@aid-framework/generator-sdk 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 (48) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +221 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/aid-manifest.d.ts +71 -0
  5. package/dist/aid-manifest.d.ts.map +1 -0
  6. package/dist/aid-manifest.js +233 -0
  7. package/dist/aid-manifest.js.map +1 -0
  8. package/dist/determinism.d.ts +76 -0
  9. package/dist/determinism.d.ts.map +1 -0
  10. package/dist/determinism.js +142 -0
  11. package/dist/determinism.js.map +1 -0
  12. package/dist/diagnostics.d.ts +49 -0
  13. package/dist/diagnostics.d.ts.map +1 -0
  14. package/dist/diagnostics.js +59 -0
  15. package/dist/diagnostics.js.map +1 -0
  16. package/dist/drift.d.ts +114 -0
  17. package/dist/drift.d.ts.map +1 -0
  18. package/dist/drift.js +259 -0
  19. package/dist/drift.js.map +1 -0
  20. package/dist/index.d.ts +29 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +21 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/manifest.d.ts +100 -0
  25. package/dist/manifest.d.ts.map +1 -0
  26. package/dist/manifest.js +357 -0
  27. package/dist/manifest.js.map +1 -0
  28. package/dist/node-sink.d.ts +17 -0
  29. package/dist/node-sink.d.ts.map +1 -0
  30. package/dist/node-sink.js +62 -0
  31. package/dist/node-sink.js.map +1 -0
  32. package/dist/ownership.d.ts +50 -0
  33. package/dist/ownership.d.ts.map +1 -0
  34. package/dist/ownership.js +90 -0
  35. package/dist/ownership.js.map +1 -0
  36. package/dist/plan.d.ts +51 -0
  37. package/dist/plan.d.ts.map +1 -0
  38. package/dist/plan.js +132 -0
  39. package/dist/plan.js.map +1 -0
  40. package/dist/semver.d.ts +46 -0
  41. package/dist/semver.d.ts.map +1 -0
  42. package/dist/semver.js +264 -0
  43. package/dist/semver.js.map +1 -0
  44. package/dist/targets.d.ts +44 -0
  45. package/dist/targets.d.ts.map +1 -0
  46. package/dist/targets.js +88 -0
  47. package/dist/targets.js.map +1 -0
  48. package/package.json +43 -14
@@ -0,0 +1,357 @@
1
+ /**
2
+ * The generator plugin manifest (§8.1) and its validation.
3
+ *
4
+ * A manifest is the complete contract between a target generator and everything
5
+ * that consumes it: which target id it serves, which IR versions it can compile,
6
+ * which capabilities the code it emits actually *has*, and what runtime
7
+ * technology that code is built against. That last field, `emitsAgainst`, is the
8
+ * one that makes composition honest — a target that emits Pydantic models and an
9
+ * OpenTelemetry tracer is not interchangeable with one that emits Zod and
10
+ * Langfuse, and nothing else in the IR records that.
11
+ *
12
+ * Validation is total: an unknown key is an error, capabilities are resolved
13
+ * through the IR's alias table before being stored, and `irRange` is a real range
14
+ * so "does this generator support the IR it was handed" is answered by
15
+ * {@link checkIRSupport} instead of at codegen time.
16
+ */
17
+ import { IR_VERSION, resolveRequiredCapability } from '@aid-framework/ir';
18
+ import { sortDiagnostics } from '@aid-framework/spec';
19
+ import { GENERATOR_DIAGNOSTIC_CODES, generatorError, } from './diagnostics.js';
20
+ import { DEFAULT_BUSINESS_DIR, DEFAULT_GENERATED_DIR, escapesRoot, isAbsolutePath, normalizeRelativePath, } from './ownership.js';
21
+ import { isValidRange, isValidVersion, satisfies } from './semver.js';
22
+ /** Current on-disk manifest format. Bumped only for a breaking reshape. */
23
+ export const GENERATOR_MANIFEST_VERSION = 1;
24
+ /** §8.1: what the emitted code is built against. Closed vocabularies, one value each. */
25
+ export const ORCHESTRATIONS = [
26
+ 'langgraph',
27
+ 'llamaindex',
28
+ 'dspy',
29
+ 'vercel-ai',
30
+ 'semantic-kernel',
31
+ ];
32
+ export const STRUCTURED_OUTPUTS = ['pydantic', 'instructor', 'zod'];
33
+ export const TRACING_BACKENDS = ['otel-genai', 'langfuse', 'langsmith'];
34
+ const TOP_LEVEL_KEYS = new Set([
35
+ 'manifestVersion',
36
+ 'name',
37
+ 'target',
38
+ 'version',
39
+ 'irRange',
40
+ 'capabilities',
41
+ 'emitsAgainst',
42
+ 'output',
43
+ 'optionsSchema',
44
+ ]);
45
+ const EMITS_AGAINST_VOCABULARIES = {
46
+ orchestration: ORCHESTRATIONS,
47
+ structuredOutput: STRUCTURED_OUTPUTS,
48
+ tracing: TRACING_BACKENDS,
49
+ };
50
+ function isRecord(value) {
51
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
52
+ }
53
+ function invalid(code, message, path, hint) {
54
+ return generatorError({ code, message, path, ...(hint === undefined ? {} : { hint }) });
55
+ }
56
+ function isNonEmptyString(value) {
57
+ return typeof value === 'string' && value.trim() !== '';
58
+ }
59
+ /** Parses and validates an authored manifest value. Never throws. */
60
+ export function parseManifest(value) {
61
+ if (!isRecord(value)) {
62
+ return {
63
+ diagnostics: [
64
+ invalid(GENERATOR_DIAGNOSTIC_CODES.manifestNotAMapping, 'A generator manifest must be an object.', 'manifest'),
65
+ ],
66
+ };
67
+ }
68
+ const diagnostics = [];
69
+ for (const key of Object.keys(value)) {
70
+ if (!TOP_LEVEL_KEYS.has(key)) {
71
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestUnknownKey, `Unknown manifest key "${key}".`, key, 'An unrecognised key is usually a typo that silently does nothing. Remove it or fix the spelling.'));
72
+ }
73
+ }
74
+ const manifestVersion = readManifestVersion(value, diagnostics);
75
+ const name = readString(value, 'name', diagnostics);
76
+ const target = readString(value, 'target', diagnostics);
77
+ const version = readVersion(value, diagnostics);
78
+ const irRange = readIrRange(value, diagnostics);
79
+ const capabilities = readCapabilities(value, diagnostics);
80
+ const emitsAgainst = readEmitsAgainst(value, diagnostics);
81
+ const output = readOutput(value, diagnostics);
82
+ if (diagnostics.some((diagnostic) => diagnostic.severity === 'error')) {
83
+ return { diagnostics: sortDiagnostics(diagnostics) };
84
+ }
85
+ // Every read above returns a value once no error was recorded, so these casts are
86
+ // unreachable-but-required by the type checker rather than runtime assertions.
87
+ return {
88
+ manifest: {
89
+ manifestVersion: manifestVersion,
90
+ name: name,
91
+ target: target,
92
+ version: version,
93
+ irRange: irRange,
94
+ capabilities: capabilities,
95
+ emitsAgainst: emitsAgainst,
96
+ output: output,
97
+ ...(value.optionsSchema === undefined ? {} : { optionsSchema: value.optionsSchema }),
98
+ },
99
+ diagnostics: sortDiagnostics(diagnostics),
100
+ };
101
+ }
102
+ export function validateManifest(value) {
103
+ return parseManifest(value).diagnostics;
104
+ }
105
+ export function parseManifestJson(text) {
106
+ let parsed;
107
+ try {
108
+ parsed = JSON.parse(text);
109
+ }
110
+ catch (error) {
111
+ return {
112
+ diagnostics: [
113
+ invalid(GENERATOR_DIAGNOSTIC_CODES.manifestParseFailed, `Generator manifest is not valid JSON: ${error instanceof Error ? error.message : String(error)}`, 'manifest'),
114
+ ],
115
+ };
116
+ }
117
+ return parseManifest(parsed);
118
+ }
119
+ function readManifestVersion(value, diagnostics) {
120
+ const raw = value.manifestVersion;
121
+ if (raw === undefined)
122
+ return GENERATOR_MANIFEST_VERSION;
123
+ if (raw !== GENERATOR_MANIFEST_VERSION) {
124
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestVersionUnsupported, `manifestVersion ${JSON.stringify(raw)} is not supported; this build reads version ${GENERATOR_MANIFEST_VERSION}.`, 'manifestVersion'));
125
+ return undefined;
126
+ }
127
+ return GENERATOR_MANIFEST_VERSION;
128
+ }
129
+ function readString(value, key, diagnostics) {
130
+ if (!(key in value)) {
131
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestMissingField, `Manifest is missing required key "${key}".`, key));
132
+ return undefined;
133
+ }
134
+ if (!isNonEmptyString(value[key])) {
135
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestInvalidField, `Manifest key "${key}" must be a non-empty string.`, key));
136
+ return undefined;
137
+ }
138
+ return value[key];
139
+ }
140
+ function readVersion(value, diagnostics) {
141
+ const version = readString(value, 'version', diagnostics);
142
+ if (version === undefined)
143
+ return undefined;
144
+ if (!isValidVersion(version)) {
145
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestInvalidField, `Manifest version "${version}" is not a semantic version.`, 'version'));
146
+ return undefined;
147
+ }
148
+ return version;
149
+ }
150
+ function readIrRange(value, diagnostics) {
151
+ const irRange = readString(value, 'irRange', diagnostics);
152
+ if (irRange === undefined)
153
+ return undefined;
154
+ if (!isValidRange(irRange)) {
155
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestInvalidField, `Manifest irRange "${irRange}" is not a supported range expression.`, 'irRange', 'Use `||` alternatives with `^`, `~`, `>=`, `<=`, `<`, `>`, or `=` comparators.'));
156
+ return undefined;
157
+ }
158
+ return irRange;
159
+ }
160
+ function readCapabilities(value, diagnostics) {
161
+ if (!('capabilities' in value)) {
162
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestMissingField, 'Manifest is missing required key "capabilities".', 'capabilities', 'Declare the capabilities the emitted code actually has; an empty list is allowed but must be explicit.'));
163
+ return undefined;
164
+ }
165
+ const raw = value.capabilities;
166
+ if (!Array.isArray(raw)) {
167
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestInvalidField, 'Manifest key "capabilities" must be an array of capability strings.', 'capabilities'));
168
+ return undefined;
169
+ }
170
+ const resolved = [];
171
+ const seen = new Set();
172
+ let failed = false;
173
+ for (const [index, entry] of raw.entries()) {
174
+ if (typeof entry !== 'string') {
175
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestInvalidField, `capabilities[${index}] must be a string.`, `capabilities[${index}]`));
176
+ failed = true;
177
+ continue;
178
+ }
179
+ const capability = resolveRequiredCapability(entry);
180
+ if (capability === undefined) {
181
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestCapabilityUnknown, `capabilities[${index}] "${entry}" is not a known target capability.`, `capabilities[${index}]`));
182
+ failed = true;
183
+ continue;
184
+ }
185
+ if (seen.has(capability)) {
186
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestCapabilityDuplicate, `capabilities[${index}] "${entry}" resolves to "${capability}", already declared.`, `capabilities[${index}]`));
187
+ failed = true;
188
+ continue;
189
+ }
190
+ seen.add(capability);
191
+ resolved.push(capability);
192
+ }
193
+ if (failed)
194
+ return undefined;
195
+ return [...resolved].sort();
196
+ }
197
+ function readEmitsAgainst(value, diagnostics) {
198
+ const raw = value.emitsAgainst;
199
+ if (raw === undefined)
200
+ return {};
201
+ if (!isRecord(raw)) {
202
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestInvalidField, 'Manifest key "emitsAgainst" must be an object.', 'emitsAgainst'));
203
+ return undefined;
204
+ }
205
+ const result = {};
206
+ let failed = false;
207
+ for (const [key, entry] of Object.entries(raw)) {
208
+ const vocabulary = EMITS_AGAINST_VOCABULARIES[key];
209
+ if (vocabulary === undefined) {
210
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestUnknownKey, `Unknown emitsAgainst key "${key}".`, `emitsAgainst.${key}`, `Known keys: ${Object.keys(EMITS_AGAINST_VOCABULARIES).join(', ')}.`));
211
+ failed = true;
212
+ continue;
213
+ }
214
+ if (typeof entry !== 'string' || !vocabulary.includes(entry)) {
215
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestEmitsAgainstUnknown, `emitsAgainst.${key} "${String(entry)}" is not one of: ${vocabulary.join(', ')}.`, `emitsAgainst.${key}`));
216
+ failed = true;
217
+ continue;
218
+ }
219
+ if (key === 'orchestration') {
220
+ result.orchestration = entry;
221
+ }
222
+ else if (key === 'structuredOutput') {
223
+ result.structuredOutput = entry;
224
+ }
225
+ else {
226
+ result.tracing = entry;
227
+ }
228
+ }
229
+ if (failed)
230
+ return undefined;
231
+ return result;
232
+ }
233
+ function readOutput(value, diagnostics) {
234
+ if (!('output' in value)) {
235
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestMissingField, 'Manifest is missing required key "output".', 'output'));
236
+ return undefined;
237
+ }
238
+ const raw = value.output;
239
+ if (!isRecord(raw)) {
240
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestInvalidField, 'Manifest key "output" must be an object with a `root`.', 'output'));
241
+ return undefined;
242
+ }
243
+ for (const key of Object.keys(raw)) {
244
+ if (key !== 'root' && key !== 'generatedDir' && key !== 'businessDir') {
245
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestUnknownKey, `Unknown output key "${key}".`, `output.${key}`, 'Known keys: root, generatedDir, businessDir.'));
246
+ }
247
+ }
248
+ const root = readRelative(raw, 'root', diagnostics);
249
+ const generatedDir = readRelative(raw, 'generatedDir', diagnostics) ?? DEFAULT_GENERATED_DIR;
250
+ const businessDir = readRelative(raw, 'businessDir', diagnostics) ?? DEFAULT_BUSINESS_DIR;
251
+ if (root === undefined)
252
+ return undefined;
253
+ // `generatedDir` and `businessDir` are relative to `root`, and ownership is decided
254
+ // from the composed prefix. So the invariant is not that they sit inside `root` —
255
+ // they never do — but that they are distinct and neither contains the other.
256
+ // Otherwise one path would belong to both tiers and drift detection would have no
257
+ // single answer for whether a file may be overwritten.
258
+ if (generatedDir === businessDir) {
259
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestNotRelative, `output.generatedDir and output.businessDir are both "${generatedDir}"; the generated and business tiers must be separate directories.`, 'output.businessDir'));
260
+ return undefined;
261
+ }
262
+ if (isNested(generatedDir, businessDir) || isNested(businessDir, generatedDir)) {
263
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestNotRelative, `output.generatedDir "${generatedDir}" and output.businessDir "${businessDir}" overlap; one must not contain the other.`, 'output.businessDir'));
264
+ return undefined;
265
+ }
266
+ return { root, generatedDir, businessDir };
267
+ }
268
+ function readRelative(source, key, diagnostics) {
269
+ const raw = source[key];
270
+ if (raw === undefined)
271
+ return undefined;
272
+ if (typeof raw !== 'string' || raw.trim() === '') {
273
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestInvalidField, `output.${key} must be a non-empty string.`, `output.${key}`));
274
+ return undefined;
275
+ }
276
+ if (isAbsolutePath(raw)) {
277
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestNotRelative, `output.${key} "${raw}" is absolute; output paths are repo-relative.`, `output.${key}`));
278
+ return undefined;
279
+ }
280
+ if (escapesRoot(raw)) {
281
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestEscapingRoot, `output.${key} "${raw}" escapes the repository root.`, `output.${key}`));
282
+ return undefined;
283
+ }
284
+ const normalized = normalizeRelativePath(raw);
285
+ if (normalized === undefined) {
286
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestNotRelative, `output.${key} "${raw}" is not a relative path.`, `output.${key}`));
287
+ return undefined;
288
+ }
289
+ return normalized;
290
+ }
291
+ /** True when `child` is `parent` itself or sits below it. */
292
+ function isNested(parent, child) {
293
+ return child === parent || child.startsWith(`${parent}/`);
294
+ }
295
+ /**
296
+ * The repo-relative prefixes the plan validator needs. `output.root` is repo-relative,
297
+ * and the managed directories are relative to it, so this is the single place that
298
+ * turns a manifest's output layout into the two roots ownership is decided from.
299
+ */
300
+ export function managedRoots(manifest) {
301
+ const { root, generatedDir, businessDir } = manifest.output;
302
+ return {
303
+ generatedDir: `${root}/${generatedDir}`,
304
+ businessDir: `${root}/${businessDir}`,
305
+ manifestFilename: `${root}/aid.manifest.json`,
306
+ };
307
+ }
308
+ export function supportsIR(manifest, irVersion = IR_VERSION) {
309
+ return satisfies(irVersion, manifest.irRange);
310
+ }
311
+ /** Reports the manifest's `irRange` against the IR version it will actually be given. */
312
+ export function checkIRSupport(manifest, irVersion = IR_VERSION) {
313
+ if (supportsIR(manifest, irVersion))
314
+ return [];
315
+ const diagnostic = generatorError({
316
+ code: GENERATOR_DIAGNOSTIC_CODES.manifestUnsupportedIr,
317
+ message: `Generator "${manifest.name}" supports IR ${manifest.irRange} and cannot compile IR ${irVersion}.`,
318
+ path: 'irRange',
319
+ hint: 'Regenerate with a generator whose irRange covers this IR version, or pin the IR version the generator was built for.',
320
+ });
321
+ return [diagnostic];
322
+ }
323
+ /**
324
+ * Generator ids and target ids must each be unique across the set a build loads;
325
+ * two generators claiming one target is a silent last-wins otherwise.
326
+ */
327
+ export function validateGeneratorSet(manifests) {
328
+ const diagnostics = [];
329
+ const seenNames = new Map();
330
+ const seenTargets = new Map();
331
+ for (const [index, manifest] of manifests.entries()) {
332
+ const name = seenNames.get(manifest.name);
333
+ if (name !== undefined) {
334
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestDuplicateGenerator, `Generator name "${manifest.name}" is declared twice (also at manifests[${name}]).`, `manifests[${index}].name`));
335
+ }
336
+ else {
337
+ seenNames.set(manifest.name, index);
338
+ }
339
+ const target = seenTargets.get(manifest.target);
340
+ if (target !== undefined) {
341
+ diagnostics.push(invalid(GENERATOR_DIAGNOSTIC_CODES.manifestDuplicateGenerator, `Target "${manifest.target}" is claimed by two generators (also at manifests[${target}]).`, `manifests[${index}].target`));
342
+ }
343
+ else {
344
+ seenTargets.set(manifest.target, index);
345
+ }
346
+ }
347
+ return sortDiagnostics(diagnostics);
348
+ }
349
+ /** The capability declarations a set of manifests contributes, in the IR gate's shape. */
350
+ export function targetCapabilityDeclarations(manifests) {
351
+ const declarations = {};
352
+ for (const manifest of [...manifests].sort((left, right) => left.target < right.target ? -1 : left.target > right.target ? 1 : 0)) {
353
+ declarations[manifest.target] = manifest.capabilities;
354
+ }
355
+ return declarations;
356
+ }
357
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAA2B,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AACnG,OAAO,EAAmB,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EACL,0BAA0B,EAG1B,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,WAAW,EACX,cAAc,EACd,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEtE,2EAA2E;AAC3E,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAE5C,yFAAyF;AACzF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,WAAW;IACX,YAAY;IACZ,MAAM;IACN,WAAW;IACX,iBAAiB;CACT,CAAC;AAGX,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,KAAK,CAAU,CAAC;AAG7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,YAAY,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC;AAqDjF,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,iBAAiB;IACjB,MAAM;IACN,QAAQ;IACR,SAAS;IACT,SAAS;IACT,cAAc;IACd,cAAc;IACd,QAAQ;IACR,eAAe;CAChB,CAAC,CAAC;AAEH,MAAM,0BAA0B,GAAsC;IACpE,aAAa,EAAE,cAAc;IAC7B,gBAAgB,EAAE,kBAAkB;IACpC,OAAO,EAAE,gBAAgB;CAC1B,CAAC;AAQF,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,OAAO,CACd,IAA6B,EAC7B,OAAe,EACf,IAAY,EACZ,IAAa;IAEb,OAAO,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;AAC1D,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,WAAW,EAAE;gBACX,OAAO,CACL,0BAA0B,CAAC,mBAAmB,EAC9C,yCAAyC,EACzC,UAAU,CACX;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAA0B,EAAE,CAAC;IAE9C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,kBAAkB,EAC7C,yBAAyB,GAAG,IAAI,EAChC,GAAG,EACH,kGAAkG,CACnG,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,gBAAgB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAE9C,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,CAAC;QACtE,OAAO,EAAE,WAAW,EAAE,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;IACvD,CAAC;IAED,kFAAkF;IAClF,+EAA+E;IAC/E,OAAO;QACL,QAAQ,EAAE;YACR,eAAe,EAAE,eAAyB;YAC1C,IAAI,EAAE,IAAc;YACpB,MAAM,EAAE,MAAgB;YACxB,OAAO,EAAE,OAAiB;YAC1B,OAAO,EAAE,OAAiB;YAC1B,YAAY,EAAE,YAA6C;YAC3D,YAAY,EAAE,YAA4B;YAC1C,MAAM,EAAE,MAAqC;YAC7C,GAAG,CAAC,KAAK,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC;SACrF;QACD,WAAW,EAAE,eAAe,CAAC,WAAW,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,WAAW,EAAE;gBACX,OAAO,CACL,0BAA0B,CAAC,mBAAmB,EAC9C,yCAAyC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACjG,UAAU,CACX;aACF;SACF,CAAC;IACJ,CAAC;IACD,OAAO,aAAa,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA8B,EAC9B,WAAkC;IAElC,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,CAAC;IAClC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,0BAA0B,CAAC;IACzD,IAAI,GAAG,KAAK,0BAA0B,EAAE,CAAC;QACvC,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,0BAA0B,EACrD,mBAAmB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,+CAA+C,0BAA0B,GAAG,EAClH,iBAAiB,CAClB,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,0BAA0B,CAAC;AACpC,CAAC;AAED,SAAS,UAAU,CACjB,KAA8B,EAC9B,GAAW,EACX,WAAkC;IAElC,IAAI,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC;QACpB,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,qCAAqC,GAAG,IAAI,EAC5C,GAAG,CACJ,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAClC,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,iBAAiB,GAAG,+BAA+B,EACnD,GAAG,CACJ,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,WAAW,CAClB,KAA8B,EAC9B,WAAkC;IAElC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,qBAAqB,OAAO,8BAA8B,EAC1D,SAAS,CACV,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW,CAClB,KAA8B,EAC9B,WAAkC;IAElC,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1D,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,qBAAqB,OAAO,wCAAwC,EACpE,SAAS,EACT,gFAAgF,CACjF,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,gBAAgB,CACvB,KAA8B,EAC9B,WAAkC;IAElC,IAAI,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC,EAAE,CAAC;QAC/B,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,kDAAkD,EAClD,cAAc,EACd,wGAAwG,CACzG,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,qEAAqE,EACrE,cAAc,CACf,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC3C,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,gBAAgB,KAAK,qBAAqB,EAC1C,gBAAgB,KAAK,GAAG,CACzB,CACF,CAAC;YACF,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QACpD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,yBAAyB,EACpD,gBAAgB,KAAK,MAAM,KAAK,qCAAqC,EACrE,gBAAgB,KAAK,GAAG,CACzB,CACF,CAAC;YACF,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,2BAA2B,EACtD,gBAAgB,KAAK,MAAM,KAAK,kBAAkB,UAAU,sBAAsB,EAClF,gBAAgB,KAAK,GAAG,CACzB,CACF,CAAC;YACF,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrB,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,MAAM;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,gBAAgB,CACvB,KAA8B,EAC9B,WAAkC;IAElC,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC;IAC/B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAEjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,gDAAgD,EAChD,cAAc,CACf,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,kBAAkB,EAC7C,6BAA6B,GAAG,IAAI,EACpC,gBAAgB,GAAG,EAAE,EACrB,eAAe,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACrE,CACF,CAAC;YACF,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7D,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,2BAA2B,EACtD,gBAAgB,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,oBAAoB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EACjF,gBAAgB,GAAG,EAAE,CACtB,CACF,CAAC;YACF,MAAM,GAAG,IAAI,CAAC;YACd,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,MAAM,CAAC,aAAa,GAAG,KAAsB,CAAC;QAChD,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAkB,EAAE,CAAC;YACtC,MAAM,CAAC,gBAAgB,GAAG,KAAyB,CAAC;QACtD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,OAAO,GAAG,KAAuB,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,MAAM;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CACjB,KAA8B,EAC9B,WAAkC;IAElC,IAAI,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC;QACzB,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,4CAA4C,EAC5C,QAAQ,CACT,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACzB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,wDAAwD,EACxD,QAAQ,CACT,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,cAAc,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YACtE,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,kBAAkB,EAC7C,uBAAuB,GAAG,IAAI,EAC9B,UAAU,GAAG,EAAE,EACf,8CAA8C,CAC/C,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,WAAW,CAAC,IAAI,qBAAqB,CAAC;IAC7F,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,WAAW,CAAC,IAAI,oBAAoB,CAAC;IAE1F,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAEzC,oFAAoF;IACpF,kFAAkF;IAClF,6EAA6E;IAC7E,kFAAkF;IAClF,uDAAuD;IACvD,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QACjC,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,mBAAmB,EAC9C,wDAAwD,YAAY,mEAAmE,EACvI,oBAAoB,CACrB,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;QAC/E,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,mBAAmB,EAC9C,wBAAwB,YAAY,6BAA6B,WAAW,4CAA4C,EACxH,oBAAoB,CACrB,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CACnB,MAA+B,EAC/B,GAAW,EACX,WAAkC;IAElC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACxB,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAExC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjD,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,UAAU,GAAG,8BAA8B,EAC3C,UAAU,GAAG,EAAE,CAChB,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,mBAAmB,EAC9C,UAAU,GAAG,KAAK,GAAG,gDAAgD,EACrE,UAAU,GAAG,EAAE,CAChB,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,oBAAoB,EAC/C,UAAU,GAAG,KAAK,GAAG,gCAAgC,EACrD,UAAU,GAAG,EAAE,CAChB,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAC9C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,mBAAmB,EAC9C,UAAU,GAAG,KAAK,GAAG,2BAA2B,EAChD,UAAU,GAAG,EAAE,CAChB,CACF,CAAC;QACF,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,6DAA6D;AAC7D,SAAS,QAAQ,CAAC,MAAc,EAAE,KAAa;IAC7C,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,QAA2B;IACtD,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC5D,OAAO;QACL,YAAY,EAAE,GAAG,IAAI,IAAI,YAAY,EAAE;QACvC,WAAW,EAAE,GAAG,IAAI,IAAI,WAAW,EAAE;QACrC,gBAAgB,EAAE,GAAG,IAAI,oBAAoB;KAC9C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAA2B,EAAE,SAAS,GAAW,UAAU;IACpF,OAAO,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,cAAc,CAC5B,QAA2B,EAC3B,SAAS,GAAW,UAAU;IAE9B,IAAI,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAwC,cAAc,CAAC;QACrE,IAAI,EAAE,0BAA0B,CAAC,qBAAqB;QACtD,OAAO,EAAE,cAAc,QAAQ,CAAC,IAAI,iBAAiB,QAAQ,CAAC,OAAO,0BAA0B,SAAS,GAAG;QAC3G,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,sHAAsH;KAC7H,CAAC,CAAC;IACH,OAAO,CAAC,UAAU,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAuC;IAEvC,MAAM,WAAW,GAA0B,EAAE,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE9C,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,0BAA0B,EACrD,mBAAmB,QAAQ,CAAC,IAAI,0CAA0C,IAAI,KAAK,EACnF,aAAa,KAAK,QAAQ,CAC3B,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,WAAW,CAAC,IAAI,CACd,OAAO,CACL,0BAA0B,CAAC,0BAA0B,EACrD,WAAW,QAAQ,CAAC,MAAM,qDAAqD,MAAM,KAAK,EAC1F,aAAa,KAAK,UAAU,CAC7B,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,eAAe,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,4BAA4B,CAC1C,SAAuC;IAEvC,MAAM,YAAY,GAAsC,EAAE,CAAC;IAC3D,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACzD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACrE,EAAE,CAAC;QACF,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC;IACxD,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The filesystem-backed {@link RegenerationSink}. Kept out of `drift.ts` so the
3
+ * algorithm itself has no dependency on `node:fs` and can be driven from an
4
+ * in-memory map in tests.
5
+ *
6
+ * Writes are atomic (temp file in the destination directory, then rename over the
7
+ * target) because a partially written generated file is worse than a stale one: it
8
+ * fails to parse, so nothing downstream can tell "regeneration was interrupted" from
9
+ * "the generator emitted garbage".
10
+ */
11
+ import type { RegenerationSink } from './drift.js';
12
+ export declare function createNodeSink(root: string): RegenerationSink;
13
+ /** An in-memory sink, for tests and for dry runs against a plan. */
14
+ export declare function createMemorySink(initial?: Record<string, string>): RegenerationSink & {
15
+ files: Map<string, string>;
16
+ };
17
+ //# sourceMappingURL=node-sink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-sink.d.ts","sourceRoot":"","sources":["../src/node-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAInD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CA+B7D;AAED,oEAAoE;AACpE,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,gBAAgB,GAAG;IACzF,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC5B,CAcA"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * The filesystem-backed {@link RegenerationSink}. Kept out of `drift.ts` so the
3
+ * algorithm itself has no dependency on `node:fs` and can be driven from an
4
+ * in-memory map in tests.
5
+ *
6
+ * Writes are atomic (temp file in the destination directory, then rename over the
7
+ * target) because a partially written generated file is worse than a stale one: it
8
+ * fails to parse, so nothing downstream can tell "regeneration was interrupted" from
9
+ * "the generator emitted garbage".
10
+ */
11
+ import { mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
12
+ import { dirname, resolve, sep } from 'node:path';
13
+ const TEMP_SUFFIX = '.aid-tmp';
14
+ export function createNodeSink(root) {
15
+ const base = resolve(root);
16
+ function absoluteFor(path) {
17
+ const absolute = resolve(base, ...path.split('/'));
18
+ if (absolute !== base && !absolute.startsWith(base + sep)) {
19
+ throw new Error(`Path "${path}" escapes the sink root "${base}".`);
20
+ }
21
+ return absolute;
22
+ }
23
+ return {
24
+ read(path) {
25
+ try {
26
+ return readFileSync(absoluteFor(path), 'utf8');
27
+ }
28
+ catch (error) {
29
+ if (error.code === 'ENOENT')
30
+ return undefined;
31
+ throw error;
32
+ }
33
+ },
34
+ write(path, content) {
35
+ const absolute = absoluteFor(path);
36
+ mkdirSync(dirname(absolute), { recursive: true });
37
+ const temporary = `${absolute}${TEMP_SUFFIX}`;
38
+ writeFileSync(temporary, content, 'utf8');
39
+ renameSync(temporary, absolute);
40
+ },
41
+ remove(path) {
42
+ rmSync(absoluteFor(path), { force: true });
43
+ },
44
+ };
45
+ }
46
+ /** An in-memory sink, for tests and for dry runs against a plan. */
47
+ export function createMemorySink(initial = {}) {
48
+ const files = new Map(Object.entries(initial));
49
+ return {
50
+ files,
51
+ read(path) {
52
+ return files.get(path);
53
+ },
54
+ write(path, content) {
55
+ files.set(path, content);
56
+ },
57
+ remove(path) {
58
+ files.delete(path);
59
+ },
60
+ };
61
+ }
62
+ //# sourceMappingURL=node-sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-sink.js","sourceRoot":"","sources":["../src/node-sink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAIlD,MAAM,WAAW,GAAG,UAAU,CAAC;AAE/B,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3B,SAAS,WAAW,CAAC,IAAY;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,IAAI,QAAQ,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,4BAA4B,IAAI,IAAI,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI;YACP,IAAI,CAAC;gBACH,OAAO,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO,SAAS,CAAC;gBACzE,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,EAAE,OAAO;YACjB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACnC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,MAAM,SAAS,GAAG,GAAG,QAAQ,GAAG,WAAW,EAAE,CAAC;YAC9C,aAAa,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC1C,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,CAAC,IAAI;YACT,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,OAAO,GAA2B,EAAE;IAGnE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,OAAO;QACL,KAAK;QACL,IAAI,CAAC,IAAI;YACP,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,CAAC,IAAI,EAAE,OAAO;YACjB,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3B,CAAC;QACD,MAAM,CAAC,IAAI;YACT,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Ownership and path rules (§8.3, §8.4, §10).
3
+ *
4
+ * The three-tier split is the whole reason regeneration is safe: `generated/` is
5
+ * generator-owned and never hand-edited, `business/` is developer-owned and written
6
+ * once, and the ownership of a path is decided by *where it lives*, not by what a
7
+ * generator happens to say about it. Every path in a plan is normalized through this
8
+ * module, so a generator cannot escape its own root or claim a business path as
9
+ * generated (or the reverse).
10
+ */
11
+ export type FileOwner = 'generated' | 'business';
12
+ export declare const DEFAULT_GENERATED_DIR = "generated";
13
+ export declare const DEFAULT_BUSINESS_DIR = "business";
14
+ /** The ownership manifest. Generator bookkeeping, so it is never a planned artifact. */
15
+ export declare const DEFAULT_MANIFEST_FILENAME = "aid.manifest.json";
16
+ /** The rejected-content sidecar: the newly generated bytes that were *not* written. */
17
+ export declare const REJECTION_SUFFIX = ".aid-rej";
18
+ /**
19
+ * Normalizes a plan path to a repo-relative POSIX path: backslashes become
20
+ * separators, `.` segments are dropped, and a leading `./` or `/` is removed.
21
+ * Returns `undefined` for a path that cannot be expressed relative to the root.
22
+ * `..` segments are preserved here so `escapesRoot` can report them as an error
23
+ * rather than this function silently absorbing them.
24
+ */
25
+ export declare function normalizeRelativePath(path: string): string | undefined;
26
+ export declare function isRelativePath(path: string): boolean;
27
+ /** True when the path climbs above its root. Reported instead of normalized away. */
28
+ export declare function escapesRoot(path: string): boolean;
29
+ export declare function isAbsolutePath(path: string): boolean;
30
+ /**
31
+ * The owner of a path, from its first segment. Anything outside both roots has no
32
+ * owner, which is how a plan that reaches outside the two managed tiers is caught.
33
+ */
34
+ export declare function ownerForPath(path: string, options?: {
35
+ generatedDir?: string;
36
+ businessDir?: string;
37
+ }): FileOwner | undefined;
38
+ export declare function isGeneratedPath(path: string, options?: {
39
+ generatedDir?: string;
40
+ businessDir?: string;
41
+ }): boolean;
42
+ export declare function isBusinessPath(path: string, options?: {
43
+ generatedDir?: string;
44
+ businessDir?: string;
45
+ }): boolean;
46
+ /** Where rejected generated content lands: alongside the file it could not replace. */
47
+ export declare function rejectionPath(path: string): string;
48
+ /** True when the path is the manifest itself or a rejection sidecar, never planned. */
49
+ export declare function isReservedPath(path: string, manifestFilename: string): boolean;
50
+ //# sourceMappingURL=ownership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownership.d.ts","sourceRoot":"","sources":["../src/ownership.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,UAAU,CAAC;AAEjD,eAAO,MAAM,qBAAqB,cAAc,CAAC;AACjD,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAE/C,wFAAwF;AACxF,eAAO,MAAM,yBAAyB,sBAAsB,CAAC;AAE7D,uFAAuF;AACvF,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAE3C;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUtE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGpD;AAUD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5D,SAAS,GAAG,SAAS,CAUvB;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5D,OAAO,CAET;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAC5D,OAAO,CAET;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAI9E"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Ownership and path rules (§8.3, §8.4, §10).
3
+ *
4
+ * The three-tier split is the whole reason regeneration is safe: `generated/` is
5
+ * generator-owned and never hand-edited, `business/` is developer-owned and written
6
+ * once, and the ownership of a path is decided by *where it lives*, not by what a
7
+ * generator happens to say about it. Every path in a plan is normalized through this
8
+ * module, so a generator cannot escape its own root or claim a business path as
9
+ * generated (or the reverse).
10
+ */
11
+ export const DEFAULT_GENERATED_DIR = 'generated';
12
+ export const DEFAULT_BUSINESS_DIR = 'business';
13
+ /** The ownership manifest. Generator bookkeeping, so it is never a planned artifact. */
14
+ export const DEFAULT_MANIFEST_FILENAME = 'aid.manifest.json';
15
+ /** The rejected-content sidecar: the newly generated bytes that were *not* written. */
16
+ export const REJECTION_SUFFIX = '.aid-rej';
17
+ /**
18
+ * Normalizes a plan path to a repo-relative POSIX path: backslashes become
19
+ * separators, `.` segments are dropped, and a leading `./` or `/` is removed.
20
+ * Returns `undefined` for a path that cannot be expressed relative to the root.
21
+ * `..` segments are preserved here so `escapesRoot` can report them as an error
22
+ * rather than this function silently absorbing them.
23
+ */
24
+ export function normalizeRelativePath(path) {
25
+ const trimmed = path.trim().replace(/\\/g, '/');
26
+ if (trimmed === '')
27
+ return undefined;
28
+ if (/^[A-Za-z]:\//.test(trimmed))
29
+ return undefined;
30
+ const segments = trimmed.split('/').filter((segment) => segment !== '' && segment !== '.');
31
+ if (segments.length === 0)
32
+ return undefined;
33
+ if (segments.includes('..'))
34
+ return undefined;
35
+ return segments.join('/');
36
+ }
37
+ export function isRelativePath(path) {
38
+ return normalizeRelativePath(path) !== undefined;
39
+ }
40
+ /** True when the path climbs above its root. Reported instead of normalized away. */
41
+ export function escapesRoot(path) {
42
+ const segments = path.trim().replace(/\\/g, '/').split('/');
43
+ return segments.includes('..');
44
+ }
45
+ export function isAbsolutePath(path) {
46
+ const trimmed = path.trim();
47
+ return /^[A-Za-z]:[\\/]/.test(trimmed) || trimmed.startsWith('/') || trimmed.startsWith('\\\\');
48
+ }
49
+ /** Drops a trailing run of `/`. A loop, not `/\/+$/`, which is quadratic when the
50
+ * run is not at the end of the string. Root dirs are short, but not attacker-fixed. */
51
+ function stripTrailingSlashes(value) {
52
+ let end = value.length;
53
+ while (end > 0 && value[end - 1] === '/')
54
+ end--;
55
+ return value.slice(0, end);
56
+ }
57
+ /**
58
+ * The owner of a path, from its first segment. Anything outside both roots has no
59
+ * owner, which is how a plan that reaches outside the two managed tiers is caught.
60
+ */
61
+ export function ownerForPath(path, options = {}) {
62
+ const normalized = normalizeRelativePath(path);
63
+ if (normalized === undefined)
64
+ return undefined;
65
+ const generatedDir = stripTrailingSlashes(options.generatedDir ?? DEFAULT_GENERATED_DIR);
66
+ const businessDir = stripTrailingSlashes(options.businessDir ?? DEFAULT_BUSINESS_DIR);
67
+ if (normalized === generatedDir || normalized.startsWith(`${generatedDir}/`))
68
+ return 'generated';
69
+ if (normalized === businessDir || normalized.startsWith(`${businessDir}/`))
70
+ return 'business';
71
+ return undefined;
72
+ }
73
+ export function isGeneratedPath(path, options = {}) {
74
+ return ownerForPath(path, options) === 'generated';
75
+ }
76
+ export function isBusinessPath(path, options = {}) {
77
+ return ownerForPath(path, options) === 'business';
78
+ }
79
+ /** Where rejected generated content lands: alongside the file it could not replace. */
80
+ export function rejectionPath(path) {
81
+ return `${path}${REJECTION_SUFFIX}`;
82
+ }
83
+ /** True when the path is the manifest itself or a rejection sidecar, never planned. */
84
+ export function isReservedPath(path, manifestFilename) {
85
+ const normalized = normalizeRelativePath(path);
86
+ if (normalized === undefined)
87
+ return false;
88
+ return normalized === manifestFilename || normalized.endsWith(REJECTION_SUFFIX);
89
+ }
90
+ //# sourceMappingURL=ownership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownership.js","sourceRoot":"","sources":["../src/ownership.ts"],"names":[],"mappings":"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"}