From 039ea7ae710d1599263c28f3c90a0883377dc5f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Padez?= Date: Sun, 22 Mar 2026 17:55:14 +0000 Subject: [PATCH] remove stale native tasks on marketplace sync Co-Authored-By: Claude Opus 4.6 (1M context) --- src/databases/officer_db/src/index.ts | 1 + src/databases/officer_db/src/queries/tasks.ts | 11 ++++++++++- src/servers/sync-marketplace.ts | 9 ++++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/databases/officer_db/src/index.ts b/src/databases/officer_db/src/index.ts index 2c075de8..0460fb78 100644 --- a/src/databases/officer_db/src/index.ts +++ b/src/databases/officer_db/src/index.ts @@ -80,6 +80,7 @@ export { updateTask, deleteTask, upsertNativeTask, + deleteNativeTasksNotIn, } from './queries/tasks'; export { diff --git a/src/databases/officer_db/src/queries/tasks.ts b/src/databases/officer_db/src/queries/tasks.ts index 9d954700..85f916ba 100644 --- a/src/databases/officer_db/src/queries/tasks.ts +++ b/src/databases/officer_db/src/queries/tasks.ts @@ -1,4 +1,4 @@ -import { eq, or, and, isNull, sql } from 'drizzle-orm'; +import { eq, or, and, isNull, notInArray, sql } from 'drizzle-orm'; import { db } from '../db'; import { tasks } from '../schema/agent-items'; @@ -73,6 +73,15 @@ export async function deleteTask(id: number) { await db.delete(tasks).where(eq(tasks.id, id)); } +export async function deleteNativeTasksNotIn(dirNames: string[]) { + if (dirNames.length === 0) return []; + const deleted = await db + .delete(tasks) + .where(and(eq(tasks.scope, 'native'), notInArray(tasks.dirName, dirNames))) + .returning({ dirName: tasks.dirName }); + return deleted; +} + export async function upsertNativeTask(data: Omit) { const existing = await db .select({ id: tasks.id }) diff --git a/src/servers/sync-marketplace.ts b/src/servers/sync-marketplace.ts index 3b64d628..e8b06575 100644 --- a/src/servers/sync-marketplace.ts +++ b/src/servers/sync-marketplace.ts @@ -2,7 +2,7 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'; import { join } from 'node:path'; import { DATA_PATH } from './data-path'; import { parseSeedVersion } from './sync-version'; -import { upsertNativeTask } from 'officerdb'; +import { upsertNativeTask, deleteNativeTasksNotIn } from 'officerdb'; const MARKETPLACE_URL = process.env.MARKETPLACE_URL ?? 'https://marketplace.officer.dev'; const GLOBAL_TOOLS_DIR = join(DATA_PATH, 'tools'); @@ -169,6 +169,13 @@ export async function syncMarketplaceTasks(): Promise { console.log(`[marketplace] Synced task: ${task.dirName} (v${task.version})`); } + + // Delete native tasks that no longer exist in the marketplace + const activeDirNames = allTasks.map((t) => t.dirName); + const deleted = await deleteNativeTasksNotIn(activeDirNames); + for (const row of deleted) { + console.log(`[marketplace] Removed task: ${row.dirName}`); + } } catch (err) { console.error('[marketplace] Failed to sync tasks:', err instanceof Error ? err.message : err); }