@manifesto-ai/compiler 3.2.0 → 3.3.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.
@@ -1 +0,0 @@
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/expr-type-surface.ts","../src/analyzer/entity-primitives.ts","../src/analyzer/validator.ts","../src/lowering/context.ts","../src/lowering/errors.ts","../src/utils/unicode-order.ts","../src/lowering/lower-expr.ts","../src/lowering/lower-patch.ts","../src/lowering/lower-runtime-patch.ts","../src/lowering/to-mel-expr.ts","../src/generator/ir.ts","../src/generator/runtime-lowering.ts","../src/analyzer/flow-composition.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)\", \"E004\");\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)\", \"E004\");\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, code = \"MEL_LEXER\"): void {\n const location = this.currentLocation();\n this.diagnostics.push({\n severity: \"error\",\n code,\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 | FlowDeclNode;\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 * Flow declaration (v0.7.0 / ADR-013a)\n * Raw AST preserves flow declarations until the expansion pass removes them.\n */\nexport interface FlowDeclNode extends ASTNode {\n kind: \"flow\";\n name: string;\n params: ParamNode[];\n body: FlowStmtNode[];\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 =\n | WhenStmtNode\n | OnceStmtNode\n | OnceIntentStmtNode\n | IncludeStmtNode\n | FailStmtNode\n | StopStmtNode;\n\n/**\n * Raw flow statement types (top-level in flow body).\n * Parser stays permissive; validation narrows the allowed subset.\n */\nexport type FlowStmtNode =\n | WhenStmtNode\n | IncludeStmtNode\n | OnceStmtNode\n | OnceIntentStmtNode\n | PatchStmtNode\n | EffectStmtNode;\n\n/**\n * Inner statement types (inside guards)\n */\nexport type InnerStmtNode =\n | PatchStmtNode\n | EffectStmtNode\n | WhenStmtNode\n | OnceStmtNode\n | OnceIntentStmtNode\n | IncludeStmtNode\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 * Include statement (v0.7.0 / ADR-013a)\n * Raw AST preserves include sites until the expansion pass inlines them.\n */\nexport interface IncludeStmtNode extends ASTNode {\n kind: \"include\";\n flowName: string;\n args: ExprNode[];\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 { 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 FlowDeclNode,\n type ParamNode,\n type GuardedStmtNode,\n type FlowStmtNode,\n type InnerStmtNode,\n type WhenStmtNode,\n type OnceStmtNode,\n type OnceIntentStmtNode,\n type IncludeStmtNode,\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 if (this.isFlowDeclContext()) return this.parseFlowDecl();\n\n this.error(`Unexpected token '${this.peek().lexeme}'. Expected 'state', 'computed', 'action', or 'flow'.`);\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 parseFlowDecl(): FlowDeclNode {\n const startToken = this.consume(\"IDENTIFIER\", \"Expected 'flow'\");\n const name = this.consume(\"IDENTIFIER\", \"Expected flow name\").lexeme;\n this.consume(\"LPAREN\", \"Expected '(' after flow 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 this.consume(\"LBRACE\", \"Expected '{' to start flow body\");\n\n const body: FlowStmtNode[] = [];\n while (!this.check(\"RBRACE\") && !this.isAtEnd()) {\n const stmt = this.parseFlowStmt();\n if (stmt) body.push(stmt);\n }\n\n const end = this.consume(\"RBRACE\", \"Expected '}' to close flow\").location;\n\n return {\n kind: \"flow\",\n name,\n params,\n body,\n location: mergeLocations(startToken.location, 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 if (this.isIncludeContext()) return this.parseIncludeStmt();\n if (this.check(\"FAIL\")) return this.parseFailStmt();\n if (this.check(\"STOP\")) return this.parseStopStmt();\n\n // Detect common mistake: patch/effect without when block\n const token = this.peek();\n if (token.kind === \"PATCH\" || token.lexeme === \"patch\" ||\n token.kind === \"EFFECT\" || token.lexeme === \"effect\") {\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', 'onceIntent', 'include', 'fail', or 'stop'.`);\n this.advance();\n return null;\n }\n\n private parseFlowStmt(): FlowStmtNode | null {\n if (this.check(\"WHEN\")) return this.parseWhenStmt();\n if (this.isIncludeContext()) return this.parseIncludeStmt();\n if (this.check(\"ONCE\")) return this.parseOnceStmt();\n if (this.isOnceIntentContext()) return this.parseOnceIntentStmt();\n if (this.check(\"PATCH\")) return this.parsePatchStmt();\n if (this.check(\"EFFECT\")) return this.parseEffectStmt();\n\n this.error(`Unexpected token '${this.peek().lexeme}'. Expected 'when', 'include', 'once', 'onceIntent', 'patch', or 'effect'.`);\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 valid action-body statements at depth 0.\n if (\n braceDepth === 0 &&\n (\n t.kind === \"WHEN\" ||\n t.kind === \"ONCE\" ||\n t.lexeme === \"onceIntent\" ||\n this.isIncludeContext() ||\n t.kind === \"FAIL\" ||\n t.kind === \"STOP\"\n )\n ) {\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.isIncludeContext()) return this.parseIncludeStmt();\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', 'include', 'fail', or 'stop'.`);\n this.advance();\n return null;\n }\n\n private parseIncludeStmt(): IncludeStmtNode {\n const startToken = this.consume(\"IDENTIFIER\", \"Expected 'include'\");\n const flowNameToken = this.consume(\"IDENTIFIER\", \"Expected flow name after 'include'\");\n this.consume(\"LPAREN\", \"Expected '(' after flow name\");\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 include arguments\").location;\n\n return {\n kind: \"include\",\n flowName: flowNameToken.lexeme,\n args,\n location: mergeLocations(startToken.location, end),\n };\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 return this.peekAt(1);\n }\n\n private peekAt(offset: number): Token {\n if (this.current + offset >= this.tokens.length) {\n return this.tokens[this.tokens.length - 1];\n }\n return this.tokens[this.current + offset];\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 isFlowDeclContext(): boolean {\n if (!this.check(\"IDENTIFIER\")) return false;\n const keyword = this.peek();\n if (keyword.lexeme !== \"flow\") return false;\n return this.peekNext().kind === \"IDENTIFIER\" && this.peekAt(2).kind === \"LPAREN\";\n }\n\n private isIncludeContext(): boolean {\n if (!this.check(\"IDENTIFIER\")) return false;\n const keyword = this.peek();\n if (keyword.lexeme !== \"include\") return false;\n return this.peekNext().kind === \"IDENTIFIER\" && this.peekAt(2).kind === \"LPAREN\";\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 } else if (member.kind === \"flow\") {\n // Flow declarations are compiler-only and removed before canonical analysis.\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 case \"include\":\n case \"fail\":\n case \"stop\":\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","import type {\n ComputedNode,\n DomainNode,\n ExprNode,\n ParamNode,\n TypeDeclNode,\n TypeExprNode,\n} from \"../parser/ast.js\";\n\nexport type TypeEnv = Map<string, TypeExprNode>;\nexport type ComparableSurfaceClass = \"primitive\" | \"nonprimitive\" | \"unknown\";\n\nexport interface DomainTypeSymbols {\n stateTypes: Map<string, TypeExprNode>;\n computedDecls: Map<string, ComputedNode>;\n typeDefs: Map<string, TypeDeclNode>;\n computedTypeCache: Map<string, TypeExprNode | null>;\n computedTypeInFlight: Set<string>;\n}\n\nconst PRIMITIVE_BOOLEAN_CALLS = new Set([\n \"eq\",\n \"neq\",\n \"gt\",\n \"gte\",\n \"lt\",\n \"lte\",\n \"and\",\n \"or\",\n \"not\",\n \"isNull\",\n \"isNotNull\",\n \"hasKey\",\n \"startsWith\",\n \"endsWith\",\n \"strIncludes\",\n \"includes\",\n \"every\",\n \"some\",\n \"existsById\",\n]);\n\nconst PRIMITIVE_NUMBER_CALLS = new Set([\n \"add\",\n \"sub\",\n \"mul\",\n \"div\",\n \"mod\",\n \"abs\",\n \"floor\",\n \"ceil\",\n \"round\",\n \"sqrt\",\n \"pow\",\n \"len\",\n \"strlen\",\n \"indexOf\",\n \"sum\",\n \"min\",\n \"max\",\n \"toNumber\",\n]);\n\nconst PRIMITIVE_STRING_CALLS = new Set([\n \"trim\",\n \"lower\",\n \"upper\",\n \"concat\",\n \"typeof\",\n \"toString\",\n \"substring\",\n \"substr\",\n \"replace\",\n]);\n\nconst NONPRIMITIVE_CALLS = new Set([\n \"keys\",\n \"values\",\n \"entries\",\n \"merge\",\n \"filter\",\n \"map\",\n \"append\",\n \"reverse\",\n \"unique\",\n \"flat\",\n \"split\",\n \"fromEntries\",\n]);\n\nconst ENTITY_TRANSFORM_CALLS = new Set([\"updateById\", \"removeById\"]);\n\nexport function collectDomainTypeSymbols(domain: DomainNode): DomainTypeSymbols {\n const stateTypes = new Map<string, TypeExprNode>();\n const computedDecls = new Map<string, ComputedNode>();\n const typeDefs = new Map<string, TypeDeclNode>();\n\n for (const typeDecl of domain.types) {\n 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 stateTypes.set(field.name, field.typeExpr);\n }\n continue;\n }\n\n if (member.kind === \"computed\") {\n computedDecls.set(member.name, member);\n }\n }\n\n return {\n stateTypes,\n computedDecls,\n typeDefs,\n computedTypeCache: new Map(),\n computedTypeInFlight: new Set(),\n };\n}\n\nexport function createActionTypeEnv(params: readonly ParamNode[]): TypeEnv {\n const env = new Map<string, TypeExprNode>();\n for (const param of params) {\n env.set(param.name, param.typeExpr);\n }\n return env;\n}\n\nexport function inferExprType(\n expr: ExprNode,\n env: TypeEnv,\n symbols: DomainTypeSymbols\n): TypeExprNode | null {\n switch (expr.kind) {\n case \"literal\":\n return literalTypeFromValue(expr.value, expr.location);\n\n case \"identifier\":\n return env.get(expr.name) ?? symbols.stateTypes.get(expr.name) ?? inferComputedType(expr.name, symbols);\n\n case \"propertyAccess\":\n return getPropertyType(inferExprType(expr.object, env, symbols), expr.property, symbols);\n\n case \"indexAccess\":\n return getIndexType(inferExprType(expr.object, env, symbols), symbols);\n\n case \"objectLiteral\":\n return {\n kind: \"objectType\",\n fields: expr.properties\n .map((property) => {\n const propertyType = inferExprType(property.value, env, symbols);\n if (!propertyType) {\n return null;\n }\n return {\n kind: \"typeField\" as const,\n name: property.key,\n typeExpr: propertyType,\n optional: false,\n location: property.location,\n };\n })\n .filter((field): field is NonNullable<typeof field> => field !== null),\n location: expr.location,\n };\n\n case \"arrayLiteral\": {\n const elementType = joinTypeCandidates(\n expr.elements.map((element) => inferExprType(element, env, symbols)),\n expr.location\n );\n if (!elementType) {\n return null;\n }\n return {\n kind: \"arrayType\",\n elementType,\n location: expr.location,\n };\n }\n\n case \"unary\":\n return inferUnaryType(expr);\n\n case \"binary\":\n return inferBinaryType(expr, env, symbols);\n\n case \"ternary\":\n return joinTypeCandidates(\n [\n inferExprType(expr.consequent, env, symbols),\n inferExprType(expr.alternate, env, symbols),\n ],\n expr.location\n );\n\n case \"functionCall\":\n return inferFunctionCallType(expr, env, symbols);\n\n case \"systemIdent\":\n return null;\n\n case \"iterationVar\":\n return env.get(\"$item\") ?? null;\n }\n}\n\nexport function classifyComparableExpr(\n expr: ExprNode,\n env: TypeEnv,\n symbols: DomainTypeSymbols\n): ComparableSurfaceClass {\n const inferred = inferExprType(expr, env, symbols);\n if (inferred) {\n return classifyComparableType(inferred, symbols);\n }\n\n switch (expr.kind) {\n case \"literal\":\n return \"primitive\";\n\n case \"objectLiteral\":\n case \"arrayLiteral\":\n return \"nonprimitive\";\n\n case \"binary\":\n if (expr.operator === \"??\") {\n return joinComparableClasses([\n classifyComparableExpr(expr.left, env, symbols),\n classifyComparableExpr(expr.right, env, symbols),\n ]);\n }\n if (expr.operator === \"==\" || expr.operator === \"!=\") {\n return \"primitive\";\n }\n if (\n expr.operator === \"+\" ||\n expr.operator === \"-\" ||\n expr.operator === \"*\" ||\n expr.operator === \"/\" ||\n expr.operator === \"%\" ||\n expr.operator === \"<\" ||\n expr.operator === \"<=\" ||\n expr.operator === \">\" ||\n expr.operator === \">=\" ||\n expr.operator === \"&&\" ||\n expr.operator === \"||\"\n ) {\n return \"primitive\";\n }\n return \"unknown\";\n\n case \"unary\":\n return \"primitive\";\n\n case \"ternary\":\n return joinComparableClasses([\n classifyComparableExpr(expr.consequent, env, symbols),\n classifyComparableExpr(expr.alternate, env, symbols),\n ]);\n\n case \"functionCall\":\n if (NONPRIMITIVE_CALLS.has(expr.name)) {\n return \"nonprimitive\";\n }\n\n if (\n PRIMITIVE_BOOLEAN_CALLS.has(expr.name) ||\n PRIMITIVE_NUMBER_CALLS.has(expr.name) ||\n PRIMITIVE_STRING_CALLS.has(expr.name) ||\n expr.name === \"toBoolean\"\n ) {\n return \"primitive\";\n }\n\n if ((expr.name === \"cond\" || expr.name === \"if\") && expr.args.length >= 3) {\n return joinComparableClasses([\n classifyComparableExpr(expr.args[1], env, symbols),\n classifyComparableExpr(expr.args[2], env, symbols),\n ]);\n }\n\n if (expr.name === \"coalesce\") {\n return joinComparableClasses(\n expr.args.map((arg) => classifyComparableExpr(arg, env, symbols))\n );\n }\n\n return \"unknown\";\n\n case \"identifier\":\n case \"propertyAccess\":\n case \"indexAccess\":\n case \"systemIdent\":\n case \"iterationVar\":\n return \"unknown\";\n }\n}\n\nexport function classifyComparableType(\n typeExpr: TypeExprNode | null,\n symbols: DomainTypeSymbols\n): ComparableSurfaceClass {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved) {\n return \"unknown\";\n }\n\n switch (resolved.kind) {\n case \"simpleType\":\n return resolved.name === \"object\"\n ? \"nonprimitive\"\n : resolved.name === \"string\" ||\n resolved.name === \"number\" ||\n resolved.name === \"boolean\" ||\n resolved.name === \"null\"\n ? \"primitive\"\n : \"unknown\";\n\n case \"literalType\":\n return \"primitive\";\n\n case \"arrayType\":\n case \"recordType\":\n case \"objectType\":\n return \"nonprimitive\";\n\n case \"unionType\":\n return joinComparableClasses(\n resolved.types.map((member) => classifyComparableType(member, symbols))\n );\n }\n}\n\nexport function resolveType(\n typeExpr: TypeExprNode | null,\n symbols: DomainTypeSymbols,\n seen = new Set<string>()\n): TypeExprNode | null {\n if (!typeExpr) {\n return null;\n }\n\n if (typeExpr.kind === \"simpleType\" && symbols.typeDefs.has(typeExpr.name)) {\n if (seen.has(typeExpr.name)) {\n return null;\n }\n seen.add(typeExpr.name);\n return resolveType(symbols.typeDefs.get(typeExpr.name)!.typeExpr, symbols, seen);\n }\n\n return typeExpr;\n}\n\nexport function getPropertyType(\n typeExpr: TypeExprNode | null,\n property: string,\n symbols: DomainTypeSymbols\n): TypeExprNode | null {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved) {\n return null;\n }\n\n if (resolved.kind === \"objectType\") {\n const field = resolved.fields.find((candidate) => candidate.name === property);\n return field?.typeExpr ?? null;\n }\n\n if (resolved.kind === \"unionType\") {\n const memberTypes = resolved.types\n .filter((member) => !isNullType(member))\n .map((member) => getPropertyType(member, property, symbols))\n .filter((member): member is TypeExprNode => member !== null);\n\n return joinTypeCandidates(memberTypes, resolved.location);\n }\n\n return null;\n}\n\nexport function getIndexType(\n typeExpr: TypeExprNode | null,\n symbols: DomainTypeSymbols\n): TypeExprNode | null {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved) {\n return null;\n }\n\n if (resolved.kind === \"arrayType\") {\n return resolved.elementType;\n }\n\n if (resolved.kind === \"recordType\") {\n return resolved.valueType;\n }\n\n if (resolved.kind === \"unionType\") {\n const memberTypes = resolved.types\n .filter((member) => !isNullType(member))\n .map((member) => getIndexType(member, symbols))\n .filter((member): member is TypeExprNode => member !== null);\n\n return joinTypeCandidates(memberTypes, resolved.location);\n }\n\n return null;\n}\n\nexport function getArrayElementType(\n typeExpr: TypeExprNode | null,\n symbols: DomainTypeSymbols\n): TypeExprNode | null {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved) {\n return null;\n }\n\n if (resolved.kind === \"arrayType\") {\n return resolved.elementType;\n }\n\n if (resolved.kind === \"unionType\") {\n const candidates = resolved.types\n .filter((member) => !isNullType(member))\n .map((member) => getArrayElementType(member, symbols))\n .filter((member): member is TypeExprNode => member !== null);\n\n return joinTypeCandidates(candidates, resolved.location);\n }\n\n return null;\n}\n\nexport function isPrimitiveEntityIdType(typeExpr: TypeExprNode, symbols: DomainTypeSymbols): boolean {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved) {\n return false;\n }\n\n switch (resolved.kind) {\n case \"simpleType\":\n return resolved.name === \"string\" || resolved.name === \"number\";\n\n case \"literalType\":\n return typeof resolved.value === \"string\" || typeof resolved.value === \"number\";\n\n case \"unionType\":\n return resolved.types.length > 0 && resolved.types.every((member) => isPrimitiveEntityIdType(member, symbols));\n\n default:\n return false;\n }\n}\n\nexport function isNullType(typeExpr: TypeExprNode): boolean {\n return (\n (typeExpr.kind === \"simpleType\" && typeExpr.name === \"null\") ||\n (typeExpr.kind === \"literalType\" && typeExpr.value === null)\n );\n}\n\nfunction inferComputedType(name: string, symbols: DomainTypeSymbols): TypeExprNode | null {\n if (symbols.computedTypeCache.has(name)) {\n return symbols.computedTypeCache.get(name) ?? null;\n }\n\n const computed = symbols.computedDecls.get(name);\n if (!computed) {\n return null;\n }\n\n if (symbols.computedTypeInFlight.has(name)) {\n return null;\n }\n\n symbols.computedTypeInFlight.add(name);\n const inferred = inferExprType(computed.expression, new Map(), symbols);\n symbols.computedTypeInFlight.delete(name);\n symbols.computedTypeCache.set(name, inferred);\n return inferred;\n}\n\nfunction inferUnaryType(expr: Extract<ExprNode, { kind: \"unary\" }>): TypeExprNode {\n return expr.operator === \"!\"\n ? simpleType(\"boolean\", expr.location)\n : simpleType(\"number\", expr.location);\n}\n\nfunction inferBinaryType(\n expr: Extract<ExprNode, { kind: \"binary\" }>,\n env: TypeEnv,\n symbols: DomainTypeSymbols\n): TypeExprNode | null {\n switch (expr.operator) {\n case \"==\":\n case \"!=\":\n case \"<\":\n case \"<=\":\n case \">\":\n case \">=\":\n case \"&&\":\n case \"||\":\n return simpleType(\"boolean\", expr.location);\n\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n case \"%\":\n return simpleType(\"number\", expr.location);\n\n case \"??\":\n return joinTypeCandidates(\n [\n inferExprType(expr.left, env, symbols),\n inferExprType(expr.right, env, symbols),\n ],\n expr.location\n );\n }\n}\n\nfunction inferFunctionCallType(\n expr: Extract<ExprNode, { kind: \"functionCall\" }>,\n env: TypeEnv,\n symbols: DomainTypeSymbols\n): TypeExprNode | null {\n if (PRIMITIVE_BOOLEAN_CALLS.has(expr.name)) {\n return simpleType(\"boolean\", expr.location);\n }\n\n if (PRIMITIVE_NUMBER_CALLS.has(expr.name)) {\n return simpleType(\"number\", expr.location);\n }\n\n if (PRIMITIVE_STRING_CALLS.has(expr.name)) {\n return simpleType(\"string\", expr.location);\n }\n\n if (expr.name === \"toBoolean\") {\n return simpleType(\"boolean\", expr.location);\n }\n\n if (expr.name === \"findById\" && expr.args.length >= 1) {\n const elementType = getArrayElementType(inferExprType(expr.args[0], env, symbols), symbols);\n if (!elementType) {\n return null;\n }\n return joinTypeCandidates([elementType, simpleType(\"null\", expr.location)], expr.location);\n }\n\n if (expr.name === \"find\" && expr.args.length >= 1) {\n const elementType = getArrayElementType(inferExprType(expr.args[0], env, symbols), symbols);\n if (!elementType) {\n return null;\n }\n return joinTypeCandidates([elementType, simpleType(\"null\", expr.location)], expr.location);\n }\n\n if (expr.name === \"filter\" && expr.args.length >= 1) {\n return inferExprType(expr.args[0], env, symbols);\n }\n\n if (expr.name === \"map\" && expr.args.length >= 2) {\n const arrayType = inferExprType(expr.args[0], env, symbols);\n const elementType = getArrayElementType(arrayType, symbols);\n if (!elementType) {\n return null;\n }\n\n const mapperType = inferExprType(\n expr.args[1],\n extendCollectionEnv(env, elementType),\n symbols\n );\n if (!mapperType) {\n return null;\n }\n\n return {\n kind: \"arrayType\",\n elementType: mapperType,\n location: expr.location,\n };\n }\n\n if ((expr.name === \"first\" || expr.name === \"last\") && expr.args.length >= 1) {\n return getArrayElementType(inferExprType(expr.args[0], env, symbols), symbols);\n }\n\n if (expr.name === \"at\" && expr.args.length >= 1) {\n return getIndexType(inferExprType(expr.args[0], env, symbols), symbols);\n }\n\n if (expr.name === \"field\" && expr.args.length >= 2) {\n const property = getStaticPropertyName(expr.args[1]);\n if (!property) {\n return null;\n }\n return getPropertyType(inferExprType(expr.args[0], env, symbols), property, symbols);\n }\n\n if (ENTITY_TRANSFORM_CALLS.has(expr.name) && expr.args.length >= 1) {\n return inferExprType(expr.args[0], env, symbols);\n }\n\n if ((expr.name === \"cond\" || expr.name === \"if\") && expr.args.length >= 3) {\n return joinTypeCandidates(\n [\n inferExprType(expr.args[1], env, symbols),\n inferExprType(expr.args[2], env, symbols),\n ],\n expr.location\n );\n }\n\n if (expr.name === \"coalesce\") {\n return joinTypeCandidates(\n expr.args.map((arg) => inferExprType(arg, env, symbols)),\n expr.location\n );\n }\n\n if (expr.name === \"slice\" && expr.args.length >= 1) {\n return inferExprType(expr.args[0], env, symbols);\n }\n\n if (expr.name === \"split\") {\n return {\n kind: \"arrayType\",\n elementType: simpleType(\"string\", expr.location),\n location: expr.location,\n };\n }\n\n if (expr.name === \"keys\") {\n return {\n kind: \"arrayType\",\n elementType: simpleType(\"string\", expr.location),\n location: expr.location,\n };\n }\n\n return null;\n}\n\nfunction joinComparableClasses(classes: ComparableSurfaceClass[]): ComparableSurfaceClass {\n let sawUnknown = false;\n\n for (const surfaceClass of classes) {\n if (surfaceClass === \"nonprimitive\") {\n return \"nonprimitive\";\n }\n if (surfaceClass === \"unknown\") {\n sawUnknown = true;\n }\n }\n\n return sawUnknown ? \"unknown\" : \"primitive\";\n}\n\nfunction joinTypeCandidates(\n candidates: Array<TypeExprNode | null>,\n location: TypeExprNode[\"location\"]\n): TypeExprNode | null {\n const present = candidates.filter((candidate): candidate is TypeExprNode => candidate !== null);\n if (present.length === 0) {\n return null;\n }\n if (present.length === 1) {\n return present[0];\n }\n\n const deduped: TypeExprNode[] = [];\n const seen = new Set<string>();\n for (const candidate of present) {\n const key = JSON.stringify(candidate);\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n deduped.push(candidate);\n }\n\n if (deduped.length === 1) {\n return deduped[0];\n }\n\n return {\n kind: \"unionType\",\n types: deduped,\n location,\n };\n}\n\nfunction literalTypeFromValue(\n value: unknown,\n location: TypeExprNode[\"location\"]\n): TypeExprNode {\n return {\n kind: \"literalType\",\n value: value as string | number | boolean | null,\n location,\n };\n}\n\nfunction simpleType(name: string, location: TypeExprNode[\"location\"]): TypeExprNode {\n return {\n kind: \"simpleType\",\n name,\n location,\n };\n}\n\nfunction getStaticPropertyName(expr: ExprNode): string | null {\n if (expr.kind === \"literal\" && typeof expr.value === \"string\") {\n return expr.value;\n }\n\n return null;\n}\n\nfunction extendCollectionEnv(env: TypeEnv, itemType: TypeExprNode): TypeEnv {\n const next = new Map(env);\n next.set(\"$item\", itemType);\n return next;\n}\n","import { createError, type Diagnostic } from \"../diagnostics/types.js\";\nimport type {\n ActionNode,\n DomainNode,\n ExprNode,\n GuardedStmtNode,\n InnerStmtNode,\n ProgramNode,\n StateFieldNode,\n TypeExprNode,\n} from \"../parser/ast.js\";\nimport {\n collectDomainTypeSymbols,\n createActionTypeEnv,\n getArrayElementType,\n getPropertyType,\n inferExprType,\n isPrimitiveEntityIdType,\n type DomainTypeSymbols,\n type TypeEnv,\n} from \"./expr-type-surface.js\";\n\nconst ENTITY_LOOKUP_FNS = new Set([\"findById\", \"existsById\"]);\nconst ENTITY_TRANSFORM_FNS = new Set([\"updateById\", \"removeById\"]);\nconst ENTITY_PRIMITIVE_FNS = new Set([\n ...ENTITY_LOOKUP_FNS,\n ...ENTITY_TRANSFORM_FNS,\n]);\n\ntype ExprContext = \"computed\" | \"action\" | \"guard\" | \"available\" | \"patch\";\n\nfunction addDiagnostic(\n diagnostics: Diagnostic[],\n dedupe: Set<string>,\n code: string,\n message: string,\n location: Diagnostic[\"location\"]\n): void {\n const key = `${code}:${location.start.offset}:${location.end.offset}:${message}`;\n if (dedupe.has(key)) {\n return;\n }\n dedupe.add(key);\n diagnostics.push(createError(code, message, location));\n}\n\nexport function validateEntityPrimitives(program: ProgramNode): Diagnostic[] {\n const diagnostics: Diagnostic[] = [];\n const dedupe = new Set<string>();\n const symbols = collectDomainTypeSymbols(program.domain);\n\n validateInitializerUniqueness(program.domain, symbols, diagnostics, dedupe);\n\n for (const member of program.domain.members) {\n switch (member.kind) {\n case \"computed\":\n validateExpr(member.expression, \"computed\", new Map(), symbols, diagnostics, dedupe, 0);\n break;\n\n case \"action\": {\n const params = createActionTypeEnv(member.params);\n validateAction(member, params, symbols, diagnostics, dedupe);\n break;\n }\n\n case \"state\":\n case \"flow\":\n break;\n }\n }\n\n return diagnostics;\n}\n\nfunction validateAction(\n action: ActionNode,\n params: TypeEnv,\n symbols: DomainTypeSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>\n): void {\n if (action.available) {\n validateExpr(action.available, \"available\", params, symbols, diagnostics, dedupe, 0);\n }\n\n for (const stmt of action.body) {\n validateGuardedStmt(stmt, params, symbols, diagnostics, dedupe);\n }\n}\n\nfunction validateGuardedStmt(\n stmt: GuardedStmtNode,\n params: TypeEnv,\n symbols: DomainTypeSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>\n): void {\n switch (stmt.kind) {\n case \"when\":\n validateExpr(stmt.condition, \"guard\", params, symbols, diagnostics, dedupe, 0);\n for (const inner of stmt.body) {\n validateInnerStmt(inner, params, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"once\":\n if (stmt.condition) {\n validateExpr(stmt.condition, \"guard\", params, symbols, diagnostics, dedupe, 0);\n }\n for (const inner of stmt.body) {\n validateInnerStmt(inner, params, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"onceIntent\":\n if (stmt.condition) {\n validateExpr(stmt.condition, \"guard\", params, symbols, diagnostics, dedupe, 0);\n }\n for (const inner of stmt.body) {\n validateInnerStmt(inner, params, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"include\":\n break;\n }\n}\n\nfunction validateInnerStmt(\n stmt: InnerStmtNode,\n params: TypeEnv,\n symbols: DomainTypeSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>\n): void {\n switch (stmt.kind) {\n case \"when\":\n validateExpr(stmt.condition, \"guard\", params, symbols, diagnostics, dedupe, 0);\n for (const inner of stmt.body) {\n validateInnerStmt(inner, params, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"once\":\n if (stmt.condition) {\n validateExpr(stmt.condition, \"guard\", params, symbols, diagnostics, dedupe, 0);\n }\n for (const inner of stmt.body) {\n validateInnerStmt(inner, params, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"onceIntent\":\n if (stmt.condition) {\n validateExpr(stmt.condition, \"guard\", params, symbols, diagnostics, dedupe, 0);\n }\n for (const inner of stmt.body) {\n validateInnerStmt(inner, params, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"patch\":\n if (stmt.value) {\n validateExpr(stmt.value, \"patch\", params, symbols, diagnostics, dedupe, 0);\n }\n break;\n\n case \"effect\":\n for (const arg of stmt.args) {\n if (!arg.isPath) {\n validateExpr(arg.value as ExprNode, \"action\", params, symbols, diagnostics, dedupe, 0);\n }\n }\n break;\n\n case \"fail\":\n if (stmt.message) {\n validateExpr(stmt.message, \"action\", params, symbols, diagnostics, dedupe, 0);\n }\n break;\n\n case \"include\":\n case \"stop\":\n break;\n }\n}\n\nfunction validateExpr(\n expr: ExprNode,\n context: ExprContext,\n env: TypeEnv,\n symbols: DomainTypeSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>,\n transformDepth: number\n): void {\n switch (expr.kind) {\n case \"functionCall\": {\n validateEntityCall(expr, context, env, symbols, diagnostics, dedupe, transformDepth);\n const nextTransformDepth =\n transformDepth + (ENTITY_TRANSFORM_FNS.has(expr.name) ? 1 : 0);\n for (const arg of expr.args) {\n validateExpr(arg, context, env, symbols, diagnostics, dedupe, nextTransformDepth);\n }\n break;\n }\n\n case \"binary\":\n validateExpr(expr.left, context, env, symbols, diagnostics, dedupe, transformDepth);\n validateExpr(expr.right, context, env, symbols, diagnostics, dedupe, transformDepth);\n break;\n\n case \"unary\":\n validateExpr(expr.operand, context, env, symbols, diagnostics, dedupe, transformDepth);\n break;\n\n case \"ternary\":\n validateExpr(expr.condition, context, env, symbols, diagnostics, dedupe, transformDepth);\n validateExpr(expr.consequent, context, env, symbols, diagnostics, dedupe, transformDepth);\n validateExpr(expr.alternate, context, env, symbols, diagnostics, dedupe, transformDepth);\n break;\n\n case \"propertyAccess\":\n validateExpr(expr.object, context, env, symbols, diagnostics, dedupe, transformDepth);\n break;\n\n case \"indexAccess\":\n validateExpr(expr.object, context, env, symbols, diagnostics, dedupe, transformDepth);\n validateExpr(expr.index, context, env, symbols, diagnostics, dedupe, transformDepth);\n break;\n\n case \"objectLiteral\":\n for (const property of expr.properties) {\n validateExpr(property.value, context, env, symbols, diagnostics, dedupe, transformDepth);\n }\n break;\n\n case \"arrayLiteral\":\n for (const element of expr.elements) {\n validateExpr(element, context, env, symbols, diagnostics, dedupe, transformDepth);\n }\n break;\n\n case \"literal\":\n case \"identifier\":\n case \"systemIdent\":\n case \"iterationVar\":\n break;\n }\n}\n\nfunction validateEntityCall(\n expr: { kind: \"functionCall\"; name: string; args: ExprNode[]; location: Diagnostic[\"location\"] },\n context: ExprContext,\n env: TypeEnv,\n symbols: DomainTypeSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>,\n transformDepth: number\n): void {\n if (!ENTITY_PRIMITIVE_FNS.has(expr.name) || expr.args.length === 0) {\n return;\n }\n\n if (ENTITY_TRANSFORM_FNS.has(expr.name)) {\n if (context === \"available\") {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E035\",\n \"updateById/removeById are not allowed in available conditions.\",\n expr.location\n );\n } else if (context === \"guard\") {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E034\",\n \"updateById/removeById are not allowed in guard conditions.\",\n expr.location\n );\n } else if (context !== \"patch\") {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E031\",\n \"updateById/removeById are only allowed in patch RHS.\",\n expr.location\n );\n }\n\n if (transformDepth > 0) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E032\",\n \"Nested transform primitives are not allowed.\",\n expr.location\n );\n }\n\n if (context === \"patch\" && !isStatePathExpr(expr.args[0], symbols)) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E033\",\n \"Transform primitive collection argument must resolve to a state path.\",\n expr.args[0].location\n );\n }\n }\n\n const elementType = getCollectionElementType(expr.args[0], env, symbols);\n if (!elementType) {\n return;\n }\n\n const idType = getEntityIdType(elementType, symbols);\n if (!idType) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E030\",\n \"Collection element type must declare an 'id' field for entity primitives.\",\n expr.args[0].location\n );\n return;\n }\n\n if (!isPrimitiveEntityIdType(idType, symbols)) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E030a\",\n \"Entity 'id' field must be string or number.\",\n expr.args[0].location\n );\n }\n}\n\nfunction validateInitializerUniqueness(\n domain: DomainNode,\n symbols: DomainTypeSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>\n): void {\n for (const member of domain.members) {\n if (member.kind !== \"state\") {\n continue;\n }\n\n for (const field of member.fields) {\n validateFieldInitializerUniqueness(field, symbols, diagnostics, dedupe);\n }\n }\n}\n\nfunction validateFieldInitializerUniqueness(\n field: StateFieldNode,\n symbols: DomainTypeSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>\n): void {\n if (!field.initializer || field.initializer.kind !== \"arrayLiteral\") {\n return;\n }\n\n const elementType = getArrayElementType(field.typeExpr, symbols);\n if (!elementType) {\n return;\n }\n\n const idType = getEntityIdType(elementType, symbols);\n if (!idType || !isPrimitiveEntityIdType(idType, symbols)) {\n return;\n }\n\n const seen = new Map<string, Diagnostic[\"location\"]>();\n for (const element of field.initializer.elements) {\n if (element.kind !== \"objectLiteral\") {\n continue;\n }\n\n const idProp = element.properties.find((property) => property.key === \"id\");\n if (!idProp || idProp.value.kind !== \"literal\") {\n continue;\n }\n\n if (\n typeof idProp.value.value !== \"string\" &&\n typeof idProp.value.value !== \"number\"\n ) {\n continue;\n }\n\n const key = `${typeof idProp.value.value}:${String(idProp.value.value)}`;\n const previous = seen.get(key);\n if (previous) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E030b\",\n \"Duplicate '.id' values detected in state initializer.\",\n idProp.value.location\n );\n continue;\n }\n seen.set(key, idProp.value.location);\n }\n}\n\nfunction getCollectionElementType(\n expr: ExprNode,\n env: TypeEnv,\n symbols: DomainTypeSymbols\n): TypeExprNode | null {\n return getArrayElementType(inferExprType(expr, env, symbols), symbols);\n}\n\nfunction getEntityIdType(\n elementType: TypeExprNode,\n symbols: DomainTypeSymbols\n): TypeExprNode | null {\n return getPropertyType(elementType, \"id\", symbols);\n}\n\nfunction isStatePathExpr(expr: ExprNode, symbols: DomainTypeSymbols): boolean {\n switch (expr.kind) {\n case \"identifier\":\n return symbols.stateTypes.has(expr.name);\n\n case \"propertyAccess\":\n return isStatePathExpr(expr.object, symbols);\n\n case \"indexAccess\":\n return isStatePathExpr(expr.object, symbols);\n\n default:\n return false;\n }\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 FailStmtNode,\n StopStmtNode,\n TypeExprNode,\n PathNode,\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\";\nimport { validateEntityPrimitives } from \"./entity-primitives.js\";\nimport {\n collectDomainTypeSymbols,\n createActionTypeEnv,\n getArrayElementType,\n getIndexType,\n getPropertyType,\n inferExprType,\n isNullType,\n resolveType,\n type DomainTypeSymbols,\n type TypeEnv,\n} from \"./expr-type-surface.js\";\n\n// ============ Validation Context ============\n\ninterface ValidationContext {\n inAction: boolean;\n inGuard: boolean;\n guardDepth: number;\n hasMarkerPatch: boolean; // For once() validation\n currentActionParamTypes: Map<string, TypeExprNode>;\n diagnostics: Diagnostic[];\n}\n\nfunction createContext(): ValidationContext {\n return {\n inAction: false,\n inGuard: false,\n guardDepth: 0,\n hasMarkerPatch: false,\n currentActionParamTypes: new Map(),\n diagnostics: [],\n };\n}\n\nconst STOP_WAITING_REASON_PATTERN = /\\b(await(?:ing)?|wait(?:ing)?|pending)\\b/i;\n\ntype PrimitiveKind = \"null\" | \"boolean\" | \"number\" | \"string\";\n\nfunction simpleTypeNode(name: PrimitiveKind, location: SourceLocation): TypeExprNode {\n return {\n kind: \"simpleType\",\n name,\n location,\n };\n}\n\nfunction isAssignableType(\n sourceType: TypeExprNode,\n targetType: TypeExprNode,\n symbols: DomainTypeSymbols\n): boolean | null {\n const resolvedSource = resolveType(sourceType, symbols);\n const resolvedTarget = resolveType(targetType, symbols);\n if (!resolvedSource || !resolvedTarget) {\n return null;\n }\n\n if (resolvedTarget.kind === \"unionType\") {\n const sourceMembers = resolvedSource.kind === \"unionType\"\n ? resolvedSource.types\n : [resolvedSource];\n let sawUnknown = false;\n\n for (const member of sourceMembers) {\n const outcomes = resolvedTarget.types.map((candidate) =>\n isAssignableType(member, candidate, symbols)\n );\n if (outcomes.includes(true)) {\n continue;\n }\n if (outcomes.every((outcome) => outcome === false)) {\n return false;\n }\n sawUnknown = true;\n }\n\n return sawUnknown ? null : true;\n }\n\n if (resolvedSource.kind === \"unionType\") {\n let sawUnknown = false;\n for (const member of resolvedSource.types) {\n const outcome = isAssignableType(member, resolvedTarget, symbols);\n if (outcome === false) {\n return false;\n }\n if (outcome === null) {\n sawUnknown = true;\n }\n }\n return sawUnknown ? null : true;\n }\n\n if (resolvedTarget.kind === \"simpleType\") {\n if (resolvedSource.kind === \"simpleType\") {\n return resolvedSource.name === resolvedTarget.name;\n }\n if (resolvedSource.kind === \"literalType\") {\n if (resolvedTarget.name === \"null\") {\n return resolvedSource.value === null;\n }\n return typeof resolvedSource.value === resolvedTarget.name;\n }\n }\n\n if (resolvedTarget.kind === \"literalType\") {\n if (resolvedSource.kind !== \"literalType\") {\n return false;\n }\n return resolvedSource.value === resolvedTarget.value;\n }\n\n if (resolvedTarget.kind === \"arrayType\") {\n if (resolvedSource.kind !== \"arrayType\") {\n return false;\n }\n return isAssignableType(resolvedSource.elementType, resolvedTarget.elementType, symbols);\n }\n\n if (resolvedTarget.kind === \"objectType\") {\n if (resolvedSource.kind !== \"objectType\") {\n return false;\n }\n\n for (const targetField of resolvedTarget.fields) {\n const sourceField = resolvedSource.fields.find((candidate) => candidate.name === targetField.name);\n if (!sourceField) {\n if (targetField.optional) {\n continue;\n }\n return false;\n }\n const fieldAssignable = isAssignableType(sourceField.typeExpr, targetField.typeExpr, symbols);\n if (fieldAssignable !== true) {\n return fieldAssignable;\n }\n }\n\n return true;\n }\n\n if (resolvedTarget.kind === \"recordType\") {\n if (resolvedSource.kind !== \"recordType\") {\n return null;\n }\n return isAssignableType(resolvedSource.valueType, resolvedTarget.valueType, symbols);\n }\n\n return null;\n}\n\nfunction describeTypeExpr(typeExpr: TypeExprNode | null, symbols: DomainTypeSymbols): string {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved) {\n return \"unknown\";\n }\n\n switch (resolved.kind) {\n case \"simpleType\":\n return resolved.name;\n case \"literalType\":\n return JSON.stringify(resolved.value);\n case \"arrayType\":\n return `Array<${describeTypeExpr(resolved.elementType, symbols)}>`;\n case \"recordType\":\n return `Record<${describeTypeExpr(resolved.keyType, symbols)}, ${describeTypeExpr(resolved.valueType, symbols)}>`;\n case \"objectType\":\n return `{ ${resolved.fields.map((field) => `${field.name}${field.optional ? \"?\" : \"\"}: ${describeTypeExpr(field.typeExpr, symbols)}`).join(\"; \")} }`;\n case \"unionType\":\n return resolved.types.map((member) => describeTypeExpr(member, symbols)).join(\" | \");\n }\n}\n\nfunction collectPrimitiveKinds(\n typeExpr: TypeExprNode | null,\n symbols: DomainTypeSymbols\n): Set<PrimitiveKind> | \"nonprimitive\" | null {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved) {\n return null;\n }\n\n switch (resolved.kind) {\n case \"simpleType\":\n if (\n resolved.name === \"string\" ||\n resolved.name === \"number\" ||\n resolved.name === \"boolean\" ||\n resolved.name === \"null\"\n ) {\n return new Set([resolved.name]);\n }\n return resolved.name === \"object\" ? \"nonprimitive\" : null;\n\n case \"literalType\":\n return new Set([\n resolved.value === null ? \"null\" : (typeof resolved.value as Exclude<PrimitiveKind, \"null\">),\n ]);\n\n case \"arrayType\":\n case \"recordType\":\n case \"objectType\":\n return \"nonprimitive\";\n\n case \"unionType\": {\n const kinds = new Set<PrimitiveKind>();\n for (const member of resolved.types) {\n const memberKinds = collectPrimitiveKinds(member, symbols);\n if (memberKinds === null) {\n return null;\n }\n if (memberKinds === \"nonprimitive\") {\n return \"nonprimitive\";\n }\n for (const kind of memberKinds) {\n kinds.add(kind);\n }\n }\n return kinds;\n }\n }\n}\n\nfunction areComparableTypesCompatible(\n leftType: TypeExprNode | null,\n rightType: TypeExprNode | null,\n symbols: DomainTypeSymbols\n): boolean | null {\n const leftKinds = collectPrimitiveKinds(leftType, symbols);\n const rightKinds = collectPrimitiveKinds(rightType, symbols);\n\n if (leftKinds === null || rightKinds === null) {\n return null;\n }\n if (leftKinds === \"nonprimitive\" || rightKinds === \"nonprimitive\") {\n return false;\n }\n if (!(leftKinds instanceof Set) || !(rightKinds instanceof Set)) {\n return null;\n }\n\n const leftNonNull = [...leftKinds].filter((kind) => kind !== \"null\");\n const rightNonNull = [...rightKinds].filter((kind) => kind !== \"null\");\n if (leftNonNull.length === 0 || rightNonNull.length === 0) {\n return true;\n }\n\n return leftNonNull.some((kind) => rightNonNull.includes(kind));\n}\n\nfunction stripNullType(typeExpr: TypeExprNode | null, symbols: DomainTypeSymbols): TypeExprNode | null {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved || isNullType(resolved)) {\n return null;\n }\n\n if (resolved.kind !== \"unionType\") {\n return resolved;\n }\n\n const members = resolved.types.filter((member) => !isNullType(member));\n if (members.length === 0) {\n return null;\n }\n if (members.length === 1) {\n return members[0];\n }\n\n return {\n kind: \"unionType\",\n types: members,\n location: resolved.location,\n };\n}\n\nfunction areTypesCompatible(\n leftType: TypeExprNode | null,\n rightType: TypeExprNode | null,\n symbols: DomainTypeSymbols\n): boolean | null {\n if (!leftType || !rightType) {\n return null;\n }\n\n const leftToRight = isAssignableType(leftType, rightType, symbols);\n if (leftToRight === true) {\n return true;\n }\n\n const rightToLeft = isAssignableType(rightType, leftType, symbols);\n if (rightToLeft === true) {\n return true;\n }\n\n const comparable = areComparableTypesCompatible(leftType, rightType, symbols);\n if (comparable !== null) {\n return comparable;\n }\n\n if (leftToRight === false && rightToLeft === false) {\n return false;\n }\n\n return null;\n}\n\nfunction classifyArrayOperand(\n typeExpr: TypeExprNode | null,\n symbols: DomainTypeSymbols\n): boolean | null {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved) {\n return null;\n }\n\n if (resolved.kind === \"unionType\") {\n const outcomes = resolved.types.map((member) => classifyArrayOperand(member, symbols));\n if (outcomes.every((outcome) => outcome === true)) {\n return true;\n }\n return outcomes.some((outcome) => outcome === false) ? false : null;\n }\n\n return resolved.kind === \"arrayType\";\n}\n\nfunction classifyLenOperand(\n typeExpr: TypeExprNode | null,\n symbols: DomainTypeSymbols\n): boolean | null {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved) {\n return null;\n }\n\n if (resolved.kind === \"unionType\") {\n const outcomes = resolved.types.map((member) => classifyLenOperand(member, symbols));\n if (outcomes.every((outcome) => outcome === true)) {\n return true;\n }\n return outcomes.some((outcome) => outcome === false) ? false : null;\n }\n\n if (resolved.kind === \"arrayType\" || resolved.kind === \"recordType\" || resolved.kind === \"objectType\") {\n return true;\n }\n\n if (resolved.kind === \"literalType\") {\n return typeof resolved.value === \"string\";\n }\n\n if (resolved.kind === \"simpleType\") {\n return resolved.name === \"string\" || resolved.name === \"object\";\n }\n\n return false;\n}\n\nfunction extendCollectionTypeEnv(baseEnv: TypeEnv, itemType: TypeExprNode): TypeEnv {\n const next = new Map(baseEnv);\n next.set(\"$item\", itemType);\n return next;\n}\n\nfunction resolvePathType(path: PathNode, symbols: DomainTypeSymbols): TypeExprNode | null {\n const [first, ...rest] = path.segments;\n if (!first || first.kind !== \"propertySegment\") {\n return null;\n }\n\n let current = symbols.stateTypes.get(first.name) ?? null;\n for (const segment of rest) {\n if (!current) {\n return null;\n }\n current = segment.kind === \"propertySegment\"\n ? getPropertyType(current, segment.name, symbols)\n : getIndexType(current, symbols);\n }\n\n return current;\n}\n\nfunction renderPath(path: PathNode): string {\n let result = \"\";\n\n for (const [index, segment] of path.segments.entries()) {\n if (segment.kind === \"propertySegment\") {\n result += index === 0 ? segment.name : `.${segment.name}`;\n continue;\n }\n\n if (segment.index.kind === \"literal\") {\n result += `[${JSON.stringify(segment.index.value)}]`;\n } else {\n result += \"[*]\";\n }\n }\n\n return result;\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 private symbols: DomainTypeSymbols | null = null;\n\n /**\n * Validate a MEL program\n */\n validate(program: ProgramNode): ValidationResult {\n this.ctx = createContext();\n this.symbols = collectDomainTypeSymbols(program.domain);\n this.validateDomain(program.domain);\n this.symbols = null;\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 case \"flow\":\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 if (field.initializer) {\n this.validateStateInitializer(field.initializer);\n }\n }\n\n private validateStateInitializer(expr: ExprNode): void {\n switch (expr.kind) {\n case \"literal\":\n return;\n\n case \"identifier\":\n case \"iterationVar\":\n this.error(\n \"State initializers must be compile-time constants\",\n expr.location,\n \"E042\"\n );\n return;\n\n case \"systemIdent\":\n if (expr.path[0] === \"system\") {\n this.error(\n \"$system.* cannot be used in state initializers\",\n expr.location,\n \"E002\"\n );\n } else {\n this.error(\n \"State initializers must be compile-time constants\",\n expr.location,\n \"E042\"\n );\n }\n return;\n\n case \"objectLiteral\":\n for (const prop of expr.properties) {\n this.validateStateInitializer(prop.value);\n }\n return;\n\n case \"arrayLiteral\":\n for (const elem of expr.elements) {\n this.validateStateInitializer(elem);\n }\n return;\n\n case \"functionCall\": {\n const before = this.ctx.diagnostics.length;\n for (const arg of expr.args) {\n this.validateStateInitializer(arg);\n }\n if (this.ctx.diagnostics.length === before) {\n this.error(\n \"State initializers must be compile-time constants\",\n expr.location,\n \"E042\"\n );\n }\n return;\n }\n\n case \"binary\": {\n const before = this.ctx.diagnostics.length;\n this.validateStateInitializer(expr.left);\n this.validateStateInitializer(expr.right);\n if (this.ctx.diagnostics.length === before) {\n this.error(\n \"State initializers must be compile-time constants\",\n expr.location,\n \"E042\"\n );\n }\n return;\n }\n\n case \"unary\": {\n const before = this.ctx.diagnostics.length;\n this.validateStateInitializer(expr.operand);\n if (this.ctx.diagnostics.length === before) {\n this.error(\n \"State initializers must be compile-time constants\",\n expr.location,\n \"E042\"\n );\n }\n return;\n }\n\n case \"ternary\": {\n const before = this.ctx.diagnostics.length;\n this.validateStateInitializer(expr.condition);\n this.validateStateInitializer(expr.consequent);\n this.validateStateInitializer(expr.alternate);\n if (this.ctx.diagnostics.length === before) {\n this.error(\n \"State initializers must be compile-time constants\",\n expr.location,\n \"E042\"\n );\n }\n return;\n }\n\n case \"propertyAccess\": {\n const before = this.ctx.diagnostics.length;\n this.validateStateInitializer(expr.object);\n if (this.ctx.diagnostics.length === before) {\n this.error(\n \"State initializers must be compile-time constants\",\n expr.location,\n \"E042\"\n );\n }\n return;\n }\n\n case \"indexAccess\": {\n const before = this.ctx.diagnostics.length;\n this.validateStateInitializer(expr.object);\n this.validateStateInitializer(expr.index);\n if (this.ctx.diagnostics.length === before) {\n this.error(\n \"State initializers must be compile-time constants\",\n expr.location,\n \"E042\"\n );\n }\n return;\n }\n }\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 this.ctx.currentActionParamTypes = createActionTypeEnv(action.params);\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 // fail/stop are parsed permissively at top-level and narrowed here.\n for (const stmt of action.body) {\n this.validateGuardedStmt(stmt);\n }\n\n this.ctx.inAction = false;\n this.ctx.currentActionParamTypes = new Map();\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 \"identifier\":\n if (this.ctx.currentActionParamTypes.has(expr.name)) {\n this.error(\n \"Action parameters cannot be used in available condition\",\n expr.location,\n \"E005\"\n );\n }\n break;\n\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 if (expr.path[0] === \"meta\") {\n this.error(\n \"$meta.* cannot be used in available condition (availability is schema-context only)\",\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 case \"include\":\n break;\n case \"fail\":\n this.validateFail(stmt);\n break;\n case \"stop\":\n this.validateStop(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 const before = this.ctx.diagnostics.length;\n const valueType = this.validateExpr(stmt.value, \"action\");\n if (!this.symbols || before !== this.ctx.diagnostics.length) {\n return;\n }\n\n const targetType = resolvePathType(stmt.path, this.symbols);\n if (!targetType || !valueType) {\n return;\n }\n\n const assignable = isAssignableType(valueType, targetType, this.symbols);\n if (assignable === false) {\n this.error(\n `Patch value for '${renderPath(stmt.path)}' must be assignable to ${describeTypeExpr(targetType, this.symbols)}, got ${describeTypeExpr(valueType, this.symbols)}`,\n stmt.value.location,\n \"E_TYPE_MISMATCH\"\n );\n }\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 validateFail(stmt: FailStmtNode): void {\n if (!this.ctx.inGuard) {\n this.error(\n \"fail must be inside a guard (when, once, or onceIntent)\",\n stmt.location,\n \"E006\"\n );\n }\n\n if (stmt.message) {\n this.validateExpr(stmt.message, \"action\");\n }\n }\n\n private validateStop(stmt: StopStmtNode): void {\n if (!this.ctx.inGuard) {\n this.error(\n \"stop must be inside a guard (when, once, or onceIntent)\",\n stmt.location,\n \"E007\"\n );\n }\n\n if (STOP_WAITING_REASON_PATTERN.test(stmt.reason)) {\n this.error(\n \"stop message suggests waiting/pending - use 'Already processed' style instead\",\n stmt.location,\n \"E008\"\n );\n }\n }\n\n private validateCondition(expr: ExprNode, guardType: \"when\" | \"once\" | \"onceIntent\"): void {\n const before = this.ctx.diagnostics.length;\n const conditionType = this.validateExpr(expr, \"action\");\n if (before === this.ctx.diagnostics.length) {\n this.requireAssignable(\n conditionType,\n simpleTypeNode(\"boolean\", expr.location),\n expr.location,\n `Condition in ${guardType} must evaluate to boolean`\n );\n }\n }\n\n private validateExpr(\n expr: ExprNode,\n context: \"computed\" | \"action\",\n env: TypeEnv = this.ctx.currentActionParamTypes\n ): TypeExprNode | null {\n switch (expr.kind) {\n case \"functionCall\":\n this.validateFunctionCall(expr, context, env);\n return this.inferType(expr, env);\n\n case \"binary\":\n {\n const before = this.ctx.diagnostics.length;\n const leftType = this.validateExpr(expr.left, context, env);\n const rightType = this.validateExpr(expr.right, context, env);\n const hadInnerErrors = before !== this.ctx.diagnostics.length;\n\n if (!hadInnerErrors) {\n switch (expr.operator) {\n case \"==\":\n case \"!=\":\n this.validatePrimitiveEquality(expr.left, expr.right, leftType, rightType, expr.location);\n break;\n case \"<\":\n case \"<=\":\n case \">\":\n case \">=\":\n this.requireAssignable(\n leftType,\n simpleTypeNode(\"number\", expr.left.location),\n expr.left.location,\n `Operator '${expr.operator}' requires a numeric left operand`\n );\n this.requireAssignable(\n rightType,\n simpleTypeNode(\"number\", expr.right.location),\n expr.right.location,\n `Operator '${expr.operator}' requires a numeric right operand`\n );\n break;\n case \"&&\":\n case \"||\":\n this.requireAssignable(\n leftType,\n simpleTypeNode(\"boolean\", expr.left.location),\n expr.left.location,\n `Operator '${expr.operator}' requires a boolean left operand`\n );\n this.requireAssignable(\n rightType,\n simpleTypeNode(\"boolean\", expr.right.location),\n expr.right.location,\n `Operator '${expr.operator}' requires a boolean right operand`\n );\n break;\n case \"+\":\n case \"-\":\n case \"*\":\n case \"/\":\n case \"%\":\n this.requireAssignable(\n leftType,\n simpleTypeNode(\"number\", expr.left.location),\n expr.left.location,\n `Operator '${expr.operator}' requires a numeric left operand`\n );\n this.requireAssignable(\n rightType,\n simpleTypeNode(\"number\", expr.right.location),\n expr.right.location,\n `Operator '${expr.operator}' requires a numeric right operand`\n );\n break;\n case \"??\":\n this.validateCoalesceTypes([leftType, rightType], expr.location);\n break;\n }\n }\n\n return this.inferType(expr, env);\n }\n\n case \"unary\":\n {\n const before = this.ctx.diagnostics.length;\n const operandType = this.validateExpr(expr.operand, context, env);\n if (before === this.ctx.diagnostics.length) {\n this.requireAssignable(\n operandType,\n simpleTypeNode(expr.operator === \"!\" ? \"boolean\" : \"number\", expr.operand.location),\n expr.operand.location,\n expr.operator === \"!\"\n ? \"Unary '!' requires a boolean operand\"\n : \"Unary '-' requires a numeric operand\"\n );\n }\n return this.inferType(expr, env);\n }\n\n case \"ternary\":\n {\n const before = this.ctx.diagnostics.length;\n const conditionType = this.validateExpr(expr.condition, context, env);\n this.validateExpr(expr.consequent, context, env);\n this.validateExpr(expr.alternate, context, env);\n if (before === this.ctx.diagnostics.length) {\n this.requireAssignable(\n conditionType,\n simpleTypeNode(\"boolean\", expr.condition.location),\n expr.condition.location,\n \"Ternary condition must evaluate to boolean\"\n );\n }\n return this.inferType(expr, env);\n }\n\n case \"propertyAccess\":\n this.validateExpr(expr.object, context, env);\n return this.inferType(expr, env);\n\n case \"indexAccess\":\n this.validateExpr(expr.object, context, env);\n this.validateExpr(expr.index, context, env);\n return this.inferType(expr, env);\n\n case \"objectLiteral\":\n for (const prop of expr.properties) {\n this.validateExpr(prop.value, context, env);\n }\n return this.inferType(expr, env);\n\n case \"arrayLiteral\":\n for (const elem of expr.elements) {\n this.validateExpr(elem, context, env);\n }\n return this.inferType(expr, env);\n\n case \"systemIdent\":\n // E001: $system.* in computed — handled by scope analysis (analyzeScope)\n // No duplicate check here to avoid double-reporting\n return this.inferType(expr, env);\n\n case \"literal\":\n case \"identifier\":\n case \"iterationVar\":\n return this.inferType(expr, env);\n }\n }\n\n private validateFunctionCall(\n expr: { kind: \"functionCall\"; name: string; args: ExprNode[]; location: SourceLocation },\n context: \"computed\" | \"action\",\n env: TypeEnv\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 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 \"findById\":\n case \"existsById\":\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 case \"updateById\":\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 case \"removeById\":\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 const argTypes: Array<TypeExprNode | null> = [];\n if ([\"filter\", \"map\", \"find\", \"every\", \"some\"].includes(name) && args.length > 0) {\n const sourceType = this.validateExpr(args[0], context, env);\n argTypes.push(sourceType);\n\n let callbackEnv = env;\n if (this.symbols) {\n const itemType = getArrayElementType(sourceType, this.symbols);\n if (itemType) {\n callbackEnv = extendCollectionTypeEnv(env, itemType);\n }\n }\n\n for (let index = 1; index < args.length; index += 1) {\n argTypes.push(this.validateExpr(args[index], context, index === 1 ? callbackEnv : env));\n }\n } else {\n for (const arg of args) {\n argTypes.push(this.validateExpr(arg, context, env));\n }\n }\n\n if (!this.symbols) {\n return;\n }\n\n switch (name) {\n case \"eq\":\n case \"neq\":\n if (args.length === 2) {\n this.validatePrimitiveEquality(args[0], args[1], argTypes[0], argTypes[1], location);\n }\n break;\n\n case \"add\":\n case \"sub\":\n case \"mul\":\n case \"div\":\n case \"mod\":\n case \"pow\":\n if (args.length === 2) {\n this.requireAssignable(\n argTypes[0],\n simpleTypeNode(\"number\", args[0].location),\n args[0].location,\n `Function '${name}' expects a numeric first argument`\n );\n this.requireAssignable(\n argTypes[1],\n simpleTypeNode(\"number\", args[1].location),\n args[1].location,\n `Function '${name}' expects a numeric second argument`\n );\n }\n break;\n\n case \"gt\":\n case \"gte\":\n case \"lt\":\n case \"lte\":\n if (args.length === 2) {\n this.requireAssignable(\n argTypes[0],\n simpleTypeNode(\"number\", args[0].location),\n args[0].location,\n `Function '${name}' expects a numeric first argument`\n );\n this.requireAssignable(\n argTypes[1],\n simpleTypeNode(\"number\", args[1].location),\n args[1].location,\n `Function '${name}' expects a numeric second argument`\n );\n }\n break;\n\n case \"and\":\n case \"or\":\n for (const [index, arg] of args.entries()) {\n this.requireAssignable(\n argTypes[index],\n simpleTypeNode(\"boolean\", arg.location),\n arg.location,\n `Function '${name}' expects boolean arguments`\n );\n }\n break;\n\n case \"not\":\n if (args.length === 1) {\n this.requireAssignable(\n argTypes[0],\n simpleTypeNode(\"boolean\", args[0].location),\n args[0].location,\n \"Function 'not' expects a boolean argument\"\n );\n }\n break;\n\n case \"neg\":\n case \"abs\":\n case \"floor\":\n case \"ceil\":\n case \"round\":\n case \"sqrt\":\n if (args.length === 1) {\n this.requireAssignable(\n argTypes[0],\n simpleTypeNode(\"number\", args[0].location),\n args[0].location,\n `Function '${name}' expects a numeric argument`\n );\n }\n break;\n\n case \"trim\":\n case \"lower\":\n case \"upper\":\n case \"strlen\":\n if (args.length === 1) {\n this.requireAssignable(\n argTypes[0],\n simpleTypeNode(\"string\", args[0].location),\n args[0].location,\n `Function '${name}' expects a string argument`\n );\n }\n break;\n\n case \"startsWith\":\n case \"endsWith\":\n case \"strIncludes\":\n case \"indexOf\":\n case \"split\":\n if (args.length === 2) {\n this.requireAssignable(\n argTypes[0],\n simpleTypeNode(\"string\", args[0].location),\n args[0].location,\n `Function '${name}' expects a string first argument`\n );\n this.requireAssignable(\n argTypes[1],\n simpleTypeNode(\"string\", args[1].location),\n args[1].location,\n `Function '${name}' expects a string second argument`\n );\n }\n break;\n\n case \"replace\":\n if (args.length >= 2) {\n this.requireAssignable(\n argTypes[0],\n simpleTypeNode(\"string\", args[0].location),\n args[0].location,\n \"Function 'replace' expects a string first argument\"\n );\n this.requireAssignable(\n argTypes[1],\n simpleTypeNode(\"string\", args[1].location),\n args[1].location,\n \"Function 'replace' expects a string second argument\"\n );\n }\n if (args.length === 3) {\n this.requireAssignable(\n argTypes[2],\n simpleTypeNode(\"string\", args[2].location),\n args[2].location,\n \"Function 'replace' expects a string replacement argument\"\n );\n }\n break;\n\n case \"substring\":\n case \"substr\":\n if (args.length >= 2) {\n this.requireAssignable(\n argTypes[0],\n simpleTypeNode(\"string\", args[0].location),\n args[0].location,\n `Function '${name}' expects a string first argument`\n );\n this.requireAssignable(\n argTypes[1],\n simpleTypeNode(\"number\", args[1].location),\n args[1].location,\n `Function '${name}' expects a numeric second argument`\n );\n }\n if (args.length === 3) {\n this.requireAssignable(\n argTypes[2],\n simpleTypeNode(\"number\", args[2].location),\n args[2].location,\n `Function '${name}' expects a numeric third argument`\n );\n }\n break;\n\n case \"len\":\n if (args.length === 1) {\n this.requireLenCompatible(argTypes[0], args[0].location);\n }\n break;\n\n case \"filter\":\n case \"find\":\n case \"every\":\n case \"some\":\n if (args.length === 2) {\n this.requireArrayCompatible(argTypes[0], args[0].location, name);\n this.requireAssignable(\n argTypes[1],\n simpleTypeNode(\"boolean\", args[1].location),\n args[1].location,\n `Function '${name}' requires a boolean-valued callback`\n );\n }\n break;\n\n case \"map\":\n if (args.length === 2) {\n this.requireArrayCompatible(argTypes[0], args[0].location, name);\n }\n break;\n\n case \"coalesce\":\n this.validateCoalesceTypes(argTypes, location);\n break;\n\n case \"if\":\n case \"cond\":\n if (args.length === 3) {\n this.requireAssignable(\n argTypes[0],\n simpleTypeNode(\"boolean\", args[0].location),\n args[0].location,\n `Function '${name}' expects a boolean condition`\n );\n }\n break;\n }\n }\n\n private validatePrimitiveEquality(\n leftExpr: ExprNode,\n rightExpr: ExprNode,\n leftType: TypeExprNode | null,\n rightType: TypeExprNode | null,\n location: SourceLocation\n ): void {\n if (!this.symbols) {\n return;\n }\n\n if (\n leftExpr.kind === \"objectLiteral\" ||\n leftExpr.kind === \"arrayLiteral\" ||\n rightExpr.kind === \"objectLiteral\" ||\n rightExpr.kind === \"arrayLiteral\"\n ) {\n this.error(\n \"eq/neq operands must be compatible primitive types, not object or array literals\",\n location,\n \"E_TYPE_MISMATCH\"\n );\n return;\n }\n\n const compatible = areComparableTypesCompatible(leftType, rightType, this.symbols);\n if (compatible === false) {\n this.error(\n `eq/neq operands must be compatible primitive types, got ${describeTypeExpr(leftType, this.symbols)} and ${describeTypeExpr(rightType, this.symbols)}`,\n location,\n \"E_TYPE_MISMATCH\"\n );\n }\n }\n\n private inferType(expr: ExprNode, env: TypeEnv): TypeExprNode | null {\n if (!this.symbols) {\n return null;\n }\n\n return inferExprType(expr, env, this.symbols);\n }\n\n private requireAssignable(\n actualType: TypeExprNode | null,\n expectedType: TypeExprNode,\n location: SourceLocation,\n message: string\n ): void {\n if (!this.symbols || !actualType) {\n return;\n }\n\n const assignable = isAssignableType(actualType, expectedType, this.symbols);\n if (assignable === false) {\n this.error(\n `${message}, got ${describeTypeExpr(actualType, this.symbols)}`,\n location,\n \"E_TYPE_MISMATCH\"\n );\n }\n }\n\n private requireArrayCompatible(\n actualType: TypeExprNode | null,\n location: SourceLocation,\n fnName: string\n ): void {\n if (!this.symbols || !actualType) {\n return;\n }\n\n const outcome = classifyArrayOperand(actualType, this.symbols);\n if (outcome === false) {\n this.error(\n `Function '${fnName}' expects an array first argument, got ${describeTypeExpr(actualType, this.symbols)}`,\n location,\n \"E_TYPE_MISMATCH\"\n );\n }\n }\n\n private requireLenCompatible(actualType: TypeExprNode | null, location: SourceLocation): void {\n if (!this.symbols || !actualType) {\n return;\n }\n\n const outcome = classifyLenOperand(actualType, this.symbols);\n if (outcome === false) {\n this.error(\n `Function 'len' expects a string, array, object, or record argument, got ${describeTypeExpr(actualType, this.symbols)}`,\n location,\n \"E_TYPE_MISMATCH\"\n );\n }\n }\n\n private validateCoalesceTypes(types: Array<TypeExprNode | null>, location: SourceLocation): void {\n if (!this.symbols) {\n return;\n }\n\n const concreteTypes = types\n .map((typeExpr) => stripNullType(typeExpr, this.symbols!))\n .filter((typeExpr): typeExpr is TypeExprNode => typeExpr !== null);\n\n for (let i = 0; i < concreteTypes.length; i += 1) {\n for (let j = i + 1; j < concreteTypes.length; j += 1) {\n const compatible = areTypesCompatible(concreteTypes[i], concreteTypes[j], this.symbols);\n if (compatible === false) {\n this.error(\n `coalesce arguments must have compatible non-null types, got ${describeTypeExpr(concreteTypes[i], this.symbols)} and ${describeTypeExpr(concreteTypes[j], this.symbols)}`,\n location,\n \"E_TYPE_MISMATCH\"\n );\n return;\n }\n }\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 const result = validator.validate(program);\n const entityDiagnostics = validateEntityPrimitives(program);\n const diagnostics = [...result.diagnostics, ...entityDiagnostics];\n\n return {\n valid: !diagnostics.some((diagnostic) => diagnostic.severity === \"error\"),\n diagnostics,\n };\n}\n","/**\n * Lowering Context Types\n *\n * Defines contexts for expression and patch lowering.\n *\n * @see SPEC v0.4.0 §17.2\n */\n\n/**\n * Allowed system path prefixes.\n *\n * In Translator path, only 'meta' and 'input' are allowed.\n * 'system' is forbidden (requires Flow execution).\n *\n * @see FDR-MEL-071\n */\nexport type AllowedSysPrefix = \"meta\" | \"input\";\n\n/**\n * Context for single expression lowering.\n *\n * @see SPEC v0.4.0 §17.2\n */\nexport interface ExprLoweringContext {\n /**\n * Expression context mode.\n * - 'schema': for addComputed, addConstraint, etc.\n * - 'action': for guards, patches, effects\n */\n mode: \"schema\" | \"action\";\n\n /**\n * Allowed system path prefixes.\n * In Translator path: only [\"meta\", \"input\"]\n *\n * @see FDR-MEL-071\n */\n allowSysPaths?: { prefixes: AllowedSysPrefix[] };\n\n /**\n * Function table version for call lowering.\n */\n fnTableVersion: string;\n\n /**\n * Action name (for action context).\n */\n actionName?: string;\n\n /**\n * Whether $item is allowed in this context.\n * Only true for effect.args fields.\n *\n * @see FDR-MEL-068\n */\n allowItem?: boolean;\n}\n\n/**\n * Context for patch lowering.\n *\n * NO mode field - Compiler determines context per op-field.\n *\n * @see SPEC v0.4.0 §17.2, AD-COMP-LOW-002\n */\nexport interface PatchLoweringContext {\n /**\n * Allowed system path prefixes.\n * In Translator path: only [\"meta\", \"input\"]\n *\n * @see FDR-MEL-071\n */\n allowSysPaths?: { prefixes: AllowedSysPrefix[] };\n\n /**\n * Function table version for call lowering.\n */\n fnTableVersion: string;\n\n /**\n * Action name (for action-related ops).\n */\n actionName?: string;\n}\n\n/**\n * Default expression lowering context for schema mode.\n */\nexport const DEFAULT_SCHEMA_CONTEXT: ExprLoweringContext = {\n mode: \"schema\",\n allowSysPaths: { prefixes: [\"meta\", \"input\"] },\n fnTableVersion: \"1.0\",\n allowItem: false,\n};\n\n/**\n * Default expression lowering context for action mode.\n */\nexport const DEFAULT_ACTION_CONTEXT: ExprLoweringContext = {\n mode: \"action\",\n allowSysPaths: { prefixes: [\"meta\", \"input\"] },\n fnTableVersion: \"1.0\",\n allowItem: false,\n};\n\n/**\n * Context for effect.args (allows $item).\n */\nexport const EFFECT_ARGS_CONTEXT: ExprLoweringContext = {\n mode: \"action\",\n allowSysPaths: { prefixes: [\"meta\", \"input\"] },\n fnTableVersion: \"1.0\",\n allowItem: true,\n};\n\n/**\n * Default patch lowering context.\n */\nexport const DEFAULT_PATCH_CONTEXT: PatchLoweringContext = {\n allowSysPaths: { prefixes: [\"meta\", \"input\"] },\n fnTableVersion: \"1.0\",\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","export function compareUnicodeCodePoints(a: string, b: string): number {\n const aPoints = Array.from(a);\n const bPoints = Array.from(b);\n const length = Math.min(aPoints.length, bPoints.length);\n\n for (let index = 0; index < length; index += 1) {\n const aCode = aPoints[index].codePointAt(0) ?? 0;\n const bCode = bPoints[index].codePointAt(0) ?? 0;\n if (aCode !== bCode) {\n return aCode - bCode;\n }\n }\n\n return aPoints.length - bPoints.length;\n}\n\nexport function sortKeysByUnicodeCodePoint(keys: readonly string[]): string[] {\n return [...keys].sort(compareUnicodeCodePoints);\n}\n\nexport function stableSortByUnicodeObjectKey<T extends { key: string }>(items: readonly T[]): T[] {\n return items\n .map((item, index) => ({ item, index }))\n .sort((left, right) => {\n const keyOrder = compareUnicodeCodePoints(left.item.key, right.item.key);\n return keyOrder !== 0 ? keyOrder : left.index - right.index;\n })\n .map(({ item }) => item);\n}\n","/**\n * Expression Lowering\n *\n * Transforms MEL Canonical IR (8 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\";\nimport { stableSortByUnicodeObjectKey } from \"../utils/unicode-order.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 (8 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: \"field\"; object: MelExprNode; property: string }\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 \"field\":\n return lowerField(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 field node.\n *\n * Rule 1: field(get(path), \"prop\") -> get(\"path.prop\")\n * Rule 2: all other cases -> field(lowered object, property)\n */\nfunction lowerField(\n input: { kind: \"field\"; object: MelExprNode; property: string },\n ctx: ExprLoweringContext\n): CoreExprNode {\n if (input.object.kind === \"get\" && input.object.base === undefined) {\n const objectPath = input.object.path.map((segment) => segment.name).join(\".\");\n return {\n kind: \"get\",\n path: objectPath ? `${objectPath}.${input.property}` : input.property,\n };\n }\n\n return {\n kind: \"field\",\n object: lowerExprNode(input.object, ctx),\n property: input.property,\n };\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 if (fn === \"isNotNull\") {\n if (args.length !== 1) {\n throw unknownCallFn(fn);\n }\n return {\n kind: \"not\",\n arg: {\n kind: \"isNull\",\n arg: lowerExprNode(args[0], ctx),\n },\n };\n }\n\n // Unary operators: arg\n if (isUnaryArgOp(fn)) {\n if (args.length !== 1) {\n throw unknownCallFn(fn);\n }\n const normalizedFn = normalizeUnaryArgOp(fn);\n return {\n kind: normalizedFn,\n arg: lowerExprNode(args[0], ctx),\n } as CoreExprNode;\n }\n\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 if (fn === \"lower\" || fn === \"toLowerCase\") {\n if (args.length !== 1) {\n throw unknownCallFn(fn);\n }\n return {\n kind: \"toLowerCase\",\n str: lowerExprNode(args[0], ctx),\n };\n }\n\n if (fn === \"upper\" || fn === \"toUpperCase\") {\n if (args.length !== 1) {\n throw unknownCallFn(fn);\n }\n return {\n kind: \"toUpperCase\",\n str: lowerExprNode(args[0], ctx),\n };\n }\n\n if (fn === \"strlen\" || fn === \"strLen\") {\n if (args.length !== 1) {\n throw unknownCallFn(fn);\n }\n return {\n kind: \"strLen\",\n str: lowerExprNode(args[0], ctx),\n };\n }\n\n if (isScalarMinMaxOp(fn)) {\n if (args.length === 1) {\n return {\n kind: fn === \"min\" ? \"minArray\" : \"maxArray\",\n array: lowerExprNode(args[0], ctx),\n };\n }\n return {\n kind: fn,\n args: args.map((arg) => lowerExprNode(arg, ctx)),\n } as CoreExprNode;\n }\n\n if (fn === \"sum\") {\n if (args.length !== 1) {\n throw unknownCallFn(fn);\n }\n return {\n kind: \"sumArray\",\n array: lowerExprNode(args[0], ctx),\n };\n }\n\n if (fn === \"pow\") {\n if (args.length !== 2) {\n throw unknownCallFn(fn);\n }\n return {\n kind: \"pow\",\n base: lowerExprNode(args[0], ctx),\n exponent: lowerExprNode(args[1], 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: cond(cond, then, else)\n if (fn === \"if\" || fn === \"cond\") {\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 lowerField(\n {\n kind: \"field\",\n object: args[0],\n property: property.value,\n },\n ctx\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\" || fn === \"substr\") {\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 stableSortByUnicodeObjectKey(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\ntype UnaryArgOp =\n | \"not\"\n | \"neg\"\n | \"abs\"\n | \"floor\"\n | \"ceil\"\n | \"round\"\n | \"sqrt\"\n | \"len\"\n | \"typeof\"\n | \"isNull\"\n | \"toString\";\n\n/** Unary operators with 'arg' field */\nfunction isUnaryArgOp(fn: string): fn is UnaryArgOp {\n return [\n \"not\",\n \"neg\",\n \"abs\",\n \"floor\",\n \"ceil\",\n \"round\",\n \"sqrt\",\n \"len\",\n \"typeof\",\n \"isNull\",\n \"toString\",\n ].includes(fn);\n}\n\nfunction normalizeUnaryArgOp(fn: string): UnaryArgOp {\n if (fn === \"isNotNull\") {\n throw unknownCallFn(fn);\n }\n if (!isUnaryArgOp(fn)) {\n throw unknownCallFn(fn);\n }\n return fn;\n}\n\nfunction isScalarMinMaxOp(fn: string): boolean {\n return fn === \"min\" || fn === \"max\";\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 * Patch Lowering\n *\n * Transforms PatchFragment[] (MEL IR) to ConditionalPatchOp[] (Core IR).\n *\n * @see SPEC v0.4.0 §17.4, §17.5\n */\n\nimport type { ExprNode as CoreExprNode } from \"@manifesto-ai/core\";\nimport type { PatchLoweringContext, ExprLoweringContext } from \"./context.js\";\nimport { lowerExprNode, MelExprNode } from \"./lower-expr.js\";\n\n// ============ Input Types (from Translator) ============\n\n/**\n * MEL TypeExpr (Translator output).\n */\nexport type MelTypeExpr =\n | { kind: \"primitive\"; name: \"string\" | \"number\" | \"boolean\" | \"null\" }\n | { kind: \"array\"; element: MelTypeExpr }\n | { kind: \"object\"; fields: MelTypeField[] }\n | { kind: \"union\"; members: MelTypeExpr[] }\n | { kind: \"literal\"; value: string | number | boolean | null }\n | { kind: \"ref\"; name: string };\n\n/**\n * MEL TypeField.\n */\nexport type MelTypeField = {\n name: string;\n type: MelTypeExpr;\n optional?: boolean;\n};\n\n/**\n * MEL PatchOp (Translator output - schema operations).\n *\n * @see SPEC v0.4.0 §17.4\n */\nexport type MelPatchOp =\n | { kind: \"addType\"; typeName: string; typeExpr: MelTypeExpr }\n | {\n kind: \"addField\";\n typeName: string;\n field: MelTypeField & { defaultValue?: unknown };\n }\n | { kind: \"setFieldType\"; path: string; typeExpr: MelTypeExpr }\n | { kind: \"setDefaultValue\"; path: string; value: unknown }\n | {\n kind: \"addConstraint\";\n targetPath: string;\n rule: MelExprNode;\n message?: string;\n }\n | { kind: \"addComputed\"; name: string; expr: MelExprNode; deps?: string[] }\n | { kind: \"addActionAvailable\"; actionName: string; expr: MelExprNode };\n\n/**\n * MEL PatchFragment (Translator output).\n *\n * Contains MEL IR expressions that need lowering.\n *\n * @see SPEC v0.4.0 §17.4\n */\nexport interface MelPatchFragment {\n /**\n * Unique fragment identifier (content-addressed).\n */\n fragmentId: string;\n\n /**\n * Source intent identifier.\n */\n sourceIntentId: string;\n\n /**\n * Fragment operation with MEL IR expressions.\n */\n op: MelPatchOp;\n\n /**\n * Optional condition (MEL IR).\n * Preserved in output as Core IR.\n */\n condition?: MelExprNode;\n\n /**\n * Confidence score (0-1).\n */\n confidence: number;\n\n /**\n * Evidence strings.\n */\n evidence: string[];\n\n /**\n * Creation timestamp (ISO 8601).\n */\n createdAt: string;\n}\n\n// ============ Output Types (for Host) ============\n\n/**\n * Lowered TypeExpr (Core format).\n */\nexport type LoweredTypeExpr =\n | { kind: \"primitive\"; name: \"string\" | \"number\" | \"boolean\" | \"null\" }\n | { kind: \"array\"; element: LoweredTypeExpr }\n | { kind: \"object\"; fields: LoweredTypeField[] }\n | { kind: \"union\"; members: LoweredTypeExpr[] }\n | { kind: \"literal\"; value: string | number | boolean | null }\n | { kind: \"ref\"; name: string };\n\n/**\n * Lowered TypeField.\n */\nexport type LoweredTypeField = {\n name: string;\n type: LoweredTypeExpr;\n optional?: boolean;\n};\n\n/**\n * Lowered PatchOp (Core IR expressions).\n *\n * Same structure as MelPatchOp but with Core IR expressions.\n */\nexport type LoweredPatchOp =\n | { kind: \"addType\"; typeName: string; typeExpr: LoweredTypeExpr }\n | {\n kind: \"addField\";\n typeName: string;\n field: LoweredTypeField & { defaultValue?: unknown };\n }\n | { kind: \"setFieldType\"; path: string; typeExpr: LoweredTypeExpr }\n | { kind: \"setDefaultValue\"; path: string; value: unknown }\n | {\n kind: \"addConstraint\";\n targetPath: string;\n rule: CoreExprNode;\n message?: string;\n }\n | { kind: \"addComputed\"; name: string; expr: CoreExprNode; deps?: string[] }\n | { kind: \"addActionAvailable\"; actionName: string; expr: CoreExprNode };\n\n/**\n * Schema conditional patch operation (intermediate IR for Translator → Host).\n *\n * Used for schema evolution operations (addType, addField, addComputed, etc.).\n * Preserves fragment condition for later evaluation.\n *\n * @see SPEC v0.4.0 §17.5\n */\nexport interface SchemaConditionalPatchOp {\n /**\n * Fragment identifier (for tracing).\n */\n fragmentId: string;\n\n /**\n * Condition expression (Core IR).\n * If present, op is only applied when condition evaluates to true.\n *\n * @see FDR-MEL-073\n */\n condition?: CoreExprNode;\n\n /**\n * Lowered patch operation.\n */\n op: LoweredPatchOp;\n\n /**\n * Confidence (preserved from fragment).\n */\n confidence: number;\n}\n\n/**\n * @deprecated Use SchemaConditionalPatchOp instead.\n */\nexport type ConditionalPatchOp = SchemaConditionalPatchOp;\n\n// ============ Lowering Functions ============\n\n/**\n * Lower PatchFragment[] to SchemaConditionalPatchOp[].\n *\n * Transforms MEL IR expressions to Core IR expressions.\n * Preserves fragment conditions for evaluation phase.\n *\n * @param fragments - MEL IR patch fragments from Translator\n * @param ctx - Patch lowering context\n * @returns Core IR schema conditional patch operations\n *\n * @see SPEC v0.4.0 §17.5\n */\nexport function lowerPatchFragments(\n fragments: MelPatchFragment[],\n ctx: PatchLoweringContext\n): SchemaConditionalPatchOp[] {\n return fragments.map((fragment) => lowerPatchFragment(fragment, ctx));\n}\n\n/**\n * Lower a single PatchFragment to SchemaConditionalPatchOp.\n */\nfunction lowerPatchFragment(\n fragment: MelPatchFragment,\n ctx: PatchLoweringContext\n): SchemaConditionalPatchOp {\n // Lower condition if present\n const condition = fragment.condition\n ? lowerExprNode(fragment.condition, createExprContext(ctx, \"action\"))\n : undefined;\n\n // Lower the operation\n const op = lowerPatchOp(fragment.op, ctx);\n\n return {\n fragmentId: fragment.fragmentId,\n condition,\n op,\n confidence: fragment.confidence,\n };\n}\n\n/**\n * Lower a MelPatchOp to LoweredPatchOp.\n *\n * Determines context per op-field per AD-COMP-LOW-002.\n */\nfunction lowerPatchOp(op: MelPatchOp, ctx: PatchLoweringContext): LoweredPatchOp {\n switch (op.kind) {\n case \"addType\":\n return {\n kind: \"addType\",\n typeName: op.typeName,\n typeExpr: lowerTypeExpr(op.typeExpr),\n };\n\n case \"addField\":\n return {\n kind: \"addField\",\n typeName: op.typeName,\n field: {\n name: op.field.name,\n type: lowerTypeExpr(op.field.type),\n optional: op.field.optional,\n defaultValue: op.field.defaultValue,\n },\n };\n\n case \"setFieldType\":\n return {\n kind: \"setFieldType\",\n path: op.path,\n typeExpr: lowerTypeExpr(op.typeExpr),\n };\n\n case \"setDefaultValue\":\n return {\n kind: \"setDefaultValue\",\n path: op.path,\n value: op.value,\n };\n\n case \"addConstraint\":\n // addConstraint.rule → schema context (no $item)\n return {\n kind: \"addConstraint\",\n targetPath: op.targetPath,\n rule: lowerExprNode(op.rule, createExprContext(ctx, \"schema\")),\n message: op.message,\n };\n\n case \"addComputed\":\n // addComputed.expr → schema context (no $item)\n return {\n kind: \"addComputed\",\n name: op.name,\n expr: lowerExprNode(op.expr, createExprContext(ctx, \"schema\")),\n deps: op.deps,\n };\n\n case \"addActionAvailable\":\n // addActionAvailable.expr → schema context (no $item)\n return {\n kind: \"addActionAvailable\",\n actionName: op.actionName,\n expr: lowerExprNode(op.expr, createExprContext(ctx, \"schema\")),\n };\n }\n}\n\n/**\n * Lower TypeExpr (pass-through, no expressions inside).\n */\nfunction lowerTypeExpr(typeExpr: MelTypeExpr): LoweredTypeExpr {\n switch (typeExpr.kind) {\n case \"primitive\":\n return { kind: \"primitive\", name: typeExpr.name };\n\n case \"array\":\n return { kind: \"array\", element: lowerTypeExpr(typeExpr.element) };\n\n case \"object\":\n return {\n kind: \"object\",\n fields: typeExpr.fields.map((f) => ({\n name: f.name,\n type: lowerTypeExpr(f.type),\n optional: f.optional,\n })),\n };\n\n case \"union\":\n return {\n kind: \"union\",\n members: typeExpr.members.map(lowerTypeExpr),\n };\n\n case \"literal\":\n return { kind: \"literal\", value: typeExpr.value };\n\n case \"ref\":\n return { kind: \"ref\", name: typeExpr.name };\n }\n}\n\n/**\n * Create expression lowering context from patch context.\n *\n * @see AD-COMP-LOW-002\n */\nfunction createExprContext(\n patchCtx: PatchLoweringContext,\n mode: \"schema\" | \"action\"\n): ExprLoweringContext {\n return {\n mode,\n allowSysPaths: patchCtx.allowSysPaths,\n fnTableVersion: patchCtx.fnTableVersion,\n actionName: patchCtx.actionName,\n allowItem: false, // Only true for effect.args (not in schema ops)\n };\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 type { BinaryOperator, ExprNode, SystemIdentExprNode } from \"../parser/ast.js\";\nimport type { MelExprNode, MelPathNode } from \"./lower-expr.js\";\n\nexport interface ToMelExprOptions {\n resolveIdentifier?: (name: string) => MelExprNode;\n resolveSystemIdent?: (path: string[]) => MelExprNode;\n}\n\nexport function toMelExpr(\n input: ExprNode,\n options: ToMelExprOptions = {}\n): MelExprNode {\n switch (input.kind) {\n case \"literal\":\n return { kind: \"lit\", value: toMelPrimitive(input.value, input.literalType) };\n\n case \"identifier\":\n return options.resolveIdentifier?.(input.name) ?? getPathExpr(input.name);\n\n case \"systemIdent\":\n return resolveSystemIdent(input, options);\n\n case \"iterationVar\":\n return { kind: \"var\", name: input.name };\n\n case \"propertyAccess\":\n return toMelPropertyAccess(input.object, input.property, options);\n\n case \"indexAccess\":\n return {\n kind: \"call\",\n fn: \"at\",\n args: [toMelExpr(input.object, options), toMelExpr(input.index, options)],\n };\n\n case \"functionCall\":\n return {\n kind: \"call\",\n fn: input.name,\n args: input.args.map((arg) => toMelExpr(arg, options)),\n };\n\n case \"unary\":\n return {\n kind: \"call\",\n fn: input.operator === \"!\" ? \"not\" : \"neg\",\n args: [toMelExpr(input.operand, options)],\n };\n\n case \"binary\":\n return {\n kind: \"call\",\n fn: toMelBinaryOp(input.operator),\n args: [toMelExpr(input.left, options), toMelExpr(input.right, options)],\n };\n\n case \"ternary\":\n return {\n kind: \"call\",\n fn: \"cond\",\n args: [\n toMelExpr(input.condition, options),\n toMelExpr(input.consequent, options),\n toMelExpr(input.alternate, options),\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, options),\n })),\n };\n\n case \"arrayLiteral\":\n return {\n kind: \"arr\",\n elements: input.elements.map((element) => toMelExpr(element, options)),\n };\n }\n}\n\nexport function getPathExpr(...segments: string[]): MelExprNode {\n return {\n kind: \"get\",\n path: toMelPath(...segments),\n };\n}\n\nexport function getBasePathExpr(base: MelExprNode, ...segments: string[]): MelExprNode {\n return {\n kind: \"get\",\n base,\n path: toMelPath(...segments),\n };\n}\n\nexport function sysPathExpr(...segments: string[]): MelExprNode {\n return {\n kind: \"sys\",\n path: segments,\n };\n}\n\nexport function objExpr(fields: Record<string, MelExprNode>): MelExprNode {\n return {\n kind: \"obj\",\n fields: Object.entries(fields).map(([key, value]) => ({ key, value })),\n };\n}\n\nexport function toMelPath(...segments: string[]): MelPathNode {\n return segments.map((name) => ({ kind: \"prop\", name }));\n}\n\nfunction resolveSystemIdent(\n input: SystemIdentExprNode,\n options: ToMelExprOptions\n): MelExprNode {\n return options.resolveSystemIdent?.(input.path) ?? sysPathExpr(...input.path);\n}\n\nfunction toMelPropertyAccess(\n object: ExprNode,\n property: string,\n options: ToMelExprOptions\n): MelExprNode {\n const base = toMelExpr(object, options);\n\n if (base.kind === \"get\") {\n return {\n kind: \"get\",\n ...(base.base ? { base: base.base } : undefined),\n path: [...base.path, { kind: \"prop\", name: property }],\n };\n }\n\n if (base.kind === \"var\" && base.name === \"item\") {\n return getBasePathExpr(base, property);\n }\n\n return {\n kind: \"field\",\n object: base,\n property,\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 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 }\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 { SourceLocation } from \"../lexer/source-location.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} from \"../parser/ast.js\";\nimport type { MelExprNode } from \"../lowering/lower-expr.js\";\nimport {\n getPathExpr,\n objExpr,\n sysPathExpr,\n toMelExpr,\n} from \"../lowering/to-mel-expr.js\";\nimport {\n hashSchemaSync,\n semanticPathToPatchPath,\n sha256Sync,\n type ExprNode as RuntimeExprNode,\n type FlowNode as RuntimeFlowNode,\n type PatchPath,\n} from \"@manifesto-ai/core\";\nimport { lowerCanonicalSchema } from \"./runtime-lowering.js\";\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 = RuntimeExprNode;\n\nexport type CompilerExprNode = MelExprNode;\n\n/**\n * Core FlowNode types (matching core/schema/flow.ts)\n */\nexport type CoreFlowNode = RuntimeFlowNode;\n\nexport type CompilerFlowNode =\n | { kind: \"seq\"; steps: CompilerFlowNode[] }\n | { kind: \"if\"; cond: CompilerExprNode; then: CompilerFlowNode; else?: CompilerFlowNode }\n | { kind: \"patch\"; op: \"set\" | \"unset\" | \"merge\"; path: PatchPath; value?: CompilerExprNode }\n | { kind: \"effect\"; type: string; params: Record<string, CompilerExprNode> }\n | { kind: \"call\"; flow: string }\n | { kind: \"halt\"; reason?: string }\n | { kind: \"fail\"; code: string; message?: CompilerExprNode };\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\nexport interface CompilerComputedFieldSpec {\n deps: string[];\n expr: CompilerExprNode;\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\nexport interface CompilerActionSpec {\n flow: CompilerFlowNode;\n input?: FieldSpec;\n available?: CompilerExprNode;\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\nexport interface CanonicalDomainSchema {\n id: string;\n version: string;\n hash: string;\n types: Record<string, TypeSpec>;\n state: StateSpec;\n computed: { fields: Record<string, CompilerComputedFieldSpec> };\n actions: Record<string, CompilerActionSpec>;\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 /** Track 2: State field specs for literal type validation in patches */\n stateFieldSpecs: Map<string, FieldSpec>;\n}\n\ninterface ComputedEntry {\n name: string;\n deps: string[];\n expr: CompilerExprNode;\n location: ComputedNode[\"location\"];\n order: number;\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 stateFieldSpecs: new Map(),\n };\n}\n\n// ============ Generator Result ============\n\nexport interface GenerateResult {\n schema: DomainSchema | null;\n diagnostics: Diagnostic[];\n}\n\nexport interface GenerateCanonicalResult {\n schema: CanonicalDomainSchema | null;\n diagnostics: Diagnostic[];\n}\n\n// ============ Main Generator ============\n\nexport function generateCanonical(program: ProgramNode): GenerateCanonicalResult {\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<CanonicalDomainSchema, \"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 = computeCanonicalHash(schemaWithoutHash);\n\n const schema: CanonicalDomainSchema = {\n ...schemaWithoutHash,\n hash,\n };\n\n return {\n schema,\n diagnostics: ctx.diagnostics,\n };\n}\n\n/**\n * Generate runtime-ready DomainSchema from MEL AST.\n */\nexport function generate(program: ProgramNode): GenerateResult {\n const canonical = generateCanonical(program);\n if (!canonical.schema) {\n return {\n schema: null,\n diagnostics: canonical.diagnostics,\n };\n }\n\n return {\n schema: lowerCanonicalSchema(canonical.schema),\n diagnostics: canonical.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 } else if (member.kind === \"flow\") {\n // flow/include are removed before canonical IR generation\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 const typeSpec = typeExprToFieldSpec(field.typeExpr, ctx);\n if (typeSpec) {\n ctx.stateFieldSpecs.set(field.name, typeSpec);\n }\n const fieldSpec = generateFieldSpec(field, ctx);\n if (fieldSpec) {\n fields[field.name] = fieldSpec;\n }\n }\n }\n }\n\n return { fields };\n}\n\nfunction generateFieldSpec(field: StateFieldNode, ctx: GeneratorContext): FieldSpec | null {\n const spec = typeExprToFieldSpec(field.typeExpr, ctx);\n if (!spec) {\n return null;\n }\n const defaultValue = field.initializer\n ? evaluateInitializer(field.initializer, ctx)\n : undefined;\n\n // Track 2: validate literal default against the type-level spec\n // (before `required: true` override, which means \"field must exist in state\",\n // not \"field is non-nullable\")\n if (defaultValue !== undefined) {\n validateLiteralAgainstSpec(defaultValue, spec, field.name, field.location, ctx);\n }\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(\n typeExpr: TypeExprNode,\n ctx: GeneratorContext,\n seenTypeRefs: readonly string[] = []\n): FieldSpec | null {\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 if (seenTypeRefs.includes(typeExpr.name)) {\n pushSchemaTypeError(\n ctx,\n \"E044\",\n `Recursive type '${typeExpr.name}' cannot be lowered to FieldSpec in a schema position`,\n typeExpr.location\n );\n return null;\n }\n return typeExprToFieldSpec(typeDef.typeExpr, ctx, [...seenTypeRefs, typeExpr.name]);\n }\n // Unknown type - treat as opaque object\n return { type: \"object\", required: true };\n }\n }\n\n case \"unionType\": {\n const nonNullTypes = typeExpr.types.filter(\n (candidate) =>\n !(candidate.kind === \"simpleType\" && candidate.name === \"null\") &&\n !(candidate.kind === \"literalType\" && candidate.value === null)\n );\n const hasNull = nonNullTypes.length !== typeExpr.types.length;\n const enumValues: unknown[] = [];\n let isLiteralEnum = !hasNull;\n\n for (const candidate of nonNullTypes) {\n if (candidate.kind !== \"literalType\") {\n isLiteralEnum = false;\n break;\n }\n enumValues.push(candidate.value);\n }\n\n if (isLiteralEnum && enumValues.length > 0) {\n return { type: { enum: enumValues }, required: true };\n }\n\n if (hasNull && nonNullTypes.length === 1) {\n pushSchemaTypeError(\n ctx,\n \"E045\",\n `Nullable type '${describeTypeExpr(typeExpr)}' cannot be lowered to FieldSpec`,\n typeExpr.location\n );\n return null;\n }\n\n pushSchemaTypeError(\n ctx,\n \"E043\",\n `Union type '${describeTypeExpr(typeExpr)}' cannot be soundly lowered to FieldSpec`,\n typeExpr.location\n );\n return null;\n }\n\n case \"arrayType\": {\n const itemSpec = typeExprToFieldSpec(typeExpr.elementType, ctx, seenTypeRefs);\n if (!itemSpec) {\n return null;\n }\n return {\n type: \"array\",\n required: true,\n items: itemSpec,\n };\n }\n\n case \"recordType\":\n pushSchemaTypeError(\n ctx,\n \"E046\",\n `Record type '${describeTypeExpr(typeExpr)}' cannot be lowered to FieldSpec`,\n typeExpr.location\n );\n return null;\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, seenTypeRefs);\n if (!fieldSpec) {\n return null;\n }\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 ?? \"object\";\n}\n\nfunction pushSchemaTypeError(\n ctx: GeneratorContext,\n code: string,\n message: string,\n location: TypeExprNode[\"location\"]\n): void {\n ctx.diagnostics.push({\n severity: \"error\",\n code,\n message,\n location,\n });\n}\n\nfunction describeTypeExpr(typeExpr: TypeExprNode): string {\n switch (typeExpr.kind) {\n case \"simpleType\":\n return typeExpr.name;\n case \"unionType\":\n return typeExpr.types.map((member) => describeTypeExpr(member)).join(\" | \");\n case \"arrayType\":\n return `Array<${describeTypeExpr(typeExpr.elementType)}>`;\n case \"recordType\":\n return `Record<${describeTypeExpr(typeExpr.keyType)}, ${describeTypeExpr(typeExpr.valueType)}>`;\n case \"literalType\":\n return JSON.stringify(typeExpr.value);\n case \"objectType\":\n return `{ ${typeExpr.fields.map((field) => `${field.name}${field.optional ? \"?\" : \"\"}: ${describeTypeExpr(field.typeExpr)}`).join(\"; \")} }`;\n }\n}\n\n// ============ Literal Type Validation (Track 2) ============\n\n/**\n * Validate a literal value against a FieldSpec, emitting E_TYPE_MISMATCH diagnostics.\n * Only checks statically-known literal values; complex expressions (undefined) are skipped.\n */\nfunction validateLiteralAgainstSpec(\n value: unknown,\n spec: FieldSpec,\n fieldName: string,\n location: SourceLocation,\n ctx: GeneratorContext,\n): void {\n if (value === undefined) return; // Complex expression, can't check statically\n\n // Null on required (non-nullable) field\n if (value === null) {\n if (spec.required !== false && !(typeof spec.type === \"object\" && \"enum\" in spec.type && (spec.type as {enum: unknown[]}).enum.includes(null))) {\n ctx.diagnostics.push({\n severity: \"error\",\n code: \"E_TYPE_MISMATCH\",\n message: `Type mismatch: field '${fieldName}' is not nullable, but initializer is null`,\n location,\n });\n }\n return;\n }\n\n const specType = spec.type;\n\n // Enum check\n if (typeof specType === \"object\" && \"enum\" in specType) {\n if (!specType.enum.some((e: unknown) => Object.is(e, value))) {\n ctx.diagnostics.push({\n severity: \"error\",\n code: \"E_TYPE_MISMATCH\",\n message: `Type mismatch: field '${fieldName}' expects one of [${specType.enum.join(\", \")}], got ${JSON.stringify(value)}`,\n location,\n });\n }\n return;\n }\n\n // Primitive type check\n const actualType = Array.isArray(value) ? \"array\" : (typeof value === \"object\" ? \"object\" : typeof value);\n\n if (specType === \"string\" && typeof value !== \"string\") {\n emitTypeMismatch(ctx, fieldName, \"string\", actualType, location);\n } else if (specType === \"number\" && typeof value !== \"number\") {\n emitTypeMismatch(ctx, fieldName, \"number\", actualType, location);\n } else if (specType === \"boolean\" && typeof value !== \"boolean\") {\n emitTypeMismatch(ctx, fieldName, \"boolean\", actualType, location);\n } else if (specType === \"array\" && !Array.isArray(value)) {\n emitTypeMismatch(ctx, fieldName, \"array\", actualType, location);\n } else if (specType === \"object\" && (typeof value !== \"object\" || Array.isArray(value))) {\n emitTypeMismatch(ctx, fieldName, \"object\", actualType, location);\n }\n\n // Recursive object field validation\n if (specType === \"object\" && spec.fields && typeof value === \"object\" && !Array.isArray(value)) {\n const obj = value as Record<string, unknown>;\n for (const [key, fieldSpec] of Object.entries(spec.fields)) {\n if (key in obj) {\n validateLiteralAgainstSpec(obj[key], fieldSpec, `${fieldName}.${key}`, location, ctx);\n }\n }\n }\n\n // Recursive array item validation\n if (specType === \"array\" && spec.items && Array.isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n validateLiteralAgainstSpec(value[i], spec.items, `${fieldName}[${i}]`, location, ctx);\n }\n }\n}\n\nfunction emitTypeMismatch(\n ctx: GeneratorContext,\n fieldName: string,\n expected: string,\n actual: string,\n location: SourceLocation,\n): void {\n ctx.diagnostics.push({\n severity: \"error\",\n code: \"E_TYPE_MISMATCH\",\n message: `Type mismatch: field '${fieldName}' expects ${expected}, got ${actual}`,\n location,\n });\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(\n domain: DomainNode,\n ctx: GeneratorContext\n): { fields: Record<string, CompilerComputedFieldSpec> } {\n const entries: ComputedEntry[] = [];\n let order = 0;\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 entries.push({\n name: member.name,\n deps,\n expr,\n location: member.location,\n order,\n });\n order += 1;\n }\n }\n\n const fields: Record<string, CompilerComputedFieldSpec> = {};\n for (const entry of topologicallyOrderComputedEntries(entries, ctx)) {\n fields[entry.name] = {\n deps: entry.deps,\n expr: entry.expr,\n };\n }\n\n return { fields };\n}\n\nfunction topologicallyOrderComputedEntries(entries: readonly ComputedEntry[], ctx: GeneratorContext): ComputedEntry[] {\n if (entries.length <= 1) {\n return [...entries];\n }\n\n const entryByName = new Map(entries.map((entry) => [entry.name, entry]));\n const computedDeps = new Map<string, string[]>();\n const dependents = new Map<string, string[]>();\n const inDegree = new Map<string, number>();\n\n for (const entry of entries) {\n dependents.set(entry.name, []);\n inDegree.set(entry.name, 0);\n }\n\n for (const entry of entries) {\n const deps = Array.from(new Set(entry.deps.filter((dep) => entryByName.has(dep))));\n computedDeps.set(entry.name, deps);\n inDegree.set(entry.name, deps.length);\n\n for (const dep of deps) {\n dependents.get(dep)!.push(entry.name);\n }\n }\n\n const queue = entries\n .filter((entry) => (inDegree.get(entry.name) ?? 0) === 0)\n .map((entry) => entry.name);\n const sorted: ComputedEntry[] = [];\n\n while (queue.length > 0) {\n const name = queue.shift()!;\n sorted.push(entryByName.get(name)!);\n\n for (const dependent of dependents.get(name) ?? []) {\n const nextDegree = (inDegree.get(dependent) ?? 0) - 1;\n inDegree.set(dependent, nextDegree);\n if (nextDegree === 0) {\n insertComputedQueue(queue, dependent, entryByName);\n }\n }\n }\n\n if (sorted.length !== entries.length) {\n const sortedNames = new Set(sorted.map((entry) => entry.name));\n const remaining = entries.filter((entry) => !sortedNames.has(entry.name));\n const cyclePath = findComputedCyclePath(remaining[0]!.name, computedDeps);\n const renderedCycle = cyclePath ? cyclePath.join(\" -> \") : remaining.map((entry) => entry.name).join(\", \");\n\n pushSchemaTypeError(\n ctx,\n \"E040\",\n `Circular computed dependency: ${renderedCycle}`,\n (cyclePath ? entryByName.get(cyclePath[0]) : remaining[0])!.location\n );\n\n return [...entries];\n }\n\n return sorted;\n}\n\nfunction insertComputedQueue(\n queue: string[],\n candidate: string,\n entryByName: Map<string, ComputedEntry>\n): void {\n const candidateOrder = entryByName.get(candidate)?.order ?? Number.MAX_SAFE_INTEGER;\n let insertAt = queue.length;\n\n for (let index = 0; index < queue.length; index += 1) {\n const queuedOrder = entryByName.get(queue[index])?.order ?? Number.MAX_SAFE_INTEGER;\n if (candidateOrder < queuedOrder) {\n insertAt = index;\n break;\n }\n }\n\n queue.splice(insertAt, 0, candidate);\n}\n\nfunction findComputedCyclePath(start: string, graph: Map<string, string[]>): string[] | null {\n const visited = new Set<string>();\n const stack: string[] = [];\n const stackSet = new Set<string>();\n\n function visit(node: string): string[] | null {\n visited.add(node);\n stack.push(node);\n stackSet.add(node);\n\n for (const dep of graph.get(node) ?? []) {\n if (!visited.has(dep)) {\n const cycle = visit(dep);\n if (cycle) {\n return cycle;\n }\n } else if (stackSet.has(dep)) {\n const cycleStart = stack.indexOf(dep);\n return [...stack.slice(cycleStart), dep];\n }\n }\n\n stack.pop();\n stackSet.delete(node);\n return null;\n }\n\n return visit(start);\n}\n\nfunction extractDeps(expr: CompilerExprNode): string[] {\n const deps = new Set<string>();\n\n function visit(node: CompilerExprNode): void {\n switch (node.kind) {\n case \"lit\":\n case \"sys\":\n case \"var\":\n return;\n\n case \"get\":\n if (node.base === undefined) {\n deps.add(node.path.map((segment) => segment.name).join(\".\"));\n } else {\n visit(node.base);\n }\n return;\n\n case \"field\":\n visit(node.object);\n return;\n\n case \"call\":\n for (const arg of node.args) {\n visit(arg);\n }\n return;\n\n case \"obj\":\n for (const field of node.fields) {\n visit(field.value);\n }\n return;\n\n case \"arr\":\n for (const element of node.elements) {\n visit(element);\n }\n return;\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, CompilerActionSpec> {\n const actions: Record<string, CompilerActionSpec> = {};\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 if (!fieldSpec) {\n continue;\n }\n inputFields[param.name] = structuredClone(fieldSpec);\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: CompilerExprNode | 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(\n stmts: (GuardedStmtNode | InnerStmtNode)[],\n ctx: GeneratorContext\n): CompilerFlowNode {\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(\n stmt: GuardedStmtNode | InnerStmtNode,\n ctx: GeneratorContext\n): CompilerFlowNode {\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 case \"include\":\n return { kind: \"seq\", steps: [] };\n }\n}\n\nfunction generateWhen(stmt: WhenStmtNode, ctx: GeneratorContext): CompilerFlowNode {\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): CompilerFlowNode {\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: CompilerExprNode = sysPathExpr(\"meta\", \"intentId\");\n\n // Condition: marker != $meta.intentId\n let cond: CompilerExprNode = callExpr(\"neq\", [getPathExpr(...pathToSegments(markerPath)), intentIdExpr]);\n\n // Add extra condition if present\n if (stmt.condition) {\n const extraCond = generateExpr(stmt.condition, ctx);\n cond = callExpr(\"and\", [cond, extraCond]);\n }\n\n // Body: patch marker = $meta.intentId, then rest\n const markerPatch: CompilerFlowNode = {\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): CompilerFlowNode {\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: CompilerExprNode = sysPathExpr(\"meta\", \"intentId\");\n\n let cond: CompilerExprNode = callExpr(\"neq\", [getPathExpr(...pathToSegments(guardPath)), intentIdExpr]);\n\n if (stmt.condition) {\n const extraCond = generateExpr(stmt.condition, ctx);\n cond = callExpr(\"and\", [cond, extraCond]);\n }\n\n // Guard write: semantic target is guardPath, lowered as map-level merge.\n const markerPatch: CompilerFlowNode = {\n kind: \"patch\",\n op: \"merge\",\n path: toPatchPath(\"$mel.guards.intent\"),\n value: objExpr({ [guardId]: 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 generatePatch(stmt: PatchStmtNode, ctx: GeneratorContext): CompilerFlowNode {\n const path = generatePath(stmt.path, ctx);\n\n const result: CompilerFlowNode = {\n kind: \"patch\",\n op: stmt.op,\n path: toPatchPath(path),\n };\n\n if (stmt.value) {\n const valueExpr = generateExpr(stmt.value, ctx);\n (result as { kind: \"patch\"; op: \"set\" | \"unset\" | \"merge\"; path: PatchPath; value?: CompilerExprNode }).value = valueExpr;\n\n // Track 2: validate literal patch values against the target field's declared type\n if (stmt.op === \"set\") {\n const rootField = stmt.path.segments[0];\n if (rootField.kind === \"propertySegment\") {\n const fieldSpec = ctx.stateFieldSpecs.get(rootField.name);\n if (fieldSpec) {\n // Resolve the target spec for nested paths\n let targetSpec = fieldSpec;\n const segments = stmt.path.segments;\n for (let i = 1; i < segments.length; i++) {\n const seg = segments[i];\n if (seg.kind === \"propertySegment\" && targetSpec.fields?.[seg.name]) {\n targetSpec = targetSpec.fields[seg.name];\n } else if (seg.kind === \"indexSegment\" && targetSpec.items) {\n targetSpec = targetSpec.items;\n } else {\n // Can't resolve further — skip validation\n targetSpec = undefined as unknown as FieldSpec;\n break;\n }\n }\n if (targetSpec) {\n const literalValue = evaluatePatchLiteral(stmt.value, ctx);\n if (literalValue !== undefined) {\n const fieldName = stmt.path.segments.map(s =>\n s.kind === \"propertySegment\" ? s.name : \"[*]\"\n ).join(\".\");\n validateLiteralAgainstSpec(literalValue, targetSpec, fieldName, stmt.location, ctx);\n }\n }\n }\n }\n }\n }\n\n return result;\n}\n\nfunction generateEffect(stmt: EffectStmtNode, ctx: GeneratorContext): CompilerFlowNode {\n const params: Record<string, CompilerExprNode> = {};\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 * Try to evaluate a patch value expression as a literal.\n * Returns undefined for non-literal (dynamic) expressions.\n */\nfunction evaluatePatchLiteral(expr: ExprNode, ctx: GeneratorContext): unknown {\n return evaluateInitializer(expr, ctx);\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): CompilerFlowNode {\n const result: CompilerFlowNode = {\n kind: \"fail\",\n code: stmt.code,\n };\n\n if (stmt.message) {\n (result as { kind: \"fail\"; code: string; message?: CompilerExprNode }).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): CompilerFlowNode {\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\nfunction callExpr(fn: string, args: CompilerExprNode[]): CompilerExprNode {\n return { kind: \"call\", fn, args };\n}\n\nfunction pathToSegments(path: string): string[] {\n return path.split(/(?<!\\\\)\\./g).map((segment) => segment.replaceAll(\"\\\\.\", \".\").replaceAll(\"\\\\\\\\\", \"\\\\\"));\n}\n\n// ============ Expression Generation ============\n\nfunction generateExpr(expr: ExprNode, ctx: GeneratorContext): CompilerExprNode {\n return toMelExpr(expr, {\n resolveIdentifier: (name) => resolveIdentifier(name, ctx),\n resolveSystemIdent: (path) => resolveSystemIdent(path, ctx),\n });\n}\n\nfunction resolveIdentifier(name: string, ctx: GeneratorContext): CompilerExprNode {\n if (ctx.stateFields.has(name) || ctx.computedFields.has(name)) {\n return getPathExpr(name);\n }\n\n if (ctx.currentAction && ctx.actionParams.get(ctx.currentAction)?.has(name)) {\n return getPathExpr(\"input\", name);\n }\n\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 getPathExpr(name);\n}\n\nfunction resolveSystemIdent(path: string[], ctx: GeneratorContext): CompilerExprNode {\n const [namespace, ...rest] = path;\n\n switch (namespace) {\n case \"system\":\n case \"meta\":\n case \"input\":\n return sysPathExpr(namespace, ...rest);\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\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 computeCanonicalHash(schema: Omit<CanonicalDomainSchema, \"hash\">): string {\n return hashSchemaSync(schema as unknown as Omit<DomainSchema, \"hash\">);\n}\n\nfunction computeHash(schema: Omit<DomainSchema, \"hash\">): string {\n return hashSchemaSync(schema);\n}\n","import type { MelExprNode } from \"../lowering/lower-expr.js\";\nimport {\n DEFAULT_ACTION_CONTEXT,\n DEFAULT_SCHEMA_CONTEXT,\n EFFECT_ARGS_CONTEXT,\n lowerExprNode,\n} from \"../lowering/index.js\";\nimport {\n getBasePathExpr,\n getPathExpr,\n objExpr,\n} from \"../lowering/to-mel-expr.js\";\nimport type {\n CanonicalDomainSchema,\n CompilerActionSpec,\n CompilerComputedFieldSpec,\n CompilerFlowNode,\n CoreExprNode,\n CoreFlowNode,\n DomainSchema,\n} from \"./ir.js\";\n\nconst ENTITY_PRIMITIVES = new Set([\"findById\", \"existsById\", \"updateById\", \"removeById\"]);\n\nexport function lowerCanonicalSchema(schema: CanonicalDomainSchema): DomainSchema {\n return {\n ...schema,\n computed: {\n fields: Object.fromEntries(\n Object.entries(schema.computed.fields).map(([name, field]) => [\n name,\n lowerComputedField(field),\n ])\n ),\n },\n actions: Object.fromEntries(\n Object.entries(schema.actions).map(([name, action]) => [name, lowerAction(action)])\n ),\n };\n}\n\nfunction lowerComputedField(field: CompilerComputedFieldSpec): DomainSchema[\"computed\"][\"fields\"][string] {\n return {\n ...field,\n expr: lowerSchemaExpr(field.expr),\n };\n}\n\nfunction lowerAction(action: CompilerActionSpec): DomainSchema[\"actions\"][string] {\n return {\n ...action,\n flow: lowerFlow(action.flow),\n available: action.available ? lowerSchemaExpr(action.available) : undefined,\n };\n}\n\nfunction lowerFlow(flow: CompilerFlowNode): CoreFlowNode {\n switch (flow.kind) {\n case \"seq\":\n return {\n kind: \"seq\",\n steps: flow.steps.map((step) => lowerFlow(step)),\n };\n\n case \"if\":\n return {\n kind: \"if\",\n cond: lowerActionExpr(flow.cond),\n then: lowerFlow(flow.then),\n else: flow.else ? lowerFlow(flow.else) : undefined,\n };\n\n case \"patch\":\n return {\n kind: \"patch\",\n op: flow.op,\n path: flow.path,\n value: flow.value ? lowerActionExpr(flow.value) : undefined,\n };\n\n case \"effect\":\n return {\n kind: \"effect\",\n type: flow.type,\n params: Object.fromEntries(\n Object.entries(flow.params).map(([name, value]) => [name, lowerEffectExpr(value)])\n ),\n };\n\n case \"fail\":\n return {\n kind: \"fail\",\n code: flow.code,\n message: flow.message ? lowerActionExpr(flow.message) : undefined,\n };\n\n case \"call\":\n case \"halt\":\n return flow;\n }\n}\n\nfunction lowerSchemaExpr(expr: MelExprNode): CoreExprNode {\n return lowerExprNode(rewriteForRuntime(expr), DEFAULT_SCHEMA_CONTEXT);\n}\n\nfunction lowerActionExpr(expr: MelExprNode): CoreExprNode {\n return lowerExprNode(rewriteForRuntime(expr), DEFAULT_ACTION_CONTEXT);\n}\n\nfunction lowerEffectExpr(expr: MelExprNode): CoreExprNode {\n return lowerExprNode(rewriteForRuntime(expr), EFFECT_ARGS_CONTEXT);\n}\n\nfunction rewriteForRuntime(expr: MelExprNode): MelExprNode {\n switch (expr.kind) {\n case \"lit\":\n case \"var\":\n return expr;\n\n case \"sys\":\n if (expr.path[0] === \"system\") {\n return getPathExpr(\"$system\", ...expr.path.slice(1));\n }\n return expr;\n\n case \"get\":\n return {\n kind: \"get\",\n ...(expr.base ? { base: rewriteForRuntime(expr.base) } : undefined),\n path: expr.path,\n };\n\n case \"field\":\n return {\n kind: \"field\",\n object: rewriteForRuntime(expr.object),\n property: expr.property,\n };\n\n case \"obj\":\n return {\n kind: \"obj\",\n fields: expr.fields.map((field) => ({\n key: field.key,\n value: rewriteForRuntime(field.value),\n })),\n };\n\n case \"arr\":\n return {\n kind: \"arr\",\n elements: expr.elements.map((element) => rewriteForRuntime(element)),\n };\n\n case \"call\":\n if (ENTITY_PRIMITIVES.has(expr.fn)) {\n return rewriteForRuntime(rewriteEntityPrimitive(expr.fn, expr.args));\n }\n return {\n kind: \"call\",\n fn: expr.fn,\n args: expr.args.map((arg) => rewriteForRuntime(arg)),\n };\n }\n}\n\nfunction rewriteEntityPrimitive(fn: string, args: MelExprNode[]): MelExprNode {\n const [collection, idArg, updatesArg] = args;\n const collectionExpr = rewriteForRuntime(collection);\n const idExpr = idArg ? rewriteForRuntime(idArg) : { kind: \"lit\", value: null } satisfies MelExprNode;\n const itemVar = { kind: \"var\", name: \"item\" } satisfies MelExprNode;\n const itemId = getBasePathExpr(itemVar, \"id\");\n\n switch (fn) {\n case \"findById\":\n return {\n kind: \"call\",\n fn: \"find\",\n args: [\n collectionExpr,\n {\n kind: \"call\",\n fn: \"eq\",\n args: [itemId, idExpr],\n },\n ],\n };\n\n case \"existsById\":\n return {\n kind: \"call\",\n fn: \"not\",\n args: [\n {\n kind: \"call\",\n fn: \"isNull\",\n args: [rewriteEntityPrimitive(\"findById\", args)],\n },\n ],\n };\n\n case \"updateById\": {\n const updatesExpr = updatesArg ? rewriteForRuntime(updatesArg) : objExpr({});\n return {\n kind: \"call\",\n fn: \"map\",\n args: [\n collectionExpr,\n {\n kind: \"call\",\n fn: \"cond\",\n args: [\n {\n kind: \"call\",\n fn: \"eq\",\n args: [itemId, idExpr],\n },\n {\n kind: \"call\",\n fn: \"merge\",\n args: [itemVar, updatesExpr],\n },\n itemVar,\n ],\n },\n ],\n };\n }\n\n case \"removeById\":\n return {\n kind: \"call\",\n fn: \"filter\",\n args: [\n collectionExpr,\n {\n kind: \"call\",\n fn: \"not\",\n args: [\n {\n kind: \"call\",\n fn: \"eq\",\n args: [itemId, idExpr],\n },\n ],\n },\n ],\n };\n\n default:\n return {\n kind: \"call\",\n fn,\n args: args.map((arg) => rewriteForRuntime(arg)),\n };\n }\n}\n","import { createError, type Diagnostic } from \"../diagnostics/types.js\";\nimport type {\n ActionNode,\n DomainMember,\n DomainNode,\n EffectStmtNode,\n ExprNode,\n FailStmtNode,\n FlowDeclNode,\n FlowStmtNode,\n GuardedStmtNode,\n IncludeStmtNode,\n InnerStmtNode,\n OnceIntentStmtNode,\n OnceStmtNode,\n PatchStmtNode,\n ProgramNode,\n StateNode,\n StopStmtNode,\n TypeDeclNode,\n TypeExprNode,\n WhenStmtNode,\n} from \"../parser/ast.js\";\n\nconst MAX_INCLUDE_DEPTH = 16;\n\nexport interface FlowExpansionResult {\n program: ProgramNode;\n diagnostics: Diagnostic[];\n}\n\ninterface FlowSymbols {\n stateTypes: Map<string, TypeExprNode>;\n computedNames: Set<string>;\n typeDefs: Map<string, TypeDeclNode>;\n actionNames: Set<string>;\n flows: Map<string, FlowDeclNode>;\n}\n\ntype TypeEnv = Map<string, TypeExprNode>;\ntype ValueBindings = Map<string, ExprNode>;\n\ninterface FlowEdge {\n target: string;\n location: IncludeStmtNode[\"location\"];\n}\n\nfunction cloneNode<T>(value: T): T {\n return structuredClone(value);\n}\n\nfunction addDiagnostic(\n diagnostics: Diagnostic[],\n dedupe: Set<string>,\n code: string,\n message: string,\n location: Diagnostic[\"location\"]\n): void {\n const key = `${code}:${location.start.offset}:${location.end.offset}:${message}`;\n if (dedupe.has(key)) {\n return;\n }\n dedupe.add(key);\n diagnostics.push(createError(code, message, location));\n}\n\nfunction collectSymbols(domain: DomainNode): FlowSymbols {\n const stateTypes = new Map<string, TypeExprNode>();\n const computedNames = new Set<string>();\n const typeDefs = new Map<string, TypeDeclNode>();\n const actionNames = new Set<string>();\n const flows = new Map<string, FlowDeclNode>();\n\n for (const typeDecl of domain.types) {\n typeDefs.set(typeDecl.name, typeDecl);\n }\n\n for (const member of domain.members) {\n switch (member.kind) {\n case \"state\":\n for (const field of member.fields) {\n stateTypes.set(field.name, field.typeExpr);\n }\n break;\n case \"computed\":\n computedNames.add(member.name);\n break;\n case \"action\":\n actionNames.add(member.name);\n break;\n case \"flow\":\n if (!flows.has(member.name)) {\n flows.set(member.name, member);\n }\n break;\n }\n }\n\n return {\n stateTypes,\n computedNames,\n typeDefs,\n actionNames,\n flows,\n };\n}\n\nfunction createFlowParamEnv(flow: FlowDeclNode): TypeEnv {\n const env = new Map<string, TypeExprNode>();\n for (const param of flow.params) {\n env.set(param.name, param.typeExpr);\n }\n return env;\n}\n\nfunction createActionParamEnv(action: ActionNode): TypeEnv {\n const env = new Map<string, TypeExprNode>();\n for (const param of action.params) {\n env.set(param.name, param.typeExpr);\n }\n return env;\n}\n\nfunction collectFlowValidationDiagnostics(\n domain: DomainNode,\n symbols: FlowSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>\n): Map<string, FlowEdge[]> {\n const graph = new Map<string, FlowEdge[]>();\n\n for (const flow of symbols.flows.values()) {\n graph.set(flow.name, []);\n\n if (symbols.actionNames.has(flow.name)) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E022\",\n `Flow '${flow.name}' conflicts with action '${flow.name}'.`,\n flow.location\n );\n }\n\n for (const param of flow.params) {\n if (\n symbols.stateTypes.has(param.name) ||\n symbols.computedNames.has(param.name) ||\n symbols.typeDefs.has(param.name)\n ) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E021\",\n `Flow parameter '${param.name}' conflicts with a top-level identifier.`,\n param.location\n );\n }\n }\n\n const paramEnv = createFlowParamEnv(flow);\n for (const stmt of flow.body) {\n validateFlowStmt(stmt, flow.name, paramEnv, symbols, diagnostics, dedupe, graph.get(flow.name)!);\n }\n }\n\n for (const member of domain.members) {\n if (member.kind === \"action\") {\n const paramEnv = createActionParamEnv(member);\n for (const stmt of member.body) {\n validateActionStmt(stmt, paramEnv, symbols, diagnostics, dedupe);\n }\n }\n }\n\n return graph;\n}\n\nfunction validateActionStmt(\n stmt: GuardedStmtNode,\n typeEnv: TypeEnv,\n symbols: FlowSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>\n): void {\n switch (stmt.kind) {\n case \"include\":\n validateInclude(stmt, typeEnv, symbols, diagnostics, dedupe);\n break;\n\n case \"when\":\n for (const inner of stmt.body) {\n validateActionInnerStmt(inner, typeEnv, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"once\":\n for (const inner of stmt.body) {\n validateActionInnerStmt(inner, typeEnv, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"onceIntent\":\n for (const inner of stmt.body) {\n validateActionInnerStmt(inner, typeEnv, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"fail\":\n case \"stop\":\n break;\n }\n}\n\nfunction validateActionInnerStmt(\n stmt: InnerStmtNode,\n typeEnv: TypeEnv,\n symbols: FlowSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>\n): void {\n switch (stmt.kind) {\n case \"include\":\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E016\",\n \"include is only allowed at action or flow body top-level.\",\n stmt.location\n );\n validateInclude(stmt, typeEnv, symbols, diagnostics, dedupe);\n break;\n\n case \"when\":\n for (const inner of stmt.body) {\n validateActionInnerStmt(inner, typeEnv, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"once\":\n for (const inner of stmt.body) {\n validateActionInnerStmt(inner, typeEnv, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"onceIntent\":\n for (const inner of stmt.body) {\n validateActionInnerStmt(inner, typeEnv, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"patch\":\n case \"effect\":\n case \"fail\":\n case \"stop\":\n break;\n }\n}\n\nfunction validateFlowStmt(\n stmt: FlowStmtNode,\n flowName: string,\n typeEnv: TypeEnv,\n symbols: FlowSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>,\n edges: FlowEdge[]\n): void {\n switch (stmt.kind) {\n case \"include\":\n if (validateInclude(stmt, typeEnv, symbols, diagnostics, dedupe)) {\n edges.push({ target: stmt.flowName, location: stmt.location });\n }\n break;\n\n case \"when\":\n for (const inner of stmt.body) {\n validateFlowInnerStmt(inner, flowName, typeEnv, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"once\":\n addDiagnostic(diagnostics, dedupe, \"E017\", \"once() is not allowed in flow bodies.\", stmt.location);\n break;\n\n case \"onceIntent\":\n addDiagnostic(diagnostics, dedupe, \"E018\", \"onceIntent is not allowed in flow bodies.\", stmt.location);\n break;\n\n case \"patch\":\n addDiagnostic(diagnostics, dedupe, \"E019\", \"patch is not allowed in flow bodies.\", stmt.location);\n break;\n\n case \"effect\":\n addDiagnostic(diagnostics, dedupe, \"E020\", \"effect is not allowed in flow bodies.\", stmt.location);\n break;\n }\n}\n\nfunction validateFlowInnerStmt(\n stmt: InnerStmtNode,\n flowName: string,\n typeEnv: TypeEnv,\n symbols: FlowSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>\n): void {\n switch (stmt.kind) {\n case \"include\":\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E016\",\n \"include is only allowed at action or flow body top-level.\",\n stmt.location\n );\n validateInclude(stmt, typeEnv, symbols, diagnostics, dedupe);\n break;\n\n case \"when\":\n for (const inner of stmt.body) {\n validateFlowInnerStmt(inner, flowName, typeEnv, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"once\":\n addDiagnostic(diagnostics, dedupe, \"E017\", \"once() is not allowed in flow bodies.\", stmt.location);\n for (const inner of stmt.body) {\n validateFlowInnerStmt(inner, flowName, typeEnv, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"onceIntent\":\n addDiagnostic(diagnostics, dedupe, \"E018\", \"onceIntent is not allowed in flow bodies.\", stmt.location);\n for (const inner of stmt.body) {\n validateFlowInnerStmt(inner, flowName, typeEnv, symbols, diagnostics, dedupe);\n }\n break;\n\n case \"patch\":\n addDiagnostic(diagnostics, dedupe, \"E019\", \"patch is not allowed in flow bodies.\", stmt.location);\n break;\n\n case \"effect\":\n addDiagnostic(diagnostics, dedupe, \"E020\", \"effect is not allowed in flow bodies.\", stmt.location);\n break;\n\n case \"fail\":\n case \"stop\":\n break;\n }\n}\n\nfunction validateInclude(\n stmt: IncludeStmtNode,\n typeEnv: TypeEnv,\n symbols: FlowSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>\n): boolean {\n const targetFlow = symbols.flows.get(stmt.flowName);\n if (!targetFlow) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E015\",\n `'${stmt.flowName}' is not a declared flow.`,\n stmt.location\n );\n return false;\n }\n\n if (stmt.args.length !== targetFlow.params.length) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E023\",\n `include '${stmt.flowName}' expected ${targetFlow.params.length} argument(s), got ${stmt.args.length}.`,\n stmt.location\n );\n return true;\n }\n\n for (let index = 0; index < stmt.args.length; index += 1) {\n const arg = stmt.args[index];\n const param = targetFlow.params[index];\n const argType = inferExprType(arg, typeEnv, symbols);\n if (!argType) {\n continue;\n }\n\n const assignable = isAssignable(argType, param.typeExpr, symbols);\n if (assignable === false) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E024\",\n `include '${stmt.flowName}' argument ${index + 1} is not assignable to parameter '${param.name}'.`,\n arg.location\n );\n }\n }\n\n return true;\n}\n\nfunction detectFlowGraphIssues(\n graph: Map<string, FlowEdge[]>,\n symbols: FlowSymbols,\n diagnostics: Diagnostic[],\n dedupe: Set<string>\n): void {\n function walk(flowName: string, depth: number, stack: Set<string>): void {\n stack.add(flowName);\n\n for (const edge of graph.get(flowName) ?? []) {\n if (depth + 1 > MAX_INCLUDE_DEPTH) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E014\",\n `Include expansion depth exceeds limit (${MAX_INCLUDE_DEPTH}).`,\n edge.location\n );\n continue;\n }\n\n if (stack.has(edge.target)) {\n addDiagnostic(\n diagnostics,\n dedupe,\n \"E013\",\n \"Circular include detected.\",\n edge.location\n );\n continue;\n }\n\n walk(edge.target, depth + 1, new Set(stack));\n }\n }\n\n for (const flowName of symbols.flows.keys()) {\n walk(flowName, 1, new Set<string>());\n }\n}\n\nfunction cloneExprWithBindings(expr: ExprNode, bindings: ValueBindings): ExprNode {\n switch (expr.kind) {\n case \"identifier\":\n return bindings.has(expr.name) ? cloneNode(bindings.get(expr.name)!) : cloneNode(expr);\n\n case \"systemIdent\":\n case \"literal\":\n case \"iterationVar\":\n return cloneNode(expr);\n\n case \"functionCall\":\n return {\n ...cloneNode(expr),\n args: expr.args.map((arg) => cloneExprWithBindings(arg, bindings)),\n };\n\n case \"binary\":\n return {\n ...cloneNode(expr),\n left: cloneExprWithBindings(expr.left, bindings),\n right: cloneExprWithBindings(expr.right, bindings),\n };\n\n case \"unary\":\n return {\n ...cloneNode(expr),\n operand: cloneExprWithBindings(expr.operand, bindings),\n };\n\n case \"ternary\":\n return {\n ...cloneNode(expr),\n condition: cloneExprWithBindings(expr.condition, bindings),\n consequent: cloneExprWithBindings(expr.consequent, bindings),\n alternate: cloneExprWithBindings(expr.alternate, bindings),\n };\n\n case \"propertyAccess\":\n return {\n ...cloneNode(expr),\n object: cloneExprWithBindings(expr.object, bindings),\n };\n\n case \"indexAccess\":\n return {\n ...cloneNode(expr),\n object: cloneExprWithBindings(expr.object, bindings),\n index: cloneExprWithBindings(expr.index, bindings),\n };\n\n case \"objectLiteral\":\n return {\n ...cloneNode(expr),\n properties: expr.properties.map((property) => ({\n ...cloneNode(property),\n value: cloneExprWithBindings(property.value, bindings),\n })),\n };\n\n case \"arrayLiteral\":\n return {\n ...cloneNode(expr),\n elements: expr.elements.map((element) => cloneExprWithBindings(element, bindings)),\n };\n }\n}\n\nfunction cloneInnerStmtWithBindings(stmt: InnerStmtNode, bindings: ValueBindings): InnerStmtNode[] {\n switch (stmt.kind) {\n case \"when\":\n return [cloneWhenWithBindings(stmt, bindings)];\n\n case \"fail\":\n return [{\n ...cloneNode(stmt),\n message: stmt.message ? cloneExprWithBindings(stmt.message, bindings) : undefined,\n }];\n\n case \"stop\":\n return [cloneNode(stmt)];\n\n case \"patch\":\n case \"effect\":\n case \"once\":\n case \"onceIntent\":\n case \"include\":\n return [];\n }\n}\n\nfunction cloneWhenWithBindings(stmt: WhenStmtNode, bindings: ValueBindings): WhenStmtNode {\n return {\n ...cloneNode(stmt),\n condition: cloneExprWithBindings(stmt.condition, bindings),\n body: stmt.body.flatMap((inner) => cloneInnerStmtWithBindings(inner, bindings)),\n };\n}\n\nfunction buildIncludeBindings(\n targetFlow: FlowDeclNode,\n includeStmt: IncludeStmtNode,\n bindings: ValueBindings\n): ValueBindings {\n const nextBindings = new Map<string, ExprNode>();\n for (let index = 0; index < targetFlow.params.length; index += 1) {\n nextBindings.set(targetFlow.params[index].name, cloneExprWithBindings(includeStmt.args[index], bindings));\n }\n return nextBindings;\n}\n\nfunction expandFlowStmt(\n stmt: FlowStmtNode,\n symbols: FlowSymbols,\n bindings: ValueBindings,\n depth: number,\n stack: string[]\n): GuardedStmtNode[] {\n switch (stmt.kind) {\n case \"when\":\n return [cloneWhenWithBindings(stmt, bindings)];\n\n case \"include\":\n return expandInclude(stmt, symbols, bindings, depth, stack);\n\n case \"once\":\n case \"onceIntent\":\n case \"patch\":\n case \"effect\":\n return [];\n }\n}\n\nfunction expandInclude(\n stmt: IncludeStmtNode,\n symbols: FlowSymbols,\n bindings: ValueBindings,\n depth: number,\n stack: string[]\n): GuardedStmtNode[] {\n const targetFlow = symbols.flows.get(stmt.flowName);\n if (\n !targetFlow ||\n stmt.args.length !== targetFlow.params.length ||\n depth > MAX_INCLUDE_DEPTH ||\n stack.includes(stmt.flowName)\n ) {\n return [];\n }\n\n const nextBindings = buildIncludeBindings(targetFlow, stmt, bindings);\n const nextStack = [...stack, stmt.flowName];\n\n return targetFlow.body.flatMap((flowStmt) =>\n expandFlowStmt(flowStmt, symbols, nextBindings, depth + 1, nextStack)\n );\n}\n\nfunction cloneActionInnerStmt(stmt: InnerStmtNode): InnerStmtNode[] {\n switch (stmt.kind) {\n case \"when\":\n return [{\n ...cloneNode(stmt),\n body: stmt.body.flatMap((inner) => cloneActionInnerStmt(inner)),\n }];\n\n case \"once\":\n return [{\n ...cloneNode(stmt),\n body: stmt.body.flatMap((inner) => cloneActionInnerStmt(inner)),\n }];\n\n case \"onceIntent\":\n return [{\n ...cloneNode(stmt),\n body: stmt.body.flatMap((inner) => cloneActionInnerStmt(inner)),\n }];\n\n case \"include\":\n return [];\n\n case \"patch\":\n case \"effect\":\n case \"fail\":\n case \"stop\":\n return [cloneNode(stmt)];\n }\n}\n\nfunction expandActionStmt(\n stmt: GuardedStmtNode,\n symbols: FlowSymbols,\n depth: number\n): GuardedStmtNode[] {\n switch (stmt.kind) {\n case \"include\":\n return expandInclude(stmt, symbols, new Map(), depth, []);\n\n case \"when\":\n return [{\n ...cloneNode(stmt),\n body: stmt.body.flatMap((inner) => cloneActionInnerStmt(inner)),\n }];\n\n case \"once\":\n return [{\n ...cloneNode(stmt),\n body: stmt.body.flatMap((inner) => cloneActionInnerStmt(inner)),\n }];\n\n case \"onceIntent\":\n return [{\n ...cloneNode(stmt),\n body: stmt.body.flatMap((inner) => cloneActionInnerStmt(inner)),\n }];\n\n case \"fail\":\n case \"stop\":\n return [cloneNode(stmt)];\n }\n}\n\nfunction expandProgram(program: ProgramNode, symbols: FlowSymbols): ProgramNode {\n const domainMembers: DomainMember[] = [];\n\n for (const member of program.domain.members) {\n switch (member.kind) {\n case \"state\":\n case \"computed\":\n domainMembers.push(cloneNode(member));\n break;\n\n case \"action\":\n domainMembers.push({\n ...cloneNode(member),\n body: member.body.flatMap((stmt) => expandActionStmt(stmt, symbols, 1)),\n });\n break;\n\n case \"flow\":\n break;\n }\n }\n\n return {\n ...cloneNode(program),\n domain: {\n ...cloneNode(program.domain),\n types: program.domain.types.map((typeDecl) => cloneNode(typeDecl)),\n members: domainMembers,\n },\n };\n}\n\nfunction inferExprType(expr: ExprNode, typeEnv: TypeEnv, symbols: FlowSymbols): TypeExprNode | null {\n switch (expr.kind) {\n case \"literal\":\n return {\n kind: \"literalType\",\n value: expr.value as string | number | boolean | null,\n location: expr.location,\n };\n\n case \"identifier\":\n return typeEnv.get(expr.name) ?? symbols.stateTypes.get(expr.name) ?? null;\n\n case \"propertyAccess\": {\n const objectType = inferExprType(expr.object, typeEnv, symbols);\n return getPropertyType(objectType, expr.property, symbols);\n }\n\n case \"indexAccess\": {\n const objectType = inferExprType(expr.object, typeEnv, symbols);\n return getIndexType(objectType, symbols);\n }\n\n case \"objectLiteral\":\n return {\n kind: \"objectType\",\n fields: expr.properties\n .map((property) => {\n const propertyType = inferExprType(property.value, typeEnv, symbols);\n if (!propertyType) {\n return null;\n }\n return {\n kind: \"typeField\" as const,\n name: property.key,\n typeExpr: propertyType,\n optional: false,\n location: property.location,\n };\n })\n .filter((field): field is NonNullable<typeof field> => field !== null),\n location: expr.location,\n };\n\n case \"arrayLiteral\": {\n if (expr.elements.length === 0) {\n return null;\n }\n const firstElementType = inferExprType(expr.elements[0], typeEnv, symbols);\n if (!firstElementType) {\n return null;\n }\n return {\n kind: \"arrayType\",\n elementType: firstElementType,\n location: expr.location,\n };\n }\n\n case \"systemIdent\":\n case \"functionCall\":\n case \"binary\":\n case \"unary\":\n case \"ternary\":\n case \"iterationVar\":\n return null;\n }\n}\n\nfunction resolveType(typeExpr: TypeExprNode | null, symbols: FlowSymbols, seen = new Set<string>()): TypeExprNode | null {\n if (!typeExpr) {\n return null;\n }\n\n if (typeExpr.kind === \"simpleType\" && symbols.typeDefs.has(typeExpr.name)) {\n if (seen.has(typeExpr.name)) {\n return null;\n }\n seen.add(typeExpr.name);\n return resolveType(symbols.typeDefs.get(typeExpr.name)!.typeExpr, symbols, seen);\n }\n\n return typeExpr;\n}\n\nfunction getPropertyType(typeExpr: TypeExprNode | null, property: string, symbols: FlowSymbols): TypeExprNode | null {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved) {\n return null;\n }\n\n if (resolved.kind === \"objectType\") {\n const field = resolved.fields.find((candidate) => candidate.name === property);\n return field?.typeExpr ?? null;\n }\n\n if (resolved.kind === \"unionType\") {\n for (const member of resolved.types) {\n if (member.kind === \"simpleType\" && member.name === \"null\") {\n continue;\n }\n const memberType = getPropertyType(member, property, symbols);\n if (memberType) {\n return memberType;\n }\n }\n }\n\n return null;\n}\n\nfunction getIndexType(typeExpr: TypeExprNode | null, symbols: FlowSymbols): TypeExprNode | null {\n const resolved = resolveType(typeExpr, symbols);\n if (!resolved) {\n return null;\n }\n\n if (resolved.kind === \"arrayType\") {\n return resolved.elementType;\n }\n\n if (resolved.kind === \"recordType\") {\n return resolved.valueType;\n }\n\n if (resolved.kind === \"unionType\") {\n for (const member of resolved.types) {\n if (member.kind === \"simpleType\" && member.name === \"null\") {\n continue;\n }\n const memberType = getIndexType(member, symbols);\n if (memberType) {\n return memberType;\n }\n }\n }\n\n return null;\n}\n\nfunction isAssignable(sourceType: TypeExprNode, targetType: TypeExprNode, symbols: FlowSymbols): boolean | null {\n const resolvedSource = resolveType(sourceType, symbols);\n const resolvedTarget = resolveType(targetType, symbols);\n if (!resolvedSource || !resolvedTarget) {\n return null;\n }\n\n if (resolvedTarget.kind === \"unionType\") {\n const outcomes = resolvedTarget.types.map((candidate) => isAssignable(resolvedSource, candidate, symbols));\n if (outcomes.includes(true)) {\n return true;\n }\n return outcomes.every((outcome) => outcome === false) ? false : null;\n }\n\n if (resolvedSource.kind === \"unionType\") {\n const outcomes = resolvedSource.types.map((candidate) => isAssignable(candidate, resolvedTarget, symbols));\n if (outcomes.every((outcome) => outcome === true)) {\n return true;\n }\n return outcomes.some((outcome) => outcome === false) ? false : null;\n }\n\n if (resolvedTarget.kind === \"simpleType\") {\n if (resolvedSource.kind === \"simpleType\") {\n return resolvedSource.name === resolvedTarget.name;\n }\n if (resolvedSource.kind === \"literalType\") {\n if (resolvedTarget.name === \"null\") {\n return resolvedSource.value === null;\n }\n return typeof resolvedSource.value === resolvedTarget.name;\n }\n }\n\n if (resolvedTarget.kind === \"literalType\") {\n if (resolvedSource.kind !== \"literalType\") {\n return false;\n }\n return resolvedSource.value === resolvedTarget.value;\n }\n\n if (resolvedTarget.kind === \"arrayType\") {\n if (resolvedSource.kind !== \"arrayType\") {\n return false;\n }\n return isAssignable(resolvedSource.elementType, resolvedTarget.elementType, symbols);\n }\n\n if (resolvedTarget.kind === \"objectType\") {\n if (resolvedSource.kind !== \"objectType\") {\n return false;\n }\n\n for (const targetField of resolvedTarget.fields) {\n const sourceField = resolvedSource.fields.find((candidate) => candidate.name === targetField.name);\n if (!sourceField) {\n if (targetField.optional) {\n continue;\n }\n return false;\n }\n const fieldAssignable = isAssignable(sourceField.typeExpr, targetField.typeExpr, symbols);\n if (fieldAssignable !== true) {\n return fieldAssignable;\n }\n }\n\n return true;\n }\n\n if (resolvedTarget.kind === \"recordType\") {\n if (resolvedSource.kind !== \"recordType\") {\n return null;\n }\n return isAssignable(resolvedSource.valueType, resolvedTarget.valueType, symbols);\n }\n\n return null;\n}\n\nexport function validateAndExpandFlows(program: ProgramNode): FlowExpansionResult {\n const symbols = collectSymbols(program.domain);\n const diagnostics: Diagnostic[] = [];\n const dedupe = new Set<string>();\n const graph = collectFlowValidationDiagnostics(program.domain, symbols, diagnostics, dedupe);\n\n detectFlowGraphIssues(graph, symbols, diagnostics, dedupe);\n\n return {\n program: expandProgram(program, symbols),\n diagnostics,\n };\n}\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 ExprNode,\n GuardedStmtNode,\n InnerStmtNode,\n PathNode,\n PatchStmtNode,\n} from \"../parser/ast.js\";\nimport {\n classifyComparableExpr,\n type DomainTypeSymbols,\n} from \"../analyzer/expr-type-surface.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 private readonly exprValidator: PatchExprValidator;\n\n constructor(private readonly deps: PatchCollectorDeps) {\n this.exprValidator = new PatchExprValidator(deps.mapLocation);\n }\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 this.exprValidator.validatePath(stmt.path, errors);\n if (stmt.value) {\n this.exprValidator.validateExpr(stmt.value, errors);\n }\n patchStatements.push({\n patch: stmt,\n condition: parentCondition,\n });\n continue;\n }\n\n if (stmt.kind === \"when\") {\n this.exprValidator.validateExpr(stmt.condition, errors);\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 this.exprValidator.validatePath(stmt.marker, errors);\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 this.exprValidator.validateExpr(stmt.condition, errors);\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 this.exprValidator.validateExpr(stmt.condition, errors);\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\nclass PatchExprValidator {\n private readonly symbols: DomainTypeSymbols = {\n stateTypes: new Map(),\n computedDecls: new Map(),\n typeDefs: new Map(),\n computedTypeCache: new Map(),\n computedTypeInFlight: new Set(),\n };\n\n constructor(private readonly mapLocation: (location: Diagnostic[\"location\"]) => Diagnostic[\"location\"]) {}\n\n validatePath(path: PathNode, errors: Diagnostic[]): void {\n for (const segment of path.segments) {\n if (segment.kind === \"indexSegment\") {\n this.validateExpr(segment.index, errors);\n }\n }\n }\n\n validateExpr(expr: ExprNode, errors: Diagnostic[]): void {\n switch (expr.kind) {\n case \"functionCall\":\n if ((expr.name === \"eq\" || expr.name === \"neq\") && expr.args.length >= 2) {\n this.validatePrimitiveEquality(expr.args[0], expr.args[1], expr.location, errors);\n }\n for (const arg of expr.args) {\n this.validateExpr(arg, errors);\n }\n return;\n\n case \"binary\":\n if (expr.operator === \"==\" || expr.operator === \"!=\") {\n this.validatePrimitiveEquality(expr.left, expr.right, expr.location, errors);\n }\n this.validateExpr(expr.left, errors);\n this.validateExpr(expr.right, errors);\n return;\n\n case \"unary\":\n this.validateExpr(expr.operand, errors);\n return;\n\n case \"ternary\":\n this.validateExpr(expr.condition, errors);\n this.validateExpr(expr.consequent, errors);\n this.validateExpr(expr.alternate, errors);\n return;\n\n case \"propertyAccess\":\n this.validateExpr(expr.object, errors);\n return;\n\n case \"indexAccess\":\n this.validateExpr(expr.object, errors);\n this.validateExpr(expr.index, errors);\n return;\n\n case \"objectLiteral\":\n for (const property of expr.properties) {\n this.validateExpr(property.value, errors);\n }\n return;\n\n case \"arrayLiteral\":\n for (const element of expr.elements) {\n this.validateExpr(element, errors);\n }\n return;\n\n case \"literal\":\n case \"identifier\":\n case \"systemIdent\":\n case \"iterationVar\":\n return;\n }\n }\n\n private validatePrimitiveEquality(\n left: ExprNode,\n right: ExprNode,\n location: Diagnostic[\"location\"],\n errors: Diagnostic[]\n ): void {\n const leftClass = classifyComparableExpr(left, new Map(), this.symbols);\n const rightClass = classifyComparableExpr(right, new Map(), this.symbols);\n if (leftClass !== \"nonprimitive\" && rightClass !== \"nonprimitive\") {\n return;\n }\n\n errors.push({\n severity: \"error\",\n code: \"E_TYPE_MISMATCH\",\n message: \"eq/neq operands must be primitive types (null, boolean, number, string)\",\n location: this.mapLocation(location),\n });\n }\n}\n","import type { ExprNode } from \"../parser/ast.js\";\nimport type { MelExprNode } from \"../lowering/lower-expr.js\";\nimport { toMelExpr as sharedToMelExpr } from \"../lowering/to-mel-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 return sharedToMelExpr(input);\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 { validateAndExpandFlows } from \"../analyzer/flow-composition.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 flowResult = validateAndExpandFlows(ast);\n const flowErrors = flowResult.diagnostics.filter((d) => d.severity === \"error\");\n const flowWarnings = flowResult.diagnostics.filter((d) => d.severity === \"warning\");\n\n const scopeResult = analyzeScope(flowResult.program);\n const validateResult = validateSemantics(flowResult.program);\n const analyzeErrors = [\n ...flowErrors,\n ...scopeResult.diagnostics.filter(d => d.severity === \"error\"),\n ...validateResult.diagnostics.filter(d => d.severity === \"error\"),\n ];\n const analyzeWarnings = [\n ...flowWarnings,\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(flowResult.program);\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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KAAK,aAAa,UAAUA,EAAO,IAAI,EAAG,CAC5C,KAAK,MACH,yBAAyBA,EAAO,IAAI,IACpCA,EAAO,SACP,aACF,EACA,MACF,CAEA,KAAK,aAAa,OAAOA,CAAM,EACjC,CAEQ,MAAMyB,EAAiBP,EAA0BQ,EAAoB,CAC3E,KAAK,YAAY,KAAK,CACpB,SAAU,QACV,KAAAA,EACA,QAAAD,EACA,SAAAP,CACF,CAAC,CACH,CACF,EAKO,SAASS,GAAaxB,EAA2C,CAEtE,OADiB,IAAID,GAAc,EACnB,QAAQC,CAAO,CACjC,CC5WO,SAASyB,GACdC,EACAC,EACAC,EACAC,EAKY,CACZ,MAAO,CACL,SAAU,QACV,KAAAH,EACA,QAAAC,EACA,SAAAC,EACA,GAAGC,CACL,CACF,CAKO,SAASC,GACdJ,EACAC,EACAC,EACAC,EAIY,CACZ,MAAO,CACL,SAAU,UACV,KAAAH,EACA,QAAAC,EACA,SAAAC,EACA,GAAGC,CACL,CACF,CAKO,SAASE,GACdL,EACAC,EACAC,EACY,CACZ,MAAO,CACL,SAAU,OACV,KAAAF,EACA,QAAAC,EACA,SAAAC,CACF,CACF,CAKO,SAASI,GAAQC,EAAiC,CACvD,OAAOA,EAAW,WAAa,OACjC,CAKO,SAASC,GAAUC,EAAoC,CAC5D,OAAOA,EAAY,KAAKH,EAAO,CACjC,CAKO,SAASI,GACdD,EACAE,EACc,CACd,OAAOF,EAAY,OAAQG,GAAMA,EAAE,WAAaD,CAAQ,CAC1D,CCrGA,IAAME,GAA0B,IAAI,IAAI,CACtC,KACA,MACA,KACA,MACA,KACA,MACA,MACA,KACA,MACA,SACA,YACA,SACA,aACA,WACA,cACA,WACA,QACA,OACA,YACF,CAAC,EAEKC,GAAyB,IAAI,IAAI,CACrC,MACA,MACA,MACA,MACA,MACA,MACA,QACA,OACA,QACA,OACA,MACA,MACA,SACA,UACA,MACA,MACA,MACA,UACF,CAAC,EAEKC,GAAyB,IAAI,IAAI,CACrC,OACA,QACA,QACA,SACA,SACA,WACA,YACA,SACA,SACF,CAAC,EAEKC,GAAqB,IAAI,IAAI,CACjC,OACA,SAC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","names":["KEYWORDS","RESERVED_KEYWORDS","isKeyword","lexeme","isReserved","getKeywordKind","createToken","kind","location","value","createPosition","line","column","offset","createLocation","start","end","source","createPointLocation","pos","mergeLocations","a","b","Lexer","source","sourcePath","createToken","c","startLine","startColumn","quote","value","escaped","hexStr","lexeme","isReserved","keywordKind","getKeywordKind","initialLexeme","expected","startPos","endPos","createLocation","offset","line","lineStart","createPosition","kind","message","code","location","lineNumber","tokenize","isExprNode","node","isStmtNode","Precedence","getBinaryPrecedence","kind","tokenToBinaryOp","isBinaryOp","isUnaryOp","isRightAssociative","Parser","tokens","start","imports","domain","mergeLocations","names","fromToken","name","types","members","member","end","typeExpr","fields","nameToken","initializer","expression","params","available","body","stmt","startToken","token","braceDepth","t","condition","marker","flowNameToken","args","path","op","value","effectType","isPath","codeToken","code","message","reasonToken","type","elementType","keyType","valueType","optional","minPrecedence","left","precedence","getBinaryPrecedence","tokenToBinaryOp","nextPrecedence","isRightAssociative","right","consequent","alternate","operand","expr","prop","index","properties","keyToken","elements","segments","first","last","prev","offset","kind","next","kinds","parse","Scope","kind","parent","symbol","name","ScopeAnalyzer","program","domain","scope","member","field","computed","action","param","stmt","inner","arg","expr","context","prop","elem","location","path","namespace","rest","validKeys","key","first","message","code","analyzeScope","createError","code","message","location","options","createWarning","createInfo","isError","diagnostic","hasErrors","diagnostics","filterBySeverity","severity","d","PRIMITIVE_BOOLEAN_CALLS","PRIMITIVE_NUMBER_CALLS","PRIMITIVE_STRING_CALLS","NONPRIMITIVE_CALLS","ENTITY_TRANSFORM_CALLS","collectDomainTypeSymbols","domain","stateTypes","computedDecls","typeDefs","typeDecl","member","field","createActionTypeEnv","params","env","param","inferExprType","expr","symbols","literalTypeFromValue","inferComputedType","getPropertyType","getIndexType","property","propertyType","elementType","joinTypeCandidates","element","inferUnaryType","inferBinaryType","inferFunctionCallType","classifyComparableExpr","inferred","classifyComparableType","joinComparableClasses","arg","typeExpr","resolved","resolveType","seen","candidate","memberTypes","isNullType","getArrayElementType","candidates","isPrimitiveEntityIdType","name","computed","simpleType","arrayType","mapperType","extendCollectionEnv","getStaticPropertyName","classes","sawUnknown","surfaceClass","location","present","deduped","key","value","itemType","next","ENTITY_LOOKUP_FNS","ENTITY_TRANSFORM_FNS","ENTITY_PRIMITIVE_FNS","addDiagnostic","diagnostics","dedupe","code","message","location","key","createError","validateEntityPrimitives","program","symbols","collectDomainTypeSymbols","validateInitializerUniqueness","member","validateExpr","params","createActionTypeEnv","validateAction","action","stmt","validateGuardedStmt","inner","validateInnerStmt","arg","expr","context","env","transformDepth","validateEntityCall","nextTransformDepth","property","element","isStatePathExpr","elementType","getCollectionElementType","idType","getEntityIdType","isPrimitiveEntityIdType","domain","field","validateFieldInitializerUniqueness","getArrayElementType","seen","idProp","inferExprType","getPropertyType","createContext","STOP_WAITING_REASON_PATTERN","simpleTypeNode","name","location","isAssignableType","sourceType","targetType","symbols","resolvedSource","resolveType","resolvedTarget","sourceMembers","sawUnknown","member","outcomes","candidate","outcome","targetField","sourceField","fieldAssignable","describeTypeExpr","typeExpr","resolved","field","collectPrimitiveKinds","kinds","memberKinds","kind","areComparableTypesCompatible","leftType","rightType","leftKinds","rightKinds","leftNonNull","rightNonNull","stripNullType","isNullType","members","areTypesCompatible","leftToRight","rightToLeft","comparable","classifyArrayOperand","classifyLenOperand","extendCollectionTypeEnv","baseEnv","itemType","next","resolvePathType","path","first","rest","current","segment","getPropertyType","getIndexType","renderPath","result","index","SemanticValidator","program","collectDomainTypeSymbols","d","domain","state","seen","prev","expr","prop","elem","before","arg","fieldLocation","createWarning","f","t","action","createActionTypeEnv","stmt","inner","valueType","guardType","conditionType","context","env","operandType","args","argTypes","callbackEnv","getArrayElementType","leftExpr","rightExpr","inferExprType","actualType","expectedType","message","fnName","types","concreteTypes","j","code","validateSemantics","entityDiagnostics","validateEntityPrimitives","diagnostics","diagnostic","DEFAULT_SCHEMA_CONTEXT","DEFAULT_ACTION_CONTEXT","EFFECT_ARGS_CONTEXT","DEFAULT_PATCH_CONTEXT","LoweringError","code","message","options","invalidKindForContext","kind","context","path","unknownCallFn","fn","invalidSysPath","sysPath","unsupportedBase","baseKind","invalidShape","description","unknownNodeKind","compareUnicodeCodePoints","a","b","aPoints","bPoints","length","index","aCode","bCode","stableSortByUnicodeObjectKey","items","item","index","left","right","keyOrder","compareUnicodeCodePoints","lowerExprNode","input","ctx","lowerLit","lowerVar","lowerSys","lowerGet","lowerField","lowerCall","lowerObj","lowerArr","unknownNodeKind","invalidKindForContext","invalidSysPath","prefix","pathStr","seg","unsupportedBase","objectPath","segment","fn","args","isBinaryOp","unknownCallFn","left","right","isUnaryArgOp","normalizeUnaryArgOp","isScalarMinMaxOp","arg","isArgsOp","a","object","property","isArrayArgOp","isObjArgOp","isPredicateOp","predicateCtx","result","fields","field","stableSortByUnicodeObjectKey","e","loweredElements","lowerPatchFragments","fragments","ctx","fragment","lowerPatchFragment","condition","lowerExprNode","createExprContext","op","lowerPatchOp","lowerTypeExpr","typeExpr","f","patchCtx","mode","lowerRuntimePatches","patches","ctx","patch","lowerRuntimePatch","condition","lowerExprNode","value","lowerRuntimePath","path","segment","toMelExpr","input","options","toMelPrimitive","getPathExpr","resolveSystemIdent","toMelPropertyAccess","arg","toMelBinaryOp","property","element","segments","toMelPath","getBasePathExpr","base","sysPathExpr","objExpr","fields","key","value","name","object","literalType","parsed","op","hashSchemaSync","semanticPathToPatchPath","sha256Sync","ENTITY_PRIMITIVES","lowerCanonicalSchema","schema","name","field","lowerComputedField","action","lowerAction","lowerSchemaExpr","lowerFlow","flow","step","lowerActionExpr","value","lowerEffectExpr","expr","lowerExprNode","rewriteForRuntime","DEFAULT_SCHEMA_CONTEXT","DEFAULT_ACTION_CONTEXT","EFFECT_ARGS_CONTEXT","getPathExpr","element","rewriteEntityPrimitive","arg","fn","args","collection","idArg","updatesArg","collectionExpr","idExpr","itemVar","itemId","getBasePathExpr","updatesExpr","objExpr","createContext","domainName","generateCanonical","program","ctx","collectFieldNames","types","generateTypes","state","generateState","computed","generateComputed","actions","generateActions","d","schemaWithoutHash","hash","computeCanonicalHash","generate","canonical","lowerCanonicalSchema","domain","typeDecl","member","field","_ctx","typeExprToDefinition","typeExpr","fields","_exhaustive","typeSpec","typeExprToFieldSpec","fieldSpec","generateFieldSpec","spec","defaultValue","evaluateInitializer","validateLiteralAgainstSpec","seenTypeRefs","typeDef","pushSchemaTypeError","nonNullTypes","candidate","hasNull","enumValues","isLiteralEnum","describeTypeExpr","itemSpec","objectFields","pushSchemaTypeError","ctx","code","message","location","describeTypeExpr","typeExpr","member","field","validateLiteralAgainstSpec","value","spec","fieldName","specType","e","actualType","emitTypeMismatch","obj","key","fieldSpec","i","expected","actual","evaluateInitializer","expr","prop","generateComputed","domain","entries","order","generateExpr","deps","extractDeps","fields","entry","topologicallyOrderComputedEntries","entryByName","computedDeps","dependents","inDegree","dep","queue","sorted","name","dependent","nextDegree","insertComputedQueue","sortedNames","remaining","cyclePath","findComputedCyclePath","renderedCycle","candidate","candidateOrder","insertAt","index","queuedOrder","start","graph","visited","stack","stackSet","visit","node","cycleStart","cycle","segment","arg","element","generateActions","actions","params","param","flow","generateFlow","input","inputFields","typeExprToFieldSpec","available","stmts","generateStmt","s","stmt","generateWhen","generateOnce","generateOnceIntent","generatePatch","generateEffect","generateFail","generateStop","cond","thenFlow","markerPath","generatePath","intentIdExpr","sysPathExpr","callExpr","getPathExpr","pathToSegments","extraCond","markerPatch","toPatchPath","bodySteps","actionName","nextIndex","guardId","sha256Sync","guardPath","objExpr","path","result","valueExpr","rootField","targetSpec","segments","seg","literalValue","evaluatePatchLiteral","escapePathSegment","joinPathPreserveEmptySegments","indexExpr","first","semanticPathToPatchPath","fn","args","toMelExpr","resolveIdentifier","resolveSystemIdent","namespace","rest","computeCanonicalHash","schema","hashSchemaSync","MAX_INCLUDE_DEPTH","cloneNode","value","addDiagnostic","diagnostics","dedupe","code","message","location","key","createError","collectSymbols","domain","stateTypes","computedNames","typeDefs","actionNames","flows","typeDecl","member","field","createFlowParamEnv","flow","env","param","createActionParamEnv","action","collectFlowValidationDiagnostics","symbols","graph","paramEnv","stmt","validateFlowStmt","validateActionStmt","typeEnv","validateInclude","inner","validateActionInnerStmt","flowName","edges","validateFlowInnerStmt","targetFlow","index","arg","argType","inferExprType","isAssignable","detectFlowGraphIssues","walk","depth","stack","edge","cloneExprWithBindings","expr","bindings","property","element","cloneInnerStmtWithBindings","cloneWhenWithBindings","buildIncludeBindings","includeStmt","nextBindings","expandFlowStmt","expandInclude","nextStack","flowStmt","cloneActionInnerStmt","expandActionStmt","expandProgram","program","domainMembers","objectType","getPropertyType","getIndexType","propertyType","firstElementType","resolveType","typeExpr","seen","resolved","candidate","memberType","sourceType","targetType","resolvedSource","resolvedTarget","outcomes","outcome","targetField","sourceField","fieldAssignable","validateAndExpandFlows","sha256Sync","isSyntheticPatchCondition","condition","toMelExpr","input","PatchStatementCollector","deps","PatchExprValidator","ConditionComposer","stmts","errors","context","parentCondition","patchStatements","stmt","condition","error","whenMarkerId","sha256Sync","whenMarkerPath","whenMarkerExpr","pathToMelExpr","guardedBody","statement","markerExpr","markerPath","markerLocation","onceCondition","onceScopeMarkerId","onceScopeMarkerPath","onceScopeMarkerExpr","scopedBodyPatchStatements","markerScopeId","markerScopePath","markerScopeExpr","onceIntentGuardId","onceIntentCondition","onceIntentGuardMapPath","compilePatchStmtToMelRuntime","patchStatement","toRuntimePatchPath","toMelExpr","path","segments","result","segment","prop","lhs","rhs","mapLocation","expr","arg","property","element","left","right","location","leftClass","classifyComparableExpr","rightClass","computeLineStartOffsets","lines","offsets","offset","line","makePatchLocationMapper","patchLines","patchLineStarts","location","remapLocationToPatchSource","remapDiagnosticsToPatchSource","diagnostics","diagnostic","remapDiagnosticToPatchSource","remapPositionToPatchSource","position","patchLine","patchLineCount","clampedPatchLine","sourceLineStart","sourceLineText","maxSourceColumn","sourceColumn","SYNTHETIC_ACTION","SYNTHETIC_DOMAIN","SYNTHETIC_PATCH_INDENT","compileMelPatchText","melText","options","trace","warnings","errors","patchLines","patchLineStarts","computeLineStartOffsets","mapLocation","makePatchLocationMapper","syntheticMel","buildSyntheticPatchProgram","lexStart","tokens","lexResult","tokenize","lexErrors","remapDiagnosticsToPatchSource","d","error","parseStart","program","parseResult","parse","parsedDiagnostics","parseErrors","parseWarnings","analyzeStart","collectContext","action","member","expectedActionEndLine","patchRoot","isSyntheticPatchCondition","patchStatements","PatchStatementCollector","toMelExpr","lowerStart","loweringContext","loweredOps","patchStatement","melPatch","compilePatchStmtToMelRuntime","lowerRuntimePatch","LoweringError","actionName","indentedPatchText","line","compileMelDomain","melText","options","trace","warnings","errors","lexStart","tokens","lexResult","tokenize","lexErrors","d","lexWarnings","e","error","parseStart","ast","parseResult","parse","parseErrors","capDiagnostics","analyzeStart","flowResult","validateAndExpandFlows","flowErrors","flowWarnings","scopeResult","analyzeScope","validateResult","validateSemantics","analyzeErrors","analyzeWarnings","genStart","genResult","generate","diag","MAX_ERRORS","diagnostics","capped","compileMelPatch","compileMelPatchText"]}