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

推荐订阅源

博客园 - Franky
J
Java Code Geeks
腾讯CDC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
博客园 - 司徒正美
Stack Overflow Blog
Stack Overflow Blog
美团技术团队
L
LangChain Blog
WordPress大学
WordPress大学
A
About on SuperTechFans
Martin Fowler
Martin Fowler
月光博客
月光博客
Y
Y Combinator Blog
U
Unit 42
D
Docker
Recent Announcements
Recent Announcements
Hugging Face - Blog
Hugging Face - Blog
B
Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
G
Google Developers Blog
Last Week in AI
Last Week in AI
T
The Blog of Author Tim Ferriss
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

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(channels): preserve direct native progress callbacks ...
PashaGanson · 2026-05-27 · via Recent Commits to openclaw:main

@@ -1945,7 +1945,7 @@ describe("dispatchReplyFromConfig", () => {

19451945

await opts?.onPatchSummary?.({ phase: "end", summary: "1 modified" });

19461946

await opts?.onCompactionStart?.();

19471947

await opts?.onCompactionEnd?.();

1948-

await opts?.onToolResult?.({ text: "🔧 exec: ok" });

1948+

await opts?.onToolResult?.({ text: "exec: ok" });

19491949

return { text: "done" } satisfies ReplyPayload;

19501950

};

19511951

@@ -1992,6 +1992,120 @@ describe("dispatchReplyFromConfig", () => {

19921992

expect(event.shouldSendToolSummaries).toBe(true);

19931993

});

199419941995+

it("forwards direct native progress callbacks while verbose is off", async () => {

1996+

setNoAbort();

1997+

sessionStoreMocks.currentEntry = {

1998+

verboseLevel: "off",

1999+

};

2000+

const cfg = emptyConfig;

2001+

const dispatcher = createDispatcher();

2002+

const ctx = buildTestCtx({

2003+

Provider: "telegram",

2004+

Surface: "telegram",

2005+

ChatType: "direct",

2006+

From: "telegram:123",

2007+

SessionKey: "agent:main:telegram:dm:123",

2008+

});

2009+

const onToolStart = vi.fn();

2010+

const onItemEvent = vi.fn();

2011+

const onCommandOutput = vi.fn();

2012+2013+

const replyResolver = async (

2014+

_ctx: MsgContext,

2015+

opts?: GetReplyOptions,

2016+

_cfg?: OpenClawConfig,

2017+

) => {

2018+

await opts?.onToolStart?.({ name: "exec", phase: "start" });

2019+

await opts?.onItemEvent?.({ itemId: "1", kind: "tool", progressText: "running exec" });

2020+

await opts?.onCommandOutput?.({ phase: "end", name: "exec", status: "ok", exitCode: 0 });

2021+

await opts?.onToolResult?.({ text: "🔧 exec: ok" });

2022+

return { text: "done" } satisfies ReplyPayload;

2023+

};

2024+2025+

await dispatchReplyFromConfig({

2026+

ctx,

2027+

cfg,

2028+

dispatcher,

2029+

replyResolver,

2030+

replyOptions: {

2031+

sourceReplyDeliveryMode: "message_tool_only",

2032+

suppressDefaultToolProgressMessages: true,

2033+

allowProgressCallbacksWhenSourceDeliverySuppressed: true,

2034+

onToolStart,

2035+

onItemEvent,

2036+

onCommandOutput,

2037+

},

2038+

});

2039+2040+

expect(onToolStart).toHaveBeenCalledWith({ name: "exec", phase: "start" });

2041+

expect(onItemEvent).toHaveBeenCalledWith({

2042+

itemId: "1",

2043+

kind: "tool",

2044+

progressText: "running exec",

2045+

});

2046+

expect(onCommandOutput).toHaveBeenCalledWith({

2047+

phase: "end",

2048+

name: "exec",

2049+

status: "ok",

2050+

exitCode: 0,

2051+

});

2052+

expect(dispatcher.sendToolResult).not.toHaveBeenCalled();

2053+

expect(dispatcher.sendFinalReply).not.toHaveBeenCalled();

2054+

});

2055+2056+

it("suppresses direct native progress callbacks when send policy denies delivery", async () => {

2057+

setNoAbort();

2058+

sessionStoreMocks.currentEntry = {

2059+

sendPolicy: "deny",

2060+

verboseLevel: "off",

2061+

};

2062+

const cfg = emptyConfig;

2063+

const dispatcher = createDispatcher();

2064+

const ctx = buildTestCtx({

2065+

Provider: "telegram",

2066+

Surface: "telegram",

2067+

ChatType: "direct",

2068+

From: "telegram:123",

2069+

SessionKey: "agent:main:telegram:dm:123",

2070+

});

2071+

const onToolStart = vi.fn();

2072+

const onItemEvent = vi.fn();

2073+

const onCommandOutput = vi.fn();

2074+2075+

const replyResolver = async (

2076+

_ctx: MsgContext,

2077+

opts?: GetReplyOptions,

2078+

_cfg?: OpenClawConfig,

2079+

) => {

2080+

await opts?.onToolStart?.({ name: "exec", phase: "start" });

2081+

await opts?.onItemEvent?.({ itemId: "1", kind: "tool", progressText: "running exec" });

2082+

await opts?.onCommandOutput?.({ phase: "end", name: "exec", status: "ok", exitCode: 0 });

2083+

await opts?.onToolResult?.({ text: "exec: ok" });

2084+

return { text: "done" } satisfies ReplyPayload;

2085+

};

2086+2087+

await dispatchReplyFromConfig({

2088+

ctx,

2089+

cfg,

2090+

dispatcher,

2091+

replyResolver,

2092+

replyOptions: {

2093+

sourceReplyDeliveryMode: "message_tool_only",

2094+

suppressDefaultToolProgressMessages: true,

2095+

allowProgressCallbacksWhenSourceDeliverySuppressed: true,

2096+

onToolStart,

2097+

onItemEvent,

2098+

onCommandOutput,

2099+

},

2100+

});

2101+2102+

expect(onToolStart).not.toHaveBeenCalled();

2103+

expect(onItemEvent).not.toHaveBeenCalled();

2104+

expect(onCommandOutput).not.toHaveBeenCalled();

2105+

expect(dispatcher.sendToolResult).not.toHaveBeenCalled();

2106+

expect(dispatcher.sendFinalReply).not.toHaveBeenCalled();

2107+

});

2108+19952109

it("normalizes tool-result media before delivery and drops blocked file URLs", async () => {

19962110

setNoAbort();

19972111

replyMediaPathMocks.createReplyMediaPathNormalizer.mockReturnValue(