From 1860ca51881ee0e9a048c4581113daabbc22acbe Mon Sep 17 00:00:00 2001 From: Ben Brandt Date: Wed, 1 Jul 2026 10:53:56 +0200 Subject: [PATCH] Handle completed image generation items Closes #259 --- src/CodexEventHandler.ts | 2 +- src/CodexToolCallMapper.ts | 23 ++++++++++++++++--- src/StdUtils.ts | 5 ++-- .../data/image-generation-completed-only.json | 2 +- .../data/image-generation-flow.json | 2 +- .../CodexACPAgent/image-events.test.ts | 4 ++-- tsconfig.json | 1 + 7 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/CodexEventHandler.ts b/src/CodexEventHandler.ts index 4ed0cdbe..2e177152 100644 --- a/src/CodexEventHandler.ts +++ b/src/CodexEventHandler.ts @@ -429,7 +429,7 @@ export class CodexEventHandler { if (this.activeImageGenerationItems.delete(event.item.id)) { return createImageGenerationCompleteUpdate(event.item); } - return createImageGenerationUpdate(event.item); + return createImageGenerationUpdate(event.item, { terminalStatus: true }); case "reasoning": if (this.seenReasoningDeltaItemIds.delete(event.item.id)) { return null; diff --git a/src/CodexToolCallMapper.ts b/src/CodexToolCallMapper.ts index 61060c7a..3e2fd4e7 100644 --- a/src/CodexToolCallMapper.ts +++ b/src/CodexToolCallMapper.ts @@ -197,21 +197,24 @@ export function createImageGenerationCompleteUpdate( return { sessionUpdate: "tool_call_update", toolCallId: item.id, - status: imageGenerationToolStatus(item.status), + status: imageGenerationTerminalStatus(item.status), content: imageGenerationContent(item), rawOutput: imageGenerationRawOutput(item), }; } export function createImageGenerationUpdate( - item: ThreadItem & { type: "imageGeneration" } + item: ThreadItem & { type: "imageGeneration" }, + options?: { terminalStatus?: boolean }, ): UpdateSessionEvent { return { sessionUpdate: "tool_call", toolCallId: item.id, kind: "other", title: "Image generation", - status: imageGenerationToolStatus(item.status), + status: options?.terminalStatus + ? imageGenerationTerminalStatus(item.status) + : imageGenerationToolStatus(item.status), content: imageGenerationContent(item), rawOutput: imageGenerationRawOutput(item), }; @@ -624,6 +627,20 @@ function imageGenerationToolStatus(status: string): AcpToolCallStatus { } } +function imageGenerationTerminalStatus(status: string): AcpToolCallStatus { + switch (status) { + case "failed": + return "failed"; + case "completed": + case "generating": + case "in_progress": + case "inProgress": + case "incomplete": + default: + return "completed"; + } +} + function imageGenerationContent( item: ThreadItem & { type: "imageGeneration" } ): ToolCallContent[] { diff --git a/src/StdUtils.ts b/src/StdUtils.ts index 82e20bb2..99423433 100644 --- a/src/StdUtils.ts +++ b/src/StdUtils.ts @@ -1,8 +1,7 @@ import {Readable, Writable} from "node:stream"; import {Disposable} from "vscode-jsonrpc"; -import type {PartialMessageInfo} from "vscode-jsonrpc/lib/common/messageReader"; import {Emitter, Message, MessageReader, MessageWriter} from "vscode-jsonrpc/node"; -import type {DataCallback} from "vscode-jsonrpc/node"; +import type {DataCallback, PartialMessageInfo} from "vscode-jsonrpc/node"; import * as acp from "@agentclientprotocol/sdk"; //TODO ask to include proper jsonrpc field and remove @@ -70,4 +69,4 @@ export function createJsonStream(readable: Readable, writable: Writable){ const input = Writable.toWeb(writable); const output = Readable.toWeb(readable) as ReadableStream; return acp.ndJsonStream(input, output); -} \ No newline at end of file +} diff --git a/src/__tests__/CodexACPAgent/data/image-generation-completed-only.json b/src/__tests__/CodexACPAgent/data/image-generation-completed-only.json index d20df233..73d9bf87 100644 --- a/src/__tests__/CodexACPAgent/data/image-generation-completed-only.json +++ b/src/__tests__/CodexACPAgent/data/image-generation-completed-only.json @@ -20,7 +20,7 @@ } ], "rawOutput": { - "status": "completed", + "status": "generating", "revisedPrompt": null, "result": "iVBORw0KGgo=" } diff --git a/src/__tests__/CodexACPAgent/data/image-generation-flow.json b/src/__tests__/CodexACPAgent/data/image-generation-flow.json index 204fe7f2..176aefdd 100644 --- a/src/__tests__/CodexACPAgent/data/image-generation-flow.json +++ b/src/__tests__/CodexACPAgent/data/image-generation-flow.json @@ -44,7 +44,7 @@ } ], "rawOutput": { - "status": "completed", + "status": "generating", "revisedPrompt": "A tiny blue square", "result": "iVBORw0KGgo=", "savedPath": "/tmp/codex/generated-blue-square.png" diff --git a/src/__tests__/CodexACPAgent/image-events.test.ts b/src/__tests__/CodexACPAgent/image-events.test.ts index bb7718aa..8eb8102e 100644 --- a/src/__tests__/CodexACPAgent/image-events.test.ts +++ b/src/__tests__/CodexACPAgent/image-events.test.ts @@ -45,7 +45,7 @@ describe("CodexEventHandler - image events", () => { item: { type: "imageGeneration", id: "image-generation-1", - status: "completed", + status: "generating", revisedPrompt: "A tiny blue square", result: "iVBORw0KGgo=", savedPath: "/tmp/codex/generated-blue-square.png", @@ -71,7 +71,7 @@ describe("CodexEventHandler - image events", () => { item: { type: "imageGeneration", id: "image-generation-completed-only", - status: "completed", + status: "generating", revisedPrompt: null, result: "iVBORw0KGgo=", }, diff --git a/tsconfig.json b/tsconfig.json index 1d21f510..39a4fd81 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,6 +6,7 @@ "module": "ES2022", "moduleResolution": "Bundler", "target": "ES2022", + "types": ["node"], "sourceMap": true, "declaration": true,