@adhd/apigen-engine-runtime 0.2.2 โ†’ 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ ## 0.2.3 (2026-08-07)
2
+
3
+
4
+ ### ๐Ÿš€ Features
5
+
6
+ - **apigen:** schema-driven worked examples for MCP tool descriptions + validation errors
7
+
8
+
9
+ ### ๐Ÿฉน Fixes
10
+
11
+ - **apigen-engine-runtime:** stop parity-harness from mutating the real repo (BUG-APIGEN-052)
12
+
13
+ - **apigen-engine-runtime:** isolated-git.spec.ts's own fixture helper can corrupt the enclosing repo under real hook env (BUG-APIGEN-052 follow-up)
14
+
15
+ - **apigen-cli:** restore 2768 files mass-deleted by 0117eb22 (BUG-APIGEN-052)
16
+
17
+ - **apigen-engine-runtime:** delegate vgit() to runGit() in isolated-git.spec.ts (BUG-APIGEN-054)
18
+
19
+
20
+ ### โค๏ธ Thank You
21
+
22
+ - parity-harness-self-test
23
+ - pseudosky
24
+
1
25
  ## 0.2.2 (2026-07-30)
2
26
 
3
27
 
package/README.md CHANGED
@@ -29,6 +29,20 @@ import type { Logger, LogFormat, CreateLoggerOptions, ParamInfo, AnyFn, BatchOpt
29
29
  See `@adhd/apigen-plugin-batch` for mount wiring.
30
30
  - **`defineMiddleware` / `createApiPackage` / `EventBus` / `wireObservers` / `buildContext`**
31
31
  โ€” middleware + observer wiring.
32
+ - **`buildToolDescription(schema, ...)`** โ€” builds the human-facing description shown for a
33
+ mounted tool/operation, appending a schema-synthesized worked example (via
34
+ `@adhd/apigen-base-logical`'s `renderExampleNote`) after the envelope-convention note. The
35
+ same function backs both `apigen-plugin-cli-output`'s static codegen and
36
+ `apigen-plugin-mcp`'s dynamic server, so every apigen-mounted tool's description carries a
37
+ concrete example of its own real shape, not just a generic convention sentence.
38
+
39
+ ## Validation error messages include a worked example
40
+
41
+ The validate-Layer's AJV validation-failure errors append the same schema-synthesized
42
+ example described above (`invalid_argument`, `Validation failed: ... โ€” Example: {...}`) โ€”
43
+ so a rejected call comes back with both what was structurally wrong and a shape that would
44
+ actually pass. This closes a real discoverability gap: previously an error only named the
45
+ missing/invalid property, never what a correct call looked like.
32
46
 
33
47
  ## Request envelope
34
48
 
package/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("ts-morph");require("node:fs");require("node:path");require("ts-json-schema-generator");const O=require("pino"),Ue=require("ajv"),De=require("ajv-formats"),I="$apigen";class V extends Error{constructor(t){super(t),this.code="E_DUP_CODEC",this.name="CodecRegistryError"}}function Le(e){const t=new Map;return{register(r,n){if(t.has(r.id)&&!(n!=null&&n.override))throw new V(`E_DUP_CODEC: a codec is already registered for id "${r.id}"`);t.set(r.id,r)},resolve(r){for(const n of t.values())if(n.matches(r))return n},get(r){return t.get(r)},ids(){return[...t.keys()]},freeze(){const r=new Map(t),n={register(){throw new V("E_DUP_CODEC: registry is frozen and cannot accept new codecs")},resolve(o){for(const i of r.values())if(i.matches(o))return i},get(o){return r.get(o)},ids(){return[...r.keys()]},freeze(){return n}};return n}}}const L="x-apigen-logical",R="x-apigen-codec",S="x-apigen-ctor",x="x-apigen-tojson",Re="0.1.0";function G(e,t){return{registry:e,resolve:r=>{throw new Error(`[apigen-logical] $ref "${r}" cannot be resolved in run-mode without a descriptor root. Supply a resolve() in the ctx override to handle $ref.`)},seen:new WeakSet,path:"",mode:"strict",...t}}function v(e,t,r){const n=r.registry.resolve(t);if(n)return n.encode(e,t,r);const o=t.$ref;if(typeof o=="string"){const a=r.resolve(o);return v(e,a,r)}const i=t.oneOf;if(Array.isArray(i)){const a=ue(e,i,t);return v(e,a,r)}const s=t.type;if(s==="array"){if(!Array.isArray(e))return _(e,t,r);const a=t.items;if(!a)return e.map(c=>w(c));const f=r.path;return Array.isArray(a)?e.map((c,u)=>{const l=a[u];return l===void 0?w(c):v(c,l,{...r,path:`${f}/${u}`})}):e.map((c,u)=>v(c,a,{...r,path:`${f}/${u}`}))}if(s==="object"){if(e===null||typeof e!="object"||Array.isArray(e))return _(e,t,r);const a=t.properties;if(!a)return w(e);const f=r.path,c={};for(const[u,l]of Object.entries(a)){const p=e[u];p!==void 0&&(c[u]=v(p,l,{...r,path:`${f}/${u}`}))}return c}return s==null?_(e,t,r):w(e)}function $(e,t,r){const n=r.registry.resolve(t);if(n)return n.decode(e,t,r);const o=t.$ref;if(typeof o=="string"){const a=r.resolve(o);return $(e,a,r)}const i=t.oneOf;if(Array.isArray(i)){const a=ue(e,i,t);return $(e,a,r)}const s=t.type;if(s==="array"){if(!Array.isArray(e))return e;const a=t.items;if(!a)return e;const f=r.path;return Array.isArray(a)?e.map((c,u)=>{const l=a[u];return l===void 0?c:$(c,l,{...r,path:`${f}/${u}`})}):e.map((c,u)=>$(c,a,{...r,path:`${f}/${u}`}))}if(s==="object"){if(e===null||typeof e!="object"||Array.isArray(e))return e;const a=t.properties;if(!a)return e;const f=r.path,c={};for(const[u,l]of Object.entries(a)){const p=e[u];p!==void 0&&(c[u]=$(p,l,{...r,path:`${f}/${u}`}))}return c}return s==null?Be(e,r):e}function ue(e,t,r,n){const o=r.discriminator;if(o!=null&&o.propertyName){const i=e!==null&&typeof e=="object"?e[o.propertyName]:void 0;if(typeof i=="string"&&o.mapping){const s=o.mapping[i];if(s){const a=t.find(f=>f.$ref===s);if(a)return a}}}return t[0]??{}}function _(e,t,r){for(const n of r.registry.ids()){const o=r.registry.get(n);if(o)try{const i=o.encode(e,o.schema,r);return{[I]:n,v:i}}catch{}}return w(e)}function Be(e,t){if(e!==null&&typeof e=="object"&&!Array.isArray(e)&&I in e){const r=e,n=r[I],o=t.registry.get(n);if(o)return o.decode(r.v,o.schema,t)}return e}function w(e){if(e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(w);if(typeof e=="object"){const t={};for(const[r,n]of Object.entries(e))n!==void 0&&(t[r]=w(n));return t}return null}function Fe(e){return{encode(t,r,n){const o=G(e,n);return v(t,r,o)},decode(t,r,n){const o=G(e,n);return $(t,r,o)}}}const B={id:"date-time",kind:"scalar",schema:{type:"string",format:"date-time"},matches(e){return e.type==="string"&&e.format==="date-time"},encode(e,t,r){return e.toISOString()},decode(e,t,r){if(typeof e!="string"){if(r.mode==="strict")throw new TypeError(`[date-time] expected a string on the wire at "${r.path}", got ${typeof e}`);return new Date(String(e))}if(r.mode==="strict"&&Number.isNaN(new Date(e).getTime()))throw new TypeError(`[date-time] invalid date-time string at "${r.path}": ${JSON.stringify(e)}`);return new Date(e)}},F={id:"int64",kind:"scalar",schema:{type:"string",format:"int64"},matches(e){return e.type==="string"&&e.format==="int64"},encode(e,t,r){return String(e)},decode(e,t,r){if(typeof e!="string"){if(r.mode==="strict")throw new TypeError(`[int64] expected a string on the wire at "${r.path}", got ${typeof e}`);try{return BigInt(Math.trunc(Number(e)))}catch{return BigInt(0)}}if(r.mode==="strict")return BigInt(e);if(/^-?\d+$/.test(e))try{return BigInt(e)}catch{return BigInt(0)}return BigInt(0)}},q={id:"decimal",kind:"scalar",schema:{type:"string",format:"decimal"},matches(e){return e.type==="string"&&e.format==="decimal"},encode(e,t,r){return e},decode(e,t,r){if(typeof e!="string"){if(r.mode==="strict")throw new TypeError(`[decimal] expected a string on the wire at "${r.path}", got ${typeof e}`);return String(e)}if(r.mode==="strict"&&!/^-?\d+(\.\d+)?$/.test(e))throw new TypeError(`[decimal] wire value "${e}" at "${r.path}" is not a valid decimal string`);return e}},H={id:"byte",kind:"scalar",schema:{type:"string",format:"byte"},matches(e){return e.type==="string"&&e.format==="byte"},encode(e,t,r){return Buffer.from(e).toString("base64")},decode(e,t,r){if(typeof e!="string"){if(r.mode==="strict")throw new TypeError(`[byte] expected a base64 string on the wire at "${r.path}", got ${typeof e}`);return new Uint8Array(0)}if(r.mode==="strict"&&!/^[A-Za-z0-9+/]*={0,2}$/.test(e))throw new TypeError(`[byte] wire value at "${r.path}" is not standard base64 (format:byte): "${e}"`);return new Uint8Array(Buffer.from(e,"base64"))}},qe=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,K={id:"uuid",kind:"scalar",schema:{type:"string",format:"uuid"},matches(e){return e.type==="string"&&e.format==="uuid"},encode(e,t,r){return e.toLowerCase()},decode(e,t,r){if(typeof e!="string"){if(r.mode==="strict")throw new TypeError(`[uuid] expected a string on the wire at "${r.path}", got ${typeof e}`);return String(e).toLowerCase()}if(r.mode==="strict"&&!qe.test(e))throw new TypeError(`[uuid] wire value "${e}" at "${r.path}" is not a lowercase-hyphenated RFC 4122 UUID`);return e}},M="NaN",T="Infinity",P="-Infinity",He=new Set([M,T,P]),W={id:"number-special",kind:"scalar",schema:{type:"number"},matches(e){return e.type==="number"&&e.format===void 0},encode(e,t,r){return Number.isNaN(e)?M:e===1/0?T:e===-1/0?P:e},decode(e,t,r){if(typeof e=="number")return e;if(typeof e=="string"){if(e===M)return NaN;if(e===T)return 1/0;if(e===P)return-1/0;const n=Number(e);if(!Number.isNaN(n))return n}if(r.mode==="strict")throw new TypeError(`[number-special] unrecognized wire value at "${r.path}": ${JSON.stringify(e)}. Expected a number or one of ${[...He].join(", ")}.`);return NaN}},Ke=[B,F,q,H,K,W];function We(e,t={}){for(const r of Ke)e.register(r,{override:t.override??!1})}B.id,F.id,q.id,H.id,K.id,W.id;const fe=Le();We(fe);const le=Fe(fe.freeze());function de(e,t){var n;const r=((n=e.input)==null?void 0:n.properties)??{};return t in r}function pe(e){var r,n;const t=(n=(r=e.input)==null?void 0:r.properties)==null?void 0:n.data;return Object.keys((t==null?void 0:t.properties)??{})}function ze(e,t){var o,i,s;const r=(s=(i=(o=e.input)==null?void 0:o.properties)==null?void 0:i.data)==null?void 0:s.properties,n=r==null?void 0:r[t];return n!==void 0?n:void 0}function Ve(e,t){return t===void 0||e===void 0?e:le.decode(e,t)}function E(e,t){const r=t.output;return!r||Object.keys(r).length===0?e:le.encode(e,r)}async function ye(e,t,r,n,o,i){const a=pe(r).map(c=>Ve(i[c],ze(r,c)));if(de(r,"session")&&t){const c=await t({session:o.session}),u=await e[n](c,...a);return E(u,r)}if(r.hasCtx){const c=t?await t(o):void 0,u=await e[n](c,...a);return E(u,r)}const f=await e[n](...a);return E(f,r)}class me{constructor(){this._map=new Map}set(t,r){this._map.set(t,r)}get(t){return this._map.get(t)}has(t){return this._map.has(t)}}function he(e=[]){return async function(r,n,o){const i=o.schemas[r];if(!i)throw new Error(`apigen/invoke: no schema found for operation "${r}"`);const s=()=>ye(o.fns,o.createClient,i,r,n.envelope,n.domainArgs);return e.reduceRight((f,c)=>()=>c(n,f),s)()}}function Ge(e){return e}class ge{constructor(){this.handlers=new Map}on(t,r){const n=this.handlers.get(t)??[];return this.handlers.set(t,[...n,r]),()=>this.off(t,r)}off(t,r){const n=this.handlers.get(t);if(!n)return;const o=n.filter(i=>i!==r);o.length===0?this.handlers.delete(t):this.handlers.set(t,o)}clear(){this.handlers.clear()}async emit(t){for(const[r,n]of this.handlers)if(Je(r,t))for(const o of n)await o(t)}}function Je(e,t){const[r,n,o]=e.split(":");return!(r!=="*"&&r!==t.module||n&&n!=="*"&&n!==t.method||o&&o!=="*"&&o!==t.lifecycle)}function we(e,t){for(const r of e)if(r.eventMapping)for(const[n,o]of Object.entries(r.eventMapping))t.on(n,o)}async function be(e,t,r){let n={...t};for(const o of e)if(o.createContext){await r.emit({module:o.id,method:"createContext",lifecycle:"start",ctx:n});try{const i=await o.createContext(n);n={...n,...i},await r.emit({module:o.id,method:"createContext",lifecycle:"complete",ctx:n})}catch(i){throw await r.emit({module:o.id,method:"createContext",lifecycle:"error",ctx:n,error:i}),i}}return n}function J(e,t){const r=new Set,n=[e];for(;n.length>0;){const o=n.pop();if(!o||r.has(o))continue;r.add(o);const i=o.$ref;if(typeof i=="string"){if(t){const l=t[i];if(!l){const p=Object.keys(t).join(", ")||"(none)";throw new Error(`[apigen-logical] $ref "${i}" cannot be resolved. Available $defs: ${p}`)}n.push(l)}continue}const s=o.oneOf;if(Array.isArray(s))for(const l of s)typeof l=="object"&&l!==null&&n.push(l);const a=o.properties;if(a)for(const l of Object.values(a))n.push(l);const f=o.items;if(Array.isArray(f))for(const l of f)typeof l=="object"&&l!==null&&n.push(l);else typeof f=="object"&&f!==null&&n.push(f);const c=o.additionalProperties;typeof c=="object"&&c!==null&&n.push(c);const u=o.propertyNames;typeof u=="object"&&u!==null&&n.push(u)}}const Y=new Set(["string","number","boolean","integer"]);function Ye(e){if(typeof e!="object"||e===null)return!1;const t=e;if(t.$ref!==void 0||t.oneOf||t.anyOf||t.allOf)return!1;const{type:r}=t;return typeof r=="string"?Y.has(r):Array.isArray(r)?r.every(n=>Y.has(n)||n==="null"):Array.isArray(t.enum)&&t.enum.length>0?t.enum.every(n=>["string","number","boolean"].includes(typeof n)):!1}function Xe(e){if(!e||typeof e!="object")return!1;const t=e.properties;return t===void 0||typeof t!="object"||t===null?!1:Object.values(t).every(Ye)}function Qe(e){const t={},r=n=>{for(const o of["definitions","$defs"]){const i=n[o];if(i)for(const[s,a]of Object.entries(i)){const f=s.startsWith("#/")?s:`#/${o}/${s}`;t[f]=a}}};for(const n of Object.values(e.schemas))r(n.input),r(n.output);if(Object.keys(t).length!==0)for(const[n,o]of Object.entries(e.schemas))try{J(o.input,t),J(o.output,t)}catch(i){throw new Error(`[apigen-core-client] Schema validation failed for function "${n}": ${i.message}`)}}function Ze(e,t){const r=['apigen calling convention: all domain parameters go inside a "data" envelope โ€” e.g. { "data": { ... } }'+(t?".":" (an empty object for this zero-parameter tool).")];return e.length>0&&r.push(`Field(s) ${e.map(n=>`"${n}"`).join(", ")} are transport-level envelope metadata, NOT domain data โ€” do not nest them under "data". Over MCP they are read from arguments._meta["x-<pluginId>-<field>"] (default pluginId "adhd"); see @adhd/apigen-engine-naming's envelopeMetaKey/envelopeCliFlag/envelopeEnvVar for the HTTP-header / CLI-flag / env-var equivalents.`),r.join(" ")}function et(e,t,r){Qe(e);const n={};for(const[o,i]of Object.entries(e.schemas)){const s=(r==null?void 0:r[o])??{},a=i.input.properties??{},f=i.input.required??[],c={},u=[],l={};for(const h of t)if(h.envelope&&s[h.id]!==!1)for(const[b,Pe]of Object.entries(h.envelope))c[b]=Pe,l[b]=h.id,u.includes(b)||u.push(b);const p={type:"object",properties:a,additionalProperties:!1,...f.length>0?{required:f}:{}},m=i.safe===!0||Xe(i.input),d=i.input.definitions,y=i.input.$defs;n[o]={input:{type:"object",properties:{...c,data:p},required:[...u,...f.length>0?["data"]:[]],additionalProperties:!1,description:Ze(Object.keys(c),Object.keys(a).length>0),...d?{definitions:d}:{},...y?{$defs:y}:{}},output:i.output,...i.hasCtx?{hasCtx:!0}:{},"x-apigen-safe":m,...Object.keys(l).length>0?{"x-apigen-envelope":l}:{}}}return n}const tt={"decimal.js":"Decimal"};function rt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}Object.entries(tt).map(([e,t])=>({pattern:new RegExp(`import\\(["'][^"']*${rt(e)}[^"']*["']\\)\\.\\w+`,"g"),key:t}));class U extends Error{constructor(t){super(t),this.name="ConfigurationError"}}function ve(e){for(const t of e)for(const r of Object.keys(t.eventMapping??{})){const[n]=r.split(":");if(n!=="*"&&n===t.id)throw new U(`Middleware "${t.id}" subscribes to its own events via "${r}". This would cause infinite recursion.`)}}function nt(e){const{domainSchemas:t,middlewares:r,overrides:n={},strict:o=!1}=e;ve(r);for(const c of Object.keys(n))if(!(c in t.schemas)){const u=`Override key "${c}" not found in domain schemas.`;if(o)throw new U(u);console.warn("[apigen-runtime]",u)}const i=new Set(r.map(c=>c.id));for(const[c,u]of Object.entries(n))for(const l of Object.keys(u??{}))if(!i.has(l)){const p=`Override key "${c}.${l}" does not match any declared middleware id.`;if(o)throw new U(p);console.warn("[apigen-runtime]",p)}const s=et(t,r,n),a=new ge;return we(r,a),{schemas:s,createClient:async c=>be(r,c,a),dispose:()=>a.clear()}}function ot(e={}){const t=e.level??"info",r=typeof e.destination=="string"&&e.destination.length>0,n=!r&&!!process.stderr.isTTY,o=e.format??(n?"pretty":"json"),i={level:t};if(o==="pretty")return i.transport={target:"pino-pretty",options:{colorize:!r,translateTime:"SYS:HH:MM:ss.l",ignore:"pid,hostname",...r?{destination:e.destination,mkdir:!0}:{destination:2}}},O(i);const s=r?O.destination({dest:e.destination,mkdir:!0,sync:!0}):O.destination(2);return O(i,s)}function $e(e){return e?e.type==="array"?`${$e(e.items)}[]`:e.enum?"enum":e.$ref?String(e.$ref).split("/").pop()||"object":e.anyOf||e.oneOf?"union":e.type??"object":"unknown"}function Ne(e){var a;const r=(a=((e==null?void 0:e.input)??{}).properties)==null?void 0:a.data,n=(r==null?void 0:r.properties)??{},o=new Set((r==null?void 0:r.required)??[]),i=Object.entries(n).map(([f,c])=>({name:f,type:$e(c),required:o.has(f)})),s=i.map(f=>`${f.name}${f.required?"":"?"}: ${f.type}`).join(", ");return{params:i,text:s}}function it(e){let t;return Array.isArray(e)?t=e:e?t=[e]:t=[],t.find(r=>r==="number"||r==="integer"||r==="boolean")}function st(e,t){var i,s;const n=((s=(i=((t==null?void 0:t.input)??{}).properties)==null?void 0:i.data)==null?void 0:s.properties)??{},o={...e};for(const[a,f]of Object.entries(n)){const c=o[a];if(typeof c!="string")continue;const u=it(f==null?void 0:f.type);if(u==="number"||u==="integer"){const l=Number(c);!Number.isNaN(l)&&c.trim()!==""&&(o[a]=l)}else u==="boolean"&&(c==="true"?o[a]=!0:c==="false"&&(o[a]=!1))}return o}const X=new Set(["default","module.exports","__esModule"]);function at(e){const t={},r=(n,o)=>{for(const[i,s]of Object.entries(n))if(typeof s=="function"){!X.has(i)&&!(i in t)&&(t[i]=s);const a=s.name;a&&!(a in t)&&(t[a]=s)}else s&&typeof s=="object"&&o<2&&X.has(i)&&r(s,o+1)};return r(e,0),t}const ct=["invalid_argument","unauthenticated","permission_denied","not_found","internal"];class A extends Error{constructor(t,r,n){super(r),this.name="ApiError",this.code=t,this.details=n,Object.setPrototypeOf(this,new.target.prototype)}toJSON(){const t={code:this.code,message:this.message};return this.details!==void 0&&(t.details=this.details),t}}function Oe(e){return typeof e=="object"&&e!==null&&e.name==="ApiError"&&ct.includes(e.code)&&typeof e.toJSON=="function"}function Q(e,t,r=0){return e==="before-first-chunk"?{phase:e,error:t}:{phase:e,error:t,chunksDelivered:r}}const N=new Ue({allErrors:!0});De(N);for(const e of[L,R,S,x,"discriminator"])N.addKeyword({keyword:e,valid:!0});N.addFormat("decimal",/^[+-]?(?:\d+(?:\.\d+)?|\.\d+)$/);function je(e){return e.map(t=>`${t.instancePath||"(root)"} ${t.message??"failed schema check"}`).join("; ")}const ut=async(e,t)=>{const r=e.ctx.get(Ae);if(r===void 0)return t();const n=e.operation.id,o=r[n];if(o===void 0)return t();const i={data:e.domainArgs,...e.envelope},s=N.compile(o.input);if(!s(i)){const f=s.errors??[];throw new A("invalid_argument",`Validation failed: ${je(f)}`,f)}return t()},Ae=Symbol("ValidateSchemasToken");function _e(e){return async function(r,n){const o=r.operation.id,i=e[o];if(i===void 0)return n();const s={data:r.domainArgs,...r.envelope},a=N.compile(i.input);if(!a(s)){const c=a.errors??[];throw new A("invalid_argument",`Validation failed: ${je(c)}`,c)}return n()}}function ft(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}class lt{constructor(t={}){var n,o;this._store=new Map,this._sweeper=null,this._defaultTtlMs=t.defaultTtlMs;let r=null;t.sweepIntervalMs===0?r=null:t.sweepIntervalMs!==void 0?r=t.sweepIntervalMs:this._defaultTtlMs!==void 0?r=Math.max(1e3,Math.floor(this._defaultTtlMs/4)):r=null,r!==null&&r>0&&(this._sweeper=setInterval(()=>this._sweep(),r),(o=(n=this._sweeper).unref)==null||o.call(n))}create(t,r=[],n){const o=new t(...r),i=ft(),s=n??this._defaultTtlMs,a=s!==void 0?Date.now()+s:null;return this._store.set(i,{instance:o,expiresAt:a}),{instanceId:i}}get(t){const r=this._store.get(t);if(!r)throw new Error(`[instance-registry] Unknown instanceId: "${t}"`);if(r.expiresAt!==null&&Date.now()>r.expiresAt)throw this._evict(t,r),new Error(`[instance-registry] Instance "${t}" has expired`);return r.instance}async dispatch(t,r,n=[]){const o=this.get(t),i=o[r];if(typeof i!="function")throw new Error(`[instance-registry] Method "${r}" not found on instance "${t}"`);return i.call(o,...n)}async dispose(t){const r=this._store.get(t);r&&(this._store.delete(t),await C(r.instance))}async disposeAll(){this._sweeper!==null&&(clearInterval(this._sweeper),this._sweeper=null);const t=[...this._store.entries()];this._store.clear(),await Promise.all(t.map(([,r])=>C(r.instance)))}get size(){return this._store.size}_sweep(){const t=Date.now();for(const[r,n]of this._store)n.expiresAt!==null&&t>n.expiresAt&&this._evict(r,n)}_evict(t,r){this._store.delete(t),C(r.instance)}}async function C(e){if(e!==null&&typeof e=="object"&&"dispose"in e){const t=e.dispose;typeof t=="function"&&await t.call(e)}}function dt(e){const{produce:t,signal:r}=e,n=r??new AbortController().signal;return{[Symbol.asyncIterator](){const o=t(n);return{async next(){return n.aborted?(await o.return(void 0),{done:!0,value:void 0}):o.next()},async return(i){return await o.return(i),{done:!0,value:void 0}},async throw(i){return await o.throw(i),{done:!0,value:void 0}}}}}}async function pt(e){const t=[];for await(const r of e)t.push(r);return t}async function Ee(e){const t=[];try{for await(const r of e)t.push(r);return{ok:!0,chunks:t}}catch(r){const n=Oe(r)?r:new A("internal",r instanceof Error?r.message:String(r));return t.length===0?{ok:!1,carrier:Q("before-first-chunk",n)}:{ok:!1,carrier:Q("after-first-chunk",n,t.length)}}}function Ce(e){return e!==null&&typeof e=="object"&&Symbol.asyncIterator in e}class g extends Error{constructor(t,r){super(r),this.name="UnionCodecError",this.code=t}}function k(e){const t=e.discriminator;if(t===null||typeof t!="object"||Array.isArray(t))return;const r=t;if(typeof r.propertyName!="string")return;const n=r.mapping;if(!(n===null||typeof n!="object"||Array.isArray(n)))return{propertyName:r.propertyName,mapping:n}}function ke(e,t){const r=e[R];if(typeof r=="string"){const n=t.registry.get(r);if(n)return n}return t.registry.resolve(e)}function yt(e,t,r){const n=ke(t,r);return n?n.encode(e,t,r):e}function mt(e,t,r){const n=ke(t,r);return n?n.decode(e,t,r):e}function Ie(e){const{id:t,schema:r}=e;return{id:t,kind:"union",schema:r,matches(n){if(n[L]==="union")return!0;const o=n.oneOf;return!Array.isArray(o)||o.length===0?!1:k(n)!==void 0},encode(n,o,i){const s=k(o);if(!s)throw new g("E_UNION_NO_DISCRIMINATOR",`[${t}] schema node at "${i.path}" has no discriminator.propertyName; cannot dispatch union branch.`);const{propertyName:a,mapping:f}=s,c=n[a];if(c==null)throw new g("E_UNION_NO_DISCRIMINATOR",`[${t}] value at "${i.path}" is missing the discriminator property "${a}".`);const u=String(c),l=f[u];if(!l)throw new g("E_UNION_UNKNOWN_TAG",`[${t}] discriminator tag "${u}" at "${i.path}" is not in the mapping (known: ${Object.keys(f).join(", ")}).`);const p=i.resolve(l);return yt(n,p,{...i,path:`${i.path}[${u}]`})},decode(n,o,i){if(n===null||typeof n!="object"||Array.isArray(n)){let d;throw n===null?d="null":Array.isArray(n)?d="array":d=typeof n,new g("E_UNION_INVALID_WIRE",`[${t}] expected a JSON object on the wire at "${i.path}", got ${d}.`)}const s=n,a=k(o);if(!a)throw new g("E_UNION_NO_DISCRIMINATOR",`[${t}] schema node at "${i.path}" has no discriminator.propertyName; cannot dispatch union branch.`);const{propertyName:f,mapping:c}=a,u=s[f];if(u==null)throw new g("E_UNION_NO_DISCRIMINATOR",`[${t}] wire object at "${i.path}" is missing the discriminator property "${f}".`);const l=String(u),p=c[l];if(!p)throw new g("E_UNION_UNKNOWN_TAG",`[${t}] discriminator tag "${l}" on the wire at "${i.path}" is not in the mapping (known: ${Object.keys(c).join(", ")}).`);const m=i.resolve(p);return mt(n,m,{...i,path:`${i.path}[${l}]`})}}}const ht="x-apigen-instances";class j extends Error{constructor(t,r){super(r),this.name="NominalCodecError",this.code=t}}function Z(e){const t=e.properties;return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function gt(e){const t=e.required;return Array.isArray(t)?t.filter(r=>typeof r=="string"):[]}function ee(e,t,r){if(t){const n=r.registry.resolve(t);if(n)return n.encode(e,t,r)}return e}function wt(e,t,r){if(t){const n=r.registry.resolve(t);if(n)return n.decode(e,t,r)}return e}function bt(e){const{id:t,schema:r,ctor:n}=e;return{id:t,kind:"nominal",schema:r,matches(o){return o[L]==="nominal"?!0:o[R]===t},encode(o,i,s){if(o===null||typeof o!="object")return o;if(s.seen.has(o)){if(s.mode==="strict")throw new j("E_NOMINAL_CYCLE",`[${t}] cycle detected at "${s.path}": a nominal instance references itself. Strict mode rejects cycles (DESIGN ยง8.3); break the cycle or use 'lossy' mode.`);return null}s.seen.add(o);try{const a=Z(i),f=typeof i[x]=="string"?i[x]:"toJSON",c=o[f];if(typeof c=="function"){const d=c.call(o);if(d!==null&&typeof d=="object"&&!Array.isArray(d)){const y={};for(const[h,b]of Object.entries(d))y[h]=ee(b,a[h],{...s,path:`${s.path}/${h}`});return y}return d}const u={},l=Object.keys(a),p=o,m=l.length>0?l:Object.keys(p);for(const d of m){const y=p[d];y!==void 0&&(u[d]=ee(y,a[d],{...s,path:`${s.path}/${d}`}))}return u}finally{s.seen.delete(o)}},decode(o,i,s){if(o===null||typeof o!="object"||Array.isArray(o)){let u;throw o===null?u="null":Array.isArray(o)?u="array":u=typeof o,new j("E_NOMINAL_INVALID_WIRE",`[${t}] expected a JSON object on the wire at "${s.path}", got ${u}.`)}const a=o;for(const u of gt(i))if(!(u in a))throw new j("E_NOMINAL_INVALID_WIRE",`[${t}] required field "${u}" missing on the wire at "${s.path}".`);if(i[ht]===!1)throw new j("E_NOMINAL_NONRECONSTRUCTABLE",`[${t}] is encode-only: the extractor marked it non-reconstructable (x-apigen-instances:false). It cannot be decoded back to a live instance.`);const f=Z(i),c={};for(const[u,l]of Object.entries(a))c[u]=wt(l,f[u],{...s,path:`${s.path}/${u}`});if(n){const u=typeof i[S]=="string"?i[S]:"fromJSON",l=n[u];if(typeof l=="function")return l.call(n,c);const p=n;return new p(c)}return c}}}const Se=[B,F,q,H,K,W],vt={type:"object","x-apigen-logical":"nominal","x-apigen-codec":"ts.NominalSentinel"},te=bt({id:"ts.NominalSentinel",schema:vt}),$t={oneOf:[],discriminator:{propertyName:"kind",mapping:{}},"x-apigen-logical":"union","x-apigen-codec":"ts.UnionSentinel"},re=Ie({id:"ts.UnionSentinel",schema:$t});function Nt(){const e=[...Se.map(t=>[t.id,t]),[te.id,te],[re.id,re]];return Object.freeze(new Map(e))}const Ot=Object.freeze({host:"ts",logicalTypeVersion:Re,codecs:Nt()});function jt(e,t,r){var i;const n=typeof((i=t==null?void 0:t.input)==null?void 0:i.description)=="string"?t.input.description:void 0,o=[r,n].filter(s=>typeof s=="string"&&s.length>0);return o.length>0?o.join(" โ€” "):e}function At(e){if(!e||typeof e!="object"||Array.isArray(e)||Object.keys(e).length===0)return{outputSchema:void 0,wrapped:!1};const t=e;return t.type==="object"?{outputSchema:t,wrapped:!1}:{outputSchema:{type:"object",properties:{result:t},required:["result"]},wrapped:!0}}function _t(e,t){return e?{result:t}:t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}const xe=4,Me=32;function D(e){return Oe(e)?e:e instanceof Error?new A("internal",e.message):e}function Et(e,t){if(e==="serial"||e==="chained")return 1;const r=t??xe;return!Number.isFinite(r)||r<1?1:Math.min(Math.floor(r),Me)}function Ct(){}function kt(e,t){var i;if(!e&&!t)return{signal:void 0,dispose:Ct};const r=new AbortController,n=()=>{r.abort(e==null?void 0:e.reason)};e&&(e.aborted?r.abort(e.reason):e.addEventListener("abort",n,{once:!0}));let o;return t!==void 0&&!r.signal.aborted&&(o=setTimeout(()=>{r.abort(new DOMException(`apigen/invokeBatch: item timed out after ${t}ms`,"TimeoutError"))},t),(i=o.unref)==null||i.call(o)),{signal:r.signal,dispose(){e&&e.removeEventListener("abort",n),o&&clearTimeout(o)}}}async function ne(e,t,r,n,o,i){const s=kt(n.signal,i);try{const a=s.signal?{...n,signal:s.signal}:n,f=await e(t,a,o);if(Ce(f)){const c=await Ee(f);if(c.ok)return{index:r,status:"fulfilled",chunks:c.chunks};const u=c.carrier;return{index:r,status:"rejected",reason:D(u.error),...u.phase==="after-first-chunk"?{chunksDelivered:u.chunksDelivered}:{}}}return{index:r,status:"fulfilled",value:f}}catch(a){return{index:r,status:"rejected",reason:D(a)}}finally{s.dispose()}}async function It(e,t,r,n,o={}){const i=o.mode??"parallel",s=o.onItemError??"continue",a=Et(i,o.concurrency),f=new Array(r.length),c=d=>({index:d,status:"rejected",reason:D(new Error("apigen/invokeBatch: not attempted โ€” an earlier item failed and "+(i==="chained"?'mode is "chained"':'onItemError is "abort"')))});if(i==="serial"||i==="chained"){let d=!1;for(let y=0;y<r.length;y++){if(d){f[y]=c(y);continue}const h=await ne(e,t,y,r[y],n,o.itemTimeoutMs);f[y]=h,h.status==="rejected"&&(i==="chained"||s==="abort")&&(d=!0)}return f}let u=0,l=!1;const p=Math.max(1,Math.min(a,r.length)),m=Array.from({length:p},async()=>{for(;;){const d=u++;if(d>=r.length)return;if(l){f[d]=c(d);continue}const y=await ne(e,t,d,r[d],n,o.itemTimeoutMs);f[d]=y,y.status==="rejected"&&s==="abort"&&(l=!0)}});return await Promise.all(m),f}const oe=new Set(["string","number","boolean","integer"]);function St(e){if(typeof e!="object"||e===null)return!1;const t=e;if(t.$ref!==void 0||t.oneOf||t.anyOf||t.allOf)return!1;const{type:r}=t;return typeof r=="string"?oe.has(r):Array.isArray(r)?r.every(n=>oe.has(n)||n==="null"):Array.isArray(t.enum)&&t.enum.length>0?t.enum.every(n=>["string","number","boolean"].includes(typeof n)):!1}function xt(e){if(!e||typeof e!="object")return!1;const t=e.properties;return t===void 0||typeof t!="object"||t===null?!1:Object.values(t).every(St)}const Mt={"decimal.js":"Decimal"};function Tt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}Object.entries(Mt).map(([e,t])=>({pattern:new RegExp(`import\\(["'][^"']*${Tt(e)}[^"']*["']\\)\\.\\w+`,"g"),key:t}));function ie(e){return e.words.join("-")}function se(e){return e.words.map(Rt).join("")}function ae(e){return e.words.join("_")}function Pt(e,t={}){var r,n;const o=[e.namespace,...e.path],i=e.safe||xt(e.input)?"GET":"POST",s=((n=(r=t.http)==null?void 0:r.verb)==null?void 0:n[e.id])??i,a="/"+o.map(m=>ie(m)).join("/"),f=o.map(m=>ae(m)).join("_"),c=o.map(m=>ae(m)).slice(0,-1).join("."),u=se(o[o.length-2]??o[0]),l=se(o[o.length-1]),p=o.map(m=>ie(m));return{http:{verb:s,route:a},mcp:{name:f},grpc:{package:c,service:u,method:l},cli:{path:p}}}function Ut(e,t){return`x-${e}-${t}`}function Dt(e,t){return`--${e}-${t}`}function Lt(e,t){const r=n=>n.toUpperCase().replace(/-/g,"_");return e==="adhd"?`APIGEN_${r(t)}`:`APIGEN_${r(e)}_${r(t)}`}function Rt(e){return e.length===0?e:e[0].toUpperCase()+e.slice(1)}function z(e){return e.anyOf??e.oneOf}function Bt(e){if(!e)return!1;if(e.type==="array"||e.type==="object")return!0;const t=z(e);if(t){const r=t.filter(n=>n.type!=="null");return r.length>0&&r.every(n=>n.type==="array"||n.type==="object")}return!1}function Ft(e){if(!e)return!1;if(e.type==="boolean")return!0;const t=z(e);if(t){const r=t.filter(n=>n.type!=="null");return r.length>0&&r.every(n=>n.type==="boolean")}return!1}function qt(e){if(!e)return!1;if(e.type==="number"||e.type==="integer")return!0;const t=z(e);if(t){const r=t.filter(n=>n.type!=="null");return r.length>0&&r.every(n=>n.type==="number"||n.type==="integer")}return!1}function Ht(e){return e.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}function Kt(e){var o,i;const t=(i=(o=e.input)==null?void 0:o.properties)==null?void 0:i.data,r=(t==null?void 0:t.properties)??{},n=(t==null?void 0:t.required)??[];return{props:r,required:n}}function ce(e){return typeof e.handler=="function"}function Wt(e){var o;const t=((o=e.input)==null?void 0:o.properties)??{},r=e["x-apigen-envelope"],n=[];for(const i of Object.keys(t)){if(i==="data")continue;const s=(r==null?void 0:r[i])??"adhd",a=Ut(s,i);n.push({field:i,pluginId:s,httpHeader:a,mcpMetaKey:a,cliFlag:Dt(s,i),envVar:Lt(s,i)})}return n}function zt(e,t){const r=new Map,{props:n}=Kt(e);for(const[o,i]of Object.entries(n)){let s="string";Ft(i)?s="boolean":(Bt(i)||qt(i))&&(s="json"),r.set(Ht(o),{camelKey:o,kind:"domain",valueKind:s})}for(const o of t){const i=o.cliFlag.replace(/^--/,"");r.set(i,{camelKey:o.field,kind:"envelope",valueKind:"string",envVar:o.envVar})}return r}function Vt(e){const{op:t,schema:r,transport:n,projection:o}=e,i=Pt(t,o),s=r?Wt(r):[],a=r?zt(r,s):new Map,f=r?Ne(r).params:void 0,c={op:t,transport:n,http:i.http,mcp:i.mcp,cli:i.cli,grpc:i.grpc,params:f,envelope:s,cliFlags:a,streaming:t.streaming,isMount:ce(t)};if(ce(t)){const u=t.handler;c.mountHandler=async l=>u(l)}return c}function Gt(e){const t=e.usePlugins;return Array.isArray(t)?t:[]}function Jt(e){const t=e.useOptions;return t&&typeof t=="object"?t:{}}function Te(e){return async function(r,n){const o=Object.assign(r,{data:r.domainArgs});return await e.layer(o,n)}}function Yt(e,t){var n;const r=[];for(const o of t){const i=(n=o.capabilities)==null?void 0:n.layer;i&&r.push(Te(i))}return r.push(_e(e)),he(r)}function Xt(){const e=new Map;return{get:t=>e.get(t),set:(t,r)=>{e.set(t,r)}}}const Qt={input:{type:"object",properties:{data:{type:"object",properties:{}}}},output:{}};async function Zt(e,t,r,n){const o={...r,operation:{id:e.op.id},ctx:new me};if(e.isMount){const i=e.mountHandler;if(!i)throw new Error(`apigen-engine-runtime/dispatchForPlan: OpPlan for mount op "${e.op.id}" has isMount=true but no mountHandler`);const s={operation:e.op,data:r.domainArgs,envelope:r.envelope,ctx:Xt(),transport:e.transport,signal:r.signal??new AbortController().signal},a={...n,fns:{[e.op.id]:()=>i(s)},schemas:{[e.op.id]:Qt}};return t(e.op.id,o,a)}return t(e.op.id,o,n)}exports.BATCH_DEFAULT_CONCURRENCY=xe;exports.BATCH_MAX_CONCURRENCY=Me;exports.EventBus=ge;exports.InstanceRegistry=lt;exports.LayerContext=me;exports.UnionCodecError=g;exports.ValidateSchemasToken=Ae;exports.WELL_KNOWN_TS_CODECS=Se;exports.adaptCoreLayer=Te;exports.assertNoSelfSubscription=ve;exports.buildContext=be;exports.buildFnTable=at;exports.buildMcpOutputSchema=At;exports.buildOpPlan=Vt;exports.buildToolDescription=jt;exports.coerceQueryParams=st;exports.collectWithPhase=Ee;exports.createApiPackage=nt;exports.createInvoker=he;exports.createLogger=ot;exports.createPackageInvoker=Yt;exports.createStream=dt;exports.createUnionCodec=Ie;exports.dataParamNames=pe;exports.defineMiddleware=Ge;exports.describeParams=Ne;exports.dispatch=ye;exports.dispatchForPlan=Zt;exports.drainStream=pt;exports.invokeBatch=It;exports.isApiStream=Ce;exports.makeValidateLayer=_e;exports.needsEnvelopeField=de;exports.readUseOptions=Jt;exports.readUsePlugins=Gt;exports.tsHostBinding=Ot;exports.validateLayer=ut;exports.wireObservers=we;exports.wrapMcpStructuredContent=_t;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("ts-morph");require("node:fs");require("node:path");require("ts-json-schema-generator");const N=require("pino"),Be=require("ajv"),qe=require("ajv-formats"),I="$apigen";class J extends Error{constructor(t){super(t),this.code="E_DUP_CODEC",this.name="CodecRegistryError"}}function Fe(e){const t=new Map;return{register(r,n){if(t.has(r.id)&&!(n!=null&&n.override))throw new J(`E_DUP_CODEC: a codec is already registered for id "${r.id}"`);t.set(r.id,r)},resolve(r){for(const n of t.values())if(n.matches(r))return n},get(r){return t.get(r)},ids(){return[...t.keys()]},freeze(){const r=new Map(t),n={register(){throw new J("E_DUP_CODEC: registry is frozen and cannot accept new codecs")},resolve(o){for(const i of r.values())if(i.matches(o))return i},get(o){return r.get(o)},ids(){return[...r.keys()]},freeze(){return n}};return n}}}const R="x-apigen-logical",B="x-apigen-codec",x="x-apigen-ctor",T="x-apigen-tojson",He="0.1.0";function Y(e,t){return{registry:e,resolve:r=>{throw new Error(`[apigen-logical] $ref "${r}" cannot be resolved in run-mode without a descriptor root. Supply a resolve() in the ctx override to handle $ref.`)},seen:new WeakSet,path:"",mode:"strict",...t}}function v(e,t,r){const n=r.registry.resolve(t);if(n)return n.encode(e,t,r);const o=t.$ref;if(typeof o=="string"){const a=r.resolve(o);return v(e,a,r)}const i=t.oneOf;if(Array.isArray(i)){const a=pe(e,i,t);return v(e,a,r)}const s=t.type;if(s==="array"){if(!Array.isArray(e))return _(e,t,r);const a=t.items;if(!a)return e.map(c=>w(c));const f=r.path;return Array.isArray(a)?e.map((c,u)=>{const l=a[u];return l===void 0?w(c):v(c,l,{...r,path:`${f}/${u}`})}):e.map((c,u)=>v(c,a,{...r,path:`${f}/${u}`}))}if(s==="object"){if(e===null||typeof e!="object"||Array.isArray(e))return _(e,t,r);const a=t.properties;if(!a)return w(e);const f=r.path,c={};for(const[u,l]of Object.entries(a)){const d=e[u];d!==void 0&&(c[u]=v(d,l,{...r,path:`${f}/${u}`}))}return c}return s==null?_(e,t,r):w(e)}function $(e,t,r){const n=r.registry.resolve(t);if(n)return n.decode(e,t,r);const o=t.$ref;if(typeof o=="string"){const a=r.resolve(o);return $(e,a,r)}const i=t.oneOf;if(Array.isArray(i)){const a=pe(e,i,t);return $(e,a,r)}const s=t.type;if(s==="array"){if(!Array.isArray(e))return e;const a=t.items;if(!a)return e;const f=r.path;return Array.isArray(a)?e.map((c,u)=>{const l=a[u];return l===void 0?c:$(c,l,{...r,path:`${f}/${u}`})}):e.map((c,u)=>$(c,a,{...r,path:`${f}/${u}`}))}if(s==="object"){if(e===null||typeof e!="object"||Array.isArray(e))return e;const a=t.properties;if(!a)return e;const f=r.path,c={};for(const[u,l]of Object.entries(a)){const d=e[u];d!==void 0&&(c[u]=$(d,l,{...r,path:`${f}/${u}`}))}return c}return s==null?Ke(e,r):e}function pe(e,t,r,n){const o=r.discriminator;if(o!=null&&o.propertyName){const i=e!==null&&typeof e=="object"?e[o.propertyName]:void 0;if(typeof i=="string"&&o.mapping){const s=o.mapping[i];if(s){const a=t.find(f=>f.$ref===s);if(a)return a}}}return t[0]??{}}function _(e,t,r){for(const n of r.registry.ids()){const o=r.registry.get(n);if(o)try{const i=o.encode(e,o.schema,r);return{[I]:n,v:i}}catch{}}return w(e)}function Ke(e,t){if(e!==null&&typeof e=="object"&&!Array.isArray(e)&&I in e){const r=e,n=r[I],o=t.registry.get(n);if(o)return o.decode(r.v,o.schema,t)}return e}function w(e){if(e===null||typeof e=="string"||typeof e=="number"||typeof e=="boolean")return e;if(Array.isArray(e))return e.map(w);if(typeof e=="object"){const t={};for(const[r,n]of Object.entries(e))n!==void 0&&(t[r]=w(n));return t}return null}function We(e){return{encode(t,r,n){const o=Y(e,n);return v(t,r,o)},decode(t,r,n){const o=Y(e,n);return $(t,r,o)}}}const q={id:"date-time",kind:"scalar",schema:{type:"string",format:"date-time"},matches(e){return e.type==="string"&&e.format==="date-time"},encode(e,t,r){return e.toISOString()},decode(e,t,r){if(typeof e!="string"){if(r.mode==="strict")throw new TypeError(`[date-time] expected a string on the wire at "${r.path}", got ${typeof e}`);return new Date(String(e))}if(r.mode==="strict"&&Number.isNaN(new Date(e).getTime()))throw new TypeError(`[date-time] invalid date-time string at "${r.path}": ${JSON.stringify(e)}`);return new Date(e)}},F={id:"int64",kind:"scalar",schema:{type:"string",format:"int64"},matches(e){return e.type==="string"&&e.format==="int64"},encode(e,t,r){return String(e)},decode(e,t,r){if(typeof e!="string"){if(r.mode==="strict")throw new TypeError(`[int64] expected a string on the wire at "${r.path}", got ${typeof e}`);try{return BigInt(Math.trunc(Number(e)))}catch{return BigInt(0)}}if(r.mode==="strict")return BigInt(e);if(/^-?\d+$/.test(e))try{return BigInt(e)}catch{return BigInt(0)}return BigInt(0)}},H={id:"decimal",kind:"scalar",schema:{type:"string",format:"decimal"},matches(e){return e.type==="string"&&e.format==="decimal"},encode(e,t,r){return e},decode(e,t,r){if(typeof e!="string"){if(r.mode==="strict")throw new TypeError(`[decimal] expected a string on the wire at "${r.path}", got ${typeof e}`);return String(e)}if(r.mode==="strict"&&!/^-?\d+(\.\d+)?$/.test(e))throw new TypeError(`[decimal] wire value "${e}" at "${r.path}" is not a valid decimal string`);return e}},K={id:"byte",kind:"scalar",schema:{type:"string",format:"byte"},matches(e){return e.type==="string"&&e.format==="byte"},encode(e,t,r){return Buffer.from(e).toString("base64")},decode(e,t,r){if(typeof e!="string"){if(r.mode==="strict")throw new TypeError(`[byte] expected a base64 string on the wire at "${r.path}", got ${typeof e}`);return new Uint8Array(0)}if(r.mode==="strict"&&!/^[A-Za-z0-9+/]*={0,2}$/.test(e))throw new TypeError(`[byte] wire value at "${r.path}" is not standard base64 (format:byte): "${e}"`);return new Uint8Array(Buffer.from(e,"base64"))}},ze=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/,W={id:"uuid",kind:"scalar",schema:{type:"string",format:"uuid"},matches(e){return e.type==="string"&&e.format==="uuid"},encode(e,t,r){return e.toLowerCase()},decode(e,t,r){if(typeof e!="string"){if(r.mode==="strict")throw new TypeError(`[uuid] expected a string on the wire at "${r.path}", got ${typeof e}`);return String(e).toLowerCase()}if(r.mode==="strict"&&!ze.test(e))throw new TypeError(`[uuid] wire value "${e}" at "${r.path}" is not a lowercase-hyphenated RFC 4122 UUID`);return e}},M="NaN",P="Infinity",U="-Infinity",Ve=new Set([M,P,U]),z={id:"number-special",kind:"scalar",schema:{type:"number"},matches(e){return e.type==="number"&&e.format===void 0},encode(e,t,r){return Number.isNaN(e)?M:e===1/0?P:e===-1/0?U:e},decode(e,t,r){if(typeof e=="number")return e;if(typeof e=="string"){if(e===M)return NaN;if(e===P)return 1/0;if(e===U)return-1/0;const n=Number(e);if(!Number.isNaN(n))return n}if(r.mode==="strict")throw new TypeError(`[number-special] unrecognized wire value at "${r.path}": ${JSON.stringify(e)}. Expected a number or one of ${[...Ve].join(", ")}.`);return NaN}},Je=[q,F,H,K,W,z];function Ye(e,t={}){for(const r of Je)e.register(r,{override:t.override??!1})}const Ge=12;function Ze(e,t){const r=/^#\/(definitions|\$defs)\/(.+)$/.exec(e);if(!r)return;const[,n,o]=r,i=n==="$defs"?t.$defs:t.definitions;return i==null?void 0:i[decodeURIComponent(o)]}function G(e){return Array.isArray(e)&&e.length>0?e[0]:void 0}function Xe(e){if(Array.isArray(e.type))return e.type.find(t=>t!=="null")??e.type[0];if(typeof e.type=="string")return e.type;if(e.properties)return"object"}function Qe(e){switch(e.format){case"date-time":return"1970-01-01T00:00:00.000Z";case"date":return"1970-01-01";case"time":return"00:00:00Z";case"uuid":return"00000000-0000-0000-0000-000000000000";case"email":return"user@example.com";case"uri":case"url":case"uri-reference":return"https://example.com";case"hostname":return"example.com";case"ipv4":return"127.0.0.1";case"ipv6":return"::1";case"decimal":return"0";case"int64":return"0";case"byte":return"";default:return"<string>"}}function Z(e,t,r){const n=e.properties??{},o=e.required??[],i={};for(const s of o){const a=n[s];i[s]=a!==void 0?O(a,t,r+1):`<${s}>`}return i}function et(e,t,r){const n=Array.isArray(e.items)?e.items[0]:e.items;return n?[O(n,t,r+1)]:[]}function O(e,t=e??{},r=0){if(!e||r>Ge)return null;if(typeof e.$ref=="string"){const o=Ze(e.$ref,t);return o!==void 0?O(o,t,r+1):null}if(e.const!==void 0)return e.const;if(Array.isArray(e.enum)&&e.enum.length>0)return e.enum[0];if(Array.isArray(e.allOf)&&e.allOf.length>0){const o={},i=[];for(const s of e.allOf){Object.assign(o,s.properties??{});for(const a of s.required??[])i.includes(a)||i.push(a)}return Z({...e,properties:o,required:i},t,r)}const n=G(e.oneOf)??G(e.anyOf);if(n)return O(n,t,r+1);switch(Xe(e)){case"object":return Z(e,t,r);case"array":return et(e,t,r);case"string":return Qe(e);case"integer":case"number":return 0;case"boolean":return!1;case"null":return null;default:return null}}function de(e){if(!e)return;const t=O(e);return`Example: ${JSON.stringify(t)}`}q.id,F.id,H.id,K.id,W.id,z.id;const ye=Fe();Ye(ye);const me=We(ye.freeze());function he(e,t){var n;const r=((n=e.input)==null?void 0:n.properties)??{};return t in r}function ge(e){var r,n;const t=(n=(r=e.input)==null?void 0:r.properties)==null?void 0:n.data;return Object.keys((t==null?void 0:t.properties)??{})}function tt(e,t){var o,i,s;const r=(s=(i=(o=e.input)==null?void 0:o.properties)==null?void 0:i.data)==null?void 0:s.properties,n=r==null?void 0:r[t];return n!==void 0?n:void 0}function rt(e,t){return t===void 0||e===void 0?e:me.decode(e,t)}function C(e,t){const r=t.output;return!r||Object.keys(r).length===0?e:me.encode(e,r)}async function we(e,t,r,n,o,i){const a=ge(r).map(c=>rt(i[c],tt(r,c)));if(he(r,"session")&&t){const c=await t({session:o.session}),u=await e[n](c,...a);return C(u,r)}if(r.hasCtx){const c=t?await t(o):void 0,u=await e[n](c,...a);return C(u,r)}const f=await e[n](...a);return C(f,r)}class be{constructor(){this._map=new Map}set(t,r){this._map.set(t,r)}get(t){return this._map.get(t)}has(t){return this._map.has(t)}}function ve(e=[]){return async function(r,n,o){const i=o.schemas[r];if(!i)throw new Error(`apigen/invoke: no schema found for operation "${r}"`);const s=()=>we(o.fns,o.createClient,i,r,n.envelope,n.domainArgs);return e.reduceRight((f,c)=>()=>c(n,f),s)()}}function nt(e){return e}class $e{constructor(){this.handlers=new Map}on(t,r){const n=this.handlers.get(t)??[];return this.handlers.set(t,[...n,r]),()=>this.off(t,r)}off(t,r){const n=this.handlers.get(t);if(!n)return;const o=n.filter(i=>i!==r);o.length===0?this.handlers.delete(t):this.handlers.set(t,o)}clear(){this.handlers.clear()}async emit(t){for(const[r,n]of this.handlers)if(ot(r,t))for(const o of n)await o(t)}}function ot(e,t){const[r,n,o]=e.split(":");return!(r!=="*"&&r!==t.module||n&&n!=="*"&&n!==t.method||o&&o!=="*"&&o!==t.lifecycle)}function Oe(e,t){for(const r of e)if(r.eventMapping)for(const[n,o]of Object.entries(r.eventMapping))t.on(n,o)}async function Ae(e,t,r){let n={...t};for(const o of e)if(o.createContext){await r.emit({module:o.id,method:"createContext",lifecycle:"start",ctx:n});try{const i=await o.createContext(n);n={...n,...i},await r.emit({module:o.id,method:"createContext",lifecycle:"complete",ctx:n})}catch(i){throw await r.emit({module:o.id,method:"createContext",lifecycle:"error",ctx:n,error:i}),i}}return n}function X(e,t){const r=new Set,n=[e];for(;n.length>0;){const o=n.pop();if(!o||r.has(o))continue;r.add(o);const i=o.$ref;if(typeof i=="string"){if(t){const l=t[i];if(!l){const d=Object.keys(t).join(", ")||"(none)";throw new Error(`[apigen-logical] $ref "${i}" cannot be resolved. Available $defs: ${d}`)}n.push(l)}continue}const s=o.oneOf;if(Array.isArray(s))for(const l of s)typeof l=="object"&&l!==null&&n.push(l);const a=o.properties;if(a)for(const l of Object.values(a))n.push(l);const f=o.items;if(Array.isArray(f))for(const l of f)typeof l=="object"&&l!==null&&n.push(l);else typeof f=="object"&&f!==null&&n.push(f);const c=o.additionalProperties;typeof c=="object"&&c!==null&&n.push(c);const u=o.propertyNames;typeof u=="object"&&u!==null&&n.push(u)}}const Q=new Set(["string","number","boolean","integer"]);function it(e){if(typeof e!="object"||e===null)return!1;const t=e;if(t.$ref!==void 0||t.oneOf||t.anyOf||t.allOf)return!1;const{type:r}=t;return typeof r=="string"?Q.has(r):Array.isArray(r)?r.every(n=>Q.has(n)||n==="null"):Array.isArray(t.enum)&&t.enum.length>0?t.enum.every(n=>["string","number","boolean"].includes(typeof n)):!1}function st(e){if(!e||typeof e!="object")return!1;const t=e.properties;return t===void 0||typeof t!="object"||t===null?!1:Object.values(t).every(it)}function at(e){const t={},r=n=>{for(const o of["definitions","$defs"]){const i=n[o];if(i)for(const[s,a]of Object.entries(i)){const f=s.startsWith("#/")?s:`#/${o}/${s}`;t[f]=a}}};for(const n of Object.values(e.schemas))r(n.input),r(n.output);if(Object.keys(t).length!==0)for(const[n,o]of Object.entries(e.schemas))try{X(o.input,t),X(o.output,t)}catch(i){throw new Error(`[apigen-core-client] Schema validation failed for function "${n}": ${i.message}`)}}function ct(e,t){const r=['apigen calling convention: all domain parameters go inside a "data" envelope โ€” e.g. { "data": { ... } }'+(t?".":" (an empty object for this zero-parameter tool).")];return e.length>0&&r.push(`Field(s) ${e.map(n=>`"${n}"`).join(", ")} are transport-level envelope metadata, NOT domain data โ€” do not nest them under "data". Over MCP they are read from arguments._meta["x-<pluginId>-<field>"] (default pluginId "adhd"); see @adhd/apigen-engine-naming's envelopeMetaKey/envelopeCliFlag/envelopeEnvVar for the HTTP-header / CLI-flag / env-var equivalents.`),r.join(" ")}function ut(e,t,r){at(e);const n={};for(const[o,i]of Object.entries(e.schemas)){const s=(r==null?void 0:r[o])??{},a=i.input.properties??{},f=i.input.required??[],c={},u=[],l={};for(const h of t)if(h.envelope&&s[h.id]!==!1)for(const[b,Re]of Object.entries(h.envelope))c[b]=Re,l[b]=h.id,u.includes(b)||u.push(b);const d={type:"object",properties:a,additionalProperties:!1,...f.length>0?{required:f}:{}},m=i.safe===!0||st(i.input),p=i.input.definitions,y=i.input.$defs;n[o]={input:{type:"object",properties:{...c,data:d},required:[...u,...f.length>0?["data"]:[]],additionalProperties:!1,description:ct(Object.keys(c),Object.keys(a).length>0),...p?{definitions:p}:{},...y?{$defs:y}:{}},output:i.output,...i.hasCtx?{hasCtx:!0}:{},"x-apigen-safe":m,...Object.keys(l).length>0?{"x-apigen-envelope":l}:{}}}return n}const ft={"decimal.js":"Decimal"};function lt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}Object.entries(ft).map(([e,t])=>({pattern:new RegExp(`import\\(["'][^"']*${lt(e)}[^"']*["']\\)\\.\\w+`,"g"),key:t}));class D extends Error{constructor(t){super(t),this.name="ConfigurationError"}}function Ne(e){for(const t of e)for(const r of Object.keys(t.eventMapping??{})){const[n]=r.split(":");if(n!=="*"&&n===t.id)throw new D(`Middleware "${t.id}" subscribes to its own events via "${r}". This would cause infinite recursion.`)}}function pt(e){const{domainSchemas:t,middlewares:r,overrides:n={},strict:o=!1}=e;Ne(r);for(const c of Object.keys(n))if(!(c in t.schemas)){const u=`Override key "${c}" not found in domain schemas.`;if(o)throw new D(u);console.warn("[apigen-runtime]",u)}const i=new Set(r.map(c=>c.id));for(const[c,u]of Object.entries(n))for(const l of Object.keys(u??{}))if(!i.has(l)){const d=`Override key "${c}.${l}" does not match any declared middleware id.`;if(o)throw new D(d);console.warn("[apigen-runtime]",d)}const s=ut(t,r,n),a=new $e;return Oe(r,a),{schemas:s,createClient:async c=>Ae(r,c,a),dispose:()=>a.clear()}}function dt(e={}){const t=e.level??"info",r=typeof e.destination=="string"&&e.destination.length>0,n=!r&&!!process.stderr.isTTY,o=e.format??(n?"pretty":"json"),i={level:t};if(o==="pretty")return i.transport={target:"pino-pretty",options:{colorize:!r,translateTime:"SYS:HH:MM:ss.l",ignore:"pid,hostname",...r?{destination:e.destination,mkdir:!0}:{destination:2}}},N(i);const s=r?N.destination({dest:e.destination,mkdir:!0,sync:!0}):N.destination(2);return N(i,s)}function je(e){return e?e.type==="array"?`${je(e.items)}[]`:e.enum?"enum":e.$ref?String(e.$ref).split("/").pop()||"object":e.anyOf||e.oneOf?"union":e.type??"object":"unknown"}function Ee(e){var a;const r=(a=((e==null?void 0:e.input)??{}).properties)==null?void 0:a.data,n=(r==null?void 0:r.properties)??{},o=new Set((r==null?void 0:r.required)??[]),i=Object.entries(n).map(([f,c])=>({name:f,type:je(c),required:o.has(f)})),s=i.map(f=>`${f.name}${f.required?"":"?"}: ${f.type}`).join(", ");return{params:i,text:s}}function yt(e){let t;return Array.isArray(e)?t=e:e?t=[e]:t=[],t.find(r=>r==="number"||r==="integer"||r==="boolean")}function mt(e,t){var i,s;const n=((s=(i=((t==null?void 0:t.input)??{}).properties)==null?void 0:i.data)==null?void 0:s.properties)??{},o={...e};for(const[a,f]of Object.entries(n)){const c=o[a];if(typeof c!="string")continue;const u=yt(f==null?void 0:f.type);if(u==="number"||u==="integer"){const l=Number(c);!Number.isNaN(l)&&c.trim()!==""&&(o[a]=l)}else u==="boolean"&&(c==="true"?o[a]=!0:c==="false"&&(o[a]=!1))}return o}const ee=new Set(["default","module.exports","__esModule"]);function ht(e){const t={},r=(n,o)=>{for(const[i,s]of Object.entries(n))if(typeof s=="function"){!ee.has(i)&&!(i in t)&&(t[i]=s);const a=s.name;a&&!(a in t)&&(t[a]=s)}else s&&typeof s=="object"&&o<2&&ee.has(i)&&r(s,o+1)};return r(e,0),t}const gt=["invalid_argument","unauthenticated","permission_denied","not_found","internal"];class E extends Error{constructor(t,r,n){super(r),this.name="ApiError",this.code=t,this.details=n,Object.setPrototypeOf(this,new.target.prototype)}toJSON(){const t={code:this.code,message:this.message};return this.details!==void 0&&(t.details=this.details),t}}function _e(e){return typeof e=="object"&&e!==null&&e.name==="ApiError"&&gt.includes(e.code)&&typeof e.toJSON=="function"}function te(e,t,r=0){return e==="before-first-chunk"?{phase:e,error:t}:{phase:e,error:t,chunksDelivered:r}}const A=new Be({allErrors:!0});qe(A);for(const e of[R,B,x,T,"discriminator"])A.addKeyword({keyword:e,valid:!0});A.addFormat("decimal",/^[+-]?(?:\d+(?:\.\d+)?|\.\d+)$/);function wt(e){return e.map(t=>`${t.instancePath||"(root)"} ${t.message??"failed schema check"}`).join("; ")}function Ce(e,t){const r=de(t),n=[`Validation failed: ${wt(e)}`];return r&&n.push(r),n.join(" โ€” ")}const bt=async(e,t)=>{const r=e.ctx.get(ke);if(r===void 0)return t();const n=e.operation.id,o=r[n];if(o===void 0)return t();const i={data:e.domainArgs,...e.envelope},s=A.compile(o.input);if(!s(i)){const f=s.errors??[];throw new E("invalid_argument",Ce(f,o.input),f)}return t()},ke=Symbol("ValidateSchemasToken");function Se(e){return async function(r,n){const o=r.operation.id,i=e[o];if(i===void 0)return n();const s={data:r.domainArgs,...r.envelope},a=A.compile(i.input);if(!a(s)){const c=a.errors??[];throw new E("invalid_argument",Ce(c,i.input),c)}return n()}}function vt(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=Math.random()*16|0;return(e==="x"?t:t&3|8).toString(16)})}class $t{constructor(t={}){var n,o;this._store=new Map,this._sweeper=null,this._defaultTtlMs=t.defaultTtlMs;let r=null;t.sweepIntervalMs===0?r=null:t.sweepIntervalMs!==void 0?r=t.sweepIntervalMs:this._defaultTtlMs!==void 0?r=Math.max(1e3,Math.floor(this._defaultTtlMs/4)):r=null,r!==null&&r>0&&(this._sweeper=setInterval(()=>this._sweep(),r),(o=(n=this._sweeper).unref)==null||o.call(n))}create(t,r=[],n){const o=new t(...r),i=vt(),s=n??this._defaultTtlMs,a=s!==void 0?Date.now()+s:null;return this._store.set(i,{instance:o,expiresAt:a}),{instanceId:i}}get(t){const r=this._store.get(t);if(!r)throw new Error(`[instance-registry] Unknown instanceId: "${t}"`);if(r.expiresAt!==null&&Date.now()>r.expiresAt)throw this._evict(t,r),new Error(`[instance-registry] Instance "${t}" has expired`);return r.instance}async dispatch(t,r,n=[]){const o=this.get(t),i=o[r];if(typeof i!="function")throw new Error(`[instance-registry] Method "${r}" not found on instance "${t}"`);return i.call(o,...n)}async dispose(t){const r=this._store.get(t);r&&(this._store.delete(t),await k(r.instance))}async disposeAll(){this._sweeper!==null&&(clearInterval(this._sweeper),this._sweeper=null);const t=[...this._store.entries()];this._store.clear(),await Promise.all(t.map(([,r])=>k(r.instance)))}get size(){return this._store.size}_sweep(){const t=Date.now();for(const[r,n]of this._store)n.expiresAt!==null&&t>n.expiresAt&&this._evict(r,n)}_evict(t,r){this._store.delete(t),k(r.instance)}}async function k(e){if(e!==null&&typeof e=="object"&&"dispose"in e){const t=e.dispose;typeof t=="function"&&await t.call(e)}}function Ot(e){const{produce:t,signal:r}=e,n=r??new AbortController().signal;return{[Symbol.asyncIterator](){const o=t(n);return{async next(){return n.aborted?(await o.return(void 0),{done:!0,value:void 0}):o.next()},async return(i){return await o.return(i),{done:!0,value:void 0}},async throw(i){return await o.throw(i),{done:!0,value:void 0}}}}}}async function At(e){const t=[];for await(const r of e)t.push(r);return t}async function Ie(e){const t=[];try{for await(const r of e)t.push(r);return{ok:!0,chunks:t}}catch(r){const n=_e(r)?r:new E("internal",r instanceof Error?r.message:String(r));return t.length===0?{ok:!1,carrier:te("before-first-chunk",n)}:{ok:!1,carrier:te("after-first-chunk",n,t.length)}}}function xe(e){return e!==null&&typeof e=="object"&&Symbol.asyncIterator in e}class g extends Error{constructor(t,r){super(r),this.name="UnionCodecError",this.code=t}}function S(e){const t=e.discriminator;if(t===null||typeof t!="object"||Array.isArray(t))return;const r=t;if(typeof r.propertyName!="string")return;const n=r.mapping;if(!(n===null||typeof n!="object"||Array.isArray(n)))return{propertyName:r.propertyName,mapping:n}}function Te(e,t){const r=e[B];if(typeof r=="string"){const n=t.registry.get(r);if(n)return n}return t.registry.resolve(e)}function Nt(e,t,r){const n=Te(t,r);return n?n.encode(e,t,r):e}function jt(e,t,r){const n=Te(t,r);return n?n.decode(e,t,r):e}function Me(e){const{id:t,schema:r}=e;return{id:t,kind:"union",schema:r,matches(n){if(n[R]==="union")return!0;const o=n.oneOf;return!Array.isArray(o)||o.length===0?!1:S(n)!==void 0},encode(n,o,i){const s=S(o);if(!s)throw new g("E_UNION_NO_DISCRIMINATOR",`[${t}] schema node at "${i.path}" has no discriminator.propertyName; cannot dispatch union branch.`);const{propertyName:a,mapping:f}=s,c=n[a];if(c==null)throw new g("E_UNION_NO_DISCRIMINATOR",`[${t}] value at "${i.path}" is missing the discriminator property "${a}".`);const u=String(c),l=f[u];if(!l)throw new g("E_UNION_UNKNOWN_TAG",`[${t}] discriminator tag "${u}" at "${i.path}" is not in the mapping (known: ${Object.keys(f).join(", ")}).`);const d=i.resolve(l);return Nt(n,d,{...i,path:`${i.path}[${u}]`})},decode(n,o,i){if(n===null||typeof n!="object"||Array.isArray(n)){let p;throw n===null?p="null":Array.isArray(n)?p="array":p=typeof n,new g("E_UNION_INVALID_WIRE",`[${t}] expected a JSON object on the wire at "${i.path}", got ${p}.`)}const s=n,a=S(o);if(!a)throw new g("E_UNION_NO_DISCRIMINATOR",`[${t}] schema node at "${i.path}" has no discriminator.propertyName; cannot dispatch union branch.`);const{propertyName:f,mapping:c}=a,u=s[f];if(u==null)throw new g("E_UNION_NO_DISCRIMINATOR",`[${t}] wire object at "${i.path}" is missing the discriminator property "${f}".`);const l=String(u),d=c[l];if(!d)throw new g("E_UNION_UNKNOWN_TAG",`[${t}] discriminator tag "${l}" on the wire at "${i.path}" is not in the mapping (known: ${Object.keys(c).join(", ")}).`);const m=i.resolve(d);return jt(n,m,{...i,path:`${i.path}[${l}]`})}}}const Et="x-apigen-instances";class j extends Error{constructor(t,r){super(r),this.name="NominalCodecError",this.code=t}}function re(e){const t=e.properties;return t&&typeof t=="object"&&!Array.isArray(t)?t:{}}function _t(e){const t=e.required;return Array.isArray(t)?t.filter(r=>typeof r=="string"):[]}function ne(e,t,r){if(t){const n=r.registry.resolve(t);if(n)return n.encode(e,t,r)}return e}function Ct(e,t,r){if(t){const n=r.registry.resolve(t);if(n)return n.decode(e,t,r)}return e}function kt(e){const{id:t,schema:r,ctor:n}=e;return{id:t,kind:"nominal",schema:r,matches(o){return o[R]==="nominal"?!0:o[B]===t},encode(o,i,s){if(o===null||typeof o!="object")return o;if(s.seen.has(o)){if(s.mode==="strict")throw new j("E_NOMINAL_CYCLE",`[${t}] cycle detected at "${s.path}": a nominal instance references itself. Strict mode rejects cycles (DESIGN ยง8.3); break the cycle or use 'lossy' mode.`);return null}s.seen.add(o);try{const a=re(i),f=typeof i[T]=="string"?i[T]:"toJSON",c=o[f];if(typeof c=="function"){const p=c.call(o);if(p!==null&&typeof p=="object"&&!Array.isArray(p)){const y={};for(const[h,b]of Object.entries(p))y[h]=ne(b,a[h],{...s,path:`${s.path}/${h}`});return y}return p}const u={},l=Object.keys(a),d=o,m=l.length>0?l:Object.keys(d);for(const p of m){const y=d[p];y!==void 0&&(u[p]=ne(y,a[p],{...s,path:`${s.path}/${p}`}))}return u}finally{s.seen.delete(o)}},decode(o,i,s){if(o===null||typeof o!="object"||Array.isArray(o)){let u;throw o===null?u="null":Array.isArray(o)?u="array":u=typeof o,new j("E_NOMINAL_INVALID_WIRE",`[${t}] expected a JSON object on the wire at "${s.path}", got ${u}.`)}const a=o;for(const u of _t(i))if(!(u in a))throw new j("E_NOMINAL_INVALID_WIRE",`[${t}] required field "${u}" missing on the wire at "${s.path}".`);if(i[Et]===!1)throw new j("E_NOMINAL_NONRECONSTRUCTABLE",`[${t}] is encode-only: the extractor marked it non-reconstructable (x-apigen-instances:false). It cannot be decoded back to a live instance.`);const f=re(i),c={};for(const[u,l]of Object.entries(a))c[u]=Ct(l,f[u],{...s,path:`${s.path}/${u}`});if(n){const u=typeof i[x]=="string"?i[x]:"fromJSON",l=n[u];if(typeof l=="function")return l.call(n,c);const d=n;return new d(c)}return c}}}const Pe=[q,F,H,K,W,z],St={type:"object","x-apigen-logical":"nominal","x-apigen-codec":"ts.NominalSentinel"},oe=kt({id:"ts.NominalSentinel",schema:St}),It={oneOf:[],discriminator:{propertyName:"kind",mapping:{}},"x-apigen-logical":"union","x-apigen-codec":"ts.UnionSentinel"},ie=Me({id:"ts.UnionSentinel",schema:It});function xt(){const e=[...Pe.map(t=>[t.id,t]),[oe.id,oe],[ie.id,ie]];return Object.freeze(new Map(e))}const Tt=Object.freeze({host:"ts",logicalTypeVersion:He,codecs:xt()});function Mt(e,t,r){var s;const n=typeof((s=t==null?void 0:t.input)==null?void 0:s.description)=="string"?t.input.description:void 0,o=de(t==null?void 0:t.input),i=[r,n,o].filter(a=>typeof a=="string"&&a.length>0);return i.length>0?i.join(" โ€” "):e}function Pt(e){if(!e||typeof e!="object"||Array.isArray(e)||Object.keys(e).length===0)return{outputSchema:void 0,wrapped:!1};const t=e;return t.type==="object"?{outputSchema:t,wrapped:!1}:{outputSchema:{type:"object",properties:{result:t},required:["result"]},wrapped:!0}}function Ut(e,t){return e?{result:t}:t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}const Ue=4,De=32;function L(e){return _e(e)?e:e instanceof Error?new E("internal",e.message):e}function Dt(e,t){if(e==="serial"||e==="chained")return 1;const r=t??Ue;return!Number.isFinite(r)||r<1?1:Math.min(Math.floor(r),De)}function Lt(){}function Rt(e,t){var i;if(!e&&!t)return{signal:void 0,dispose:Lt};const r=new AbortController,n=()=>{r.abort(e==null?void 0:e.reason)};e&&(e.aborted?r.abort(e.reason):e.addEventListener("abort",n,{once:!0}));let o;return t!==void 0&&!r.signal.aborted&&(o=setTimeout(()=>{r.abort(new DOMException(`apigen/invokeBatch: item timed out after ${t}ms`,"TimeoutError"))},t),(i=o.unref)==null||i.call(o)),{signal:r.signal,dispose(){e&&e.removeEventListener("abort",n),o&&clearTimeout(o)}}}async function se(e,t,r,n,o,i){const s=Rt(n.signal,i);try{const a=s.signal?{...n,signal:s.signal}:n,f=await e(t,a,o);if(xe(f)){const c=await Ie(f);if(c.ok)return{index:r,status:"fulfilled",chunks:c.chunks};const u=c.carrier;return{index:r,status:"rejected",reason:L(u.error),...u.phase==="after-first-chunk"?{chunksDelivered:u.chunksDelivered}:{}}}return{index:r,status:"fulfilled",value:f}}catch(a){return{index:r,status:"rejected",reason:L(a)}}finally{s.dispose()}}async function Bt(e,t,r,n,o={}){const i=o.mode??"parallel",s=o.onItemError??"continue",a=Dt(i,o.concurrency),f=new Array(r.length),c=p=>({index:p,status:"rejected",reason:L(new Error("apigen/invokeBatch: not attempted โ€” an earlier item failed and "+(i==="chained"?'mode is "chained"':'onItemError is "abort"')))});if(i==="serial"||i==="chained"){let p=!1;for(let y=0;y<r.length;y++){if(p){f[y]=c(y);continue}const h=await se(e,t,y,r[y],n,o.itemTimeoutMs);f[y]=h,h.status==="rejected"&&(i==="chained"||s==="abort")&&(p=!0)}return f}let u=0,l=!1;const d=Math.max(1,Math.min(a,r.length)),m=Array.from({length:d},async()=>{for(;;){const p=u++;if(p>=r.length)return;if(l){f[p]=c(p);continue}const y=await se(e,t,p,r[p],n,o.itemTimeoutMs);f[p]=y,y.status==="rejected"&&s==="abort"&&(l=!0)}});return await Promise.all(m),f}const ae=new Set(["string","number","boolean","integer"]);function qt(e){if(typeof e!="object"||e===null)return!1;const t=e;if(t.$ref!==void 0||t.oneOf||t.anyOf||t.allOf)return!1;const{type:r}=t;return typeof r=="string"?ae.has(r):Array.isArray(r)?r.every(n=>ae.has(n)||n==="null"):Array.isArray(t.enum)&&t.enum.length>0?t.enum.every(n=>["string","number","boolean"].includes(typeof n)):!1}function Ft(e){if(!e||typeof e!="object")return!1;const t=e.properties;return t===void 0||typeof t!="object"||t===null?!1:Object.values(t).every(qt)}const Ht={"decimal.js":"Decimal"};function Kt(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}Object.entries(Ht).map(([e,t])=>({pattern:new RegExp(`import\\(["'][^"']*${Kt(e)}[^"']*["']\\)\\.\\w+`,"g"),key:t}));function ce(e){return e.words.join("-")}function ue(e){return e.words.map(Yt).join("")}function fe(e){return e.words.join("_")}function Wt(e,t={}){var r,n;const o=[e.namespace,...e.path],i=e.safe||Ft(e.input)?"GET":"POST",s=((n=(r=t.http)==null?void 0:r.verb)==null?void 0:n[e.id])??i,a="/"+o.map(m=>ce(m)).join("/"),f=o.map(m=>fe(m)).join("_"),c=o.map(m=>fe(m)).slice(0,-1).join("."),u=ue(o[o.length-2]??o[0]),l=ue(o[o.length-1]),d=o.map(m=>ce(m));return{http:{verb:s,route:a},mcp:{name:f},grpc:{package:c,service:u,method:l},cli:{path:d}}}function zt(e,t){return`x-${e}-${t}`}function Vt(e,t){return`--${e}-${t}`}function Jt(e,t){const r=n=>n.toUpperCase().replace(/-/g,"_");return e==="adhd"?`APIGEN_${r(t)}`:`APIGEN_${r(e)}_${r(t)}`}function Yt(e){return e.length===0?e:e[0].toUpperCase()+e.slice(1)}function V(e){return e.anyOf??e.oneOf}function Gt(e){if(!e)return!1;if(e.type==="array"||e.type==="object")return!0;const t=V(e);if(t){const r=t.filter(n=>n.type!=="null");return r.length>0&&r.every(n=>n.type==="array"||n.type==="object")}return!1}function Zt(e){if(!e)return!1;if(e.type==="boolean")return!0;const t=V(e);if(t){const r=t.filter(n=>n.type!=="null");return r.length>0&&r.every(n=>n.type==="boolean")}return!1}function Xt(e){if(!e)return!1;if(e.type==="number"||e.type==="integer")return!0;const t=V(e);if(t){const r=t.filter(n=>n.type!=="null");return r.length>0&&r.every(n=>n.type==="number"||n.type==="integer")}return!1}function Qt(e){return e.replace(/[A-Z]/g,t=>"-"+t.toLowerCase())}function er(e){var o,i;const t=(i=(o=e.input)==null?void 0:o.properties)==null?void 0:i.data,r=(t==null?void 0:t.properties)??{},n=(t==null?void 0:t.required)??[];return{props:r,required:n}}function le(e){return typeof e.handler=="function"}function tr(e){var o;const t=((o=e.input)==null?void 0:o.properties)??{},r=e["x-apigen-envelope"],n=[];for(const i of Object.keys(t)){if(i==="data")continue;const s=(r==null?void 0:r[i])??"adhd",a=zt(s,i);n.push({field:i,pluginId:s,httpHeader:a,mcpMetaKey:a,cliFlag:Vt(s,i),envVar:Jt(s,i)})}return n}function rr(e,t){const r=new Map,{props:n}=er(e);for(const[o,i]of Object.entries(n)){let s="string";Zt(i)?s="boolean":(Gt(i)||Xt(i))&&(s="json"),r.set(Qt(o),{camelKey:o,kind:"domain",valueKind:s})}for(const o of t){const i=o.cliFlag.replace(/^--/,"");r.set(i,{camelKey:o.field,kind:"envelope",valueKind:"string",envVar:o.envVar})}return r}function nr(e){const{op:t,schema:r,transport:n,projection:o}=e,i=Wt(t,o),s=r?tr(r):[],a=r?rr(r,s):new Map,f=r?Ee(r).params:void 0,c={op:t,transport:n,http:i.http,mcp:i.mcp,cli:i.cli,grpc:i.grpc,params:f,envelope:s,cliFlags:a,streaming:t.streaming,isMount:le(t)};if(le(t)){const u=t.handler;c.mountHandler=async l=>u(l)}return c}function or(e){const t=e.usePlugins;return Array.isArray(t)?t:[]}function ir(e){const t=e.useOptions;return t&&typeof t=="object"?t:{}}function Le(e){return async function(r,n){const o=Object.assign(r,{data:r.domainArgs});return await e.layer(o,n)}}function sr(e,t){var n;const r=[];for(const o of t){const i=(n=o.capabilities)==null?void 0:n.layer;i&&r.push(Le(i))}return r.push(Se(e)),ve(r)}function ar(){const e=new Map;return{get:t=>e.get(t),set:(t,r)=>{e.set(t,r)}}}const cr={input:{type:"object",properties:{data:{type:"object",properties:{}}}},output:{}};async function ur(e,t,r,n){const o={...r,operation:{id:e.op.id},ctx:new be};if(e.isMount){const i=e.mountHandler;if(!i)throw new Error(`apigen-engine-runtime/dispatchForPlan: OpPlan for mount op "${e.op.id}" has isMount=true but no mountHandler`);const s={operation:e.op,data:r.domainArgs,envelope:r.envelope,ctx:ar(),transport:e.transport,signal:r.signal??new AbortController().signal},a={...n,fns:{[e.op.id]:()=>i(s)},schemas:{[e.op.id]:cr}};return t(e.op.id,o,a)}return t(e.op.id,o,n)}exports.BATCH_DEFAULT_CONCURRENCY=Ue;exports.BATCH_MAX_CONCURRENCY=De;exports.EventBus=$e;exports.InstanceRegistry=$t;exports.LayerContext=be;exports.UnionCodecError=g;exports.ValidateSchemasToken=ke;exports.WELL_KNOWN_TS_CODECS=Pe;exports.adaptCoreLayer=Le;exports.assertNoSelfSubscription=Ne;exports.buildContext=Ae;exports.buildFnTable=ht;exports.buildMcpOutputSchema=Pt;exports.buildOpPlan=nr;exports.buildToolDescription=Mt;exports.coerceQueryParams=mt;exports.collectWithPhase=Ie;exports.createApiPackage=pt;exports.createInvoker=ve;exports.createLogger=dt;exports.createPackageInvoker=sr;exports.createStream=Ot;exports.createUnionCodec=Me;exports.dataParamNames=ge;exports.defineMiddleware=nt;exports.describeParams=Ee;exports.dispatch=we;exports.dispatchForPlan=ur;exports.drainStream=At;exports.invokeBatch=Bt;exports.isApiStream=xe;exports.makeValidateLayer=Se;exports.needsEnvelopeField=he;exports.readUseOptions=ir;exports.readUsePlugins=or;exports.tsHostBinding=Tt;exports.validateLayer=bt;exports.wireObservers=Oe;exports.wrapMcpStructuredContent=Ut;