@@ -2523,7 +2523,7 @@ describe("dispatchTelegramMessage draft streaming", () => {
25232523 } ) ;
25242524
25252525 expect ( answerDraftStream . updatePreview ) . not . toHaveBeenCalledWith (
2526- expect . stringContaining ( "stdout line one" ) ,
2526+ expect . objectContaining ( { text : expect . stringContaining ( "stdout line one" ) } ) ,
25272527 ) ;
25282528 expect ( answerDraftStream . updatePreview ) . toHaveBeenLastCalledWith (
25292529 expect . objectContaining ( {
@@ -2758,6 +2758,92 @@ describe("dispatchTelegramMessage draft streaming", () => {
27582758 expect ( draftStream . flush ) . toHaveBeenCalled ( ) ;
27592759 } ) ;
27602760
2761+ it ( "renders command status without command output in Telegram progress draft previews" , async ( ) => {
2762+ const draftStream = createSequencedDraftStream ( 2001 ) ;
2763+ createTelegramDraftStream . mockReturnValue ( draftStream ) ;
2764+ dispatchReplyWithBufferedBlockDispatcher . mockImplementation ( async ( { replyOptions } ) => {
2765+ await replyOptions ?. onReplyStart ?.( ) ;
2766+ await replyOptions ?. onAssistantMessageStart ?.( ) ;
2767+ await replyOptions ?. onToolStart ?.( {
2768+ name : "exec" ,
2769+ phase : "start" ,
2770+ toolCallId : "exec-1" ,
2771+ args : { command : "false" } ,
2772+ } ) ;
2773+ await replyOptions ?. onCommandOutput ?.( {
2774+ phase : "end" ,
2775+ title : "command false" ,
2776+ name : "exec" ,
2777+ toolCallId : "exec-1" ,
2778+ output : "No such file or directory" ,
2779+ exitCode : 2 ,
2780+ } ) ;
2781+ return { queuedFinal : false } ;
2782+ } ) ;
2783+
2784+ await dispatchWithContext ( {
2785+ context : createContext ( ) ,
2786+ streamMode : "progress" ,
2787+ telegramCfg : {
2788+ streaming : {
2789+ mode : "progress" ,
2790+ progress : { label : "Shelling" , commandText : "raw" } ,
2791+ } ,
2792+ } ,
2793+ } ) ;
2794+
2795+ expect ( draftStream . updatePreview ) . toHaveBeenLastCalledWith ( {
2796+ text : "Shelling\n\n`🛠️ exit 2; command false`" ,
2797+ richMessage : {
2798+ html : "<b>Shelling</b><br><b>🛠️ Exec</b> <code>command false</code> <i>exit 2</i>" ,
2799+ skip_entity_detection : true ,
2800+ } ,
2801+ } ) ;
2802+ } ) ;
2803+
2804+ it ( "hides command titles in Telegram status-only progress draft previews" , async ( ) => {
2805+ const draftStream = createSequencedDraftStream ( 2001 ) ;
2806+ createTelegramDraftStream . mockReturnValue ( draftStream ) ;
2807+ dispatchReplyWithBufferedBlockDispatcher . mockImplementation ( async ( { replyOptions } ) => {
2808+ await replyOptions ?. onReplyStart ?.( ) ;
2809+ await replyOptions ?. onAssistantMessageStart ?.( ) ;
2810+ await replyOptions ?. onToolStart ?.( {
2811+ name : "exec" ,
2812+ phase : "start" ,
2813+ toolCallId : "exec-1" ,
2814+ args : { command : "curl -H 'Authorization: token' https://example.test" } ,
2815+ } ) ;
2816+ await replyOptions ?. onCommandOutput ?.( {
2817+ phase : "end" ,
2818+ title : "curl -H 'Authorization: token' https://example.test" ,
2819+ name : "exec" ,
2820+ toolCallId : "exec-1" ,
2821+ output : "secret response" ,
2822+ exitCode : 2 ,
2823+ } ) ;
2824+ return { queuedFinal : false } ;
2825+ } ) ;
2826+
2827+ await dispatchWithContext ( {
2828+ context : createContext ( ) ,
2829+ streamMode : "progress" ,
2830+ telegramCfg : {
2831+ streaming : {
2832+ mode : "progress" ,
2833+ progress : { label : "Shelling" , commandText : "status" } ,
2834+ } ,
2835+ } ,
2836+ } ) ;
2837+
2838+ expect ( draftStream . updatePreview ) . toHaveBeenLastCalledWith ( {
2839+ text : "Shelling\n\n`🛠️ exit 2`" ,
2840+ richMessage : {
2841+ html : "<b>Shelling</b><br><b>🛠️ Exec</b> <code>exit 2</code>" ,
2842+ skip_entity_detection : true ,
2843+ } ,
2844+ } ) ;
2845+ } ) ;
2846+
27612847 it ( "composes streamed reasoning with tool progress in Telegram progress drafts" , async ( ) => {
27622848 const draftStream = createSequencedDraftStream ( 2001 ) ;
27632849 createTelegramDraftStream . mockReturnValue ( draftStream ) ;
@@ -2842,9 +2928,11 @@ describe("dispatchTelegramMessage draft streaming", () => {
28422928 } ,
28432929 } ) ;
28442930
2845- expect ( draftStream . updatePreview ) . not . toHaveBeenCalledWith (
2846- expect . objectContaining ( { text : expect . stringContaining ( "Checking recent" ) } ) ,
2847- ) ;
2931+ expect (
2932+ draftStream . updatePreview . mock . calls . every (
2933+ ( [ preview ] ) => ! preview . text . includes ( "Checking recent" ) ,
2934+ ) ,
2935+ ) . toBe ( true ) ;
28482936 } ) ;
28492937
28502938 it ( "keeps the progress draft label when tool progress lines are hidden" , async ( ) => {
0 commit comments