diff --git a/src/CodexAcpClient.ts b/src/CodexAcpClient.ts index 13e107a9..414f5071 100644 --- a/src/CodexAcpClient.ts +++ b/src/CodexAcpClient.ts @@ -686,7 +686,13 @@ function buildPromptItems(prompt: acp.ContentBlock[]): UserInput[] { const context = `\n${resource.text}\n`; return {type: "text", text: `${link}\n${context}`, text_elements: []}; } - return null; + if (isImageMimeType(resource.mimeType)) { + return {type: "image", url: `data:${resource.mimeType};base64,${resource.blob}`}; + } + const link = formatUriAsLink(null, resource.uri); + const mimeType = resource.mimeType ?? "application/octet-stream"; + const context = `\n${resource.blob}\n`; + return {type: "text", text: `${link}\n${context}`, text_elements: []}; } case "audio": return null; @@ -694,6 +700,10 @@ function buildPromptItems(prompt: acp.ContentBlock[]): UserInput[] { }).filter((block): block is UserInput => block !== null); } +function isImageMimeType(mimeType: string | null | undefined): mimeType is string { + return mimeType?.startsWith("image/") ?? false; +} + function formatUriAsLink(name: string | null | undefined, uri: string): string { if (name && name.length > 0) { return `[@${name}](${uri})`; diff --git a/src/__tests__/CodexACPAgent/CodexAcpClient.test.ts b/src/__tests__/CodexACPAgent/CodexAcpClient.test.ts index 6924d739..9bfd43e5 100644 --- a/src/__tests__/CodexACPAgent/CodexAcpClient.test.ts +++ b/src/__tests__/CodexACPAgent/CodexAcpClient.test.ts @@ -730,6 +730,8 @@ describe('ACP server test', { timeout: 40_000 }, () => { { type: "image", mimeType: "image/png", data: "abc123", uri: "https://example.com/image.png" }, { type: "resource_link", name: "report.txt", uri: "file:///tmp/report.txt" }, { type: "resource", resource: { uri: "file:///tmp/notes.txt", text: "Notes body" } as acp.EmbeddedResourceResource }, + { type: "resource", resource: { uri: "file:///tmp/pixel.png", mimeType: "image/png", blob: "iVBORw0KGgo=" } as acp.EmbeddedResourceResource }, + { type: "resource", resource: { uri: "file:///tmp/archive.bin", mimeType: "application/octet-stream", blob: "AAEC" } as acp.EmbeddedResourceResource }, ]; await codexAcpAgent.prompt({ sessionId: "session-id", prompt }); diff --git a/src/__tests__/CodexACPAgent/data/send-attachments-turn-start.json b/src/__tests__/CodexACPAgent/data/send-attachments-turn-start.json index 47394626..cad1559e 100644 --- a/src/__tests__/CodexACPAgent/data/send-attachments-turn-start.json +++ b/src/__tests__/CodexACPAgent/data/send-attachments-turn-start.json @@ -35,6 +35,15 @@ "type": "text", "text": "[@notes.txt](file:///tmp/notes.txt)\n\nNotes body\n", "text_elements": [] + }, + { + "type": "image", + "url": "data:image/png;base64,iVBORw0KGgo=" + }, + { + "type": "text", + "text": "[@archive.bin](file:///tmp/archive.bin)\n\nAAEC\n", + "text_elements": [] } ], "approvalPolicy": "on-request",