@@ -265,6 +265,41 @@ describe("copilot_sdk_driver.cjs", () => {
265265 expect ( onPermissionRequest ( { kind : "read" , fileName : "a.txt" } ) ) . toEqual ( { kind : "approve-once" } ) ;
266266 } ) ;
267267
268+ it ( "allows read requests when shell access is allowlisted" , async ( ) => {
269+ const disconnect = vi . fn ( ) . mockResolvedValue ( undefined ) ;
270+ const stop = vi . fn ( ) . mockResolvedValue ( undefined ) ;
271+ const createSession = vi . fn ( ) . mockResolvedValue ( {
272+ sessionId : "session-read-via-shell" ,
273+ on : ( ) => { } ,
274+ sendAndWait : vi . fn ( ) . mockResolvedValue ( { data : { content : "ok" } } ) ,
275+ disconnect,
276+ } ) ;
277+ class FakeCopilotClient {
278+ start = vi . fn ( ) . mockResolvedValue ( undefined ) ;
279+ createSession = createSession ;
280+ stop = stop ;
281+ }
282+
283+ const result = await runWithCopilotSDK ( {
284+ sdkUri : "http://127.0.0.1:3002" ,
285+ prompt : "test prompt" ,
286+ logger : ( ) => { } ,
287+ permissionConfig : {
288+ allowedTools : [ "shell" ] ,
289+ } ,
290+ sdkModule : {
291+ CopilotClient : FakeCopilotClient ,
292+ RuntimeConnection : { forUri : vi . fn ( ( ) => ( { } ) ) } ,
293+ approveAll : ( ) => ( { kind : "approve-once" } ) ,
294+ } ,
295+ } ) ;
296+
297+ expect ( result . exitCode ) . toBe ( 0 ) ;
298+ const sessionConfig = createSession . mock . calls [ 0 ] [ 0 ] ;
299+ const onPermissionRequest = sessionConfig . onPermissionRequest ;
300+ expect ( onPermissionRequest ( { kind : "read" , fileName : "a.txt" } ) ) . toEqual ( { kind : "approve-once" } ) ;
301+ } ) ;
302+
268303 it ( "logs permission-denied SDK requests as core warnings" , async ( ) => {
269304 const disconnect = vi . fn ( ) . mockResolvedValue ( undefined ) ;
270305 const stop = vi . fn ( ) . mockResolvedValue ( undefined ) ;
0 commit comments