import { expect, test } from 'bun:test' import { z } from 'zod/v4' import { getEmptyToolPermissionContext, type Tool, type Tools } from '../Tool.js' import { SkillTool } from '../tools/SkillTool/SkillTool.js' import { toolToAPISchema } from './api.js' test('toolToAPISchema preserves provider-specific schema keywords in input_schema', async () => { const schema = await toolToAPISchema( { name: 'WebFetch', inputSchema: z.strictObject({}), inputJSONSchema: { type: 'object', properties: { url: { type: 'string', format: 'uri', description: 'Public HTTP or HTTPS URL', }, metadata: { type: 'object', propertyNames: { pattern: '^[a-z]+$', }, properties: { callback: { type: 'string', format: 'uri-reference', }, }, }, }, }, prompt: async () => 'Fetch a URL', } as unknown as Tool, { getToolPermissionContext: async () => getEmptyToolPermissionContext(), tools: [] as unknown as Tools, agents: [], }, ) expect(schema).toMatchObject({ input_schema: { type: 'object', properties: { url: { type: 'string', format: 'uri', description: 'Public HTTP or HTTPS URL', }, metadata: { type: 'object', propertyNames: { pattern: '^[a-z]+$', }, properties: { callback: { type: 'string', format: 'uri-reference', }, }, }, }, }, }) }) test('toolToAPISchema keeps skill required for SkillTool', async () => { const schema = await toolToAPISchema(SkillTool, { getToolPermissionContext: async () => getEmptyToolPermissionContext(), tools: [] as unknown as Tools, agents: [], }) expect((schema as { input_schema: unknown }).input_schema).toMatchObject({ type: 'object', required: ['skill'], }) })