@@ -204,6 +204,7 @@ describe("useThreadMessaging telemetry", () => {
204204 } ) ;
205205
206206 it ( "uses turn/steer when steer mode is enabled and an active turn is present" , async ( ) => {
207+ const dispatch = vi . fn ( ) ;
207208 const { result } = renderHook ( ( ) =>
208209 useThreadMessaging ( {
209210 activeWorkspace : workspace ,
@@ -229,7 +230,7 @@ describe("useThreadMessaging telemetry", () => {
229230 } ,
230231 rateLimitsByWorkspace : { } ,
231232 pendingInterruptsRef : { current : new Set < string > ( ) } ,
232- dispatch : vi . fn ( ) ,
233+ dispatch,
233234 getCustomName : vi . fn ( ( ) => undefined ) ,
234235 markProcessing : vi . fn ( ) ,
235236 markReviewing : vi . fn ( ) ,
@@ -263,14 +264,15 @@ describe("useThreadMessaging telemetry", () => {
263264 [ ] ,
264265 ) ;
265266 expect ( sendUserMessageService ) . not . toHaveBeenCalled ( ) ;
267+ expect ( dispatch ) . not . toHaveBeenCalledWith (
268+ expect . objectContaining ( { type : "upsertItem" } ) ,
269+ ) ;
266270 } ) ;
267271
268- it ( "falls back to turn/start when turn/steer is unsupported and remembers fallback" , async ( ) => {
272+ it ( "does not fall back to turn/start when turn/steer fails" , async ( ) => {
273+ const pushThreadErrorMessage = vi . fn ( ) ;
269274 vi . mocked ( steerTurnService ) . mockResolvedValueOnce ( {
270- error : {
271- message :
272- "Invalid request: unknown variant `turn/steer`, expected one of `turn/start`, `turn/interrupt`" ,
273- } ,
275+ error : { message : "no active turn to steer" } ,
274276 } as unknown as Awaited < ReturnType < typeof steerTurnService > > ) ;
275277
276278 const { result } = renderHook ( ( ) =>
@@ -306,89 +308,7 @@ describe("useThreadMessaging telemetry", () => {
306308 recordThreadActivity : vi . fn ( ) ,
307309 safeMessageActivity : vi . fn ( ) ,
308310 onDebug : vi . fn ( ) ,
309- pushThreadErrorMessage : vi . fn ( ) ,
310- ensureThreadForActiveWorkspace : vi . fn ( async ( ) => "thread-1" ) ,
311- ensureThreadForWorkspace : vi . fn ( async ( ) => "thread-1" ) ,
312- refreshThread : vi . fn ( async ( ) => null ) ,
313- forkThreadForWorkspace : vi . fn ( async ( ) => null ) ,
314- updateThreadParent : vi . fn ( ) ,
315- } ) ,
316- ) ;
317-
318- await act ( async ( ) => {
319- await result . current . sendUserMessageToThread (
320- workspace ,
321- "thread-1" ,
322- "fallback once" ,
323- [ ] ,
324- ) ;
325- } ) ;
326- await act ( async ( ) => {
327- await result . current . sendUserMessageToThread (
328- workspace ,
329- "thread-1" ,
330- "fallback twice" ,
331- [ ] ,
332- ) ;
333- } ) ;
334-
335- expect ( steerTurnService ) . toHaveBeenCalledTimes ( 1 ) ;
336- expect ( sendUserMessageService ) . toHaveBeenCalledTimes ( 2 ) ;
337- expect ( sendUserMessageService ) . toHaveBeenNthCalledWith (
338- 1 ,
339- "ws-1" ,
340- "thread-1" ,
341- "fallback once" ,
342- expect . any ( Object ) ,
343- ) ;
344- expect ( sendUserMessageService ) . toHaveBeenNthCalledWith (
345- 2 ,
346- "ws-1" ,
347- "thread-1" ,
348- "fallback twice" ,
349- expect . any ( Object ) ,
350- ) ;
351- } ) ;
352-
353- it ( "falls back to turn/start when remote reports unknown method turn_steer" , async ( ) => {
354- vi . mocked ( steerTurnService ) . mockRejectedValueOnce (
355- new Error ( "unknown method: turn_steer" ) ,
356- ) ;
357-
358- const { result } = renderHook ( ( ) =>
359- useThreadMessaging ( {
360- activeWorkspace : workspace ,
361- activeThreadId : "thread-1" ,
362- accessMode : "current" ,
363- model : null ,
364- effort : null ,
365- collaborationMode : null ,
366- reviewDeliveryMode : "inline" ,
367- steerEnabled : true ,
368- customPrompts : [ ] ,
369- threadStatusById : {
370- "thread-1" : {
371- isProcessing : true ,
372- isReviewing : false ,
373- hasUnread : false ,
374- processingStartedAt : 0 ,
375- lastDurationMs : null ,
376- } ,
377- } ,
378- activeTurnIdByThread : {
379- "thread-1" : "turn-1" ,
380- } ,
381- rateLimitsByWorkspace : { } ,
382- pendingInterruptsRef : { current : new Set < string > ( ) } ,
383- dispatch : vi . fn ( ) ,
384- getCustomName : vi . fn ( ( ) => undefined ) ,
385- markProcessing : vi . fn ( ) ,
386- markReviewing : vi . fn ( ) ,
387- setActiveTurnId : vi . fn ( ) ,
388- recordThreadActivity : vi . fn ( ) ,
389- safeMessageActivity : vi . fn ( ) ,
390- onDebug : vi . fn ( ) ,
391- pushThreadErrorMessage : vi . fn ( ) ,
311+ pushThreadErrorMessage,
392312 ensureThreadForActiveWorkspace : vi . fn ( async ( ) => "thread-1" ) ,
393313 ensureThreadForWorkspace : vi . fn ( async ( ) => "thread-1" ) ,
394314 refreshThread : vi . fn ( async ( ) => null ) ,
@@ -401,18 +321,16 @@ describe("useThreadMessaging telemetry", () => {
401321 await result . current . sendUserMessageToThread (
402322 workspace ,
403323 "thread-1" ,
404- "fallback remote method " ,
324+ "steer should fail " ,
405325 [ ] ,
406326 ) ;
407327 } ) ;
408328
409329 expect ( steerTurnService ) . toHaveBeenCalledTimes ( 1 ) ;
410- expect ( sendUserMessageService ) . toHaveBeenCalledTimes ( 1 ) ;
411- expect ( sendUserMessageService ) . toHaveBeenCalledWith (
412- "ws-1" ,
330+ expect ( sendUserMessageService ) . not . toHaveBeenCalled ( ) ;
331+ expect ( pushThreadErrorMessage ) . toHaveBeenCalledWith (
413332 "thread-1" ,
414- "fallback remote method" ,
415- expect . any ( Object ) ,
333+ "Turn steer failed: no active turn to steer" ,
416334 ) ;
417335 } ) ;
418336} ) ;
0 commit comments