diff --git a/packages/server/src/server/agent/providers/opencode/tool-call-detail-parser.ts b/packages/server/src/server/agent/providers/opencode/tool-call-detail-parser.ts index 670286344..992a0a4e6 100644 --- a/packages/server/src/server/agent/providers/opencode/tool-call-detail-parser.ts +++ b/packages/server/src/server/agent/providers/opencode/tool-call-detail-parser.ts @@ -219,6 +219,25 @@ function deriveOpencodeTaskDetail( }; } +const OpencodeEditInputSchema = z.union([ + z + .object({ + filePath: z.string(), + oldString: z.string().optional(), + newString: z.string().optional(), + }) + .passthrough() + .transform((value) => ({ + filePath: value.filePath, + oldString: nonEmptyString(value.oldString), + newString: nonEmptyString(value.newString), + unifiedDiff: undefined, + })), + ToolEditInputSchema, +]); + +const OpencodeEditOutputSchema = z.union([z.string().transform(() => null), ToolEditOutputSchema]); + const OpencodeKnownToolDetailSchema = z.union([ toolDetailBranchByToolName( "shell", @@ -264,11 +283,16 @@ const OpencodeKnownToolDetailSchema = z.union([ ToolWriteOutputSchema, toWriteToolDetail, ), - toolDetailBranchByToolName("edit", ToolEditInputSchema, ToolEditOutputSchema, toEditToolDetail), + toolDetailBranchByToolName( + "edit", + OpencodeEditInputSchema, + OpencodeEditOutputSchema, + toEditToolDetail, + ), toolDetailBranchByToolName( "apply_patch", - ToolEditInputSchema, - ToolEditOutputSchema, + OpencodeEditInputSchema, + OpencodeEditOutputSchema, toEditToolDetail, ), toolDetailBranchByToolName( @@ -279,8 +303,8 @@ const OpencodeKnownToolDetailSchema = z.union([ ), toolDetailBranchByToolName( "apply_diff", - ToolEditInputSchema, - ToolEditOutputSchema, + OpencodeEditInputSchema, + OpencodeEditOutputSchema, toEditToolDetail, ), toolDetailBranchByToolName("search", ToolSearchInputSchema, z.unknown(), (input) => 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 9a28fdc01..fa558da81 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 @@ -296,6 +296,29 @@ describe("opencode tool-call mapper", () => { }); }); + it("maps completed edit calls with OpenCode camelCase input and success text", () => { + const item = expectMapped( + mapOpencodeToolCall({ + toolName: "edit", + callId: "opencode-edit-camel", + status: "completed", + input: { + filePath: "/Users/moboudra/dev/paseo/packages/website/src/data/agent-pages.ts", + oldString: 'metaTitle: "Junie agent Mobile and Desktop App, Open Source"', + newString: 'metaTitle: "Junie Agent Mobile and Desktop App, Open Source"', + }, + output: "Edit applied successfully.", + }), + ); + + expect(item.detail).toEqual({ + type: "edit", + filePath: "/Users/moboudra/dev/paseo/packages/website/src/data/agent-pages.ts", + oldString: 'metaTitle: "Junie agent Mobile and Desktop App, Open Source"', + newString: 'metaTitle: "Junie Agent Mobile and Desktop App, Open Source"', + }); + }); + it("maps skill calls to plain text detail with the loaded skill name", () => { const item = expectMapped( mapOpencodeToolCall({