From f6ffa41b790e9e04e56fae074cbb5fa9ad4d9114 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Mon, 14 Sep 2026 14:20:27 -0700 Subject: [PATCH] fix(codex): bound prompt turn identity on registration --- src/main/codex/codex-prompt-registry.ts | 3 ++- .../codex-structured-prompt-replies.test.ts | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/codex/codex-prompt-registry.ts b/src/main/codex/codex-prompt-registry.ts index d1df12d4d23..70a57255943 100644 --- a/src/main/codex/codex-prompt-registry.ts +++ b/src/main/codex/codex-prompt-registry.ts @@ -88,11 +88,12 @@ export class CodexPromptRegistry { if (optionAnswers === null) { return null } + const turnId = readString(request.params, 'turnId') const prompt: CodexPendingPrompt = { requestId: request.id, method: request.method, threadId, - turnId: readString(request.params, 'turnId'), + ...(turnId ? codexPromptTurnIdentity(turnId) : { turnId: null }), codexItemId, promptKey: readString(request.params, 'approvalId') ?? codexItemId, questionIds, diff --git a/src/main/codex/codex-structured-prompt-replies.test.ts b/src/main/codex/codex-structured-prompt-replies.test.ts index 49626ebd0a1..efb04de0675 100644 --- a/src/main/codex/codex-structured-prompt-replies.test.ts +++ b/src/main/codex/codex-structured-prompt-replies.test.ts @@ -138,6 +138,22 @@ describe('CodexPromptRegistry', () => { expect(registry.find('journal-root')).toBeNull() }) + it('bounds an oversized request turn id and still clears its prompt', () => { + const registry = new CodexPromptRegistry() + const turnId = 'turn-'.padEnd(MAX_CODEX_PROMPT_REGISTRY_BYTES + 1, 'x') + const prompt = registry.register({ + id: 1, + method: 'item/commandExecution/requestApproval', + params: { itemId: 'root-item', threadId: 'thread-1', turnId } + }) + + expect(prompt).not.toBeNull() + expect(registry.bytes).toBeLessThanOrEqual(MAX_CODEX_PROMPT_REGISTRY_BYTES) + registry.bindJournalItemId('journal-root', 'thread-1', 'root-item') + registry.clearTurn('thread-1', turnId) + expect(registry.find('journal-root')).toBeNull() + }) + it('addresses a prompt by its journal item id once bound, and forgets both', () => { const registry = new CodexPromptRegistry() const prompt = registry.register(userInputRequest(['q1']))