|
|
@@ -10,7 +10,7 @@ import DESCRIPTION from "./read.txt"
|
|
|
import { InstanceState } from "@/effect/instance-state"
|
|
|
import { assertExternalDirectoryEffect } from "./external-directory"
|
|
|
import { Instruction } from "../session/instruction"
|
|
|
-import { isImageAttachment, isPdfAttachment, sniffAttachmentMime } from "@/util/media"
|
|
|
+import { isPdfAttachment, sniffAttachmentMime } from "@/util/media"
|
|
|
|
|
|
const DEFAULT_READ_LIMIT = 2000
|
|
|
const MAX_LINE_LENGTH = 2000
|
|
|
@@ -18,6 +18,7 @@ const MAX_LINE_SUFFIX = `... (line truncated to ${MAX_LINE_LENGTH} chars)`
|
|
|
const MAX_BYTES = 50 * 1024
|
|
|
const MAX_BYTES_LABEL = `${MAX_BYTES / 1024} KB`
|
|
|
const SAMPLE_BYTES = 4096
|
|
|
+const SUPPORTED_IMAGE_MIMES = new Set(["image/jpeg", "image/png", "image/gif", "image/webp"])
|
|
|
|
|
|
// `offset` and `limit` were originally `z.coerce.number()` — the runtime
|
|
|
// coercion was useful when the tool was called from a shell but serves no
|
|
|
@@ -220,7 +221,9 @@ export const ReadTool = Tool.define(
|
|
|
const sample = yield* readSample(filepath, Number(stat.size), SAMPLE_BYTES)
|
|
|
|
|
|
const mime = sniffAttachmentMime(sample, AppFileSystem.mimeType(filepath))
|
|
|
- if (isImageAttachment(mime) || isPdfAttachment(mime)) {
|
|
|
+ const isImage = SUPPORTED_IMAGE_MIMES.has(mime)
|
|
|
+
|
|
|
+ if (isImage || isPdfAttachment(mime)) {
|
|
|
const bytes = yield* fs.readFile(filepath)
|
|
|
const msg = isPdfAttachment(mime) ? "PDF read successfully" : "Image read successfully"
|
|
|
return {
|