@@ -239,6 +239,7 @@ const makeOpenCodeRuntimeHarness = Effect.fn("makeOpenCodeRuntimeHarness")(funct
239239const makePermissionRuleHarness = Effect . fn ( "makePermissionRuleHarness" ) ( function * (
240240 suffix : string ,
241241 nativeSession : { readonly id : string ; readonly parentID ?: string } ,
242+ initialMode : ProviderAdapter . ProviderAdapterV2RuntimePolicy [ "runtimeMode" ] = "approval-required" ,
242243) {
243244 const nativeEvents = asyncEventStream ( ) ;
244245 const createdPermissions : Array < unknown > = [ ] ;
@@ -282,12 +283,12 @@ const makePermissionRuleHarness = Effect.fn("makePermissionRuleHarness")(functio
282283 threadId,
283284 providerSessionId : ProviderSessionId . make ( `session-${ suffix } ` ) ,
284285 modelSelection,
285- runtimePolicy : runtimePolicy ( "approval-required" , { cwd : "/workspace" } ) ,
286+ runtimePolicy : runtimePolicy ( initialMode , { cwd : "/workspace" } ) ,
286287 } ) ;
287288 const providerThread = yield * runtime . ensureThread ( {
288289 threadId,
289290 modelSelection,
290- runtimePolicy : runtimePolicy ( "approval-required" , { cwd : "/workspace" } ) ,
291+ runtimePolicy : runtimePolicy ( initialMode , { cwd : "/workspace" } ) ,
291292 } ) ;
292293 return {
293294 createdPermissions,
@@ -2352,6 +2353,36 @@ describe("OpenCodeAdapterV2", () => {
23522353 ) ,
23532354 ) ;
23542355
2356+ it . effect ( "reapplies the restricted rules when a full-access session is resumed" , ( ) =>
2357+ Effect . gen ( function * ( ) {
2358+ const harness = yield * makePermissionRuleHarness (
2359+ "resume-restricted-policy" ,
2360+ { id : "root" } ,
2361+ "full-access" ,
2362+ ) ;
2363+ assert . equal (
2364+ permissionAction ( harness . createdPermissions [ 0 ] as PermissionRuleset , "bash" ) ,
2365+ "allow" ,
2366+ ) ;
2367+
2368+ yield * harness . runtime . resumeThread ( {
2369+ providerThread : harness . providerThread ,
2370+ threadId : harness . threadId ,
2371+ modelSelection : harness . modelSelection ,
2372+ runtimePolicy : runtimePolicy ( "approval-required" , { cwd : "/workspace" } ) ,
2373+ } ) ;
2374+
2375+ assert . equal ( harness . updatedPermissions . length , 1 ) ;
2376+ assert . equal (
2377+ permissionAction ( harness . updatedPermissions [ 0 ] as PermissionRuleset , "bash" ) ,
2378+ "ask" ,
2379+ ) ;
2380+ } ) . pipe (
2381+ Effect . provide ( Layer . merge ( IdAllocator . layer , McpProviderSessions . layer ) ) ,
2382+ Effect . scoped ,
2383+ ) ,
2384+ ) ;
2385+
23552386 it . effect ( "keeps the rules of a resumed native child session" , ( ) =>
23562387 Effect . gen ( function * ( ) {
23572388 // A server restart drops the in-memory subagent marker, so the native
0 commit comments