{"record":{"id":"445d8375d585ebfe","repo":"Budibase/budibase","slug":"knowledge-base-file-not-found","errorCode":null,"errorMessage":"Knowledge base file not found","messagePattern":"Knowledge base file not found","errorType":"http","errorClass":"HTTPError","httpStatus":404,"severity":"error","filePath":"packages/server/src/sdk/workspace/ai/knowledgeBase/files.ts","lineNumber":90,"sourceCode":"    _rev: rev,\n  }\n}\n\nexport const updateKnowledgeBaseFile = async (\n  file: KnowledgeBaseFile\n): Promise<KnowledgeBaseFile> => {\n  const db = context.getWorkspaceDB()\n  const updated = { ...file }\n  const { rev } = await db.put(file)\n  updated._rev = rev\n  return updated\n}\n\nexport const getKnowledgeBaseFileOrThrow = async (fileId: string) => {\n  const db = context.getWorkspaceDB()\n  const file = await db.tryGet<KnowledgeBaseFile>(fileId)\n  if (!file || file._deleted) {\n    throw new HTTPError(\"Knowledge base file not found\", 404)\n  }\n  return file\n}\n\nexport const listKnowledgeBaseFiles = async (\n  knowledgeBaseId: string\n): Promise<KnowledgeBaseFile[]> => {\n  const db = context.getWorkspaceDB()\n  const response = await db.allDocs<KnowledgeBaseFile>(\n    docIds.getDocParams(DocumentType.KNOWLEDGE_BASE_FILE, knowledgeBaseId, {\n      include_docs: true,\n    })\n  )\n  return response.rows\n    .map(row => row.doc)\n    .filter(file => !!file)\n    .filter(file => !file._deleted)\n    .sort((a, b) => {","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/Budibase/budibase/blob/a81a902e9a8fe55b467d106765f6638f12e35c49/packages/server/src/sdk/workspace/ai/knowledgeBase/files.ts#L72-L108","documentation":"getKnowledgeBaseFileOrThrow fetches a KnowledgeBaseFile doc by ID from the workspace DB via db.tryGet. If no document exists with that ID, or it is flagged _deleted, an HTTPError 404 is thrown. removeKnowledgeBaseFile relies on it to load the file before deletion.","triggerScenarios":"Calling getKnowledgeBaseFileOrThrow (directly or via removeKnowledgeBaseFile) with a fileId that does not exist in the workspace DB, or one that was already deleted (including race: deleted by another request just before).","commonSituations":"Client retries a delete of an already-deleted file; stale UI holding an old file ID after the KB was reset; wrong workspace context (file exists in another workspace/app DB); querying the wrong CouchDB.","solutions":["Check the file exists first with listKnowledgeBaseFiles or db.tryGet before deleting/fetching","Treat the 404 as success if the goal is removal (idempotent delete)","Verify the correct workspace DB is in context (context.getWorkspaceDB) for the app that owns the file"],"exampleFix":"// before\nawait sdk.ai.knowledgeBase.files.removeKnowledgeBaseFile(kb, file) // 404 if already gone\n// after\ntry {\n  const file = await getKnowledgeBaseFileOrThrow(fileId)\n  await removeKnowledgeBaseFile(kb, file)\n} catch (e) {\n  if (!(e instanceof HTTPError && e.status === 404)) throw e\n}","handlingStrategy":"try-catch","validationCode":"const existing = await db.tryGet<KnowledgeBaseFile>(fileId)\nif (!existing || existing._deleted) { /* skip or inform user */ }","typeGuard":null,"tryCatchPattern":"try {\n  const file = await getKnowledgeBaseFileOrThrow(fileId)\n  await removeKnowledgeBaseFile(kb, file)\n} catch (e) {\n  if (e instanceof HTTPError && e.status === 404) return // already gone\n  throw e\n}","preventionTips":["Make deletes idempotent by swallowing 404","Refresh file lists in the UI before acting on a stored fileId","Confirm the request runs in the workspace that owns the file"],"tags":["http-404","not-found","couchdb"],"backgroundTag":"resource-not-found","analyzedSha":"a81a902e9a8fe55b467d106765f6638f12e35c49","analyzedAt":"2026-08-29T01:03:10.972Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}