diff --git a/src/agents/pi-tools.read.ts b/src/agents/pi-tools.read.ts index 5de5019635b..3798c6dd8b1 100644 --- a/src/agents/pi-tools.read.ts +++ b/src/agents/pi-tools.read.ts @@ -3,6 +3,7 @@ import { createEditTool, createReadTool, createWriteTool } from "@mariozechner/p import type { AnyAgentTool } from "./pi-tools.types.js"; import type { SandboxFsBridge } from "./sandbox/fs-bridge.js"; import { detectMime } from "../media/mime.js"; +import { sniffMimeFromBase64 } from "../media/sniff-mime-from-base64.js"; import { assertSandboxPath } from "./sandbox-paths.js"; import { sanitizeToolResultImages } from "./tool-images.js"; @@ -12,26 +13,6 @@ type ToolContentBlock = AgentToolResult["content"][number]; type ImageContentBlock = Extract; type TextContentBlock = Extract; -async function sniffMimeFromBase64(base64: string): Promise { - const trimmed = base64.trim(); - if (!trimmed) { - return undefined; - } - - const take = Math.min(256, trimmed.length); - const sliceLen = take - (take % 4); - if (sliceLen < 8) { - return undefined; - } - - try { - const head = Buffer.from(trimmed.slice(0, sliceLen), "base64"); - return await detectMime({ buffer: head }); - } catch { - return undefined; - } -} - function rewriteReadImageHeader(text: string, mimeType: string): string { // pi-coding-agent uses: "Read image file [image/png]" if (text.startsWith("Read image file [") && text.endsWith("]")) { diff --git a/src/gateway/chat-attachments.ts b/src/gateway/chat-attachments.ts index b9e78184032..bb1e2c2e7ab 100644 --- a/src/gateway/chat-attachments.ts +++ b/src/gateway/chat-attachments.ts @@ -1,5 +1,5 @@ import { estimateBase64DecodedBytes } from "../media/base64.js"; -import { detectMime } from "../media/mime.js"; +import { sniffMimeFromBase64 } from "../media/sniff-mime-from-base64.js"; export type ChatAttachment = { type?: string; @@ -31,26 +31,6 @@ function normalizeMime(mime?: string): string | undefined { return cleaned || undefined; } -async function sniffMimeFromBase64(base64: string): Promise { - const trimmed = base64.trim(); - if (!trimmed) { - return undefined; - } - - const take = Math.min(256, trimmed.length); - const sliceLen = take - (take % 4); - if (sliceLen < 8) { - return undefined; - } - - try { - const head = Buffer.from(trimmed.slice(0, sliceLen), "base64"); - return await detectMime({ buffer: head }); - } catch { - return undefined; - } -} - function isImageMime(mime?: string): boolean { return typeof mime === "string" && mime.startsWith("image/"); } diff --git a/src/media/sniff-mime-from-base64.ts b/src/media/sniff-mime-from-base64.ts new file mode 100644 index 00000000000..631b08a9c80 --- /dev/null +++ b/src/media/sniff-mime-from-base64.ts @@ -0,0 +1,21 @@ +import { detectMime } from "./mime.js"; + +export async function sniffMimeFromBase64(base64: string): Promise { + const trimmed = base64.trim(); + if (!trimmed) { + return undefined; + } + + const take = Math.min(256, trimmed.length); + const sliceLen = take - (take % 4); + if (sliceLen < 8) { + return undefined; + } + + try { + const head = Buffer.from(trimmed.slice(0, sliceLen), "base64"); + return await detectMime({ buffer: head }); + } catch { + return undefined; + } +}