tool-schema 0.1.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/README.md +77 -10
- package/dist/{chunk-OI5FY7ML.js → chunk-HM2FG6DI.js} +4 -1
- package/dist/{chunk-OI5FY7ML.js.map → chunk-HM2FG6DI.js.map} +1 -1
- package/dist/cli.cjs +1 -0
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/index.cjs +61 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +40 -1
- package/dist/index.d.ts +40 -1
- package/dist/index.js +61 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,28 @@ All notable changes to this project are documented here. The format is based on
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres
|
|
5
5
|
to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [Unreleased]
|
|
8
|
+
|
|
9
|
+
## [0.3.0] - 2026-06-05
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Added Vercel AI SDK adapter helpers: `toAISDKTool(...)` emits AI SDK v5
|
|
14
|
+
`inputSchema` tool definitions, and `fromAISDKTool(...)` converts AI SDK tools
|
|
15
|
+
into provider-specific OpenAI, Anthropic, Gemini or MCP tool shapes.
|
|
16
|
+
- Added legacy AI SDK v4 `parameters` support and a zero-dependency
|
|
17
|
+
`zodToJsonSchema` hook for callers using Zod inputs.
|
|
18
|
+
|
|
19
|
+
## [0.2.0] - 2026-06-05
|
|
20
|
+
|
|
21
|
+
### Added
|
|
22
|
+
|
|
23
|
+
- Added MCP `outputSchema` support on `toTool(...)` definitions so tools can
|
|
24
|
+
describe `structuredContent` results.
|
|
25
|
+
- Preserved MCP output schemas as standard JSON Schema without forcing an object
|
|
26
|
+
root, matching structured outputs that return arrays, primitives or composed
|
|
27
|
+
schemas.
|
|
28
|
+
|
|
7
29
|
## [0.1.3] - 2026-06-04
|
|
8
30
|
|
|
9
31
|
### Changed
|
package/README.md
CHANGED
|
@@ -9,11 +9,15 @@
|
|
|
9
9
|
|
|
10
10
|
One JSON Schema in, a valid tool / function calling schema out, for **OpenAI**, **Anthropic**, **Gemini** and **MCP**. Zero dependencies.
|
|
11
11
|
|
|
12
|
+
Security posture is tracked in [docs/security-posture.md](./docs/security-posture.md),
|
|
13
|
+
including CodeQL, OpenSSF Scorecard, Dependabot and branch rules.
|
|
14
|
+
|
|
12
15
|
Every provider accepts a slightly different subset of JSON Schema for tool calling, and the differences are exactly the kind that fail at runtime with a `400 invalid schema`:
|
|
13
16
|
|
|
14
17
|
- **OpenAI** strict mode demands `additionalProperties: false` on every object and every property listed in `required`, and rejects `allOf`, `not` and `if/then/else`.
|
|
15
18
|
- **Gemini** does not understand `$ref`, `oneOf`, `allOf` or `additionalProperties`, and expresses nullability as `nullable: true` instead of `type: ["string", "null"]`.
|
|
16
|
-
- **Anthropic** and **MCP** are permissive but still require an object at the root.
|
|
19
|
+
- **Anthropic** and **MCP input schemas** are permissive but still require an object at the root.
|
|
20
|
+
- **MCP output schemas** describe `structuredContent` and can be any JSON Schema shape, including arrays and primitives.
|
|
17
21
|
|
|
18
22
|
`tool-schema` knows these rules so you do not have to. Write your schema once, target any provider.
|
|
19
23
|
|
|
@@ -54,6 +58,35 @@ toTool(def, { target: 'gemini' }); // { name, description, parameters }
|
|
|
54
58
|
toTool(def, { target: 'mcp' }); // { name, description, inputSchema, annotations? }
|
|
55
59
|
```
|
|
56
60
|
|
|
61
|
+
MCP tools can also publish an `outputSchema` for structured tool results:
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
toTool(
|
|
65
|
+
{
|
|
66
|
+
name: 'rank_files',
|
|
67
|
+
description: 'Rank files by relevance',
|
|
68
|
+
schema: {
|
|
69
|
+
type: 'object',
|
|
70
|
+
properties: { query: { type: 'string' } },
|
|
71
|
+
required: ['query'],
|
|
72
|
+
},
|
|
73
|
+
outputSchema: {
|
|
74
|
+
type: 'array',
|
|
75
|
+
items: {
|
|
76
|
+
type: 'object',
|
|
77
|
+
properties: {
|
|
78
|
+
path: { type: 'string' },
|
|
79
|
+
score: { type: 'number' },
|
|
80
|
+
},
|
|
81
|
+
required: ['path', 'score'],
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
{ target: 'mcp' },
|
|
86
|
+
);
|
|
87
|
+
// -> { name, description, inputSchema, outputSchema }
|
|
88
|
+
```
|
|
89
|
+
|
|
57
90
|
## Convert just the schema
|
|
58
91
|
|
|
59
92
|
When you already build the tool envelope yourself and only need a provider valid
|
|
@@ -82,6 +115,39 @@ const schema = z.toJSONSchema(z.object({ city: z.string(), units: z.enum(['c', '
|
|
|
82
115
|
const { tool } = toTool({ name: 'get_weather', schema }, { target: 'openai-strict' });
|
|
83
116
|
```
|
|
84
117
|
|
|
118
|
+
## Vercel AI SDK adapter
|
|
119
|
+
|
|
120
|
+
AI SDK v5 tools use `{ description?, inputSchema, strict? }`. Convert a normal
|
|
121
|
+
`tool-schema` definition into that shape, while still applying provider rules:
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
import { toAISDKTool, fromAISDKTool } from 'tool-schema';
|
|
125
|
+
|
|
126
|
+
const { tool: aiSdkTool } = toAISDKTool(
|
|
127
|
+
{ name: 'get_weather', description: 'Get weather', schema },
|
|
128
|
+
{ target: 'openai-strict' },
|
|
129
|
+
);
|
|
130
|
+
// aiSdkTool -> { description, inputSchema, strict: true }
|
|
131
|
+
|
|
132
|
+
// AI SDK tool names usually live as keys in the `tools` object.
|
|
133
|
+
const { tool: openaiTool } = fromAISDKTool('get_weather', aiSdkTool, { target: 'openai-strict' });
|
|
134
|
+
// openaiTool -> { type: 'function', function: { name, description, parameters, strict: true } }
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Use `{ aiSDKParameters: true }` for legacy AI SDK v4 `parameters` instead of
|
|
138
|
+
`inputSchema`. For Zod inputs, keep `tool-schema` zero-dependency by passing a
|
|
139
|
+
converter:
|
|
140
|
+
|
|
141
|
+
```ts
|
|
142
|
+
import { z } from 'zod';
|
|
143
|
+
import { fromAISDKTool } from 'tool-schema';
|
|
144
|
+
|
|
145
|
+
fromAISDKTool('get_weather', { inputSchema: z.object({ city: z.string() }) }, {
|
|
146
|
+
target: 'openai-strict',
|
|
147
|
+
zodToJsonSchema: z.toJSONSchema,
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
85
151
|
## Lint without transforming
|
|
86
152
|
|
|
87
153
|
Want to know whether a schema is already valid for a provider, for example in a
|
|
@@ -105,18 +171,19 @@ if (!ok) {
|
|
|
105
171
|
| `anthropic` | `input_schema` | Permissive. Ensures an object root. |
|
|
106
172
|
| `gemini` | `parameters` | OpenAPI subset: inlines `$ref`, strips `oneOf`/`allOf`/`additionalProperties`, `nullable: true`, string enums. |
|
|
107
173
|
| `gemini-jsonschema` | `parametersJsonSchema` | Gemini's richer route. Keeps `$ref` and more. |
|
|
108
|
-
| `mcp` | `inputSchema` | Most permissive. Ensures an object root. Supports `annotations`.
|
|
174
|
+
| `mcp` | `inputSchema` | Most permissive for input. Ensures an object root. Supports `annotations` and `outputSchema`. |
|
|
109
175
|
|
|
110
176
|
## Provider rules at a glance
|
|
111
177
|
|
|
112
|
-
| Constraint | openai | openai-strict | anthropic | gemini | mcp
|
|
113
|
-
| ------------------------------------ | -------------- | ------------------------ | -------------- | ---------------- |
|
|
114
|
-
| Root must be object | yes | yes | yes | yes |
|
|
115
|
-
| `additionalProperties: false` forced | no | yes (every object) | no | removed | no
|
|
116
|
-
| All properties required | no | yes (optionals nullable) | no | no | no
|
|
117
|
-
| `$ref` / `$defs` | keep | keep | keep | inlined | keep
|
|
118
|
-
| `oneOf` / `allOf` / `not` | keep | stripped / merged | keep | stripped | keep
|
|
119
|
-
| Nullability | `["t","null"]` | `["t","null"]` | `["t","null"]` | `nullable: true` | any
|
|
178
|
+
| Constraint | openai | openai-strict | anthropic | gemini | mcp |
|
|
179
|
+
| ------------------------------------ | -------------- | ------------------------ | -------------- | ---------------- | ---------- |
|
|
180
|
+
| Root must be object | yes | yes | yes | yes | input only |
|
|
181
|
+
| `additionalProperties: false` forced | no | yes (every object) | no | removed | no |
|
|
182
|
+
| All properties required | no | yes (optionals nullable) | no | no | no |
|
|
183
|
+
| `$ref` / `$defs` | keep | keep | keep | inlined | keep |
|
|
184
|
+
| `oneOf` / `allOf` / `not` | keep | stripped / merged | keep | stripped | keep |
|
|
185
|
+
| Nullability | `["t","null"]` | `["t","null"]` | `["t","null"]` | `nullable: true` | any |
|
|
186
|
+
| Structured output schema | no | no | no | no | yes |
|
|
120
187
|
|
|
121
188
|
## CLI
|
|
122
189
|
|
|
@@ -535,6 +535,7 @@ function buildTool(def, schema, target, options) {
|
|
|
535
535
|
name,
|
|
536
536
|
...description ? { description } : {},
|
|
537
537
|
inputSchema: schema,
|
|
538
|
+
...def.outputSchema ? { outputSchema: clone(def.outputSchema) } : {},
|
|
538
539
|
...def.annotations ? { annotations: def.annotations } : {}
|
|
539
540
|
};
|
|
540
541
|
default:
|
|
@@ -561,8 +562,10 @@ function validateName(name, target, warnings) {
|
|
|
561
562
|
}
|
|
562
563
|
|
|
563
564
|
export {
|
|
565
|
+
isPlainObject,
|
|
566
|
+
clone,
|
|
564
567
|
toToolSchema,
|
|
565
568
|
toTool,
|
|
566
569
|
lintToolSchema
|
|
567
570
|
};
|
|
568
|
-
//# sourceMappingURL=chunk-
|
|
571
|
+
//# sourceMappingURL=chunk-HM2FG6DI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/util.ts","../src/targets/openai.ts","../src/targets/anthropic.ts","../src/targets/gemini.ts","../src/targets/mcp.ts","../src/transform.ts"],"sourcesContent":["import type { JSONSchema, Warning, WarningCode } from './types.js';\n\n/** Collects warnings and tracks whether the conversion lost information. */\nexport class Warnings {\n readonly list: Warning[] = [];\n lossy = false;\n\n add(path: string, code: WarningCode, message: string, lossy = true): void {\n this.list.push({ path, code, message });\n if (lossy) this.lossy = true;\n }\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** A deep, structurally faithful clone. Uses the platform `structuredClone`. */\nexport function clone<T>(value: T): T {\n return structuredClone(value);\n}\n\n/** Returns the schema's declared types as an array (empty when untyped). */\nexport function typesOf(schema: JSONSchema): string[] {\n if (typeof schema.type === 'string') return [schema.type];\n if (Array.isArray(schema.type)) return schema.type.filter((t) => typeof t === 'string');\n return [];\n}\n\n/**\n * Heuristic: does this node describe an object? True when `type` is `object`\n * (or a union containing it) or when it is untyped but carries object keywords.\n */\nexport function isObjectSchema(schema: JSONSchema): boolean {\n const types = typesOf(schema);\n if (types.includes('object')) return true;\n if (types.length > 0) return false;\n return isPlainObject(schema.properties) || schema.additionalProperties !== undefined;\n}\n\n/**\n * Makes a schema accept `null`. Adds `null` to a string/array `type`, appends a\n * `{ type: 'null' }` branch to an `anyOf`, otherwise wraps the node in an\n * `anyOf` with a null branch. Used by OpenAI strict mode where every property\n * must be `required`, so optional fields are expressed as nullable instead.\n */\nexport function makeNullable(schema: JSONSchema): JSONSchema {\n if (typeof schema.type === 'string') {\n if (schema.type === 'null') return schema;\n return { ...schema, type: [schema.type, 'null'] };\n }\n if (Array.isArray(schema.type)) {\n if (schema.type.includes('null')) return schema;\n return { ...schema, type: [...schema.type, 'null'] };\n }\n if (Array.isArray(schema.anyOf)) {\n if (schema.anyOf.some((b) => typesOf(b).includes('null'))) return schema;\n return { ...schema, anyOf: [...schema.anyOf, { type: 'null' }] };\n }\n return { anyOf: [schema, { type: 'null' }] };\n}\n\n/**\n * Resolves local `$ref` pointers (`#/$defs/...` or `#/definitions/...`) by\n * inlining them. Non local refs are left untouched. Recursive refs are replaced\n * with an empty schema and reported, since target dialects that need inlining\n * (Gemini route A) cannot express recursion.\n */\nexport function dereference(root: JSONSchema, warnings: Warnings): JSONSchema {\n const defs: Record<string, JSONSchema> = {\n ...(isPlainObject(root.definitions) ? (root.definitions as Record<string, JSONSchema>) : {}),\n ...(isPlainObject(root.$defs) ? (root.$defs as Record<string, JSONSchema>) : {}),\n };\n\n const resolve = (ref: string): JSONSchema | undefined => {\n const m = /^#\\/(?:\\$defs|definitions)\\/(.+)$/.exec(ref);\n if (!m) return undefined;\n const key = decodeURIComponent(m[1].replace(/~1/g, '/').replace(/~0/g, '~'));\n return defs[key];\n };\n\n const walk = (node: JSONSchema, path: string, seen: Set<string>): JSONSchema => {\n if (!isPlainObject(node)) return node;\n if (typeof node.$ref === 'string') {\n const ref = node.$ref;\n const target = resolve(ref);\n if (!target) return node; // leave external / unknown refs in place\n if (seen.has(ref)) {\n warnings.add(path, 'recursive-ref', `Recursive $ref '${ref}' cannot be inlined; replaced with an open schema.`);\n return {};\n }\n const { $ref: _drop, ...rest } = node;\n void _drop;\n warnings.add(path, 'inlined-ref', `Inlined $ref '${ref}'.`, false);\n const merged = { ...clone(target), ...rest };\n return walk(merged, path, new Set([...seen, ref]));\n }\n return mapChildren(node, path, (child, childPath) => walk(child, childPath, seen));\n };\n\n const out = walk(clone(root), '#', new Set());\n delete out.$defs;\n delete out.definitions;\n return out;\n}\n\n/**\n * Applies `fn` to every direct sub schema of `node`, returning a new node. Walks\n * the standard applicator keywords. Leaf keywords are copied as is.\n */\nexport function mapChildren(\n node: JSONSchema,\n path: string,\n fn: (child: JSONSchema, childPath: string) => JSONSchema,\n): JSONSchema {\n const out: JSONSchema = { ...node };\n\n if (isPlainObject(out.properties)) {\n const props: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.properties as Record<string, JSONSchema>)) {\n props[k] = fn(v, `${path}/properties/${k}`);\n }\n out.properties = props;\n }\n\n if (Array.isArray(out.items)) {\n out.items = out.items.map((it, i) => fn(it, `${path}/items/${i}`));\n } else if (isPlainObject(out.items)) {\n out.items = fn(out.items as JSONSchema, `${path}/items`);\n }\n\n if (isPlainObject(out.additionalProperties)) {\n out.additionalProperties = fn(out.additionalProperties as JSONSchema, `${path}/additionalProperties`);\n }\n\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = out[key];\n if (Array.isArray(arr)) {\n out[key] = arr.map((b, i) => fn(b, `${path}/${key}/${i}`));\n }\n }\n\n if (isPlainObject(out.not)) out.not = fn(out.not as JSONSchema, `${path}/not`);\n for (const key of ['if', 'then', 'else'] as const) {\n if (isPlainObject(out[key])) out[key] = fn(out[key] as JSONSchema, `${path}/${key}`);\n }\n\n if (isPlainObject(out.patternProperties)) {\n const pp: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.patternProperties as Record<string, JSONSchema>)) {\n pp[k] = fn(v, `${path}/patternProperties/${k}`);\n }\n out.patternProperties = pp;\n }\n\n for (const key of ['$defs', 'definitions', 'dependentSchemas'] as const) {\n const map = out[key];\n if (isPlainObject(map)) {\n const next: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(map as Record<string, JSONSchema>)) {\n next[k] = fn(v as JSONSchema, `${path}/${key}/${k}`);\n }\n out[key] = next;\n }\n }\n\n return out;\n}\n\n/** Ensures the root is an object schema, reporting when it was not. */\nexport function ensureObjectRoot(schema: JSONSchema, warnings: Warnings, target: string): JSONSchema {\n if (isObjectSchema(schema)) {\n if (typesOf(schema).length === 0) return { type: 'object', ...schema };\n return schema;\n }\n warnings.add(\n '#',\n 'root-not-object',\n `${target} requires the root schema to be an object; wrapped the schema under a 'value' property.`,\n );\n return {\n type: 'object',\n properties: { value: schema },\n required: ['value'],\n };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport {\n Warnings,\n clone,\n isObjectSchema,\n isPlainObject,\n makeNullable,\n mapChildren,\n ensureObjectRoot,\n} from '../util.js';\n\n/** Formats OpenAI Structured Outputs accepts. Others are dropped in strict mode. */\nconst FORMAT_WHITELIST = new Set([\n 'date-time',\n 'time',\n 'date',\n 'duration',\n 'email',\n 'hostname',\n 'ipv4',\n 'ipv6',\n 'uuid',\n]);\n\n/** Keywords OpenAI strict mode rejects outright. */\nconst UNSUPPORTED = [\n 'not',\n 'if',\n 'then',\n 'else',\n 'dependentRequired',\n 'dependentSchemas',\n 'patternProperties',\n 'unevaluatedProperties',\n] as const;\n\nconst MAX_PROPERTIES = 5000;\nconst MAX_DEPTH = 10;\nconst MAX_ENUM_VALUES = 1000;\n\n/** OpenAI non strict: tool parameters should be an object, otherwise pass through. */\nexport function toOpenAI(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'OpenAI');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/**\n * OpenAI Structured Outputs / `strict: true`. Enforces: every object has\n * `additionalProperties: false`; every property is `required` (optional ones\n * become nullable); unsupported keywords are stripped; `allOf` is merged; only\n * whitelisted `format` values survive. `$defs` / `$ref` and `anyOf` are kept.\n */\nexport function toOpenAIStrict(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n if (Array.isArray(s.allOf)) {\n s = mergeAllOf(s, path, warnings);\n }\n\n for (const kw of UNSUPPORTED) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported in OpenAI strict mode; removed.`);\n }\n }\n\n if (typeof s.format === 'string' && !FORMAT_WHITELIST.has(s.format)) {\n warnings.add(\n `${path}/format`,\n 'unsupported-format',\n `format '${s.format}' is not in OpenAI's whitelist; removed.`,\n );\n delete s.format;\n }\n\n // Recurse into all sub schemas first (anyOf branches, items, $defs, ...).\n s = mapChildren(s, path, transform);\n\n if (isObjectSchema(s) && isPlainObject(s.properties)) {\n const props = s.properties as Record<string, JSONSchema>;\n const originalRequired = new Set(Array.isArray(s.required) ? s.required : []);\n const nextProps: Record<string, JSONSchema> = {};\n for (const key of Object.keys(props)) {\n let child = props[key];\n if (!originalRequired.has(key)) {\n child = makeNullable(child);\n warnings.add(\n `${path}/properties/${key}`,\n 'forced-required',\n `Optional property '${key}' was made required and nullable for OpenAI strict mode.`,\n );\n }\n nextProps[key] = child;\n }\n s.properties = nextProps;\n s.required = Object.keys(nextProps);\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' as required by strict mode.\",\n false,\n );\n }\n s.additionalProperties = false;\n } else if (isObjectSchema(s)) {\n // Object without declared properties: strict mode still forbids extra keys.\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' on a property-less object.\",\n false,\n );\n }\n s.additionalProperties = false;\n }\n\n return s;\n };\n\n const schema = ensureObjectRoot(transform(clone(input), '#'), warnings, 'OpenAI strict mode');\n checkLimits(schema, warnings);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Shallow merges `allOf` object subschemas into the parent, then drops `allOf`. */\nfunction mergeAllOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n const parts = node.allOf as JSONSchema[];\n const { allOf: _drop, ...base } = node;\n void _drop;\n const merged: JSONSchema = { ...base };\n const props: Record<string, JSONSchema> = isPlainObject(merged.properties)\n ? { ...(merged.properties as Record<string, JSONSchema>) }\n : {};\n const required = new Set<string>(Array.isArray(merged.required) ? merged.required : []);\n\n for (const part of parts) {\n if (!isPlainObject(part)) continue;\n if (isPlainObject(part.properties)) {\n Object.assign(props, part.properties);\n }\n if (Array.isArray(part.required)) {\n for (const r of part.required) required.add(r);\n }\n if (part.type && !merged.type) merged.type = part.type;\n }\n\n if (Object.keys(props).length > 0) merged.properties = props;\n if (required.size > 0) merged.required = [...required];\n if (!merged.type && (merged.properties || isObjectSchema(merged))) merged.type = 'object';\n warnings.add(path, 'merged-allof', \"Merged 'allOf' subschemas into the parent (unsupported in strict mode).\");\n return merged;\n}\n\nfunction checkLimits(schema: JSONSchema, warnings: Warnings): void {\n let propertyCount = 0;\n let maxDepth = 0;\n\n const visit = (node: JSONSchema, depth: number): void => {\n if (!isPlainObject(node)) return;\n maxDepth = Math.max(maxDepth, depth);\n if (isPlainObject(node.properties)) {\n const keys = Object.keys(node.properties as Record<string, JSONSchema>);\n propertyCount += keys.length;\n }\n if (Array.isArray(node.enum) && node.enum.length > MAX_ENUM_VALUES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `An enum has ${node.enum.length} values; OpenAI allows at most ${MAX_ENUM_VALUES}.`,\n false,\n );\n }\n const children = collectChildren(node);\n for (const c of children) visit(c, depth + 1);\n };\n\n visit(schema, 0);\n if (propertyCount > MAX_PROPERTIES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema has ${propertyCount} object properties; OpenAI allows at most ${MAX_PROPERTIES}.`,\n false,\n );\n }\n if (maxDepth > MAX_DEPTH) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema nests ${maxDepth} levels deep; OpenAI allows at most ${MAX_DEPTH}.`,\n false,\n );\n }\n}\n\nfunction collectChildren(node: JSONSchema): JSONSchema[] {\n const out: JSONSchema[] = [];\n if (isPlainObject(node.properties)) out.push(...Object.values(node.properties as Record<string, JSONSchema>));\n if (Array.isArray(node.items)) out.push(...node.items);\n else if (isPlainObject(node.items)) out.push(node.items as JSONSchema);\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = node[key];\n if (Array.isArray(arr)) out.push(...arr);\n }\n if (isPlainObject(node.$defs)) out.push(...Object.values(node.$defs as Record<string, JSONSchema>));\n return out.filter(isPlainObject) as JSONSchema[];\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * Anthropic tool use. The API is permissive: it accepts standard JSON Schema for\n * `input_schema` (anyOf, oneOf, allOf, $ref, format, pattern, ...). The only hard\n * requirement is that the root is an object, so that is all we enforce.\n */\nexport function toAnthropic(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Anthropic');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, dereference, ensureObjectRoot, isPlainObject, mapChildren, typesOf } from '../util.js';\n\n/**\n * Keywords absent from Gemini's `Schema` proto (route A). Sending them either\n * errors or is silently ignored, so they are stripped.\n */\nconst STRIP = [\n '$schema',\n '$id',\n '$anchor',\n '$ref',\n 'oneOf',\n 'allOf',\n 'not',\n 'if',\n 'then',\n 'else',\n 'additionalProperties',\n 'patternProperties',\n 'unevaluatedProperties',\n 'const',\n 'dependentRequired',\n 'dependentSchemas',\n 'multipleOf',\n 'exclusiveMinimum',\n 'exclusiveMaximum',\n 'uniqueItems',\n 'contentEncoding',\n 'contentMediaType',\n '$defs',\n 'definitions',\n] as const;\n\nconst TYPE_UPPER: Record<string, string> = {\n string: 'STRING',\n number: 'NUMBER',\n integer: 'INTEGER',\n boolean: 'BOOLEAN',\n array: 'ARRAY',\n object: 'OBJECT',\n null: 'NULL',\n};\n\ninterface GeminiOptions {\n uppercaseTypes?: boolean;\n}\n\n/**\n * Gemini function calling, route A (`parameters` as an OpenAPI 3.0 subset).\n * Inlines `$ref`, strips unsupported keywords, converts nullable unions to\n * `nullable: true`, collapses `anyOf` null branches, and coerces enum values to\n * strings. Use the `gemini-jsonschema` target for the richer\n * `parametersJsonSchema` route.\n */\nexport function toGemini(input: JSONSchema, options: GeminiOptions = {}): TransformResult {\n const warnings = new Warnings();\n const dereferenced = dereference(clone(input), warnings);\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n for (const kw of STRIP) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported by Gemini (route A); removed.`);\n }\n }\n\n s = collapseNullableUnion(s, path, warnings);\n s = mapChildren(s, path, transform);\n s = collapseAnyOf(s, path, warnings);\n coerceEnum(s, path, warnings);\n return s;\n };\n\n let schema = ensureObjectRoot(transform(dereferenced, '#'), warnings, 'Gemini');\n if (options.uppercaseTypes) schema = uppercaseTypes(schema);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Final pass: rewrite JSON Schema type names to Gemini's upper case enum. */\nfunction uppercaseTypes(node: JSONSchema): JSONSchema {\n if (!isPlainObject(node)) return node;\n const out: JSONSchema = { ...node };\n if (typeof out.type === 'string') {\n out.type = TYPE_UPPER[out.type] ?? out.type;\n } else if (Array.isArray(out.type)) {\n out.type = out.type.map((t) => TYPE_UPPER[t] ?? t);\n }\n return mapChildren(out, '#', (child) => uppercaseTypes(child));\n}\n\n/** Gemini route B (`parametersJsonSchema`): richer JSON Schema, object root only. */\nexport function toGeminiJsonSchema(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Gemini (parametersJsonSchema)');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Converts `type: ['string', 'null']` into `type: 'string', nullable: true`. */\nfunction collapseNullableUnion(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.type)) return node;\n const nonNull = node.type.filter((t) => t !== 'null');\n const hadNull = node.type.includes('null');\n const out: JSONSchema = { ...node };\n if (nonNull.length === 0) {\n out.type = 'string';\n } else {\n out.type = nonNull[0];\n if (nonNull.length > 1) {\n warnings.add(\n path,\n 'union-types',\n `Gemini cannot express a union of types [${nonNull.join(', ')}]; kept '${nonNull[0]}'.`,\n );\n }\n }\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted nullable type union into 'nullable: true'.\", false);\n }\n return out;\n}\n\n/** Removes `{ type: 'null' }` branches from `anyOf`, mapping them to `nullable`. */\nfunction collapseAnyOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.anyOf)) return node;\n const branches = node.anyOf as JSONSchema[];\n const nonNull = branches.filter((b) => !(typesOf(b).length === 1 && typesOf(b)[0] === 'null'));\n const hadNull = nonNull.length !== branches.length;\n const out: JSONSchema = { ...node };\n\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted an anyOf null branch into 'nullable: true'.\", false);\n }\n\n if (nonNull.length === 0) {\n delete out.anyOf;\n if (!out.type) out.type = 'string';\n } else if (nonNull.length === 1) {\n // Flatten a single remaining branch into the parent.\n delete out.anyOf;\n const branch = nonNull[0];\n for (const [k, v] of Object.entries(branch)) {\n if (k === 'description' && out.description) continue;\n out[k] = v;\n }\n } else {\n out.anyOf = nonNull;\n }\n return out;\n}\n\n/** Gemini enum values must be strings. Coerces and reports when they were not. */\nfunction coerceEnum(node: JSONSchema, path: string, warnings: Warnings): void {\n if (!Array.isArray(node.enum)) return;\n const allStrings = node.enum.every((v) => typeof v === 'string');\n if (!allStrings) {\n node.enum = node.enum.map((v) => String(v));\n warnings.add(`${path}/enum`, 'enum-coerced', 'Gemini enum values must be strings; coerced non string values.');\n }\n if (!node.type) node.type = 'string';\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * MCP (Model Context Protocol) tools. The most permissive target: `inputSchema`\n * is standard JSON Schema and the spec only requires the root to be an object.\n * All keywords are preserved.\n */\nexport function toMcp(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'MCP');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type {\n JSONSchema,\n LintResult,\n Target,\n ToolDefinition,\n ToolResult,\n ToolSchemaOptions,\n TransformResult,\n Warning,\n} from './types.js';\nimport { toOpenAI, toOpenAIStrict } from './targets/openai.js';\nimport { toAnthropic } from './targets/anthropic.js';\nimport { toGemini, toGeminiJsonSchema } from './targets/gemini.js';\nimport { toMcp } from './targets/mcp.js';\n\nconst EMPTY_OBJECT_SCHEMA: JSONSchema = { type: 'object', properties: {} };\n\n/**\n * Convert any JSON Schema into a schema that is valid for a provider's tool /\n * function calling parameters.\n *\n * @example\n * const { schema, warnings } = toToolSchema(mySchema, { target: 'openai-strict' });\n */\nexport function toToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): TransformResult {\n const target = options.target ?? 'openai';\n switch (target) {\n case 'openai':\n return toOpenAI(schema);\n case 'openai-strict':\n return toOpenAIStrict(schema);\n case 'anthropic':\n return toAnthropic(schema);\n case 'gemini':\n return toGemini(schema, { uppercaseTypes: options.geminiUppercaseTypes });\n case 'gemini-jsonschema':\n return toGeminiJsonSchema(schema);\n case 'mcp':\n return toMcp(schema);\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\n/**\n * Build a complete, provider shaped tool / function declaration: the right\n * wrapper keys (`function`, `input_schema`, `parameters`, `inputSchema`), the\n * converted parameter schema, and provider specific extras such as `strict` or\n * MCP `annotations`.\n */\nexport function toTool(def: ToolDefinition, options: ToolSchemaOptions = {}): ToolResult {\n const target = options.target ?? 'openai';\n const result = toToolSchema(def.schema ?? EMPTY_OBJECT_SCHEMA, options);\n const warnings: Warning[] = [...result.warnings];\n validateName(def.name, target, warnings);\n\n const tool = buildTool(def, result.schema, target, options);\n return { tool, warnings, lossy: result.lossy };\n}\n\n/**\n * Report what would change to make `schema` valid for a target, without\n * applying it. `ok` is true when the schema is already conformant.\n */\nexport function lintToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): LintResult {\n const { warnings } = toToolSchema(schema, options);\n return { ok: warnings.length === 0, issues: warnings };\n}\n\nfunction buildTool(\n def: ToolDefinition,\n schema: JSONSchema,\n target: Target,\n options: ToolSchemaOptions,\n): Record<string, unknown> {\n const { name, description } = def;\n\n switch (target) {\n case 'openai':\n case 'openai-strict': {\n const strict = target === 'openai-strict';\n if (options.openaiResponses) {\n return {\n type: 'function',\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n };\n }\n return {\n type: 'function',\n function: {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n },\n };\n }\n case 'anthropic':\n return {\n name,\n ...(description ? { description } : {}),\n input_schema: schema,\n ...(options.anthropicStrict ? { strict: true } : {}),\n };\n case 'gemini':\n return {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n };\n case 'gemini-jsonschema':\n return {\n name,\n ...(description ? { description } : {}),\n parametersJsonSchema: schema,\n };\n case 'mcp':\n return {\n name,\n ...(description ? { description } : {}),\n inputSchema: schema,\n ...(def.annotations ? { annotations: def.annotations } : {}),\n };\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\nconst NAME_RULES: Record<Target, { pattern: RegExp; label: string }> = {\n openai: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n 'openai-strict': { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n anthropic: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'Anthropic (letters, digits, _ and -, max 64)' },\n gemini: { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n 'gemini-jsonschema': { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n mcp: { pattern: /^[a-zA-Z0-9_-]{1,128}$/, label: 'MCP (letters, digits, _ and -)' },\n};\n\nfunction validateName(name: string, target: Target, warnings: Warning[]): void {\n const rule = NAME_RULES[target];\n if (!rule.pattern.test(name)) {\n warnings.push({\n path: '#/name',\n code: 'invalid-name',\n message: `Tool name '${name}' does not match the ${rule.label} naming rule.`,\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/util.ts","../src/targets/openai.ts","../src/targets/anthropic.ts","../src/targets/gemini.ts","../src/targets/mcp.ts","../src/transform.ts"],"sourcesContent":["import type { JSONSchema, Warning, WarningCode } from './types.js';\n\n/** Collects warnings and tracks whether the conversion lost information. */\nexport class Warnings {\n readonly list: Warning[] = [];\n lossy = false;\n\n add(path: string, code: WarningCode, message: string, lossy = true): void {\n this.list.push({ path, code, message });\n if (lossy) this.lossy = true;\n }\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** A deep, structurally faithful clone. Uses the platform `structuredClone`. */\nexport function clone<T>(value: T): T {\n return structuredClone(value);\n}\n\n/** Returns the schema's declared types as an array (empty when untyped). */\nexport function typesOf(schema: JSONSchema): string[] {\n if (typeof schema.type === 'string') return [schema.type];\n if (Array.isArray(schema.type)) return schema.type.filter((t) => typeof t === 'string');\n return [];\n}\n\n/**\n * Heuristic: does this node describe an object? True when `type` is `object`\n * (or a union containing it) or when it is untyped but carries object keywords.\n */\nexport function isObjectSchema(schema: JSONSchema): boolean {\n const types = typesOf(schema);\n if (types.includes('object')) return true;\n if (types.length > 0) return false;\n return isPlainObject(schema.properties) || schema.additionalProperties !== undefined;\n}\n\n/**\n * Makes a schema accept `null`. Adds `null` to a string/array `type`, appends a\n * `{ type: 'null' }` branch to an `anyOf`, otherwise wraps the node in an\n * `anyOf` with a null branch. Used by OpenAI strict mode where every property\n * must be `required`, so optional fields are expressed as nullable instead.\n */\nexport function makeNullable(schema: JSONSchema): JSONSchema {\n if (typeof schema.type === 'string') {\n if (schema.type === 'null') return schema;\n return { ...schema, type: [schema.type, 'null'] };\n }\n if (Array.isArray(schema.type)) {\n if (schema.type.includes('null')) return schema;\n return { ...schema, type: [...schema.type, 'null'] };\n }\n if (Array.isArray(schema.anyOf)) {\n if (schema.anyOf.some((b) => typesOf(b).includes('null'))) return schema;\n return { ...schema, anyOf: [...schema.anyOf, { type: 'null' }] };\n }\n return { anyOf: [schema, { type: 'null' }] };\n}\n\n/**\n * Resolves local `$ref` pointers (`#/$defs/...` or `#/definitions/...`) by\n * inlining them. Non local refs are left untouched. Recursive refs are replaced\n * with an empty schema and reported, since target dialects that need inlining\n * (Gemini route A) cannot express recursion.\n */\nexport function dereference(root: JSONSchema, warnings: Warnings): JSONSchema {\n const defs: Record<string, JSONSchema> = {\n ...(isPlainObject(root.definitions) ? (root.definitions as Record<string, JSONSchema>) : {}),\n ...(isPlainObject(root.$defs) ? (root.$defs as Record<string, JSONSchema>) : {}),\n };\n\n const resolve = (ref: string): JSONSchema | undefined => {\n const m = /^#\\/(?:\\$defs|definitions)\\/(.+)$/.exec(ref);\n if (!m) return undefined;\n const key = decodeURIComponent(m[1].replace(/~1/g, '/').replace(/~0/g, '~'));\n return defs[key];\n };\n\n const walk = (node: JSONSchema, path: string, seen: Set<string>): JSONSchema => {\n if (!isPlainObject(node)) return node;\n if (typeof node.$ref === 'string') {\n const ref = node.$ref;\n const target = resolve(ref);\n if (!target) return node; // leave external / unknown refs in place\n if (seen.has(ref)) {\n warnings.add(path, 'recursive-ref', `Recursive $ref '${ref}' cannot be inlined; replaced with an open schema.`);\n return {};\n }\n const { $ref: _drop, ...rest } = node;\n void _drop;\n warnings.add(path, 'inlined-ref', `Inlined $ref '${ref}'.`, false);\n const merged = { ...clone(target), ...rest };\n return walk(merged, path, new Set([...seen, ref]));\n }\n return mapChildren(node, path, (child, childPath) => walk(child, childPath, seen));\n };\n\n const out = walk(clone(root), '#', new Set());\n delete out.$defs;\n delete out.definitions;\n return out;\n}\n\n/**\n * Applies `fn` to every direct sub schema of `node`, returning a new node. Walks\n * the standard applicator keywords. Leaf keywords are copied as is.\n */\nexport function mapChildren(\n node: JSONSchema,\n path: string,\n fn: (child: JSONSchema, childPath: string) => JSONSchema,\n): JSONSchema {\n const out: JSONSchema = { ...node };\n\n if (isPlainObject(out.properties)) {\n const props: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.properties as Record<string, JSONSchema>)) {\n props[k] = fn(v, `${path}/properties/${k}`);\n }\n out.properties = props;\n }\n\n if (Array.isArray(out.items)) {\n out.items = out.items.map((it, i) => fn(it, `${path}/items/${i}`));\n } else if (isPlainObject(out.items)) {\n out.items = fn(out.items as JSONSchema, `${path}/items`);\n }\n\n if (isPlainObject(out.additionalProperties)) {\n out.additionalProperties = fn(out.additionalProperties as JSONSchema, `${path}/additionalProperties`);\n }\n\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = out[key];\n if (Array.isArray(arr)) {\n out[key] = arr.map((b, i) => fn(b, `${path}/${key}/${i}`));\n }\n }\n\n if (isPlainObject(out.not)) out.not = fn(out.not as JSONSchema, `${path}/not`);\n for (const key of ['if', 'then', 'else'] as const) {\n if (isPlainObject(out[key])) out[key] = fn(out[key] as JSONSchema, `${path}/${key}`);\n }\n\n if (isPlainObject(out.patternProperties)) {\n const pp: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.patternProperties as Record<string, JSONSchema>)) {\n pp[k] = fn(v, `${path}/patternProperties/${k}`);\n }\n out.patternProperties = pp;\n }\n\n for (const key of ['$defs', 'definitions', 'dependentSchemas'] as const) {\n const map = out[key];\n if (isPlainObject(map)) {\n const next: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(map as Record<string, JSONSchema>)) {\n next[k] = fn(v as JSONSchema, `${path}/${key}/${k}`);\n }\n out[key] = next;\n }\n }\n\n return out;\n}\n\n/** Ensures the root is an object schema, reporting when it was not. */\nexport function ensureObjectRoot(schema: JSONSchema, warnings: Warnings, target: string): JSONSchema {\n if (isObjectSchema(schema)) {\n if (typesOf(schema).length === 0) return { type: 'object', ...schema };\n return schema;\n }\n warnings.add(\n '#',\n 'root-not-object',\n `${target} requires the root schema to be an object; wrapped the schema under a 'value' property.`,\n );\n return {\n type: 'object',\n properties: { value: schema },\n required: ['value'],\n };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport {\n Warnings,\n clone,\n isObjectSchema,\n isPlainObject,\n makeNullable,\n mapChildren,\n ensureObjectRoot,\n} from '../util.js';\n\n/** Formats OpenAI Structured Outputs accepts. Others are dropped in strict mode. */\nconst FORMAT_WHITELIST = new Set([\n 'date-time',\n 'time',\n 'date',\n 'duration',\n 'email',\n 'hostname',\n 'ipv4',\n 'ipv6',\n 'uuid',\n]);\n\n/** Keywords OpenAI strict mode rejects outright. */\nconst UNSUPPORTED = [\n 'not',\n 'if',\n 'then',\n 'else',\n 'dependentRequired',\n 'dependentSchemas',\n 'patternProperties',\n 'unevaluatedProperties',\n] as const;\n\nconst MAX_PROPERTIES = 5000;\nconst MAX_DEPTH = 10;\nconst MAX_ENUM_VALUES = 1000;\n\n/** OpenAI non strict: tool parameters should be an object, otherwise pass through. */\nexport function toOpenAI(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'OpenAI');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/**\n * OpenAI Structured Outputs / `strict: true`. Enforces: every object has\n * `additionalProperties: false`; every property is `required` (optional ones\n * become nullable); unsupported keywords are stripped; `allOf` is merged; only\n * whitelisted `format` values survive. `$defs` / `$ref` and `anyOf` are kept.\n */\nexport function toOpenAIStrict(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n if (Array.isArray(s.allOf)) {\n s = mergeAllOf(s, path, warnings);\n }\n\n for (const kw of UNSUPPORTED) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported in OpenAI strict mode; removed.`);\n }\n }\n\n if (typeof s.format === 'string' && !FORMAT_WHITELIST.has(s.format)) {\n warnings.add(\n `${path}/format`,\n 'unsupported-format',\n `format '${s.format}' is not in OpenAI's whitelist; removed.`,\n );\n delete s.format;\n }\n\n // Recurse into all sub schemas first (anyOf branches, items, $defs, ...).\n s = mapChildren(s, path, transform);\n\n if (isObjectSchema(s) && isPlainObject(s.properties)) {\n const props = s.properties as Record<string, JSONSchema>;\n const originalRequired = new Set(Array.isArray(s.required) ? s.required : []);\n const nextProps: Record<string, JSONSchema> = {};\n for (const key of Object.keys(props)) {\n let child = props[key];\n if (!originalRequired.has(key)) {\n child = makeNullable(child);\n warnings.add(\n `${path}/properties/${key}`,\n 'forced-required',\n `Optional property '${key}' was made required and nullable for OpenAI strict mode.`,\n );\n }\n nextProps[key] = child;\n }\n s.properties = nextProps;\n s.required = Object.keys(nextProps);\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' as required by strict mode.\",\n false,\n );\n }\n s.additionalProperties = false;\n } else if (isObjectSchema(s)) {\n // Object without declared properties: strict mode still forbids extra keys.\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' on a property-less object.\",\n false,\n );\n }\n s.additionalProperties = false;\n }\n\n return s;\n };\n\n const schema = ensureObjectRoot(transform(clone(input), '#'), warnings, 'OpenAI strict mode');\n checkLimits(schema, warnings);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Shallow merges `allOf` object subschemas into the parent, then drops `allOf`. */\nfunction mergeAllOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n const parts = node.allOf as JSONSchema[];\n const { allOf: _drop, ...base } = node;\n void _drop;\n const merged: JSONSchema = { ...base };\n const props: Record<string, JSONSchema> = isPlainObject(merged.properties)\n ? { ...(merged.properties as Record<string, JSONSchema>) }\n : {};\n const required = new Set<string>(Array.isArray(merged.required) ? merged.required : []);\n\n for (const part of parts) {\n if (!isPlainObject(part)) continue;\n if (isPlainObject(part.properties)) {\n Object.assign(props, part.properties);\n }\n if (Array.isArray(part.required)) {\n for (const r of part.required) required.add(r);\n }\n if (part.type && !merged.type) merged.type = part.type;\n }\n\n if (Object.keys(props).length > 0) merged.properties = props;\n if (required.size > 0) merged.required = [...required];\n if (!merged.type && (merged.properties || isObjectSchema(merged))) merged.type = 'object';\n warnings.add(path, 'merged-allof', \"Merged 'allOf' subschemas into the parent (unsupported in strict mode).\");\n return merged;\n}\n\nfunction checkLimits(schema: JSONSchema, warnings: Warnings): void {\n let propertyCount = 0;\n let maxDepth = 0;\n\n const visit = (node: JSONSchema, depth: number): void => {\n if (!isPlainObject(node)) return;\n maxDepth = Math.max(maxDepth, depth);\n if (isPlainObject(node.properties)) {\n const keys = Object.keys(node.properties as Record<string, JSONSchema>);\n propertyCount += keys.length;\n }\n if (Array.isArray(node.enum) && node.enum.length > MAX_ENUM_VALUES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `An enum has ${node.enum.length} values; OpenAI allows at most ${MAX_ENUM_VALUES}.`,\n false,\n );\n }\n const children = collectChildren(node);\n for (const c of children) visit(c, depth + 1);\n };\n\n visit(schema, 0);\n if (propertyCount > MAX_PROPERTIES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema has ${propertyCount} object properties; OpenAI allows at most ${MAX_PROPERTIES}.`,\n false,\n );\n }\n if (maxDepth > MAX_DEPTH) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema nests ${maxDepth} levels deep; OpenAI allows at most ${MAX_DEPTH}.`,\n false,\n );\n }\n}\n\nfunction collectChildren(node: JSONSchema): JSONSchema[] {\n const out: JSONSchema[] = [];\n if (isPlainObject(node.properties)) out.push(...Object.values(node.properties as Record<string, JSONSchema>));\n if (Array.isArray(node.items)) out.push(...node.items);\n else if (isPlainObject(node.items)) out.push(node.items as JSONSchema);\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = node[key];\n if (Array.isArray(arr)) out.push(...arr);\n }\n if (isPlainObject(node.$defs)) out.push(...Object.values(node.$defs as Record<string, JSONSchema>));\n return out.filter(isPlainObject) as JSONSchema[];\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * Anthropic tool use. The API is permissive: it accepts standard JSON Schema for\n * `input_schema` (anyOf, oneOf, allOf, $ref, format, pattern, ...). The only hard\n * requirement is that the root is an object, so that is all we enforce.\n */\nexport function toAnthropic(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Anthropic');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, dereference, ensureObjectRoot, isPlainObject, mapChildren, typesOf } from '../util.js';\n\n/**\n * Keywords absent from Gemini's `Schema` proto (route A). Sending them either\n * errors or is silently ignored, so they are stripped.\n */\nconst STRIP = [\n '$schema',\n '$id',\n '$anchor',\n '$ref',\n 'oneOf',\n 'allOf',\n 'not',\n 'if',\n 'then',\n 'else',\n 'additionalProperties',\n 'patternProperties',\n 'unevaluatedProperties',\n 'const',\n 'dependentRequired',\n 'dependentSchemas',\n 'multipleOf',\n 'exclusiveMinimum',\n 'exclusiveMaximum',\n 'uniqueItems',\n 'contentEncoding',\n 'contentMediaType',\n '$defs',\n 'definitions',\n] as const;\n\nconst TYPE_UPPER: Record<string, string> = {\n string: 'STRING',\n number: 'NUMBER',\n integer: 'INTEGER',\n boolean: 'BOOLEAN',\n array: 'ARRAY',\n object: 'OBJECT',\n null: 'NULL',\n};\n\ninterface GeminiOptions {\n uppercaseTypes?: boolean;\n}\n\n/**\n * Gemini function calling, route A (`parameters` as an OpenAPI 3.0 subset).\n * Inlines `$ref`, strips unsupported keywords, converts nullable unions to\n * `nullable: true`, collapses `anyOf` null branches, and coerces enum values to\n * strings. Use the `gemini-jsonschema` target for the richer\n * `parametersJsonSchema` route.\n */\nexport function toGemini(input: JSONSchema, options: GeminiOptions = {}): TransformResult {\n const warnings = new Warnings();\n const dereferenced = dereference(clone(input), warnings);\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n for (const kw of STRIP) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported by Gemini (route A); removed.`);\n }\n }\n\n s = collapseNullableUnion(s, path, warnings);\n s = mapChildren(s, path, transform);\n s = collapseAnyOf(s, path, warnings);\n coerceEnum(s, path, warnings);\n return s;\n };\n\n let schema = ensureObjectRoot(transform(dereferenced, '#'), warnings, 'Gemini');\n if (options.uppercaseTypes) schema = uppercaseTypes(schema);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Final pass: rewrite JSON Schema type names to Gemini's upper case enum. */\nfunction uppercaseTypes(node: JSONSchema): JSONSchema {\n if (!isPlainObject(node)) return node;\n const out: JSONSchema = { ...node };\n if (typeof out.type === 'string') {\n out.type = TYPE_UPPER[out.type] ?? out.type;\n } else if (Array.isArray(out.type)) {\n out.type = out.type.map((t) => TYPE_UPPER[t] ?? t);\n }\n return mapChildren(out, '#', (child) => uppercaseTypes(child));\n}\n\n/** Gemini route B (`parametersJsonSchema`): richer JSON Schema, object root only. */\nexport function toGeminiJsonSchema(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Gemini (parametersJsonSchema)');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Converts `type: ['string', 'null']` into `type: 'string', nullable: true`. */\nfunction collapseNullableUnion(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.type)) return node;\n const nonNull = node.type.filter((t) => t !== 'null');\n const hadNull = node.type.includes('null');\n const out: JSONSchema = { ...node };\n if (nonNull.length === 0) {\n out.type = 'string';\n } else {\n out.type = nonNull[0];\n if (nonNull.length > 1) {\n warnings.add(\n path,\n 'union-types',\n `Gemini cannot express a union of types [${nonNull.join(', ')}]; kept '${nonNull[0]}'.`,\n );\n }\n }\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted nullable type union into 'nullable: true'.\", false);\n }\n return out;\n}\n\n/** Removes `{ type: 'null' }` branches from `anyOf`, mapping them to `nullable`. */\nfunction collapseAnyOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.anyOf)) return node;\n const branches = node.anyOf as JSONSchema[];\n const nonNull = branches.filter((b) => !(typesOf(b).length === 1 && typesOf(b)[0] === 'null'));\n const hadNull = nonNull.length !== branches.length;\n const out: JSONSchema = { ...node };\n\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted an anyOf null branch into 'nullable: true'.\", false);\n }\n\n if (nonNull.length === 0) {\n delete out.anyOf;\n if (!out.type) out.type = 'string';\n } else if (nonNull.length === 1) {\n // Flatten a single remaining branch into the parent.\n delete out.anyOf;\n const branch = nonNull[0];\n for (const [k, v] of Object.entries(branch)) {\n if (k === 'description' && out.description) continue;\n out[k] = v;\n }\n } else {\n out.anyOf = nonNull;\n }\n return out;\n}\n\n/** Gemini enum values must be strings. Coerces and reports when they were not. */\nfunction coerceEnum(node: JSONSchema, path: string, warnings: Warnings): void {\n if (!Array.isArray(node.enum)) return;\n const allStrings = node.enum.every((v) => typeof v === 'string');\n if (!allStrings) {\n node.enum = node.enum.map((v) => String(v));\n warnings.add(`${path}/enum`, 'enum-coerced', 'Gemini enum values must be strings; coerced non string values.');\n }\n if (!node.type) node.type = 'string';\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * MCP (Model Context Protocol) tools. The most permissive input target:\n * `inputSchema` is standard JSON Schema and the spec only requires the root to\n * be an object. All input keywords are preserved. MCP `outputSchema` is handled\n * at the tool envelope layer because it describes `structuredContent` and does\n * not share the input object-root constraint.\n */\nexport function toMcp(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'MCP');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type {\n JSONSchema,\n LintResult,\n Target,\n ToolDefinition,\n ToolResult,\n ToolSchemaOptions,\n TransformResult,\n Warning,\n} from './types.js';\nimport { toOpenAI, toOpenAIStrict } from './targets/openai.js';\nimport { toAnthropic } from './targets/anthropic.js';\nimport { toGemini, toGeminiJsonSchema } from './targets/gemini.js';\nimport { toMcp } from './targets/mcp.js';\nimport { clone } from './util.js';\n\nconst EMPTY_OBJECT_SCHEMA: JSONSchema = { type: 'object', properties: {} };\n\n/**\n * Convert any JSON Schema into a schema that is valid for a provider's tool /\n * function calling parameters.\n *\n * @example\n * const { schema, warnings } = toToolSchema(mySchema, { target: 'openai-strict' });\n */\nexport function toToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): TransformResult {\n const target = options.target ?? 'openai';\n switch (target) {\n case 'openai':\n return toOpenAI(schema);\n case 'openai-strict':\n return toOpenAIStrict(schema);\n case 'anthropic':\n return toAnthropic(schema);\n case 'gemini':\n return toGemini(schema, { uppercaseTypes: options.geminiUppercaseTypes });\n case 'gemini-jsonschema':\n return toGeminiJsonSchema(schema);\n case 'mcp':\n return toMcp(schema);\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\n/**\n * Build a complete, provider shaped tool / function declaration: the right\n * wrapper keys (`function`, `input_schema`, `parameters`, `inputSchema`), the\n * converted parameter schema, and provider specific extras such as `strict` or\n * MCP `annotations`.\n */\nexport function toTool(def: ToolDefinition, options: ToolSchemaOptions = {}): ToolResult {\n const target = options.target ?? 'openai';\n const result = toToolSchema(def.schema ?? EMPTY_OBJECT_SCHEMA, options);\n const warnings: Warning[] = [...result.warnings];\n validateName(def.name, target, warnings);\n\n const tool = buildTool(def, result.schema, target, options);\n return { tool, warnings, lossy: result.lossy };\n}\n\n/**\n * Report what would change to make `schema` valid for a target, without\n * applying it. `ok` is true when the schema is already conformant.\n */\nexport function lintToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): LintResult {\n const { warnings } = toToolSchema(schema, options);\n return { ok: warnings.length === 0, issues: warnings };\n}\n\nfunction buildTool(\n def: ToolDefinition,\n schema: JSONSchema,\n target: Target,\n options: ToolSchemaOptions,\n): Record<string, unknown> {\n const { name, description } = def;\n\n switch (target) {\n case 'openai':\n case 'openai-strict': {\n const strict = target === 'openai-strict';\n if (options.openaiResponses) {\n return {\n type: 'function',\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n };\n }\n return {\n type: 'function',\n function: {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n },\n };\n }\n case 'anthropic':\n return {\n name,\n ...(description ? { description } : {}),\n input_schema: schema,\n ...(options.anthropicStrict ? { strict: true } : {}),\n };\n case 'gemini':\n return {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n };\n case 'gemini-jsonschema':\n return {\n name,\n ...(description ? { description } : {}),\n parametersJsonSchema: schema,\n };\n case 'mcp':\n return {\n name,\n ...(description ? { description } : {}),\n inputSchema: schema,\n ...(def.outputSchema ? { outputSchema: clone(def.outputSchema) } : {}),\n ...(def.annotations ? { annotations: def.annotations } : {}),\n };\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\nconst NAME_RULES: Record<Target, { pattern: RegExp; label: string }> = {\n openai: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n 'openai-strict': { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n anthropic: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'Anthropic (letters, digits, _ and -, max 64)' },\n gemini: { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n 'gemini-jsonschema': { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n mcp: { pattern: /^[a-zA-Z0-9_-]{1,128}$/, label: 'MCP (letters, digits, _ and -)' },\n};\n\nfunction validateName(name: string, target: Target, warnings: Warning[]): void {\n const rule = NAME_RULES[target];\n if (!rule.pattern.test(name)) {\n warnings.push({\n path: '#/name',\n code: 'invalid-name',\n message: `Tool name '${name}' does not match the ${rule.label} naming rule.`,\n });\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/cli.cjs
CHANGED
|
@@ -537,6 +537,7 @@ function buildTool(def, schema, target, options) {
|
|
|
537
537
|
name,
|
|
538
538
|
...description ? { description } : {},
|
|
539
539
|
inputSchema: schema,
|
|
540
|
+
...def.outputSchema ? { outputSchema: clone(def.outputSchema) } : {},
|
|
540
541
|
...def.annotations ? { annotations: def.annotations } : {}
|
|
541
542
|
};
|
|
542
543
|
default:
|
package/dist/cli.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/util.ts","../src/targets/openai.ts","../src/targets/anthropic.ts","../src/targets/gemini.ts","../src/targets/mcp.ts","../src/transform.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from 'node:fs';\nimport { toToolSchema, toTool } from './transform.js';\nimport type { JSONSchema, Target, ToolSchemaOptions } from './types.js';\n\nconst TARGETS: Target[] = ['openai', 'openai-strict', 'anthropic', 'gemini', 'gemini-jsonschema', 'mcp'];\n\nconst HELP = `tool-schema - convert a JSON Schema into a provider valid tool schema\n\nUsage:\n tool-schema [file.json] --target <target> [options]\n cat schema.json | tool-schema --target gemini\n\nTargets:\n ${TARGETS.join(', ')}\n\nOptions:\n -t, --target <name> Provider target (default: openai)\n --tool <name> Wrap the result as a full tool definition with this name\n --description <text> Tool description (with --tool)\n --responses OpenAI: emit the Responses API tool shape\n --uppercase-types Gemini: emit upper case OpenAPI type names\n --quiet Do not print warnings to stderr\n -h, --help Show this help\n\nReads from the given file or from stdin. Prints the converted schema (or tool)\nas JSON to stdout. Warnings go to stderr and never pollute stdout.`;\n\ninterface Args {\n file?: string;\n target: Target;\n tool?: string;\n description?: string;\n responses: boolean;\n uppercase: boolean;\n quiet: boolean;\n help: boolean;\n}\n\nfunction parseArgs(argv: string[]): Args {\n const args: Args = {\n target: 'openai',\n responses: false,\n uppercase: false,\n quiet: false,\n help: false,\n };\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n switch (a) {\n case '-h':\n case '--help':\n args.help = true;\n break;\n case '-t':\n case '--target':\n args.target = argv[++i] as Target;\n break;\n case '--tool':\n args.tool = argv[++i];\n break;\n case '--description':\n args.description = argv[++i];\n break;\n case '--responses':\n args.responses = true;\n break;\n case '--uppercase-types':\n args.uppercase = true;\n break;\n case '--quiet':\n args.quiet = true;\n break;\n default:\n if (a.startsWith('-')) {\n throw new Error(`Unknown option: ${a}`);\n }\n args.file = a;\n }\n }\n return args;\n}\n\nfunction readInput(file?: string): string {\n if (file) return readFileSync(file, 'utf8');\n return readFileSync(0, 'utf8');\n}\n\nfunction main(): void {\n let args: Args;\n try {\n args = parseArgs(process.argv.slice(2));\n } catch (err) {\n process.stderr.write(`${(err as Error).message}\\n`);\n process.exit(2);\n }\n\n if (args.help) {\n process.stdout.write(`${HELP}\\n`);\n return;\n }\n\n if (!TARGETS.includes(args.target)) {\n process.stderr.write(`Invalid target '${args.target}'. Valid: ${TARGETS.join(', ')}\\n`);\n process.exit(2);\n }\n\n let schema: JSONSchema;\n try {\n schema = JSON.parse(readInput(args.file)) as JSONSchema;\n } catch (err) {\n process.stderr.write(`Could not read or parse input: ${(err as Error).message}\\n`);\n process.exit(1);\n return;\n }\n\n const options: ToolSchemaOptions = {\n target: args.target,\n openaiResponses: args.responses,\n geminiUppercaseTypes: args.uppercase,\n };\n\n const { output, warnings, lossy } = args.tool\n ? (() => {\n const r = toTool({ name: args.tool!, description: args.description, schema }, options);\n return { output: r.tool, warnings: r.warnings, lossy: r.lossy };\n })()\n : (() => {\n const r = toToolSchema(schema, options);\n return { output: r.schema, warnings: r.warnings, lossy: r.lossy };\n })();\n\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`);\n\n if (!args.quiet && warnings.length > 0) {\n process.stderr.write(`\\n${warnings.length} warning(s) for target '${args.target}'${lossy ? ' (lossy)' : ''}:\\n`);\n for (const w of warnings) {\n process.stderr.write(` ${w.path} [${w.code}] ${w.message}\\n`);\n }\n }\n}\n\nmain();\n","import type { JSONSchema, Warning, WarningCode } from './types.js';\n\n/** Collects warnings and tracks whether the conversion lost information. */\nexport class Warnings {\n readonly list: Warning[] = [];\n lossy = false;\n\n add(path: string, code: WarningCode, message: string, lossy = true): void {\n this.list.push({ path, code, message });\n if (lossy) this.lossy = true;\n }\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** A deep, structurally faithful clone. Uses the platform `structuredClone`. */\nexport function clone<T>(value: T): T {\n return structuredClone(value);\n}\n\n/** Returns the schema's declared types as an array (empty when untyped). */\nexport function typesOf(schema: JSONSchema): string[] {\n if (typeof schema.type === 'string') return [schema.type];\n if (Array.isArray(schema.type)) return schema.type.filter((t) => typeof t === 'string');\n return [];\n}\n\n/**\n * Heuristic: does this node describe an object? True when `type` is `object`\n * (or a union containing it) or when it is untyped but carries object keywords.\n */\nexport function isObjectSchema(schema: JSONSchema): boolean {\n const types = typesOf(schema);\n if (types.includes('object')) return true;\n if (types.length > 0) return false;\n return isPlainObject(schema.properties) || schema.additionalProperties !== undefined;\n}\n\n/**\n * Makes a schema accept `null`. Adds `null` to a string/array `type`, appends a\n * `{ type: 'null' }` branch to an `anyOf`, otherwise wraps the node in an\n * `anyOf` with a null branch. Used by OpenAI strict mode where every property\n * must be `required`, so optional fields are expressed as nullable instead.\n */\nexport function makeNullable(schema: JSONSchema): JSONSchema {\n if (typeof schema.type === 'string') {\n if (schema.type === 'null') return schema;\n return { ...schema, type: [schema.type, 'null'] };\n }\n if (Array.isArray(schema.type)) {\n if (schema.type.includes('null')) return schema;\n return { ...schema, type: [...schema.type, 'null'] };\n }\n if (Array.isArray(schema.anyOf)) {\n if (schema.anyOf.some((b) => typesOf(b).includes('null'))) return schema;\n return { ...schema, anyOf: [...schema.anyOf, { type: 'null' }] };\n }\n return { anyOf: [schema, { type: 'null' }] };\n}\n\n/**\n * Resolves local `$ref` pointers (`#/$defs/...` or `#/definitions/...`) by\n * inlining them. Non local refs are left untouched. Recursive refs are replaced\n * with an empty schema and reported, since target dialects that need inlining\n * (Gemini route A) cannot express recursion.\n */\nexport function dereference(root: JSONSchema, warnings: Warnings): JSONSchema {\n const defs: Record<string, JSONSchema> = {\n ...(isPlainObject(root.definitions) ? (root.definitions as Record<string, JSONSchema>) : {}),\n ...(isPlainObject(root.$defs) ? (root.$defs as Record<string, JSONSchema>) : {}),\n };\n\n const resolve = (ref: string): JSONSchema | undefined => {\n const m = /^#\\/(?:\\$defs|definitions)\\/(.+)$/.exec(ref);\n if (!m) return undefined;\n const key = decodeURIComponent(m[1].replace(/~1/g, '/').replace(/~0/g, '~'));\n return defs[key];\n };\n\n const walk = (node: JSONSchema, path: string, seen: Set<string>): JSONSchema => {\n if (!isPlainObject(node)) return node;\n if (typeof node.$ref === 'string') {\n const ref = node.$ref;\n const target = resolve(ref);\n if (!target) return node; // leave external / unknown refs in place\n if (seen.has(ref)) {\n warnings.add(path, 'recursive-ref', `Recursive $ref '${ref}' cannot be inlined; replaced with an open schema.`);\n return {};\n }\n const { $ref: _drop, ...rest } = node;\n void _drop;\n warnings.add(path, 'inlined-ref', `Inlined $ref '${ref}'.`, false);\n const merged = { ...clone(target), ...rest };\n return walk(merged, path, new Set([...seen, ref]));\n }\n return mapChildren(node, path, (child, childPath) => walk(child, childPath, seen));\n };\n\n const out = walk(clone(root), '#', new Set());\n delete out.$defs;\n delete out.definitions;\n return out;\n}\n\n/**\n * Applies `fn` to every direct sub schema of `node`, returning a new node. Walks\n * the standard applicator keywords. Leaf keywords are copied as is.\n */\nexport function mapChildren(\n node: JSONSchema,\n path: string,\n fn: (child: JSONSchema, childPath: string) => JSONSchema,\n): JSONSchema {\n const out: JSONSchema = { ...node };\n\n if (isPlainObject(out.properties)) {\n const props: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.properties as Record<string, JSONSchema>)) {\n props[k] = fn(v, `${path}/properties/${k}`);\n }\n out.properties = props;\n }\n\n if (Array.isArray(out.items)) {\n out.items = out.items.map((it, i) => fn(it, `${path}/items/${i}`));\n } else if (isPlainObject(out.items)) {\n out.items = fn(out.items as JSONSchema, `${path}/items`);\n }\n\n if (isPlainObject(out.additionalProperties)) {\n out.additionalProperties = fn(out.additionalProperties as JSONSchema, `${path}/additionalProperties`);\n }\n\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = out[key];\n if (Array.isArray(arr)) {\n out[key] = arr.map((b, i) => fn(b, `${path}/${key}/${i}`));\n }\n }\n\n if (isPlainObject(out.not)) out.not = fn(out.not as JSONSchema, `${path}/not`);\n for (const key of ['if', 'then', 'else'] as const) {\n if (isPlainObject(out[key])) out[key] = fn(out[key] as JSONSchema, `${path}/${key}`);\n }\n\n if (isPlainObject(out.patternProperties)) {\n const pp: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.patternProperties as Record<string, JSONSchema>)) {\n pp[k] = fn(v, `${path}/patternProperties/${k}`);\n }\n out.patternProperties = pp;\n }\n\n for (const key of ['$defs', 'definitions', 'dependentSchemas'] as const) {\n const map = out[key];\n if (isPlainObject(map)) {\n const next: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(map as Record<string, JSONSchema>)) {\n next[k] = fn(v as JSONSchema, `${path}/${key}/${k}`);\n }\n out[key] = next;\n }\n }\n\n return out;\n}\n\n/** Ensures the root is an object schema, reporting when it was not. */\nexport function ensureObjectRoot(schema: JSONSchema, warnings: Warnings, target: string): JSONSchema {\n if (isObjectSchema(schema)) {\n if (typesOf(schema).length === 0) return { type: 'object', ...schema };\n return schema;\n }\n warnings.add(\n '#',\n 'root-not-object',\n `${target} requires the root schema to be an object; wrapped the schema under a 'value' property.`,\n );\n return {\n type: 'object',\n properties: { value: schema },\n required: ['value'],\n };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport {\n Warnings,\n clone,\n isObjectSchema,\n isPlainObject,\n makeNullable,\n mapChildren,\n ensureObjectRoot,\n} from '../util.js';\n\n/** Formats OpenAI Structured Outputs accepts. Others are dropped in strict mode. */\nconst FORMAT_WHITELIST = new Set([\n 'date-time',\n 'time',\n 'date',\n 'duration',\n 'email',\n 'hostname',\n 'ipv4',\n 'ipv6',\n 'uuid',\n]);\n\n/** Keywords OpenAI strict mode rejects outright. */\nconst UNSUPPORTED = [\n 'not',\n 'if',\n 'then',\n 'else',\n 'dependentRequired',\n 'dependentSchemas',\n 'patternProperties',\n 'unevaluatedProperties',\n] as const;\n\nconst MAX_PROPERTIES = 5000;\nconst MAX_DEPTH = 10;\nconst MAX_ENUM_VALUES = 1000;\n\n/** OpenAI non strict: tool parameters should be an object, otherwise pass through. */\nexport function toOpenAI(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'OpenAI');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/**\n * OpenAI Structured Outputs / `strict: true`. Enforces: every object has\n * `additionalProperties: false`; every property is `required` (optional ones\n * become nullable); unsupported keywords are stripped; `allOf` is merged; only\n * whitelisted `format` values survive. `$defs` / `$ref` and `anyOf` are kept.\n */\nexport function toOpenAIStrict(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n if (Array.isArray(s.allOf)) {\n s = mergeAllOf(s, path, warnings);\n }\n\n for (const kw of UNSUPPORTED) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported in OpenAI strict mode; removed.`);\n }\n }\n\n if (typeof s.format === 'string' && !FORMAT_WHITELIST.has(s.format)) {\n warnings.add(\n `${path}/format`,\n 'unsupported-format',\n `format '${s.format}' is not in OpenAI's whitelist; removed.`,\n );\n delete s.format;\n }\n\n // Recurse into all sub schemas first (anyOf branches, items, $defs, ...).\n s = mapChildren(s, path, transform);\n\n if (isObjectSchema(s) && isPlainObject(s.properties)) {\n const props = s.properties as Record<string, JSONSchema>;\n const originalRequired = new Set(Array.isArray(s.required) ? s.required : []);\n const nextProps: Record<string, JSONSchema> = {};\n for (const key of Object.keys(props)) {\n let child = props[key];\n if (!originalRequired.has(key)) {\n child = makeNullable(child);\n warnings.add(\n `${path}/properties/${key}`,\n 'forced-required',\n `Optional property '${key}' was made required and nullable for OpenAI strict mode.`,\n );\n }\n nextProps[key] = child;\n }\n s.properties = nextProps;\n s.required = Object.keys(nextProps);\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' as required by strict mode.\",\n false,\n );\n }\n s.additionalProperties = false;\n } else if (isObjectSchema(s)) {\n // Object without declared properties: strict mode still forbids extra keys.\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' on a property-less object.\",\n false,\n );\n }\n s.additionalProperties = false;\n }\n\n return s;\n };\n\n const schema = ensureObjectRoot(transform(clone(input), '#'), warnings, 'OpenAI strict mode');\n checkLimits(schema, warnings);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Shallow merges `allOf` object subschemas into the parent, then drops `allOf`. */\nfunction mergeAllOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n const parts = node.allOf as JSONSchema[];\n const { allOf: _drop, ...base } = node;\n void _drop;\n const merged: JSONSchema = { ...base };\n const props: Record<string, JSONSchema> = isPlainObject(merged.properties)\n ? { ...(merged.properties as Record<string, JSONSchema>) }\n : {};\n const required = new Set<string>(Array.isArray(merged.required) ? merged.required : []);\n\n for (const part of parts) {\n if (!isPlainObject(part)) continue;\n if (isPlainObject(part.properties)) {\n Object.assign(props, part.properties);\n }\n if (Array.isArray(part.required)) {\n for (const r of part.required) required.add(r);\n }\n if (part.type && !merged.type) merged.type = part.type;\n }\n\n if (Object.keys(props).length > 0) merged.properties = props;\n if (required.size > 0) merged.required = [...required];\n if (!merged.type && (merged.properties || isObjectSchema(merged))) merged.type = 'object';\n warnings.add(path, 'merged-allof', \"Merged 'allOf' subschemas into the parent (unsupported in strict mode).\");\n return merged;\n}\n\nfunction checkLimits(schema: JSONSchema, warnings: Warnings): void {\n let propertyCount = 0;\n let maxDepth = 0;\n\n const visit = (node: JSONSchema, depth: number): void => {\n if (!isPlainObject(node)) return;\n maxDepth = Math.max(maxDepth, depth);\n if (isPlainObject(node.properties)) {\n const keys = Object.keys(node.properties as Record<string, JSONSchema>);\n propertyCount += keys.length;\n }\n if (Array.isArray(node.enum) && node.enum.length > MAX_ENUM_VALUES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `An enum has ${node.enum.length} values; OpenAI allows at most ${MAX_ENUM_VALUES}.`,\n false,\n );\n }\n const children = collectChildren(node);\n for (const c of children) visit(c, depth + 1);\n };\n\n visit(schema, 0);\n if (propertyCount > MAX_PROPERTIES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema has ${propertyCount} object properties; OpenAI allows at most ${MAX_PROPERTIES}.`,\n false,\n );\n }\n if (maxDepth > MAX_DEPTH) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema nests ${maxDepth} levels deep; OpenAI allows at most ${MAX_DEPTH}.`,\n false,\n );\n }\n}\n\nfunction collectChildren(node: JSONSchema): JSONSchema[] {\n const out: JSONSchema[] = [];\n if (isPlainObject(node.properties)) out.push(...Object.values(node.properties as Record<string, JSONSchema>));\n if (Array.isArray(node.items)) out.push(...node.items);\n else if (isPlainObject(node.items)) out.push(node.items as JSONSchema);\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = node[key];\n if (Array.isArray(arr)) out.push(...arr);\n }\n if (isPlainObject(node.$defs)) out.push(...Object.values(node.$defs as Record<string, JSONSchema>));\n return out.filter(isPlainObject) as JSONSchema[];\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * Anthropic tool use. The API is permissive: it accepts standard JSON Schema for\n * `input_schema` (anyOf, oneOf, allOf, $ref, format, pattern, ...). The only hard\n * requirement is that the root is an object, so that is all we enforce.\n */\nexport function toAnthropic(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Anthropic');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, dereference, ensureObjectRoot, isPlainObject, mapChildren, typesOf } from '../util.js';\n\n/**\n * Keywords absent from Gemini's `Schema` proto (route A). Sending them either\n * errors or is silently ignored, so they are stripped.\n */\nconst STRIP = [\n '$schema',\n '$id',\n '$anchor',\n '$ref',\n 'oneOf',\n 'allOf',\n 'not',\n 'if',\n 'then',\n 'else',\n 'additionalProperties',\n 'patternProperties',\n 'unevaluatedProperties',\n 'const',\n 'dependentRequired',\n 'dependentSchemas',\n 'multipleOf',\n 'exclusiveMinimum',\n 'exclusiveMaximum',\n 'uniqueItems',\n 'contentEncoding',\n 'contentMediaType',\n '$defs',\n 'definitions',\n] as const;\n\nconst TYPE_UPPER: Record<string, string> = {\n string: 'STRING',\n number: 'NUMBER',\n integer: 'INTEGER',\n boolean: 'BOOLEAN',\n array: 'ARRAY',\n object: 'OBJECT',\n null: 'NULL',\n};\n\ninterface GeminiOptions {\n uppercaseTypes?: boolean;\n}\n\n/**\n * Gemini function calling, route A (`parameters` as an OpenAPI 3.0 subset).\n * Inlines `$ref`, strips unsupported keywords, converts nullable unions to\n * `nullable: true`, collapses `anyOf` null branches, and coerces enum values to\n * strings. Use the `gemini-jsonschema` target for the richer\n * `parametersJsonSchema` route.\n */\nexport function toGemini(input: JSONSchema, options: GeminiOptions = {}): TransformResult {\n const warnings = new Warnings();\n const dereferenced = dereference(clone(input), warnings);\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n for (const kw of STRIP) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported by Gemini (route A); removed.`);\n }\n }\n\n s = collapseNullableUnion(s, path, warnings);\n s = mapChildren(s, path, transform);\n s = collapseAnyOf(s, path, warnings);\n coerceEnum(s, path, warnings);\n return s;\n };\n\n let schema = ensureObjectRoot(transform(dereferenced, '#'), warnings, 'Gemini');\n if (options.uppercaseTypes) schema = uppercaseTypes(schema);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Final pass: rewrite JSON Schema type names to Gemini's upper case enum. */\nfunction uppercaseTypes(node: JSONSchema): JSONSchema {\n if (!isPlainObject(node)) return node;\n const out: JSONSchema = { ...node };\n if (typeof out.type === 'string') {\n out.type = TYPE_UPPER[out.type] ?? out.type;\n } else if (Array.isArray(out.type)) {\n out.type = out.type.map((t) => TYPE_UPPER[t] ?? t);\n }\n return mapChildren(out, '#', (child) => uppercaseTypes(child));\n}\n\n/** Gemini route B (`parametersJsonSchema`): richer JSON Schema, object root only. */\nexport function toGeminiJsonSchema(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Gemini (parametersJsonSchema)');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Converts `type: ['string', 'null']` into `type: 'string', nullable: true`. */\nfunction collapseNullableUnion(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.type)) return node;\n const nonNull = node.type.filter((t) => t !== 'null');\n const hadNull = node.type.includes('null');\n const out: JSONSchema = { ...node };\n if (nonNull.length === 0) {\n out.type = 'string';\n } else {\n out.type = nonNull[0];\n if (nonNull.length > 1) {\n warnings.add(\n path,\n 'union-types',\n `Gemini cannot express a union of types [${nonNull.join(', ')}]; kept '${nonNull[0]}'.`,\n );\n }\n }\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted nullable type union into 'nullable: true'.\", false);\n }\n return out;\n}\n\n/** Removes `{ type: 'null' }` branches from `anyOf`, mapping them to `nullable`. */\nfunction collapseAnyOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.anyOf)) return node;\n const branches = node.anyOf as JSONSchema[];\n const nonNull = branches.filter((b) => !(typesOf(b).length === 1 && typesOf(b)[0] === 'null'));\n const hadNull = nonNull.length !== branches.length;\n const out: JSONSchema = { ...node };\n\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted an anyOf null branch into 'nullable: true'.\", false);\n }\n\n if (nonNull.length === 0) {\n delete out.anyOf;\n if (!out.type) out.type = 'string';\n } else if (nonNull.length === 1) {\n // Flatten a single remaining branch into the parent.\n delete out.anyOf;\n const branch = nonNull[0];\n for (const [k, v] of Object.entries(branch)) {\n if (k === 'description' && out.description) continue;\n out[k] = v;\n }\n } else {\n out.anyOf = nonNull;\n }\n return out;\n}\n\n/** Gemini enum values must be strings. Coerces and reports when they were not. */\nfunction coerceEnum(node: JSONSchema, path: string, warnings: Warnings): void {\n if (!Array.isArray(node.enum)) return;\n const allStrings = node.enum.every((v) => typeof v === 'string');\n if (!allStrings) {\n node.enum = node.enum.map((v) => String(v));\n warnings.add(`${path}/enum`, 'enum-coerced', 'Gemini enum values must be strings; coerced non string values.');\n }\n if (!node.type) node.type = 'string';\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * MCP (Model Context Protocol) tools. The most permissive target: `inputSchema`\n * is standard JSON Schema and the spec only requires the root to be an object.\n * All keywords are preserved.\n */\nexport function toMcp(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'MCP');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type {\n JSONSchema,\n LintResult,\n Target,\n ToolDefinition,\n ToolResult,\n ToolSchemaOptions,\n TransformResult,\n Warning,\n} from './types.js';\nimport { toOpenAI, toOpenAIStrict } from './targets/openai.js';\nimport { toAnthropic } from './targets/anthropic.js';\nimport { toGemini, toGeminiJsonSchema } from './targets/gemini.js';\nimport { toMcp } from './targets/mcp.js';\n\nconst EMPTY_OBJECT_SCHEMA: JSONSchema = { type: 'object', properties: {} };\n\n/**\n * Convert any JSON Schema into a schema that is valid for a provider's tool /\n * function calling parameters.\n *\n * @example\n * const { schema, warnings } = toToolSchema(mySchema, { target: 'openai-strict' });\n */\nexport function toToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): TransformResult {\n const target = options.target ?? 'openai';\n switch (target) {\n case 'openai':\n return toOpenAI(schema);\n case 'openai-strict':\n return toOpenAIStrict(schema);\n case 'anthropic':\n return toAnthropic(schema);\n case 'gemini':\n return toGemini(schema, { uppercaseTypes: options.geminiUppercaseTypes });\n case 'gemini-jsonschema':\n return toGeminiJsonSchema(schema);\n case 'mcp':\n return toMcp(schema);\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\n/**\n * Build a complete, provider shaped tool / function declaration: the right\n * wrapper keys (`function`, `input_schema`, `parameters`, `inputSchema`), the\n * converted parameter schema, and provider specific extras such as `strict` or\n * MCP `annotations`.\n */\nexport function toTool(def: ToolDefinition, options: ToolSchemaOptions = {}): ToolResult {\n const target = options.target ?? 'openai';\n const result = toToolSchema(def.schema ?? EMPTY_OBJECT_SCHEMA, options);\n const warnings: Warning[] = [...result.warnings];\n validateName(def.name, target, warnings);\n\n const tool = buildTool(def, result.schema, target, options);\n return { tool, warnings, lossy: result.lossy };\n}\n\n/**\n * Report what would change to make `schema` valid for a target, without\n * applying it. `ok` is true when the schema is already conformant.\n */\nexport function lintToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): LintResult {\n const { warnings } = toToolSchema(schema, options);\n return { ok: warnings.length === 0, issues: warnings };\n}\n\nfunction buildTool(\n def: ToolDefinition,\n schema: JSONSchema,\n target: Target,\n options: ToolSchemaOptions,\n): Record<string, unknown> {\n const { name, description } = def;\n\n switch (target) {\n case 'openai':\n case 'openai-strict': {\n const strict = target === 'openai-strict';\n if (options.openaiResponses) {\n return {\n type: 'function',\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n };\n }\n return {\n type: 'function',\n function: {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n },\n };\n }\n case 'anthropic':\n return {\n name,\n ...(description ? { description } : {}),\n input_schema: schema,\n ...(options.anthropicStrict ? { strict: true } : {}),\n };\n case 'gemini':\n return {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n };\n case 'gemini-jsonschema':\n return {\n name,\n ...(description ? { description } : {}),\n parametersJsonSchema: schema,\n };\n case 'mcp':\n return {\n name,\n ...(description ? { description } : {}),\n inputSchema: schema,\n ...(def.annotations ? { annotations: def.annotations } : {}),\n };\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\nconst NAME_RULES: Record<Target, { pattern: RegExp; label: string }> = {\n openai: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n 'openai-strict': { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n anthropic: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'Anthropic (letters, digits, _ and -, max 64)' },\n gemini: { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n 'gemini-jsonschema': { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n mcp: { pattern: /^[a-zA-Z0-9_-]{1,128}$/, label: 'MCP (letters, digits, _ and -)' },\n};\n\nfunction validateName(name: string, target: Target, warnings: Warning[]): void {\n const rule = NAME_RULES[target];\n if (!rule.pattern.test(name)) {\n warnings.push({\n path: '#/name',\n code: 'invalid-name',\n message: `Tool name '${name}' does not match the ${rule.label} naming rule.`,\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/util.ts","../src/targets/openai.ts","../src/targets/anthropic.ts","../src/targets/gemini.ts","../src/targets/mcp.ts","../src/transform.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from 'node:fs';\nimport { toToolSchema, toTool } from './transform.js';\nimport type { JSONSchema, Target, ToolSchemaOptions } from './types.js';\n\nconst TARGETS: Target[] = ['openai', 'openai-strict', 'anthropic', 'gemini', 'gemini-jsonschema', 'mcp'];\n\nconst HELP = `tool-schema - convert a JSON Schema into a provider valid tool schema\n\nUsage:\n tool-schema [file.json] --target <target> [options]\n cat schema.json | tool-schema --target gemini\n\nTargets:\n ${TARGETS.join(', ')}\n\nOptions:\n -t, --target <name> Provider target (default: openai)\n --tool <name> Wrap the result as a full tool definition with this name\n --description <text> Tool description (with --tool)\n --responses OpenAI: emit the Responses API tool shape\n --uppercase-types Gemini: emit upper case OpenAPI type names\n --quiet Do not print warnings to stderr\n -h, --help Show this help\n\nReads from the given file or from stdin. Prints the converted schema (or tool)\nas JSON to stdout. Warnings go to stderr and never pollute stdout.`;\n\ninterface Args {\n file?: string;\n target: Target;\n tool?: string;\n description?: string;\n responses: boolean;\n uppercase: boolean;\n quiet: boolean;\n help: boolean;\n}\n\nfunction parseArgs(argv: string[]): Args {\n const args: Args = {\n target: 'openai',\n responses: false,\n uppercase: false,\n quiet: false,\n help: false,\n };\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i];\n switch (a) {\n case '-h':\n case '--help':\n args.help = true;\n break;\n case '-t':\n case '--target':\n args.target = argv[++i] as Target;\n break;\n case '--tool':\n args.tool = argv[++i];\n break;\n case '--description':\n args.description = argv[++i];\n break;\n case '--responses':\n args.responses = true;\n break;\n case '--uppercase-types':\n args.uppercase = true;\n break;\n case '--quiet':\n args.quiet = true;\n break;\n default:\n if (a.startsWith('-')) {\n throw new Error(`Unknown option: ${a}`);\n }\n args.file = a;\n }\n }\n return args;\n}\n\nfunction readInput(file?: string): string {\n if (file) return readFileSync(file, 'utf8');\n return readFileSync(0, 'utf8');\n}\n\nfunction main(): void {\n let args: Args;\n try {\n args = parseArgs(process.argv.slice(2));\n } catch (err) {\n process.stderr.write(`${(err as Error).message}\\n`);\n process.exit(2);\n }\n\n if (args.help) {\n process.stdout.write(`${HELP}\\n`);\n return;\n }\n\n if (!TARGETS.includes(args.target)) {\n process.stderr.write(`Invalid target '${args.target}'. Valid: ${TARGETS.join(', ')}\\n`);\n process.exit(2);\n }\n\n let schema: JSONSchema;\n try {\n schema = JSON.parse(readInput(args.file)) as JSONSchema;\n } catch (err) {\n process.stderr.write(`Could not read or parse input: ${(err as Error).message}\\n`);\n process.exit(1);\n return;\n }\n\n const options: ToolSchemaOptions = {\n target: args.target,\n openaiResponses: args.responses,\n geminiUppercaseTypes: args.uppercase,\n };\n\n const { output, warnings, lossy } = args.tool\n ? (() => {\n const r = toTool({ name: args.tool!, description: args.description, schema }, options);\n return { output: r.tool, warnings: r.warnings, lossy: r.lossy };\n })()\n : (() => {\n const r = toToolSchema(schema, options);\n return { output: r.schema, warnings: r.warnings, lossy: r.lossy };\n })();\n\n process.stdout.write(`${JSON.stringify(output, null, 2)}\\n`);\n\n if (!args.quiet && warnings.length > 0) {\n process.stderr.write(`\\n${warnings.length} warning(s) for target '${args.target}'${lossy ? ' (lossy)' : ''}:\\n`);\n for (const w of warnings) {\n process.stderr.write(` ${w.path} [${w.code}] ${w.message}\\n`);\n }\n }\n}\n\nmain();\n","import type { JSONSchema, Warning, WarningCode } from './types.js';\n\n/** Collects warnings and tracks whether the conversion lost information. */\nexport class Warnings {\n readonly list: Warning[] = [];\n lossy = false;\n\n add(path: string, code: WarningCode, message: string, lossy = true): void {\n this.list.push({ path, code, message });\n if (lossy) this.lossy = true;\n }\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** A deep, structurally faithful clone. Uses the platform `structuredClone`. */\nexport function clone<T>(value: T): T {\n return structuredClone(value);\n}\n\n/** Returns the schema's declared types as an array (empty when untyped). */\nexport function typesOf(schema: JSONSchema): string[] {\n if (typeof schema.type === 'string') return [schema.type];\n if (Array.isArray(schema.type)) return schema.type.filter((t) => typeof t === 'string');\n return [];\n}\n\n/**\n * Heuristic: does this node describe an object? True when `type` is `object`\n * (or a union containing it) or when it is untyped but carries object keywords.\n */\nexport function isObjectSchema(schema: JSONSchema): boolean {\n const types = typesOf(schema);\n if (types.includes('object')) return true;\n if (types.length > 0) return false;\n return isPlainObject(schema.properties) || schema.additionalProperties !== undefined;\n}\n\n/**\n * Makes a schema accept `null`. Adds `null` to a string/array `type`, appends a\n * `{ type: 'null' }` branch to an `anyOf`, otherwise wraps the node in an\n * `anyOf` with a null branch. Used by OpenAI strict mode where every property\n * must be `required`, so optional fields are expressed as nullable instead.\n */\nexport function makeNullable(schema: JSONSchema): JSONSchema {\n if (typeof schema.type === 'string') {\n if (schema.type === 'null') return schema;\n return { ...schema, type: [schema.type, 'null'] };\n }\n if (Array.isArray(schema.type)) {\n if (schema.type.includes('null')) return schema;\n return { ...schema, type: [...schema.type, 'null'] };\n }\n if (Array.isArray(schema.anyOf)) {\n if (schema.anyOf.some((b) => typesOf(b).includes('null'))) return schema;\n return { ...schema, anyOf: [...schema.anyOf, { type: 'null' }] };\n }\n return { anyOf: [schema, { type: 'null' }] };\n}\n\n/**\n * Resolves local `$ref` pointers (`#/$defs/...` or `#/definitions/...`) by\n * inlining them. Non local refs are left untouched. Recursive refs are replaced\n * with an empty schema and reported, since target dialects that need inlining\n * (Gemini route A) cannot express recursion.\n */\nexport function dereference(root: JSONSchema, warnings: Warnings): JSONSchema {\n const defs: Record<string, JSONSchema> = {\n ...(isPlainObject(root.definitions) ? (root.definitions as Record<string, JSONSchema>) : {}),\n ...(isPlainObject(root.$defs) ? (root.$defs as Record<string, JSONSchema>) : {}),\n };\n\n const resolve = (ref: string): JSONSchema | undefined => {\n const m = /^#\\/(?:\\$defs|definitions)\\/(.+)$/.exec(ref);\n if (!m) return undefined;\n const key = decodeURIComponent(m[1].replace(/~1/g, '/').replace(/~0/g, '~'));\n return defs[key];\n };\n\n const walk = (node: JSONSchema, path: string, seen: Set<string>): JSONSchema => {\n if (!isPlainObject(node)) return node;\n if (typeof node.$ref === 'string') {\n const ref = node.$ref;\n const target = resolve(ref);\n if (!target) return node; // leave external / unknown refs in place\n if (seen.has(ref)) {\n warnings.add(path, 'recursive-ref', `Recursive $ref '${ref}' cannot be inlined; replaced with an open schema.`);\n return {};\n }\n const { $ref: _drop, ...rest } = node;\n void _drop;\n warnings.add(path, 'inlined-ref', `Inlined $ref '${ref}'.`, false);\n const merged = { ...clone(target), ...rest };\n return walk(merged, path, new Set([...seen, ref]));\n }\n return mapChildren(node, path, (child, childPath) => walk(child, childPath, seen));\n };\n\n const out = walk(clone(root), '#', new Set());\n delete out.$defs;\n delete out.definitions;\n return out;\n}\n\n/**\n * Applies `fn` to every direct sub schema of `node`, returning a new node. Walks\n * the standard applicator keywords. Leaf keywords are copied as is.\n */\nexport function mapChildren(\n node: JSONSchema,\n path: string,\n fn: (child: JSONSchema, childPath: string) => JSONSchema,\n): JSONSchema {\n const out: JSONSchema = { ...node };\n\n if (isPlainObject(out.properties)) {\n const props: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.properties as Record<string, JSONSchema>)) {\n props[k] = fn(v, `${path}/properties/${k}`);\n }\n out.properties = props;\n }\n\n if (Array.isArray(out.items)) {\n out.items = out.items.map((it, i) => fn(it, `${path}/items/${i}`));\n } else if (isPlainObject(out.items)) {\n out.items = fn(out.items as JSONSchema, `${path}/items`);\n }\n\n if (isPlainObject(out.additionalProperties)) {\n out.additionalProperties = fn(out.additionalProperties as JSONSchema, `${path}/additionalProperties`);\n }\n\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = out[key];\n if (Array.isArray(arr)) {\n out[key] = arr.map((b, i) => fn(b, `${path}/${key}/${i}`));\n }\n }\n\n if (isPlainObject(out.not)) out.not = fn(out.not as JSONSchema, `${path}/not`);\n for (const key of ['if', 'then', 'else'] as const) {\n if (isPlainObject(out[key])) out[key] = fn(out[key] as JSONSchema, `${path}/${key}`);\n }\n\n if (isPlainObject(out.patternProperties)) {\n const pp: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.patternProperties as Record<string, JSONSchema>)) {\n pp[k] = fn(v, `${path}/patternProperties/${k}`);\n }\n out.patternProperties = pp;\n }\n\n for (const key of ['$defs', 'definitions', 'dependentSchemas'] as const) {\n const map = out[key];\n if (isPlainObject(map)) {\n const next: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(map as Record<string, JSONSchema>)) {\n next[k] = fn(v as JSONSchema, `${path}/${key}/${k}`);\n }\n out[key] = next;\n }\n }\n\n return out;\n}\n\n/** Ensures the root is an object schema, reporting when it was not. */\nexport function ensureObjectRoot(schema: JSONSchema, warnings: Warnings, target: string): JSONSchema {\n if (isObjectSchema(schema)) {\n if (typesOf(schema).length === 0) return { type: 'object', ...schema };\n return schema;\n }\n warnings.add(\n '#',\n 'root-not-object',\n `${target} requires the root schema to be an object; wrapped the schema under a 'value' property.`,\n );\n return {\n type: 'object',\n properties: { value: schema },\n required: ['value'],\n };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport {\n Warnings,\n clone,\n isObjectSchema,\n isPlainObject,\n makeNullable,\n mapChildren,\n ensureObjectRoot,\n} from '../util.js';\n\n/** Formats OpenAI Structured Outputs accepts. Others are dropped in strict mode. */\nconst FORMAT_WHITELIST = new Set([\n 'date-time',\n 'time',\n 'date',\n 'duration',\n 'email',\n 'hostname',\n 'ipv4',\n 'ipv6',\n 'uuid',\n]);\n\n/** Keywords OpenAI strict mode rejects outright. */\nconst UNSUPPORTED = [\n 'not',\n 'if',\n 'then',\n 'else',\n 'dependentRequired',\n 'dependentSchemas',\n 'patternProperties',\n 'unevaluatedProperties',\n] as const;\n\nconst MAX_PROPERTIES = 5000;\nconst MAX_DEPTH = 10;\nconst MAX_ENUM_VALUES = 1000;\n\n/** OpenAI non strict: tool parameters should be an object, otherwise pass through. */\nexport function toOpenAI(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'OpenAI');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/**\n * OpenAI Structured Outputs / `strict: true`. Enforces: every object has\n * `additionalProperties: false`; every property is `required` (optional ones\n * become nullable); unsupported keywords are stripped; `allOf` is merged; only\n * whitelisted `format` values survive. `$defs` / `$ref` and `anyOf` are kept.\n */\nexport function toOpenAIStrict(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n if (Array.isArray(s.allOf)) {\n s = mergeAllOf(s, path, warnings);\n }\n\n for (const kw of UNSUPPORTED) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported in OpenAI strict mode; removed.`);\n }\n }\n\n if (typeof s.format === 'string' && !FORMAT_WHITELIST.has(s.format)) {\n warnings.add(\n `${path}/format`,\n 'unsupported-format',\n `format '${s.format}' is not in OpenAI's whitelist; removed.`,\n );\n delete s.format;\n }\n\n // Recurse into all sub schemas first (anyOf branches, items, $defs, ...).\n s = mapChildren(s, path, transform);\n\n if (isObjectSchema(s) && isPlainObject(s.properties)) {\n const props = s.properties as Record<string, JSONSchema>;\n const originalRequired = new Set(Array.isArray(s.required) ? s.required : []);\n const nextProps: Record<string, JSONSchema> = {};\n for (const key of Object.keys(props)) {\n let child = props[key];\n if (!originalRequired.has(key)) {\n child = makeNullable(child);\n warnings.add(\n `${path}/properties/${key}`,\n 'forced-required',\n `Optional property '${key}' was made required and nullable for OpenAI strict mode.`,\n );\n }\n nextProps[key] = child;\n }\n s.properties = nextProps;\n s.required = Object.keys(nextProps);\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' as required by strict mode.\",\n false,\n );\n }\n s.additionalProperties = false;\n } else if (isObjectSchema(s)) {\n // Object without declared properties: strict mode still forbids extra keys.\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' on a property-less object.\",\n false,\n );\n }\n s.additionalProperties = false;\n }\n\n return s;\n };\n\n const schema = ensureObjectRoot(transform(clone(input), '#'), warnings, 'OpenAI strict mode');\n checkLimits(schema, warnings);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Shallow merges `allOf` object subschemas into the parent, then drops `allOf`. */\nfunction mergeAllOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n const parts = node.allOf as JSONSchema[];\n const { allOf: _drop, ...base } = node;\n void _drop;\n const merged: JSONSchema = { ...base };\n const props: Record<string, JSONSchema> = isPlainObject(merged.properties)\n ? { ...(merged.properties as Record<string, JSONSchema>) }\n : {};\n const required = new Set<string>(Array.isArray(merged.required) ? merged.required : []);\n\n for (const part of parts) {\n if (!isPlainObject(part)) continue;\n if (isPlainObject(part.properties)) {\n Object.assign(props, part.properties);\n }\n if (Array.isArray(part.required)) {\n for (const r of part.required) required.add(r);\n }\n if (part.type && !merged.type) merged.type = part.type;\n }\n\n if (Object.keys(props).length > 0) merged.properties = props;\n if (required.size > 0) merged.required = [...required];\n if (!merged.type && (merged.properties || isObjectSchema(merged))) merged.type = 'object';\n warnings.add(path, 'merged-allof', \"Merged 'allOf' subschemas into the parent (unsupported in strict mode).\");\n return merged;\n}\n\nfunction checkLimits(schema: JSONSchema, warnings: Warnings): void {\n let propertyCount = 0;\n let maxDepth = 0;\n\n const visit = (node: JSONSchema, depth: number): void => {\n if (!isPlainObject(node)) return;\n maxDepth = Math.max(maxDepth, depth);\n if (isPlainObject(node.properties)) {\n const keys = Object.keys(node.properties as Record<string, JSONSchema>);\n propertyCount += keys.length;\n }\n if (Array.isArray(node.enum) && node.enum.length > MAX_ENUM_VALUES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `An enum has ${node.enum.length} values; OpenAI allows at most ${MAX_ENUM_VALUES}.`,\n false,\n );\n }\n const children = collectChildren(node);\n for (const c of children) visit(c, depth + 1);\n };\n\n visit(schema, 0);\n if (propertyCount > MAX_PROPERTIES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema has ${propertyCount} object properties; OpenAI allows at most ${MAX_PROPERTIES}.`,\n false,\n );\n }\n if (maxDepth > MAX_DEPTH) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema nests ${maxDepth} levels deep; OpenAI allows at most ${MAX_DEPTH}.`,\n false,\n );\n }\n}\n\nfunction collectChildren(node: JSONSchema): JSONSchema[] {\n const out: JSONSchema[] = [];\n if (isPlainObject(node.properties)) out.push(...Object.values(node.properties as Record<string, JSONSchema>));\n if (Array.isArray(node.items)) out.push(...node.items);\n else if (isPlainObject(node.items)) out.push(node.items as JSONSchema);\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = node[key];\n if (Array.isArray(arr)) out.push(...arr);\n }\n if (isPlainObject(node.$defs)) out.push(...Object.values(node.$defs as Record<string, JSONSchema>));\n return out.filter(isPlainObject) as JSONSchema[];\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * Anthropic tool use. The API is permissive: it accepts standard JSON Schema for\n * `input_schema` (anyOf, oneOf, allOf, $ref, format, pattern, ...). The only hard\n * requirement is that the root is an object, so that is all we enforce.\n */\nexport function toAnthropic(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Anthropic');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, dereference, ensureObjectRoot, isPlainObject, mapChildren, typesOf } from '../util.js';\n\n/**\n * Keywords absent from Gemini's `Schema` proto (route A). Sending them either\n * errors or is silently ignored, so they are stripped.\n */\nconst STRIP = [\n '$schema',\n '$id',\n '$anchor',\n '$ref',\n 'oneOf',\n 'allOf',\n 'not',\n 'if',\n 'then',\n 'else',\n 'additionalProperties',\n 'patternProperties',\n 'unevaluatedProperties',\n 'const',\n 'dependentRequired',\n 'dependentSchemas',\n 'multipleOf',\n 'exclusiveMinimum',\n 'exclusiveMaximum',\n 'uniqueItems',\n 'contentEncoding',\n 'contentMediaType',\n '$defs',\n 'definitions',\n] as const;\n\nconst TYPE_UPPER: Record<string, string> = {\n string: 'STRING',\n number: 'NUMBER',\n integer: 'INTEGER',\n boolean: 'BOOLEAN',\n array: 'ARRAY',\n object: 'OBJECT',\n null: 'NULL',\n};\n\ninterface GeminiOptions {\n uppercaseTypes?: boolean;\n}\n\n/**\n * Gemini function calling, route A (`parameters` as an OpenAPI 3.0 subset).\n * Inlines `$ref`, strips unsupported keywords, converts nullable unions to\n * `nullable: true`, collapses `anyOf` null branches, and coerces enum values to\n * strings. Use the `gemini-jsonschema` target for the richer\n * `parametersJsonSchema` route.\n */\nexport function toGemini(input: JSONSchema, options: GeminiOptions = {}): TransformResult {\n const warnings = new Warnings();\n const dereferenced = dereference(clone(input), warnings);\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n for (const kw of STRIP) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported by Gemini (route A); removed.`);\n }\n }\n\n s = collapseNullableUnion(s, path, warnings);\n s = mapChildren(s, path, transform);\n s = collapseAnyOf(s, path, warnings);\n coerceEnum(s, path, warnings);\n return s;\n };\n\n let schema = ensureObjectRoot(transform(dereferenced, '#'), warnings, 'Gemini');\n if (options.uppercaseTypes) schema = uppercaseTypes(schema);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Final pass: rewrite JSON Schema type names to Gemini's upper case enum. */\nfunction uppercaseTypes(node: JSONSchema): JSONSchema {\n if (!isPlainObject(node)) return node;\n const out: JSONSchema = { ...node };\n if (typeof out.type === 'string') {\n out.type = TYPE_UPPER[out.type] ?? out.type;\n } else if (Array.isArray(out.type)) {\n out.type = out.type.map((t) => TYPE_UPPER[t] ?? t);\n }\n return mapChildren(out, '#', (child) => uppercaseTypes(child));\n}\n\n/** Gemini route B (`parametersJsonSchema`): richer JSON Schema, object root only. */\nexport function toGeminiJsonSchema(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Gemini (parametersJsonSchema)');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Converts `type: ['string', 'null']` into `type: 'string', nullable: true`. */\nfunction collapseNullableUnion(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.type)) return node;\n const nonNull = node.type.filter((t) => t !== 'null');\n const hadNull = node.type.includes('null');\n const out: JSONSchema = { ...node };\n if (nonNull.length === 0) {\n out.type = 'string';\n } else {\n out.type = nonNull[0];\n if (nonNull.length > 1) {\n warnings.add(\n path,\n 'union-types',\n `Gemini cannot express a union of types [${nonNull.join(', ')}]; kept '${nonNull[0]}'.`,\n );\n }\n }\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted nullable type union into 'nullable: true'.\", false);\n }\n return out;\n}\n\n/** Removes `{ type: 'null' }` branches from `anyOf`, mapping them to `nullable`. */\nfunction collapseAnyOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.anyOf)) return node;\n const branches = node.anyOf as JSONSchema[];\n const nonNull = branches.filter((b) => !(typesOf(b).length === 1 && typesOf(b)[0] === 'null'));\n const hadNull = nonNull.length !== branches.length;\n const out: JSONSchema = { ...node };\n\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted an anyOf null branch into 'nullable: true'.\", false);\n }\n\n if (nonNull.length === 0) {\n delete out.anyOf;\n if (!out.type) out.type = 'string';\n } else if (nonNull.length === 1) {\n // Flatten a single remaining branch into the parent.\n delete out.anyOf;\n const branch = nonNull[0];\n for (const [k, v] of Object.entries(branch)) {\n if (k === 'description' && out.description) continue;\n out[k] = v;\n }\n } else {\n out.anyOf = nonNull;\n }\n return out;\n}\n\n/** Gemini enum values must be strings. Coerces and reports when they were not. */\nfunction coerceEnum(node: JSONSchema, path: string, warnings: Warnings): void {\n if (!Array.isArray(node.enum)) return;\n const allStrings = node.enum.every((v) => typeof v === 'string');\n if (!allStrings) {\n node.enum = node.enum.map((v) => String(v));\n warnings.add(`${path}/enum`, 'enum-coerced', 'Gemini enum values must be strings; coerced non string values.');\n }\n if (!node.type) node.type = 'string';\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * MCP (Model Context Protocol) tools. The most permissive input target:\n * `inputSchema` is standard JSON Schema and the spec only requires the root to\n * be an object. All input keywords are preserved. MCP `outputSchema` is handled\n * at the tool envelope layer because it describes `structuredContent` and does\n * not share the input object-root constraint.\n */\nexport function toMcp(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'MCP');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type {\n JSONSchema,\n LintResult,\n Target,\n ToolDefinition,\n ToolResult,\n ToolSchemaOptions,\n TransformResult,\n Warning,\n} from './types.js';\nimport { toOpenAI, toOpenAIStrict } from './targets/openai.js';\nimport { toAnthropic } from './targets/anthropic.js';\nimport { toGemini, toGeminiJsonSchema } from './targets/gemini.js';\nimport { toMcp } from './targets/mcp.js';\nimport { clone } from './util.js';\n\nconst EMPTY_OBJECT_SCHEMA: JSONSchema = { type: 'object', properties: {} };\n\n/**\n * Convert any JSON Schema into a schema that is valid for a provider's tool /\n * function calling parameters.\n *\n * @example\n * const { schema, warnings } = toToolSchema(mySchema, { target: 'openai-strict' });\n */\nexport function toToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): TransformResult {\n const target = options.target ?? 'openai';\n switch (target) {\n case 'openai':\n return toOpenAI(schema);\n case 'openai-strict':\n return toOpenAIStrict(schema);\n case 'anthropic':\n return toAnthropic(schema);\n case 'gemini':\n return toGemini(schema, { uppercaseTypes: options.geminiUppercaseTypes });\n case 'gemini-jsonschema':\n return toGeminiJsonSchema(schema);\n case 'mcp':\n return toMcp(schema);\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\n/**\n * Build a complete, provider shaped tool / function declaration: the right\n * wrapper keys (`function`, `input_schema`, `parameters`, `inputSchema`), the\n * converted parameter schema, and provider specific extras such as `strict` or\n * MCP `annotations`.\n */\nexport function toTool(def: ToolDefinition, options: ToolSchemaOptions = {}): ToolResult {\n const target = options.target ?? 'openai';\n const result = toToolSchema(def.schema ?? EMPTY_OBJECT_SCHEMA, options);\n const warnings: Warning[] = [...result.warnings];\n validateName(def.name, target, warnings);\n\n const tool = buildTool(def, result.schema, target, options);\n return { tool, warnings, lossy: result.lossy };\n}\n\n/**\n * Report what would change to make `schema` valid for a target, without\n * applying it. `ok` is true when the schema is already conformant.\n */\nexport function lintToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): LintResult {\n const { warnings } = toToolSchema(schema, options);\n return { ok: warnings.length === 0, issues: warnings };\n}\n\nfunction buildTool(\n def: ToolDefinition,\n schema: JSONSchema,\n target: Target,\n options: ToolSchemaOptions,\n): Record<string, unknown> {\n const { name, description } = def;\n\n switch (target) {\n case 'openai':\n case 'openai-strict': {\n const strict = target === 'openai-strict';\n if (options.openaiResponses) {\n return {\n type: 'function',\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n };\n }\n return {\n type: 'function',\n function: {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n },\n };\n }\n case 'anthropic':\n return {\n name,\n ...(description ? { description } : {}),\n input_schema: schema,\n ...(options.anthropicStrict ? { strict: true } : {}),\n };\n case 'gemini':\n return {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n };\n case 'gemini-jsonschema':\n return {\n name,\n ...(description ? { description } : {}),\n parametersJsonSchema: schema,\n };\n case 'mcp':\n return {\n name,\n ...(description ? { description } : {}),\n inputSchema: schema,\n ...(def.outputSchema ? { outputSchema: clone(def.outputSchema) } : {}),\n ...(def.annotations ? { annotations: def.annotations } : {}),\n };\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\nconst NAME_RULES: Record<Target, { pattern: RegExp; label: string }> = {\n openai: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n 'openai-strict': { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n anthropic: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'Anthropic (letters, digits, _ and -, max 64)' },\n gemini: { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n 'gemini-jsonschema': { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n mcp: { pattern: /^[a-zA-Z0-9_-]{1,128}$/, label: 'MCP (letters, digits, _ and -)' },\n};\n\nfunction validateName(name: string, target: Target, warnings: Warning[]): void {\n const rule = NAME_RULES[target];\n if (!rule.pattern.test(name)) {\n warnings.push({\n path: '#/name',\n code: 'invalid-name',\n message: `Tool name '${name}' does not match the ${rule.label} naming rule.`,\n });\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/cli.js
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -20,7 +20,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
+
fromAISDKTool: () => fromAISDKTool,
|
|
23
24
|
lintToolSchema: () => lintToolSchema,
|
|
25
|
+
toAISDKTool: () => toAISDKTool,
|
|
24
26
|
toTool: () => toTool,
|
|
25
27
|
toToolSchema: () => toToolSchema
|
|
26
28
|
});
|
|
@@ -563,6 +565,7 @@ function buildTool(def, schema, target, options) {
|
|
|
563
565
|
name,
|
|
564
566
|
...description ? { description } : {},
|
|
565
567
|
inputSchema: schema,
|
|
568
|
+
...def.outputSchema ? { outputSchema: clone(def.outputSchema) } : {},
|
|
566
569
|
...def.annotations ? { annotations: def.annotations } : {}
|
|
567
570
|
};
|
|
568
571
|
default:
|
|
@@ -587,9 +590,67 @@ function validateName(name, target, warnings) {
|
|
|
587
590
|
});
|
|
588
591
|
}
|
|
589
592
|
}
|
|
593
|
+
|
|
594
|
+
// src/adapters/ai-sdk.ts
|
|
595
|
+
var EMPTY_OBJECT_SCHEMA2 = { type: "object", properties: {} };
|
|
596
|
+
function toAISDKTool(def, options = {}) {
|
|
597
|
+
const result = toToolSchema(def.schema ?? EMPTY_OBJECT_SCHEMA2, options);
|
|
598
|
+
const schemaKey = options.aiSDKParameters ? "parameters" : "inputSchema";
|
|
599
|
+
return {
|
|
600
|
+
tool: {
|
|
601
|
+
...def.description ? { description: def.description } : {},
|
|
602
|
+
[schemaKey]: result.schema,
|
|
603
|
+
...options.target === "openai-strict" ? { strict: true } : {}
|
|
604
|
+
},
|
|
605
|
+
warnings: result.warnings,
|
|
606
|
+
lossy: result.lossy
|
|
607
|
+
};
|
|
608
|
+
}
|
|
609
|
+
function fromAISDKTool(name, aiTool, options = {}) {
|
|
610
|
+
if (!isPlainObject(aiTool)) {
|
|
611
|
+
throw new TypeError("fromAISDKTool expected an AI SDK tool object.");
|
|
612
|
+
}
|
|
613
|
+
const rawSchema = aiTool.inputSchema ?? aiTool.parameters ?? EMPTY_OBJECT_SCHEMA2;
|
|
614
|
+
const schema = toJSONSchema(rawSchema, options);
|
|
615
|
+
const target = aiTool.strict === true && (options.target ?? "openai") === "openai" ? "openai-strict" : options.target;
|
|
616
|
+
return toTool(
|
|
617
|
+
{
|
|
618
|
+
name,
|
|
619
|
+
...typeof aiTool.description === "string" ? { description: aiTool.description } : {},
|
|
620
|
+
schema
|
|
621
|
+
},
|
|
622
|
+
{ ...options, target }
|
|
623
|
+
);
|
|
624
|
+
}
|
|
625
|
+
function toJSONSchema(value, options) {
|
|
626
|
+
if (isProbablyZodSchema(value)) {
|
|
627
|
+
if (options.zodToJsonSchema) {
|
|
628
|
+
return assertJSONSchema(options.zodToJsonSchema(value));
|
|
629
|
+
}
|
|
630
|
+
throw new TypeError(
|
|
631
|
+
"AI SDK tool schema looks like a Zod/Standard Schema object. tool-schema has zero dependencies; pass zodToJsonSchema: z.toJSONSchema or pass JSON Schema directly."
|
|
632
|
+
);
|
|
633
|
+
}
|
|
634
|
+
if (isPlainObject(value) && typeof value.toJSONSchema === "function") {
|
|
635
|
+
return assertJSONSchema(value.toJSONSchema());
|
|
636
|
+
}
|
|
637
|
+
return assertJSONSchema(value);
|
|
638
|
+
}
|
|
639
|
+
function assertJSONSchema(value) {
|
|
640
|
+
if (!isPlainObject(value)) {
|
|
641
|
+
throw new TypeError("Expected a JSON Schema object for the AI SDK tool input schema.");
|
|
642
|
+
}
|
|
643
|
+
return clone(value);
|
|
644
|
+
}
|
|
645
|
+
function isProbablyZodSchema(value) {
|
|
646
|
+
if (!isPlainObject(value)) return false;
|
|
647
|
+
return "_def" in value || "_zod" in value || "~standard" in value;
|
|
648
|
+
}
|
|
590
649
|
// Annotate the CommonJS export names for ESM import in node:
|
|
591
650
|
0 && (module.exports = {
|
|
651
|
+
fromAISDKTool,
|
|
592
652
|
lintToolSchema,
|
|
653
|
+
toAISDKTool,
|
|
593
654
|
toTool,
|
|
594
655
|
toToolSchema
|
|
595
656
|
});
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/util.ts","../src/targets/openai.ts","../src/targets/anthropic.ts","../src/targets/gemini.ts","../src/targets/mcp.ts","../src/transform.ts"],"sourcesContent":["export { toToolSchema, toTool, lintToolSchema } from './transform.js';\nexport type {\n JSONSchema,\n Target,\n Warning,\n WarningCode,\n TransformResult,\n ToolSchemaOptions,\n ToolDefinition,\n ToolResult,\n LintResult,\n McpAnnotations,\n} from './types.js';\n","import type { JSONSchema, Warning, WarningCode } from './types.js';\n\n/** Collects warnings and tracks whether the conversion lost information. */\nexport class Warnings {\n readonly list: Warning[] = [];\n lossy = false;\n\n add(path: string, code: WarningCode, message: string, lossy = true): void {\n this.list.push({ path, code, message });\n if (lossy) this.lossy = true;\n }\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** A deep, structurally faithful clone. Uses the platform `structuredClone`. */\nexport function clone<T>(value: T): T {\n return structuredClone(value);\n}\n\n/** Returns the schema's declared types as an array (empty when untyped). */\nexport function typesOf(schema: JSONSchema): string[] {\n if (typeof schema.type === 'string') return [schema.type];\n if (Array.isArray(schema.type)) return schema.type.filter((t) => typeof t === 'string');\n return [];\n}\n\n/**\n * Heuristic: does this node describe an object? True when `type` is `object`\n * (or a union containing it) or when it is untyped but carries object keywords.\n */\nexport function isObjectSchema(schema: JSONSchema): boolean {\n const types = typesOf(schema);\n if (types.includes('object')) return true;\n if (types.length > 0) return false;\n return isPlainObject(schema.properties) || schema.additionalProperties !== undefined;\n}\n\n/**\n * Makes a schema accept `null`. Adds `null` to a string/array `type`, appends a\n * `{ type: 'null' }` branch to an `anyOf`, otherwise wraps the node in an\n * `anyOf` with a null branch. Used by OpenAI strict mode where every property\n * must be `required`, so optional fields are expressed as nullable instead.\n */\nexport function makeNullable(schema: JSONSchema): JSONSchema {\n if (typeof schema.type === 'string') {\n if (schema.type === 'null') return schema;\n return { ...schema, type: [schema.type, 'null'] };\n }\n if (Array.isArray(schema.type)) {\n if (schema.type.includes('null')) return schema;\n return { ...schema, type: [...schema.type, 'null'] };\n }\n if (Array.isArray(schema.anyOf)) {\n if (schema.anyOf.some((b) => typesOf(b).includes('null'))) return schema;\n return { ...schema, anyOf: [...schema.anyOf, { type: 'null' }] };\n }\n return { anyOf: [schema, { type: 'null' }] };\n}\n\n/**\n * Resolves local `$ref` pointers (`#/$defs/...` or `#/definitions/...`) by\n * inlining them. Non local refs are left untouched. Recursive refs are replaced\n * with an empty schema and reported, since target dialects that need inlining\n * (Gemini route A) cannot express recursion.\n */\nexport function dereference(root: JSONSchema, warnings: Warnings): JSONSchema {\n const defs: Record<string, JSONSchema> = {\n ...(isPlainObject(root.definitions) ? (root.definitions as Record<string, JSONSchema>) : {}),\n ...(isPlainObject(root.$defs) ? (root.$defs as Record<string, JSONSchema>) : {}),\n };\n\n const resolve = (ref: string): JSONSchema | undefined => {\n const m = /^#\\/(?:\\$defs|definitions)\\/(.+)$/.exec(ref);\n if (!m) return undefined;\n const key = decodeURIComponent(m[1].replace(/~1/g, '/').replace(/~0/g, '~'));\n return defs[key];\n };\n\n const walk = (node: JSONSchema, path: string, seen: Set<string>): JSONSchema => {\n if (!isPlainObject(node)) return node;\n if (typeof node.$ref === 'string') {\n const ref = node.$ref;\n const target = resolve(ref);\n if (!target) return node; // leave external / unknown refs in place\n if (seen.has(ref)) {\n warnings.add(path, 'recursive-ref', `Recursive $ref '${ref}' cannot be inlined; replaced with an open schema.`);\n return {};\n }\n const { $ref: _drop, ...rest } = node;\n void _drop;\n warnings.add(path, 'inlined-ref', `Inlined $ref '${ref}'.`, false);\n const merged = { ...clone(target), ...rest };\n return walk(merged, path, new Set([...seen, ref]));\n }\n return mapChildren(node, path, (child, childPath) => walk(child, childPath, seen));\n };\n\n const out = walk(clone(root), '#', new Set());\n delete out.$defs;\n delete out.definitions;\n return out;\n}\n\n/**\n * Applies `fn` to every direct sub schema of `node`, returning a new node. Walks\n * the standard applicator keywords. Leaf keywords are copied as is.\n */\nexport function mapChildren(\n node: JSONSchema,\n path: string,\n fn: (child: JSONSchema, childPath: string) => JSONSchema,\n): JSONSchema {\n const out: JSONSchema = { ...node };\n\n if (isPlainObject(out.properties)) {\n const props: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.properties as Record<string, JSONSchema>)) {\n props[k] = fn(v, `${path}/properties/${k}`);\n }\n out.properties = props;\n }\n\n if (Array.isArray(out.items)) {\n out.items = out.items.map((it, i) => fn(it, `${path}/items/${i}`));\n } else if (isPlainObject(out.items)) {\n out.items = fn(out.items as JSONSchema, `${path}/items`);\n }\n\n if (isPlainObject(out.additionalProperties)) {\n out.additionalProperties = fn(out.additionalProperties as JSONSchema, `${path}/additionalProperties`);\n }\n\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = out[key];\n if (Array.isArray(arr)) {\n out[key] = arr.map((b, i) => fn(b, `${path}/${key}/${i}`));\n }\n }\n\n if (isPlainObject(out.not)) out.not = fn(out.not as JSONSchema, `${path}/not`);\n for (const key of ['if', 'then', 'else'] as const) {\n if (isPlainObject(out[key])) out[key] = fn(out[key] as JSONSchema, `${path}/${key}`);\n }\n\n if (isPlainObject(out.patternProperties)) {\n const pp: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.patternProperties as Record<string, JSONSchema>)) {\n pp[k] = fn(v, `${path}/patternProperties/${k}`);\n }\n out.patternProperties = pp;\n }\n\n for (const key of ['$defs', 'definitions', 'dependentSchemas'] as const) {\n const map = out[key];\n if (isPlainObject(map)) {\n const next: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(map as Record<string, JSONSchema>)) {\n next[k] = fn(v as JSONSchema, `${path}/${key}/${k}`);\n }\n out[key] = next;\n }\n }\n\n return out;\n}\n\n/** Ensures the root is an object schema, reporting when it was not. */\nexport function ensureObjectRoot(schema: JSONSchema, warnings: Warnings, target: string): JSONSchema {\n if (isObjectSchema(schema)) {\n if (typesOf(schema).length === 0) return { type: 'object', ...schema };\n return schema;\n }\n warnings.add(\n '#',\n 'root-not-object',\n `${target} requires the root schema to be an object; wrapped the schema under a 'value' property.`,\n );\n return {\n type: 'object',\n properties: { value: schema },\n required: ['value'],\n };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport {\n Warnings,\n clone,\n isObjectSchema,\n isPlainObject,\n makeNullable,\n mapChildren,\n ensureObjectRoot,\n} from '../util.js';\n\n/** Formats OpenAI Structured Outputs accepts. Others are dropped in strict mode. */\nconst FORMAT_WHITELIST = new Set([\n 'date-time',\n 'time',\n 'date',\n 'duration',\n 'email',\n 'hostname',\n 'ipv4',\n 'ipv6',\n 'uuid',\n]);\n\n/** Keywords OpenAI strict mode rejects outright. */\nconst UNSUPPORTED = [\n 'not',\n 'if',\n 'then',\n 'else',\n 'dependentRequired',\n 'dependentSchemas',\n 'patternProperties',\n 'unevaluatedProperties',\n] as const;\n\nconst MAX_PROPERTIES = 5000;\nconst MAX_DEPTH = 10;\nconst MAX_ENUM_VALUES = 1000;\n\n/** OpenAI non strict: tool parameters should be an object, otherwise pass through. */\nexport function toOpenAI(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'OpenAI');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/**\n * OpenAI Structured Outputs / `strict: true`. Enforces: every object has\n * `additionalProperties: false`; every property is `required` (optional ones\n * become nullable); unsupported keywords are stripped; `allOf` is merged; only\n * whitelisted `format` values survive. `$defs` / `$ref` and `anyOf` are kept.\n */\nexport function toOpenAIStrict(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n if (Array.isArray(s.allOf)) {\n s = mergeAllOf(s, path, warnings);\n }\n\n for (const kw of UNSUPPORTED) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported in OpenAI strict mode; removed.`);\n }\n }\n\n if (typeof s.format === 'string' && !FORMAT_WHITELIST.has(s.format)) {\n warnings.add(\n `${path}/format`,\n 'unsupported-format',\n `format '${s.format}' is not in OpenAI's whitelist; removed.`,\n );\n delete s.format;\n }\n\n // Recurse into all sub schemas first (anyOf branches, items, $defs, ...).\n s = mapChildren(s, path, transform);\n\n if (isObjectSchema(s) && isPlainObject(s.properties)) {\n const props = s.properties as Record<string, JSONSchema>;\n const originalRequired = new Set(Array.isArray(s.required) ? s.required : []);\n const nextProps: Record<string, JSONSchema> = {};\n for (const key of Object.keys(props)) {\n let child = props[key];\n if (!originalRequired.has(key)) {\n child = makeNullable(child);\n warnings.add(\n `${path}/properties/${key}`,\n 'forced-required',\n `Optional property '${key}' was made required and nullable for OpenAI strict mode.`,\n );\n }\n nextProps[key] = child;\n }\n s.properties = nextProps;\n s.required = Object.keys(nextProps);\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' as required by strict mode.\",\n false,\n );\n }\n s.additionalProperties = false;\n } else if (isObjectSchema(s)) {\n // Object without declared properties: strict mode still forbids extra keys.\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' on a property-less object.\",\n false,\n );\n }\n s.additionalProperties = false;\n }\n\n return s;\n };\n\n const schema = ensureObjectRoot(transform(clone(input), '#'), warnings, 'OpenAI strict mode');\n checkLimits(schema, warnings);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Shallow merges `allOf` object subschemas into the parent, then drops `allOf`. */\nfunction mergeAllOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n const parts = node.allOf as JSONSchema[];\n const { allOf: _drop, ...base } = node;\n void _drop;\n const merged: JSONSchema = { ...base };\n const props: Record<string, JSONSchema> = isPlainObject(merged.properties)\n ? { ...(merged.properties as Record<string, JSONSchema>) }\n : {};\n const required = new Set<string>(Array.isArray(merged.required) ? merged.required : []);\n\n for (const part of parts) {\n if (!isPlainObject(part)) continue;\n if (isPlainObject(part.properties)) {\n Object.assign(props, part.properties);\n }\n if (Array.isArray(part.required)) {\n for (const r of part.required) required.add(r);\n }\n if (part.type && !merged.type) merged.type = part.type;\n }\n\n if (Object.keys(props).length > 0) merged.properties = props;\n if (required.size > 0) merged.required = [...required];\n if (!merged.type && (merged.properties || isObjectSchema(merged))) merged.type = 'object';\n warnings.add(path, 'merged-allof', \"Merged 'allOf' subschemas into the parent (unsupported in strict mode).\");\n return merged;\n}\n\nfunction checkLimits(schema: JSONSchema, warnings: Warnings): void {\n let propertyCount = 0;\n let maxDepth = 0;\n\n const visit = (node: JSONSchema, depth: number): void => {\n if (!isPlainObject(node)) return;\n maxDepth = Math.max(maxDepth, depth);\n if (isPlainObject(node.properties)) {\n const keys = Object.keys(node.properties as Record<string, JSONSchema>);\n propertyCount += keys.length;\n }\n if (Array.isArray(node.enum) && node.enum.length > MAX_ENUM_VALUES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `An enum has ${node.enum.length} values; OpenAI allows at most ${MAX_ENUM_VALUES}.`,\n false,\n );\n }\n const children = collectChildren(node);\n for (const c of children) visit(c, depth + 1);\n };\n\n visit(schema, 0);\n if (propertyCount > MAX_PROPERTIES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema has ${propertyCount} object properties; OpenAI allows at most ${MAX_PROPERTIES}.`,\n false,\n );\n }\n if (maxDepth > MAX_DEPTH) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema nests ${maxDepth} levels deep; OpenAI allows at most ${MAX_DEPTH}.`,\n false,\n );\n }\n}\n\nfunction collectChildren(node: JSONSchema): JSONSchema[] {\n const out: JSONSchema[] = [];\n if (isPlainObject(node.properties)) out.push(...Object.values(node.properties as Record<string, JSONSchema>));\n if (Array.isArray(node.items)) out.push(...node.items);\n else if (isPlainObject(node.items)) out.push(node.items as JSONSchema);\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = node[key];\n if (Array.isArray(arr)) out.push(...arr);\n }\n if (isPlainObject(node.$defs)) out.push(...Object.values(node.$defs as Record<string, JSONSchema>));\n return out.filter(isPlainObject) as JSONSchema[];\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * Anthropic tool use. The API is permissive: it accepts standard JSON Schema for\n * `input_schema` (anyOf, oneOf, allOf, $ref, format, pattern, ...). The only hard\n * requirement is that the root is an object, so that is all we enforce.\n */\nexport function toAnthropic(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Anthropic');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, dereference, ensureObjectRoot, isPlainObject, mapChildren, typesOf } from '../util.js';\n\n/**\n * Keywords absent from Gemini's `Schema` proto (route A). Sending them either\n * errors or is silently ignored, so they are stripped.\n */\nconst STRIP = [\n '$schema',\n '$id',\n '$anchor',\n '$ref',\n 'oneOf',\n 'allOf',\n 'not',\n 'if',\n 'then',\n 'else',\n 'additionalProperties',\n 'patternProperties',\n 'unevaluatedProperties',\n 'const',\n 'dependentRequired',\n 'dependentSchemas',\n 'multipleOf',\n 'exclusiveMinimum',\n 'exclusiveMaximum',\n 'uniqueItems',\n 'contentEncoding',\n 'contentMediaType',\n '$defs',\n 'definitions',\n] as const;\n\nconst TYPE_UPPER: Record<string, string> = {\n string: 'STRING',\n number: 'NUMBER',\n integer: 'INTEGER',\n boolean: 'BOOLEAN',\n array: 'ARRAY',\n object: 'OBJECT',\n null: 'NULL',\n};\n\ninterface GeminiOptions {\n uppercaseTypes?: boolean;\n}\n\n/**\n * Gemini function calling, route A (`parameters` as an OpenAPI 3.0 subset).\n * Inlines `$ref`, strips unsupported keywords, converts nullable unions to\n * `nullable: true`, collapses `anyOf` null branches, and coerces enum values to\n * strings. Use the `gemini-jsonschema` target for the richer\n * `parametersJsonSchema` route.\n */\nexport function toGemini(input: JSONSchema, options: GeminiOptions = {}): TransformResult {\n const warnings = new Warnings();\n const dereferenced = dereference(clone(input), warnings);\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n for (const kw of STRIP) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported by Gemini (route A); removed.`);\n }\n }\n\n s = collapseNullableUnion(s, path, warnings);\n s = mapChildren(s, path, transform);\n s = collapseAnyOf(s, path, warnings);\n coerceEnum(s, path, warnings);\n return s;\n };\n\n let schema = ensureObjectRoot(transform(dereferenced, '#'), warnings, 'Gemini');\n if (options.uppercaseTypes) schema = uppercaseTypes(schema);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Final pass: rewrite JSON Schema type names to Gemini's upper case enum. */\nfunction uppercaseTypes(node: JSONSchema): JSONSchema {\n if (!isPlainObject(node)) return node;\n const out: JSONSchema = { ...node };\n if (typeof out.type === 'string') {\n out.type = TYPE_UPPER[out.type] ?? out.type;\n } else if (Array.isArray(out.type)) {\n out.type = out.type.map((t) => TYPE_UPPER[t] ?? t);\n }\n return mapChildren(out, '#', (child) => uppercaseTypes(child));\n}\n\n/** Gemini route B (`parametersJsonSchema`): richer JSON Schema, object root only. */\nexport function toGeminiJsonSchema(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Gemini (parametersJsonSchema)');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Converts `type: ['string', 'null']` into `type: 'string', nullable: true`. */\nfunction collapseNullableUnion(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.type)) return node;\n const nonNull = node.type.filter((t) => t !== 'null');\n const hadNull = node.type.includes('null');\n const out: JSONSchema = { ...node };\n if (nonNull.length === 0) {\n out.type = 'string';\n } else {\n out.type = nonNull[0];\n if (nonNull.length > 1) {\n warnings.add(\n path,\n 'union-types',\n `Gemini cannot express a union of types [${nonNull.join(', ')}]; kept '${nonNull[0]}'.`,\n );\n }\n }\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted nullable type union into 'nullable: true'.\", false);\n }\n return out;\n}\n\n/** Removes `{ type: 'null' }` branches from `anyOf`, mapping them to `nullable`. */\nfunction collapseAnyOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.anyOf)) return node;\n const branches = node.anyOf as JSONSchema[];\n const nonNull = branches.filter((b) => !(typesOf(b).length === 1 && typesOf(b)[0] === 'null'));\n const hadNull = nonNull.length !== branches.length;\n const out: JSONSchema = { ...node };\n\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted an anyOf null branch into 'nullable: true'.\", false);\n }\n\n if (nonNull.length === 0) {\n delete out.anyOf;\n if (!out.type) out.type = 'string';\n } else if (nonNull.length === 1) {\n // Flatten a single remaining branch into the parent.\n delete out.anyOf;\n const branch = nonNull[0];\n for (const [k, v] of Object.entries(branch)) {\n if (k === 'description' && out.description) continue;\n out[k] = v;\n }\n } else {\n out.anyOf = nonNull;\n }\n return out;\n}\n\n/** Gemini enum values must be strings. Coerces and reports when they were not. */\nfunction coerceEnum(node: JSONSchema, path: string, warnings: Warnings): void {\n if (!Array.isArray(node.enum)) return;\n const allStrings = node.enum.every((v) => typeof v === 'string');\n if (!allStrings) {\n node.enum = node.enum.map((v) => String(v));\n warnings.add(`${path}/enum`, 'enum-coerced', 'Gemini enum values must be strings; coerced non string values.');\n }\n if (!node.type) node.type = 'string';\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * MCP (Model Context Protocol) tools. The most permissive target: `inputSchema`\n * is standard JSON Schema and the spec only requires the root to be an object.\n * All keywords are preserved.\n */\nexport function toMcp(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'MCP');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type {\n JSONSchema,\n LintResult,\n Target,\n ToolDefinition,\n ToolResult,\n ToolSchemaOptions,\n TransformResult,\n Warning,\n} from './types.js';\nimport { toOpenAI, toOpenAIStrict } from './targets/openai.js';\nimport { toAnthropic } from './targets/anthropic.js';\nimport { toGemini, toGeminiJsonSchema } from './targets/gemini.js';\nimport { toMcp } from './targets/mcp.js';\n\nconst EMPTY_OBJECT_SCHEMA: JSONSchema = { type: 'object', properties: {} };\n\n/**\n * Convert any JSON Schema into a schema that is valid for a provider's tool /\n * function calling parameters.\n *\n * @example\n * const { schema, warnings } = toToolSchema(mySchema, { target: 'openai-strict' });\n */\nexport function toToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): TransformResult {\n const target = options.target ?? 'openai';\n switch (target) {\n case 'openai':\n return toOpenAI(schema);\n case 'openai-strict':\n return toOpenAIStrict(schema);\n case 'anthropic':\n return toAnthropic(schema);\n case 'gemini':\n return toGemini(schema, { uppercaseTypes: options.geminiUppercaseTypes });\n case 'gemini-jsonschema':\n return toGeminiJsonSchema(schema);\n case 'mcp':\n return toMcp(schema);\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\n/**\n * Build a complete, provider shaped tool / function declaration: the right\n * wrapper keys (`function`, `input_schema`, `parameters`, `inputSchema`), the\n * converted parameter schema, and provider specific extras such as `strict` or\n * MCP `annotations`.\n */\nexport function toTool(def: ToolDefinition, options: ToolSchemaOptions = {}): ToolResult {\n const target = options.target ?? 'openai';\n const result = toToolSchema(def.schema ?? EMPTY_OBJECT_SCHEMA, options);\n const warnings: Warning[] = [...result.warnings];\n validateName(def.name, target, warnings);\n\n const tool = buildTool(def, result.schema, target, options);\n return { tool, warnings, lossy: result.lossy };\n}\n\n/**\n * Report what would change to make `schema` valid for a target, without\n * applying it. `ok` is true when the schema is already conformant.\n */\nexport function lintToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): LintResult {\n const { warnings } = toToolSchema(schema, options);\n return { ok: warnings.length === 0, issues: warnings };\n}\n\nfunction buildTool(\n def: ToolDefinition,\n schema: JSONSchema,\n target: Target,\n options: ToolSchemaOptions,\n): Record<string, unknown> {\n const { name, description } = def;\n\n switch (target) {\n case 'openai':\n case 'openai-strict': {\n const strict = target === 'openai-strict';\n if (options.openaiResponses) {\n return {\n type: 'function',\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n };\n }\n return {\n type: 'function',\n function: {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n },\n };\n }\n case 'anthropic':\n return {\n name,\n ...(description ? { description } : {}),\n input_schema: schema,\n ...(options.anthropicStrict ? { strict: true } : {}),\n };\n case 'gemini':\n return {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n };\n case 'gemini-jsonschema':\n return {\n name,\n ...(description ? { description } : {}),\n parametersJsonSchema: schema,\n };\n case 'mcp':\n return {\n name,\n ...(description ? { description } : {}),\n inputSchema: schema,\n ...(def.annotations ? { annotations: def.annotations } : {}),\n };\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\nconst NAME_RULES: Record<Target, { pattern: RegExp; label: string }> = {\n openai: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n 'openai-strict': { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n anthropic: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'Anthropic (letters, digits, _ and -, max 64)' },\n gemini: { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n 'gemini-jsonschema': { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n mcp: { pattern: /^[a-zA-Z0-9_-]{1,128}$/, label: 'MCP (letters, digits, _ and -)' },\n};\n\nfunction validateName(name: string, target: Target, warnings: Warning[]): void {\n const rule = NAME_RULES[target];\n if (!rule.pattern.test(name)) {\n warnings.push({\n path: '#/name',\n code: 'invalid-name',\n message: `Tool name '${name}' does not match the ${rule.label} naming rule.`,\n });\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/util.ts","../src/targets/openai.ts","../src/targets/anthropic.ts","../src/targets/gemini.ts","../src/targets/mcp.ts","../src/transform.ts","../src/adapters/ai-sdk.ts"],"sourcesContent":["export { toToolSchema, toTool, lintToolSchema } from './transform.js';\nexport { toAISDKTool, fromAISDKTool } from './adapters/ai-sdk.js';\nexport type {\n AISDKAdapterOptions,\n AISDKToolDefinition,\n JSONSchema,\n Target,\n Warning,\n WarningCode,\n TransformResult,\n ToolSchemaOptions,\n ToolDefinition,\n ToolResult,\n LintResult,\n McpAnnotations,\n} from './types.js';\n","import type { JSONSchema, Warning, WarningCode } from './types.js';\n\n/** Collects warnings and tracks whether the conversion lost information. */\nexport class Warnings {\n readonly list: Warning[] = [];\n lossy = false;\n\n add(path: string, code: WarningCode, message: string, lossy = true): void {\n this.list.push({ path, code, message });\n if (lossy) this.lossy = true;\n }\n}\n\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** A deep, structurally faithful clone. Uses the platform `structuredClone`. */\nexport function clone<T>(value: T): T {\n return structuredClone(value);\n}\n\n/** Returns the schema's declared types as an array (empty when untyped). */\nexport function typesOf(schema: JSONSchema): string[] {\n if (typeof schema.type === 'string') return [schema.type];\n if (Array.isArray(schema.type)) return schema.type.filter((t) => typeof t === 'string');\n return [];\n}\n\n/**\n * Heuristic: does this node describe an object? True when `type` is `object`\n * (or a union containing it) or when it is untyped but carries object keywords.\n */\nexport function isObjectSchema(schema: JSONSchema): boolean {\n const types = typesOf(schema);\n if (types.includes('object')) return true;\n if (types.length > 0) return false;\n return isPlainObject(schema.properties) || schema.additionalProperties !== undefined;\n}\n\n/**\n * Makes a schema accept `null`. Adds `null` to a string/array `type`, appends a\n * `{ type: 'null' }` branch to an `anyOf`, otherwise wraps the node in an\n * `anyOf` with a null branch. Used by OpenAI strict mode where every property\n * must be `required`, so optional fields are expressed as nullable instead.\n */\nexport function makeNullable(schema: JSONSchema): JSONSchema {\n if (typeof schema.type === 'string') {\n if (schema.type === 'null') return schema;\n return { ...schema, type: [schema.type, 'null'] };\n }\n if (Array.isArray(schema.type)) {\n if (schema.type.includes('null')) return schema;\n return { ...schema, type: [...schema.type, 'null'] };\n }\n if (Array.isArray(schema.anyOf)) {\n if (schema.anyOf.some((b) => typesOf(b).includes('null'))) return schema;\n return { ...schema, anyOf: [...schema.anyOf, { type: 'null' }] };\n }\n return { anyOf: [schema, { type: 'null' }] };\n}\n\n/**\n * Resolves local `$ref` pointers (`#/$defs/...` or `#/definitions/...`) by\n * inlining them. Non local refs are left untouched. Recursive refs are replaced\n * with an empty schema and reported, since target dialects that need inlining\n * (Gemini route A) cannot express recursion.\n */\nexport function dereference(root: JSONSchema, warnings: Warnings): JSONSchema {\n const defs: Record<string, JSONSchema> = {\n ...(isPlainObject(root.definitions) ? (root.definitions as Record<string, JSONSchema>) : {}),\n ...(isPlainObject(root.$defs) ? (root.$defs as Record<string, JSONSchema>) : {}),\n };\n\n const resolve = (ref: string): JSONSchema | undefined => {\n const m = /^#\\/(?:\\$defs|definitions)\\/(.+)$/.exec(ref);\n if (!m) return undefined;\n const key = decodeURIComponent(m[1].replace(/~1/g, '/').replace(/~0/g, '~'));\n return defs[key];\n };\n\n const walk = (node: JSONSchema, path: string, seen: Set<string>): JSONSchema => {\n if (!isPlainObject(node)) return node;\n if (typeof node.$ref === 'string') {\n const ref = node.$ref;\n const target = resolve(ref);\n if (!target) return node; // leave external / unknown refs in place\n if (seen.has(ref)) {\n warnings.add(path, 'recursive-ref', `Recursive $ref '${ref}' cannot be inlined; replaced with an open schema.`);\n return {};\n }\n const { $ref: _drop, ...rest } = node;\n void _drop;\n warnings.add(path, 'inlined-ref', `Inlined $ref '${ref}'.`, false);\n const merged = { ...clone(target), ...rest };\n return walk(merged, path, new Set([...seen, ref]));\n }\n return mapChildren(node, path, (child, childPath) => walk(child, childPath, seen));\n };\n\n const out = walk(clone(root), '#', new Set());\n delete out.$defs;\n delete out.definitions;\n return out;\n}\n\n/**\n * Applies `fn` to every direct sub schema of `node`, returning a new node. Walks\n * the standard applicator keywords. Leaf keywords are copied as is.\n */\nexport function mapChildren(\n node: JSONSchema,\n path: string,\n fn: (child: JSONSchema, childPath: string) => JSONSchema,\n): JSONSchema {\n const out: JSONSchema = { ...node };\n\n if (isPlainObject(out.properties)) {\n const props: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.properties as Record<string, JSONSchema>)) {\n props[k] = fn(v, `${path}/properties/${k}`);\n }\n out.properties = props;\n }\n\n if (Array.isArray(out.items)) {\n out.items = out.items.map((it, i) => fn(it, `${path}/items/${i}`));\n } else if (isPlainObject(out.items)) {\n out.items = fn(out.items as JSONSchema, `${path}/items`);\n }\n\n if (isPlainObject(out.additionalProperties)) {\n out.additionalProperties = fn(out.additionalProperties as JSONSchema, `${path}/additionalProperties`);\n }\n\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = out[key];\n if (Array.isArray(arr)) {\n out[key] = arr.map((b, i) => fn(b, `${path}/${key}/${i}`));\n }\n }\n\n if (isPlainObject(out.not)) out.not = fn(out.not as JSONSchema, `${path}/not`);\n for (const key of ['if', 'then', 'else'] as const) {\n if (isPlainObject(out[key])) out[key] = fn(out[key] as JSONSchema, `${path}/${key}`);\n }\n\n if (isPlainObject(out.patternProperties)) {\n const pp: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(out.patternProperties as Record<string, JSONSchema>)) {\n pp[k] = fn(v, `${path}/patternProperties/${k}`);\n }\n out.patternProperties = pp;\n }\n\n for (const key of ['$defs', 'definitions', 'dependentSchemas'] as const) {\n const map = out[key];\n if (isPlainObject(map)) {\n const next: Record<string, JSONSchema> = {};\n for (const [k, v] of Object.entries(map as Record<string, JSONSchema>)) {\n next[k] = fn(v as JSONSchema, `${path}/${key}/${k}`);\n }\n out[key] = next;\n }\n }\n\n return out;\n}\n\n/** Ensures the root is an object schema, reporting when it was not. */\nexport function ensureObjectRoot(schema: JSONSchema, warnings: Warnings, target: string): JSONSchema {\n if (isObjectSchema(schema)) {\n if (typesOf(schema).length === 0) return { type: 'object', ...schema };\n return schema;\n }\n warnings.add(\n '#',\n 'root-not-object',\n `${target} requires the root schema to be an object; wrapped the schema under a 'value' property.`,\n );\n return {\n type: 'object',\n properties: { value: schema },\n required: ['value'],\n };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport {\n Warnings,\n clone,\n isObjectSchema,\n isPlainObject,\n makeNullable,\n mapChildren,\n ensureObjectRoot,\n} from '../util.js';\n\n/** Formats OpenAI Structured Outputs accepts. Others are dropped in strict mode. */\nconst FORMAT_WHITELIST = new Set([\n 'date-time',\n 'time',\n 'date',\n 'duration',\n 'email',\n 'hostname',\n 'ipv4',\n 'ipv6',\n 'uuid',\n]);\n\n/** Keywords OpenAI strict mode rejects outright. */\nconst UNSUPPORTED = [\n 'not',\n 'if',\n 'then',\n 'else',\n 'dependentRequired',\n 'dependentSchemas',\n 'patternProperties',\n 'unevaluatedProperties',\n] as const;\n\nconst MAX_PROPERTIES = 5000;\nconst MAX_DEPTH = 10;\nconst MAX_ENUM_VALUES = 1000;\n\n/** OpenAI non strict: tool parameters should be an object, otherwise pass through. */\nexport function toOpenAI(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'OpenAI');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/**\n * OpenAI Structured Outputs / `strict: true`. Enforces: every object has\n * `additionalProperties: false`; every property is `required` (optional ones\n * become nullable); unsupported keywords are stripped; `allOf` is merged; only\n * whitelisted `format` values survive. `$defs` / `$ref` and `anyOf` are kept.\n */\nexport function toOpenAIStrict(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n if (Array.isArray(s.allOf)) {\n s = mergeAllOf(s, path, warnings);\n }\n\n for (const kw of UNSUPPORTED) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported in OpenAI strict mode; removed.`);\n }\n }\n\n if (typeof s.format === 'string' && !FORMAT_WHITELIST.has(s.format)) {\n warnings.add(\n `${path}/format`,\n 'unsupported-format',\n `format '${s.format}' is not in OpenAI's whitelist; removed.`,\n );\n delete s.format;\n }\n\n // Recurse into all sub schemas first (anyOf branches, items, $defs, ...).\n s = mapChildren(s, path, transform);\n\n if (isObjectSchema(s) && isPlainObject(s.properties)) {\n const props = s.properties as Record<string, JSONSchema>;\n const originalRequired = new Set(Array.isArray(s.required) ? s.required : []);\n const nextProps: Record<string, JSONSchema> = {};\n for (const key of Object.keys(props)) {\n let child = props[key];\n if (!originalRequired.has(key)) {\n child = makeNullable(child);\n warnings.add(\n `${path}/properties/${key}`,\n 'forced-required',\n `Optional property '${key}' was made required and nullable for OpenAI strict mode.`,\n );\n }\n nextProps[key] = child;\n }\n s.properties = nextProps;\n s.required = Object.keys(nextProps);\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' as required by strict mode.\",\n false,\n );\n }\n s.additionalProperties = false;\n } else if (isObjectSchema(s)) {\n // Object without declared properties: strict mode still forbids extra keys.\n if (s.additionalProperties !== false) {\n warnings.add(\n path,\n 'forced-additional-properties',\n \"Set 'additionalProperties: false' on a property-less object.\",\n false,\n );\n }\n s.additionalProperties = false;\n }\n\n return s;\n };\n\n const schema = ensureObjectRoot(transform(clone(input), '#'), warnings, 'OpenAI strict mode');\n checkLimits(schema, warnings);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Shallow merges `allOf` object subschemas into the parent, then drops `allOf`. */\nfunction mergeAllOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n const parts = node.allOf as JSONSchema[];\n const { allOf: _drop, ...base } = node;\n void _drop;\n const merged: JSONSchema = { ...base };\n const props: Record<string, JSONSchema> = isPlainObject(merged.properties)\n ? { ...(merged.properties as Record<string, JSONSchema>) }\n : {};\n const required = new Set<string>(Array.isArray(merged.required) ? merged.required : []);\n\n for (const part of parts) {\n if (!isPlainObject(part)) continue;\n if (isPlainObject(part.properties)) {\n Object.assign(props, part.properties);\n }\n if (Array.isArray(part.required)) {\n for (const r of part.required) required.add(r);\n }\n if (part.type && !merged.type) merged.type = part.type;\n }\n\n if (Object.keys(props).length > 0) merged.properties = props;\n if (required.size > 0) merged.required = [...required];\n if (!merged.type && (merged.properties || isObjectSchema(merged))) merged.type = 'object';\n warnings.add(path, 'merged-allof', \"Merged 'allOf' subschemas into the parent (unsupported in strict mode).\");\n return merged;\n}\n\nfunction checkLimits(schema: JSONSchema, warnings: Warnings): void {\n let propertyCount = 0;\n let maxDepth = 0;\n\n const visit = (node: JSONSchema, depth: number): void => {\n if (!isPlainObject(node)) return;\n maxDepth = Math.max(maxDepth, depth);\n if (isPlainObject(node.properties)) {\n const keys = Object.keys(node.properties as Record<string, JSONSchema>);\n propertyCount += keys.length;\n }\n if (Array.isArray(node.enum) && node.enum.length > MAX_ENUM_VALUES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `An enum has ${node.enum.length} values; OpenAI allows at most ${MAX_ENUM_VALUES}.`,\n false,\n );\n }\n const children = collectChildren(node);\n for (const c of children) visit(c, depth + 1);\n };\n\n visit(schema, 0);\n if (propertyCount > MAX_PROPERTIES) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema has ${propertyCount} object properties; OpenAI allows at most ${MAX_PROPERTIES}.`,\n false,\n );\n }\n if (maxDepth > MAX_DEPTH) {\n warnings.add(\n '#',\n 'limit-exceeded',\n `Schema nests ${maxDepth} levels deep; OpenAI allows at most ${MAX_DEPTH}.`,\n false,\n );\n }\n}\n\nfunction collectChildren(node: JSONSchema): JSONSchema[] {\n const out: JSONSchema[] = [];\n if (isPlainObject(node.properties)) out.push(...Object.values(node.properties as Record<string, JSONSchema>));\n if (Array.isArray(node.items)) out.push(...node.items);\n else if (isPlainObject(node.items)) out.push(node.items as JSONSchema);\n for (const key of ['anyOf', 'oneOf', 'allOf'] as const) {\n const arr = node[key];\n if (Array.isArray(arr)) out.push(...arr);\n }\n if (isPlainObject(node.$defs)) out.push(...Object.values(node.$defs as Record<string, JSONSchema>));\n return out.filter(isPlainObject) as JSONSchema[];\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * Anthropic tool use. The API is permissive: it accepts standard JSON Schema for\n * `input_schema` (anyOf, oneOf, allOf, $ref, format, pattern, ...). The only hard\n * requirement is that the root is an object, so that is all we enforce.\n */\nexport function toAnthropic(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Anthropic');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, dereference, ensureObjectRoot, isPlainObject, mapChildren, typesOf } from '../util.js';\n\n/**\n * Keywords absent from Gemini's `Schema` proto (route A). Sending them either\n * errors or is silently ignored, so they are stripped.\n */\nconst STRIP = [\n '$schema',\n '$id',\n '$anchor',\n '$ref',\n 'oneOf',\n 'allOf',\n 'not',\n 'if',\n 'then',\n 'else',\n 'additionalProperties',\n 'patternProperties',\n 'unevaluatedProperties',\n 'const',\n 'dependentRequired',\n 'dependentSchemas',\n 'multipleOf',\n 'exclusiveMinimum',\n 'exclusiveMaximum',\n 'uniqueItems',\n 'contentEncoding',\n 'contentMediaType',\n '$defs',\n 'definitions',\n] as const;\n\nconst TYPE_UPPER: Record<string, string> = {\n string: 'STRING',\n number: 'NUMBER',\n integer: 'INTEGER',\n boolean: 'BOOLEAN',\n array: 'ARRAY',\n object: 'OBJECT',\n null: 'NULL',\n};\n\ninterface GeminiOptions {\n uppercaseTypes?: boolean;\n}\n\n/**\n * Gemini function calling, route A (`parameters` as an OpenAPI 3.0 subset).\n * Inlines `$ref`, strips unsupported keywords, converts nullable unions to\n * `nullable: true`, collapses `anyOf` null branches, and coerces enum values to\n * strings. Use the `gemini-jsonschema` target for the richer\n * `parametersJsonSchema` route.\n */\nexport function toGemini(input: JSONSchema, options: GeminiOptions = {}): TransformResult {\n const warnings = new Warnings();\n const dereferenced = dereference(clone(input), warnings);\n\n const transform = (node: JSONSchema, path: string): JSONSchema => {\n if (!isPlainObject(node)) return node;\n let s: JSONSchema = { ...node };\n\n for (const kw of STRIP) {\n if (kw in s) {\n delete s[kw];\n warnings.add(path, 'stripped-keyword', `'${kw}' is not supported by Gemini (route A); removed.`);\n }\n }\n\n s = collapseNullableUnion(s, path, warnings);\n s = mapChildren(s, path, transform);\n s = collapseAnyOf(s, path, warnings);\n coerceEnum(s, path, warnings);\n return s;\n };\n\n let schema = ensureObjectRoot(transform(dereferenced, '#'), warnings, 'Gemini');\n if (options.uppercaseTypes) schema = uppercaseTypes(schema);\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Final pass: rewrite JSON Schema type names to Gemini's upper case enum. */\nfunction uppercaseTypes(node: JSONSchema): JSONSchema {\n if (!isPlainObject(node)) return node;\n const out: JSONSchema = { ...node };\n if (typeof out.type === 'string') {\n out.type = TYPE_UPPER[out.type] ?? out.type;\n } else if (Array.isArray(out.type)) {\n out.type = out.type.map((t) => TYPE_UPPER[t] ?? t);\n }\n return mapChildren(out, '#', (child) => uppercaseTypes(child));\n}\n\n/** Gemini route B (`parametersJsonSchema`): richer JSON Schema, object root only. */\nexport function toGeminiJsonSchema(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'Gemini (parametersJsonSchema)');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n\n/** Converts `type: ['string', 'null']` into `type: 'string', nullable: true`. */\nfunction collapseNullableUnion(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.type)) return node;\n const nonNull = node.type.filter((t) => t !== 'null');\n const hadNull = node.type.includes('null');\n const out: JSONSchema = { ...node };\n if (nonNull.length === 0) {\n out.type = 'string';\n } else {\n out.type = nonNull[0];\n if (nonNull.length > 1) {\n warnings.add(\n path,\n 'union-types',\n `Gemini cannot express a union of types [${nonNull.join(', ')}]; kept '${nonNull[0]}'.`,\n );\n }\n }\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted nullable type union into 'nullable: true'.\", false);\n }\n return out;\n}\n\n/** Removes `{ type: 'null' }` branches from `anyOf`, mapping them to `nullable`. */\nfunction collapseAnyOf(node: JSONSchema, path: string, warnings: Warnings): JSONSchema {\n if (!Array.isArray(node.anyOf)) return node;\n const branches = node.anyOf as JSONSchema[];\n const nonNull = branches.filter((b) => !(typesOf(b).length === 1 && typesOf(b)[0] === 'null'));\n const hadNull = nonNull.length !== branches.length;\n const out: JSONSchema = { ...node };\n\n if (hadNull) {\n out.nullable = true;\n warnings.add(path, 'collapsed-nullable', \"Converted an anyOf null branch into 'nullable: true'.\", false);\n }\n\n if (nonNull.length === 0) {\n delete out.anyOf;\n if (!out.type) out.type = 'string';\n } else if (nonNull.length === 1) {\n // Flatten a single remaining branch into the parent.\n delete out.anyOf;\n const branch = nonNull[0];\n for (const [k, v] of Object.entries(branch)) {\n if (k === 'description' && out.description) continue;\n out[k] = v;\n }\n } else {\n out.anyOf = nonNull;\n }\n return out;\n}\n\n/** Gemini enum values must be strings. Coerces and reports when they were not. */\nfunction coerceEnum(node: JSONSchema, path: string, warnings: Warnings): void {\n if (!Array.isArray(node.enum)) return;\n const allStrings = node.enum.every((v) => typeof v === 'string');\n if (!allStrings) {\n node.enum = node.enum.map((v) => String(v));\n warnings.add(`${path}/enum`, 'enum-coerced', 'Gemini enum values must be strings; coerced non string values.');\n }\n if (!node.type) node.type = 'string';\n}\n","import type { JSONSchema, TransformResult } from '../types.js';\nimport { Warnings, clone, ensureObjectRoot } from '../util.js';\n\n/**\n * MCP (Model Context Protocol) tools. The most permissive input target:\n * `inputSchema` is standard JSON Schema and the spec only requires the root to\n * be an object. All input keywords are preserved. MCP `outputSchema` is handled\n * at the tool envelope layer because it describes `structuredContent` and does\n * not share the input object-root constraint.\n */\nexport function toMcp(input: JSONSchema): TransformResult {\n const warnings = new Warnings();\n const schema = ensureObjectRoot(clone(input), warnings, 'MCP');\n return { schema, warnings: warnings.list, lossy: warnings.lossy };\n}\n","import type {\n JSONSchema,\n LintResult,\n Target,\n ToolDefinition,\n ToolResult,\n ToolSchemaOptions,\n TransformResult,\n Warning,\n} from './types.js';\nimport { toOpenAI, toOpenAIStrict } from './targets/openai.js';\nimport { toAnthropic } from './targets/anthropic.js';\nimport { toGemini, toGeminiJsonSchema } from './targets/gemini.js';\nimport { toMcp } from './targets/mcp.js';\nimport { clone } from './util.js';\n\nconst EMPTY_OBJECT_SCHEMA: JSONSchema = { type: 'object', properties: {} };\n\n/**\n * Convert any JSON Schema into a schema that is valid for a provider's tool /\n * function calling parameters.\n *\n * @example\n * const { schema, warnings } = toToolSchema(mySchema, { target: 'openai-strict' });\n */\nexport function toToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): TransformResult {\n const target = options.target ?? 'openai';\n switch (target) {\n case 'openai':\n return toOpenAI(schema);\n case 'openai-strict':\n return toOpenAIStrict(schema);\n case 'anthropic':\n return toAnthropic(schema);\n case 'gemini':\n return toGemini(schema, { uppercaseTypes: options.geminiUppercaseTypes });\n case 'gemini-jsonschema':\n return toGeminiJsonSchema(schema);\n case 'mcp':\n return toMcp(schema);\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\n/**\n * Build a complete, provider shaped tool / function declaration: the right\n * wrapper keys (`function`, `input_schema`, `parameters`, `inputSchema`), the\n * converted parameter schema, and provider specific extras such as `strict` or\n * MCP `annotations`.\n */\nexport function toTool(def: ToolDefinition, options: ToolSchemaOptions = {}): ToolResult {\n const target = options.target ?? 'openai';\n const result = toToolSchema(def.schema ?? EMPTY_OBJECT_SCHEMA, options);\n const warnings: Warning[] = [...result.warnings];\n validateName(def.name, target, warnings);\n\n const tool = buildTool(def, result.schema, target, options);\n return { tool, warnings, lossy: result.lossy };\n}\n\n/**\n * Report what would change to make `schema` valid for a target, without\n * applying it. `ok` is true when the schema is already conformant.\n */\nexport function lintToolSchema(schema: JSONSchema, options: ToolSchemaOptions = {}): LintResult {\n const { warnings } = toToolSchema(schema, options);\n return { ok: warnings.length === 0, issues: warnings };\n}\n\nfunction buildTool(\n def: ToolDefinition,\n schema: JSONSchema,\n target: Target,\n options: ToolSchemaOptions,\n): Record<string, unknown> {\n const { name, description } = def;\n\n switch (target) {\n case 'openai':\n case 'openai-strict': {\n const strict = target === 'openai-strict';\n if (options.openaiResponses) {\n return {\n type: 'function',\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n };\n }\n return {\n type: 'function',\n function: {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n ...(strict ? { strict: true } : {}),\n },\n };\n }\n case 'anthropic':\n return {\n name,\n ...(description ? { description } : {}),\n input_schema: schema,\n ...(options.anthropicStrict ? { strict: true } : {}),\n };\n case 'gemini':\n return {\n name,\n ...(description ? { description } : {}),\n parameters: schema,\n };\n case 'gemini-jsonschema':\n return {\n name,\n ...(description ? { description } : {}),\n parametersJsonSchema: schema,\n };\n case 'mcp':\n return {\n name,\n ...(description ? { description } : {}),\n inputSchema: schema,\n ...(def.outputSchema ? { outputSchema: clone(def.outputSchema) } : {}),\n ...(def.annotations ? { annotations: def.annotations } : {}),\n };\n default:\n throw new Error(`Unknown target: ${String(target satisfies never)}`);\n }\n}\n\nconst NAME_RULES: Record<Target, { pattern: RegExp; label: string }> = {\n openai: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n 'openai-strict': { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'OpenAI (letters, digits, _ and -, max 64)' },\n anthropic: { pattern: /^[a-zA-Z0-9_-]{1,64}$/, label: 'Anthropic (letters, digits, _ and -, max 64)' },\n gemini: { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n 'gemini-jsonschema': { pattern: /^[a-zA-Z0-9_:.-]{1,128}$/, label: 'Gemini (letters, digits, _ : . -, max 128)' },\n mcp: { pattern: /^[a-zA-Z0-9_-]{1,128}$/, label: 'MCP (letters, digits, _ and -)' },\n};\n\nfunction validateName(name: string, target: Target, warnings: Warning[]): void {\n const rule = NAME_RULES[target];\n if (!rule.pattern.test(name)) {\n warnings.push({\n path: '#/name',\n code: 'invalid-name',\n message: `Tool name '${name}' does not match the ${rule.label} naming rule.`,\n });\n }\n}\n","import type { AISDKAdapterOptions, AISDKToolDefinition, JSONSchema, ToolDefinition, ToolResult } from '../types.js';\nimport { toTool, toToolSchema } from '../transform.js';\nimport { clone, isPlainObject } from '../util.js';\n\nconst EMPTY_OBJECT_SCHEMA: JSONSchema = { type: 'object', properties: {} };\n\n/**\n * Build a Vercel AI SDK tool definition from a `tool-schema` definition.\n *\n * AI SDK v5 expects `{ description?, inputSchema, strict? }`. Pass\n * `aiSDKParameters: true` for the legacy AI SDK v4 `{ parameters }` key.\n */\nexport function toAISDKTool(def: ToolDefinition, options: AISDKAdapterOptions = {}): ToolResult {\n const result = toToolSchema(def.schema ?? EMPTY_OBJECT_SCHEMA, options);\n const schemaKey = options.aiSDKParameters ? 'parameters' : 'inputSchema';\n\n return {\n tool: {\n ...(def.description ? { description: def.description } : {}),\n [schemaKey]: result.schema,\n ...(options.target === 'openai-strict' ? { strict: true } : {}),\n },\n warnings: result.warnings,\n lossy: result.lossy,\n };\n}\n\n/**\n * Convert a Vercel AI SDK tool definition into any provider-specific tool shape.\n *\n * The tool name comes from the key in the AI SDK `tools` object:\n * `fromAISDKTool('get_weather', tools.get_weather, { target: 'openai-strict' })`.\n */\nexport function fromAISDKTool(name: string, aiTool: AISDKToolDefinition, options: AISDKAdapterOptions = {}): ToolResult {\n if (!isPlainObject(aiTool)) {\n throw new TypeError('fromAISDKTool expected an AI SDK tool object.');\n }\n\n const rawSchema = aiTool.inputSchema ?? aiTool.parameters ?? EMPTY_OBJECT_SCHEMA;\n const schema = toJSONSchema(rawSchema, options);\n const target = aiTool.strict === true && (options.target ?? 'openai') === 'openai' ? 'openai-strict' : options.target;\n\n return toTool(\n {\n name,\n ...(typeof aiTool.description === 'string' ? { description: aiTool.description } : {}),\n schema,\n },\n { ...options, target },\n );\n}\n\nfunction toJSONSchema(value: unknown, options: AISDKAdapterOptions): JSONSchema {\n if (isProbablyZodSchema(value)) {\n if (options.zodToJsonSchema) {\n return assertJSONSchema(options.zodToJsonSchema(value));\n }\n throw new TypeError(\n 'AI SDK tool schema looks like a Zod/Standard Schema object. tool-schema has zero dependencies; pass zodToJsonSchema: z.toJSONSchema or pass JSON Schema directly.',\n );\n }\n\n if (isPlainObject(value) && typeof value.toJSONSchema === 'function') {\n return assertJSONSchema((value.toJSONSchema as () => unknown)());\n }\n\n return assertJSONSchema(value);\n}\n\nfunction assertJSONSchema(value: unknown): JSONSchema {\n if (!isPlainObject(value)) {\n throw new TypeError('Expected a JSON Schema object for the AI SDK tool input schema.');\n }\n return clone(value as JSONSchema);\n}\n\nfunction isProbablyZodSchema(value: unknown): value is Record<string, unknown> {\n if (!isPlainObject(value)) return false;\n return '_def' in value || '_zod' in value || '~standard' in value;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACGO,IAAM,WAAN,MAAe;AAAA,EACX,OAAkB,CAAC;AAAA,EAC5B,QAAQ;AAAA,EAER,IAAI,MAAc,MAAmB,SAAiB,QAAQ,MAAY;AACxE,SAAK,KAAK,KAAK,EAAE,MAAM,MAAM,QAAQ,CAAC;AACtC,QAAI,MAAO,MAAK,QAAQ;AAAA,EAC1B;AACF;AAEO,SAAS,cAAc,OAAkD;AAC9E,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAGO,SAAS,MAAS,OAAa;AACpC,SAAO,gBAAgB,KAAK;AAC9B;AAGO,SAAS,QAAQ,QAA8B;AACpD,MAAI,OAAO,OAAO,SAAS,SAAU,QAAO,CAAC,OAAO,IAAI;AACxD,MAAI,MAAM,QAAQ,OAAO,IAAI,EAAG,QAAO,OAAO,KAAK,OAAO,CAAC,MAAM,OAAO,MAAM,QAAQ;AACtF,SAAO,CAAC;AACV;AAMO,SAAS,eAAe,QAA6B;AAC1D,QAAM,QAAQ,QAAQ,MAAM;AAC5B,MAAI,MAAM,SAAS,QAAQ,EAAG,QAAO;AACrC,MAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,SAAO,cAAc,OAAO,UAAU,KAAK,OAAO,yBAAyB;AAC7E;AAQO,SAAS,aAAa,QAAgC;AAC3D,MAAI,OAAO,OAAO,SAAS,UAAU;AACnC,QAAI,OAAO,SAAS,OAAQ,QAAO;AACnC,WAAO,EAAE,GAAG,QAAQ,MAAM,CAAC,OAAO,MAAM,MAAM,EAAE;AAAA,EAClD;AACA,MAAI,MAAM,QAAQ,OAAO,IAAI,GAAG;AAC9B,QAAI,OAAO,KAAK,SAAS,MAAM,EAAG,QAAO;AACzC,WAAO,EAAE,GAAG,QAAQ,MAAM,CAAC,GAAG,OAAO,MAAM,MAAM,EAAE;AAAA,EACrD;AACA,MAAI,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/B,QAAI,OAAO,MAAM,KAAK,CAAC,MAAM,QAAQ,CAAC,EAAE,SAAS,MAAM,CAAC,EAAG,QAAO;AAClE,WAAO,EAAE,GAAG,QAAQ,OAAO,CAAC,GAAG,OAAO,OAAO,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,EACjE;AACA,SAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,EAAE;AAC7C;AAQO,SAAS,YAAY,MAAkB,UAAgC;AAC5E,QAAM,OAAmC;AAAA,IACvC,GAAI,cAAc,KAAK,WAAW,IAAK,KAAK,cAA6C,CAAC;AAAA,IAC1F,GAAI,cAAc,KAAK,KAAK,IAAK,KAAK,QAAuC,CAAC;AAAA,EAChF;AAEA,QAAM,UAAU,CAAC,QAAwC;AACvD,UAAM,IAAI,oCAAoC,KAAK,GAAG;AACtD,QAAI,CAAC,EAAG,QAAO;AACf,UAAM,MAAM,mBAAmB,EAAE,CAAC,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,OAAO,GAAG,CAAC;AAC3E,WAAO,KAAK,GAAG;AAAA,EACjB;AAEA,QAAM,OAAO,CAAC,MAAkB,MAAc,SAAkC;AAC9E,QAAI,CAAC,cAAc,IAAI,EAAG,QAAO;AACjC,QAAI,OAAO,KAAK,SAAS,UAAU;AACjC,YAAM,MAAM,KAAK;AACjB,YAAM,SAAS,QAAQ,GAAG;AAC1B,UAAI,CAAC,OAAQ,QAAO;AACpB,UAAI,KAAK,IAAI,GAAG,GAAG;AACjB,iBAAS,IAAI,MAAM,iBAAiB,mBAAmB,GAAG,oDAAoD;AAC9G,eAAO,CAAC;AAAA,MACV;AACA,YAAM,EAAE,MAAM,OAAO,GAAG,KAAK,IAAI;AACjC,WAAK;AACL,eAAS,IAAI,MAAM,eAAe,iBAAiB,GAAG,MAAM,KAAK;AACjE,YAAM,SAAS,EAAE,GAAG,MAAM,MAAM,GAAG,GAAG,KAAK;AAC3C,aAAO,KAAK,QAAQ,MAAM,oBAAI,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;AAAA,IACnD;AACA,WAAO,YAAY,MAAM,MAAM,CAAC,OAAO,cAAc,KAAK,OAAO,WAAW,IAAI,CAAC;AAAA,EACnF;AAEA,QAAM,MAAM,KAAK,MAAM,IAAI,GAAG,KAAK,oBAAI,IAAI,CAAC;AAC5C,SAAO,IAAI;AACX,SAAO,IAAI;AACX,SAAO;AACT;AAMO,SAAS,YACd,MACA,MACA,IACY;AACZ,QAAM,MAAkB,EAAE,GAAG,KAAK;AAElC,MAAI,cAAc,IAAI,UAAU,GAAG;AACjC,UAAM,QAAoC,CAAC;AAC3C,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,UAAwC,GAAG;AACjF,YAAM,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE;AAAA,IAC5C;AACA,QAAI,aAAa;AAAA,EACnB;AAEA,MAAI,MAAM,QAAQ,IAAI,KAAK,GAAG;AAC5B,QAAI,QAAQ,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC;AAAA,EACnE,WAAW,cAAc,IAAI,KAAK,GAAG;AACnC,QAAI,QAAQ,GAAG,IAAI,OAAqB,GAAG,IAAI,QAAQ;AAAA,EACzD;AAEA,MAAI,cAAc,IAAI,oBAAoB,GAAG;AAC3C,QAAI,uBAAuB,GAAG,IAAI,sBAAoC,GAAG,IAAI,uBAAuB;AAAA,EACtG;AAEA,aAAW,OAAO,CAAC,SAAS,SAAS,OAAO,GAAY;AACtD,UAAM,MAAM,IAAI,GAAG;AACnB,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAI,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,MAAI,cAAc,IAAI,GAAG,EAAG,KAAI,MAAM,GAAG,IAAI,KAAmB,GAAG,IAAI,MAAM;AAC7E,aAAW,OAAO,CAAC,MAAM,QAAQ,MAAM,GAAY;AACjD,QAAI,cAAc,IAAI,GAAG,CAAC,EAAG,KAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAiB,GAAG,IAAI,IAAI,GAAG,EAAE;AAAA,EACrF;AAEA,MAAI,cAAc,IAAI,iBAAiB,GAAG;AACxC,UAAM,KAAiC,CAAC;AACxC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,iBAA+C,GAAG;AACxF,SAAG,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,sBAAsB,CAAC,EAAE;AAAA,IAChD;AACA,QAAI,oBAAoB;AAAA,EAC1B;AAEA,aAAW,OAAO,CAAC,SAAS,eAAe,kBAAkB,GAAY;AACvE,UAAM,MAAM,IAAI,GAAG;AACnB,QAAI,cAAc,GAAG,GAAG;AACtB,YAAM,OAAmC,CAAC;AAC1C,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAiC,GAAG;AACtE,aAAK,CAAC,IAAI,GAAG,GAAiB,GAAG,IAAI,IAAI,GAAG,IAAI,CAAC,EAAE;AAAA,MACrD;AACA,UAAI,GAAG,IAAI;AAAA,IACb;AAAA,EACF;AAEA,SAAO;AACT;AAGO,SAAS,iBAAiB,QAAoB,UAAoB,QAA4B;AACnG,MAAI,eAAe,MAAM,GAAG;AAC1B,QAAI,QAAQ,MAAM,EAAE,WAAW,EAAG,QAAO,EAAE,MAAM,UAAU,GAAG,OAAO;AACrE,WAAO;AAAA,EACT;AACA,WAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA,GAAG,MAAM;AAAA,EACX;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,YAAY,EAAE,OAAO,OAAO;AAAA,IAC5B,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;;;AC7KA,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAiB;AACvB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AAGjB,SAAS,SAAS,OAAoC;AAC3D,QAAM,WAAW,IAAI,SAAS;AAC9B,QAAM,SAAS,iBAAiB,MAAM,KAAK,GAAG,UAAU,QAAQ;AAChE,SAAO,EAAE,QAAQ,UAAU,SAAS,MAAM,OAAO,SAAS,MAAM;AAClE;AAQO,SAAS,eAAe,OAAoC;AACjE,QAAM,WAAW,IAAI,SAAS;AAE9B,QAAM,YAAY,CAAC,MAAkB,SAA6B;AAChE,QAAI,CAAC,cAAc,IAAI,EAAG,QAAO;AACjC,QAAI,IAAgB,EAAE,GAAG,KAAK;AAE9B,QAAI,MAAM,QAAQ,EAAE,KAAK,GAAG;AAC1B,UAAI,WAAW,GAAG,MAAM,QAAQ;AAAA,IAClC;AAEA,eAAW,MAAM,aAAa;AAC5B,UAAI,MAAM,GAAG;AACX,eAAO,EAAE,EAAE;AACX,iBAAS,IAAI,MAAM,oBAAoB,IAAI,EAAE,oDAAoD;AAAA,MACnG;AAAA,IACF;AAEA,QAAI,OAAO,EAAE,WAAW,YAAY,CAAC,iBAAiB,IAAI,EAAE,MAAM,GAAG;AACnE,eAAS;AAAA,QACP,GAAG,IAAI;AAAA,QACP;AAAA,QACA,WAAW,EAAE,MAAM;AAAA,MACrB;AACA,aAAO,EAAE;AAAA,IACX;AAGA,QAAI,YAAY,GAAG,MAAM,SAAS;AAElC,QAAI,eAAe,CAAC,KAAK,cAAc,EAAE,UAAU,GAAG;AACpD,YAAM,QAAQ,EAAE;AAChB,YAAM,mBAAmB,IAAI,IAAI,MAAM,QAAQ,EAAE,QAAQ,IAAI,EAAE,WAAW,CAAC,CAAC;AAC5E,YAAM,YAAwC,CAAC;AAC/C,iBAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,YAAI,QAAQ,MAAM,GAAG;AACrB,YAAI,CAAC,iBAAiB,IAAI,GAAG,GAAG;AAC9B,kBAAQ,aAAa,KAAK;AAC1B,mBAAS;AAAA,YACP,GAAG,IAAI,eAAe,GAAG;AAAA,YACzB;AAAA,YACA,sBAAsB,GAAG;AAAA,UAC3B;AAAA,QACF;AACA,kBAAU,GAAG,IAAI;AAAA,MACnB;AACA,QAAE,aAAa;AACf,QAAE,WAAW,OAAO,KAAK,SAAS;AAClC,UAAI,EAAE,yBAAyB,OAAO;AACpC,iBAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,QAAE,uBAAuB;AAAA,IAC3B,WAAW,eAAe,CAAC,GAAG;AAE5B,UAAI,EAAE,yBAAyB,OAAO;AACpC,iBAAS;AAAA,UACP;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA,QAAE,uBAAuB;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,iBAAiB,UAAU,MAAM,KAAK,GAAG,GAAG,GAAG,UAAU,oBAAoB;AAC5F,cAAY,QAAQ,QAAQ;AAC5B,SAAO,EAAE,QAAQ,UAAU,SAAS,MAAM,OAAO,SAAS,MAAM;AAClE;AAGA,SAAS,WAAW,MAAkB,MAAc,UAAgC;AAClF,QAAM,QAAQ,KAAK;AACnB,QAAM,EAAE,OAAO,OAAO,GAAG,KAAK,IAAI;AAClC,OAAK;AACL,QAAM,SAAqB,EAAE,GAAG,KAAK;AACrC,QAAM,QAAoC,cAAc,OAAO,UAAU,IACrE,EAAE,GAAI,OAAO,WAA0C,IACvD,CAAC;AACL,QAAM,WAAW,IAAI,IAAY,MAAM,QAAQ,OAAO,QAAQ,IAAI,OAAO,WAAW,CAAC,CAAC;AAEtF,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,cAAc,IAAI,EAAG;AAC1B,QAAI,cAAc,KAAK,UAAU,GAAG;AAClC,aAAO,OAAO,OAAO,KAAK,UAAU;AAAA,IACtC;AACA,QAAI,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAChC,iBAAW,KAAK,KAAK,SAAU,UAAS,IAAI,CAAC;AAAA,IAC/C;AACA,QAAI,KAAK,QAAQ,CAAC,OAAO,KAAM,QAAO,OAAO,KAAK;AAAA,EACpD;AAEA,MAAI,OAAO,KAAK,KAAK,EAAE,SAAS,EAAG,QAAO,aAAa;AACvD,MAAI,SAAS,OAAO,EAAG,QAAO,WAAW,CAAC,GAAG,QAAQ;AACrD,MAAI,CAAC,OAAO,SAAS,OAAO,cAAc,eAAe,MAAM,GAAI,QAAO,OAAO;AACjF,WAAS,IAAI,MAAM,gBAAgB,yEAAyE;AAC5G,SAAO;AACT;AAEA,SAAS,YAAY,QAAoB,UAA0B;AACjE,MAAI,gBAAgB;AACpB,MAAI,WAAW;AAEf,QAAM,QAAQ,CAAC,MAAkB,UAAwB;AACvD,QAAI,CAAC,cAAc,IAAI,EAAG;AAC1B,eAAW,KAAK,IAAI,UAAU,KAAK;AACnC,QAAI,cAAc,KAAK,UAAU,GAAG;AAClC,YAAM,OAAO,OAAO,KAAK,KAAK,UAAwC;AACtE,uBAAiB,KAAK;AAAA,IACxB;AACA,QAAI,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,iBAAiB;AAClE,eAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA,eAAe,KAAK,KAAK,MAAM,kCAAkC,eAAe;AAAA,QAChF;AAAA,MACF;AAAA,IACF;AACA,UAAM,WAAW,gBAAgB,IAAI;AACrC,eAAW,KAAK,SAAU,OAAM,GAAG,QAAQ,CAAC;AAAA,EAC9C;AAEA,QAAM,QAAQ,CAAC;AACf,MAAI,gBAAgB,gBAAgB;AAClC,aAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA,cAAc,aAAa,6CAA6C,cAAc;AAAA,MACtF;AAAA,IACF;AAAA,EACF;AACA,MAAI,WAAW,WAAW;AACxB,aAAS;AAAA,MACP;AAAA,MACA;AAAA,MACA,gBAAgB,QAAQ,uCAAuC,SAAS;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAAgC;AACvD,QAAM,MAAoB,CAAC;AAC3B,MAAI,cAAc,KAAK,UAAU,EAAG,KAAI,KAAK,GAAG,OAAO,OAAO,KAAK,UAAwC,CAAC;AAC5G,MAAI,MAAM,QAAQ,KAAK,KAAK,EAAG,KAAI,KAAK,GAAG,KAAK,KAAK;AAAA,WAC5C,cAAc,KAAK,KAAK,EAAG,KAAI,KAAK,KAAK,KAAmB;AACrE,aAAW,OAAO,CAAC,SAAS,SAAS,OAAO,GAAY;AACtD,UAAM,MAAM,KAAK,GAAG;AACpB,QAAI,MAAM,QAAQ,GAAG,EAAG,KAAI,KAAK,GAAG,GAAG;AAAA,EACzC;AACA,MAAI,cAAc,KAAK,KAAK,EAAG,KAAI,KAAK,GAAG,OAAO,OAAO,KAAK,KAAmC,CAAC;AAClG,SAAO,IAAI,OAAO,aAAa;AACjC;;;AC7MO,SAAS,YAAY,OAAoC;AAC9D,QAAM,WAAW,IAAI,SAAS;AAC9B,QAAM,SAAS,iBAAiB,MAAM,KAAK,GAAG,UAAU,WAAW;AACnE,SAAO,EAAE,QAAQ,UAAU,SAAS,MAAM,OAAO,SAAS,MAAM;AAClE;;;ACLA,IAAM,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,aAAqC;AAAA,EACzC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AACR;AAaO,SAAS,SAAS,OAAmB,UAAyB,CAAC,GAAoB;AACxF,QAAM,WAAW,IAAI,SAAS;AAC9B,QAAM,eAAe,YAAY,MAAM,KAAK,GAAG,QAAQ;AAEvD,QAAM,YAAY,CAAC,MAAkB,SAA6B;AAChE,QAAI,CAAC,cAAc,IAAI,EAAG,QAAO;AACjC,QAAI,IAAgB,EAAE,GAAG,KAAK;AAE9B,eAAW,MAAM,OAAO;AACtB,UAAI,MAAM,GAAG;AACX,eAAO,EAAE,EAAE;AACX,iBAAS,IAAI,MAAM,oBAAoB,IAAI,EAAE,kDAAkD;AAAA,MACjG;AAAA,IACF;AAEA,QAAI,sBAAsB,GAAG,MAAM,QAAQ;AAC3C,QAAI,YAAY,GAAG,MAAM,SAAS;AAClC,QAAI,cAAc,GAAG,MAAM,QAAQ;AACnC,eAAW,GAAG,MAAM,QAAQ;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,iBAAiB,UAAU,cAAc,GAAG,GAAG,UAAU,QAAQ;AAC9E,MAAI,QAAQ,eAAgB,UAAS,eAAe,MAAM;AAC1D,SAAO,EAAE,QAAQ,UAAU,SAAS,MAAM,OAAO,SAAS,MAAM;AAClE;AAGA,SAAS,eAAe,MAA8B;AACpD,MAAI,CAAC,cAAc,IAAI,EAAG,QAAO;AACjC,QAAM,MAAkB,EAAE,GAAG,KAAK;AAClC,MAAI,OAAO,IAAI,SAAS,UAAU;AAChC,QAAI,OAAO,WAAW,IAAI,IAAI,KAAK,IAAI;AAAA,EACzC,WAAW,MAAM,QAAQ,IAAI,IAAI,GAAG;AAClC,QAAI,OAAO,IAAI,KAAK,IAAI,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC;AAAA,EACnD;AACA,SAAO,YAAY,KAAK,KAAK,CAAC,UAAU,eAAe,KAAK,CAAC;AAC/D;AAGO,SAAS,mBAAmB,OAAoC;AACrE,QAAM,WAAW,IAAI,SAAS;AAC9B,QAAM,SAAS,iBAAiB,MAAM,KAAK,GAAG,UAAU,+BAA+B;AACvF,SAAO,EAAE,QAAQ,UAAU,SAAS,MAAM,OAAO,SAAS,MAAM;AAClE;AAGA,SAAS,sBAAsB,MAAkB,MAAc,UAAgC;AAC7F,MAAI,CAAC,MAAM,QAAQ,KAAK,IAAI,EAAG,QAAO;AACtC,QAAM,UAAU,KAAK,KAAK,OAAO,CAAC,MAAM,MAAM,MAAM;AACpD,QAAM,UAAU,KAAK,KAAK,SAAS,MAAM;AACzC,QAAM,MAAkB,EAAE,GAAG,KAAK;AAClC,MAAI,QAAQ,WAAW,GAAG;AACxB,QAAI,OAAO;AAAA,EACb,OAAO;AACL,QAAI,OAAO,QAAQ,CAAC;AACpB,QAAI,QAAQ,SAAS,GAAG;AACtB,eAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA,2CAA2C,QAAQ,KAAK,IAAI,CAAC,YAAY,QAAQ,CAAC,CAAC;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AACA,MAAI,SAAS;AACX,QAAI,WAAW;AACf,aAAS,IAAI,MAAM,sBAAsB,wDAAwD,KAAK;AAAA,EACxG;AACA,SAAO;AACT;AAGA,SAAS,cAAc,MAAkB,MAAc,UAAgC;AACrF,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,EAAG,QAAO;AACvC,QAAM,WAAW,KAAK;AACtB,QAAM,UAAU,SAAS,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,KAAK,QAAQ,CAAC,EAAE,CAAC,MAAM,OAAO;AAC7F,QAAM,UAAU,QAAQ,WAAW,SAAS;AAC5C,QAAM,MAAkB,EAAE,GAAG,KAAK;AAElC,MAAI,SAAS;AACX,QAAI,WAAW;AACf,aAAS,IAAI,MAAM,sBAAsB,yDAAyD,KAAK;AAAA,EACzG;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,IAAI;AACX,QAAI,CAAC,IAAI,KAAM,KAAI,OAAO;AAAA,EAC5B,WAAW,QAAQ,WAAW,GAAG;AAE/B,WAAO,IAAI;AACX,UAAM,SAAS,QAAQ,CAAC;AACxB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC3C,UAAI,MAAM,iBAAiB,IAAI,YAAa;AAC5C,UAAI,CAAC,IAAI;AAAA,IACX;AAAA,EACF,OAAO;AACL,QAAI,QAAQ;AAAA,EACd;AACA,SAAO;AACT;AAGA,SAAS,WAAW,MAAkB,MAAc,UAA0B;AAC5E,MAAI,CAAC,MAAM,QAAQ,KAAK,IAAI,EAAG;AAC/B,QAAM,aAAa,KAAK,KAAK,MAAM,CAAC,MAAM,OAAO,MAAM,QAAQ;AAC/D,MAAI,CAAC,YAAY;AACf,SAAK,OAAO,KAAK,KAAK,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;AAC1C,aAAS,IAAI,GAAG,IAAI,SAAS,gBAAgB,gEAAgE;AAAA,EAC/G;AACA,MAAI,CAAC,KAAK,KAAM,MAAK,OAAO;AAC9B;;;AC3JO,SAAS,MAAM,OAAoC;AACxD,QAAM,WAAW,IAAI,SAAS;AAC9B,QAAM,SAAS,iBAAiB,MAAM,KAAK,GAAG,UAAU,KAAK;AAC7D,SAAO,EAAE,QAAQ,UAAU,SAAS,MAAM,OAAO,SAAS,MAAM;AAClE;;;ACEA,IAAM,sBAAkC,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AASlE,SAAS,aAAa,QAAoB,UAA6B,CAAC,GAAoB;AACjG,QAAM,SAAS,QAAQ,UAAU;AACjC,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO,SAAS,MAAM;AAAA,IACxB,KAAK;AACH,aAAO,eAAe,MAAM;AAAA,IAC9B,KAAK;AACH,aAAO,YAAY,MAAM;AAAA,IAC3B,KAAK;AACH,aAAO,SAAS,QAAQ,EAAE,gBAAgB,QAAQ,qBAAqB,CAAC;AAAA,IAC1E,KAAK;AACH,aAAO,mBAAmB,MAAM;AAAA,IAClC,KAAK;AACH,aAAO,MAAM,MAAM;AAAA,IACrB;AACE,YAAM,IAAI,MAAM,mBAAmB,OAAO,MAAsB,CAAC,EAAE;AAAA,EACvE;AACF;AAQO,SAAS,OAAO,KAAqB,UAA6B,CAAC,GAAe;AACvF,QAAM,SAAS,QAAQ,UAAU;AACjC,QAAM,SAAS,aAAa,IAAI,UAAU,qBAAqB,OAAO;AACtE,QAAM,WAAsB,CAAC,GAAG,OAAO,QAAQ;AAC/C,eAAa,IAAI,MAAM,QAAQ,QAAQ;AAEvC,QAAM,OAAO,UAAU,KAAK,OAAO,QAAQ,QAAQ,OAAO;AAC1D,SAAO,EAAE,MAAM,UAAU,OAAO,OAAO,MAAM;AAC/C;AAMO,SAAS,eAAe,QAAoB,UAA6B,CAAC,GAAe;AAC9F,QAAM,EAAE,SAAS,IAAI,aAAa,QAAQ,OAAO;AACjD,SAAO,EAAE,IAAI,SAAS,WAAW,GAAG,QAAQ,SAAS;AACvD;AAEA,SAAS,UACP,KACA,QACA,QACA,SACyB;AACzB,QAAM,EAAE,MAAM,YAAY,IAAI;AAE9B,UAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,IACL,KAAK,iBAAiB;AACpB,YAAM,SAAS,WAAW;AAC1B,UAAI,QAAQ,iBAAiB;AAC3B,eAAO;AAAA,UACL,MAAM;AAAA,UACN;AAAA,UACA,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,UACrC,YAAY;AAAA,UACZ,GAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,QACnC;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,UACR;AAAA,UACA,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,UACrC,YAAY;AAAA,UACZ,GAAI,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACrC,cAAc;AAAA,QACd,GAAI,QAAQ,kBAAkB,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,MACpD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACrC,YAAY;AAAA,MACd;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACrC,sBAAsB;AAAA,MACxB;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL;AAAA,QACA,GAAI,cAAc,EAAE,YAAY,IAAI,CAAC;AAAA,QACrC,aAAa;AAAA,QACb,GAAI,IAAI,eAAe,EAAE,cAAc,MAAM,IAAI,YAAY,EAAE,IAAI,CAAC;AAAA,QACpE,GAAI,IAAI,cAAc,EAAE,aAAa,IAAI,YAAY,IAAI,CAAC;AAAA,MAC5D;AAAA,IACF;AACE,YAAM,IAAI,MAAM,mBAAmB,OAAO,MAAsB,CAAC,EAAE;AAAA,EACvE;AACF;AAEA,IAAM,aAAiE;AAAA,EACrE,QAAQ,EAAE,SAAS,yBAAyB,OAAO,4CAA4C;AAAA,EAC/F,iBAAiB,EAAE,SAAS,yBAAyB,OAAO,4CAA4C;AAAA,EACxG,WAAW,EAAE,SAAS,yBAAyB,OAAO,+CAA+C;AAAA,EACrG,QAAQ,EAAE,SAAS,4BAA4B,OAAO,6CAA6C;AAAA,EACnG,qBAAqB,EAAE,SAAS,4BAA4B,OAAO,6CAA6C;AAAA,EAChH,KAAK,EAAE,SAAS,0BAA0B,OAAO,iCAAiC;AACpF;AAEA,SAAS,aAAa,MAAc,QAAgB,UAA2B;AAC7E,QAAM,OAAO,WAAW,MAAM;AAC9B,MAAI,CAAC,KAAK,QAAQ,KAAK,IAAI,GAAG;AAC5B,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,cAAc,IAAI,wBAAwB,KAAK,KAAK;AAAA,IAC/D,CAAC;AAAA,EACH;AACF;;;ACnJA,IAAMA,uBAAkC,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAQlE,SAAS,YAAY,KAAqB,UAA+B,CAAC,GAAe;AAC9F,QAAM,SAAS,aAAa,IAAI,UAAUA,sBAAqB,OAAO;AACtE,QAAM,YAAY,QAAQ,kBAAkB,eAAe;AAE3D,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,GAAI,IAAI,cAAc,EAAE,aAAa,IAAI,YAAY,IAAI,CAAC;AAAA,MAC1D,CAAC,SAAS,GAAG,OAAO;AAAA,MACpB,GAAI,QAAQ,WAAW,kBAAkB,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC/D;AAAA,IACA,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,EAChB;AACF;AAQO,SAAS,cAAc,MAAc,QAA6B,UAA+B,CAAC,GAAe;AACtH,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,UAAM,IAAI,UAAU,+CAA+C;AAAA,EACrE;AAEA,QAAM,YAAY,OAAO,eAAe,OAAO,cAAcA;AAC7D,QAAM,SAAS,aAAa,WAAW,OAAO;AAC9C,QAAM,SAAS,OAAO,WAAW,SAAS,QAAQ,UAAU,cAAc,WAAW,kBAAkB,QAAQ;AAE/G,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,GAAI,OAAO,OAAO,gBAAgB,WAAW,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,MACpF;AAAA,IACF;AAAA,IACA,EAAE,GAAG,SAAS,OAAO;AAAA,EACvB;AACF;AAEA,SAAS,aAAa,OAAgB,SAA0C;AAC9E,MAAI,oBAAoB,KAAK,GAAG;AAC9B,QAAI,QAAQ,iBAAiB;AAC3B,aAAO,iBAAiB,QAAQ,gBAAgB,KAAK,CAAC;AAAA,IACxD;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,KAAK,KAAK,OAAO,MAAM,iBAAiB,YAAY;AACpE,WAAO,iBAAkB,MAAM,aAA+B,CAAC;AAAA,EACjE;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAEA,SAAS,iBAAiB,OAA4B;AACpD,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,UAAM,IAAI,UAAU,iEAAiE;AAAA,EACvF;AACA,SAAO,MAAM,KAAmB;AAClC;AAEA,SAAS,oBAAoB,OAAkD;AAC7E,MAAI,CAAC,cAAc,KAAK,EAAG,QAAO;AAClC,SAAO,UAAU,SAAS,UAAU,SAAS,eAAe;AAC9D;","names":["EMPTY_OBJECT_SCHEMA"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -67,6 +67,24 @@ interface ToolSchemaOptions {
|
|
|
67
67
|
/** For the `anthropic` target, add `strict: true` to the tool definition. */
|
|
68
68
|
anthropicStrict?: boolean;
|
|
69
69
|
}
|
|
70
|
+
/** A Vercel AI SDK-style tool object. AI SDK v5 uses `inputSchema`; v4 used `parameters`. */
|
|
71
|
+
interface AISDKToolDefinition {
|
|
72
|
+
description?: string;
|
|
73
|
+
inputSchema?: unknown;
|
|
74
|
+
parameters?: unknown;
|
|
75
|
+
strict?: boolean;
|
|
76
|
+
[key: string]: unknown;
|
|
77
|
+
}
|
|
78
|
+
/** Options for the Vercel AI SDK adapter helpers. */
|
|
79
|
+
interface AISDKAdapterOptions extends ToolSchemaOptions {
|
|
80
|
+
/** Emit the AI SDK v4 `parameters` key instead of the AI SDK v5 `inputSchema` key. */
|
|
81
|
+
aiSDKParameters?: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Optional converter for Zod or Standard Schema inputs. Pass `z.toJSONSchema`
|
|
84
|
+
* or a wrapper around it to keep this package zero-dependency.
|
|
85
|
+
*/
|
|
86
|
+
zodToJsonSchema?: (schema: unknown) => JSONSchema;
|
|
87
|
+
}
|
|
70
88
|
/** MCP tool behavioural hints. See the Model Context Protocol spec. */
|
|
71
89
|
interface McpAnnotations {
|
|
72
90
|
title?: string;
|
|
@@ -83,6 +101,12 @@ interface ToolDefinition {
|
|
|
83
101
|
description?: string;
|
|
84
102
|
/** The parameters / input schema. Defaults to an empty object schema. */
|
|
85
103
|
schema?: JSONSchema;
|
|
104
|
+
/**
|
|
105
|
+
* MCP only: JSON Schema for `structuredContent` returned by the tool.
|
|
106
|
+
* Preserved as standard JSON Schema 2020-12 and may describe arrays,
|
|
107
|
+
* primitives, objects or composition schemas.
|
|
108
|
+
*/
|
|
109
|
+
outputSchema?: JSONSchema;
|
|
86
110
|
/** MCP only: behavioural hints surfaced to clients. */
|
|
87
111
|
annotations?: McpAnnotations;
|
|
88
112
|
}
|
|
@@ -122,4 +146,19 @@ declare function toTool(def: ToolDefinition, options?: ToolSchemaOptions): ToolR
|
|
|
122
146
|
*/
|
|
123
147
|
declare function lintToolSchema(schema: JSONSchema, options?: ToolSchemaOptions): LintResult;
|
|
124
148
|
|
|
125
|
-
|
|
149
|
+
/**
|
|
150
|
+
* Build a Vercel AI SDK tool definition from a `tool-schema` definition.
|
|
151
|
+
*
|
|
152
|
+
* AI SDK v5 expects `{ description?, inputSchema, strict? }`. Pass
|
|
153
|
+
* `aiSDKParameters: true` for the legacy AI SDK v4 `{ parameters }` key.
|
|
154
|
+
*/
|
|
155
|
+
declare function toAISDKTool(def: ToolDefinition, options?: AISDKAdapterOptions): ToolResult;
|
|
156
|
+
/**
|
|
157
|
+
* Convert a Vercel AI SDK tool definition into any provider-specific tool shape.
|
|
158
|
+
*
|
|
159
|
+
* The tool name comes from the key in the AI SDK `tools` object:
|
|
160
|
+
* `fromAISDKTool('get_weather', tools.get_weather, { target: 'openai-strict' })`.
|
|
161
|
+
*/
|
|
162
|
+
declare function fromAISDKTool(name: string, aiTool: AISDKToolDefinition, options?: AISDKAdapterOptions): ToolResult;
|
|
163
|
+
|
|
164
|
+
export { type AISDKAdapterOptions, type AISDKToolDefinition, type JSONSchema, type LintResult, type McpAnnotations, type Target, type ToolDefinition, type ToolResult, type ToolSchemaOptions, type TransformResult, type Warning, type WarningCode, fromAISDKTool, lintToolSchema, toAISDKTool, toTool, toToolSchema };
|
package/dist/index.d.ts
CHANGED
|
@@ -67,6 +67,24 @@ interface ToolSchemaOptions {
|
|
|
67
67
|
/** For the `anthropic` target, add `strict: true` to the tool definition. */
|
|
68
68
|
anthropicStrict?: boolean;
|
|
69
69
|
}
|
|
70
|
+
/** A Vercel AI SDK-style tool object. AI SDK v5 uses `inputSchema`; v4 used `parameters`. */
|
|
71
|
+
interface AISDKToolDefinition {
|
|
72
|
+
description?: string;
|
|
73
|
+
inputSchema?: unknown;
|
|
74
|
+
parameters?: unknown;
|
|
75
|
+
strict?: boolean;
|
|
76
|
+
[key: string]: unknown;
|
|
77
|
+
}
|
|
78
|
+
/** Options for the Vercel AI SDK adapter helpers. */
|
|
79
|
+
interface AISDKAdapterOptions extends ToolSchemaOptions {
|
|
80
|
+
/** Emit the AI SDK v4 `parameters` key instead of the AI SDK v5 `inputSchema` key. */
|
|
81
|
+
aiSDKParameters?: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Optional converter for Zod or Standard Schema inputs. Pass `z.toJSONSchema`
|
|
84
|
+
* or a wrapper around it to keep this package zero-dependency.
|
|
85
|
+
*/
|
|
86
|
+
zodToJsonSchema?: (schema: unknown) => JSONSchema;
|
|
87
|
+
}
|
|
70
88
|
/** MCP tool behavioural hints. See the Model Context Protocol spec. */
|
|
71
89
|
interface McpAnnotations {
|
|
72
90
|
title?: string;
|
|
@@ -83,6 +101,12 @@ interface ToolDefinition {
|
|
|
83
101
|
description?: string;
|
|
84
102
|
/** The parameters / input schema. Defaults to an empty object schema. */
|
|
85
103
|
schema?: JSONSchema;
|
|
104
|
+
/**
|
|
105
|
+
* MCP only: JSON Schema for `structuredContent` returned by the tool.
|
|
106
|
+
* Preserved as standard JSON Schema 2020-12 and may describe arrays,
|
|
107
|
+
* primitives, objects or composition schemas.
|
|
108
|
+
*/
|
|
109
|
+
outputSchema?: JSONSchema;
|
|
86
110
|
/** MCP only: behavioural hints surfaced to clients. */
|
|
87
111
|
annotations?: McpAnnotations;
|
|
88
112
|
}
|
|
@@ -122,4 +146,19 @@ declare function toTool(def: ToolDefinition, options?: ToolSchemaOptions): ToolR
|
|
|
122
146
|
*/
|
|
123
147
|
declare function lintToolSchema(schema: JSONSchema, options?: ToolSchemaOptions): LintResult;
|
|
124
148
|
|
|
125
|
-
|
|
149
|
+
/**
|
|
150
|
+
* Build a Vercel AI SDK tool definition from a `tool-schema` definition.
|
|
151
|
+
*
|
|
152
|
+
* AI SDK v5 expects `{ description?, inputSchema, strict? }`. Pass
|
|
153
|
+
* `aiSDKParameters: true` for the legacy AI SDK v4 `{ parameters }` key.
|
|
154
|
+
*/
|
|
155
|
+
declare function toAISDKTool(def: ToolDefinition, options?: AISDKAdapterOptions): ToolResult;
|
|
156
|
+
/**
|
|
157
|
+
* Convert a Vercel AI SDK tool definition into any provider-specific tool shape.
|
|
158
|
+
*
|
|
159
|
+
* The tool name comes from the key in the AI SDK `tools` object:
|
|
160
|
+
* `fromAISDKTool('get_weather', tools.get_weather, { target: 'openai-strict' })`.
|
|
161
|
+
*/
|
|
162
|
+
declare function fromAISDKTool(name: string, aiTool: AISDKToolDefinition, options?: AISDKAdapterOptions): ToolResult;
|
|
163
|
+
|
|
164
|
+
export { type AISDKAdapterOptions, type AISDKToolDefinition, type JSONSchema, type LintResult, type McpAnnotations, type Target, type ToolDefinition, type ToolResult, type ToolSchemaOptions, type TransformResult, type Warning, type WarningCode, fromAISDKTool, lintToolSchema, toAISDKTool, toTool, toToolSchema };
|
package/dist/index.js
CHANGED
|
@@ -1,10 +1,70 @@
|
|
|
1
1
|
import {
|
|
2
|
+
clone,
|
|
3
|
+
isPlainObject,
|
|
2
4
|
lintToolSchema,
|
|
3
5
|
toTool,
|
|
4
6
|
toToolSchema
|
|
5
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-HM2FG6DI.js";
|
|
8
|
+
|
|
9
|
+
// src/adapters/ai-sdk.ts
|
|
10
|
+
var EMPTY_OBJECT_SCHEMA = { type: "object", properties: {} };
|
|
11
|
+
function toAISDKTool(def, options = {}) {
|
|
12
|
+
const result = toToolSchema(def.schema ?? EMPTY_OBJECT_SCHEMA, options);
|
|
13
|
+
const schemaKey = options.aiSDKParameters ? "parameters" : "inputSchema";
|
|
14
|
+
return {
|
|
15
|
+
tool: {
|
|
16
|
+
...def.description ? { description: def.description } : {},
|
|
17
|
+
[schemaKey]: result.schema,
|
|
18
|
+
...options.target === "openai-strict" ? { strict: true } : {}
|
|
19
|
+
},
|
|
20
|
+
warnings: result.warnings,
|
|
21
|
+
lossy: result.lossy
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function fromAISDKTool(name, aiTool, options = {}) {
|
|
25
|
+
if (!isPlainObject(aiTool)) {
|
|
26
|
+
throw new TypeError("fromAISDKTool expected an AI SDK tool object.");
|
|
27
|
+
}
|
|
28
|
+
const rawSchema = aiTool.inputSchema ?? aiTool.parameters ?? EMPTY_OBJECT_SCHEMA;
|
|
29
|
+
const schema = toJSONSchema(rawSchema, options);
|
|
30
|
+
const target = aiTool.strict === true && (options.target ?? "openai") === "openai" ? "openai-strict" : options.target;
|
|
31
|
+
return toTool(
|
|
32
|
+
{
|
|
33
|
+
name,
|
|
34
|
+
...typeof aiTool.description === "string" ? { description: aiTool.description } : {},
|
|
35
|
+
schema
|
|
36
|
+
},
|
|
37
|
+
{ ...options, target }
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
function toJSONSchema(value, options) {
|
|
41
|
+
if (isProbablyZodSchema(value)) {
|
|
42
|
+
if (options.zodToJsonSchema) {
|
|
43
|
+
return assertJSONSchema(options.zodToJsonSchema(value));
|
|
44
|
+
}
|
|
45
|
+
throw new TypeError(
|
|
46
|
+
"AI SDK tool schema looks like a Zod/Standard Schema object. tool-schema has zero dependencies; pass zodToJsonSchema: z.toJSONSchema or pass JSON Schema directly."
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
if (isPlainObject(value) && typeof value.toJSONSchema === "function") {
|
|
50
|
+
return assertJSONSchema(value.toJSONSchema());
|
|
51
|
+
}
|
|
52
|
+
return assertJSONSchema(value);
|
|
53
|
+
}
|
|
54
|
+
function assertJSONSchema(value) {
|
|
55
|
+
if (!isPlainObject(value)) {
|
|
56
|
+
throw new TypeError("Expected a JSON Schema object for the AI SDK tool input schema.");
|
|
57
|
+
}
|
|
58
|
+
return clone(value);
|
|
59
|
+
}
|
|
60
|
+
function isProbablyZodSchema(value) {
|
|
61
|
+
if (!isPlainObject(value)) return false;
|
|
62
|
+
return "_def" in value || "_zod" in value || "~standard" in value;
|
|
63
|
+
}
|
|
6
64
|
export {
|
|
65
|
+
fromAISDKTool,
|
|
7
66
|
lintToolSchema,
|
|
67
|
+
toAISDKTool,
|
|
8
68
|
toTool,
|
|
9
69
|
toToolSchema
|
|
10
70
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/adapters/ai-sdk.ts"],"sourcesContent":["import type { AISDKAdapterOptions, AISDKToolDefinition, JSONSchema, ToolDefinition, ToolResult } from '../types.js';\nimport { toTool, toToolSchema } from '../transform.js';\nimport { clone, isPlainObject } from '../util.js';\n\nconst EMPTY_OBJECT_SCHEMA: JSONSchema = { type: 'object', properties: {} };\n\n/**\n * Build a Vercel AI SDK tool definition from a `tool-schema` definition.\n *\n * AI SDK v5 expects `{ description?, inputSchema, strict? }`. Pass\n * `aiSDKParameters: true` for the legacy AI SDK v4 `{ parameters }` key.\n */\nexport function toAISDKTool(def: ToolDefinition, options: AISDKAdapterOptions = {}): ToolResult {\n const result = toToolSchema(def.schema ?? EMPTY_OBJECT_SCHEMA, options);\n const schemaKey = options.aiSDKParameters ? 'parameters' : 'inputSchema';\n\n return {\n tool: {\n ...(def.description ? { description: def.description } : {}),\n [schemaKey]: result.schema,\n ...(options.target === 'openai-strict' ? { strict: true } : {}),\n },\n warnings: result.warnings,\n lossy: result.lossy,\n };\n}\n\n/**\n * Convert a Vercel AI SDK tool definition into any provider-specific tool shape.\n *\n * The tool name comes from the key in the AI SDK `tools` object:\n * `fromAISDKTool('get_weather', tools.get_weather, { target: 'openai-strict' })`.\n */\nexport function fromAISDKTool(name: string, aiTool: AISDKToolDefinition, options: AISDKAdapterOptions = {}): ToolResult {\n if (!isPlainObject(aiTool)) {\n throw new TypeError('fromAISDKTool expected an AI SDK tool object.');\n }\n\n const rawSchema = aiTool.inputSchema ?? aiTool.parameters ?? EMPTY_OBJECT_SCHEMA;\n const schema = toJSONSchema(rawSchema, options);\n const target = aiTool.strict === true && (options.target ?? 'openai') === 'openai' ? 'openai-strict' : options.target;\n\n return toTool(\n {\n name,\n ...(typeof aiTool.description === 'string' ? { description: aiTool.description } : {}),\n schema,\n },\n { ...options, target },\n );\n}\n\nfunction toJSONSchema(value: unknown, options: AISDKAdapterOptions): JSONSchema {\n if (isProbablyZodSchema(value)) {\n if (options.zodToJsonSchema) {\n return assertJSONSchema(options.zodToJsonSchema(value));\n }\n throw new TypeError(\n 'AI SDK tool schema looks like a Zod/Standard Schema object. tool-schema has zero dependencies; pass zodToJsonSchema: z.toJSONSchema or pass JSON Schema directly.',\n );\n }\n\n if (isPlainObject(value) && typeof value.toJSONSchema === 'function') {\n return assertJSONSchema((value.toJSONSchema as () => unknown)());\n }\n\n return assertJSONSchema(value);\n}\n\nfunction assertJSONSchema(value: unknown): JSONSchema {\n if (!isPlainObject(value)) {\n throw new TypeError('Expected a JSON Schema object for the AI SDK tool input schema.');\n }\n return clone(value as JSONSchema);\n}\n\nfunction isProbablyZodSchema(value: unknown): value is Record<string, unknown> {\n if (!isPlainObject(value)) return false;\n return '_def' in value || '_zod' in value || '~standard' in value;\n}\n"],"mappings":";;;;;;;;;AAIA,IAAM,sBAAkC,EAAE,MAAM,UAAU,YAAY,CAAC,EAAE;AAQlE,SAAS,YAAY,KAAqB,UAA+B,CAAC,GAAe;AAC9F,QAAM,SAAS,aAAa,IAAI,UAAU,qBAAqB,OAAO;AACtE,QAAM,YAAY,QAAQ,kBAAkB,eAAe;AAE3D,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,GAAI,IAAI,cAAc,EAAE,aAAa,IAAI,YAAY,IAAI,CAAC;AAAA,MAC1D,CAAC,SAAS,GAAG,OAAO;AAAA,MACpB,GAAI,QAAQ,WAAW,kBAAkB,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC/D;AAAA,IACA,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,EAChB;AACF;AAQO,SAAS,cAAc,MAAc,QAA6B,UAA+B,CAAC,GAAe;AACtH,MAAI,CAAC,cAAc,MAAM,GAAG;AAC1B,UAAM,IAAI,UAAU,+CAA+C;AAAA,EACrE;AAEA,QAAM,YAAY,OAAO,eAAe,OAAO,cAAc;AAC7D,QAAM,SAAS,aAAa,WAAW,OAAO;AAC9C,QAAM,SAAS,OAAO,WAAW,SAAS,QAAQ,UAAU,cAAc,WAAW,kBAAkB,QAAQ;AAE/G,SAAO;AAAA,IACL;AAAA,MACE;AAAA,MACA,GAAI,OAAO,OAAO,gBAAgB,WAAW,EAAE,aAAa,OAAO,YAAY,IAAI,CAAC;AAAA,MACpF;AAAA,IACF;AAAA,IACA,EAAE,GAAG,SAAS,OAAO;AAAA,EACvB;AACF;AAEA,SAAS,aAAa,OAAgB,SAA0C;AAC9E,MAAI,oBAAoB,KAAK,GAAG;AAC9B,QAAI,QAAQ,iBAAiB;AAC3B,aAAO,iBAAiB,QAAQ,gBAAgB,KAAK,CAAC;AAAA,IACxD;AACA,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,MAAI,cAAc,KAAK,KAAK,OAAO,MAAM,iBAAiB,YAAY;AACpE,WAAO,iBAAkB,MAAM,aAA+B,CAAC;AAAA,EACjE;AAEA,SAAO,iBAAiB,KAAK;AAC/B;AAEA,SAAS,iBAAiB,OAA4B;AACpD,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,UAAM,IAAI,UAAU,iEAAiE;AAAA,EACvF;AACA,SAAO,MAAM,KAAmB;AAClC;AAEA,SAAS,oBAAoB,OAAkD;AAC7E,MAAI,CAAC,cAAc,KAAK,EAAG,QAAO;AAClC,SAAO,UAAU,SAAS,UAAU,SAAS,eAAe;AAC9D;","names":[]}
|
package/package.json
CHANGED