@@ -7,12 +7,12 @@ const {
77 mockDownloadFileFromUrl,
88 mockGenerateInternalToken,
99 mockGetInternalApiBaseUrl,
10- mockIsModelSafeWorkspaceFileKey ,
10+ mockParseBuffer ,
1111} = vi . hoisted ( ( ) => ( {
1212 mockDownloadFileFromUrl : vi . fn ( ) ,
1313 mockGenerateInternalToken : vi . fn ( ) ,
1414 mockGetInternalApiBaseUrl : vi . fn ( ) ,
15- mockIsModelSafeWorkspaceFileKey : vi . fn ( ) ,
15+ mockParseBuffer : vi . fn ( ) ,
1616} ) )
1717
1818vi . mock ( '@/lib/auth/internal' , ( ) => ( {
@@ -24,10 +24,8 @@ vi.mock('@/lib/core/utils/urls', async (importOriginal) => ({
2424 getInternalApiBaseUrl : mockGetInternalApiBaseUrl ,
2525} ) )
2626
27- vi . mock ( '@/lib/uploads/contexts/workspace/workspace-file-secret-provenance' , ( ) => ( {
28- isModelSafeWorkspaceFileKey : mockIsModelSafeWorkspaceFileKey ,
29- MODEL_UNSAFE_WORKSPACE_FILE_ERROR_MESSAGE :
30- 'File cannot be sent to a model because its secret provenance is unavailable' ,
27+ vi . mock ( '@/lib/file-parsers' , ( ) => ( {
28+ parseBuffer : mockParseBuffer ,
3129} ) )
3230
3331vi . mock ( '@/lib/uploads/utils/file-utils.server' , ( ) => ( {
@@ -38,6 +36,7 @@ import { env } from '@/lib/core/config/env'
3836import { RESOLVED_SECRET_PROVENANCE_FIELD } from '@/lib/execution/private-tool-metadata'
3937import { processDocument } from '@/lib/knowledge/documents/document-processor'
4038import { runWithKnowledgeModelInputProvenance } from '@/lib/knowledge/model-input-provenance'
39+ import { ResolvedSecretTraceRegistry } from '@/executor/utils/resolved-secret-trace-registry'
4140
4241describe ( 'knowledge document model-input provenance' , ( ) => {
4342 beforeEach ( ( ) => {
@@ -57,27 +56,38 @@ describe('knowledge document model-input provenance', () => {
5756 vi . unstubAllGlobals ( )
5857 } )
5958
60- it ( 'rejects an unsafe workspace file before downloading or parsing its bytes' , async ( ) => {
61- mockIsModelSafeWorkspaceFileKey . mockResolvedValue ( false )
59+ it ( 'parses tracked workspace-file bytes locally without treating parsing as model egress' , async ( ) => {
60+ const registry = new ResolvedSecretTraceRegistry ( [
61+ { name : 'TOKEN' , plaintext : 'tracked-secret' , encryptedValue : 'encrypted-token' } ,
62+ ] )
63+ registry . recordResolved ( 'TOKEN' , 'tracked-secret' )
64+ mockDownloadFileFromUrl . mockResolvedValue (
65+ Buffer . from ( 'Locally parsed content containing tracked-secret.' )
66+ )
67+ mockParseBuffer . mockResolvedValue ( {
68+ content : 'Locally parsed content containing tracked-secret.' ,
69+ metadata : { } ,
70+ } )
71+ const fetchMock = vi . fn ( )
72+ vi . stubGlobal ( 'fetch' , fetchMock )
6273
63- await expect (
74+ const processed = await runWithKnowledgeModelInputProvenance ( registry , ( ) =>
6475 processDocument (
65- '/api/files/serve/workspace/workspace-1/opaque .txt?context=workspace' ,
66- 'opaque .txt' ,
76+ '/api/files/serve/workspace/workspace-1/tracked .txt?context=workspace' ,
77+ 'tracked .txt' ,
6778 'text/plain' ,
6879 1024 ,
6980 200 ,
70- 100 ,
81+ 1 ,
7182 'user-1' ,
7283 'workspace-1'
7384 )
74- ) . rejects . toThrow ( 'secret provenance is unavailable' )
75-
76- expect ( mockIsModelSafeWorkspaceFileKey ) . toHaveBeenCalledWith (
77- 'workspace/workspace-1/opaque.txt' ,
78- { workspaceId : 'workspace-1' }
7985 )
80- expect ( mockDownloadFileFromUrl ) . not . toHaveBeenCalled ( )
86+
87+ expect ( processed . metadata . processingMethod ) . toBe ( 'file-parser' )
88+ expect ( processed . chunks . map ( ( chunk ) => chunk . text ) . join ( '\n' ) ) . toContain ( 'tracked-secret' )
89+ expect ( mockDownloadFileFromUrl ) . toHaveBeenCalledOnce ( )
90+ expect ( fetchMock ) . not . toHaveBeenCalled ( )
8191 } )
8292
8393 it ( 'rejects secret-bearing opaque document bytes before external OCR' , async ( ) => {
0 commit comments