From 486840cbee43f5848529eef08b58c2f6c0c52f2e Mon Sep 17 00:00:00 2001 From: Joey Barkley Date: Thu, 2 Apr 2026 23:32:33 -0500 Subject: [PATCH] fix(opencode): replace zodToJsonSchema with z.toJSONSchema for Zod v4 compat zodToJsonSchema from zod-to-json-schema@3.x produces incorrect output with Zod v4 schemas (returns {"type":"string"} for object schemas, losing all properties and descriptions). Switch the experimental tools API endpoint to z.toJSONSchema() which is Zod v4's built-in converter and correctly preserves .describe() metadata. Fixes #20807 Co-Authored-By: Claude Opus 4.6 (1M context) --- packages/opencode/src/server/routes/experimental.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/opencode/src/server/routes/experimental.ts b/packages/opencode/src/server/routes/experimental.ts index a41b21a1fe9b..8de419782d61 100644 --- a/packages/opencode/src/server/routes/experimental.ts +++ b/packages/opencode/src/server/routes/experimental.ts @@ -8,7 +8,6 @@ import { Instance } from "../../project/instance" import { Project } from "../../project/project" import { MCP } from "../../mcp" import { Session } from "../../session" -import { zodToJsonSchema } from "zod-to-json-schema" import { errors } from "../error" import { lazy } from "../../util/lazy" import { WorkspaceRoutes } from "./workspace" @@ -83,8 +82,11 @@ export const ExperimentalRoutes = lazy(() => tools.map((t) => ({ id: t.id, description: t.description, - // Handle both Zod schemas and plain JSON schemas - parameters: (t.parameters as any)?._def ? zodToJsonSchema(t.parameters as any) : t.parameters, + // Convert Zod schemas to JSON Schema via Zod v4 built-in. + // The previous zodToJsonSchema (zod-to-json-schema@3.x) is incompatible with Zod v4. + parameters: typeof (t.parameters as any)?.parse === "function" + ? z.toJSONSchema(t.parameters as any) + : t.parameters, })), ) },