From cd52b8e2f23187374d0b47053622c07b0140fcb7 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 28 Apr 2026 17:03:29 -0700 Subject: [PATCH 1/3] fix(knowledge): skip sync and document processing when KB is deleted --- .../lib/knowledge/connectors/sync-engine.ts | 37 ++++++++++++++++--- apps/sim/lib/knowledge/documents/service.ts | 5 ++- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/apps/sim/lib/knowledge/connectors/sync-engine.ts b/apps/sim/lib/knowledge/connectors/sync-engine.ts index ef949c1f78..a670a424f2 100644 --- a/apps/sim/lib/knowledge/connectors/sync-engine.ts +++ b/apps/sim/lib/knowledge/connectors/sync-engine.ts @@ -156,8 +156,11 @@ export async function dispatchSync( const connectorRows = await db .select({ knowledgeBaseId: knowledgeConnector.knowledgeBaseId, + connectorArchivedAt: knowledgeConnector.archivedAt, + connectorDeletedAt: knowledgeConnector.deletedAt, workspaceId: knowledgeBase.workspaceId, userId: knowledgeBase.userId, + kbDeletedAt: knowledgeBase.deletedAt, }) .from(knowledgeConnector) .innerJoin(knowledgeBase, eq(knowledgeBase.id, knowledgeConnector.knowledgeBaseId)) @@ -165,10 +168,30 @@ export async function dispatchSync( .limit(1) const row = connectorRows[0] + if (!row) { + logger.warn(`Skipping sync dispatch: connector not found`, { connectorId, requestId }) + return + } + if (row.kbDeletedAt) { + logger.warn(`Skipping sync dispatch: knowledge base is deleted`, { + connectorId, + knowledgeBaseId: row.knowledgeBaseId, + requestId, + }) + return + } + if (row.connectorArchivedAt || row.connectorDeletedAt) { + logger.warn(`Skipping sync dispatch: connector is archived or deleted`, { + connectorId, + requestId, + }) + return + } + const tags = [`connectorId:${connectorId}`] - if (row?.knowledgeBaseId) tags.push(`knowledgeBaseId:${row.knowledgeBaseId}`) - if (row?.workspaceId) tags.push(`workspaceId:${row.workspaceId}`) - if (row?.userId) tags.push(`userId:${row.userId}`) + if (row.knowledgeBaseId) tags.push(`knowledgeBaseId:${row.knowledgeBaseId}`) + if (row.workspaceId) tags.push(`workspaceId:${row.workspaceId}`) + if (row.userId) tags.push(`userId:${row.userId}`) await knowledgeConnectorSync.trigger( { @@ -261,7 +284,8 @@ export async function executeSync( .limit(1) if (connectorRows.length === 0) { - throw new Error(`Connector not found: ${connectorId}`) + logger.warn(`Skipping sync: connector ${connectorId} not found, archived, or deleted`) + return { ...result, error: 'connector_unavailable' } } const connector = connectorRows[0] @@ -278,7 +302,10 @@ export async function executeSync( .limit(1) if (kbRows.length === 0) { - throw new Error(`Knowledge base not found: ${connector.knowledgeBaseId}`) + logger.warn( + `Skipping sync: knowledge base ${connector.knowledgeBaseId} is deleted (connector ${connectorId})` + ) + return { ...result, error: 'knowledge_base_deleted' } } const userId = kbRows[0].userId diff --git a/apps/sim/lib/knowledge/documents/service.ts b/apps/sim/lib/knowledge/documents/service.ts index 84241c5772..a89878fb6d 100644 --- a/apps/sim/lib/knowledge/documents/service.ts +++ b/apps/sim/lib/knowledge/documents/service.ts @@ -386,7 +386,10 @@ export async function processDocumentAsync( .limit(1) if (kb.length === 0) { - throw new Error(`Knowledge base not found: ${knowledgeBaseId}`) + logger.warn( + `[${documentId}] Skipping document processing: knowledge base ${knowledgeBaseId} is deleted` + ) + return } await db From 19eb8a1b86f34c7bb90b68439d96db295e62fe5e Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 28 Apr 2026 17:10:51 -0700 Subject: [PATCH 2/3] fix(knowledge): mark connector errored and document failed when KB is deleted --- apps/sim/lib/knowledge/connectors/sync-engine.ts | 9 +++++++++ apps/sim/lib/knowledge/documents/service.ts | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/apps/sim/lib/knowledge/connectors/sync-engine.ts b/apps/sim/lib/knowledge/connectors/sync-engine.ts index a670a424f2..a87536ff66 100644 --- a/apps/sim/lib/knowledge/connectors/sync-engine.ts +++ b/apps/sim/lib/knowledge/connectors/sync-engine.ts @@ -305,6 +305,15 @@ export async function executeSync( logger.warn( `Skipping sync: knowledge base ${connector.knowledgeBaseId} is deleted (connector ${connectorId})` ) + await db + .update(knowledgeConnector) + .set({ + status: 'error', + nextSyncAt: null, + lastSyncError: 'Knowledge base deleted', + updatedAt: new Date(), + }) + .where(eq(knowledgeConnector.id, connectorId)) return { ...result, error: 'knowledge_base_deleted' } } diff --git a/apps/sim/lib/knowledge/documents/service.ts b/apps/sim/lib/knowledge/documents/service.ts index a89878fb6d..774f30d986 100644 --- a/apps/sim/lib/knowledge/documents/service.ts +++ b/apps/sim/lib/knowledge/documents/service.ts @@ -389,6 +389,16 @@ export async function processDocumentAsync( logger.warn( `[${documentId}] Skipping document processing: knowledge base ${knowledgeBaseId} is deleted` ) + await db + .update(document) + .set({ + processingStatus: 'failed', + processingError: 'Knowledge base deleted', + processingCompletedAt: new Date(), + }) + .where( + and(eq(document.id, documentId), isNull(document.archivedAt), isNull(document.deletedAt)) + ) return } From dfae79a3030426a17343842dd3bc8e6ff0971ab9 Mon Sep 17 00:00:00 2001 From: Waleed Latif Date: Tue, 28 Apr 2026 17:31:07 -0700 Subject: [PATCH 3/3] fix(knowledge): mark connector errored in dispatchSync when KB is deleted --- apps/sim/lib/knowledge/connectors/sync-engine.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/apps/sim/lib/knowledge/connectors/sync-engine.ts b/apps/sim/lib/knowledge/connectors/sync-engine.ts index a87536ff66..22c79598c5 100644 --- a/apps/sim/lib/knowledge/connectors/sync-engine.ts +++ b/apps/sim/lib/knowledge/connectors/sync-engine.ts @@ -178,6 +178,15 @@ export async function dispatchSync( knowledgeBaseId: row.knowledgeBaseId, requestId, }) + await db + .update(knowledgeConnector) + .set({ + status: 'error', + nextSyncAt: null, + lastSyncError: 'Knowledge base deleted', + updatedAt: new Date(), + }) + .where(eq(knowledgeConnector.id, connectorId)) return } if (row.connectorArchivedAt || row.connectorDeletedAt) {