@manifesto-ai/compiler 1.6.1 → 1.7.0
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 +64 -16
- package/dist/chunk-DJY6BFGK.js +74 -0
- package/dist/chunk-DJY6BFGK.js.map +1 -0
- package/dist/chunk-QP2LGMBA.js +4522 -0
- package/dist/chunk-QP2LGMBA.js.map +1 -0
- package/dist/chunk-QXLPDCLA.js +33 -0
- package/dist/chunk-QXLPDCLA.js.map +1 -0
- package/dist/esbuild.d.ts +8 -0
- package/dist/esbuild.js +14 -0
- package/dist/esbuild.js.map +1 -0
- package/dist/index.d.ts +2710 -11
- package/dist/index.js +2189 -43
- package/dist/index.js.map +1 -1
- package/dist/node-loader.d.ts +18 -0
- package/dist/node-loader.js +47 -0
- package/dist/node-loader.js.map +1 -0
- package/dist/rollup.d.ts +8 -0
- package/dist/rollup.js +14 -0
- package/dist/rollup.js.map +1 -0
- package/dist/rspack.d.ts +7 -0
- package/dist/rspack.js +14 -0
- package/dist/rspack.js.map +1 -0
- package/dist/unplugin-6wnvFiEo.d.ts +17 -0
- package/dist/vite.d.ts +8 -17
- package/dist/vite.js +13 -33
- package/dist/vite.js.map +1 -1
- package/dist/webpack.d.ts +8 -0
- package/dist/webpack.js +14 -0
- package/dist/webpack.js.map +1 -0
- package/package.json +42 -24
- package/dist/analyzer/index.d.ts +0 -6
- package/dist/analyzer/index.d.ts.map +0 -1
- package/dist/analyzer/index.js +0 -6
- package/dist/analyzer/index.js.map +0 -1
- package/dist/analyzer/scope.d.ts +0 -77
- package/dist/analyzer/scope.d.ts.map +0 -1
- package/dist/analyzer/scope.js +0 -296
- package/dist/analyzer/scope.js.map +0 -1
- package/dist/analyzer/validator.d.ts +0 -60
- package/dist/analyzer/validator.d.ts.map +0 -1
- package/dist/analyzer/validator.js +0 -439
- package/dist/analyzer/validator.js.map +0 -1
- package/dist/api/compile-mel.d.ts +0 -126
- package/dist/api/compile-mel.d.ts.map +0 -1
- package/dist/api/compile-mel.js +0 -129
- package/dist/api/compile-mel.js.map +0 -1
- package/dist/api/index.d.ts +0 -10
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/index.js +0 -9
- package/dist/api/index.js.map +0 -1
- package/dist/diagnostics/codes.d.ts +0 -25
- package/dist/diagnostics/codes.d.ts.map +0 -1
- package/dist/diagnostics/codes.js +0 -154
- package/dist/diagnostics/codes.js.map +0 -1
- package/dist/diagnostics/index.d.ts +0 -6
- package/dist/diagnostics/index.d.ts.map +0 -1
- package/dist/diagnostics/index.js +0 -6
- package/dist/diagnostics/index.js.map +0 -1
- package/dist/diagnostics/types.d.ts +0 -67
- package/dist/diagnostics/types.d.ts.map +0 -1
- package/dist/diagnostics/types.js +0 -58
- package/dist/diagnostics/types.js.map +0 -1
- package/dist/evaluation/context.d.ts +0 -91
- package/dist/evaluation/context.d.ts.map +0 -1
- package/dist/evaluation/context.js +0 -59
- package/dist/evaluation/context.js.map +0 -1
- package/dist/evaluation/evaluate-expr.d.ts +0 -24
- package/dist/evaluation/evaluate-expr.d.ts.map +0 -1
- package/dist/evaluation/evaluate-expr.js +0 -576
- package/dist/evaluation/evaluate-expr.js.map +0 -1
- package/dist/evaluation/evaluate-patch.d.ts +0 -123
- package/dist/evaluation/evaluate-patch.d.ts.map +0 -1
- package/dist/evaluation/evaluate-patch.js +0 -202
- package/dist/evaluation/evaluate-patch.js.map +0 -1
- package/dist/evaluation/evaluate-runtime-patch.d.ts +0 -86
- package/dist/evaluation/evaluate-runtime-patch.d.ts.map +0 -1
- package/dist/evaluation/evaluate-runtime-patch.js +0 -153
- package/dist/evaluation/evaluate-runtime-patch.js.map +0 -1
- package/dist/evaluation/index.d.ts +0 -15
- package/dist/evaluation/index.d.ts.map +0 -1
- package/dist/evaluation/index.js +0 -13
- package/dist/evaluation/index.js.map +0 -1
- package/dist/generator/index.d.ts +0 -7
- package/dist/generator/index.d.ts.map +0 -1
- package/dist/generator/index.js +0 -7
- package/dist/generator/index.js.map +0 -1
- package/dist/generator/ir.d.ts +0 -348
- package/dist/generator/ir.d.ts.map +0 -1
- package/dist/generator/ir.js +0 -709
- package/dist/generator/ir.js.map +0 -1
- package/dist/generator/lowering.d.ts +0 -11
- package/dist/generator/lowering.d.ts.map +0 -1
- package/dist/generator/lowering.js +0 -368
- package/dist/generator/lowering.js.map +0 -1
- package/dist/generator/normalizer.d.ts +0 -16
- package/dist/generator/normalizer.d.ts.map +0 -1
- package/dist/generator/normalizer.js +0 -181
- package/dist/generator/normalizer.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/lexer/index.d.ts +0 -7
- package/dist/lexer/index.d.ts.map +0 -1
- package/dist/lexer/index.js +0 -7
- package/dist/lexer/index.js.map +0 -1
- package/dist/lexer/lexer.d.ts +0 -59
- package/dist/lexer/lexer.d.ts.map +0 -1
- package/dist/lexer/lexer.js +0 -433
- package/dist/lexer/lexer.js.map +0 -1
- package/dist/lexer/source-location.d.ts +0 -41
- package/dist/lexer/source-location.d.ts.map +0 -1
- package/dist/lexer/source-location.js +0 -33
- package/dist/lexer/source-location.js.map +0 -1
- package/dist/lexer/tokens.d.ts +0 -47
- package/dist/lexer/tokens.d.ts.map +0 -1
- package/dist/lexer/tokens.js +0 -73
- package/dist/lexer/tokens.js.map +0 -1
- package/dist/loader.d.ts +0 -23
- package/dist/loader.d.ts.map +0 -1
- package/dist/loader.js +0 -62
- package/dist/loader.js.map +0 -1
- package/dist/lowering/context.d.ts +0 -96
- package/dist/lowering/context.d.ts.map +0 -1
- package/dist/lowering/context.js +0 -42
- package/dist/lowering/context.js.map +0 -1
- package/dist/lowering/errors.d.ts +0 -84
- package/dist/lowering/errors.d.ts.map +0 -1
- package/dist/lowering/errors.js +0 -81
- package/dist/lowering/errors.js.map +0 -1
- package/dist/lowering/index.d.ts +0 -20
- package/dist/lowering/index.d.ts.map +0 -1
- package/dist/lowering/index.js +0 -13
- package/dist/lowering/index.js.map +0 -1
- package/dist/lowering/lower-expr.d.ts +0 -76
- package/dist/lowering/lower-expr.d.ts.map +0 -1
- package/dist/lowering/lower-expr.js +0 -351
- package/dist/lowering/lower-expr.js.map +0 -1
- package/dist/lowering/lower-patch.d.ts +0 -231
- package/dist/lowering/lower-patch.d.ts.map +0 -1
- package/dist/lowering/lower-patch.js +0 -146
- package/dist/lowering/lower-patch.js.map +0 -1
- package/dist/lowering/lower-runtime-patch.d.ts +0 -100
- package/dist/lowering/lower-runtime-patch.d.ts.map +0 -1
- package/dist/lowering/lower-runtime-patch.js +0 -49
- package/dist/lowering/lower-runtime-patch.js.map +0 -1
- package/dist/mel-module.d.ts +0 -13
- package/dist/mel-module.d.ts.map +0 -1
- package/dist/mel-module.js +0 -33
- package/dist/mel-module.js.map +0 -1
- package/dist/parser/ast.d.ts +0 -344
- package/dist/parser/ast.d.ts.map +0 -1
- package/dist/parser/ast.js +0 -24
- package/dist/parser/ast.js.map +0 -1
- package/dist/parser/index.d.ts +0 -7
- package/dist/parser/index.d.ts.map +0 -1
- package/dist/parser/index.js +0 -7
- package/dist/parser/index.js.map +0 -1
- package/dist/parser/parser.d.ts +0 -92
- package/dist/parser/parser.d.ts.map +0 -1
- package/dist/parser/parser.js +0 -892
- package/dist/parser/parser.js.map +0 -1
- package/dist/parser/precedence.d.ts +0 -44
- package/dist/parser/precedence.d.ts.map +0 -1
- package/dist/parser/precedence.js +0 -69
- package/dist/parser/precedence.js.map +0 -1
- package/dist/renderer/expr-node.d.ts +0 -172
- package/dist/renderer/expr-node.d.ts.map +0 -1
- package/dist/renderer/expr-node.js +0 -218
- package/dist/renderer/expr-node.js.map +0 -1
- package/dist/renderer/fragment.d.ts +0 -84
- package/dist/renderer/fragment.d.ts.map +0 -1
- package/dist/renderer/fragment.js +0 -172
- package/dist/renderer/fragment.js.map +0 -1
- package/dist/renderer/index.d.ts +0 -23
- package/dist/renderer/index.d.ts.map +0 -1
- package/dist/renderer/index.js +0 -27
- package/dist/renderer/index.js.map +0 -1
- package/dist/renderer/patch-op.d.ts +0 -82
- package/dist/renderer/patch-op.d.ts.map +0 -1
- package/dist/renderer/patch-op.js +0 -203
- package/dist/renderer/patch-op.js.map +0 -1
- package/dist/renderer/type-expr.d.ts +0 -61
- package/dist/renderer/type-expr.d.ts.map +0 -1
- package/dist/renderer/type-expr.js +0 -131
- package/dist/renderer/type-expr.js.map +0 -1
- package/dist/vite.d.ts.map +0 -1
- package/loader.cjs +0 -22
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lexer/tokens.ts","../src/lexer/source-location.ts","../src/lexer/lexer.ts","../src/parser/ast.ts","../src/parser/precedence.ts","../src/parser/parser.ts","../src/analyzer/scope.ts","../src/diagnostics/types.ts","../src/analyzer/validator.ts","../src/generator/normalizer.ts","../src/generator/ir.ts","../src/lowering/errors.ts","../src/lowering/lower-expr.ts","../src/lowering/lower-runtime-patch.ts","../src/api/compile-mel-patch-collector.ts","../src/api/compile-mel-patch-expr.ts","../src/api/compile-mel-patch-location.ts","../src/api/compile-mel-patch.ts","../src/api/compile-mel.ts"],"sourcesContent":["/**\n * Token Types for MEL Lexer\n * Based on MEL SPEC v0.3.3 Section 3\n */\n\nimport type { SourceLocation } from \"./source-location.js\";\n\n/**\n * All token kinds in MEL\n */\nexport type TokenKind =\n // Keywords\n | \"DOMAIN\"\n | \"STATE\"\n | \"COMPUTED\"\n | \"ACTION\"\n | \"EFFECT\"\n | \"WHEN\"\n | \"ONCE\"\n | \"PATCH\"\n | \"UNSET\"\n | \"MERGE\"\n | \"TRUE\"\n | \"FALSE\"\n | \"NULL\"\n | \"AS\"\n | \"AVAILABLE\" // v0.3.2\n | \"FAIL\" // v0.3.2\n | \"STOP\" // v0.3.2\n | \"WITH\" // v0.3.2\n | \"TYPE\" // v0.3.3\n | \"IMPORT\"\n | \"FROM\"\n | \"EXPORT\"\n // Operators\n | \"PLUS\" // +\n | \"MINUS\" // -\n | \"STAR\" // *\n | \"SLASH\" // /\n | \"PERCENT\" // %\n | \"EQ_EQ\" // ==\n | \"BANG_EQ\" // !=\n | \"LT\" // <\n | \"LT_EQ\" // <=\n | \"GT\" // >\n | \"GT_EQ\" // >=\n | \"AMP_AMP\" // &&\n | \"PIPE_PIPE\" // ||\n | \"BANG\" // !\n | \"QUESTION_QUESTION\" // ??\n | \"QUESTION\" // ?\n | \"COLON\" // :\n | \"EQ\" // =\n // Delimiters\n | \"LPAREN\" // (\n | \"RPAREN\" // )\n | \"LBRACE\" // {\n | \"RBRACE\" // }\n | \"LBRACKET\" // [\n | \"RBRACKET\" // ]\n | \"COMMA\" // ,\n | \"SEMICOLON\" // ;\n | \"DOT\" // .\n | \"PIPE\" // |\n // Literals\n | \"NUMBER\"\n | \"STRING\"\n | \"IDENTIFIER\"\n // System identifiers (reserved)\n | \"SYSTEM_IDENT\" // $system.*, $meta.*, $input.*\n | \"ITEM\" // $item\n // v0.3.2: ACC removed - reduce pattern deprecated\n // Special\n | \"EOF\"\n | \"ERROR\";\n\n/**\n * A token produced by the lexer\n */\nexport interface Token {\n kind: TokenKind;\n /** The raw text of the token */\n lexeme: string;\n /** Parsed value for literals */\n value?: unknown;\n /** Location in source */\n location: SourceLocation;\n}\n\n/**\n * Keywords lookup table\n */\nexport const KEYWORDS: Record<string, TokenKind> = {\n domain: \"DOMAIN\",\n state: \"STATE\",\n computed: \"COMPUTED\",\n action: \"ACTION\",\n effect: \"EFFECT\",\n when: \"WHEN\",\n once: \"ONCE\",\n patch: \"PATCH\",\n unset: \"UNSET\",\n merge: \"MERGE\",\n true: \"TRUE\",\n false: \"FALSE\",\n null: \"NULL\",\n as: \"AS\",\n available: \"AVAILABLE\", // v0.3.2\n fail: \"FAIL\", // v0.3.2\n stop: \"STOP\", // v0.3.2\n with: \"WITH\", // v0.3.2\n type: \"TYPE\", // v0.3.3\n import: \"IMPORT\",\n from: \"FROM\",\n export: \"EXPORT\",\n};\n\n/**\n * Reserved keywords (JS keywords that are forbidden in MEL)\n */\nexport const RESERVED_KEYWORDS = new Set([\n // Control flow (forbidden)\n \"function\", \"var\", \"let\", \"const\", \"if\", \"else\",\n \"for\", \"while\", \"do\", \"switch\", \"case\", \"break\",\n \"continue\", \"return\", \"throw\", \"try\", \"catch\", \"finally\",\n \"new\", \"delete\", \"instanceof\", \"void\",\n // NOTE: \"typeof\" removed - now a MEL builtin function\n // NOTE: \"with\" removed - now a MEL keyword in v0.3.2\n \"debugger\", \"this\", \"super\", \"arguments\", \"eval\",\n // Reserved for future\n \"async\", \"await\", \"yield\", \"class\", \"extends\",\n \"interface\", \"enum\", \"namespace\", \"module\",\n // NOTE: \"type\" removed - now a MEL keyword in v0.3.3\n]);\n\n/**\n * Check if a token is a keyword\n */\nexport function isKeyword(lexeme: string): boolean {\n return lexeme in KEYWORDS;\n}\n\n/**\n * Check if a token is a reserved word\n */\nexport function isReserved(lexeme: string): boolean {\n return RESERVED_KEYWORDS.has(lexeme);\n}\n\n/**\n * Get keyword token kind, or undefined if not a keyword\n * Note: Uses Object.hasOwn to avoid prototype pollution (e.g., \"toString\")\n */\nexport function getKeywordKind(lexeme: string): TokenKind | undefined {\n return Object.hasOwn(KEYWORDS, lexeme) ? KEYWORDS[lexeme] : undefined;\n}\n\n/**\n * Create a token\n */\nexport function createToken(\n kind: TokenKind,\n lexeme: string,\n location: SourceLocation,\n value?: unknown\n): Token {\n return { kind, lexeme, location, value };\n}\n","/**\n * Source Location Types\n * Tracks positions in MEL source code for error reporting\n */\n\n/**\n * A position in source code (1-based line/column)\n */\nexport interface Position {\n /** 1-based line number */\n line: number;\n /** 1-based column number */\n column: number;\n /** 0-based byte offset from start of source */\n offset: number;\n}\n\n/**\n * A span in source code (start to end)\n */\nexport interface SourceLocation {\n start: Position;\n end: Position;\n /** Optional source file path */\n source?: string;\n}\n\n/**\n * Create a position\n */\nexport function createPosition(line: number, column: number, offset: number): Position {\n return { line, column, offset };\n}\n\n/**\n * Create a source location from two positions\n */\nexport function createLocation(start: Position, end: Position, source?: string): SourceLocation {\n return { start, end, source };\n}\n\n/**\n * Create a zero-width location at a position\n */\nexport function createPointLocation(pos: Position, source?: string): SourceLocation {\n return { start: pos, end: pos, source };\n}\n\n/**\n * Merge two locations into one spanning both\n */\nexport function mergeLocations(a: SourceLocation, b: SourceLocation): SourceLocation {\n return {\n start: a.start.offset < b.start.offset ? a.start : b.start,\n end: a.end.offset > b.end.offset ? a.end : b.end,\n source: a.source ?? b.source,\n };\n}\n","/**\n * MEL Lexer\n * Tokenizes MEL source code based on SPEC v0.3.1 Section 3\n */\n\nimport type { Diagnostic } from \"../diagnostics/types.js\";\nimport { createPosition, createLocation, type Position, type SourceLocation } from \"./source-location.js\";\nimport {\n type Token,\n type TokenKind,\n createToken,\n getKeywordKind,\n isReserved,\n} from \"./tokens.js\";\n\n/**\n * Result of lexical analysis\n */\nexport interface LexResult {\n tokens: Token[];\n diagnostics: Diagnostic[];\n}\n\n/**\n * Lexer for MEL source code\n */\nexport class Lexer {\n private source: string;\n private sourcePath?: string;\n private tokens: Token[] = [];\n private diagnostics: Diagnostic[] = [];\n\n // Current position\n private start = 0; // Start of current token\n private current = 0; // Current character\n private line = 1;\n private column = 1;\n private lineStart = 0; // Offset of current line start\n\n constructor(source: string, sourcePath?: string) {\n this.source = source;\n this.sourcePath = sourcePath;\n }\n\n /**\n * Tokenize the source code\n */\n tokenize(): LexResult {\n while (!this.isAtEnd()) {\n this.start = this.current;\n this.scanToken();\n }\n\n // Add EOF token\n this.tokens.push(\n createToken(\"EOF\", \"\", this.currentLocation())\n );\n\n return {\n tokens: this.tokens,\n diagnostics: this.diagnostics,\n };\n }\n\n private scanToken(): void {\n const c = this.advance();\n\n switch (c) {\n // Single-character tokens\n case \"(\": this.addToken(\"LPAREN\"); break;\n case \")\": this.addToken(\"RPAREN\"); break;\n case \"{\": this.addToken(\"LBRACE\"); break;\n case \"}\": this.addToken(\"RBRACE\"); break;\n case \"[\": this.addToken(\"LBRACKET\"); break;\n case \"]\": this.addToken(\"RBRACKET\"); break;\n case \",\": this.addToken(\"COMMA\"); break;\n case \";\": this.addToken(\"SEMICOLON\"); break;\n case \".\": this.addToken(\"DOT\"); break;\n case \"+\": this.addToken(\"PLUS\"); break;\n case \"-\": this.addToken(\"MINUS\"); break;\n case \"*\": this.addToken(\"STAR\"); break;\n case \"%\": this.addToken(\"PERCENT\"); break;\n case \":\": this.addToken(\"COLON\"); break;\n\n // Two-character tokens\n case \"=\":\n this.addToken(this.match(\"=\") ? \"EQ_EQ\" : \"EQ\");\n break;\n case \"!\":\n this.addToken(this.match(\"=\") ? \"BANG_EQ\" : \"BANG\");\n break;\n case \"<\":\n this.addToken(this.match(\"=\") ? \"LT_EQ\" : \"LT\");\n break;\n case \">\":\n this.addToken(this.match(\"=\") ? \"GT_EQ\" : \"GT\");\n break;\n case \"&\":\n if (this.match(\"&\")) {\n this.addToken(\"AMP_AMP\");\n } else {\n this.error(\"Expected '&&' for logical AND\");\n }\n break;\n case \"|\":\n if (this.match(\"|\")) {\n this.addToken(\"PIPE_PIPE\");\n } else {\n this.addToken(\"PIPE\");\n }\n break;\n case \"?\":\n this.addToken(this.match(\"?\") ? \"QUESTION_QUESTION\" : \"QUESTION\");\n break;\n\n // Slash or comment\n case \"/\":\n if (this.match(\"/\")) {\n this.lineComment();\n } else if (this.match(\"*\")) {\n this.blockComment();\n } else {\n this.addToken(\"SLASH\");\n }\n break;\n\n // Whitespace\n case \" \":\n case \"\\r\":\n case \"\\t\":\n // Ignore whitespace\n break;\n case \"\\n\":\n this.newline();\n break;\n\n // String literals\n case '\"':\n this.string('\"');\n break;\n case \"'\":\n this.string(\"'\");\n break;\n\n // System identifiers ($...)\n case \"$\":\n this.systemIdentifier();\n break;\n\n default:\n if (this.isDigit(c)) {\n this.number();\n } else if (this.isAlpha(c)) {\n this.identifier();\n } else {\n this.error(`Unexpected character '${c}'`);\n }\n }\n }\n\n // ============ Token Scanners ============\n\n private lineComment(): void {\n // Skip until end of line\n while (this.peek() !== \"\\n\" && !this.isAtEnd()) {\n this.advance();\n }\n }\n\n private blockComment(): void {\n const startLine = this.line;\n const startColumn = this.column - 2; // Account for /*\n\n while (!this.isAtEnd()) {\n if (this.peek() === \"*\" && this.peekNext() === \"/\") {\n this.advance(); // *\n this.advance(); // /\n return;\n }\n if (this.peek() === \"\\n\") {\n this.newline();\n }\n this.advance();\n }\n\n // Unterminated block comment\n this.error(`Unterminated block comment starting at line ${startLine}:${startColumn}`);\n }\n\n private string(quote: string): void {\n const startLine = this.line;\n const startColumn = this.column - 1;\n let value = \"\";\n\n while (this.peek() !== quote && !this.isAtEnd()) {\n if (this.peek() === \"\\n\") {\n this.error(\"Unterminated string literal\");\n return;\n }\n\n if (this.peek() === \"\\\\\") {\n this.advance(); // Skip backslash\n const escaped = this.advance();\n switch (escaped) {\n case \"n\": value += \"\\n\"; break;\n case \"r\": value += \"\\r\"; break;\n case \"t\": value += \"\\t\"; break;\n case \"\\\\\": value += \"\\\\\"; break;\n case \"'\": value += \"'\"; break;\n case '\"': value += '\"'; break;\n case \"0\": value += \"\\0\"; break;\n default:\n this.error(`Invalid escape sequence '\\\\${escaped}'`);\n value += escaped;\n }\n } else {\n value += this.advance();\n }\n }\n\n if (this.isAtEnd()) {\n this.error(`Unterminated string starting at line ${startLine}:${startColumn}`);\n return;\n }\n\n // Closing quote\n this.advance();\n this.addToken(\"STRING\", value);\n }\n\n private number(): void {\n // Check for hex\n if (this.source[this.start] === \"0\" && (this.peek() === \"x\" || this.peek() === \"X\")) {\n this.advance(); // x\n while (this.isHexDigit(this.peek())) {\n this.advance();\n }\n const hexStr = this.source.slice(this.start + 2, this.current);\n const value = parseInt(hexStr, 16);\n this.addToken(\"NUMBER\", value);\n return;\n }\n\n // Decimal part\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n\n // Fractional part\n if (this.peek() === \".\" && this.isDigit(this.peekNext())) {\n this.advance(); // .\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n }\n\n // Exponent part\n if (this.peek() === \"e\" || this.peek() === \"E\") {\n this.advance();\n if (this.peek() === \"+\" || this.peek() === \"-\") {\n this.advance();\n }\n if (!this.isDigit(this.peek())) {\n this.error(\"Invalid number: expected digits after exponent\");\n return;\n }\n while (this.isDigit(this.peek())) {\n this.advance();\n }\n }\n\n const value = parseFloat(this.source.slice(this.start, this.current));\n this.addToken(\"NUMBER\", value);\n }\n\n private identifier(): void {\n while (this.isAlphaNumeric(this.peek())) {\n // Check for $ in middle of identifier (forbidden by A17)\n if (this.peek() === \"$\") {\n this.advance();\n this.error(\"'$' is forbidden in identifiers (MEL A17)\");\n continue;\n }\n this.advance();\n }\n\n const lexeme = this.source.slice(this.start, this.current);\n\n // Check for __sys__ prefix (reserved for compiler, A26)\n if (lexeme.startsWith(\"__sys__\")) {\n this.error(\"'__sys__' prefix is reserved for compiler-generated identifiers (MEL A26)\");\n this.addToken(\"ERROR\");\n return;\n }\n\n // Check for reserved words\n if (isReserved(lexeme)) {\n this.error(`'${lexeme}' is a reserved keyword and cannot be used`);\n this.addToken(\"ERROR\");\n return;\n }\n\n // Check if keyword\n const keywordKind = getKeywordKind(lexeme);\n if (keywordKind) {\n this.addToken(keywordKind);\n } else {\n this.addToken(\"IDENTIFIER\");\n }\n }\n\n private systemIdentifier(): void {\n // $system.*, $meta.*, $input.*, $item\n // v0.3.2: $acc removed - reduce pattern deprecated\n if (!this.isAlpha(this.peek())) {\n this.error(\"Expected identifier after '$'\");\n this.addToken(\"ERROR\");\n return;\n }\n\n // First, read only the initial identifier part (no dots)\n while (this.isAlphaNumeric(this.peek())) {\n this.advance();\n }\n\n const initialLexeme = this.source.slice(this.start, this.current);\n\n // Special case: $item is an iteration variable\n // It should NOT consume the dot, allowing property access to be parsed separately\n if (initialLexeme === \"$item\") {\n this.addToken(\"ITEM\");\n return;\n }\n\n // For $system, $meta, $input - continue reading dot-separated path\n if (initialLexeme === \"$system\" || initialLexeme === \"$meta\" || initialLexeme === \"$input\") {\n // Read any following .identifier segments\n while (this.peek() === \".\" && this.isAlpha(this.peekNext())) {\n this.advance(); // consume .\n while (this.isAlphaNumeric(this.peek())) {\n this.advance();\n }\n }\n this.addToken(\"SYSTEM_IDENT\");\n return;\n }\n\n // Invalid system identifier\n this.error(`Invalid system identifier '${initialLexeme}'. Expected $system.*, $meta.*, $input.*, or $item`);\n this.addToken(\"ERROR\");\n }\n\n // ============ Helpers ============\n\n private isAtEnd(): boolean {\n return this.current >= this.source.length;\n }\n\n private advance(): string {\n const c = this.source[this.current];\n this.current++;\n this.column++;\n return c;\n }\n\n private peek(): string {\n if (this.isAtEnd()) return \"\\0\";\n return this.source[this.current];\n }\n\n private peekNext(): string {\n if (this.current + 1 >= this.source.length) return \"\\0\";\n return this.source[this.current + 1];\n }\n\n private match(expected: string): boolean {\n if (this.isAtEnd()) return false;\n if (this.source[this.current] !== expected) return false;\n this.current++;\n this.column++;\n return true;\n }\n\n private newline(): void {\n this.line++;\n this.column = 1;\n this.lineStart = this.current;\n }\n\n private isDigit(c: string): boolean {\n return c >= \"0\" && c <= \"9\";\n }\n\n private isHexDigit(c: string): boolean {\n return this.isDigit(c) || (c >= \"a\" && c <= \"f\") || (c >= \"A\" && c <= \"F\");\n }\n\n private isAlpha(c: string): boolean {\n return (c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\") || c === \"_\";\n }\n\n private isAlphaNumeric(c: string): boolean {\n return this.isAlpha(c) || this.isDigit(c);\n }\n\n private currentLocation(): SourceLocation {\n const startPos = this.positionAt(this.start);\n const endPos = this.positionAt(this.current);\n return createLocation(startPos, endPos, this.sourcePath);\n }\n\n private positionAt(offset: number): Position {\n // Calculate line and column for the given offset\n let line = 1;\n let lineStart = 0;\n for (let i = 0; i < offset; i++) {\n if (this.source[i] === \"\\n\") {\n line++;\n lineStart = i + 1;\n }\n }\n return createPosition(line, offset - lineStart + 1, offset);\n }\n\n private addToken(kind: TokenKind, value?: unknown): void {\n const lexeme = this.source.slice(this.start, this.current);\n this.tokens.push(createToken(kind, lexeme, this.currentLocation(), value));\n }\n\n private error(message: string): void {\n const location = this.currentLocation();\n this.diagnostics.push({\n severity: \"error\",\n code: \"MEL_LEXER\",\n message,\n location,\n source: this.getSourceLine(location.start.line),\n });\n }\n\n private getSourceLine(lineNumber: number): string {\n const lines = this.source.split(\"\\n\");\n return lines[lineNumber - 1] ?? \"\";\n }\n}\n\n/**\n * Tokenize MEL source code\n */\nexport function tokenize(source: string, sourcePath?: string): LexResult {\n const lexer = new Lexer(source, sourcePath);\n return lexer.tokenize();\n}\n","/**\n * AST Node Types for MEL Parser\n * Based on MEL SPEC v0.3.3 Section 4\n */\n\nimport type { SourceLocation } from \"../lexer/source-location.js\";\n\n// ============ Base Types ============\n\n/**\n * Base interface for all AST nodes\n */\nexport interface ASTNode {\n location: SourceLocation;\n}\n\n// ============ Program Structure ============\n\n/**\n * Root node of a MEL program\n */\nexport interface ProgramNode extends ASTNode {\n kind: \"program\";\n imports: ImportNode[];\n domain: DomainNode;\n}\n\n/**\n * Import declaration\n */\nexport interface ImportNode extends ASTNode {\n kind: \"import\";\n names: string[];\n from: string;\n}\n\n/**\n * Domain declaration\n */\nexport interface DomainNode extends ASTNode {\n kind: \"domain\";\n name: string;\n /** v0.3.3: Named type declarations */\n types: TypeDeclNode[];\n members: DomainMember[];\n}\n\n/**\n * Domain member types\n */\nexport type DomainMember = StateNode | ComputedNode | ActionNode;\n\n/**\n * Type declaration (v0.3.3)\n * Syntax: type Name = TypeExpr\n */\nexport interface TypeDeclNode extends ASTNode {\n kind: \"typeDecl\";\n name: string;\n typeExpr: TypeExprNode;\n}\n\n// ============ State ============\n\n/**\n * State block declaration\n */\nexport interface StateNode extends ASTNode {\n kind: \"state\";\n fields: StateFieldNode[];\n}\n\n/**\n * State field declaration\n */\nexport interface StateFieldNode extends ASTNode {\n kind: \"stateField\";\n name: string;\n typeExpr: TypeExprNode;\n initializer?: ExprNode;\n}\n\n// ============ Computed ============\n\n/**\n * Computed value declaration\n */\nexport interface ComputedNode extends ASTNode {\n kind: \"computed\";\n name: string;\n expression: ExprNode;\n}\n\n// ============ Action ============\n\n/**\n * Action declaration\n */\nexport interface ActionNode extends ASTNode {\n kind: \"action\";\n name: string;\n params: ParamNode[];\n /** v0.3.2: Optional availability condition */\n available?: ExprNode;\n body: GuardedStmtNode[];\n}\n\n/**\n * Parameter declaration\n */\nexport interface ParamNode extends ASTNode {\n kind: \"param\";\n name: string;\n typeExpr: TypeExprNode;\n}\n\n// ============ Statements ============\n\n/**\n * Guarded statement types (top-level in action body)\n */\nexport type GuardedStmtNode = WhenStmtNode | OnceStmtNode | OnceIntentStmtNode;\n\n/**\n * Inner statement types (inside guards)\n */\nexport type InnerStmtNode =\n | PatchStmtNode\n | EffectStmtNode\n | WhenStmtNode\n | OnceStmtNode\n | OnceIntentStmtNode\n | FailStmtNode\n | StopStmtNode;\n\n/**\n * When guard statement\n */\nexport interface WhenStmtNode extends ASTNode {\n kind: \"when\";\n condition: ExprNode;\n body: InnerStmtNode[];\n}\n\n/**\n * Once guard statement (per-intent idempotency)\n */\nexport interface OnceStmtNode extends ASTNode {\n kind: \"once\";\n marker: PathNode;\n condition?: ExprNode;\n body: InnerStmtNode[];\n}\n\n/**\n * Once-intent guard statement (per-intent idempotency sugar)\n */\nexport interface OnceIntentStmtNode extends ASTNode {\n kind: \"onceIntent\";\n condition?: ExprNode;\n body: InnerStmtNode[];\n}\n\n/**\n * Patch statement\n */\nexport interface PatchStmtNode extends ASTNode {\n kind: \"patch\";\n path: PathNode;\n op: \"set\" | \"unset\" | \"merge\";\n value?: ExprNode;\n}\n\n/**\n * Effect statement\n */\nexport interface EffectStmtNode extends ASTNode {\n kind: \"effect\";\n effectType: string;\n args: EffectArgNode[];\n}\n\n/**\n * Effect argument\n */\nexport interface EffectArgNode extends ASTNode {\n kind: \"effectArg\";\n name: string;\n value: ExprNode | PathNode;\n isPath: boolean; // true for into:, pass:, fail:\n}\n\n/**\n * Fail statement (v0.3.2) - terminates flow with error\n * Compiles to FlowNode { kind: \"fail\", code, message }\n */\nexport interface FailStmtNode extends ASTNode {\n kind: \"fail\";\n code: string;\n message?: ExprNode;\n}\n\n/**\n * Stop statement (v0.3.2) - early exit, no error\n * Compiles to FlowNode { kind: \"halt\", reason }\n */\nexport interface StopStmtNode extends ASTNode {\n kind: \"stop\";\n reason: string;\n}\n\n// ============ Types ============\n\n/**\n * Type expression node\n */\nexport type TypeExprNode =\n | SimpleTypeNode\n | UnionTypeNode\n | ArrayTypeNode\n | RecordTypeNode\n | LiteralTypeNode\n | ObjectTypeNode;\n\nexport interface SimpleTypeNode extends ASTNode {\n kind: \"simpleType\";\n name: string;\n}\n\nexport interface UnionTypeNode extends ASTNode {\n kind: \"unionType\";\n types: TypeExprNode[];\n}\n\nexport interface ArrayTypeNode extends ASTNode {\n kind: \"arrayType\";\n elementType: TypeExprNode;\n}\n\nexport interface RecordTypeNode extends ASTNode {\n kind: \"recordType\";\n keyType: TypeExprNode;\n valueType: TypeExprNode;\n}\n\nexport interface LiteralTypeNode extends ASTNode {\n kind: \"literalType\";\n value: string | number | boolean | null;\n}\n\n/**\n * Object type node (v0.3.3)\n * Represents inline object types: { field: Type, ... }\n * Note: In state fields, this triggers W012 warning (use named type instead)\n */\nexport interface ObjectTypeNode extends ASTNode {\n kind: \"objectType\";\n fields: TypeFieldNode[];\n}\n\n/**\n * Type field within an object type\n */\nexport interface TypeFieldNode extends ASTNode {\n kind: \"typeField\";\n name: string;\n typeExpr: TypeExprNode;\n optional: boolean;\n}\n\n// ============ Expressions ============\n\n/**\n * All expression types\n */\nexport type ExprNode =\n | LiteralExprNode\n | IdentifierExprNode\n | SystemIdentExprNode\n | IterationVarExprNode\n | PropertyAccessExprNode\n | IndexAccessExprNode\n | FunctionCallExprNode\n | UnaryExprNode\n | BinaryExprNode\n | TernaryExprNode\n | ObjectLiteralExprNode\n | ArrayLiteralExprNode;\n\n/**\n * Literal expression (number, string, boolean, null)\n */\nexport interface LiteralExprNode extends ASTNode {\n kind: \"literal\";\n value: unknown;\n literalType: \"number\" | \"string\" | \"boolean\" | \"null\";\n}\n\n/**\n * Identifier expression\n */\nexport interface IdentifierExprNode extends ASTNode {\n kind: \"identifier\";\n name: string;\n}\n\n/**\n * System identifier expression ($system.*, $meta.*, $input.*)\n */\nexport interface SystemIdentExprNode extends ASTNode {\n kind: \"systemIdent\";\n path: string[]; // e.g., [\"system\", \"uuid\"] for $system.uuid\n}\n\n/**\n * Iteration variable expression ($item only)\n * v0.3.2: $acc removed - reduce pattern deprecated\n */\nexport interface IterationVarExprNode extends ASTNode {\n kind: \"iterationVar\";\n name: \"item\";\n}\n\n/**\n * Property access expression (a.b)\n */\nexport interface PropertyAccessExprNode extends ASTNode {\n kind: \"propertyAccess\";\n object: ExprNode;\n property: string;\n}\n\n/**\n * Index access expression (a[b])\n */\nexport interface IndexAccessExprNode extends ASTNode {\n kind: \"indexAccess\";\n object: ExprNode;\n index: ExprNode;\n}\n\n/**\n * Function call expression\n */\nexport interface FunctionCallExprNode extends ASTNode {\n kind: \"functionCall\";\n name: string;\n args: ExprNode[];\n}\n\n/**\n * Unary expression (!a, -a)\n */\nexport interface UnaryExprNode extends ASTNode {\n kind: \"unary\";\n operator: \"!\" | \"-\";\n operand: ExprNode;\n}\n\n/**\n * Binary operators\n */\nexport type BinaryOperator =\n | \"+\" | \"-\" | \"*\" | \"/\" | \"%\"\n | \"==\" | \"!=\" | \"<\" | \"<=\" | \">\" | \">=\"\n | \"&&\" | \"||\" | \"??\";\n\n/**\n * Binary expression (a + b, a && b, etc.)\n */\nexport interface BinaryExprNode extends ASTNode {\n kind: \"binary\";\n operator: BinaryOperator;\n left: ExprNode;\n right: ExprNode;\n}\n\n/**\n * Ternary expression (a ? b : c)\n */\nexport interface TernaryExprNode extends ASTNode {\n kind: \"ternary\";\n condition: ExprNode;\n consequent: ExprNode;\n alternate: ExprNode;\n}\n\n/**\n * Object literal expression ({ a: 1, b: 2 })\n */\nexport interface ObjectLiteralExprNode extends ASTNode {\n kind: \"objectLiteral\";\n properties: ObjectPropertyNode[];\n}\n\nexport interface ObjectPropertyNode extends ASTNode {\n kind: \"objectProperty\";\n key: string;\n value: ExprNode;\n}\n\n/**\n * Array literal expression ([1, 2, 3])\n */\nexport interface ArrayLiteralExprNode extends ASTNode {\n kind: \"arrayLiteral\";\n elements: ExprNode[];\n}\n\n// ============ Path ============\n\n/**\n * Path node for patch targets and effect destinations\n */\nexport interface PathNode extends ASTNode {\n kind: \"path\";\n segments: PathSegmentNode[];\n}\n\nexport type PathSegmentNode = PropertySegmentNode | IndexSegmentNode;\n\nexport interface PropertySegmentNode extends ASTNode {\n kind: \"propertySegment\";\n name: string;\n}\n\nexport interface IndexSegmentNode extends ASTNode {\n kind: \"indexSegment\";\n index: ExprNode;\n}\n\n// ============ Helpers ============\n\n/**\n * Check if a node is an expression\n */\nexport function isExprNode(node: ASTNode): node is ExprNode {\n const exprKinds = [\n \"literal\", \"identifier\", \"systemIdent\", \"iterationVar\",\n \"propertyAccess\", \"indexAccess\", \"functionCall\",\n \"unary\", \"binary\", \"ternary\", \"objectLiteral\", \"arrayLiteral\"\n ];\n return exprKinds.includes((node as ExprNode).kind);\n}\n\n/**\n * Check if a node is a statement\n */\nexport function isStmtNode(node: ASTNode): node is InnerStmtNode {\n const stmtKinds = [\"when\", \"once\", \"onceIntent\", \"patch\", \"effect\", \"fail\", \"stop\"];\n return stmtKinds.includes((node as InnerStmtNode).kind);\n}\n","/**\n * Operator Precedence for MEL Parser\n * Based on MEL SPEC v0.3.1 Section 4.9\n */\n\nimport type { TokenKind } from \"../lexer/tokens.js\";\nimport type { BinaryOperator } from \"./ast.js\";\n\n/**\n * Precedence levels (higher = binds tighter)\n */\nexport const enum Precedence {\n NONE = 0,\n TERNARY = 1, // ? :\n NULLISH = 2, // ??\n OR = 3, // ||\n AND = 4, // &&\n EQUALITY = 5, // == !=\n COMPARISON = 6, // < <= > >=\n ADDITIVE = 7, // + -\n MULTIPLICATIVE = 8, // * / %\n UNARY = 9, // ! -\n CALL = 10, // ()\n ACCESS = 11, // . []\n}\n\n/**\n * Get the precedence of a binary operator token\n */\nexport function getBinaryPrecedence(kind: TokenKind): Precedence {\n switch (kind) {\n case \"QUESTION\": return Precedence.TERNARY;\n case \"QUESTION_QUESTION\": return Precedence.NULLISH;\n case \"PIPE_PIPE\": return Precedence.OR;\n case \"AMP_AMP\": return Precedence.AND;\n case \"EQ_EQ\":\n case \"BANG_EQ\": return Precedence.EQUALITY;\n case \"LT\":\n case \"LT_EQ\":\n case \"GT\":\n case \"GT_EQ\": return Precedence.COMPARISON;\n case \"PLUS\":\n case \"MINUS\": return Precedence.ADDITIVE;\n case \"STAR\":\n case \"SLASH\":\n case \"PERCENT\": return Precedence.MULTIPLICATIVE;\n default: return Precedence.NONE;\n }\n}\n\n/**\n * Map token kind to binary operator\n */\nexport function tokenToBinaryOp(kind: TokenKind): BinaryOperator | null {\n switch (kind) {\n case \"PLUS\": return \"+\";\n case \"MINUS\": return \"-\";\n case \"STAR\": return \"*\";\n case \"SLASH\": return \"/\";\n case \"PERCENT\": return \"%\";\n case \"EQ_EQ\": return \"==\";\n case \"BANG_EQ\": return \"!=\";\n case \"LT\": return \"<\";\n case \"LT_EQ\": return \"<=\";\n case \"GT\": return \">\";\n case \"GT_EQ\": return \">=\";\n case \"AMP_AMP\": return \"&&\";\n case \"PIPE_PIPE\": return \"||\";\n case \"QUESTION_QUESTION\": return \"??\";\n default: return null;\n }\n}\n\n/**\n * Check if a token is a binary operator\n */\nexport function isBinaryOp(kind: TokenKind): boolean {\n return getBinaryPrecedence(kind) !== Precedence.NONE;\n}\n\n/**\n * Check if a token is a unary operator\n */\nexport function isUnaryOp(kind: TokenKind): boolean {\n return kind === \"BANG\" || kind === \"MINUS\";\n}\n\n/**\n * Check if operators are right-associative\n */\nexport function isRightAssociative(kind: TokenKind): boolean {\n // Ternary and nullish are right-associative\n return kind === \"QUESTION\" || kind === \"QUESTION_QUESTION\";\n}\n","/**\n * MEL Parser\n * Recursive descent parser with Pratt parsing for expressions\n * Based on MEL SPEC v0.3.3 Section 4\n */\n\nimport type { Diagnostic } from \"../diagnostics/types.js\";\nimport type { Token, TokenKind } from \"../lexer/tokens.js\";\nimport { createLocation, mergeLocations, type SourceLocation } from \"../lexer/source-location.js\";\nimport {\n type ProgramNode,\n type DomainNode,\n type DomainMember,\n type TypeDeclNode, // v0.3.3\n type StateNode,\n type StateFieldNode,\n type ComputedNode,\n type ActionNode,\n type ParamNode,\n type GuardedStmtNode,\n type InnerStmtNode,\n type WhenStmtNode,\n type OnceStmtNode,\n type OnceIntentStmtNode,\n type PatchStmtNode,\n type EffectStmtNode,\n type EffectArgNode,\n type FailStmtNode, // v0.3.2\n type StopStmtNode, // v0.3.2\n type TypeExprNode,\n type ObjectTypeNode, // v0.3.3\n type TypeFieldNode, // v0.3.3\n type ExprNode,\n type PathNode,\n type PathSegmentNode,\n type ObjectPropertyNode,\n} from \"./ast.js\";\nimport {\n Precedence,\n getBinaryPrecedence,\n tokenToBinaryOp,\n isRightAssociative,\n} from \"./precedence.js\";\n\n/**\n * Result of parsing\n */\nexport interface ParseResult {\n program: ProgramNode | null;\n diagnostics: Diagnostic[];\n}\n\n/**\n * Parser for MEL source code\n */\nexport class Parser {\n private tokens: Token[];\n private current = 0;\n private diagnostics: Diagnostic[] = [];\n\n constructor(tokens: Token[]) {\n this.tokens = tokens;\n }\n\n /**\n * Parse tokens into an AST\n */\n parse(): ParseResult {\n try {\n const program = this.parseProgram();\n return { program, diagnostics: this.diagnostics };\n } catch (e) {\n // Unrecoverable error\n return { program: null, diagnostics: this.diagnostics };\n }\n }\n\n // ============ Program Structure ============\n\n private parseProgram(): ProgramNode {\n const start = this.peek().location;\n const imports: ProgramNode[\"imports\"] = [];\n\n // Parse imports (if any)\n while (this.check(\"IMPORT\")) {\n imports.push(this.parseImport());\n }\n\n // Parse domain\n const domain = this.parseDomain();\n\n return {\n kind: \"program\",\n imports,\n domain,\n location: mergeLocations(start, domain.location),\n };\n }\n\n private parseImport(): ProgramNode[\"imports\"][0] {\n const start = this.consume(\"IMPORT\", \"Expected 'import'\").location;\n this.consume(\"LBRACE\", \"Expected '{' after 'import'\");\n\n const names: string[] = [];\n do {\n names.push(this.consume(\"IDENTIFIER\", \"Expected identifier\").lexeme);\n } while (this.match(\"COMMA\"));\n\n this.consume(\"RBRACE\", \"Expected '}' after import names\");\n this.consume(\"FROM\", \"Expected 'from' after import names\");\n const fromToken = this.consume(\"STRING\", \"Expected string after 'from'\");\n\n return {\n kind: \"import\",\n names,\n from: fromToken.value as string,\n location: mergeLocations(start, fromToken.location),\n };\n }\n\n private parseDomain(): DomainNode {\n const start = this.consume(\"DOMAIN\", \"Expected 'domain'\").location;\n const name = this.consume(\"IDENTIFIER\", \"Expected domain name\").lexeme;\n this.consume(\"LBRACE\", \"Expected '{' after domain name\");\n\n // v0.3.3: Parse type declarations first\n const types: TypeDeclNode[] = [];\n while (this.check(\"TYPE\") && !this.isAtEnd()) {\n types.push(this.parseTypeDecl());\n }\n\n const members: DomainMember[] = [];\n while (!this.check(\"RBRACE\") && !this.isAtEnd()) {\n // v0.3.3: type declarations can appear anywhere in domain\n if (this.check(\"TYPE\")) {\n types.push(this.parseTypeDecl());\n } else {\n const member = this.parseDomainMember();\n if (member) members.push(member);\n }\n }\n\n const end = this.consume(\"RBRACE\", \"Expected '}' to close domain\").location;\n\n return {\n kind: \"domain\",\n name,\n types,\n members,\n location: mergeLocations(start, end),\n };\n }\n\n /**\n * v0.3.3: Parse type declaration\n * Syntax: type Name = TypeExpr\n */\n private parseTypeDecl(): TypeDeclNode {\n const start = this.consume(\"TYPE\", \"Expected 'type'\").location;\n const name = this.consume(\"IDENTIFIER\", \"Expected type name\").lexeme;\n this.consume(\"EQ\", \"Expected '=' after type name\");\n const typeExpr = this.parseTypeExpr();\n\n return {\n kind: \"typeDecl\",\n name,\n typeExpr,\n location: mergeLocations(start, typeExpr.location),\n };\n }\n\n private parseDomainMember(): DomainMember | null {\n if (this.check(\"STATE\")) return this.parseState();\n if (this.check(\"COMPUTED\")) return this.parseComputed();\n if (this.check(\"ACTION\")) return this.parseAction();\n\n this.error(`Unexpected token '${this.peek().lexeme}'. Expected 'state', 'computed', or 'action'.`);\n this.advance(); // Skip the bad token\n return null;\n }\n\n // ============ State ============\n\n private parseState(): StateNode {\n const start = this.consume(\"STATE\", \"Expected 'state'\").location;\n this.consume(\"LBRACE\", \"Expected '{' after 'state'\");\n\n const fields: StateFieldNode[] = [];\n while (!this.check(\"RBRACE\") && !this.isAtEnd()) {\n fields.push(this.parseStateField());\n }\n\n const end = this.consume(\"RBRACE\", \"Expected '}' to close state block\").location;\n\n return {\n kind: \"state\",\n fields,\n location: mergeLocations(start, end),\n };\n }\n\n private parseStateField(): StateFieldNode {\n const nameToken = this.consume(\"IDENTIFIER\", \"Expected field name\");\n this.consume(\"COLON\", \"Expected ':' after field name\");\n const typeExpr = this.parseTypeExpr();\n\n let initializer: ExprNode | undefined;\n if (this.match(\"EQ\")) {\n initializer = this.parseExpression();\n }\n\n return {\n kind: \"stateField\",\n name: nameToken.lexeme,\n typeExpr,\n initializer,\n location: mergeLocations(\n nameToken.location,\n initializer?.location ?? typeExpr.location\n ),\n };\n }\n\n // ============ Computed ============\n\n private parseComputed(): ComputedNode {\n const start = this.consume(\"COMPUTED\", \"Expected 'computed'\").location;\n const name = this.consume(\"IDENTIFIER\", \"Expected computed name\").lexeme;\n this.consume(\"EQ\", \"Expected '=' after computed name\");\n const expression = this.parseExpression();\n\n return {\n kind: \"computed\",\n name,\n expression,\n location: mergeLocations(start, expression.location),\n };\n }\n\n // ============ Action ============\n\n private parseAction(): ActionNode {\n const start = this.consume(\"ACTION\", \"Expected 'action'\").location;\n const name = this.consume(\"IDENTIFIER\", \"Expected action name\").lexeme;\n this.consume(\"LPAREN\", \"Expected '(' after action name\");\n\n const params: ParamNode[] = [];\n if (!this.check(\"RPAREN\")) {\n do {\n params.push(this.parseParam());\n } while (this.match(\"COMMA\"));\n }\n\n this.consume(\"RPAREN\", \"Expected ')' after parameters\");\n\n // v0.3.2: Parse optional 'available when <Expr>'\n let available: ExprNode | undefined;\n if (this.match(\"AVAILABLE\")) {\n this.consume(\"WHEN\", \"Expected 'when' after 'available'\");\n available = this.parseExpression();\n }\n\n this.consume(\"LBRACE\", \"Expected '{' to start action body\");\n\n const body: GuardedStmtNode[] = [];\n while (!this.check(\"RBRACE\") && !this.isAtEnd()) {\n const stmt = this.parseGuardedStmt();\n if (stmt) body.push(stmt);\n }\n\n const end = this.consume(\"RBRACE\", \"Expected '}' to close action\").location;\n\n return {\n kind: \"action\",\n name,\n params,\n available,\n body,\n location: mergeLocations(start, end),\n };\n }\n\n private parseParam(): ParamNode {\n const nameToken = this.consume(\"IDENTIFIER\", \"Expected parameter name\");\n this.consume(\"COLON\", \"Expected ':' after parameter name\");\n const typeExpr = this.parseTypeExpr();\n\n return {\n kind: \"param\",\n name: nameToken.lexeme,\n typeExpr,\n location: mergeLocations(nameToken.location, typeExpr.location),\n };\n }\n\n // ============ Statements ============\n\n private parseGuardedStmt(): GuardedStmtNode | null {\n if (this.check(\"WHEN\")) return this.parseWhenStmt();\n if (this.check(\"ONCE\")) return this.parseOnceStmt();\n if (this.isOnceIntentContext()) return this.parseOnceIntentStmt();\n\n // Detect common mistake: patch/effect/fail/stop without when block\n const token = this.peek();\n if (token.kind === \"PATCH\" || token.lexeme === \"patch\" ||\n token.kind === \"EFFECT\" || token.lexeme === \"effect\" ||\n token.kind === \"FAIL\" || token.lexeme === \"fail\" ||\n token.kind === \"STOP\" || token.lexeme === \"stop\") {\n this.error(\n `'${token.lexeme}' must be inside a guard block (when, once, or onceIntent). ` +\n `Wrap it: when true { ${token.lexeme} ... }`\n );\n // Skip to end of statement or next guard keyword to prevent error cascade\n this.skipToRecoveryPoint();\n return null;\n }\n\n this.error(`Unexpected token '${token.lexeme}'. Expected 'when', 'once', or 'onceIntent'.`);\n this.advance();\n return null;\n }\n\n /**\n * Skip tokens until we reach a recovery point (closing brace, guard keyword, or EOF).\n */\n private skipToRecoveryPoint(): void {\n let braceDepth = 0;\n while (!this.isAtEnd()) {\n const t = this.peek();\n if (t.kind === \"LBRACE\") { braceDepth++; this.advance(); continue; }\n if (t.kind === \"RBRACE\") {\n if (braceDepth === 0) return; // Don't consume the closing brace\n braceDepth--;\n this.advance();\n continue;\n }\n // Stop before guard keywords at depth 0 (next valid statement)\n if (braceDepth === 0 && (t.kind === \"WHEN\" || t.kind === \"ONCE\" || t.lexeme === \"onceIntent\")) {\n return;\n }\n this.advance();\n }\n }\n\n private parseWhenStmt(): WhenStmtNode {\n const start = this.consume(\"WHEN\", \"Expected 'when'\").location;\n const condition = this.parseExpression();\n this.consume(\"LBRACE\", \"Expected '{' after when condition\");\n\n const body: InnerStmtNode[] = [];\n while (!this.check(\"RBRACE\") && !this.isAtEnd()) {\n const stmt = this.parseInnerStmt();\n if (stmt) body.push(stmt);\n }\n\n const end = this.consume(\"RBRACE\", \"Expected '}' to close when block\").location;\n\n return {\n kind: \"when\",\n condition,\n body,\n location: mergeLocations(start, end),\n };\n }\n\n private parseOnceStmt(): OnceStmtNode {\n const start = this.consume(\"ONCE\", \"Expected 'once'\").location;\n this.consume(\"LPAREN\", \"Expected '(' after 'once'\");\n const marker = this.parsePath();\n this.consume(\"RPAREN\", \"Expected ')' after marker\");\n\n let condition: ExprNode | undefined;\n if (this.match(\"WHEN\")) {\n condition = this.parseExpression();\n }\n\n this.consume(\"LBRACE\", \"Expected '{' to start once block\");\n\n const body: InnerStmtNode[] = [];\n while (!this.check(\"RBRACE\") && !this.isAtEnd()) {\n const stmt = this.parseInnerStmt();\n if (stmt) body.push(stmt);\n }\n\n const end = this.consume(\"RBRACE\", \"Expected '}' to close once block\").location;\n\n return {\n kind: \"once\",\n marker,\n condition,\n body,\n location: mergeLocations(start, end),\n };\n }\n\n private parseOnceIntentStmt(): OnceIntentStmtNode {\n const startToken = this.consume(\"IDENTIFIER\", \"Expected 'onceIntent'\");\n\n let condition: ExprNode | undefined;\n if (this.match(\"WHEN\")) {\n condition = this.parseExpression();\n }\n\n this.consume(\"LBRACE\", \"Expected '{' to start onceIntent block\");\n\n const body: InnerStmtNode[] = [];\n while (!this.check(\"RBRACE\") && !this.isAtEnd()) {\n const stmt = this.parseInnerStmt();\n if (stmt) body.push(stmt);\n }\n\n const end = this.consume(\"RBRACE\", \"Expected '}' to close onceIntent block\").location;\n\n return {\n kind: \"onceIntent\",\n condition,\n body,\n location: mergeLocations(startToken.location, end),\n };\n }\n\n private parseInnerStmt(): InnerStmtNode | null {\n if (this.check(\"PATCH\")) return this.parsePatchStmt();\n if (this.check(\"EFFECT\")) return this.parseEffectStmt();\n if (this.check(\"WHEN\")) return this.parseWhenStmt();\n if (this.check(\"ONCE\")) return this.parseOnceStmt();\n if (this.isOnceIntentContext()) return this.parseOnceIntentStmt();\n if (this.check(\"FAIL\")) return this.parseFailStmt(); // v0.3.2\n if (this.check(\"STOP\")) return this.parseStopStmt(); // v0.3.2\n\n this.error(`Unexpected token '${this.peek().lexeme}'. Expected 'patch', 'effect', 'when', 'once', 'onceIntent', 'fail', or 'stop'.`);\n this.advance();\n return null;\n }\n\n private parsePatchStmt(): PatchStmtNode {\n const start = this.consume(\"PATCH\", \"Expected 'patch'\").location;\n const path = this.parsePath();\n\n let op: \"set\" | \"unset\" | \"merge\";\n let value: ExprNode | undefined;\n let end: SourceLocation;\n\n if (this.match(\"UNSET\")) {\n op = \"unset\";\n end = this.previous().location;\n } else if (this.match(\"MERGE\")) {\n op = \"merge\";\n value = this.parseExpression();\n end = value.location;\n } else {\n this.consume(\"EQ\", \"Expected '=', 'unset', or 'merge' after path\");\n op = \"set\";\n value = this.parseExpression();\n end = value.location;\n }\n\n return {\n kind: \"patch\",\n path,\n op,\n value,\n location: mergeLocations(start, end),\n };\n }\n\n private parseEffectStmt(): EffectStmtNode {\n const start = this.consume(\"EFFECT\", \"Expected 'effect'\").location;\n\n // Effect type: identifier.identifier...\n let effectType = this.consume(\"IDENTIFIER\", \"Expected effect type\").lexeme;\n while (this.match(\"DOT\")) {\n effectType += \".\" + this.consume(\"IDENTIFIER\", \"Expected identifier after '.'\").lexeme;\n }\n\n this.consume(\"LPAREN\", \"Expected '(' after effect type\");\n this.consume(\"LBRACE\", \"Expected '{' for effect arguments\");\n\n const args: EffectArgNode[] = [];\n while (!this.check(\"RBRACE\") && !this.isAtEnd()) {\n args.push(this.parseEffectArg());\n this.match(\"COMMA\"); // Optional trailing comma\n }\n\n this.consume(\"RBRACE\", \"Expected '}' after effect arguments\");\n const end = this.consume(\"RPAREN\", \"Expected ')' to close effect\").location;\n\n return {\n kind: \"effect\",\n effectType,\n args,\n location: mergeLocations(start, end),\n };\n }\n\n private parseEffectArg(): EffectArgNode {\n const nameToken = this.match(\"IDENTIFIER\", \"FAIL\")\n ? this.previous()\n : this.consume(\"IDENTIFIER\", \"Expected argument name\");\n this.consume(\"COLON\", \"Expected ':' after argument name\");\n\n // 'into', 'pass', 'fail' are path arguments\n const isPath = [\"into\", \"pass\", \"fail\"].includes(nameToken.lexeme);\n const value = isPath ? this.parsePath() : this.parseExpression();\n\n return {\n kind: \"effectArg\",\n name: nameToken.lexeme,\n value,\n isPath,\n location: mergeLocations(nameToken.location, value.location),\n };\n }\n\n /**\n * v0.3.2: Parse fail statement\n * FailStmt ::= 'fail' StringLiteral ('with' Expr)?\n */\n private parseFailStmt(): FailStmtNode {\n const start = this.consume(\"FAIL\", \"Expected 'fail'\").location;\n const codeToken = this.consume(\"STRING\", \"Expected error code string after 'fail'\");\n const code = codeToken.value as string;\n\n let message: ExprNode | undefined;\n let end = codeToken.location;\n\n if (this.match(\"WITH\")) {\n message = this.parseExpression();\n end = message.location;\n }\n\n return {\n kind: \"fail\",\n code,\n message,\n location: mergeLocations(start, end),\n };\n }\n\n /**\n * v0.3.2: Parse stop statement\n * StopStmt ::= 'stop' StringLiteral\n */\n private parseStopStmt(): StopStmtNode {\n const start = this.consume(\"STOP\", \"Expected 'stop'\").location;\n const reasonToken = this.consume(\"STRING\", \"Expected reason string after 'stop'\");\n const reason = reasonToken.value as string;\n\n return {\n kind: \"stop\",\n reason,\n location: mergeLocations(start, reasonToken.location),\n };\n }\n\n // ============ Types ============\n\n private parseTypeExpr(): TypeExprNode {\n let type = this.parseBaseType();\n\n // Union type: T | U | V\n if (this.check(\"PIPE\")) {\n const types: TypeExprNode[] = [type];\n while (this.match(\"PIPE\")) {\n types.push(this.parseBaseType());\n }\n type = {\n kind: \"unionType\",\n types,\n location: mergeLocations(types[0].location, types[types.length - 1].location),\n };\n }\n\n return type;\n }\n\n private parseBaseType(): TypeExprNode {\n // v0.3.3: Object type: { field: Type, ... }\n if (this.check(\"LBRACE\")) {\n return this.parseObjectType();\n }\n\n // Literal types: \"string\" | 42 | true\n if (this.check(\"STRING\")) {\n const token = this.advance();\n return {\n kind: \"literalType\",\n value: token.value as string,\n location: token.location,\n };\n }\n if (this.check(\"NUMBER\")) {\n const token = this.advance();\n return {\n kind: \"literalType\",\n value: token.value as number,\n location: token.location,\n };\n }\n if (this.check(\"TRUE\") || this.check(\"FALSE\")) {\n const token = this.advance();\n return {\n kind: \"literalType\",\n value: token.kind === \"TRUE\",\n location: token.location,\n };\n }\n if (this.check(\"NULL\")) {\n const token = this.advance();\n return {\n kind: \"literalType\",\n value: null,\n location: token.location,\n };\n }\n\n // Named type: Array<T>, Record<K, V>, or simple type\n const nameToken = this.consume(\"IDENTIFIER\", \"Expected type name\");\n\n if (this.match(\"LT\")) {\n // Generic type\n if (nameToken.lexeme === \"Array\") {\n const elementType = this.parseTypeExpr();\n const end = this.consume(\"GT\", \"Expected '>' after array element type\").location;\n return {\n kind: \"arrayType\",\n elementType,\n location: mergeLocations(nameToken.location, end),\n };\n } else if (nameToken.lexeme === \"Record\") {\n const keyType = this.parseTypeExpr();\n this.consume(\"COMMA\", \"Expected ',' between Record type parameters\");\n const valueType = this.parseTypeExpr();\n const end = this.consume(\"GT\", \"Expected '>' after Record value type\").location;\n return {\n kind: \"recordType\",\n keyType,\n valueType,\n location: mergeLocations(nameToken.location, end),\n };\n } else {\n this.error(`Unknown generic type '${nameToken.lexeme}'`);\n // Consume until >\n while (!this.check(\"GT\") && !this.isAtEnd()) this.advance();\n this.match(\"GT\");\n }\n }\n\n return {\n kind: \"simpleType\",\n name: nameToken.lexeme,\n location: nameToken.location,\n };\n }\n\n /**\n * v0.3.3: Parse object type\n * Syntax: { field: Type, field?: Type, ... }\n */\n private parseObjectType(): ObjectTypeNode {\n const start = this.consume(\"LBRACE\", \"Expected '{'\").location;\n const fields: TypeFieldNode[] = [];\n\n while (!this.check(\"RBRACE\") && !this.isAtEnd()) {\n const nameToken = this.consume(\"IDENTIFIER\", \"Expected field name\");\n const optional = this.match(\"QUESTION\");\n this.consume(\"COLON\", \"Expected ':' after field name\");\n const typeExpr = this.parseTypeExpr();\n\n fields.push({\n kind: \"typeField\",\n name: nameToken.lexeme,\n typeExpr,\n optional,\n location: mergeLocations(nameToken.location, typeExpr.location),\n });\n\n // Optional comma between fields\n this.match(\"COMMA\");\n }\n\n const end = this.consume(\"RBRACE\", \"Expected '}' to close object type\").location;\n\n return {\n kind: \"objectType\",\n fields,\n location: mergeLocations(start, end),\n };\n }\n\n // ============ Expressions (Pratt Parser) ============\n\n private parseExpression(minPrecedence: Precedence = Precedence.NONE): ExprNode {\n let left = this.parsePrimary();\n\n while (true) {\n const precedence = getBinaryPrecedence(this.peek().kind);\n if (precedence <= minPrecedence) break;\n\n // Handle ternary specially\n if (this.peek().kind === \"QUESTION\") {\n left = this.parseTernary(left);\n continue;\n }\n\n const op = tokenToBinaryOp(this.peek().kind);\n if (!op) break;\n\n this.advance(); // Consume operator\n const nextPrecedence = isRightAssociative(this.previous().kind)\n ? precedence - 1\n : precedence;\n const right = this.parseExpression(nextPrecedence);\n\n left = {\n kind: \"binary\",\n operator: op,\n left,\n right,\n location: mergeLocations(left.location, right.location),\n };\n }\n\n return left;\n }\n\n private parseTernary(condition: ExprNode): ExprNode {\n this.consume(\"QUESTION\", \"Expected '?'\");\n const consequent = this.parseExpression();\n this.consume(\"COLON\", \"Expected ':' in ternary expression\");\n const alternate = this.parseExpression(Precedence.TERNARY - 1);\n\n return {\n kind: \"ternary\",\n condition,\n consequent,\n alternate,\n location: mergeLocations(condition.location, alternate.location),\n };\n }\n\n private parsePrimary(): ExprNode {\n // Unary operators\n if (this.check(\"BANG\") || (this.check(\"MINUS\") && this.isUnaryContext())) {\n const op = this.advance();\n const operand = this.parsePrimary();\n return {\n kind: \"unary\",\n operator: op.kind === \"BANG\" ? \"!\" : \"-\",\n operand,\n location: mergeLocations(op.location, operand.location),\n };\n }\n\n // Grouping\n if (this.match(\"LPAREN\")) {\n const expr = this.parseExpression();\n this.consume(\"RPAREN\", \"Expected ')' after expression\");\n return expr;\n }\n\n // Object literal\n if (this.check(\"LBRACE\")) {\n return this.parseObjectLiteral();\n }\n\n // Array literal\n if (this.check(\"LBRACKET\")) {\n return this.parseArrayLiteral();\n }\n\n // Literals\n if (this.check(\"NUMBER\")) {\n const token = this.advance();\n return {\n kind: \"literal\",\n value: token.value,\n literalType: \"number\",\n location: token.location,\n };\n }\n\n if (this.check(\"STRING\")) {\n const token = this.advance();\n return {\n kind: \"literal\",\n value: token.value,\n literalType: \"string\",\n location: token.location,\n };\n }\n\n if (this.check(\"TRUE\") || this.check(\"FALSE\")) {\n const token = this.advance();\n return {\n kind: \"literal\",\n value: token.kind === \"TRUE\",\n literalType: \"boolean\",\n location: token.location,\n };\n }\n\n if (this.check(\"NULL\")) {\n const token = this.advance();\n return {\n kind: \"literal\",\n value: null,\n literalType: \"null\",\n location: token.location,\n };\n }\n\n // System identifiers\n if (this.check(\"SYSTEM_IDENT\")) {\n const token = this.advance();\n // Parse $system.uuid → [\"system\", \"uuid\"]\n const path = token.lexeme.slice(1).split(\".\");\n return this.parsePostfix({\n kind: \"systemIdent\",\n path,\n location: token.location,\n });\n }\n\n // v0.3.2: $acc removed - reduce pattern deprecated\n if (this.check(\"ITEM\")) {\n const token = this.advance();\n return this.parsePostfix({\n kind: \"iterationVar\",\n name: \"item\",\n location: token.location,\n });\n }\n\n // Keywords that can also be expression function calls (e.g., merge(...))\n if (this.check(\"MERGE\") && this.peekNext()?.kind === \"LPAREN\") {\n const token = this.advance();\n return this.parseFunctionCall(token);\n }\n\n // Identifier or function call\n if (this.check(\"IDENTIFIER\")) {\n const token = this.advance();\n\n // Function call\n if (this.check(\"LPAREN\")) {\n return this.parseFunctionCall(token);\n }\n\n // Plain identifier\n return this.parsePostfix({\n kind: \"identifier\",\n name: token.lexeme,\n location: token.location,\n });\n }\n\n this.error(`Unexpected token '${this.peek().lexeme}'`);\n return {\n kind: \"literal\",\n value: null,\n literalType: \"null\",\n location: this.peek().location,\n };\n }\n\n private parseFunctionCall(nameToken: Token): ExprNode {\n this.consume(\"LPAREN\", \"Expected '(' for function call\");\n\n const args: ExprNode[] = [];\n if (!this.check(\"RPAREN\")) {\n do {\n args.push(this.parseExpression());\n } while (this.match(\"COMMA\"));\n }\n\n const end = this.consume(\"RPAREN\", \"Expected ')' after arguments\").location;\n\n return this.parsePostfix({\n kind: \"functionCall\",\n name: nameToken.lexeme,\n args,\n location: mergeLocations(nameToken.location, end),\n });\n }\n\n private parsePostfix(expr: ExprNode): ExprNode {\n while (true) {\n if (this.match(\"DOT\")) {\n const prop = this.consume(\"IDENTIFIER\", \"Expected property name after '.'\");\n expr = {\n kind: \"propertyAccess\",\n object: expr,\n property: prop.lexeme,\n location: mergeLocations(expr.location, prop.location),\n };\n } else if (this.match(\"LBRACKET\")) {\n const index = this.parseExpression();\n const end = this.consume(\"RBRACKET\", \"Expected ']' after index\").location;\n expr = {\n kind: \"indexAccess\",\n object: expr,\n index,\n location: mergeLocations(expr.location, end),\n };\n } else {\n break;\n }\n }\n return expr;\n }\n\n private parseObjectLiteral(): ExprNode {\n const start = this.consume(\"LBRACE\", \"Expected '{'\").location;\n const properties: ObjectPropertyNode[] = [];\n\n while (!this.check(\"RBRACE\") && !this.isAtEnd()) {\n const keyToken = this.consume(\"IDENTIFIER\", \"Expected property name\");\n this.consume(\"COLON\", \"Expected ':' after property name\");\n const value = this.parseExpression();\n\n properties.push({\n kind: \"objectProperty\",\n key: keyToken.lexeme,\n value,\n location: mergeLocations(keyToken.location, value.location),\n });\n\n if (!this.check(\"RBRACE\")) {\n this.consume(\"COMMA\", \"Expected ',' between properties\");\n }\n }\n\n const end = this.consume(\"RBRACE\", \"Expected '}' to close object\").location;\n\n return {\n kind: \"objectLiteral\",\n properties,\n location: mergeLocations(start, end),\n };\n }\n\n private parseArrayLiteral(): ExprNode {\n const start = this.consume(\"LBRACKET\", \"Expected '['\").location;\n const elements: ExprNode[] = [];\n\n while (!this.check(\"RBRACKET\") && !this.isAtEnd()) {\n elements.push(this.parseExpression());\n if (!this.check(\"RBRACKET\")) {\n this.consume(\"COMMA\", \"Expected ',' between elements\");\n }\n }\n\n const end = this.consume(\"RBRACKET\", \"Expected ']' to close array\").location;\n\n return {\n kind: \"arrayLiteral\",\n elements,\n location: mergeLocations(start, end),\n };\n }\n\n // ============ Path ============\n\n private parsePath(): PathNode {\n const segments: PathSegmentNode[] = [];\n const start = this.peek().location;\n\n // First segment must be identifier\n const first = this.consume(\"IDENTIFIER\", \"Expected identifier\");\n segments.push({\n kind: \"propertySegment\",\n name: first.lexeme,\n location: first.location,\n });\n\n // Subsequent segments: .prop or [index]\n while (true) {\n if (this.match(\"DOT\")) {\n const prop = this.consume(\"IDENTIFIER\", \"Expected property name\");\n segments.push({\n kind: \"propertySegment\",\n name: prop.lexeme,\n location: prop.location,\n });\n } else if (this.match(\"LBRACKET\")) {\n const index = this.parseExpression();\n const end = this.consume(\"RBRACKET\", \"Expected ']'\").location;\n segments.push({\n kind: \"indexSegment\",\n index,\n location: mergeLocations(index.location, end),\n });\n } else {\n break;\n }\n }\n\n const last = segments[segments.length - 1];\n return {\n kind: \"path\",\n segments,\n location: mergeLocations(start, last.location),\n };\n }\n\n // ============ Helpers ============\n\n private isUnaryContext(): boolean {\n // Minus is unary at start of expression or after operators\n if (this.current === 0) return true;\n const prev = this.previous();\n const unaryPrecedingTokens: TokenKind[] = [\n \"LPAREN\", \"LBRACKET\", \"LBRACE\", \"COMMA\", \"COLON\", \"EQ\",\n \"PLUS\", \"MINUS\", \"STAR\", \"SLASH\", \"PERCENT\",\n \"EQ_EQ\", \"BANG_EQ\", \"LT\", \"LT_EQ\", \"GT\", \"GT_EQ\",\n \"AMP_AMP\", \"PIPE_PIPE\", \"BANG\", \"QUESTION\", \"QUESTION_QUESTION\",\n ];\n return unaryPrecedingTokens.includes(prev.kind);\n }\n\n private peek(): Token {\n return this.tokens[this.current];\n }\n\n private peekNext(): Token {\n if (this.current + 1 >= this.tokens.length) {\n return this.tokens[this.tokens.length - 1];\n }\n return this.tokens[this.current + 1];\n }\n\n private previous(): Token {\n return this.tokens[this.current - 1];\n }\n\n private isAtEnd(): boolean {\n return this.peek().kind === \"EOF\";\n }\n\n private advance(): Token {\n if (!this.isAtEnd()) this.current++;\n return this.previous();\n }\n\n private check(kind: TokenKind): boolean {\n if (this.isAtEnd()) return false;\n return this.peek().kind === kind;\n }\n\n private isOnceIntentContext(): boolean {\n if (!this.check(\"IDENTIFIER\")) return false;\n const token = this.peek();\n if (token.lexeme !== \"onceIntent\") return false;\n const next = this.peekNext();\n return next.kind === \"LBRACE\" || next.kind === \"WHEN\";\n }\n\n private match(...kinds: TokenKind[]): boolean {\n for (const kind of kinds) {\n if (this.check(kind)) {\n this.advance();\n return true;\n }\n }\n return false;\n }\n\n private consume(kind: TokenKind, message: string): Token {\n if (this.check(kind)) return this.advance();\n throw this.errorAtCurrent(message);\n }\n\n private error(message: string): void {\n this.diagnostics.push({\n severity: \"error\",\n code: \"MEL_PARSER\",\n message,\n location: this.previous().location,\n });\n }\n\n private errorAtCurrent(message: string): Error {\n this.diagnostics.push({\n severity: \"error\",\n code: \"MEL_PARSER\",\n message,\n location: this.peek().location,\n });\n return new Error(message);\n }\n}\n\n/**\n * Parse tokens into an AST\n */\nexport function parse(tokens: Token[]): ParseResult {\n const parser = new Parser(tokens);\n return parser.parse();\n}\n","/**\n * Scope Analysis for MEL\n * Tracks variable scopes and resolves identifiers\n * Based on MEL SPEC v0.3.1 Section 4.10\n */\n\nimport type {\n ProgramNode,\n DomainNode,\n StateFieldNode,\n ComputedNode,\n ActionNode,\n ParamNode,\n ExprNode,\n GuardedStmtNode,\n InnerStmtNode,\n} from \"../parser/ast.js\";\nimport type { Diagnostic } from \"../diagnostics/types.js\";\nimport type { SourceLocation } from \"../lexer/source-location.js\";\n\n// ============ Scope Types ============\n\n/**\n * Symbol kinds\n */\nexport type SymbolKind = \"state\" | \"computed\" | \"param\" | \"action\" | \"iteration\";\n\n/**\n * Symbol information\n */\nexport interface Symbol {\n name: string;\n kind: SymbolKind;\n location: SourceLocation;\n type?: string; // Optional type information\n}\n\n/**\n * Scope represents a lexical scope\n */\nexport class Scope {\n readonly parent: Scope | null;\n readonly symbols: Map<string, Symbol> = new Map();\n readonly kind: \"domain\" | \"action\" | \"guard\";\n\n constructor(kind: \"domain\" | \"action\" | \"guard\", parent: Scope | null = null) {\n this.kind = kind;\n this.parent = parent;\n }\n\n /**\n * Define a new symbol in this scope\n */\n define(symbol: Symbol): void {\n this.symbols.set(symbol.name, symbol);\n }\n\n /**\n * Look up a symbol, searching parent scopes if not found\n */\n lookup(name: string): Symbol | undefined {\n const symbol = this.symbols.get(name);\n if (symbol) return symbol;\n return this.parent?.lookup(name);\n }\n\n /**\n * Check if a symbol is defined in this scope (not parent scopes)\n */\n isDefined(name: string): boolean {\n return this.symbols.has(name);\n }\n}\n\n// ============ Scope Analyzer ============\n\n/**\n * Result of scope analysis\n */\nexport interface ScopeAnalysisResult {\n scopes: Map<string, Scope>; // Maps scope path to scope\n diagnostics: Diagnostic[];\n}\n\n/**\n * Scope Analyzer - builds scope tree and checks for errors\n */\nexport class ScopeAnalyzer {\n private diagnostics: Diagnostic[] = [];\n private scopes: Map<string, Scope> = new Map();\n private currentScope: Scope | null = null;\n private domainScope: Scope | null = null;\n\n /**\n * Analyze a MEL program\n */\n analyze(program: ProgramNode): ScopeAnalysisResult {\n this.diagnostics = [];\n this.scopes = new Map();\n this.currentScope = null;\n this.domainScope = null;\n\n this.analyzeDomain(program.domain);\n\n return {\n scopes: this.scopes,\n diagnostics: this.diagnostics,\n };\n }\n\n private analyzeDomain(domain: DomainNode): void {\n // Create domain scope\n const scope = new Scope(\"domain\");\n this.domainScope = scope;\n this.currentScope = scope;\n this.scopes.set(\"domain\", scope);\n\n // First pass: collect all state and computed names\n for (const member of domain.members) {\n if (member.kind === \"state\") {\n for (const field of member.fields) {\n this.defineSymbol({\n name: field.name,\n kind: \"state\",\n location: field.location,\n });\n }\n } else if (member.kind === \"computed\") {\n this.defineSymbol({\n name: member.name,\n kind: \"computed\",\n location: member.location,\n });\n } else if (member.kind === \"action\") {\n this.defineSymbol({\n name: member.name,\n kind: \"action\",\n location: member.location,\n });\n }\n }\n\n // Second pass: analyze expressions and bodies\n for (const member of domain.members) {\n if (member.kind === \"computed\") {\n this.analyzeComputedExpr(member);\n } else if (member.kind === \"action\") {\n this.analyzeAction(member);\n }\n }\n }\n\n private analyzeComputedExpr(computed: ComputedNode): void {\n // Computed expressions have access to state and other computed values\n this.analyzeExpr(computed.expression, \"computed\");\n }\n\n private analyzeAction(action: ActionNode): void {\n // Create action scope with params\n const scope = new Scope(\"action\", this.domainScope);\n this.currentScope = scope;\n this.scopes.set(`action.${action.name}`, scope);\n\n // Define parameters\n for (const param of action.params) {\n scope.define({\n name: param.name,\n kind: \"param\",\n location: param.location,\n });\n }\n\n // Analyze body\n for (const stmt of action.body) {\n this.analyzeStmt(stmt);\n }\n\n this.currentScope = this.domainScope;\n }\n\n private analyzeStmt(stmt: GuardedStmtNode | InnerStmtNode): void {\n switch (stmt.kind) {\n case \"when\":\n this.analyzeExpr(stmt.condition, \"action\");\n for (const inner of stmt.body) {\n this.analyzeStmt(inner);\n }\n break;\n\n case \"onceIntent\":\n if (stmt.condition) {\n this.analyzeExpr(stmt.condition, \"action\");\n }\n for (const inner of stmt.body) {\n this.analyzeStmt(inner);\n }\n break;\n\n case \"once\":\n // Marker is a path, need to validate\n this.validatePath(stmt.marker);\n if (stmt.condition) {\n this.analyzeExpr(stmt.condition, \"action\");\n }\n for (const inner of stmt.body) {\n this.analyzeStmt(inner);\n }\n break;\n\n case \"patch\":\n this.validatePath(stmt.path);\n if (stmt.value) {\n this.analyzeExpr(stmt.value, \"action\");\n }\n break;\n\n case \"effect\":\n for (const arg of stmt.args) {\n if (arg.isPath) {\n this.validatePath(arg.value as any);\n } else {\n this.analyzeExpr(arg.value as ExprNode, \"action\");\n }\n }\n break;\n }\n }\n\n private analyzeExpr(expr: ExprNode, context: \"computed\" | \"action\"): void {\n switch (expr.kind) {\n case \"identifier\":\n this.checkIdentifier(expr.name, expr.location, context);\n break;\n\n case \"systemIdent\":\n this.checkSystemIdent(expr.path, expr.location, context);\n break;\n\n case \"propertyAccess\":\n this.analyzeExpr(expr.object, context);\n break;\n\n case \"indexAccess\":\n this.analyzeExpr(expr.object, context);\n this.analyzeExpr(expr.index, context);\n break;\n\n case \"functionCall\":\n for (const arg of expr.args) {\n this.analyzeExpr(arg, context);\n }\n break;\n\n case \"binary\":\n this.analyzeExpr(expr.left, context);\n this.analyzeExpr(expr.right, context);\n break;\n\n case \"unary\":\n this.analyzeExpr(expr.operand, context);\n break;\n\n case \"ternary\":\n this.analyzeExpr(expr.condition, context);\n this.analyzeExpr(expr.consequent, context);\n this.analyzeExpr(expr.alternate, context);\n break;\n\n case \"objectLiteral\":\n for (const prop of expr.properties) {\n this.analyzeExpr(prop.value, context);\n }\n break;\n\n case \"arrayLiteral\":\n for (const elem of expr.elements) {\n this.analyzeExpr(elem, context);\n }\n break;\n\n case \"iterationVar\":\n // v0.3.2: $item only (reduce pattern deprecated, $acc removed)\n // $item is valid in filter/map predicates\n // For now, we don't validate the context\n break;\n\n case \"literal\":\n // Nothing to check\n break;\n }\n }\n\n private checkIdentifier(name: string, location: SourceLocation, context: \"computed\" | \"action\"): void {\n const symbol = this.currentScope?.lookup(name);\n\n if (!symbol) {\n this.error(`Undefined identifier '${name}'`, location, \"E_UNDEFINED\");\n return;\n }\n\n // Check access rules\n if (context === \"computed\") {\n // Computed can only access state and other computed values\n if (symbol.kind === \"param\") {\n this.error(\n `Cannot access parameter '${name}' in computed expression`,\n location,\n \"E_INVALID_ACCESS\"\n );\n }\n }\n }\n\n private checkSystemIdent(path: string[], location: SourceLocation, context: \"computed\" | \"action\"): void {\n const [namespace, ...rest] = path;\n\n // E001: $system.* in computed\n if (namespace === \"system\" && context === \"computed\") {\n this.error(\n `Cannot use $system.* in computed expressions (non-deterministic)`,\n location,\n \"E001\"\n );\n }\n\n // E003: Invalid $system reference\n if (namespace === \"system\") {\n const validKeys = [\"uuid\", \"timestamp\", \"time.now\", \"random\"];\n const key = rest.join(\".\");\n if (key && !validKeys.includes(key)) {\n this.error(\n `Invalid system value '$system.${key}'. Valid values: ${validKeys.join(\", \")}`,\n location,\n \"E003\"\n );\n }\n }\n\n // E003: Invalid $meta reference\n if (namespace === \"meta\") {\n const validKeys = [\"intentId\", \"actionName\", \"timestamp\"];\n const key = rest.join(\".\");\n if (key && !validKeys.includes(key)) {\n this.error(\n `Invalid meta value '$meta.${key}'. Valid values: ${validKeys.join(\", \")}`,\n location,\n \"E003\"\n );\n }\n }\n }\n\n private validatePath(path: any): void {\n if (!path || !path.segments) return;\n\n // Check first segment is a valid identifier\n const first = path.segments[0];\n if (first?.kind === \"propertySegment\") {\n const symbol = this.currentScope?.lookup(first.name);\n if (!symbol) {\n this.error(\n `Undefined identifier '${first.name}' in path`,\n path.location,\n \"E_UNDEFINED\"\n );\n }\n }\n }\n\n private defineSymbol(symbol: Symbol): void {\n if (!this.currentScope) return;\n\n if (this.currentScope.isDefined(symbol.name)) {\n this.error(\n `Duplicate identifier '${symbol.name}'`,\n symbol.location,\n \"E_DUPLICATE\"\n );\n return;\n }\n\n this.currentScope.define(symbol);\n }\n\n private error(message: string, location: SourceLocation, code: string): void {\n this.diagnostics.push({\n severity: \"error\",\n code,\n message,\n location,\n });\n }\n}\n\n/**\n * Analyze a MEL program for scope issues\n */\nexport function analyzeScope(program: ProgramNode): ScopeAnalysisResult {\n const analyzer = new ScopeAnalyzer();\n return analyzer.analyze(program);\n}\n","/**\n * Diagnostic Types for MEL Compiler\n * Error and warning reporting structures\n */\n\nimport type { SourceLocation } from \"../lexer/source-location.js\";\n\n/**\n * Severity level of a diagnostic\n */\nexport type DiagnosticSeverity = \"error\" | \"warning\" | \"info\";\n\n/**\n * A diagnostic message (error, warning, or info)\n */\nexport interface Diagnostic {\n /** Severity level */\n severity: DiagnosticSeverity;\n /** Error code (e.g., \"MEL001\", \"MEL_LEXER\") */\n code: string;\n /** Human-readable message */\n message: string;\n /** Location in source */\n location: SourceLocation;\n /** The source line containing the error */\n source?: string;\n /** Suggested fix */\n suggestion?: string;\n /** Related diagnostics */\n related?: RelatedDiagnostic[];\n}\n\n/**\n * A related diagnostic (for multi-location errors)\n */\nexport interface RelatedDiagnostic {\n message: string;\n location: SourceLocation;\n}\n\n/**\n * Create an error diagnostic\n */\nexport function createError(\n code: string,\n message: string,\n location: SourceLocation,\n options?: {\n source?: string;\n suggestion?: string;\n related?: RelatedDiagnostic[];\n }\n): Diagnostic {\n return {\n severity: \"error\",\n code,\n message,\n location,\n ...options,\n };\n}\n\n/**\n * Create a warning diagnostic\n */\nexport function createWarning(\n code: string,\n message: string,\n location: SourceLocation,\n options?: {\n source?: string;\n suggestion?: string;\n }\n): Diagnostic {\n return {\n severity: \"warning\",\n code,\n message,\n location,\n ...options,\n };\n}\n\n/**\n * Create an info diagnostic\n */\nexport function createInfo(\n code: string,\n message: string,\n location: SourceLocation\n): Diagnostic {\n return {\n severity: \"info\",\n code,\n message,\n location,\n };\n}\n\n/**\n * Check if a diagnostic is an error\n */\nexport function isError(diagnostic: Diagnostic): boolean {\n return diagnostic.severity === \"error\";\n}\n\n/**\n * Check if any diagnostics contain errors\n */\nexport function hasErrors(diagnostics: Diagnostic[]): boolean {\n return diagnostics.some(isError);\n}\n\n/**\n * Filter diagnostics by severity\n */\nexport function filterBySeverity(\n diagnostics: Diagnostic[],\n severity: DiagnosticSeverity\n): Diagnostic[] {\n return diagnostics.filter((d) => d.severity === severity);\n}\n","/**\n * Semantic Validator for MEL\n * Validates semantic rules beyond syntax\n * Based on MEL SPEC v0.3.3 and FDR-MEL-*\n */\n\nimport type {\n ProgramNode,\n DomainNode,\n ActionNode,\n StateNode,\n StateFieldNode,\n ExprNode,\n GuardedStmtNode,\n InnerStmtNode,\n WhenStmtNode,\n OnceStmtNode,\n OnceIntentStmtNode,\n PatchStmtNode,\n EffectStmtNode,\n TypeExprNode,\n} from \"../parser/ast.js\";\nimport type { Diagnostic } from \"../diagnostics/types.js\";\nimport { createWarning } from \"../diagnostics/types.js\";\nimport type { SourceLocation } from \"../lexer/source-location.js\";\n\n// ============ Validation Context ============\n\ninterface ValidationContext {\n inAction: boolean;\n inGuard: boolean;\n guardDepth: number;\n hasMarkerPatch: boolean; // For once() validation\n diagnostics: Diagnostic[];\n}\n\nfunction createContext(): ValidationContext {\n return {\n inAction: false,\n inGuard: false,\n guardDepth: 0,\n hasMarkerPatch: false,\n diagnostics: [],\n };\n}\n\n// ============ Semantic Validator ============\n\n/**\n * Result of semantic validation\n */\nexport interface ValidationResult {\n valid: boolean;\n diagnostics: Diagnostic[];\n}\n\n/**\n * Semantic Validator\n */\nexport class SemanticValidator {\n private ctx: ValidationContext = createContext();\n\n /**\n * Validate a MEL program\n */\n validate(program: ProgramNode): ValidationResult {\n this.ctx = createContext();\n this.validateDomain(program.domain);\n\n return {\n valid: !this.ctx.diagnostics.some(d => d.severity === \"error\"),\n diagnostics: this.ctx.diagnostics,\n };\n }\n\n private validateDomain(domain: DomainNode): void {\n // Validate domain name\n if (domain.name.startsWith(\"__\")) {\n this.error(\n \"Domain name cannot start with '__' (reserved prefix)\",\n domain.location,\n \"E_RESERVED_NAME\"\n );\n }\n\n // Validate members\n for (const member of domain.members) {\n switch (member.kind) {\n case \"state\":\n this.validateState(member);\n break;\n case \"computed\":\n this.validateExpr(member.expression, \"computed\");\n break;\n case \"action\":\n this.validateAction(member);\n break;\n }\n }\n }\n\n /**\n * v0.3.3: Validate state fields for W012 (anonymous object types)\n */\n private validateState(state: StateNode): void {\n const seen = new Map<string, SourceLocation>();\n for (const field of state.fields) {\n const prev = seen.get(field.name);\n if (prev) {\n this.error(\n `Duplicate state field '${field.name}'. First declared at line ${prev.start.line}`,\n field.location,\n \"E_DUPLICATE_FIELD\"\n );\n } else {\n seen.set(field.name, field.location);\n }\n this.validateStateField(field);\n }\n }\n\n /**\n * v0.3.3: Validate state field - check for anonymous object types (W012)\n */\n private validateStateField(field: StateFieldNode): void {\n this.checkAnonymousObjectType(field.typeExpr, field.location);\n }\n\n /**\n * v0.3.3: Check if a type expression contains anonymous object types\n * Issues W012 warning for inline object types in state fields\n */\n private checkAnonymousObjectType(typeExpr: TypeExprNode, fieldLocation: SourceLocation): void {\n switch (typeExpr.kind) {\n case \"objectType\":\n // W012: Anonymous object type in state field\n this.ctx.diagnostics.push(\n createWarning(\n \"W012\",\n \"Anonymous object type in state field. Use a named type declaration instead: type MyType = { ... }\",\n typeExpr.location,\n {\n suggestion: \"Define this type using 'type TypeName = { ... }' and reference it by name\",\n }\n )\n );\n // Also check nested types\n for (const f of typeExpr.fields) {\n this.checkAnonymousObjectType(f.typeExpr, fieldLocation);\n }\n break;\n\n case \"arrayType\":\n this.checkAnonymousObjectType(typeExpr.elementType, fieldLocation);\n break;\n\n case \"recordType\":\n this.checkAnonymousObjectType(typeExpr.keyType, fieldLocation);\n this.checkAnonymousObjectType(typeExpr.valueType, fieldLocation);\n break;\n\n case \"unionType\":\n for (const t of typeExpr.types) {\n this.checkAnonymousObjectType(t, fieldLocation);\n }\n break;\n\n // simpleType and literalType are OK\n }\n }\n\n private validateAction(action: ActionNode): void {\n this.ctx.inAction = true;\n\n // v0.3.3: E005 - available expression must be pure\n if (action.available) {\n this.validateAvailableExpr(action.available);\n }\n\n // FDR-MEL-020: All patch/effect must be inside guards\n // Action body should only contain when/once statements\n for (const stmt of action.body) {\n this.validateGuardedStmt(stmt);\n }\n\n this.ctx.inAction = false;\n }\n\n /**\n * v0.3.3: Validate available expression is pure (E005)\n * No $system.*, no effects, no $input.*\n */\n private validateAvailableExpr(expr: ExprNode): void {\n switch (expr.kind) {\n case \"systemIdent\":\n // E005: $system.* not allowed in available\n if (expr.path[0] === \"system\") {\n this.error(\n \"$system.* cannot be used in available condition (must be pure expression)\",\n expr.location,\n \"E005\"\n );\n }\n // E005: $input.* not allowed in available (no input at availability check)\n if (expr.path[0] === \"input\") {\n this.error(\n \"$input.* cannot be used in available condition (parameters not available at availability check)\",\n expr.location,\n \"E005\"\n );\n }\n break;\n\n case \"functionCall\":\n // Check for effect-like function calls (this is a basic check)\n // In practice, effects are in statements, not expressions\n // Recursively validate arguments\n for (const arg of expr.args) {\n this.validateAvailableExpr(arg);\n }\n break;\n\n case \"binary\":\n this.validateAvailableExpr(expr.left);\n this.validateAvailableExpr(expr.right);\n break;\n\n case \"unary\":\n this.validateAvailableExpr(expr.operand);\n break;\n\n case \"ternary\":\n this.validateAvailableExpr(expr.condition);\n this.validateAvailableExpr(expr.consequent);\n this.validateAvailableExpr(expr.alternate);\n break;\n\n case \"propertyAccess\":\n this.validateAvailableExpr(expr.object);\n break;\n\n case \"indexAccess\":\n this.validateAvailableExpr(expr.object);\n this.validateAvailableExpr(expr.index);\n break;\n\n case \"objectLiteral\":\n for (const prop of expr.properties) {\n this.validateAvailableExpr(prop.value);\n }\n break;\n\n case \"arrayLiteral\":\n for (const elem of expr.elements) {\n this.validateAvailableExpr(elem);\n }\n break;\n\n // literal, identifier, iterationVar are OK\n }\n }\n\n private validateGuardedStmt(stmt: GuardedStmtNode | InnerStmtNode): void {\n switch (stmt.kind) {\n case \"when\":\n this.validateWhen(stmt);\n break;\n case \"once\":\n this.validateOnce(stmt);\n break;\n case \"onceIntent\":\n this.validateOnceIntent(stmt);\n break;\n case \"patch\":\n this.validatePatch(stmt);\n break;\n case \"effect\":\n this.validateEffect(stmt);\n break;\n }\n }\n\n private validateWhen(stmt: WhenStmtNode): void {\n this.ctx.inGuard = true;\n this.ctx.guardDepth++;\n\n // FDR-MEL-025: Condition must be boolean\n this.validateCondition(stmt.condition, \"when\");\n\n for (const inner of stmt.body) {\n this.validateGuardedStmt(inner);\n }\n\n this.ctx.guardDepth--;\n if (this.ctx.guardDepth === 0) {\n this.ctx.inGuard = false;\n }\n }\n\n private validateOnce(stmt: OnceStmtNode): void {\n this.ctx.inGuard = true;\n this.ctx.guardDepth++;\n this.ctx.hasMarkerPatch = false;\n\n // Validate extra condition if present\n if (stmt.condition) {\n this.validateCondition(stmt.condition, \"once\");\n }\n\n // FDR-MEL-044: First statement should be marker patch\n // The compiler auto-inserts this, but we can warn if user adds it manually\n for (const inner of stmt.body) {\n this.validateGuardedStmt(inner);\n }\n\n this.ctx.guardDepth--;\n if (this.ctx.guardDepth === 0) {\n this.ctx.inGuard = false;\n }\n }\n\n private validateOnceIntent(stmt: OnceIntentStmtNode): void {\n this.ctx.inGuard = true;\n this.ctx.guardDepth++;\n\n if (stmt.condition) {\n this.validateCondition(stmt.condition, \"onceIntent\");\n }\n\n for (const inner of stmt.body) {\n this.validateGuardedStmt(inner);\n }\n\n this.ctx.guardDepth--;\n if (this.ctx.guardDepth === 0) {\n this.ctx.inGuard = false;\n }\n }\n\n private validatePatch(stmt: PatchStmtNode): void {\n // Patch must be inside a guard\n if (!this.ctx.inGuard) {\n this.error(\n \"Patch must be inside a guard (when, once, or onceIntent)\",\n stmt.location,\n \"E_UNGUARDED_PATCH\"\n );\n }\n\n // Validate value expression\n if (stmt.value) {\n this.validateExpr(stmt.value, \"action\");\n }\n }\n\n private validateEffect(stmt: EffectStmtNode): void {\n // Effect must be inside a guard\n if (!this.ctx.inGuard) {\n this.error(\n \"Effect must be inside a guard (when, once, or onceIntent)\",\n stmt.location,\n \"E_UNGUARDED_EFFECT\"\n );\n }\n\n // FDR-MEL-018: No nested effects (effects can't contain effects)\n // This is naturally enforced by the parser\n\n // Validate effect arguments\n for (const arg of stmt.args) {\n if (!arg.isPath) {\n this.validateExpr(arg.value as ExprNode, \"action\");\n }\n }\n }\n\n private validateCondition(expr: ExprNode, guardType: \"when\" | \"once\" | \"onceIntent\"): void {\n // FDR-MEL-025: Condition must return boolean\n // We can do basic static analysis for obvious non-boolean expressions\n this.validateExpr(expr, \"action\");\n\n // Warn about literals that aren't boolean\n if (expr.kind === \"literal\" && typeof expr.value !== \"boolean\") {\n this.warn(\n `Condition in ${guardType} is a non-boolean literal. Consider using a boolean expression`,\n expr.location,\n \"W_NON_BOOL_COND\"\n );\n }\n }\n\n private validateExpr(expr: ExprNode, context: \"computed\" | \"action\"): void {\n switch (expr.kind) {\n case \"functionCall\":\n this.validateFunctionCall(expr, context);\n break;\n\n case \"binary\":\n this.validateExpr(expr.left, context);\n this.validateExpr(expr.right, context);\n break;\n\n case \"unary\":\n this.validateExpr(expr.operand, context);\n break;\n\n case \"ternary\":\n this.validateExpr(expr.condition, context);\n this.validateExpr(expr.consequent, context);\n this.validateExpr(expr.alternate, context);\n break;\n\n case \"propertyAccess\":\n this.validateExpr(expr.object, context);\n break;\n\n case \"indexAccess\":\n this.validateExpr(expr.object, context);\n this.validateExpr(expr.index, context);\n break;\n\n case \"objectLiteral\":\n for (const prop of expr.properties) {\n this.validateExpr(prop.value, context);\n }\n break;\n\n case \"arrayLiteral\":\n for (const elem of expr.elements) {\n this.validateExpr(elem, context);\n }\n break;\n\n case \"systemIdent\":\n // E001: $system.* in computed — handled by scope analysis (analyzeScope)\n // No duplicate check here to avoid double-reporting\n break;\n }\n }\n\n private validateFunctionCall(\n expr: { kind: \"functionCall\"; name: string; args: ExprNode[]; location: SourceLocation },\n context: \"computed\" | \"action\"\n ): void {\n const { name, args, location } = expr;\n\n // v0.3.3: E011 - reduce/fold/scan is forbidden\n if ([\"reduce\", \"fold\", \"foldl\", \"foldr\", \"scan\"].includes(name)) {\n this.error(\n `Function '${name}' is forbidden. Use sum(), min(), max() for aggregation instead`,\n location,\n \"E011\"\n );\n }\n\n // v0.3.3: E009/E010 - Primitive aggregation constraints\n // sum(array), min(array), max(array) with single arg = array aggregation\n if ([\"sum\", \"min\", \"max\"].includes(name) && args.length === 1) {\n // E009: Array aggregation only in computed\n if (context === \"action\") {\n this.error(\n `Primitive aggregation '${name}()' can only be used in computed expressions, not in actions`,\n location,\n \"E009\"\n );\n }\n\n // E010: No composition - argument must be simple reference\n const arg = args[0];\n if (arg.kind === \"functionCall\") {\n this.error(\n `Primitive aggregation '${name}()' does not allow composition. Use a direct reference, not '${arg.name}()'`,\n location,\n \"E010\"\n );\n }\n }\n\n // Validate known function signatures\n switch (name) {\n // FDR-MEL-042: eq/neq on primitives only\n case \"eq\":\n case \"neq\":\n // We can't fully type-check at compile time, but we can note the requirement\n break;\n\n // FDR-MEL-026: len() on Array only\n case \"len\":\n // v0.3.3: sum() for array aggregation\n case \"sum\":\n if (args.length !== 1) {\n this.error(\n `Function '${name}' expects 1 argument, got ${args.length}`,\n location,\n \"E_ARG_COUNT\"\n );\n }\n break;\n\n // Binary functions need exactly 2 args\n case \"add\":\n case \"sub\":\n case \"mul\":\n case \"div\":\n case \"mod\":\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n if (args.length !== 2) {\n this.error(\n `Function '${name}' expects 2 arguments, got ${args.length}`,\n location,\n \"E_ARG_COUNT\"\n );\n }\n break;\n\n // Unary functions need exactly 1 arg\n case \"not\":\n case \"neg\":\n case \"abs\":\n case \"floor\":\n case \"ceil\":\n case \"round\":\n case \"sqrt\":\n case \"isNull\":\n case \"isNotNull\":\n case \"trim\":\n case \"lower\":\n case \"upper\":\n case \"strlen\":\n case \"keys\":\n case \"values\":\n case \"entries\":\n case \"first\":\n case \"last\":\n case \"typeof\":\n case \"toString\":\n case \"toNumber\":\n case \"toBoolean\":\n case \"reverse\":\n case \"unique\":\n case \"flat\":\n case \"fromEntries\":\n if (args.length !== 1) {\n this.error(\n `Function '${name}' expects 1 argument, got ${args.length}`,\n location,\n \"E_ARG_COUNT\"\n );\n }\n break;\n\n // Binary functions need exactly 2 args\n case \"pow\":\n case \"filter\":\n case \"map\":\n case \"find\":\n case \"every\":\n case \"some\":\n case \"at\":\n case \"includes\":\n case \"field\":\n case \"hasKey\":\n case \"pick\":\n case \"omit\":\n case \"startsWith\":\n case \"endsWith\":\n case \"strIncludes\":\n case \"indexOf\":\n if (args.length !== 2) {\n this.error(\n `Function '${name}' expects 2 arguments, got ${args.length}`,\n location,\n \"E_ARG_COUNT\"\n );\n }\n break;\n\n // 2-3 arg functions\n case \"slice\":\n case \"substring\":\n case \"substr\":\n case \"replace\":\n if (args.length < 2 || args.length > 3) {\n this.error(\n `Function '${name}' expects 2-3 arguments, got ${args.length}`,\n location,\n \"E_ARG_COUNT\"\n );\n }\n break;\n\n // split(str, delimiter)\n case \"split\":\n if (args.length !== 2) {\n this.error(\n `Function '${name}' expects 2 arguments, got ${args.length}`,\n location,\n \"E_ARG_COUNT\"\n );\n }\n break;\n\n // Variadic functions (at least 1 arg)\n case \"and\":\n case \"or\":\n case \"concat\":\n case \"min\":\n case \"max\":\n case \"merge\":\n case \"coalesce\":\n case \"append\":\n if (args.length < 1) {\n this.error(\n `Function '${name}' expects at least 1 argument`,\n location,\n \"E_ARG_COUNT\"\n );\n }\n break;\n\n // Conditional needs exactly 3 args\n case \"if\":\n case \"cond\":\n if (args.length !== 3) {\n this.error(\n `Function '${name}' expects 3 arguments, got ${args.length}`,\n location,\n \"E_ARG_COUNT\"\n );\n }\n break;\n\n default:\n this.error(\n `Unknown function '${name}'. Check spelling or see MEL builtin function reference`,\n location,\n \"E_UNKNOWN_FN\"\n );\n break;\n }\n\n // Recursively validate arguments\n for (const arg of args) {\n this.validateExpr(arg, context);\n }\n }\n\n private error(message: string, location: SourceLocation, code: string): void {\n this.ctx.diagnostics.push({\n severity: \"error\",\n code,\n message,\n location,\n });\n }\n\n private warn(message: string, location: SourceLocation, code: string): void {\n this.ctx.diagnostics.push({\n severity: \"warning\",\n code,\n message,\n location,\n });\n }\n}\n\n/**\n * Validate a MEL program semantically\n */\nexport function validateSemantics(program: ProgramNode): ValidationResult {\n const validator = new SemanticValidator();\n return validator.validate(program);\n}\n","/**\n * Expression Normalizer\n * Converts MEL operators and function calls to Core ExprNode format\n * Based on MEL SPEC v0.3.1 Section 4 and FDR-MEL-038\n */\n\nimport type { CoreExprNode } from \"./ir.js\";\nimport type { BinaryOperator } from \"../parser/ast.js\";\n\n/**\n * Normalize a binary operator to Core ExprNode\n */\nexport function normalizeExpr(\n op: BinaryOperator,\n left: CoreExprNode,\n right: CoreExprNode\n): CoreExprNode {\n switch (op) {\n // Arithmetic\n case \"+\": return { kind: \"add\", left, right };\n case \"-\": return { kind: \"sub\", left, right };\n case \"*\": return { kind: \"mul\", left, right };\n case \"/\": return { kind: \"div\", left, right };\n case \"%\": return { kind: \"mod\", left, right };\n\n // Comparison\n case \"==\": return { kind: \"eq\", left, right };\n case \"!=\": return { kind: \"neq\", left, right };\n case \"<\": return { kind: \"lt\", left, right };\n case \"<=\": return { kind: \"lte\", left, right };\n case \">\": return { kind: \"gt\", left, right };\n case \">=\": return { kind: \"gte\", left, right };\n\n // Logical\n case \"&&\": return { kind: \"and\", args: [left, right] };\n case \"||\": return { kind: \"or\", args: [left, right] };\n\n // Nullish coalescing\n case \"??\": return { kind: \"coalesce\", args: [left, right] };\n }\n}\n\n/**\n * Function name to Core ExprNode mapping\n */\nexport function normalizeFunctionCall(\n name: string,\n args: CoreExprNode[]\n): CoreExprNode {\n switch (name) {\n // ============ Arithmetic ============\n case \"add\":\n return { kind: \"add\", left: args[0], right: args[1] };\n case \"sub\":\n return { kind: \"sub\", left: args[0], right: args[1] };\n case \"mul\":\n return { kind: \"mul\", left: args[0], right: args[1] };\n case \"div\":\n return { kind: \"div\", left: args[0], right: args[1] };\n case \"mod\":\n return { kind: \"mod\", left: args[0], right: args[1] };\n case \"neg\":\n return { kind: \"neg\", arg: args[0] };\n case \"abs\":\n return { kind: \"abs\", arg: args[0] };\n case \"min\":\n // v0.3.2: single arg = array aggregation, multiple args = value comparison\n if (args.length === 1) {\n return { kind: \"minArray\", array: args[0] };\n }\n return { kind: \"min\", args };\n case \"max\":\n // v0.3.2: single arg = array aggregation, multiple args = value comparison\n if (args.length === 1) {\n return { kind: \"maxArray\", array: args[0] };\n }\n return { kind: \"max\", args };\n // v0.3.2: sum array aggregation\n case \"sum\":\n return { kind: \"sumArray\", array: args[0] };\n case \"floor\":\n return { kind: \"floor\", arg: args[0] };\n case \"ceil\":\n return { kind: \"ceil\", arg: args[0] };\n case \"round\":\n return { kind: \"round\", arg: args[0] };\n case \"sqrt\":\n return { kind: \"sqrt\", arg: args[0] };\n case \"pow\":\n return { kind: \"pow\", base: args[0], exponent: args[1] };\n\n // ============ Comparison ============\n case \"eq\":\n return { kind: \"eq\", left: args[0], right: args[1] };\n case \"neq\":\n return { kind: \"neq\", left: args[0], right: args[1] };\n case \"gt\":\n return { kind: \"gt\", left: args[0], right: args[1] };\n case \"gte\":\n return { kind: \"gte\", left: args[0], right: args[1] };\n case \"lt\":\n return { kind: \"lt\", left: args[0], right: args[1] };\n case \"lte\":\n return { kind: \"lte\", left: args[0], right: args[1] };\n\n // ============ Logical ============\n case \"and\":\n return { kind: \"and\", args };\n case \"or\":\n return { kind: \"or\", args };\n case \"not\":\n return { kind: \"not\", arg: args[0] };\n\n // ============ Type Checking ============\n case \"isNull\":\n return { kind: \"isNull\", arg: args[0] };\n case \"isNotNull\":\n // isNotNull(x) -> not(isNull(x))\n return { kind: \"not\", arg: { kind: \"isNull\", arg: args[0] } };\n case \"typeof\":\n return { kind: \"typeof\", arg: args[0] };\n case \"coalesce\":\n return { kind: \"coalesce\", args };\n\n // ============ String ============\n case \"concat\":\n return { kind: \"concat\", args };\n case \"trim\":\n return { kind: \"trim\", str: args[0] };\n case \"lower\":\n case \"toLowerCase\":\n return { kind: \"toLowerCase\", str: args[0] };\n case \"upper\":\n case \"toUpperCase\":\n return { kind: \"toUpperCase\", str: args[0] };\n case \"strlen\":\n case \"strLen\":\n return { kind: \"strLen\", str: args[0] };\n case \"substr\":\n case \"substring\":\n return args[2]\n ? { kind: \"substring\", str: args[0], start: args[1], end: args[2] }\n : { kind: \"substring\", str: args[0], start: args[1] };\n case \"toString\":\n return { kind: \"toString\", arg: args[0] };\n\n // ============ Collection ============\n case \"len\":\n case \"length\":\n return { kind: \"len\", arg: args[0] };\n case \"at\":\n return { kind: \"at\", array: args[0], index: args[1] };\n case \"first\":\n return { kind: \"first\", array: args[0] };\n case \"last\":\n return { kind: \"last\", array: args[0] };\n case \"slice\":\n return args[2]\n ? { kind: \"slice\", array: args[0], start: args[1], end: args[2] }\n : { kind: \"slice\", array: args[0], start: args[1] };\n case \"includes\":\n return { kind: \"includes\", array: args[0], item: args[1] };\n case \"filter\":\n return { kind: \"filter\", array: args[0], predicate: args[1] };\n case \"map\":\n return { kind: \"map\", array: args[0], mapper: args[1] };\n case \"find\":\n return { kind: \"find\", array: args[0], predicate: args[1] };\n case \"every\":\n return { kind: \"every\", array: args[0], predicate: args[1] };\n case \"some\":\n return { kind: \"some\", array: args[0], predicate: args[1] };\n case \"append\":\n return { kind: \"append\", array: args[0], items: args.slice(1) };\n\n // ============ Object ============\n case \"keys\":\n return { kind: \"keys\", obj: args[0] };\n case \"values\":\n return { kind: \"values\", obj: args[0] };\n case \"entries\":\n return { kind: \"entries\", obj: args[0] };\n case \"merge\":\n return { kind: \"merge\", objects: args };\n\n // ============ Conditional ============\n case \"if\":\n case \"cond\":\n return { kind: \"if\", cond: args[0], then: args[1], else: args[2] };\n\n // ============ Unknown Function ============\n default:\n // For unknown functions, create a generic call representation\n // This will be caught during semantic analysis\n return {\n kind: \"object\",\n fields: {\n __call: { kind: \"lit\", value: name },\n __args: { kind: \"lit\", value: args },\n },\n };\n }\n}\n","/**\n * IR Generator - Transforms MEL AST to Core DomainSchema\n * Based on MEL SPEC v0.3.3 Section 5\n */\n\nimport type { Diagnostic } from \"../diagnostics/types.js\";\nimport type {\n ProgramNode,\n DomainNode,\n TypeDeclNode, // v0.3.3\n StateNode,\n StateFieldNode,\n ComputedNode,\n ActionNode,\n ExprNode,\n GuardedStmtNode,\n InnerStmtNode,\n WhenStmtNode,\n OnceStmtNode,\n OnceIntentStmtNode,\n PatchStmtNode,\n EffectStmtNode,\n FailStmtNode, // v0.3.2\n StopStmtNode, // v0.3.2\n PathNode,\n TypeExprNode,\n ObjectTypeNode, // v0.3.3\n BinaryOperator,\n} from \"../parser/ast.js\";\nimport { normalizeExpr, normalizeFunctionCall } from \"./normalizer.js\";\nimport { hashSchemaSync, semanticPathToPatchPath, sha256Sync, type PatchPath } from \"@manifesto-ai/core\";\n\n// ============ Core IR Types (matching @manifesto-ai/core) ============\n\n/**\n * Core ExprNode types (simplified, matching core/schema/expr.ts)\n */\nexport type CoreExprNode =\n | { kind: \"lit\"; value: unknown }\n | { kind: \"get\"; path: string }\n | { kind: \"eq\"; left: CoreExprNode; right: CoreExprNode }\n | { kind: \"neq\"; left: CoreExprNode; right: CoreExprNode }\n | { kind: \"gt\"; left: CoreExprNode; right: CoreExprNode }\n | { kind: \"gte\"; left: CoreExprNode; right: CoreExprNode }\n | { kind: \"lt\"; left: CoreExprNode; right: CoreExprNode }\n | { kind: \"lte\"; left: CoreExprNode; right: CoreExprNode }\n | { kind: \"and\"; args: CoreExprNode[] }\n | { kind: \"or\"; args: CoreExprNode[] }\n | { kind: \"not\"; arg: CoreExprNode }\n | { kind: \"if\"; cond: CoreExprNode; then: CoreExprNode; else: CoreExprNode }\n | { kind: \"add\"; left: CoreExprNode; right: CoreExprNode }\n | { kind: \"sub\"; left: CoreExprNode; right: CoreExprNode }\n | { kind: \"mul\"; left: CoreExprNode; right: CoreExprNode }\n | { kind: \"div\"; left: CoreExprNode; right: CoreExprNode }\n | { kind: \"mod\"; left: CoreExprNode; right: CoreExprNode }\n | { kind: \"neg\"; arg: CoreExprNode }\n | { kind: \"abs\"; arg: CoreExprNode }\n | { kind: \"min\"; args: CoreExprNode[] }\n | { kind: \"max\"; args: CoreExprNode[] }\n // v0.3.2: Array aggregation functions\n | { kind: \"sumArray\"; array: CoreExprNode }\n | { kind: \"minArray\"; array: CoreExprNode }\n | { kind: \"maxArray\"; array: CoreExprNode }\n | { kind: \"floor\"; arg: CoreExprNode }\n | { kind: \"ceil\"; arg: CoreExprNode }\n | { kind: \"round\"; arg: CoreExprNode }\n | { kind: \"sqrt\"; arg: CoreExprNode }\n | { kind: \"pow\"; base: CoreExprNode; exponent: CoreExprNode }\n | { kind: \"concat\"; args: CoreExprNode[] }\n | { kind: \"trim\"; str: CoreExprNode }\n | { kind: \"toLowerCase\"; str: CoreExprNode }\n | { kind: \"toUpperCase\"; str: CoreExprNode }\n | { kind: \"strLen\"; str: CoreExprNode }\n | { kind: \"substring\"; str: CoreExprNode; start: CoreExprNode; end?: CoreExprNode }\n | { kind: \"len\"; arg: CoreExprNode }\n | { kind: \"at\"; array: CoreExprNode; index: CoreExprNode }\n | { kind: \"first\"; array: CoreExprNode }\n | { kind: \"last\"; array: CoreExprNode }\n | { kind: \"slice\"; array: CoreExprNode; start: CoreExprNode; end?: CoreExprNode }\n | { kind: \"includes\"; array: CoreExprNode; item: CoreExprNode }\n | { kind: \"filter\"; array: CoreExprNode; predicate: CoreExprNode }\n | { kind: \"map\"; array: CoreExprNode; mapper: CoreExprNode }\n | { kind: \"find\"; array: CoreExprNode; predicate: CoreExprNode }\n | { kind: \"every\"; array: CoreExprNode; predicate: CoreExprNode }\n | { kind: \"some\"; array: CoreExprNode; predicate: CoreExprNode }\n | { kind: \"append\"; array: CoreExprNode; items: CoreExprNode[] }\n | { kind: \"object\"; fields: Record<string, CoreExprNode> }\n | { kind: \"field\"; object: CoreExprNode; property: string }\n | { kind: \"keys\"; obj: CoreExprNode }\n | { kind: \"values\"; obj: CoreExprNode }\n | { kind: \"entries\"; obj: CoreExprNode }\n | { kind: \"merge\"; objects: CoreExprNode[] }\n | { kind: \"typeof\"; arg: CoreExprNode }\n | { kind: \"isNull\"; arg: CoreExprNode }\n | { kind: \"coalesce\"; args: CoreExprNode[] }\n | { kind: \"toString\"; arg: CoreExprNode };\n\n/**\n * Core FlowNode types (matching core/schema/flow.ts)\n */\nexport type CoreFlowNode =\n | { kind: \"seq\"; steps: CoreFlowNode[] }\n | { kind: \"if\"; cond: CoreExprNode; then: CoreFlowNode; else?: CoreFlowNode }\n | { kind: \"patch\"; op: \"set\" | \"unset\" | \"merge\"; path: PatchPath; value?: CoreExprNode }\n | { kind: \"effect\"; type: string; params: Record<string, CoreExprNode> }\n | { kind: \"call\"; flow: string }\n | { kind: \"halt\"; reason?: string }\n | { kind: \"fail\"; code: string; message?: CoreExprNode };\n\n/**\n * Field type definition\n */\nexport type FieldType =\n | \"string\" | \"number\" | \"boolean\" | \"null\" | \"object\" | \"array\"\n | { enum: readonly unknown[] };\n\n/**\n * Field specification\n */\nexport interface FieldSpec {\n type: FieldType;\n required: boolean;\n default?: unknown;\n description?: string;\n fields?: Record<string, FieldSpec>;\n items?: FieldSpec;\n}\n\n/**\n * State specification\n */\nexport interface StateSpec {\n fields: Record<string, FieldSpec>;\n}\n\n/**\n * Computed field specification\n */\nexport interface ComputedFieldSpec {\n deps: string[];\n expr: CoreExprNode;\n description?: string;\n}\n\n/**\n * Computed specification\n */\nexport interface ComputedSpec {\n fields: Record<string, ComputedFieldSpec>;\n}\n\n/**\n * Action specification\n */\nexport interface ActionSpec {\n flow: CoreFlowNode;\n input?: FieldSpec;\n available?: CoreExprNode;\n description?: string;\n}\n\n/**\n * Domain schema (output IR)\n */\n/**\n * v0.3.3: Type specification (named type declaration)\n */\nexport interface TypeSpec {\n name: string;\n definition: TypeDefinition;\n}\n\n/**\n * v0.3.3: Type definition structure\n */\nexport type TypeDefinition =\n | { kind: \"primitive\"; type: string }\n | { kind: \"array\"; element: TypeDefinition }\n | { kind: \"record\"; key: TypeDefinition; value: TypeDefinition }\n | { kind: \"object\"; fields: Record<string, { type: TypeDefinition; optional: boolean }> }\n | { kind: \"union\"; types: TypeDefinition[] }\n | { kind: \"literal\"; value: string | number | boolean | null }\n | { kind: \"ref\"; name: string };\n\nexport interface DomainSchema {\n id: string;\n version: string;\n hash: string;\n /** v0.3.3: Named type declarations */\n types: Record<string, TypeSpec>;\n state: StateSpec;\n computed: ComputedSpec;\n actions: Record<string, ActionSpec>;\n meta?: {\n name?: string;\n description?: string;\n authors?: string[];\n };\n}\n\n// ============ Generation Context ============\n\n/**\n * Context for IR generation\n */\ninterface GeneratorContext {\n domainName: string;\n stateFields: Set<string>;\n computedFields: Set<string>;\n actionParams: Map<string, Set<string>>; // action -> params\n onceIntentCounters: Map<string, number>; // action -> onceIntent block index\n currentAction: string | null;\n diagnostics: Diagnostic[];\n /** v0.3.3: Type declarations for expanding user-defined types */\n typeDefs: Map<string, TypeDeclNode>;\n}\n\nfunction createContext(domainName: string): GeneratorContext {\n return {\n domainName,\n stateFields: new Set(),\n computedFields: new Set(),\n actionParams: new Map(),\n onceIntentCounters: new Map(),\n currentAction: null,\n diagnostics: [],\n typeDefs: new Map(),\n };\n}\n\n// ============ Generator Result ============\n\nexport interface GenerateResult {\n schema: DomainSchema | null;\n diagnostics: Diagnostic[];\n}\n\n// ============ Main Generator ============\n\n/**\n * Generate Core DomainSchema from MEL AST\n */\nexport function generate(program: ProgramNode): GenerateResult {\n const ctx = createContext(program.domain.name);\n\n // First pass: collect state and computed field names\n collectFieldNames(program.domain, ctx);\n\n // v0.3.3: Generate types first\n const types = generateTypes(program.domain, ctx);\n\n // Generate schema parts\n const state = generateState(program.domain, ctx);\n const computed = generateComputed(program.domain, ctx);\n const actions = generateActions(program.domain, ctx);\n\n if (ctx.diagnostics.some(d => d.severity === \"error\")) {\n return {\n schema: null,\n diagnostics: ctx.diagnostics,\n };\n }\n\n // Create schema\n const schemaWithoutHash: Omit<DomainSchema, \"hash\"> = {\n id: `mel:${program.domain.name.toLowerCase()}`,\n version: \"1.0.0\",\n types,\n state,\n computed,\n actions,\n meta: {\n name: program.domain.name,\n },\n };\n\n // Compute hash\n const hash = computeHash(schemaWithoutHash);\n\n const schema: DomainSchema = {\n ...schemaWithoutHash,\n hash,\n };\n\n return {\n schema,\n diagnostics: ctx.diagnostics,\n };\n}\n\n// ============ Field Collection ============\n\nfunction collectFieldNames(domain: DomainNode, ctx: GeneratorContext): void {\n // Collect type declarations first\n for (const typeDecl of domain.types) {\n ctx.typeDefs.set(typeDecl.name, typeDecl);\n }\n\n for (const member of domain.members) {\n if (member.kind === \"state\") {\n for (const field of member.fields) {\n ctx.stateFields.add(field.name);\n }\n } else if (member.kind === \"computed\") {\n ctx.computedFields.add(member.name);\n }\n }\n}\n\n// ============ Type Generation (v0.3.3) ============\n\nfunction generateTypes(domain: DomainNode, _ctx: GeneratorContext): Record<string, TypeSpec> {\n const types: Record<string, TypeSpec> = {};\n\n for (const typeDecl of domain.types) {\n types[typeDecl.name] = {\n name: typeDecl.name,\n definition: typeExprToDefinition(typeDecl.typeExpr),\n };\n }\n\n return types;\n}\n\nfunction typeExprToDefinition(typeExpr: TypeExprNode): TypeDefinition {\n switch (typeExpr.kind) {\n case \"simpleType\":\n // Primitive types vs type references\n if ([\"string\", \"number\", \"boolean\", \"null\"].includes(typeExpr.name)) {\n return { kind: \"primitive\", type: typeExpr.name };\n }\n // User-defined type reference\n return { kind: \"ref\", name: typeExpr.name };\n\n case \"arrayType\":\n return {\n kind: \"array\",\n element: typeExprToDefinition(typeExpr.elementType),\n };\n\n case \"recordType\":\n return {\n kind: \"record\",\n key: typeExprToDefinition(typeExpr.keyType),\n value: typeExprToDefinition(typeExpr.valueType),\n };\n\n case \"objectType\":\n const fields: Record<string, { type: TypeDefinition; optional: boolean }> = {};\n for (const field of typeExpr.fields) {\n fields[field.name] = {\n type: typeExprToDefinition(field.typeExpr),\n optional: field.optional,\n };\n }\n return { kind: \"object\", fields };\n\n case \"unionType\":\n return {\n kind: \"union\",\n types: typeExpr.types.map(typeExprToDefinition),\n };\n\n case \"literalType\":\n return { kind: \"literal\", value: typeExpr.value };\n\n default:\n // Exhaustive check\n const _exhaustive: never = typeExpr;\n throw new Error(`Unknown type expression kind: ${(typeExpr as TypeExprNode).kind}`);\n }\n}\n\n// ============ State Generation ============\n\nfunction generateState(domain: DomainNode, ctx: GeneratorContext): StateSpec {\n const fields: Record<string, FieldSpec> = {};\n\n for (const member of domain.members) {\n if (member.kind === \"state\") {\n for (const field of member.fields) {\n fields[field.name] = generateFieldSpec(field, ctx);\n }\n }\n }\n\n return { fields };\n}\n\nfunction generateFieldSpec(field: StateFieldNode, ctx: GeneratorContext): FieldSpec {\n const spec = typeExprToFieldSpec(field.typeExpr, ctx);\n const defaultValue = field.initializer\n ? evaluateInitializer(field.initializer, ctx)\n : undefined;\n\n return {\n ...spec,\n required: true,\n default: defaultValue,\n };\n}\n\n/**\n * Convert TypeExprNode to complete FieldSpec (including nested fields)\n * This is the full conversion that includes `fields` for object types\n */\nfunction typeExprToFieldSpec(typeExpr: TypeExprNode, ctx: GeneratorContext): FieldSpec {\n switch (typeExpr.kind) {\n case \"simpleType\":\n switch (typeExpr.name) {\n case \"string\": return { type: \"string\", required: true };\n case \"number\": return { type: \"number\", required: true };\n case \"boolean\": return { type: \"boolean\", required: true };\n case \"null\": return { type: \"null\", required: true };\n default: {\n // User-defined type - look up and expand\n const typeDef = ctx.typeDefs.get(typeExpr.name);\n if (typeDef) {\n return typeExprToFieldSpec(typeDef.typeExpr, ctx);\n }\n // Unknown type - treat as opaque object\n return { type: \"object\", required: true };\n }\n }\n\n case \"unionType\": {\n // Check if it's a literal union (enum)\n const literals: unknown[] = [];\n let isLiteralUnion = true;\n let hasNull = false;\n\n for (const t of typeExpr.types) {\n if (t.kind === \"literalType\") {\n if (t.value === null) {\n hasNull = true;\n }\n literals.push(t.value);\n continue;\n }\n\n if (t.kind === \"simpleType\" && t.name === \"null\") {\n hasNull = true;\n literals.push(null);\n continue;\n }\n\n isLiteralUnion = false;\n }\n\n if (isLiteralUnion && literals.length > 0) {\n return { type: { enum: literals }, required: !hasNull };\n }\n\n // Nullable type: T | null -> get spec of T\n if (hasNull) {\n for (const t of typeExpr.types) {\n if (t.kind !== \"simpleType\" || t.name !== \"null\") {\n const innerSpec = typeExprToFieldSpec(t, ctx);\n return { ...innerSpec, required: false };\n }\n }\n }\n\n // Mixed union - default to first non-null type\n for (const t of typeExpr.types) {\n if (t.kind !== \"simpleType\" || t.name !== \"null\") {\n return typeExprToFieldSpec(t, ctx);\n }\n }\n return { type: \"null\", required: true };\n }\n\n case \"arrayType\": {\n const itemSpec = typeExprToFieldSpec(typeExpr.elementType, ctx);\n return {\n type: \"array\",\n required: true,\n items: itemSpec,\n };\n }\n\n case \"recordType\":\n return { type: \"object\", required: true };\n\n case \"literalType\":\n // Single literal type - use its base type\n if (typeof typeExpr.value === \"string\") return { type: \"string\", required: true };\n if (typeof typeExpr.value === \"number\") return { type: \"number\", required: true };\n if (typeof typeExpr.value === \"boolean\") return { type: \"boolean\", required: true };\n return { type: \"null\", required: true };\n\n case \"objectType\": {\n // v0.3.3: Inline object type - expand to fields\n const objectFields: Record<string, FieldSpec> = {};\n for (const field of typeExpr.fields) {\n const fieldSpec = typeExprToFieldSpec(field.typeExpr, ctx);\n objectFields[field.name] = {\n ...fieldSpec,\n required: !field.optional,\n };\n }\n return {\n type: \"object\",\n required: true,\n fields: objectFields,\n };\n }\n }\n}\n\n/**\n * Simple type extraction (for backward compat with action input specs)\n */\nfunction typeExprToFieldType(typeExpr: TypeExprNode, ctx: GeneratorContext): FieldType {\n const spec = typeExprToFieldSpec(typeExpr, ctx);\n return spec.type;\n}\n\nfunction evaluateInitializer(expr: ExprNode, ctx: GeneratorContext): unknown {\n // Only evaluate literals and simple expressions for default values\n switch (expr.kind) {\n case \"literal\":\n return expr.value;\n\n case \"arrayLiteral\":\n return expr.elements.map(e => evaluateInitializer(e, ctx));\n\n case \"objectLiteral\": {\n const obj: Record<string, unknown> = {};\n for (const prop of expr.properties) {\n obj[prop.key] = evaluateInitializer(prop.value, ctx);\n }\n return obj;\n }\n\n default:\n // Complex expressions can't be evaluated statically\n return undefined;\n }\n}\n\n// ============ Computed Generation ============\n\nfunction generateComputed(domain: DomainNode, ctx: GeneratorContext): ComputedSpec {\n const fields: Record<string, ComputedFieldSpec> = {};\n\n for (const member of domain.members) {\n if (member.kind === \"computed\") {\n const expr = generateExpr(member.expression, ctx);\n const deps = extractDeps(expr);\n\n fields[member.name] = {\n deps,\n expr,\n };\n }\n }\n\n return { fields };\n}\n\nfunction extractDeps(expr: CoreExprNode): string[] {\n const deps = new Set<string>();\n\n function visit(node: CoreExprNode): void {\n if (node.kind === \"get\") {\n deps.add(node.path);\n } else {\n // Visit all nested expressions\n for (const value of Object.values(node)) {\n if (typeof value === \"object\" && value !== null) {\n if (Array.isArray(value)) {\n for (const item of value) {\n if (typeof item === \"object\" && item !== null && \"kind\" in item) {\n visit(item as CoreExprNode);\n }\n }\n } else if (\"kind\" in value) {\n visit(value as CoreExprNode);\n }\n }\n }\n }\n }\n\n visit(expr);\n return Array.from(deps);\n}\n\n// ============ Action Generation ============\n\nfunction generateActions(domain: DomainNode, ctx: GeneratorContext): Record<string, ActionSpec> {\n const actions: Record<string, ActionSpec> = {};\n\n for (const member of domain.members) {\n if (member.kind === \"action\") {\n ctx.currentAction = member.name;\n ctx.onceIntentCounters.set(member.name, 0);\n\n // Collect params\n const params = new Set<string>();\n for (const param of member.params) {\n params.add(param.name);\n }\n ctx.actionParams.set(member.name, params);\n\n const flow = generateFlow(member.body, ctx);\n\n // Generate input spec if there are params\n let input: FieldSpec | undefined;\n if (member.params.length > 0) {\n const inputFields: Record<string, FieldSpec> = {};\n for (const param of member.params) {\n const fieldSpec = typeExprToFieldSpec(param.typeExpr, ctx);\n const inputField: FieldSpec = {\n type: fieldSpec.type,\n required: fieldSpec.required ?? true,\n };\n\n if (fieldSpec.type === \"object\" && fieldSpec.fields) {\n inputField.fields = fieldSpec.fields;\n }\n\n if (fieldSpec.type === \"array\" && fieldSpec.items) {\n inputField.items = fieldSpec.items;\n }\n\n inputFields[param.name] = inputField;\n }\n input = {\n type: \"object\",\n required: true,\n fields: inputFields,\n };\n }\n\n // v0.3.2: Generate available condition if present\n let available: CoreExprNode | undefined;\n if (member.available) {\n available = generateExpr(member.available, ctx);\n }\n\n actions[member.name] = {\n flow,\n input,\n available,\n };\n\n ctx.currentAction = null;\n }\n }\n\n return actions;\n}\n\nfunction generateFlow(stmts: (GuardedStmtNode | InnerStmtNode)[], ctx: GeneratorContext): CoreFlowNode {\n if (stmts.length === 0) {\n return { kind: \"seq\", steps: [] };\n }\n\n if (stmts.length === 1) {\n return generateStmt(stmts[0], ctx);\n }\n\n return {\n kind: \"seq\",\n steps: stmts.map(s => generateStmt(s, ctx)),\n };\n}\n\nfunction generateStmt(stmt: GuardedStmtNode | InnerStmtNode, ctx: GeneratorContext): CoreFlowNode {\n switch (stmt.kind) {\n case \"when\":\n return generateWhen(stmt, ctx);\n\n case \"once\":\n return generateOnce(stmt, ctx);\n\n case \"onceIntent\":\n return generateOnceIntent(stmt, ctx);\n\n case \"patch\":\n return generatePatch(stmt, ctx);\n\n case \"effect\":\n return generateEffect(stmt, ctx);\n\n case \"fail\":\n return generateFail(stmt, ctx);\n\n case \"stop\":\n return generateStop(stmt, ctx);\n }\n}\n\nfunction generateWhen(stmt: WhenStmtNode, ctx: GeneratorContext): CoreFlowNode {\n const cond = generateExpr(stmt.condition, ctx);\n const thenFlow = generateFlow(stmt.body, ctx);\n\n return {\n kind: \"if\",\n cond,\n then: thenFlow,\n };\n}\n\nfunction generateOnce(stmt: OnceStmtNode, ctx: GeneratorContext): CoreFlowNode {\n // Desugar once(marker) { ... } to:\n // when neq(marker, $meta.intentId) { patch marker = $meta.intentId; ... }\n // Note: Core accesses $meta intent values via meta.*\n\n const markerPath = generatePath(stmt.marker, ctx);\n const intentIdExpr: CoreExprNode = { kind: \"get\", path: \"meta.intentId\" };\n\n // Condition: marker != $meta.intentId\n let cond: CoreExprNode = {\n kind: \"neq\",\n left: { kind: \"get\", path: markerPath },\n right: intentIdExpr,\n };\n\n // Add extra condition if present\n if (stmt.condition) {\n const extraCond = generateExpr(stmt.condition, ctx);\n cond = {\n kind: \"and\",\n args: [cond, extraCond],\n };\n }\n\n // Body: patch marker = $meta.intentId, then rest\n const markerPatch: CoreFlowNode = {\n kind: \"patch\",\n op: \"set\",\n path: toPatchPath(markerPath),\n value: intentIdExpr,\n };\n\n const bodySteps = stmt.body.map(s => generateStmt(s, ctx));\n\n return {\n kind: \"if\",\n cond,\n then: {\n kind: \"seq\",\n steps: [markerPatch, ...bodySteps],\n },\n };\n}\n\nfunction generateOnceIntent(stmt: OnceIntentStmtNode, ctx: GeneratorContext): CoreFlowNode {\n const actionName = ctx.currentAction ?? \"unknown\";\n const nextIndex = ctx.onceIntentCounters.get(actionName) ?? 0;\n ctx.onceIntentCounters.set(actionName, nextIndex + 1);\n\n const guardId = sha256Sync(`${actionName}:${nextIndex}:intent`);\n const guardPath = `$mel.guards.intent.${guardId}`;\n const intentIdExpr: CoreExprNode = { kind: \"get\", path: \"meta.intentId\" };\n\n let cond: CoreExprNode = {\n kind: \"neq\",\n left: { kind: \"get\", path: guardPath },\n right: intentIdExpr,\n };\n\n if (stmt.condition) {\n const extraCond = generateExpr(stmt.condition, ctx);\n cond = {\n kind: \"and\",\n args: [cond, extraCond],\n };\n }\n\n // Guard write: semantic target is guardPath, lowered as map-level merge.\n const markerPatch: CoreFlowNode = {\n kind: \"patch\",\n op: \"merge\",\n path: toPatchPath(\"$mel.guards.intent\"),\n value: {\n kind: \"object\",\n fields: { [guardId]: intentIdExpr },\n },\n };\n\n const bodySteps = stmt.body.map(s => generateStmt(s, ctx));\n\n return {\n kind: \"if\",\n cond,\n then: {\n kind: \"seq\",\n steps: [markerPatch, ...bodySteps],\n },\n };\n}\n\nfunction generatePatch(stmt: PatchStmtNode, ctx: GeneratorContext): CoreFlowNode {\n const path = generatePath(stmt.path, ctx);\n\n const result: CoreFlowNode = {\n kind: \"patch\",\n op: stmt.op,\n path: toPatchPath(path),\n };\n\n if (stmt.value) {\n (result as { kind: \"patch\"; op: \"set\" | \"unset\" | \"merge\"; path: PatchPath; value?: CoreExprNode }).value = generateExpr(stmt.value, ctx);\n }\n\n return result;\n}\n\nfunction generateEffect(stmt: EffectStmtNode, ctx: GeneratorContext): CoreFlowNode {\n const params: Record<string, CoreExprNode> = {};\n\n for (const arg of stmt.args) {\n if (arg.isPath) {\n // Path arguments like into:, pass:, fail:\n params[arg.name] = { kind: \"lit\", value: generatePath(arg.value as PathNode, ctx) };\n } else {\n params[arg.name] = generateExpr(arg.value as ExprNode, ctx);\n }\n }\n\n return {\n kind: \"effect\",\n type: stmt.effectType,\n params,\n };\n}\n\n/**\n * v0.3.2: Generate fail statement\n * fail \"CODE\" with expr → { kind: \"fail\", code, message? }\n */\nfunction generateFail(stmt: FailStmtNode, ctx: GeneratorContext): CoreFlowNode {\n const result: CoreFlowNode = {\n kind: \"fail\",\n code: stmt.code,\n };\n\n if (stmt.message) {\n (result as { kind: \"fail\"; code: string; message?: CoreExprNode }).message = generateExpr(stmt.message, ctx);\n }\n\n return result;\n}\n\n/**\n * v0.3.2: Generate stop statement\n * stop \"reason\" → { kind: \"halt\", reason }\n */\nfunction generateStop(stmt: StopStmtNode, ctx: GeneratorContext): CoreFlowNode {\n return {\n kind: \"halt\",\n reason: stmt.reason,\n };\n}\n\n// ============ Path Generation ============\n\nfunction escapePathSegment(segment: string): string {\n return segment.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\".\", \"\\\\.\");\n}\n\nfunction joinPathPreserveEmptySegments(...segments: string[]): string {\n return segments.map(escapePathSegment).join(\".\");\n}\n\nfunction generatePath(path: PathNode, ctx: GeneratorContext): string {\n const segments: string[] = [];\n\n for (const segment of path.segments) {\n if (segment.kind === \"propertySegment\") {\n segments.push(segment.name);\n } else {\n // Index segment - for now, stringify the index\n // In reality, this would need runtime evaluation\n const indexExpr = generateExpr(segment.index, ctx);\n if (indexExpr.kind === \"lit\") {\n segments.push(String(indexExpr.value));\n } else {\n // Dynamic index - use placeholder\n segments.push(\"*\");\n }\n }\n }\n\n // Determine prefix based on first segment\n const first = segments[0];\n if (ctx.stateFields.has(first)) {\n // Core expects state paths without prefix (e.g., \"count\" not \"data.count\")\n return joinPathPreserveEmptySegments(...segments);\n }\n if (ctx.computedFields.has(first)) {\n return joinPathPreserveEmptySegments(...segments);\n }\n if (ctx.currentAction && ctx.actionParams.get(ctx.currentAction)?.has(first)) {\n return `input.${joinPathPreserveEmptySegments(...segments)}`;\n }\n\n // Default to plain path (state-like)\n return joinPathPreserveEmptySegments(...segments);\n}\n\nfunction toPatchPath(path: string): PatchPath {\n return semanticPathToPatchPath(path);\n}\n\n// ============ Expression Generation ============\n\nfunction generateExpr(expr: ExprNode, ctx: GeneratorContext): CoreExprNode {\n switch (expr.kind) {\n case \"literal\":\n return { kind: \"lit\", value: expr.value };\n\n case \"identifier\":\n return generateIdentifier(expr.name, ctx);\n\n case \"systemIdent\":\n return generateSystemIdent(expr.path, ctx);\n\n case \"iterationVar\":\n // v0.3.2: $item only (reduce pattern deprecated, $acc removed)\n // $item is used in filter/map expressions\n return { kind: \"get\", path: `$${expr.name}` };\n\n case \"propertyAccess\":\n return generatePropertyAccess(expr, ctx);\n\n case \"indexAccess\":\n return {\n kind: \"at\",\n array: generateExpr(expr.object, ctx),\n index: generateExpr(expr.index, ctx),\n };\n\n case \"functionCall\":\n return normalizeFunctionCall(\n expr.name,\n expr.args.map(a => generateExpr(a, ctx))\n );\n\n case \"binary\":\n return normalizeExpr(\n expr.operator,\n generateExpr(expr.left, ctx),\n generateExpr(expr.right, ctx)\n );\n\n case \"unary\":\n if (expr.operator === \"!\") {\n return { kind: \"not\", arg: generateExpr(expr.operand, ctx) };\n } else {\n return { kind: \"neg\", arg: generateExpr(expr.operand, ctx) };\n }\n\n case \"ternary\":\n return {\n kind: \"if\",\n cond: generateExpr(expr.condition, ctx),\n then: generateExpr(expr.consequent, ctx),\n else: generateExpr(expr.alternate, ctx),\n };\n\n case \"objectLiteral\": {\n const fields: Record<string, CoreExprNode> = {};\n for (const prop of expr.properties) {\n fields[prop.key] = generateExpr(prop.value, ctx);\n }\n return { kind: \"object\", fields };\n }\n\n case \"arrayLiteral\":\n // For array literals, we build using append\n if (expr.elements.length === 0) {\n return { kind: \"lit\", value: [] };\n }\n // Check if all elements are literals\n const allLiterals = expr.elements.every(e => e.kind === \"literal\");\n if (allLiterals) {\n return { kind: \"lit\", value: expr.elements.map(e => (e as { kind: \"literal\"; value: unknown }).value) };\n }\n // Otherwise use append\n return {\n kind: \"append\",\n array: { kind: \"lit\", value: [] },\n items: expr.elements.map(e => generateExpr(e, ctx)),\n };\n }\n}\n\nfunction generateIdentifier(name: string, ctx: GeneratorContext): CoreExprNode {\n // Resolve identifier to path\n if (ctx.stateFields.has(name)) {\n // Core expects state paths without prefix (e.g., \"count\" not \"data.count\")\n return { kind: \"get\", path: name };\n }\n if (ctx.computedFields.has(name)) {\n return { kind: \"get\", path: name };\n }\n if (ctx.currentAction && ctx.actionParams.get(ctx.currentAction)?.has(name)) {\n return { kind: \"get\", path: `input.${name}` };\n }\n\n // Unknown identifier - report error and default to plain path\n ctx.diagnostics.push({\n severity: \"error\",\n code: \"E_UNKNOWN_IDENT\",\n message: `Unknown identifier '${name}'`,\n location: { start: { line: 0, column: 0, offset: 0 }, end: { line: 0, column: 0, offset: 0 } },\n });\n\n return { kind: \"get\", path: name };\n}\n\nfunction generateSystemIdent(path: string[], ctx: GeneratorContext): CoreExprNode {\n // $system.uuid -> will be lowered later\n // $meta.intentId -> meta.intentId\n // $input.* -> input.*\n\n const [namespace, ...rest] = path;\n\n switch (namespace) {\n case \"system\":\n // $system values are placeholders - will be lowered in the lowering pass\n return { kind: \"get\", path: `$system.${rest.join(\".\")}` };\n\n case \"meta\":\n return { kind: \"get\", path: `meta.${rest.join(\".\")}` };\n\n case \"input\":\n return { kind: \"get\", path: `input.${rest.join(\".\")}` };\n\n default:\n ctx.diagnostics.push({\n severity: \"error\",\n code: \"E_INVALID_SYSTEM\",\n message: `Invalid system identifier namespace '$${namespace}'`,\n location: { start: { line: 0, column: 0, offset: 0 }, end: { line: 0, column: 0, offset: 0 } },\n });\n return { kind: \"lit\", value: null };\n }\n}\n\nfunction generatePropertyAccess(expr: { kind: \"propertyAccess\"; object: ExprNode; property: string }, ctx: GeneratorContext): CoreExprNode {\n // Handle chained property access\n const objectExpr = generateExpr(expr.object, ctx);\n\n // If the object is a get expression, we can extend the path\n if (objectExpr.kind === \"get\") {\n return { kind: \"get\", path: `${objectExpr.path}.${expr.property}` };\n }\n\n // Static member access: use field() to access a known property on a computed object.\n // This is semantically distinct from at() (array indexing) and get() (snapshot path lookup).\n return {\n kind: \"field\",\n object: objectExpr,\n property: expr.property,\n };\n}\n\n// ============ Hash Computation ============\n\n/**\n * Compute schema hash using browser-compatible SHA-256.\n * Uses @manifesto-ai/core's sha256Sync for universal compatibility.\n */\nfunction computeHash(schema: Omit<DomainSchema, \"hash\">): string {\n return hashSchemaSync(schema);\n}\n","/**\n * Lowering Error Types\n *\n * Defines error types for MEL IR → Core IR lowering.\n *\n * @see SPEC v0.4.0 §17.6\n */\n\n/**\n * Lowering error codes.\n *\n * @see SPEC v0.4.0 §17.6\n */\nexport type LoweringErrorCode =\n /** var in non-effect context, sys in schema */\n | \"INVALID_KIND_FOR_CONTEXT\"\n /** Unknown function name in call node */\n | \"UNKNOWN_CALL_FN\"\n /** sys.system in Translator path */\n | \"INVALID_SYS_PATH\"\n /** get.base is not var(item) */\n | \"UNSUPPORTED_BASE\"\n /** Malformed node structure */\n | \"INVALID_SHAPE\"\n /** Unknown node kind */\n | \"UNKNOWN_NODE_KIND\";\n\n/**\n * Lowering error class.\n *\n * Thrown when MEL IR cannot be lowered to Core IR.\n *\n * @see SPEC v0.4.0 §17.6\n */\nexport class LoweringError extends Error {\n readonly code: LoweringErrorCode;\n readonly path?: string[];\n readonly details?: Record<string, unknown>;\n\n constructor(\n code: LoweringErrorCode,\n message: string,\n options?: {\n path?: string[];\n details?: Record<string, unknown>;\n }\n ) {\n super(message);\n this.name = \"LoweringError\";\n this.code = code;\n this.path = options?.path;\n this.details = options?.details;\n }\n}\n\n/**\n * Create a lowering error for invalid kind in context.\n *\n * @example\n * throw invalidKindForContext(\"var\", \"schema\");\n */\nexport function invalidKindForContext(\n kind: string,\n context: string,\n path?: string[]\n): LoweringError {\n return new LoweringError(\n \"INVALID_KIND_FOR_CONTEXT\",\n `Node kind '${kind}' is not allowed in ${context} context`,\n { path, details: { kind, context } }\n );\n}\n\n/**\n * Create a lowering error for unknown call function.\n *\n * @example\n * throw unknownCallFn(\"unknownFunc\");\n */\nexport function unknownCallFn(fn: string, path?: string[]): LoweringError {\n return new LoweringError(\n \"UNKNOWN_CALL_FN\",\n `Unknown function '${fn}' in call expression`,\n { path, details: { fn } }\n );\n}\n\n/**\n * Create a lowering error for invalid sys path.\n *\n * @example\n * throw invalidSysPath([\"system\", \"uuid\"]);\n */\nexport function invalidSysPath(\n sysPath: string[],\n path?: string[]\n): LoweringError {\n return new LoweringError(\n \"INVALID_SYS_PATH\",\n `System path '${sysPath.join(\".\")}' is not allowed in Translator path`,\n { path, details: { sysPath } }\n );\n}\n\n/**\n * Create a lowering error for unsupported base expression.\n *\n * @example\n * throw unsupportedBase(\"call\");\n */\nexport function unsupportedBase(\n baseKind: string,\n path?: string[]\n): LoweringError {\n return new LoweringError(\n \"UNSUPPORTED_BASE\",\n `Unsupported base expression kind '${baseKind}'. Only var(item) is supported.`,\n { path, details: { baseKind } }\n );\n}\n\n/**\n * Create a lowering error for invalid shape.\n *\n * @example\n * throw invalidShape(\"missing 'value' field\");\n */\nexport function invalidShape(\n description: string,\n path?: string[]\n): LoweringError {\n return new LoweringError(\n \"INVALID_SHAPE\",\n `Invalid node shape: ${description}`,\n { path, details: { description } }\n );\n}\n\n/**\n * Create a lowering error for unknown node kind.\n *\n * @example\n * throw unknownNodeKind(\"foo\");\n */\nexport function unknownNodeKind(\n kind: string,\n path?: string[]\n): LoweringError {\n return new LoweringError(\n \"UNKNOWN_NODE_KIND\",\n `Unknown expression node kind '${kind}'`,\n { path, details: { kind } }\n );\n}\n","/**\n * Expression Lowering\n *\n * Transforms MEL Canonical IR (7 kinds) to Core Runtime IR (30+ kinds).\n *\n * @see SPEC v0.4.0 §17\n */\n\nimport type { ExprNode as CoreExprNode } from \"@manifesto-ai/core\";\nimport type { ExprLoweringContext } from \"./context.js\";\nimport {\n invalidKindForContext,\n invalidSysPath,\n unknownCallFn,\n unknownNodeKind,\n unsupportedBase,\n} from \"./errors.js\";\n\n// ============ MEL IR Types (Input) ============\n\n/**\n * MEL primitive value.\n */\nexport type MelPrimitive = null | boolean | number | string;\n\n/**\n * MEL path segment.\n */\nexport type MelPathSegment = { kind: \"prop\"; name: string };\n\n/**\n * MEL path node array.\n */\nexport type MelPathNode = MelPathSegment[];\n\n/**\n * MEL system path as segment array.\n */\nexport type MelSystemPath = string[];\n\n/**\n * MEL object field.\n */\nexport type MelObjField = { key: string; value: MelExprNode };\n\n/**\n * MEL Canonical IR (7 kinds).\n *\n * @see SPEC v0.4.0 §17.1.1\n */\nexport type MelExprNode =\n | { kind: \"lit\"; value: MelPrimitive }\n | { kind: \"var\"; name: \"item\" }\n | { kind: \"sys\"; path: MelSystemPath }\n | { kind: \"get\"; base?: MelExprNode; path: MelPathNode }\n | { kind: \"call\"; fn: string; args: MelExprNode[] }\n | { kind: \"obj\"; fields: MelObjField[] }\n | { kind: \"arr\"; elements: MelExprNode[] };\n\n// ============ Lowering Function ============\n\n/**\n * Lower MEL expression to Core expression.\n *\n * @param input - MEL canonical IR expression\n * @param ctx - Lowering context\n * @returns Core runtime IR expression\n * @throws LoweringError if expression cannot be lowered\n *\n * @see SPEC v0.4.0 §17.3\n */\nexport function lowerExprNode(\n input: MelExprNode,\n ctx: ExprLoweringContext\n): CoreExprNode {\n switch (input.kind) {\n case \"lit\":\n return lowerLit(input);\n\n case \"var\":\n return lowerVar(input, ctx);\n\n case \"sys\":\n return lowerSys(input, ctx);\n\n case \"get\":\n return lowerGet(input, ctx);\n\n case \"call\":\n return lowerCall(input, ctx);\n\n case \"obj\":\n return lowerObj(input, ctx);\n\n case \"arr\":\n return lowerArr(input, ctx);\n\n default:\n throw unknownNodeKind((input as { kind: string }).kind);\n }\n}\n\n// ============ Individual Kind Lowering ============\n\n/**\n * Lower lit node.\n * Pass through - Core lit accepts any value.\n */\nfunction lowerLit(input: { kind: \"lit\"; value: MelPrimitive }): CoreExprNode {\n return { kind: \"lit\", value: input.value };\n}\n\n/**\n * Lower var node.\n *\n * var(item) → get(\"$item\")\n *\n * Only allowed in effect.args context (allowItem: true).\n *\n * @see FDR-MEL-068, SPEC §17.3.2\n */\nfunction lowerVar(\n input: { kind: \"var\"; name: \"item\" },\n ctx: ExprLoweringContext\n): CoreExprNode {\n if (!ctx.allowItem) {\n throw invalidKindForContext(\"var\", ctx.mode);\n }\n return { kind: \"get\", path: \"$item\" };\n}\n\n/**\n * Lower sys node.\n *\n * sys([\"meta\", \"intentId\"]) → get(\"meta.intentId\")\n * sys([\"input\", \"title\"]) → get(\"input.title\")\n * sys([\"system\", ...]) → LoweringError (forbidden in Translator path)\n *\n * @see FDR-MEL-067, FDR-MEL-071, SPEC §17.3.1\n */\nfunction lowerSys(\n input: { kind: \"sys\"; path: MelSystemPath },\n ctx: ExprLoweringContext\n): CoreExprNode {\n if (input.path.length === 0) {\n throw invalidSysPath(input.path);\n }\n\n const prefix = input.path[0];\n const allowedPrefixes = ctx.allowSysPaths?.prefixes ?? [\"meta\", \"input\"];\n\n if (!allowedPrefixes.includes(prefix as \"meta\" | \"input\")) {\n throw invalidSysPath(input.path);\n }\n\n // Core convention: no $ prefix for meta/input\n const path = input.path.join(\".\");\n return { kind: \"get\", path };\n}\n\n/**\n * Lower get node.\n *\n * PathNode[] → dot-notation string\n * get.base only supports var(item)\n *\n * @see FDR-MEL-066, SPEC §17.3.3, §17.3.4\n */\nfunction lowerGet(\n input: { kind: \"get\"; base?: MelExprNode; path: MelPathNode },\n ctx: ExprLoweringContext\n): CoreExprNode {\n const pathStr = input.path.map((seg) => seg.name).join(\".\");\n\n if (input.base === undefined) {\n return { kind: \"get\", path: pathStr };\n }\n\n // base must be var(item)\n if (input.base.kind === \"var\" && input.base.name === \"item\") {\n if (!ctx.allowItem) {\n throw invalidKindForContext(\"var\", ctx.mode);\n }\n return { kind: \"get\", path: `$item.${pathStr}` };\n }\n\n throw unsupportedBase(input.base.kind);\n}\n\n/**\n * Lower call node.\n *\n * call(fn, args) → specialized Core node\n *\n * @see SPEC §17.3.5\n */\nfunction lowerCall(\n input: { kind: \"call\"; fn: string; args: MelExprNode[] },\n ctx: ExprLoweringContext\n): CoreExprNode {\n const { fn, args } = input;\n\n // Binary operators: left, right\n if (isBinaryOp(fn)) {\n if (args.length !== 2) {\n throw unknownCallFn(fn);\n }\n const [left, right] = args;\n return {\n kind: fn as CoreExprNode[\"kind\"],\n left: lowerExprNode(left, ctx),\n right: lowerExprNode(right, ctx),\n } as CoreExprNode;\n }\n\n // Unary operators: arg\n if (isUnaryArgOp(fn)) {\n if (args.length !== 1) {\n throw unknownCallFn(fn);\n }\n return {\n kind: fn,\n arg: lowerExprNode(args[0], ctx),\n } as CoreExprNode;\n }\n\n // Unary operators: str\n if (fn === \"trim\") {\n if (args.length !== 1) {\n throw unknownCallFn(fn);\n }\n return {\n kind: \"trim\",\n str: lowerExprNode(args[0], ctx),\n };\n }\n\n // Variadic operators: args\n if (isArgsOp(fn)) {\n return {\n kind: fn,\n args: args.map((a) => lowerExprNode(a, ctx)),\n } as CoreExprNode;\n }\n\n // Conditional: if(cond, then, else)\n if (fn === \"if\") {\n if (args.length !== 3) {\n throw unknownCallFn(fn);\n }\n return {\n kind: \"if\",\n cond: lowerExprNode(args[0], ctx),\n then: lowerExprNode(args[1], ctx),\n else: lowerExprNode(args[2], ctx),\n };\n }\n\n if (fn === \"field\") {\n if (args.length !== 2) {\n throw unknownCallFn(fn);\n }\n\n const object = lowerExprNode(args[0], ctx);\n const property = args[1];\n if (property.kind !== \"lit\" || typeof property.value !== \"string\") {\n throw unknownCallFn(fn);\n }\n\n return {\n kind: \"field\",\n object,\n property: property.value,\n };\n }\n\n // Array operators: array\n if (isArrayArgOp(fn)) {\n if (args.length !== 1) {\n throw unknownCallFn(fn);\n }\n return {\n kind: fn,\n array: lowerExprNode(args[0], ctx),\n } as CoreExprNode;\n }\n\n // Object operators: obj\n if (isObjArgOp(fn)) {\n if (args.length !== 1) {\n throw unknownCallFn(fn);\n }\n return {\n kind: fn,\n obj: lowerExprNode(args[0], ctx),\n } as CoreExprNode;\n }\n\n // at(array, index)\n if (fn === \"at\") {\n if (args.length !== 2) {\n throw unknownCallFn(fn);\n }\n return {\n kind: \"at\",\n array: lowerExprNode(args[0], ctx),\n index: lowerExprNode(args[1], ctx),\n };\n }\n\n // includes(array, item)\n if (fn === \"includes\") {\n if (args.length !== 2) {\n throw unknownCallFn(fn);\n }\n return {\n kind: \"includes\",\n array: lowerExprNode(args[0], ctx),\n item: lowerExprNode(args[1], ctx),\n };\n }\n\n // filter, map, find, every, some: array, predicate/mapper\n if (isPredicateOp(fn)) {\n if (args.length !== 2) {\n throw unknownCallFn(fn);\n }\n const predicateCtx: ExprLoweringContext = { ...ctx, allowItem: true };\n if (fn === \"map\") {\n return {\n kind: \"map\",\n array: lowerExprNode(args[0], ctx),\n mapper: lowerExprNode(args[1], predicateCtx),\n };\n }\n return {\n kind: fn,\n array: lowerExprNode(args[0], ctx),\n predicate: lowerExprNode(args[1], predicateCtx),\n } as CoreExprNode;\n }\n\n // slice(array, start, end?)\n if (fn === \"slice\") {\n if (args.length < 2 || args.length > 3) {\n throw unknownCallFn(fn);\n }\n const result: { kind: \"slice\"; array: CoreExprNode; start: CoreExprNode; end?: CoreExprNode } = {\n kind: \"slice\",\n array: lowerExprNode(args[0], ctx),\n start: lowerExprNode(args[1], ctx),\n };\n if (args.length === 3) {\n result.end = lowerExprNode(args[2], ctx);\n }\n return result;\n }\n\n // substring(str, start, end?)\n if (fn === \"substring\") {\n if (args.length < 2 || args.length > 3) {\n throw unknownCallFn(fn);\n }\n const result: { kind: \"substring\"; str: CoreExprNode; start: CoreExprNode; end?: CoreExprNode } = {\n kind: \"substring\",\n str: lowerExprNode(args[0], ctx),\n start: lowerExprNode(args[1], ctx),\n };\n if (args.length === 3) {\n result.end = lowerExprNode(args[2], ctx);\n }\n return result;\n }\n\n // append(array, ...items)\n if (fn === \"append\") {\n if (args.length < 1) {\n throw unknownCallFn(fn);\n }\n return {\n kind: \"append\",\n array: lowerExprNode(args[0], ctx),\n items: args.slice(1).map((a) => lowerExprNode(a, ctx)),\n };\n }\n\n // merge(...objects)\n if (fn === \"merge\") {\n return {\n kind: \"merge\",\n objects: args.map((a) => lowerExprNode(a, ctx)),\n };\n }\n\n throw unknownCallFn(fn);\n}\n\n/**\n * Lower obj node.\n *\n * obj({ fields: [{key, value}] }) → object({ fields: Record })\n *\n * @see SPEC §17\n */\nfunction lowerObj(\n input: { kind: \"obj\"; fields: MelObjField[] },\n ctx: ExprLoweringContext\n): CoreExprNode {\n const fields: Record<string, CoreExprNode> = {};\n for (const field of input.fields) {\n fields[field.key] = lowerExprNode(field.value, ctx);\n }\n return { kind: \"object\", fields };\n}\n\n/**\n * Lower arr node.\n *\n * arr({ elements: [...] }) → lit([...evaluated])\n *\n * Note: Core doesn't have an \"arr\" kind, so we evaluate to lit\n * if all elements are literals, otherwise use concat/append pattern.\n * For simplicity, we'll create an evaluated array literal.\n *\n * @see SPEC §17\n */\nfunction lowerArr(\n input: { kind: \"arr\"; elements: MelExprNode[] },\n ctx: ExprLoweringContext\n): CoreExprNode {\n // If all elements are literals, we can create a lit array\n const allLiterals = input.elements.every((e) => e.kind === \"lit\");\n if (allLiterals) {\n const values = input.elements.map(\n (e) => (e as { kind: \"lit\"; value: MelPrimitive }).value\n );\n return { kind: \"lit\", value: values };\n }\n\n // Otherwise, we need to build the array using concat\n // Start with empty array and append each element\n const loweredElements = input.elements.map((e) => lowerExprNode(e, ctx));\n\n if (loweredElements.length === 0) {\n return { kind: \"lit\", value: [] };\n }\n\n // Use append pattern: append([], e1, e2, ...)\n return {\n kind: \"append\",\n array: { kind: \"lit\", value: [] },\n items: loweredElements,\n };\n}\n\n// ============ Operator Classification ============\n\n/** Binary operators: eq, neq, gt, gte, lt, lte, add, sub, mul, div, mod */\nfunction isBinaryOp(fn: string): boolean {\n return [\n \"eq\", \"neq\", \"gt\", \"gte\", \"lt\", \"lte\",\n \"add\", \"sub\", \"mul\", \"div\", \"mod\",\n ].includes(fn);\n}\n\n/** Unary operators with 'arg' field: not, len, typeof, isNull */\nfunction isUnaryArgOp(fn: string): boolean {\n return [\"not\", \"len\", \"typeof\", \"isNull\"].includes(fn);\n}\n\n/** Variadic operators with 'args' field: and, or, concat, coalesce */\nfunction isArgsOp(fn: string): boolean {\n return [\"and\", \"or\", \"concat\", \"coalesce\"].includes(fn);\n}\n\n/** Array operators with 'array' field: first, last */\nfunction isArrayArgOp(fn: string): boolean {\n return [\"first\", \"last\"].includes(fn);\n}\n\n/** Object operators with 'obj' field: keys, values, entries */\nfunction isObjArgOp(fn: string): boolean {\n return [\"keys\", \"values\", \"entries\"].includes(fn);\n}\n\n/** Predicate operators: filter, find, every, some, map */\nfunction isPredicateOp(fn: string): boolean {\n return [\"filter\", \"find\", \"every\", \"some\", \"map\"].includes(fn);\n}\n","/**\n * Runtime Patch Lowering\n *\n * Transforms MEL runtime patches (set/unset/merge) to Core IR.\n *\n * @see SPEC v0.4.0 §17.5\n */\n\nimport type { ExprNode as CoreExprNode } from \"@manifesto-ai/core\";\nimport type { ExprLoweringContext } from \"./context.js\";\nimport type { MelExprNode } from \"./lower-expr.js\";\nimport { lowerExprNode } from \"./lower-expr.js\";\n\n// ============ MEL Runtime Patch Types (Input) ============\n\n/**\n * MEL runtime patch operation type.\n *\n * @see SPEC v0.4.0 §17.5\n */\nexport type MelRuntimePatchOp = \"set\" | \"unset\" | \"merge\";\n\n/**\n * MEL path segment for runtime patches before expression lowering.\n */\nexport type MelIRPathSegment =\n | { kind: \"prop\"; name: string }\n | { kind: \"expr\"; expr: MelExprNode };\n\n/**\n * MEL runtime patch path represented as IR segments.\n */\nexport type MelIRPatchPath = MelIRPathSegment[];\n\n/**\n * Lowered runtime IR path segment.\n */\nexport type IRPathSegment =\n | { kind: \"prop\"; name: string }\n | { kind: \"expr\"; expr: CoreExprNode };\n\n/**\n * Runtime patch path represented as IR segments.\n */\nexport type IRPatchPath = IRPathSegment[];\n\n/**\n * MEL runtime patch (Translator output for action patches).\n *\n * Contains MEL IR expressions that need lowering to Core IR.\n */\nexport interface MelRuntimePatch {\n /**\n * Optional condition (MEL IR).\n * If present, patch is only applied when condition evaluates to true.\n */\n condition?: MelExprNode;\n\n /**\n * Patch operation type.\n */\n op: MelRuntimePatchOp;\n\n /**\n * Target path in snapshot.\n * Uses IR segments and is resolved to concrete PatchPath at evaluation time.\n */\n path: MelIRPatchPath;\n\n /**\n * Value expression (MEL IR) for set/merge operations.\n * Required for \"set\" and \"merge\", forbidden for \"unset\".\n */\n value?: MelExprNode;\n}\n\n// ============ Core Runtime Patch Types (Output) ============\n\n/**\n * Runtime ConditionalPatchOp for snapshot state mutations.\n *\n * This is the intermediate representation between Translator output\n * and final concrete Patch[]. Host must call evaluateRuntimePatches()\n * to get concrete values.\n *\n * @see SPEC v0.4.0 §17.5, §20\n */\nexport interface RuntimeConditionalPatchOp {\n /**\n * Optional condition expression (Core IR).\n * If present, patch is only applied when condition evaluates to true.\n *\n * @see SPEC v0.4.0 §18.6 (boolean-only conditions)\n */\n condition?: CoreExprNode;\n\n /**\n * Patch operation type.\n */\n op: \"set\" | \"unset\" | \"merge\";\n\n /**\n * Target path in IR form.\n * Evaluator resolves this to concrete PatchPath.\n */\n path: IRPatchPath;\n\n /**\n * Value expression (Core IR) for set/merge operations.\n * Required for \"set\" and \"merge\", undefined for \"unset\".\n */\n value?: CoreExprNode;\n}\n\n// ============ Lowering Function ============\n\n/**\n * Lower MEL runtime patches to Core IR.\n *\n * Transforms MEL IR expressions to Core IR expressions.\n * The returned patches still contain expressions that need to be\n * evaluated by evaluateRuntimePatches() to get concrete values.\n *\n * @param patches - MEL IR runtime patches from Translator\n * @param ctx - Expression lowering context\n * @returns Core IR runtime conditional patches\n *\n * @see SPEC v0.4.0 §17.5\n */\nexport function lowerRuntimePatches(\n patches: MelRuntimePatch[],\n ctx: ExprLoweringContext\n): RuntimeConditionalPatchOp[] {\n return patches.map((patch) => lowerRuntimePatch(patch, ctx));\n}\n\n/**\n * Lower a single MEL runtime patch to Core IR.\n */\nfunction lowerRuntimePatch(\n patch: MelRuntimePatch,\n ctx: ExprLoweringContext\n): RuntimeConditionalPatchOp {\n // Lower condition if present\n const condition = patch.condition\n ? lowerExprNode(patch.condition, ctx)\n : undefined;\n\n // Lower value if present (required for set/merge, forbidden for unset)\n const value = patch.value ? lowerExprNode(patch.value, ctx) : undefined;\n\n return {\n condition,\n op: patch.op,\n path: lowerRuntimePath(patch.path, ctx),\n value,\n };\n}\n\nfunction lowerRuntimePath(\n path: MelIRPatchPath,\n ctx: ExprLoweringContext\n): IRPatchPath {\n return path.map((segment) => {\n if (segment.kind === \"prop\") {\n return segment;\n }\n return { kind: \"expr\" as const, expr: lowerExprNode(segment.expr, ctx) };\n });\n}\n\n/**\n * Lower a single MEL runtime patch to Core IR.\n *\n * Exported for cases where individual patch lowering is needed.\n */\nexport { lowerRuntimePatch };\n","import { sha256Sync } from \"@manifesto-ai/core\";\n\nimport type { Diagnostic } from \"../diagnostics/types.js\";\nimport type { MelExprNode } from \"../lowering/lower-expr.js\";\nimport type { MelIRPatchPath } from \"../lowering/lower-runtime-patch.js\";\nimport type {\n GuardedStmtNode,\n InnerStmtNode,\n PathNode,\n PatchStmtNode,\n} from \"../parser/ast.js\";\nimport { toMelExpr } from \"./compile-mel-patch-expr.js\";\n\nexport interface PatchCollectContext {\n actionName: string;\n onceCounter: number;\n onceIntentCounter: number;\n whenCounter: number;\n}\n\nexport type ConditionedPatchStatement = {\n patch: PatchStmtNode;\n condition?: MelExprNode;\n};\n\nexport interface PatchCollectorDeps {\n toMelExpr: (expr: Parameters<typeof toMelExpr>[0]) => MelExprNode;\n mapLocation: (location: Diagnostic[\"location\"]) => Diagnostic[\"location\"];\n}\n\nexport class PatchStatementCollector {\n private readonly conditionComposer = new ConditionComposer();\n\n constructor(private readonly deps: PatchCollectorDeps) {}\n\n collect(\n stmts: GuardedStmtNode[] | InnerStmtNode[],\n errors: Diagnostic[],\n context: PatchCollectContext,\n parentCondition: MelExprNode | undefined\n ): ConditionedPatchStatement[] {\n return this.collectPatchStatements(stmts, errors, context, parentCondition);\n }\n\n private collectPatchStatements(\n stmts: GuardedStmtNode[] | InnerStmtNode[],\n errors: Diagnostic[],\n context: PatchCollectContext,\n parentCondition: MelExprNode | undefined\n ): ConditionedPatchStatement[] {\n const patchStatements: ConditionedPatchStatement[] = [];\n\n for (const stmt of stmts) {\n if (stmt.kind === \"patch\") {\n patchStatements.push({\n patch: stmt,\n condition: parentCondition,\n });\n continue;\n }\n\n if (stmt.kind === \"when\") {\n let condition = parentCondition;\n try {\n condition = this.conditionComposer.and(\n parentCondition,\n this.deps.toMelExpr(stmt.condition)\n );\n } catch (error) {\n errors.push({\n severity: \"error\",\n code: \"E_LOWER\",\n message: (error as Error).message,\n location: this.deps.mapLocation(stmt.condition.location),\n });\n }\n const whenMarkerId = sha256Sync(\n `${context.actionName}:${context.whenCounter}:when`\n );\n context.whenCounter += 1;\n\n const whenMarkerPath = {\n kind: \"path\" as const,\n segments: [\n {\n kind: \"propertySegment\",\n name: \"$mel\",\n location: stmt.location,\n },\n {\n kind: \"propertySegment\",\n name: \"__whenGuards\",\n location: stmt.location,\n },\n {\n kind: \"propertySegment\",\n name: whenMarkerId,\n location: stmt.location,\n },\n ],\n location: stmt.location,\n } satisfies PathNode;\n\n const whenMarkerExpr = pathToMelExpr(whenMarkerPath);\n\n const guardedBody = this.collectPatchStatements(\n stmt.body,\n errors,\n context,\n undefined\n ).map((statement) => ({\n patch: statement.patch,\n condition: this.conditionComposer.and(whenMarkerExpr, statement.condition),\n }));\n\n patchStatements.push(\n {\n patch: {\n kind: \"patch\",\n op: \"set\",\n path: whenMarkerPath,\n value: {\n kind: \"literal\",\n literalType: \"boolean\",\n value: true,\n location: stmt.location,\n },\n location: stmt.location,\n },\n condition,\n },\n ...guardedBody,\n {\n patch: {\n kind: \"patch\",\n op: \"unset\",\n path: whenMarkerPath,\n location: stmt.location,\n },\n }\n );\n continue;\n }\n\n if (stmt.kind === \"once\") {\n let condition = parentCondition;\n const markerExpr = pathToMelExpr(stmt.marker);\n const markerPath = stmt.marker;\n const markerLocation = stmt.location;\n let onceCondition: MelExprNode = {\n kind: \"call\",\n fn: \"neq\",\n args: [markerExpr, { kind: \"sys\", path: [\"meta\", \"intentId\"] }],\n };\n\n if (stmt.condition) {\n try {\n onceCondition = this.conditionComposer.and(\n onceCondition,\n this.deps.toMelExpr(stmt.condition)\n ) ?? onceCondition;\n } catch (error) {\n errors.push({\n severity: \"error\",\n code: \"E_LOWER\",\n message: (error as Error).message,\n location: this.deps.mapLocation(stmt.condition.location),\n });\n }\n }\n\n condition = this.conditionComposer.and(parentCondition, onceCondition);\n const onceScopeMarkerId = sha256Sync(\n `${context.actionName}:${context.onceCounter}:once`\n );\n context.onceCounter += 1;\n const onceScopeMarkerPath: PathNode = {\n kind: \"path\",\n segments: [\n {\n kind: \"propertySegment\",\n name: \"$mel\",\n location: markerLocation,\n },\n {\n kind: \"propertySegment\",\n name: \"__onceScopeGuards\",\n location: markerLocation,\n },\n {\n kind: \"propertySegment\",\n name: onceScopeMarkerId,\n location: markerLocation,\n },\n ],\n location: markerLocation,\n };\n const onceScopeMarkerExpr = pathToMelExpr(onceScopeMarkerPath);\n const scopedBodyPatchStatements = this.collectPatchStatements(\n stmt.body,\n errors,\n context,\n onceScopeMarkerExpr\n );\n patchStatements.push(\n {\n patch: {\n kind: \"patch\",\n op: \"set\",\n path: onceScopeMarkerPath,\n value: {\n kind: \"literal\",\n literalType: \"boolean\",\n value: true,\n location: markerLocation,\n },\n location: markerLocation,\n },\n condition,\n },\n {\n patch: {\n kind: \"patch\",\n op: \"set\",\n path: markerPath,\n value: {\n kind: \"systemIdent\",\n path: [\"meta\", \"intentId\"],\n location: markerLocation,\n },\n location: markerLocation,\n },\n condition: onceScopeMarkerExpr,\n },\n ...scopedBodyPatchStatements,\n {\n patch: {\n kind: \"patch\",\n op: \"unset\",\n path: onceScopeMarkerPath,\n location: markerLocation,\n },\n condition,\n }\n );\n continue;\n }\n\n if (stmt.kind === \"onceIntent\") {\n const markerScopeId = sha256Sync(\n `${context.actionName}:${context.onceCounter}:onceIntent`\n );\n context.onceCounter += 1;\n const markerScopePath: PathNode = {\n kind: \"path\" as const,\n segments: [\n {\n kind: \"propertySegment\",\n name: \"$mel\",\n location: stmt.location,\n },\n {\n kind: \"propertySegment\",\n name: \"__onceScopeGuards\",\n location: stmt.location,\n },\n {\n kind: \"propertySegment\",\n name: markerScopeId,\n location: stmt.location,\n },\n ],\n location: stmt.location,\n };\n const markerScopeExpr = pathToMelExpr(markerScopePath);\n const onceIntentGuardId = sha256Sync(\n `${context.actionName}:${context.onceIntentCounter}:intent`\n );\n context.onceIntentCounter += 1;\n\n const markerLocation = stmt.location;\n const onceIntentGuardPath = {\n kind: \"path\" as const,\n segments: [\n {\n kind: \"propertySegment\",\n name: \"$mel\",\n location: markerLocation,\n },\n {\n kind: \"propertySegment\",\n name: \"guards\",\n location: markerLocation,\n },\n {\n kind: \"propertySegment\",\n name: \"intent\",\n location: markerLocation,\n },\n {\n kind: \"propertySegment\",\n name: onceIntentGuardId,\n location: markerLocation,\n },\n ],\n location: markerLocation,\n } satisfies PathNode;\n\n let onceIntentCondition: MelExprNode = {\n kind: \"call\",\n fn: \"neq\",\n args: [\n pathToMelExpr(onceIntentGuardPath),\n { kind: \"sys\", path: [\"meta\", \"intentId\"] },\n ],\n };\n\n if (stmt.condition) {\n try {\n onceIntentCondition = this.conditionComposer.and(\n onceIntentCondition,\n this.deps.toMelExpr(stmt.condition)\n ) ?? onceIntentCondition;\n } catch (error) {\n errors.push({\n severity: \"error\",\n code: \"E_LOWER\",\n message: (error as Error).message,\n location: this.deps.mapLocation(stmt.condition.location),\n });\n }\n }\n\n const condition = this.conditionComposer.and(parentCondition, onceIntentCondition);\n\n const onceIntentGuardMapPath: PathNode = {\n kind: \"path\",\n segments: [\n {\n kind: \"propertySegment\",\n name: \"$mel\",\n location: markerLocation,\n },\n {\n kind: \"propertySegment\",\n name: \"guards\",\n location: markerLocation,\n },\n {\n kind: \"propertySegment\",\n name: \"intent\",\n location: markerLocation,\n },\n ],\n location: markerLocation,\n };\n\n const scopedBodyPatchStatements = this.collectPatchStatements(\n stmt.body,\n errors,\n context,\n markerScopeExpr\n );\n\n patchStatements.push(\n {\n patch: {\n kind: \"patch\",\n op: \"set\",\n path: markerScopePath,\n value: {\n kind: \"literal\",\n literalType: \"boolean\",\n value: true,\n location: markerLocation,\n },\n location: markerLocation,\n },\n condition,\n },\n {\n patch: {\n kind: \"patch\",\n op: \"merge\",\n path: onceIntentGuardMapPath,\n value: {\n kind: \"objectLiteral\",\n properties: [\n {\n kind: \"objectProperty\",\n key: onceIntentGuardId,\n value: {\n kind: \"systemIdent\",\n path: [\"meta\", \"intentId\"],\n location: markerLocation,\n },\n location: markerLocation,\n },\n ],\n location: markerLocation,\n },\n location: markerLocation,\n },\n condition: markerScopeExpr,\n },\n ...scopedBodyPatchStatements,\n {\n patch: {\n kind: \"patch\",\n op: \"unset\",\n path: markerScopePath,\n location: markerLocation,\n },\n condition,\n }\n );\n continue;\n }\n\n errors.push({\n severity: \"error\",\n code: \"E_UNSUPPORTED_STMT\",\n message: `Unsupported statement '${stmt.kind}' in patch text. Only patch statements are allowed.`,\n location: this.deps.mapLocation(stmt.location),\n });\n }\n\n return patchStatements;\n }\n}\n\nexport function compilePatchStmtToMelRuntime(\n patchStatement: ConditionedPatchStatement\n): { op: \"set\" | \"unset\" | \"merge\"; path: MelIRPatchPath; value?: MelExprNode; condition?: MelExprNode } {\n return {\n op: patchStatement.patch.op,\n path: toRuntimePatchPath(patchStatement.patch.path),\n ...(patchStatement.condition ? { condition: patchStatement.condition } : undefined),\n ...(patchStatement.patch.value\n ? { value: toMelExpr(patchStatement.patch.value) }\n : undefined),\n };\n}\n\nfunction pathToMelExpr(path: PathNode): MelExprNode {\n const segments = path.segments;\n let result: MelExprNode | undefined;\n\n for (const segment of segments) {\n if (segment.kind === \"propertySegment\") {\n const prop = { kind: \"prop\", name: segment.name } as const;\n if (!result) {\n result = { kind: \"get\", path: [prop] };\n } else {\n result = {\n kind: \"call\",\n fn: \"field\",\n args: [result, { kind: \"lit\", value: segment.name }],\n };\n }\n continue;\n }\n\n if (!result) {\n throw new Error(\"Path cannot start with index access in compileMelPatch guard.\");\n }\n\n result = {\n kind: \"call\",\n fn: \"at\",\n args: [result, toMelExpr(segment.index)],\n };\n }\n\n if (!result) {\n throw new Error(\"Empty patch guard path.\");\n }\n\n return result;\n}\n\nfunction toRuntimePatchPath(path: PathNode): MelIRPatchPath {\n return path.segments.map((segment) => {\n if (segment.kind === \"propertySegment\") {\n return { kind: \"prop\" as const, name: segment.name };\n }\n\n return { kind: \"expr\" as const, expr: toMelExpr(segment.index) };\n });\n}\n\nclass ConditionComposer {\n and(lhs: MelExprNode | undefined, rhs: MelExprNode | undefined): MelExprNode | undefined {\n if (!lhs) {\n return rhs;\n }\n\n if (!rhs) {\n return lhs;\n }\n\n return {\n kind: \"call\",\n fn: \"and\",\n args: [lhs, rhs],\n };\n }\n}\n","import type { BinaryOperator, ExprNode } from \"../parser/ast.js\";\nimport type { MelExprNode } from \"../lowering/lower-expr.js\";\n\nexport function isSyntheticPatchCondition(\n condition: ExprNode\n): condition is (ExprNode & { kind: \"literal\"; literalType: \"boolean\"; value: true }) {\n return (\n condition.kind === \"literal\" &&\n condition.literalType === \"boolean\" &&\n condition.value === true\n );\n}\n\nexport function toMelExpr(input: ExprNode): MelExprNode {\n switch (input.kind) {\n case \"literal\":\n return { kind: \"lit\", value: toMelPrimitive(input.value, input.literalType) };\n\n case \"identifier\":\n return {\n kind: \"get\",\n path: [{ kind: \"prop\", name: input.name }],\n };\n\n case \"systemIdent\":\n return { kind: \"sys\", path: input.path };\n\n case \"iterationVar\":\n return { kind: \"var\", name: input.name };\n\n case \"propertyAccess\": {\n const path = collectStaticMelExpr(input);\n if (path) {\n return path;\n }\n return {\n kind: \"call\",\n fn: \"field\",\n args: [toMelExpr(input.object), { kind: \"lit\", value: input.property }],\n };\n }\n\n case \"indexAccess\": {\n return {\n kind: \"call\",\n fn: \"at\",\n args: [toMelExpr(input.object), toMelExpr(input.index)],\n };\n }\n\n case \"functionCall\":\n return {\n kind: \"call\",\n fn: input.name,\n args: input.args.map(toMelExpr),\n };\n\n case \"unary\":\n if (input.operator === \"!\") {\n return {\n kind: \"call\",\n fn: \"not\",\n args: [toMelExpr(input.operand)],\n };\n }\n return {\n kind: \"call\",\n fn: \"sub\",\n args: [{ kind: \"lit\", value: 0 }, toMelExpr(input.operand)],\n };\n\n case \"binary\":\n return {\n kind: \"call\",\n fn: toMelBinaryOp(input.operator),\n args: [toMelExpr(input.left), toMelExpr(input.right)],\n };\n\n case \"ternary\":\n return {\n kind: \"call\",\n fn: \"if\",\n args: [\n toMelExpr(input.condition),\n toMelExpr(input.consequent),\n toMelExpr(input.alternate),\n ],\n };\n\n case \"objectLiteral\":\n return {\n kind: \"obj\",\n fields: input.properties.map((property) => ({\n key: property.key,\n value: toMelExpr(property.value),\n })),\n };\n\n case \"arrayLiteral\":\n return {\n kind: \"arr\",\n elements: input.elements.map(toMelExpr),\n };\n\n default:\n throw new Error(`Unsupported expression kind '${(input as ExprNode).kind}'`);\n }\n}\n\nfunction toMelPrimitive(\n value: unknown,\n literalType: \"number\" | \"string\" | \"boolean\" | \"null\"\n): null | boolean | number | string {\n if (literalType === \"null\") {\n return null;\n }\n\n if (literalType === \"number\") {\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"bigint\") {\n return Number(value);\n }\n if (typeof value === \"string\" && value.length > 0) {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n throw new Error(\"Invalid number literal\");\n }\n\n if (literalType === \"string\") {\n if (typeof value === \"string\") {\n return value;\n }\n throw new Error(\"Invalid string literal\");\n }\n\n if (literalType === \"boolean\") {\n if (typeof value === \"boolean\") {\n return value;\n }\n throw new Error(\"Invalid boolean literal\");\n }\n\n throw new Error(\"Unsupported literal type\");\n}\n\nfunction collectStaticMelExpr(expr: ExprNode): MelExprNode | null {\n if (expr.kind === \"identifier\") {\n return { kind: \"get\", path: [{ kind: \"prop\", name: expr.name }] };\n }\n\n if (expr.kind === \"iterationVar\") {\n if (expr.name !== \"item\") {\n return null;\n }\n return { kind: \"var\", name: \"item\" };\n }\n\n if (expr.kind === \"propertyAccess\") {\n const basePath = collectStaticMelExpr(expr.object);\n if (!basePath) {\n return null;\n }\n return {\n kind: \"call\",\n fn: \"field\",\n args: [basePath, { kind: \"lit\", value: expr.property }],\n };\n }\n\n return null;\n}\n\nfunction toMelBinaryOp(op: BinaryOperator): string {\n switch (op) {\n case \"+\":\n return \"add\";\n case \"-\":\n return \"sub\";\n case \"*\":\n return \"mul\";\n case \"/\":\n return \"div\";\n case \"%\":\n return \"mod\";\n case \"==\":\n return \"eq\";\n case \"!=\":\n return \"neq\";\n case \"<\":\n return \"lt\";\n case \"<=\":\n return \"lte\";\n case \">\":\n return \"gt\";\n case \">=\":\n return \"gte\";\n case \"&&\":\n return \"and\";\n case \"||\":\n return \"or\";\n case \"??\":\n return \"coalesce\";\n default:\n throw new Error(`Unsupported binary operator '${op}'`);\n }\n}\n","/**\n * Location mapping helpers for compile-mel-patch synthetic wrapper diagnostics.\n */\n\nimport type { Diagnostic } from \"../diagnostics/types.js\";\n\nexport const SYNTHETIC_PATCH_PREFIX_LINES = 3;\nexport const SYNTHETIC_PATCH_PREFIX_COLUMNS = 6;\n\nexport function computeLineStartOffsets(lines: string[]): number[] {\n const offsets: number[] = [];\n let offset = 0;\n for (const line of lines) {\n offsets.push(offset);\n offset += line.length + 1;\n }\n return offsets;\n}\n\nexport function makePatchLocationMapper(\n patchLines: string[],\n patchLineStarts: number[]\n): (location: Diagnostic[\"location\"]) => Diagnostic[\"location\"] {\n return (location) => remapLocationToPatchSource(location, patchLines, patchLineStarts);\n}\n\nexport function remapDiagnosticsToPatchSource(\n diagnostics: Diagnostic[],\n patchLines: string[],\n patchLineStarts: number[]\n): Diagnostic[] {\n return diagnostics.map((diagnostic) => remapDiagnosticToPatchSource(\n diagnostic,\n patchLines,\n patchLineStarts\n ));\n}\n\nfunction remapDiagnosticToPatchSource(\n diagnostic: Diagnostic,\n patchLines: string[],\n patchLineStarts: number[]\n): Diagnostic {\n return {\n ...diagnostic,\n location: remapLocationToPatchSource(\n diagnostic.location,\n patchLines,\n patchLineStarts\n ),\n };\n}\n\nfunction remapLocationToPatchSource(\n location: Diagnostic[\"location\"],\n patchLines: string[],\n patchLineStarts: number[]\n): Diagnostic[\"location\"] {\n return {\n ...location,\n start: remapPositionToPatchSource(location.start, patchLines, patchLineStarts),\n end: remapPositionToPatchSource(location.end, patchLines, patchLineStarts),\n };\n}\n\nfunction remapPositionToPatchSource(\n position: Diagnostic[\"location\"][\"start\"],\n patchLines: string[],\n patchLineStarts: number[]\n): Diagnostic[\"location\"][\"start\"] {\n const patchLine = position.line - SYNTHETIC_PATCH_PREFIX_LINES;\n const patchLineCount = patchLines.length;\n const clampedPatchLine = Math.min(Math.max(patchLine, 1), patchLineCount);\n\n const sourceLineStart = patchLineStarts[clampedPatchLine - 1] ?? 0;\n const sourceLineText = patchLines[clampedPatchLine - 1] ?? \"\";\n const maxSourceColumn = Math.max(sourceLineText.length + 1, 1);\n const sourceColumn = Math.min(\n Math.max(position.column - SYNTHETIC_PATCH_PREFIX_COLUMNS, 1),\n maxSourceColumn\n );\n\n return {\n line: clampedPatchLine,\n column: sourceColumn,\n offset: Math.max(sourceLineStart + sourceColumn - 1, 0),\n };\n}\n","import type { Diagnostic } from \"../diagnostics/types.js\";\nimport type { CompileMelPatchOptions, CompileMelPatchResult, CompileTrace } from \"./compile-mel.js\";\n\nimport { tokenize } from \"../lexer/index.js\";\nimport { parse } from \"../parser/index.js\";\nimport type { ProgramNode } from \"../parser/index.js\";\nimport type { ActionNode } from \"../parser/ast.js\";\nimport { lowerRuntimePatch } from \"../lowering/lower-runtime-patch.js\";\nimport { LoweringError } from \"../lowering/errors.js\";\nimport type { ExprLoweringContext } from \"../lowering/context.js\";\n\nimport {\n compilePatchStmtToMelRuntime,\n PatchCollectContext,\n PatchStatementCollector,\n} from \"./compile-mel-patch-collector.js\";\nimport { isSyntheticPatchCondition, toMelExpr } from \"./compile-mel-patch-expr.js\";\nimport {\n SYNTHETIC_PATCH_PREFIX_LINES,\n computeLineStartOffsets,\n makePatchLocationMapper,\n remapDiagnosticsToPatchSource,\n} from \"./compile-mel-patch-location.js\";\n\n/**\n * Synthetic action name for compile-time wrap.\n */\nconst SYNTHETIC_ACTION = \"__compileMelPatch\";\nconst SYNTHETIC_DOMAIN = \"__patchDomain\";\nconst SYNTHETIC_PATCH_INDENT = \" \";\n\n/**\n * Compile MEL patch text into RuntimeConditionalPatchOps.\n */\nexport function compileMelPatchText(\n melText: string,\n options: CompileMelPatchOptions\n): CompileMelPatchResult {\n const trace: CompileTrace[] = [];\n const warnings: Diagnostic[] = [];\n const errors: Diagnostic[] = [];\n const patchLines = melText.split(\"\\n\");\n const patchLineStarts = computeLineStartOffsets(patchLines);\n const mapLocation = makePatchLocationMapper(patchLines, patchLineStarts);\n\n const syntheticMel = buildSyntheticPatchProgram(melText, SYNTHETIC_ACTION);\n\n // Phase 1: Lex\n const lexStart = performance.now();\n let tokens: ReturnType<typeof tokenize>[\"tokens\"];\n try {\n const lexResult = tokenize(syntheticMel);\n tokens = lexResult.tokens;\n const lexErrors = remapDiagnosticsToPatchSource(\n lexResult.diagnostics.filter(d => d.severity === \"error\"),\n patchLines,\n patchLineStarts\n );\n if (lexErrors.length > 0) {\n errors.push(...lexErrors);\n trace.push({\n phase: \"lex\",\n durationMs: performance.now() - lexStart,\n details: { tokenCount: tokens.length },\n });\n return { ops: [], trace, warnings, errors };\n }\n } catch (error) {\n errors.push({\n severity: \"error\",\n code: \"E_LEX\",\n message: (error as Error).message,\n location: {\n start: { line: 1, column: 1, offset: 0 },\n end: { line: 1, column: 1, offset: 0 },\n },\n });\n trace.push({ phase: \"lex\", durationMs: performance.now() - lexStart });\n return { ops: [], trace, warnings, errors };\n }\n trace.push({\n phase: \"lex\",\n durationMs: performance.now() - lexStart,\n details: { tokenCount: tokens.length },\n });\n\n // Phase 2: Parse\n const parseStart = performance.now();\n let program: ProgramNode;\n try {\n const parseResult = parse(tokens);\n const parsedDiagnostics = remapDiagnosticsToPatchSource(\n parseResult.diagnostics,\n patchLines,\n patchLineStarts\n );\n const parseErrors = parsedDiagnostics.filter(d => d.severity === \"error\");\n const parseWarnings = parsedDiagnostics.filter(d => d.severity !== \"error\");\n\n if (parseErrors.length > 0) {\n errors.push(...parseErrors);\n warnings.push(...parseWarnings);\n trace.push({ phase: \"parse\", durationMs: performance.now() - parseStart });\n return { ops: [], trace, warnings, errors };\n }\n if (!parseResult.program) {\n errors.push({\n severity: \"error\",\n code: \"E_PARSE\",\n message: \"Failed to parse MEL patch program\",\n location: {\n start: { line: 1, column: 1, offset: 0 },\n end: { line: 1, column: 1, offset: 0 },\n },\n });\n warnings.push(...parseWarnings);\n trace.push({ phase: \"parse\", durationMs: performance.now() - parseStart });\n return { ops: [], trace, warnings, errors };\n }\n\n program = parseResult.program;\n warnings.push(...parseWarnings);\n } catch (error) {\n errors.push({\n severity: \"error\",\n code: \"E_PARSE\",\n message: (error as Error).message,\n location: {\n start: { line: 1, column: 1, offset: 0 },\n end: { line: 1, column: 1, offset: 0 },\n },\n });\n trace.push({ phase: \"parse\", durationMs: performance.now() - parseStart });\n return { ops: [], trace, warnings, errors };\n }\n trace.push({ phase: \"parse\", durationMs: performance.now() - parseStart });\n\n // Phase 3: Analyze\n const analyzeStart = performance.now();\n const collectContext: PatchCollectContext = {\n actionName: options.actionName,\n onceCounter: 0,\n onceIntentCounter: 0,\n whenCounter: 0,\n };\n const action = program.domain.members.find(\n (member): member is ActionNode =>\n member.kind === \"action\" && member.name === SYNTHETIC_ACTION\n );\n if (!action) {\n errors.push({\n severity: \"error\",\n code: \"E_ANALYZE\",\n message: `Synthetic patch action '${SYNTHETIC_ACTION}' not found during parsing`,\n location: {\n start: { line: 1, column: 1, offset: 0 },\n end: { line: 1, column: 1, offset: 0 },\n },\n });\n trace.push({ phase: \"analyze\", durationMs: performance.now() - analyzeStart });\n return { ops: [], trace, warnings, errors };\n }\n\n const expectedActionEndLine = patchLines.length + SYNTHETIC_PATCH_PREFIX_LINES + 2;\n if (action.location.end.line !== expectedActionEndLine) {\n errors.push({\n severity: \"error\",\n code: \"E_PATCH_WRAPPER\",\n message: `Malformed synthetic patch wrapper for action '${SYNTHETIC_ACTION}'.`,\n location: mapLocation(action.location),\n });\n trace.push({ phase: \"analyze\", durationMs: performance.now() - analyzeStart });\n return { ops: [], trace, warnings, errors };\n }\n\n const [patchRoot] = action.body;\n if (\n !patchRoot ||\n patchRoot.kind !== \"when\" ||\n !isSyntheticPatchCondition(patchRoot.condition) ||\n action.body.length !== 1\n ) {\n errors.push({\n severity: \"error\",\n code: \"E_PATCH_WRAPPER\",\n message: `Malformed synthetic patch wrapper for action '${SYNTHETIC_ACTION}'.`,\n location: mapLocation(action.location),\n });\n trace.push({ phase: \"analyze\", durationMs: performance.now() - analyzeStart });\n return { ops: [], trace, warnings, errors };\n }\n\n const collector = new PatchStatementCollector({\n mapLocation,\n toMelExpr,\n });\n const patchStatements = collector.collect(\n patchRoot.body,\n errors,\n collectContext,\n undefined\n );\n\n if (errors.length === 0 && melText.trim() !== \"\" && patchStatements.length === 0) {\n errors.push({\n severity: \"error\",\n code: \"E_PATCH_WRAPPER\",\n message:\n \"Patch wrapper parsing produced no patch statements. The patch source may be malformed.\",\n location: mapLocation(patchRoot.location),\n });\n }\n trace.push({\n phase: \"analyze\",\n durationMs: performance.now() - analyzeStart,\n details: { count: patchStatements.length },\n });\n\n if (errors.length > 0) {\n return { ops: [], trace, warnings, errors };\n }\n\n // Phase 4: Lowering\n const lowerStart = performance.now();\n const loweringContext: ExprLoweringContext = {\n mode: \"action\",\n allowSysPaths: options.allowSysPaths ?? { prefixes: [\"meta\", \"input\"] },\n fnTableVersion: options.fnTableVersion ?? \"1.0\",\n actionName: options.actionName,\n };\n\n const loweredOps: CompileMelPatchResult[\"ops\"] = [];\n for (const patchStatement of patchStatements) {\n try {\n const melPatch = compilePatchStmtToMelRuntime(patchStatement);\n loweredOps.push(lowerRuntimePatch(melPatch, loweringContext));\n } catch (error) {\n if (error instanceof LoweringError) {\n errors.push({\n severity: \"error\",\n code: error.code,\n message: error.message,\n location: mapLocation(patchStatement.patch.location),\n });\n } else if (error instanceof Error) {\n errors.push({\n severity: \"error\",\n code: \"E_LOWER\",\n message: error.message,\n location: mapLocation(patchStatement.patch.location),\n });\n } else {\n errors.push({\n severity: \"error\",\n code: \"E_LOWER\",\n message: \"Unknown lowering failure\",\n location: mapLocation(patchStatement.patch.location),\n });\n }\n }\n }\n\n trace.push({\n phase: \"lower\",\n durationMs: performance.now() - lowerStart,\n details: { count: loweredOps.length },\n });\n\n if (errors.length > 0) {\n return { ops: [], trace, warnings, errors };\n }\n\n return {\n ops: loweredOps,\n trace,\n warnings,\n errors,\n };\n}\n\nfunction buildSyntheticPatchProgram(melText: string, actionName: string): string {\n const indentedPatchText = melText\n .split(\"\\n\")\n .map((line) => `${SYNTHETIC_PATCH_INDENT}${line}`)\n .join(\"\\n\");\n\n return [\n `domain ${SYNTHETIC_DOMAIN} {`,\n ` action ${actionName}() {`,\n \" when true {\",\n indentedPatchText,\n \" }\",\n \" }\",\n \"}\",\n ].join(\"\\n\");\n}\n","/**\n * MEL Text Ingest API\n *\n * Compiles MEL text to DomainSchema or RuntimeConditionalPatchOp[].\n *\n * @see SPEC v0.4.0 §19\n */\n\nimport type { Diagnostic } from \"../diagnostics/types.js\";\nimport type { DomainSchema } from \"../generator/ir.js\";\nimport type { RuntimeConditionalPatchOp } from \"../lowering/lower-runtime-patch.js\";\n\nimport { tokenize, type Token } from \"../lexer/index.js\";\nimport { parse, type ProgramNode } from \"../parser/index.js\";\nimport { generate } from \"../generator/ir.js\";\nimport { analyzeScope } from \"../analyzer/scope.js\";\nimport { validateSemantics } from \"../analyzer/validator.js\";\nimport { compileMelPatchText } from \"./compile-mel-patch.js\";\n\n// ============ Types ============\n\n/**\n * Trace entry for compilation steps.\n */\nexport interface CompileTrace {\n phase: \"lex\" | \"parse\" | \"analyze\" | \"generate\" | \"lower\";\n durationMs: number;\n details?: Record<string, unknown>;\n}\n\n/**\n * Domain compilation options.\n */\nexport interface CompileMelDomainOptions {\n mode: \"domain\";\n fnTableVersion?: string;\n}\n\n/**\n * Domain compilation result.\n *\n * @see SPEC v0.4.0 §19.1\n */\nexport interface CompileMelDomainResult {\n /**\n * Compiled schema, or null if errors occurred.\n */\n schema: DomainSchema | null;\n\n /**\n * Compilation trace.\n */\n trace: CompileTrace[];\n\n /**\n * Warning diagnostics.\n */\n warnings: Diagnostic[];\n\n /**\n * Error diagnostics.\n */\n errors: Diagnostic[];\n}\n\n/**\n * Patch compilation options.\n */\nexport interface CompileMelPatchOptions {\n mode: \"patch\";\n\n /**\n * Action name for context.\n */\n actionName: string;\n\n /**\n * Allowed system path prefixes.\n * Default: [\"meta\", \"input\"] (system is forbidden per §20.3).\n */\n allowSysPaths?: { prefixes: (\"meta\" | \"input\")[] };\n\n /**\n * Function table version.\n */\n fnTableVersion?: string;\n}\n\n/**\n * Patch compilation result.\n *\n * @see SPEC v0.4.0 §19.2\n */\nexport interface CompileMelPatchResult {\n /**\n * Compiled patch operations.\n * These still contain Core IR expressions that need evaluation.\n */\n ops: RuntimeConditionalPatchOp[];\n\n /**\n * Compilation trace.\n */\n trace: CompileTrace[];\n\n /**\n * Warning diagnostics.\n */\n warnings: Diagnostic[];\n\n /**\n * Error diagnostics.\n */\n errors: Diagnostic[];\n}\n\n// ============ Main Functions ============\n\n/**\n * Compile MEL text to DomainSchema.\n *\n * Takes a complete MEL domain definition and produces a DomainSchema\n * suitable for use with core.compute().\n *\n * @param melText - MEL domain source text\n * @param options - Compilation options\n * @returns Compilation result with schema or errors\n *\n * @see SPEC v0.4.0 §19.1\n */\nexport function compileMelDomain(\n melText: string,\n options?: CompileMelDomainOptions\n): CompileMelDomainResult {\n const trace: CompileTrace[] = [];\n const warnings: Diagnostic[] = [];\n const errors: Diagnostic[] = [];\n\n // Phase 1: Lex\n const lexStart = performance.now();\n let tokens: Token[];\n try {\n const lexResult = tokenize(melText);\n tokens = lexResult.tokens;\n\n // Collect lexer diagnostics (unterminated strings, invalid characters, etc.)\n const lexErrors = lexResult.diagnostics.filter(d => d.severity === \"error\");\n if (lexErrors.length > 0) {\n errors.push(...lexErrors);\n trace.push({ phase: \"lex\", durationMs: performance.now() - lexStart, details: { tokenCount: tokens.length } });\n return { schema: null, trace, warnings, errors };\n }\n const lexWarnings = lexResult.diagnostics.filter(d => d.severity === \"warning\");\n warnings.push(...lexWarnings);\n } catch (e) {\n const error = e as Error;\n errors.push({\n severity: \"error\",\n code: \"E_LEX\",\n message: error.message,\n location: { start: { line: 1, column: 1, offset: 0 }, end: { line: 1, column: 1, offset: 0 } },\n });\n trace.push({ phase: \"lex\", durationMs: performance.now() - lexStart });\n return { schema: null, trace, warnings, errors };\n }\n trace.push({ phase: \"lex\", durationMs: performance.now() - lexStart, details: { tokenCount: tokens.length } });\n\n // Phase 2: Parse\n const parseStart = performance.now();\n let ast: ProgramNode;\n try {\n const parseResult = parse(tokens);\n const parseErrors = parseResult.diagnostics.filter(d => d.severity === \"error\");\n if (parseErrors.length > 0) {\n errors.push(...parseErrors);\n trace.push({ phase: \"parse\", durationMs: performance.now() - parseStart });\n return { schema: null, trace, warnings, errors: capDiagnostics(errors) };\n }\n ast = parseResult.program as ProgramNode;\n } catch (e) {\n const error = e as Error;\n errors.push({\n severity: \"error\",\n code: \"E_PARSE\",\n message: error.message,\n location: { start: { line: 1, column: 1, offset: 0 }, end: { line: 1, column: 1, offset: 0 } },\n });\n trace.push({ phase: \"parse\", durationMs: performance.now() - parseStart });\n return { schema: null, trace, warnings, errors };\n }\n trace.push({ phase: \"parse\", durationMs: performance.now() - parseStart });\n\n // Phase 2.5: Semantic Analysis (scope + validation)\n const analyzeStart = performance.now();\n const scopeResult = analyzeScope(ast);\n const validateResult = validateSemantics(ast);\n const analyzeErrors = [\n ...scopeResult.diagnostics.filter(d => d.severity === \"error\"),\n ...validateResult.diagnostics.filter(d => d.severity === \"error\"),\n ];\n const analyzeWarnings = [\n ...scopeResult.diagnostics.filter(d => d.severity === \"warning\"),\n ...validateResult.diagnostics.filter(d => d.severity === \"warning\"),\n ];\n warnings.push(...analyzeWarnings);\n trace.push({ phase: \"analyze\", durationMs: performance.now() - analyzeStart });\n\n if (analyzeErrors.length > 0) {\n errors.push(...analyzeErrors);\n return { schema: null, trace, warnings, errors };\n }\n\n // Phase 3: Generate IR\n const genStart = performance.now();\n const genResult = generate(ast);\n trace.push({ phase: \"generate\", durationMs: performance.now() - genStart });\n\n // Separate warnings and errors from generation\n for (const diag of genResult.diagnostics) {\n if (diag.severity === \"warning\") {\n warnings.push(diag);\n } else {\n errors.push(diag);\n }\n }\n\n return {\n schema: genResult.schema,\n trace,\n warnings,\n errors: capDiagnostics(errors),\n };\n}\n\n/** Cap diagnostics to prevent error flooding in output. */\nconst MAX_ERRORS = 10;\nfunction capDiagnostics(diagnostics: Diagnostic[]): Diagnostic[] {\n if (diagnostics.length <= MAX_ERRORS) return diagnostics;\n const capped = diagnostics.slice(0, MAX_ERRORS);\n capped.push({\n severity: \"error\",\n code: \"E_TOO_MANY\",\n message: `... and ${diagnostics.length - MAX_ERRORS} more error(s). Fix the errors above first.`,\n location: { start: { line: 0, column: 0, offset: 0 }, end: { line: 0, column: 0, offset: 0 } },\n });\n return capped;\n}\n\n/**\n * Compile MEL patch text to RuntimeConditionalPatchOp[].\n *\n * Takes MEL patch statements (set, unset, merge) and produces\n * RuntimeConditionalPatchOp[] with Core IR expressions.\n *\n * The returned ops still contain expressions that need to be evaluated\n * by evaluateRuntimePatches() to get concrete values.\n *\n * Constraints:\n * - §20.3: $system.* is forbidden in Translator path\n *\n * @param melText - MEL patch source text\n * @param options - Compilation options\n * @returns Compilation result with ops or errors\n *\n * @see SPEC v0.4.0 §19.2\n */\nexport function compileMelPatch(\n melText: string,\n options: CompileMelPatchOptions\n): CompileMelPatchResult {\n return compileMelPatchText(melText, options);\n}\n"],"mappings":"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","names":["value","Precedence","createContext","isBinaryOp","sha256Sync","sha256Sync"]}
|