@lokascript/framework 2.0.0 → 2.1.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.
Files changed (126) hide show
  1. package/dist/aot/index.d.ts +1 -0
  2. package/dist/aot/index.d.ts.map +1 -1
  3. package/dist/aot/registry-bridge.d.ts +27 -0
  4. package/dist/aot/registry-bridge.d.ts.map +1 -0
  5. package/dist/api/create-dsl.d.ts.map +1 -1
  6. package/dist/api/dispatcher.d.ts +22 -0
  7. package/dist/api/dispatcher.d.ts.map +1 -1
  8. package/dist/api/domain-registry.d.ts +41 -0
  9. package/dist/api/domain-registry.d.ts.map +1 -1
  10. package/dist/api/index.js +1351 -21
  11. package/dist/api/index.js.map +1 -1
  12. package/dist/core/index.js +114 -10
  13. package/dist/core/index.js.map +1 -1
  14. package/dist/core/pattern-matching/index.js +74 -10
  15. package/dist/core/pattern-matching/index.js.map +1 -1
  16. package/dist/core/pattern-matching/pattern-matcher.d.ts.map +1 -1
  17. package/dist/core/types.d.ts +80 -2
  18. package/dist/core/types.d.ts.map +1 -1
  19. package/dist/core/types.js +40 -0
  20. package/dist/core/types.js.map +1 -1
  21. package/dist/feedback/confidence-gate.d.ts +28 -0
  22. package/dist/feedback/confidence-gate.d.ts.map +1 -0
  23. package/dist/feedback/feedback-formatter.d.ts +21 -0
  24. package/dist/feedback/feedback-formatter.d.ts.map +1 -0
  25. package/dist/feedback/index.d.ts +11 -0
  26. package/dist/feedback/index.d.ts.map +1 -0
  27. package/dist/feedback/pattern-tracker.d.ts +47 -0
  28. package/dist/feedback/pattern-tracker.d.ts.map +1 -0
  29. package/dist/feedback/types.d.ts +113 -0
  30. package/dist/feedback/types.d.ts.map +1 -0
  31. package/dist/generation/index.js +2 -1
  32. package/dist/generation/index.js.map +1 -1
  33. package/dist/index.cjs +2685 -71
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.ts +6 -2
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +2652 -71
  38. package/dist/index.js.map +1 -1
  39. package/dist/ir/explicit-parser.d.ts +31 -0
  40. package/dist/ir/explicit-parser.d.ts.map +1 -0
  41. package/dist/ir/explicit-renderer.d.ts +17 -0
  42. package/dist/ir/explicit-renderer.d.ts.map +1 -0
  43. package/dist/ir/from-interchange.d.ts +51 -0
  44. package/dist/ir/from-interchange.d.ts.map +1 -0
  45. package/dist/ir/index.d.ts +29 -0
  46. package/dist/ir/index.d.ts.map +1 -0
  47. package/dist/ir/index.js +1557 -0
  48. package/dist/ir/index.js.map +1 -0
  49. package/dist/ir/json-schema.d.ts +40 -0
  50. package/dist/ir/json-schema.d.ts.map +1 -0
  51. package/dist/ir/protocol-json.d.ts +73 -0
  52. package/dist/ir/protocol-json.d.ts.map +1 -0
  53. package/dist/ir/references.d.ts +19 -0
  54. package/dist/ir/references.d.ts.map +1 -0
  55. package/dist/ir/types.d.ts +141 -0
  56. package/dist/ir/types.d.ts.map +1 -0
  57. package/dist/parsing/index.js +74 -10
  58. package/dist/parsing/index.js.map +1 -1
  59. package/dist/prompts/index.d.ts +9 -0
  60. package/dist/prompts/index.d.ts.map +1 -0
  61. package/dist/prompts/prompt-generator.d.ts +49 -0
  62. package/dist/prompts/prompt-generator.d.ts.map +1 -0
  63. package/dist/prompts/types.d.ts +64 -0
  64. package/dist/prompts/types.d.ts.map +1 -0
  65. package/dist/schema/command-schema.d.ts +17 -0
  66. package/dist/schema/command-schema.d.ts.map +1 -1
  67. package/dist/schema/index.js.map +1 -1
  68. package/dist/testing/index.js +3 -0
  69. package/dist/testing/index.js.map +1 -1
  70. package/dist/training/index.d.ts +11 -0
  71. package/dist/training/index.d.ts.map +1 -0
  72. package/dist/training/jsonl-writer.d.ts +42 -0
  73. package/dist/training/jsonl-writer.d.ts.map +1 -0
  74. package/dist/training/schema-synthesizer.d.ts +20 -0
  75. package/dist/training/schema-synthesizer.d.ts.map +1 -0
  76. package/dist/training/types.d.ts +73 -0
  77. package/dist/training/types.d.ts.map +1 -0
  78. package/package.json +5 -1
  79. package/src/aot/index.ts +1 -0
  80. package/src/aot/registry-bridge.test.ts +104 -0
  81. package/src/aot/registry-bridge.ts +66 -0
  82. package/src/api/create-dsl.test.ts +306 -0
  83. package/src/api/create-dsl.ts +21 -0
  84. package/src/api/dispatcher.test.ts +66 -0
  85. package/src/api/dispatcher.ts +77 -9
  86. package/src/api/domain-registry.ts +120 -4
  87. package/src/core/pattern-matching/pattern-matcher.test.ts +131 -0
  88. package/src/core/pattern-matching/pattern-matcher.ts +102 -19
  89. package/src/core/types.ts +145 -2
  90. package/src/feedback/confidence-gate.test.ts +111 -0
  91. package/src/feedback/confidence-gate.ts +70 -0
  92. package/src/feedback/feedback-formatter.test.ts +198 -0
  93. package/src/feedback/feedback-formatter.ts +298 -0
  94. package/src/feedback/index.ts +24 -0
  95. package/src/feedback/pattern-tracker.test.ts +198 -0
  96. package/src/feedback/pattern-tracker.ts +140 -0
  97. package/src/feedback/types.ts +149 -0
  98. package/src/generation/pattern-generator.ts +2 -2
  99. package/src/index.ts +22 -0
  100. package/src/integration/llm-lse-integration.test.ts +457 -0
  101. package/src/ir/explicit-parser.test.ts +306 -0
  102. package/src/ir/explicit-parser.ts +419 -0
  103. package/src/ir/explicit-renderer.test.ts +144 -0
  104. package/src/ir/explicit-renderer.ts +146 -0
  105. package/src/ir/from-interchange.test.ts +853 -0
  106. package/src/ir/from-interchange.ts +594 -0
  107. package/src/ir/index.ts +66 -0
  108. package/src/ir/json-schema.test.ts +281 -0
  109. package/src/ir/json-schema.ts +299 -0
  110. package/src/ir/protocol-json.test.ts +1185 -0
  111. package/src/ir/protocol-json.ts +745 -0
  112. package/src/ir/references.test.ts +38 -0
  113. package/src/ir/references.ts +33 -0
  114. package/src/ir/round-trip.test.ts +557 -0
  115. package/src/ir/types.ts +181 -0
  116. package/src/prompts/index.ts +15 -0
  117. package/src/prompts/prompt-generator.test.ts +386 -0
  118. package/src/prompts/prompt-generator.ts +531 -0
  119. package/src/prompts/types.ts +89 -0
  120. package/src/schema/command-schema.ts +19 -0
  121. package/src/training/index.ts +13 -0
  122. package/src/training/jsonl-writer.test.ts +138 -0
  123. package/src/training/jsonl-writer.ts +67 -0
  124. package/src/training/schema-synthesizer.test.ts +250 -0
  125. package/src/training/schema-synthesizer.ts +306 -0
  126. package/src/training/types.ts +103 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/ir/references.ts","../../src/core/types.ts","../../src/ir/explicit-parser.ts","../../src/ir/explicit-renderer.ts","../../src/ir/json-schema.ts","../../src/ir/protocol-json.ts","../../src/ir/from-interchange.ts"],"sourcesContent":["/**\n * Reference Validation\n *\n * Configurable validation for reference values (me, you, it, result, etc.).\n * Domain DSLs can provide custom reference sets.\n */\n\n/**\n * Default set of valid references.\n * Covers the common hyperscript references; domain DSLs can extend or replace.\n */\nexport const DEFAULT_REFERENCES: ReadonlySet<string> = new Set([\n 'me',\n 'you',\n 'it',\n 'result',\n 'event',\n 'target',\n 'body',\n]);\n\n/**\n * Check if a value is a valid reference name.\n *\n * @param value - The string to check\n * @param referenceSet - Custom reference set (defaults to DEFAULT_REFERENCES)\n */\nexport function isValidReference(\n value: string,\n referenceSet: ReadonlySet<string> = DEFAULT_REFERENCES\n): boolean {\n return referenceSet.has(value);\n}\n","/**\n * Generic Semantic Types for Multilingual DSLs\n *\n * This module defines the canonical semantic representation that all languages\n * parse to and render from. The semantic layer is language-neutral - it captures\n * the MEANING of DSL commands independent of surface syntax.\n *\n * These types are domain-agnostic - they work for any DSL (SQL, animations, etc.)\n */\n\n// =============================================================================\n// Action Types (Generic)\n// =============================================================================\n\n/**\n * Action type represents the command/operation in a DSL.\n * This is generic - each DSL defines its own set of actions.\n *\n * Examples:\n * - Hyperscript: 'toggle', 'add', 'remove', 'fetch'\n * - SQL: 'select', 'insert', 'update', 'delete'\n * - Animation: 'animate', 'fade', 'slide', 'rotate'\n */\nexport type ActionType = string;\n\n/**\n * Semantic role represents the grammatical function of a part of a command.\n * This is generic - each DSL can define its own roles, though common ones include:\n *\n * Common roles across DSLs:\n * - action: The verb/command\n * - patient: What is being acted upon\n * - destination: Where something goes\n * - source: Where something comes from\n * - condition: Boolean expressions\n * - quantity: Numeric amounts\n * - duration: Time spans\n *\n * Examples:\n * - Hyperscript: 'patient', 'destination', 'source', 'event', 'style'\n * - SQL: 'columns', 'table', 'condition', 'orderBy', 'limit'\n * - Animation: 'target', 'duration', 'easing', 'delay'\n */\nexport type SemanticRole = string;\n\n// =============================================================================\n// Semantic Values\n// =============================================================================\n\n/**\n * A semantic value represents a typed piece of data in a semantic node.\n * Values are language-neutral - they capture what something IS, not how it's written.\n */\nexport type SemanticValue =\n | LiteralValue\n | SelectorValue\n | ReferenceValue\n | PropertyPathValue\n | ExpressionValue\n | FlagValue;\n\n/**\n * Expected value types for role tokens.\n * Shared between RoleSpec (command-schemas) and RolePatternToken.\n */\nexport type ExpectedType = SemanticValue['type'];\n\nexport interface LiteralValue {\n readonly type: 'literal';\n readonly value: string | number | boolean;\n readonly dataType?: 'string' | 'number' | 'boolean' | 'duration';\n}\n\nexport interface SelectorValue {\n readonly type: 'selector';\n readonly value: string; // The selector: #id, .class, [attr], table-name, etc.\n readonly selectorKind?: 'id' | 'class' | 'attribute' | 'element' | 'complex' | 'identifier';\n}\n\nexport interface ReferenceValue {\n readonly type: 'reference';\n readonly value: string; // Generic reference name (DSL-specific)\n}\n\nexport interface PropertyPathValue {\n readonly type: 'property-path';\n readonly object: SemanticValue;\n readonly property: string;\n}\n\nexport interface ExpressionValue {\n readonly type: 'expression';\n /** Raw expression string for complex expressions that need further parsing */\n readonly raw: string;\n}\n\n/**\n * A boolean flag value — present (+flag) or negated (~flag).\n * Used in declarative domains for no-value attributes like primary-key, not-null.\n */\nexport interface FlagValue {\n readonly type: 'flag';\n readonly name: string;\n readonly enabled: boolean;\n}\n\n// =============================================================================\n// Annotations & Diagnostics (v1.2)\n// =============================================================================\n\n/** A metadata annotation on a node (v1.2). */\nexport interface Annotation {\n readonly name: string;\n readonly value?: string;\n}\n\n/**\n * A type constraint diagnostic attached to a node (v1.2).\n *\n * Named `ProtocolDiagnostic` to avoid collision with the framework's own\n * `Diagnostic` type (which has `severity: 'error' | 'warning' | 'info'`\n * and `suggestion?: string`).\n */\nexport interface ProtocolDiagnostic {\n readonly level: 'error' | 'warning';\n readonly role: string;\n readonly message: string;\n readonly code: string;\n}\n\n/** Async coordination variant (v1.2). */\nexport type AsyncVariant = 'all' | 'race';\n\n/** A single arm in a match command (v1.2). */\nexport interface MatchArm {\n readonly pattern: SemanticValue;\n readonly body: SemanticNode[];\n}\n\n// =============================================================================\n// Semantic Nodes\n// =============================================================================\n\n/**\n * Base interface for all semantic nodes.\n * Semantic nodes capture the MEANING of DSL constructs.\n */\nexport interface SemanticNode {\n readonly kind: 'command' | 'event-handler' | 'conditional' | 'compound' | 'loop';\n readonly action: ActionType;\n readonly roles: ReadonlyMap<SemanticRole, SemanticValue>;\n readonly metadata?: SemanticMetadata;\n /** Metadata annotations (v1.2). */\n readonly annotations?: readonly Annotation[];\n /** Type constraint diagnostics (v1.2). */\n readonly diagnostics?: readonly ProtocolDiagnostic[];\n}\n\n/**\n * Metadata about the source of a semantic node.\n * Useful for debugging, error messages, and round-trip conversion.\n */\nexport interface SemanticMetadata {\n readonly sourceLanguage?: string;\n readonly sourceText?: string;\n readonly sourcePosition?: SourcePosition;\n readonly patternId?: string;\n /**\n * Confidence score for the parse (0-1).\n * Higher values indicate more certain matches.\n * - 1.0: Exact match with all roles captured\n * - 0.8-0.99: High confidence with minor uncertainty\n * - 0.6-0.8: Medium confidence (normalization, defaults applied)\n * - <0.6: Low confidence (may need fallback)\n */\n readonly confidence?: number;\n}\n\nexport interface SourcePosition {\n readonly start: number;\n readonly end: number;\n readonly line?: number;\n readonly column?: number;\n}\n\n/**\n * A command semantic node - represents a single DSL command.\n *\n * v1.2 adds optional fields for try/catch/finally, async coordination (all/race),\n * and pattern matching (match/arms). These are encoded as fields on command nodes\n * (matching the protocol wire format) rather than new node kinds.\n */\nexport interface CommandSemanticNode extends SemanticNode {\n readonly kind: 'command';\n /** try body — commands to execute in the try block (v1.2). */\n readonly body?: readonly SemanticNode[];\n /** catch branch — commands to execute on error (v1.2). */\n readonly catchBranch?: readonly SemanticNode[];\n /** finally branch — cleanup commands that always execute (v1.2). */\n readonly finallyBranch?: readonly SemanticNode[];\n /** Async coordination variant: all (wait for all) or race (first wins) (v1.2). */\n readonly asyncVariant?: AsyncVariant;\n /** Async body — concurrent commands for all/race (v1.2). */\n readonly asyncBody?: readonly SemanticNode[];\n /** Match arms — pattern/body pairs for match command (v1.2). */\n readonly arms?: readonly MatchArm[];\n /** Default arm — executed when no match arm matches (v1.2). */\n readonly defaultArm?: readonly SemanticNode[];\n}\n\n/**\n * An event handler semantic node - represents trigger-based commands.\n * E.g., \"on click [commands]\" in hyperscript, or \"when condition [commands]\" in other DSLs.\n */\nexport interface EventHandlerSemanticNode extends SemanticNode {\n readonly kind: 'event-handler';\n readonly body: SemanticNode[];\n readonly eventModifiers?: EventModifiers;\n readonly additionalEvents?: readonly SemanticValue[];\n readonly parameterNames?: readonly string[];\n}\n\nexport interface EventModifiers {\n readonly once?: boolean;\n readonly debounce?: number;\n readonly throttle?: number;\n readonly queue?: 'first' | 'last' | 'all' | 'none';\n readonly from?: SemanticValue;\n}\n\n/**\n * A conditional semantic node - represents \"if [condition] then [body] else [body]\".\n */\nexport interface ConditionalSemanticNode extends SemanticNode {\n readonly kind: 'conditional';\n readonly thenBranch: SemanticNode[];\n readonly elseBranch?: SemanticNode[];\n}\n\n/**\n * A compound semantic node - represents multiple chained statements.\n */\nexport interface CompoundSemanticNode extends SemanticNode {\n readonly kind: 'compound';\n readonly statements: SemanticNode[];\n readonly chainType: 'then' | 'and' | 'async' | 'sequential' | 'pipe';\n}\n\n/**\n * Loop variant discriminant for different loop types.\n */\nexport type LoopVariant = 'forever' | 'times' | 'for' | 'while' | 'until';\n\n/**\n * A loop semantic node - represents repeat/for/while loops.\n */\nexport interface LoopSemanticNode extends SemanticNode {\n readonly kind: 'loop';\n readonly loopVariant: LoopVariant;\n readonly body: SemanticNode[];\n readonly loopVariable?: string;\n readonly indexVariable?: string;\n}\n\n// =============================================================================\n// Tokenization Types\n// =============================================================================\n\n/**\n * Token kind - categorizes what type of token this is.\n */\nexport type TokenKind =\n | 'keyword' // Command or modifier keyword\n | 'selector' // CSS selector or identifier (#id, .class, table-name)\n | 'literal' // String or number literal\n | 'particle' // Grammatical particle (を, に, من)\n | 'conjunction' // Grammatical conjunction\n | 'event-modifier' // Event modifier (.once, .debounce(300))\n | 'identifier' // Generic identifier\n | 'operator' // Operators (., +, -, etc.)\n | 'punctuation' // Punctuation (parentheses, etc.)\n | 'url'; // URL or path\n\n/**\n * A language token - the result of tokenization.\n */\nexport interface LanguageToken {\n readonly value: string;\n readonly kind: TokenKind;\n readonly position: SourcePosition;\n /** Normalized form from explicit keyword map */\n readonly normalized?: string;\n /** Morphologically normalized stem */\n readonly stem?: string;\n /** Confidence in the morphological stem (0.0-1.0) */\n readonly stemConfidence?: number;\n /** Additional metadata for specific token types */\n readonly metadata?: Record<string, unknown>;\n}\n\n/**\n * Token stream - provides sequential access to tokens with backtracking.\n */\nexport interface TokenStream {\n readonly tokens: readonly LanguageToken[];\n readonly language: string;\n\n /** Look at token at current position + offset without consuming */\n peek(offset?: number): LanguageToken | null;\n\n /** Consume and return current token, advance position */\n advance(): LanguageToken;\n\n /** Check if we've consumed all tokens */\n isAtEnd(): boolean;\n\n /** Save current position for backtracking */\n mark(): StreamMark;\n\n /** Restore to a saved position */\n reset(mark: StreamMark): void;\n\n /** Get current position */\n position(): number;\n}\n\n/**\n * Stream mark for backtracking during parsing.\n */\nexport interface StreamMark {\n readonly position: number;\n}\n\n/**\n * Language tokenizer interface - converts text to tokens.\n */\nexport interface LanguageTokenizer {\n readonly language: string;\n readonly direction: 'ltr' | 'rtl';\n\n /** Convert input string to token stream */\n tokenize(input: string): TokenStream;\n\n /** Classify a single token */\n classifyToken(token: string): TokenKind;\n}\n\n// =============================================================================\n// Pattern Matching Types\n// =============================================================================\n\n/**\n * A language pattern defines how a semantic structure appears in a specific language.\n */\nexport interface LanguagePattern {\n /** Unique identifier for this pattern */\n readonly id: string;\n /** ISO 639-1 language code */\n readonly language: string;\n /** Which command this pattern matches */\n readonly command: ActionType;\n /** Priority for disambiguation (higher = checked first) */\n readonly priority: number;\n /** The pattern template with role placeholders */\n readonly template: PatternTemplate;\n /** Rules for extracting semantic roles from matched tokens */\n readonly extraction: ExtractionRules;\n /** Optional constraints on when this pattern applies */\n readonly constraints?: PatternConstraints;\n}\n\n/**\n * Pattern template - defines expected token sequence.\n */\nexport interface PatternTemplate {\n /** Human-readable template string */\n readonly format: string;\n /** Parsed token sequence for matching */\n readonly tokens: PatternToken[];\n}\n\n/**\n * Pattern token - literal, role placeholder, or group.\n */\nexport type PatternToken = LiteralPatternToken | RolePatternToken | GroupPatternToken;\n\nexport interface LiteralPatternToken {\n readonly type: 'literal';\n readonly value: string;\n /** Alternative spellings/forms that also match */\n readonly alternatives?: string[];\n}\n\nexport interface RolePatternToken {\n readonly type: 'role';\n readonly role: SemanticRole;\n readonly optional?: boolean;\n /** Expected value types (for validation) */\n readonly expectedTypes?: Array<ExpectedType>;\n /** When true, captures all remaining tokens until next marker or end */\n readonly greedy?: boolean;\n}\n\nexport interface GroupPatternToken {\n readonly type: 'group';\n readonly tokens: PatternToken[];\n readonly optional?: boolean;\n}\n\n/**\n * Rules for extracting semantic values from matched tokens.\n */\nexport interface ExtractionRules {\n readonly [role: string]: ExtractionRule;\n}\n\nexport interface ExtractionRule {\n /** Position-based extraction (0-indexed from pattern start) */\n readonly position?: number;\n /** Marker-based extraction (find value after this marker) */\n readonly marker?: string;\n /** Alternative markers that also work */\n readonly markerAlternatives?: string[];\n /** Transform the extracted value */\n readonly transform?: (raw: string) => SemanticValue;\n /** Default value if not found (for optional roles) */\n readonly default?: SemanticValue;\n /** Static value extraction */\n readonly value?: string;\n /** Extract value from a pattern role by name */\n readonly fromRole?: string;\n}\n\n/**\n * Additional constraints on pattern applicability.\n */\nexport interface PatternConstraints {\n /** Required roles that must be present */\n readonly requiredRoles?: SemanticRole[];\n /** Roles that must NOT be present */\n readonly forbiddenRoles?: SemanticRole[];\n /** Valid selector types for the patient role */\n readonly validPatientTypes?: Array<SelectorValue['selectorKind']>;\n /** Pattern IDs this conflicts with */\n readonly conflictsWith?: string[];\n}\n\n/**\n * Result of matching a pattern against tokens.\n */\nexport interface PatternMatchResult {\n readonly pattern: LanguagePattern;\n readonly captured: ReadonlyMap<SemanticRole, SemanticValue>;\n readonly consumedTokens: number;\n readonly confidence: number; // 0-1, how well the pattern matched\n}\n\n/**\n * Error when pattern matching fails.\n */\nexport interface PatternMatchError {\n readonly message: string;\n readonly position: SourcePosition;\n readonly expectedPatterns?: string[];\n readonly partialMatch?: Partial<PatternMatchResult>;\n}\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Create a literal value\n */\nexport function createLiteral(\n value: string | number | boolean,\n dataType?: 'string' | 'number' | 'boolean' | 'duration'\n): LiteralValue {\n return dataType ? { type: 'literal', value, dataType } : { type: 'literal', value };\n}\n\n/**\n * Create a selector value\n */\nexport function createSelector(\n value: string,\n selectorKind?: SelectorValue['selectorKind']\n): SelectorValue {\n return selectorKind ? { type: 'selector', value, selectorKind } : { type: 'selector', value };\n}\n\n/**\n * Create a reference value\n */\nexport function createReference(value: string): ReferenceValue {\n return { type: 'reference', value };\n}\n\n/**\n * Create a property path value\n */\nexport function createPropertyPath(object: SemanticValue, property: string): PropertyPathValue {\n return { type: 'property-path', object, property };\n}\n\n/**\n * Create an expression value\n */\nexport function createExpression(raw: string): ExpressionValue {\n return { type: 'expression', raw };\n}\n\n/**\n * Create a boolean flag value (+flag or ~flag)\n */\nexport function createFlag(name: string, enabled: boolean = true): FlagValue {\n return { type: 'flag', name, enabled };\n}\n\n/**\n * Create a command semantic node\n */\nexport function createCommandNode(\n action: ActionType,\n roles: Record<SemanticRole, SemanticValue> | Map<SemanticRole, SemanticValue>,\n metadata?: SemanticMetadata\n): CommandSemanticNode {\n const rolesMap = roles instanceof Map ? roles : new Map(Object.entries(roles));\n const node: CommandSemanticNode = {\n kind: 'command',\n action,\n roles: rolesMap,\n };\n if (metadata) {\n return { ...node, metadata };\n }\n return node;\n}\n\n/**\n * Create an event handler semantic node\n */\nexport function createEventHandlerNode(\n action: ActionType,\n roles: Record<SemanticRole, SemanticValue> | Map<SemanticRole, SemanticValue>,\n body: SemanticNode[],\n metadata?: SemanticMetadata,\n eventModifiers?: EventModifiers\n): EventHandlerSemanticNode {\n const rolesMap = roles instanceof Map ? roles : new Map(Object.entries(roles));\n const base = {\n kind: 'event-handler' as const,\n action,\n roles: rolesMap,\n body,\n };\n return {\n ...base,\n ...(eventModifiers && { eventModifiers }),\n ...(metadata && { metadata }),\n };\n}\n\n/**\n * Create a conditional semantic node\n */\nexport function createConditionalNode(\n action: ActionType,\n roles: Record<SemanticRole, SemanticValue> | Map<SemanticRole, SemanticValue>,\n thenBranch: SemanticNode[],\n elseBranch?: SemanticNode[],\n metadata?: SemanticMetadata\n): ConditionalSemanticNode {\n const rolesMap = roles instanceof Map ? roles : new Map(Object.entries(roles));\n const base = {\n kind: 'conditional' as const,\n action,\n roles: rolesMap,\n thenBranch,\n };\n return {\n ...base,\n ...(elseBranch && { elseBranch }),\n ...(metadata && { metadata }),\n };\n}\n\n/**\n * Create a compound semantic node\n */\nexport function createCompoundNode(\n statements: SemanticNode[],\n chainType: CompoundSemanticNode['chainType'] = 'sequential',\n metadata?: SemanticMetadata\n): CompoundSemanticNode {\n const base = {\n kind: 'compound' as const,\n action: 'compound' as const,\n roles: new Map(),\n statements,\n chainType,\n };\n return metadata ? { ...base, metadata } : base;\n}\n\n/**\n * Extract a string value from a SemanticValue.\n *\n * Handles all value types in the SemanticValue union:\n * - ExpressionValue: returns `raw`\n * - LiteralValue/SelectorValue/ReferenceValue: returns `value` as string\n * - PropertyPathValue: returns `object.property` path\n *\n * This is the standard way to get a display string from any semantic value,\n * eliminating the need for `as any` casts in domain code generators.\n */\nexport function extractValue(value: SemanticValue): string {\n if (value.type === 'flag') return value.name;\n if ('raw' in value && value.raw !== undefined) return String(value.raw);\n if ('value' in value && value.value !== undefined) return String(value.value);\n if (value.type === 'property-path') return `${extractValue(value.object)}.${value.property}`;\n return '';\n}\n\n/**\n * Extract a string value from a named role on a SemanticNode.\n *\n * Convenience wrapper: looks up the role, returns empty string if missing.\n * Eliminates the common `const x = node.roles.get('role'); const val = x ? extractValue(x as any) : '';` pattern.\n */\nexport function extractRoleValue(node: SemanticNode, role: string): string {\n const value = node.roles.get(role);\n if (!value) return '';\n return extractValue(value);\n}\n\n/**\n * Create a loop semantic node\n */\nexport function createLoopNode(\n action: ActionType,\n roles: Record<SemanticRole, SemanticValue> | Map<SemanticRole, SemanticValue>,\n loopVariant: LoopVariant,\n body: SemanticNode[],\n loopVariable?: string,\n indexVariable?: string,\n metadata?: SemanticMetadata\n): LoopSemanticNode {\n const rolesMap = roles instanceof Map ? roles : new Map(Object.entries(roles));\n const base = {\n kind: 'loop' as const,\n action,\n roles: rolesMap,\n loopVariant,\n body,\n };\n return {\n ...base,\n ...(loopVariable && { loopVariable }),\n ...(indexVariable && { indexVariable }),\n ...(metadata && { metadata }),\n };\n}\n\n// =============================================================================\n// v1.2 Factory Helpers\n// =============================================================================\n\n/**\n * Create a try/catch/finally command node (v1.2).\n */\nexport function createTryNode(\n body: SemanticNode[],\n catchBranch?: SemanticNode[],\n finallyBranch?: SemanticNode[],\n metadata?: SemanticMetadata\n): CommandSemanticNode {\n return {\n kind: 'command',\n action: 'try',\n roles: new Map(),\n body,\n ...(catchBranch && catchBranch.length > 0 ? { catchBranch } : {}),\n ...(finallyBranch && finallyBranch.length > 0 ? { finallyBranch } : {}),\n ...(metadata ? { metadata } : {}),\n };\n}\n\n/**\n * Create an async coordination (all/race) command node (v1.2).\n */\nexport function createAsyncNode(\n variant: AsyncVariant,\n asyncBody: SemanticNode[],\n metadata?: SemanticMetadata\n): CommandSemanticNode {\n return {\n kind: 'command',\n action: variant,\n roles: new Map(),\n asyncVariant: variant,\n asyncBody,\n ...(metadata ? { metadata } : {}),\n };\n}\n\n/**\n * Create a match command node with pattern arms (v1.2).\n */\nexport function createMatchNode(\n roles: Record<SemanticRole, SemanticValue> | Map<SemanticRole, SemanticValue>,\n arms: MatchArm[],\n defaultArm?: SemanticNode[],\n metadata?: SemanticMetadata\n): CommandSemanticNode {\n const rolesMap = roles instanceof Map ? roles : new Map(Object.entries(roles));\n return {\n kind: 'command',\n action: 'match',\n roles: rolesMap,\n arms,\n ...(defaultArm && defaultArm.length > 0 ? { defaultArm } : {}),\n ...(metadata ? { metadata } : {}),\n };\n}\n\n/** Wire format envelope with version metadata (v1.2). */\nexport interface LSEEnvelope {\n readonly lseVersion: string;\n readonly features?: readonly string[];\n readonly nodes: readonly SemanticNode[];\n}\n","/**\n * Explicit Syntax Parser\n *\n * Parses the universal [command role:value ...] bracket syntax.\n * Domain-agnostic — schema validation is injectable via ParseExplicitOptions.\n *\n * Syntax:\n * [command role1:value1 role2:value2 ...]\n *\n * Examples:\n * [toggle patient:.active destination:#button]\n * [put patient:\"hello\" destination:#output]\n * [on event:click body:[toggle patient:.active]]\n * [select patient:name source:users condition:age>25]\n */\n\nimport type {\n SemanticNode,\n SemanticValue,\n SemanticRole,\n ActionType,\n LoopVariant,\n} from '../core/types';\nimport {\n createCommandNode,\n createEventHandlerNode,\n createConditionalNode,\n createLoopNode,\n createSelector,\n createLiteral,\n createReference,\n createFlag,\n} from '../core/types';\nimport type { ParseExplicitOptions } from './types';\nimport { isValidReference, DEFAULT_REFERENCES } from './references';\n\n/** Structural role names whose bracket-enclosed values may be nested commands. */\nexport const STRUCTURAL_ROLES = new Set([\n 'body',\n 'then',\n 'else',\n 'condition',\n 'loop-body',\n 'variable',\n 'catch', // v1.2: try/catch/finally\n 'finally', // v1.2: try/catch/finally\n]);\n\n/**\n * Checks whether a bracket-enclosed value is a nested command (vs. an attribute selector).\n * A value starting with `[` is a nested command if the inner content (after stripping\n * outer `[]`) contains at least one ASCII space or `:` at bracket-depth 0.\n */\nfunction isNestedCommand(value: string): boolean {\n const inner = value.slice(1, -1);\n let depth = 0;\n for (const ch of inner) {\n if (ch === '[') depth++;\n else if (ch === ']') depth--;\n else if (depth === 0 && (ch === ' ' || ch === ':')) return true;\n }\n return false;\n}\n\n// =============================================================================\n// Explicit Syntax Parser\n// =============================================================================\n\n/**\n * Parse explicit bracket syntax into a semantic node.\n *\n * When `options.schemaLookup` is provided, validates roles against the\n * command's schema. When omitted, accepts any role names.\n */\nexport function parseExplicit(input: string, options: ParseExplicitOptions = {}): SemanticNode {\n const trimmed = input.trim();\n\n if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) {\n throw new Error('Explicit syntax must be wrapped in brackets: [command role:value ...]');\n }\n\n const content = trimmed.slice(1, -1).trim();\n if (!content) {\n throw new Error('Empty explicit statement');\n }\n\n const tokens = tokenizeExplicit(content);\n if (tokens.length === 0) {\n throw new Error('No command specified in explicit statement');\n }\n\n const command = tokens[0].toLowerCase() as ActionType;\n const roles = new Map<SemanticRole, SemanticValue>();\n const refSet = options.referenceSet ?? DEFAULT_REFERENCES;\n\n // Look up schema for role validation (undefined = skip validation)\n const schema = options.schemaLookup?.getSchema(command);\n const validRoleNames = schema ? new Set(schema.roles.map(r => r.role)) : null;\n\n // Parse role:value pairs and flags\n for (let i = 1; i < tokens.length; i++) {\n const token = tokens[i];\n\n // Boolean flag: +flag-name or ~flag-name\n if (token.startsWith('+') || token.startsWith('~')) {\n const enabled = token.startsWith('+');\n const flagName = token.slice(1);\n if (!flagName) {\n throw new Error(`Empty flag name: \"${token}\"`);\n }\n if (validRoleNames && !validRoleNames.has(flagName as SemanticRole)) {\n const roleList = [...validRoleNames].join(', ');\n throw new Error(\n `Unknown flag \"${flagName}\" for command \"${command}\". Valid roles: ${roleList}`\n );\n }\n roles.set(flagName as SemanticRole, createFlag(flagName, enabled));\n continue;\n }\n\n const colonIndex = token.indexOf(':');\n\n if (colonIndex === -1) {\n throw new Error(`Invalid role format: \"${token}\". Expected role:value or +flag`);\n }\n\n const roleName = token.slice(0, colonIndex);\n\n // Validate role name against schema (skip for structural roles)\n if (\n validRoleNames &&\n !STRUCTURAL_ROLES.has(roleName) &&\n !validRoleNames.has(roleName as SemanticRole)\n ) {\n const roleList = [...validRoleNames].join(', ');\n throw new Error(\n `Unknown role \"${roleName}\" for command \"${command}\". Valid roles: ${roleList}`\n );\n }\n\n const role = roleName as SemanticRole;\n const valueStr = token.slice(colonIndex + 1);\n\n // Handle nested explicit syntax for structural roles (body, then, else, condition, loop-body, variable)\n if (STRUCTURAL_ROLES.has(roleName) && valueStr.startsWith('[') && isNestedCommand(valueStr)) {\n const nestedEnd = findMatchingBracket(token, colonIndex + 1);\n const nestedSyntax = token.slice(colonIndex + 1, nestedEnd + 1);\n roles.set(role, { type: 'expression', raw: nestedSyntax });\n continue;\n }\n\n const value = parseExplicitValue(valueStr, refSet);\n roles.set(role, value);\n }\n\n // Validate required roles are present (skip for event handlers — handled below)\n if (schema && command !== 'on') {\n for (const roleSpec of schema.roles) {\n if (roleSpec.required && !roles.has(roleSpec.role as SemanticRole) && !roleSpec.default) {\n throw new Error(\n `Missing required role \"${roleSpec.role}\" for command \"${command}\": ${roleSpec.description}`\n );\n }\n }\n }\n\n // Build appropriate node type based on action name\n switch (command) {\n case 'on': {\n const eventValue = roles.get('event');\n if (!eventValue) {\n throw new Error('Event handler requires event role: [on event:click ...]');\n }\n\n // Parse body if present\n const body = extractStructuralBody(roles, 'body', options);\n roles.delete('body' as SemanticRole);\n\n return createEventHandlerNode('on', roles, body, {\n sourceLanguage: 'explicit',\n });\n }\n\n case 'if': {\n // Extract structural roles for conditional\n const thenBranch = extractStructuralBody(roles, 'then', options);\n const elseBranch = extractStructuralBody(roles, 'else', options);\n roles.delete('then' as SemanticRole);\n roles.delete('else' as SemanticRole);\n\n return createConditionalNode(\n command,\n roles,\n thenBranch,\n elseBranch.length > 0 ? elseBranch : undefined,\n {\n sourceLanguage: 'explicit',\n }\n );\n }\n\n case 'repeat': {\n // Extract loop structural roles\n const loopBody = extractStructuralBody(roles, 'loop-body', options);\n const loopVariantValue = roles.get('loop-variant' as SemanticRole);\n const variableValue = roles.get('variable' as SemanticRole);\n const indexVariableValue = roles.get('index-variable' as SemanticRole);\n\n roles.delete('loop-body' as SemanticRole);\n roles.delete('loop-variant' as SemanticRole);\n roles.delete('variable' as SemanticRole);\n roles.delete('index-variable' as SemanticRole);\n\n // Determine loop variant: explicit > inferred from roles\n let variant: LoopVariant;\n if (\n loopVariantValue &&\n loopVariantValue.type === 'literal' &&\n typeof loopVariantValue.value === 'string'\n ) {\n variant = loopVariantValue.value as LoopVariant;\n } else if (roles.has('quantity' as SemanticRole)) {\n variant = 'times';\n } else if (roles.has('source' as SemanticRole)) {\n variant = 'for';\n } else if (roles.has('condition' as SemanticRole)) {\n variant = 'while';\n } else {\n variant = 'forever';\n }\n\n const loopVariable =\n variableValue?.type === 'literal' && typeof variableValue.value === 'string'\n ? variableValue.value\n : variableValue?.type === 'expression'\n ? variableValue.raw\n : undefined;\n const indexVariable =\n indexVariableValue?.type === 'literal' && typeof indexVariableValue.value === 'string'\n ? indexVariableValue.value\n : undefined;\n\n return createLoopNode(command, roles, variant, loopBody, loopVariable, indexVariable, {\n sourceLanguage: 'explicit',\n });\n }\n\n default:\n return createCommandNode(command, roles, {\n sourceLanguage: 'explicit',\n });\n }\n}\n\n/**\n * Check if input is explicit bracket syntax.\n */\nexport function isExplicitSyntax(input: string): boolean {\n const trimmed = input.trim();\n return trimmed.startsWith('[') && trimmed.endsWith(']');\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\n/**\n * Extract and parse a structural role (body, then, else, loop-body) into SemanticNode[].\n * Returns an empty array if the role is not present.\n */\nfunction extractStructuralBody(\n roles: Map<SemanticRole, SemanticValue>,\n roleName: string,\n options: ParseExplicitOptions\n): SemanticNode[] {\n const value = roles.get(roleName as SemanticRole);\n if (!value) return [];\n if (value.type === 'expression') {\n return [parseExplicit(value.raw, options)];\n }\n return [];\n}\n\n/**\n * Infer selectorKind from a CSS selector string.\n */\nfunction inferSelectorKind(\n value: string\n): 'id' | 'class' | 'attribute' | 'element' | 'complex' | undefined {\n if (!value) return undefined;\n if (value.startsWith('#')) return 'id';\n if (value.startsWith('.')) return 'class';\n if (value.startsWith('[')) return 'attribute';\n if (value.startsWith('<') || value.startsWith('*')) return 'element';\n if (/[>+~ ]/.test(value) && value.length > 1) return 'complex';\n return undefined;\n}\n\n/**\n * Tokenize explicit syntax content (space-separated, respecting quotes and brackets).\n */\nfunction tokenizeExplicit(content: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let inString = false;\n let stringChar = '';\n let bracketDepth = 0;\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n\n if (inString) {\n current += char;\n if (char === stringChar && content[i - 1] !== '\\\\') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n inString = true;\n stringChar = char;\n current += char;\n continue;\n }\n\n if (char === '[') {\n bracketDepth++;\n current += char;\n continue;\n }\n\n if (char === ']') {\n bracketDepth--;\n current += char;\n continue;\n }\n\n if (char === ' ' && bracketDepth === 0) {\n if (current) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n\n current += char;\n }\n\n if (current) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\n/**\n * Parse a value string into a SemanticValue.\n */\nfunction parseExplicitValue(valueStr: string, referenceSet: ReadonlySet<string>): SemanticValue {\n // CSS selector\n if (\n valueStr.startsWith('#') ||\n valueStr.startsWith('.') ||\n valueStr.startsWith('[') ||\n valueStr.startsWith('@') ||\n valueStr.startsWith('*')\n ) {\n return createSelector(valueStr, inferSelectorKind(valueStr));\n }\n\n // String literal\n if (valueStr.startsWith('\"') || valueStr.startsWith(\"'\")) {\n const inner = valueStr.slice(1, -1);\n return createLiteral(inner, 'string');\n }\n\n // Boolean\n if (valueStr === 'true') return createLiteral(true, 'boolean');\n if (valueStr === 'false') return createLiteral(false, 'boolean');\n\n // Reference\n const lowerRef = valueStr.toLowerCase();\n if (isValidReference(lowerRef, referenceSet)) {\n return createReference(lowerRef);\n }\n\n // Number (possibly with duration suffix)\n const numMatch = valueStr.match(/^(-?\\d+(?:\\.\\d+)?)(ms|s|m|h)?$/);\n if (numMatch) {\n const num = parseFloat(numMatch[1]);\n const suffix = numMatch[2];\n if (suffix) {\n return createLiteral(valueStr, 'duration');\n }\n return createLiteral(num, 'number');\n }\n\n // Default to untyped string literal (no dataType — avoids spurious quoting on round-trip).\n // Only explicitly-quoted values (handled above) get dataType: 'string'.\n return createLiteral(valueStr);\n}\n\n/**\n * Find the matching closing bracket.\n */\nfunction findMatchingBracket(str: string, start: number): number {\n let depth = 0;\n\n for (let i = start; i < str.length; i++) {\n if (str[i] === '[') depth++;\n else if (str[i] === ']') {\n depth--;\n if (depth === 0) return i;\n }\n }\n\n return str.length - 1;\n}\n","/**\n * Explicit Syntax Renderer\n *\n * Serializes SemanticNode to the universal [command role:value ...] bracket syntax.\n * Zero dependencies beyond core types — no language-specific logic.\n */\n\nimport type {\n SemanticNode,\n SemanticValue,\n CommandSemanticNode,\n CompoundSemanticNode,\n EventHandlerSemanticNode,\n ConditionalSemanticNode,\n LoopSemanticNode,\n} from '../core/types';\n\n/**\n * Render a semantic node as explicit bracket syntax.\n *\n * @example\n * ```typescript\n * renderExplicit(node) // \"[toggle patient:.active destination:#button]\"\n * ```\n */\nexport function renderExplicit(node: SemanticNode): string {\n // Handle compound nodes\n if (node.kind === 'compound') {\n const compoundNode = node as CompoundSemanticNode;\n const renderedStatements = compoundNode.statements.map(stmt => renderExplicit(stmt));\n return renderedStatements.join(` ${compoundNode.chainType} `);\n }\n\n const parts: string[] = [node.action];\n\n // Add roles\n for (const [role, value] of node.roles) {\n if (value.type === 'flag') {\n parts.push(value.enabled ? `+${value.name}` : `~${value.name}`);\n } else {\n parts.push(`${role}:${valueToString(value)}`);\n }\n }\n\n // Handle event handler body\n if (node.kind === 'event-handler') {\n const eventNode = node as EventHandlerSemanticNode;\n if (eventNode.body && eventNode.body.length > 0) {\n const bodyParts = eventNode.body.map(n => renderExplicit(n));\n parts.push(`body:${bodyParts.join(' ')}`);\n }\n }\n\n // Handle conditional branches (v1.1)\n if (node.kind === 'conditional') {\n const condNode = node as ConditionalSemanticNode;\n if (condNode.thenBranch && condNode.thenBranch.length > 0) {\n const thenParts = condNode.thenBranch.map(n => renderExplicit(n));\n parts.push(`then:${thenParts.join(' ')}`);\n }\n if (condNode.elseBranch && condNode.elseBranch.length > 0) {\n const elseParts = condNode.elseBranch.map(n => renderExplicit(n));\n parts.push(`else:${elseParts.join(' ')}`);\n }\n }\n\n // Handle loop body and metadata (v1.1)\n if (node.kind === 'loop') {\n const loopNode = node as LoopSemanticNode;\n if (loopNode.loopVariant) {\n parts.push(`loop-variant:${loopNode.loopVariant}`);\n }\n if (loopNode.loopVariable) {\n parts.push(`variable:${loopNode.loopVariable}`);\n }\n if (loopNode.indexVariable) {\n parts.push(`index-variable:${loopNode.indexVariable}`);\n }\n if (loopNode.body && loopNode.body.length > 0) {\n const bodyParts = loopNode.body.map(n => renderExplicit(n));\n parts.push(`loop-body:${bodyParts.join(' ')}`);\n }\n }\n\n // Handle v1.2 command fields (try/catch/finally, async, match)\n if (node.kind === 'command') {\n const cmd = node as CommandSemanticNode;\n if (cmd.body && cmd.body.length > 0) {\n const bodyParts = cmd.body.map(n => renderExplicit(n));\n parts.push(`body:${bodyParts.join(' ')}`);\n }\n if (cmd.catchBranch && cmd.catchBranch.length > 0) {\n const catchParts = cmd.catchBranch.map(n => renderExplicit(n));\n parts.push(`catch:${catchParts.join(' ')}`);\n }\n if (cmd.finallyBranch && cmd.finallyBranch.length > 0) {\n const finallyParts = cmd.finallyBranch.map(n => renderExplicit(n));\n parts.push(`finally:${finallyParts.join(' ')}`);\n }\n if (cmd.asyncVariant) {\n parts.push(`async-variant:${cmd.asyncVariant}`);\n }\n if (cmd.asyncBody && cmd.asyncBody.length > 0) {\n const asyncParts = cmd.asyncBody.map(n => renderExplicit(n));\n parts.push(`async-body:${asyncParts.join(' ')}`);\n }\n }\n\n return `[${parts.join(' ')}]`;\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\n/**\n * Convert a semantic value to its explicit syntax string form.\n */\nfunction valueToString(value: SemanticValue): string {\n switch (value.type) {\n case 'literal':\n if (typeof value.value === 'string') {\n // Quote strings that contain spaces or are explicitly typed as strings\n if (value.dataType === 'string' || /\\s/.test(value.value)) {\n return `\"${value.value}\"`;\n }\n return value.value;\n }\n return String(value.value);\n\n case 'selector':\n return value.value;\n\n case 'reference':\n return value.value;\n\n case 'property-path':\n return `${valueToString(value.object)}'s ${value.property}`;\n\n case 'expression':\n return value.raw;\n\n case 'flag':\n return value.name;\n }\n}\n","/**\n * LLM JSON Schema Conversion (DEPRECATED)\n *\n * These functions are superseded by the unified protocol JSON functions in\n * protocol-json.ts. `fromProtocolJSON()` now accepts optional `kind` (defaults\n * to \"command\") and `trigger` sugar, making these wrappers unnecessary.\n *\n * Use instead:\n * - `validateProtocolJSON()` instead of `validateSemanticJSON()`\n * - `fromProtocolJSON()` instead of `jsonToSemanticNode()`\n * - `toProtocolJSON()` instead of `semanticNodeToJSON()`\n *\n * These functions are kept for backward compatibility and will be removed\n * in a future major version.\n */\n\nimport type {\n SemanticNode,\n SemanticValue,\n SemanticRole,\n EventHandlerSemanticNode,\n CompoundSemanticNode,\n} from '../core/types';\nimport {\n createCommandNode,\n createEventHandlerNode,\n createSelector,\n createLiteral,\n createReference,\n createExpression,\n createFlag,\n} from '../core/types';\nimport type { SemanticJSON, SemanticJSONValue, IRDiagnostic } from './types';\n\n// =============================================================================\n// Validation\n// =============================================================================\n\nconst VALID_VALUE_TYPES = new Set([\n 'selector',\n 'literal',\n 'reference',\n 'expression',\n 'property-path',\n 'flag',\n]);\n\n/**\n * Validate LLM JSON input structure.\n * Returns diagnostics (empty array = valid).\n * @deprecated Use `validateProtocolJSON()` from `protocol-json.ts` instead.\n */\nexport function validateSemanticJSON(input: SemanticJSON): IRDiagnostic[] {\n const diagnostics: IRDiagnostic[] = [];\n\n // Action is required and must be a string\n if (!input.action || typeof input.action !== 'string') {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_ACTION',\n message: 'Field \"action\" is required and must be a string.',\n suggestion: 'Provide a command name like \"toggle\", \"add\", \"set\", etc.',\n });\n return diagnostics; // Can't proceed without action\n }\n\n // Roles validation\n if (input.roles && typeof input.roles === 'object') {\n for (const [role, value] of Object.entries(input.roles)) {\n if (!value || typeof value !== 'object') {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_ROLE_VALUE',\n message: `Role \"${role}\" must be an object with \"type\" and \"value\" fields.`,\n suggestion: 'Use: { \"type\": \"selector\", \"value\": \".active\" }',\n });\n continue;\n }\n\n const v = value as SemanticJSONValue;\n if (!VALID_VALUE_TYPES.has(v.type)) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_VALUE_TYPE',\n message: `Role \"${role}\" has invalid type \"${v.type}\".`,\n suggestion: 'Valid types: selector, literal, reference, expression, property-path.',\n });\n }\n\n if (v.value === undefined || v.value === null) {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_VALUE',\n message: `Role \"${role}\" is missing the \"value\" field.`,\n });\n }\n }\n }\n\n // Trigger validation (optional)\n if (input.trigger) {\n if (!input.trigger.event || typeof input.trigger.event !== 'string') {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_TRIGGER',\n message: 'Trigger \"event\" is required and must be a string.',\n suggestion: 'Use an event name like \"click\", \"mouseover\", \"keydown\".',\n });\n }\n }\n\n return diagnostics;\n}\n\n// =============================================================================\n// JSON → SemanticNode\n// =============================================================================\n\n/**\n * Convert validated SemanticJSON to a SemanticNode.\n *\n * Returns a properly typed SemanticNode using the framework's factory functions.\n * If `trigger` is present, wraps the command in an event handler node.\n * @deprecated Use `fromProtocolJSON()` from `protocol-json.ts` instead.\n */\nexport function jsonToSemanticNode(input: SemanticJSON): SemanticNode {\n const roles = new Map<SemanticRole, SemanticValue>();\n\n if (input.roles) {\n for (const [role, value] of Object.entries(input.roles)) {\n roles.set(role as SemanticRole, convertJSONValue(value));\n }\n }\n\n // Event handler wrapping\n if (input.trigger) {\n // Set the event role\n roles.set('event' as SemanticRole, createLiteral(input.trigger.event, 'string'));\n\n // Build body as a single command node\n const bodyRoles = new Map(roles);\n bodyRoles.delete('event' as SemanticRole);\n const bodyNode = createCommandNode(input.action, bodyRoles);\n\n return createEventHandlerNode(\n 'on',\n roles,\n [bodyNode],\n { sourceLanguage: 'json' },\n (input.trigger.modifiers as Record<string, unknown> | undefined) ?? {}\n );\n }\n\n return createCommandNode(input.action, roles, {\n sourceLanguage: 'json',\n });\n}\n\n// =============================================================================\n// SemanticNode → JSON\n// =============================================================================\n\n/**\n * Convert a SemanticNode to SemanticJSON format.\n *\n * This is the inverse of jsonToSemanticNode(). For event handlers,\n * the event is extracted into the `trigger` field.\n * @deprecated Use `toProtocolJSON()` from `protocol-json.ts` instead.\n */\nexport function semanticNodeToJSON(node: SemanticNode): SemanticJSON {\n if (node.kind === 'compound') {\n // Compound nodes: use first statement's action, flatten roles\n const compound = node as CompoundSemanticNode;\n if (compound.statements.length > 0) {\n return semanticNodeToJSON(compound.statements[0]);\n }\n return { action: 'compound', roles: {} };\n }\n\n if (node.kind === 'event-handler') {\n const eventNode = node as EventHandlerSemanticNode;\n const bodyAction = eventNode.body?.[0]?.action ?? node.action;\n const roles: Record<string, SemanticJSONValue> = {};\n\n // Convert body's roles (not the event handler's)\n if (eventNode.body?.[0]) {\n for (const [role, value] of eventNode.body[0].roles) {\n roles[role] = semanticValueToJSON(value);\n }\n }\n\n // Extract event from roles\n const eventValue = node.roles.get('event');\n const eventName = eventValue\n ? 'value' in eventValue\n ? String(eventValue.value)\n : 'raw' in eventValue\n ? eventValue.raw\n : 'unknown'\n : 'unknown';\n\n const result: SemanticJSON = {\n action: bodyAction === 'on' ? (eventNode.body?.[0]?.action ?? 'on') : bodyAction,\n roles,\n trigger: {\n event: eventName,\n },\n };\n\n if (eventNode.eventModifiers && Object.keys(eventNode.eventModifiers).length > 0) {\n result.trigger!.modifiers = eventNode.eventModifiers as Record<string, unknown>;\n }\n\n return result;\n }\n\n // Regular command\n const roles: Record<string, SemanticJSONValue> = {};\n for (const [role, value] of node.roles) {\n roles[role] = semanticValueToJSON(value);\n }\n\n return { action: node.action, roles };\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\n/**\n * Convert a SemanticJSONValue to a SemanticValue.\n */\nfunction convertJSONValue(value: SemanticJSONValue): SemanticValue {\n switch (value.type) {\n case 'selector':\n return createSelector(String(value.value), detectSelectorKind(String(value.value)));\n\n case 'literal':\n return createLiteral(\n value.value,\n typeof value.value === 'number'\n ? 'number'\n : typeof value.value === 'boolean'\n ? 'boolean'\n : 'string'\n );\n\n case 'reference':\n return createReference(String(value.value));\n\n case 'expression':\n return createExpression(String(value.value));\n\n case 'property-path':\n // Property paths in JSON are represented as dot-separated strings\n return createExpression(String(value.value));\n\n case 'flag':\n return createFlag(String(value.value), true);\n\n default:\n return createLiteral(String(value.value), 'string');\n }\n}\n\n/**\n * Convert a SemanticValue to a SemanticJSONValue.\n */\nfunction semanticValueToJSON(value: SemanticValue): SemanticJSONValue {\n switch (value.type) {\n case 'selector':\n return { type: 'selector', value: value.value };\n\n case 'literal':\n return { type: 'literal', value: value.value };\n\n case 'reference':\n return { type: 'reference', value: value.value };\n\n case 'expression':\n return { type: 'expression', value: value.raw };\n\n case 'property-path':\n return {\n type: 'property-path',\n value: `${semanticValueToJSON(value.object).value}.${value.property}`,\n };\n\n case 'flag':\n return { type: 'flag', value: value.enabled };\n }\n}\n\nfunction detectSelectorKind(selector: string): 'id' | 'class' | 'attribute' | 'complex' {\n if (selector.startsWith('#')) return 'id';\n if (selector.startsWith('.')) return 'class';\n if (selector.startsWith('[')) return 'attribute';\n return 'complex';\n}\n","/**\n * Protocol JSON Serialization\n *\n * Converts between TypeScript SemanticNode (internal representation) and\n * the protocol wire format defined in protocol/spec/wire-format.md.\n *\n * `kind` is optional and defaults to `\"command\"` when absent.\n * `trigger` is accepted as convenience sugar for wrapping a command in an\n * event handler (e.g., `{ action: \"toggle\", trigger: { event: \"click\" } }`).\n *\n * The TypeScript layer is a superset of the protocol spec:\n * - TS has 5 node kinds; protocol has 3 (command, event-handler, compound)\n * - TS uses ReadonlyMap<SemanticRole, SemanticValue>; protocol uses plain Record\n * - TS SelectorValue has optional selectorKind; protocol preserves it when present (v1.1)\n * - TS has PropertyPathValue; protocol flattens it to expression\n * - TS conditional/loop nodes are losslessly encoded as command nodes with\n * thenBranch/elseBranch/loopVariant/loopBody/loopVariable/indexVariable fields (v1.1)\n * - v1.2 adds: annotations, diagnostics, try/catch/finally, async all/race,\n * match/arms, pipe chainType, and LSEEnvelope\n *\n * Use toProtocolJSON() to serialize for tool-to-tool interchange.\n * Use fromProtocolJSON() to deserialize from protocol-conformant sources.\n */\n\nimport type {\n SemanticNode,\n SemanticValue,\n SemanticRole,\n CommandSemanticNode,\n EventHandlerSemanticNode,\n CompoundSemanticNode,\n ConditionalSemanticNode,\n LoopSemanticNode,\n LoopVariant,\n AsyncVariant,\n LSEEnvelope,\n} from '../core/types';\nimport {\n createCommandNode,\n createEventHandlerNode,\n createCompoundNode,\n createConditionalNode,\n createLoopNode,\n createTryNode,\n createAsyncNode,\n createMatchNode,\n createSelector,\n createLiteral,\n createReference,\n createExpression,\n createFlag,\n extractValue,\n} from '../core/types';\nimport type {\n ProtocolNodeJSON,\n ProtocolValueJSON,\n ProtocolChainType,\n IRDiagnostic,\n LSEEnvelopeJSON,\n} from './types';\n\n// =============================================================================\n// Serialization: SemanticNode → ProtocolNodeJSON\n// =============================================================================\n\n/**\n * Serialize a SemanticNode to the protocol full-fidelity JSON wire format.\n *\n * TS-only node kinds are losslessly encoded as command nodes (v1.1):\n * - `conditional` → `command` with thenBranch/elseBranch arrays\n * - `loop` → `command` with loopVariant/loopBody/loopVariable/indexVariable fields\n *\n * v1.2 fields (annotations, diagnostics, try/catch/finally, async, match)\n * are serialized when present on the source node.\n *\n * TS-only value fields:\n * - `property-path` flattened to `expression` using extractValue()\n */\nexport function toProtocolJSON(node: SemanticNode): ProtocolNodeJSON {\n const roles = rolesToProtocol(node.roles);\n let result: ProtocolNodeJSON;\n\n switch (node.kind) {\n case 'command': {\n const cmd = node as CommandSemanticNode;\n result = { kind: 'command', action: node.action, roles };\n // v1.2: try/catch/finally\n if (cmd.body && cmd.body.length > 0) {\n result.body = cmd.body.map(toProtocolJSON);\n }\n if (cmd.catchBranch && cmd.catchBranch.length > 0) {\n result.catchBranch = cmd.catchBranch.map(toProtocolJSON);\n }\n if (cmd.finallyBranch && cmd.finallyBranch.length > 0) {\n result.finallyBranch = cmd.finallyBranch.map(toProtocolJSON);\n }\n // v1.2: async coordination\n if (cmd.asyncVariant) {\n result.asyncVariant = cmd.asyncVariant;\n }\n if (cmd.asyncBody && cmd.asyncBody.length > 0) {\n result.asyncBody = cmd.asyncBody.map(toProtocolJSON);\n }\n // v1.2: match\n if (cmd.arms && cmd.arms.length > 0) {\n result.arms = cmd.arms.map(arm => ({\n pattern: valueToProtocol(arm.pattern),\n body: arm.body.map(toProtocolJSON),\n }));\n }\n if (cmd.defaultArm && cmd.defaultArm.length > 0) {\n result.defaultArm = cmd.defaultArm.map(toProtocolJSON);\n }\n break;\n }\n\n case 'event-handler': {\n const eh = node as EventHandlerSemanticNode;\n result = {\n kind: 'event-handler',\n action: node.action,\n roles,\n body: eh.body.map(toProtocolJSON),\n };\n break;\n }\n\n case 'compound': {\n const c = node as CompoundSemanticNode;\n result = {\n kind: 'compound',\n action: 'compound',\n statements: c.statements.map(toProtocolJSON),\n chainType: c.chainType,\n } as ProtocolNodeJSON;\n break;\n }\n\n case 'conditional': {\n const cond = node as ConditionalSemanticNode;\n result = { kind: 'command', action: node.action, roles };\n result.thenBranch = cond.thenBranch.map(toProtocolJSON);\n if (cond.elseBranch && cond.elseBranch.length > 0) {\n result.elseBranch = cond.elseBranch.map(toProtocolJSON);\n }\n break;\n }\n\n case 'loop': {\n const loop = node as LoopSemanticNode;\n result = { kind: 'command', action: node.action, roles };\n result.loopVariant = loop.loopVariant;\n result.loopBody = loop.body.map(toProtocolJSON);\n if (loop.loopVariable) result.loopVariable = loop.loopVariable;\n if (loop.indexVariable) result.indexVariable = loop.indexVariable;\n break;\n }\n }\n\n // v1.2: annotations (all node kinds)\n if (node.annotations && node.annotations.length > 0) {\n result.annotations = node.annotations.map(a =>\n a.value !== undefined ? { name: a.name, value: a.value } : { name: a.name }\n );\n }\n\n // v1.2: diagnostics (all node kinds)\n if (node.diagnostics && node.diagnostics.length > 0) {\n result.diagnostics = node.diagnostics.map(d => ({\n level: d.level,\n role: d.role,\n message: d.message,\n code: d.code,\n }));\n }\n\n return result;\n}\n\nfunction rolesToProtocol(\n roles: ReadonlyMap<SemanticRole, SemanticValue>\n): Record<string, ProtocolValueJSON> {\n const result: Record<string, ProtocolValueJSON> = {};\n for (const [role, value] of roles) {\n result[role] = valueToProtocol(value);\n }\n return result;\n}\n\nfunction valueToProtocol(value: SemanticValue): ProtocolValueJSON {\n switch (value.type) {\n case 'selector': {\n const PROTOCOL_SELECTOR_KINDS = new Set([\n 'id',\n 'class',\n 'attribute',\n 'element',\n 'complex',\n ] as const);\n const sk = 'selectorKind' in value ? value.selectorKind : undefined;\n const sv: ProtocolValueJSON = { type: 'selector', value: value.value };\n if (sk && PROTOCOL_SELECTOR_KINDS.has(sk as 'id')) {\n sv.selectorKind = sk as 'id' | 'class' | 'attribute' | 'element' | 'complex';\n }\n return sv;\n }\n\n case 'literal':\n return value.dataType\n ? { type: 'literal', value: value.value, dataType: value.dataType }\n : { type: 'literal', value: value.value };\n\n case 'reference':\n return { type: 'reference', value: value.value };\n\n case 'expression':\n return { type: 'expression', raw: value.raw };\n\n case 'property-path':\n // Flatten to expression — property-path has no structured protocol representation\n return { type: 'expression', raw: extractValue(value) };\n\n case 'flag':\n return { type: 'flag', name: value.name, enabled: value.enabled };\n }\n}\n\n// =============================================================================\n// Deserialization: ProtocolNodeJSON → SemanticNode\n// =============================================================================\n\n/**\n * Deserialize a protocol wire format JSON object into a SemanticNode.\n *\n * Produces all 5 node kinds — detects v1.1/v1.2 fields on command nodes to\n * reconstruct appropriate node types:\n * - thenBranch present → `conditional` node via createConditionalNode()\n * - loopVariant present → `loop` node via createLoopNode()\n * - catchBranch/finallyBranch → try node via createTryNode() (v1.2)\n * - asyncVariant → async node via createAsyncNode() (v1.2)\n * - arms → match node via createMatchNode() (v1.2)\n *\n * Annotations and diagnostics (v1.2) are preserved on all node kinds.\n */\nexport function fromProtocolJSON(json: ProtocolNodeJSON): SemanticNode {\n const roles = new Map<SemanticRole, SemanticValue>(\n Object.entries(json.roles ?? {}).map(([role, val]) => [role, valueFromProtocol(val)])\n );\n\n // Deserialize v1.2 metadata (applies to all node kinds)\n const annotations = json.annotations?.map(a =>\n a.value !== undefined ? { name: a.name, value: a.value } : { name: a.name }\n );\n const diagnostics = json.diagnostics?.map(d => ({\n level: d.level as 'error' | 'warning',\n role: d.role,\n message: d.message,\n code: d.code,\n }));\n\n // trigger sugar: wrap command in event handler (check before kind dispatch)\n if (json.trigger) {\n const eventName = json.trigger.event;\n roles.set('event' as SemanticRole, createLiteral(eventName, 'string'));\n const bodyRoles = new Map(roles);\n bodyRoles.delete('event' as SemanticRole);\n const bodyNode = createCommandNode(json.action, bodyRoles);\n const node = createEventHandlerNode(\n 'on',\n roles,\n [bodyNode],\n { sourceLanguage: 'json' },\n (json.trigger.modifiers as Record<string, unknown> | undefined) ?? {}\n );\n return applyV12Metadata(node, annotations, diagnostics);\n }\n\n const kind = json.kind ?? 'command';\n\n if (kind === 'event-handler') {\n const body = (json.body ?? []).map(fromProtocolJSON);\n const node = createEventHandlerNode(json.action, roles, body);\n return applyV12Metadata(node, annotations, diagnostics);\n }\n\n if (kind === 'compound') {\n const statements = (json.statements ?? []).map(fromProtocolJSON);\n const node = createCompoundNode(\n statements,\n (json.chainType ?? 'sequential') as ProtocolChainType\n );\n return applyV12Metadata(node, annotations, diagnostics);\n }\n\n // Detect v1.1 conditional encoding: command with thenBranch\n if (json.thenBranch && json.thenBranch.length > 0) {\n const thenBranch = json.thenBranch.map(fromProtocolJSON);\n const elseBranch = json.elseBranch ? json.elseBranch.map(fromProtocolJSON) : undefined;\n const node = createConditionalNode(json.action, roles, thenBranch, elseBranch);\n return applyV12Metadata(node, annotations, diagnostics);\n }\n\n // Detect v1.1 loop encoding: command with loopVariant\n if (json.loopVariant) {\n const loopBody = (json.loopBody ?? []).map(fromProtocolJSON);\n const node = createLoopNode(\n json.action,\n roles,\n json.loopVariant as LoopVariant,\n loopBody,\n json.loopVariable,\n json.indexVariable\n );\n return applyV12Metadata(node, annotations, diagnostics);\n }\n\n // v1.2: Detect try/catch/finally (body + catchBranch or finallyBranch)\n if (json.catchBranch || json.finallyBranch) {\n const body = (json.body ?? []).map(fromProtocolJSON);\n const catchBranch = json.catchBranch ? json.catchBranch.map(fromProtocolJSON) : undefined;\n const finallyBranch = json.finallyBranch ? json.finallyBranch.map(fromProtocolJSON) : undefined;\n const node = createTryNode(body, catchBranch, finallyBranch);\n return applyV12Metadata(node, annotations, diagnostics);\n }\n\n // v1.2: Detect async coordination (asyncVariant)\n if (json.asyncVariant) {\n const asyncBody = (json.asyncBody ?? []).map(fromProtocolJSON);\n const node = createAsyncNode(json.asyncVariant as AsyncVariant, asyncBody);\n return applyV12Metadata(node, annotations, diagnostics);\n }\n\n // v1.2: Detect match (arms)\n if (json.arms && json.arms.length > 0) {\n const arms = json.arms.map(arm => ({\n pattern: valueFromProtocol(arm.pattern),\n body: arm.body.map(fromProtocolJSON),\n }));\n const defaultArm = json.defaultArm ? json.defaultArm.map(fromProtocolJSON) : undefined;\n const node = createMatchNode(roles, arms, defaultArm);\n return applyV12Metadata(node, annotations, diagnostics);\n }\n\n // v1.2: command with body only (try with no catch/finally)\n if (json.body && json.body.length > 0 && kind === 'command') {\n const body = json.body.map(fromProtocolJSON);\n const node = createTryNode(body);\n return applyV12Metadata(node, annotations, diagnostics);\n }\n\n // Plain command\n const node = createCommandNode(json.action, roles);\n return applyV12Metadata(node, annotations, diagnostics);\n}\n\n/**\n * Apply v1.2 annotations and diagnostics to a node.\n * Returns the node unchanged if neither is present.\n */\nfunction applyV12Metadata(\n node: SemanticNode,\n annotations: Array<{ name: string; value?: string }> | undefined,\n diagnostics:\n | Array<{ level: 'error' | 'warning'; role: string; message: string; code: string }>\n | undefined\n): SemanticNode {\n if ((!annotations || annotations.length === 0) && (!diagnostics || diagnostics.length === 0)) {\n return node;\n }\n return {\n ...node,\n ...(annotations && annotations.length > 0 ? { annotations } : {}),\n ...(diagnostics && diagnostics.length > 0 ? { diagnostics } : {}),\n };\n}\n\nfunction valueFromProtocol(value: ProtocolValueJSON): SemanticValue {\n switch (value.type) {\n case 'selector':\n return createSelector(String(value.value ?? ''), value.selectorKind);\n\n case 'literal':\n return createLiteral(\n value.value !== undefined ? value.value : '',\n value.dataType as 'string' | 'number' | 'boolean' | 'duration' | undefined\n );\n\n case 'reference':\n return createReference(String(value.value ?? ''));\n\n case 'expression':\n return createExpression(value.raw ?? String(value.value ?? ''));\n\n case 'flag':\n return createFlag(\n value.name ?? String(value.value ?? ''),\n value.enabled ?? (typeof value.value === 'boolean' ? value.value : true)\n );\n\n case 'property-path':\n // Protocol property-path has no structured form; restore as expression\n return createExpression(String(value.value ?? value.raw ?? ''));\n }\n}\n\n// =============================================================================\n// Envelope (v1.2)\n// =============================================================================\n\n/**\n * Serialize an LSEEnvelope to its JSON wire format.\n */\nexport function toEnvelopeJSON(envelope: LSEEnvelope): LSEEnvelopeJSON {\n const result: LSEEnvelopeJSON = {\n lseVersion: envelope.lseVersion,\n nodes: envelope.nodes.map(toProtocolJSON),\n };\n if (envelope.features && envelope.features.length > 0) {\n result.features = [...envelope.features];\n }\n return result;\n}\n\n/**\n * Deserialize an LSEEnvelopeJSON into an LSEEnvelope.\n */\nexport function fromEnvelopeJSON(json: LSEEnvelopeJSON): LSEEnvelope {\n return {\n lseVersion: json.lseVersion,\n ...(json.features && json.features.length > 0 ? { features: json.features } : {}),\n nodes: json.nodes.map(fromProtocolJSON),\n };\n}\n\n/**\n * Check whether an unknown JSON value is an LSE envelope (has lseVersion + nodes).\n */\nexport function isEnvelope(json: unknown): json is LSEEnvelopeJSON {\n return (\n typeof json === 'object' &&\n json !== null &&\n 'lseVersion' in json &&\n 'nodes' in json &&\n Array.isArray((json as Record<string, unknown>).nodes)\n );\n}\n\n// =============================================================================\n// Validation\n// =============================================================================\n\nconst VALID_KINDS = new Set(['command', 'event-handler', 'compound']);\nconst VALID_VALUE_TYPES = new Set([\n 'selector',\n 'literal',\n 'reference',\n 'expression',\n 'property-path',\n 'flag',\n]);\nconst VALID_CHAIN_TYPES = new Set(['then', 'and', 'async', 'sequential', 'pipe']);\nconst VALID_ASYNC_VARIANTS = new Set(['all', 'race']);\nconst VALID_DIAGNOSTIC_LEVELS = new Set(['error', 'warning']);\n\n/**\n * Validate that an unknown value conforms to the protocol JSON format.\n * `kind` is optional (defaults to `\"command\"`). `trigger` is accepted as\n * convenience sugar for wrapping a command in an event handler.\n * Returns an array of diagnostics (empty array = valid).\n */\nexport function validateProtocolJSON(json: unknown): IRDiagnostic[] {\n const diagnostics: IRDiagnostic[] = [];\n\n if (typeof json !== 'object' || json === null) {\n return [{ severity: 'error', code: 'INVALID_ROOT', message: 'Root must be a JSON object' }];\n }\n\n const node = json as Record<string, unknown>;\n\n // kind (optional, defaults to \"command\")\n const kind = 'kind' in node ? String(node.kind) : 'command';\n if ('kind' in node && !VALID_KINDS.has(kind)) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_KIND',\n message: `Invalid kind \"${node.kind}\". Must be one of: command, event-handler, compound`,\n });\n }\n\n // action\n if (!('action' in node)) {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_ACTION',\n message: 'Missing required field: action',\n });\n } else if (typeof node.action !== 'string' || node.action.length === 0) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_ACTION',\n message: 'action must be a non-empty string',\n });\n }\n\n // roles (optional on compound nodes)\n if (!('roles' in node) && kind !== 'compound') {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_ROLES',\n message: 'Missing required field: roles',\n });\n } else if (\n 'roles' in node &&\n (typeof node.roles !== 'object' || node.roles === null || Array.isArray(node.roles))\n ) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_ROLES',\n message: 'roles must be a plain object',\n });\n } else if ('roles' in node && node.roles) {\n for (const [role, value] of Object.entries(node.roles as Record<string, unknown>)) {\n if (typeof value !== 'object' || value === null) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_ROLE_VALUE',\n message: `Role \"${role}\" value must be an object`,\n });\n continue;\n }\n const v = value as Record<string, unknown>;\n if (!('type' in v) || !VALID_VALUE_TYPES.has(String(v.type))) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_VALUE_TYPE',\n message: `Role \"${role}\" has invalid type \"${v.type}\"`,\n });\n }\n // Flags: accept { name, enabled } or { value } (simplified form)\n if (v.type === 'flag') {\n const hasName = typeof v.name === 'string';\n const hasEnabled = typeof v.enabled === 'boolean';\n const hasValue = 'value' in v;\n if (!hasName && !hasValue) {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_FLAG_NAME',\n message: `Flag role \"${role}\" missing required field: name (or value)`,\n });\n }\n if (!hasEnabled && !hasValue) {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_FLAG_ENABLED',\n message: `Flag role \"${role}\" missing required field: enabled (or value)`,\n });\n }\n }\n // Expressions: accept { raw } or { value } (simplified form)\n if (v.type === 'expression' && typeof v.raw !== 'string' && !('value' in v)) {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_EXPRESSION_RAW',\n message: `Expression role \"${role}\" missing required field: raw (or value)`,\n });\n }\n }\n }\n\n // trigger validation (convenience sugar for event handlers)\n if ('trigger' in node && node.trigger) {\n const trigger = node.trigger as Record<string, unknown>;\n if (typeof trigger !== 'object' || trigger === null) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_TRIGGER',\n message: 'trigger must be an object',\n });\n } else if (!trigger.event || typeof trigger.event !== 'string') {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_TRIGGER',\n message: 'trigger.event is required and must be a non-empty string',\n });\n }\n }\n\n // event-handler requires body array (unless using trigger sugar)\n if (kind === 'event-handler' && !('trigger' in node)) {\n if (!('body' in node) || !Array.isArray(node.body)) {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_BODY',\n message: 'event-handler node requires a body array',\n });\n }\n }\n\n // compound requires statements array\n if (kind === 'compound') {\n if (!('statements' in node) || !Array.isArray(node.statements)) {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_STATEMENTS',\n message: 'compound node requires a statements array',\n });\n }\n if ('chainType' in node && !VALID_CHAIN_TYPES.has(String(node.chainType))) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_CHAIN_TYPE',\n message: `Invalid chainType \"${node.chainType}\". Must be one of: then, and, async, sequential, pipe`,\n });\n }\n }\n\n // v1.2: validate diagnostics array\n if ('diagnostics' in node) {\n if (!Array.isArray(node.diagnostics)) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_DIAGNOSTICS',\n message: 'diagnostics must be an array',\n });\n } else {\n for (let i = 0; i < (node.diagnostics as unknown[]).length; i++) {\n const d = (node.diagnostics as unknown[])[i] as Record<string, unknown> | null;\n if (!d || typeof d !== 'object') {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_DIAGNOSTIC_ENTRY',\n message: `diagnostics[${i}] must be an object`,\n });\n continue;\n }\n if (!VALID_DIAGNOSTIC_LEVELS.has(String(d.level))) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_DIAGNOSTIC_LEVEL',\n message: `diagnostics[${i}].level must be \"error\" or \"warning\"`,\n });\n }\n if (typeof d.role !== 'string') {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_DIAGNOSTIC_ROLE',\n message: `diagnostics[${i}] missing required field: role`,\n });\n }\n if (typeof d.message !== 'string') {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_DIAGNOSTIC_MESSAGE',\n message: `diagnostics[${i}] missing required field: message`,\n });\n }\n if (typeof d.code !== 'string') {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_DIAGNOSTIC_CODE',\n message: `diagnostics[${i}] missing required field: code`,\n });\n }\n }\n }\n }\n\n // v1.2: validate annotations array\n if ('annotations' in node) {\n if (!Array.isArray(node.annotations)) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_ANNOTATIONS',\n message: 'annotations must be an array',\n });\n } else {\n for (let i = 0; i < (node.annotations as unknown[]).length; i++) {\n const a = (node.annotations as unknown[])[i] as Record<string, unknown> | null;\n if (!a || typeof a !== 'object') {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_ANNOTATION_ENTRY',\n message: `annotations[${i}] must be an object`,\n });\n continue;\n }\n if (typeof a.name !== 'string' || a.name.length === 0) {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_ANNOTATION_NAME',\n message: `annotations[${i}] missing required field: name`,\n });\n }\n }\n }\n }\n\n // v1.2: validate asyncVariant\n if ('asyncVariant' in node && !VALID_ASYNC_VARIANTS.has(String(node.asyncVariant))) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_ASYNC_VARIANT',\n message: `Invalid asyncVariant \"${node.asyncVariant}\". Must be \"all\" or \"race\"`,\n });\n }\n\n // v1.2: validate arms\n if ('arms' in node) {\n if (!Array.isArray(node.arms)) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_ARMS',\n message: 'arms must be an array',\n });\n } else {\n for (let i = 0; i < (node.arms as unknown[]).length; i++) {\n const arm = (node.arms as unknown[])[i] as Record<string, unknown> | null;\n if (!arm || typeof arm !== 'object') {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_ARM_ENTRY',\n message: `arms[${i}] must be an object`,\n });\n continue;\n }\n if (!arm.pattern || typeof arm.pattern !== 'object') {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_ARM_PATTERN',\n message: `arms[${i}] missing required field: pattern`,\n });\n }\n if (!Array.isArray(arm.body)) {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_ARM_BODY',\n message: `arms[${i}] missing required field: body (array)`,\n });\n }\n }\n }\n }\n\n return diagnostics;\n}\n","/**\n * InterchangeNode → SemanticNode Converter\n *\n * Converts the expression-level InterchangeNode AST (from core/semantic parsers)\n * into the command-level SemanticNode IR used by LSE, MCP tools, and domain DSLs.\n *\n * This bridges the two IR pipelines in the monorepo:\n * - Pipeline A (InterchangeNode): full expression trees, 16 node types\n * - Pipeline B (SemanticNode): command-level semantics, opaque expression values\n *\n * Expression subtrees are intentionally collapsed to ExpressionValue { raw: string }\n * — LSE deliberately abstracts away expression-level detail.\n *\n * Uses structural typing for the input to avoid a dependency on the core package.\n */\n\nimport type {\n SemanticNode,\n SemanticValue,\n SemanticRole,\n LoopVariant,\n EventModifiers as SemanticEventModifiers,\n} from '../core/types';\nimport {\n createCommandNode,\n createEventHandlerNode,\n createConditionalNode,\n createLoopNode,\n createLiteral,\n createSelector,\n createReference,\n createExpression,\n createPropertyPath,\n} from '../core/types';\nimport { DEFAULT_REFERENCES } from './references';\n\n// =============================================================================\n// Structural Input Types (no core package dependency)\n// =============================================================================\n\n/**\n * Minimal interface matching InterchangeNode's structural shape.\n * Uses the `type` discriminant for dispatch. Additional fields are\n * accessed dynamically — this keeps the framework free of core imports.\n */\ninterface INode {\n readonly type: string;\n readonly [key: string]: unknown;\n}\n\n// =============================================================================\n// Main Converter\n// =============================================================================\n\n/**\n * Convert an InterchangeNode (expression-level AST) to a SemanticNode (command-level IR).\n *\n * Handles all 16 InterchangeNode types:\n * - Command/event nodes map to corresponding SemanticNode kinds\n * - Control flow nodes (if, repeat, foreach, while) map to conditional/loop kinds\n * - Expression nodes are wrapped as `get` commands with the value as patient role\n *\n * @param node - An InterchangeNode (or structurally compatible object)\n * @returns A SemanticNode suitable for LSE rendering, protocol JSON, or MCP tools\n */\nexport function fromInterchangeNode(node: INode): SemanticNode {\n if (!node || typeof node !== 'object') {\n return createCommandNode('unknown', {});\n }\n\n switch (node.type) {\n case 'event':\n return convertEvent(node);\n\n case 'command':\n return convertCommand(node);\n\n case 'if':\n return convertIf(node);\n\n case 'repeat':\n return convertRepeat(node);\n\n case 'foreach':\n return convertForEach(node);\n\n case 'while':\n return convertWhile(node);\n\n // Expression nodes — wrap as `get` command with patient role\n default:\n return createCommandNode('get', { patient: convertValue(node) });\n }\n}\n\n// =============================================================================\n// Node Converters\n// =============================================================================\n\nfunction convertEvent(node: INode): SemanticNode {\n const event = String(node.event ?? 'click');\n const bodyNodes = Array.isArray(node.body) ? (node.body as INode[]) : [];\n const body = bodyNodes.map(fromInterchangeNode);\n\n const roles: Record<SemanticRole, SemanticValue> = {\n event: createLiteral(event),\n };\n\n // Preserve event target if present\n if (node.target && typeof node.target === 'object') {\n roles.source = convertValue(node.target as INode);\n }\n\n // Bridge event modifiers\n const modifiers = node.modifiers as Record<string, unknown> | undefined;\n let eventModifiers: SemanticEventModifiers | undefined;\n\n if (modifiers) {\n eventModifiers = bridgeEventModifiers(modifiers);\n\n // InterchangeNode-only modifiers → encode as roles\n if (modifiers.prevent) roles.prevent = createLiteral(true);\n if (modifiers.stop) roles.stop = createLiteral(true);\n if (modifiers.passive) roles.passive = createLiteral(true);\n if (modifiers.capture) roles.capture = createLiteral(true);\n }\n\n return createEventHandlerNode('on', roles, body, undefined, eventModifiers);\n}\n\nfunction convertCommand(node: INode): SemanticNode {\n const name = String(node.name ?? 'unknown');\n const args = Array.isArray(node.args) ? (node.args as INode[]) : [];\n const target =\n node.target && typeof node.target === 'object' ? (node.target as INode) : undefined;\n const existingRoles = node.roles as Record<string, INode> | undefined;\n const modifiers = node.modifiers as Record<string, unknown> | undefined;\n\n let roles: Record<SemanticRole, SemanticValue>;\n\n if (existingRoles && typeof existingRoles === 'object' && Object.keys(existingRoles).length > 0) {\n // Semantic parser path: roles already present\n roles = {};\n for (const [role, value] of Object.entries(existingRoles)) {\n if (value && typeof value === 'object' && 'type' in value) {\n roles[role] = convertValue(value as INode);\n }\n }\n } else {\n // Core parser path: infer roles from command name\n roles = inferRoles(name, args, modifiers, target);\n }\n\n return createCommandNode(name, roles);\n}\n\nfunction convertIf(node: INode): SemanticNode {\n const condition =\n node.condition && typeof node.condition === 'object'\n ? convertValue(node.condition as INode)\n : createExpression('true');\n\n const thenBody = Array.isArray(node.thenBranch) ? (node.thenBranch as INode[]) : [];\n const thenBranch = thenBody.map(fromInterchangeNode);\n\n // Handle else branch — may include chained else-if\n let elseBranch: SemanticNode[] | undefined;\n\n const elseIfBranches = node.elseIfBranches as\n | ReadonlyArray<{ condition: INode; body: INode[] }>\n | undefined;\n\n if (elseIfBranches && elseIfBranches.length > 0) {\n // Chain else-if branches as nested conditionals\n elseBranch = [chainElseIfs(elseIfBranches, node.elseBranch as INode[] | undefined)];\n } else if (Array.isArray(node.elseBranch) && (node.elseBranch as INode[]).length > 0) {\n elseBranch = (node.elseBranch as INode[]).map(fromInterchangeNode);\n }\n\n const roles: Record<SemanticRole, SemanticValue> = { condition };\n return createConditionalNode('if', roles, thenBranch, elseBranch);\n}\n\nfunction chainElseIfs(\n branches: ReadonlyArray<{ condition: INode; body: INode[] }>,\n finalElse: INode[] | undefined\n): SemanticNode {\n const [first, ...rest] = branches;\n const condition = convertValue(first.condition as INode);\n const thenBranch = first.body.map(fromInterchangeNode);\n\n let elseBranch: SemanticNode[] | undefined;\n if (rest.length > 0) {\n elseBranch = [chainElseIfs(rest, finalElse)];\n } else if (finalElse && finalElse.length > 0) {\n elseBranch = finalElse.map(fromInterchangeNode);\n }\n\n return createConditionalNode('if', { condition }, thenBranch, elseBranch);\n}\n\nfunction convertRepeat(node: INode): SemanticNode {\n const bodyNodes = Array.isArray(node.body) ? (node.body as INode[]) : [];\n const body = bodyNodes.map(fromInterchangeNode);\n const roles: Record<SemanticRole, SemanticValue> = {};\n\n let variant: LoopVariant;\n\n if (node.count !== undefined && node.count !== null) {\n variant = 'times';\n if (typeof node.count === 'number') {\n roles.quantity = createLiteral(node.count, 'number');\n } else if (typeof node.count === 'object') {\n roles.quantity = convertValue(node.count as INode);\n }\n } else if (node.whileCondition && typeof node.whileCondition === 'object') {\n variant = 'while';\n roles.condition = convertValue(node.whileCondition as INode);\n } else if (typeof node.untilEvent === 'string') {\n variant = 'until';\n roles.condition = createLiteral(node.untilEvent);\n } else {\n variant = 'forever';\n }\n\n return createLoopNode('repeat', roles, variant, body);\n}\n\nfunction convertForEach(node: INode): SemanticNode {\n const bodyNodes = Array.isArray(node.body) ? (node.body as INode[]) : [];\n const body = bodyNodes.map(fromInterchangeNode);\n const roles: Record<SemanticRole, SemanticValue> = {};\n\n if (node.collection && typeof node.collection === 'object') {\n roles.source = convertValue(node.collection as INode);\n }\n\n const itemName = typeof node.itemName === 'string' ? node.itemName : undefined;\n const indexName = typeof node.indexName === 'string' ? node.indexName : undefined;\n\n return createLoopNode('repeat', roles, 'for', body, itemName, indexName);\n}\n\nfunction convertWhile(node: INode): SemanticNode {\n const bodyNodes = Array.isArray(node.body) ? (node.body as INode[]) : [];\n const body = bodyNodes.map(fromInterchangeNode);\n const roles: Record<SemanticRole, SemanticValue> = {};\n\n if (node.condition && typeof node.condition === 'object') {\n roles.condition = convertValue(node.condition as INode);\n }\n\n return createLoopNode('repeat', roles, 'while', body);\n}\n\n// =============================================================================\n// Value Conversion\n// =============================================================================\n\n/**\n * Convert an InterchangeNode to a SemanticValue.\n *\n * Simple nodes map directly to typed SemanticValue variants.\n * Complex expression nodes are collapsed to ExpressionValue { raw: string }.\n */\nexport function convertValue(node: INode): SemanticValue {\n switch (node.type) {\n case 'literal':\n return convertLiteral(node);\n\n case 'selector':\n return createSelector(String(node.value ?? ''), inferSelectorKind(String(node.value ?? '')));\n\n case 'identifier':\n return convertIdentifier(node);\n\n case 'variable':\n return convertVariable(node);\n\n case 'possessive':\n return createPropertyPath(\n node.object && typeof node.object === 'object'\n ? convertValue(node.object as INode)\n : createReference('me'),\n String(node.property ?? '')\n );\n\n // Complex expressions → collapse to raw string\n case 'binary':\n case 'unary':\n case 'member':\n case 'call':\n case 'positional':\n return createExpression(renderExpr(node));\n\n default:\n // Unknown type — render as expression\n if ('value' in node) return createLiteral(String(node.value ?? ''));\n return createExpression(renderExpr(node));\n }\n}\n\nfunction convertLiteral(node: INode): SemanticValue {\n const value = node.value;\n if (value === null || value === undefined) return createLiteral('null');\n\n const dataType =\n typeof value === 'number'\n ? ('number' as const)\n : typeof value === 'boolean'\n ? ('boolean' as const)\n : undefined;\n\n return createLiteral(value as string | number | boolean, dataType);\n}\n\nfunction convertIdentifier(node: INode): SemanticValue {\n const value = String(node.value ?? '');\n if (DEFAULT_REFERENCES.has(value)) {\n return createReference(value);\n }\n return createLiteral(value);\n}\n\nfunction convertVariable(node: INode): SemanticValue {\n const name = String(node.name ?? '');\n const scope = String(node.scope ?? 'local');\n\n switch (scope) {\n case 'element':\n return createExpression(`:${name}`);\n case 'global':\n return createExpression(`$${name}`);\n default:\n return createExpression(name);\n }\n}\n\n// =============================================================================\n// Expression Renderer\n// =============================================================================\n\n/**\n * Recursively render an InterchangeNode expression tree to a string.\n * Used to collapse complex expressions into ExpressionValue.raw.\n */\nexport function renderExpr(node: INode): string {\n if (!node || typeof node !== 'object') return '';\n\n switch (node.type) {\n case 'literal': {\n const v = node.value;\n if (v === null || v === undefined) return 'null';\n if (typeof v === 'string') return /\\s/.test(v) ? `\"${v}\"` : v;\n return String(v);\n }\n\n case 'identifier':\n return String(node.value ?? '');\n\n case 'selector':\n return String(node.value ?? '');\n\n case 'variable': {\n const name = String(node.name ?? '');\n const scope = String(node.scope ?? 'local');\n if (scope === 'element') return `:${name}`;\n if (scope === 'global') return `$${name}`;\n return name;\n }\n\n case 'binary': {\n const left = node.left && typeof node.left === 'object' ? renderExpr(node.left as INode) : '';\n const right =\n node.right && typeof node.right === 'object' ? renderExpr(node.right as INode) : '';\n return `${left} ${node.operator ?? ''} ${right}`;\n }\n\n case 'unary': {\n const operand =\n node.operand && typeof node.operand === 'object' ? renderExpr(node.operand as INode) : '';\n return `${node.operator ?? ''} ${operand}`;\n }\n\n case 'member': {\n const obj =\n node.object && typeof node.object === 'object' ? renderExpr(node.object as INode) : '';\n if (node.computed && node.property && typeof node.property === 'object') {\n return `${obj}[${renderExpr(node.property as INode)}]`;\n }\n const prop =\n typeof node.property === 'string'\n ? node.property\n : node.property && typeof node.property === 'object'\n ? renderExpr(node.property as INode)\n : '';\n return `${obj}.${prop}`;\n }\n\n case 'possessive': {\n const obj =\n node.object && typeof node.object === 'object' ? renderExpr(node.object as INode) : '';\n return `${obj}'s ${node.property ?? ''}`;\n }\n\n case 'call': {\n const callee =\n node.callee && typeof node.callee === 'object' ? renderExpr(node.callee as INode) : '';\n const args = Array.isArray(node.args)\n ? (node.args as INode[]).map(a => renderExpr(a)).join(', ')\n : '';\n return `${callee}(${args})`;\n }\n\n case 'positional': {\n const target =\n node.target && typeof node.target === 'object' ? renderExpr(node.target as INode) : '';\n return target ? `${node.position ?? ''} ${target}` : String(node.position ?? '');\n }\n\n default:\n if ('value' in node) return String(node.value ?? '');\n return '';\n }\n}\n\n// =============================================================================\n// Role Inference\n// =============================================================================\n\n/**\n * Infer semantic roles from command name, positional args, modifiers, and target.\n * Mirrors the heuristics in core's from-core.ts inferRoles() function.\n */\nfunction inferRoles(\n name: string,\n args: INode[],\n modifiers: Record<string, unknown> | undefined,\n target: INode | undefined\n): Record<SemanticRole, SemanticValue> {\n const roles: Record<SemanticRole, SemanticValue> = {};\n\n switch (name) {\n case 'set': {\n if (args[0]) roles.destination = convertValue(args[0]);\n const toVal = modifiers?.to;\n if (toVal && typeof toVal === 'object' && 'type' in (toVal as object)) {\n roles.patient = convertValue(toVal as INode);\n } else if (args[1]) {\n roles.patient = convertValue(args[1]);\n }\n break;\n }\n\n case 'put': {\n if (args[0]) roles.patient = convertValue(args[0]);\n if (modifiers) {\n for (const key of ['into', 'before', 'after'] as const) {\n const val = modifiers[key];\n if (val && typeof val === 'object' && 'type' in (val as object)) {\n roles.destination = convertValue(val as INode);\n roles.method = createLiteral(key);\n break;\n }\n }\n }\n if (!roles.destination && target) {\n roles.destination = convertValue(target);\n }\n break;\n }\n\n case 'increment':\n case 'decrement': {\n if (args[0]) roles.destination = convertValue(args[0]);\n const byVal = modifiers?.by;\n if (byVal && typeof byVal === 'object' && 'type' in (byVal as object)) {\n roles.quantity = convertValue(byVal as INode);\n } else if (args[1]) {\n roles.quantity = convertValue(args[1]);\n }\n break;\n }\n\n case 'fetch': {\n if (args[0]) roles.source = convertValue(args[0]);\n const asVal = modifiers?.as;\n if (asVal && typeof asVal === 'object' && 'type' in (asVal as object)) {\n roles.responseType = convertValue(asVal as INode);\n } else if (typeof asVal === 'string') {\n roles.responseType = createLiteral(asVal);\n }\n break;\n }\n\n case 'wait':\n case 'settle': {\n if (args[0]) roles.duration = convertValue(args[0]);\n break;\n }\n\n case 'toggle':\n case 'add':\n case 'show':\n case 'hide': {\n if (args[0]) roles.patient = convertValue(args[0]);\n if (target) roles.destination = convertValue(target);\n break;\n }\n\n case 'remove': {\n if (args[0]) roles.patient = convertValue(args[0]);\n if (target) roles.source = convertValue(target);\n break;\n }\n\n case 'send':\n case 'trigger': {\n if (args[0]) roles.patient = convertValue(args[0]);\n if (target) roles.destination = convertValue(target);\n break;\n }\n\n case 'log': {\n if (args[0]) roles.patient = convertValue(args[0]);\n break;\n }\n\n default: {\n // Generic fallback: first arg as patient, target as destination\n if (args[0]) roles.patient = convertValue(args[0]);\n if (target) roles.destination = convertValue(target);\n break;\n }\n }\n\n return roles;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/**\n * Infer selectorKind from a CSS selector string.\n */\nfunction inferSelectorKind(\n value: string\n): 'id' | 'class' | 'attribute' | 'element' | 'complex' | undefined {\n if (!value) return undefined;\n if (value.startsWith('#')) return 'id';\n if (value.startsWith('.')) return 'class';\n if (value.startsWith('[')) return 'attribute';\n if (value.startsWith('<') || value.startsWith('*')) return 'element';\n // Check for combinators indicating complex selectors\n if (/[>\\+~ ]/.test(value) && value.length > 1) return 'complex';\n return undefined;\n}\n\n/**\n * Infer a SemanticValue from a string (for event modifier `from` bridging).\n */\nfunction inferValueFromString(value: string): SemanticValue {\n if (DEFAULT_REFERENCES.has(value)) return createReference(value);\n const kind = inferSelectorKind(value);\n if (kind) return createSelector(value, kind);\n return createLiteral(value);\n}\n\n/**\n * Bridge InterchangeNode EventModifiers to SemanticNode EventModifiers.\n */\nfunction bridgeEventModifiers(mods: Record<string, unknown>): SemanticEventModifiers | undefined {\n const once = mods.once === true ? true : undefined;\n const debounce = typeof mods.debounce === 'number' ? mods.debounce : undefined;\n const throttle = typeof mods.throttle === 'number' ? mods.throttle : undefined;\n const from = typeof mods.from === 'string' ? inferValueFromString(mods.from) : undefined;\n\n if (\n once === undefined &&\n debounce === undefined &&\n throttle === undefined &&\n from === undefined\n ) {\n return undefined;\n }\n\n return {\n ...(once !== undefined ? { once } : {}),\n ...(debounce !== undefined ? { debounce } : {}),\n ...(throttle !== undefined ? { throttle } : {}),\n ...(from !== undefined ? { from } : {}),\n };\n}\n"],"mappings":"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","names":["roles","node","VALID_VALUE_TYPES","inferSelectorKind"]}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * LLM JSON Schema Conversion (DEPRECATED)
3
+ *
4
+ * These functions are superseded by the unified protocol JSON functions in
5
+ * protocol-json.ts. `fromProtocolJSON()` now accepts optional `kind` (defaults
6
+ * to "command") and `trigger` sugar, making these wrappers unnecessary.
7
+ *
8
+ * Use instead:
9
+ * - `validateProtocolJSON()` instead of `validateSemanticJSON()`
10
+ * - `fromProtocolJSON()` instead of `jsonToSemanticNode()`
11
+ * - `toProtocolJSON()` instead of `semanticNodeToJSON()`
12
+ *
13
+ * These functions are kept for backward compatibility and will be removed
14
+ * in a future major version.
15
+ */
16
+ import type { SemanticNode } from '../core/types';
17
+ import type { SemanticJSON, IRDiagnostic } from './types';
18
+ /**
19
+ * Validate LLM JSON input structure.
20
+ * Returns diagnostics (empty array = valid).
21
+ * @deprecated Use `validateProtocolJSON()` from `protocol-json.ts` instead.
22
+ */
23
+ export declare function validateSemanticJSON(input: SemanticJSON): IRDiagnostic[];
24
+ /**
25
+ * Convert validated SemanticJSON to a SemanticNode.
26
+ *
27
+ * Returns a properly typed SemanticNode using the framework's factory functions.
28
+ * If `trigger` is present, wraps the command in an event handler node.
29
+ * @deprecated Use `fromProtocolJSON()` from `protocol-json.ts` instead.
30
+ */
31
+ export declare function jsonToSemanticNode(input: SemanticJSON): SemanticNode;
32
+ /**
33
+ * Convert a SemanticNode to SemanticJSON format.
34
+ *
35
+ * This is the inverse of jsonToSemanticNode(). For event handlers,
36
+ * the event is extracted into the `trigger` field.
37
+ * @deprecated Use `toProtocolJSON()` from `protocol-json.ts` instead.
38
+ */
39
+ export declare function semanticNodeToJSON(node: SemanticNode): SemanticJSON;
40
+ //# sourceMappingURL=json-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema.d.ts","sourceRoot":"","sources":["../../src/ir/json-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,YAAY,EAKb,MAAM,eAAe,CAAC;AAUvB,OAAO,KAAK,EAAE,YAAY,EAAqB,YAAY,EAAE,MAAM,SAAS,CAAC;AAe7E;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,EAAE,CA4DxE;AAMD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,CA+BpE;AAMD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,CAsDnE"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Protocol JSON Serialization
3
+ *
4
+ * Converts between TypeScript SemanticNode (internal representation) and
5
+ * the protocol wire format defined in protocol/spec/wire-format.md.
6
+ *
7
+ * `kind` is optional and defaults to `"command"` when absent.
8
+ * `trigger` is accepted as convenience sugar for wrapping a command in an
9
+ * event handler (e.g., `{ action: "toggle", trigger: { event: "click" } }`).
10
+ *
11
+ * The TypeScript layer is a superset of the protocol spec:
12
+ * - TS has 5 node kinds; protocol has 3 (command, event-handler, compound)
13
+ * - TS uses ReadonlyMap<SemanticRole, SemanticValue>; protocol uses plain Record
14
+ * - TS SelectorValue has optional selectorKind; protocol preserves it when present (v1.1)
15
+ * - TS has PropertyPathValue; protocol flattens it to expression
16
+ * - TS conditional/loop nodes are losslessly encoded as command nodes with
17
+ * thenBranch/elseBranch/loopVariant/loopBody/loopVariable/indexVariable fields (v1.1)
18
+ * - v1.2 adds: annotations, diagnostics, try/catch/finally, async all/race,
19
+ * match/arms, pipe chainType, and LSEEnvelope
20
+ *
21
+ * Use toProtocolJSON() to serialize for tool-to-tool interchange.
22
+ * Use fromProtocolJSON() to deserialize from protocol-conformant sources.
23
+ */
24
+ import type { SemanticNode, LSEEnvelope } from '../core/types';
25
+ import type { ProtocolNodeJSON, IRDiagnostic, LSEEnvelopeJSON } from './types';
26
+ /**
27
+ * Serialize a SemanticNode to the protocol full-fidelity JSON wire format.
28
+ *
29
+ * TS-only node kinds are losslessly encoded as command nodes (v1.1):
30
+ * - `conditional` → `command` with thenBranch/elseBranch arrays
31
+ * - `loop` → `command` with loopVariant/loopBody/loopVariable/indexVariable fields
32
+ *
33
+ * v1.2 fields (annotations, diagnostics, try/catch/finally, async, match)
34
+ * are serialized when present on the source node.
35
+ *
36
+ * TS-only value fields:
37
+ * - `property-path` flattened to `expression` using extractValue()
38
+ */
39
+ export declare function toProtocolJSON(node: SemanticNode): ProtocolNodeJSON;
40
+ /**
41
+ * Deserialize a protocol wire format JSON object into a SemanticNode.
42
+ *
43
+ * Produces all 5 node kinds — detects v1.1/v1.2 fields on command nodes to
44
+ * reconstruct appropriate node types:
45
+ * - thenBranch present → `conditional` node via createConditionalNode()
46
+ * - loopVariant present → `loop` node via createLoopNode()
47
+ * - catchBranch/finallyBranch → try node via createTryNode() (v1.2)
48
+ * - asyncVariant → async node via createAsyncNode() (v1.2)
49
+ * - arms → match node via createMatchNode() (v1.2)
50
+ *
51
+ * Annotations and diagnostics (v1.2) are preserved on all node kinds.
52
+ */
53
+ export declare function fromProtocolJSON(json: ProtocolNodeJSON): SemanticNode;
54
+ /**
55
+ * Serialize an LSEEnvelope to its JSON wire format.
56
+ */
57
+ export declare function toEnvelopeJSON(envelope: LSEEnvelope): LSEEnvelopeJSON;
58
+ /**
59
+ * Deserialize an LSEEnvelopeJSON into an LSEEnvelope.
60
+ */
61
+ export declare function fromEnvelopeJSON(json: LSEEnvelopeJSON): LSEEnvelope;
62
+ /**
63
+ * Check whether an unknown JSON value is an LSE envelope (has lseVersion + nodes).
64
+ */
65
+ export declare function isEnvelope(json: unknown): json is LSEEnvelopeJSON;
66
+ /**
67
+ * Validate that an unknown value conforms to the protocol JSON format.
68
+ * `kind` is optional (defaults to `"command"`). `trigger` is accepted as
69
+ * convenience sugar for wrapping a command in an event handler.
70
+ * Returns an array of diagnostics (empty array = valid).
71
+ */
72
+ export declare function validateProtocolJSON(json: unknown): IRDiagnostic[];
73
+ //# sourceMappingURL=protocol-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-json.d.ts","sourceRoot":"","sources":["../../src/ir/protocol-json.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EACV,YAAY,EAUZ,WAAW,EACZ,MAAM,eAAe,CAAC;AAiBvB,OAAO,KAAK,EACV,gBAAgB,EAGhB,YAAY,EACZ,eAAe,EAChB,MAAM,SAAS,CAAC;AAMjB;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,gBAAgB,CAmGnE;AAsDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CA6GrE;AAwDD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,GAAG,eAAe,CASrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,WAAW,CAMnE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,eAAe,CAQjE;AAmBD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,EAAE,CAkRlE"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Reference Validation
3
+ *
4
+ * Configurable validation for reference values (me, you, it, result, etc.).
5
+ * Domain DSLs can provide custom reference sets.
6
+ */
7
+ /**
8
+ * Default set of valid references.
9
+ * Covers the common hyperscript references; domain DSLs can extend or replace.
10
+ */
11
+ export declare const DEFAULT_REFERENCES: ReadonlySet<string>;
12
+ /**
13
+ * Check if a value is a valid reference name.
14
+ *
15
+ * @param value - The string to check
16
+ * @param referenceSet - Custom reference set (defaults to DEFAULT_REFERENCES)
17
+ */
18
+ export declare function isValidReference(value: string, referenceSet?: ReadonlySet<string>): boolean;
19
+ //# sourceMappingURL=references.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../../src/ir/references.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAQjD,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EACb,YAAY,GAAE,WAAW,CAAC,MAAM,CAAsB,GACrD,OAAO,CAET"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * IR (Intermediate Representation) Types
3
+ *
4
+ * Types for the explicit bracket syntax, LLM JSON format, and
5
+ * schema-based validation. These are domain-agnostic — they work
6
+ * for any DSL built on the framework.
7
+ */
8
+ import type { CommandSchema } from '../schema/command-schema';
9
+ /**
10
+ * Structured input format for LLMs.
11
+ * No parsing ambiguity — action and roles are explicitly typed.
12
+ *
13
+ * @example
14
+ * ```json
15
+ * {
16
+ * "action": "toggle",
17
+ * "roles": { "patient": { "type": "selector", "value": ".active" } },
18
+ * "trigger": { "event": "click" }
19
+ * }
20
+ * ```
21
+ */
22
+ export interface SemanticJSON {
23
+ /** The command/action name */
24
+ action: string;
25
+ /** Named semantic roles with typed values */
26
+ roles: Record<string, SemanticJSONValue>;
27
+ /** Optional event trigger (wraps command in event handler) */
28
+ trigger?: {
29
+ event: string;
30
+ modifiers?: Record<string, unknown>;
31
+ };
32
+ }
33
+ /**
34
+ * A typed value in the LLM JSON format.
35
+ */
36
+ export interface SemanticJSONValue {
37
+ type: 'selector' | 'literal' | 'reference' | 'expression' | 'property-path' | 'flag';
38
+ value: string | number | boolean;
39
+ }
40
+ /**
41
+ * Interface for optional schema-based role validation in the explicit parser.
42
+ * Consumers provide this to validate roles against command definitions.
43
+ *
44
+ * When not provided, the parser accepts any role names.
45
+ */
46
+ export interface SchemaLookup {
47
+ getSchema(action: string): CommandSchema | undefined;
48
+ }
49
+ /**
50
+ * Options for parseExplicit().
51
+ */
52
+ export interface ParseExplicitOptions {
53
+ /** Optional schema lookup for role validation */
54
+ schemaLookup?: SchemaLookup;
55
+ /** Custom set of valid reference names (defaults to DEFAULT_REFERENCES) */
56
+ referenceSet?: ReadonlySet<string>;
57
+ }
58
+ /**
59
+ * A diagnostic message from IR validation.
60
+ *
61
+ * Uses required `code` field (compatible with both framework Diagnostic
62
+ * and compilation-service Diagnostic types via structural typing).
63
+ */
64
+ export interface IRDiagnostic {
65
+ severity: 'error' | 'warning' | 'info';
66
+ code: string;
67
+ message: string;
68
+ suggestion?: string;
69
+ }
70
+ export type ProtocolNodeKind = 'command' | 'event-handler' | 'compound';
71
+ export type ProtocolChainType = 'then' | 'and' | 'async' | 'sequential' | 'pipe';
72
+ /**
73
+ * A typed semantic value in the protocol full-fidelity JSON format.
74
+ * Matches protocol/spec/wire-format.md "Value Shapes" table.
75
+ */
76
+ export interface ProtocolValueJSON {
77
+ type: 'selector' | 'literal' | 'reference' | 'expression' | 'property-path' | 'flag';
78
+ value?: string | number | boolean;
79
+ dataType?: 'string' | 'number' | 'boolean' | 'duration';
80
+ raw?: string;
81
+ name?: string;
82
+ enabled?: boolean;
83
+ selectorKind?: 'id' | 'class' | 'attribute' | 'element' | 'complex';
84
+ }
85
+ /**
86
+ * Protocol JSON node — matches protocol/spec/wire-format.md.
87
+ * Produced by toProtocolJSON() and consumed by fromProtocolJSON().
88
+ *
89
+ * `kind` defaults to `"command"` when omitted.
90
+ * `trigger` is convenience sugar that wraps a command in an event handler.
91
+ */
92
+ export interface ProtocolNodeJSON {
93
+ kind?: ProtocolNodeKind;
94
+ action: string;
95
+ roles: Record<string, ProtocolValueJSON>;
96
+ trigger?: {
97
+ event: string;
98
+ modifiers?: Record<string, unknown>;
99
+ };
100
+ body?: ProtocolNodeJSON[];
101
+ statements?: ProtocolNodeJSON[];
102
+ chainType?: ProtocolChainType;
103
+ thenBranch?: ProtocolNodeJSON[];
104
+ elseBranch?: ProtocolNodeJSON[];
105
+ loopVariant?: 'forever' | 'times' | 'for' | 'while' | 'until';
106
+ loopBody?: ProtocolNodeJSON[];
107
+ loopVariable?: string;
108
+ indexVariable?: string;
109
+ diagnostics?: ProtocolDiagnosticJSON[];
110
+ annotations?: AnnotationJSON[];
111
+ catchBranch?: ProtocolNodeJSON[];
112
+ finallyBranch?: ProtocolNodeJSON[];
113
+ asyncVariant?: 'all' | 'race';
114
+ asyncBody?: ProtocolNodeJSON[];
115
+ arms?: MatchArmJSON[];
116
+ defaultArm?: ProtocolNodeJSON[];
117
+ }
118
+ /** A type constraint diagnostic in protocol wire format (v1.2). */
119
+ export interface ProtocolDiagnosticJSON {
120
+ level: 'error' | 'warning';
121
+ role: string;
122
+ message: string;
123
+ code: string;
124
+ }
125
+ /** A metadata annotation in protocol wire format (v1.2). */
126
+ export interface AnnotationJSON {
127
+ name: string;
128
+ value?: string;
129
+ }
130
+ /** A match arm in protocol wire format (v1.2). */
131
+ export interface MatchArmJSON {
132
+ pattern: ProtocolValueJSON;
133
+ body: ProtocolNodeJSON[];
134
+ }
135
+ /** Versioned envelope for multi-node LSE documents (v1.2). */
136
+ export interface LSEEnvelopeJSON {
137
+ lseVersion: string;
138
+ features?: string[];
139
+ nodes: ProtocolNodeJSON[];
140
+ }
141
+ //# sourceMappingURL=types.d.ts.map