mirror of
https://github.com/anomalyco/opencode.git
synced 2026-05-06 08:21:50 +00:00
fix(read): prevent unsupported image formats from being sending to provider (#21114)
Co-authored-by: Aiden Cline <aidenpcline@gmail.com>
This commit is contained in:
parent
478156456e
commit
51e310c9ce
2 changed files with 23 additions and 2 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -440,6 +440,24 @@ root_type Monster;`
|
|||
expect(result.output).toContain("table Monster")
|
||||
}),
|
||||
)
|
||||
|
||||
it.live("falls through unsupported image mime types to text", () =>
|
||||
Effect.gen(function* () {
|
||||
const dir = yield* tmpdirScoped()
|
||||
const cases = [
|
||||
["image.bmp", "BM text content"],
|
||||
["photo.tiff", "II text content"],
|
||||
["photo.avif", "avif text content"],
|
||||
] as const
|
||||
|
||||
for (const item of cases) {
|
||||
yield* put(path.join(dir, item[0]), item[1])
|
||||
const result = yield* exec(dir, { filePath: path.join(dir, item[0]) })
|
||||
expect(result.attachments).toBeUndefined()
|
||||
expect(result.output).toContain(item[1])
|
||||
}
|
||||
}),
|
||||
)
|
||||
})
|
||||
|
||||
describe("tool.read loaded instructions", () => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue