@aid-framework/generator-ts-vercel 0.0.0 → 0.1.48

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.
Files changed (80) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +123 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/emit/agents.d.ts +62 -0
  5. package/dist/emit/agents.d.ts.map +1 -0
  6. package/dist/emit/agents.js +256 -0
  7. package/dist/emit/agents.js.map +1 -0
  8. package/dist/emit/business.d.ts +23 -0
  9. package/dist/emit/business.d.ts.map +1 -0
  10. package/dist/emit/business.js +414 -0
  11. package/dist/emit/business.js.map +1 -0
  12. package/dist/emit/control.d.ts +40 -0
  13. package/dist/emit/control.d.ts.map +1 -0
  14. package/dist/emit/control.js +108 -0
  15. package/dist/emit/control.js.map +1 -0
  16. package/dist/emit/file.d.ts +64 -0
  17. package/dist/emit/file.d.ts.map +1 -0
  18. package/dist/emit/file.js +80 -0
  19. package/dist/emit/file.js.map +1 -0
  20. package/dist/emit/guardrails.d.ts +45 -0
  21. package/dist/emit/guardrails.d.ts.map +1 -0
  22. package/dist/emit/guardrails.js +192 -0
  23. package/dist/emit/guardrails.js.map +1 -0
  24. package/dist/emit/infrastructure.d.ts +15 -0
  25. package/dist/emit/infrastructure.d.ts.map +1 -0
  26. package/dist/emit/infrastructure.js +238 -0
  27. package/dist/emit/infrastructure.js.map +1 -0
  28. package/dist/emit/pipelines.d.ts +46 -0
  29. package/dist/emit/pipelines.d.ts.map +1 -0
  30. package/dist/emit/pipelines.js +1015 -0
  31. package/dist/emit/pipelines.js.map +1 -0
  32. package/dist/emit/prompts.d.ts +14 -0
  33. package/dist/emit/prompts.d.ts.map +1 -0
  34. package/dist/emit/prompts.js +61 -0
  35. package/dist/emit/prompts.js.map +1 -0
  36. package/dist/emit/retrieval.d.ts +19 -0
  37. package/dist/emit/retrieval.d.ts.map +1 -0
  38. package/dist/emit/retrieval.js +206 -0
  39. package/dist/emit/retrieval.js.map +1 -0
  40. package/dist/emit/schemas.d.ts +22 -0
  41. package/dist/emit/schemas.d.ts.map +1 -0
  42. package/dist/emit/schemas.js +145 -0
  43. package/dist/emit/schemas.js.map +1 -0
  44. package/dist/emit/text.d.ts +86 -0
  45. package/dist/emit/text.d.ts.map +1 -0
  46. package/dist/emit/text.js +242 -0
  47. package/dist/emit/text.js.map +1 -0
  48. package/dist/emit/tools.d.ts +15 -0
  49. package/dist/emit/tools.d.ts.map +1 -0
  50. package/dist/emit/tools.js +225 -0
  51. package/dist/emit/tools.js.map +1 -0
  52. package/dist/errors.d.ts +12 -0
  53. package/dist/errors.d.ts.map +1 -0
  54. package/dist/errors.js +16 -0
  55. package/dist/errors.js.map +1 -0
  56. package/dist/index.d.ts +36 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +47 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/manifest.d.ts +48 -0
  61. package/dist/manifest.d.ts.map +1 -0
  62. package/dist/manifest.js +88 -0
  63. package/dist/manifest.js.map +1 -0
  64. package/dist/names.d.ts +57 -0
  65. package/dist/names.d.ts.map +1 -0
  66. package/dist/names.js +294 -0
  67. package/dist/names.js.map +1 -0
  68. package/dist/placeholders.d.ts +48 -0
  69. package/dist/placeholders.d.ts.map +1 -0
  70. package/dist/placeholders.js +114 -0
  71. package/dist/placeholders.js.map +1 -0
  72. package/dist/plan.d.ts +18 -0
  73. package/dist/plan.d.ts.map +1 -0
  74. package/dist/plan.js +81 -0
  75. package/dist/plan.js.map +1 -0
  76. package/dist/validate.d.ts +88 -0
  77. package/dist/validate.d.ts.map +1 -0
  78. package/dist/validate.js +790 -0
  79. package/dist/validate.js.map +1 -0
  80. package/package.json +43 -14
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Byte-level helpers every emitter goes through.
3
+ *
4
+ * A generated file is the banner, then the body, then exactly one trailing newline and
5
+ * no tabs. `normalizeText` from the SDK enforces the newline half so the determinism
6
+ * check and the emitters agree by construction rather than by convention.
7
+ */
8
+ import { GENERATED_BANNER_MARKER, sha256Hex } from '@aid-framework/generator-sdk';
9
+ export { GENERATED_BANNER_MARKER, sha256Hex };
10
+ /** The `DO NOT EDIT` banner every generated file starts with. */
11
+ export declare function banner(): string;
12
+ /**
13
+ * The banner a business seed carries. It says the file is *not* owned by the generator
14
+ * and is never overwritten, because that sentence is the whole point of the tier.
15
+ */
16
+ export declare function businessBanner(): string;
17
+ /** Join sections with single blank lines, dropping empty ones. */
18
+ export declare function sections(...parts: readonly string[]): string;
19
+ /** A line fragment that may be omitted; a blank string is a real blank line. */
20
+ export type LinePart = string | readonly string[] | false | undefined;
21
+ /** Flatten line fragments, dropping only the omitted ones so blank lines survive. */
22
+ export declare function lines(...parts: readonly LinePart[]): string[];
23
+ /** A complete generated module body: banner, then sections, then one newline. */
24
+ export declare function moduleText(...parts: readonly string[]): string;
25
+ /** A complete business seed body. */
26
+ export declare function seedText(...parts: readonly string[]): string;
27
+ /**
28
+ * A multi-line string as the TS literal whose value is exactly that string.
29
+ *
30
+ * No re-indentation: template contents are emitted verbatim, because the value is the
31
+ * prompt text a model is shown and adding indentation to each line would change it.
32
+ */
33
+ export declare function templateLiteral(value: string): string;
34
+ /** Render a JSON object as TypeScript source with sorted keys. */
35
+ export declare function jsonLiteral(value: unknown): string;
36
+ /**
37
+ * The column budget. Emitted code is formatted the way the repository formatter would
38
+ * format it, because the example keeps its generated tree inside `biome ci` rather than
39
+ * excluding it: `py-fastapi` keeps its emitted tree `ruff format --check` clean, and an
40
+ * exemption here would be the weaker promise.
41
+ */
42
+ export declare const LINE_WIDTH = 100;
43
+ export declare function fits(indent: string, text: string): boolean;
44
+ export type Entry = readonly [string, string];
45
+ /** An object literal: inline when it fits, otherwise one entry per line. */
46
+ export declare function objectLiteral(entries: readonly Entry[], indent: string): string;
47
+ /** An array literal: inline when it fits, otherwise one item per line. */
48
+ export declare function arrayLiteral(items: readonly string[], indent: string): string;
49
+ /** A named object argument spread over lines when the call would not fit. */
50
+ export declare function callOf(callee: string, entries: readonly Entry[], indent: string): string;
51
+ /**
52
+ * The order the import organiser uses: natural (so `x2` sorts before `x10`),
53
+ * case-insensitive, with an uppercase-first tie-break on the first character whose case
54
+ * differs, and shorter-first when one name is a prefix of the other. That is why
55
+ * `RetrievalMetricSpec` sorts before `retrievalMetrics`, `ALIASES` before `aB`, and
56
+ * `Pipeline` before `PipelineError`. The `type` modifier is not part of the key.
57
+ */
58
+ export declare function compareNames(a: string, b: string): number;
59
+ /** A list of names sorted the way the import organisers sort them. */
60
+ export declare function sortedNames(names: Iterable<string>): string[];
61
+ export interface ImportName {
62
+ readonly name: string;
63
+ readonly type: boolean;
64
+ }
65
+ /**
66
+ * One import statement. Type-only members carry the inline `type` modifier, which is
67
+ * what the formatter wants when a statement mixes values and types; a statement that is
68
+ * entirely types is written `import type`.
69
+ */
70
+ export declare function importStatement(from: string, names: readonly ImportName[]): string;
71
+ /** An `export { a, b as c } from '...'` statement, expanded when it would not fit. */
72
+ export declare function exportStatement(from: string, names: readonly Entry[]): string;
73
+ /** An `export { a, b }` statement for names declared in the same module. */
74
+ export declare function localExportStatement(names: readonly string[]): string;
75
+ /**
76
+ * Order a group of import or export statements by their specifier, the way the
77
+ * import organiser does. Statements in one group have to be emitted in this order
78
+ * rather than in the order the IR happens to list them.
79
+ */
80
+ export declare function sortStatements(statements: readonly {
81
+ readonly from: string;
82
+ readonly text: string;
83
+ }[]): string[];
84
+ /** Render a literal value as formatted TypeScript source, expanding what would not fit. */
85
+ export declare function tsValue(value: unknown, indent: string): string;
86
+ //# sourceMappingURL=text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../src/emit/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,242 @@
1
+ /**
2
+ * Byte-level helpers every emitter goes through.
3
+ *
4
+ * A generated file is the banner, then the body, then exactly one trailing newline and
5
+ * no tabs. `normalizeText` from the SDK enforces the newline half so the determinism
6
+ * check and the emitters agree by construction rather than by convention.
7
+ */
8
+ import { GENERATED_BANNER_MARKER, generatedBanner, normalizeText, sha256Hex, } from '@aid-framework/generator-sdk';
9
+ import { GENERATOR_NAME, GENERATOR_VERSION } from '../manifest.js';
10
+ import { propertyKey, stringLiteral } from '../names.js';
11
+ export { GENERATED_BANNER_MARKER, sha256Hex };
12
+ /** The `DO NOT EDIT` banner every generated file starts with. */
13
+ export function banner() {
14
+ return generatedBanner({ generator: GENERATOR_NAME, version: GENERATOR_VERSION, comment: '//' });
15
+ }
16
+ /**
17
+ * The banner a business seed carries. It says the file is *not* owned by the generator
18
+ * and is never overwritten, because that sentence is the whole point of the tier.
19
+ */
20
+ export function businessBanner() {
21
+ return [
22
+ `// Created once by AID Framework "${GENERATOR_NAME}" v${GENERATOR_VERSION}. Edit freely.`,
23
+ '// This file is yours: the generator seeds it on first run and never overwrites it.',
24
+ ].join('\n');
25
+ }
26
+ /**
27
+ * Drop leading and trailing newlines.
28
+ *
29
+ * A scan, not a regex: `/^\n+/` is linear but `/\n+$/` is unanchored on the left, so a
30
+ * body carrying many newlines makes it retry "one-or-more, then end of input" at every
31
+ * position. CodeQL reads spec-derived strings as untrusted input and was right to flag
32
+ * that shape (`js/polynomial-redos`); this is linear in the part's length.
33
+ */
34
+ function trimBlankEdges(part) {
35
+ let start = 0;
36
+ while (start < part.length && part[start] === '\n')
37
+ start += 1;
38
+ let end = part.length;
39
+ while (end > start && part[end - 1] === '\n')
40
+ end -= 1;
41
+ return part.slice(start, end);
42
+ }
43
+ /** Join sections with single blank lines, dropping empty ones. */
44
+ export function sections(...parts) {
45
+ return parts
46
+ .map(trimBlankEdges)
47
+ .filter((part) => part.length > 0)
48
+ .join('\n\n');
49
+ }
50
+ /** Flatten line fragments, dropping only the omitted ones so blank lines survive. */
51
+ export function lines(...parts) {
52
+ const collected = [];
53
+ for (const part of parts) {
54
+ if (part === false || part === undefined)
55
+ continue;
56
+ if (typeof part === 'string')
57
+ collected.push(part);
58
+ else
59
+ collected.push(...part);
60
+ }
61
+ return collected;
62
+ }
63
+ /** A complete generated module body: banner, then sections, then one newline. */
64
+ export function moduleText(...parts) {
65
+ return normalizeText(`${banner()}\n\n${sections(...parts)}`);
66
+ }
67
+ /** A complete business seed body. */
68
+ export function seedText(...parts) {
69
+ return normalizeText(`${businessBanner()}\n\n${sections(...parts)}`);
70
+ }
71
+ /**
72
+ * A multi-line string as the TS literal whose value is exactly that string.
73
+ *
74
+ * No re-indentation: template contents are emitted verbatim, because the value is the
75
+ * prompt text a model is shown and adding indentation to each line would change it.
76
+ */
77
+ export function templateLiteral(value) {
78
+ const escaped = value.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$\{/g, '\\${');
79
+ return `\`${escaped}\``;
80
+ }
81
+ /** Render a JSON object as TypeScript source with sorted keys. */
82
+ export function jsonLiteral(value) {
83
+ const text = JSON.stringify(value, null, 2);
84
+ return text ?? 'null';
85
+ }
86
+ /**
87
+ * The column budget. Emitted code is formatted the way the repository formatter would
88
+ * format it, because the example keeps its generated tree inside `biome ci` rather than
89
+ * excluding it: `py-fastapi` keeps its emitted tree `ruff format --check` clean, and an
90
+ * exemption here would be the weaker promise.
91
+ */
92
+ export const LINE_WIDTH = 100;
93
+ export function fits(indent, text) {
94
+ return indent.length + text.length <= LINE_WIDTH;
95
+ }
96
+ /** An object literal: inline when it fits, otherwise one entry per line. */
97
+ export function objectLiteral(entries, indent) {
98
+ if (entries.length === 0)
99
+ return '{}';
100
+ const inline = `{ ${entries.map(([key, value]) => `${key}: ${value}`).join(', ')} }`;
101
+ if (fits(indent, inline))
102
+ return inline;
103
+ const lines = entries.map(([key, value]) => `${indent} ${key}: ${value},`);
104
+ return ['{', ...lines, `${indent}}`].join('\n');
105
+ }
106
+ /** An array literal: inline when it fits, otherwise one item per line. */
107
+ export function arrayLiteral(items, indent) {
108
+ if (items.length === 0)
109
+ return '[]';
110
+ const inline = `[${items.join(', ')}]`;
111
+ // An array of two or more objects is always one item per line, even when the inline
112
+ // form fits: `biome` expands it that way, measured on both a top-level array of two
113
+ // inline objects and the same array as a property of a multi-line object, and keeps a
114
+ // one-element array inline. Emitting the inline form there is a `biome ci` failure in
115
+ // the consumer's project rather than a matter of taste.
116
+ const expandedObjects = items.length > 1 && items.every((item) => item.startsWith('{'));
117
+ if (!expandedObjects && fits(indent, inline))
118
+ return inline;
119
+ return ['[', ...items.map((item) => `${indent} ${item},`), `${indent}]`].join('\n');
120
+ }
121
+ /** A named object argument spread over lines when the call would not fit. */
122
+ export function callOf(callee, entries, indent) {
123
+ const argument = objectLiteral(entries, `${indent} `);
124
+ return `${callee}(${argument})`;
125
+ }
126
+ function isDigit(character) {
127
+ return character >= '0' && character <= '9';
128
+ }
129
+ /**
130
+ * The order the import organiser uses: natural (so `x2` sorts before `x10`),
131
+ * case-insensitive, with an uppercase-first tie-break on the first character whose case
132
+ * differs, and shorter-first when one name is a prefix of the other. That is why
133
+ * `RetrievalMetricSpec` sorts before `retrievalMetrics`, `ALIASES` before `aB`, and
134
+ * `Pipeline` before `PipelineError`. The `type` modifier is not part of the key.
135
+ */
136
+ export function compareNames(a, b) {
137
+ let left = 0;
138
+ let right = 0;
139
+ while (left < a.length && right < b.length) {
140
+ const leftChar = a[left];
141
+ const rightChar = b[right];
142
+ if (isDigit(leftChar) && isDigit(rightChar)) {
143
+ let leftEnd = left;
144
+ while (leftEnd < a.length && isDigit(a[leftEnd]))
145
+ leftEnd += 1;
146
+ let rightEnd = right;
147
+ while (rightEnd < b.length && isDigit(b[rightEnd]))
148
+ rightEnd += 1;
149
+ const leftNumber = Number(a.slice(left, leftEnd));
150
+ const rightNumber = Number(b.slice(right, rightEnd));
151
+ if (leftNumber !== rightNumber)
152
+ return leftNumber < rightNumber ? -1 : 1;
153
+ left = leftEnd;
154
+ right = rightEnd;
155
+ continue;
156
+ }
157
+ const leftLower = leftChar.toLowerCase();
158
+ const rightLower = rightChar.toLowerCase();
159
+ if (leftLower !== rightLower)
160
+ return leftLower < rightLower ? -1 : 1;
161
+ if (leftChar !== rightChar)
162
+ return leftChar < rightChar ? -1 : 1;
163
+ left += 1;
164
+ right += 1;
165
+ }
166
+ const leftRest = a.length - left;
167
+ const rightRest = b.length - right;
168
+ if (leftRest !== rightRest)
169
+ return leftRest < rightRest ? -1 : 1;
170
+ return 0;
171
+ }
172
+ /** A list of names sorted the way the import organisers sort them. */
173
+ export function sortedNames(names) {
174
+ return [...names].sort(compareNames);
175
+ }
176
+ /**
177
+ * One import statement. Type-only members carry the inline `type` modifier, which is
178
+ * what the formatter wants when a statement mixes values and types; a statement that is
179
+ * entirely types is written `import type`.
180
+ */
181
+ export function importStatement(from, names) {
182
+ const sorted = [...names].sort((a, b) => compareNames(a.name, b.name));
183
+ if (sorted.every((entry) => entry.type)) {
184
+ return `import type { ${sorted.map((entry) => entry.name).join(', ')} } from ${stringLiteral(from)};`;
185
+ }
186
+ const members = sorted.map((entry) => (entry.type ? `type ${entry.name}` : entry.name));
187
+ const inline = `import { ${members.join(', ')} } from ${stringLiteral(from)};`;
188
+ if (fits('', inline))
189
+ return inline;
190
+ return [
191
+ 'import {',
192
+ ...members.map((member) => ` ${member},`),
193
+ `} from ${stringLiteral(from)};`,
194
+ ].join('\n');
195
+ }
196
+ /** An `export { a, b as c } from '...'` statement, expanded when it would not fit. */
197
+ export function exportStatement(from, names) {
198
+ const sorted = [...names].sort((a, b) => compareNames(a[0], b[0]));
199
+ const members = sorted.map(([local, exported]) => local === exported ? local : `${local} as ${exported}`);
200
+ const inline = `export { ${members.join(', ')} } from ${stringLiteral(from)};`;
201
+ if (fits('', inline))
202
+ return inline;
203
+ return [
204
+ 'export {',
205
+ ...members.map((member) => ` ${member},`),
206
+ `} from ${stringLiteral(from)};`,
207
+ ].join('\n');
208
+ }
209
+ /** An `export { a, b }` statement for names declared in the same module. */
210
+ export function localExportStatement(names) {
211
+ return `export { ${sortedNames(names).join(', ')} };`;
212
+ }
213
+ /**
214
+ * Order a group of import or export statements by their specifier, the way the
215
+ * import organiser does. Statements in one group have to be emitted in this order
216
+ * rather than in the order the IR happens to list them.
217
+ */
218
+ export function sortStatements(statements) {
219
+ return [...statements]
220
+ .sort((a, b) => compareNames(a.from, b.from))
221
+ .map((statement) => statement.text);
222
+ }
223
+ /** Render a literal value as formatted TypeScript source, expanding what would not fit. */
224
+ export function tsValue(value, indent) {
225
+ if (value === null)
226
+ return 'null';
227
+ if (typeof value === 'string')
228
+ return stringLiteral(value);
229
+ if (typeof value === 'number')
230
+ return Number.isFinite(value) ? String(value) : 'null';
231
+ if (typeof value === 'boolean')
232
+ return value ? 'true' : 'false';
233
+ if (Array.isArray(value)) {
234
+ return arrayLiteral(value.map((item) => tsValue(item, `${indent} `)), indent);
235
+ }
236
+ if (typeof value === 'object') {
237
+ const entries = Object.entries(value).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0);
238
+ return objectLiteral(entries.map(([key, item]) => [propertyKey(key), tsValue(item, `${indent} `)]), indent);
239
+ }
240
+ return 'null';
241
+ }
242
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/emit/text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `generated/contracts/*` and `generated/tools/*`.
3
+ *
4
+ * A tool has two halves: the contract (what an implementation must accept and return)
5
+ * and the adapter (the `Tool` the executor and the model see). Splitting them is what
6
+ * lets `business/tools/<name>.ts` be hand-written against the contract without the
7
+ * generator ever needing to read it back.
8
+ */
9
+ import type { IR, ToolShape } from '@aid-framework/ir';
10
+ import { type EmittedFile } from './file.js';
11
+ export declare function emitContractsIndex(ir: IR): EmittedFile;
12
+ export declare function emitContractModule(ir: IR, tool: ToolShape): EmittedFile;
13
+ export declare function emitToolAdapter(ir: IR, tool: ToolShape): EmittedFile;
14
+ export declare function emitToolsIndex(ir: IR): EmittedFile;
15
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/emit/tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAsB,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAE,KAAK,WAAW,EAAuD,MAAM,WAAW,CAAC;AAyBlG,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,EAAE,GAAG,WAAW,CAetD;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,WAAW,CAgDvE;AA+BD,wBAAgB,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,WAAW,CAoDpE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,EAAE,GAAG,WAAW,CAsElD"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * `generated/contracts/*` and `generated/tools/*`.
3
+ *
4
+ * A tool has two halves: the contract (what an implementation must accept and return)
5
+ * and the adapter (the `Tool` the executor and the model see). Splitting them is what
6
+ * lets `business/tools/<name>.ts` be hand-written against the contract without the
7
+ * generator ever needing to read it back.
8
+ */
9
+ import { className, literal, memberAccess, propertyKey, toSnakeCase } from '../names.js';
10
+ import { generated, paths, toolAdapterPath, toolContractPath } from './file.js';
11
+ import { fits, importStatement, lines, moduleText, sortStatements } from './text.js';
12
+ /** The TypeScript type a `TypeRef` denotes, in a signature position. */
13
+ function refType(ref) {
14
+ if (ref.kind === 'named')
15
+ return className(ref.name);
16
+ switch (ref.name) {
17
+ case 'string':
18
+ return 'string';
19
+ case 'number':
20
+ case 'integer':
21
+ return 'number';
22
+ case 'boolean':
23
+ return 'boolean';
24
+ default:
25
+ return 'unknown';
26
+ }
27
+ }
28
+ function typeIndex(ir) {
29
+ const map = new Map();
30
+ for (const shape of ir.types)
31
+ map.set(shape.id, shape);
32
+ return map;
33
+ }
34
+ export function emitContractsIndex(ir) {
35
+ void ir;
36
+ const body = [
37
+ '/** What a tool implementation is called with, beside the request itself. */',
38
+ 'export interface ToolContext {',
39
+ ' readonly name: string;',
40
+ ' readonly arguments: Readonly<Record<string, unknown>>;',
41
+ '}',
42
+ '',
43
+ '/** Build the context a business tool receives. */',
44
+ 'export function toolContext(name: string, args: Readonly<Record<string, unknown>>): ToolContext {',
45
+ ' return { name, arguments: args };',
46
+ '}',
47
+ ].join('\n');
48
+ return generated(paths.contractsIndex, moduleText(body));
49
+ }
50
+ export function emitContractModule(ir, tool) {
51
+ const index = typeIndex(ir);
52
+ const input = refType(tool.input);
53
+ const output = refType(tool.output);
54
+ const handler = `${className(tool.id)}Handler`;
55
+ const typeImports = [];
56
+ if (tool.input.kind === 'named' && index.has(tool.input.name))
57
+ typeImports.push(className(tool.input.name));
58
+ if (tool.output.kind === 'named' &&
59
+ index.has(tool.output.name) &&
60
+ tool.output.name !== (tool.input.kind === 'named' ? tool.input.name : undefined)) {
61
+ typeImports.push(className(tool.output.name));
62
+ }
63
+ const header = typeImports.length === 0
64
+ ? importStatement('./index.js', [{ name: 'ToolContext', type: true }])
65
+ : sortStatements([
66
+ {
67
+ from: '../schemas.js',
68
+ text: importStatement('../schemas.js', typeImports.map((name) => ({ name, type: true }))),
69
+ },
70
+ {
71
+ from: './index.js',
72
+ text: importStatement('./index.js', [{ name: 'ToolContext', type: true }]),
73
+ },
74
+ ]).join('\n');
75
+ const signature = `export type ${handler} = (context: ToolContext, request: ${input}) => Promise<${output}>;`;
76
+ const body = [
77
+ `/** What \`${tool.id}\` must implement. */`,
78
+ ...(fits('', signature)
79
+ ? [signature]
80
+ : [
81
+ `export type ${handler} = (`,
82
+ ' context: ToolContext,',
83
+ ` request: ${input},`,
84
+ `) => Promise<${output}>;`,
85
+ ]),
86
+ ].join('\n');
87
+ return generated(toolContractPath(tool.id), moduleText(header, body));
88
+ }
89
+ /** The flat JSON-Schema the runtime's tool validator enforces. */
90
+ function parametersFor(ir, tool) {
91
+ const index = typeIndex(ir);
92
+ const properties = [];
93
+ const required = [];
94
+ if (tool.input.kind === 'named') {
95
+ const shape = index.get(tool.input.name);
96
+ if (shape !== undefined) {
97
+ for (const field of shape.fields) {
98
+ const type = field.type.kind === 'primitive' && field.type.name === 'integer' ? 'integer' : 'string';
99
+ properties.push(` ${propertyKey(field.name)}: { type: ${literal(type)} },`);
100
+ if (field.required)
101
+ required.push(field.name);
102
+ }
103
+ }
104
+ }
105
+ const schema = [
106
+ 'const PARAMETERS: ToolParameters = {',
107
+ " type: 'object',",
108
+ ' additionalProperties: false,',
109
+ ' properties: {',
110
+ ...properties,
111
+ ' },',
112
+ ` required: [${required.map((name) => literal(name)).join(', ')}],`,
113
+ '};',
114
+ ].join('\n');
115
+ return { schema, required };
116
+ }
117
+ export function emitToolAdapter(ir, tool) {
118
+ const index = typeIndex(ir);
119
+ const handler = `${className(tool.id)}Handler`;
120
+ const factory = `as${className(tool.id)}`;
121
+ const inputType = refType(tool.input);
122
+ const inputSchema = tool.input.kind === 'named' && index.has(tool.input.name)
123
+ ? className(tool.input.name)
124
+ : undefined;
125
+ const { schema } = parametersFor(ir, tool);
126
+ const constant = `${toSnakeCase(tool.id).toUpperCase()}_NAME`;
127
+ const header = lines(importStatement('@aid-framework/runtime', [
128
+ { name: 'Tool', type: false },
129
+ { name: 'ToolParameters', type: true },
130
+ ]), importStatement('../contracts/index.js', [{ name: 'toolContext', type: false }]), importStatement(`../contracts/${tool.id}.js`, [{ name: handler, type: true }]), inputSchema !== undefined &&
131
+ importStatement('../schemas.js', [{ name: inputSchema, type: false }])).join('\n');
132
+ const body = [
133
+ `const ${constant} = ${literal(tool.id)};`,
134
+ `const DESCRIPTION = ${literal(tool.description)};`,
135
+ '',
136
+ schema,
137
+ '',
138
+ '/**',
139
+ ` * Bind a \`${tool.id}\` implementation to the tool the executor and the model see.`,
140
+ ' * The request is validated against its schema before the implementation runs, so a',
141
+ ' * malformed tool call is a typed error rather than a downstream surprise.',
142
+ ' */',
143
+ `export function ${factory}(implementation: ${handler}): Tool {`,
144
+ ' return Tool.of({',
145
+ ` name: ${constant},`,
146
+ ' description: DESCRIPTION,',
147
+ ' parameters: PARAMETERS,',
148
+ ' handler: async (args) => {',
149
+ inputSchema === undefined
150
+ ? ` return await implementation(toolContext(${constant}, args), args as ${inputType});`
151
+ : [
152
+ ` const request = ${inputSchema}.parse(args);`,
153
+ ` return await implementation(toolContext(${constant}, args), request);`,
154
+ ].join('\n'),
155
+ ' },',
156
+ ' });',
157
+ '}',
158
+ ].join('\n');
159
+ return generated(toolAdapterPath(tool.id), moduleText(header, body));
160
+ }
161
+ export function emitToolsIndex(ir) {
162
+ const tools = ir.tools;
163
+ const toolImports = tools.flatMap((tool) => [
164
+ { specifier: `../contracts/${tool.id}.js`, name: `${className(tool.id)}Handler`, type: true },
165
+ { specifier: `./${tool.id}.js`, name: `as${className(tool.id)}`, type: false },
166
+ ]);
167
+ const header = [
168
+ importStatement('@aid-framework/runtime', [
169
+ { name: 'ConfigurationError', type: false },
170
+ { name: 'Tool', type: true },
171
+ { name: 'ToolExecutor', type: false },
172
+ ]),
173
+ ...sortStatements([
174
+ ...toolImports.map((entry) => ({
175
+ from: entry.specifier,
176
+ text: importStatement(entry.specifier, [{ name: entry.name, type: entry.type }]),
177
+ })),
178
+ {
179
+ from: '../../business/tools/index.js',
180
+ text: importStatement('../../business/tools/index.js', [
181
+ { name: 'IMPLEMENTATIONS', type: false },
182
+ ]),
183
+ },
184
+ ]),
185
+ ].join('\n');
186
+ const optionLines = tools.map((tool) => ` readonly ${propertyKey(tool.id)}?: ${className(tool.id)}Handler;`);
187
+ const args = tools.map((tool) => {
188
+ const local = `${className(tool.id)}Implementation`;
189
+ const handler = `${className(tool.id)}Handler`;
190
+ const assignment = ` const ${local} = options${memberAccess(tool.id)} ?? (IMPLEMENTATIONS${memberAccess(tool.id)} as ${handler} | undefined);`;
191
+ const broken = [
192
+ ` const ${local} =`,
193
+ ` options${memberAccess(tool.id)} ??`,
194
+ ` (IMPLEMENTATIONS${memberAccess(tool.id)} as ${handler} | undefined);`,
195
+ ].join('\n');
196
+ return [
197
+ fits('', assignment) ? assignment : broken,
198
+ ` if (${local} === undefined) {`,
199
+ ` throw new ConfigurationError(${literal(`no implementation is registered for ${tool.id}`)});`,
200
+ ' }',
201
+ ` adapters.push(as${className(tool.id)}(${local}));`,
202
+ ].join('\n');
203
+ });
204
+ const body = [
205
+ '/** The implementations a caller may override; the business tier supplies the rest. */',
206
+ 'export interface BuildExecutorOptions {',
207
+ ...optionLines,
208
+ '}',
209
+ '',
210
+ '/** Build the adapters with every IR tool bound to an implementation. */',
211
+ 'export function buildTools(options: BuildExecutorOptions = {}): Tool[] {',
212
+ ' const adapters: Tool[] = [];',
213
+ ...args,
214
+ ' return adapters;',
215
+ '}',
216
+ '',
217
+ '/** Build the executor over those adapters. */',
218
+ 'export function buildExecutor(options: BuildExecutorOptions = {}): ToolExecutor {',
219
+ ' return new ToolExecutor(buildTools(options));',
220
+ '}',
221
+ ].join('\n');
222
+ const fullHeader = header;
223
+ return generated(paths.toolsIndex, moduleText(fullHeader, body));
224
+ }
225
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/emit/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The error a caller sees when the IR cannot be emitted for this target.
3
+ *
4
+ * Planning refuses rather than emitting a half-wired tree: a generated app that boots
5
+ * but silently drops a step is worse than one that never got written.
6
+ */
7
+ import type { PlanProblem } from './validate.js';
8
+ export declare class TsVercelPlanError extends Error {
9
+ readonly problems: readonly PlanProblem[];
10
+ constructor(problems: readonly PlanProblem[]);
11
+ }
12
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAE1C,YAAY,QAAQ,EAAE,SAAS,WAAW,EAAE,EAO3C;CACF"}
package/dist/errors.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The error a caller sees when the IR cannot be emitted for this target.
3
+ *
4
+ * Planning refuses rather than emitting a half-wired tree: a generated app that boots
5
+ * but silently drops a step is worse than one that never got written.
6
+ */
7
+ export class TsVercelPlanError extends Error {
8
+ problems;
9
+ constructor(problems) {
10
+ const lines = problems.map((problem) => ` - ${problem.code} at ${problem.path}: ${problem.message}`);
11
+ super(`cannot emit ts-vercel from this IR:\n${lines.join('\n')}`);
12
+ this.name = 'TsVercelPlanError';
13
+ this.problems = [...problems];
14
+ }
15
+ }
16
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,QAAQ,CAAyB;IAE1C,YAAY,QAAgC;QAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CACxB,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE,CAC1E,CAAC;QACF,KAAK,CAAC,wCAAwC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAChC,CAAC;CACF"}