






















@@ -499,7 +499,7 @@ describe("dispatchTelegramMessage draft streaming", () => {
499499);
500500});
501501502-it("suppresses Telegram tool progress by default", async () => {
502+it("streams Telegram tool progress by default when preview streaming is active", async () => {
503503const draftStream = createDraftStream();
504504createTelegramDraftStream.mockReturnValue(draftStream);
505505dispatchReplyWithBufferedBlockDispatcher.mockImplementation(async ({ replyOptions }) => {
@@ -510,6 +510,33 @@ describe("dispatchTelegramMessage draft streaming", () => {
510510511511await dispatchWithContext({ context: createContext(), streamMode: "partial" });
512512513+expect(draftStream.update).toHaveBeenCalledWith(
514+"Working…\n• `tool: exec`\n• `exec ls ~/Desktop`",
515+);
516+expect(dispatchReplyWithBufferedBlockDispatcher).toHaveBeenCalledWith(
517+expect.objectContaining({
518+replyOptions: expect.objectContaining({
519+suppressDefaultToolProgressMessages: true,
520+}),
521+}),
522+);
523+});
524+525+it("suppresses Telegram tool progress when explicitly disabled", async () => {
526+const draftStream = createDraftStream();
527+createTelegramDraftStream.mockReturnValue(draftStream);
528+dispatchReplyWithBufferedBlockDispatcher.mockImplementation(async ({ replyOptions }) => {
529+await replyOptions?.onToolStart?.({ name: "exec", phase: "start" });
530+await replyOptions?.onItemEvent?.({ progressText: "exec ls ~/Desktop" });
531+return { queuedFinal: false };
532+});
533+534+await dispatchWithContext({
535+context: createContext(),
536+streamMode: "partial",
537+telegramCfg: { streaming: { preview: { toolProgress: false } } },
538+});
539+513540expect(draftStream.update).not.toHaveBeenCalled();
514541expect(dispatchReplyWithBufferedBlockDispatcher).toHaveBeenCalledWith(
515542expect.objectContaining({
@@ -520,7 +547,7 @@ describe("dispatchTelegramMessage draft streaming", () => {
520547);
521548});
522549523-it("streams Telegram tool progress only when explicitly enabled", async () => {
550+it("keeps Telegram tool progress links inside code formatting", async () => {
524551const draftStream = createDraftStream();
525552createTelegramDraftStream.mockReturnValue(draftStream);
526553dispatchReplyWithBufferedBlockDispatcher.mockImplementation(async ({ replyOptions }) => {
@@ -532,7 +559,6 @@ describe("dispatchTelegramMessage draft streaming", () => {
532559await dispatchWithContext({
533560context: createContext(),
534561streamMode: "partial",
535-telegramCfg: { streaming: { preview: { toolProgress: true } } },
536562});
537563538564const lastPreviewText = draftStream.update.mock.calls.at(-1)?.[0];
@@ -566,11 +592,32 @@ describe("dispatchTelegramMessage draft streaming", () => {
566592const progressLine = lastPreviewText.split("\n").at(1) ?? "";
567593568594expect(lastPreviewText.length).toBeLessThan(340);
569-expect(progressLine).toMatch(/^• `{10}/);
595+expect(progressLine).toMatch(/^• `'{10}/);
570596expect(progressLine).toContain("…");
571597expect(renderTelegramHtmlText(lastPreviewText)).not.toContain("<a ");
572598});
573599600+it("does not let Telegram tool progress backticks break out of code formatting", async () => {
601+const draftStream = createDraftStream();
602+createTelegramDraftStream.mockReturnValue(draftStream);
603+const breakoutProgress = `${"`".repeat(10)} [label](tg://user?id=123)`;
604+dispatchReplyWithBufferedBlockDispatcher.mockImplementation(async ({ replyOptions }) => {
605+await replyOptions?.onItemEvent?.({ progressText: breakoutProgress });
606+return { queuedFinal: false };
607+});
608+609+await dispatchWithContext({
610+context: createContext(),
611+streamMode: "partial",
612+telegramCfg: { streaming: { preview: { toolProgress: true } } },
613+});
614+615+const lastPreviewText = draftStream.update.mock.calls.at(-1)?.[0] ?? "";
616+617+expect(lastPreviewText).toContain(`• \`'''''''''' [label](tg://user?id=123)\``);
618+expect(renderTelegramHtmlText(lastPreviewText)).not.toContain("<a ");
619+});
620+574621it("keeps block streaming enabled when account config enables it", async () => {
575622dispatchReplyWithBufferedBlockDispatcher.mockImplementation(async ({ dispatcherOptions }) => {
576623await dispatcherOptions.deliver({ text: "Hello" }, { kind: "final" });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。