fix: add Zod v4 schema extraction support in Railway executor

- Import Zod v4's toJSONSchema from zod@4/json-schema
- Add Strategy 3: Detect Zod v4 schemas via ._zod property
- Convert Zod v4 schemas using native toJSONSchema function
- Update error message to mention both Zod v4 and v3 support

Fixes schema extraction for @tpmjs/emoji-magic and other Zod v4 tools

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Ajax Davis 2025-12-29 23:21:05 +10:00
parent 26421be4e6
commit 1c8b516db8

View file

@ -5,6 +5,8 @@
// Import zod-to-json-schema for Zod v3 support // Import zod-to-json-schema for Zod v3 support
import { zodToJsonSchema } from 'https://esm.sh/zod-to-json-schema@3.25.0'; import { zodToJsonSchema } from 'https://esm.sh/zod-to-json-schema@3.25.0';
// Import Zod v4's JSON Schema converter (for packages using Zod v4)
import { toJSONSchema as zodV4ToJsonSchema } from 'https://esm.sh/zod@4/json-schema';
// Cache TTL: 2 minutes // Cache TTL: 2 minutes
const CACHE_TTL_MS = 2 * 60 * 1000; const CACHE_TTL_MS = 2 * 60 * 1000;
@ -406,7 +408,20 @@ async function loadAndDescribe(req: Request): Promise<Response> {
rawJsonSchema = toolModule.inputSchema.jsonSchema; rawJsonSchema = toolModule.inputSchema.jsonSchema;
} }
// Strategy 3: Try Zod v3 schema (detect via _def property and convert) // Strategy 3: Try Zod v4 schema (detect via _zod property - new in Zod v4)
if (!rawJsonSchema && toolModule.inputSchema._zod) {
console.log(
`📋 Detected Zod v4 schema, converting with Zod v4 toJSONSchema for ${cacheKey}`
);
try {
rawJsonSchema = zodV4ToJsonSchema(toolModule.inputSchema);
console.log(`✅ Successfully converted Zod v4 schema for ${cacheKey}`);
} catch (error) {
console.warn(`⚠️ Zod v4 toJSONSchema conversion failed for ${cacheKey}:`, error);
}
}
// Strategy 4: Try Zod v3 schema (detect via _def property and convert)
if (!rawJsonSchema && toolModule.inputSchema._def) { if (!rawJsonSchema && toolModule.inputSchema._def) {
console.log( console.log(
`📋 Detected Zod schema (v3), converting with zod-to-json-schema for ${cacheKey}` `📋 Detected Zod schema (v3), converting with zod-to-json-schema for ${cacheKey}`
@ -436,11 +451,12 @@ async function loadAndDescribe(req: Request): Promise<Response> {
return Response.json( return Response.json(
{ {
success: false, success: false,
error: `Tool "${name}" has no valid inputSchema. Tools must use AI SDK jsonSchema(), Zod v4 toJSONSchema(), or Zod v3 schemas.`, error: `Tool "${name}" has no valid inputSchema. Tools must use AI SDK jsonSchema(), Zod v4 (._zod), or Zod v3 (._def) schemas.`,
debug: { debug: {
hasInputSchema: !!toolModule.inputSchema, hasInputSchema: !!toolModule.inputSchema,
availableMethods: toolModule.inputSchema ? Object.keys(toolModule.inputSchema) : [], availableMethods: toolModule.inputSchema ? Object.keys(toolModule.inputSchema) : [],
hasZodDef: !!toolModule.inputSchema?._def, hasZodV4: !!toolModule.inputSchema?._zod,
hasZodV3Def: !!toolModule.inputSchema?._def,
}, },
}, },
{ status: 400 } { status: 400 }