@@ -23,6 +23,7 @@ import {
2323 resolveSuspendedApprovalFromStore ,
2424} from "./approval-resume.js" ;
2525import { createSessionOperationQueue } from "../tui/delivery-queue.js" ;
26+ import { createParkedOverlayAbortBinding } from "../tui/runner/parked-overlay-abort.js" ;
2627import { defined } from "../../testkit/defined.js" ;
2728import { redactedCorrelationId } from "./redacted-correlation.js" ;
2829import {
@@ -1222,3 +1223,30 @@ describe("approval resume retry re-await", () => {
12221223 expect ( delivered ) . toHaveLength ( 1 ) ;
12231224 } ) ;
12241225} ) ;
1226+
1227+ describe ( "parked overlay registration after the operator answers" , ( ) => {
1228+ // approve_worker_call raises a nested permission prompt as soon as its
1229+ // redispatched call starts, while the decision that resumed it is still being
1230+ // delivered. That prompt's abort signal merges the parked overlay controller.
1231+ test ( "a permission prompt raised while the decision is delivered is not pre-aborted" , async ( ) => {
1232+ const binding = createParkedOverlayAbortBinding ( ) ;
1233+ const identity = new AbortController ( ) ;
1234+ const { agent, gate } = createApprovalResumeHarness ( ) ;
1235+ let promptSignal : AbortSignal | undefined ;
1236+ const resume = createApprovalResume ( {
1237+ getAgent : ( ) => agent ,
1238+ gate,
1239+ resolveParkedCallId : ( ) => "call-A" ,
1240+ registerOverlayAbort : binding . registerOverlayAbort ,
1241+ deliver : async ( message ) => {
1242+ promptSignal = binding . identitySignal ( identity . signal ) ;
1243+ agent . deliver ( message ) ;
1244+ } ,
1245+ } ) ;
1246+ expect (
1247+ await resume . handle ( suspension ( "corr-A" , "git status --short" ) ) ,
1248+ ) . toBe ( true ) ;
1249+ expect ( promptSignal ) . toBeDefined ( ) ;
1250+ expect ( promptSignal ?. aborted ) . toBe ( false ) ;
1251+ } ) ;
1252+ } ) ;
0 commit comments