@@ -18,6 +18,7 @@ import { handleRecordTraceCommands } from './daemon/handlers/record-trace.ts';
1818import { handleInteractionCommands } from './daemon/handlers/interaction.ts' ;
1919import { assertSessionSelectorMatches } from './daemon/session-selector.ts' ;
2020import { resolveEffectiveSessionName } from './daemon/session-routing.ts' ;
21+ import { clearRequestCanceled , isRequestCanceled , markRequestCanceled } from './daemon/request-cancel.ts' ;
2122import {
2223 isAgentDeviceDaemonProcess ,
2324 readProcessStartTime ,
@@ -50,7 +51,11 @@ function contextFromFlags(
5051 appBundleId ?: string ,
5152 traceLogPath ?: string ,
5253) : DaemonCommandContext {
53- return contextFromFlagsWithLog ( logPath , flags , appBundleId , traceLogPath ) ;
54+ const requestId = getDiagnosticsMeta ( ) . requestId ;
55+ return {
56+ ...contextFromFlagsWithLog ( logPath , flags , appBundleId , traceLogPath , requestId ) ,
57+ requestId,
58+ } ;
5459}
5560
5661async function handleRequest ( req : DaemonRequest ) : Promise < DaemonResponse > {
@@ -295,10 +300,14 @@ function start(): void {
295300 const server = net . createServer ( ( socket ) => {
296301 let buffer = '' ;
297302 let inFlightRequests = 0 ;
303+ const activeRequestIds = new Set < string > ( ) ;
298304 let canceledInFlight = false ;
299305 const cancelInFlightRunnerSessions = ( ) => {
300306 if ( canceledInFlight || inFlightRequests === 0 ) return ;
301307 canceledInFlight = true ;
308+ for ( const requestId of activeRequestIds ) {
309+ markRequestCanceled ( requestId ) ;
310+ }
302311 emitDiagnostic ( {
303312 level : 'warn' ,
304313 phase : 'request_client_disconnected' ,
@@ -332,13 +341,25 @@ function start(): void {
332341 }
333342 let response : DaemonResponse ;
334343 inFlightRequests += 1 ;
344+ let requestIdForCleanup : string | undefined ;
335345 try {
336346 const req = JSON . parse ( line ) as DaemonRequest ;
347+ requestIdForCleanup = req . meta ?. requestId ;
348+ if ( requestIdForCleanup ) {
349+ activeRequestIds . add ( requestIdForCleanup ) ;
350+ if ( isRequestCanceled ( requestIdForCleanup ) ) {
351+ throw new AppError ( 'COMMAND_FAILED' , 'request canceled' ) ;
352+ }
353+ }
337354 response = await handleRequest ( req ) ;
338355 } catch ( err ) {
339356 response = { ok : false , error : normalizeError ( err ) } ;
340357 } finally {
341358 inFlightRequests -= 1 ;
359+ if ( requestIdForCleanup ) {
360+ activeRequestIds . delete ( requestIdForCleanup ) ;
361+ clearRequestCanceled ( requestIdForCleanup ) ;
362+ }
342363 }
343364 if ( ! socket . destroyed ) {
344365 socket . write ( `${ JSON . stringify ( response ) } \n` ) ;
0 commit comments