@@ -252,6 +252,47 @@ describe("sendAgentTurnSilently", () => {
252252 await promise ;
253253 expect ( cancelled ) . toBe ( true ) ;
254254 } ) ;
255+
256+ it ( "streamAgentTurn cancels the run when abort fires during the in-flight send" , async ( ) => {
257+ // Abort lands after send() is called but before runHolder.run is
258+ // populated (onAbort has nothing to cancel). The post-assignment guard
259+ // in startRun must still cancel the resolved run.
260+ let cancelled = false ;
261+ const controller = new AbortController ( ) ;
262+ let releaseSend : ( ( ) => void ) | undefined ;
263+ const agent = {
264+ agentId : "agent-inflight-abort" ,
265+ send : async (
266+ _message : SDKUserMessage ,
267+ _sendOptions ?: Record < string , unknown > ,
268+ ) => {
269+ // Hold send() in flight until the caller releases it (post-abort).
270+ await new Promise < void > ( ( resolve ) => {
271+ releaseSend = resolve ;
272+ } ) ;
273+ const run : Partial < Run > = {
274+ wait : async ( ) => ( { status : "cancelled" } ) as never ,
275+ cancel : async ( ) => {
276+ cancelled = true ;
277+ } ,
278+ } ;
279+ return run as Run ;
280+ } ,
281+ } as unknown as AgentLike ;
282+
283+ const promise = collect (
284+ streamAgentTurn ( agent , MESSAGE , {
285+ mode : "agent" ,
286+ abortSignal : controller . signal ,
287+ } ) ,
288+ ) ;
289+ // Abort while send() is still in flight, then let send() resolve.
290+ await new Promise ( ( r ) => setTimeout ( r , 5 ) ) ;
291+ controller . abort ( ) ;
292+ releaseSend ?.( ) ;
293+ await promise ;
294+ expect ( cancelled ) . toBe ( true ) ;
295+ } ) ;
255296} ) ;
256297
257298describe ( "streamAgentTurn MCP error surfacing" , ( ) => {
0 commit comments