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(), ): 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 = {}; for (const [key, child] of Object.entries(value as Record)) { out[key] = typeof child === "string" ? redactSensitiveFieldValue(key, child) : sanitizeCodexAgentEventValue(child, seen); } return out; } return value; } export function sanitizeCodexAgentEventRecord( value: Record, ): Record { return sanitizeCodexAgentEventValue(value) as Record; } export function sanitizeCodexToolArguments( value: JsonValue | undefined, ): Record | undefined { if (!isJsonObject(value)) { return undefined; } return sanitizeCodexAgentEventRecord(value); } export function sanitizeCodexToolResponse( response: CodexDynamicToolCallResponse, ): Record { return sanitizeCodexAgentEventRecord(response as unknown as Record); } export function inferCodexDynamicToolMeta( call: Pick, detailMode: ToolProgressDetailMode, ): string | undefined { return inferToolMetaFromArgs(call.tool, call.arguments, { detailMode }); }