惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
IT之家
IT之家
Microsoft Security Blog
Microsoft Security Blog
博客园 - 司徒正美
云风的 BLOG
云风的 BLOG
P
Proofpoint News Feed
D
DataBreaches.Net
B
Blog RSS Feed
博客园_首页
The GitHub Blog
The GitHub Blog
I
InfoQ
L
LangChain Blog
G
Google Developers Blog
M
MIT News - Artificial intelligence
美团技术团队
腾讯CDC
V
Visual Studio Blog
aimingoo的专栏
aimingoo的专栏
博客园 - 聂微东
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Apple Machine Learning Research
Apple Machine Learning Research
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗

Recent Commits to openclaw:main

test: merge chat side-result checks · openclaw/openclaw@ddd2c2a test: merge cron history checks · openclaw/openclaw@f7eb746 test: merge responsive navigation shell checks · openclaw/openclaw@c2e4b47 docs(changelog): add codex oauth fixes · openclaw/openclaw@628e6cd test: merge navigation routing cases · openclaw/openclaw@5d8cecb Tests: mock channel registry bundled fallback · openclaw/openclaw@2b08233 Secrets: avoid broad web search discovery for single plugin config · openclaw/openclaw@a464f59 test: merge config view browser checks · openclaw/openclaw@20cf511 fix(status): align oauth health with runtime · openclaw/openclaw@eed7116 feat: add macOS screen snapshots for monitor preview (#67954) thanks … · openclaw/openclaw@f377db1 fix: report shared auth scopes in hello-ok (#67810) thanks @BunsDev · openclaw/openclaw@0b6c39b Auto-reply: avoid eager bundled route fallback · openclaw/openclaw@3ea1bf4 Tests: narrow session binding contract setup · openclaw/openclaw@54e4e16 fix(macOS): enable undo/redo in webchat composer text input (#34962) · openclaw/openclaw@00951dc Tests: speed up channel setup promotion · openclaw/openclaw@82b529a Docs: refresh agent instructions · openclaw/openclaw@5775fe2 fix(auth): serialize OAuth refresh across agents to fix #26322 (#67876) · openclaw/openclaw@8e79080 test: allow ollama public surface boundary test · openclaw/openclaw@7d4f1a6 Docs: add test performance guardrails · openclaw/openclaw@89706d3 Tests: restore context-engine usage proof · openclaw/openclaw@e4c4f95 Tests: slim context engine runtime coverage · openclaw/openclaw@74c198f ci: retry failed custom checkouts · openclaw/openclaw@0ee5baf test: trim duplicate provider auth onboarding cases · openclaw/openclaw@1ffc02e matrix: fix sessions_spawn --thread subagent session spawning (#67643) · openclaw/openclaw@1ce2596 test: reduce auth choice fixture churn · openclaw/openclaw@857b9cd test: mock health status config boundaries · openclaw/openclaw@9d5ab4a test: mock onboard config io boundary · openclaw/openclaw@299694d test: mock legacy state plugin boundaries · openclaw/openclaw@2713089 test: mock channel install boundaries · openclaw/openclaw@b945248 test: mock doctor preview channel boundaries · openclaw/openclaw@b1a3ad4
fix(telegram): avoid duplicate progress headings · opencl...
vincentkoc · 2026-06-23 · via Recent Commits to openclaw:main

@@ -381,10 +381,10 @@ describe("dispatchTelegramMessage draft streaming", () => {

381381

return expectRecordFields(mockCallArg(createTelegramDraftStream), expected);

382382

}

383383384-

function telegramProgressPreview(text: string, html: string) {

384+

function telegramProgressPreview(_plainText: string, html: string) {

385385

return {

386-

text,

387-

richMessage: { html: html.replaceAll("\n", "<br>"), skip_entity_detection: true },

386+

text: html.replaceAll("\n", "<br>"),

387+

parseMode: "HTML" as const,

388388

};

389389

}

390390

@@ -1892,7 +1892,15 @@ describe("dispatchTelegramMessage draft streaming", () => {

18921892

content: fullAnswer,

18931893

messageId: 2001,

18941894

});

1895-

expect(appendSessionTranscriptMessage).not.toHaveBeenCalled();

1895+

const transcriptCall = expectRecordFields(mockCallArg(appendSessionTranscriptMessage), {

1896+

transcriptPath: "/tmp/session.jsonl",

1897+

});

1898+

expectRecordFields(transcriptCall.message, {

1899+

role: "assistant",

1900+

provider: "openclaw",

1901+

model: "delivery-mirror",

1902+

content: [{ type: "text", text: fullAnswer }],

1903+

});

18961904

});

1897190518981906

it("emits the redacted appended message in transcript updates", async () => {

@@ -2510,7 +2518,7 @@ describe("dispatchTelegramMessage draft streaming", () => {

25102518

expect(answerDraftStream.update).toHaveBeenNthCalledWith(1, "Site A shows X.");

25112519

expect(answerDraftStream.update).toHaveBeenNthCalledWith(2, "Site A shows X.");

25122520

expect(answerDraftStream.updatePreview).toHaveBeenCalledWith(

2513-

expect.objectContaining({ text: expect.stringMatching(/🛠 Exec$/) }),

2521+

expect.objectContaining({ text: expect.stringMatching(/🛠 Exec<\/b>$/) }),

25142522

);

25152523

expect(answerDraftStream.update).toHaveBeenNthCalledWith(3, "Final answer");

25162524

expect(answerDraftStream.clear).toHaveBeenCalledTimes(1);

@@ -2537,7 +2545,7 @@ describe("dispatchTelegramMessage draft streaming", () => {

2537254525382546

expect(answerDraftStream.update).toHaveBeenNthCalledWith(1, "Site A shows X.");

25392547

expect(answerDraftStream.updatePreview).toHaveBeenCalledWith(

2540-

expect.objectContaining({ text: expect.stringMatching(/🛠 Exec$/) }),

2548+

expect.objectContaining({ text: expect.stringMatching(/🛠 Exec<\/b>$/) }),

25412549

);

25422550

expect(answerDraftStream.update).toHaveBeenNthCalledWith(2, "Site B shows Y.");

25432551

expect(answerDraftStream.update).toHaveBeenNthCalledWith(3, "Final answer");

@@ -2579,7 +2587,7 @@ describe("dispatchTelegramMessage draft streaming", () => {

25792587

await dispatchWithContext({ context: createContext() });

2580258825812589

expect(answerDraftStream.updatePreview).toHaveBeenCalledWith(

2582-

expect.objectContaining({ text: expect.stringMatching(/🛠 Exec$/) }),

2590+

expect.objectContaining({ text: expect.stringMatching(/🛠 Exec<\/b>$/) }),

25832591

);

25842592

expect(answerDraftStream.update).toHaveBeenNthCalledWith(1, "Branch is up to date");

25852593

expect(answerDraftStream.forceNewMessage).toHaveBeenCalledTimes(1);

@@ -2605,7 +2613,7 @@ describe("dispatchTelegramMessage draft streaming", () => {

26052613

await dispatchWithContext({ context: createContext() });

2606261426072615

expect(answerDraftStream.updatePreview).toHaveBeenCalledWith(

2608-

expect.objectContaining({ text: expect.stringMatching(/🛠 Exec$/) }),

2616+

expect.objectContaining({ text: expect.stringMatching(/🛠 Exec<\/b>$/) }),

26092617

);

26102618

expect(answerDraftStream.update).toHaveBeenNthCalledWith(1, "Branch is up to date");

26112619

expect(answerDraftStream.forceNewMessage).toHaveBeenCalledTimes(1);

@@ -2762,9 +2770,10 @@ describe("dispatchTelegramMessage draft streaming", () => {

27622770

expect.objectContaining({ text: expect.stringContaining("stdout line one") }),

27632771

);

27642772

expect(answerDraftStream.updatePreview).toHaveBeenLastCalledWith(

2765-

expect.objectContaining({

2766-

text: "Shelling\n\n🛠️ Exec\n🔎 Web Search: docs lookup",

2767-

}),

2773+

telegramProgressPreview(

2774+

"Shelling\n\n🛠️ Exec\n🔎 Web Search: docs lookup",

2775+

"<b>Shelling</b>\n<b>🛠️ Exec</b>\n<b>🔎 Web Search</b> <code>docs lookup</code>",

2776+

),

27682777

);

27692778

expect(deliverReplies).not.toHaveBeenCalled();

27702779

});

@@ -3318,7 +3327,7 @@ describe("dispatchTelegramMessage draft streaming", () => {

33183327

const updateBeforeStatusReaction = draftStream.updatePreview.mock.calls.at(-1)?.[0]?.text;

33193328

releaseSetTool?.();

33203329

await pendingToolStart;

3321-

expect(updateBeforeStatusReaction).toBe("Shelling\n\n🛠️ Exec");

3330+

expect(updateBeforeStatusReaction).toBe("<b>Shelling</b><br><b>🛠️ Exec</b>");

33223331

return { queuedFinal: false };

33233332

});

33243333