@@ -1963,6 +1963,124 @@ describe("TriggerChatTransport", function () {
19631963 } ) ;
19641964 } ) ;
19651965
1966+ it ( "preserves consumeTrackingStream failures when cleanup run-store set throws" , async function ( ) {
1967+ const errors : TriggerChatTransportError [ ] = [ ] ;
1968+ const runStore = new FailingCleanupSetRunStore ( 2 ) ;
1969+
1970+ const server = await startServer ( function ( req , res ) {
1971+ if ( req . method === "POST" && req . url === "/api/v1/tasks/chat-task/trigger" ) {
1972+ res . writeHead ( 200 , {
1973+ "content-type" : "application/json" ,
1974+ "x-trigger-jwt" : "pk_run_tracking_cleanup_set_failure" ,
1975+ } ) ;
1976+ res . end ( JSON . stringify ( { id : "run_tracking_cleanup_set_failure" } ) ) ;
1977+ return ;
1978+ }
1979+
1980+ res . writeHead ( 404 ) ;
1981+ res . end ( ) ;
1982+ } ) ;
1983+
1984+ const transport = new TriggerChatTransport ( {
1985+ task : "chat-task" ,
1986+ stream : "chat-stream" ,
1987+ accessToken : "pk_trigger" ,
1988+ baseURL : server . url ,
1989+ runStore,
1990+ onError : function onError ( error ) {
1991+ errors . push ( error ) ;
1992+ } ,
1993+ } ) ;
1994+
1995+ ( transport as any ) . fetchRunStream = async function fetchRunStream ( ) {
1996+ return new ReadableStream ( {
1997+ start ( controller ) {
1998+ controller . error ( new Error ( "tracking failed root cause" ) ) ;
1999+ } ,
2000+ } ) ;
2001+ } ;
2002+
2003+ const stream = await transport . sendMessages ( {
2004+ trigger : "submit-message" ,
2005+ chatId : "chat-tracking-cleanup-set-failure" ,
2006+ messageId : undefined ,
2007+ messages : [ ] ,
2008+ abortSignal : undefined ,
2009+ } ) ;
2010+
2011+ await expect ( readChunks ( stream ) ) . rejects . toThrowError ( "tracking failed root cause" ) ;
2012+
2013+ await waitForCondition ( function ( ) {
2014+ return errors . length === 1 ;
2015+ } ) ;
2016+
2017+ expect ( errors [ 0 ] ) . toMatchObject ( {
2018+ phase : "consumeTrackingStream" ,
2019+ chatId : "chat-tracking-cleanup-set-failure" ,
2020+ runId : "run_tracking_cleanup_set_failure" ,
2021+ } ) ;
2022+ expect ( errors [ 0 ] ?. error . message ) . toBe ( "tracking failed root cause" ) ;
2023+ } ) ;
2024+
2025+ it ( "preserves consumeTrackingStream failures when cleanup run-store delete throws" , async function ( ) {
2026+ const errors : TriggerChatTransportError [ ] = [ ] ;
2027+ const runStore = new FailingCleanupDeleteRunStore ( 1 ) ;
2028+
2029+ const server = await startServer ( function ( req , res ) {
2030+ if ( req . method === "POST" && req . url === "/api/v1/tasks/chat-task/trigger" ) {
2031+ res . writeHead ( 200 , {
2032+ "content-type" : "application/json" ,
2033+ "x-trigger-jwt" : "pk_run_tracking_cleanup_delete_failure" ,
2034+ } ) ;
2035+ res . end ( JSON . stringify ( { id : "run_tracking_cleanup_delete_failure" } ) ) ;
2036+ return ;
2037+ }
2038+
2039+ res . writeHead ( 404 ) ;
2040+ res . end ( ) ;
2041+ } ) ;
2042+
2043+ const transport = new TriggerChatTransport ( {
2044+ task : "chat-task" ,
2045+ stream : "chat-stream" ,
2046+ accessToken : "pk_trigger" ,
2047+ baseURL : server . url ,
2048+ runStore,
2049+ onError : function onError ( error ) {
2050+ errors . push ( error ) ;
2051+ } ,
2052+ } ) ;
2053+
2054+ ( transport as any ) . fetchRunStream = async function fetchRunStream ( ) {
2055+ return new ReadableStream ( {
2056+ start ( controller ) {
2057+ controller . error ( new Error ( "tracking failed root cause" ) ) ;
2058+ } ,
2059+ } ) ;
2060+ } ;
2061+
2062+ const stream = await transport . sendMessages ( {
2063+ trigger : "submit-message" ,
2064+ chatId : "chat-tracking-cleanup-delete-failure" ,
2065+ messageId : undefined ,
2066+ messages : [ ] ,
2067+ abortSignal : undefined ,
2068+ } ) ;
2069+
2070+ await expect ( readChunks ( stream ) ) . rejects . toThrowError ( "tracking failed root cause" ) ;
2071+
2072+ await waitForCondition ( function ( ) {
2073+ return errors . length === 1 ;
2074+ } ) ;
2075+
2076+ expect ( errors [ 0 ] ) . toMatchObject ( {
2077+ phase : "consumeTrackingStream" ,
2078+ chatId : "chat-tracking-cleanup-delete-failure" ,
2079+ runId : "run_tracking_cleanup_delete_failure" ,
2080+ } ) ;
2081+ expect ( errors [ 0 ] ?. error . message ) . toBe ( "tracking failed root cause" ) ;
2082+ } ) ;
2083+
19662084 it ( "reports reconnect failures through onError" , async function ( ) {
19672085 const errors : TriggerChatTransportError [ ] = [ ] ;
19682086 const runStore = new InMemoryTriggerChatRunStore ( ) ;
0 commit comments