Fix codex persistence shell command hydration

This commit is contained in:
Mohamed Boudra
2025-12-24 19:56:33 +07:00
parent f9af141d80
commit 8489f35cdd
2 changed files with 44 additions and 6 deletions
@@ -1591,7 +1591,7 @@ function handleRolloutFunctionCall(
}
if (SHELL_FUNCTION_NAMES.has(name)) {
const args = safeJsonParse<Record<string, unknown>>(payload.arguments);
const args = parseJsonOrObject<Record<string, unknown>>(payload.arguments);
const command = formatCommand(args);
const cwd =
args &&
@@ -1599,8 +1599,9 @@ function handleRolloutFunctionCall(
typeof (args as { workdir?: unknown }).workdir === "string"
? ((args as { workdir?: unknown }).workdir as string)
: undefined;
if (command && typeof payload.call_id === "string") {
commandCalls.set(payload.call_id, { command, cwd });
if (typeof payload.call_id === "string") {
const commandValue = command ?? "Command";
commandCalls.set(payload.call_id, { command: commandValue, cwd });
events.push({
type: "timeline",
provider: "codex",
@@ -1611,7 +1612,7 @@ function handleRolloutFunctionCall(
callId: payload.call_id,
displayName: buildCommandDisplayName(command),
kind: "execute",
input: { command, cwd },
input: { command: commandValue, cwd },
}),
});
}
@@ -1658,7 +1659,7 @@ function finalizeRolloutFunctionCall(
if (!command) {
return;
}
const result = safeJsonParse<CommandExecutionResult>(payload.output);
const result = parseJsonOrObject<CommandExecutionResult>(payload.output);
const exitCode = result?.metadata?.exit_code;
const status =
exitCode === undefined || exitCode === 0 ? "completed" : "failed";
@@ -1671,6 +1672,9 @@ function finalizeRolloutFunctionCall(
output: result.stdout,
exitCode,
cwd: command.cwd,
metadata:
result?.metadata ??
(typeof exitCode === "number" ? { exit_code: exitCode } : undefined),
}
: result;
@@ -2102,6 +2106,16 @@ function safeJsonParse<T = unknown>(value: unknown): T | null {
}
}
function parseJsonOrObject<T = unknown>(value: unknown): T | null {
if (typeof value === "string") {
return safeJsonParse<T>(value);
}
if (value && typeof value === "object") {
return value as T;
}
return null;
}
function formatCommand(args: unknown): string | null {
if (!args || typeof args !== "object") {
return null;