@lokascript/framework 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aot/index.d.ts +1 -0
- package/dist/aot/index.d.ts.map +1 -1
- package/dist/aot/registry-bridge.d.ts +27 -0
- package/dist/aot/registry-bridge.d.ts.map +1 -0
- package/dist/api/create-dsl.d.ts.map +1 -1
- package/dist/api/dispatcher.d.ts +22 -0
- package/dist/api/dispatcher.d.ts.map +1 -1
- package/dist/api/domain-registry.d.ts +41 -0
- package/dist/api/domain-registry.d.ts.map +1 -1
- package/dist/api/index.js +1438 -21
- package/dist/api/index.js.map +1 -1
- package/dist/core/index.js +247 -10
- package/dist/core/index.js.map +1 -1
- package/dist/core/pattern-matching/index.js +74 -10
- package/dist/core/pattern-matching/index.js.map +1 -1
- package/dist/core/pattern-matching/pattern-matcher.d.ts.map +1 -1
- package/dist/core/tokenization/index.js +133 -0
- package/dist/core/tokenization/index.js.map +1 -1
- package/dist/core/tokenization/morphology/base-normalizer.d.ts +94 -0
- package/dist/core/tokenization/morphology/base-normalizer.d.ts.map +1 -0
- package/dist/core/tokenization/morphology/index.d.ts +3 -1
- package/dist/core/tokenization/morphology/index.d.ts.map +1 -1
- package/dist/core/types.d.ts +81 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +40 -0
- package/dist/core/types.js.map +1 -1
- package/dist/feedback/confidence-gate.d.ts +28 -0
- package/dist/feedback/confidence-gate.d.ts.map +1 -0
- package/dist/feedback/feedback-formatter.d.ts +21 -0
- package/dist/feedback/feedback-formatter.d.ts.map +1 -0
- package/dist/feedback/index.d.ts +11 -0
- package/dist/feedback/index.d.ts.map +1 -0
- package/dist/feedback/pattern-tracker.d.ts +47 -0
- package/dist/feedback/pattern-tracker.d.ts.map +1 -0
- package/dist/feedback/types.d.ts +113 -0
- package/dist/feedback/types.d.ts.map +1 -0
- package/dist/generation/index.js +2 -1
- package/dist/generation/index.js.map +1 -1
- package/dist/index.cjs +3264 -132
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3223 -132
- package/dist/index.js.map +1 -1
- package/dist/ir/explicit-parser.d.ts +86 -0
- package/dist/ir/explicit-parser.d.ts.map +1 -0
- package/dist/ir/explicit-renderer.d.ts +34 -0
- package/dist/ir/explicit-renderer.d.ts.map +1 -0
- package/dist/ir/from-interchange.d.ts +51 -0
- package/dist/ir/from-interchange.d.ts.map +1 -0
- package/dist/ir/index.d.ts +31 -0
- package/dist/ir/index.d.ts.map +1 -0
- package/dist/ir/index.js +1934 -0
- package/dist/ir/index.js.map +1 -0
- package/dist/ir/json-schema.d.ts +40 -0
- package/dist/ir/json-schema.d.ts.map +1 -0
- package/dist/ir/protocol-json.d.ts +73 -0
- package/dist/ir/protocol-json.d.ts.map +1 -0
- package/dist/ir/references.d.ts +19 -0
- package/dist/ir/references.d.ts.map +1 -0
- package/dist/ir/to-runtime-ast.d.ts +53 -0
- package/dist/ir/to-runtime-ast.d.ts.map +1 -0
- package/dist/ir/types.d.ts +151 -0
- package/dist/ir/types.d.ts.map +1 -0
- package/dist/parsing/index.js +74 -10
- package/dist/parsing/index.js.map +1 -1
- package/dist/prompts/index.d.ts +9 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/prompt-generator.d.ts +49 -0
- package/dist/prompts/prompt-generator.d.ts.map +1 -0
- package/dist/prompts/types.d.ts +64 -0
- package/dist/prompts/types.d.ts.map +1 -0
- package/dist/schema/command-schema.d.ts +17 -0
- package/dist/schema/command-schema.d.ts.map +1 -1
- package/dist/schema/index.js.map +1 -1
- package/dist/testing/index.js +8673 -8260
- package/dist/testing/index.js.map +1 -1
- package/dist/training/index.d.ts +11 -0
- package/dist/training/index.d.ts.map +1 -0
- package/dist/training/jsonl-writer.d.ts +42 -0
- package/dist/training/jsonl-writer.d.ts.map +1 -0
- package/dist/training/schema-synthesizer.d.ts +20 -0
- package/dist/training/schema-synthesizer.d.ts.map +1 -0
- package/dist/training/types.d.ts +73 -0
- package/dist/training/types.d.ts.map +1 -0
- package/package.json +5 -1
- package/src/aot/index.ts +1 -0
- package/src/aot/registry-bridge.test.ts +104 -0
- package/src/aot/registry-bridge.ts +66 -0
- package/src/api/create-dsl.test.ts +306 -0
- package/src/api/create-dsl.ts +21 -0
- package/src/api/dispatcher.test.ts +66 -0
- package/src/api/dispatcher.ts +77 -9
- package/src/api/domain-registry.ts +120 -4
- package/src/core/pattern-matching/pattern-matcher.test.ts +131 -0
- package/src/core/pattern-matching/pattern-matcher.ts +102 -19
- package/src/core/tokenization/morphology/base-normalizer.ts +249 -0
- package/src/core/tokenization/morphology/index.ts +3 -1
- package/src/core/types.ts +147 -2
- package/src/feedback/confidence-gate.test.ts +111 -0
- package/src/feedback/confidence-gate.ts +70 -0
- package/src/feedback/feedback-formatter.test.ts +198 -0
- package/src/feedback/feedback-formatter.ts +298 -0
- package/src/feedback/index.ts +24 -0
- package/src/feedback/pattern-tracker.test.ts +198 -0
- package/src/feedback/pattern-tracker.ts +140 -0
- package/src/feedback/types.ts +149 -0
- package/src/generation/pattern-generator.ts +2 -2
- package/src/index.ts +29 -0
- package/src/integration/llm-lse-integration.test.ts +457 -0
- package/src/ir/conformance.test.ts +120 -0
- package/src/ir/explicit-parser.test.ts +612 -0
- package/src/ir/explicit-parser.ts +793 -0
- package/src/ir/explicit-renderer.test.ts +229 -0
- package/src/ir/explicit-renderer.ts +198 -0
- package/src/ir/from-interchange.test.ts +853 -0
- package/src/ir/from-interchange.ts +594 -0
- package/src/ir/index.ts +77 -0
- package/src/ir/json-schema.test.ts +281 -0
- package/src/ir/json-schema.ts +299 -0
- package/src/ir/protocol-json.test.ts +1187 -0
- package/src/ir/protocol-json.ts +751 -0
- package/src/ir/references.test.ts +38 -0
- package/src/ir/references.ts +33 -0
- package/src/ir/round-trip.test.ts +557 -0
- package/src/ir/to-runtime-ast.ts +203 -0
- package/src/ir/types.ts +191 -0
- package/src/prompts/index.ts +15 -0
- package/src/prompts/prompt-generator.test.ts +386 -0
- package/src/prompts/prompt-generator.ts +531 -0
- package/src/prompts/types.ts +89 -0
- package/src/schema/command-schema.ts +19 -0
- package/src/training/index.ts +13 -0
- package/src/training/jsonl-writer.test.ts +138 -0
- package/src/training/jsonl-writer.ts +67 -0
- package/src/training/schema-synthesizer.test.ts +250 -0
- package/src/training/schema-synthesizer.ts +306 -0
- 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","../../src/ir/to-runtime-ast.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\nimport type { Diagnostic } from '../generation/diagnostics';\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 /** Diagnostics from parsing, validation, and schema checks (v1.2, extended v1.2.1). */\n readonly diagnostics?: readonly Diagnostic[];\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 * Three parsing levels matching the ABNF grammar:\n * parseDocument() → parseCompound() → parseExplicit()\n * (multi-line) (chain ops) (single bracket)\n *\n * Syntax:\n * [command role1:value1 role2:value2 ...]\n * [cmd1 ...] then [cmd2 ...]\n * @annotation(value) [command ...]\n * #!lse 1.2\\n[cmd1 ...]\\n[cmd2 ...]\n */\n\nimport type {\n SemanticNode,\n SemanticValue,\n SemanticRole,\n ActionType,\n LoopVariant,\n Annotation,\n LSEEnvelope,\n CompoundSemanticNode,\n} from '../core/types';\nimport {\n createCommandNode,\n createEventHandlerNode,\n createConditionalNode,\n createLoopNode,\n createCompoundNode,\n createSelector,\n createLiteral,\n createReference,\n createFlag,\n} from '../core/types';\nimport type { Diagnostic } from '../generation/diagnostics';\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 const collect = options.collectDiagnostics === true;\n const diagnostics: Diagnostic[] = [];\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 if (collect) {\n diagnostics.push({\n severity: 'error',\n code: 'EMPTY_FLAG',\n message: `Empty flag name: \"${token}\"`,\n source: 'schema',\n });\n continue;\n }\n throw new Error(`Empty flag name: \"${token}\"`);\n }\n if (validRoleNames && !validRoleNames.has(flagName as SemanticRole)) {\n const roleList = [...validRoleNames].join(', ');\n if (collect) {\n diagnostics.push({\n severity: 'error',\n code: 'UNKNOWN_FLAG',\n message: `Unknown flag \"${flagName}\" for command \"${command}\"`,\n source: 'schema',\n suggestions: [...validRoleNames].map(r => `+${r}`),\n });\n // Still add the flag so the node is usable\n roles.set(flagName as SemanticRole, createFlag(flagName, enabled));\n continue;\n }\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 if (collect) {\n diagnostics.push({\n severity: 'error',\n code: 'INVALID_ROLE_FORMAT',\n message: `Invalid role format: \"${token}\". Expected role:value or +flag`,\n source: 'schema',\n });\n continue;\n }\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 if (collect) {\n diagnostics.push({\n severity: 'error',\n code: 'UNKNOWN_ROLE',\n message: `Unknown role \"${roleName}\" for command \"${command}\"`,\n source: 'schema',\n suggestions: [...validRoleNames],\n });\n // Still parse and add the role so the node is usable\n } else {\n throw new Error(\n `Unknown role \"${roleName}\" for command \"${command}\". Valid roles: ${roleList}`\n );\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 if (collect) {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_REQUIRED_ROLE',\n message: `Missing required role \"${roleSpec.role}\" for command \"${command}\": ${roleSpec.description}`,\n source: 'schema',\n });\n } else {\n throw new Error(\n `Missing required role \"${roleSpec.role}\" for command \"${command}\": ${roleSpec.description}`\n );\n }\n }\n }\n }\n\n // Helper: attach diagnostics to a node if any were collected\n const attachDiagnostics = (node: SemanticNode): SemanticNode => {\n if (diagnostics.length === 0) return node;\n return { ...node, diagnostics };\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 if (collect) {\n diagnostics.push({\n severity: 'error',\n code: 'MISSING_EVENT_ROLE',\n message: 'Event handler requires event role: [on event:click ...]',\n source: 'schema',\n });\n // Return a stub event handler with diagnostics\n return attachDiagnostics(\n createEventHandlerNode('on', roles, [], {\n sourceLanguage: 'explicit',\n })\n );\n }\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 attachDiagnostics(\n createEventHandlerNode('on', roles, body, {\n sourceLanguage: 'explicit',\n })\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 attachDiagnostics(\n createConditionalNode(\n command,\n roles,\n thenBranch,\n elseBranch.length > 0 ? elseBranch : undefined,\n {\n sourceLanguage: 'explicit',\n }\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 attachDiagnostics(\n createLoopNode(command, roles, variant, loopBody, loopVariable, indexVariable, {\n sourceLanguage: 'explicit',\n })\n );\n }\n\n default:\n return attachDiagnostics(\n createCommandNode(command, roles, {\n sourceLanguage: 'explicit',\n })\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// Compound Statement Parsing\n// =============================================================================\n\n/** Chain operators per ABNF: \"then\" / \"and\" / \"async\" / \"sequential\" / \"|>\" */\nconst CHAIN_KEYWORDS = new Set(['then', 'and', 'async', 'sequential']);\n\n/**\n * Split input into bracket-command segments separated by chain operators.\n * Returns segments and the chain operator found (first one wins for mixed).\n */\nfunction splitCompoundSegments(input: string): {\n segments: string[];\n chainType: CompoundSemanticNode['chainType'] | null;\n} {\n const segments: string[] = [];\n let chainType: CompoundSemanticNode['chainType'] | null = null;\n let current = '';\n let bracketDepth = 0;\n let inString = false;\n let stringChar = '';\n\n for (let i = 0; i < input.length; i++) {\n const char = input[i];\n\n if (inString) {\n current += char;\n if (char === stringChar && input[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\n // At depth 0 after closing bracket, check for chain operator\n if (bracketDepth === 0) {\n const rest = input.slice(i + 1);\n // Check for |> pipe operator\n const pipeMatch = rest.match(/^\\s*\\|>\\s*/);\n if (pipeMatch) {\n segments.push(current.trim());\n current = '';\n chainType ??= 'pipe';\n i += pipeMatch[0].length;\n continue;\n }\n // Check for keyword chain operators\n const keywordMatch = rest.match(/^\\s+(then|and|async|sequential)\\s+/);\n if (keywordMatch && CHAIN_KEYWORDS.has(keywordMatch[1])) {\n segments.push(current.trim());\n current = '';\n chainType ??= keywordMatch[1] as CompoundSemanticNode['chainType'];\n i += keywordMatch[0].length;\n continue;\n }\n }\n continue;\n }\n\n current += char;\n }\n\n if (current.trim()) {\n segments.push(current.trim());\n }\n\n return { segments, chainType };\n}\n\n/**\n * Parse a compound statement (one or more bracket commands chained with operators).\n *\n * ABNF: compound-stmt = bracket-cmd *( chain-op bracket-cmd )\n *\n * Single commands pass through to parseExplicit(). Multiple commands produce\n * a CompoundSemanticNode.\n *\n * Also handles annotations (@name or @name(value)) before the first bracket.\n *\n * @example\n * ```typescript\n * // Single command — passthrough\n * parseCompound('[toggle patient:.active]')\n *\n * // Compound statement\n * parseCompound('[add patient:.loading] then [fetch source:/api/data]')\n *\n * // With annotation\n * parseCompound('@timeout(5s) [fetch source:/api/users]')\n * ```\n */\nexport function parseCompound(input: string, options?: ParseExplicitOptions): SemanticNode {\n const trimmed = input.trim();\n\n // Extract annotations before the first bracket\n const { annotations, remainder } = extractAnnotations(trimmed);\n\n const { segments, chainType } = splitCompoundSegments(remainder);\n\n let node: SemanticNode;\n if (segments.length <= 1) {\n // Single command — delegate to parseExplicit\n node = parseExplicit(segments[0] || remainder, options);\n } else {\n // Multiple commands — create compound node\n const statements = segments.map(seg => parseExplicit(seg, options));\n node = createCompoundNode(statements, chainType ?? 'sequential');\n }\n\n // Attach annotations if any\n if (annotations.length > 0) {\n return { ...node, annotations };\n }\n return node;\n}\n\n// =============================================================================\n// Annotation Parsing\n// =============================================================================\n\n/**\n * Extract @name and @name(value) annotations from before the first bracket.\n * Per ABNF, annotations precede the compound statement on the same line.\n */\nfunction extractAnnotations(input: string): { annotations: Annotation[]; remainder: string } {\n const annotations: Annotation[] = [];\n let pos = 0;\n\n while (pos < input.length) {\n // Skip whitespace\n while (pos < input.length && (input[pos] === ' ' || input[pos] === '\\t')) {\n pos++;\n }\n\n // If we hit '[' or end of string, we're done with annotations\n if (pos >= input.length || input[pos] !== '@') {\n break;\n }\n\n // Parse @name\n pos++; // skip @\n const nameStart = pos;\n while (pos < input.length && /[A-Za-z0-9\\-_]/.test(input[pos])) {\n pos++;\n }\n const name = input.slice(nameStart, pos);\n if (!name) break;\n\n // Check for (value)\n let value: string | undefined;\n if (pos < input.length && input[pos] === '(') {\n pos++; // skip (\n const valueStart = pos;\n // Handle quoted strings inside annotation values\n if (pos < input.length && (input[pos] === '\"' || input[pos] === \"'\")) {\n const quote = input[pos];\n pos++; // skip opening quote\n while (pos < input.length && input[pos] !== quote) {\n if (input[pos] === '\\\\') pos++; // skip escape\n pos++;\n }\n pos++; // skip closing quote\n value = input.slice(valueStart + 1, pos - 1); // strip quotes\n } else {\n // Plain value chars: ALPHA / DIGIT / \"-\" / \"_\" / \".\" / \"/\" / \":\"\n while (pos < input.length && input[pos] !== ')') {\n pos++;\n }\n value = input.slice(valueStart, pos);\n }\n if (pos < input.length && input[pos] === ')') {\n pos++; // skip )\n }\n }\n\n annotations.push(value !== undefined ? { name, value } : { name });\n }\n\n return { annotations, remainder: input.slice(pos).trim() };\n}\n\n// =============================================================================\n// Document Parsing\n// =============================================================================\n\n/** Version header regex: #!lse <version> */\nconst VERSION_HEADER_RE = /^#!lse\\s+(\\d+\\.\\d+(?:\\.\\d+)?)\\s*$/;\n\n/**\n * Parse a multi-line LSE document into an LSEEnvelope.\n *\n * ABNF: document = [ version-header LF ] *( line LF ) [ line ]\n *\n * Handles version headers (#!lse 1.2), comments (// or #), blank lines,\n * and statement lines (one compound statement per line).\n *\n * @example\n * ```typescript\n * const envelope = parseDocument(`\n * #!lse 1.2\n * // Toggle active state\n * [toggle patient:.active]\n * [add patient:.highlight]\n * `);\n * // envelope.lseVersion === '1.2'\n * // envelope.nodes.length === 2\n * ```\n */\nexport function parseDocument(input: string, options?: ParseExplicitOptions): LSEEnvelope {\n const lines = input.split('\\n');\n let lseVersion = '1.0';\n const nodes: SemanticNode[] = [];\n let startLine = 0;\n\n // Check for version header on first non-blank line\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trim();\n if (!trimmed) continue; // skip leading blank lines\n const versionMatch = trimmed.match(VERSION_HEADER_RE);\n if (versionMatch) {\n lseVersion = versionMatch[1];\n startLine = i + 1;\n }\n break;\n }\n\n // Parse remaining lines\n for (let i = startLine; i < lines.length; i++) {\n const trimmed = lines[i].trim();\n\n // Skip blank lines\n if (!trimmed) continue;\n\n // Skip comments (// or #, but NOT #! which is version header)\n if (trimmed.startsWith('//') || (trimmed.startsWith('#') && !trimmed.startsWith('#!'))) {\n continue;\n }\n\n // Parse statement line\n nodes.push(parseCompound(trimmed, options));\n }\n\n return { lseVersion, nodes };\n}\n\n// =============================================================================\n// Detection Helpers\n// =============================================================================\n\n/**\n * Check if input contains compound chaining (multiple bracket commands\n * with chain operators at bracket-depth 0).\n */\nexport function isCompoundSyntax(input: string): boolean {\n const { segments } = splitCompoundSegments(input.trim());\n return segments.length > 1;\n}\n\n/**\n * Check if input is a multi-line LSE document (contains newlines,\n * version header, or comment lines).\n */\nexport function isDocumentSyntax(input: string): boolean {\n const trimmed = input.trim();\n if (trimmed.includes('\\n')) return true;\n if (VERSION_HEADER_RE.test(trimmed)) return true;\n if (trimmed.startsWith('//') || (trimmed.startsWith('#') && !trimmed.startsWith('#!'))) {\n return true;\n }\n return false;\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 * Also renders annotations (@name(value)) and multi-line documents.\n */\n\nimport type {\n SemanticNode,\n SemanticValue,\n CommandSemanticNode,\n CompoundSemanticNode,\n EventHandlerSemanticNode,\n ConditionalSemanticNode,\n LoopSemanticNode,\n LSEEnvelope,\n} from '../core/types';\n\n/**\n * Render a semantic node as explicit bracket syntax.\n *\n * Handles annotations (v1.2) — if the node has annotations, they are\n * prepended as @name or @name(value) before the bracket output.\n *\n * @example\n * ```typescript\n * renderExplicit(node) // \"[toggle patient:.active destination:#button]\"\n * // With annotations:\n * renderExplicit(annotatedNode) // \"@timeout(5s) [fetch source:\\\"/api/users\\\"]\"\n * ```\n */\nexport function renderExplicit(node: SemanticNode): string {\n let result: string;\n\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 result = renderedStatements.join(` ${compoundNode.chainType} `);\n } else {\n result = renderBracketCommand(node);\n }\n\n // Prepend annotations if present\n if (node.annotations && node.annotations.length > 0) {\n const annParts = node.annotations.map(ann =>\n ann.value !== undefined ? `@${ann.name}(${ann.value})` : `@${ann.name}`\n );\n return annParts.join(' ') + ' ' + result;\n }\n\n return result;\n}\n\n/**\n * Render an LSEEnvelope as a multi-line document string.\n *\n * @example\n * ```typescript\n * renderDocument(envelope)\n * // \"#!lse 1.2\\n[toggle patient:.active]\\n[add patient:.highlight]\"\n * ```\n */\nexport function renderDocument(envelope: LSEEnvelope): string {\n const lines: string[] = [];\n\n // Emit version header if not the default\n if (envelope.lseVersion && envelope.lseVersion !== '1.0') {\n lines.push(`#!lse ${envelope.lseVersion}`);\n }\n\n // Emit each node on its own line\n for (const node of envelope.nodes) {\n lines.push(renderExplicit(node));\n }\n\n return lines.join('\\n');\n}\n\n// =============================================================================\n// Internal Helpers\n// =============================================================================\n\n/**\n * Render a single bracket command (non-compound node).\n */\nfunction renderBracketCommand(node: SemanticNode): string {\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 * 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 ProtocolDiagnosticJSON,\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/v1.2.1: diagnostics (all node kinds)\n if (node.diagnostics && node.diagnostics.length > 0) {\n result.diagnostics = node.diagnostics.map(d => {\n const json: ProtocolDiagnosticJSON = {\n level: d.severity,\n message: d.message,\n };\n if (d.code) json.code = d.code;\n if (d.source) json.source = d.source;\n if (d.suggestions && d.suggestions.length > 0) json.suggestions = [...d.suggestions];\n return json;\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 severity: d.level as 'error' | 'warning' | 'info',\n message: d.message,\n ...(d.code ? { code: d.code } : {}),\n ...(d.source ? { source: d.source } : {}),\n ...(d.suggestions && d.suggestions.length > 0 ? { suggestions: d.suggestions } : {}),\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<{\n severity: 'error' | 'warning' | 'info';\n message: string;\n code?: string;\n source?: string;\n suggestions?: string[];\n }>\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', 'info']);\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\", \"warning\", or \"info\"`,\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 // v1.2.1: role and code are now optional\n if ('code' in d && typeof d.code !== 'string') {\n diagnostics.push({\n severity: 'warning',\n code: 'INVALID_DIAGNOSTIC_CODE',\n message: `diagnostics[${i}].code must be a string if present`,\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","/**\n * SemanticNode → Runtime AST Converter\n *\n * Converts framework SemanticNode (LSE IR) to a structural AST format\n * that the core runtime can execute directly. Uses structural typing\n * to avoid a dependency on the core package.\n *\n * This is the canonical converter — AOT compiler delegates to it.\n *\n * The output matches the core runtime's expected node shapes:\n * - `{ type: 'command', name, args, roles }` → processCommand()\n * - `{ type: 'event', event, modifiers, body }` → adapted to executeEventHandler()\n */\n\nimport type {\n SemanticNode,\n SemanticValue,\n EventHandlerSemanticNode,\n ConditionalSemanticNode,\n LoopSemanticNode,\n} from '../core/types';\n\n// =============================================================================\n// Structural output types (no core package dependency)\n// =============================================================================\n\n/** Minimal AST node that the core runtime can execute. */\nexport interface RuntimeASTNode {\n readonly type: string;\n readonly [key: string]: unknown;\n}\n\n/** Command node shape expected by runtime's processCommand(). */\nexport interface RuntimeCommandNode extends RuntimeASTNode {\n readonly type: 'command';\n readonly name: string;\n readonly args: RuntimeASTNode[];\n readonly roles?: Readonly<Record<string, RuntimeASTNode>>;\n readonly modifiers?: Record<string, unknown>;\n}\n\n/** Event node shape expected by runtime's event adapter. */\nexport interface RuntimeEventNode extends RuntimeASTNode {\n readonly type: 'event';\n readonly event: string;\n readonly modifiers: Record<string, unknown>;\n readonly body: RuntimeASTNode[];\n}\n\n// =============================================================================\n// Converter\n// =============================================================================\n\n/**\n * Convert a SemanticNode to a RuntimeASTNode that the core runtime can execute.\n *\n * @example\n * ```typescript\n * import { parseExplicit } from '@lokascript/framework/ir';\n * import { semanticNodeToRuntimeAST } from '@lokascript/framework/ir';\n *\n * const node = parseExplicit('[toggle patient:.active]');\n * const ast = semanticNodeToRuntimeAST(node);\n * // { type: 'command', name: 'toggle', args: [{ type: 'selector', value: '.active' }], roles: { patient: ... } }\n * ```\n */\nexport function semanticNodeToRuntimeAST(node: SemanticNode): RuntimeASTNode {\n switch (node.kind) {\n case 'event-handler':\n return convertEventHandler(node as EventHandlerSemanticNode);\n\n case 'conditional':\n return convertConditional(node as ConditionalSemanticNode);\n\n case 'loop':\n return convertLoop(node as LoopSemanticNode);\n\n case 'compound': {\n const compound = node as SemanticNode & { statements?: SemanticNode[]; chainType?: string };\n const commands = (compound.statements ?? []).map(semanticNodeToRuntimeAST);\n return {\n type: 'CommandSequence',\n commands,\n };\n }\n\n case 'command':\n default:\n return convertCommand(node);\n }\n}\n\nfunction convertEventHandler(eh: EventHandlerSemanticNode): RuntimeEventNode {\n const eventValue = eh.roles.get('event');\n const eventName = eventValue && 'value' in eventValue ? String(eventValue.value) : 'click';\n\n const modifiers: Record<string, unknown> = {};\n if (eh.eventModifiers) {\n if (eh.eventModifiers.once) modifiers.once = true;\n if (eh.eventModifiers.debounce) modifiers.debounce = eh.eventModifiers.debounce;\n if (eh.eventModifiers.throttle) modifiers.throttle = eh.eventModifiers.throttle;\n if (eh.eventModifiers.queue) modifiers.queue = eh.eventModifiers.queue;\n }\n\n return {\n type: 'event',\n event: eventName,\n modifiers,\n body: (eh.body ?? []).map(semanticNodeToRuntimeAST),\n };\n}\n\nfunction convertCommand(node: SemanticNode): RuntimeCommandNode {\n const roles: Record<string, RuntimeASTNode> = {};\n const args: RuntimeASTNode[] = [];\n\n for (const [roleName, value] of node.roles) {\n const astValue = semanticValueToAST(value);\n roles[roleName] = astValue;\n args.push(astValue);\n }\n\n return {\n type: 'command',\n name: node.action,\n args,\n roles,\n };\n}\n\nfunction convertConditional(node: ConditionalSemanticNode): RuntimeASTNode {\n const conditionValue = node.roles.get('condition');\n return {\n type: 'command',\n name: 'if',\n args: conditionValue ? [semanticValueToAST(conditionValue)] : [],\n condition: conditionValue ? semanticValueToAST(conditionValue) : undefined,\n thenBranch: (node.thenBranch ?? []).map(semanticNodeToRuntimeAST),\n elseBranch: (node.elseBranch ?? []).map(semanticNodeToRuntimeAST),\n };\n}\n\nfunction convertLoop(node: LoopSemanticNode): RuntimeASTNode {\n const countValue = node.roles.get('patient') || node.roles.get('count');\n return {\n type: 'command',\n name: 'repeat',\n args: countValue ? [semanticValueToAST(countValue)] : [],\n loopVariant: node.loopVariant ?? 'forever',\n body: (node.body ?? []).map(semanticNodeToRuntimeAST),\n loopVariable: node.loopVariable,\n indexVariable: node.indexVariable,\n };\n}\n\n/**\n * Convert a SemanticValue to a RuntimeASTNode.\n */\nexport function semanticValueToAST(value: SemanticValue): RuntimeASTNode {\n switch (value.type) {\n case 'selector':\n return { type: 'selector', value: value.value as string };\n\n case 'reference':\n return { type: 'identifier', value: value.value as string };\n\n case 'literal': {\n const lit = value as { value: unknown; dataType?: string };\n if (lit.dataType === 'duration') {\n const str = String(lit.value);\n const match = /^(\\d+(?:\\.\\d+)?)(ms|s)$/.exec(str);\n if (match) {\n const ms = match[2] === 's' ? parseFloat(match[1]) * 1000 : parseFloat(match[1]);\n return { type: 'literal', value: ms };\n }\n }\n return { type: 'literal', value: lit.value as string | number | boolean | null };\n }\n\n case 'property-path': {\n const pp = value as import('../core/types').PropertyPathValue;\n const objectAST = semanticValueToAST(pp.object);\n return {\n type: 'member',\n object: objectAST,\n property: pp.property,\n };\n }\n\n case 'expression': {\n const expr = value as { raw: string };\n return { type: 'expression', value: expr.raw };\n }\n\n case 'flag': {\n const flag = value as { name: string; enabled: boolean };\n return { type: 'literal', value: flag.enabled };\n }\n\n default:\n return { type: 'literal', value: String((value as { value?: unknown }).value ?? '') };\n }\n}\n"],"mappings":"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","names":["roles","node","VALID_VALUE_TYPES","inferSelectorKind","convertCommand"]}
|
|
@@ -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,EAIhB,YAAY,EACZ,eAAe,EAChB,MAAM,SAAS,CAAC;AAMjB;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,gBAAgB,CAuGnE;AAsDD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,CA8GrE;AA8DD;;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,CA4QlE"}
|
|
@@ -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,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SemanticNode → Runtime AST Converter
|
|
3
|
+
*
|
|
4
|
+
* Converts framework SemanticNode (LSE IR) to a structural AST format
|
|
5
|
+
* that the core runtime can execute directly. Uses structural typing
|
|
6
|
+
* to avoid a dependency on the core package.
|
|
7
|
+
*
|
|
8
|
+
* This is the canonical converter — AOT compiler delegates to it.
|
|
9
|
+
*
|
|
10
|
+
* The output matches the core runtime's expected node shapes:
|
|
11
|
+
* - `{ type: 'command', name, args, roles }` → processCommand()
|
|
12
|
+
* - `{ type: 'event', event, modifiers, body }` → adapted to executeEventHandler()
|
|
13
|
+
*/
|
|
14
|
+
import type { SemanticNode, SemanticValue } from '../core/types';
|
|
15
|
+
/** Minimal AST node that the core runtime can execute. */
|
|
16
|
+
export interface RuntimeASTNode {
|
|
17
|
+
readonly type: string;
|
|
18
|
+
readonly [key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
/** Command node shape expected by runtime's processCommand(). */
|
|
21
|
+
export interface RuntimeCommandNode extends RuntimeASTNode {
|
|
22
|
+
readonly type: 'command';
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly args: RuntimeASTNode[];
|
|
25
|
+
readonly roles?: Readonly<Record<string, RuntimeASTNode>>;
|
|
26
|
+
readonly modifiers?: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
/** Event node shape expected by runtime's event adapter. */
|
|
29
|
+
export interface RuntimeEventNode extends RuntimeASTNode {
|
|
30
|
+
readonly type: 'event';
|
|
31
|
+
readonly event: string;
|
|
32
|
+
readonly modifiers: Record<string, unknown>;
|
|
33
|
+
readonly body: RuntimeASTNode[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Convert a SemanticNode to a RuntimeASTNode that the core runtime can execute.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* import { parseExplicit } from '@lokascript/framework/ir';
|
|
41
|
+
* import { semanticNodeToRuntimeAST } from '@lokascript/framework/ir';
|
|
42
|
+
*
|
|
43
|
+
* const node = parseExplicit('[toggle patient:.active]');
|
|
44
|
+
* const ast = semanticNodeToRuntimeAST(node);
|
|
45
|
+
* // { type: 'command', name: 'toggle', args: [{ type: 'selector', value: '.active' }], roles: { patient: ... } }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare function semanticNodeToRuntimeAST(node: SemanticNode): RuntimeASTNode;
|
|
49
|
+
/**
|
|
50
|
+
* Convert a SemanticValue to a RuntimeASTNode.
|
|
51
|
+
*/
|
|
52
|
+
export declare function semanticValueToAST(value: SemanticValue): RuntimeASTNode;
|
|
53
|
+
//# sourceMappingURL=to-runtime-ast.d.ts.map
|