diff --git a/packages/server/src/server/agent/providers/opencode/tool-call-mapper.test.ts b/packages/server/src/server/agent/providers/opencode/tool-call-mapper.test.ts index a40d7adfa..280e2b6e4 100644 --- a/packages/server/src/server/agent/providers/opencode/tool-call-mapper.test.ts +++ b/packages/server/src/server/agent/providers/opencode/tool-call-mapper.test.ts @@ -245,6 +245,27 @@ describe("opencode tool-call mapper", () => { }); }); + it("maps completed write calls with OpenCode success text into canonical detail", () => { + const item = expectMapped( + mapOpencodeToolCall({ + toolName: "write", + callId: "opencode-write-success-text", + status: "completed", + input: { + filePath: "/Users/moboudra/.paseo/worktrees/1luy0po7/cold-ladybug/dummy.txt", + content: "hello world\n", + }, + output: "Wrote file successfully.", + }), + ); + + expect(item.detail).toEqual({ + type: "write", + filePath: "/Users/moboudra/.paseo/worktrees/1luy0po7/cold-ladybug/dummy.txt", + content: "hello world\n", + }); + }); + it("maps skill calls to plain text detail with the loaded skill name", () => { const item = expectMapped( mapOpencodeToolCall({ diff --git a/packages/server/src/server/agent/providers/tool-call-detail-primitives.ts b/packages/server/src/server/agent/providers/tool-call-detail-primitives.ts index b2adcabb1..b88fe497b 100644 --- a/packages/server/src/server/agent/providers/tool-call-detail-primitives.ts +++ b/packages/server/src/server/agent/providers/tool-call-detail-primitives.ts @@ -387,6 +387,10 @@ export const ToolWriteInputSchema = z })); export const ToolWriteOutputSchema = z.union([ + z.string().transform(() => ({ + filePath: undefined, + content: undefined, + })), z.intersection(ToolPathInputSchema, ToolWriteContentSchema).transform((value) => ({ filePath: value.filePath, content: