Skip to content

Commit 027229d

Browse files
committed
fix
1 parent fc5efa8 commit 027229d

3 files changed

Lines changed: 97 additions & 2 deletions

File tree

apps/sim/lib/knowledge/documents/document-processing-source.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,25 @@ describe('knowledge document processing source', () => {
182182
)
183183
expect(mockGenerateEmbeddings).not.toHaveBeenCalled()
184184
})
185+
186+
it('fails before parsing an existing document when its current source is tracked unknown', async () => {
187+
mockGetFileMetadataByKeys.mockImplementation(async (_keys: string[], context: string) =>
188+
context === 'workspace' ? [{ ...SOURCE_BINDING, secretProvenanceVersion: 1 }] : []
189+
)
190+
mockGetBoundWorkspaceFileSecretProvenanceByMetadata.mockResolvedValue(
191+
new Map([[SOURCE_BINDING.id, { status: 'unknown' }]])
192+
)
193+
194+
await expect(
195+
processDocumentAsync('knowledge-base-1', 'document-1', {
196+
filename: 'stale.pdf',
197+
fileUrl: 'https://example.com/stale.pdf',
198+
fileSize: 1,
199+
mimeType: 'text/plain',
200+
})
201+
).rejects.toThrow('Knowledge document secret provenance is unavailable')
202+
203+
expect(mockProcessDocument).not.toHaveBeenCalled()
204+
expect(mockGenerateEmbeddings).not.toHaveBeenCalled()
205+
})
185206
})

apps/sim/lib/knowledge/documents/service.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2550,7 +2550,10 @@ export async function deleteDocumentStorageFiles(
25502550
...new Set(
25512551
entries
25522552
.map((entry) => entry.storageKey)
2553-
.filter((key): key is string => typeof key === 'string')
2553+
.filter(
2554+
(key): key is string =>
2555+
typeof key === 'string' && (key.startsWith('kb/') || key.startsWith('knowledge-base/'))
2556+
)
25542557
),
25552558
]
25562559
const bindingByKey = new Map<string, FileMetadataRecord>()
@@ -2566,6 +2569,10 @@ export async function deleteDocumentStorageFiles(
25662569
return
25672570
}
25682571

2572+
if (!storageKey.startsWith('kb/') && !storageKey.startsWith('knowledge-base/')) {
2573+
return
2574+
}
2575+
25692576
const binding = bindingByKey.get(storageKey)
25702577
if (!binding?.workspaceId || binding.context !== 'knowledge-base') {
25712578
logger.warn(`[${requestId}] Skipping storage delete: no ownership binding for key`, {

apps/sim/lib/knowledge/documents/workspace-source-provenance.test.ts

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,73 @@ describe('knowledge workspace source provenance', () => {
193193
)
194194
})
195195

196+
it('preserves a tracked exact-empty manual upload as model-safe', async () => {
197+
mockGetBoundWorkspaceFileSecretProvenanceByMetadata.mockResolvedValue(
198+
new Map([[SOURCE_BINDING.id, { status: 'exact', entries: [] }]])
199+
)
200+
201+
await createSingleDocument(
202+
{
203+
filename: 'source.pdf',
204+
fileUrl: SOURCE_URL,
205+
fileSize: 512,
206+
mimeType: 'application/pdf',
207+
},
208+
KNOWLEDGE_BASE_ID,
209+
'request-1',
210+
SOURCE_USER_ID
211+
)
212+
213+
expect(findDocumentProvenanceWrite()).toEqual(
214+
expect.objectContaining({ status: 'exact', entries: [] })
215+
)
216+
})
217+
218+
it('uses the trusted mothership row context instead of the URL context label', async () => {
219+
const mothershipBinding = {
220+
...SOURCE_BINDING,
221+
id: 'mothership-file-1',
222+
context: 'mothership',
223+
}
224+
mockGetFileMetadataByKeys.mockImplementation(async (_keys: string[], context: string) =>
225+
context === 'mothership' ? [mothershipBinding] : []
226+
)
227+
mockGetBoundWorkspaceFileSecretProvenanceByMetadata.mockResolvedValue(
228+
new Map([
229+
[
230+
mothershipBinding.id,
231+
{
232+
status: 'exact',
233+
entries: [{ name: 'CHAT_SECRET', encryptedValue: 'encrypted-chat-secret' }],
234+
},
235+
],
236+
])
237+
)
238+
239+
await createSingleDocument(
240+
{
241+
filename: 'source.pdf',
242+
fileUrl: SOURCE_URL,
243+
fileSize: 512,
244+
mimeType: 'application/pdf',
245+
},
246+
KNOWLEDGE_BASE_ID,
247+
'request-1',
248+
SOURCE_USER_ID
249+
)
250+
251+
expect(mockGetBoundWorkspaceFileSecretProvenanceByMetadata).toHaveBeenCalledWith(
252+
expect.anything(),
253+
[mothershipBinding]
254+
)
255+
expect(findDocumentProvenanceWrite()).toEqual(
256+
expect.objectContaining({
257+
status: 'exact',
258+
entries: [expect.objectContaining({ name: 'CHAT_SECRET' })],
259+
})
260+
)
261+
})
262+
196263
it('preserves legacy behavior when a workspace source has no metadata binding', async () => {
197264
mockGetFileMetadataByKeys.mockResolvedValue([])
198265

@@ -221,7 +288,7 @@ describe('knowledge workspace source provenance', () => {
221288
'request-1'
222289
)
223290

224-
expect(mockGetFileMetadataByKeys).toHaveBeenCalledWith([SOURCE_KEY], 'knowledge-base')
291+
expect(mockGetFileMetadataByKeys).not.toHaveBeenCalled()
225292
expect(mockDeleteFile).not.toHaveBeenCalled()
226293
expect(mockDeleteFileMetadataByIdentity).not.toHaveBeenCalled()
227294
})

0 commit comments

Comments
 (0)