






















@@ -1812,9 +1812,9 @@ describe("dispatchTelegramMessage draft streaming", () => {
18121812telegramCfg: { streaming: { mode: "partial" } },
18131813});
181418141815-expect(mockCallArg(answerDraftStream.update)).toContain("Exec");
1816-expect(answerDraftStream.update).toHaveBeenNthCalledWith(2, "Done ");
1817-expect(answerDraftStream.update).toHaveBeenNthCalledWith(3, "Done answer");
1815+expect(mockCallArg(answerDraftStream.updatePreview).text).toContain("Exec");
1816+expect(answerDraftStream.update).toHaveBeenNthCalledWith(1, "Done ");
1817+expect(answerDraftStream.update).toHaveBeenNthCalledWith(2, "Done answer");
18181818expect(answerDraftStream.update).toHaveBeenLastCalledWith("Done answer.");
18191819expect(deliverReplies).not.toHaveBeenCalled();
18201820});
@@ -2219,15 +2219,14 @@ describe("dispatchTelegramMessage draft streaming", () => {
2219221922202220expect(answerDraftStream.update).toHaveBeenNthCalledWith(1, "Site A shows X.");
22212221expect(answerDraftStream.update).toHaveBeenNthCalledWith(2, "Site A shows X.");
2222-expect(answerDraftStream.update).toHaveBeenNthCalledWith(
2223-3,
2224-expect.stringMatching(/`🛠️ Exec`$/),
2222+expect(answerDraftStream.updatePreview).toHaveBeenCalledWith(
2223+expect.objectContaining({ text: expect.stringMatching(/`🛠️ Exec`$/) }),
22252224);
2226-expect(answerDraftStream.update).toHaveBeenNthCalledWith(4, "Final answer");
2225+expect(answerDraftStream.update).toHaveBeenNthCalledWith(3, "Final answer");
22272226expect(answerDraftStream.clear).toHaveBeenCalledTimes(1);
22282227expect(answerDraftStream.forceNewMessage).toHaveBeenCalledTimes(2);
22292228const progressResetOrder = answerDraftStream.forceNewMessage.mock.invocationCallOrder[0];
2230-const progressUpdateOrder = answerDraftStream.update.mock.invocationCallOrder[2];
2229+const progressUpdateOrder = answerDraftStream.updatePreview.mock.invocationCallOrder[0];
22312230expect(progressResetOrder).toBeLessThan(progressUpdateOrder);
22322231expect(deliverReplies).not.toHaveBeenCalled();
22332232});
@@ -2247,12 +2246,11 @@ describe("dispatchTelegramMessage draft streaming", () => {
22472246await dispatchWithContext({ context: createContext() });
2248224722492248expect(answerDraftStream.update).toHaveBeenNthCalledWith(1, "Site A shows X.");
2250-expect(answerDraftStream.update).toHaveBeenNthCalledWith(
2251-2,
2252-expect.stringMatching(/`🛠️ Exec`$/),
2249+expect(answerDraftStream.updatePreview).toHaveBeenCalledWith(
2250+expect.objectContaining({ text: expect.stringMatching(/`🛠️ Exec`$/) }),
22532251);
2254-expect(answerDraftStream.update).toHaveBeenNthCalledWith(3, "Site B shows Y.");
2255-expect(answerDraftStream.update).toHaveBeenNthCalledWith(4, "Final answer");
2252+expect(answerDraftStream.update).toHaveBeenNthCalledWith(2, "Site B shows Y.");
2253+expect(answerDraftStream.update).toHaveBeenNthCalledWith(3, "Final answer");
22562254expect(answerDraftStream.forceNewMessage).toHaveBeenCalledTimes(2);
22572255expect(answerDraftStream.clear).toHaveBeenCalledTimes(1);
22582256expect(deliverReplies).not.toHaveBeenCalled();
@@ -2290,16 +2288,15 @@ describe("dispatchTelegramMessage draft streaming", () => {
2290228822912289await dispatchWithContext({ context: createContext() });
229222902293-expect(answerDraftStream.update).toHaveBeenNthCalledWith(
2294-1,
2295-expect.stringMatching(/`🛠️ Exec`$/),
2291+expect(answerDraftStream.updatePreview).toHaveBeenCalledWith(
2292+expect.objectContaining({ text: expect.stringMatching(/`🛠️ Exec`$/) }),
22962293);
2297-expect(answerDraftStream.update).toHaveBeenNthCalledWith(2, "Branch is up to date");
2294+expect(answerDraftStream.update).toHaveBeenNthCalledWith(1, "Branch is up to date");
22982295expect(answerDraftStream.forceNewMessage).toHaveBeenCalledTimes(1);
22992296expect(answerDraftStream.clear).toHaveBeenCalledTimes(1);
23002297const clearOrder = answerDraftStream.clear.mock.invocationCallOrder[0];
23012298const rotationOrder = answerDraftStream.forceNewMessage.mock.invocationCallOrder[0];
2302-const finalUpdateOrder = answerDraftStream.update.mock.invocationCallOrder[1];
2299+const finalUpdateOrder = answerDraftStream.update.mock.invocationCallOrder[0];
23032300expect(clearOrder).toBeLessThan(rotationOrder);
23042301expect(rotationOrder).toBeLessThan(finalUpdateOrder);
23052302});
@@ -2317,16 +2314,15 @@ describe("dispatchTelegramMessage draft streaming", () => {
2317231423182315await dispatchWithContext({ context: createContext() });
231923162320-expect(answerDraftStream.update).toHaveBeenNthCalledWith(
2321-1,
2322-expect.stringMatching(/`🛠️ Exec`$/),
2317+expect(answerDraftStream.updatePreview).toHaveBeenCalledWith(
2318+expect.objectContaining({ text: expect.stringMatching(/`🛠️ Exec`$/) }),
23232319);
2324-expect(answerDraftStream.update).toHaveBeenNthCalledWith(2, "Branch is up to date");
2320+expect(answerDraftStream.update).toHaveBeenNthCalledWith(1, "Branch is up to date");
23252321expect(answerDraftStream.forceNewMessage).toHaveBeenCalledTimes(1);
23262322expect(answerDraftStream.clear).toHaveBeenCalledTimes(1);
23272323const clearOrder = answerDraftStream.clear.mock.invocationCallOrder[0];
23282324const rotationOrder = answerDraftStream.forceNewMessage.mock.invocationCallOrder[0];
2329-const finalUpdateOrder = answerDraftStream.update.mock.invocationCallOrder[1];
2325+const finalUpdateOrder = answerDraftStream.update.mock.invocationCallOrder[0];
23302326expect(clearOrder).toBeLessThan(rotationOrder);
23312327expect(rotationOrder).toBeLessThan(finalUpdateOrder);
23322328});
@@ -2373,9 +2369,13 @@ describe("dispatchTelegramMessage draft streaming", () => {
23732369telegramCfg: { streaming: { mode: "progress" } },
23742370});
237523712376-expect(answerDraftStream.update).toHaveBeenCalledWith(
2377-"Cracking\n\n`🛠️ Exec`\n\n`🛠️ git rev-parse --abbrev-ref HEAD`",
2378-);
2372+expect(answerDraftStream.updatePreview).toHaveBeenCalledWith({
2373+text: "Cracking\n\n`🛠️ Exec`\n`🛠️ git rev-parse --abbrev-ref HEAD`",
2374+richMessage: {
2375+html: "<b>Cracking</b><br><b>🛠️ Exec</b><br><b>🛠️ Exec</b> <code>git rev-parse --abbrev-ref HEAD</code>",
2376+skip_entity_detection: true,
2377+},
2378+});
23792379expect(answerDraftStream.update).not.toHaveBeenCalledWith("Branch is up to date");
23802380expect(answerDraftStream.forceNewMessage).toHaveBeenCalledTimes(1);
23812381expect(answerDraftStream.clear).toHaveBeenCalledTimes(1);
@@ -2400,12 +2400,18 @@ describe("dispatchTelegramMessage draft streaming", () => {
24002400telegramCfg: { streaming: { mode: "progress" } },
24012401});
240224022403-expect(answerDraftStream.update).toHaveBeenCalledTimes(2);
2404-expect(answerDraftStream.update).toHaveBeenNthCalledWith(1, "Cracking\n\n`🛠️ Exec`");
2405-expect(answerDraftStream.update).toHaveBeenNthCalledWith(2, trailingFinalStatusText);
2403+expect(answerDraftStream.updatePreview).toHaveBeenCalledWith({
2404+text: "Cracking\n\n`🛠️ Exec`",
2405+richMessage: {
2406+html: "<b>Cracking</b><br><b>🛠️ Exec</b>",
2407+skip_entity_detection: true,
2408+},
2409+});
2410+expect(answerDraftStream.update).toHaveBeenCalledTimes(1);
2411+expect(answerDraftStream.update).toHaveBeenNthCalledWith(1, trailingFinalStatusText);
24062412expect(answerDraftStream.forceNewMessage).toHaveBeenCalledTimes(2);
24072413expect(answerDraftStream.forceNewMessage.mock.invocationCallOrder[1]).toBeLessThan(
2408-answerDraftStream.update.mock.invocationCallOrder[1],
2414+answerDraftStream.update.mock.invocationCallOrder[0],
24092415);
24102416expectDeliveredReply(0, { text: "Branch is up to date" });
24112417});
@@ -2430,11 +2436,13 @@ describe("dispatchTelegramMessage draft streaming", () => {
24302436telegramCfg: { streaming: { mode: "progress", progress: { label: "Shelling" } } },
24312437});
243224382433-expect(answerDraftStream.update).not.toHaveBeenCalledWith(
2439+expect(answerDraftStream.updatePreview).not.toHaveBeenCalledWith(
24342440expect.stringContaining("stdout line one"),
24352441);
2436-expect(answerDraftStream.update).toHaveBeenLastCalledWith(
2437-"Shelling\n\n`🛠️ Exec`\n\n`🔎 Web Search: docs lookup`",
2442+expect(answerDraftStream.updatePreview).toHaveBeenLastCalledWith(
2443+expect.objectContaining({
2444+text: "Shelling\n\n`🛠️ Exec`\n`🔎 Web Search: docs lookup`",
2445+}),
24382446);
24392447expect(deliverReplies).not.toHaveBeenCalled();
24402448});
@@ -2456,8 +2464,10 @@ describe("dispatchTelegramMessage draft streaming", () => {
24562464telegramCfg: { streaming: { mode: "progress", progress: { label: "Shelling" } } },
24572465});
245824662459-expect(answerDraftStream.update).toHaveBeenCalledTimes(1);
2460-expect(answerDraftStream.update).toHaveBeenCalledWith("Shelling\n\n`🛠️ Exec`");
2467+expect(answerDraftStream.updatePreview).toHaveBeenCalledTimes(1);
2468+expect(answerDraftStream.updatePreview).toHaveBeenCalledWith(
2469+expect.objectContaining({ text: "Shelling\n\n`🛠️ Exec`" }),
2470+);
24612471expectDeliveredReply(0, { text: "Branch is up to date" });
24622472});
24632473@@ -2484,8 +2494,10 @@ describe("dispatchTelegramMessage draft streaming", () => {
24842494telegramCfg: { streaming: { mode: "progress", progress: { label: "Shelling" } } },
24852495});
248624962487-expect(answerDraftStream.update).toHaveBeenCalledTimes(1);
2488-expect(answerDraftStream.update).toHaveBeenCalledWith("Shelling\n\n`🛠️ Exec`");
2497+expect(answerDraftStream.updatePreview).toHaveBeenCalledTimes(1);
2498+expect(answerDraftStream.updatePreview).toHaveBeenCalledWith(
2499+expect.objectContaining({ text: "Shelling\n\n`🛠️ Exec`" }),
2500+);
24892501expectDeliveredReply(0, { text: "Branch is up to date" });
24902502});
24912503@@ -2516,8 +2528,10 @@ describe("dispatchTelegramMessage draft streaming", () => {
25162528telegramCfg: { streaming: { mode: "progress", progress: { label: "Shelling" } } },
25172529});
251825302519-expect(answerDraftStream.update).toHaveBeenCalledTimes(1);
2520-expect(answerDraftStream.update).toHaveBeenCalledWith("Shelling\n\n`🛠️ Exec`");
2531+expect(answerDraftStream.updatePreview).toHaveBeenCalledTimes(1);
2532+expect(answerDraftStream.updatePreview).toHaveBeenCalledWith(
2533+expect.objectContaining({ text: "Shelling\n\n`🛠️ Exec`" }),
2534+);
25212535expectDeliveredReply(0, { text: "Branch is up to date" });
25222536});
25232537@@ -2648,7 +2662,13 @@ describe("dispatchTelegramMessage draft streaming", () => {
26482662telegramCfg: { streaming: { mode: "progress", progress: { label: "Shelling" } } },
26492663});
265026642651-expect(draftStream.update).toHaveBeenCalledWith("Shelling\n\n`🛠️ Exec`");
2665+expect(draftStream.updatePreview).toHaveBeenCalledWith({
2666+text: "Shelling\n\n`🛠️ Exec`",
2667+richMessage: {
2668+html: "<b>Shelling</b><br><b>🛠️ Exec</b>",
2669+skip_entity_detection: true,
2670+},
2671+});
26522672expect(draftStream.flush).toHaveBeenCalled();
26532673});
26542674@@ -2670,7 +2690,13 @@ describe("dispatchTelegramMessage draft streaming", () => {
26702690});
2671269126722692expect(createTelegramDraftStream).toHaveBeenCalledTimes(1);
2673-expect(draftStream.update).toHaveBeenCalledWith("Shelling\n\n`🛠️ Exec`\n\n• _Checking files_");
2693+expect(draftStream.updatePreview).toHaveBeenCalledWith({
2694+text: "Shelling\n\n`🛠️ Exec`\n• _Checking files_",
2695+richMessage: {
2696+html: "<b>Shelling</b><br><b>🛠️ Exec</b><br><i>Checking files</i>",
2697+skip_entity_detection: true,
2698+},
2699+});
26742700});
2675270126762702it("renders configured Telegram commentary progress from preamble item events", async () => {
@@ -2697,7 +2723,13 @@ describe("dispatchTelegramMessage draft streaming", () => {
26972723},
26982724});
269927252700-expect(draftStream.update).toHaveBeenCalledWith("Shelling\n\n_Checking recent context_");
2726+expect(draftStream.updatePreview).toHaveBeenCalledWith({
2727+text: "Shelling\n\n_Checking recent context_",
2728+richMessage: {
2729+html: "<b>Shelling</b><br><i>Checking recent context</i>",
2730+skip_entity_detection: true,
2731+},
2732+});
27012733});
2702273427032735it("suppresses Telegram preamble progress when commentary is disabled", async () => {
@@ -2724,7 +2756,9 @@ describe("dispatchTelegramMessage draft streaming", () => {
27242756},
27252757});
272627582727-expect(draftStream.update).not.toHaveBeenCalledWith(expect.stringContaining("Checking recent"));
2759+expect(draftStream.updatePreview).not.toHaveBeenCalledWith(
2760+expect.objectContaining({ text: expect.stringContaining("Checking recent") }),
2761+);
27282762});
2729276327302764it("keeps the progress draft label when tool progress lines are hidden", async () => {
@@ -2748,7 +2782,10 @@ describe("dispatchTelegramMessage draft streaming", () => {
27482782},
27492783});
275027842751-expect(draftStream.update).toHaveBeenCalledWith("Shelling");
2785+expect(draftStream.updatePreview).toHaveBeenCalledWith({
2786+text: "Shelling",
2787+richMessage: { html: "<b>Shelling</b>", skip_entity_detection: true },
2788+});
27522789expect(draftStream.flush).toHaveBeenCalled();
27532790});
27542791@@ -2777,10 +2814,20 @@ describe("dispatchTelegramMessage draft streaming", () => {
27772814},
27782815});
277928162780-await vi.waitFor(() => expect(draftStream.update).toHaveBeenCalledWith("Working"));
2781-expect(draftStream.update).not.toHaveBeenCalledWith("Working.");
2782-expect(draftStream.update).not.toHaveBeenCalledWith("Working..");
2783-expect(draftStream.update).not.toHaveBeenCalledWith("Working...");
2817+await vi.waitFor(() =>
2818+expect(draftStream.updatePreview).toHaveBeenCalledWith(
2819+expect.objectContaining({ text: "Working" }),
2820+),
2821+);
2822+expect(draftStream.updatePreview).not.toHaveBeenCalledWith(
2823+expect.objectContaining({ text: "Working." }),
2824+);
2825+expect(draftStream.updatePreview).not.toHaveBeenCalledWith(
2826+expect.objectContaining({ text: "Working.." }),
2827+);
2828+expect(draftStream.updatePreview).not.toHaveBeenCalledWith(
2829+expect.objectContaining({ text: "Working..." }),
2830+);
27842831finishRun?.();
27852832await run;
27862833});
@@ -2800,10 +2847,10 @@ describe("dispatchTelegramMessage draft streaming", () => {
28002847const pendingToolStart = replyOptions?.onToolStart?.({ name: "exec", phase: "start" });
28012848await Promise.resolve();
28022849await Promise.resolve();
2803-const updateBeforeStatusReaction = draftStream.update.mock.calls.at(-1)?.[0];
2850+const updateBeforeStatusReaction = draftStream.updatePreview.mock.calls.at(-1)?.[0]?.text;
28042851releaseSetTool?.();
28052852await pendingToolStart;
2806-expect(updateBeforeStatusReaction).toMatch(/^Shelling\n`🛠️ Exec`$/);
2853+expect(updateBeforeStatusReaction).toBe("Shelling\n\n`🛠️ Exec`");
28072854return { queuedFinal: false };
28082855});
28092856@@ -2839,9 +2886,13 @@ describe("dispatchTelegramMessage draft streaming", () => {
28392886telegramCfg: { streaming: { mode: "progress", progress: { label: "Shelling" } } },
28402887});
284128882842-expect(draftStream.update).toHaveBeenCalledWith(
2843-"Shelling\n\n`🔎 Web Search: docs lookup`\n\n• `tests passed`",
2844-);
2889+expect(draftStream.updatePreview).toHaveBeenCalledWith({
2890+text: "Shelling\n\n`🔎 Web Search: docs lookup`\n• `tests passed`",
2891+richMessage: {
2892+html: "<b>Shelling</b><br><b>🔎 Web Search</b> <code>docs lookup</code><br><b>Update</b> <code>tests passed</code>",
2893+skip_entity_detection: true,
2894+},
2895+});
28452896expect(draftStream.forceNewMessage).toHaveBeenCalledTimes(1);
28462897expect(draftStream.materialize).not.toHaveBeenCalled();
28472898expect(draftStream.clear).toHaveBeenCalledTimes(1);
@@ -3984,7 +4035,7 @@ describe("dispatchTelegramMessage draft streaming", () => {
39844035telegramCfg: { streaming: { mode: "partial" } },
39854036});
398640373987-expect(mockCallArg(answerDraftStream.update)).toContain("Exec");
4038+expect(mockCallArg(answerDraftStream.updatePreview).text).toContain("Exec");
39884039expect(answerDraftStream.update).toHaveBeenLastCalledWith("block after progress");
39894040});
39904041此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。