diff --git a/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts b/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts index a73ff0c490..b56999c4fb 100644 --- a/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts +++ b/packages/server/src/server/agent/providers/codex-app-server-agent.test.ts @@ -267,7 +267,7 @@ describe("Codex file-change approvals", () => { provider: "codex", name: "CodexFileChange", kind: "tool", - title: "Apply file changes", + title: "Apply file changes: alpha.txt", description: "Apply the patch", detail: { type: "edit", diff --git a/packages/server/src/server/agent/providers/codex-app-server-agent.ts b/packages/server/src/server/agent/providers/codex-app-server-agent.ts index 86f7eb073b..473a38738e 100644 --- a/packages/server/src/server/agent/providers/codex-app-server-agent.ts +++ b/packages/server/src/server/agent/providers/codex-app-server-agent.ts @@ -6781,6 +6781,10 @@ export class CodexAppServerAgentSession implements AgentSession { return !this.closed && this.activeForegroundTurnId === turnId; } + private forgetPendingToolCallDetail(itemId: string | null | undefined): void { + if (itemId) this.pendingToolCallDetails.delete(itemId); + } + private async handleItemCompletedNotification( parsed: Extract, ): Promise { @@ -6792,9 +6796,7 @@ export class CodexAppServerAgentSession implements AgentSession { if (shouldIgnoreMirroredLifecycleItem(parsed.source, parsed.item)) { return; } - if (parsed.item.id) { - this.pendingToolCallDetails.delete(parsed.item.id); - } + this.forgetPendingToolCallDetail(parsed.item.id); this.receiveAsyncQuestion(parsed.threadId, parsed.item); if (this.isUserMessageItem(parsed.item)) { await this.handleUserMessageItem(parsed); @@ -7270,20 +7272,24 @@ export class CodexAppServerAgentSession implements AgentSession { }) .parse(params); const requestId = `permission-${parsed.itemId}`; + const detail: ToolCallTimelineItem["detail"] = this.pendingToolCallDetails.get( + parsed.itemId, + ) ?? { + type: "unknown", + input: { reason: parsed.reason ?? null }, + output: null, + }; const request: AgentPermissionRequest = { id: requestId, provider: CODEX_PROVIDER, name: "CodexFileChange", kind: "tool", - title: "Apply file changes", + title: + detail.type === "edit" && detail.filePath + ? `Apply file changes: ${detail.filePath}` + : "Apply file changes", description: parsed.reason ?? undefined, - detail: this.pendingToolCallDetails.get(parsed.itemId) ?? { - type: "unknown", - input: { - reason: parsed.reason ?? null, - }, - output: null, - }, + detail, metadata: { itemId: parsed.itemId, threadId: parsed.threadId,