



















@@ -2523,7 +2523,7 @@ describe("dispatchTelegramMessage draft streaming", () => {
25232523});
2524252425252525expect(answerDraftStream.updatePreview).not.toHaveBeenCalledWith(
2526-expect.stringContaining("stdout line one"),
2526+expect.objectContaining({ text: expect.stringContaining("stdout line one") }),
25272527);
25282528expect(answerDraftStream.updatePreview).toHaveBeenLastCalledWith(
25292529expect.objectContaining({
@@ -2758,6 +2758,92 @@ describe("dispatchTelegramMessage draft streaming", () => {
27582758expect(draftStream.flush).toHaveBeenCalled();
27592759});
276027602761+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+27612847it("composes streamed reasoning with tool progress in Telegram progress drafts", async () => {
27622848const draftStream = createSequencedDraftStream(2001);
27632849createTelegramDraftStream.mockReturnValue(draftStream);
@@ -2842,9 +2928,11 @@ describe("dispatchTelegramMessage draft streaming", () => {
28422928},
28432929});
284429302845-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});
2849293728502938it("keeps the progress draft label when tool progress lines are hidden", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。