From 53ee9cd9930d9479af318c1ed29713a0bfb5f47b Mon Sep 17 00:00:00 2001 From: "paseo-bot[bot]" <266920839+paseo-bot[bot]@users.noreply.github.com> Date: Wed, 30 Sep 2026 00:06:21 +0200 Subject: [PATCH] fix(codex): settle declined commands and file edits as failed (#5717) Codex completes a command or file change with status "declined" when its approval is denied. The shared status normalizer did not know that word and fell back to "running", so the denied command kept a spinner after the turn ended. Co-authored-by: paseo-bot[bot] <266920839+paseo-bot[bot]@users.noreply.github.com> Co-authored-by: Bae Seongmin <83870598+3ae3ae@users.noreply.github.com> --- .../providers/codex/tool-call-mapper.test.ts | 23 +++++++++++++++++++ .../agent/providers/tool-call-mapper-utils.ts | 1 + 2 files changed, 24 insertions(+) diff --git a/packages/server/src/server/agent/providers/codex/tool-call-mapper.test.ts b/packages/server/src/server/agent/providers/codex/tool-call-mapper.test.ts index 6ce2d4fe13..566fd10083 100644 --- a/packages/server/src/server/agent/providers/codex/tool-call-mapper.test.ts +++ b/packages/server/src/server/agent/providers/codex/tool-call-mapper.test.ts @@ -656,6 +656,29 @@ describe("codex tool-call mapper", () => { }); }); + it.each([ + { + type: "commandExecution", + id: "codex-declined-command", + status: "declined", + command: "printf ok > /outside/permission.txt", + cwd: "/tmp/repo", + aggregatedOutput: null, + exitCode: null, + }, + { + type: "fileChange", + id: "codex-declined-patch", + status: "declined", + changes: [], + }, + ])("settles a declined $type as failed instead of running", (threadItem) => { + const item = expectMapped(mapCodexToolCallFromThreadItem(threadItem)); + + expect(item.callId).toBe(threadItem.id); + expect(item.status).toBe("failed"); + }); + it("maps unknown tools to unknown detail with raw payloads", () => { const item = expectMapped( mapCodexToolCallEnvelope({ diff --git a/packages/server/src/server/agent/providers/tool-call-mapper-utils.ts b/packages/server/src/server/agent/providers/tool-call-mapper-utils.ts index 281a2bcf32..cd0e4776b7 100644 --- a/packages/server/src/server/agent/providers/tool-call-mapper-utils.ts +++ b/packages/server/src/server/agent/providers/tool-call-mapper-utils.ts @@ -7,6 +7,7 @@ const FAILED_STATUS_VOCAB = new Set([ "errored", "rejected", "denied", + "declined", ]); const CANCELED_STATUS_VOCAB = new Set(["canceled", "cancelled", "interrupted", "aborted"]); const COMPLETED_STATUS_VOCAB = new Set(["completed", "complete", "done", "success", "succeeded"]);