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

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
The Blog of Author Tim Ferriss
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
量子位
S
SegmentFault 最新的问题
博客园 - 聂微东
博客园 - 【当耐特】
J
Java Code Geeks
美团技术团队
Hugging Face - Blog
Hugging Face - Blog
H
Help Net Security
V
V2EX
人人都是产品经理
人人都是产品经理
博客园 - Franky
罗磊的独立博客
Engineering at Meta
Engineering at Meta
A
About on SuperTechFans
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research

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): pass raw progress detail to drafts · openc...
vincentkoc · 2026-05-04 · via Recent Commits to openclaw:main

File tree

  • extensions

    • discord/src/monitor

    • matrix/src/matrix/monitor

    • msteams/src

    • slack/src/monitor/message-handler

    • telegram/src

  • src

    • auto-reply

      • reply

    • plugin-sdk

Original file line numberDiff line numberDiff line change

@@ -52,6 +52,7 @@ Docs: https://docs.openclaw.ai

5252

- Channels/CLI: keep `openclaw channels list --json` usable when provider usage fetching fails, and report per-provider usage errors without aborting the channel list. Refs #67595.

5353

- Agents/messaging: deliver distinct final commentary after same-target `message` tool sends while still deduping text/media already sent by the tool, so short closing remarks are no longer silently dropped. Fixes #76915. Thanks @hclsys.

5454

- Agents/messaging: preserve string thread IDs when matching message-tool reply dedupe routes, avoiding precision loss on numeric-looking topic IDs before channel plugin comparison. Thanks @vincentkoc.

55+

- Channels/streaming: honor `agents.defaults.toolProgressDetail: "raw"` in Slack, Discord, Telegram, Matrix, and Microsoft Teams progress drafts, so tool-start lines include raw command/detail output when debugging. Thanks @vincentkoc.

5556

- OpenAI Codex: honor `auth.order.openai-codex` when starting app-server clients without an explicit auth profile, so status/model probes and implicit startup use the configured Codex account instead of falling back to the default profile. Thanks @vincentkoc.

5657

- OpenAI Codex: let SSRF-guarded provider requests inherit OpenClaw's undici IPv4/IPv6 fallback policy, so ChatGPT-backed Codex runs recover on IPv4-working hosts when DNS still returns unreachable IPv6 addresses. Fixes #76857. Thanks @jplavoiemtl and @SymbolStar.

5758

- Gateway/systemd: preserve operator-added secrets in the Gateway env file across re-stage while clearing OpenClaw-managed keys (such as `OPENCLAW_GATEWAY_TOKEN`) so a fresh staging value is never shadowed by a stale env-file copy; operator secrets are also retained when the state-dir `.env` is empty. Fixes #76860. Thanks @hclsys.

Original file line numberDiff line numberDiff line change

@@ -102,6 +102,7 @@ type DispatchInboundParams = {

102102

name?: string;

103103

phase?: string;

104104

args?: Record<string, unknown>;

105+

detailMode?: "explain" | "raw";

105106

}) => Promise<void> | void;

106107

onItemEvent?: (payload: {

107108

progressText?: string;

@@ -1534,6 +1535,38 @@ describe("processDiscordMessage draft streaming", () => {

15341535

);

15351536

});

15361537
1538+

it("uses raw tool-progress detail in Discord progress drafts", async () => {

1539+

const draftStream = createMockDraftStreamForTest();

1540+
1541+

dispatchInboundMessage.mockImplementationOnce(async (params?: DispatchInboundParams) => {

1542+

await params?.replyOptions?.onToolStart?.({

1543+

name: "exec",

1544+

phase: "start",

1545+

args: { command: "pnpm test -- --watch=false" },

1546+

detailMode: "raw",

1547+

});

1548+

await params?.replyOptions?.onItemEvent?.({ progressText: "done" });

1549+

return createNoQueuedDispatchResult();

1550+

});

1551+
1552+

const ctx = await createAutomaticSourceDeliveryContext({

1553+

discordConfig: {

1554+

streaming: {

1555+

mode: "progress",

1556+

progress: {

1557+

label: "Shelling",

1558+

},

1559+

},

1560+

},

1561+

});

1562+
1563+

await runProcessDiscordMessage(ctx);

1564+
1565+

expect(draftStream.update).toHaveBeenCalledWith(

1566+

"Shelling\n🛠️ Exec: run tests, `pnpm test -- --watch=false`\n• done",

1567+

);

1568+

});

1569+
15371570

it("keeps Discord progress lines across assistant boundaries", async () => {

15381571

const draftStream = createMockDraftStreamForTest();

15391572
Original file line numberDiff line numberDiff line change

@@ -91,6 +91,7 @@ type ToolStartPayload = {

9191

name?: string;

9292

phase?: string;

9393

args?: Record<string, unknown>;

94+

detailMode?: "explain" | "raw";

9495

};

9596
9697

function readToolStringArg(args: Record<string, unknown>, key: string): string | undefined {

@@ -668,12 +669,15 @@ export async function processDiscordMessage(

668669

await maybeBindStatusReactionsToToolReaction(payload);

669670

await statusReactions.setTool(payload.name);

670671

await draftPreview.pushToolProgress(

671-

formatChannelProgressDraftLine({

672-

event: "tool",

673-

name: payload.name,

674-

phase: payload.phase,

675-

args: payload.args,

676-

}),

672+

formatChannelProgressDraftLine(

673+

{

674+

event: "tool",

675+

name: payload.name,

676+

phase: payload.phase,

677+

args: payload.args,

678+

},

679+

payload.detailMode ? { detailMode: payload.detailMode } : undefined,

680+

),

677681

{ toolName: payload.name },

678682

);

679683

},

Original file line numberDiff line numberDiff line change

@@ -1580,12 +1580,15 @@ export function createMatrixRoomMessageHandler(params: MatrixMonitorHandlerParam

15801580

onToolStart: async (payload) => {

15811581

const toolName = payload.name?.trim();

15821582

await pushPreviewToolProgress(

1583-

formatChannelProgressDraftLine({

1584-

event: "tool",

1585-

name: toolName,

1586-

phase: payload.phase,

1587-

args: payload.args,

1588-

}),

1583+

formatChannelProgressDraftLine(

1584+

{

1585+

event: "tool",

1586+

name: toolName,

1587+

phase: payload.phase,

1588+

args: payload.args,

1589+

},

1590+

payload.detailMode ? { detailMode: payload.detailMode } : undefined,

1591+

),

15891592

{ toolName },

15901593

);

15911594

},

Original file line numberDiff line numberDiff line change

@@ -381,14 +381,18 @@ export function createMSTeamsReplyDispatcher(params: {

381381

name?: string;

382382

phase?: string;

383383

args?: Record<string, unknown>;

384+

detailMode?: "explain" | "raw";

384385

}) => {

385386

await streamController.pushProgressLine(

386-

formatChannelProgressDraftLine({

387-

event: "tool",

388-

name: payload.name,

389-

phase: payload.phase,

390-

args: payload.args,

391-

}),

387+

formatChannelProgressDraftLine(

388+

{

389+

event: "tool",

390+

name: payload.name,

391+

phase: payload.phase,

392+

args: payload.args,

393+

},

394+

payload.detailMode ? { detailMode: payload.detailMode } : undefined,

395+

),

392396

{ toolName: payload.name },

393397

);

394398

},

Original file line numberDiff line numberDiff line change

@@ -1084,12 +1084,15 @@ export async function dispatchPreparedSlackMessage(prepared: PreparedSlackMessag

10841084

await statusReactions.setTool(payload.name);

10851085

}

10861086

await pushPreviewToolProgress(

1087-

formatChannelProgressDraftLine({

1088-

event: "tool",

1089-

name: payload.name,

1090-

phase: payload.phase,

1091-

args: payload.args,

1092-

}),

1087+

formatChannelProgressDraftLine(

1088+

{

1089+

event: "tool",

1090+

name: payload.name,

1091+

phase: payload.phase,

1092+

args: payload.args,

1093+

},

1094+

payload.detailMode ? { detailMode: payload.detailMode } : undefined,

1095+

),

10931096

{ toolName: payload.name },

10941097

);

10951098

},

Original file line numberDiff line numberDiff line change

@@ -1174,12 +1174,15 @@ export const dispatchTelegramMessage = async ({

11741174

await statusReactionController.setTool(toolName);

11751175

}

11761176

await pushPreviewToolProgress(

1177-

formatChannelProgressDraftLine({

1178-

event: "tool",

1179-

name: toolName,

1180-

phase: payload.phase,

1181-

args: payload.args,

1182-

}),

1177+

formatChannelProgressDraftLine(

1178+

{

1179+

event: "tool",

1180+

name: toolName,

1181+

phase: payload.phase,

1182+

args: payload.args,

1183+

},

1184+

payload.detailMode ? { detailMode: payload.detailMode } : undefined,

1185+

),

11831186

{ toolName },

11841187

);

11851188

},

Original file line numberDiff line numberDiff line change

@@ -85,6 +85,7 @@ export type GetReplyOptions = {

8585

name?: string;

8686

phase?: string;

8787

args?: Record<string, unknown>;

88+

detailMode?: "explain" | "raw";

8889

}) => Promise<void> | void;

8990

/** Called when a concrete work item starts, updates, or completes. */

9091

onItemEvent?: (payload: {

Original file line numberDiff line numberDiff line change

@@ -1142,6 +1142,39 @@ describe("runAgentTurnWithFallback", () => {

11421142

});

11431143

});

11441144
1145+

it("forwards raw tool progress detail mode to tool-start reply options", async () => {

1146+

const onToolStart = vi.fn();

1147+

state.runEmbeddedPiAgentMock.mockImplementationOnce(async (params: EmbeddedAgentParams) => {

1148+

await params.onAgentEvent?.({

1149+

stream: "tool",

1150+

data: {

1151+

name: "exec",

1152+

phase: "start",

1153+

args: { command: "pnpm test -- --watch=false" },

1154+

},

1155+

});

1156+

return { payloads: [{ text: "final" }], meta: {} };

1157+

});

1158+
1159+

const runAgentTurnWithFallback = await getRunAgentTurnWithFallback();

1160+

const result = await runAgentTurnWithFallback({

1161+

...createMinimalRunAgentTurnParams({

1162+

opts: {

1163+

onToolStart,

1164+

} satisfies GetReplyOptions,

1165+

}),

1166+

toolProgressDetail: "raw",

1167+

});

1168+
1169+

expect(result.kind).toBe("success");

1170+

expect(onToolStart).toHaveBeenCalledWith({

1171+

name: "exec",

1172+

phase: "start",

1173+

args: { command: "pnpm test -- --watch=false" },

1174+

detailMode: "raw",

1175+

});

1176+

});

1177+
11451178

it("publishes Codex app-server telemetry to agent event subscribers", async () => {

11461179

const agentEvents = await import("../../infra/agent-events.js");

11471180

const emitAgentEvent = vi.mocked(agentEvents.emitAgentEvent);

Original file line numberDiff line numberDiff line change

@@ -1537,6 +1537,7 @@ export async function runAgentTurnWithFallback(params: {

15371537

evt.data.args && typeof evt.data.args === "object"

15381538

? (evt.data.args as Record<string, unknown>)

15391539

: undefined,

1540+

detailMode: params.toolProgressDetail,

15401541

});

15411542

}

15421543

}