1-
21import * as mainPromptModule from '@codebuff/agent-runtime/main-prompt'
32import { FILE_READ_STATUS } from '@codebuff/common/old-constants'
43import * as projectFileTree from '@codebuff/common/project-file-tree'
@@ -91,9 +90,7 @@ describe('CodebuffClientOptions fileFilter', () => {
9190 let requestedFiles : Record < string , string | null > = { }
9291
9392 spyOn ( mainPromptModule , 'callMainPrompt' ) . mockImplementation (
94- async (
95- params : Parameters < typeof mainPromptModule . callMainPrompt > [ 0 ] ,
96- ) => {
93+ async ( params : Parameters < typeof mainPromptModule . callMainPrompt > [ 0 ] ) => {
9794 const { sendAction, promptId, requestFiles } = params
9895 const sessionState = getInitialSessionState ( getStubProjectFileContext ( ) )
9996
@@ -177,9 +174,7 @@ describe('CodebuffClientOptions fileFilter', () => {
177174 let requestedFiles : Record < string , string | null > = { }
178175
179176 spyOn ( mainPromptModule , 'callMainPrompt' ) . mockImplementation (
180- async (
181- params : Parameters < typeof mainPromptModule . callMainPrompt > [ 0 ] ,
182- ) => {
177+ async ( params : Parameters < typeof mainPromptModule . callMainPrompt > [ 0 ] ) => {
183178 const { sendAction, promptId, requestFiles } = params
184179 const sessionState = getInitialSessionState ( getStubProjectFileContext ( ) )
185180
@@ -259,9 +254,7 @@ describe('CodebuffClientOptions fileFilter', () => {
259254 let optionalFileResult : string | null = null
260255
261256 spyOn ( mainPromptModule , 'callMainPrompt' ) . mockImplementation (
262- async (
263- params : Parameters < typeof mainPromptModule . callMainPrompt > [ 0 ] ,
264- ) => {
257+ async ( params : Parameters < typeof mainPromptModule . callMainPrompt > [ 0 ] ) => {
265258 const { sendAction, promptId, requestOptionalFile } = params
266259 const sessionState = getInitialSessionState ( getStubProjectFileContext ( ) )
267260
@@ -319,6 +312,75 @@ describe('CodebuffClientOptions fileFilter', () => {
319312 expect ( optionalFileResult ) . toBeNull ( )
320313 } )
321314
315+ it ( 'should tolerate absolute requestOptionalFile paths inside cwd' , async ( ) => {
316+ spyOn ( databaseModule , 'getUserInfoFromApiKey' ) . mockResolvedValue ( {
317+ id : 'user-123' ,
318+ email : 'test@example.com' ,
319+ discord_id : null ,
320+ stripe_customer_id : null ,
321+ banned : false ,
322+ created_at : new Date ( '2024-01-01T00:00:00Z' ) ,
323+ } )
324+ spyOn ( databaseModule , 'fetchAgentFromDatabase' ) . mockResolvedValue ( null )
325+ spyOn ( databaseModule , 'startAgentRun' ) . mockResolvedValue ( 'run-1' )
326+ spyOn ( databaseModule , 'finishAgentRun' ) . mockResolvedValue ( undefined )
327+ spyOn ( databaseModule , 'addAgentStep' ) . mockResolvedValue ( 'step-1' )
328+ spyOn ( projectFileTree , 'isFileIgnored' ) . mockResolvedValue ( false )
329+
330+ const mockFs = createMockFs ( {
331+ files : {
332+ '/project/src/index.ts' : { content : 'normal file content' } ,
333+ } ,
334+ } )
335+
336+ const optionalFileResult : { current : string | null } = { current : null }
337+
338+ spyOn ( mainPromptModule , 'callMainPrompt' ) . mockImplementation (
339+ async ( params : Parameters < typeof mainPromptModule . callMainPrompt > [ 0 ] ) => {
340+ const { sendAction, promptId, requestOptionalFile } = params
341+ const sessionState = getInitialSessionState ( getStubProjectFileContext ( ) )
342+
343+ optionalFileResult . current = await requestOptionalFile ( {
344+ filePath : '/project/src/index.ts' ,
345+ } )
346+
347+ await sendAction ( {
348+ action : {
349+ type : 'prompt-response' ,
350+ promptId,
351+ sessionState,
352+ output : {
353+ type : 'lastMessage' ,
354+ value : [ ] ,
355+ } ,
356+ } ,
357+ } )
358+
359+ return {
360+ sessionState,
361+ output : {
362+ type : 'lastMessage' as const ,
363+ value : [ ] ,
364+ } ,
365+ }
366+ } ,
367+ )
368+
369+ const client = new CodebuffClient ( {
370+ apiKey : 'test-key' ,
371+ cwd : '/project' ,
372+ fsSource : mockFs ,
373+ } )
374+
375+ const result = await client . run ( {
376+ agent : 'base2' ,
377+ prompt : 'read optional file' ,
378+ } )
379+
380+ expect ( result . output . type ) . toBe ( 'lastMessage' )
381+ expect ( optionalFileResult . current ) . toBe ( 'normal file content' )
382+ } )
383+
322384 it ( 'should allow all files when no fileFilter is provided' , async ( ) => {
323385 spyOn ( databaseModule , 'getUserInfoFromApiKey' ) . mockResolvedValue ( {
324386 id : 'user-123' ,
@@ -343,9 +405,7 @@ describe('CodebuffClientOptions fileFilter', () => {
343405 let requestedFiles : Record < string , string | null > = { }
344406
345407 spyOn ( mainPromptModule , 'callMainPrompt' ) . mockImplementation (
346- async (
347- params : Parameters < typeof mainPromptModule . callMainPrompt > [ 0 ] ,
348- ) => {
408+ async ( params : Parameters < typeof mainPromptModule . callMainPrompt > [ 0 ] ) => {
349409 const { sendAction, promptId, requestFiles } = params
350410 const sessionState = getInitialSessionState ( getStubProjectFileContext ( ) )
351411
@@ -417,9 +477,7 @@ describe('CodebuffClientOptions fileFilter', () => {
417477 } )
418478
419479 spyOn ( mainPromptModule , 'callMainPrompt' ) . mockImplementation (
420- async (
421- params : Parameters < typeof mainPromptModule . callMainPrompt > [ 0 ] ,
422- ) => {
480+ async ( params : Parameters < typeof mainPromptModule . callMainPrompt > [ 0 ] ) => {
423481 const { sendAction, promptId, requestFiles } = params
424482 const sessionState = getInitialSessionState ( getStubProjectFileContext ( ) )
425483
0 commit comments