@mochabug/adapt-sdk 0.2.5 → 0.2.7

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.
@@ -1,2 +1,2 @@
1
- "use strict";var y=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var x=(e,r)=>{for(var t in r)y(e,t,{get:r[t],enumerable:!0})},R=(e,r,t,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of k(r))!w.call(e,o)&&o!==t&&y(e,o,{get:()=>r[o],enumerable:!(i=P(r,o))||i.enumerable});return e};var A=e=>R(y({},"__esModule",{value:!0}),e);var G={};x(G,{JTD_SCHEMA_CONFIG:()=>M,MAX_VALIDATION_DEPTH:()=>T,MAX_VALIDATION_ERRORS:()=>D,UNIVERSAL_JTD_SCHEMA_CONFIG:()=>F,fuzzJTD:()=>u,jtdToJsonSchema:()=>c,jtdToUniversalJsonSchema:()=>V,validateJSON:()=>J,validateJTDSchema:()=>v,validateJTDSchemaString:()=>j,validateUniversalJTD:()=>h,validateUniversalJTDSchemaString:()=>q,validateValueAgainstJTD:()=>d,validateValueAgainstSignal:()=>I});module.exports=A(G);var f=require("jtd"),S=10;function u(e,r,t=0){if(t>S)return null;if(e.ref){let i=r?.[e.ref];return i?u(i,r,t+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 42;case"boolean":return!0;default:return null}if(e.enum)return e.enum[0]??null;if(e.elements)return[u(e.elements,r,t+1),u(e.elements,r,t+1)];if(e.values)return{key1:u(e.values,r,t+1)};if(e.properties||e.optionalProperties){let i={};if(e.properties)for(let[o,n]of Object.entries(e.properties))i[o]=u(n,r,t+1);if(e.optionalProperties)for(let[o,n]of Object.entries(e.optionalProperties))i[o]=u(n,r,t+1);return i}if(e.discriminator&&e.mapping){let i=Object.keys(e.mapping)[0];if(i){let o=e.mapping[i],n=u(o,r,t+1);return n[e.discriminator]=i,n}return null}return null}var E=new Set(["int8","uint8","int16","uint16","int32","uint32"]);function U(e){return e.length===0?"/":e.map(r=>/^\d+$/.test(r)?`[${r}]`:`.${r}`).join("")}function b(e,r){let t=e;for(let i=0;i<r.length-1&&(t&&typeof t=="object"&&r[i]in t);i++)t=t[r[i]];return t}function O(e,r){let t=e;for(let i of r)if(t&&typeof t=="object")t=t[i];else return;return t}function C(e,r,t){let{instancePath:i,schemaPath:o}=e,n=U(i),s=o[o.length-1];if(s==="type"){let p=b(r,o)?.type;return p==="boolean"?`${n}: expected boolean`:p==="string"?`${n}: expected string`:p==="timestamp"?`${n}: expected timestamp string`:E.has(p)?`${n}: expected integer`:`${n}: expected number`}if(s==="enum"){let p=b(r,o)?.enum;return`${n}: expected one of [${p.join(", ")}]`}if(o.length>=2&&o[o.length-2]==="properties"&&s)return`${n==="/"?"":n}.${s}: missing required property`;if(s==="elements")return`${n}: expected array`;if(s==="properties"||s==="optionalProperties"||s==="values")return`${n}: expected object`;if(s==="discriminator")return`${n}: expected string discriminator`;if(s==="mapping"){let a=O(t,i);return`${n}: unknown variant "${a}"`}return o.length===0?`${n}: unexpected property`:`${n}: validation error at /${o.join("/")}`}function d(e,r,t){let i=t??e.definitions,o=i?{...e,definitions:i}:e;return(0,f.isValidSchema)(o)?(0,f.validate)(o,r,{maxDepth:T,maxErrors:D}).map(s=>C(s,o,r)):e.ref?[`/: unknown ref "${e.ref}"`]:["/: invalid schema"]}function I(e,r){if("formats"in e&&Array.isArray(e.formats)){let i=e.formats.filter(o=>o.jtdSchema);if(i.length===0)return["/: no JTD formats in signal descriptor"];for(let o of i)if(d(o.jtdSchema,r).length===0)return[];return d(i[i.length-1].jtdSchema,r)}let t=e;return t.jtdSchema?d(t.jtdSchema,r):["/: signal format has no jtdSchema"]}function c(e,r,t=!0){if(!e||typeof e!="object")return{};let i=e.nullable,o=r||e.definitions,n={};if(t&&(n.$schema="http://json-schema.org/draft-07/schema#"),e.ref){let s=e.ref;if(o&&o[s]){let a=c(o[s],o,!1);if(i)if(a.type)a.type=Array.isArray(a.type)?[...a.type,"null"]:[a.type,"null"];else return{...a,anyOf:[a,{type:"null"}],...t?{$schema:"http://json-schema.org/draft-07/schema#"}:{}};return t?{...a,$schema:"http://json-schema.org/draft-07/schema#"}:a}return t?n:{}}if(e.type){let s={boolean:"boolean",string:"string",timestamp:"string",float32:"number",float64:"number",int8:"integer",uint8:"integer",int16:"integer",uint16:"integer",int32:"integer",uint32:"integer"},a=e.type,p=s[a]||"string";return n.type=i?[p,"null"]:p,p==="string"&&a==="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=c(e.elements,o,!1),n;if(e.properties||e.optionalProperties){if(n.type=i?["object","null"]:"object",n.properties={},n.required=[],e.properties)for(let[s,a]of Object.entries(e.properties))n.properties[s]=c(a,o,!1),n.required.push(s);if(e.optionalProperties)for(let[s,a]of Object.entries(e.optionalProperties))n.properties[s]=c(a,o,!1);return e.additionalProperties!==!0&&(n.additionalProperties=!1),n}if(e.values)return n.type=i?["object","null"]:"object",n.additionalProperties=c(e.values,o,!1),n;if(e.discriminator&&e.mapping){let s=[],a=e.discriminator;for(let[p,$]of Object.entries(e.mapping)){let l=c($,o,!1);l.type?l.type!=="object"&&!Array.isArray(l.type)&&(l.type="object"):l.type="object",l.properties=l.properties||{},l.properties[a]={const:p},l.required=l.required||[],l.required.includes(a)||l.required.unshift(a),l.additionalProperties===void 0&&(l.additionalProperties=!1),s.push(l)}return i&&s.push({type:"null"}),n.oneOf=s,n}return n}function m(e,r=""){if(!e||typeof e!="object")return null;if("discriminator"in e||"mapping"in e)return`Discriminator unions are not supported${r?` (at ${r})`:""}. Use a simpler object structure instead.`;if("ref"in e)return`Schema references (ref) are not supported${r?` (at ${r})`:""}. Inline the schema definition instead.`;if("definitions"in e)return`Schema definitions are not supported${r?` (at ${r})`:""}. Inline the schema definition instead.`;if("values"in e)return`Dictionary/map schemas (values form) are not supported${r?` (at ${r})`:""}. OpenAI requires additionalProperties: false on all objects. Use explicit properties instead.`;if("elements"in e&&e.elements){let t=m(e.elements,`${r}/elements`);if(t)return t}if("properties"in e&&e.properties)for(let[t,i]of Object.entries(e.properties)){let o=m(i,`${r}/properties/${t}`);if(o)return o}if("optionalProperties"in e&&e.optionalProperties)for(let[t,i]of Object.entries(e.optionalProperties)){let o=m(i,`${r}/optionalProperties/${t}`);if(o)return o}return null}function g(e){if(!e||typeof e!="object")return{};let r="nullable"in e&&e.nullable===!0,t={},i=e.metadata;if(i&&(typeof i.title=="string"&&i.title.trim()&&(t.title=i.title.trim()),typeof i.description=="string"&&i.description.trim()&&(t.description=i.description.trim())),"type"in e&&e.type){let o={boolean:"boolean",string:"string",timestamp:"string",float32:"number",float64:"number",int8:"integer",uint8:"integer",int16:"integer",uint16:"integer",int32:"integer",uint32:"integer"},n=e.type,s=o[n]||"string";return t.type=r?[s,"null"]:s,n==="timestamp"&&(t.format="date-time"),t}if("enum"in e&&e.enum){let o=e.enum;return t.type=r?["string","null"]:"string",t.enum=r?[...o,null]:o,t}if("elements"in e&&e.elements)return t.type=r?["array","null"]:"array",t.items=g(e.elements),t;if("properties"in e||"optionalProperties"in e){if(t.type=r?["object","null"]:"object",t.properties={},t.required=[],t.additionalProperties=!1,"properties"in e&&e.properties)for(let[o,n]of Object.entries(e.properties))t.properties[o]=g(n),t.required.push(o);if("optionalProperties"in e&&e.optionalProperties)for(let[o,n]of Object.entries(e.optionalProperties))t.properties[o]=g(n);return t}return t}function V(e){let r=m(e);if(r)return{success:!1,error:r};try{return{success:!0,schema:g(e)}}catch(t){return{success:!1,error:t instanceof Error?t.message:"Unknown conversion error"}}}function N(e){let r=m(e);return r?{compatible:!1,error:r}:{compatible:!0}}var T=32,D=100;function v(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 h(e){let r=v(e);if(!r.valid)return r;let t=r.schema;if(!("type"in t)&&!("enum"in t)&&!("elements"in t)&&!("properties"in t)&&!("optionalProperties"in t))return{valid:!1,error:"Schema must define structure (properties, type, enum, or elements). Empty schemas are not supported."};let i=N(r.schema);return i.compatible?{valid:!0,schema:r.schema}:{valid:!1,error:i.error}}function J(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 j(e){let r=J(e);return r.valid?v(r.data):{valid:!1,error:r.error}}function q(e){let r=J(e);return r.valid?h(r.data):{valid:!1,error:r.error}}var F={uri:"https://mochabug.com/schemas/universal-jtd-schema.json",fileMatch:["inmemory://jtd-schema/*.json"],schema:{$schema:"http://json-schema.org/draft-07/schema#",title:"Universal JTD Schema",description:"JSON Type Definition schema compatible with Anthropic Claude, Google Gemini, and OpenAI structured outputs. Note: discriminator unions, refs, and dictionary/map schemas (values) are NOT supported.",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 for classification",type:"array",items:{type:"string"},minItems:1},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 (can be omitted)",type:"object",additionalProperties:{$ref:"#"}},nullable:{description:"Allow null values in addition to the defined type",type:"boolean"},metadata:{description:'Custom metadata - use "title" and "description" to guide the AI model',type:"object",properties:{title:{type:"string",description:"Short title/label for this field"},description:{type:"string",description:"Detailed description of what this field should contain"}},additionalProperties:!1}}}},M={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,UNIVERSAL_JTD_SCHEMA_CONFIG,fuzzJTD,jtdToJsonSchema,jtdToUniversalJsonSchema,validateJSON,validateJTDSchema,validateJTDSchemaString,validateUniversalJTD,validateUniversalJTDSchemaString,validateValueAgainstJTD,validateValueAgainstSignal});
1
+ "use strict";var y=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var x=(e,r)=>{for(var t in r)y(e,t,{get:r[t],enumerable:!0})},R=(e,r,t,i)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of k(r))!w.call(e,o)&&o!==t&&y(e,o,{get:()=>r[o],enumerable:!(i=P(r,o))||i.enumerable});return e};var A=e=>R(y({},"__esModule",{value:!0}),e);var G={};x(G,{JTD_SCHEMA_CONFIG:()=>M,MAX_VALIDATION_DEPTH:()=>T,MAX_VALIDATION_ERRORS:()=>D,UNIVERSAL_JTD_SCHEMA_CONFIG:()=>F,fuzzJTD:()=>u,jtdToJsonSchema:()=>c,jtdToUniversalJsonSchema:()=>V,validateJSON:()=>J,validateJTDSchema:()=>v,validateJTDSchemaString:()=>j,validateUniversalJTD:()=>h,validateUniversalJTDSchemaString:()=>q,validateValueAgainstJTD:()=>d,validateValueAgainstSignal:()=>I});module.exports=A(G);var f=require("jtd"),S=10;function u(e,r,t=0){if(t>S)return null;if(e.ref){let i=r?.[e.ref];return i?u(i,r,t+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[u(e.elements,r,t+1),u(e.elements,r,t+1)];if(e.values)return{key1:u(e.values,r,t+1)};if(e.properties||e.optionalProperties){let i={};if(e.properties)for(let[o,n]of Object.entries(e.properties))i[o]=u(n,r,t+1);if(e.optionalProperties)for(let[o,n]of Object.entries(e.optionalProperties))i[o]=u(n,r,t+1);return i}if(e.discriminator&&e.mapping){let i=Object.keys(e.mapping)[0];if(i){let o=e.mapping[i],n=u(o,r,t+1);return n[e.discriminator]=i,n}return null}return null}var E=new Set(["int8","uint8","int16","uint16","int32","uint32"]);function U(e){return e.length===0?"/":e.map(r=>/^\d+$/.test(r)?`[${r}]`:`.${r}`).join("")}function b(e,r){let t=e;for(let i=0;i<r.length-1&&(t&&typeof t=="object"&&r[i]in t);i++)t=t[r[i]];return t}function O(e,r){let t=e;for(let i of r)if(t&&typeof t=="object")t=t[i];else return;return t}function C(e,r,t){let{instancePath:i,schemaPath:o}=e,n=U(i),s=o[o.length-1];if(s==="type"){let p=b(r,o)?.type;return p==="boolean"?`${n}: expected boolean`:p==="string"?`${n}: expected string`:p==="timestamp"?`${n}: expected timestamp string`:E.has(p)?`${n}: expected integer`:`${n}: expected number`}if(s==="enum"){let p=b(r,o)?.enum;return`${n}: expected one of [${p.join(", ")}]`}if(o.length>=2&&o[o.length-2]==="properties"&&s)return`${n==="/"?"":n}.${s}: missing required property`;if(s==="elements")return`${n}: expected array`;if(s==="properties"||s==="optionalProperties"||s==="values")return`${n}: expected object`;if(s==="discriminator")return`${n}: expected string discriminator`;if(s==="mapping"){let a=O(t,i);return`${n}: unknown variant "${a}"`}return o.length===0?`${n}: unexpected property`:`${n}: validation error at /${o.join("/")}`}function d(e,r,t){let i=t??e.definitions,o=i?{...e,definitions:i}:e;return(0,f.isValidSchema)(o)?(0,f.validate)(o,r,{maxDepth:T,maxErrors:D}).map(s=>C(s,o,r)):e.ref?[`/: unknown ref "${e.ref}"`]:["/: invalid schema"]}function I(e,r){if("formats"in e&&Array.isArray(e.formats)){let i=e.formats.filter(o=>o.jtdSchema);if(i.length===0)return["/: no JTD formats in signal descriptor"];for(let o of i)if(d(o.jtdSchema,r).length===0)return[];return d(i[i.length-1].jtdSchema,r)}let t=e;return t.jtdSchema?d(t.jtdSchema,r):["/: signal format has no jtdSchema"]}function c(e,r,t=!0){if(!e||typeof e!="object")return{};let i=e.nullable,o=r||e.definitions,n={};if(t&&(n.$schema="http://json-schema.org/draft-07/schema#"),e.ref){let s=e.ref;if(o&&o[s]){let a=c(o[s],o,!1);if(i)if(a.type)a.type=Array.isArray(a.type)?[...a.type,"null"]:[a.type,"null"];else return{...a,anyOf:[a,{type:"null"}],...t?{$schema:"http://json-schema.org/draft-07/schema#"}:{}};return t?{...a,$schema:"http://json-schema.org/draft-07/schema#"}:a}return t?n:{}}if(e.type){let s={boolean:"boolean",string:"string",timestamp:"string",float32:"number",float64:"number",int8:"integer",uint8:"integer",int16:"integer",uint16:"integer",int32:"integer",uint32:"integer"},a=e.type,p=s[a]||"string";return n.type=i?[p,"null"]:p,p==="string"&&a==="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=c(e.elements,o,!1),n;if(e.properties||e.optionalProperties){if(n.type=i?["object","null"]:"object",n.properties={},n.required=[],e.properties)for(let[s,a]of Object.entries(e.properties))n.properties[s]=c(a,o,!1),n.required.push(s);if(e.optionalProperties)for(let[s,a]of Object.entries(e.optionalProperties))n.properties[s]=c(a,o,!1);return e.additionalProperties!==!0&&(n.additionalProperties=!1),n}if(e.values)return n.type=i?["object","null"]:"object",n.additionalProperties=c(e.values,o,!1),n;if(e.discriminator&&e.mapping){let s=[],a=e.discriminator;for(let[p,$]of Object.entries(e.mapping)){let l=c($,o,!1);l.type?l.type!=="object"&&!Array.isArray(l.type)&&(l.type="object"):l.type="object",l.properties=l.properties||{},l.properties[a]={const:p},l.required=l.required||[],l.required.includes(a)||l.required.unshift(a),l.additionalProperties===void 0&&(l.additionalProperties=!1),s.push(l)}return i&&s.push({type:"null"}),n.oneOf=s,n}return n}function m(e,r=""){if(!e||typeof e!="object")return null;if("discriminator"in e||"mapping"in e)return`Discriminator unions are not supported${r?` (at ${r})`:""}. Use a simpler object structure instead.`;if("ref"in e)return`Schema references (ref) are not supported${r?` (at ${r})`:""}. Inline the schema definition instead.`;if("definitions"in e)return`Schema definitions are not supported${r?` (at ${r})`:""}. Inline the schema definition instead.`;if("values"in e)return`Dictionary/map schemas (values form) are not supported${r?` (at ${r})`:""}. OpenAI requires additionalProperties: false on all objects. Use explicit properties instead.`;if("elements"in e&&e.elements){let t=m(e.elements,`${r}/elements`);if(t)return t}if("properties"in e&&e.properties)for(let[t,i]of Object.entries(e.properties)){let o=m(i,`${r}/properties/${t}`);if(o)return o}if("optionalProperties"in e&&e.optionalProperties)for(let[t,i]of Object.entries(e.optionalProperties)){let o=m(i,`${r}/optionalProperties/${t}`);if(o)return o}return null}function g(e){if(!e||typeof e!="object")return{};let r="nullable"in e&&e.nullable===!0,t={},i=e.metadata;if(i&&(typeof i.title=="string"&&i.title.trim()&&(t.title=i.title.trim()),typeof i.description=="string"&&i.description.trim()&&(t.description=i.description.trim())),"type"in e&&e.type){let o={boolean:"boolean",string:"string",timestamp:"string",float32:"number",float64:"number",int8:"integer",uint8:"integer",int16:"integer",uint16:"integer",int32:"integer",uint32:"integer"},n=e.type,s=o[n]||"string";return t.type=r?[s,"null"]:s,n==="timestamp"&&(t.format="date-time"),t}if("enum"in e&&e.enum){let o=e.enum;return t.type=r?["string","null"]:"string",t.enum=r?[...o,null]:o,t}if("elements"in e&&e.elements)return t.type=r?["array","null"]:"array",t.items=g(e.elements),t;if("properties"in e||"optionalProperties"in e){if(t.type=r?["object","null"]:"object",t.properties={},t.required=[],t.additionalProperties=!1,"properties"in e&&e.properties)for(let[o,n]of Object.entries(e.properties))t.properties[o]=g(n),t.required.push(o);if("optionalProperties"in e&&e.optionalProperties)for(let[o,n]of Object.entries(e.optionalProperties))t.properties[o]=g(n);return t}return t}function V(e){let r=m(e);if(r)return{success:!1,error:r};try{return{success:!0,schema:g(e)}}catch(t){return{success:!1,error:t instanceof Error?t.message:"Unknown conversion error"}}}function N(e){let r=m(e);return r?{compatible:!1,error:r}:{compatible:!0}}var T=32,D=100;function v(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 h(e){let r=v(e);if(!r.valid)return r;let t=r.schema;if(!("type"in t)&&!("enum"in t)&&!("elements"in t)&&!("properties"in t)&&!("optionalProperties"in t))return{valid:!1,error:"Schema must define structure (properties, type, enum, or elements). Empty schemas are not supported."};let i=N(r.schema);return i.compatible?{valid:!0,schema:r.schema}:{valid:!1,error:i.error}}function J(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 j(e){let r=J(e);return r.valid?v(r.data):{valid:!1,error:r.error}}function q(e){let r=J(e);return r.valid?h(r.data):{valid:!1,error:r.error}}var F={uri:"https://mochabug.com/schemas/universal-jtd-schema.json",fileMatch:["inmemory://jtd-schema/*.json"],schema:{$schema:"http://json-schema.org/draft-07/schema#",title:"Universal JTD Schema",description:"JSON Type Definition schema compatible with Anthropic Claude, Google Gemini, and OpenAI structured outputs. Note: discriminator unions, refs, and dictionary/map schemas (values) are NOT supported.",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 for classification",type:"array",items:{type:"string"},minItems:1},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 (can be omitted)",type:"object",additionalProperties:{$ref:"#"}},nullable:{description:"Allow null values in addition to the defined type",type:"boolean"},metadata:{description:'Custom metadata - use "title" and "description" to guide the AI model',type:"object",properties:{title:{type:"string",description:"Short title/label for this field"},description:{type:"string",description:"Detailed description of what this field should contain"}},additionalProperties:!1}}}},M={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,UNIVERSAL_JTD_SCHEMA_CONFIG,fuzzJTD,jtdToJsonSchema,jtdToUniversalJsonSchema,validateJSON,validateJTDSchema,validateJTDSchemaString,validateUniversalJTD,validateUniversalJTDSchemaString,validateValueAgainstJTD,validateValueAgainstSignal});
2
2
  //# sourceMappingURL=signals.cjs.map
@@ -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 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 validateValueAgainstJTD(\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 validateValueAgainstSignal(\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 validateValueAgainstSignal(\n descriptor: SignalDescriptorJson,\n jsonValue: unknown\n): string[];\nexport function validateValueAgainstSignal(\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 = validateValueAgainstJTD(format.jtdSchema!, jsonValue);\n if (errors.length === 0) return [];\n }\n // None matched \u2014 return errors from last format attempt\n return validateValueAgainstJTD(\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 validateValueAgainstJTD(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 for validation.\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 */\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\n // Ref form\n if (jtdSchema['ref']) {\n const refName = jtdSchema['ref'] as string;\n if (defs && defs[refName]) {\n const resolvedSchema = jtdToJsonSchema(\n defs[refName] as JTDSchemaJson,\n defs,\n false\n );\n\n if (isNullable) {\n if (resolvedSchema.type) {\n resolvedSchema.type = Array.isArray(resolvedSchema.type)\n ? [...resolvedSchema.type, 'null']\n : [resolvedSchema.type, 'null'];\n } else {\n return {\n ...resolvedSchema,\n anyOf: [resolvedSchema, { type: 'null' }],\n ...(isRoot\n ? { $schema: 'http://json-schema.org/draft-07/schema#' }\n : {})\n };\n }\n }\n\n return isRoot\n ? {\n ...resolvedSchema,\n $schema: 'http://json-schema.org/draft-07/schema#'\n }\n : resolvedSchema;\n }\n return isRoot ? result : {};\n }\n\n // Type form\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 // Enum form\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 // Elements form\n if (jtdSchema['elements']) {\n result.type = isNullable ? ['array', 'null'] : 'array';\n result.items = jtdToJsonSchema(\n jtdSchema['elements'] as JTDSchemaJson,\n defs,\n false\n );\n return result;\n }\n\n // Properties form\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] = jtdToJsonSchema(\n value as JTDSchemaJson,\n defs,\n false\n );\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] = jtdToJsonSchema(\n value as JTDSchemaJson,\n defs,\n false\n );\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 // Values form\n if (jtdSchema['values']) {\n result.type = isNullable ? ['object', 'null'] : 'object';\n result.additionalProperties = jtdToJsonSchema(\n jtdSchema['values'] as JTDSchemaJson,\n defs,\n false\n );\n return result;\n }\n\n // Discriminator form\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 = jtdToJsonSchema(\n schema as JTDSchemaJson,\n defs,\n false\n );\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 // Empty form\n return result;\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 UNIVERSAL JSON SCHEMA (for AI providers: Claude, Gemini, OpenAI)\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 interface UniversalJsonSchema {\n type?: string | string[];\n title?: string;\n description?: string;\n enum?: (string | number | null)[];\n format?: 'date-time' | 'date' | 'time';\n properties?: Record<string, UniversalJsonSchema>;\n required?: string[];\n additionalProperties?: false;\n items?: UniversalJsonSchema;\n}\n\nexport interface ConversionSuccess {\n success: true;\n schema: UniversalJsonSchema;\n}\n\nexport interface ConversionFailure {\n success: false;\n error: string;\n}\n\nexport type ConversionResult = ConversionSuccess | ConversionFailure;\n\nfunction checkUnsupportedFeatures(\n jtdSchema: JTDSchemaJson,\n path = ''\n): string | null {\n if (!jtdSchema || typeof jtdSchema !== 'object') {\n return null;\n }\n\n if ('discriminator' in jtdSchema || 'mapping' in jtdSchema) {\n return `Discriminator unions are not supported${\n path ? ` (at ${path})` : ''\n }. Use a simpler object structure instead.`;\n }\n\n if ('ref' in jtdSchema) {\n return `Schema references (ref) are not supported${\n path ? ` (at ${path})` : ''\n }. Inline the schema definition instead.`;\n }\n\n if ('definitions' in jtdSchema) {\n return `Schema definitions are not supported${\n path ? ` (at ${path})` : ''\n }. Inline the schema definition instead.`;\n }\n\n if ('values' in jtdSchema) {\n return `Dictionary/map schemas (values form) are not supported${\n path ? ` (at ${path})` : ''\n }. OpenAI requires additionalProperties: false on all objects. Use explicit properties instead.`;\n }\n\n if ('elements' in jtdSchema && jtdSchema.elements) {\n const elemError = checkUnsupportedFeatures(\n jtdSchema.elements as JTDSchemaJson,\n `${path}/elements`\n );\n if (elemError) return elemError;\n }\n\n if ('properties' in jtdSchema && jtdSchema.properties) {\n for (const [key, value] of Object.entries(jtdSchema.properties)) {\n const propError = checkUnsupportedFeatures(\n value as JTDSchemaJson,\n `${path}/properties/${key}`\n );\n if (propError) return propError;\n }\n }\n\n if ('optionalProperties' in jtdSchema && jtdSchema.optionalProperties) {\n for (const [key, value] of Object.entries(jtdSchema.optionalProperties)) {\n const propError = checkUnsupportedFeatures(\n value as JTDSchemaJson,\n `${path}/optionalProperties/${key}`\n );\n if (propError) return propError;\n }\n }\n\n return null;\n}\n\nfunction convertSchemaToUniversal(\n jtdSchema: JTDSchemaJson\n): UniversalJsonSchema {\n if (!jtdSchema || typeof jtdSchema !== 'object') {\n return {};\n }\n\n const isNullable = 'nullable' in jtdSchema && jtdSchema.nullable === true;\n const result: UniversalJsonSchema = {};\n\n const metadata = jtdSchema.metadata as Record<string, unknown> | undefined;\n if (metadata) {\n if (typeof metadata['title'] === 'string' && metadata['title'].trim()) {\n result.title = metadata['title'].trim();\n }\n if (\n typeof metadata['description'] === 'string' &&\n metadata['description'].trim()\n ) {\n result.description = metadata['description'].trim();\n }\n }\n\n // Type form\n if ('type' in jtdSchema && 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\n const jtdType = jtdSchema.type as string;\n const baseType = typeMap[jtdType] || 'string';\n\n result.type = isNullable ? [baseType, 'null'] : baseType;\n\n if (jtdType === 'timestamp') {\n result.format = 'date-time';\n }\n\n return result;\n }\n\n // Enum form\n if ('enum' in jtdSchema && jtdSchema.enum) {\n const enumValues = jtdSchema.enum as string[];\n result.type = isNullable ? ['string', 'null'] : 'string';\n result.enum = isNullable ? [...enumValues, null] : enumValues;\n return result;\n }\n\n // Elements form\n if ('elements' in jtdSchema && jtdSchema.elements) {\n result.type = isNullable ? ['array', 'null'] : 'array';\n result.items = convertSchemaToUniversal(\n jtdSchema.elements as JTDSchemaJson\n );\n return result;\n }\n\n // Properties form\n if ('properties' in jtdSchema || 'optionalProperties' in jtdSchema) {\n result.type = isNullable ? ['object', 'null'] : 'object';\n result.properties = {};\n result.required = [];\n result.additionalProperties = false;\n\n if ('properties' in jtdSchema && jtdSchema.properties) {\n for (const [key, value] of Object.entries(jtdSchema.properties)) {\n result.properties[key] = convertSchemaToUniversal(\n value as JTDSchemaJson\n );\n result.required.push(key);\n }\n }\n\n if ('optionalProperties' in jtdSchema && jtdSchema.optionalProperties) {\n for (const [key, value] of Object.entries(jtdSchema.optionalProperties)) {\n result.properties[key] = convertSchemaToUniversal(\n value as JTDSchemaJson\n );\n }\n }\n\n return result;\n }\n\n // Empty form\n return result;\n}\n\n/** Convert JTD schema to Universal JSON Schema compatible with Claude, Gemini, and OpenAI. */\nexport function jtdToUniversalJsonSchema(\n jtdSchema: JTDSchemaJson\n): ConversionResult {\n const unsupportedError = checkUnsupportedFeatures(jtdSchema);\n if (unsupportedError) {\n return { success: false, error: unsupportedError };\n }\n\n try {\n const schema = convertSchemaToUniversal(jtdSchema);\n return { success: true, schema };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Unknown conversion error'\n };\n }\n}\n\ninterface UniversalCompatible {\n compatible: true;\n}\n\ninterface UniversalNotCompatible {\n compatible: false;\n error: string;\n}\n\ntype UniversalCompatibilityResult =\n | UniversalCompatible\n | UniversalNotCompatible;\n\nfunction isUniversalCompatible(\n jtdSchema: JTDSchemaJson\n): UniversalCompatibilityResult {\n const error = checkUnsupportedFeatures(jtdSchema);\n if (error) {\n return { compatible: false, error };\n }\n\n return { compatible: true };\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/**\n * Validate that the input is a valid JTD schema compatible with universal JSON schema\n * (Anthropic Claude, Google Gemini, and OpenAI structured outputs).\n */\nexport function validateUniversalJTD(\n schema: unknown\n): { valid: true; schema: JTDSchemaJson } | { valid: false; error: string } {\n const jtdResult = validateJTDSchema(schema);\n if (!jtdResult.valid) return jtdResult;\n\n const s = jtdResult.schema;\n if (\n !('type' in s) &&\n !('enum' in s) &&\n !('elements' in s) &&\n !('properties' in s) &&\n !('optionalProperties' in s)\n ) {\n return {\n valid: false,\n error:\n 'Schema must define structure (properties, type, enum, or elements). Empty schemas are not supported.'\n };\n }\n\n const compatibilityResult = isUniversalCompatible(jtdResult.schema);\n if (!compatibilityResult.compatible) {\n return { valid: false, error: compatibilityResult.error };\n }\n\n return { valid: true, schema: jtdResult.schema };\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/** Parse a JSON string and validate it as a universal JTD schema (compatible with Claude, Gemini, OpenAI). */\nexport function validateUniversalJTDSchemaString(\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 validateUniversalJTD(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/**\n * Monaco editor JSON schema configuration for JTD schemas compatible with\n * Anthropic Claude, Google Gemini, and OpenAI structured outputs.\n * This is a restricted subset of JTD that excludes discriminator unions, refs, and values (dictionaries).\n */\nexport const UNIVERSAL_JTD_SCHEMA_CONFIG = {\n uri: 'https://mochabug.com/schemas/universal-jtd-schema.json',\n fileMatch: ['inmemory://jtd-schema/*.json'],\n schema: {\n $schema: 'http://json-schema.org/draft-07/schema#',\n title: 'Universal JTD Schema',\n description:\n 'JSON Type Definition schema compatible with Anthropic Claude, Google Gemini, and OpenAI structured outputs. Note: discriminator unions, refs, and dictionary/map schemas (values) are NOT supported.',\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 for classification',\n type: 'array',\n items: { type: 'string' },\n minItems: 1,\n },\n elements: {\n description: 'Elements form - defines an array with typed elements',\n $ref: '#',\n },\n properties: {\n description: '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 (can be omitted)',\n type: 'object',\n additionalProperties: { $ref: '#' },\n },\n nullable: {\n description: 'Allow null values in addition to the defined type',\n type: 'boolean',\n },\n metadata: {\n description: 'Custom metadata - use \"title\" and \"description\" to guide the AI model',\n type: 'object',\n properties: {\n title: {\n type: 'string',\n description: 'Short title/label for this field',\n },\n description: {\n type: 'string',\n description: 'Detailed description of what this field should contain',\n },\n },\n additionalProperties: false,\n },\n },\n // Note: We explicitly do NOT include discriminator, mapping, ref, definitions, values,\n // or additionalProperties as these are not universally supported across AI providers\n },\n};\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": "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O,MAAOA,EAAW,KAAO,CAGzE,CAWO,IAAMzE,EAA8B,CACzC,IAAK,yDACL,UAAW,CAAC,8BAA8B,EAC1C,OAAQ,CACN,QAAS,0CACT,MAAO,uBACP,YACE,uMACF,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,gEACb,KAAM,QACN,MAAO,CAAE,KAAM,QAAS,EACxB,SAAU,CACZ,EACA,SAAU,CACR,YAAa,uDACb,KAAM,GACR,EACA,WAAY,CACV,YAAa,+DACb,KAAM,SACN,qBAAsB,CAAE,KAAM,GAAI,CACpC,EACA,mBAAoB,CAClB,YAAa,4EACb,KAAM,SACN,qBAAsB,CAAE,KAAM,GAAI,CACpC,EACA,SAAU,CACR,YAAa,oDACb,KAAM,SACR,EACA,SAAU,CACR,YAAa,wEACb,KAAM,SACN,WAAY,CACV,MAAO,CACL,KAAM,SACN,YAAa,kCACf,EACA,YAAa,CACX,KAAM,SACN,YAAa,wDACf,CACF,EACA,qBAAsB,EACxB,CACF,CAGF,CACF,EAGaH,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",
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 validateValueAgainstJTD(\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 validateValueAgainstSignal(\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 validateValueAgainstSignal(\n descriptor: SignalDescriptorJson,\n jsonValue: unknown\n): string[];\nexport function validateValueAgainstSignal(\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 = validateValueAgainstJTD(format.jtdSchema!, jsonValue);\n if (errors.length === 0) return [];\n }\n // None matched \u2014 return errors from last format attempt\n return validateValueAgainstJTD(\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 validateValueAgainstJTD(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 for validation.\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 */\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\n // Ref form\n if (jtdSchema['ref']) {\n const refName = jtdSchema['ref'] as string;\n if (defs && defs[refName]) {\n const resolvedSchema = jtdToJsonSchema(\n defs[refName] as JTDSchemaJson,\n defs,\n false\n );\n\n if (isNullable) {\n if (resolvedSchema.type) {\n resolvedSchema.type = Array.isArray(resolvedSchema.type)\n ? [...resolvedSchema.type, 'null']\n : [resolvedSchema.type, 'null'];\n } else {\n return {\n ...resolvedSchema,\n anyOf: [resolvedSchema, { type: 'null' }],\n ...(isRoot\n ? { $schema: 'http://json-schema.org/draft-07/schema#' }\n : {})\n };\n }\n }\n\n return isRoot\n ? {\n ...resolvedSchema,\n $schema: 'http://json-schema.org/draft-07/schema#'\n }\n : resolvedSchema;\n }\n return isRoot ? result : {};\n }\n\n // Type form\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 // Enum form\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 // Elements form\n if (jtdSchema['elements']) {\n result.type = isNullable ? ['array', 'null'] : 'array';\n result.items = jtdToJsonSchema(\n jtdSchema['elements'] as JTDSchemaJson,\n defs,\n false\n );\n return result;\n }\n\n // Properties form\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] = jtdToJsonSchema(\n value as JTDSchemaJson,\n defs,\n false\n );\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] = jtdToJsonSchema(\n value as JTDSchemaJson,\n defs,\n false\n );\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 // Values form\n if (jtdSchema['values']) {\n result.type = isNullable ? ['object', 'null'] : 'object';\n result.additionalProperties = jtdToJsonSchema(\n jtdSchema['values'] as JTDSchemaJson,\n defs,\n false\n );\n return result;\n }\n\n // Discriminator form\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 = jtdToJsonSchema(\n schema as JTDSchemaJson,\n defs,\n false\n );\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 // Empty form\n return result;\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 UNIVERSAL JSON SCHEMA (for AI providers: Claude, Gemini, OpenAI)\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 interface UniversalJsonSchema {\n type?: string | string[];\n title?: string;\n description?: string;\n enum?: (string | number | null)[];\n format?: 'date-time' | 'date' | 'time';\n properties?: Record<string, UniversalJsonSchema>;\n required?: string[];\n additionalProperties?: false;\n items?: UniversalJsonSchema;\n}\n\nexport interface ConversionSuccess {\n success: true;\n schema: UniversalJsonSchema;\n}\n\nexport interface ConversionFailure {\n success: false;\n error: string;\n}\n\nexport type ConversionResult = ConversionSuccess | ConversionFailure;\n\nfunction checkUnsupportedFeatures(\n jtdSchema: JTDSchemaJson,\n path = ''\n): string | null {\n if (!jtdSchema || typeof jtdSchema !== 'object') {\n return null;\n }\n\n if ('discriminator' in jtdSchema || 'mapping' in jtdSchema) {\n return `Discriminator unions are not supported${\n path ? ` (at ${path})` : ''\n }. Use a simpler object structure instead.`;\n }\n\n if ('ref' in jtdSchema) {\n return `Schema references (ref) are not supported${\n path ? ` (at ${path})` : ''\n }. Inline the schema definition instead.`;\n }\n\n if ('definitions' in jtdSchema) {\n return `Schema definitions are not supported${\n path ? ` (at ${path})` : ''\n }. Inline the schema definition instead.`;\n }\n\n if ('values' in jtdSchema) {\n return `Dictionary/map schemas (values form) are not supported${\n path ? ` (at ${path})` : ''\n }. OpenAI requires additionalProperties: false on all objects. Use explicit properties instead.`;\n }\n\n if ('elements' in jtdSchema && jtdSchema.elements) {\n const elemError = checkUnsupportedFeatures(\n jtdSchema.elements as JTDSchemaJson,\n `${path}/elements`\n );\n if (elemError) return elemError;\n }\n\n if ('properties' in jtdSchema && jtdSchema.properties) {\n for (const [key, value] of Object.entries(jtdSchema.properties)) {\n const propError = checkUnsupportedFeatures(\n value as JTDSchemaJson,\n `${path}/properties/${key}`\n );\n if (propError) return propError;\n }\n }\n\n if ('optionalProperties' in jtdSchema && jtdSchema.optionalProperties) {\n for (const [key, value] of Object.entries(jtdSchema.optionalProperties)) {\n const propError = checkUnsupportedFeatures(\n value as JTDSchemaJson,\n `${path}/optionalProperties/${key}`\n );\n if (propError) return propError;\n }\n }\n\n return null;\n}\n\nfunction convertSchemaToUniversal(\n jtdSchema: JTDSchemaJson\n): UniversalJsonSchema {\n if (!jtdSchema || typeof jtdSchema !== 'object') {\n return {};\n }\n\n const isNullable = 'nullable' in jtdSchema && jtdSchema.nullable === true;\n const result: UniversalJsonSchema = {};\n\n const metadata = jtdSchema.metadata as Record<string, unknown> | undefined;\n if (metadata) {\n if (typeof metadata['title'] === 'string' && metadata['title'].trim()) {\n result.title = metadata['title'].trim();\n }\n if (\n typeof metadata['description'] === 'string' &&\n metadata['description'].trim()\n ) {\n result.description = metadata['description'].trim();\n }\n }\n\n // Type form\n if ('type' in jtdSchema && 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\n const jtdType = jtdSchema.type as string;\n const baseType = typeMap[jtdType] || 'string';\n\n result.type = isNullable ? [baseType, 'null'] : baseType;\n\n if (jtdType === 'timestamp') {\n result.format = 'date-time';\n }\n\n return result;\n }\n\n // Enum form\n if ('enum' in jtdSchema && jtdSchema.enum) {\n const enumValues = jtdSchema.enum as string[];\n result.type = isNullable ? ['string', 'null'] : 'string';\n result.enum = isNullable ? [...enumValues, null] : enumValues;\n return result;\n }\n\n // Elements form\n if ('elements' in jtdSchema && jtdSchema.elements) {\n result.type = isNullable ? ['array', 'null'] : 'array';\n result.items = convertSchemaToUniversal(\n jtdSchema.elements as JTDSchemaJson\n );\n return result;\n }\n\n // Properties form\n if ('properties' in jtdSchema || 'optionalProperties' in jtdSchema) {\n result.type = isNullable ? ['object', 'null'] : 'object';\n result.properties = {};\n result.required = [];\n result.additionalProperties = false;\n\n if ('properties' in jtdSchema && jtdSchema.properties) {\n for (const [key, value] of Object.entries(jtdSchema.properties)) {\n result.properties[key] = convertSchemaToUniversal(\n value as JTDSchemaJson\n );\n result.required.push(key);\n }\n }\n\n if ('optionalProperties' in jtdSchema && jtdSchema.optionalProperties) {\n for (const [key, value] of Object.entries(jtdSchema.optionalProperties)) {\n result.properties[key] = convertSchemaToUniversal(\n value as JTDSchemaJson\n );\n }\n }\n\n return result;\n }\n\n // Empty form\n return result;\n}\n\n/** Convert JTD schema to Universal JSON Schema compatible with Claude, Gemini, and OpenAI. */\nexport function jtdToUniversalJsonSchema(\n jtdSchema: JTDSchemaJson\n): ConversionResult {\n const unsupportedError = checkUnsupportedFeatures(jtdSchema);\n if (unsupportedError) {\n return { success: false, error: unsupportedError };\n }\n\n try {\n const schema = convertSchemaToUniversal(jtdSchema);\n return { success: true, schema };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Unknown conversion error'\n };\n }\n}\n\ninterface UniversalCompatible {\n compatible: true;\n}\n\ninterface UniversalNotCompatible {\n compatible: false;\n error: string;\n}\n\ntype UniversalCompatibilityResult =\n | UniversalCompatible\n | UniversalNotCompatible;\n\nfunction isUniversalCompatible(\n jtdSchema: JTDSchemaJson\n): UniversalCompatibilityResult {\n const error = checkUnsupportedFeatures(jtdSchema);\n if (error) {\n return { compatible: false, error };\n }\n\n return { compatible: true };\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/**\n * Validate that the input is a valid JTD schema compatible with universal JSON schema\n * (Anthropic Claude, Google Gemini, and OpenAI structured outputs).\n */\nexport function validateUniversalJTD(\n schema: unknown\n): { valid: true; schema: JTDSchemaJson } | { valid: false; error: string } {\n const jtdResult = validateJTDSchema(schema);\n if (!jtdResult.valid) return jtdResult;\n\n const s = jtdResult.schema;\n if (\n !('type' in s) &&\n !('enum' in s) &&\n !('elements' in s) &&\n !('properties' in s) &&\n !('optionalProperties' in s)\n ) {\n return {\n valid: false,\n error:\n 'Schema must define structure (properties, type, enum, or elements). Empty schemas are not supported.'\n };\n }\n\n const compatibilityResult = isUniversalCompatible(jtdResult.schema);\n if (!compatibilityResult.compatible) {\n return { valid: false, error: compatibilityResult.error };\n }\n\n return { valid: true, schema: jtdResult.schema };\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/** Parse a JSON string and validate it as a universal JTD schema (compatible with Claude, Gemini, OpenAI). */\nexport function validateUniversalJTDSchemaString(\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 validateUniversalJTD(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/**\n * Monaco editor JSON schema configuration for JTD schemas compatible with\n * Anthropic Claude, Google Gemini, and OpenAI structured outputs.\n * This is a restricted subset of JTD that excludes discriminator unions, refs, and values (dictionaries).\n */\nexport const UNIVERSAL_JTD_SCHEMA_CONFIG = {\n uri: 'https://mochabug.com/schemas/universal-jtd-schema.json',\n fileMatch: ['inmemory://jtd-schema/*.json'],\n schema: {\n $schema: 'http://json-schema.org/draft-07/schema#',\n title: 'Universal JTD Schema',\n description:\n 'JSON Type Definition schema compatible with Anthropic Claude, Google Gemini, and OpenAI structured outputs. Note: discriminator unions, refs, and dictionary/map schemas (values) are NOT supported.',\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:\n 'Enum form - defines a set of string values for classification',\n type: 'array',\n items: { type: 'string' },\n minItems: 1\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:\n 'Optional properties - defines optional object properties (can be omitted)',\n type: 'object',\n additionalProperties: { $ref: '#' }\n },\n nullable: {\n description: 'Allow null values in addition to the defined type',\n type: 'boolean'\n },\n metadata: {\n description:\n 'Custom metadata - use \"title\" and \"description\" to guide the AI model',\n type: 'object',\n properties: {\n title: {\n type: 'string',\n description: 'Short title/label for this field'\n },\n description: {\n type: 'string',\n description:\n 'Detailed description of what this field should contain'\n }\n },\n additionalProperties: false\n }\n }\n // Note: We explicitly do NOT include discriminator, mapping, ref, definitions, values,\n // or additionalProperties as these are not universally supported across AI providers\n }\n};\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": "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AE,MAAO,GAAO,MAAOA,EAAW,KAAO,CAGzE,CAWO,IAAMzE,EAA8B,CACzC,IAAK,yDACL,UAAW,CAAC,8BAA8B,EAC1C,OAAQ,CACN,QAAS,0CACT,MAAO,uBACP,YACE,uMACF,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,YACE,gEACF,KAAM,QACN,MAAO,CAAE,KAAM,QAAS,EACxB,SAAU,CACZ,EACA,SAAU,CACR,YAAa,uDACb,KAAM,GACR,EACA,WAAY,CACV,YACE,+DACF,KAAM,SACN,qBAAsB,CAAE,KAAM,GAAI,CACpC,EACA,mBAAoB,CAClB,YACE,4EACF,KAAM,SACN,qBAAsB,CAAE,KAAM,GAAI,CACpC,EACA,SAAU,CACR,YAAa,oDACb,KAAM,SACR,EACA,SAAU,CACR,YACE,wEACF,KAAM,SACN,WAAY,CACV,MAAO,CACL,KAAM,SACN,YAAa,kCACf,EACA,YAAa,CACX,KAAM,SACN,YACE,wDACJ,CACF,EACA,qBAAsB,EACxB,CACF,CAGF,CACF,EAGaH,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
6
  "names": ["signals_exports", "__export", "JTD_SCHEMA_CONFIG", "MAX_VALIDATION_DEPTH", "MAX_VALIDATION_ERRORS", "UNIVERSAL_JTD_SCHEMA_CONFIG", "fuzzJTD", "jtdToJsonSchema", "jtdToUniversalJsonSchema", "validateJSON", "validateJTDSchema", "validateJTDSchemaString", "validateUniversalJTD", "validateUniversalJTDSchemaString", "validateValueAgainstJTD", "validateValueAgainstSignal", "__toCommonJS", "import_jtd", "FUZZ_MAX_DEPTH", "schema", "definitions", "_depth", "def", "obj", "k", "v", "firstKey", "variant", "INTEGER_TYPES", "formatInstancePath", "instancePath", "p", "resolveSchemaParent", "schemaPath", "current", "resolveInstanceValue", "value", "key", "formatValidationError", "error", "path", "lastKey", "jtdType", "enumValues", "discValue", "defs", "schemaForValidation", "jtdValidate", "err", "formatOrDescriptor", "jsonValue", "jtdFormats", "f", "format", "jtdSchema", "isRoot", "isNullable", "result", "refName", "resolvedSchema", "typeMap", "baseType", "variants", "discriminatorKey", "tag", "variantSchema", "checkUnsupportedFeatures", "elemError", "propError", "convertSchemaToUniversal", "metadata", "unsupportedError", "isUniversalCompatible", "jtdResult", "s", "compatibilityResult", "jsonString", "schemaString", "jsonResult"]
7
7
  }
package/dist/esm/cel.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import{celFunc as g,celMethod as v,run as oe,CelScalar as f,isCelError as se,isCelList as ae,isCelMap as le,isCelUint as $,listType as ue,objectType as j}from"@bufbuild/cel";import{strings as ce}from"@bufbuild/cel/ext";import{timestampFromDate as ze,timestampNow as pe,TimestampSchema as V}from"@bufbuild/protobuf/wkt";import{isSchema as Ae,isValidSchema as Re,validate as $e}from"jtd";var ie=10;function b(e,n,t=0){if(t>ie)return null;if(e.ref){let r=n?.[e.ref];return r?b(r,n,t+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 42;case"boolean":return!0;default:return null}if(e.enum)return e.enum[0]??null;if(e.elements)return[b(e.elements,n,t+1),b(e.elements,n,t+1)];if(e.values)return{key1:b(e.values,n,t+1)};if(e.properties||e.optionalProperties){let r={};if(e.properties)for(let[i,o]of Object.entries(e.properties))r[i]=b(o,n,t+1);if(e.optionalProperties)for(let[i,o]of Object.entries(e.optionalProperties))r[i]=b(o,n,t+1);return r}if(e.discriminator&&e.mapping){let r=Object.keys(e.mapping)[0];if(r){let i=e.mapping[r],o=b(i,n,t+1);return o[e.discriminator]=r,o}return null}return null}function S(e){return typeof e=="number"?e:typeof e=="bigint"?Number(e):$(e)?Number(e.value):null}function w(e,n){if(e===n)return!0;let t=$(e)?e.value:e,r=$(n)?n.value:n;return t===r}function me(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&!(e instanceof DataView)}function U(e){return e instanceof Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e}function de(e){return new Uint8Array(e)}var M=typeof Buffer<"u",fe=M?e=>Buffer.from(e,"base64"):typeof Uint8Array.fromBase64=="function"?e=>Uint8Array.fromBase64(e):e=>Uint8Array.from(atob(e),n=>n.charCodeAt(0)),ge=M?e=>Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString("base64"):typeof Uint8Array.prototype.toBase64=="function"?e=>e.toBase64():e=>btoa(Array.from(e,n=>String.fromCharCode(n)).join(""));function L(e,n="utf-8"){if(me(e))return U(e);let t=JSON.stringify(A(e));return n==="utf-8"||n==="utf8"?de(new TextEncoder().encode(t)):M?new Uint8Array(Buffer.from(t,n)):Uint8Array.from(t,r=>r.charCodeAt(0))}function F(e,n="utf-8"){let t=U(e);return JSON.parse(new TextDecoder(n).decode(t))}function _(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}var h=ue(f.DYN),{DYN:m,BOOL:G,INT:k}=f;function ye(e,n){let t=e.getFullYear(),r=e.getMonth()+1,i=e.getDate(),o=e.getHours(),s=e.getMinutes(),a=e.getSeconds();return n.replace(/YYYY/g,String(t)).replace(/YY/g,String(t).slice(-2)).replace(/MM/g,String(r).padStart(2,"0")).replace(/DD/g,String(i).padStart(2,"0")).replace(/HH/g,String(o).padStart(2,"0")).replace(/mm/g,String(s).padStart(2,"0")).replace(/ss/g,String(a).padStart(2,"0"))}var he=[g("sum",[h],m,e=>{let n=0;for(let t of e){let r=S(t);r!==null&&(n+=r)}return n}),v("sum",h,[],m,function(){let e=0;for(let n of this){let t=S(n);t!==null&&(e+=t)}return e}),g("min",[h],m,e=>{let n=null;for(let t of e){let r=S(t);r!==null&&(n===null||r<n)&&(n=r)}return n??0}),v("min",h,[],m,function(){let e=null;for(let n of this){let t=S(n);t!==null&&(e===null||t<e)&&(e=t)}return e??0}),g("max",[h],m,e=>{let n=null;for(let t of e){let r=S(t);r!==null&&(n===null||r>n)&&(n=r)}return n??0}),v("max",h,[],m,function(){let e=null;for(let n of this){let t=S(n);t!==null&&(e===null||t>e)&&(e=t)}return e??0}),g("avg",[h],m,e=>{let n=0,t=0;for(let r of e){let i=S(r);i!==null&&(n+=i,t++)}return t>0?n/t:0}),v("avg",h,[],m,function(){let e=0,n=0;for(let t of this){let r=S(t);r!==null&&(e+=r,n++)}return n>0?e/n:0}),g("includes",[h,m],G,(e,n)=>{for(let t of e)if(w(t,n))return!0;return!1}),v("includes",h,[m],G,function(e){for(let n of this)if(w(n,e))return!0;return!1}),g("findIndex",[h,m],k,(e,n)=>{let t=0n;for(let r of e){if(w(r,n))return t;t++}return-1n}),v("findIndex",h,[m],k,function(e){let n=0n;for(let t of this){if(w(t,e))return n;n++}return-1n}),g("findLastIndex",[h,m],k,(e,n)=>{let t=[...e];for(let r=t.length-1;r>=0;r--)if(w(t[r],n))return BigInt(r);return-1n}),v("findLastIndex",h,[m],k,function(e){let n=[...this];for(let t=n.length-1;t>=0;t--)if(w(n[t],e))return BigInt(t);return-1n}),g("now",[],j(V),()=>pe()),g("lower",[f.STRING],f.STRING,e=>e.toLowerCase()),g("upper",[f.STRING],f.STRING,e=>e.toUpperCase()),v("lower",f.STRING,[],f.STRING,function(){return this.toLowerCase()}),v("upper",f.STRING,[],f.STRING,function(){return this.toUpperCase()}),g("base64decode",[f.STRING],m,e=>fe(e)),g("base64encode",[m],f.STRING,e=>ge(U(e))),g("encode",[m],m,e=>L(e)),g("encode",[m,f.STRING],m,(e,n)=>L(e,n)),g("decode",[m],m,e=>F(e)),g("decode",[m,f.STRING],m,(e,n)=>F(e,n)),g("htmlEscape",[f.STRING],f.STRING,e=>_(e)),g("attrEscape",[f.STRING],f.STRING,e=>_(e)),v("formatDate",j(V),[f.STRING],f.STRING,function(e){let n=this.message,t=Number(n.seconds)*1e3+Math.floor(n.nanos/1e6),r=new Date(t);return ye(r,e)})],be={funcs:[...ce,...he]};function A(e){if(ae(e))return[...e].map(n=>A(n));if(le(e)){let n={};for(let[t,r]of e)n[String(t)]=A(r);return n}return typeof e=="bigint"?Number(e):e}var H=1e4;function ve(e,n){let t=n.filter(l=>l.length>0&&/^\w+$/.test(l));if(t.length===0)return[];let r=[],o=t.map(l=>l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),s=new RegExp(`\\b(${o})(?:(?:\\.([a-zA-Z_]\\w*)|\\["([^"]+)"\\]|\\['([^']+)'\\])|(?=$|[^a-zA-Z_0-9.\\[]))`,"g"),a;for(;(a=s.exec(e))!==null;){let l=a[1],p=a[2]||a[3]||a[4];if(!p){r.push({variableName:l,path:[],fullPath:l});continue}let d=[p],u=a.index+a[0].length;for(;u<e.length;){let y=e.slice(u).match(/^\.([a-zA-Z_]\w*)/);if(y){let T=u+y[0].length;if(e[T]==="(")break;d.push(y[1]),u=T;continue}let x=e.slice(u).match(/^\["([^"]+)"\]|^\['([^']+)'\]/);if(x){d.push(x[1]||x[2]),u+=x[0].length;continue}break}let c=l+"."+d.join(".");r.push({variableName:l,path:d,fullPath:c})}return Te(r)}function Te(e){let n=new Map;for(let r of e){let i=n.get(r.variableName)||[];i.push(r),n.set(r.variableName,i)}let t=[];for(let[,r]of n){r.sort((o,s)=>s.path.length-o.path.length);let i=[];for(let o of r)i.some(a=>xe(o,a))||i.push(o);t.push(...i)}return t}function xe(e,n){if(e.variableName!==n.variableName||e.path.length>n.path.length)return!1;for(let t=0;t<e.path.length;t++)if(e.path[t]!==n.path[t])return!1;return!0}function Se(e,n,t){let r=[];if(t&&r.push({segmentIndex:-1,propertyName:"",isSignalOptional:!0}),!n||e.length===0)return r;let i=n;for(let o=0;o<e.length;o++){let s=e[o];if(!i)break;let a=i.optionalProperties,l=i.properties;if(a&&s in a)r.push({segmentIndex:o,propertyName:s,isSignalOptional:!1}),i=a[s];else if(l&&s in l)i=l[s];else break}return r}function Je(e,n){let t=[],r={};for(let i of e)r[i.name]=b(i.schema,i.schema.definitions);t.push({bindings:r,description:"All properties present"});for(let i of n){let o=e.find(a=>a.name===i.variableName);if(!o)continue;let s=Se(i.path,o.schema,o.optional??!1);for(let a of s){let l=JSON.parse(JSON.stringify(r));if(a.isSignalOptional&&a.segmentIndex===-1)delete l[i.variableName],t.push({bindings:l,description:`Variable '${i.variableName}' not bound`,unsetPath:i.variableName});else{let p=i.path.slice(0,a.segmentIndex+1);we(l[i.variableName],p);let d=`${i.variableName}.${p.join(".")}`;t.push({bindings:l,description:`Optional property '${a.propertyName}' unset`,unsetPath:d})}}}return t}function we(e,n){if(n.length===0||e===null||typeof e!="object")return;let t=e;for(let r=0;r<n.length-1;r++){if(t===null||typeof t!="object")return;t=t[n[r]]}t!==null&&typeof t=="object"&&delete t[n[n.length-1]]}function O(e,n){if(e.length>H)return{error:`Expression exceeds maximum length of ${H} characters`};try{let t={};for(let[i,o]of Object.entries(n))t[i]=o;let r=oe(e,t,be);return se(r)?{error:r.message}:{result:A(r)}}catch(t){return{error:t instanceof Error?t.message:String(t)}}}function Ve(e,n){let t=[];if(!e.trim())return{valid:!0};let r={};for(let l of n)r[l.name]=b(l.schema,l.schema.definitions);let i=O(e,r);if(i.error)return{valid:!1,errors:[{message:`Syntax error: ${i.error}`}]};let o=n.map(l=>l.name),s=ve(e,o);if(s.length===0)return{valid:!0};let a=Je(n,s);for(let l=1;l<a.length;l++){let p=a[l],d=O(e,p.bindings);d.error&&t.push({message:`Expression fails when ${p.description}: ${d.error}`,path:p.unsetPath,isOptionalAccess:!0})}return t.length>0?{valid:!1,errors:t}:{valid:!0}}function Le(e,n){if(!e.trim())return{valid:!0};let t={};for(let i of n)t[i.name]=b(i.schema,i.schema.definitions);let r=O(e,t);return r.error?{valid:!1,errors:[{message:r.error}]}:{valid:!0}}var J="cel",E=[{name:"string",detail:"string(x) \u2192 string",documentation:"Convert value to string. Works on bool, int, uint, double, bytes, timestamp, duration.",params:["x"]},{name:"int",detail:"int(x) \u2192 int",documentation:"Convert value to integer. Works on uint, double, string, timestamp, duration.",params:["x"]},{name:"uint",detail:"uint(x) \u2192 uint",documentation:"Convert value to unsigned integer. Works on int, double, string.",params:["x"]},{name:"double",detail:"double(x) \u2192 double",documentation:"Convert value to double. Works on int, uint, string.",params:["x"]},{name:"bool",detail:"bool(x) \u2192 bool",documentation:'Convert value to boolean. String values: "true", "false", "t", "f", "1", "0".',params:["x"]},{name:"bytes",detail:"bytes(x) \u2192 bytes",documentation:"Convert value to bytes. String is UTF-8 encoded.",params:["x"]},{name:"timestamp",detail:"timestamp(x) \u2192 timestamp",documentation:"Convert value to timestamp. String must be RFC3339 format.",params:["x"]},{name:"duration",detail:"duration(x) \u2192 duration",documentation:'Convert value to duration. String format: "300s", "1.5h", "2m30s".',params:["x"]},{name:"type",detail:"type(x) \u2192 type",documentation:"Returns the type of the value.",params:["x"]},{name:"dyn",detail:"dyn(x) \u2192 dyn",documentation:"Identity function, returns the value unchanged.",params:["x"]},{name:"size",detail:"size(x) \u2192 int",documentation:"Returns size of string (codepoints), list, bytes, or map.",params:["x"]},{name:"has",detail:"has(x.field) \u2192 bool",documentation:"Check if field exists and is not null. Use to guard optional values.",params:["x.field"]},{name:"now",detail:"now() \u2192 timestamp",documentation:"Returns the current timestamp.",params:[]},{name:"strings.quote",detail:"strings.quote(s) \u2192 string",documentation:"Returns a quoted string with escape sequences.",params:["s"]},{name:"sum",detail:"sum(list) \u2192 number",documentation:"Sum of numeric list elements.",params:["list"]},{name:"min",detail:"min(list) \u2192 number",documentation:"Minimum value in a numeric list.",params:["list"]},{name:"max",detail:"max(list) \u2192 number",documentation:"Maximum value in a numeric list.",params:["list"]},{name:"avg",detail:"avg(list) \u2192 number",documentation:"Average of numeric list elements.",params:["list"]},{name:"includes",detail:"includes(list, element) \u2192 bool",documentation:"True if list contains element.",params:["list","element"]},{name:"findIndex",detail:"findIndex(list, element) \u2192 int",documentation:"Index of first occurrence, or -1.",params:["list","element"]},{name:"findLastIndex",detail:"findLastIndex(list, element) \u2192 int",documentation:"Index of last occurrence, or -1.",params:["list","element"]},{name:"lower",detail:"lower(s) \u2192 string",documentation:"Full Unicode lowercase.",params:["s"]},{name:"upper",detail:"upper(s) \u2192 string",documentation:"Full Unicode uppercase.",params:["s"]},{name:"base64decode",detail:"base64decode(s) \u2192 bytes",documentation:"Decode base64 string to bytes.",params:["s"]},{name:"base64encode",detail:"base64encode(data) \u2192 string",documentation:"Encode bytes to base64 string.",params:["data"]},{name:"encode",detail:"encode(value, encoding?) \u2192 bytes",documentation:"JSON-serialize any value to bytes. Default encoding: utf-8. If value is already bytes, passes through.",params:["value","encoding"]},{name:"decode",detail:"decode(data, encoding?) \u2192 dyn",documentation:"Parse JSON bytes to a value. Default encoding: utf-8.",params:["data","encoding"]},{name:"htmlEscape",detail:"htmlEscape(s) \u2192 string",documentation:"HTML-encode a string for safe insertion into HTML text content.",params:["s"]},{name:"attrEscape",detail:"attrEscape(s) \u2192 string",documentation:"HTML-encode a string for safe insertion into an HTML attribute value.",params:["s"]}],W=[{name:"contains",detail:".contains(substr) \u2192 bool",documentation:"True if string contains substr.",params:["substr"],receiverType:"string"},{name:"startsWith",detail:".startsWith(prefix) \u2192 bool",documentation:"True if string starts with prefix.",params:["prefix"],receiverType:"string"},{name:"endsWith",detail:".endsWith(suffix) \u2192 bool",documentation:"True if string ends with suffix.",params:["suffix"],receiverType:"string"},{name:"matches",detail:".matches(regex) \u2192 bool",documentation:"True if string matches RE2 regex pattern.",params:["regex"],receiverType:"string"},{name:"size",detail:".size() \u2192 int",documentation:"Returns number of Unicode codepoints in string.",params:[],receiverType:"string"},{name:"charAt",detail:".charAt(index) \u2192 string",documentation:"Returns character at index.",params:["index"],receiverType:"string"},{name:"indexOf",detail:".indexOf(substr, start?) \u2192 int",documentation:"Index of first occurrence of substr, or -1 if not found.",params:["substr","start"],receiverType:"string"},{name:"lastIndexOf",detail:".lastIndexOf(substr, start?) \u2192 int",documentation:"Index of last occurrence of substr, or -1 if not found.",params:["substr","start"],receiverType:"string"},{name:"lowerAscii",detail:".lowerAscii() \u2192 string",documentation:"Convert ASCII letters to lowercase (A-Z only).",params:[],receiverType:"string"},{name:"upperAscii",detail:".upperAscii() \u2192 string",documentation:"Convert ASCII letters to uppercase (a-z only).",params:[],receiverType:"string"},{name:"replace",detail:".replace(old, new, count?) \u2192 string",documentation:"Replace occurrences of old with new. If count specified, replaces at most count times.",params:["old","new","count"],receiverType:"string"},{name:"split",detail:".split(sep, count?) \u2192 list",documentation:"Split string by separator. If count specified, splits into at most count parts.",params:["sep","count"],receiverType:"string"},{name:"substring",detail:".substring(start, end?) \u2192 string",documentation:"Extract substring from start index to end index (exclusive).",params:["start","end"],receiverType:"string"},{name:"trim",detail:".trim() \u2192 string",documentation:"Remove leading and trailing Unicode whitespace.",params:[],receiverType:"string"},{name:"format",detail:".format(args) \u2192 string",documentation:"Format string with arguments. Placeholders: %s (string), %d (decimal), %f (float), %e (exponent), %x (hex), %o (octal), %b (binary).",params:["args"],receiverType:"string"},{name:"lower",detail:".lower() \u2192 string",documentation:"Lowercase string (full Unicode).",params:[],receiverType:"string"},{name:"upper",detail:".upper() \u2192 string",documentation:"Uppercase string (full Unicode).",params:[],receiverType:"string"},{name:"join",detail:".join(sep?) \u2192 string",documentation:"Join list elements into string with optional separator.",params:["sep"],receiverType:"list"},{name:"size",detail:".size() \u2192 int",documentation:"Number of elements in list.",params:[],receiverType:"list"},{name:"map",detail:".map(x, expr) \u2192 list",documentation:"Transform each element using expression.",params:["x","expr"],receiverType:"list"},{name:"filter",detail:".filter(x, predicate) \u2192 list",documentation:"Filter elements by predicate.",params:["x","predicate"],receiverType:"list"},{name:"all",detail:".all(x, predicate) \u2192 bool",documentation:"True if all elements match predicate.",params:["x","predicate"],receiverType:"list"},{name:"exists",detail:".exists(x, predicate) \u2192 bool",documentation:"True if any element matches predicate.",params:["x","predicate"],receiverType:"list"},{name:"exists_one",detail:".exists_one(x, predicate) \u2192 bool",documentation:"True if exactly one element matches predicate.",params:["x","predicate"],receiverType:"list"},{name:"sum",detail:".sum() \u2192 number",documentation:"Sum of numeric list elements.",params:[],receiverType:"list"},{name:"min",detail:".min() \u2192 number",documentation:"Minimum value in list.",params:[],receiverType:"list"},{name:"max",detail:".max() \u2192 number",documentation:"Maximum value in list.",params:[],receiverType:"list"},{name:"avg",detail:".avg() \u2192 number",documentation:"Average of list elements.",params:[],receiverType:"list"},{name:"includes",detail:".includes(element) \u2192 bool",documentation:"True if list contains element.",params:["element"],receiverType:"list"},{name:"findIndex",detail:".findIndex(element) \u2192 int",documentation:"First index of element, or -1.",params:["element"],receiverType:"list"},{name:"findLastIndex",detail:".findLastIndex(element) \u2192 int",documentation:"Last index of element, or -1.",params:["element"],receiverType:"list"},{name:"getFullYear",detail:".getFullYear(tz?) \u2192 int",documentation:"4-digit year. Optional timezone (IANA or fixed offset).",params:["tz"],receiverType:"timestamp"},{name:"getMonth",detail:".getMonth(tz?) \u2192 int",documentation:"Month (0-11). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getDate",detail:".getDate(tz?) \u2192 int",documentation:"Day of month (1-31). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getDayOfMonth",detail:".getDayOfMonth(tz?) \u2192 int",documentation:"Day of month (0-30). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getDayOfWeek",detail:".getDayOfWeek(tz?) \u2192 int",documentation:"Day of week (0=Sunday). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getDayOfYear",detail:".getDayOfYear(tz?) \u2192 int",documentation:"Day of year (0-365). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getHours",detail:".getHours(tz?) \u2192 int",documentation:"Hours (0-23). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getMinutes",detail:".getMinutes(tz?) \u2192 int",documentation:"Minutes (0-59). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getSeconds",detail:".getSeconds(tz?) \u2192 int",documentation:"Seconds (0-59). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getMilliseconds",detail:".getMilliseconds(tz?) \u2192 int",documentation:"Milliseconds (0-999). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"formatDate",detail:".formatDate(pattern) \u2192 string",documentation:"Format timestamp. Patterns: YYYY, YY, MM, DD, HH, mm, ss.",params:["pattern"],receiverType:"timestamp"},{name:"getSeconds",detail:".getSeconds() \u2192 int",documentation:"Total seconds in duration.",params:[],receiverType:"duration"},{name:"getMinutes",detail:".getMinutes() \u2192 int",documentation:"Total minutes in duration (seconds / 60).",params:[],receiverType:"duration"},{name:"getHours",detail:".getHours() \u2192 int",documentation:"Total hours in duration (seconds / 3600).",params:[],receiverType:"duration"},{name:"getMilliseconds",detail:".getMilliseconds() \u2192 int",documentation:"Milliseconds portion of duration.",params:[],receiverType:"duration"},{name:"size",detail:".size() \u2192 int",documentation:"Number of entries in map or bytes in buffer.",params:[],receiverType:"map"}],B=(()=>{let e=new Map;for(let n of E){let t=n.name.includes(".")?n.name.split(".")[1]:n.name;e.set(t,[n])}for(let n of W){let t=e.get(n.name);t?t.some(r=>r.detail===n.detail)||t.push(n):e.set(n.name,[n])}return e})(),C=[];function Fe(e){C=e}function D(e,n){return e.ref&&n?.[e.ref]?D(n[e.ref],n):e}function Y(e){return e?.definitions}function R(e,n,t){if(!e||n.length===0)return e;let r=D(e,t),[i,...o]=n,s={...r.properties,...r.optionalProperties};if(i&&s[i])return R(s[i],o,t);if(r.discriminator&&r.mapping&&i){if(i===r.discriminator)return o.length===0?{enum:Object.keys(r.mapping)}:void 0;for(let a of Object.values(r.mapping)){let l={...a.properties,...a.optionalProperties};if(l[i])return R(l[i],o,t)}}}function Z(e,n){let t=D(e,n);return t.type?t.type:t.enum?`enum(${t.enum.slice(0,3).join(", ")}${t.enum.length>3?"...":""})`:t.properties||t.optionalProperties?"object":t.elements?"list":t.values?"map":t.discriminator?`union(${t.discriminator})`:"any"}function Ne(e,n){if(!e)return[];let t=D(e,n),r=[],i={...t.properties,...t.optionalProperties};for(let[o,s]of Object.entries(i))r.push({name:o,type:Z(s,n)});if(t.discriminator&&t.mapping){let o=Object.keys(t.mapping);r.push({name:t.discriminator,type:o.join(" | ")});let s=new Set([t.discriminator]);for(let a of Object.values(t.mapping)){let l={...a.properties,...a.optionalProperties};for(let[p,d]of Object.entries(l))s.has(p)||(s.add(p),r.push({name:p,type:Z(d,n)}))}}return r}function q(e,n){if(!e)return!1;let t=D(e,n);return!!(t.properties||t.optionalProperties||t.discriminator&&t.mapping)}function Ce(){let e=new Set,n=[];for(let t of W){let r=`${t.name}|${t.detail}`;e.has(r)||(e.add(r),n.push(t))}return n}function _e(e){e.languages.getLanguages().some(n=>n.id===J)||(e.languages.register({id:J}),e.languages.setLanguageConfiguration(J,{brackets:[["(",")"],["[","]"],["{","}"]],autoClosingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"{",close:"}"}],surroundingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"{",close:"}"},{open:'"',close:'"'},{open:"'",close:"'"}]}),e.languages.setMonarchTokensProvider(J,{keywords:["true","false","null","in"],builtins:E.map(n=>n.name.split(".")[0]),operators:["&&","||","!","==","!=","<=",">=","<",">","+","-","*","/","%","?",":"],tokenizer:{root:[[/"(?:[^"\\]|\\.)*"/,"string"],[/'(?:[^'\\]|\\.)*'/,"string"],[/\d+\.\d*([eE][-+]?\d+)?/,"number.float"],[/\d*\.\d+([eE][-+]?\d+)?/,"number.float"],[/\d+[eE][-+]?\d+/,"number.float"],[/0[xX][0-9a-fA-F]+[uU]?/,"number.hex"],[/\d+[uU]?/,"number"],[/\./,"delimiter","@afterDot"],[/[a-zA-Z_]\w*/,{cases:{"@keywords":"keyword","@builtins":"predefined","@default":"identifier"}}],[/&&|\|\||[!=]=|[<>]=?/,"operator"],[/[+\-*/%?:!]/,"operator"],[/[[\](){}]/,"@brackets"],[/,/,"delimiter"],[/\s+/,"white"]],afterDot:[[/[a-zA-Z_]\w*/,"variable.property","@pop"],[/\s+/,"white"],[/./,"@rematch","@pop"]]}}),e.languages.registerCompletionItemProvider(J,{triggerCharacters:["."],provideCompletionItems:(n,t)=>{let r=n.getValueInRange({startLineNumber:t.lineNumber,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),i=!1,o=!1;for(let u=0;u<r.length;u++){let c=r[u];if(c==="\\"){u++;continue}c==='"'&&!o&&(i=!i),c==="'"&&!i&&(o=!o)}if(i||o)return{suggestions:[]};let s=n.getWordUntilPosition(t),a={startLineNumber:t.lineNumber,startColumn:s.startColumn,endLineNumber:t.lineNumber,endColumn:s.endColumn},l=r.slice(0,r.length-s.word.length).match(/inputs\.(\w+(?:\.\w+)*)\.\s*$/);if(l){let u=l[1].split("."),c=u[0],y=u.slice(1),x=C.find(T=>T.name===c);if(x?.schema){let T=Y(x.schema),z=R(x.schema,y,T);return{suggestions:Ne(z,T).map((I,te)=>{let ne=R(z,[I.name],T),re=q(ne,T);return{label:I.name,kind:re?e.languages.CompletionItemKind.Module:e.languages.CompletionItemKind.Property,detail:I.type,documentation:`Property of inputs.${u.join(".")}`,insertText:I.name,range:a,sortText:String(te).padStart(3,"0")}})}}return{suggestions:[]}}if(/inputs\.\s*$/.test(r.slice(0,r.length-s.word.length)))return{suggestions:C.map((u,c)=>{let y=q(u.schema,Y(u.schema));return{label:u.name,kind:y?e.languages.CompletionItemKind.Module:e.languages.CompletionItemKind.Variable,detail:u.label||(y?"object":"Input variable"),documentation:`Access as inputs.${u.name}${y?" (has nested properties)":""}`,insertText:u.name,range:a,sortText:String(c).padStart(3,"0")}})};if(/\.\s*$/.test(r.slice(0,r.length-s.word.length)))return{suggestions:Ce().map((c,y)=>({label:c.name,kind:e.languages.CompletionItemKind.Method,detail:`${c.detail} (${c.receiverType})`,documentation:c.documentation,insertText:c.params.length>0?`${c.name}($0)`:`${c.name}()`,insertTextRules:c.params.length>0?e.languages.CompletionItemInsertTextRule.InsertAsSnippet:void 0,range:a,sortText:String(y).padStart(3,"0")}))};let p=[],d=0;p.push({label:"inputs",kind:e.languages.CompletionItemKind.Variable,detail:"object",documentation:"Access input signals (e.g., inputs.customerName)",insertText:"inputs.",range:a,sortText:String(d++).padStart(3,"0")});for(let u of C)p.push({label:`inputs.${u.name}`,kind:e.languages.CompletionItemKind.Variable,detail:u.label||"Input variable",documentation:`Access the "${u.name}" input signal`,insertText:`inputs.${u.name}`,range:a,sortText:String(d++).padStart(3,"0")});for(let u of E)p.push({label:u.name,kind:e.languages.CompletionItemKind.Function,detail:u.detail,documentation:u.documentation,insertText:u.params.length>0?`${u.name}($0)`:`${u.name}()`,insertTextRules:u.params.length>0?e.languages.CompletionItemInsertTextRule.InsertAsSnippet:void 0,range:a,sortText:String(d++).padStart(3,"0")});return{suggestions:p}}}),e.languages.registerHoverProvider(J,{provideHover:(n,t)=>{let r=n.getWordAtPosition(t);if(!r)return null;let i=C.find(s=>s.name===r.word);if(i)return{range:{startLineNumber:t.lineNumber,startColumn:r.startColumn,endLineNumber:t.lineNumber,endColumn:r.endColumn},contents:[{value:`**inputs.${i.name}**${i.label?`
1
+ import{celFunc as g,celMethod as T,run as ue,CelScalar as f,isCelError as ce,isCelList as pe,isCelMap as me,isCelUint as O,listType as de,objectType as _}from"@bufbuild/cel";import{strings as fe}from"@bufbuild/cel/ext";import{timestampFromDate as Ve,timestampNow as ge,TimestampSchema as G}from"@bufbuild/protobuf/wkt";import{isSchema as $e,isValidSchema as Oe,validate as Ee}from"jtd";var le=10;function b(e,n,t=0){if(t>le)return null;if(e.ref){let r=n?.[e.ref];return r?b(r,n,t+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[b(e.elements,n,t+1),b(e.elements,n,t+1)];if(e.values)return{key1:b(e.values,n,t+1)};if(e.properties||e.optionalProperties){let r={};if(e.properties)for(let[i,o]of Object.entries(e.properties))r[i]=b(o,n,t+1);if(e.optionalProperties)for(let[i,o]of Object.entries(e.optionalProperties))r[i]=b(o,n,t+1);return r}if(e.discriminator&&e.mapping){let r=Object.keys(e.mapping)[0];if(r){let i=e.mapping[r],o=b(i,n,t+1);return o[e.discriminator]=r,o}return null}return null}function w(e){return typeof e=="number"?e:typeof e=="bigint"?Number(e):O(e)?Number(e.value):null}function N(e,n){if(e===n)return!0;let t=O(e)?e.value:e,r=O(n)?n.value:n;return t===r}function ye(e){return e instanceof Uint8Array||ArrayBuffer.isView(e)&&!(e instanceof DataView)}function U(e){return e instanceof Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e}function he(e){return new Uint8Array(e)}var z=typeof Buffer<"u",be=z?e=>Buffer.from(e,"base64"):typeof Uint8Array.fromBase64=="function"?e=>Uint8Array.fromBase64(e):e=>Uint8Array.from(atob(e),n=>n.charCodeAt(0)),ve=z?e=>Buffer.from(e.buffer,e.byteOffset,e.byteLength).toString("base64"):typeof Uint8Array.prototype.toBase64=="function"?e=>e.toBase64():e=>btoa(Array.from(e,n=>String.fromCharCode(n)).join(""));function H(e,n="utf-8"){if(ye(e))return U(e);let t=JSON.stringify(R(e));return n==="utf-8"||n==="utf8"?he(new TextEncoder().encode(t)):z?new Uint8Array(Buffer.from(t,n)):Uint8Array.from(t,r=>r.charCodeAt(0))}function B(e,n="utf-8"){let t=U(e);return JSON.parse(new TextDecoder(n).decode(t))}function Y(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}var h=de(f.DYN),{DYN:m,BOOL:Z,INT:A}=f;function Te(e,n){let t=e.getFullYear(),r=e.getMonth()+1,i=e.getDate(),o=e.getHours(),s=e.getMinutes(),a=e.getSeconds();return n.replace(/YYYY/g,String(t)).replace(/YY/g,String(t).slice(-2)).replace(/MM/g,String(r).padStart(2,"0")).replace(/DD/g,String(i).padStart(2,"0")).replace(/HH/g,String(o).padStart(2,"0")).replace(/mm/g,String(s).padStart(2,"0")).replace(/ss/g,String(a).padStart(2,"0"))}var xe=[g("sum",[h],m,e=>{let n=0;for(let t of e){let r=w(t);r!==null&&(n+=r)}return n}),T("sum",h,[],m,function(){let e=0;for(let n of this){let t=w(n);t!==null&&(e+=t)}return e}),g("min",[h],m,e=>{let n=null;for(let t of e){let r=w(t);r!==null&&(n===null||r<n)&&(n=r)}return n??0}),T("min",h,[],m,function(){let e=null;for(let n of this){let t=w(n);t!==null&&(e===null||t<e)&&(e=t)}return e??0}),g("max",[h],m,e=>{let n=null;for(let t of e){let r=w(t);r!==null&&(n===null||r>n)&&(n=r)}return n??0}),T("max",h,[],m,function(){let e=null;for(let n of this){let t=w(n);t!==null&&(e===null||t>e)&&(e=t)}return e??0}),g("avg",[h],m,e=>{let n=0,t=0;for(let r of e){let i=w(r);i!==null&&(n+=i,t++)}return t>0?n/t:0}),T("avg",h,[],m,function(){let e=0,n=0;for(let t of this){let r=w(t);r!==null&&(e+=r,n++)}return n>0?e/n:0}),g("includes",[h,m],Z,(e,n)=>{for(let t of e)if(N(t,n))return!0;return!1}),T("includes",h,[m],Z,function(e){for(let n of this)if(N(n,e))return!0;return!1}),g("findIndex",[h,m],A,(e,n)=>{let t=0n;for(let r of e){if(N(r,n))return t;t++}return-1n}),T("findIndex",h,[m],A,function(e){let n=0n;for(let t of this){if(N(t,e))return n;n++}return-1n}),g("findLastIndex",[h,m],A,(e,n)=>{let t=[...e];for(let r=t.length-1;r>=0;r--)if(N(t[r],n))return BigInt(r);return-1n}),T("findLastIndex",h,[m],A,function(e){let n=[...this];for(let t=n.length-1;t>=0;t--)if(N(n[t],e))return BigInt(t);return-1n}),g("now",[],_(G),()=>ge()),g("lower",[f.STRING],f.STRING,e=>e.toLowerCase()),g("upper",[f.STRING],f.STRING,e=>e.toUpperCase()),T("lower",f.STRING,[],f.STRING,function(){return this.toLowerCase()}),T("upper",f.STRING,[],f.STRING,function(){return this.toUpperCase()}),g("base64decode",[f.STRING],m,e=>be(e)),g("base64encode",[m],f.STRING,e=>ve(U(e))),g("encode",[m],m,e=>H(e)),g("encode",[m,f.STRING],m,(e,n)=>H(e,n)),g("decode",[m],m,e=>B(e)),g("decode",[m,f.STRING],m,(e,n)=>B(e,n)),g("htmlEscape",[f.STRING],f.STRING,e=>Y(e)),g("attrEscape",[f.STRING],f.STRING,e=>Y(e)),T("formatDate",_(G),[f.STRING],f.STRING,function(e){let n=this.message,t=Number(n.seconds)*1e3+Math.floor(n.nanos/1e6),r=new Date(t);return Te(r,e)})],Se={funcs:[...fe,...xe]};function R(e){if(pe(e))return[...e].map(n=>R(n));if(me(e)){let n={};for(let[t,r]of e)n[String(t)]=R(r);return n}return typeof e=="bigint"?Number(e):e}var q=1e4;function Je(e,n){let t=n.filter(l=>l.length>0&&/^\w+$/.test(l));if(t.length===0)return[];let r=[],o=t.map(l=>l.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|"),s=new RegExp(`\\b(${o})(?:(?:\\.([a-zA-Z_]\\w*)|\\["([^"]+)"\\]|\\['([^']+)'\\])|(?=$|[^a-zA-Z_0-9.\\[]))`,"g"),a;for(;(a=s.exec(e))!==null;){let l=a[1],p=a[2]||a[3]||a[4];if(!p){r.push({variableName:l,path:[],fullPath:l});continue}let d=[p],u=a.index+a[0].length;for(;u<e.length;){let y=e.slice(u).match(/^\.([a-zA-Z_]\w*)/);if(y){let x=u+y[0].length;if(e[x]==="(")break;d.push(y[1]),u=x;continue}let J=e.slice(u).match(/^\["([^"]+)"\]|^\['([^']+)'\]/);if(J){d.push(J[1]||J[2]),u+=J[0].length;continue}break}let c=l+"."+d.join(".");r.push({variableName:l,path:d,fullPath:c})}return we(r)}function we(e){let n=new Map;for(let r of e){let i=n.get(r.variableName)||[];i.push(r),n.set(r.variableName,i)}let t=[];for(let[,r]of n){r.sort((o,s)=>s.path.length-o.path.length);let i=[];for(let o of r)i.some(a=>Ce(o,a))||i.push(o);t.push(...i)}return t}function Ce(e,n){if(e.variableName!==n.variableName||e.path.length>n.path.length)return!1;for(let t=0;t<e.path.length;t++)if(e.path[t]!==n.path[t])return!1;return!0}function Ne(e,n,t){let r=[];if(t&&r.push({segmentIndex:-1,propertyName:"",isSignalOptional:!0}),!n||e.length===0)return r;let i=n;for(let o=0;o<e.length;o++){let s=e[o];if(!i)break;let a=i.optionalProperties,l=i.properties;if(a&&s in a)r.push({segmentIndex:o,propertyName:s,isSignalOptional:!1}),i=a[s];else if(l&&s in l)i=l[s];else break}return r}function Pe(e,n){let t=[],r={};for(let i of e)r[i.name]=b(i.schema,i.schema.definitions);t.push({bindings:r,description:"All properties present"});for(let i of n){let o=e.find(a=>a.name===i.variableName);if(!o)continue;let s=Ne(i.path,o.schema,o.optional??!1);for(let a of s){let l=structuredClone(r);if(a.isSignalOptional&&a.segmentIndex===-1)delete l[i.variableName],t.push({bindings:l,description:`Variable '${i.variableName}' not bound`,unsetPath:i.variableName});else{let p=i.path.slice(0,a.segmentIndex+1);De(l[i.variableName],p);let d=`${i.variableName}.${p.join(".")}`;t.push({bindings:l,description:`Optional property '${a.propertyName}' unset`,unsetPath:d})}}}return t}function De(e,n){if(n.length===0||e===null||typeof e!="object")return;let t=e;for(let r=0;r<n.length-1;r++){if(t===null||typeof t!="object")return;t=t[n[r]]}t!==null&&typeof t=="object"&&delete t[n[n.length-1]]}function E(e,n){if(e.length>q)return{error:`Expression exceeds maximum length of ${q} characters`};try{let t={};for(let[i,o]of Object.entries(n))t[i]=o;let r=ue(e,t,Se);return ce(r)?{error:r.message}:{result:R(r)}}catch(t){return{error:t instanceof Error?t.message:String(t)}}}function Fe(e,n){let t=[];if(!e.trim())return{valid:!0};let r={};for(let l of n)r[l.name]=b(l.schema,l.schema.definitions);let i=E(e,r);if(i.error)return{valid:!1,errors:[{message:`Syntax error: ${i.error}`}]};let o=n.map(l=>l.name),s=Je(e,o);if(s.length===0)return{valid:!0};let a=Pe(n,s);for(let l=1;l<a.length;l++){let p=a[l],d=E(e,p.bindings);d.error&&t.push({message:`Expression fails when ${p.description}: ${d.error}`,path:p.unsetPath,isOptionalAccess:!0})}return t.length>0?{valid:!1,errors:t}:{valid:!0}}function _e(e,n){if(!e.trim())return{valid:!0};let t={};for(let i of n)t[i.name]=b(i.schema,i.schema.definitions);let r=E(e,t);return r.error?{valid:!1,errors:[{message:r.error}]}:{valid:!0}}var C="cel",M=[{name:"string",detail:"string(x) \u2192 string",documentation:"Convert value to string. Works on bool, int, uint, double, bytes, timestamp, duration.",params:["x"]},{name:"int",detail:"int(x) \u2192 int",documentation:"Convert value to integer. Works on uint, double, string, timestamp, duration.",params:["x"]},{name:"uint",detail:"uint(x) \u2192 uint",documentation:"Convert value to unsigned integer. Works on int, double, string.",params:["x"]},{name:"double",detail:"double(x) \u2192 double",documentation:"Convert value to double. Works on int, uint, string.",params:["x"]},{name:"bool",detail:"bool(x) \u2192 bool",documentation:'Convert value to boolean. String values: "true", "false", "t", "f", "1", "0".',params:["x"]},{name:"bytes",detail:"bytes(x) \u2192 bytes",documentation:"Convert value to bytes. String is UTF-8 encoded.",params:["x"]},{name:"timestamp",detail:"timestamp(x) \u2192 timestamp",documentation:"Convert value to timestamp. String must be RFC3339 format.",params:["x"]},{name:"duration",detail:"duration(x) \u2192 duration",documentation:'Convert value to duration. String format: "300s", "1.5h", "2m30s".',params:["x"]},{name:"type",detail:"type(x) \u2192 type",documentation:"Returns the type of the value.",params:["x"]},{name:"dyn",detail:"dyn(x) \u2192 dyn",documentation:"Identity function, returns the value unchanged.",params:["x"]},{name:"size",detail:"size(x) \u2192 int",documentation:"Returns size of string (codepoints), list, bytes, or map.",params:["x"]},{name:"has",detail:"has(x.field) \u2192 bool",documentation:"Check if field exists and is not null. Use to guard optional values.",params:["x.field"]},{name:"now",detail:"now() \u2192 timestamp",documentation:"Returns the current timestamp.",params:[]},{name:"strings.quote",detail:"strings.quote(s) \u2192 string",documentation:"Returns a quoted string with escape sequences.",params:["s"]},{name:"sum",detail:"sum(list) \u2192 number",documentation:"Sum of numeric list elements.",params:["list"]},{name:"min",detail:"min(list) \u2192 number",documentation:"Minimum value in a numeric list.",params:["list"]},{name:"max",detail:"max(list) \u2192 number",documentation:"Maximum value in a numeric list.",params:["list"]},{name:"avg",detail:"avg(list) \u2192 number",documentation:"Average of numeric list elements.",params:["list"]},{name:"includes",detail:"includes(list, element) \u2192 bool",documentation:"True if list contains element.",params:["list","element"]},{name:"findIndex",detail:"findIndex(list, element) \u2192 int",documentation:"Index of first occurrence, or -1.",params:["list","element"]},{name:"findLastIndex",detail:"findLastIndex(list, element) \u2192 int",documentation:"Index of last occurrence, or -1.",params:["list","element"]},{name:"lower",detail:"lower(s) \u2192 string",documentation:"Full Unicode lowercase.",params:["s"]},{name:"upper",detail:"upper(s) \u2192 string",documentation:"Full Unicode uppercase.",params:["s"]},{name:"base64decode",detail:"base64decode(s) \u2192 bytes",documentation:"Decode base64 string to bytes.",params:["s"]},{name:"base64encode",detail:"base64encode(data) \u2192 string",documentation:"Encode bytes to base64 string.",params:["data"]},{name:"encode",detail:"encode(value, encoding?) \u2192 bytes",documentation:"JSON-serialize any value to bytes. Default encoding: utf-8. If value is already bytes, passes through.",params:["value","encoding"]},{name:"decode",detail:"decode(data, encoding?) \u2192 dyn",documentation:"Parse JSON bytes to a value. Default encoding: utf-8.",params:["data","encoding"]},{name:"htmlEscape",detail:"htmlEscape(s) \u2192 string",documentation:"HTML-encode a string for safe insertion into HTML text content.",params:["s"]},{name:"attrEscape",detail:"attrEscape(s) \u2192 string",documentation:"HTML-encode a string for safe insertion into an HTML attribute value.",params:["s"]}],te=[{name:"contains",detail:".contains(substr) \u2192 bool",documentation:"True if string contains substr.",params:["substr"],receiverType:"string"},{name:"startsWith",detail:".startsWith(prefix) \u2192 bool",documentation:"True if string starts with prefix.",params:["prefix"],receiverType:"string"},{name:"endsWith",detail:".endsWith(suffix) \u2192 bool",documentation:"True if string ends with suffix.",params:["suffix"],receiverType:"string"},{name:"matches",detail:".matches(regex) \u2192 bool",documentation:"True if string matches RE2 regex pattern.",params:["regex"],receiverType:"string"},{name:"size",detail:".size() \u2192 int",documentation:"Returns number of Unicode codepoints in string.",params:[],receiverType:"string"},{name:"charAt",detail:".charAt(index) \u2192 string",documentation:"Returns character at index.",params:["index"],receiverType:"string"},{name:"indexOf",detail:".indexOf(substr, start?) \u2192 int",documentation:"Index of first occurrence of substr, or -1 if not found.",params:["substr","start"],receiverType:"string"},{name:"lastIndexOf",detail:".lastIndexOf(substr, start?) \u2192 int",documentation:"Index of last occurrence of substr, or -1 if not found.",params:["substr","start"],receiverType:"string"},{name:"lowerAscii",detail:".lowerAscii() \u2192 string",documentation:"Convert ASCII letters to lowercase (A-Z only).",params:[],receiverType:"string"},{name:"upperAscii",detail:".upperAscii() \u2192 string",documentation:"Convert ASCII letters to uppercase (a-z only).",params:[],receiverType:"string"},{name:"replace",detail:".replace(old, new, count?) \u2192 string",documentation:"Replace occurrences of old with new. If count specified, replaces at most count times.",params:["old","new","count"],receiverType:"string"},{name:"split",detail:".split(sep, count?) \u2192 list",documentation:"Split string by separator. If count specified, splits into at most count parts.",params:["sep","count"],receiverType:"string"},{name:"substring",detail:".substring(start, end?) \u2192 string",documentation:"Extract substring from start index to end index (exclusive).",params:["start","end"],receiverType:"string"},{name:"trim",detail:".trim() \u2192 string",documentation:"Remove leading and trailing Unicode whitespace.",params:[],receiverType:"string"},{name:"format",detail:".format(args) \u2192 string",documentation:"Format string with arguments. Placeholders: %s (string), %d (decimal), %f (float), %e (exponent), %x (hex), %o (octal), %b (binary).",params:["args"],receiverType:"string"},{name:"lower",detail:".lower() \u2192 string",documentation:"Lowercase string (full Unicode).",params:[],receiverType:"string"},{name:"upper",detail:".upper() \u2192 string",documentation:"Uppercase string (full Unicode).",params:[],receiverType:"string"},{name:"join",detail:".join(sep?) \u2192 string",documentation:"Join list elements into string with optional separator.",params:["sep"],receiverType:"list"},{name:"size",detail:".size() \u2192 int",documentation:"Number of elements in list.",params:[],receiverType:"list"},{name:"map",detail:".map(x, expr) \u2192 list",documentation:"Transform each element using expression.",params:["x","expr"],receiverType:"list"},{name:"filter",detail:".filter(x, predicate) \u2192 list",documentation:"Filter elements by predicate.",params:["x","predicate"],receiverType:"list"},{name:"all",detail:".all(x, predicate) \u2192 bool",documentation:"True if all elements match predicate.",params:["x","predicate"],receiverType:"list"},{name:"exists",detail:".exists(x, predicate) \u2192 bool",documentation:"True if any element matches predicate.",params:["x","predicate"],receiverType:"list"},{name:"exists_one",detail:".exists_one(x, predicate) \u2192 bool",documentation:"True if exactly one element matches predicate.",params:["x","predicate"],receiverType:"list"},{name:"sum",detail:".sum() \u2192 number",documentation:"Sum of numeric list elements.",params:[],receiverType:"list"},{name:"min",detail:".min() \u2192 number",documentation:"Minimum value in list.",params:[],receiverType:"list"},{name:"max",detail:".max() \u2192 number",documentation:"Maximum value in list.",params:[],receiverType:"list"},{name:"avg",detail:".avg() \u2192 number",documentation:"Average of list elements.",params:[],receiverType:"list"},{name:"includes",detail:".includes(element) \u2192 bool",documentation:"True if list contains element.",params:["element"],receiverType:"list"},{name:"findIndex",detail:".findIndex(element) \u2192 int",documentation:"First index of element, or -1.",params:["element"],receiverType:"list"},{name:"findLastIndex",detail:".findLastIndex(element) \u2192 int",documentation:"Last index of element, or -1.",params:["element"],receiverType:"list"},{name:"getFullYear",detail:".getFullYear(tz?) \u2192 int",documentation:"4-digit year. Optional timezone (IANA or fixed offset).",params:["tz"],receiverType:"timestamp"},{name:"getMonth",detail:".getMonth(tz?) \u2192 int",documentation:"Month (0-11). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getDate",detail:".getDate(tz?) \u2192 int",documentation:"Day of month (1-31). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getDayOfMonth",detail:".getDayOfMonth(tz?) \u2192 int",documentation:"Day of month (0-30). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getDayOfWeek",detail:".getDayOfWeek(tz?) \u2192 int",documentation:"Day of week (0=Sunday). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getDayOfYear",detail:".getDayOfYear(tz?) \u2192 int",documentation:"Day of year (0-365). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getHours",detail:".getHours(tz?) \u2192 int",documentation:"Hours (0-23). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getMinutes",detail:".getMinutes(tz?) \u2192 int",documentation:"Minutes (0-59). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getSeconds",detail:".getSeconds(tz?) \u2192 int",documentation:"Seconds (0-59). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"getMilliseconds",detail:".getMilliseconds(tz?) \u2192 int",documentation:"Milliseconds (0-999). Optional timezone.",params:["tz"],receiverType:"timestamp"},{name:"formatDate",detail:".formatDate(pattern) \u2192 string",documentation:"Format timestamp. Patterns: YYYY, YY, MM, DD, HH, mm, ss.",params:["pattern"],receiverType:"timestamp"},{name:"getSeconds",detail:".getSeconds() \u2192 int",documentation:"Total seconds in duration.",params:[],receiverType:"duration"},{name:"getMinutes",detail:".getMinutes() \u2192 int",documentation:"Total minutes in duration (seconds / 60).",params:[],receiverType:"duration"},{name:"getHours",detail:".getHours() \u2192 int",documentation:"Total hours in duration (seconds / 3600).",params:[],receiverType:"duration"},{name:"getMilliseconds",detail:".getMilliseconds() \u2192 int",documentation:"Milliseconds portion of duration.",params:[],receiverType:"duration"},{name:"size",detail:".size() \u2192 int",documentation:"Number of entries in map or bytes in buffer.",params:[],receiverType:"map"}],W=(()=>{let e=new Map;for(let n of M){let t=n.name.includes(".")?n.name.split(".")[1]:n.name;e.set(t,[n])}for(let n of te){let t=e.get(n.name);t?t.some(r=>r.detail===n.detail)||t.push(n):e.set(n.name,[n])}return e})(),D=[];function Ge(e){D=e}function k(e,n){return e.ref&&n?.[e.ref]?k(n[e.ref],n):e}function K(e){return e?.definitions}function $(e,n,t){if(!e||n.length===0)return e;let r=k(e,t),[i,...o]=n,s={...r.properties,...r.optionalProperties};if(i&&s[i])return $(s[i],o,t);if(r.discriminator&&r.mapping&&i){if(i===r.discriminator)return o.length===0?{enum:Object.keys(r.mapping)}:void 0;for(let a of Object.values(r.mapping)){let l={...a.properties,...a.optionalProperties};if(l[i])return $(l[i],o,t)}}}function X(e,n){let t=k(e,n);return t.type?t.type:t.enum?`enum(${t.enum.slice(0,3).join(", ")}${t.enum.length>3?"...":""})`:t.properties||t.optionalProperties?"object":t.elements?"list":t.values?"map":t.discriminator?`union(${t.discriminator})`:"any"}function Ie(e,n){if(!e)return[];let t=k(e,n),r=[],i={...t.properties,...t.optionalProperties};for(let[o,s]of Object.entries(i))r.push({name:o,type:X(s,n)});if(t.discriminator&&t.mapping){let o=Object.keys(t.mapping);r.push({name:t.discriminator,type:o.join(" | ")});let s=new Set([t.discriminator]);for(let a of Object.values(t.mapping)){let l={...a.properties,...a.optionalProperties};for(let[p,d]of Object.entries(l))s.has(p)||(s.add(p),r.push({name:p,type:X(d,n)}))}}return r}function Q(e,n){if(!e)return!1;let t=k(e,n);return!!(t.properties||t.optionalProperties||t.discriminator&&t.mapping)}function ee(){let e=new Set,n=[];for(let t of te){let r=`${t.name}|${t.detail}`;e.has(r)||(e.add(r),n.push(t))}return n}function He(e){e.languages.getLanguages().some(n=>n.id===C)||(e.languages.register({id:C}),e.languages.setLanguageConfiguration(C,{brackets:[["(",")"],["[","]"],["{","}"]],autoClosingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"{",close:"}"}],surroundingPairs:[{open:"(",close:")"},{open:"[",close:"]"},{open:"{",close:"}"},{open:'"',close:'"'},{open:"'",close:"'"}]}),e.languages.setMonarchTokensProvider(C,{keywords:["true","false","null","in"],builtins:M.map(n=>n.name.split(".")[0]),operators:["&&","||","!","==","!=","<=",">=","<",">","+","-","*","/","%","?",":"],tokenizer:{root:[[/"(?:[^"\\]|\\.)*"/,"string"],[/'(?:[^'\\]|\\.)*'/,"string"],[/\d+\.\d*([eE][-+]?\d+)?/,"number.float"],[/\d*\.\d+([eE][-+]?\d+)?/,"number.float"],[/\d+[eE][-+]?\d+/,"number.float"],[/0[xX][0-9a-fA-F]+[uU]?/,"number.hex"],[/\d+[uU]?/,"number"],[/\./,"delimiter","@afterDot"],[/[a-zA-Z_]\w*/,{cases:{"@keywords":"keyword","@builtins":"predefined","@default":"identifier"}}],[/&&|\|\||[!=]=|[<>]=?/,"operator"],[/[+\-*/%?:!]/,"operator"],[/[[\](){}]/,"@brackets"],[/,/,"delimiter"],[/\s+/,"white"]],afterDot:[[/[a-zA-Z_]\w*/,"variable.property","@pop"],[/\s+/,"white"],[/./,"@rematch","@pop"]]}}),e.languages.registerCompletionItemProvider(C,{triggerCharacters:["."],provideCompletionItems:(n,t)=>{let r=n.getValueInRange({startLineNumber:t.lineNumber,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),i=!1,o=!1;for(let u=0;u<r.length;u++){let c=r[u];if(c==="\\"){u++;continue}c==='"'&&!o&&(i=!i),c==="'"&&!i&&(o=!o)}if(i||o)return{suggestions:[]};let s=n.getWordUntilPosition(t),a={startLineNumber:t.lineNumber,startColumn:s.startColumn,endLineNumber:t.lineNumber,endColumn:s.endColumn},l=r.slice(0,r.length-s.word.length).match(/inputs\.(\w+(?:\.\w+)*)\.\s*$/);if(l){let u=l[1].split("."),c=u[0],y=u.slice(1),J=D.find(x=>x.name===c);if(J?.schema){let x=K(J.schema),j=$(J.schema,y,x),V=Ie(j,x),L=V.map((S,v)=>{let se=$(j,[S.name],x),ae=Q(se,x);return{label:S.name,kind:ae?e.languages.CompletionItemKind.Module:e.languages.CompletionItemKind.Property,detail:S.type,documentation:`Property of inputs.${u.join(".")}`,insertText:S.name,range:a,sortText:String(v).padStart(3,"0")}}),F=ee();for(let S=0;S<F.length;S++){let v=F[S];L.push({label:v.name,kind:e.languages.CompletionItemKind.Method,detail:`${v.detail} (${v.receiverType})`,documentation:v.documentation,insertText:v.params.length>0?`${v.name}($0)`:`${v.name}()`,insertTextRules:v.params.length>0?e.languages.CompletionItemInsertTextRule.InsertAsSnippet:void 0,range:a,sortText:String(V.length+S).padStart(3,"0")})}return{suggestions:L}}return{suggestions:[]}}if(/inputs\.\s*$/.test(r.slice(0,r.length-s.word.length)))return{suggestions:D.map((u,c)=>{let y=Q(u.schema,K(u.schema));return{label:u.name,kind:y?e.languages.CompletionItemKind.Module:e.languages.CompletionItemKind.Variable,detail:u.label||(y?"object":"Input variable"),documentation:`Access as inputs.${u.name}${y?" (has nested properties)":""}`,insertText:u.name,range:a,sortText:String(c).padStart(3,"0")}})};if(/\.\s*$/.test(r.slice(0,r.length-s.word.length)))return{suggestions:ee().map((c,y)=>({label:c.name,kind:e.languages.CompletionItemKind.Method,detail:`${c.detail} (${c.receiverType})`,documentation:c.documentation,insertText:c.params.length>0?`${c.name}($0)`:`${c.name}()`,insertTextRules:c.params.length>0?e.languages.CompletionItemInsertTextRule.InsertAsSnippet:void 0,range:a,sortText:String(y).padStart(3,"0")}))};let p=[],d=0;p.push({label:"inputs",kind:e.languages.CompletionItemKind.Variable,detail:"object",documentation:"Access input signals (e.g., inputs.customerName)",insertText:"inputs.",range:a,sortText:String(d++).padStart(3,"0")});for(let u of D)p.push({label:`inputs.${u.name}`,kind:e.languages.CompletionItemKind.Variable,detail:u.label||"Input variable",documentation:`Access the "${u.name}" input signal`,insertText:`inputs.${u.name}`,range:a,sortText:String(d++).padStart(3,"0")});for(let u of M)p.push({label:u.name,kind:e.languages.CompletionItemKind.Function,detail:u.detail,documentation:u.documentation,insertText:u.params.length>0?`${u.name}($0)`:`${u.name}()`,insertTextRules:u.params.length>0?e.languages.CompletionItemInsertTextRule.InsertAsSnippet:void 0,range:a,sortText:String(d++).padStart(3,"0")});return{suggestions:p}}}),e.languages.registerHoverProvider(C,{provideHover:(n,t)=>{let r=n.getWordAtPosition(t);if(!r)return null;let i=D.find(s=>s.name===r.word);if(i)return{range:{startLineNumber:t.lineNumber,startColumn:r.startColumn,endLineNumber:t.lineNumber,endColumn:r.endColumn},contents:[{value:`**inputs.${i.name}**${i.label?`
2
2
 
3
- ${i.label}`:""}`}]};let o=B.get(r.word);return o&&o.length>0?{range:{startLineNumber:t.lineNumber,startColumn:r.startColumn,endLineNumber:t.lineNumber,endColumn:r.endColumn},contents:o.map(s=>({value:`**${s.detail}**
3
+ ${i.label}`:""}`}]};let o=W.get(r.word);return o&&o.length>0?{range:{startLineNumber:t.lineNumber,startColumn:r.startColumn,endLineNumber:t.lineNumber,endColumn:r.endColumn},contents:o.map(s=>({value:`**${s.detail}**
4
4
 
5
- ${s.documentation}`}))}:null}}),e.languages.registerSignatureHelpProvider(J,{signatureHelpTriggerCharacters:["(",","],provideSignatureHelp:(n,t)=>{let r=n.getValueInRange({startLineNumber:t.lineNumber,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),i=0,o=0,s=-1;for(let c=r.length-1;c>=0;c--){let y=r[c];if(y===")")i++;else if(y==="("){if(i===0){s=c;break}i--}else y===","&&i===0&&o++}if(s<0)return null;let l=r.slice(0,s).match(/([a-zA-Z_]\w*)\s*$/);if(!l)return null;let p=l[1],d=B.get(p);if(!d||d.length===0)return null;let u=d.filter(c=>c.params.length>0).map(c=>({label:c.detail,documentation:c.documentation,parameters:c.params.map(y=>({label:y}))}));return u.length===0?null:{value:{signatures:u,activeSignature:0,activeParameter:Math.min(o,u[0].parameters.length-1)},dispose(){}}}}))}var P="[*]";function K(e,n){return e.ref&&n?.[e.ref]?K(n[e.ref],n):e}function N(e,n){let t=K(e,n),r={},i;if(t.type)i=t.type;else if(t.enum)i=t.enum.map(o=>JSON.stringify(o)).join(" | ");else if(t.elements){let o=N(t.elements,n);r[P]=o,i=`${o.detail}[]`}else if(t.values){let o=N(t.values,n);r[P]=o,i=`map<${o.detail}>`}else if(t.properties||t.optionalProperties){let o=[];if(t.properties)for(let[s,a]of Object.entries(t.properties)){let l=N(a,n);r[s]=l,o.push(`${s}: ${l.detail}`)}if(t.optionalProperties)for(let[s,a]of Object.entries(t.optionalProperties)){let l=N(a,n);r[s]=l,o.push(`${s}?: ${l.detail}`)}i=`{ ${o.join(", ")} }`}else if(t.discriminator&&t.mapping){let o=Object.keys(t.mapping);r[t.discriminator]={detail:o.map(s=>JSON.stringify(s)).join(" | "),children:{}};for(let s of Object.values(t.mapping)){let a=N(s,n);for(let[l,p]of Object.entries(a.children))l in r||(r[l]=p)}i=`union(${t.discriminator}: ${o.join(" | ")})`}else i="any";return e.nullable&&(i+="?"),e.ref&&(i=`ref(${e.ref})`),{detail:i,children:r}}function Ge(e){let n={};for(let t of e){if(!t.name)continue;let r=t.accepts?.[0],i;r?.jtdSchema?i=N(r.jtdSchema,r.jtdSchema.definitions):r?.mimeType?i={detail:r.mimeType,children:{}}:i={detail:"any",children:{}},t.optional&&(i={...i,detail:i.detail+" | null"}),n[t.name]=i}return n}function X(e){let n={};for(let[r,i]of Object.entries(e))typeof i=="string"?n[r]={detail:"string",children:{}}:typeof i=="object"&&i!==null&&(n[r]=X(i));return{detail:`{ ${Object.entries(n).map(([r,i])=>`${r}: ${i.detail}`).join(", ")} }`,children:n}}function Q(e,n){for(let[t,r]of Object.entries(n))typeof r=="object"&&r!==null&&typeof e[t]=="object"&&e[t]!==null?Q(e[t],r):e[t]=r}function He(e){let n={};for(let t of Object.values(e))Q(n,t);return X(n)}function Be(e){let n=e.match(/\b(inputs|t)((?:\.[a-zA-Z_]\w*|\[[^\]]*\])*)\.\s*$/);if(!n)return null;let t=n[1],r=n[2],i=[t],o=0;for(;o<r.length;)if(r[o]==="."){o++;let s=r.substring(o).match(/^[a-zA-Z_]\w*/);s&&(i.push(s[0]),o+=s[0].length)}else if(r[o]==="["){let s=r.indexOf("]",o);if(s===-1)break;i.push(P),o=s+1}else o++;return i}function Pe(e,n,t){if(n.length===0)return null;if(n[0]==="inputs"){if(n.length===1)return{detail:"Signal inputs",children:e};let r=e[n[1]];if(!r)return null;for(let i=2;i<n.length;i++)if(r=r.children[n[i]],!r)return null;return r}if(n[0]==="t"&&t){if(n.length===1)return t;let r=t.children[n[1]];if(!r)return null;for(let i=2;i<n.length;i++)if(r=r.children[n[i]],!r)return null;return r}return null}function ee(e){let n=[],t=e.match(/^[a-zA-Z_]\w*/);if(!t)return n;n.push(t[0]);let r=t[0].length;for(;r<e.length;)if(e[r]==="."){r++;let i=e.substring(r).match(/^[a-zA-Z_]\w*/);if(i)n.push(i[0]),r+=i[0].length;else break}else if(e[r]==="["){let i=e.indexOf("]",r);if(i===-1)break;n.push(P),r=i+1}else break;return n}function Ye(e){let n=[],t=/([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*|\[[^\]]*\])*)\.(?:map|filter|all|exists_one|exists)\s*\(\s*([a-zA-Z_]\w*)\s*,/g,r;for(;(r=t.exec(e))!==null;){let i=ee(r[1]);i.length>0&&n.push({varName:r[2],collectionSegments:i})}return n}function Ze(e){let n=e.match(/\b([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*|\[[^\]]*\])*)\.\s*$/);if(!n)return null;let t=ee(n[1]);return t.length>0?t:null}function De(e,n,t,r){if(n.length===0)return null;let i=n[0];if(i==="inputs"||i==="t")return Pe(e,n,r);for(let o=t.length-1;o>=0;o--){let s=t[o];if(s.varName===i){let a=De(e,s.collectionSegments,t,r);if(!a)return null;let l=a.children[P];if(!l)return null;let p=l;for(let d=1;d<n.length;d++)if(p=p.children[n[d]],!p)return null;return p}}return null}function qe(e,n,t){let r=[],i=n-2;for(;i>=0&&e[i]===".";){i--;let o=i+1;for(;i>=0&&/[a-zA-Z_0-9]/.test(e[i]);)i--;let s=i+1,a=e.substring(s,o);if(/^[a-zA-Z_]\w*$/.test(a)&&a.length>0)r.unshift(a);else break}return r.push(t),r}export{B as CEL_DESCRIPTORS,J as CEL_LANGUAGE_ID,W as CEL_METHODS,he as CUSTOM_FUNCS,f as CelScalar,E as GLOBAL_FUNCTIONS,V as TimestampSchema,g as celFunc,v as celMethod,be as celOptions,oe as celRun,A as celToNative,O as evaluateExpression,ve as extractAccessPaths,qe as extractHoverSegments,Ye as extractLambdaBindings,Se as findOptionalSegments,ye as formatDateWithPattern,b as fuzzJTD,Ge as generateCelSymbolTree,Je as generateTestPermutations,He as generateTranslationsSymbolTree,se as isCelError,ae as isCelList,le as isCelMap,$ as isCelUint,ue as listType,j as objectType,Be as parseDotPath,Ze as parseGeneralDotPath,_e as registerCelLanguage,Pe as resolveNode,De as resolveWithLambdas,Fe as setInputVariables,ce as stringsExt,ze as timestampFromDate,pe as timestampNow,Ve as validateCelExpression,Le as validateCelExpressionSyntax};
5
+ ${s.documentation}`}))}:null}}),e.languages.registerSignatureHelpProvider(C,{signatureHelpTriggerCharacters:["(",","],provideSignatureHelp:(n,t)=>{let r=n.getValueInRange({startLineNumber:t.lineNumber,startColumn:1,endLineNumber:t.lineNumber,endColumn:t.column}),i=0,o=0,s=-1;for(let c=r.length-1;c>=0;c--){let y=r[c];if(y===")")i++;else if(y==="("){if(i===0){s=c;break}i--}else y===","&&i===0&&o++}if(s<0)return null;let l=r.slice(0,s).match(/([a-zA-Z_]\w*)\s*$/);if(!l)return null;let p=l[1],d=W.get(p);if(!d||d.length===0)return null;let u=d.filter(c=>c.params.length>0).map(c=>({label:c.detail,documentation:c.documentation,parameters:c.params.map(y=>({label:y}))}));return u.length===0?null:{value:{signatures:u,activeSignature:0,activeParameter:Math.min(o,u[0].parameters.length-1)},dispose(){}}}}))}var I="[*]";function ne(e,n){return e.ref&&n?.[e.ref]?ne(n[e.ref],n):e}function P(e,n){let t=ne(e,n),r={},i;if(t.type)i=t.type;else if(t.enum)i=t.enum.map(o=>JSON.stringify(o)).join(" | ");else if(t.elements){let o=P(t.elements,n);r[I]=o,i=`${o.detail}[]`}else if(t.values){let o=P(t.values,n);r[I]=o,i=`map<${o.detail}>`}else if(t.properties||t.optionalProperties){let o=[];if(t.properties)for(let[s,a]of Object.entries(t.properties)){let l=P(a,n);r[s]=l,o.push(`${s}: ${l.detail}`)}if(t.optionalProperties)for(let[s,a]of Object.entries(t.optionalProperties)){let l=P(a,n);r[s]=l,o.push(`${s}?: ${l.detail}`)}i=`{ ${o.join(", ")} }`}else if(t.discriminator&&t.mapping){let o=Object.keys(t.mapping);r[t.discriminator]={detail:o.map(s=>JSON.stringify(s)).join(" | "),children:{}};for(let s of Object.values(t.mapping)){let a=P(s,n);for(let[l,p]of Object.entries(a.children))l in r||(r[l]=p)}i=`union(${t.discriminator}: ${o.join(" | ")})`}else i="any";return e.nullable&&(i+="?"),e.ref&&(i=`ref(${e.ref})`),{detail:i,children:r}}function Be(e){let n={};for(let t of e){if(!t.name)continue;let r=t.accepts?.[0],i;r?.jtdSchema?i=P(r.jtdSchema,r.jtdSchema.definitions):r?.mimeType?i={detail:r.mimeType,children:{}}:i={detail:"any",children:{}},t.optional&&(i={...i,detail:i.detail+" | null"}),n[t.name]=i}return n}function re(e){let n={};for(let[r,i]of Object.entries(e))typeof i=="string"?n[r]={detail:"string",children:{}}:typeof i=="object"&&i!==null&&(n[r]=re(i));return{detail:`{ ${Object.entries(n).map(([r,i])=>`${r}: ${i.detail}`).join(", ")} }`,children:n}}function ie(e,n){for(let[t,r]of Object.entries(n))typeof r=="object"&&r!==null&&typeof e[t]=="object"&&e[t]!==null?ie(e[t],r):e[t]=r}function Ye(e){let n={};for(let t of Object.values(e))ie(n,t);return re(n)}function Ze(e){let n=e.match(/\b(inputs|t)((?:\.[a-zA-Z_]\w*|\[[^\]]*\])*)\.\s*$/);if(!n)return null;let t=n[1],r=n[2],i=[t],o=0;for(;o<r.length;)if(r[o]==="."){o++;let s=r.substring(o).match(/^[a-zA-Z_]\w*/);s&&(i.push(s[0]),o+=s[0].length)}else if(r[o]==="["){let s=r.indexOf("]",o);if(s===-1)break;i.push(I),o=s+1}else o++;return i}function ke(e,n,t){if(n.length===0)return null;if(n[0]==="inputs"){if(n.length===1)return{detail:"Signal inputs",children:e};let r=e[n[1]];if(!r)return null;for(let i=2;i<n.length;i++)if(r=r.children[n[i]],!r)return null;return r}if(n[0]==="t"&&t){if(n.length===1)return t;let r=t.children[n[1]];if(!r)return null;for(let i=2;i<n.length;i++)if(r=r.children[n[i]],!r)return null;return r}return null}function oe(e){let n=[],t=e.match(/^[a-zA-Z_]\w*/);if(!t)return n;n.push(t[0]);let r=t[0].length;for(;r<e.length;)if(e[r]==="."){r++;let i=e.substring(r).match(/^[a-zA-Z_]\w*/);if(i)n.push(i[0]),r+=i[0].length;else break}else if(e[r]==="["){let i=e.indexOf("]",r);if(i===-1)break;n.push(I),r=i+1}else break;return n}function qe(e){let n=[],t=/([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*|\[[^\]]*\])*)\.(?:map|filter|all|exists_one|exists)\s*\(\s*([a-zA-Z_]\w*)\s*,/g,r;for(;(r=t.exec(e))!==null;){let i=oe(r[1]);i.length>0&&n.push({varName:r[2],collectionSegments:i})}return n}function We(e){let n=e.match(/\b([a-zA-Z_]\w*(?:\.[a-zA-Z_]\w*|\[[^\]]*\])*)\.\s*$/);if(!n)return null;let t=oe(n[1]);return t.length>0?t:null}function Ae(e,n,t,r){if(n.length===0)return null;let i=n[0];if(i==="inputs"||i==="t")return ke(e,n,r);for(let o=t.length-1;o>=0;o--){let s=t[o];if(s.varName===i){let a=Ae(e,s.collectionSegments,t,r);if(!a)return null;let l=a.children[I];if(!l)return null;let p=l;for(let d=1;d<n.length;d++)if(p=p.children[n[d]],!p)return null;return p}}return null}function Ke(e,n,t){let r=[],i=n-2;for(;i>=0&&e[i]===".";){i--;let o=i+1;for(;i>=0&&/[a-zA-Z_0-9]/.test(e[i]);)i--;let s=i+1,a=e.substring(s,o);if(/^[a-zA-Z_]\w*$/.test(a)&&a.length>0)r.unshift(a);else break}return r.push(t),r}export{W as CEL_DESCRIPTORS,C as CEL_LANGUAGE_ID,te as CEL_METHODS,xe as CUSTOM_FUNCS,f as CelScalar,M as GLOBAL_FUNCTIONS,G as TimestampSchema,g as celFunc,T as celMethod,Se as celOptions,ue as celRun,R as celToNative,E as evaluateExpression,Je as extractAccessPaths,Ke as extractHoverSegments,qe as extractLambdaBindings,Ne as findOptionalSegments,Te as formatDateWithPattern,b as fuzzJTD,Be as generateCelSymbolTree,Pe as generateTestPermutations,Ye as generateTranslationsSymbolTree,ce as isCelError,pe as isCelList,me as isCelMap,O as isCelUint,de as listType,_ as objectType,Ze as parseDotPath,We as parseGeneralDotPath,He as registerCelLanguage,ke as resolveNode,Ae as resolveWithLambdas,Ge as setInputVariables,fe as stringsExt,Ve as timestampFromDate,ge as timestampNow,Fe as validateCelExpression,_e as validateCelExpressionSyntax};
6
6
  //# sourceMappingURL=cel.mjs.map