diff --git a/packages/opencode/src/tool/read.ts b/packages/opencode/src/tool/read.ts index ce4ab28619d..3b1484cbc0f 100644 --- a/packages/opencode/src/tool/read.ts +++ b/packages/opencode/src/tool/read.ts @@ -59,7 +59,9 @@ export const ReadTool = Tool.define("read", { throw new Error(`File not found: ${filepath}`) } - const isImage = file.type.startsWith("image/") && file.type !== "image/svg+xml" + // Exclude SVG (XML-based) and vnd.fastbidsheet (.fbs extension, commonly FlatBuffers schema files) + const isImage = + file.type.startsWith("image/") && file.type !== "image/svg+xml" && file.type !== "image/vnd.fastbidsheet" const isPdf = file.type === "application/pdf" if (isImage || isPdf) { const mime = file.type diff --git a/packages/opencode/test/tool/read.test.ts b/packages/opencode/test/tool/read.test.ts index 04ffc80ea67..7250bd2fd1e 100644 --- a/packages/opencode/test/tool/read.test.ts +++ b/packages/opencode/test/tool/read.test.ts @@ -300,4 +300,33 @@ describe("tool.read truncation", () => { }, }) }) + + test(".fbs files (FlatBuffers schema) are read as text, not images", async () => { + await using tmp = await tmpdir({ + init: async (dir) => { + // FlatBuffers schema content + const fbsContent = `namespace MyGame; + +table Monster { + pos:Vec3; + name:string; + inventory:[ubyte]; +} + +root_type Monster;` + await Bun.write(path.join(dir, "schema.fbs"), fbsContent) + }, + }) + await Instance.provide({ + directory: tmp.path, + fn: async () => { + const read = await ReadTool.init() + const result = await read.execute({ filePath: path.join(tmp.path, "schema.fbs") }, ctx) + // Should be read as text, not as image + expect(result.attachments).toBeUndefined() + expect(result.output).toContain("namespace MyGame") + expect(result.output).toContain("table Monster") + }, + }) + }) })