@adhd/apigen-core-client 0.1.5 โ 0.2.1
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 +16 -0
- package/README.md +28 -2
- package/index.d.ts +4 -1
- package/index.js +1 -1
- package/index.mjs +723 -575
- package/lib/batch.d.ts +89 -0
- package/lib/plugin.d.ts +99 -5
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,19 @@
|
|
|
1
|
+
## 0.2.1 (2026-07-28)
|
|
2
|
+
|
|
3
|
+
This was a version bump only for apigen-core-client to align it with other projects, there were no code changes.
|
|
4
|
+
|
|
5
|
+
## 0.1.6 (2026-07-27)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### ๐ Features
|
|
9
|
+
|
|
10
|
+
- **apigen:** batch/bulk fan-out plugin โ `groupBatchableOperationsByKind()`, `buildBatchKindSchema()`, `buildBatchMountedOperations()` for discriminated `_batch/<kind>` mounts
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### โค๏ธ Thank You
|
|
14
|
+
|
|
15
|
+
- pseudosky
|
|
16
|
+
|
|
1
17
|
## 0.1.5 (2026-07-25)
|
|
2
18
|
|
|
3
19
|
|
package/README.md
CHANGED
|
@@ -387,6 +387,29 @@ try {
|
|
|
387
387
|
|
|
388
388
|
**Important:** Do **not** parallelize `buildSchema` loops โ the work is synchronous CPU under an async signature, and morph-walk mutates the shared SourceFile, so `Promise.all` gains nothing and can race.
|
|
389
389
|
|
|
390
|
+
### Mount capability: Synthetic operations and batch fan-out
|
|
391
|
+
|
|
392
|
+
Mount plugins add synthetic operations to your server โ both simple mounts like `GET /_meta/health` and complex features like batch bulk fan-out. The batch plugin demonstrates the pattern:
|
|
393
|
+
|
|
394
|
+
```ts
|
|
395
|
+
import { buildBatchMountedOperations } from '@adhd/apigen-core-client';
|
|
396
|
+
|
|
397
|
+
// Derive one _batch/<kind> mount per distinct operation kind
|
|
398
|
+
const batchMounts = buildBatchMountedOperations(descriptor, { exclude: ['catalog/delete'] });
|
|
399
|
+
// => [
|
|
400
|
+
// { id: '_batch/query', kind: 'query', input: { oneOf: [...] }, output: { ... } },
|
|
401
|
+
// { id: '_batch/action', kind: 'action', input: { oneOf: [...] }, output: { ... } }
|
|
402
|
+
// ]
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
The batch feature provides:
|
|
406
|
+
- `groupBatchableOperationsByKind()` โ group operations by kind (query vs. action)
|
|
407
|
+
- `buildBatchKindSchema()` โ build discriminated-union input/output schemas for one kind
|
|
408
|
+
- `buildBatchMountedOperations()` โ emit one synthetic mount per distinct kind
|
|
409
|
+
- `syntheticOp()` โ shared helper to build synthetic operation shapes
|
|
410
|
+
|
|
411
|
+
See [apigen-plugin-batch](../../packages/apigen/apigen-plugin-batch) for the host-specific wiring.
|
|
412
|
+
|
|
390
413
|
### v2 Plugin Capability Interface
|
|
391
414
|
|
|
392
415
|
The `Plugin` interface (SPEC ยง7.1) declares four orthogonal capabilities โ a plugin implements only what it needs:
|
|
@@ -395,9 +418,11 @@ The `Plugin` interface (SPEC ยง7.1) declares four orthogonal capabilities โ a
|
|
|
395
418
|
|-----------|---------|---------|
|
|
396
419
|
| `target` | Project descriptor to transport/format (codegen) or host functions in-process (serve) | MCP server, Fastify HTTP server, proto client |
|
|
397
420
|
| `layer` | Wrap all operations in the onion (middleware) | Logger, auth, rate-limiting |
|
|
398
|
-
| `mount` | Add synthetic operations | `/meta/openapi`, `/meta/health
|
|
421
|
+
| `mount` | Add synthetic operations | `/meta/openapi`, `/meta/health`, batch fan-out |
|
|
399
422
|
| `envelope` | Declare transport-agnostic side-channel fields (request/response headers, metadata) | Session tokens, request IDs |
|
|
400
423
|
|
|
424
|
+
The `MountCapability.operations()` method receives an optional `hostBridge` parameter carrying the actual invoker and option schemas โ enabling mounts like batch to route directly to real operations without a separate dispatch layer.
|
|
425
|
+
|
|
401
426
|
```ts
|
|
402
427
|
import type { Plugin } from '@adhd/apigen-core-client';
|
|
403
428
|
|
|
@@ -468,10 +493,11 @@ Recognized extensions: `.ts/.tsx/.mts/.cts` โ `ts`, `.py` โ `py`, `.rs` โ
|
|
|
468
493
|
|--------|---------|-------------|
|
|
469
494
|
| [Extract](./docs/reference/extract.md) | v2 symbol-based extraction | `extract()`, `tokenize()`, `ExtractOptions` |
|
|
470
495
|
| [Schemas](./docs/reference/schemas.md) | Schema generation & composition | `generateSchemas()`, `composeSchemas()`, `GenerateSchemasOptions`, `ComposedSchemas` |
|
|
471
|
-
| [Plugin](./docs/reference/plugin.md) | v1 & v2 Plugin contracts | `Plugin`, `OutputPlugin`, `TargetCapability`, `LayerCapability`, `MountCapability`, `EnvelopeCapability` |
|
|
496
|
+
| [Plugin](./docs/reference/plugin.md) | v1 & v2 Plugin contracts | `Plugin`, `OutputPlugin`, `TargetCapability`, `LayerCapability`, `MountCapability`, `EnvelopeCapability`, `syntheticOp()` |
|
|
472
497
|
| [Extraction Session](./docs/reference/session.md) | Per-run caching | `createExtractionSession()`, `clearPersistentProjectCache()`, `ExtractionSession` |
|
|
473
498
|
| [Extract Classes](./docs/reference/extract-classes.md) | Class export extraction | `extractClasses()`, `ExtractClassesOptions` |
|
|
474
499
|
| [Source Language](./docs/reference/source-language.md) | Polyglot file routing | `languageOfSource()`, `sourcesForPlugin()`, `pluginConsumesSource()` |
|
|
500
|
+
| [Batch Fan-Out](./docs/reference/batch.md) | Bulk operation dispatch schemas | `groupBatchableOperationsByKind()`, `buildBatchKindSchema()`, `buildBatchMountedOperations()`, `BatchMountOptions`, `BatchKindSchema`, `BatchKindOperation` |
|
|
475
501
|
| [Descriptor](./docs/reference/descriptor.md) | Canonical types | `Operation`, `Segment`, `JSONSchema`, `TypeText`, `OperationKind` |
|
|
476
502
|
|
|
477
503
|
## How-To Guides
|
package/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export type { GeneratedSchemas, ComposedSchemas, ExportMode, PluginInput, PluginOutput, RunInput, OutputPlugin, PluginLanguage, } from './lib/types';
|
|
2
2
|
export type { Operation, OperationKind, Segment, TypeText, JSONSchema, ApigenSchemaHints, } from './lib/descriptor';
|
|
3
|
-
export type { Plugin, TargetCapability, LayerCapability, MountCapability, MountedOperation, EnvelopeCapability, Call, Next, Result, Chunk, Transport, Extensions, Descriptor, Harness, Server, File, } from './lib/plugin';
|
|
3
|
+
export type { Plugin, TargetCapability, LayerCapability, MountCapability, MountedOperation, MountHostBridge, MountHostBridgeInvokeOptions, EnvelopeCapability, Call, Next, Result, Chunk, Transport, Extensions, Descriptor, Harness, Server, File, SyntheticOpFields, } from './lib/plugin';
|
|
4
|
+
export { syntheticOp } from './lib/plugin';
|
|
4
5
|
export type { Logger } from 'pino';
|
|
5
6
|
export { createExtractionSession, clearPersistentProjectCache, } from './lib/extraction-session';
|
|
6
7
|
export type { ExtractionSession, ISessionStats, } from './lib/extraction-session';
|
|
@@ -12,3 +13,5 @@ export { extractClasses } from './lib/extract-classes';
|
|
|
12
13
|
export type { ExtractClassesOptions } from './lib/extract-classes';
|
|
13
14
|
export { languageOfSource, pluginConsumesSource, sourcesForPlugin, effectiveLanguage, } from './lib/source-language';
|
|
14
15
|
export type { LanguageAwarePlugin } from './lib/source-language';
|
|
16
|
+
export { deriveBatchOperationBranch, groupBatchableOperationsByKind, buildBatchKindSchema, buildBatchMountedOperations, } from './lib/batch';
|
|
17
|
+
export type { BatchMountOptions, BatchOperationBranch, BatchKindSchema, BatchKindOperation, } from './lib/batch';
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Ne=Object.create;var oe=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var ke=Object.getOwnPropertyNames;var Ee=Object.getPrototypeOf,Ce=Object.prototype.hasOwnProperty;var Ie=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ke(t))!Ce.call(e,r)&&r!==n&&oe(e,r,{get:()=>t[r],enumerable:!(o=Oe(t,r))||o.enumerable});return e};var Fe=(e,t,n)=>(n=e!=null?Ne(Ee(e)):{},Ie(t||!e||!e.__esModule?oe(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const I=require("ts-morph"),Le=require("node:fs"),W=require("node:path"),C=require("ts-json-schema-generator");function Re(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const _e=Re(W),pe=Symbol.for("adhd.apigen.extraction-session");function ge(e,t){const n=[...e.getImportDeclarations().map(o=>o.getModuleSpecifierSourceFile()),...e.getExportDeclarations().map(o=>o.getModuleSpecifierSourceFile())];for(const o of n){if(!o)continue;const r=o.getFilePath();if(!r.includes("/node_modules/")&&!t.has(r)){t.add(r);try{o.refreshFromFileSystemSync()}catch{}ge(o,t)}}}function me(e){try{const t=Le.statSync(e);return`${t.mtimeMs}:${t.size}`}catch{return"nostat"}}const R=new Map,Z=new Map;function Me(e,t,n){const o=t??"",r=R.get(o);let i=n;if(r&&r.fileVersions.size>0){const c=[n],f=[...r.fileVersions.entries()].sort(([u],[l])=>u.localeCompare(l));for(const[u,l]of f)u!==e&&c.push(`${u}:${l}`);i=c.join("|")}const s=`${e}\0${t??""}`;let a=Z.get(s);return(!a||a.version!==i)&&(a={version:i,schemas:new Map},Z.set(s,a)),a.schemas}function Ve(){R.clear(),Z.clear()}function ee(){const e={projectsBuilt:0,generatorsBuilt:0,schemaCacheHits:0,schemaCacheMisses:0},t=new Map;let n=!1;return{[pe]:!0,stats:e,schemaCache:new Map,aliasCache:new WeakMap,zodImportCache:new WeakMap,generatorCache:new Map,projectFor(r){if(n)throw new Error("apigen-core: ExtractionSession used after dispose()");const i=r??"",s=r?this.statVersion(r):"";let a=R.get(i);return a&&a.tsconfigVersion!==s&&(a=void 0),a||(a={project:r?new I.Project({tsConfigFilePath:r,skipAddingFilesFromTsConfig:!0}):new I.Project({skipAddingFilesFromTsConfig:!0}),tsconfigVersion:s,fileVersions:new Map},R.set(i,a),e.projectsBuilt++),a.project},sourceFileFor(r,i){const s=this.projectFor(i),a=R.get(i??""),c=this.statVersion(r);let f=s.getSourceFile(r);if(f===void 0?f=s.addSourceFileAtPath(r):a&&a.fileVersions.get(r)!==c&&f.refreshFromFileSystemSync(),a==null||a.fileVersions.set(r,c),a){const u=new Set([r]);ge(f,u);for(const l of u)l!==r&&a.fileVersions.set(l,this.statVersion(l))}return f},statVersion(r){let i=t.get(r);return i===void 0&&(i=me(r),t.set(r,i)),i},dispose(){n=!0,this.schemaCache.clear(),this.generatorCache.clear(),t.clear()}}}function de(e){const t=e;if(t[pe]!==!0)throw new Error("apigen-core: unknown ExtractionSession implementation โ create sessions with createExtractionSession()");return t}const K="x-apigen-logical";function ie(e,t){const n=new Set,o=[e];for(;o.length>0;){const r=o.pop();if(!r||n.has(r))continue;n.add(r);const i=r.$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}`)}o.push(l)}continue}const s=r.oneOf;if(Array.isArray(s))for(const l of s)typeof l=="object"&&l!==null&&o.push(l);const a=r.properties;if(a)for(const l of Object.values(a))o.push(l);const c=r.items;if(Array.isArray(c))for(const l of c)typeof l=="object"&&l!==null&&o.push(l);else typeof c=="object"&&c!==null&&o.push(c);const f=r.additionalProperties;typeof f=="object"&&f!==null&&o.push(f);const u=r.propertyNames;typeof u=="object"&&u!==null&&o.push(u)}}const se=new Set(["string","number","boolean","integer"]);function ze(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:n}=t;return typeof n=="string"?se.has(n):Array.isArray(n)?n.every(o=>se.has(o)||o==="null"):Array.isArray(t.enum)&&t.enum.length>0?t.enum.every(o=>["string","number","boolean"].includes(typeof o)):!1}function ye(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(ze)}function qe(e){var n,o;const t=[];for(const r of e){const i={...(n=r.capabilities.layer)==null?void 0:n.envelopeFields,...(o=r.capabilities.envelope)==null?void 0:o.request};Object.keys(i).length>0&&t.push({id:r.id,envelope:i})}return t}function De(e){const t={},n=o=>{for(const r of["definitions","$defs"]){const i=o[r];if(i)for(const[s,a]of Object.entries(i)){const c=s.startsWith("#/")?s:`#/${r}/${s}`;t[c]=a}}};for(const o of Object.values(e.schemas))n(o.input),n(o.output);if(Object.keys(t).length!==0)for(const[o,r]of Object.entries(e.schemas))try{ie(r.input,t),ie(r.output,t)}catch(i){throw new Error(`[apigen-core-client] Schema validation failed for function "${o}": ${i.message}`)}}function Ke(e,t){const n=['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&&n.push(`Field(s) ${e.map(o=>`"${o}"`).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.`),n.join(" ")}function We(e,t,n){De(e);const o={};for(const[r,i]of Object.entries(e.schemas)){const s=(n==null?void 0:n[r])??{},a=i.input.properties??{},c=i.input.required??[],f={},u=[],l={};for(const T of t)if(T.envelope&&s[T.id]!==!1)for(const[d,y]of Object.entries(T.envelope))f[d]=y,l[d]=T.id,u.includes(d)||u.push(d);const p={type:"object",properties:a,additionalProperties:!1,...c.length>0?{required:c}:{}},S=i.safe===!0||ye(i.input),h=i.input.definitions,g=i.input.$defs;o[r]={input:{type:"object",properties:{...f,data:p},required:[...u,...c.length>0?["data"]:[]],additionalProperties:!1,description:Ke(Object.keys(f),Object.keys(a).length>0),...h?{definitions:h}:{},...g?{$defs:g}:{}},output:i.output,...i.hasCtx?{hasCtx:!0}:{},"x-apigen-safe":S,...Object.keys(l).length>0?{"x-apigen-envelope":l}:{}}}return o}const Be=8;function Ue(e,t){try{return t?e.getText(t):e.getText()}catch{try{return e.getText()}catch{return}}}let Ge=0;async function He(e,t,n,o){const r=`__ApigenProbe_${process.pid}_${Ge++}`;let i;try{i=t.addTypeAlias({name:r,type:n});const s=i.getType();return await o(s)}catch{return}finally{try{i==null||i.remove()}catch{}}}async function he(e,t,n){if(n>Be)return{};if(e.isString()||e.isStringLiteral())return e.isStringLiteral()?{type:"string",enum:[e.getLiteralValue()]}:{type:"string"};if(e.isNumber()||e.isNumberLiteral())return e.isNumberLiteral()?{type:"number",enum:[e.getLiteralValue()]}:{type:"number"};if(e.isBoolean())return{type:"boolean"};if(e.isBooleanLiteral())return{type:"boolean"};if(e.isNull()||e.isUndefined()||e.isVoid())return{type:"null"};if(e.isUnion()){const o=e.getUnionTypes();if(o.every(c=>c.isStringLiteral())&&o.length>0)return{type:"string",enum:o.map(c=>c.getLiteralValue())};if(o.every(c=>c.isNumberLiteral())&&o.length>0)return{type:"number",enum:o.map(c=>c.getLiteralValue())};const s=await Promise.all(o.map(c=>he(c,t,n+1))),a=te(s);return{oneOf:s,...a?{discriminator:a}:{},[K]:"union"}}if(e.isArray()){const o=e.getArrayElementType();return{type:"array",items:o?await t(o.getText()):{}}}if(e.isTuple()){const o=e.getTupleElements(),r=await Promise.all(o.map(i=>t(i.getText())));return{type:"array",items:r,minItems:r.length,maxItems:r.length}}if(e.isObject()){const o=e.getStringIndexType(),r=e.getNumberIndexType(),i=o??r,s=e.getProperties();if(i&&s.length===0)return{type:"object",additionalProperties:await t(i.getText())};const a={};for(const c of s){const f=c.getName(),l=c.getDeclarations()[0];let p;if(l)try{p=c.getTypeAtLocation(l)}catch{p=void 0}if(p!==void 0&&p.getCallSignatures().length>0)continue;const S=p!==void 0?Ue(p,l):void 0;a[f]=S!==void 0?await t(S):{}}return Object.keys(a).length>0?{type:"object",properties:a}:{}}return{}}function te(e){if(e.length<2)return;const t=[];for(const o of e){if(o.type!=="object")return;const r=o.properties;if(!r||typeof r!="object")return;t.push(r)}const n=Object.keys(t[0]).filter(o=>t.every(r=>Object.prototype.hasOwnProperty.call(r,o)));for(const o of n){const r=[];let i=!0;for(const a of t){const c=a[o],f=c&&(c.type==="string"||c.type==="number"),u=c==null?void 0:c.enum;if(!f||!Array.isArray(u)||u.length!==1){i=!1;break}r.push(String(u[0]))}if(!i||new Set(r).size!==r.length)continue;const s={};return r.forEach((a,c)=>{s[a]=`#/oneOf/${c}`}),{propertyName:o,mapping:s}}}function q(e,t,n){if(t>6)return{};const o=e.trim();if(o==="string")return{type:"string"};if(o==="number")return{type:"number"};if(o==="boolean")return{type:"boolean"};if(o==="null")return{type:"null"};if(o==="undefined")return{type:"null"};const r=J[o];if(r!==void 0)return r;if(n!=null&&n.size){const i=n.get(o);if(i!==void 0){const s=J[i];if(s!==void 0)return s}}if(o.endsWith("[]"))return{type:"array",items:q(o.slice(0,-2),t+1,n)};if(o.includes("|")){const i=o.split("|").map(c=>c.trim());if(i.every(c=>c.startsWith("'")))return{type:"string",enum:i.map(c=>c.replace(/'/g,""))};const s=i.map(c=>q(c,t+1,n)),a=te(s);return{oneOf:s,...a?{discriminator:a}:{},[K]:"union"}}if(o.startsWith("{")&&o.endsWith("}")){const i=o.slice(1,-1).trim(),s={};for(const a of i.split(";").filter(Boolean)){const[c,f]=a.split(":").map(u=>u.trim());c&&f&&(s[c.replace("?","")]=q(f,t+1,n))}return{type:"object",properties:s}}return{}}function Te(e){const t=[];let n=0,o=0;for(let i=0;i<e.length;i++){const s=e[i];s==="<"||s==="["||s==="{"||s==="("?n++:s===">"||s==="]"||s==="}"||s===")"?n--:s===","&&n===0&&(t.push(e.slice(o,i).trim()),o=i+1)}const r=e.slice(o).trim();return r.length>0&&t.push(r),t}function Ze(e){const t=/^(?:Readonly)?Map<(.+)>$/.exec(e);return t?t[1]:void 0}function Je(e){const t=/^(?:Readonly)?Set<(.+)>$/.exec(e);return t?t[1]:void 0}function Qe(e){let t=e.trim();if(t.startsWith("readonly ")&&(t=t.slice(9).trim()),!t.startsWith("[")||!t.endsWith("]"))return;const n=t.slice(1,-1).trim();if(n.length!==0)return Te(n)}async function Xe(e,t){const n=e.trim(),o=Ze(n);if(o!==void 0){const s=Te(o);if(s.length===2){const[a,c]=await Promise.all([t(s[0]),t(s[1])]);return{type:"array",items:{type:"array",items:[a,c],minItems:2,maxItems:2}}}}const r=Je(n);if(r!==void 0)return{type:"array",items:await t(r),uniqueItems:!0};const i=Qe(n);if(i!==void 0){const s=await Promise.all(i.map(a=>t(a)));return{type:"array",items:s,minItems:s.length,maxItems:s.length}}}const Se={"decimal.js":"Decimal"},J={Date:{type:"string",format:"date-time"},bigint:{type:"string",format:"int64"},Uint8Array:{type:"string",format:"byte"},Buffer:{type:"string",format:"byte"},URL:{type:"string",format:"uri"},RegExp:{type:"string",format:"regex"},Decimal:{type:"string",format:"decimal"}},ae={Uint8Array:"byte",Buffer:"byte",Decimal:"decimal"};function ce(e){var n;const t=new Map;for(const o of e.getImportDeclarations()){const r=o.getModuleSpecifierValue(),i=Se[r];if(!i)continue;const s=o.getDefaultImport();if(s){const a=s.getText();a!==i&&t.set(a,i)}for(const a of o.getNamedImports()){const c=((n=a.getAliasNode())==null?void 0:n.getText())??a.getName();c!==i&&t.set(c,i)}}return t}function Ye(e,t){return n=>{n.addNodeParser({supportsNode(o){var i,s,a;if(o.kind!==t)return!1;const r=((i=o.typeName)==null?void 0:i.escapedText)??((a=(s=o.typeName)==null?void 0:s.right)==null?void 0:a.escapedText);return r!==void 0&&Object.prototype.hasOwnProperty.call(ae,r)},createType(o){var i,s,a;const r=((i=o.typeName)==null?void 0:i.escapedText)??((a=(s=o.typeName)==null?void 0:s.right)==null?void 0:a.escapedText);return new C.AnnotatedType(new C.StringType,{format:ae[r]},!1)}}),n.addNodeParser({supportsNode(o){return o.kind===e},createType(){return new C.AnnotatedType(new C.StringType,{format:"int64"},!1)}})}}let F;function et(){if(F)return F;try{const e=W.dirname(require.resolve("ts-json-schema-generator/package.json"));F=require(require.resolve("typescript",{paths:[e]}))}catch{F=require("typescript")}return F}const k=new Map;function tt(){const e=process.env.APIGEN_PROGRAM_CACHE,t=e===void 0?NaN:Number(e);return Number.isFinite(t)&&t>=0?t:8}function nt(e){const t=k.get(e);return t&&(k.delete(e),k.set(e,t)),t}function rt(e,t){const n=tt();if(n!==0)for(k.delete(e),k.set(e,t);k.size>n;){const o=k.keys().next().value;k.delete(o)}}function ot(e,t){return`${e}\0${t??""}`}const it=new Set(["zod",/^zod\/./]);function st(e){for(const t of e.getImportDeclarations()){const n=t.getModuleSpecifierValue();for(const o of it)if(typeof o=="string"){if(n===o)return!0}else if(o.test(n))return!0}return!1}function at(e){for(const t of["$defs","definitions"]){const n=e[t];if(!n||typeof n!="object")continue;const o=Object.keys(n);if(o.length===0)continue;const r=new Set(o.filter(i=>/zod/i.test(i)));for(const[i,s]of Object.entries(n)){if(r.has(i)||typeof s!="object"||s===null)continue;const a=s,c=typeof a.$ref=="string"?a.$ref:"";if(c){for(const f of r)if(c.includes(f)){r.add(i);break}}}for(const i of r)delete n[i]}Q(e)}function Q(e,t){if(!e||typeof e!="object")return;const n=t??new WeakSet;if(!n.has(e)){n.add(e);for(const o of Object.keys(e))if(o==="$ref"&&typeof e[o]=="string"){const r=e[o];/zod/i.test(r)&&delete e[o]}for(const[,o]of Object.entries(e))if(typeof o=="object"&&o!==null)if(Array.isArray(o))for(const r of o)typeof r=="object"&&r!==null&&Q(r,n);else Q(o,n)}}function ct(e){const t=new Set;for(const o of["$defs","definitions"]){const r=e[o];if(r&&typeof r=="object")for(const i of Object.keys(r))t.add(i)}const n=X(e,t);if(n.length>0)throw new Error(`[apigen-core-client] Generated schema contains ${n.length} unresolvable $ref(s): ${n.join(", ")}. This usually means zod-internal definitions were stripped but $ref references to them remain. Check the source file's imports or the ts-json-schema-generator output.`)}function X(e,t){if(!e||typeof e!="object")return[];const n=[];for(const[o,r]of Object.entries(e))if(o==="$ref"&&typeof r=="string"){const i=r.match(/#\/(?:\$defs|definitions)\/(.+)$/);i&&!t.has(i[1])&&n.push(r)}else if(typeof r=="object"&&r!==null)if(Array.isArray(r))for(const i of r)typeof i=="object"&&i!==null&&n.push(...X(i,t));else n.push(...X(r,t));return n}function ut(e){const t=e.anyOf;if(!Array.isArray(t)||t.length<2)return e;const n=t,o=te(n),r={...e};return delete r.anyOf,{...r,oneOf:n,...o?{discriminator:o}:{},[K]:r[K]??"union"}}function lt(e,t,n){const{DEFAULT_CONFIG:o}=require("ts-json-schema-generator/dist/src/Config.js"),r={...o,...e},i=r.path,s=ot(i,r.tsconfig);let a;a=n?n.statVersion(i):me(i);let c;if(s!==void 0){const u=(n==null?void 0:n.generatorCache.get(s))??nt(s);u&&u.version===a&&(c=u.gen)}if(!c){const{createProgram:u}=require("ts-json-schema-generator/dist/factory/program.js"),l=et(),p=Ye(l.SyntaxKind.BigIntKeyword,l.SyntaxKind.TypeReference),S=u(r),h=C.createParser(S,r,p),g=C.createFormatter(r);if(c=new C.SchemaGenerator(S,h,g,r),n&&n.stats.generatorsBuilt++,s!==void 0&&a!==void 0){const T={version:a,gen:c};rt(s,T),n==null||n.generatorCache.set(s,T)}}const f=c.createSchema(r.type);return at(f),ct(f),f}function ft(e,t){let n=e.trim();if(n=ve(n),t!=null&&t.size){const r=t.get(n);if(r!==void 0)return r}const o=n.match(/^ReadonlyArray<(.+)>$/);for(o&&(n=`${o[1].trim()}[]`);n.startsWith("readonly ");)n=n.slice(9).trim();return n}function be(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}const pt=Object.entries(Se).map(([e,t])=>({pattern:new RegExp(`import\\(["'][^"']*${be(e)}[^"']*["']\\)\\.\\w+`,"g"),key:t}));function ve(e){let t=e;for(const{pattern:n,key:o}of pt)t=t.replace(n,o);return t}function gt(e,t){let n=ve(e);for(const[o,r]of t)n=n.replace(new RegExp(`\\b${be(o)}\\b`,"g"),r);return n}async function $(e,t,n,o,r,i){const s=t.getFilePath(),a=`${s}\0${o??""}\0${n}`,c=i??new Set;if(c.has(a))return{};if(!r){const h=new Set(c);return h.add(a),ue(e,t,n,o,void 0,h)}const f=r.schemaCache.get(a);if(f!==void 0)return r.stats.schemaCacheHits++,f;const u=Me(s,o,r.statVersion(s)),l=u.get(n);if(l!==void 0)return r.stats.schemaCacheHits++,r.schemaCache.set(a,Promise.resolve(l)),l;r.stats.schemaCacheMisses++;const p=new Set(c);p.add(a);const S=ue(e,t,n,o,r,p).then(h=>(u.set(n,h),h)).catch(h=>{throw r.schemaCache.delete(a),h});return r.schemaCache.set(a,S),S}async function ue(e,t,n,o,r,i){if(["void","undefined","null","Promise<void>"].includes(n))return{type:"null"};let s;if(r){const p=r.aliasCache.get(t);s=p??ce(t),p||r.aliasCache.set(t,s)}else s=ce(t);const a=ft(n,s),c=J[a];if(c!==void 0)return c;const f=await Xe(a,p=>$(e,t,p,o,r,i));if(f!==void 0)return f;const u=(r==null?void 0:r.zodImportCache.get(t))??st(t);if(r&&r.zodImportCache.set(t,u),!u)try{const p={path:t.getFilePath(),type:a,skipTypeCheck:!0,tsconfig:o,topRef:!1},S=lt(p,!0,r);return ut(S)}catch{}try{const p=await He(e,t,a,S=>he(S,h=>$(e,t,h,o,r,i),0));if(p!==void 0)return p}catch{}const l=gt(a,s);return q(l,0,s)}function ne(e,t,n){if(e!=null&&e.hasInitializer()){const o=e.getInitializer();if(o)return o.getText()}return mt(n,t)}function mt(e,t){var s;const n=e,o=((s=n==null?void 0:n.getJsDocs)==null?void 0:s.call(n))??[],r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`\\[\\s*${r}\\s*=\\s*([^\\]]+)\\]`);for(const a of o)for(const c of a.getTags()){if(c.getTagName()!=="param")continue;const f=c.getText().match(i);if(f)return f[1].trim()}}function dt(e){const t=e.trim(),n=t.match(/^(['"`])([\s\S]*)\1$/);if(n)return n[2];if(t==="true")return!0;if(t==="false")return!1;if(t==="null")return null;if(t!=="undefined"){if(/^-?\d+(\.\d+)?$/.test(t))return Number(t);try{return JSON.parse(t)}catch{return t}}}function yt(e,t){const n=dt(t);if(n===void 0)return;e.default=n;const o=typeof n=="string"?n:JSON.stringify(n),r=typeof e.description=="string"?e.description:void 0;e.description=r?`${r} (default: ${o})`:`(default: ${o})`}async function ht(e){const t=e.session===void 0,n=de(e.session??ee());try{return await Tt(e,n)}finally{t&&n.dispose()}}async function Tt(e,t){const{sourceFile:n,namespace:o="",dropFileSegment:r=!1,tsconfig:i}=e,s=t.projectFor(i),a=t.sourceFileFor(n,i),c=W.basename(n),f=N(vt(c)),u=r?null:f,l=N(o),p=[];for(const[g,T]of a.getExportedDeclarations()){if(g==="default"||z(g))continue;const d=wt(T);if(d){const b=d.getSignature(),x=le(b,d),w=b.getReturnType().getText();p.push(await V(s,a,l,u,g,x,w,d.isAsync(),i,t));continue}const y=T.find(b=>b.getKindName()==="VariableDeclaration");if(!y)continue;const m=y.getInitializer(),v=m==null?void 0:m.getKindName();if(m&&["ArrowFunction","FunctionExpression"].includes(v??"")){const x=y.getType().getCallSignatures();if(x.length===0)continue;const w=x[0],P=fe(w,y,y.getVariableStatement()),j=w.getReturnType().getText(),A=m.isAsync();p.push(await V(s,a,l,u,g,P,j,A,i,t))}else if(v==="ObjectLiteralExpression"){const b=y.getType();for(const x of b.getProperties()){const w=x.getName();if(z(w))continue;const j=x.getTypeAtLocation(y).getCallSignatures();if(j.length===0)continue;const A=j[0],B=fe(A,y,y.getVariableStatement()),_=A.getReturnType().getText(),M=[...u?[u]:[],N(g),N(w)];p.push(await D(s,a,l,M,w,B,_,!1,i,t))}}else{const b=y.getType(),x=b.getText();if(E(b,y)){const w=await $(s,a,x,i,t);p.push(bt(l,u,g,w))}else console.warn(`[apigen-core] Skipping non-callable, non-serializable export: ${g}`)}}const S=a.getDefaultExportSymbol();if(S){const g=a.getExportAssignment(T=>!T.isExportEquals());if(g){const T=g.getExpression(),d=T.getKindName();if(["ArrowFunction","FunctionExpression"].includes(d)){const m=T.getType().getCallSignatures();if(m.length>0){const v=m[0],b=U(v,g),x=v.getReturnType().getText(),w=T.isAsync();p.push(await V(s,a,l,u,"default",b,x,w,i,t))}}else{const y=T.getType();for(const m of y.getProperties()){const v=m.getName();if(z(v))continue;const x=m.getTypeAtLocation(g).getCallSignatures();if(x.length===0)continue;const w=x[0],P=U(w,g),j=w.getReturnType().getText(),A=[...u?[u]:[],N("default"),N(v)];p.push(await D(s,a,l,A,v,P,j,!1,i,t))}}}else{const T=S.getDeclarations();for(const d of T){if(d.getKindName()!=="FunctionDeclaration")continue;const y=d,m=y.getName(),v=m&&m.length>0?m:"default",b=y.getSignature(),x=le(b,y),w=b.getReturnType().getText();p.push(await V(s,a,l,u,v,x,w,y.isAsync(),i,t))}}}const h=xt(a);if(h.length>0)for(const{name:g,sig:T}of h){if(z(g))continue;const d=U(T),y=T.getReturnType().getText(),m=[...u?[u]:[],N(g)];p.push(await D(s,a,l,m,g,d,y,!1,i,t))}return p}function St(e,t,n,o){const r=new Set,i=s=>{if(Array.isArray(s))return s.map(i);if(!s||typeof s!="object"||r.has(s))return s;r.add(s);try{const a=s,c={};for(const[f,u]of Object.entries(a)){if(f==="definitions"||f==="$defs"){const l=f,p=t[l];for(const[S,h]of Object.entries(u)){const g=i(h),T=p[S];if(T!==void 0&&JSON.stringify(T)!==JSON.stringify(g))throw new Error(`[apigen-core-client] Function "${n}": param "${o}" contributes a "${l}.${S}" definition that conflicts with an identically-named definition already hoisted from another param/output in the same function. Two structurally different types share the same generated definition key, so apigen cannot safely merge them into one function-level schema.`);p[S]=g}continue}c[f]=i(u)}return c}finally{r.delete(s)}};return i(e)}async function V(e,t,n,o,r,i,s,a,c,f){const u=N(r);return D(e,t,n,o?[o,u]:[u],r,i,s,a,c,f)}async function D(e,t,n,o,r,i,s,a,c,f){const u=i.length>0&&i[0].name==="ctx",l=i.filter(m=>m.name!=="ctx"),p=l.filter(m=>!m.optional).map(m=>m.name),S={},h={definitions:{},$defs:{}};for(const m of l){const v=await $(e,t,m.type,c,f),b=St(v,h,r,m.name);m.defaultValue!==void 0&&yt(b,m.defaultValue),S[m.name]=b}const g=s.replace(/^Promise<(.+)>$/,"$1").trim(),T=await $(e,t,g,c,f),d={type:"object",properties:S,required:p,...Object.keys(h.definitions).length>0?{definitions:h.definitions}:{},...Object.keys(h.$defs).length>0?{$defs:h.$defs}:{}};return{id:xe(n,o),host:"ts",namespace:n,path:o,kind:"action",async:a,streaming:!1,safe:!1,input:d,output:T,envelope:{},typeText:{lang:"ts",input:jt(i),output:g},...u?{hasCtx:!0}:{}}}function bt(e,t,n,o){const r=N(n),i=t?[t,r]:[r];return{id:xe(e,i),host:"ts",namespace:e,path:i,kind:"query",async:!1,streaming:!1,safe:!0,input:{type:"object",properties:{},required:[]},output:o,envelope:{},typeText:null}}function xe(e,t){return(e.raw?[e,...t]:t).map(o=>o.words.join("-")).join("/")}function re(e){return e.split(/[-_.]+/).flatMap(t=>t.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").split("_").filter(Boolean)).map(t=>t.toLowerCase()).filter(Boolean)}function N(e){return{raw:e,words:re(e)}}function vt(e){return e.replace(/\.[^.]+$/,"").replace(/[._]+/g,"-")}function xt(e){const t=[];for(const n of e.getStatements()){if(n.getKindName()!=="ExpressionStatement")continue;const o=n.getExpression();if(o.getKindName()!=="BinaryExpression")continue;const r=o;if(r.getLeft().getText().trim()!=="module.exports"||r.getOperatorToken().getKindName()!=="EqualsToken")continue;const s=r.getRight(),a=s.getType();for(const c of a.getProperties()){const u=c.getTypeAtLocation(s).getCallSignatures();u.length!==0&&t.push({name:c.getName(),sig:u[0]})}}return t}function wt(e){let t;for(const n of e){if(n.getKindName()!=="FunctionDeclaration")continue;const o=n;if(t||(t=o),o.getBody())return o}return t}function le(e,t){return e.getParameters().map(n=>{var s;const o=n.getDeclarations(),r=o.length>0&&o[0].getKindName()==="Parameter"?o[0]:null,i=n.isOptional()||((r==null?void 0:r.hasInitializer())??!1)||(((s=r==null?void 0:r.hasQuestionToken)==null?void 0:s.call(r))??!1);return{name:n.getName(),type:n.getTypeAtLocation(e.getDeclaration()).getText(),optional:i,defaultValue:ne(r,n.getName(),t)}})}function fe(e,t,n){return e.getParameters().map(o=>{var a;const r=o.getDeclarations(),i=r.length>0&&r[0].getKindName()==="Parameter"?r[0]:null,s=o.isOptional()||((i==null?void 0:i.hasInitializer())??!1)||(((a=i==null?void 0:i.hasQuestionToken)==null?void 0:a.call(i))??!1);return{name:o.getName(),type:o.getTypeAtLocation(t).getText(),optional:s,defaultValue:ne(i,o.getName(),n??t)}})}function U(e,t){return e.getParameters().map(n=>{var s,a,c;const o=n.getDeclarations(),r=o.length>0&&o[0].getKindName()==="Parameter"?o[0]:null,i=n.isOptional()||((r==null?void 0:r.hasInitializer())??!1)||(((s=r==null?void 0:r.hasQuestionToken)==null?void 0:s.call(r))??!1);return{name:n.getName(),type:r?r.getType().getText():((c=(a=n.getValueDeclaration())==null?void 0:a.getType())==null?void 0:c.getText())??"unknown",optional:i,defaultValue:ne(r,n.getName(),t)}})}function jt(e){const t=e.filter(n=>n.name!=="ctx");return t.length===0?"()":"("+t.map(n=>`${n.name}${n.optional?"?":""}: ${n.type}`).join(", ")+")"}function z(e){return!!(e==="__samples__"||e.startsWith("__"))}function E(e,t,n=new Set){if(e.getCallSignatures().length>0||e.getConstructSignatures().length>0)return!1;if(e.isString()||e.isNumber()||e.isBoolean()||e.isNull()||e.isUndefined()||e.isStringLiteral()||e.isNumberLiteral()||e.isBooleanLiteral()||e.isEnumLiteral())return!0;if(e.isArray()||e.isReadonlyArray()){const o=e.getArrayElementType();return o?E(o,t,n):!1}if(e.isTuple())return e.getTupleElements().every(o=>E(o,t,n));if(e.isUnion())return e.getUnionTypes().every(o=>E(o,t,n));if(e.isIntersection())return e.getIntersectionTypes().every(o=>E(o,t,n));if(e.isObject()){const o=e.getText(t);if(n.has(o))return!0;n.add(o);const r=e.getStringIndexType(),i=e.getNumberIndexType();if(r||i)return[r,i].every(a=>!a||E(a,t,n));const s=e.getProperties();return s.length===0?!0:s.every(a=>{const c=a.getTypeAtLocation(t);return E(c,t,n)})}return!1}async function Pt(e){const t=e.session===void 0,n=de(e.session??ee());try{return await $t(e,n)}finally{t&&n.dispose()}}async function $t(e,t){const{sourceFile:n,namespace:o="",tsconfig:r,includeInstances:i=!1}=e,s=t.projectFor(r),a=t.sourceFileFor(n,r),c=W.basename(n),f=L(Nt(c)),u=L(o),l=[];for(const[p,S]of a.getExportedDeclarations()){const h=S.find(d=>d.getKindName()==="ClassDeclaration");if(!h)continue;const g=p==="default"?h.getName():p;if(!g||H(g))continue;const T=L(g);for(const d of h.getStaticMethods()){const y=d.getName();if(H(y))continue;const m=d.getScope();if(m===I.Scope.Private||m===I.Scope.Protected)continue;const v=d.getSignature(),b=G(v,d),x=v.getReturnType().getText(),w=d.isAsync(),P=[f,T,L(y)];l.push(await At(s,a,u,P,b,x,w,r,t))}if(i){{const y=h.getConstructors()[0]??null;let m=[];if(y){const j=y.getSignature();m=G(j,y)}const v=[f,T],b=Y(u,v),x=m.filter(j=>j.name!=="ctx"),w=x.filter(j=>!j.optional).map(j=>j.name),P={};for(const j of x)P[j.name]=await $(s,a,j.type,r,t);l.push({id:b,host:"ts",namespace:u,path:v,kind:"constructor",async:!1,streaming:!1,safe:!1,input:{type:"object",properties:P,required:w},output:{type:"object",properties:{instanceId:{type:"string"}},required:["instanceId"]},envelope:{},typeText:{lang:"ts",input:Ot(m),output:"{ instanceId: string }"}})}for(const d of h.getInstanceMethods()){const y=d.getName();if(H(y))continue;const m=d.getScope();if(m===I.Scope.Private||m===I.Scope.Protected)continue;const v=d.getSignature(),b=G(v,d),x=v.getReturnType().getText(),w=d.isAsync(),P=[f,T,L(y)],j=Y(u,P),A=b.filter(O=>O.name!=="ctx"),B=A.filter(O=>!O.optional).map(O=>O.name),_={};for(const O of A)_[O.name]=await $(s,a,O.type,r,t);const M=x.replace(/^Promise<(.+)>$/,"$1").trim(),Ae=await $(s,a,M,r,t);l.push({id:j,host:"ts",namespace:u,path:P,kind:"instance-method",async:w,streaming:!1,safe:!1,input:{type:"object",properties:_,required:B},output:Ae,envelope:{type:"object",properties:{instanceId:{type:"string"}},required:["instanceId"]},typeText:{lang:"ts",input:we(b),output:M}})}}}return l}async function At(e,t,n,o,r,i,s,a,c){const f=r.filter(g=>g.name!=="ctx"),u=f.filter(g=>!g.optional).map(g=>g.name),l={};for(const g of f)l[g.name]=await $(e,t,g.type,a,c);const p=i.replace(/^Promise<(.+)>$/,"$1").trim(),S=await $(e,t,p,a,c);return{id:Y(n,o),host:"ts",namespace:n,path:o,kind:"action",async:s,streaming:!1,safe:!1,input:{type:"object",properties:l,required:u},output:S,envelope:{},typeText:{lang:"ts",input:we(r),output:p}}}function Y(e,t){return(e.raw?[e,...t]:t).map(o=>o.words.join("-")).join("/")}function L(e){return{raw:e,words:re(e)}}function Nt(e){return e.replace(/\.[^.]+$/,"").replace(/[._]+/g,"-")}function G(e,t){return e.getParameters().map(n=>{var s;const o=n.getDeclarations(),r=o.length>0&&o[0].getKindName()==="Parameter"?o[0]:null,i=n.isOptional()||((r==null?void 0:r.hasInitializer())??!1)||(((s=r==null?void 0:r.hasQuestionToken)==null?void 0:s.call(r))??!1);return{name:n.getName(),type:n.getTypeAtLocation(t).getText(),optional:i}})}function we(e){const t=e.filter(n=>n.name!=="ctx");return t.length===0?"()":"("+t.map(n=>`${n.name}${n.optional?"?":""}: ${n.type}`).join(", ")+")"}function Ot(e){return e.length===0?"()":"("+e.map(t=>`${t.name}${t.optional?"?":""}: ${t.type}`).join(", ")+")"}function H(e){return!!(e==="__samples__"||e.startsWith("__")||e.startsWith("_"))}const kt=new Map([[".ts","ts"],[".tsx","ts"],[".mts","ts"],[".cts","ts"],[".py","py"],[".rs","rust"],[".go","go"],[".java","java"]]);function je(e){const t=_e.extname(e).toLowerCase();return kt.get(t)}function Pe(e){return e.language??"ts"}function $e(e,t){const n=je(t);return n===void 0?!1:n===Pe(e)}function Et(e,t){return t.filter(n=>$e(e,n))}exports.clearPersistentProjectCache=Ve;exports.composeSchemas=We;exports.createExtractionSession=ee;exports.effectiveLanguage=Pe;exports.extract=ht;exports.extractClasses=Pt;exports.isPrimitiveOnlyInputSchema=ye;exports.languageOfSource=je;exports.pluginConsumesSource=$e;exports.pluginsToEnvelopeMiddlewares=qe;exports.sourcesForPlugin=Et;exports.tokenize=re;
|
|
1
|
+
"use strict";var Re=Object.create;var oe=Object.defineProperty;var _e=Object.getOwnPropertyDescriptor;var Le=Object.getOwnPropertyNames;var Me=Object.getPrototypeOf,Ve=Object.prototype.hasOwnProperty;var qe=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Le(t))!Ve.call(e,r)&&r!==n&&oe(e,r,{get:()=>t[r],enumerable:!(o=_e(t,r))||o.enumerable});return e};var ze=(e,t,n)=>(n=e!=null?Re(Me(e)):{},qe(t||!e||!e.__esModule?oe(n,"default",{value:e,enumerable:!0}):n,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const I=require("ts-morph"),Ke=require("node:fs"),D=require("node:path"),E=require("ts-json-schema-generator");function Be(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const De=Be(D);function ie(e){return{raw:e,words:e.split(/(?=[A-Z])|[-_]/).map(t=>t.toLowerCase()).filter(Boolean)}}function de(e,t,n={}){const o=e.split("/");if(o.length<2||o.some(l=>l.length===0))throw new Error(`syntheticOp: id "${e}" must be "<namespace>/<path...>" with non-empty segments`);const[r,...i]=o,s=r.replace(/^_+/,""),a=n.kind??"action",c={id:e,host:t.host,namespace:ie(s),path:i.map(ie),kind:a,async:n.async??!1,streaming:n.streaming??!1,safe:n.safe??a==="query",input:n.input??{},output:n.output??{},envelope:n.envelope??{},typeText:n.typeText??null};return n.hasCtx!==void 0&&(c.hasCtx=n.hasCtx),n.transports!==void 0&&(c.transports=n.transports),c}const ye=Symbol.for("adhd.apigen.extraction-session");function he(e,t){const n=[...e.getImportDeclarations().map(o=>o.getModuleSpecifierSourceFile()),...e.getExportDeclarations().map(o=>o.getModuleSpecifierSourceFile())];for(const o of n){if(!o)continue;const r=o.getFilePath();if(!r.includes("/node_modules/")&&!t.has(r)){t.add(r);try{o.refreshFromFileSystemSync()}catch{}he(o,t)}}}function Te(e){try{const t=Ke.statSync(e);return`${t.mtimeMs}:${t.size}`}catch{return"nostat"}}const _=new Map,J=new Map;function We(e,t,n){const o=t??"",r=_.get(o);let i=n;if(r&&r.fileVersions.size>0){const c=[n],l=[...r.fileVersions.entries()].sort(([u],[f])=>u.localeCompare(f));for(const[u,f]of l)u!==e&&c.push(`${u}:${f}`);i=c.join("|")}const s=`${e}\0${t??""}`;let a=J.get(s);return(!a||a.version!==i)&&(a={version:i,schemas:new Map},J.set(s,a)),a.schemas}function Ue(){_.clear(),J.clear()}function te(){const e={projectsBuilt:0,generatorsBuilt:0,schemaCacheHits:0,schemaCacheMisses:0},t=new Map;let n=!1;return{[ye]:!0,stats:e,schemaCache:new Map,aliasCache:new WeakMap,zodImportCache:new WeakMap,generatorCache:new Map,projectFor(r){if(n)throw new Error("apigen-core: ExtractionSession used after dispose()");const i=r??"",s=r?this.statVersion(r):"";let a=_.get(i);return a&&a.tsconfigVersion!==s&&(a=void 0),a||(a={project:r?new I.Project({tsConfigFilePath:r,skipAddingFilesFromTsConfig:!0}):new I.Project({skipAddingFilesFromTsConfig:!0}),tsconfigVersion:s,fileVersions:new Map},_.set(i,a),e.projectsBuilt++),a.project},sourceFileFor(r,i){const s=this.projectFor(i),a=_.get(i??""),c=this.statVersion(r);let l=s.getSourceFile(r);if(l===void 0?l=s.addSourceFileAtPath(r):a&&a.fileVersions.get(r)!==c&&l.refreshFromFileSystemSync(),a==null||a.fileVersions.set(r,c),a){const u=new Set([r]);he(l,u);for(const f of u)f!==r&&a.fileVersions.set(f,this.statVersion(f))}return l},statVersion(r){let i=t.get(r);return i===void 0&&(i=Te(r),t.set(r,i)),i},dispose(){n=!0,this.schemaCache.clear(),this.generatorCache.clear(),t.clear()}}}function be(e){const t=e;if(t[ye]!==!0)throw new Error("apigen-core: unknown ExtractionSession implementation โ create sessions with createExtractionSession()");return t}const B="x-apigen-logical";function se(e,t){const n=new Set,o=[e];for(;o.length>0;){const r=o.pop();if(!r||n.has(r))continue;n.add(r);const i=r.$ref;if(typeof i=="string"){if(t){const f=t[i];if(!f){const p=Object.keys(t).join(", ")||"(none)";throw new Error(`[apigen-logical] $ref "${i}" cannot be resolved. Available $defs: ${p}`)}o.push(f)}continue}const s=r.oneOf;if(Array.isArray(s))for(const f of s)typeof f=="object"&&f!==null&&o.push(f);const a=r.properties;if(a)for(const f of Object.values(a))o.push(f);const c=r.items;if(Array.isArray(c))for(const f of c)typeof f=="object"&&f!==null&&o.push(f);else typeof c=="object"&&c!==null&&o.push(c);const l=r.additionalProperties;typeof l=="object"&&l!==null&&o.push(l);const u=r.propertyNames;typeof u=="object"&&u!==null&&o.push(u)}}const ae=new Set(["string","number","boolean","integer"]);function Ge(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:n}=t;return typeof n=="string"?ae.has(n):Array.isArray(n)?n.every(o=>ae.has(o)||o==="null"):Array.isArray(t.enum)&&t.enum.length>0?t.enum.every(o=>["string","number","boolean"].includes(typeof o)):!1}function Se(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(Ge)}function Ze(e){var n,o;const t=[];for(const r of e){const i={...(n=r.capabilities.layer)==null?void 0:n.envelopeFields,...(o=r.capabilities.envelope)==null?void 0:o.request};Object.keys(i).length>0&&t.push({id:r.id,envelope:i})}return t}function He(e){const t={},n=o=>{for(const r of["definitions","$defs"]){const i=o[r];if(i)for(const[s,a]of Object.entries(i)){const c=s.startsWith("#/")?s:`#/${r}/${s}`;t[c]=a}}};for(const o of Object.values(e.schemas))n(o.input),n(o.output);if(Object.keys(t).length!==0)for(const[o,r]of Object.entries(e.schemas))try{se(r.input,t),se(r.output,t)}catch(i){throw new Error(`[apigen-core-client] Schema validation failed for function "${o}": ${i.message}`)}}function Je(e,t){const n=['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&&n.push(`Field(s) ${e.map(o=>`"${o}"`).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.`),n.join(" ")}function Qe(e,t,n){He(e);const o={};for(const[r,i]of Object.entries(e.schemas)){const s=(n==null?void 0:n[r])??{},a=i.input.properties??{},c=i.input.required??[],l={},u=[],f={};for(const T of t)if(T.envelope&&s[T.id]!==!1)for(const[d,y]of Object.entries(T.envelope))l[d]=y,f[d]=T.id,u.includes(d)||u.push(d);const p={type:"object",properties:a,additionalProperties:!1,...c.length>0?{required:c}:{}},b=i.safe===!0||Se(i.input),h=i.input.definitions,m=i.input.$defs;o[r]={input:{type:"object",properties:{...l,data:p},required:[...u,...c.length>0?["data"]:[]],additionalProperties:!1,description:Je(Object.keys(l),Object.keys(a).length>0),...h?{definitions:h}:{},...m?{$defs:m}:{}},output:i.output,...i.hasCtx?{hasCtx:!0}:{},"x-apigen-safe":b,...Object.keys(f).length>0?{"x-apigen-envelope":f}:{}}}return o}const Xe=8;function Ye(e,t){try{return t?e.getText(t):e.getText()}catch{try{return e.getText()}catch{return}}}let et=0;async function tt(e,t,n,o){const r=`__ApigenProbe_${process.pid}_${et++}`;let i;try{i=t.addTypeAlias({name:r,type:n});const s=i.getType();return await o(s)}catch{return}finally{try{i==null||i.remove()}catch{}}}async function ve(e,t,n){if(n>Xe)return{};if(e.isString()||e.isStringLiteral())return e.isStringLiteral()?{type:"string",enum:[e.getLiteralValue()]}:{type:"string"};if(e.isNumber()||e.isNumberLiteral())return e.isNumberLiteral()?{type:"number",enum:[e.getLiteralValue()]}:{type:"number"};if(e.isBoolean())return{type:"boolean"};if(e.isBooleanLiteral())return{type:"boolean"};if(e.isNull()||e.isUndefined()||e.isVoid())return{type:"null"};if(e.isUnion()){const o=e.getUnionTypes();if(o.every(c=>c.isStringLiteral())&&o.length>0)return{type:"string",enum:o.map(c=>c.getLiteralValue())};if(o.every(c=>c.isNumberLiteral())&&o.length>0)return{type:"number",enum:o.map(c=>c.getLiteralValue())};const s=await Promise.all(o.map(c=>ve(c,t,n+1))),a=W(s);return{oneOf:s,...a?{discriminator:a}:{},[B]:"union"}}if(e.isArray()){const o=e.getArrayElementType();return{type:"array",items:o?await t(o.getText()):{}}}if(e.isTuple()){const o=e.getTupleElements(),r=await Promise.all(o.map(i=>t(i.getText())));return{type:"array",items:r,minItems:r.length,maxItems:r.length}}if(e.isObject()){const o=e.getStringIndexType(),r=e.getNumberIndexType(),i=o??r,s=e.getProperties();if(i&&s.length===0)return{type:"object",additionalProperties:await t(i.getText())};const a={};for(const c of s){const l=c.getName(),f=c.getDeclarations()[0];let p;if(f)try{p=c.getTypeAtLocation(f)}catch{p=void 0}if(p!==void 0&&p.getCallSignatures().length>0)continue;const b=p!==void 0?Ye(p,f):void 0;a[l]=b!==void 0?await t(b):{}}return Object.keys(a).length>0?{type:"object",properties:a}:{}}return{}}function W(e){if(e.length<2)return;const t=[];for(const o of e){if(o.type!=="object")return;const r=o.properties;if(!r||typeof r!="object")return;t.push(r)}const n=Object.keys(t[0]).filter(o=>t.every(r=>Object.prototype.hasOwnProperty.call(r,o)));for(const o of n){const r=[];let i=!0;for(const a of t){const c=a[o],l=c&&(c.type==="string"||c.type==="number"),u=c==null?void 0:c.enum;if(!l||!Array.isArray(u)||u.length!==1){i=!1;break}r.push(String(u[0]))}if(!i||new Set(r).size!==r.length)continue;const s={};return r.forEach((a,c)=>{s[a]=`#/oneOf/${c}`}),{propertyName:o,mapping:s}}}function z(e,t,n){if(t>6)return{};const o=e.trim();if(o==="string")return{type:"string"};if(o==="number")return{type:"number"};if(o==="boolean")return{type:"boolean"};if(o==="null")return{type:"null"};if(o==="undefined")return{type:"null"};const r=Q[o];if(r!==void 0)return r;if(n!=null&&n.size){const i=n.get(o);if(i!==void 0){const s=Q[i];if(s!==void 0)return s}}if(o.endsWith("[]"))return{type:"array",items:z(o.slice(0,-2),t+1,n)};if(o.includes("|")){const i=o.split("|").map(c=>c.trim());if(i.every(c=>c.startsWith("'")))return{type:"string",enum:i.map(c=>c.replace(/'/g,""))};const s=i.map(c=>z(c,t+1,n)),a=W(s);return{oneOf:s,...a?{discriminator:a}:{},[B]:"union"}}if(o.startsWith("{")&&o.endsWith("}")){const i=o.slice(1,-1).trim(),s={};for(const a of i.split(";").filter(Boolean)){const[c,l]=a.split(":").map(u=>u.trim());c&&l&&(s[c.replace("?","")]=z(l,t+1,n))}return{type:"object",properties:s}}return{}}function xe(e){const t=[];let n=0,o=0;for(let i=0;i<e.length;i++){const s=e[i];s==="<"||s==="["||s==="{"||s==="("?n++:s===">"||s==="]"||s==="}"||s===")"?n--:s===","&&n===0&&(t.push(e.slice(o,i).trim()),o=i+1)}const r=e.slice(o).trim();return r.length>0&&t.push(r),t}function nt(e){const t=/^(?:Readonly)?Map<(.+)>$/.exec(e);return t?t[1]:void 0}function rt(e){const t=/^(?:Readonly)?Set<(.+)>$/.exec(e);return t?t[1]:void 0}function ot(e){let t=e.trim();if(t.startsWith("readonly ")&&(t=t.slice(9).trim()),!t.startsWith("[")||!t.endsWith("]"))return;const n=t.slice(1,-1).trim();if(n.length!==0)return xe(n)}async function it(e,t){const n=e.trim(),o=nt(n);if(o!==void 0){const s=xe(o);if(s.length===2){const[a,c]=await Promise.all([t(s[0]),t(s[1])]);return{type:"array",items:{type:"array",items:[a,c],minItems:2,maxItems:2}}}}const r=rt(n);if(r!==void 0)return{type:"array",items:await t(r),uniqueItems:!0};const i=ot(n);if(i!==void 0){const s=await Promise.all(i.map(a=>t(a)));return{type:"array",items:s,minItems:s.length,maxItems:s.length}}}const we={"decimal.js":"Decimal"},Q={Date:{type:"string",format:"date-time"},bigint:{type:"string",format:"int64"},Uint8Array:{type:"string",format:"byte"},Buffer:{type:"string",format:"byte"},URL:{type:"string",format:"uri"},RegExp:{type:"string",format:"regex"},Decimal:{type:"string",format:"decimal"}},ce={Uint8Array:"byte",Buffer:"byte",Decimal:"decimal"};function ue(e){var n;const t=new Map;for(const o of e.getImportDeclarations()){const r=o.getModuleSpecifierValue(),i=we[r];if(!i)continue;const s=o.getDefaultImport();if(s){const a=s.getText();a!==i&&t.set(a,i)}for(const a of o.getNamedImports()){const c=((n=a.getAliasNode())==null?void 0:n.getText())??a.getName();c!==i&&t.set(c,i)}}return t}function st(e,t){return n=>{n.addNodeParser({supportsNode(o){var i,s,a;if(o.kind!==t)return!1;const r=((i=o.typeName)==null?void 0:i.escapedText)??((a=(s=o.typeName)==null?void 0:s.right)==null?void 0:a.escapedText);return r!==void 0&&Object.prototype.hasOwnProperty.call(ce,r)},createType(o){var i,s,a;const r=((i=o.typeName)==null?void 0:i.escapedText)??((a=(s=o.typeName)==null?void 0:s.right)==null?void 0:a.escapedText);return new E.AnnotatedType(new E.StringType,{format:ce[r]},!1)}}),n.addNodeParser({supportsNode(o){return o.kind===e},createType(){return new E.AnnotatedType(new E.StringType,{format:"int64"},!1)}})}}let F;function at(){if(F)return F;try{const e=D.dirname(require.resolve("ts-json-schema-generator/package.json"));F=require(require.resolve("typescript",{paths:[e]}))}catch{F=require("typescript")}return F}const k=new Map;function ct(){const e=process.env.APIGEN_PROGRAM_CACHE,t=e===void 0?NaN:Number(e);return Number.isFinite(t)&&t>=0?t:8}function ut(e){const t=k.get(e);return t&&(k.delete(e),k.set(e,t)),t}function lt(e,t){const n=ct();if(n!==0)for(k.delete(e),k.set(e,t);k.size>n;){const o=k.keys().next().value;k.delete(o)}}function ft(e,t){return`${e}\0${t??""}`}const pt=new Set(["zod",/^zod\/./]);function mt(e){for(const t of e.getImportDeclarations()){const n=t.getModuleSpecifierValue();for(const o of pt)if(typeof o=="string"){if(n===o)return!0}else if(o.test(n))return!0}return!1}function gt(e){for(const t of["$defs","definitions"]){const n=e[t];if(!n||typeof n!="object")continue;const o=Object.keys(n);if(o.length===0)continue;const r=new Set(o.filter(i=>/zod/i.test(i)));for(const[i,s]of Object.entries(n)){if(r.has(i)||typeof s!="object"||s===null)continue;const a=s,c=typeof a.$ref=="string"?a.$ref:"";if(c){for(const l of r)if(c.includes(l)){r.add(i);break}}}for(const i of r)delete n[i]}X(e)}function X(e,t){if(!e||typeof e!="object")return;const n=t??new WeakSet;if(!n.has(e)){n.add(e);for(const o of Object.keys(e))if(o==="$ref"&&typeof e[o]=="string"){const r=e[o];/zod/i.test(r)&&delete e[o]}for(const[,o]of Object.entries(e))if(typeof o=="object"&&o!==null)if(Array.isArray(o))for(const r of o)typeof r=="object"&&r!==null&&X(r,n);else X(o,n)}}function dt(e){const t=new Set;for(const o of["$defs","definitions"]){const r=e[o];if(r&&typeof r=="object")for(const i of Object.keys(r))t.add(i)}const n=Y(e,t);if(n.length>0)throw new Error(`[apigen-core-client] Generated schema contains ${n.length} unresolvable $ref(s): ${n.join(", ")}. This usually means zod-internal definitions were stripped but $ref references to them remain. Check the source file's imports or the ts-json-schema-generator output.`)}function Y(e,t){if(!e||typeof e!="object")return[];const n=[];for(const[o,r]of Object.entries(e))if(o==="$ref"&&typeof r=="string"){const i=r.match(/#\/(?:\$defs|definitions)\/(.+)$/);i&&!t.has(i[1])&&n.push(r)}else if(typeof r=="object"&&r!==null)if(Array.isArray(r))for(const i of r)typeof i=="object"&&i!==null&&n.push(...Y(i,t));else n.push(...Y(r,t));return n}function yt(e){const t=e.anyOf;if(!Array.isArray(t)||t.length<2)return e;const n=t,o=W(n),r={...e};return delete r.anyOf,{...r,oneOf:n,...o?{discriminator:o}:{},[B]:r[B]??"union"}}function ht(e,t,n){const{DEFAULT_CONFIG:o}=require("ts-json-schema-generator/dist/src/Config.js"),r={...o,...e},i=r.path,s=ft(i,r.tsconfig);let a;a=n?n.statVersion(i):Te(i);let c;if(s!==void 0){const u=(n==null?void 0:n.generatorCache.get(s))??ut(s);u&&u.version===a&&(c=u.gen)}if(!c){const{createProgram:u}=require("ts-json-schema-generator/dist/factory/program.js"),f=at(),p=st(f.SyntaxKind.BigIntKeyword,f.SyntaxKind.TypeReference),b=u(r),h=E.createParser(b,r,p),m=E.createFormatter(r);if(c=new E.SchemaGenerator(b,h,m,r),n&&n.stats.generatorsBuilt++,s!==void 0&&a!==void 0){const T={version:a,gen:c};lt(s,T),n==null||n.generatorCache.set(s,T)}}const l=c.createSchema(r.type);return gt(l),dt(l),l}function Tt(e,t){let n=e.trim();if(n=Pe(n),t!=null&&t.size){const r=t.get(n);if(r!==void 0)return r}const o=n.match(/^ReadonlyArray<(.+)>$/);for(o&&(n=`${o[1].trim()}[]`);n.startsWith("readonly ");)n=n.slice(9).trim();return n}function je(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}const bt=Object.entries(we).map(([e,t])=>({pattern:new RegExp(`import\\(["'][^"']*${je(e)}[^"']*["']\\)\\.\\w+`,"g"),key:t}));function Pe(e){let t=e;for(const{pattern:n,key:o}of bt)t=t.replace(n,o);return t}function St(e,t){let n=Pe(e);for(const[o,r]of t)n=n.replace(new RegExp(`\\b${je(o)}\\b`,"g"),r);return n}async function $(e,t,n,o,r,i){const s=t.getFilePath(),a=`${s}\0${o??""}\0${n}`,c=i??new Set;if(c.has(a))return{};if(!r){const h=new Set(c);return h.add(a),le(e,t,n,o,void 0,h)}const l=r.schemaCache.get(a);if(l!==void 0)return r.stats.schemaCacheHits++,l;const u=We(s,o,r.statVersion(s)),f=u.get(n);if(f!==void 0)return r.stats.schemaCacheHits++,r.schemaCache.set(a,Promise.resolve(f)),f;r.stats.schemaCacheMisses++;const p=new Set(c);p.add(a);const b=le(e,t,n,o,r,p).then(h=>(u.set(n,h),h)).catch(h=>{throw r.schemaCache.delete(a),h});return r.schemaCache.set(a,b),b}async function le(e,t,n,o,r,i){if(["void","undefined","null","Promise<void>"].includes(n))return{type:"null"};let s;if(r){const p=r.aliasCache.get(t);s=p??ue(t),p||r.aliasCache.set(t,s)}else s=ue(t);const a=Tt(n,s),c=Q[a];if(c!==void 0)return c;const l=await it(a,p=>$(e,t,p,o,r,i));if(l!==void 0)return l;const u=(r==null?void 0:r.zodImportCache.get(t))??mt(t);if(r&&r.zodImportCache.set(t,u),!u)try{const p={path:t.getFilePath(),type:a,skipTypeCheck:!0,tsconfig:o,topRef:!1},b=ht(p,!0,r);return yt(b)}catch{}try{const p=await tt(e,t,a,b=>ve(b,h=>$(e,t,h,o,r,i),0));if(p!==void 0)return p}catch{}const f=St(a,s);return z(f,0,s)}function ne(e,t,n){if(e!=null&&e.hasInitializer()){const o=e.getInitializer();if(o)return o.getText()}return vt(n,t)}function vt(e,t){var s;const n=e,o=((s=n==null?void 0:n.getJsDocs)==null?void 0:s.call(n))??[],r=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),i=new RegExp(`\\[\\s*${r}\\s*=\\s*([^\\]]+)\\]`);for(const a of o)for(const c of a.getTags()){if(c.getTagName()!=="param")continue;const l=c.getText().match(i);if(l)return l[1].trim()}}function xt(e){const t=e.trim(),n=t.match(/^(['"`])([\s\S]*)\1$/);if(n)return n[2];if(t==="true")return!0;if(t==="false")return!1;if(t==="null")return null;if(t!=="undefined"){if(/^-?\d+(\.\d+)?$/.test(t))return Number(t);try{return JSON.parse(t)}catch{return t}}}function wt(e,t){const n=xt(t);if(n===void 0)return;e.default=n;const o=typeof n=="string"?n:JSON.stringify(n),r=typeof e.description=="string"?e.description:void 0;e.description=r?`${r} (default: ${o})`:`(default: ${o})`}async function jt(e){const t=e.session===void 0,n=be(e.session??te());try{return await Pt(e,n)}finally{t&&n.dispose()}}async function Pt(e,t){const{sourceFile:n,namespace:o="",dropFileSegment:r=!1,tsconfig:i}=e,s=t.projectFor(i),a=t.sourceFileFor(n,i),c=D.basename(n),l=O(Ot(c)),u=r?null:l,f=O(o),p=[];for(const[m,T]of a.getExportedDeclarations()){if(m==="default"||q(m))continue;const d=kt(T);if(d){const S=d.getSignature(),x=fe(S,d),w=S.getReturnType().getText();p.push(await V(s,a,f,u,m,x,w,d.isAsync(),i,t));continue}const y=T.find(S=>S.getKindName()==="VariableDeclaration");if(!y)continue;const g=y.getInitializer(),v=g==null?void 0:g.getKindName();if(g&&["ArrowFunction","FunctionExpression"].includes(v??"")){const x=y.getType().getCallSignatures();if(x.length===0)continue;const w=x[0],P=pe(w,y,y.getVariableStatement()),j=w.getReturnType().getText(),A=g.isAsync();p.push(await V(s,a,f,u,m,P,j,A,i,t))}else if(v==="ObjectLiteralExpression"){const S=y.getType();for(const x of S.getProperties()){const w=x.getName();if(q(w))continue;const j=x.getTypeAtLocation(y).getCallSignatures();if(j.length===0)continue;const A=j[0],U=pe(A,y,y.getVariableStatement()),L=A.getReturnType().getText(),M=[...u?[u]:[],O(m),O(w)];p.push(await K(s,a,f,M,w,U,L,!1,i,t))}}else{const S=y.getType(),x=S.getText();if(C(S,y)){const w=await $(s,a,x,i,t);p.push(At(f,u,m,w))}else console.warn(`[apigen-core] Skipping non-callable, non-serializable export: ${m}`)}}const b=a.getDefaultExportSymbol();if(b){const m=a.getExportAssignment(T=>!T.isExportEquals());if(m){const T=m.getExpression(),d=T.getKindName();if(["ArrowFunction","FunctionExpression"].includes(d)){const g=T.getType().getCallSignatures();if(g.length>0){const v=g[0],S=G(v,m),x=v.getReturnType().getText(),w=T.isAsync();p.push(await V(s,a,f,u,"default",S,x,w,i,t))}}else{const y=T.getType();for(const g of y.getProperties()){const v=g.getName();if(q(v))continue;const x=g.getTypeAtLocation(m).getCallSignatures();if(x.length===0)continue;const w=x[0],P=G(w,m),j=w.getReturnType().getText(),A=[...u?[u]:[],O("default"),O(v)];p.push(await K(s,a,f,A,v,P,j,!1,i,t))}}}else{const T=b.getDeclarations();for(const d of T){if(d.getKindName()!=="FunctionDeclaration")continue;const y=d,g=y.getName(),v=g&&g.length>0?g:"default",S=y.getSignature(),x=fe(S,y),w=S.getReturnType().getText();p.push(await V(s,a,f,u,v,x,w,y.isAsync(),i,t))}}}const h=Nt(a);if(h.length>0)for(const{name:m,sig:T}of h){if(q(m))continue;const d=G(T),y=T.getReturnType().getText(),g=[...u?[u]:[],O(m)];p.push(await K(s,a,f,g,m,d,y,!1,i,t))}return p}function $t(e,t,n,o){const r=new Set,i=s=>{if(Array.isArray(s))return s.map(i);if(!s||typeof s!="object"||r.has(s))return s;r.add(s);try{const a=s,c={};for(const[l,u]of Object.entries(a)){if(l==="definitions"||l==="$defs"){const f=l,p=t[f];for(const[b,h]of Object.entries(u)){const m=i(h),T=p[b];if(T!==void 0&&JSON.stringify(T)!==JSON.stringify(m))throw new Error(`[apigen-core-client] Function "${n}": param "${o}" contributes a "${f}.${b}" definition that conflicts with an identically-named definition already hoisted from another param/output in the same function. Two structurally different types share the same generated definition key, so apigen cannot safely merge them into one function-level schema.`);p[b]=m}continue}c[l]=i(u)}return c}finally{r.delete(s)}};return i(e)}async function V(e,t,n,o,r,i,s,a,c,l){const u=O(r);return K(e,t,n,o?[o,u]:[u],r,i,s,a,c,l)}async function K(e,t,n,o,r,i,s,a,c,l){const u=i.length>0&&i[0].name==="ctx",f=i.filter(g=>g.name!=="ctx"),p=f.filter(g=>!g.optional).map(g=>g.name),b={},h={definitions:{},$defs:{}};for(const g of f){const v=await $(e,t,g.type,c,l),S=$t(v,h,r,g.name);g.defaultValue!==void 0&&wt(S,g.defaultValue),b[g.name]=S}const m=s.replace(/^Promise<(.+)>$/,"$1").trim(),T=await $(e,t,m,c,l),d={type:"object",properties:b,required:p,...Object.keys(h.definitions).length>0?{definitions:h.definitions}:{},...Object.keys(h.$defs).length>0?{$defs:h.$defs}:{}};return{id:$e(n,o),host:"ts",namespace:n,path:o,kind:"action",async:a,streaming:!1,safe:!1,input:d,output:T,envelope:{},typeText:{lang:"ts",input:Ct(i),output:m},...u?{hasCtx:!0}:{}}}function At(e,t,n,o){const r=O(n),i=t?[t,r]:[r];return{id:$e(e,i),host:"ts",namespace:e,path:i,kind:"query",async:!1,streaming:!1,safe:!0,input:{type:"object",properties:{},required:[]},output:o,envelope:{},typeText:null}}function $e(e,t){return(e.raw?[e,...t]:t).map(o=>o.words.join("-")).join("/")}function re(e){return e.split(/[-_.]+/).flatMap(t=>t.replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").split("_").filter(Boolean)).map(t=>t.toLowerCase()).filter(Boolean)}function O(e){return{raw:e,words:re(e)}}function Ot(e){return e.replace(/\.[^.]+$/,"").replace(/[._]+/g,"-")}function Nt(e){const t=[];for(const n of e.getStatements()){if(n.getKindName()!=="ExpressionStatement")continue;const o=n.getExpression();if(o.getKindName()!=="BinaryExpression")continue;const r=o;if(r.getLeft().getText().trim()!=="module.exports"||r.getOperatorToken().getKindName()!=="EqualsToken")continue;const s=r.getRight(),a=s.getType();for(const c of a.getProperties()){const u=c.getTypeAtLocation(s).getCallSignatures();u.length!==0&&t.push({name:c.getName(),sig:u[0]})}}return t}function kt(e){let t;for(const n of e){if(n.getKindName()!=="FunctionDeclaration")continue;const o=n;if(t||(t=o),o.getBody())return o}return t}function fe(e,t){return e.getParameters().map(n=>{var s;const o=n.getDeclarations(),r=o.length>0&&o[0].getKindName()==="Parameter"?o[0]:null,i=n.isOptional()||((r==null?void 0:r.hasInitializer())??!1)||(((s=r==null?void 0:r.hasQuestionToken)==null?void 0:s.call(r))??!1);return{name:n.getName(),type:n.getTypeAtLocation(e.getDeclaration()).getText(),optional:i,defaultValue:ne(r,n.getName(),t)}})}function pe(e,t,n){return e.getParameters().map(o=>{var a;const r=o.getDeclarations(),i=r.length>0&&r[0].getKindName()==="Parameter"?r[0]:null,s=o.isOptional()||((i==null?void 0:i.hasInitializer())??!1)||(((a=i==null?void 0:i.hasQuestionToken)==null?void 0:a.call(i))??!1);return{name:o.getName(),type:o.getTypeAtLocation(t).getText(),optional:s,defaultValue:ne(i,o.getName(),n??t)}})}function G(e,t){return e.getParameters().map(n=>{var s,a,c;const o=n.getDeclarations(),r=o.length>0&&o[0].getKindName()==="Parameter"?o[0]:null,i=n.isOptional()||((r==null?void 0:r.hasInitializer())??!1)||(((s=r==null?void 0:r.hasQuestionToken)==null?void 0:s.call(r))??!1);return{name:n.getName(),type:r?r.getType().getText():((c=(a=n.getValueDeclaration())==null?void 0:a.getType())==null?void 0:c.getText())??"unknown",optional:i,defaultValue:ne(r,n.getName(),t)}})}function Ct(e){const t=e.filter(n=>n.name!=="ctx");return t.length===0?"()":"("+t.map(n=>`${n.name}${n.optional?"?":""}: ${n.type}`).join(", ")+")"}function q(e){return!!(e==="__samples__"||e.startsWith("__"))}function C(e,t,n=new Set){if(e.getCallSignatures().length>0||e.getConstructSignatures().length>0)return!1;if(e.isString()||e.isNumber()||e.isBoolean()||e.isNull()||e.isUndefined()||e.isStringLiteral()||e.isNumberLiteral()||e.isBooleanLiteral()||e.isEnumLiteral())return!0;if(e.isArray()||e.isReadonlyArray()){const o=e.getArrayElementType();return o?C(o,t,n):!1}if(e.isTuple())return e.getTupleElements().every(o=>C(o,t,n));if(e.isUnion())return e.getUnionTypes().every(o=>C(o,t,n));if(e.isIntersection())return e.getIntersectionTypes().every(o=>C(o,t,n));if(e.isObject()){const o=e.getText(t);if(n.has(o))return!0;n.add(o);const r=e.getStringIndexType(),i=e.getNumberIndexType();if(r||i)return[r,i].every(a=>!a||C(a,t,n));const s=e.getProperties();return s.length===0?!0:s.every(a=>{const c=a.getTypeAtLocation(t);return C(c,t,n)})}return!1}async function Et(e){const t=e.session===void 0,n=be(e.session??te());try{return await It(e,n)}finally{t&&n.dispose()}}async function It(e,t){const{sourceFile:n,namespace:o="",tsconfig:r,includeInstances:i=!1}=e,s=t.projectFor(r),a=t.sourceFileFor(n,r),c=D.basename(n),l=R(Rt(c)),u=R(o),f=[];for(const[p,b]of a.getExportedDeclarations()){const h=b.find(d=>d.getKindName()==="ClassDeclaration");if(!h)continue;const m=p==="default"?h.getName():p;if(!m||H(m))continue;const T=R(m);for(const d of h.getStaticMethods()){const y=d.getName();if(H(y))continue;const g=d.getScope();if(g===I.Scope.Private||g===I.Scope.Protected)continue;const v=d.getSignature(),S=Z(v,d),x=v.getReturnType().getText(),w=d.isAsync(),P=[l,T,R(y)];f.push(await Ft(s,a,u,P,S,x,w,r,t))}if(i){{const y=h.getConstructors()[0]??null;let g=[];if(y){const j=y.getSignature();g=Z(j,y)}const v=[l,T],S=ee(u,v),x=g.filter(j=>j.name!=="ctx"),w=x.filter(j=>!j.optional).map(j=>j.name),P={};for(const j of x)P[j.name]=await $(s,a,j.type,r,t);f.push({id:S,host:"ts",namespace:u,path:v,kind:"constructor",async:!1,streaming:!1,safe:!1,input:{type:"object",properties:P,required:w},output:{type:"object",properties:{instanceId:{type:"string"}},required:["instanceId"]},envelope:{},typeText:{lang:"ts",input:_t(g),output:"{ instanceId: string }"}})}for(const d of h.getInstanceMethods()){const y=d.getName();if(H(y))continue;const g=d.getScope();if(g===I.Scope.Private||g===I.Scope.Protected)continue;const v=d.getSignature(),S=Z(v,d),x=v.getReturnType().getText(),w=d.isAsync(),P=[l,T,R(y)],j=ee(u,P),A=S.filter(N=>N.name!=="ctx"),U=A.filter(N=>!N.optional).map(N=>N.name),L={};for(const N of A)L[N.name]=await $(s,a,N.type,r,t);const M=x.replace(/^Promise<(.+)>$/,"$1").trim(),Fe=await $(s,a,M,r,t);f.push({id:j,host:"ts",namespace:u,path:P,kind:"instance-method",async:w,streaming:!1,safe:!1,input:{type:"object",properties:L,required:U},output:Fe,envelope:{type:"object",properties:{instanceId:{type:"string"}},required:["instanceId"]},typeText:{lang:"ts",input:Ae(S),output:M}})}}}return f}async function Ft(e,t,n,o,r,i,s,a,c){const l=r.filter(m=>m.name!=="ctx"),u=l.filter(m=>!m.optional).map(m=>m.name),f={};for(const m of l)f[m.name]=await $(e,t,m.type,a,c);const p=i.replace(/^Promise<(.+)>$/,"$1").trim(),b=await $(e,t,p,a,c);return{id:ee(n,o),host:"ts",namespace:n,path:o,kind:"action",async:s,streaming:!1,safe:!1,input:{type:"object",properties:f,required:u},output:b,envelope:{},typeText:{lang:"ts",input:Ae(r),output:p}}}function ee(e,t){return(e.raw?[e,...t]:t).map(o=>o.words.join("-")).join("/")}function R(e){return{raw:e,words:re(e)}}function Rt(e){return e.replace(/\.[^.]+$/,"").replace(/[._]+/g,"-")}function Z(e,t){return e.getParameters().map(n=>{var s;const o=n.getDeclarations(),r=o.length>0&&o[0].getKindName()==="Parameter"?o[0]:null,i=n.isOptional()||((r==null?void 0:r.hasInitializer())??!1)||(((s=r==null?void 0:r.hasQuestionToken)==null?void 0:s.call(r))??!1);return{name:n.getName(),type:n.getTypeAtLocation(t).getText(),optional:i}})}function Ae(e){const t=e.filter(n=>n.name!=="ctx");return t.length===0?"()":"("+t.map(n=>`${n.name}${n.optional?"?":""}: ${n.type}`).join(", ")+")"}function _t(e){return e.length===0?"()":"("+e.map(t=>`${t.name}${t.optional?"?":""}: ${t.type}`).join(", ")+")"}function H(e){return!!(e==="__samples__"||e.startsWith("__")||e.startsWith("_"))}const Lt=new Map([[".ts","ts"],[".tsx","ts"],[".mts","ts"],[".cts","ts"],[".py","py"],[".rs","rust"],[".go","go"],[".java","java"]]);function Oe(e){const t=De.extname(e).toLowerCase();return Lt.get(t)}function Ne(e){return e.language??"ts"}function ke(e,t){const n=Oe(t);return n===void 0?!1:n===Ne(e)}function Mt(e,t){return t.filter(n=>ke(e,n))}function Vt(e){return{oneOf:[{type:"object",required:["index","status","value"],properties:{index:{type:"integer"},status:{type:"string",enum:["fulfilled"]},value:e}},{type:"object",required:["index","status","chunks"],properties:{index:{type:"integer"},status:{type:"string",enum:["fulfilled"]},chunks:{type:"array"}}},{type:"object",required:["index","status","reason"],properties:{index:{type:"integer"},status:{type:"string",enum:["rejected"]},reason:{},chunksDelivered:{type:"integer"}}}]}}function Ce(e){return{operationConst:e.id,itemsSchema:e.input,resultSchema:Vt(e.output)}}function Ee(e,t={}){const n=new Set(t.exclude??[]),o=new Map;for(const r of e){if(n.has(r.id))continue;const i=o.get(r.kind);i?i.push(r):o.set(r.kind,[r])}return o}function me(e){return{type:"string",enum:[e]}}function ge(e,t){return{type:"object",required:["operation","items"],properties:{operation:t,items:{type:"array",items:e.itemsSchema},concurrency:{type:"number"},mode:{type:"string",enum:["parallel","serial","chained"]},onItemError:{type:"string",enum:["continue","abort"]},itemTimeoutMs:{type:"number"}},additionalProperties:!0}}function Ie(e){if(e.length===0)throw new Error("buildBatchKindSchema: at least one operation is required");const t=e.map(Ce);if(e.length===1){const[r]=e,[i]=t;return{input:ge(i,me(r.id)),output:{type:"array",items:i.resultSchema}}}const n=e.map((r,i)=>ge(t[i],me(r.id))),o=W(n);return{input:{oneOf:n,...o?{discriminator:o}:{}},output:{oneOf:t.map(r=>({type:"array",items:r.resultSchema}))},...o?{discriminator:o}:{}}}function qt(e,t={}){const n=Ee(e.operations,t),o=[];for(const[r,i]of n){const{input:s,output:a}=Ie(i),c=de(`_batch/${r}`,e,{kind:r,safe:r==="query",input:s,output:a});o.push({...c,operationIds:i.map(l=>l.id)})}return o}exports.buildBatchKindSchema=Ie;exports.buildBatchMountedOperations=qt;exports.clearPersistentProjectCache=Ue;exports.composeSchemas=Qe;exports.createExtractionSession=te;exports.deriveBatchOperationBranch=Ce;exports.effectiveLanguage=Ne;exports.extract=jt;exports.extractClasses=Et;exports.groupBatchableOperationsByKind=Ee;exports.isPrimitiveOnlyInputSchema=Se;exports.languageOfSource=Oe;exports.pluginConsumesSource=ke;exports.pluginsToEnvelopeMiddlewares=Ze;exports.sourcesForPlugin=Mt;exports.syntheticOp=de;exports.tokenize=re;
|