@mochabug/adapt-sdk 0.4.17 → 0.4.19
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/dist/cjs/anthropic.cjs +1 -1
- package/dist/cjs/anthropic.cjs.map +3 -3
- package/dist/cjs/cel.cjs +2 -2
- package/dist/cjs/cel.cjs.map +1 -1
- package/dist/cjs/gemini.cjs +1 -1
- package/dist/cjs/gemini.cjs.map +3 -3
- package/dist/cjs/openai.cjs +1 -1
- package/dist/cjs/openai.cjs.map +3 -3
- package/dist/cjs/signals.cjs +2 -2
- package/dist/cjs/signals.cjs.map +3 -3
- package/dist/esm/anthropic.mjs +1 -1
- package/dist/esm/anthropic.mjs.map +3 -3
- package/dist/esm/cel.mjs +2 -2
- package/dist/esm/cel.mjs.map +1 -1
- package/dist/esm/gemini.mjs +1 -1
- package/dist/esm/gemini.mjs.map +3 -3
- package/dist/esm/openai.mjs +1 -1
- package/dist/esm/openai.mjs.map +3 -3
- package/dist/esm/signals.mjs +2 -2
- package/dist/esm/signals.mjs.map +3 -3
- package/dist/schema-utils.d.ts +9 -5
- package/dist/schema-utils.d.ts.map +1 -1
- package/dist/signals/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/cjs/signals.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";var
|
|
2
|
-
`))}var
|
|
1
|
+
"use strict";var m=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var j=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var S=(e,r)=>{for(var i in r)m(e,i,{get:r[i],enumerable:!0})},h=(e,r,i,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of j(r))!w.call(e,t)&&t!==i&&m(e,t,{get:()=>r[t],enumerable:!(n=k(r,t))||n.enumerable});return e};var x=e=>h(m({},"__esModule",{value:!0}),e);var q={};S(q,{JTD_SCHEMA_CONFIG:()=>F,MAX_VALIDATION_DEPTH:()=>v,MAX_VALIDATION_ERRORS:()=>$,fuzzJTD:()=>c,jtdToJsonSchema:()=>I,validateJSON:()=>D,validateJTDSchema:()=>T,validateJTDSchemaString:()=>N,validateJsonAgainstJTD:()=>g,validateJsonAgainstSignal:()=>V});module.exports=x(q);var f=require("jtd"),P=10;function c(e,r,i=0){if(i>P)return null;if(e.ref){let n=r?.[e.ref];return n?c(n,r,i+1):null}if(e.type)switch(e.type){case"string":return"Lorem ipsum";case"timestamp":return"2024-01-15T10:30:00Z";case"float32":case"float64":return 42.5;case"int8":case"uint8":case"int16":case"uint16":case"int32":case"uint32":return BigInt(42);case"boolean":return!0;default:return null}if(e.enum)return e.enum[0]??null;if(e.elements)return[c(e.elements,r,i+1),c(e.elements,r,i+1)];if(e.values)return{key1:c(e.values,r,i+1)};if(e.properties||e.optionalProperties){let n={};if(e.properties)for(let[t,o]of Object.entries(e.properties))n[t]=c(o,r,i+1);if(e.optionalProperties)for(let[t,o]of Object.entries(e.optionalProperties))n[t]=c(o,r,i+1);return n}if(e.discriminator&&e.mapping){let n=Object.keys(e.mapping)[0];if(n){let t=e.mapping[n],o=c(t,r,i+1);return o[e.discriminator]=n,o}return null}return null}var R=new Set(["int8","uint8","int16","uint16","int32","uint32"]);function O(e){return e.length===0?"root":`'${e.map((i,n)=>/^\d+$/.test(i)?`[${i}]`:n===0?i:`.${i}`).join("")}'`}function d(e,r){let i=e;for(let n=0;n<r.length-1&&(i&&typeof i=="object"&&r[n]in i);n++)i=i[r[n]];return i}function A(e,r){let i=e;for(let n of r)if(i&&typeof i=="object")i=i[n];else return;return i}function E(e,r,i){let{instancePath:n,schemaPath:t}=e,o=O(n),s=t[t.length-1],u=o==="root"?"root value":`parameter ${o}`;if(s==="type"){let p=d(r,t)?.type;return p==="boolean"?`${u}: expected boolean`:p==="string"?`${u}: expected string`:p==="timestamp"?`${u}: expected timestamp string`:R.has(p)?`${u}: expected integer`:`${u}: expected number`}if(s==="enum"){let p=d(r,t)?.enum;return`${u}: expected one of [${p.join(", ")}]`}if(t.length>=2&&t[t.length-2]==="properties"&&s)return o==="root"?`missing required parameter '${s}'`:`missing required parameter ${o}.${s}`;if(s==="elements")return`${u}: expected array`;if(s==="properties"||s==="optionalProperties"||s==="values")return`${u}: expected object`;if(s==="discriminator"){let p=d(r,t)?.discriminator;return p?`${u}: parameter '${p}' must be a string`:`${u}: expected string discriminator`}if(s==="mapping"){let a=A(i,n),y=d(r,t)?.mapping,J=y?Object.keys(y):[];return J.length>0?`${u}: unknown variant "${a}". Valid values: [${J.join(", ")}]`:`${u}: unknown variant "${a}"`}return t.length===0?`${u}: unexpected property`:`${u}: validation error at /${t.join("/")}`}function g(e,r,i){let n=i??e.definitions,t=n?{...e,definitions:n}:e;return(0,f.isValidSchema)(t)?(0,f.validate)(t,r,{maxDepth:v,maxErrors:$}).map(s=>E(s,t,r)):e.ref?[`unknown ref "${e.ref}" in schema`]:["invalid schema"]}function V(e,r){if("formats"in e&&Array.isArray(e.formats)){let n=e.formats.filter(t=>t.jtdSchema);if(n.length===0)return["no JTD formats in signal descriptor"];for(let t of n)if(g(t.jtdSchema,r).length===0)return[];return g(n[n.length-1].jtdSchema,r)}let i=e;return i.jtdSchema?g(i.jtdSchema,r):["signal format has no jtdSchema"]}function I(e,r,i=!0){if(!e||typeof e!="object")return{};let n=e.nullable,t=r||e.definitions,o={};if(i&&(o.$schema="http://json-schema.org/draft-07/schema#",t&&Object.keys(t).length>0)){o.$defs={};for(let[u,a]of Object.entries(t))o.$defs[u]=l(a,t)}let s=l(e,t);return Object.assign(o,s),o}function l(e,r){if(!e||typeof e!="object")return{};let i=e.nullable,n={};if(b(n,e),e.ref){let t=e.ref;if(r&&r[t]){let o={$ref:`#/$defs/${t}`};return b(o,e),i?{anyOf:[o,{type:"null"}],...o.description?{description:o.description}:{}}:o}return{}}if(e.type){let t={boolean:"boolean",string:"string",timestamp:"string",float32:"number",float64:"number",int8:"integer",uint8:"integer",int16:"integer",uint16:"integer",int32:"integer",uint32:"integer"},o=e.type,s=t[o]||"string";return n.type=i?[s,"null"]:s,s==="string"&&o==="timestamp"&&(n.format="date-time"),n}if(e.enum)return n.type=i?["string","null"]:"string",n.enum=i?[...e.enum,null]:e.enum,n;if(e.elements)return n.type=i?["array","null"]:"array",n.items=l(e.elements,r),n;if(e.properties||e.optionalProperties){if(n.type=i?["object","null"]:"object",n.properties={},n.required=[],e.properties)for(let[t,o]of Object.entries(e.properties))n.properties[t]=l(o,r),n.required.push(t);if(e.optionalProperties)for(let[t,o]of Object.entries(e.optionalProperties))n.properties[t]=l(o,r);return e.additionalProperties!==!0&&(n.additionalProperties=!1),n}if(e.values)return n.type=i?["object","null"]:"object",n.additionalProperties=l(e.values,r),n;if(e.discriminator&&e.mapping){let t=[],o=e.discriminator;for(let[s,u]of Object.entries(e.mapping)){let a=l(u,r);a.type?a.type!=="object"&&!Array.isArray(a.type)&&(a.type="object"):a.type="object",a.properties=a.properties||{},a.properties[o]={const:s},a.required=a.required||[],a.required.includes(o)||a.required.unshift(o),a.additionalProperties===void 0&&(a.additionalProperties=!1),t.push(a)}return i&&t.push({type:"null"}),n.oneOf=t,n}return n}function b(e,r){let i=r.metadata;if(!i||typeof i!="object")return;let n=[],t=i.description;typeof t=="string"&&t&&n.push(t);for(let[o,s]of Object.entries(i)){if(o==="description"||s==null)continue;let u=typeof s=="string"?s:JSON.stringify(s);n.push(`${o}: ${u}`)}n.length>0&&(e.description=n.join(`
|
|
2
|
+
`))}var v=32,$=100;function T(e){return(0,f.isSchema)(e)?(0,f.isValidSchema)(e)?{valid:!0,schema:e}:{valid:!1,error:"Invalid JTD schema: Schema has semantic errors (e.g., circular references, conflicting forms)"}:{valid:!1,error:"Invalid JTD schema: Schema does not match JTD structure"}}function D(e){try{return{valid:!0,data:JSON.parse(e)}}catch(r){return{valid:!1,error:`Invalid JSON: ${r instanceof Error?r.message:"Parse error"}`}}}function N(e){let r=D(e);return r.valid?T(r.data):{valid:!1,error:r.error}}var F={uri:"https://jsontypedef.com/schemas/jtd-schema.json",fileMatch:["inmemory://jtd-schema/*.json"],schema:{$schema:"http://json-schema.org/draft-07/schema#",type:"object",properties:{type:{description:"Type form - defines a primitive type",enum:["boolean","string","timestamp","float32","float64","int8","uint8","int16","uint16","int32","uint32"]},enum:{description:"Enum form - defines a set of string values",type:"array",items:{type:"string"}},elements:{description:"Elements form - defines an array with typed elements",$ref:"#"},properties:{description:"Properties form - defines an object with required properties",type:"object",additionalProperties:{$ref:"#"}},optionalProperties:{description:"Optional properties - defines optional object properties",type:"object",additionalProperties:{$ref:"#"}},values:{description:"Values form - defines a map/dictionary with typed values",$ref:"#"},discriminator:{description:"Discriminator form - defines a tagged union",type:"string"},mapping:{description:"Mapping for discriminator form",type:"object",additionalProperties:{$ref:"#"}},ref:{description:"Ref form - references a definition",type:"string"},definitions:{description:"Top-level definitions for reusable schemas",type:"object",additionalProperties:{$ref:"#"}},nullable:{description:"Allow null values",type:"boolean"},metadata:{description:"Custom metadata for documentation",type:"object"},additionalProperties:{description:"Allow additional properties (properties form only)",type:"boolean"}}}};0&&(module.exports={JTD_SCHEMA_CONFIG,MAX_VALIDATION_DEPTH,MAX_VALIDATION_ERRORS,fuzzJTD,jtdToJsonSchema,validateJSON,validateJTDSchema,validateJTDSchemaString,validateJsonAgainstJTD,validateJsonAgainstSignal});
|
|
3
3
|
//# sourceMappingURL=signals.cjs.map
|
package/dist/cjs/signals.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/signals/index.ts"],
|
|
4
|
-
"sourcesContent": ["import type {\n JTDSchemaJson,\n SignalDescriptorJson,\n SignalFormatJson\n} from '../api';\nimport { isSchema, isValidSchema, validate as jtdValidate } from 'jtd';\nimport type { Schema, ValidationError } from 'jtd';\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// JTD FUZZER (generate sample values from JTD schemas)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n/** Maximum recursion depth for fuzzJTD to prevent infinite loops on self-referencing schemas. */\nconst FUZZ_MAX_DEPTH = 10;\n\n/** Generate a fuzzed (sample) value from a JTD schema. */\nexport function fuzzJTD(\n schema: JTDSchemaJson,\n definitions?: Record<string, JTDSchemaJson>,\n _depth: number = 0\n): unknown {\n if (_depth > FUZZ_MAX_DEPTH) return null;\n\n if (schema.ref) {\n const def = definitions?.[schema.ref];\n if (def) return fuzzJTD(def, definitions, _depth + 1);\n return null;\n }\n\n if (schema.type) {\n switch (schema.type) {\n case 'string':\n return 'Lorem ipsum';\n case 'timestamp':\n return '2024-01-15T10:30:00Z';\n case 'float32':\n case 'float64':\n return 42.5;\n case 'int8':\n case 'uint8':\n case 'int16':\n case 'uint16':\n case 'int32':\n case 'uint32':\n return BigInt(42);\n case 'boolean':\n return true;\n default:\n return null;\n }\n }\n\n if (schema.enum) {\n return schema.enum[0] ?? null;\n }\n\n if (schema.elements) {\n return [\n fuzzJTD(schema.elements, definitions, _depth + 1),\n fuzzJTD(schema.elements, definitions, _depth + 1)\n ];\n }\n\n if (schema.values) {\n return { key1: fuzzJTD(schema.values, definitions, _depth + 1) };\n }\n\n if (schema.properties || schema.optionalProperties) {\n const obj: Record<string, unknown> = {};\n if (schema.properties) {\n for (const [k, v] of Object.entries(schema.properties)) {\n obj[k] = fuzzJTD(v, definitions, _depth + 1);\n }\n }\n if (schema.optionalProperties) {\n for (const [k, v] of Object.entries(schema.optionalProperties)) {\n obj[k] = fuzzJTD(v, definitions, _depth + 1);\n }\n }\n return obj;\n }\n\n if (schema.discriminator && schema.mapping) {\n const firstKey = Object.keys(schema.mapping)[0];\n if (firstKey) {\n const variant = schema.mapping[firstKey]!;\n const obj = fuzzJTD(variant, definitions, _depth + 1) as Record<\n string,\n unknown\n >;\n obj[schema.discriminator] = firstKey;\n return obj;\n }\n return null;\n }\n\n // Empty schema\n return null;\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// JTD VALUE VALIDATION (delegates to the `jtd` npm package)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nconst INTEGER_TYPES = new Set([\n 'int8',\n 'uint8',\n 'int16',\n 'uint16',\n 'int32',\n 'uint32'\n]);\n\nfunction formatInstancePath(instancePath: string[]): string {\n if (instancePath.length === 0) return '/';\n return instancePath\n .map((p) => (/^\\d+$/.test(p) ? `[${p}]` : `.${p}`))\n .join('');\n}\n\nfunction resolveSchemaParent(\n schema: Record<string, unknown>,\n schemaPath: string[]\n): Record<string, unknown> {\n let current: any = schema;\n for (let i = 0; i < schemaPath.length - 1; i++) {\n if (current && typeof current === 'object' && schemaPath[i]! in current) {\n current = current[schemaPath[i]!];\n } else {\n break;\n }\n }\n return current as Record<string, unknown>;\n}\n\nfunction resolveInstanceValue(value: unknown, instancePath: string[]): unknown {\n let current = value;\n for (const key of instancePath) {\n if (current && typeof current === 'object') {\n current = (current as Record<string, unknown>)[key];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction formatValidationError(\n error: ValidationError,\n schema: Record<string, unknown>,\n value: unknown\n): string {\n const { instancePath, schemaPath } = error;\n const path = formatInstancePath(instancePath);\n const lastKey = schemaPath[schemaPath.length - 1];\n\n if (lastKey === 'type') {\n const parent = resolveSchemaParent(schema, schemaPath);\n const jtdType = parent?.type as string;\n if (jtdType === 'boolean') return `${path}: expected boolean`;\n if (jtdType === 'string') return `${path}: expected string`;\n if (jtdType === 'timestamp') return `${path}: expected timestamp string`;\n if (INTEGER_TYPES.has(jtdType)) return `${path}: expected integer`;\n return `${path}: expected number`;\n }\n\n if (lastKey === 'enum') {\n const parent = resolveSchemaParent(schema, schemaPath);\n const enumValues = parent?.enum as string[];\n return `${path}: expected one of [${enumValues.join(', ')}]`;\n }\n\n if (\n schemaPath.length >= 2 &&\n schemaPath[schemaPath.length - 2] === 'properties' &&\n lastKey\n ) {\n const prefix = path === '/' ? '' : path;\n return `${prefix}.${lastKey}: missing required property`;\n }\n\n if (lastKey === 'elements') return `${path}: expected array`;\n\n if (\n lastKey === 'properties' ||\n lastKey === 'optionalProperties' ||\n lastKey === 'values'\n ) {\n return `${path}: expected object`;\n }\n\n if (lastKey === 'discriminator')\n return `${path}: expected string discriminator`;\n\n if (lastKey === 'mapping') {\n const discValue = resolveInstanceValue(value, instancePath);\n return `${path}: unknown variant \"${discValue}\"`;\n }\n\n if (schemaPath.length === 0) return `${path}: unexpected property`;\n\n return `${path}: validation error at /${schemaPath.join('/')}`;\n}\n\n/**\n * Validate a value against a JTD schema, returning an array of error messages.\n * Delegates to the `jtd` npm package for spec-compliant validation.\n */\nexport function validateJsonAgainstJTD(\n schema: JTDSchemaJson,\n value: unknown,\n definitions?: Record<string, JTDSchemaJson>\n): string[] {\n const defs =\n definitions ??\n (schema.definitions as Record<string, JTDSchemaJson> | undefined);\n\n const schemaForValidation = defs\n ? ({ ...schema, definitions: defs } as Schema)\n : (schema as Schema);\n\n // The jtd lib throws on invalid schemas (e.g., unresolved refs).\n if (!isValidSchema(schemaForValidation)) {\n if (schema.ref) {\n return [`/: unknown ref \"${schema.ref}\"`];\n }\n return [`/: invalid schema`];\n }\n\n const errors = jtdValidate(schemaForValidation, value, {\n maxDepth: MAX_VALIDATION_DEPTH,\n maxErrors: MAX_VALIDATION_ERRORS\n });\n\n return errors.map((err) =>\n formatValidationError(\n err,\n schemaForValidation as Record<string, unknown>,\n value\n )\n );\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// SIGNAL-LEVEL VALIDATION (JSON values against JTD formats)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n/** Validate a JSON value against a single SignalFormatJson. */\nexport function validateJsonAgainstSignal(\n format: SignalFormatJson,\n jsonValue: unknown\n): string[];\n/** Validate a JSON value against a SignalDescriptorJson (valid if value matches ANY JTD format). */\nexport function validateJsonAgainstSignal(\n descriptor: SignalDescriptorJson,\n jsonValue: unknown\n): string[];\nexport function validateJsonAgainstSignal(\n formatOrDescriptor: SignalFormatJson | SignalDescriptorJson,\n jsonValue: unknown\n): string[] {\n // Descriptor path \u2014 has `formats` array\n if (\n 'formats' in formatOrDescriptor &&\n Array.isArray(formatOrDescriptor.formats)\n ) {\n const jtdFormats = (\n formatOrDescriptor.formats as SignalFormatJson[]\n ).filter((f) => f.jtdSchema);\n if (jtdFormats.length === 0) {\n return ['/: no JTD formats in signal descriptor'];\n }\n // Valid if value matches ANY JTD format\n for (const format of jtdFormats) {\n const errors = validateJsonAgainstJTD(format.jtdSchema!, jsonValue);\n if (errors.length === 0) return [];\n }\n // None matched \u2014 return errors from last format attempt\n return validateJsonAgainstJTD(\n jtdFormats[jtdFormats.length - 1]!.jtdSchema!,\n jsonValue\n );\n }\n\n // Single format path\n const format = formatOrDescriptor as SignalFormatJson;\n if (!format.jtdSchema) {\n return ['/: signal format has no jtdSchema'];\n }\n return validateJsonAgainstJTD(format.jtdSchema, jsonValue);\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// JTD \u2192 JSON SCHEMA CONVERTER\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n/**\n * Convert JTD (JSON Type Definition) schema to JSON Schema.\n *\n * Supports all 8 JTD schema forms per RFC 8927:\n * - Empty form: {}\n * - Ref form: { ref: \"...\" }\n * - Type form: { type: \"...\" }\n * - Enum form: { enum: [...] }\n * - Elements form: { elements: {...} }\n * - Properties form: { properties: {...}, optionalProperties: {...} }\n * - Values form: { values: {...} }\n * - Discriminator form: { discriminator: \"...\", mapping: {...} }\n *\n * JTD `metadata.description` is preserved as JSON Schema `description`.\n * Other metadata fields are appended to the description for context.\n *\n * Top-level `definitions` are emitted as JSON Schema `$defs` and\n * referenced via `$ref` (not inlined), keeping large schemas compact.\n */\nexport function jtdToJsonSchema(\n jtdSchema: JTDSchemaJson,\n definitions?: Record<string, JTDSchemaJson>,\n isRoot = true\n): any {\n if (!jtdSchema || typeof jtdSchema !== 'object') {\n return {};\n }\n\n const isNullable = jtdSchema['nullable'];\n const defs =\n definitions ||\n (jtdSchema['definitions'] as Record<string, JTDSchemaJson> | undefined);\n\n const result: any = {};\n\n if (isRoot) {\n result.$schema = 'http://json-schema.org/draft-07/schema#';\n\n // Emit top-level definitions as $defs (only at root)\n if (defs && Object.keys(defs).length > 0) {\n result.$defs = {};\n for (const [name, defSchema] of Object.entries(defs)) {\n result.$defs[name] = convertNode(defSchema as JTDSchemaJson, defs);\n }\n }\n }\n\n // Build the schema node \u2014 delegate to convertNode for the actual form logic\n const node = convertNode(jtdSchema, defs);\n Object.assign(result, node);\n\n return result;\n}\n\n/** Convert a single JTD node to JSON Schema. Internal recursive worker. */\nfunction convertNode(\n jtdSchema: JTDSchemaJson,\n defs: Record<string, JTDSchemaJson> | undefined\n): any {\n if (!jtdSchema || typeof jtdSchema !== 'object') {\n return {};\n }\n\n const isNullable = jtdSchema['nullable'];\n const result: any = {};\n\n // Extract metadata.description \u2192 JSON Schema description\n applyMetadata(result, jtdSchema);\n\n // \u2500\u2500 Ref form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['ref']) {\n const refName = jtdSchema['ref'] as string;\n if (defs && defs[refName]) {\n const refResult: any = { $ref: `#/$defs/${refName}` };\n applyMetadata(refResult, jtdSchema);\n\n if (isNullable) {\n return {\n anyOf: [refResult, { type: 'null' }],\n ...(refResult.description\n ? { description: refResult.description }\n : {})\n };\n }\n return refResult;\n }\n return {};\n }\n\n // \u2500\u2500 Type form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['type']) {\n const typeMap: Record<string, string> = {\n boolean: 'boolean',\n string: 'string',\n timestamp: 'string',\n float32: 'number',\n float64: 'number',\n int8: 'integer',\n uint8: 'integer',\n int16: 'integer',\n uint16: 'integer',\n int32: 'integer',\n uint32: 'integer'\n };\n const jtdType = jtdSchema['type'] as string;\n const baseType = typeMap[jtdType] || 'string';\n\n result.type = isNullable ? [baseType, 'null'] : baseType;\n\n if (baseType === 'string' && jtdType === 'timestamp') {\n result.format = 'date-time';\n }\n return result;\n }\n\n // \u2500\u2500 Enum form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['enum']) {\n result.type = isNullable ? ['string', 'null'] : 'string';\n result.enum = isNullable\n ? [...(jtdSchema['enum'] as string[]), null]\n : jtdSchema['enum'];\n return result;\n }\n\n // \u2500\u2500 Elements form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['elements']) {\n result.type = isNullable ? ['array', 'null'] : 'array';\n result.items = convertNode(jtdSchema['elements'] as JTDSchemaJson, defs);\n return result;\n }\n\n // \u2500\u2500 Properties form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['properties'] || jtdSchema['optionalProperties']) {\n result.type = isNullable ? ['object', 'null'] : 'object';\n result.properties = {};\n result.required = [];\n\n if (jtdSchema['properties']) {\n for (const [key, value] of Object.entries(jtdSchema['properties'])) {\n result.properties[key] = convertNode(value as JTDSchemaJson, defs);\n result.required.push(key);\n }\n }\n\n if (jtdSchema['optionalProperties']) {\n for (const [key, value] of Object.entries(\n jtdSchema['optionalProperties']\n )) {\n result.properties[key] = convertNode(value as JTDSchemaJson, defs);\n }\n }\n\n // JTD is strict by default\n if (jtdSchema['additionalProperties'] !== true) {\n result.additionalProperties = false;\n }\n\n return result;\n }\n\n // \u2500\u2500 Values form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['values']) {\n result.type = isNullable ? ['object', 'null'] : 'object';\n result.additionalProperties = convertNode(\n jtdSchema['values'] as JTDSchemaJson,\n defs\n );\n return result;\n }\n\n // \u2500\u2500 Discriminator form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['discriminator'] && jtdSchema['mapping']) {\n const variants = [];\n const discriminatorKey = jtdSchema['discriminator'] as string;\n\n for (const [tag, schema] of Object.entries(jtdSchema['mapping'])) {\n const variantSchema = convertNode(schema as JTDSchemaJson, defs);\n\n if (!variantSchema.type) {\n variantSchema.type = 'object';\n } else if (\n variantSchema.type !== 'object' &&\n !Array.isArray(variantSchema.type)\n ) {\n variantSchema.type = 'object';\n }\n\n variantSchema.properties = variantSchema.properties || {};\n variantSchema.properties[discriminatorKey] = { const: tag };\n\n variantSchema.required = variantSchema.required || [];\n if (!variantSchema.required.includes(discriminatorKey)) {\n variantSchema.required.unshift(discriminatorKey);\n }\n\n // JTD discriminator variants are strict by default\n if (variantSchema.additionalProperties === undefined) {\n variantSchema.additionalProperties = false;\n }\n\n variants.push(variantSchema);\n }\n\n if (isNullable) {\n variants.push({ type: 'null' });\n }\n\n result.oneOf = variants;\n return result;\n }\n\n // \u2500\u2500 Empty form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n return result;\n}\n\n/**\n * Extract JTD metadata and apply as JSON Schema `description`.\n *\n * - `metadata.description` becomes `description` directly.\n * - Other metadata fields are appended as \"key: value\" lines.\n */\nfunction applyMetadata(result: any, jtdSchema: JTDSchemaJson): void {\n const metadata = jtdSchema['metadata'] as Record<string, unknown> | undefined;\n if (!metadata || typeof metadata !== 'object') return;\n\n const parts: string[] = [];\n const desc = metadata['description'];\n if (typeof desc === 'string' && desc) {\n parts.push(desc);\n }\n\n // Fold other metadata fields into description\n for (const [key, value] of Object.entries(metadata)) {\n if (key === 'description') continue;\n if (value === undefined || value === null) continue;\n const str = typeof value === 'string' ? value : JSON.stringify(value);\n parts.push(`${key}: ${str}`);\n }\n\n if (parts.length > 0) {\n result.description = parts.join('\\n');\n }\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// JTD SCHEMA VALIDATION (using the `jtd` npm package)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nexport const MAX_VALIDATION_DEPTH = 32;\nexport const MAX_VALIDATION_ERRORS = 100;\n\n/** Validate that the input is a valid JTD schema. */\nexport function validateJTDSchema(\n schema: unknown\n): { valid: true; schema: JTDSchemaJson } | { valid: false; error: string } {\n if (!isSchema(schema)) {\n return {\n valid: false,\n error: 'Invalid JTD schema: Schema does not match JTD structure'\n };\n }\n\n if (!isValidSchema(schema)) {\n return {\n valid: false,\n error:\n 'Invalid JTD schema: Schema has semantic errors (e.g., circular references, conflicting forms)'\n };\n }\n\n return { valid: true, schema: schema as unknown as JTDSchemaJson };\n}\n\n/** Parse and validate a JSON string. */\nexport function validateJSON(jsonString: string): {\n valid: boolean;\n data?: unknown;\n error?: string;\n} {\n try {\n const data = JSON.parse(jsonString);\n return { valid: true, data };\n } catch (error) {\n return {\n valid: false,\n error: `Invalid JSON: ${error instanceof Error ? error.message : 'Parse error'}`\n };\n }\n}\n\n/** Parse a JSON string and validate it as a JTD schema. */\nexport function validateJTDSchemaString(\n schemaString: string\n): { valid: true; schema: JTDSchemaJson } | { valid: false; error: string } {\n const jsonResult = validateJSON(schemaString);\n if (!jsonResult.valid) return { valid: false, error: jsonResult.error! };\n\n return validateJTDSchema(jsonResult.data);\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// MONACO EDITOR CONFIG FOR JTD SCHEMA EDITING\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n/** Monaco editor JSON schema configuration for JTD schema IntelliSense and validation. */\nexport const JTD_SCHEMA_CONFIG = {\n uri: 'https://jsontypedef.com/schemas/jtd-schema.json',\n fileMatch: ['inmemory://jtd-schema/*.json'],\n schema: {\n $schema: 'http://json-schema.org/draft-07/schema#',\n type: 'object',\n properties: {\n type: {\n description: 'Type form - defines a primitive type',\n enum: [\n 'boolean',\n 'string',\n 'timestamp',\n 'float32',\n 'float64',\n 'int8',\n 'uint8',\n 'int16',\n 'uint16',\n 'int32',\n 'uint32'\n ]\n },\n enum: {\n description: 'Enum form - defines a set of string values',\n type: 'array',\n items: { type: 'string' }\n },\n elements: {\n description: 'Elements form - defines an array with typed elements',\n $ref: '#'\n },\n properties: {\n description:\n 'Properties form - defines an object with required properties',\n type: 'object',\n additionalProperties: { $ref: '#' }\n },\n optionalProperties: {\n description: 'Optional properties - defines optional object properties',\n type: 'object',\n additionalProperties: { $ref: '#' }\n },\n values: {\n description: 'Values form - defines a map/dictionary with typed values',\n $ref: '#'\n },\n discriminator: {\n description: 'Discriminator form - defines a tagged union',\n type: 'string'\n },\n mapping: {\n description: 'Mapping for discriminator form',\n type: 'object',\n additionalProperties: { $ref: '#' }\n },\n ref: {\n description: 'Ref form - references a definition',\n type: 'string'\n },\n definitions: {\n description: 'Top-level definitions for reusable schemas',\n type: 'object',\n additionalProperties: { $ref: '#' }\n },\n nullable: {\n description: 'Allow null values',\n type: 'boolean'\n },\n metadata: {\n description: 'Custom metadata for documentation',\n type: 'object'\n },\n additionalProperties: {\n description: 'Allow additional properties (properties form only)',\n type: 'boolean'\n }\n }\n }\n};\n"],
|
|
5
|
-
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,EAAA,yBAAAC,EAAA,0BAAAC,EAAA,YAAAC,EAAA,oBAAAC,EAAA,iBAAAC,EAAA,sBAAAC,EAAA,4BAAAC,EAAA,2BAAAC,EAAA,8BAAAC,IAAA,eAAAC,EAAAZ,GAKA,IAAAa,EAAiE,eAQ3DC,EAAiB,GAGhB,SAAST,EACdU,EACAC,EACAC,EAAiB,EACR,CACT,GAAIA,EAASH,EAAgB,OAAO,KAEpC,GAAIC,EAAO,IAAK,CACd,IAAMG,EAAMF,IAAcD,EAAO,GAAG,EACpC,OAAIG,EAAYb,EAAQa,EAAKF,EAAaC,EAAS,CAAC,EAC7C,IACT,CAEA,GAAIF,EAAO,KACT,OAAQA,EAAO,KAAM,CACnB,IAAK,SACH,MAAO,cACT,IAAK,YACH,MAAO,uBACT,IAAK,UACL,IAAK,UACH,MAAO,MACT,IAAK,OACL,IAAK,QACL,IAAK,QACL,IAAK,SACL,IAAK,QACL,IAAK,SACH,OAAO,OAAO,EAAE,EAClB,IAAK,UACH,MAAO,GACT,QACE,OAAO,IACX,CAGF,GAAIA,EAAO,KACT,OAAOA,EAAO,KAAK,CAAC,GAAK,KAG3B,GAAIA,EAAO,SACT,MAAO,CACLV,EAAQU,EAAO,SAAUC,EAAaC,EAAS,CAAC,EAChDZ,EAAQU,EAAO,SAAUC,EAAaC,EAAS,CAAC,CAClD,EAGF,GAAIF,EAAO,OACT,MAAO,CAAE,KAAMV,EAAQU,EAAO,OAAQC,EAAaC,EAAS,CAAC,CAAE,EAGjE,GAAIF,EAAO,YAAcA,EAAO,mBAAoB,CAClD,IAAMI,EAA+B,CAAC,EACtC,GAAIJ,EAAO,WACT,OAAW,CAACK,EAAGC,CAAC,IAAK,OAAO,QAAQN,EAAO,UAAU,EACnDI,EAAIC,CAAC,EAAIf,EAAQgB,EAAGL,EAAaC,EAAS,CAAC,EAG/C,GAAIF,EAAO,mBACT,OAAW,CAACK,EAAGC,CAAC,IAAK,OAAO,QAAQN,EAAO,kBAAkB,EAC3DI,EAAIC,CAAC,EAAIf,EAAQgB,EAAGL,EAAaC,EAAS,CAAC,EAG/C,OAAOE,CACT,CAEA,GAAIJ,EAAO,eAAiBA,EAAO,QAAS,CAC1C,IAAMO,EAAW,OAAO,KAAKP,EAAO,OAAO,EAAE,CAAC,EAC9C,GAAIO,EAAU,CACZ,IAAMC,EAAUR,EAAO,QAAQO,CAAQ,EACjCH,EAAMd,EAAQkB,EAASP,EAAaC,EAAS,CAAC,EAIpD,OAAAE,EAAIJ,EAAO,aAAa,EAAIO,EACrBH,CACT,CACA,OAAO,IACT,CAGA,OAAO,IACT,CAMA,IAAMK,EAAgB,IAAI,IAAI,CAC5B,OACA,QACA,QACA,SACA,QACA,QACF,CAAC,EAED,SAASC,EAAmBC,EAAgC,CAC1D,OAAIA,EAAa,SAAW,EAAU,
|
|
6
|
-
"names": ["signals_exports", "__export", "JTD_SCHEMA_CONFIG", "MAX_VALIDATION_DEPTH", "MAX_VALIDATION_ERRORS", "fuzzJTD", "jtdToJsonSchema", "validateJSON", "validateJTDSchema", "validateJTDSchemaString", "validateJsonAgainstJTD", "validateJsonAgainstSignal", "__toCommonJS", "import_jtd", "FUZZ_MAX_DEPTH", "schema", "definitions", "_depth", "def", "obj", "k", "v", "firstKey", "variant", "INTEGER_TYPES", "formatInstancePath", "instancePath", "p", "
|
|
4
|
+
"sourcesContent": ["import type {\n JTDSchemaJson,\n SignalDescriptorJson,\n SignalFormatJson\n} from '../api';\nimport { isSchema, isValidSchema, validate as jtdValidate } from 'jtd';\nimport type { Schema, ValidationError } from 'jtd';\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// JTD FUZZER (generate sample values from JTD schemas)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n/** Maximum recursion depth for fuzzJTD to prevent infinite loops on self-referencing schemas. */\nconst FUZZ_MAX_DEPTH = 10;\n\n/** Generate a fuzzed (sample) value from a JTD schema. */\nexport function fuzzJTD(\n schema: JTDSchemaJson,\n definitions?: Record<string, JTDSchemaJson>,\n _depth: number = 0\n): unknown {\n if (_depth > FUZZ_MAX_DEPTH) return null;\n\n if (schema.ref) {\n const def = definitions?.[schema.ref];\n if (def) return fuzzJTD(def, definitions, _depth + 1);\n return null;\n }\n\n if (schema.type) {\n switch (schema.type) {\n case 'string':\n return 'Lorem ipsum';\n case 'timestamp':\n return '2024-01-15T10:30:00Z';\n case 'float32':\n case 'float64':\n return 42.5;\n case 'int8':\n case 'uint8':\n case 'int16':\n case 'uint16':\n case 'int32':\n case 'uint32':\n return BigInt(42);\n case 'boolean':\n return true;\n default:\n return null;\n }\n }\n\n if (schema.enum) {\n return schema.enum[0] ?? null;\n }\n\n if (schema.elements) {\n return [\n fuzzJTD(schema.elements, definitions, _depth + 1),\n fuzzJTD(schema.elements, definitions, _depth + 1)\n ];\n }\n\n if (schema.values) {\n return { key1: fuzzJTD(schema.values, definitions, _depth + 1) };\n }\n\n if (schema.properties || schema.optionalProperties) {\n const obj: Record<string, unknown> = {};\n if (schema.properties) {\n for (const [k, v] of Object.entries(schema.properties)) {\n obj[k] = fuzzJTD(v, definitions, _depth + 1);\n }\n }\n if (schema.optionalProperties) {\n for (const [k, v] of Object.entries(schema.optionalProperties)) {\n obj[k] = fuzzJTD(v, definitions, _depth + 1);\n }\n }\n return obj;\n }\n\n if (schema.discriminator && schema.mapping) {\n const firstKey = Object.keys(schema.mapping)[0];\n if (firstKey) {\n const variant = schema.mapping[firstKey]!;\n const obj = fuzzJTD(variant, definitions, _depth + 1) as Record<\n string,\n unknown\n >;\n obj[schema.discriminator] = firstKey;\n return obj;\n }\n return null;\n }\n\n // Empty schema\n return null;\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// JTD VALUE VALIDATION (delegates to the `jtd` npm package)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nconst INTEGER_TYPES = new Set([\n 'int8',\n 'uint8',\n 'int16',\n 'uint16',\n 'int32',\n 'uint32'\n]);\n\nfunction formatInstancePath(instancePath: string[]): string {\n if (instancePath.length === 0) return 'root';\n const joined = instancePath\n .map((p, i) => (/^\\d+$/.test(p) ? `[${p}]` : i === 0 ? p : `.${p}`))\n .join('');\n return `'${joined}'`;\n}\n\nfunction resolveSchemaParent(\n schema: Record<string, unknown>,\n schemaPath: string[]\n): Record<string, unknown> {\n let current: any = schema;\n for (let i = 0; i < schemaPath.length - 1; i++) {\n if (current && typeof current === 'object' && schemaPath[i]! in current) {\n current = current[schemaPath[i]!];\n } else {\n break;\n }\n }\n return current as Record<string, unknown>;\n}\n\nfunction resolveInstanceValue(value: unknown, instancePath: string[]): unknown {\n let current = value;\n for (const key of instancePath) {\n if (current && typeof current === 'object') {\n current = (current as Record<string, unknown>)[key];\n } else {\n return undefined;\n }\n }\n return current;\n}\n\nfunction formatValidationError(\n error: ValidationError,\n schema: Record<string, unknown>,\n value: unknown\n): string {\n const { instancePath, schemaPath } = error;\n const path = formatInstancePath(instancePath);\n const lastKey = schemaPath[schemaPath.length - 1];\n const paramLabel = path === 'root' ? 'root value' : `parameter ${path}`;\n\n if (lastKey === 'type') {\n const parent = resolveSchemaParent(schema, schemaPath);\n const jtdType = parent?.type as string;\n if (jtdType === 'boolean') return `${paramLabel}: expected boolean`;\n if (jtdType === 'string') return `${paramLabel}: expected string`;\n if (jtdType === 'timestamp')\n return `${paramLabel}: expected timestamp string`;\n if (INTEGER_TYPES.has(jtdType)) return `${paramLabel}: expected integer`;\n return `${paramLabel}: expected number`;\n }\n\n if (lastKey === 'enum') {\n const parent = resolveSchemaParent(schema, schemaPath);\n const enumValues = parent?.enum as string[];\n return `${paramLabel}: expected one of [${enumValues.join(', ')}]`;\n }\n\n if (\n schemaPath.length >= 2 &&\n schemaPath[schemaPath.length - 2] === 'properties' &&\n lastKey\n ) {\n if (path === 'root') {\n return `missing required parameter '${lastKey}'`;\n }\n return `missing required parameter ${path}.${lastKey}`;\n }\n\n if (lastKey === 'elements') return `${paramLabel}: expected array`;\n\n if (\n lastKey === 'properties' ||\n lastKey === 'optionalProperties' ||\n lastKey === 'values'\n ) {\n return `${paramLabel}: expected object`;\n }\n\n if (lastKey === 'discriminator') {\n // Find the discriminator field name from the schema\n const parent = resolveSchemaParent(schema, schemaPath);\n const discField = parent?.discriminator as string | undefined;\n if (discField) {\n return `${paramLabel}: parameter '${discField}' must be a string`;\n }\n return `${paramLabel}: expected string discriminator`;\n }\n\n if (lastKey === 'mapping') {\n const discValue = resolveInstanceValue(value, instancePath);\n // Try to list valid variants from the mapping\n const parent = resolveSchemaParent(schema, schemaPath);\n const mapping = parent?.mapping as Record<string, unknown> | undefined;\n const validVariants = mapping ? Object.keys(mapping) : [];\n if (validVariants.length > 0) {\n return `${paramLabel}: unknown variant \"${discValue}\". Valid values: [${validVariants.join(', ')}]`;\n }\n return `${paramLabel}: unknown variant \"${discValue}\"`;\n }\n\n if (schemaPath.length === 0) return `${paramLabel}: unexpected property`;\n\n return `${paramLabel}: validation error at /${schemaPath.join('/')}`;\n}\n\n/**\n * Validate a value against a JTD schema, returning an array of error messages.\n * Delegates to the `jtd` npm package for spec-compliant validation.\n */\nexport function validateJsonAgainstJTD(\n schema: JTDSchemaJson,\n value: unknown,\n definitions?: Record<string, JTDSchemaJson>\n): string[] {\n const defs =\n definitions ??\n (schema.definitions as Record<string, JTDSchemaJson> | undefined);\n\n const schemaForValidation = defs\n ? ({ ...schema, definitions: defs } as Schema)\n : (schema as Schema);\n\n // The jtd lib throws on invalid schemas (e.g., unresolved refs).\n if (!isValidSchema(schemaForValidation)) {\n if (schema.ref) {\n return [`unknown ref \"${schema.ref}\" in schema`];\n }\n return [`invalid schema`];\n }\n\n const errors = jtdValidate(schemaForValidation, value, {\n maxDepth: MAX_VALIDATION_DEPTH,\n maxErrors: MAX_VALIDATION_ERRORS\n });\n\n return errors.map((err) =>\n formatValidationError(\n err,\n schemaForValidation as Record<string, unknown>,\n value\n )\n );\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// SIGNAL-LEVEL VALIDATION (JSON values against JTD formats)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n/** Validate a JSON value against a single SignalFormatJson. */\nexport function validateJsonAgainstSignal(\n format: SignalFormatJson,\n jsonValue: unknown\n): string[];\n/** Validate a JSON value against a SignalDescriptorJson (valid if value matches ANY JTD format). */\nexport function validateJsonAgainstSignal(\n descriptor: SignalDescriptorJson,\n jsonValue: unknown\n): string[];\nexport function validateJsonAgainstSignal(\n formatOrDescriptor: SignalFormatJson | SignalDescriptorJson,\n jsonValue: unknown\n): string[] {\n // Descriptor path \u2014 has `formats` array\n if (\n 'formats' in formatOrDescriptor &&\n Array.isArray(formatOrDescriptor.formats)\n ) {\n const jtdFormats = (\n formatOrDescriptor.formats as SignalFormatJson[]\n ).filter((f) => f.jtdSchema);\n if (jtdFormats.length === 0) {\n return ['no JTD formats in signal descriptor'];\n }\n // Valid if value matches ANY JTD format\n for (const format of jtdFormats) {\n const errors = validateJsonAgainstJTD(format.jtdSchema!, jsonValue);\n if (errors.length === 0) return [];\n }\n // None matched \u2014 return errors from last format attempt\n return validateJsonAgainstJTD(\n jtdFormats[jtdFormats.length - 1]!.jtdSchema!,\n jsonValue\n );\n }\n\n // Single format path\n const format = formatOrDescriptor as SignalFormatJson;\n if (!format.jtdSchema) {\n return ['signal format has no jtdSchema'];\n }\n return validateJsonAgainstJTD(format.jtdSchema, jsonValue);\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// JTD \u2192 JSON SCHEMA CONVERTER\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n/**\n * Convert JTD (JSON Type Definition) schema to JSON Schema.\n *\n * Supports all 8 JTD schema forms per RFC 8927:\n * - Empty form: {}\n * - Ref form: { ref: \"...\" }\n * - Type form: { type: \"...\" }\n * - Enum form: { enum: [...] }\n * - Elements form: { elements: {...} }\n * - Properties form: { properties: {...}, optionalProperties: {...} }\n * - Values form: { values: {...} }\n * - Discriminator form: { discriminator: \"...\", mapping: {...} }\n *\n * JTD `metadata.description` is preserved as JSON Schema `description`.\n * Other metadata fields are appended to the description for context.\n *\n * Top-level `definitions` are emitted as JSON Schema `$defs` and\n * referenced via `$ref` (not inlined), keeping large schemas compact.\n */\nexport function jtdToJsonSchema(\n jtdSchema: JTDSchemaJson,\n definitions?: Record<string, JTDSchemaJson>,\n isRoot = true\n): any {\n if (!jtdSchema || typeof jtdSchema !== 'object') {\n return {};\n }\n\n const isNullable = jtdSchema['nullable'];\n const defs =\n definitions ||\n (jtdSchema['definitions'] as Record<string, JTDSchemaJson> | undefined);\n\n const result: any = {};\n\n if (isRoot) {\n result.$schema = 'http://json-schema.org/draft-07/schema#';\n\n // Emit top-level definitions as $defs (only at root)\n if (defs && Object.keys(defs).length > 0) {\n result.$defs = {};\n for (const [name, defSchema] of Object.entries(defs)) {\n result.$defs[name] = convertNode(defSchema as JTDSchemaJson, defs);\n }\n }\n }\n\n // Build the schema node \u2014 delegate to convertNode for the actual form logic\n const node = convertNode(jtdSchema, defs);\n Object.assign(result, node);\n\n return result;\n}\n\n/** Convert a single JTD node to JSON Schema. Internal recursive worker. */\nfunction convertNode(\n jtdSchema: JTDSchemaJson,\n defs: Record<string, JTDSchemaJson> | undefined\n): any {\n if (!jtdSchema || typeof jtdSchema !== 'object') {\n return {};\n }\n\n const isNullable = jtdSchema['nullable'];\n const result: any = {};\n\n // Extract metadata.description \u2192 JSON Schema description\n applyMetadata(result, jtdSchema);\n\n // \u2500\u2500 Ref form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['ref']) {\n const refName = jtdSchema['ref'] as string;\n if (defs && defs[refName]) {\n const refResult: any = { $ref: `#/$defs/${refName}` };\n applyMetadata(refResult, jtdSchema);\n\n if (isNullable) {\n return {\n anyOf: [refResult, { type: 'null' }],\n ...(refResult.description\n ? { description: refResult.description }\n : {})\n };\n }\n return refResult;\n }\n return {};\n }\n\n // \u2500\u2500 Type form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['type']) {\n const typeMap: Record<string, string> = {\n boolean: 'boolean',\n string: 'string',\n timestamp: 'string',\n float32: 'number',\n float64: 'number',\n int8: 'integer',\n uint8: 'integer',\n int16: 'integer',\n uint16: 'integer',\n int32: 'integer',\n uint32: 'integer'\n };\n const jtdType = jtdSchema['type'] as string;\n const baseType = typeMap[jtdType] || 'string';\n\n result.type = isNullable ? [baseType, 'null'] : baseType;\n\n if (baseType === 'string' && jtdType === 'timestamp') {\n result.format = 'date-time';\n }\n return result;\n }\n\n // \u2500\u2500 Enum form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['enum']) {\n result.type = isNullable ? ['string', 'null'] : 'string';\n result.enum = isNullable\n ? [...(jtdSchema['enum'] as string[]), null]\n : jtdSchema['enum'];\n return result;\n }\n\n // \u2500\u2500 Elements form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['elements']) {\n result.type = isNullable ? ['array', 'null'] : 'array';\n result.items = convertNode(jtdSchema['elements'] as JTDSchemaJson, defs);\n return result;\n }\n\n // \u2500\u2500 Properties form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['properties'] || jtdSchema['optionalProperties']) {\n result.type = isNullable ? ['object', 'null'] : 'object';\n result.properties = {};\n result.required = [];\n\n if (jtdSchema['properties']) {\n for (const [key, value] of Object.entries(jtdSchema['properties'])) {\n result.properties[key] = convertNode(value as JTDSchemaJson, defs);\n result.required.push(key);\n }\n }\n\n if (jtdSchema['optionalProperties']) {\n for (const [key, value] of Object.entries(\n jtdSchema['optionalProperties']\n )) {\n result.properties[key] = convertNode(value as JTDSchemaJson, defs);\n }\n }\n\n // JTD is strict by default\n if (jtdSchema['additionalProperties'] !== true) {\n result.additionalProperties = false;\n }\n\n return result;\n }\n\n // \u2500\u2500 Values form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['values']) {\n result.type = isNullable ? ['object', 'null'] : 'object';\n result.additionalProperties = convertNode(\n jtdSchema['values'] as JTDSchemaJson,\n defs\n );\n return result;\n }\n\n // \u2500\u2500 Discriminator form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n if (jtdSchema['discriminator'] && jtdSchema['mapping']) {\n const variants = [];\n const discriminatorKey = jtdSchema['discriminator'] as string;\n\n for (const [tag, schema] of Object.entries(jtdSchema['mapping'])) {\n const variantSchema = convertNode(schema as JTDSchemaJson, defs);\n\n if (!variantSchema.type) {\n variantSchema.type = 'object';\n } else if (\n variantSchema.type !== 'object' &&\n !Array.isArray(variantSchema.type)\n ) {\n variantSchema.type = 'object';\n }\n\n variantSchema.properties = variantSchema.properties || {};\n variantSchema.properties[discriminatorKey] = { const: tag };\n\n variantSchema.required = variantSchema.required || [];\n if (!variantSchema.required.includes(discriminatorKey)) {\n variantSchema.required.unshift(discriminatorKey);\n }\n\n // JTD discriminator variants are strict by default\n if (variantSchema.additionalProperties === undefined) {\n variantSchema.additionalProperties = false;\n }\n\n variants.push(variantSchema);\n }\n\n if (isNullable) {\n variants.push({ type: 'null' });\n }\n\n result.oneOf = variants;\n return result;\n }\n\n // \u2500\u2500 Empty form \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n return result;\n}\n\n/**\n * Extract JTD metadata and apply as JSON Schema `description`.\n *\n * - `metadata.description` becomes `description` directly.\n * - Other metadata fields are appended as \"key: value\" lines.\n */\nfunction applyMetadata(result: any, jtdSchema: JTDSchemaJson): void {\n const metadata = jtdSchema['metadata'] as Record<string, unknown> | undefined;\n if (!metadata || typeof metadata !== 'object') return;\n\n const parts: string[] = [];\n const desc = metadata['description'];\n if (typeof desc === 'string' && desc) {\n parts.push(desc);\n }\n\n // Fold other metadata fields into description\n for (const [key, value] of Object.entries(metadata)) {\n if (key === 'description') continue;\n if (value === undefined || value === null) continue;\n const str = typeof value === 'string' ? value : JSON.stringify(value);\n parts.push(`${key}: ${str}`);\n }\n\n if (parts.length > 0) {\n result.description = parts.join('\\n');\n }\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// JTD SCHEMA VALIDATION (using the `jtd` npm package)\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nexport const MAX_VALIDATION_DEPTH = 32;\nexport const MAX_VALIDATION_ERRORS = 100;\n\n/** Validate that the input is a valid JTD schema. */\nexport function validateJTDSchema(\n schema: unknown\n): { valid: true; schema: JTDSchemaJson } | { valid: false; error: string } {\n if (!isSchema(schema)) {\n return {\n valid: false,\n error: 'Invalid JTD schema: Schema does not match JTD structure'\n };\n }\n\n if (!isValidSchema(schema)) {\n return {\n valid: false,\n error:\n 'Invalid JTD schema: Schema has semantic errors (e.g., circular references, conflicting forms)'\n };\n }\n\n return { valid: true, schema: schema as unknown as JTDSchemaJson };\n}\n\n/** Parse and validate a JSON string. */\nexport function validateJSON(jsonString: string): {\n valid: boolean;\n data?: unknown;\n error?: string;\n} {\n try {\n const data = JSON.parse(jsonString);\n return { valid: true, data };\n } catch (error) {\n return {\n valid: false,\n error: `Invalid JSON: ${error instanceof Error ? error.message : 'Parse error'}`\n };\n }\n}\n\n/** Parse a JSON string and validate it as a JTD schema. */\nexport function validateJTDSchemaString(\n schemaString: string\n): { valid: true; schema: JTDSchemaJson } | { valid: false; error: string } {\n const jsonResult = validateJSON(schemaString);\n if (!jsonResult.valid) return { valid: false, error: jsonResult.error! };\n\n return validateJTDSchema(jsonResult.data);\n}\n\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n// MONACO EDITOR CONFIG FOR JTD SCHEMA EDITING\n// \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n/** Monaco editor JSON schema configuration for JTD schema IntelliSense and validation. */\nexport const JTD_SCHEMA_CONFIG = {\n uri: 'https://jsontypedef.com/schemas/jtd-schema.json',\n fileMatch: ['inmemory://jtd-schema/*.json'],\n schema: {\n $schema: 'http://json-schema.org/draft-07/schema#',\n type: 'object',\n properties: {\n type: {\n description: 'Type form - defines a primitive type',\n enum: [\n 'boolean',\n 'string',\n 'timestamp',\n 'float32',\n 'float64',\n 'int8',\n 'uint8',\n 'int16',\n 'uint16',\n 'int32',\n 'uint32'\n ]\n },\n enum: {\n description: 'Enum form - defines a set of string values',\n type: 'array',\n items: { type: 'string' }\n },\n elements: {\n description: 'Elements form - defines an array with typed elements',\n $ref: '#'\n },\n properties: {\n description:\n 'Properties form - defines an object with required properties',\n type: 'object',\n additionalProperties: { $ref: '#' }\n },\n optionalProperties: {\n description: 'Optional properties - defines optional object properties',\n type: 'object',\n additionalProperties: { $ref: '#' }\n },\n values: {\n description: 'Values form - defines a map/dictionary with typed values',\n $ref: '#'\n },\n discriminator: {\n description: 'Discriminator form - defines a tagged union',\n type: 'string'\n },\n mapping: {\n description: 'Mapping for discriminator form',\n type: 'object',\n additionalProperties: { $ref: '#' }\n },\n ref: {\n description: 'Ref form - references a definition',\n type: 'string'\n },\n definitions: {\n description: 'Top-level definitions for reusable schemas',\n type: 'object',\n additionalProperties: { $ref: '#' }\n },\n nullable: {\n description: 'Allow null values',\n type: 'boolean'\n },\n metadata: {\n description: 'Custom metadata for documentation',\n type: 'object'\n },\n additionalProperties: {\n description: 'Allow additional properties (properties form only)',\n type: 'boolean'\n }\n }\n }\n};\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,uBAAAE,EAAA,yBAAAC,EAAA,0BAAAC,EAAA,YAAAC,EAAA,oBAAAC,EAAA,iBAAAC,EAAA,sBAAAC,EAAA,4BAAAC,EAAA,2BAAAC,EAAA,8BAAAC,IAAA,eAAAC,EAAAZ,GAKA,IAAAa,EAAiE,eAQ3DC,EAAiB,GAGhB,SAAST,EACdU,EACAC,EACAC,EAAiB,EACR,CACT,GAAIA,EAASH,EAAgB,OAAO,KAEpC,GAAIC,EAAO,IAAK,CACd,IAAMG,EAAMF,IAAcD,EAAO,GAAG,EACpC,OAAIG,EAAYb,EAAQa,EAAKF,EAAaC,EAAS,CAAC,EAC7C,IACT,CAEA,GAAIF,EAAO,KACT,OAAQA,EAAO,KAAM,CACnB,IAAK,SACH,MAAO,cACT,IAAK,YACH,MAAO,uBACT,IAAK,UACL,IAAK,UACH,MAAO,MACT,IAAK,OACL,IAAK,QACL,IAAK,QACL,IAAK,SACL,IAAK,QACL,IAAK,SACH,OAAO,OAAO,EAAE,EAClB,IAAK,UACH,MAAO,GACT,QACE,OAAO,IACX,CAGF,GAAIA,EAAO,KACT,OAAOA,EAAO,KAAK,CAAC,GAAK,KAG3B,GAAIA,EAAO,SACT,MAAO,CACLV,EAAQU,EAAO,SAAUC,EAAaC,EAAS,CAAC,EAChDZ,EAAQU,EAAO,SAAUC,EAAaC,EAAS,CAAC,CAClD,EAGF,GAAIF,EAAO,OACT,MAAO,CAAE,KAAMV,EAAQU,EAAO,OAAQC,EAAaC,EAAS,CAAC,CAAE,EAGjE,GAAIF,EAAO,YAAcA,EAAO,mBAAoB,CAClD,IAAMI,EAA+B,CAAC,EACtC,GAAIJ,EAAO,WACT,OAAW,CAACK,EAAGC,CAAC,IAAK,OAAO,QAAQN,EAAO,UAAU,EACnDI,EAAIC,CAAC,EAAIf,EAAQgB,EAAGL,EAAaC,EAAS,CAAC,EAG/C,GAAIF,EAAO,mBACT,OAAW,CAACK,EAAGC,CAAC,IAAK,OAAO,QAAQN,EAAO,kBAAkB,EAC3DI,EAAIC,CAAC,EAAIf,EAAQgB,EAAGL,EAAaC,EAAS,CAAC,EAG/C,OAAOE,CACT,CAEA,GAAIJ,EAAO,eAAiBA,EAAO,QAAS,CAC1C,IAAMO,EAAW,OAAO,KAAKP,EAAO,OAAO,EAAE,CAAC,EAC9C,GAAIO,EAAU,CACZ,IAAMC,EAAUR,EAAO,QAAQO,CAAQ,EACjCH,EAAMd,EAAQkB,EAASP,EAAaC,EAAS,CAAC,EAIpD,OAAAE,EAAIJ,EAAO,aAAa,EAAIO,EACrBH,CACT,CACA,OAAO,IACT,CAGA,OAAO,IACT,CAMA,IAAMK,EAAgB,IAAI,IAAI,CAC5B,OACA,QACA,QACA,SACA,QACA,QACF,CAAC,EAED,SAASC,EAAmBC,EAAgC,CAC1D,OAAIA,EAAa,SAAW,EAAU,OAI/B,IAHQA,EACZ,IAAI,CAACC,EAAGC,IAAO,QAAQ,KAAKD,CAAC,EAAI,IAAIA,CAAC,IAAMC,IAAM,EAAID,EAAI,IAAIA,CAAC,EAAG,EAClE,KAAK,EAAE,CACO,GACnB,CAEA,SAASE,EACPd,EACAe,EACyB,CACzB,IAAIC,EAAehB,EACnB,QAASa,EAAI,EAAGA,EAAIE,EAAW,OAAS,IAClCC,GAAW,OAAOA,GAAY,UAAYD,EAAWF,CAAC,IAAMG,GADvBH,IAEvCG,EAAUA,EAAQD,EAAWF,CAAC,CAAE,EAKpC,OAAOG,CACT,CAEA,SAASC,EAAqBC,EAAgBP,EAAiC,CAC7E,IAAIK,EAAUE,EACd,QAAWC,KAAOR,EAChB,GAAIK,GAAW,OAAOA,GAAY,SAChCA,EAAWA,EAAoCG,CAAG,MAElD,QAGJ,OAAOH,CACT,CAEA,SAASI,EACPC,EACArB,EACAkB,EACQ,CACR,GAAM,CAAE,aAAAP,EAAc,WAAAI,CAAW,EAAIM,EAC/BC,EAAOZ,EAAmBC,CAAY,EACtCY,EAAUR,EAAWA,EAAW,OAAS,CAAC,EAC1CS,EAAaF,IAAS,OAAS,aAAe,aAAaA,CAAI,GAErE,GAAIC,IAAY,OAAQ,CAEtB,IAAME,EADSX,EAAoBd,EAAQe,CAAU,GAC7B,KACxB,OAAIU,IAAY,UAAkB,GAAGD,CAAU,qBAC3CC,IAAY,SAAiB,GAAGD,CAAU,oBAC1CC,IAAY,YACP,GAAGD,CAAU,8BAClBf,EAAc,IAAIgB,CAAO,EAAU,GAAGD,CAAU,qBAC7C,GAAGA,CAAU,mBACtB,CAEA,GAAID,IAAY,OAAQ,CAEtB,IAAMG,EADSZ,EAAoBd,EAAQe,CAAU,GAC1B,KAC3B,MAAO,GAAGS,CAAU,sBAAsBE,EAAW,KAAK,IAAI,CAAC,GACjE,CAEA,GACEX,EAAW,QAAU,GACrBA,EAAWA,EAAW,OAAS,CAAC,IAAM,cACtCQ,EAEA,OAAID,IAAS,OACJ,+BAA+BC,CAAO,IAExC,8BAA8BD,CAAI,IAAIC,CAAO,GAGtD,GAAIA,IAAY,WAAY,MAAO,GAAGC,CAAU,mBAEhD,GACED,IAAY,cACZA,IAAY,sBACZA,IAAY,SAEZ,MAAO,GAAGC,CAAU,oBAGtB,GAAID,IAAY,gBAAiB,CAG/B,IAAMI,EADSb,EAAoBd,EAAQe,CAAU,GAC3B,cAC1B,OAAIY,EACK,GAAGH,CAAU,gBAAgBG,CAAS,qBAExC,GAAGH,CAAU,iCACtB,CAEA,GAAID,IAAY,UAAW,CACzB,IAAMK,EAAYX,EAAqBC,EAAOP,CAAY,EAGpDkB,EADSf,EAAoBd,EAAQe,CAAU,GAC7B,QAClBe,EAAgBD,EAAU,OAAO,KAAKA,CAAO,EAAI,CAAC,EACxD,OAAIC,EAAc,OAAS,EAClB,GAAGN,CAAU,sBAAsBI,CAAS,qBAAqBE,EAAc,KAAK,IAAI,CAAC,IAE3F,GAAGN,CAAU,sBAAsBI,CAAS,GACrD,CAEA,OAAIb,EAAW,SAAW,EAAU,GAAGS,CAAU,wBAE1C,GAAGA,CAAU,0BAA0BT,EAAW,KAAK,GAAG,CAAC,EACpE,CAMO,SAASpB,EACdK,EACAkB,EACAjB,EACU,CACV,IAAM8B,EACJ9B,GACCD,EAAO,YAEJgC,EAAsBD,EACvB,CAAE,GAAG/B,EAAQ,YAAa+B,CAAK,EAC/B/B,EAGL,SAAK,iBAAcgC,CAAmB,KAOvB,EAAAC,UAAYD,EAAqBd,EAAO,CACrD,SAAU9B,EACV,UAAWC,CACb,CAAC,EAEa,IAAK6C,GACjBd,EACEc,EACAF,EACAd,CACF,CACF,EAjBMlB,EAAO,IACF,CAAC,gBAAgBA,EAAO,GAAG,aAAa,EAE1C,CAAC,gBAAgB,CAe5B,CAgBO,SAASJ,EACduC,EACAC,EACU,CAEV,GACE,YAAaD,GACb,MAAM,QAAQA,EAAmB,OAAO,EACxC,CACA,IAAME,EACJF,EAAmB,QACnB,OAAQG,GAAMA,EAAE,SAAS,EAC3B,GAAID,EAAW,SAAW,EACxB,MAAO,CAAC,qCAAqC,EAG/C,QAAWE,KAAUF,EAEnB,GADe1C,EAAuB4C,EAAO,UAAYH,CAAS,EACvD,SAAW,EAAG,MAAO,CAAC,EAGnC,OAAOzC,EACL0C,EAAWA,EAAW,OAAS,CAAC,EAAG,UACnCD,CACF,CACF,CAGA,IAAMG,EAASJ,EACf,OAAKI,EAAO,UAGL5C,EAAuB4C,EAAO,UAAWH,CAAS,EAFhD,CAAC,gCAAgC,CAG5C,CAyBO,SAAS7C,EACdiD,EACAvC,EACAwC,EAAS,GACJ,CACL,GAAI,CAACD,GAAa,OAAOA,GAAc,SACrC,MAAO,CAAC,EAGV,IAAME,EAAaF,EAAU,SACvBT,EACJ9B,GACCuC,EAAU,YAEPG,EAAc,CAAC,EAErB,GAAIF,IACFE,EAAO,QAAU,0CAGbZ,GAAQ,OAAO,KAAKA,CAAI,EAAE,OAAS,GAAG,CACxCY,EAAO,MAAQ,CAAC,EAChB,OAAW,CAACC,EAAMC,CAAS,IAAK,OAAO,QAAQd,CAAI,EACjDY,EAAO,MAAMC,CAAI,EAAIE,EAAYD,EAA4Bd,CAAI,CAErE,CAIF,IAAMgB,EAAOD,EAAYN,EAAWT,CAAI,EACxC,cAAO,OAAOY,EAAQI,CAAI,EAEnBJ,CACT,CAGA,SAASG,EACPN,EACAT,EACK,CACL,GAAI,CAACS,GAAa,OAAOA,GAAc,SACrC,MAAO,CAAC,EAGV,IAAME,EAAaF,EAAU,SACvBG,EAAc,CAAC,EAMrB,GAHAK,EAAcL,EAAQH,CAAS,EAG3BA,EAAU,IAAQ,CACpB,IAAMS,EAAUT,EAAU,IAC1B,GAAIT,GAAQA,EAAKkB,CAAO,EAAG,CACzB,IAAMC,EAAiB,CAAE,KAAM,WAAWD,CAAO,EAAG,EAGpD,OAFAD,EAAcE,EAAWV,CAAS,EAE9BE,EACK,CACL,MAAO,CAACQ,EAAW,CAAE,KAAM,MAAO,CAAC,EACnC,GAAIA,EAAU,YACV,CAAE,YAAaA,EAAU,WAAY,EACrC,CAAC,CACP,EAEKA,CACT,CACA,MAAO,CAAC,CACV,CAGA,GAAIV,EAAU,KAAS,CACrB,IAAMW,EAAkC,CACtC,QAAS,UACT,OAAQ,SACR,UAAW,SACX,QAAS,SACT,QAAS,SACT,KAAM,UACN,MAAO,UACP,MAAO,UACP,OAAQ,UACR,MAAO,UACP,OAAQ,SACV,EACM1B,EAAUe,EAAU,KACpBY,EAAWD,EAAQ1B,CAAO,GAAK,SAErC,OAAAkB,EAAO,KAAOD,EAAa,CAACU,EAAU,MAAM,EAAIA,EAE5CA,IAAa,UAAY3B,IAAY,cACvCkB,EAAO,OAAS,aAEXA,CACT,CAGA,GAAIH,EAAU,KACZ,OAAAG,EAAO,KAAOD,EAAa,CAAC,SAAU,MAAM,EAAI,SAChDC,EAAO,KAAOD,EACV,CAAC,GAAIF,EAAU,KAAsB,IAAI,EACzCA,EAAU,KACPG,EAIT,GAAIH,EAAU,SACZ,OAAAG,EAAO,KAAOD,EAAa,CAAC,QAAS,MAAM,EAAI,QAC/CC,EAAO,MAAQG,EAAYN,EAAU,SAA8BT,CAAI,EAChEY,EAIT,GAAIH,EAAU,YAAiBA,EAAU,mBAAuB,CAK9D,GAJAG,EAAO,KAAOD,EAAa,CAAC,SAAU,MAAM,EAAI,SAChDC,EAAO,WAAa,CAAC,EACrBA,EAAO,SAAW,CAAC,EAEfH,EAAU,WACZ,OAAW,CAACrB,EAAKD,CAAK,IAAK,OAAO,QAAQsB,EAAU,UAAa,EAC/DG,EAAO,WAAWxB,CAAG,EAAI2B,EAAY5B,EAAwBa,CAAI,EACjEY,EAAO,SAAS,KAAKxB,CAAG,EAI5B,GAAIqB,EAAU,mBACZ,OAAW,CAACrB,EAAKD,CAAK,IAAK,OAAO,QAChCsB,EAAU,kBACZ,EACEG,EAAO,WAAWxB,CAAG,EAAI2B,EAAY5B,EAAwBa,CAAI,EAKrE,OAAIS,EAAU,uBAA4B,KACxCG,EAAO,qBAAuB,IAGzBA,CACT,CAGA,GAAIH,EAAU,OACZ,OAAAG,EAAO,KAAOD,EAAa,CAAC,SAAU,MAAM,EAAI,SAChDC,EAAO,qBAAuBG,EAC5BN,EAAU,OACVT,CACF,EACOY,EAIT,GAAIH,EAAU,eAAoBA,EAAU,QAAY,CACtD,IAAMa,EAAW,CAAC,EACZC,EAAmBd,EAAU,cAEnC,OAAW,CAACe,EAAKvD,CAAM,IAAK,OAAO,QAAQwC,EAAU,OAAU,EAAG,CAChE,IAAMgB,EAAgBV,EAAY9C,EAAyB+B,CAAI,EAE1DyB,EAAc,KAGjBA,EAAc,OAAS,UACvB,CAAC,MAAM,QAAQA,EAAc,IAAI,IAEjCA,EAAc,KAAO,UALrBA,EAAc,KAAO,SAQvBA,EAAc,WAAaA,EAAc,YAAc,CAAC,EACxDA,EAAc,WAAWF,CAAgB,EAAI,CAAE,MAAOC,CAAI,EAE1DC,EAAc,SAAWA,EAAc,UAAY,CAAC,EAC/CA,EAAc,SAAS,SAASF,CAAgB,GACnDE,EAAc,SAAS,QAAQF,CAAgB,EAI7CE,EAAc,uBAAyB,SACzCA,EAAc,qBAAuB,IAGvCH,EAAS,KAAKG,CAAa,CAC7B,CAEA,OAAId,GACFW,EAAS,KAAK,CAAE,KAAM,MAAO,CAAC,EAGhCV,EAAO,MAAQU,EACRV,CACT,CAGA,OAAOA,CACT,CAQA,SAASK,EAAcL,EAAaH,EAAgC,CAClE,IAAMiB,EAAWjB,EAAU,SAC3B,GAAI,CAACiB,GAAY,OAAOA,GAAa,SAAU,OAE/C,IAAMC,EAAkB,CAAC,EACnBC,EAAOF,EAAS,YAClB,OAAOE,GAAS,UAAYA,GAC9BD,EAAM,KAAKC,CAAI,EAIjB,OAAW,CAACxC,EAAKD,CAAK,IAAK,OAAO,QAAQuC,CAAQ,EAAG,CAEnD,GADItC,IAAQ,eACeD,GAAU,KAAM,SAC3C,IAAM0C,EAAM,OAAO1C,GAAU,SAAWA,EAAQ,KAAK,UAAUA,CAAK,EACpEwC,EAAM,KAAK,GAAGvC,CAAG,KAAKyC,CAAG,EAAE,CAC7B,CAEIF,EAAM,OAAS,IACjBf,EAAO,YAAce,EAAM,KAAK;AAAA,CAAI,EAExC,CAMO,IAAMtE,EAAuB,GACvBC,EAAwB,IAG9B,SAASI,EACdO,EAC0E,CAC1E,SAAK,YAASA,CAAM,KAOf,iBAAcA,CAAM,EAQlB,CAAE,MAAO,GAAM,OAAQA,CAAmC,EAPxD,CACL,MAAO,GACP,MACE,+FACJ,EAXO,CACL,MAAO,GACP,MAAO,yDACT,CAYJ,CAGO,SAASR,EAAaqE,EAI3B,CACA,GAAI,CAEF,MAAO,CAAE,MAAO,GAAM,KADT,KAAK,MAAMA,CAAU,CACP,CAC7B,OAASxC,EAAO,CACd,MAAO,CACL,MAAO,GACP,MAAO,iBAAiBA,aAAiB,MAAQA,EAAM,QAAU,aAAa,EAChF,CACF,CACF,CAGO,SAAS3B,EACdoE,EAC0E,CAC1E,IAAMC,EAAavE,EAAasE,CAAY,EAC5C,OAAKC,EAAW,MAETtE,EAAkBsE,EAAW,IAAI,EAFV,CAAE,MAAO,GAAO,MAAOA,EAAW,KAAO,CAGzE,CAOO,IAAM5E,EAAoB,CAC/B,IAAK,kDACL,UAAW,CAAC,8BAA8B,EAC1C,OAAQ,CACN,QAAS,0CACT,KAAM,SACN,WAAY,CACV,KAAM,CACJ,YAAa,uCACb,KAAM,CACJ,UACA,SACA,YACA,UACA,UACA,OACA,QACA,QACA,SACA,QACA,QACF,CACF,EACA,KAAM,CACJ,YAAa,6CACb,KAAM,QACN,MAAO,CAAE,KAAM,QAAS,CAC1B,EACA,SAAU,CACR,YAAa,uDACb,KAAM,GACR,EACA,WAAY,CACV,YACE,+DACF,KAAM,SACN,qBAAsB,CAAE,KAAM,GAAI,CACpC,EACA,mBAAoB,CAClB,YAAa,2DACb,KAAM,SACN,qBAAsB,CAAE,KAAM,GAAI,CACpC,EACA,OAAQ,CACN,YAAa,2DACb,KAAM,GACR,EACA,cAAe,CACb,YAAa,8CACb,KAAM,QACR,EACA,QAAS,CACP,YAAa,iCACb,KAAM,SACN,qBAAsB,CAAE,KAAM,GAAI,CACpC,EACA,IAAK,CACH,YAAa,qCACb,KAAM,QACR,EACA,YAAa,CACX,YAAa,6CACb,KAAM,SACN,qBAAsB,CAAE,KAAM,GAAI,CACpC,EACA,SAAU,CACR,YAAa,oBACb,KAAM,SACR,EACA,SAAU,CACR,YAAa,oCACb,KAAM,QACR,EACA,qBAAsB,CACpB,YAAa,qDACb,KAAM,SACR,CACF,CACF,CACF",
|
|
6
|
+
"names": ["signals_exports", "__export", "JTD_SCHEMA_CONFIG", "MAX_VALIDATION_DEPTH", "MAX_VALIDATION_ERRORS", "fuzzJTD", "jtdToJsonSchema", "validateJSON", "validateJTDSchema", "validateJTDSchemaString", "validateJsonAgainstJTD", "validateJsonAgainstSignal", "__toCommonJS", "import_jtd", "FUZZ_MAX_DEPTH", "schema", "definitions", "_depth", "def", "obj", "k", "v", "firstKey", "variant", "INTEGER_TYPES", "formatInstancePath", "instancePath", "p", "i", "resolveSchemaParent", "schemaPath", "current", "resolveInstanceValue", "value", "key", "formatValidationError", "error", "path", "lastKey", "paramLabel", "jtdType", "enumValues", "discField", "discValue", "mapping", "validVariants", "defs", "schemaForValidation", "jtdValidate", "err", "formatOrDescriptor", "jsonValue", "jtdFormats", "f", "format", "jtdSchema", "isRoot", "isNullable", "result", "name", "defSchema", "convertNode", "node", "applyMetadata", "refName", "refResult", "typeMap", "baseType", "variants", "discriminatorKey", "tag", "variantSchema", "metadata", "parts", "desc", "str", "jsonString", "schemaString", "jsonResult"]
|
|
7
7
|
}
|
package/dist/esm/anthropic.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{isSchema as pe,isValidSchema as K,validate as W}from"jtd";var Y=new Set(["int8","uint8","int16","uint16","int32","uint32"]);function z(e){return e.length===0?"/":e.map(n=>/^\d+$/.test(n)?`[${n}]`:`.${n}`).join("")}function M(e,n){let t=e;for(let i=0;i<n.length-1&&(t&&typeof t=="object"&&n[i]in t);i++)t=t[n[i]];return t}function X(e,n){let t=e;for(let i of n)if(t&&typeof t=="object")t=t[i];else return;return t}function Z(e,n,t){let{instancePath:i,schemaPath:r}=e,o=z(i),s=r[r.length-1];if(s==="type"){let c=M(n,r)?.type;return c==="boolean"?`${o}: expected boolean`:c==="string"?`${o}: expected string`:c==="timestamp"?`${o}: expected timestamp string`:Y.has(c)?`${o}: expected integer`:`${o}: expected number`}if(s==="enum"){let c=M(n,r)?.enum;return`${o}: expected one of [${c.join(", ")}]`}if(r.length>=2&&r[r.length-2]==="properties"&&s)return`${o==="/"?"":o}.${s}: missing required property`;if(s==="elements")return`${o}: expected array`;if(s==="properties"||s==="optionalProperties"||s==="values")return`${o}: expected object`;if(s==="discriminator")return`${o}: expected string discriminator`;if(s==="mapping"){let a=X(t,i);return`${o}: unknown variant "${a}"`}return r.length===0?`${o}: unexpected property`:`${o}: validation error at /${r.join("/")}`}function U(e,n,t){let i=t??e.definitions,r=i?{...e,definitions:i}:e;return K(r)?W(r,n,{maxDepth:Q,maxErrors:ee}).map(s=>Z(s,r,n)):e.ref?[`/: unknown ref "${e.ref}"`]:["/: invalid schema"]}var Q=32,ee=100;var v=32,A={int8:{minimum:-128,maximum:127},uint8:{minimum:0,maximum:255},int16:{minimum:-32768,maximum:32767},uint16:{minimum:0,maximum:65535},int32:{minimum:-2147483648,maximum:2147483647},uint32:{minimum:0,maximum:4294967295}},x={minimum:-34028235e31,maximum:34028235e31},R=`Must be a valid JSON value encoded as a string. For objects: '{"key": "value"}', for arrays: '[1, 2]', for primitives: '"hello"' or '42' or 'true' or 'null'.`,q=`The variant data encoded as a valid JSON string (e.g. '{"key": "value"}').`,_="Array of key-value entries representing a map/dictionary. Each entry has a string 'key' (the property name) and a 'value' (the property value).";function m(e,n){return n?[e,"null"]:e}function O(e,n){if(e===n)return!0;if(e==null||n==null||typeof e!=typeof n||typeof e!="object")return!1;if(Array.isArray(e))return Array.isArray(n)&&e.length===n.length&&e.every((o,s)=>O(o,n[s]));if(Array.isArray(n))return!1;let t=e,i=n,r=Object.keys(t);if(r.length!==Object.keys(i).length)return!1;for(let o of r)if(!(o in i)||!O(t[o],i[o]))return!1;return!0}function j(e){return!e||typeof e!="object"?!0:e.type||e.enum||e.elements||e.values||e.discriminator||e.ref||e.properties&&Object.keys(e.properties).length>0||e.optionalProperties&&Object.keys(e.optionalProperties).length>0?!1:(e.properties!==void 0||e.optionalProperties!==void 0)&&e.additionalProperties===!0?!0:!(e.properties!==void 0||e.optionalProperties!==void 0)}function C(e,n){let t=e,i=0;for(;t.ref&&i<v;){let r=n?.[t.ref];if(!r)return!1;t=r,i++}return i>=v?!1:j(t)}function $(e,n){let t=new Set,i=[...e];for(;i.length>0;){let r=i.pop();if(!(!r||typeof r!="object")){if(r.ref){!t.has(r.ref)&&n[r.ref]&&(t.add(r.ref),i.push(n[r.ref]));continue}if(r.elements&&i.push(r.elements),r.values&&i.push(r.values),r.properties)for(let o of Object.values(r.properties))i.push(o);if(r.optionalProperties)for(let o of Object.values(r.optionalProperties))i.push(o);if(r.mapping)for(let o of Object.values(r.mapping))i.push(o)}}return t}function E(e,n,t){let i=e.definitions,r=t(n,e,i,0),o=U(e,r,i);return o.length>0?{success:!1,errors:o}:{success:!0,kind:"json",data:r}}function V(e,n,t){let i=n?`${n}. `:"",r={type:"object",properties:{kind:{type:"string",enum:["value"]},data:e},required:["kind","data"],description:`${i}Inline value.`},o={type:"object",properties:{kind:{type:"string",enum:["reference"]},ref:{type:"string",description:'A file reference. The referenced file MUST contain data that conforms to the same format described in the "value" variant.'}},required:["kind","ref"],description:`${i}Reference to a file instead of inline data.`};return t!==!1&&(r.additionalProperties=!1,o.additionalProperties=!1),{anyOf:[r,o]}}function te(e,n){let t=e.trim().toLowerCase(),i=n.trim().toLowerCase();return i==="*/*"?!0:i.endsWith("/*")?t.startsWith(i.slice(0,i.indexOf("/")+1)):t===i}function ne(e,n){if(typeof n!="object"||n===null)return{success:!1,errors:[`/: expected object with data and mimeType fields, got ${typeof n}`]};let t=n;if(typeof t.mimeType!="string"||!t.mimeType.includes("/"))return{success:!1,errors:['/mimeType: required concrete MIME type (e.g. "image/png", "application/pdf")']};if(!te(t.mimeType,e))return{success:!1,errors:[`/mimeType: "${t.mimeType}" does not match accepted type "${e}"`]};let i;if(t.data instanceof Uint8Array)i=t.data;else if(typeof t.data=="string")i=new Uint8Array(Buffer.from(t.data,"base64"));else return{success:!1,errors:[`/data: expected base64 string or Uint8Array, got ${typeof t.data}`]};let r={success:!0,kind:"binary",mimeType:t.mimeType,data:i};return typeof t.filename=="string"&&t.filename&&(r.filename=t.filename),r}function I(e,n,t){return e.mimeType?ne(e.mimeType,n):e.jtdSchema?E(e.jtdSchema,n,t):{success:!1,errors:["Signal format has neither jtdSchema nor mimeType"]}}function P(e,n,t){let i=e.formats;if(!i||i.length===0)return{success:!1,errors:["Signal descriptor has no formats"]};if(i.length===1)return I(i[0],n,t);let r=[];for(let o of i){let s=I(o,n,t);if(s.success)return s;r.push(...s.errors)}return{success:!1,errors:[`No format matched for signal '${e.name??"unnamed"}'. Errors: ${r.join("; ")}`]}}function B(e,n,t){if(typeof n!="object"||n===null)return{success:!1,errors:["/: expected object with signal properties, got "+typeof n]};let i=n,r={},o=[];for(let s of e){if(!s.name)continue;let a=i[s.name];if(a==null)continue;let c=P(s,a,t);if(c.success)c.kind==="binary"?r[s.name]={data:c.data,mimeType:c.mimeType,filename:c.filename}:c.kind==="json"&&(r[s.name]=c.data);else for(let f of c.errors)o.push(`/${s.name}${f.startsWith("/")?"":": "}${f}`)}return o.length>0?{success:!1,errors:o}:{success:!0,kind:"signals",signals:r}}function J(e,n){if(!e||typeof e!="object")return e;let t={...e};return t.ref&&n.has(t.ref)&&(t.ref=n.get(t.ref)),t.properties&&(t.properties=Object.fromEntries(Object.entries(t.properties).map(([i,r])=>[i,J(r,n)]))),t.optionalProperties&&(t.optionalProperties=Object.fromEntries(Object.entries(t.optionalProperties).map(([i,r])=>[i,J(r,n)]))),t.elements&&(t.elements=J(t.elements,n)),t.values&&(t.values=J(t.values,n)),t.mapping&&(t.mapping=Object.fromEntries(Object.entries(t.mapping).map(([i,r])=>[i,J(r,n)]))),t.definitions&&delete t.definitions,t}function L(e){let n={},t=new Map;for(let s=0;s<e.length;s++){let a=e[s].formats;if(a)for(let c=0;c<a.length;c++){let f=a[c].jtdSchema?.definitions;if(!f||Object.keys(f).length===0)continue;let p=new Map,l=!1;for(let[u,d]of Object.entries(f)){let h=n[u];if(h&&!O(h,d)){l=!0;break}}if(l)for(let[u,d]of Object.entries(f)){let h=n[u];if(!(h&&O(h,d)))if(h){let b=1;for(;n[`${u}_${b}`];)b++;let F=`${u}_${b}`;p.set(u,F),n[F]=d}else n[u]=d}else for(let[u,d]of Object.entries(f))n[u]||(n[u]=d);p.size>0&&t.set(`${s}:${c}`,p)}}for(let[,s]of t)for(let[,a]of s)n[a]=J(n[a],s);let i=e.map((s,a)=>{let c=s.formats;if(!c)return s;let f=!1,p=c.map((l,u)=>{if(!l.jtdSchema)return l;let d=t.get(`${a}:${u}`),h=l.jtdSchema.definitions&&Object.keys(l.jtdSchema.definitions).length>0;if(!d&&!h)return l;f=!0;let b=d?J(l.jtdSchema,d):{...l.jtdSchema};return delete b.definitions,{...l,jtdSchema:b}});return f?{...s,formats:p}:s}),r=i.flatMap(s=>(s.formats??[]).filter(a=>a.jtdSchema).map(a=>a.jtdSchema)),o=$(r,n);for(let s of Object.keys(n))o.has(s)||delete n[s];return{mergedDefs:n,signalsCopy:i}}function T(e){return!e||typeof e!="object"?"any":e.ref?e.ref:e.type?e.type:e.enum?`one of: ${e.enum.join(", ")}`:e.elements?`array of ${T(e.elements)}`:e.values?`map of ${T(e.values)}`:e.properties||e.optionalProperties?"object":e.discriminator?`union on '${e.discriminator}'`:"any"}function G(e,n){let t=["Recursive nesting. This field accepts the same object structure as its parent with the following shape:"],i=[],r=[];if(n.properties)for(let[o,s]of Object.entries(n.properties))i.push(`${o} (${T(s)})`);if(n.optionalProperties)for(let[o,s]of Object.entries(n.optionalProperties))r.push(`${o} (${T(s)})`);if(i.length>0&&t.push(`Required: ${i.join(", ")}.`),r.length>0){let o=r.slice(0,8),s=r.length>8?`, and ${r.length-8} more`:"";t.push(`Optional: ${o.join(", ")}${s}.`)}return n.elements&&t.push(`Array of ${T(n.elements)}.`),n.values&&t.push(`Map with values of type ${T(n.values)}.`),t.join(" ")}function D(e){let n=[];if(!e||typeof e!="object")return n;if(e.ref&&n.push(e.ref),e.properties)for(let t of Object.values(e.properties))n.push(...D(t));if(e.optionalProperties)for(let t of Object.values(e.optionalProperties))n.push(...D(t));if(e.elements&&n.push(...D(e.elements)),e.values&&n.push(...D(e.values)),e.mapping)for(let t of Object.values(e.mapping))n.push(...D(t));return n}function re(e){let r=new Map,o=new Set;for(let a of Object.keys(e))r.set(a,0);function s(a,c){r.set(a,1),c.push(a);let f=e[a];if(f){for(let p of D(f))if(r.has(p))if(r.get(p)===1){let l=c.indexOf(p);for(let u=l;u<c.length;u++)o.add(c[u])}else r.get(p)===0&&s(p,c)}c.pop(),r.set(a,2)}for(let a of Object.keys(e))r.get(a)===0&&s(a,[]);return o}function k(e,n,t){if(!e||typeof e!="object")return e;if(e.ref&&n.has(e.ref)){let r=t[e.ref];return{metadata:{description:r?G(e.ref,r):`Recursive reference to ${e.ref}.`}}}let i={...e};return i.properties&&(i.properties=Object.fromEntries(Object.entries(i.properties).map(([r,o])=>[r,k(o,n,t)]))),i.optionalProperties&&(i.optionalProperties=Object.fromEntries(Object.entries(i.optionalProperties).map(([r,o])=>[r,k(o,n,t)]))),i.elements&&(i.elements=k(i.elements,n,t)),i.values&&(i.values=k(i.values,n,t)),i.mapping&&(i.mapping=Object.fromEntries(Object.entries(i.mapping).map(([r,o])=>[r,k(o,n,t)]))),i}function N(e){let n=re(e);if(n.size===0)return e;let t={};for(let[i,r]of Object.entries(e))n.has(i)?t[i]=k(r,n,e):t[i]=r;return t}function ie(e,n){e.description=e.description?`${e.description} ${n}`:n}var oe=new Set(["title","label","name","description"]);function g(e,n){let t=n.metadata;if(!t)return;let i=[],r=typeof t.title=="string"&&t.title.trim()||typeof t.label=="string"&&t.label.trim()||typeof t.name=="string"&&t.name.trim(),o=typeof t.description=="string"?t.description.trim():"";r&&o?i.push(`${r}. ${o}`):r?i.push(r):o&&i.push(o);let s=[];for(let[a,c]of Object.entries(t))oe.has(a)||(typeof c=="string"&&c.trim()?s.push(`[${a}: ${c.trim()}]`):(typeof c=="number"||typeof c=="boolean")&&s.push(`[${a}: ${c}]`));if(s.length>0&&i.push(s.join(" ")),i.length>0){let a=i.join(" ");e.description=e.description?`${e.description} ${a}`:a}}function S(e,n,t){if(t>v)throw new Error(`Schema nesting exceeded ${v} levels`);if(!e||typeof e!="object")return{type:"string",description:R};if(j(e)){let r={type:m("string",e.nullable===!0),description:R};return g(r,e),r}let i=e.nullable===!0;if(e.ref){let r=e.ref;if(!n?.[r])throw new Error(`Unresolved ref "${r}"`);if(i){let o={anyOf:[{$ref:`#/$defs/${r}`},{type:"null"}]};return g(o,e),o}return{$ref:`#/$defs/${r}`}}if(e.type){let r={},o,s=A[e.type];if(s)r.type=m("integer",i),o=`Value range: [${s.minimum}, ${s.maximum}].`;else switch(e.type){case"boolean":r.type=m("boolean",i);break;case"string":r.type=m("string",i);break;case"timestamp":r.type=m("string",i),r.format="date-time";break;case"float32":r.type=m("number",i),o=`Value range: [${x.minimum}, ${x.maximum}].`;break;case"float64":r.type=m("number",i);break;default:throw new Error(`Unknown JTD type "${e.type}"`)}return g(r,e),o&&ie(r,o),r}if(e.enum){let r={type:m("string",i),enum:i?[...e.enum,null]:e.enum};return g(r,e),r}if(e.elements){let r={type:m("array",i),items:S(e.elements,n,t+1)};return g(r,e),r}if(e.properties||e.optionalProperties){let r={},o=[];if(e.properties)for(let[a,c]of Object.entries(e.properties))r[a]=S(c,n,t+1),o.push(a);if(e.optionalProperties)for(let[a,c]of Object.entries(e.optionalProperties))r[a]=S(c,n,t+1);let s={type:m("object",i),properties:r,additionalProperties:!1};return o.length>0&&(s.required=o),g(s,e),s}if(e.values){let r=S(e.values,n,t+1),o={type:m("array",i),description:_,items:{type:"object",properties:{key:{type:"string",description:"The property name."},value:r},required:["key","value"],additionalProperties:!1}};return g(o,e),o}if(e.discriminator&&e.mapping){let r=e.discriminator,o=e.mapping,s=[];for(let[c,f]of Object.entries(o)){let p;j(f)?p={type:"object",properties:{[r]:{const:c},_data:{type:"string",description:q}},required:[r,"_data"],additionalProperties:!1}:(p=S(f,n,t+1),p.properties[r]={const:c},(p.required??=[]).unshift(r),p.additionalProperties=!1),g(p,f),s.push(p)}i&&s.push({type:"null"});let a={anyOf:s};return g(a,e),a}return{type:"string",description:R}}var se=new Set(Object.keys(A));function y(e,n,t,i){if(i>v||e==null)return e;if(n.ref){let r=t?.[n.ref];return r?y(e,r,t,i+1):e}if(j(n)){if(typeof e=="string")try{return JSON.parse(e)}catch{return e}return e}if(n.type&&se.has(n.type))return typeof e=="number"&&!Number.isInteger(e)?Math.round(e):e;if(n.elements){let r=n.elements;return(Array.isArray(e)?e:[e]).map(s=>y(s,r,t,i+1))}if((n.properties||n.optionalProperties)&&typeof e=="object"&&e!==null){let r={...e};if(n.properties)for(let[o,s]of Object.entries(n.properties))o in r&&(r[o]=y(r[o],s,t,i+1));if(n.optionalProperties)for(let[o,s]of Object.entries(n.optionalProperties))o in r&&(r[o]=y(r[o],s,t,i+1));return r}if(n.values&&Array.isArray(e)){let r={};for(let o of e)if(typeof o=="object"&&o!==null){let s=o,a=s.key;r[a]=y(s.value,n.values,t,i+1)}return r}if(n.discriminator&&n.mapping&&typeof e=="object"&&e!==null){let r=e,o=n.discriminator,s=r[o];if(typeof s!="string")return e;let a=n.mapping[s];if(!a)return e;if(j(a)){let f=r._data;if(typeof f=="string")try{let p=JSON.parse(f);if(typeof p=="object"&&p!==null)return{[o]:s,...p}}catch{}return{[o]:s}}let c={[o]:s};if(a.properties)for(let[f,p]of Object.entries(a.properties))f in r&&(c[f]=y(r[f],p,t,i+1));if(a.optionalProperties)for(let[f,p]of Object.entries(a.optionalProperties))f in r&&(c[f]=y(r[f],p,t,i+1));return c}return e}function ae(e){return{type:"object",description:`Binary content (accepted MIME type: ${e}).`,properties:{data:{type:"string",description:"The base64-encoded binary content."},filename:{type:"string",description:'Filename for the content (e.g. "report.pdf", "image.png").'},mimeType:{type:"string",description:`The concrete MIME type of the content. Must match: ${e}.`}},required:["data","mimeType","filename"],additionalProperties:!1}}var w=class e{schema;strict;jtdSchema;descriptor;descriptors;referenceMode;static fromJTD(n){let t=n.definitions,i=t&&Object.keys(t).length>0?N(t):t,r=!C(n,i),o;if(r){if(o=S(n,i,0),i&&Object.keys(i).length>0){let s=$([n],t??i);o.$defs=Object.fromEntries(Object.entries(i).filter(([a])=>s.has(a)).map(([a,c])=>[a,S(c,i,0)]))}if(n.discriminator&&n.mapping){let s=o;o={type:"object",properties:{input:s},required:["input"],additionalProperties:!1},s.$defs&&(o.$defs=s.$defs,delete s.$defs)}}else o={},g(o,n);return new e(o,r,n,void 0)}static fromSignal(n,t,i){let{schema:r,strict:o}=ce(n,t);if(i){let s=V(r,n.description);return new e(s,o,void 0,n)}return new e(r,o,void 0,n)}static fromSignals(n,t,i,r){let{mergedDefs:o,signalsCopy:s}=L(n),a=Object.keys(o).length>0?N(o):o,c={},f=[],p=!0;for(let u of s){if(!u.name)continue;let d=e.fromSignal(u,a,r);d.strict||(p=!1),c[u.name]=d.schema,u.optional||f.push(u.name)}let l={type:"object",properties:c,required:f.length>0?f:void 0,additionalProperties:!1};return Object.keys(a).length>0&&(l.$defs=Object.fromEntries(Object.entries(a).map(([u,d])=>[u,S(d,a,0)]))),i&&t?l.description=`${i}. ${t}`:i?l.description=i:t&&(l.description=t),new e(l,p,void 0,void 0,n,r)}static fromJSON(n){let t=typeof n=="string"?JSON.parse(n):n;if(t.descriptors)return e.fromSignals(t.descriptors,t.description,t.label,t.referenceMode);if(t.descriptor)return e.fromSignal(t.descriptor);if(t.jtdSchema)return e.fromJTD(t.jtdSchema);throw new Error("Cannot deserialize: missing jtdSchema, descriptor, or descriptors")}constructor(n,t,i,r,o,s){this.schema=n,this.strict=t,this.jtdSchema=i,this.descriptor=r,this.descriptors=o,this.referenceMode=s??!1}convert=n=>{if(this.descriptors)return B(this.descriptors,n,y);if(this.jtdSchema){let t=n;return this.jtdSchema.discriminator&&this.jtdSchema.mapping&&typeof t=="object"&&t!==null&&"input"in t&&(t=t.input),E(this.jtdSchema,t,y)}return this.descriptor?P(this.descriptor,n,y):{success:!1,errors:["No source schema available"]}};toJSON(){if(this.descriptors){let n={schema:this.schema,strict:this.strict,descriptors:this.descriptors};return this.schema.description&&(n.description=this.schema.description),this.referenceMode&&(n.referenceMode=!0),n}return this.descriptor?{schema:this.schema,strict:this.strict,descriptor:this.descriptor}:{schema:this.schema,strict:this.strict,jtdSchema:this.jtdSchema}}};function ce(e,n){let t=e.formats;if(!t||t.length===0)throw new Error("Signal descriptor has no formats");if(t.length===1){let[a]=t,{schema:c,strict:f}=H(a,n);if(e.label||e.description){let p=[];e.label&&p.push(e.label),e.description&&p.push(e.description);let l=p.join(". ");c.description=c.description?`${l} ${c.description}`:l}return{schema:c,strict:f}}let i=[],r=!0;for(let a of t){let{schema:c,strict:f}=H(a,n);f||(r=!1),a.jtdSchema&&(c.description=c.description?`Structured JSON data. ${c.description}`:"Structured JSON data."),i.push(c)}let o=e.description??"";return{schema:{anyOf:i,description:o||void 0},strict:r}}function H(e,n){if(e.jtdSchema){let t=n??e.jtdSchema.definitions,i=t&&Object.keys(t).length>0?N(t):t,r=!C(e.jtdSchema,i),o;if(r){if(o=S(e.jtdSchema,i,0),!n&&i&&Object.keys(i).length>0){let s=$([e.jtdSchema],i);o.$defs=Object.fromEntries(Object.entries(i).filter(([a])=>s.has(a)).map(([a,c])=>[a,S(c,i,0)]))}}else o={},g(o,e.jtdSchema);return{schema:o,strict:r}}if(e.mimeType)return{schema:ae(e.mimeType),strict:!0};throw new Error("Signal format has neither jtdSchema nor mimeType")}function ge(e){return w.fromJTD(e)}function ye(e){return w.fromSignal(e)}export{w as AnthropicConversion,ye as convertSignalToAnthropicSchema,ge as convertToAnthropicSchema};
|
|
1
|
+
import{isSchema as fe,isValidSchema as K,validate as Y}from"jtd";var W=new Set(["int8","uint8","int16","uint16","int32","uint32"]);function z(e){return e.length===0?"root":`'${e.map((n,i)=>/^\d+$/.test(n)?`[${n}]`:i===0?n:`.${n}`).join("")}'`}function $(e,t){let n=e;for(let i=0;i<t.length-1&&(n&&typeof n=="object"&&t[i]in n);i++)n=n[t[i]];return n}function X(e,t){let n=e;for(let i of t)if(n&&typeof n=="object")n=n[i];else return;return n}function Z(e,t,n){let{instancePath:i,schemaPath:r}=e,o=z(i),s=r[r.length-1],a=o==="root"?"root value":`parameter ${o}`;if(s==="type"){let p=$(t,r)?.type;return p==="boolean"?`${a}: expected boolean`:p==="string"?`${a}: expected string`:p==="timestamp"?`${a}: expected timestamp string`:W.has(p)?`${a}: expected integer`:`${a}: expected number`}if(s==="enum"){let p=$(t,r)?.enum;return`${a}: expected one of [${p.join(", ")}]`}if(r.length>=2&&r[r.length-2]==="properties"&&s)return o==="root"?`missing required parameter '${s}'`:`missing required parameter ${o}.${s}`;if(s==="elements")return`${a}: expected array`;if(s==="properties"||s==="optionalProperties"||s==="values")return`${a}: expected object`;if(s==="discriminator"){let p=$(t,r)?.discriminator;return p?`${a}: parameter '${p}' must be a string`:`${a}: expected string discriminator`}if(s==="mapping"){let c=X(n,i),f=$(t,r)?.mapping,u=f?Object.keys(f):[];return u.length>0?`${a}: unknown variant "${c}". Valid values: [${u.join(", ")}]`:`${a}: unknown variant "${c}"`}return r.length===0?`${a}: unexpected property`:`${a}: validation error at /${r.join("/")}`}function U(e,t,n){let i=n??e.definitions,r=i?{...e,definitions:i}:e;return K(r)?Y(r,t,{maxDepth:Q,maxErrors:ee}).map(s=>Z(s,r,t)):e.ref?[`unknown ref "${e.ref}" in schema`]:["invalid schema"]}var Q=32,ee=100;var v=32,x={int8:{minimum:-128,maximum:127},uint8:{minimum:0,maximum:255},int16:{minimum:-32768,maximum:32767},uint16:{minimum:0,maximum:65535},int32:{minimum:-2147483648,maximum:2147483647},uint32:{minimum:0,maximum:4294967295}},C={minimum:-34028235e31,maximum:34028235e31},R=`Must be a valid JSON value encoded as a string. For objects: '{"key": "value"}', for arrays: '[1, 2]', for primitives: '"hello"' or '42' or 'true' or 'null'.`,I=`The variant data encoded as a valid JSON string (e.g. '{"key": "value"}').`,q="Array of key-value entries representing a map/dictionary. Each entry has a string 'key' (the property name) and a 'value' (the property value).";function m(e,t){return t?[e,"null"]:e}function O(e,t){if(e===t)return!0;if(e==null||t==null||typeof e!=typeof t||typeof e!="object")return!1;if(Array.isArray(e))return Array.isArray(t)&&e.length===t.length&&e.every((o,s)=>O(o,t[s]));if(Array.isArray(t))return!1;let n=e,i=t,r=Object.keys(n);if(r.length!==Object.keys(i).length)return!1;for(let o of r)if(!(o in i)||!O(n[o],i[o]))return!1;return!0}function j(e){return!e||typeof e!="object"?!0:e.type||e.enum||e.elements||e.values||e.discriminator||e.ref||e.properties&&Object.keys(e.properties).length>0||e.optionalProperties&&Object.keys(e.optionalProperties).length>0?!1:(e.properties!==void 0||e.optionalProperties!==void 0)&&e.additionalProperties===!0?!0:!(e.properties!==void 0||e.optionalProperties!==void 0)}function E(e,t){let n=e,i=0;for(;n.ref&&i<v;){let r=t?.[n.ref];if(!r)return!1;n=r,i++}return i>=v?!1:j(n)}function w(e,t){let n=new Set,i=[...e];for(;i.length>0;){let r=i.pop();if(!(!r||typeof r!="object")){if(r.ref){!n.has(r.ref)&&t[r.ref]&&(n.add(r.ref),i.push(t[r.ref]));continue}if(r.elements&&i.push(r.elements),r.values&&i.push(r.values),r.properties)for(let o of Object.values(r.properties))i.push(o);if(r.optionalProperties)for(let o of Object.values(r.optionalProperties))i.push(o);if(r.mapping)for(let o of Object.values(r.mapping))i.push(o)}}return n}function P(e,t,n){let i=e.definitions,r=n(t,e,i,0),o=U(e,r,i);return o.length>0?{success:!1,errors:o}:{success:!0,kind:"json",data:r}}function V(e,t,n){let i=t?`${t}. `:"",r={type:"object",properties:{_kind:{type:"string",enum:["_value"]},_value:e},required:["_kind","_value"],description:`${i}Inline value.`},o={type:"object",properties:{_kind:{type:"string",enum:["_ref"]},_ref:{type:"string",description:"A file reference. The referenced file MUST contain data that conforms to the same format described in the inline value variant."}},required:["_kind","_ref"],description:`${i}Reference to a file instead of inline data.`};return n!==!1&&(r.additionalProperties=!1,o.additionalProperties=!1),{anyOf:[r,o]}}function ne(e,t){let n=e.trim().toLowerCase(),i=t.trim().toLowerCase();return i==="*/*"?!0:i.endsWith("/*")?n.startsWith(i.slice(0,i.indexOf("/")+1)):n===i}function te(e,t){if(typeof t!="object"||t===null)return{success:!1,errors:[`expected object with 'data' and 'mimeType' fields, got ${typeof t}`]};let n=t;if(typeof n.mimeType!="string"||!n.mimeType.includes("/"))return{success:!1,errors:[`parameter 'mimeType': required concrete MIME type (e.g. "image/png", "application/pdf")`]};if(!ne(n.mimeType,e))return{success:!1,errors:[`parameter 'mimeType': "${n.mimeType}" does not match accepted type "${e}"`]};let i;if(n.data instanceof Uint8Array)i=n.data;else if(typeof n.data=="string")i=new Uint8Array(Buffer.from(n.data,"base64"));else return{success:!1,errors:[`parameter 'data': expected base64 string or Uint8Array, got ${typeof n.data}`]};let r={success:!0,kind:"binary",mimeType:n.mimeType,data:i};return typeof n.filename=="string"&&n.filename&&(r.filename=n.filename),r}function _(e,t,n){return e.mimeType?te(e.mimeType,t):e.jtdSchema?P(e.jtdSchema,t,n):{success:!1,errors:["Signal format has neither jtdSchema nor mimeType"]}}function N(e,t,n){let i=e.formats;if(!i||i.length===0)return{success:!1,errors:["Signal descriptor has no formats"]};if(i.length===1)return _(i[0],t,n);let r=[];for(let o of i){let s=_(o,t,n);if(s.success)return s;r.push(...s.errors)}return{success:!1,errors:[`No format matched for signal '${e.name??"unnamed"}'. Errors: ${r.join("; ")}`]}}function B(e,t,n){if(typeof t!="object"||t===null)return{success:!1,errors:["/: expected object with signal properties, got "+typeof t]};let i=t,r={},o=[];for(let s of e){if(!s.name)continue;let a=i[s.name];if(a==null)continue;let c=N(s,a,n);if(c.success)c.kind==="binary"?r[s.name]={data:c.data,mimeType:c.mimeType,filename:c.filename}:c.kind==="json"&&(r[s.name]=c.data);else for(let p of c.errors)o.push(`parameter '${s.name}': ${p}`)}return o.length>0?{success:!1,errors:o}:{success:!0,kind:"signals",signals:r}}function J(e,t){if(!e||typeof e!="object")return e;let n={...e};return n.ref&&t.has(n.ref)&&(n.ref=t.get(n.ref)),n.properties&&(n.properties=Object.fromEntries(Object.entries(n.properties).map(([i,r])=>[i,J(r,t)]))),n.optionalProperties&&(n.optionalProperties=Object.fromEntries(Object.entries(n.optionalProperties).map(([i,r])=>[i,J(r,t)]))),n.elements&&(n.elements=J(n.elements,t)),n.values&&(n.values=J(n.values,t)),n.mapping&&(n.mapping=Object.fromEntries(Object.entries(n.mapping).map(([i,r])=>[i,J(r,t)]))),n.definitions&&delete n.definitions,n}function L(e){let t={},n=new Map;for(let s=0;s<e.length;s++){let a=e[s].formats;if(a)for(let c=0;c<a.length;c++){let p=a[c].jtdSchema?.definitions;if(!p||Object.keys(p).length===0)continue;let f=new Map,u=!1;for(let[l,d]of Object.entries(p)){let h=t[l];if(h&&!O(h,d)){u=!0;break}}if(u)for(let[l,d]of Object.entries(p)){let h=t[l];if(!(h&&O(h,d)))if(h){let b=1;for(;t[`${l}_${b}`];)b++;let M=`${l}_${b}`;f.set(l,M),t[M]=d}else t[l]=d}else for(let[l,d]of Object.entries(p))t[l]||(t[l]=d);f.size>0&&n.set(`${s}:${c}`,f)}}for(let[,s]of n)for(let[,a]of s)t[a]=J(t[a],s);let i=e.map((s,a)=>{let c=s.formats;if(!c)return s;let p=!1,f=c.map((u,l)=>{if(!u.jtdSchema)return u;let d=n.get(`${a}:${l}`),h=u.jtdSchema.definitions&&Object.keys(u.jtdSchema.definitions).length>0;if(!d&&!h)return u;p=!0;let b=d?J(u.jtdSchema,d):{...u.jtdSchema};return delete b.definitions,{...u,jtdSchema:b}});return p?{...s,formats:f}:s}),r=i.flatMap(s=>(s.formats??[]).filter(a=>a.jtdSchema).map(a=>a.jtdSchema)),o=w(r,t);for(let s of Object.keys(t))o.has(s)||delete t[s];return{mergedDefs:t,signalsCopy:i}}function T(e){return!e||typeof e!="object"?"any":e.ref?e.ref:e.type?e.type:e.enum?`one of: ${e.enum.join(", ")}`:e.elements?`array of ${T(e.elements)}`:e.values?`map of ${T(e.values)}`:e.properties||e.optionalProperties?"object":e.discriminator?`union on '${e.discriminator}'`:"any"}function G(e,t){let n=["Recursive nesting. This field accepts the same object structure as its parent with the following shape:"],i=[],r=[];if(t.properties)for(let[o,s]of Object.entries(t.properties))i.push(`${o} (${T(s)})`);if(t.optionalProperties)for(let[o,s]of Object.entries(t.optionalProperties))r.push(`${o} (${T(s)})`);if(i.length>0&&n.push(`Required: ${i.join(", ")}.`),r.length>0){let o=r.slice(0,8),s=r.length>8?`, and ${r.length-8} more`:"";n.push(`Optional: ${o.join(", ")}${s}.`)}return t.elements&&n.push(`Array of ${T(t.elements)}.`),t.values&&n.push(`Map with values of type ${T(t.values)}.`),n.join(" ")}function D(e){let t=[];if(!e||typeof e!="object")return t;if(e.ref&&t.push(e.ref),e.properties)for(let n of Object.values(e.properties))t.push(...D(n));if(e.optionalProperties)for(let n of Object.values(e.optionalProperties))t.push(...D(n));if(e.elements&&t.push(...D(e.elements)),e.values&&t.push(...D(e.values)),e.mapping)for(let n of Object.values(e.mapping))t.push(...D(n));return t}function re(e){let r=new Map,o=new Set;for(let a of Object.keys(e))r.set(a,0);function s(a,c){r.set(a,1),c.push(a);let p=e[a];if(p){for(let f of D(p))if(r.has(f))if(r.get(f)===1){let u=c.indexOf(f);for(let l=u;l<c.length;l++)o.add(c[l])}else r.get(f)===0&&s(f,c)}c.pop(),r.set(a,2)}for(let a of Object.keys(e))r.get(a)===0&&s(a,[]);return o}function k(e,t,n){if(!e||typeof e!="object")return e;if(e.ref&&t.has(e.ref)){let r=n[e.ref];return{metadata:{description:r?G(e.ref,r):`Recursive reference to ${e.ref}.`}}}let i={...e};return i.properties&&(i.properties=Object.fromEntries(Object.entries(i.properties).map(([r,o])=>[r,k(o,t,n)]))),i.optionalProperties&&(i.optionalProperties=Object.fromEntries(Object.entries(i.optionalProperties).map(([r,o])=>[r,k(o,t,n)]))),i.elements&&(i.elements=k(i.elements,t,n)),i.values&&(i.values=k(i.values,t,n)),i.mapping&&(i.mapping=Object.fromEntries(Object.entries(i.mapping).map(([r,o])=>[r,k(o,t,n)]))),i}function F(e){let t=re(e);if(t.size===0)return e;let n={};for(let[i,r]of Object.entries(e))t.has(i)?n[i]=k(r,t,e):n[i]=r;return n}function ie(e,t){e.description=e.description?`${e.description} ${t}`:t}var oe=new Set(["title","label","name","description"]);function g(e,t){let n=t.metadata;if(!n)return;let i=[],r=typeof n.title=="string"&&n.title.trim()||typeof n.label=="string"&&n.label.trim()||typeof n.name=="string"&&n.name.trim(),o=typeof n.description=="string"?n.description.trim():"";r&&o?i.push(`${r}. ${o}`):r?i.push(r):o&&i.push(o);let s=[];for(let[a,c]of Object.entries(n))oe.has(a)||(typeof c=="string"&&c.trim()?s.push(`[${a}: ${c.trim()}]`):(typeof c=="number"||typeof c=="boolean")&&s.push(`[${a}: ${c}]`));if(s.length>0&&i.push(s.join(" ")),i.length>0){let a=i.join(" ");e.description=e.description?`${e.description} ${a}`:a}}function S(e,t,n){if(n>v)throw new Error(`Schema nesting exceeded ${v} levels`);if(!e||typeof e!="object")return{type:"string",description:R};if(j(e)){let r={type:m("string",e.nullable===!0),description:R};return g(r,e),r}let i=e.nullable===!0;if(e.ref){let r=e.ref;if(!t?.[r])throw new Error(`Unresolved ref "${r}"`);if(i){let o={anyOf:[{$ref:`#/$defs/${r}`},{type:"null"}]};return g(o,e),o}return{$ref:`#/$defs/${r}`}}if(e.type){let r={},o,s=x[e.type];if(s)r.type=m("integer",i),o=`Value range: [${s.minimum}, ${s.maximum}].`;else switch(e.type){case"boolean":r.type=m("boolean",i);break;case"string":r.type=m("string",i);break;case"timestamp":r.type=m("string",i),r.format="date-time";break;case"float32":r.type=m("number",i),o=`Value range: [${C.minimum}, ${C.maximum}].`;break;case"float64":r.type=m("number",i);break;default:throw new Error(`Unknown JTD type "${e.type}"`)}return g(r,e),o&&ie(r,o),r}if(e.enum){let r={type:m("string",i),enum:i?[...e.enum,null]:e.enum};return g(r,e),r}if(e.elements){let r={type:m("array",i),items:S(e.elements,t,n+1)};return g(r,e),r}if(e.properties||e.optionalProperties){let r={},o=[];if(e.properties)for(let[a,c]of Object.entries(e.properties))r[a]=S(c,t,n+1),o.push(a);if(e.optionalProperties)for(let[a,c]of Object.entries(e.optionalProperties))r[a]=S(c,t,n+1);let s={type:m("object",i),properties:r,additionalProperties:!1};return o.length>0&&(s.required=o),g(s,e),s}if(e.values){let r=S(e.values,t,n+1),o={type:m("array",i),description:q,items:{type:"object",properties:{key:{type:"string",description:"The property name."},value:r},required:["key","value"],additionalProperties:!1}};return g(o,e),o}if(e.discriminator&&e.mapping){let r=e.discriminator,o=e.mapping,s=[];for(let[c,p]of Object.entries(o)){let f;j(p)?f={type:"object",properties:{[r]:{const:c},_data:{type:"string",description:I}},required:[r,"_data"],additionalProperties:!1}:(f=S(p,t,n+1),f.properties[r]={const:c},(f.required??=[]).unshift(r),f.additionalProperties=!1),g(f,p),s.push(f)}i&&s.push({type:"null"});let a={anyOf:s};return g(a,e),a}return{type:"string",description:R}}var se=new Set(Object.keys(x));function y(e,t,n,i){if(i>v||e==null)return e;if(t.ref){let r=n?.[t.ref];return r?y(e,r,n,i+1):e}if(j(t)){if(typeof e=="string")try{return JSON.parse(e)}catch{return e}return e}if(t.type&&se.has(t.type))return typeof e=="number"&&!Number.isInteger(e)?Math.round(e):e;if(t.elements){let r=t.elements;return(Array.isArray(e)?e:[e]).map(s=>y(s,r,n,i+1))}if((t.properties||t.optionalProperties)&&typeof e=="object"&&e!==null){let r={...e};if(t.properties)for(let[o,s]of Object.entries(t.properties))o in r&&(r[o]=y(r[o],s,n,i+1));if(t.optionalProperties)for(let[o,s]of Object.entries(t.optionalProperties))o in r&&(r[o]=y(r[o],s,n,i+1));return r}if(t.values&&Array.isArray(e)){let r={};for(let o of e)if(typeof o=="object"&&o!==null){let s=o,a=s.key;r[a]=y(s.value,t.values,n,i+1)}return r}if(t.discriminator&&t.mapping&&typeof e=="object"&&e!==null){let r=e,o=t.discriminator,s=r[o];if(typeof s!="string")return e;let a=t.mapping[s];if(!a)return e;if(j(a)){let p=r._data;if(typeof p=="string")try{let f=JSON.parse(p);if(typeof f=="object"&&f!==null)return{[o]:s,...f}}catch{}return{[o]:s}}let c={[o]:s};if(a.properties)for(let[p,f]of Object.entries(a.properties))p in r&&(c[p]=y(r[p],f,n,i+1));if(a.optionalProperties)for(let[p,f]of Object.entries(a.optionalProperties))p in r&&(c[p]=y(r[p],f,n,i+1));return c}return e}function ae(e){return{type:"object",description:`Binary content (accepted MIME type: ${e}).`,properties:{data:{type:"string",description:"The base64-encoded binary content."},filename:{type:"string",description:'Filename for the content (e.g. "report.pdf", "image.png").'},mimeType:{type:"string",description:`The concrete MIME type of the content. Must match: ${e}.`}},required:["data","mimeType","filename"],additionalProperties:!1}}var A=class e{schema;strict;jtdSchema;descriptor;descriptors;referenceMode;static fromJTD(t){let n=t.definitions,i=n&&Object.keys(n).length>0?F(n):n,r=!E(t,i),o;if(r){if(o=S(t,i,0),i&&Object.keys(i).length>0){let s=w([t],n??i);o.$defs=Object.fromEntries(Object.entries(i).filter(([a])=>s.has(a)).map(([a,c])=>[a,S(c,i,0)]))}if(t.discriminator&&t.mapping){let s=o;o={type:"object",properties:{input:s},required:["input"],additionalProperties:!1},s.$defs&&(o.$defs=s.$defs,delete s.$defs)}}else o={},g(o,t);return new e(o,r,t,void 0)}static fromSignal(t,n,i){let{schema:r,strict:o}=ce(t,n);if(i){let s=V(r,t.description);return new e(s,o,void 0,t)}return new e(r,o,void 0,t)}static fromSignals(t,n,i,r){let{mergedDefs:o,signalsCopy:s}=L(t),a=Object.keys(o).length>0?F(o):o,c={},p=[],f=!0;for(let l of s){if(!l.name)continue;let d=e.fromSignal(l,a,r);d.strict||(f=!1),c[l.name]=d.schema,l.optional||p.push(l.name)}let u={type:"object",properties:c,required:p.length>0?p:void 0,additionalProperties:!1};return Object.keys(a).length>0&&(u.$defs=Object.fromEntries(Object.entries(a).map(([l,d])=>[l,S(d,a,0)]))),i&&n?u.description=`${i}. ${n}`:i?u.description=i:n&&(u.description=n),new e(u,f,void 0,void 0,t,r)}static fromJSON(t){let n=typeof t=="string"?JSON.parse(t):t;if(n.descriptors)return e.fromSignals(n.descriptors,n.description,n.label,n.referenceMode);if(n.descriptor)return e.fromSignal(n.descriptor);if(n.jtdSchema)return e.fromJTD(n.jtdSchema);throw new Error("Cannot deserialize: missing jtdSchema, descriptor, or descriptors")}constructor(t,n,i,r,o,s){this.schema=t,this.strict=n,this.jtdSchema=i,this.descriptor=r,this.descriptors=o,this.referenceMode=s??!1}convert=t=>{if(this.descriptors)return B(this.descriptors,t,y);if(this.jtdSchema){let n=t;return this.jtdSchema.discriminator&&this.jtdSchema.mapping&&typeof n=="object"&&n!==null&&"input"in n&&(n=n.input),P(this.jtdSchema,n,y)}return this.descriptor?N(this.descriptor,t,y):{success:!1,errors:["No source schema available"]}};toJSON(){if(this.descriptors){let t={schema:this.schema,strict:this.strict,descriptors:this.descriptors};return this.schema.description&&(t.description=this.schema.description),this.referenceMode&&(t.referenceMode=!0),t}return this.descriptor?{schema:this.schema,strict:this.strict,descriptor:this.descriptor}:{schema:this.schema,strict:this.strict,jtdSchema:this.jtdSchema}}};function ce(e,t){let n=e.formats;if(!n||n.length===0)throw new Error("Signal descriptor has no formats");if(n.length===1){let[a]=n,{schema:c,strict:p}=H(a,t);if(e.label||e.description){let f=[];e.label&&f.push(e.label),e.description&&f.push(e.description);let u=f.join(". ");c.description=c.description?`${u} ${c.description}`:u}return{schema:c,strict:p}}let i=[],r=!0;for(let a of n){let{schema:c,strict:p}=H(a,t);p||(r=!1),a.jtdSchema&&(c.description=c.description?`Structured JSON data. ${c.description}`:"Structured JSON data."),i.push(c)}let o=e.description??"";return{schema:{anyOf:i,description:o||void 0},strict:r}}function H(e,t){if(e.jtdSchema){let n=t??e.jtdSchema.definitions,i=n&&Object.keys(n).length>0?F(n):n,r=!E(e.jtdSchema,i),o;if(r){if(o=S(e.jtdSchema,i,0),!t&&i&&Object.keys(i).length>0){let s=w([e.jtdSchema],i);o.$defs=Object.fromEntries(Object.entries(i).filter(([a])=>s.has(a)).map(([a,c])=>[a,S(c,i,0)]))}}else o={},g(o,e.jtdSchema);return{schema:o,strict:r}}if(e.mimeType)return{schema:ae(e.mimeType),strict:!0};throw new Error("Signal format has neither jtdSchema nor mimeType")}function ge(e){return A.fromJTD(e)}function ye(e){return A.fromSignal(e)}export{A as AnthropicConversion,ye as convertSignalToAnthropicSchema,ge as convertToAnthropicSchema};
|
|
2
2
|
//# sourceMappingURL=anthropic.mjs.map
|