@manifesto-ai/codegen 0.1.5 → 0.2.2
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/README.md +31 -5
- package/dist/compiler-codegen.d.ts +15 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +26 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ DomainSchema -> CODEGEN -> Generated Files
|
|
|
23
23
|
|
|
24
24
|
| Responsibility | Description |
|
|
25
25
|
|----------------|-------------|
|
|
26
|
-
| Generate canonical domain facades | DomainSchema -> `<domain>.
|
|
26
|
+
| Generate canonical domain facades | DomainSchema -> `<domain>.domain.ts` with `state` / `computed` / `actions` |
|
|
27
27
|
| Generate legacy TS/Zod artifacts | Optional low-level `types.ts` / `base.ts` output |
|
|
28
28
|
| Generate Zod schemas | DomainSchema types -> Zod validators with type annotations |
|
|
29
29
|
| Plugin pipeline | Run plugins sequentially with shared artifacts |
|
|
@@ -71,13 +71,32 @@ const result = await generate({
|
|
|
71
71
|
plugins: [createDomainPlugin()],
|
|
72
72
|
});
|
|
73
73
|
|
|
74
|
-
// result.files -> [{ path: "src/domain/hello.
|
|
74
|
+
// result.files -> [{ path: "src/domain/hello.domain.ts", content: "..." }]
|
|
75
75
|
// result.diagnostics -> [] (empty = no warnings or errors)
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
+
For compiler-driven emission during dev or build, inject Codegen explicitly into the compiler plugin:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
import { defineConfig } from "vite";
|
|
82
|
+
import { melPlugin } from "@manifesto-ai/compiler/vite";
|
|
83
|
+
import { createCompilerCodegen } from "@manifesto-ai/codegen";
|
|
84
|
+
|
|
85
|
+
export default defineConfig({
|
|
86
|
+
plugins: [
|
|
87
|
+
melPlugin({
|
|
88
|
+
codegen: {
|
|
89
|
+
emit: createCompilerCodegen(),
|
|
90
|
+
timing: "transform",
|
|
91
|
+
},
|
|
92
|
+
}),
|
|
93
|
+
],
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
78
97
|
This produces a canonical domain facade:
|
|
79
98
|
|
|
80
|
-
**src/domain/hello.
|
|
99
|
+
**src/domain/hello.domain.ts**
|
|
81
100
|
```typescript
|
|
82
101
|
export interface HelloDomain {
|
|
83
102
|
readonly state: {
|
|
@@ -108,6 +127,7 @@ Legacy `createTsPlugin()` and `createZodPlugin()` remain available, but are depr
|
|
|
108
127
|
```typescript
|
|
109
128
|
// Entry point
|
|
110
129
|
function generate(options: GenerateOptions): Promise<GenerateResult>;
|
|
130
|
+
function createCompilerCodegen(options?: CompilerCodegenOptions): CompilerCodegenEmitter;
|
|
111
131
|
|
|
112
132
|
// Built-in plugins
|
|
113
133
|
function createDomainPlugin(options?: DomainPluginOptions): CodegenPlugin;
|
|
@@ -131,6 +151,12 @@ type GenerateResult = {
|
|
|
131
151
|
diagnostics: Diagnostic[];
|
|
132
152
|
};
|
|
133
153
|
|
|
154
|
+
type CompilerCodegenOptions = {
|
|
155
|
+
outDir?: string; // Default: "."
|
|
156
|
+
plugins?: CodegenPlugin[]; // Default: [createDomainPlugin()]
|
|
157
|
+
stamp?: boolean;
|
|
158
|
+
};
|
|
159
|
+
|
|
134
160
|
type CodegenPlugin = {
|
|
135
161
|
name: string;
|
|
136
162
|
generate(ctx: CodegenContext): CodegenOutput;
|
|
@@ -166,14 +192,14 @@ Same DomainSchema always produces byte-identical output files. Fields and types
|
|
|
166
192
|
| Relationship | Package | How |
|
|
167
193
|
|--------------|---------|-----|
|
|
168
194
|
| Depends on | `@manifesto-ai/core` | Reads DomainSchema, TypeDefinition, TypeSpec |
|
|
169
|
-
| Used by | Build scripts | Called during build to generate type-safe code |
|
|
195
|
+
| Used by | Build scripts / compiler plugin | Called during dev or build to generate type-safe code |
|
|
170
196
|
|
|
171
197
|
---
|
|
172
198
|
|
|
173
199
|
## When to Use Codegen
|
|
174
200
|
|
|
175
201
|
Use Codegen when:
|
|
176
|
-
- You want a canonical `<domain>.
|
|
202
|
+
- You want a canonical `<domain>.domain.ts` facade for `createManifesto<T>()`
|
|
177
203
|
- You want type-safe TypeScript interfaces from your DomainSchema
|
|
178
204
|
- You want Zod runtime validators that match your schema types
|
|
179
205
|
- You need deterministic, reproducible code generation in CI
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DomainSchema } from "@manifesto-ai/core";
|
|
2
|
+
import type { CodegenPlugin, GenerateResult } from "./types.js";
|
|
3
|
+
export interface CompilerCodegenInput {
|
|
4
|
+
readonly schema: DomainSchema;
|
|
5
|
+
readonly sourceId: string;
|
|
6
|
+
}
|
|
7
|
+
export interface CompilerCodegenOptions {
|
|
8
|
+
readonly outDir?: string;
|
|
9
|
+
readonly plugins?: readonly CodegenPlugin[];
|
|
10
|
+
readonly stamp?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface CompilerCodegenEmitter {
|
|
13
|
+
(input: CompilerCodegenInput): Promise<GenerateResult>;
|
|
14
|
+
}
|
|
15
|
+
export declare function createCompilerCodegen(options?: CompilerCodegenOptions): CompilerCodegenEmitter;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export type { Diagnostic, FilePatch, CodegenPlugin, CodegenContext, CodegenOutput, CodegenHelpers, GenerateOptions, GenerateResult, } from "./types.js";
|
|
2
2
|
export { generate } from "./runner.js";
|
|
3
|
+
export { createCompilerCodegen } from "./compiler-codegen.js";
|
|
4
|
+
export type { CompilerCodegenInput, CompilerCodegenOptions, CompilerCodegenEmitter, } from "./compiler-codegen.js";
|
|
3
5
|
export { createDomainPlugin, createTsPlugin, createZodPlugin, } from "./plugins/index.js";
|
|
4
6
|
export type { DomainPluginOptions, TsPluginOptions, TsPluginArtifacts, ZodPluginOptions, } from "./plugins/index.js";
|
|
5
7
|
export { validatePath } from "./path-safety.js";
|
package/dist/index.js
CHANGED
|
@@ -954,10 +954,11 @@ function deriveInterfaceName(ctx) {
|
|
|
954
954
|
}
|
|
955
955
|
function deriveFileName(sourceId) {
|
|
956
956
|
if (!sourceId) {
|
|
957
|
-
return "domain.ts";
|
|
957
|
+
return "domain.domain.ts";
|
|
958
958
|
}
|
|
959
959
|
const normalized = sourceId.replace(/\\/g, "/");
|
|
960
|
-
|
|
960
|
+
const stem = normalized.replace(/\.[^.]+$/, "");
|
|
961
|
+
return `${stem}.domain.ts`;
|
|
961
962
|
}
|
|
962
963
|
function basenameWithoutExtension(sourceId) {
|
|
963
964
|
if (!sourceId) {
|
|
@@ -974,6 +975,28 @@ function pascalCase(value) {
|
|
|
974
975
|
return value.split(/[^a-zA-Z0-9]+/).filter(Boolean).map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1)).join("");
|
|
975
976
|
}
|
|
976
977
|
|
|
978
|
+
// src/compiler-codegen.ts
|
|
979
|
+
function createCompilerCodegen(options = {}) {
|
|
980
|
+
const outDir = options.outDir ?? ".";
|
|
981
|
+
const plugins = options.plugins ?? [createDomainPlugin()];
|
|
982
|
+
return async (input) => {
|
|
983
|
+
const result = await generate({
|
|
984
|
+
schema: input.schema,
|
|
985
|
+
sourceId: input.sourceId,
|
|
986
|
+
outDir,
|
|
987
|
+
plugins,
|
|
988
|
+
stamp: options.stamp
|
|
989
|
+
});
|
|
990
|
+
const errors = result.diagnostics.filter((diagnostic) => diagnostic.level === "error");
|
|
991
|
+
if (errors.length > 0) {
|
|
992
|
+
const details = errors.map((diagnostic) => `[${diagnostic.plugin}] ${diagnostic.message}`).join("\n");
|
|
993
|
+
throw new Error(`Codegen failed for ${input.sourceId}
|
|
994
|
+
${details}`);
|
|
995
|
+
}
|
|
996
|
+
return result;
|
|
997
|
+
};
|
|
998
|
+
}
|
|
999
|
+
|
|
977
1000
|
// src/plugins/ts-plugin.ts
|
|
978
1001
|
var PLUGIN_NAME2 = "codegen-plugin-ts";
|
|
979
1002
|
function createTsPlugin(options) {
|
|
@@ -1293,6 +1316,7 @@ function handleUnion(types, allTypeNames, diagnostics) {
|
|
|
1293
1316
|
return `z.union([${schemas.join(", ")}])`;
|
|
1294
1317
|
}
|
|
1295
1318
|
export {
|
|
1319
|
+
createCompilerCodegen,
|
|
1296
1320
|
createDomainPlugin,
|
|
1297
1321
|
createTsPlugin,
|
|
1298
1322
|
createZodPlugin,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runner.ts","../src/virtual-fs.ts","../src/path-safety.ts","../src/stable-hash.ts","../src/header.ts","../src/plugins/domain-type-model.ts","../src/plugins/domain-type-inference.ts","../src/plugins/domain-plugin.ts","../src/plugins/ts-plugin.ts","../src/plugins/zod-plugin.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as nodePath from \"node:path\";\n\nimport type {\n CodegenContext,\n CodegenPlugin,\n Diagnostic,\n GenerateOptions,\n GenerateResult,\n} from \"./types.js\";\nimport { VirtualFS } from \"./virtual-fs.js\";\nimport { validatePath } from \"./path-safety.js\";\nimport { stableHash } from \"./stable-hash.js\";\nimport { generateHeader } from \"./header.js\";\n\n/**\n * Generate typed artifacts from a DomainSchema using plugins.\n *\n * This is the sole entry point for codegen. It orchestrates:\n * - Plugin name uniqueness validation (GEN-2)\n * - Sequential plugin execution (GEN-3, GEN-7)\n * - FilePatch composition with collision detection\n * - Error gating (GEN-5, GEN-8)\n * - Optional outDir clean + file flush\n */\nexport async function generate(opts: GenerateOptions): Promise<GenerateResult> {\n const diagnostics: Diagnostic[] = [];\n const allArtifacts: Record<string, unknown> = {};\n const vfs = new VirtualFS();\n\n // GEN-2: Validate plugin name uniqueness\n const nameError = validatePluginNames(opts.plugins);\n if (nameError) {\n return {\n files: [],\n artifacts: {},\n diagnostics: [nameError],\n };\n }\n\n // GEN-3, GEN-7: Execute plugins sequentially in array order\n for (const plugin of opts.plugins) {\n const ctx: CodegenContext = {\n schema: opts.schema,\n sourceId: opts.sourceId,\n outDir: opts.outDir,\n artifacts: Object.freeze({ ...allArtifacts }), // PLG-9: frozen snapshot\n helpers: { stableHash },\n };\n\n let output;\n try {\n output = await plugin.generate(ctx);\n } catch (err) {\n // Convert plugin exceptions to error diagnostics (errors as values)\n diagnostics.push({\n level: \"error\",\n plugin: plugin.name,\n message: `Plugin threw: ${err instanceof Error ? err.message : String(err)}`,\n });\n continue;\n }\n\n // GEN-4: Merge plugin diagnostics\n if (output.diagnostics) {\n diagnostics.push(...output.diagnostics);\n }\n\n // Validate and apply patches\n for (const patch of output.patches) {\n const validation = validatePath(patch.path);\n if (!validation.valid) {\n diagnostics.push({\n level: \"error\",\n plugin: plugin.name,\n message: `Invalid path \"${patch.path}\": ${validation.reason}`,\n });\n continue;\n }\n\n // Apply with normalized path\n const normalizedPatch =\n patch.op === \"set\"\n ? { op: \"set\" as const, path: validation.normalized, content: patch.content }\n : { op: \"delete\" as const, path: validation.normalized };\n\n const collision = vfs.applyPatch(normalizedPatch, plugin.name);\n if (collision) {\n diagnostics.push(collision);\n }\n }\n\n // PLG-8: Store artifacts at allArtifacts[plugin.name]\n if (output.artifacts) {\n allArtifacts[plugin.name] = output.artifacts;\n }\n }\n\n // Collect files from VFS\n const files = vfs.getFiles();\n\n // GEN-5, GEN-8: Error gate — no disk mutation on error\n const hasErrors = diagnostics.some((d) => d.level === \"error\");\n if (hasErrors) {\n return { files, artifacts: allArtifacts, diagnostics };\n }\n\n if (opts.cleanOutDir) {\n await fs.rm(opts.outDir, { recursive: true, force: true });\n }\n\n // Build header\n const header = generateHeader({\n sourceId: opts.sourceId,\n schemaHash: opts.schema.hash,\n stamp: opts.stamp,\n });\n\n // Flush files to disk (GEN-6: OS path conversion only at write time)\n for (const file of files) {\n const absPath = nodePath.join(opts.outDir, ...file.path.split(\"/\"));\n const dir = nodePath.dirname(absPath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(absPath, header + file.content, \"utf-8\");\n }\n\n return { files, artifacts: allArtifacts, diagnostics };\n}\n\nfunction validatePluginNames(\n plugins: readonly CodegenPlugin[]\n): Diagnostic | undefined {\n const seen = new Set<string>();\n for (const plugin of plugins) {\n if (!plugin.name) {\n return {\n level: \"error\",\n plugin: \"\",\n message: \"Plugin name must not be empty (PLG-1)\",\n };\n }\n if (seen.has(plugin.name)) {\n return {\n level: \"error\",\n plugin: plugin.name,\n message: `Duplicate plugin name \"${plugin.name}\" (GEN-2)`,\n };\n }\n seen.add(plugin.name);\n }\n return undefined;\n}\n","import type { Diagnostic, FilePatch } from \"./types.js\";\n\ntype FileEntry = {\n content: string;\n source: string; // plugin name that set the file\n};\n\n/**\n * Virtual filesystem for composing FilePatch operations.\n *\n * Maintains an in-memory FS and detects collisions per FP-5, FP-6, FP-7.\n * Paths are assumed to be already validated/normalized.\n */\nexport class VirtualFS {\n private readonly files = new Map<string, FileEntry>();\n private readonly deleted = new Set<string>();\n\n /**\n * Apply a FilePatch to the virtual FS.\n * Returns a Diagnostic if a collision/warning condition is detected.\n */\n applyPatch(patch: FilePatch, pluginName: string): Diagnostic | undefined {\n if (patch.op === \"set\") {\n return this.applySet(patch.path, patch.content, pluginName);\n }\n return this.applyDelete(patch.path, pluginName);\n }\n\n private applySet(path: string, content: string, pluginName: string): Diagnostic | undefined {\n const existing = this.files.get(path);\n\n if (existing) {\n // FP-5: Duplicate set on same path -> error\n const samePlugin = existing.source === pluginName;\n return {\n level: \"error\",\n plugin: pluginName,\n message: samePlugin\n ? `Duplicate set on \"${path}\" within plugin \"${pluginName}\"`\n : `File \"${path}\" already set by plugin \"${existing.source}\", cannot be set again by \"${pluginName}\"`,\n };\n }\n\n // delete-then-set is allowed (intentional regeneration)\n this.deleted.delete(path);\n this.files.set(path, { content, source: pluginName });\n return undefined;\n }\n\n private applyDelete(path: string, pluginName: string): Diagnostic | undefined {\n const existing = this.files.get(path);\n\n if (!existing && !this.deleted.has(path)) {\n // FP-7: Delete on nonexistent path -> warn\n return {\n level: \"warn\",\n plugin: pluginName,\n message: `Delete on nonexistent path \"${path}\"`,\n };\n }\n\n if (existing) {\n // FP-6: set-then-delete -> allowed with warning\n this.files.delete(path);\n this.deleted.add(path);\n return {\n level: \"warn\",\n plugin: pluginName,\n message: `File \"${path}\" set by plugin \"${existing.source}\" is being deleted by \"${pluginName}\". Prior work is voided.`,\n };\n }\n\n // Already deleted - just track it\n this.deleted.add(path);\n return undefined;\n }\n\n /**\n * Get all files in deterministic (lexicographic) order (DET-5).\n */\n getFiles(): Array<{ path: string; content: string }> {\n const entries = Array.from(this.files.entries());\n entries.sort(([a], [b]) => a.localeCompare(b));\n return entries.map(([path, { content }]) => ({ path, content }));\n }\n\n has(path: string): boolean {\n return this.files.has(path);\n }\n}\n","export type PathValidationResult =\n | { valid: true; normalized: string }\n | { valid: false; reason: string };\n\n/**\n * Validate and normalize a file path per FP-1, FP-2, GEN-6.\n *\n * - MUST be a POSIX relative path\n * - MUST NOT contain `..`, absolute prefixes, drive letters, or null bytes\n * - Normalizes backslashes, multiple slashes, and leading `./`\n */\nexport function validatePath(path: string): PathValidationResult {\n if (!path) {\n return { valid: false, reason: \"Path must not be empty\" };\n }\n\n if (path.includes(\"\\0\")) {\n return { valid: false, reason: \"Path must not contain null bytes\" };\n }\n\n // Normalize backslashes to forward slashes (GEN-6)\n let normalized = path.replace(/\\\\/g, \"/\");\n\n // Check for drive letters (e.g., C:/)\n if (/^[a-zA-Z]:/.test(normalized)) {\n return { valid: false, reason: \"Path must not contain drive letters\" };\n }\n\n // Check for absolute path\n if (normalized.startsWith(\"/\")) {\n return { valid: false, reason: \"Path must be relative, not absolute\" };\n }\n\n // Collapse multiple slashes\n normalized = normalized.replace(/\\/+/g, \"/\");\n\n // Remove leading ./\n if (normalized.startsWith(\"./\")) {\n normalized = normalized.slice(2);\n }\n\n // Remove trailing slash\n if (normalized.endsWith(\"/\") && normalized.length > 1) {\n normalized = normalized.slice(0, -1);\n }\n\n // Check for .. traversal (after normalization)\n const segments = normalized.split(\"/\");\n for (const segment of segments) {\n if (segment === \"..\") {\n return { valid: false, reason: \"Path must not contain '..' traversal\" };\n }\n }\n\n if (!normalized) {\n return { valid: false, reason: \"Path resolves to empty after normalization\" };\n }\n\n return { valid: true, normalized };\n}\n","import { toCanonical, sha256Sync } from \"@manifesto-ai/core\";\n\n/**\n * Deterministic hash function (DET-1).\n * Same input always produces the same output.\n * Uses Core's canonical form (sorted keys, no undefined) + SHA-256.\n */\nexport function stableHash(input: unknown): string {\n const canonical = toCanonical(input);\n return sha256Sync(canonical);\n}\n","export interface HeaderOptions {\n readonly sourceId?: string;\n readonly schemaHash: string;\n readonly stamp?: boolean;\n}\n\n/**\n * Generate the @generated file header (DET-2, DET-3, DET-4).\n *\n * Default mode: no timestamp (deterministic).\n * With stamp=true: appends ISO 8601 timestamp line.\n */\nexport function generateHeader(options: HeaderOptions): string {\n const source = options.sourceId ?? \"unknown\";\n const lines = [\n \"// @generated by @manifesto-ai/codegen \\u2014 DO NOT EDIT\",\n `// Source: ${source} | Schema hash: ${options.schemaHash}`,\n ];\n\n if (options.stamp) {\n lines.push(`// Generated at: ${new Date().toISOString()}`);\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import type { FieldSpec } from \"@manifesto-ai/core\";\n\nexport type DomainPrimitive = \"string\" | \"number\" | \"boolean\" | \"null\";\n\nexport type DomainTypeField = {\n readonly type: DomainType;\n readonly optional: boolean;\n};\n\nexport type DomainType =\n | { readonly kind: \"unknown\" }\n | { readonly kind: \"primitive\"; readonly type: DomainPrimitive }\n | { readonly kind: \"literal\"; readonly value: string | number | boolean | null }\n | { readonly kind: \"array\"; readonly element: DomainType }\n | { readonly kind: \"tuple\"; readonly elements: readonly DomainType[] }\n | { readonly kind: \"object\"; readonly fields: Readonly<Record<string, DomainTypeField>> }\n | { readonly kind: \"record\"; readonly key: DomainType; readonly value: DomainType }\n | { readonly kind: \"union\"; readonly types: readonly DomainType[] };\n\nconst UNKNOWN_TYPE: DomainType = { kind: \"unknown\" };\nconst NULL_TYPE: DomainType = { kind: \"primitive\", type: \"null\" };\n\nexport function unknownType(): DomainType {\n return UNKNOWN_TYPE;\n}\n\nexport function primitiveType(type: DomainPrimitive): DomainType {\n return type === \"null\" ? NULL_TYPE : { kind: \"primitive\", type };\n}\n\nexport function literalType(\n value: string | number | boolean | null\n): DomainType {\n return value === null ? NULL_TYPE : { kind: \"literal\", value };\n}\n\nexport function arrayType(element: DomainType): DomainType {\n return { kind: \"array\", element };\n}\n\nexport function tupleType(elements: readonly DomainType[]): DomainType {\n return { kind: \"tuple\", elements };\n}\n\nexport function objectType(fields: Record<string, DomainTypeField>): DomainType {\n return { kind: \"object\", fields };\n}\n\nexport function recordType(key: DomainType, value: DomainType): DomainType {\n return { kind: \"record\", key, value };\n}\n\nexport function fieldSpecToDomainField(spec: FieldSpec): DomainTypeField {\n return {\n type: fieldSpecToDomainType(spec),\n optional: !spec.required,\n };\n}\n\nexport function fieldSpecToDomainType(spec: FieldSpec): DomainType {\n let base: DomainType;\n\n if (typeof spec.type === \"object\" && \"enum\" in spec.type) {\n base = unionOf(\n spec.type.enum.map((value) => literalValueToType(value))\n );\n } else {\n switch (spec.type) {\n case \"string\":\n base = primitiveType(\"string\");\n break;\n case \"number\":\n base = primitiveType(\"number\");\n break;\n case \"boolean\":\n base = primitiveType(\"boolean\");\n break;\n case \"null\":\n base = NULL_TYPE;\n break;\n case \"object\":\n if (spec.fields) {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(spec.fields)) {\n fields[name] = fieldSpecToDomainField(spec.fields[name]);\n }\n base = objectType(fields);\n break;\n }\n base = recordType(primitiveType(\"string\"), unknownType());\n break;\n case \"array\":\n base = arrayType(\n spec.items ? fieldSpecToDomainType(spec.items) : unknownType()\n );\n break;\n default:\n base = unknownType();\n break;\n }\n }\n\n return spec.required ? base : unionOf([base, NULL_TYPE]);\n}\n\nexport function literalValueToType(value: unknown): DomainType {\n if (value === null) {\n return NULL_TYPE;\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return literalType(value);\n }\n\n if (Array.isArray(value)) {\n return arrayType(\n value.length === 0\n ? unknownType()\n : unionOf(value.map((item) => literalValueToType(item)))\n );\n }\n\n if (isPlainObject(value)) {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(value)) {\n fields[name] = {\n type: literalValueToType(value[name]),\n optional: false,\n };\n }\n return objectType(fields);\n }\n\n return unknownType();\n}\n\nexport function unionOf(types: readonly DomainType[]): DomainType {\n const flattened: DomainType[] = [];\n\n for (const type of types) {\n if (type.kind === \"unknown\") {\n return type;\n }\n if (type.kind === \"union\") {\n flattened.push(...type.types);\n continue;\n }\n flattened.push(type);\n }\n\n const unique = new Map<string, DomainType>();\n for (const type of flattened) {\n unique.set(stableTypeKey(type), type);\n }\n\n const deduped = Array.from(unique.values());\n if (deduped.length === 0) {\n return unknownType();\n }\n if (deduped.length === 1) {\n return deduped[0];\n }\n return { kind: \"union\", types: deduped };\n}\n\nexport function removeNullType(type: DomainType): DomainType[] {\n switch (type.kind) {\n case \"primitive\":\n return type.type === \"null\" ? [] : [type];\n case \"literal\":\n return type.value === null ? [] : [type];\n case \"union\":\n return type.types.flatMap((member) => removeNullType(member));\n default:\n return [type];\n }\n}\n\nexport function renderDomainType(type: DomainType): string {\n switch (type.kind) {\n case \"unknown\":\n return \"unknown\";\n case \"primitive\":\n return type.type;\n case \"literal\":\n return renderLiteral(type.value);\n case \"array\":\n return `${wrapArrayElement(renderDomainType(type.element), type.element)}[]`;\n case \"tuple\":\n return `[${type.elements.map((element) => renderDomainType(element)).join(\", \")}]`;\n case \"object\": {\n const fieldNames = Object.keys(type.fields).sort();\n if (fieldNames.length === 0) {\n return \"{}\";\n }\n const parts = fieldNames.map((name) => {\n const field = type.fields[name];\n const optional = field.optional ? \"?\" : \"\";\n return `${name}${optional}: ${renderDomainType(field.type)}`;\n });\n return `{ ${parts.join(\"; \")} }`;\n }\n case \"record\":\n return `Record<${renderDomainType(type.key)}, ${renderDomainType(type.value)}>`;\n case \"union\":\n return type.types.map((member) => renderDomainType(member)).join(\" | \");\n }\n}\n\nfunction wrapArrayElement(rendered: string, type: DomainType): string {\n if (type.kind === \"union\") {\n return `(${rendered})`;\n }\n return rendered;\n}\n\nfunction renderLiteral(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nfunction stableTypeKey(type: DomainType): string {\n switch (type.kind) {\n case \"unknown\":\n return \"unknown\";\n case \"primitive\":\n return `primitive:${type.type}`;\n case \"literal\":\n return `literal:${JSON.stringify(type.value)}`;\n case \"array\":\n return `array:${stableTypeKey(type.element)}`;\n case \"tuple\":\n return `tuple:${type.elements.map((element) => stableTypeKey(element)).join(\",\")}`;\n case \"object\": {\n const keys = Object.keys(type.fields).sort();\n const fields = keys.map((name) => {\n const field = type.fields[name];\n return `${name}:${field.optional ? \"?\" : \"\"}${stableTypeKey(field.type)}`;\n });\n return `object:${fields.join(\",\")}`;\n }\n case \"record\":\n return `record:${stableTypeKey(type.key)}:${stableTypeKey(type.value)}`;\n case \"union\":\n return `union:${type.types.map((member) => stableTypeKey(member)).sort().join(\"|\")}`;\n }\n}\n\nfunction isPlainObject(\n value: unknown\n): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","import type { DomainSchema, ExprNode } from \"@manifesto-ai/core\";\nimport type { Diagnostic } from \"../types.js\";\nimport {\n arrayType,\n fieldSpecToDomainType,\n literalValueToType,\n objectType,\n primitiveType,\n recordType,\n removeNullType,\n tupleType,\n type DomainType,\n type DomainTypeField,\n unionOf,\n unknownType,\n} from \"./domain-type-model.js\";\n\ntype InferenceEnv = ReadonlyMap<string, DomainType>;\n\ntype InferenceContext = {\n readonly schema: DomainSchema;\n readonly pluginName: string;\n readonly diagnostics: Diagnostic[];\n readonly warnedMessages: Set<string>;\n readonly computedCache: Map<string, DomainType>;\n readonly computedInFlight: Set<string>;\n};\n\nconst META_TYPE = objectType({\n actionName: { type: primitiveType(\"string\"), optional: false },\n intentId: { type: primitiveType(\"string\"), optional: false },\n timestamp: { type: primitiveType(\"number\"), optional: false },\n});\n\nexport function createInferenceContext(\n schema: DomainSchema,\n diagnostics: Diagnostic[],\n pluginName: string\n): InferenceContext {\n return {\n schema,\n pluginName,\n diagnostics,\n warnedMessages: new Set(),\n computedCache: new Map(),\n computedInFlight: new Set(),\n };\n}\n\nexport function inferComputedType(\n name: string,\n ctx: InferenceContext\n): DomainType {\n if (ctx.computedCache.has(name)) {\n return ctx.computedCache.get(name) ?? unknownType();\n }\n\n const spec = ctx.schema.computed.fields[name];\n if (!spec) {\n warn(ctx, `Unknown computed field \"${name}\". Emitting \"unknown\".`);\n return unknownType();\n }\n\n if (ctx.computedInFlight.has(name)) {\n warn(ctx, `Recursive computed field \"${name}\" could not be inferred. Emitting \"unknown\".`);\n return unknownType();\n }\n\n ctx.computedInFlight.add(name);\n const inferred = inferExprType(spec.expr, ctx, new Map());\n ctx.computedInFlight.delete(name);\n ctx.computedCache.set(name, inferred);\n return inferred;\n}\n\nexport function inferExprType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv = new Map()\n): DomainType {\n switch (expr.kind) {\n case \"lit\":\n return literalValueToType(expr.value);\n\n case \"get\":\n return inferPathType(expr.path, ctx, env);\n\n case \"eq\":\n case \"neq\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"and\":\n case \"or\":\n case \"not\":\n case \"startsWith\":\n case \"endsWith\":\n case \"strIncludes\":\n case \"includes\":\n case \"every\":\n case \"some\":\n case \"hasKey\":\n case \"isNull\":\n case \"toBoolean\":\n return primitiveType(\"boolean\");\n\n case \"add\":\n case \"sub\":\n case \"mul\":\n case \"div\":\n case \"mod\":\n case \"min\":\n case \"max\":\n case \"abs\":\n case \"neg\":\n case \"floor\":\n case \"ceil\":\n case \"round\":\n case \"sqrt\":\n case \"pow\":\n case \"sumArray\":\n case \"strLen\":\n case \"len\":\n case \"indexOf\":\n case \"toNumber\":\n return primitiveType(\"number\");\n\n case \"concat\":\n case \"substring\":\n case \"trim\":\n case \"toLowerCase\":\n case \"toUpperCase\":\n case \"replace\":\n case \"typeof\":\n case \"toString\":\n return primitiveType(\"string\");\n\n case \"if\":\n return unionOf([\n inferExprType(expr.then, ctx, env),\n inferExprType(expr.else, ctx, env),\n ]);\n\n case \"split\":\n return arrayType(primitiveType(\"string\"));\n\n case \"at\":\n return unionOf([inferIndexedAccessType(expr.array, ctx, env), primitiveType(\"null\")]);\n\n case \"first\":\n case \"last\":\n case \"minArray\":\n case \"maxArray\":\n return unionOf([inferCollectionElementType(expr.array, ctx, env), primitiveType(\"null\")]);\n\n case \"slice\":\n case \"reverse\":\n case \"unique\":\n return inferArrayLikeType(expr.array, ctx, env);\n\n case \"filter\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n inferExprType(expr.predicate, ctx, nextEnv);\n return arrayType(elementType);\n }\n\n case \"map\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n return arrayType(inferExprType(expr.mapper, ctx, nextEnv));\n }\n\n case \"find\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n inferExprType(expr.predicate, ctx, nextEnv);\n return unionOf([elementType, primitiveType(\"null\")]);\n }\n\n case \"append\": {\n const baseArray = inferArrayLikeType(expr.array, ctx, env);\n const baseElement = getArrayElementType(baseArray);\n const itemTypes = expr.items.map((item) => inferExprType(item, ctx, env));\n return arrayType(unionOf([baseElement, ...itemTypes]));\n }\n\n case \"flat\":\n return inferFlatType(expr.array, ctx, env);\n\n case \"object\": {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(expr.fields)) {\n fields[name] = {\n type: inferExprType(expr.fields[name], ctx, env),\n optional: false,\n };\n }\n return objectType(fields);\n }\n\n case \"field\":\n return inferFieldType(inferExprType(expr.object, ctx, env), expr.property);\n\n case \"keys\":\n return arrayType(primitiveType(\"string\"));\n\n case \"values\":\n return arrayType(inferObjectValueType(inferExprType(expr.obj, ctx, env)));\n\n case \"entries\":\n return arrayType(\n tupleType([\n primitiveType(\"string\"),\n inferObjectValueType(inferExprType(expr.obj, ctx, env)),\n ])\n );\n\n case \"merge\":\n return inferMergeType(\n expr.objects.map((objectExpr) => inferExprType(objectExpr, ctx, env))\n );\n\n case \"pick\":\n return inferPickLikeType(expr.obj, expr.keys, false, ctx, env);\n\n case \"omit\":\n return inferPickLikeType(expr.obj, expr.keys, true, ctx, env);\n\n case \"fromEntries\":\n return inferFromEntriesType(expr.entries, ctx, env);\n\n case \"coalesce\": {\n const members = expr.args.flatMap((arg) =>\n removeNullType(inferExprType(arg, ctx, env))\n );\n return members.length === 0 ? primitiveType(\"null\") : unionOf(members);\n }\n\n default:\n warn(ctx, `Unsupported expression kind \"${(expr as { kind: string }).kind}\". Emitting \"unknown\".`);\n return unknownType();\n }\n}\n\nfunction inferPathType(\n path: string,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const [head, ...tail] = path.split(\".\");\n if (!head) {\n warn(ctx, `Empty get() path encountered. Emitting \"unknown\".`);\n return unknownType();\n }\n\n let base: DomainType | undefined = env.get(head);\n\n if (!base) {\n if (head === \"meta\") {\n base = META_TYPE;\n } else if (Object.hasOwn(ctx.schema.state.fields, head)) {\n base = fieldSpecToDomainType(ctx.schema.state.fields[head]);\n } else if (Object.hasOwn(ctx.schema.computed.fields, head)) {\n base = inferComputedType(head, ctx);\n }\n }\n\n if (!base) {\n warn(ctx, `Unknown get() path \"${path}\". Emitting \"unknown\".`);\n return unknownType();\n }\n\n return walkPathType(base, tail);\n}\n\nfunction walkPathType(base: DomainType, segments: readonly string[]): DomainType {\n let current = base;\n for (const segment of segments) {\n current = accessSegmentType(current, segment);\n }\n return current;\n}\n\nfunction accessSegmentType(\n base: DomainType,\n segment: string\n): DomainType {\n switch (base.kind) {\n case \"object\":\n return Object.hasOwn(base.fields, segment)\n ? base.fields[segment].type\n : unknownType();\n case \"record\":\n return unionOf([base.value, primitiveType(\"null\")]);\n case \"array\":\n return isNumericSegment(segment)\n ? unionOf([base.element, primitiveType(\"null\")])\n : unknownType();\n case \"tuple\":\n return isNumericSegment(segment)\n ? base.elements[Number(segment)] ?? unknownType()\n : unknownType();\n case \"union\":\n return unionIgnoringUnknown(\n base.types.map((member) => accessSegmentType(member, segment))\n );\n default:\n return unknownType();\n }\n}\n\nfunction inferIndexedAccessType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const base = inferExprType(expr, ctx, env);\n switch (base.kind) {\n case \"array\":\n return base.element;\n case \"tuple\":\n return unionOf(base.elements);\n case \"record\":\n return base.value;\n case \"union\":\n return unionOf(base.types.map((member) => inferIndexedAccessFromType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferIndexedAccessFromType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type.element;\n case \"tuple\":\n return unionOf(type.elements);\n case \"record\":\n return type.value;\n default:\n return unknownType();\n }\n}\n\nfunction inferCollectionElementType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n return getArrayElementType(inferExprType(expr, ctx, env));\n}\n\nfunction getArrayElementType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type.element;\n case \"tuple\":\n return unionOf(type.elements);\n case \"union\":\n return unionOf(type.types.map((member) => getArrayElementType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferArrayLikeType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const inferred = inferExprType(expr, ctx, env);\n switch (inferred.kind) {\n case \"array\":\n return inferred;\n case \"tuple\":\n return arrayType(unionOf(inferred.elements));\n case \"union\": {\n const arrays = inferred.types\n .map((member) => inferArrayLikeFromType(member))\n .filter((member): member is DomainType => member.kind !== \"unknown\");\n return arrays.length === 0 ? arrayType(unknownType()) : unionOf(arrays);\n }\n default:\n return arrayType(unknownType());\n }\n}\n\nfunction inferArrayLikeFromType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type;\n case \"tuple\":\n return arrayType(unionOf(type.elements));\n default:\n return unknownType();\n }\n}\n\nfunction inferFlatType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const outer = inferArrayLikeType(expr, ctx, env);\n const outerElement = getArrayElementType(outer);\n\n switch (outerElement.kind) {\n case \"array\":\n return arrayType(outerElement.element);\n case \"tuple\":\n return arrayType(unionOf(outerElement.elements));\n case \"union\": {\n const flatMembers: DomainType[] = [];\n for (const member of outerElement.types) {\n if (member.kind === \"array\") {\n flatMembers.push(member.element);\n continue;\n }\n if (member.kind === \"tuple\") {\n flatMembers.push(unionOf(member.elements));\n continue;\n }\n flatMembers.push(member);\n }\n return arrayType(unionOf(flatMembers));\n }\n default:\n return arrayType(outerElement);\n }\n}\n\nfunction inferFieldType(base: DomainType, property: string): DomainType {\n switch (base.kind) {\n case \"object\":\n return Object.hasOwn(base.fields, property)\n ? base.fields[property].type\n : primitiveType(\"null\");\n case \"record\":\n return unionOf([base.value, primitiveType(\"null\")]);\n case \"union\":\n return unionOf(base.types.map((member) => inferFieldType(member, property)));\n default:\n return primitiveType(\"null\");\n }\n}\n\nfunction inferObjectValueType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"object\": {\n const values = Object.keys(type.fields).map((name) => type.fields[name].type);\n return values.length === 0 ? unknownType() : unionOf(values);\n }\n case \"record\":\n return type.value;\n case \"union\":\n return unionOf(type.types.map((member) => inferObjectValueType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferMergeType(types: readonly DomainType[]): DomainType {\n const fields: Record<string, DomainTypeField> = {};\n let sawObject = false;\n\n for (const type of types) {\n if (type.kind !== \"object\") {\n continue;\n }\n sawObject = true;\n for (const name of Object.keys(type.fields)) {\n fields[name] = type.fields[name];\n }\n }\n\n return sawObject ? objectType(fields) : objectType({});\n}\n\nfunction inferPickLikeType(\n objectExpr: ExprNode,\n keysExpr: ExprNode,\n omit: boolean,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const base = inferExprType(objectExpr, ctx, env);\n if (base.kind !== \"object\") {\n return objectType({});\n }\n\n const keys = readStringArrayLiteral(keysExpr);\n if (!keys) {\n return base;\n }\n\n const selected = new Set(keys);\n const fields: Record<string, DomainTypeField> = {};\n\n for (const name of Object.keys(base.fields)) {\n const shouldInclude = omit ? !selected.has(name) : selected.has(name);\n if (shouldInclude) {\n fields[name] = base.fields[name];\n }\n }\n\n return objectType(fields);\n}\n\nfunction inferFromEntriesType(\n entriesExpr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const literalEntries = readLiteralEntries(entriesExpr);\n if (literalEntries) {\n const valueTypes = literalEntries.map(([, value]) => literalValueToType(value));\n return recordType(primitiveType(\"string\"), unionOf(valueTypes));\n }\n\n const entriesType = inferExprType(entriesExpr, ctx, env);\n const elementType = getArrayElementType(entriesType);\n\n if (elementType.kind === \"tuple\" && elementType.elements.length >= 2) {\n return recordType(primitiveType(\"string\"), elementType.elements[1]);\n }\n\n return recordType(primitiveType(\"string\"), unknownType());\n}\n\nfunction withCollectionEnv(\n env: InferenceEnv,\n itemType: DomainType\n): Map<string, DomainType> {\n const next = new Map(env);\n next.set(\"$index\", primitiveType(\"number\"));\n next.set(\"$item\", itemType);\n return next;\n}\n\nfunction readStringArrayLiteral(expr: ExprNode): string[] | null {\n if (expr.kind !== \"lit\" || !Array.isArray(expr.value)) {\n return null;\n }\n\n const values: string[] = [];\n for (const item of expr.value) {\n if (typeof item !== \"string\") {\n return null;\n }\n values.push(item);\n }\n return values;\n}\n\nfunction readLiteralEntries(\n expr: ExprNode\n): Array<[string, unknown]> | null {\n if (expr.kind !== \"lit\" || !Array.isArray(expr.value)) {\n return null;\n }\n\n const entries: Array<[string, unknown]> = [];\n for (const item of expr.value) {\n if (!Array.isArray(item) || item.length !== 2 || typeof item[0] !== \"string\") {\n return null;\n }\n entries.push([item[0], item[1]]);\n }\n return entries;\n}\n\nfunction unionIgnoringUnknown(types: readonly DomainType[]): DomainType {\n const filtered = types.filter((type) => type.kind !== \"unknown\");\n return filtered.length === 0 ? unknownType() : unionOf(filtered);\n}\n\nfunction isNumericSegment(segment: string): boolean {\n return /^\\d+$/.test(segment);\n}\n\nfunction warn(ctx: InferenceContext, message: string): void {\n if (ctx.warnedMessages.has(message)) {\n return;\n }\n ctx.warnedMessages.add(message);\n ctx.diagnostics.push({\n level: \"warn\",\n plugin: ctx.pluginName,\n message,\n });\n}\n","import type { CodegenContext, CodegenOutput, CodegenPlugin, Diagnostic } from \"../types.js\";\nimport type { FieldSpec } from \"@manifesto-ai/core\";\nimport { createInferenceContext, inferComputedType } from \"./domain-type-inference.js\";\nimport {\n fieldSpecToDomainField,\n fieldSpecToDomainType,\n renderDomainType,\n type DomainTypeField,\n} from \"./domain-type-model.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-domain\";\n\nexport interface DomainPluginOptions {\n readonly fileName?: string;\n readonly interfaceName?: string;\n readonly includeReservedState?: boolean;\n}\n\nexport function createDomainPlugin(options?: DomainPluginOptions): CodegenPlugin {\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n const inference = createInferenceContext(ctx.schema, diagnostics, PLUGIN_NAME);\n\n const interfaceName = options?.interfaceName\n ?? deriveInterfaceName(ctx)\n ?? \"Domain\";\n const fileName = options?.fileName ?? deriveFileName(ctx.sourceId);\n\n const stateFields = renderFieldBlock(\n ctx.schema.state.fields,\n { includeReservedState: options?.includeReservedState ?? false },\n (_name, spec) => fieldSpecToDomainField(spec)\n );\n\n const computedFields = renderFieldBlock(\n ctx.schema.computed.fields,\n { includeReservedState: true },\n (name) => ({\n type: inferComputedType(name, inference),\n optional: false,\n })\n );\n\n const actionNames = Object.keys(ctx.schema.actions).sort();\n const actionLines = actionNames.map((name) => {\n const action = ctx.schema.actions[name];\n return ` ${name}: ${renderActionSignature(action.input)}`;\n });\n\n const sections = [\n \"export interface \" + interfaceName + \" {\",\n \" readonly state: {\",\n stateFields,\n \" }\",\n \" readonly computed: {\",\n computedFields,\n \" }\",\n \" readonly actions: {\",\n actionLines.join(\"\\n\"),\n \" }\",\n \"}\",\n ];\n\n return {\n patches: [{ op: \"set\", path: fileName, content: sections.join(\"\\n\") + \"\\n\" }],\n diagnostics,\n };\n },\n };\n}\n\nfunction renderFieldBlock<T>(\n source: Record<string, T>,\n options: { includeReservedState: boolean },\n mapField: (name: string, value: T) => DomainTypeField\n): string {\n const names = Object.keys(source)\n .filter((name) => options.includeReservedState || !name.startsWith(\"$\"))\n .sort();\n\n if (names.length === 0) {\n return \"\";\n }\n\n return names\n .map((name) => {\n const field = mapField(name, source[name]);\n const optional = field.optional ? \"?\" : \"\";\n return ` ${name}${optional}: ${renderDomainType(field.type)}`;\n })\n .join(\"\\n\");\n}\n\nfunction renderActionSignature(input: FieldSpec | undefined): string {\n if (!input || typeof input !== \"object\" || !(\"type\" in input)) {\n return \"() => void\";\n }\n\n if (input.type !== \"object\" || !input.fields) {\n return `(input: ${renderDomainType(fieldSpecToDomainType(input))}) => void`;\n }\n\n const names = Object.keys(input.fields);\n if (names.length === 0) {\n return \"() => void\";\n }\n\n const params = names.map((name) => {\n const field = fieldSpecToDomainField(input.fields![name]);\n const optional = field.optional ? \"?\" : \"\";\n return `${name}${optional}: ${renderDomainType(field.type)}`;\n });\n\n return `(${params.join(\", \")}) => void`;\n}\n\nfunction deriveInterfaceName(ctx: CodegenContext): string | null {\n const metaName = ctx.schema.meta?.name?.trim();\n if (metaName) {\n return metaName;\n }\n\n const basename = basenameWithoutExtension(ctx.sourceId);\n if (!basename) {\n return null;\n }\n\n const candidate = pascalCase(basename);\n return candidate.endsWith(\"Domain\") ? candidate : `${candidate}Domain`;\n}\n\nfunction deriveFileName(sourceId?: string): string {\n if (!sourceId) {\n return \"domain.ts\";\n }\n\n const normalized = sourceId.replace(/\\\\/g, \"/\");\n return `${normalized}.ts`;\n}\n\nfunction basenameWithoutExtension(sourceId?: string): string | null {\n if (!sourceId) {\n return null;\n }\n\n const normalized = sourceId.replace(/\\\\/g, \"/\");\n const basename = normalized.split(\"/\").pop() ?? \"\";\n if (!basename) {\n return null;\n }\n\n return basename.replace(/\\.[^.]+$/, \"\");\n}\n\nfunction pascalCase(value: string): string {\n return value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\"\");\n}\n","import type {\n TypeDefinition,\n TypeSpec,\n ActionSpec,\n FieldSpec,\n FieldType,\n} from \"@manifesto-ai/core\";\nimport type {\n CodegenContext,\n CodegenOutput,\n CodegenPlugin,\n Diagnostic,\n} from \"../types.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-ts\";\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport interface TsPluginOptions {\n readonly typesFile?: string;\n readonly actionsFile?: string;\n}\n\nexport interface TsPluginArtifacts {\n readonly typeNames: string[];\n readonly typeImportPath: string;\n}\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport function createTsPlugin(options?: TsPluginOptions): CodegenPlugin {\n const typesFile = options?.typesFile ?? \"types.ts\";\n const actionsFile = options?.actionsFile ?? \"actions.ts\";\n\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n const typeNames: string[] = [];\n\n // Generate types from schema.types (GEN-10, TS-6: lexicographic order)\n const sortedTypeNames = Object.keys(ctx.schema.types).sort();\n const typeDecls: string[] = [];\n\n for (const name of sortedTypeNames) {\n const spec = ctx.schema.types[name];\n typeNames.push(name);\n typeDecls.push(renderNamedType(name, spec, diagnostics));\n }\n\n const typesContent = typeDecls.join(\"\\n\\n\") + \"\\n\";\n\n // Generate action input types\n const sortedActionNames = Object.keys(ctx.schema.actions).sort();\n const actionDecls: string[] = [];\n\n for (const actionName of sortedActionNames) {\n const spec = ctx.schema.actions[actionName];\n if (spec.input) {\n const typeName = pascalCase(actionName) + \"Input\";\n actionDecls.push(renderActionInputType(typeName, spec, diagnostics));\n }\n }\n\n const patches = [\n { op: \"set\" as const, path: typesFile, content: typesContent },\n ];\n\n if (actionDecls.length > 0) {\n const actionsContent = actionDecls.join(\"\\n\\n\") + \"\\n\";\n patches.push({ op: \"set\" as const, path: actionsFile, content: actionsContent });\n }\n\n const artifacts: TsPluginArtifacts = {\n typeNames,\n typeImportPath: `./${typesFile.replace(/\\.ts$/, \"\")}`,\n };\n\n return { patches, artifacts: artifacts as unknown as Record<string, unknown>, diagnostics };\n },\n };\n}\n\n// --- Type rendering ---\n\nfunction renderNamedType(\n name: string,\n spec: TypeSpec,\n diagnostics: Diagnostic[]\n): string {\n const def = spec.definition;\n\n // TS-3: top-level named object -> export interface\n if (def.kind === \"object\") {\n return renderInterface(name, def.fields, diagnostics);\n }\n\n // TS-3: all other named types -> export type\n const tsType = mapTypeDefinition(def, diagnostics);\n return `export type ${name} = ${tsType};`;\n}\n\nfunction renderInterface(\n name: string,\n fields: Record<string, { type: TypeDefinition; optional: boolean }>,\n diagnostics: Diagnostic[]\n): string {\n const sortedFields = Object.keys(fields).sort();\n const lines: string[] = [];\n\n for (const fieldName of sortedFields) {\n const field = fields[fieldName];\n const tsType = mapTypeDefinition(field.type, diagnostics);\n // TS-5: optional -> ?\n const opt = field.optional ? \"?\" : \"\";\n lines.push(` ${fieldName}${opt}: ${tsType};`);\n }\n\n return `export interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction mapTypeDefinition(\n def: TypeDefinition,\n diagnostics: Diagnostic[]\n): string {\n switch (def.kind) {\n case \"primitive\":\n return mapPrimitive(def.type);\n\n case \"literal\":\n return renderLiteral(def.value);\n\n case \"array\":\n return `${wrapComplex(mapTypeDefinition(def.element, diagnostics), def.element)}[]`;\n\n case \"record\":\n return `Record<${mapTypeDefinition(def.key, diagnostics)}, ${mapTypeDefinition(def.value, diagnostics)}>`;\n\n case \"object\": {\n const sortedFields = Object.keys(def.fields).sort();\n const parts: string[] = [];\n for (const fieldName of sortedFields) {\n const field = def.fields[fieldName];\n const tsType = mapTypeDefinition(field.type, diagnostics);\n const opt = field.optional ? \"?\" : \"\";\n parts.push(`${fieldName}${opt}: ${tsType}`);\n }\n return `{ ${parts.join(\"; \")} }`;\n }\n\n case \"union\":\n // TS-2: nullable uses T | null\n return def.types.map((t) => mapTypeDefinition(t, diagnostics)).join(\" | \");\n\n case \"ref\":\n return def.name;\n\n default: {\n // PLG-3, TS-1: unknown kind fallback\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Unknown TypeDefinition kind: \"${(def as Record<string, unknown>).kind}\". Emitting \"unknown\".`,\n });\n return \"unknown\";\n }\n }\n}\n\nfunction mapPrimitive(type: string): string {\n switch (type) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n default:\n return \"unknown\";\n }\n}\n\nfunction renderLiteral(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/** Wrap union types in parens when used as array element */\nfunction wrapComplex(tsType: string, def: TypeDefinition): string {\n if (def.kind === \"union\") {\n return `(${tsType})`;\n }\n return tsType;\n}\n\n// --- Action input rendering ---\n\nfunction renderActionInputType(\n typeName: string,\n spec: ActionSpec,\n diagnostics: Diagnostic[]\n): string {\n if (!spec.input) {\n return \"\";\n }\n const tsType = mapFieldSpec(spec.input, diagnostics);\n return `export type ${typeName} = ${tsType};`;\n}\n\nfunction mapFieldSpec(\n spec: FieldSpec,\n diagnostics: Diagnostic[]\n): string {\n const baseType = mapFieldType(spec.type, spec, diagnostics);\n\n // GEN-12: degrade for unknown structures\n if (!spec.required && baseType !== \"unknown\") {\n return `${baseType} | null`;\n }\n return baseType;\n}\n\nfunction mapFieldType(\n type: FieldType,\n spec: FieldSpec,\n diagnostics: Diagnostic[]\n): string {\n if (typeof type === \"object\" && \"enum\" in type) {\n // Enum -> union of literals\n return type.enum.map((v) => renderLiteral(v as string | number | boolean | null)).join(\" | \");\n }\n\n switch (type) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\": {\n if (spec.fields) {\n const sortedFields = Object.keys(spec.fields).sort();\n const parts: string[] = [];\n for (const name of sortedFields) {\n const field = spec.fields[name];\n const fieldType = mapFieldSpec(field, diagnostics);\n const opt = field.required ? \"\" : \"?\";\n parts.push(`${name}${opt}: ${fieldType}`);\n }\n return `{ ${parts.join(\"; \")} }`;\n }\n // GEN-12: unstructured object -> unknown\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: \"Object field without fields spec, degrading to Record<string, unknown>\",\n });\n return \"Record<string, unknown>\";\n }\n case \"array\": {\n if (spec.items) {\n return `${mapFieldSpec(spec.items, diagnostics)}[]`;\n }\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: \"Array field without items spec, degrading to unknown[]\",\n });\n return \"unknown[]\";\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction pascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n}\n","import type { TypeDefinition, TypeSpec } from \"@manifesto-ai/core\";\nimport type {\n CodegenContext,\n CodegenOutput,\n CodegenPlugin,\n Diagnostic,\n} from \"../types.js\";\nimport type { TsPluginArtifacts } from \"./ts-plugin.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-zod\";\nconst TS_PLUGIN_NAME = \"codegen-plugin-ts\";\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport interface ZodPluginOptions {\n readonly schemasFile?: string;\n}\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport function createZodPlugin(options?: ZodPluginOptions): CodegenPlugin {\n const schemasFile = options?.schemasFile ?? \"base.ts\";\n\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n\n // PLG-11: Optional TS artifacts dependency\n const tsArtifacts = ctx.artifacts[TS_PLUGIN_NAME] as TsPluginArtifacts | undefined;\n\n const sortedTypeNames = Object.keys(ctx.schema.types).sort();\n const schemaDecls: string[] = [];\n\n // Collect all type names for forward declarations with z.lazy\n const allTypeNames = new Set(sortedTypeNames);\n\n for (const name of sortedTypeNames) {\n const spec = ctx.schema.types[name];\n schemaDecls.push(renderNamedSchema(name, spec, allTypeNames, tsArtifacts, diagnostics));\n }\n\n // Build imports\n const imports: string[] = ['import { z } from \"zod\";'];\n\n // ZOD-4: Import TS types for annotations when available\n if (tsArtifacts && tsArtifacts.typeNames.length > 0) {\n const typeImports = sortedTypeNames\n .filter((n) => tsArtifacts.typeNames.includes(n))\n .join(\", \");\n if (typeImports) {\n imports.push(`import type { ${typeImports} } from \"${tsArtifacts.typeImportPath}\";`);\n }\n }\n\n const content = imports.join(\"\\n\") + \"\\n\\n\" + schemaDecls.join(\"\\n\\n\") + \"\\n\";\n\n return {\n patches: [{ op: \"set\", path: schemasFile, content }],\n diagnostics,\n };\n },\n };\n}\n\n// --- Schema rendering ---\n\nfunction renderNamedSchema(\n name: string,\n spec: TypeSpec,\n allTypeNames: Set<string>,\n tsArtifacts: TsPluginArtifacts | undefined,\n diagnostics: Diagnostic[]\n): string {\n const schemaName = `${name}Schema`;\n const zodExpr = mapTypeDefinition(spec.definition, allTypeNames, diagnostics);\n\n // ZOD-4/ZOD-5: Type annotation when TS artifacts available\n const hasTypeAnnotation = tsArtifacts && tsArtifacts.typeNames.includes(name);\n const annotation = hasTypeAnnotation ? `: z.ZodType<${name}>` : \"\";\n\n return `export const ${schemaName}${annotation} = ${zodExpr};`;\n}\n\nfunction mapTypeDefinition(\n def: TypeDefinition,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n switch (def.kind) {\n case \"primitive\":\n return mapPrimitiveZod(def.type);\n\n case \"literal\":\n return `z.literal(${renderLiteralValue(def.value)})`;\n\n case \"array\":\n return `z.array(${mapTypeDefinition(def.element, allTypeNames, diagnostics)})`;\n\n case \"record\":\n return handleRecord(def, allTypeNames, diagnostics);\n\n case \"object\":\n return renderZodObject(def.fields, allTypeNames, diagnostics);\n\n case \"union\":\n return handleUnion(def.types, allTypeNames, diagnostics);\n\n case \"ref\":\n // ZOD-2: Always z.lazy for circular reference support\n return `z.lazy(() => ${def.name}Schema)`;\n\n default: {\n // ZOD-1: Unknown kind fallback\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Unknown TypeDefinition kind: \"${(def as Record<string, unknown>).kind}\". Emitting \"z.unknown()\".`,\n });\n return \"z.unknown()\";\n }\n }\n}\n\nfunction mapPrimitiveZod(type: string): string {\n switch (type) {\n case \"string\":\n return \"z.string()\";\n case \"number\":\n return \"z.number()\";\n case \"boolean\":\n return \"z.boolean()\";\n case \"null\":\n return \"z.null()\";\n default:\n return \"z.unknown()\";\n }\n}\n\nfunction renderLiteralValue(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n if (value === null) {\n return \"null\";\n }\n return String(value);\n}\n\nfunction handleRecord(\n def: Extract<TypeDefinition, { kind: \"record\" }>,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n const valueSchema = mapTypeDefinition(def.value, allTypeNames, diagnostics);\n\n // ZOD-7: Non-string record key -> degrade to z.record(z.string(), ...)\n if (def.key.kind !== \"primitive\" || def.key.type !== \"string\") {\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Record key type is not string (got ${JSON.stringify(def.key)}). Degrading to z.record(z.string(), ...).`,\n });\n return `z.record(z.string(), ${valueSchema})`;\n }\n\n return `z.record(z.string(), ${valueSchema})`;\n}\n\nfunction renderZodObject(\n fields: Record<string, { type: TypeDefinition; optional: boolean }>,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n const sortedFields = Object.keys(fields).sort();\n const parts: string[] = [];\n\n for (const fieldName of sortedFields) {\n const field = fields[fieldName];\n let zodType = mapTypeDefinition(field.type, allTypeNames, diagnostics);\n\n // ZOD-6: optional -> .optional()\n if (field.optional) {\n zodType += \".optional()\";\n }\n\n parts.push(` ${fieldName}: ${zodType},`);\n }\n\n return `z.object({\\n${parts.join(\"\\n\")}\\n})`;\n}\n\nfunction handleUnion(\n types: TypeDefinition[],\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n // ZOD-3: 2-variant union with null -> z.nullable(T)\n if (types.length === 2) {\n const nullIdx = types.findIndex(\n (t) => t.kind === \"primitive\" && t.type === \"null\"\n );\n if (nullIdx !== -1) {\n const otherIdx = nullIdx === 0 ? 1 : 0;\n const otherSchema = mapTypeDefinition(types[otherIdx], allTypeNames, diagnostics);\n return `z.nullable(${otherSchema})`;\n }\n }\n\n const schemas = types.map((t) => mapTypeDefinition(t, allTypeNames, diagnostics));\n return `z.union([${schemas.join(\", \")}])`;\n}\n"],"mappings":"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","names":["PLUGIN_NAME","pascalCase","renderLiteral","PLUGIN_NAME","mapTypeDefinition"]}
|
|
1
|
+
{"version":3,"sources":["../src/runner.ts","../src/virtual-fs.ts","../src/path-safety.ts","../src/stable-hash.ts","../src/header.ts","../src/plugins/domain-type-model.ts","../src/plugins/domain-type-inference.ts","../src/plugins/domain-plugin.ts","../src/compiler-codegen.ts","../src/plugins/ts-plugin.ts","../src/plugins/zod-plugin.ts"],"sourcesContent":["import * as fs from \"node:fs/promises\";\nimport * as nodePath from \"node:path\";\n\nimport type {\n CodegenContext,\n CodegenPlugin,\n Diagnostic,\n GenerateOptions,\n GenerateResult,\n} from \"./types.js\";\nimport { VirtualFS } from \"./virtual-fs.js\";\nimport { validatePath } from \"./path-safety.js\";\nimport { stableHash } from \"./stable-hash.js\";\nimport { generateHeader } from \"./header.js\";\n\n/**\n * Generate typed artifacts from a DomainSchema using plugins.\n *\n * This is the sole entry point for codegen. It orchestrates:\n * - Plugin name uniqueness validation (GEN-2)\n * - Sequential plugin execution (GEN-3, GEN-7)\n * - FilePatch composition with collision detection\n * - Error gating (GEN-5, GEN-8)\n * - Optional outDir clean + file flush\n */\nexport async function generate(opts: GenerateOptions): Promise<GenerateResult> {\n const diagnostics: Diagnostic[] = [];\n const allArtifacts: Record<string, unknown> = {};\n const vfs = new VirtualFS();\n\n // GEN-2: Validate plugin name uniqueness\n const nameError = validatePluginNames(opts.plugins);\n if (nameError) {\n return {\n files: [],\n artifacts: {},\n diagnostics: [nameError],\n };\n }\n\n // GEN-3, GEN-7: Execute plugins sequentially in array order\n for (const plugin of opts.plugins) {\n const ctx: CodegenContext = {\n schema: opts.schema,\n sourceId: opts.sourceId,\n outDir: opts.outDir,\n artifacts: Object.freeze({ ...allArtifacts }), // PLG-9: frozen snapshot\n helpers: { stableHash },\n };\n\n let output;\n try {\n output = await plugin.generate(ctx);\n } catch (err) {\n // Convert plugin exceptions to error diagnostics (errors as values)\n diagnostics.push({\n level: \"error\",\n plugin: plugin.name,\n message: `Plugin threw: ${err instanceof Error ? err.message : String(err)}`,\n });\n continue;\n }\n\n // GEN-4: Merge plugin diagnostics\n if (output.diagnostics) {\n diagnostics.push(...output.diagnostics);\n }\n\n // Validate and apply patches\n for (const patch of output.patches) {\n const validation = validatePath(patch.path);\n if (!validation.valid) {\n diagnostics.push({\n level: \"error\",\n plugin: plugin.name,\n message: `Invalid path \"${patch.path}\": ${validation.reason}`,\n });\n continue;\n }\n\n // Apply with normalized path\n const normalizedPatch =\n patch.op === \"set\"\n ? { op: \"set\" as const, path: validation.normalized, content: patch.content }\n : { op: \"delete\" as const, path: validation.normalized };\n\n const collision = vfs.applyPatch(normalizedPatch, plugin.name);\n if (collision) {\n diagnostics.push(collision);\n }\n }\n\n // PLG-8: Store artifacts at allArtifacts[plugin.name]\n if (output.artifacts) {\n allArtifacts[plugin.name] = output.artifacts;\n }\n }\n\n // Collect files from VFS\n const files = vfs.getFiles();\n\n // GEN-5, GEN-8: Error gate — no disk mutation on error\n const hasErrors = diagnostics.some((d) => d.level === \"error\");\n if (hasErrors) {\n return { files, artifacts: allArtifacts, diagnostics };\n }\n\n if (opts.cleanOutDir) {\n await fs.rm(opts.outDir, { recursive: true, force: true });\n }\n\n // Build header\n const header = generateHeader({\n sourceId: opts.sourceId,\n schemaHash: opts.schema.hash,\n stamp: opts.stamp,\n });\n\n // Flush files to disk (GEN-6: OS path conversion only at write time)\n for (const file of files) {\n const absPath = nodePath.join(opts.outDir, ...file.path.split(\"/\"));\n const dir = nodePath.dirname(absPath);\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(absPath, header + file.content, \"utf-8\");\n }\n\n return { files, artifacts: allArtifacts, diagnostics };\n}\n\nfunction validatePluginNames(\n plugins: readonly CodegenPlugin[]\n): Diagnostic | undefined {\n const seen = new Set<string>();\n for (const plugin of plugins) {\n if (!plugin.name) {\n return {\n level: \"error\",\n plugin: \"\",\n message: \"Plugin name must not be empty (PLG-1)\",\n };\n }\n if (seen.has(plugin.name)) {\n return {\n level: \"error\",\n plugin: plugin.name,\n message: `Duplicate plugin name \"${plugin.name}\" (GEN-2)`,\n };\n }\n seen.add(plugin.name);\n }\n return undefined;\n}\n","import type { Diagnostic, FilePatch } from \"./types.js\";\n\ntype FileEntry = {\n content: string;\n source: string; // plugin name that set the file\n};\n\n/**\n * Virtual filesystem for composing FilePatch operations.\n *\n * Maintains an in-memory FS and detects collisions per FP-5, FP-6, FP-7.\n * Paths are assumed to be already validated/normalized.\n */\nexport class VirtualFS {\n private readonly files = new Map<string, FileEntry>();\n private readonly deleted = new Set<string>();\n\n /**\n * Apply a FilePatch to the virtual FS.\n * Returns a Diagnostic if a collision/warning condition is detected.\n */\n applyPatch(patch: FilePatch, pluginName: string): Diagnostic | undefined {\n if (patch.op === \"set\") {\n return this.applySet(patch.path, patch.content, pluginName);\n }\n return this.applyDelete(patch.path, pluginName);\n }\n\n private applySet(path: string, content: string, pluginName: string): Diagnostic | undefined {\n const existing = this.files.get(path);\n\n if (existing) {\n // FP-5: Duplicate set on same path -> error\n const samePlugin = existing.source === pluginName;\n return {\n level: \"error\",\n plugin: pluginName,\n message: samePlugin\n ? `Duplicate set on \"${path}\" within plugin \"${pluginName}\"`\n : `File \"${path}\" already set by plugin \"${existing.source}\", cannot be set again by \"${pluginName}\"`,\n };\n }\n\n // delete-then-set is allowed (intentional regeneration)\n this.deleted.delete(path);\n this.files.set(path, { content, source: pluginName });\n return undefined;\n }\n\n private applyDelete(path: string, pluginName: string): Diagnostic | undefined {\n const existing = this.files.get(path);\n\n if (!existing && !this.deleted.has(path)) {\n // FP-7: Delete on nonexistent path -> warn\n return {\n level: \"warn\",\n plugin: pluginName,\n message: `Delete on nonexistent path \"${path}\"`,\n };\n }\n\n if (existing) {\n // FP-6: set-then-delete -> allowed with warning\n this.files.delete(path);\n this.deleted.add(path);\n return {\n level: \"warn\",\n plugin: pluginName,\n message: `File \"${path}\" set by plugin \"${existing.source}\" is being deleted by \"${pluginName}\". Prior work is voided.`,\n };\n }\n\n // Already deleted - just track it\n this.deleted.add(path);\n return undefined;\n }\n\n /**\n * Get all files in deterministic (lexicographic) order (DET-5).\n */\n getFiles(): Array<{ path: string; content: string }> {\n const entries = Array.from(this.files.entries());\n entries.sort(([a], [b]) => a.localeCompare(b));\n return entries.map(([path, { content }]) => ({ path, content }));\n }\n\n has(path: string): boolean {\n return this.files.has(path);\n }\n}\n","export type PathValidationResult =\n | { valid: true; normalized: string }\n | { valid: false; reason: string };\n\n/**\n * Validate and normalize a file path per FP-1, FP-2, GEN-6.\n *\n * - MUST be a POSIX relative path\n * - MUST NOT contain `..`, absolute prefixes, drive letters, or null bytes\n * - Normalizes backslashes, multiple slashes, and leading `./`\n */\nexport function validatePath(path: string): PathValidationResult {\n if (!path) {\n return { valid: false, reason: \"Path must not be empty\" };\n }\n\n if (path.includes(\"\\0\")) {\n return { valid: false, reason: \"Path must not contain null bytes\" };\n }\n\n // Normalize backslashes to forward slashes (GEN-6)\n let normalized = path.replace(/\\\\/g, \"/\");\n\n // Check for drive letters (e.g., C:/)\n if (/^[a-zA-Z]:/.test(normalized)) {\n return { valid: false, reason: \"Path must not contain drive letters\" };\n }\n\n // Check for absolute path\n if (normalized.startsWith(\"/\")) {\n return { valid: false, reason: \"Path must be relative, not absolute\" };\n }\n\n // Collapse multiple slashes\n normalized = normalized.replace(/\\/+/g, \"/\");\n\n // Remove leading ./\n if (normalized.startsWith(\"./\")) {\n normalized = normalized.slice(2);\n }\n\n // Remove trailing slash\n if (normalized.endsWith(\"/\") && normalized.length > 1) {\n normalized = normalized.slice(0, -1);\n }\n\n // Check for .. traversal (after normalization)\n const segments = normalized.split(\"/\");\n for (const segment of segments) {\n if (segment === \"..\") {\n return { valid: false, reason: \"Path must not contain '..' traversal\" };\n }\n }\n\n if (!normalized) {\n return { valid: false, reason: \"Path resolves to empty after normalization\" };\n }\n\n return { valid: true, normalized };\n}\n","import { toCanonical, sha256Sync } from \"@manifesto-ai/core\";\n\n/**\n * Deterministic hash function (DET-1).\n * Same input always produces the same output.\n * Uses Core's canonical form (sorted keys, no undefined) + SHA-256.\n */\nexport function stableHash(input: unknown): string {\n const canonical = toCanonical(input);\n return sha256Sync(canonical);\n}\n","export interface HeaderOptions {\n readonly sourceId?: string;\n readonly schemaHash: string;\n readonly stamp?: boolean;\n}\n\n/**\n * Generate the @generated file header (DET-2, DET-3, DET-4).\n *\n * Default mode: no timestamp (deterministic).\n * With stamp=true: appends ISO 8601 timestamp line.\n */\nexport function generateHeader(options: HeaderOptions): string {\n const source = options.sourceId ?? \"unknown\";\n const lines = [\n \"// @generated by @manifesto-ai/codegen \\u2014 DO NOT EDIT\",\n `// Source: ${source} | Schema hash: ${options.schemaHash}`,\n ];\n\n if (options.stamp) {\n lines.push(`// Generated at: ${new Date().toISOString()}`);\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n","import type { FieldSpec } from \"@manifesto-ai/core\";\n\nexport type DomainPrimitive = \"string\" | \"number\" | \"boolean\" | \"null\";\n\nexport type DomainTypeField = {\n readonly type: DomainType;\n readonly optional: boolean;\n};\n\nexport type DomainType =\n | { readonly kind: \"unknown\" }\n | { readonly kind: \"primitive\"; readonly type: DomainPrimitive }\n | { readonly kind: \"literal\"; readonly value: string | number | boolean | null }\n | { readonly kind: \"array\"; readonly element: DomainType }\n | { readonly kind: \"tuple\"; readonly elements: readonly DomainType[] }\n | { readonly kind: \"object\"; readonly fields: Readonly<Record<string, DomainTypeField>> }\n | { readonly kind: \"record\"; readonly key: DomainType; readonly value: DomainType }\n | { readonly kind: \"union\"; readonly types: readonly DomainType[] };\n\nconst UNKNOWN_TYPE: DomainType = { kind: \"unknown\" };\nconst NULL_TYPE: DomainType = { kind: \"primitive\", type: \"null\" };\n\nexport function unknownType(): DomainType {\n return UNKNOWN_TYPE;\n}\n\nexport function primitiveType(type: DomainPrimitive): DomainType {\n return type === \"null\" ? NULL_TYPE : { kind: \"primitive\", type };\n}\n\nexport function literalType(\n value: string | number | boolean | null\n): DomainType {\n return value === null ? NULL_TYPE : { kind: \"literal\", value };\n}\n\nexport function arrayType(element: DomainType): DomainType {\n return { kind: \"array\", element };\n}\n\nexport function tupleType(elements: readonly DomainType[]): DomainType {\n return { kind: \"tuple\", elements };\n}\n\nexport function objectType(fields: Record<string, DomainTypeField>): DomainType {\n return { kind: \"object\", fields };\n}\n\nexport function recordType(key: DomainType, value: DomainType): DomainType {\n return { kind: \"record\", key, value };\n}\n\nexport function fieldSpecToDomainField(spec: FieldSpec): DomainTypeField {\n return {\n type: fieldSpecToDomainType(spec),\n optional: !spec.required,\n };\n}\n\nexport function fieldSpecToDomainType(spec: FieldSpec): DomainType {\n let base: DomainType;\n\n if (typeof spec.type === \"object\" && \"enum\" in spec.type) {\n base = unionOf(\n spec.type.enum.map((value) => literalValueToType(value))\n );\n } else {\n switch (spec.type) {\n case \"string\":\n base = primitiveType(\"string\");\n break;\n case \"number\":\n base = primitiveType(\"number\");\n break;\n case \"boolean\":\n base = primitiveType(\"boolean\");\n break;\n case \"null\":\n base = NULL_TYPE;\n break;\n case \"object\":\n if (spec.fields) {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(spec.fields)) {\n fields[name] = fieldSpecToDomainField(spec.fields[name]);\n }\n base = objectType(fields);\n break;\n }\n base = recordType(primitiveType(\"string\"), unknownType());\n break;\n case \"array\":\n base = arrayType(\n spec.items ? fieldSpecToDomainType(spec.items) : unknownType()\n );\n break;\n default:\n base = unknownType();\n break;\n }\n }\n\n return spec.required ? base : unionOf([base, NULL_TYPE]);\n}\n\nexport function literalValueToType(value: unknown): DomainType {\n if (value === null) {\n return NULL_TYPE;\n }\n\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return literalType(value);\n }\n\n if (Array.isArray(value)) {\n return arrayType(\n value.length === 0\n ? unknownType()\n : unionOf(value.map((item) => literalValueToType(item)))\n );\n }\n\n if (isPlainObject(value)) {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(value)) {\n fields[name] = {\n type: literalValueToType(value[name]),\n optional: false,\n };\n }\n return objectType(fields);\n }\n\n return unknownType();\n}\n\nexport function unionOf(types: readonly DomainType[]): DomainType {\n const flattened: DomainType[] = [];\n\n for (const type of types) {\n if (type.kind === \"unknown\") {\n return type;\n }\n if (type.kind === \"union\") {\n flattened.push(...type.types);\n continue;\n }\n flattened.push(type);\n }\n\n const unique = new Map<string, DomainType>();\n for (const type of flattened) {\n unique.set(stableTypeKey(type), type);\n }\n\n const deduped = Array.from(unique.values());\n if (deduped.length === 0) {\n return unknownType();\n }\n if (deduped.length === 1) {\n return deduped[0];\n }\n return { kind: \"union\", types: deduped };\n}\n\nexport function removeNullType(type: DomainType): DomainType[] {\n switch (type.kind) {\n case \"primitive\":\n return type.type === \"null\" ? [] : [type];\n case \"literal\":\n return type.value === null ? [] : [type];\n case \"union\":\n return type.types.flatMap((member) => removeNullType(member));\n default:\n return [type];\n }\n}\n\nexport function renderDomainType(type: DomainType): string {\n switch (type.kind) {\n case \"unknown\":\n return \"unknown\";\n case \"primitive\":\n return type.type;\n case \"literal\":\n return renderLiteral(type.value);\n case \"array\":\n return `${wrapArrayElement(renderDomainType(type.element), type.element)}[]`;\n case \"tuple\":\n return `[${type.elements.map((element) => renderDomainType(element)).join(\", \")}]`;\n case \"object\": {\n const fieldNames = Object.keys(type.fields).sort();\n if (fieldNames.length === 0) {\n return \"{}\";\n }\n const parts = fieldNames.map((name) => {\n const field = type.fields[name];\n const optional = field.optional ? \"?\" : \"\";\n return `${name}${optional}: ${renderDomainType(field.type)}`;\n });\n return `{ ${parts.join(\"; \")} }`;\n }\n case \"record\":\n return `Record<${renderDomainType(type.key)}, ${renderDomainType(type.value)}>`;\n case \"union\":\n return type.types.map((member) => renderDomainType(member)).join(\" | \");\n }\n}\n\nfunction wrapArrayElement(rendered: string, type: DomainType): string {\n if (type.kind === \"union\") {\n return `(${rendered})`;\n }\n return rendered;\n}\n\nfunction renderLiteral(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\nfunction stableTypeKey(type: DomainType): string {\n switch (type.kind) {\n case \"unknown\":\n return \"unknown\";\n case \"primitive\":\n return `primitive:${type.type}`;\n case \"literal\":\n return `literal:${JSON.stringify(type.value)}`;\n case \"array\":\n return `array:${stableTypeKey(type.element)}`;\n case \"tuple\":\n return `tuple:${type.elements.map((element) => stableTypeKey(element)).join(\",\")}`;\n case \"object\": {\n const keys = Object.keys(type.fields).sort();\n const fields = keys.map((name) => {\n const field = type.fields[name];\n return `${name}:${field.optional ? \"?\" : \"\"}${stableTypeKey(field.type)}`;\n });\n return `object:${fields.join(\",\")}`;\n }\n case \"record\":\n return `record:${stableTypeKey(type.key)}:${stableTypeKey(type.value)}`;\n case \"union\":\n return `union:${type.types.map((member) => stableTypeKey(member)).sort().join(\"|\")}`;\n }\n}\n\nfunction isPlainObject(\n value: unknown\n): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n","import type { DomainSchema, ExprNode } from \"@manifesto-ai/core\";\nimport type { Diagnostic } from \"../types.js\";\nimport {\n arrayType,\n fieldSpecToDomainType,\n literalValueToType,\n objectType,\n primitiveType,\n recordType,\n removeNullType,\n tupleType,\n type DomainType,\n type DomainTypeField,\n unionOf,\n unknownType,\n} from \"./domain-type-model.js\";\n\ntype InferenceEnv = ReadonlyMap<string, DomainType>;\n\ntype InferenceContext = {\n readonly schema: DomainSchema;\n readonly pluginName: string;\n readonly diagnostics: Diagnostic[];\n readonly warnedMessages: Set<string>;\n readonly computedCache: Map<string, DomainType>;\n readonly computedInFlight: Set<string>;\n};\n\nconst META_TYPE = objectType({\n actionName: { type: primitiveType(\"string\"), optional: false },\n intentId: { type: primitiveType(\"string\"), optional: false },\n timestamp: { type: primitiveType(\"number\"), optional: false },\n});\n\nexport function createInferenceContext(\n schema: DomainSchema,\n diagnostics: Diagnostic[],\n pluginName: string\n): InferenceContext {\n return {\n schema,\n pluginName,\n diagnostics,\n warnedMessages: new Set(),\n computedCache: new Map(),\n computedInFlight: new Set(),\n };\n}\n\nexport function inferComputedType(\n name: string,\n ctx: InferenceContext\n): DomainType {\n if (ctx.computedCache.has(name)) {\n return ctx.computedCache.get(name) ?? unknownType();\n }\n\n const spec = ctx.schema.computed.fields[name];\n if (!spec) {\n warn(ctx, `Unknown computed field \"${name}\". Emitting \"unknown\".`);\n return unknownType();\n }\n\n if (ctx.computedInFlight.has(name)) {\n warn(ctx, `Recursive computed field \"${name}\" could not be inferred. Emitting \"unknown\".`);\n return unknownType();\n }\n\n ctx.computedInFlight.add(name);\n const inferred = inferExprType(spec.expr, ctx, new Map());\n ctx.computedInFlight.delete(name);\n ctx.computedCache.set(name, inferred);\n return inferred;\n}\n\nexport function inferExprType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv = new Map()\n): DomainType {\n switch (expr.kind) {\n case \"lit\":\n return literalValueToType(expr.value);\n\n case \"get\":\n return inferPathType(expr.path, ctx, env);\n\n case \"eq\":\n case \"neq\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n case \"and\":\n case \"or\":\n case \"not\":\n case \"startsWith\":\n case \"endsWith\":\n case \"strIncludes\":\n case \"includes\":\n case \"every\":\n case \"some\":\n case \"hasKey\":\n case \"isNull\":\n case \"toBoolean\":\n return primitiveType(\"boolean\");\n\n case \"add\":\n case \"sub\":\n case \"mul\":\n case \"div\":\n case \"mod\":\n case \"min\":\n case \"max\":\n case \"abs\":\n case \"neg\":\n case \"floor\":\n case \"ceil\":\n case \"round\":\n case \"sqrt\":\n case \"pow\":\n case \"sumArray\":\n case \"strLen\":\n case \"len\":\n case \"indexOf\":\n case \"toNumber\":\n return primitiveType(\"number\");\n\n case \"concat\":\n case \"substring\":\n case \"trim\":\n case \"toLowerCase\":\n case \"toUpperCase\":\n case \"replace\":\n case \"typeof\":\n case \"toString\":\n return primitiveType(\"string\");\n\n case \"if\":\n return unionOf([\n inferExprType(expr.then, ctx, env),\n inferExprType(expr.else, ctx, env),\n ]);\n\n case \"split\":\n return arrayType(primitiveType(\"string\"));\n\n case \"at\":\n return unionOf([inferIndexedAccessType(expr.array, ctx, env), primitiveType(\"null\")]);\n\n case \"first\":\n case \"last\":\n case \"minArray\":\n case \"maxArray\":\n return unionOf([inferCollectionElementType(expr.array, ctx, env), primitiveType(\"null\")]);\n\n case \"slice\":\n case \"reverse\":\n case \"unique\":\n return inferArrayLikeType(expr.array, ctx, env);\n\n case \"filter\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n inferExprType(expr.predicate, ctx, nextEnv);\n return arrayType(elementType);\n }\n\n case \"map\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n return arrayType(inferExprType(expr.mapper, ctx, nextEnv));\n }\n\n case \"find\": {\n const elementType = inferCollectionElementType(expr.array, ctx, env);\n const nextEnv = withCollectionEnv(env, elementType);\n inferExprType(expr.predicate, ctx, nextEnv);\n return unionOf([elementType, primitiveType(\"null\")]);\n }\n\n case \"append\": {\n const baseArray = inferArrayLikeType(expr.array, ctx, env);\n const baseElement = getArrayElementType(baseArray);\n const itemTypes = expr.items.map((item) => inferExprType(item, ctx, env));\n return arrayType(unionOf([baseElement, ...itemTypes]));\n }\n\n case \"flat\":\n return inferFlatType(expr.array, ctx, env);\n\n case \"object\": {\n const fields: Record<string, DomainTypeField> = {};\n for (const name of Object.keys(expr.fields)) {\n fields[name] = {\n type: inferExprType(expr.fields[name], ctx, env),\n optional: false,\n };\n }\n return objectType(fields);\n }\n\n case \"field\":\n return inferFieldType(inferExprType(expr.object, ctx, env), expr.property);\n\n case \"keys\":\n return arrayType(primitiveType(\"string\"));\n\n case \"values\":\n return arrayType(inferObjectValueType(inferExprType(expr.obj, ctx, env)));\n\n case \"entries\":\n return arrayType(\n tupleType([\n primitiveType(\"string\"),\n inferObjectValueType(inferExprType(expr.obj, ctx, env)),\n ])\n );\n\n case \"merge\":\n return inferMergeType(\n expr.objects.map((objectExpr) => inferExprType(objectExpr, ctx, env))\n );\n\n case \"pick\":\n return inferPickLikeType(expr.obj, expr.keys, false, ctx, env);\n\n case \"omit\":\n return inferPickLikeType(expr.obj, expr.keys, true, ctx, env);\n\n case \"fromEntries\":\n return inferFromEntriesType(expr.entries, ctx, env);\n\n case \"coalesce\": {\n const members = expr.args.flatMap((arg) =>\n removeNullType(inferExprType(arg, ctx, env))\n );\n return members.length === 0 ? primitiveType(\"null\") : unionOf(members);\n }\n\n default:\n warn(ctx, `Unsupported expression kind \"${(expr as { kind: string }).kind}\". Emitting \"unknown\".`);\n return unknownType();\n }\n}\n\nfunction inferPathType(\n path: string,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const [head, ...tail] = path.split(\".\");\n if (!head) {\n warn(ctx, `Empty get() path encountered. Emitting \"unknown\".`);\n return unknownType();\n }\n\n let base: DomainType | undefined = env.get(head);\n\n if (!base) {\n if (head === \"meta\") {\n base = META_TYPE;\n } else if (Object.hasOwn(ctx.schema.state.fields, head)) {\n base = fieldSpecToDomainType(ctx.schema.state.fields[head]);\n } else if (Object.hasOwn(ctx.schema.computed.fields, head)) {\n base = inferComputedType(head, ctx);\n }\n }\n\n if (!base) {\n warn(ctx, `Unknown get() path \"${path}\". Emitting \"unknown\".`);\n return unknownType();\n }\n\n return walkPathType(base, tail);\n}\n\nfunction walkPathType(base: DomainType, segments: readonly string[]): DomainType {\n let current = base;\n for (const segment of segments) {\n current = accessSegmentType(current, segment);\n }\n return current;\n}\n\nfunction accessSegmentType(\n base: DomainType,\n segment: string\n): DomainType {\n switch (base.kind) {\n case \"object\":\n return Object.hasOwn(base.fields, segment)\n ? base.fields[segment].type\n : unknownType();\n case \"record\":\n return unionOf([base.value, primitiveType(\"null\")]);\n case \"array\":\n return isNumericSegment(segment)\n ? unionOf([base.element, primitiveType(\"null\")])\n : unknownType();\n case \"tuple\":\n return isNumericSegment(segment)\n ? base.elements[Number(segment)] ?? unknownType()\n : unknownType();\n case \"union\":\n return unionIgnoringUnknown(\n base.types.map((member) => accessSegmentType(member, segment))\n );\n default:\n return unknownType();\n }\n}\n\nfunction inferIndexedAccessType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const base = inferExprType(expr, ctx, env);\n switch (base.kind) {\n case \"array\":\n return base.element;\n case \"tuple\":\n return unionOf(base.elements);\n case \"record\":\n return base.value;\n case \"union\":\n return unionOf(base.types.map((member) => inferIndexedAccessFromType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferIndexedAccessFromType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type.element;\n case \"tuple\":\n return unionOf(type.elements);\n case \"record\":\n return type.value;\n default:\n return unknownType();\n }\n}\n\nfunction inferCollectionElementType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n return getArrayElementType(inferExprType(expr, ctx, env));\n}\n\nfunction getArrayElementType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type.element;\n case \"tuple\":\n return unionOf(type.elements);\n case \"union\":\n return unionOf(type.types.map((member) => getArrayElementType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferArrayLikeType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const inferred = inferExprType(expr, ctx, env);\n switch (inferred.kind) {\n case \"array\":\n return inferred;\n case \"tuple\":\n return arrayType(unionOf(inferred.elements));\n case \"union\": {\n const arrays = inferred.types\n .map((member) => inferArrayLikeFromType(member))\n .filter((member): member is DomainType => member.kind !== \"unknown\");\n return arrays.length === 0 ? arrayType(unknownType()) : unionOf(arrays);\n }\n default:\n return arrayType(unknownType());\n }\n}\n\nfunction inferArrayLikeFromType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"array\":\n return type;\n case \"tuple\":\n return arrayType(unionOf(type.elements));\n default:\n return unknownType();\n }\n}\n\nfunction inferFlatType(\n expr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const outer = inferArrayLikeType(expr, ctx, env);\n const outerElement = getArrayElementType(outer);\n\n switch (outerElement.kind) {\n case \"array\":\n return arrayType(outerElement.element);\n case \"tuple\":\n return arrayType(unionOf(outerElement.elements));\n case \"union\": {\n const flatMembers: DomainType[] = [];\n for (const member of outerElement.types) {\n if (member.kind === \"array\") {\n flatMembers.push(member.element);\n continue;\n }\n if (member.kind === \"tuple\") {\n flatMembers.push(unionOf(member.elements));\n continue;\n }\n flatMembers.push(member);\n }\n return arrayType(unionOf(flatMembers));\n }\n default:\n return arrayType(outerElement);\n }\n}\n\nfunction inferFieldType(base: DomainType, property: string): DomainType {\n switch (base.kind) {\n case \"object\":\n return Object.hasOwn(base.fields, property)\n ? base.fields[property].type\n : primitiveType(\"null\");\n case \"record\":\n return unionOf([base.value, primitiveType(\"null\")]);\n case \"union\":\n return unionOf(base.types.map((member) => inferFieldType(member, property)));\n default:\n return primitiveType(\"null\");\n }\n}\n\nfunction inferObjectValueType(type: DomainType): DomainType {\n switch (type.kind) {\n case \"object\": {\n const values = Object.keys(type.fields).map((name) => type.fields[name].type);\n return values.length === 0 ? unknownType() : unionOf(values);\n }\n case \"record\":\n return type.value;\n case \"union\":\n return unionOf(type.types.map((member) => inferObjectValueType(member)));\n default:\n return unknownType();\n }\n}\n\nfunction inferMergeType(types: readonly DomainType[]): DomainType {\n const fields: Record<string, DomainTypeField> = {};\n let sawObject = false;\n\n for (const type of types) {\n if (type.kind !== \"object\") {\n continue;\n }\n sawObject = true;\n for (const name of Object.keys(type.fields)) {\n fields[name] = type.fields[name];\n }\n }\n\n return sawObject ? objectType(fields) : objectType({});\n}\n\nfunction inferPickLikeType(\n objectExpr: ExprNode,\n keysExpr: ExprNode,\n omit: boolean,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const base = inferExprType(objectExpr, ctx, env);\n if (base.kind !== \"object\") {\n return objectType({});\n }\n\n const keys = readStringArrayLiteral(keysExpr);\n if (!keys) {\n return base;\n }\n\n const selected = new Set(keys);\n const fields: Record<string, DomainTypeField> = {};\n\n for (const name of Object.keys(base.fields)) {\n const shouldInclude = omit ? !selected.has(name) : selected.has(name);\n if (shouldInclude) {\n fields[name] = base.fields[name];\n }\n }\n\n return objectType(fields);\n}\n\nfunction inferFromEntriesType(\n entriesExpr: ExprNode,\n ctx: InferenceContext,\n env: InferenceEnv\n): DomainType {\n const literalEntries = readLiteralEntries(entriesExpr);\n if (literalEntries) {\n const valueTypes = literalEntries.map(([, value]) => literalValueToType(value));\n return recordType(primitiveType(\"string\"), unionOf(valueTypes));\n }\n\n const entriesType = inferExprType(entriesExpr, ctx, env);\n const elementType = getArrayElementType(entriesType);\n\n if (elementType.kind === \"tuple\" && elementType.elements.length >= 2) {\n return recordType(primitiveType(\"string\"), elementType.elements[1]);\n }\n\n return recordType(primitiveType(\"string\"), unknownType());\n}\n\nfunction withCollectionEnv(\n env: InferenceEnv,\n itemType: DomainType\n): Map<string, DomainType> {\n const next = new Map(env);\n next.set(\"$index\", primitiveType(\"number\"));\n next.set(\"$item\", itemType);\n return next;\n}\n\nfunction readStringArrayLiteral(expr: ExprNode): string[] | null {\n if (expr.kind !== \"lit\" || !Array.isArray(expr.value)) {\n return null;\n }\n\n const values: string[] = [];\n for (const item of expr.value) {\n if (typeof item !== \"string\") {\n return null;\n }\n values.push(item);\n }\n return values;\n}\n\nfunction readLiteralEntries(\n expr: ExprNode\n): Array<[string, unknown]> | null {\n if (expr.kind !== \"lit\" || !Array.isArray(expr.value)) {\n return null;\n }\n\n const entries: Array<[string, unknown]> = [];\n for (const item of expr.value) {\n if (!Array.isArray(item) || item.length !== 2 || typeof item[0] !== \"string\") {\n return null;\n }\n entries.push([item[0], item[1]]);\n }\n return entries;\n}\n\nfunction unionIgnoringUnknown(types: readonly DomainType[]): DomainType {\n const filtered = types.filter((type) => type.kind !== \"unknown\");\n return filtered.length === 0 ? unknownType() : unionOf(filtered);\n}\n\nfunction isNumericSegment(segment: string): boolean {\n return /^\\d+$/.test(segment);\n}\n\nfunction warn(ctx: InferenceContext, message: string): void {\n if (ctx.warnedMessages.has(message)) {\n return;\n }\n ctx.warnedMessages.add(message);\n ctx.diagnostics.push({\n level: \"warn\",\n plugin: ctx.pluginName,\n message,\n });\n}\n","import type { CodegenContext, CodegenOutput, CodegenPlugin, Diagnostic } from \"../types.js\";\nimport type { FieldSpec } from \"@manifesto-ai/core\";\nimport { createInferenceContext, inferComputedType } from \"./domain-type-inference.js\";\nimport {\n fieldSpecToDomainField,\n fieldSpecToDomainType,\n renderDomainType,\n type DomainTypeField,\n} from \"./domain-type-model.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-domain\";\n\nexport interface DomainPluginOptions {\n readonly fileName?: string;\n readonly interfaceName?: string;\n readonly includeReservedState?: boolean;\n}\n\nexport function createDomainPlugin(options?: DomainPluginOptions): CodegenPlugin {\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n const inference = createInferenceContext(ctx.schema, diagnostics, PLUGIN_NAME);\n\n const interfaceName = options?.interfaceName\n ?? deriveInterfaceName(ctx)\n ?? \"Domain\";\n const fileName = options?.fileName ?? deriveFileName(ctx.sourceId);\n\n const stateFields = renderFieldBlock(\n ctx.schema.state.fields,\n { includeReservedState: options?.includeReservedState ?? false },\n (_name, spec) => fieldSpecToDomainField(spec)\n );\n\n const computedFields = renderFieldBlock(\n ctx.schema.computed.fields,\n { includeReservedState: true },\n (name) => ({\n type: inferComputedType(name, inference),\n optional: false,\n })\n );\n\n const actionNames = Object.keys(ctx.schema.actions).sort();\n const actionLines = actionNames.map((name) => {\n const action = ctx.schema.actions[name];\n return ` ${name}: ${renderActionSignature(action.input)}`;\n });\n\n const sections = [\n \"export interface \" + interfaceName + \" {\",\n \" readonly state: {\",\n stateFields,\n \" }\",\n \" readonly computed: {\",\n computedFields,\n \" }\",\n \" readonly actions: {\",\n actionLines.join(\"\\n\"),\n \" }\",\n \"}\",\n ];\n\n return {\n patches: [{ op: \"set\", path: fileName, content: sections.join(\"\\n\") + \"\\n\" }],\n diagnostics,\n };\n },\n };\n}\n\nfunction renderFieldBlock<T>(\n source: Record<string, T>,\n options: { includeReservedState: boolean },\n mapField: (name: string, value: T) => DomainTypeField\n): string {\n const names = Object.keys(source)\n .filter((name) => options.includeReservedState || !name.startsWith(\"$\"))\n .sort();\n\n if (names.length === 0) {\n return \"\";\n }\n\n return names\n .map((name) => {\n const field = mapField(name, source[name]);\n const optional = field.optional ? \"?\" : \"\";\n return ` ${name}${optional}: ${renderDomainType(field.type)}`;\n })\n .join(\"\\n\");\n}\n\nfunction renderActionSignature(input: FieldSpec | undefined): string {\n if (!input || typeof input !== \"object\" || !(\"type\" in input)) {\n return \"() => void\";\n }\n\n if (input.type !== \"object\" || !input.fields) {\n return `(input: ${renderDomainType(fieldSpecToDomainType(input))}) => void`;\n }\n\n const names = Object.keys(input.fields);\n if (names.length === 0) {\n return \"() => void\";\n }\n\n const params = names.map((name) => {\n const field = fieldSpecToDomainField(input.fields![name]);\n const optional = field.optional ? \"?\" : \"\";\n return `${name}${optional}: ${renderDomainType(field.type)}`;\n });\n\n return `(${params.join(\", \")}) => void`;\n}\n\nfunction deriveInterfaceName(ctx: CodegenContext): string | null {\n const metaName = ctx.schema.meta?.name?.trim();\n if (metaName) {\n return metaName;\n }\n\n const basename = basenameWithoutExtension(ctx.sourceId);\n if (!basename) {\n return null;\n }\n\n const candidate = pascalCase(basename);\n return candidate.endsWith(\"Domain\") ? candidate : `${candidate}Domain`;\n}\n\nfunction deriveFileName(sourceId?: string): string {\n if (!sourceId) {\n return \"domain.domain.ts\";\n }\n\n const normalized = sourceId.replace(/\\\\/g, \"/\");\n const stem = normalized.replace(/\\.[^.]+$/, \"\");\n return `${stem}.domain.ts`;\n}\n\nfunction basenameWithoutExtension(sourceId?: string): string | null {\n if (!sourceId) {\n return null;\n }\n\n const normalized = sourceId.replace(/\\\\/g, \"/\");\n const basename = normalized.split(\"/\").pop() ?? \"\";\n if (!basename) {\n return null;\n }\n\n return basename.replace(/\\.[^.]+$/, \"\");\n}\n\nfunction pascalCase(value: string): string {\n return value\n .split(/[^a-zA-Z0-9]+/)\n .filter(Boolean)\n .map((segment) => segment.charAt(0).toUpperCase() + segment.slice(1))\n .join(\"\");\n}\n","import type { DomainSchema } from \"@manifesto-ai/core\";\n\nimport { createDomainPlugin } from \"./plugins/domain-plugin.js\";\nimport { generate } from \"./runner.js\";\nimport type { CodegenPlugin, GenerateResult } from \"./types.js\";\n\nexport interface CompilerCodegenInput {\n readonly schema: DomainSchema;\n readonly sourceId: string;\n}\n\nexport interface CompilerCodegenOptions {\n readonly outDir?: string;\n readonly plugins?: readonly CodegenPlugin[];\n readonly stamp?: boolean;\n}\n\nexport interface CompilerCodegenEmitter {\n (input: CompilerCodegenInput): Promise<GenerateResult>;\n}\n\nexport function createCompilerCodegen(\n options: CompilerCodegenOptions = {}\n): CompilerCodegenEmitter {\n const outDir = options.outDir ?? \".\";\n const plugins = options.plugins ?? [createDomainPlugin()];\n\n return async (input: CompilerCodegenInput) => {\n const result = await generate({\n schema: input.schema,\n sourceId: input.sourceId,\n outDir,\n plugins,\n stamp: options.stamp,\n });\n\n const errors = result.diagnostics.filter((diagnostic) => diagnostic.level === \"error\");\n if (errors.length > 0) {\n const details = errors\n .map((diagnostic) => `[${diagnostic.plugin}] ${diagnostic.message}`)\n .join(\"\\n\");\n throw new Error(`Codegen failed for ${input.sourceId}\\n${details}`);\n }\n\n return result;\n };\n}\n","import type {\n TypeDefinition,\n TypeSpec,\n ActionSpec,\n FieldSpec,\n FieldType,\n} from \"@manifesto-ai/core\";\nimport type {\n CodegenContext,\n CodegenOutput,\n CodegenPlugin,\n Diagnostic,\n} from \"../types.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-ts\";\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport interface TsPluginOptions {\n readonly typesFile?: string;\n readonly actionsFile?: string;\n}\n\nexport interface TsPluginArtifacts {\n readonly typeNames: string[];\n readonly typeImportPath: string;\n}\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport function createTsPlugin(options?: TsPluginOptions): CodegenPlugin {\n const typesFile = options?.typesFile ?? \"types.ts\";\n const actionsFile = options?.actionsFile ?? \"actions.ts\";\n\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n const typeNames: string[] = [];\n\n // Generate types from schema.types (GEN-10, TS-6: lexicographic order)\n const sortedTypeNames = Object.keys(ctx.schema.types).sort();\n const typeDecls: string[] = [];\n\n for (const name of sortedTypeNames) {\n const spec = ctx.schema.types[name];\n typeNames.push(name);\n typeDecls.push(renderNamedType(name, spec, diagnostics));\n }\n\n const typesContent = typeDecls.join(\"\\n\\n\") + \"\\n\";\n\n // Generate action input types\n const sortedActionNames = Object.keys(ctx.schema.actions).sort();\n const actionDecls: string[] = [];\n\n for (const actionName of sortedActionNames) {\n const spec = ctx.schema.actions[actionName];\n if (spec.input) {\n const typeName = pascalCase(actionName) + \"Input\";\n actionDecls.push(renderActionInputType(typeName, spec, diagnostics));\n }\n }\n\n const patches = [\n { op: \"set\" as const, path: typesFile, content: typesContent },\n ];\n\n if (actionDecls.length > 0) {\n const actionsContent = actionDecls.join(\"\\n\\n\") + \"\\n\";\n patches.push({ op: \"set\" as const, path: actionsFile, content: actionsContent });\n }\n\n const artifacts: TsPluginArtifacts = {\n typeNames,\n typeImportPath: `./${typesFile.replace(/\\.ts$/, \"\")}`,\n };\n\n return { patches, artifacts: artifacts as unknown as Record<string, unknown>, diagnostics };\n },\n };\n}\n\n// --- Type rendering ---\n\nfunction renderNamedType(\n name: string,\n spec: TypeSpec,\n diagnostics: Diagnostic[]\n): string {\n const def = spec.definition;\n\n // TS-3: top-level named object -> export interface\n if (def.kind === \"object\") {\n return renderInterface(name, def.fields, diagnostics);\n }\n\n // TS-3: all other named types -> export type\n const tsType = mapTypeDefinition(def, diagnostics);\n return `export type ${name} = ${tsType};`;\n}\n\nfunction renderInterface(\n name: string,\n fields: Record<string, { type: TypeDefinition; optional: boolean }>,\n diagnostics: Diagnostic[]\n): string {\n const sortedFields = Object.keys(fields).sort();\n const lines: string[] = [];\n\n for (const fieldName of sortedFields) {\n const field = fields[fieldName];\n const tsType = mapTypeDefinition(field.type, diagnostics);\n // TS-5: optional -> ?\n const opt = field.optional ? \"?\" : \"\";\n lines.push(` ${fieldName}${opt}: ${tsType};`);\n }\n\n return `export interface ${name} {\\n${lines.join(\"\\n\")}\\n}`;\n}\n\nfunction mapTypeDefinition(\n def: TypeDefinition,\n diagnostics: Diagnostic[]\n): string {\n switch (def.kind) {\n case \"primitive\":\n return mapPrimitive(def.type);\n\n case \"literal\":\n return renderLiteral(def.value);\n\n case \"array\":\n return `${wrapComplex(mapTypeDefinition(def.element, diagnostics), def.element)}[]`;\n\n case \"record\":\n return `Record<${mapTypeDefinition(def.key, diagnostics)}, ${mapTypeDefinition(def.value, diagnostics)}>`;\n\n case \"object\": {\n const sortedFields = Object.keys(def.fields).sort();\n const parts: string[] = [];\n for (const fieldName of sortedFields) {\n const field = def.fields[fieldName];\n const tsType = mapTypeDefinition(field.type, diagnostics);\n const opt = field.optional ? \"?\" : \"\";\n parts.push(`${fieldName}${opt}: ${tsType}`);\n }\n return `{ ${parts.join(\"; \")} }`;\n }\n\n case \"union\":\n // TS-2: nullable uses T | null\n return def.types.map((t) => mapTypeDefinition(t, diagnostics)).join(\" | \");\n\n case \"ref\":\n return def.name;\n\n default: {\n // PLG-3, TS-1: unknown kind fallback\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Unknown TypeDefinition kind: \"${(def as Record<string, unknown>).kind}\". Emitting \"unknown\".`,\n });\n return \"unknown\";\n }\n }\n}\n\nfunction mapPrimitive(type: string): string {\n switch (type) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n default:\n return \"unknown\";\n }\n}\n\nfunction renderLiteral(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n return String(value);\n}\n\n/** Wrap union types in parens when used as array element */\nfunction wrapComplex(tsType: string, def: TypeDefinition): string {\n if (def.kind === \"union\") {\n return `(${tsType})`;\n }\n return tsType;\n}\n\n// --- Action input rendering ---\n\nfunction renderActionInputType(\n typeName: string,\n spec: ActionSpec,\n diagnostics: Diagnostic[]\n): string {\n if (!spec.input) {\n return \"\";\n }\n const tsType = mapFieldSpec(spec.input, diagnostics);\n return `export type ${typeName} = ${tsType};`;\n}\n\nfunction mapFieldSpec(\n spec: FieldSpec,\n diagnostics: Diagnostic[]\n): string {\n const baseType = mapFieldType(spec.type, spec, diagnostics);\n\n // GEN-12: degrade for unknown structures\n if (!spec.required && baseType !== \"unknown\") {\n return `${baseType} | null`;\n }\n return baseType;\n}\n\nfunction mapFieldType(\n type: FieldType,\n spec: FieldSpec,\n diagnostics: Diagnostic[]\n): string {\n if (typeof type === \"object\" && \"enum\" in type) {\n // Enum -> union of literals\n return type.enum.map((v) => renderLiteral(v as string | number | boolean | null)).join(\" | \");\n }\n\n switch (type) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n case \"null\":\n return \"null\";\n case \"object\": {\n if (spec.fields) {\n const sortedFields = Object.keys(spec.fields).sort();\n const parts: string[] = [];\n for (const name of sortedFields) {\n const field = spec.fields[name];\n const fieldType = mapFieldSpec(field, diagnostics);\n const opt = field.required ? \"\" : \"?\";\n parts.push(`${name}${opt}: ${fieldType}`);\n }\n return `{ ${parts.join(\"; \")} }`;\n }\n // GEN-12: unstructured object -> unknown\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: \"Object field without fields spec, degrading to Record<string, unknown>\",\n });\n return \"Record<string, unknown>\";\n }\n case \"array\": {\n if (spec.items) {\n return `${mapFieldSpec(spec.items, diagnostics)}[]`;\n }\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: \"Array field without items spec, degrading to unknown[]\",\n });\n return \"unknown[]\";\n }\n default:\n return \"unknown\";\n }\n}\n\nfunction pascalCase(str: string): string {\n return str\n .split(/[-_\\s]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\");\n}\n","import type { TypeDefinition, TypeSpec } from \"@manifesto-ai/core\";\nimport type {\n CodegenContext,\n CodegenOutput,\n CodegenPlugin,\n Diagnostic,\n} from \"../types.js\";\nimport type { TsPluginArtifacts } from \"./ts-plugin.js\";\n\nconst PLUGIN_NAME = \"codegen-plugin-zod\";\nconst TS_PLUGIN_NAME = \"codegen-plugin-ts\";\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport interface ZodPluginOptions {\n readonly schemasFile?: string;\n}\n\n/**\n * @deprecated Prefer `createDomainPlugin()` for canonical domain facade output.\n */\nexport function createZodPlugin(options?: ZodPluginOptions): CodegenPlugin {\n const schemasFile = options?.schemasFile ?? \"base.ts\";\n\n return {\n name: PLUGIN_NAME,\n generate(ctx: CodegenContext): CodegenOutput {\n const diagnostics: Diagnostic[] = [];\n\n // PLG-11: Optional TS artifacts dependency\n const tsArtifacts = ctx.artifacts[TS_PLUGIN_NAME] as TsPluginArtifacts | undefined;\n\n const sortedTypeNames = Object.keys(ctx.schema.types).sort();\n const schemaDecls: string[] = [];\n\n // Collect all type names for forward declarations with z.lazy\n const allTypeNames = new Set(sortedTypeNames);\n\n for (const name of sortedTypeNames) {\n const spec = ctx.schema.types[name];\n schemaDecls.push(renderNamedSchema(name, spec, allTypeNames, tsArtifacts, diagnostics));\n }\n\n // Build imports\n const imports: string[] = ['import { z } from \"zod\";'];\n\n // ZOD-4: Import TS types for annotations when available\n if (tsArtifacts && tsArtifacts.typeNames.length > 0) {\n const typeImports = sortedTypeNames\n .filter((n) => tsArtifacts.typeNames.includes(n))\n .join(\", \");\n if (typeImports) {\n imports.push(`import type { ${typeImports} } from \"${tsArtifacts.typeImportPath}\";`);\n }\n }\n\n const content = imports.join(\"\\n\") + \"\\n\\n\" + schemaDecls.join(\"\\n\\n\") + \"\\n\";\n\n return {\n patches: [{ op: \"set\", path: schemasFile, content }],\n diagnostics,\n };\n },\n };\n}\n\n// --- Schema rendering ---\n\nfunction renderNamedSchema(\n name: string,\n spec: TypeSpec,\n allTypeNames: Set<string>,\n tsArtifacts: TsPluginArtifacts | undefined,\n diagnostics: Diagnostic[]\n): string {\n const schemaName = `${name}Schema`;\n const zodExpr = mapTypeDefinition(spec.definition, allTypeNames, diagnostics);\n\n // ZOD-4/ZOD-5: Type annotation when TS artifacts available\n const hasTypeAnnotation = tsArtifacts && tsArtifacts.typeNames.includes(name);\n const annotation = hasTypeAnnotation ? `: z.ZodType<${name}>` : \"\";\n\n return `export const ${schemaName}${annotation} = ${zodExpr};`;\n}\n\nfunction mapTypeDefinition(\n def: TypeDefinition,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n switch (def.kind) {\n case \"primitive\":\n return mapPrimitiveZod(def.type);\n\n case \"literal\":\n return `z.literal(${renderLiteralValue(def.value)})`;\n\n case \"array\":\n return `z.array(${mapTypeDefinition(def.element, allTypeNames, diagnostics)})`;\n\n case \"record\":\n return handleRecord(def, allTypeNames, diagnostics);\n\n case \"object\":\n return renderZodObject(def.fields, allTypeNames, diagnostics);\n\n case \"union\":\n return handleUnion(def.types, allTypeNames, diagnostics);\n\n case \"ref\":\n // ZOD-2: Always z.lazy for circular reference support\n return `z.lazy(() => ${def.name}Schema)`;\n\n default: {\n // ZOD-1: Unknown kind fallback\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Unknown TypeDefinition kind: \"${(def as Record<string, unknown>).kind}\". Emitting \"z.unknown()\".`,\n });\n return \"z.unknown()\";\n }\n }\n}\n\nfunction mapPrimitiveZod(type: string): string {\n switch (type) {\n case \"string\":\n return \"z.string()\";\n case \"number\":\n return \"z.number()\";\n case \"boolean\":\n return \"z.boolean()\";\n case \"null\":\n return \"z.null()\";\n default:\n return \"z.unknown()\";\n }\n}\n\nfunction renderLiteralValue(value: string | number | boolean | null): string {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n if (value === null) {\n return \"null\";\n }\n return String(value);\n}\n\nfunction handleRecord(\n def: Extract<TypeDefinition, { kind: \"record\" }>,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n const valueSchema = mapTypeDefinition(def.value, allTypeNames, diagnostics);\n\n // ZOD-7: Non-string record key -> degrade to z.record(z.string(), ...)\n if (def.key.kind !== \"primitive\" || def.key.type !== \"string\") {\n diagnostics.push({\n level: \"warn\",\n plugin: PLUGIN_NAME,\n message: `Record key type is not string (got ${JSON.stringify(def.key)}). Degrading to z.record(z.string(), ...).`,\n });\n return `z.record(z.string(), ${valueSchema})`;\n }\n\n return `z.record(z.string(), ${valueSchema})`;\n}\n\nfunction renderZodObject(\n fields: Record<string, { type: TypeDefinition; optional: boolean }>,\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n const sortedFields = Object.keys(fields).sort();\n const parts: string[] = [];\n\n for (const fieldName of sortedFields) {\n const field = fields[fieldName];\n let zodType = mapTypeDefinition(field.type, allTypeNames, diagnostics);\n\n // ZOD-6: optional -> .optional()\n if (field.optional) {\n zodType += \".optional()\";\n }\n\n parts.push(` ${fieldName}: ${zodType},`);\n }\n\n return `z.object({\\n${parts.join(\"\\n\")}\\n})`;\n}\n\nfunction handleUnion(\n types: TypeDefinition[],\n allTypeNames: Set<string>,\n diagnostics: Diagnostic[]\n): string {\n // ZOD-3: 2-variant union with null -> z.nullable(T)\n if (types.length === 2) {\n const nullIdx = types.findIndex(\n (t) => t.kind === \"primitive\" && t.type === \"null\"\n );\n if (nullIdx !== -1) {\n const otherIdx = nullIdx === 0 ? 1 : 0;\n const otherSchema = mapTypeDefinition(types[otherIdx], allTypeNames, diagnostics);\n return `z.nullable(${otherSchema})`;\n }\n }\n\n const schemas = types.map((t) => mapTypeDefinition(t, allTypeNames, diagnostics));\n return `z.union([${schemas.join(\", \")}])`;\n}\n"],"mappings":"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","names":["PLUGIN_NAME","pascalCase","renderLiteral","PLUGIN_NAME","mapTypeDefinition"]}
|