mirror of
https://github.com/moltbot/moltbot.git
synced 2026-05-13 23:56:07 +00:00
Summary:
- Normalize Codex app-server dynamic and native tool activity into channel-visible tool progress.
- Keep Telegram message-tool-only progress drafts visible without duplicate dynamic item/tool lines.
- Preserve suppressed item progress while avoiding duplicate tool callbacks.
Verification:
- OPENCLAW_VITEST_MAX_WORKERS=1 pnpm test extensions/codex/src/app-server/event-projector.test.ts extensions/codex/src/app-server/run-attempt.test.ts extensions/telegram/src/bot-message-dispatch.test.ts src/auto-reply/reply/agent-runner-execution.test.ts src/auto-reply/reply/dispatch-from-config.test.ts --pool=forks --maxWorkers=1
- pnpm tsgo:extensions:test
- pnpm exec oxfmt --check --threads=1 CHANGELOG.md extensions/codex/src/app-server/event-projector.ts extensions/codex/src/app-server/event-projector.test.ts extensions/codex/src/app-server/run-attempt.ts extensions/codex/src/app-server/run-attempt.test.ts extensions/codex/src/app-server/tool-progress-normalization.ts extensions/telegram/src/bot-message-dispatch.ts extensions/telegram/src/bot-message-dispatch.test.ts src/auto-reply/get-reply-options.types.ts src/auto-reply/reply/agent-runner-execution.ts src/auto-reply/reply/agent-runner-execution.test.ts src/auto-reply/reply/dispatch-from-config.ts src/auto-reply/reply/dispatch-from-config.test.ts src/infra/agent-events.ts
- pnpm lint:extensions
- pnpm build
- CI on 6ff6a1f868: 88 success, 20 skipped, 1 neutral, no failures or pending checks
Fixes #75641.
78 lines
2.2 KiB
TypeScript
78 lines
2.2 KiB
TypeScript
import {
|
|
inferToolMetaFromArgs,
|
|
type EmbeddedRunAttemptParams,
|
|
type ToolProgressDetailMode,
|
|
} from "openclaw/plugin-sdk/agent-harness-runtime";
|
|
import { redactSensitiveFieldValue, redactToolPayloadText } from "openclaw/plugin-sdk/text-runtime";
|
|
import {
|
|
isJsonObject,
|
|
type CodexDynamicToolCallParams,
|
|
type CodexDynamicToolCallResponse,
|
|
type JsonValue,
|
|
} from "./protocol.js";
|
|
|
|
export function resolveCodexToolProgressDetailMode(
|
|
value: EmbeddedRunAttemptParams["toolProgressDetail"],
|
|
): ToolProgressDetailMode {
|
|
return value === "raw" ? "raw" : "explain";
|
|
}
|
|
|
|
export function sanitizeCodexAgentEventValue(
|
|
value: unknown,
|
|
seen = new WeakSet<object>(),
|
|
): unknown {
|
|
if (typeof value === "string") {
|
|
return redactToolPayloadText(value);
|
|
}
|
|
if (Array.isArray(value)) {
|
|
if (seen.has(value)) {
|
|
return "[Circular]";
|
|
}
|
|
seen.add(value);
|
|
return value.map((entry) => sanitizeCodexAgentEventValue(entry, seen));
|
|
}
|
|
if (value && typeof value === "object") {
|
|
if (seen.has(value)) {
|
|
return "[Circular]";
|
|
}
|
|
seen.add(value);
|
|
const out: Record<string, unknown> = {};
|
|
for (const [key, child] of Object.entries(value as Record<string, unknown>)) {
|
|
out[key] =
|
|
typeof child === "string"
|
|
? redactSensitiveFieldValue(key, child)
|
|
: sanitizeCodexAgentEventValue(child, seen);
|
|
}
|
|
return out;
|
|
}
|
|
return value;
|
|
}
|
|
|
|
export function sanitizeCodexAgentEventRecord(
|
|
value: Record<string, unknown>,
|
|
): Record<string, unknown> {
|
|
return sanitizeCodexAgentEventValue(value) as Record<string, unknown>;
|
|
}
|
|
|
|
export function sanitizeCodexToolArguments(
|
|
value: JsonValue | undefined,
|
|
): Record<string, unknown> | undefined {
|
|
if (!isJsonObject(value)) {
|
|
return undefined;
|
|
}
|
|
return sanitizeCodexAgentEventRecord(value);
|
|
}
|
|
|
|
export function sanitizeCodexToolResponse(
|
|
response: CodexDynamicToolCallResponse,
|
|
): Record<string, unknown> {
|
|
return sanitizeCodexAgentEventRecord(response as unknown as Record<string, unknown>);
|
|
}
|
|
|
|
export function inferCodexDynamicToolMeta(
|
|
call: Pick<CodexDynamicToolCallParams, "tool" | "arguments">,
|
|
detailMode: ToolProgressDetailMode,
|
|
): string | undefined {
|
|
return inferToolMetaFromArgs(call.tool, call.arguments, { detailMode });
|
|
}
|