@lokascript/framework 2.9.3 → 2.9.4
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/api/index.js.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/pattern-matching/index.js.map +1 -1
- package/dist/core/pattern-matching/pattern-matcher.d.ts.map +1 -1
- package/dist/feedback/types.d.ts.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ir/from-interchange.d.ts.map +1 -1
- package/dist/ir/index.js.map +1 -1
- package/dist/parsing/index.js.map +1 -1
- package/package.json +3 -3
- package/src/core/pattern-matching/pattern-matcher.ts +1 -2
- package/src/feedback/types.ts +1 -5
- package/src/ir/from-interchange.ts +1 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-interchange.d.ts","sourceRoot":"","sources":["../../src/ir/from-interchange.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAId,MAAM,eAAe,CAAC;AAkBvB;;;;GAIG;AACH,UAAU,KAAK;IACb,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,KAAK,GAAG,YAAY,CA4B7D;
|
|
1
|
+
{"version":3,"file":"from-interchange.d.ts","sourceRoot":"","sources":["../../src/ir/from-interchange.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAId,MAAM,eAAe,CAAC;AAkBvB;;;;GAIG;AACH,UAAU,KAAK;IACb,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,KAAK,GAAG,YAAY,CA4B7D;AAqKD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,aAAa,CAmCvD;AA0CD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,CA8E9C"}
|
package/dist/ir/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ir/references.ts","../../src/ir/explicit-parser.ts","../../src/ir/explicit-renderer.ts","../../src/core/types.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 — re-exported from @lokascript/intent\n */\n\nexport { DEFAULT_REFERENCES, isValidReference } from '@lokascript/intent';\n","/**\n * Explicit Syntax Parser — re-exported from @lokascript/intent\n */\n\nexport {\n STRUCTURAL_ROLES,\n parseExplicit,\n isExplicitSyntax,\n parseCompound,\n parseDocument,\n isCompoundSyntax,\n isDocumentSyntax,\n} from '@lokascript/intent';\n","/**\n * Explicit Syntax Renderer — re-exported from @lokascript/intent\n */\n\nexport { renderExplicit, renderDocument } from '@lokascript/intent';\n","/**\n * Core Types — re-exported from @lokascript/intent + framework-specific extensions\n *\n * The universal semantic types (SemanticNode, SemanticValue, etc.) now live in\n * @lokascript/intent and are re-exported here for backward compatibility.\n *\n * Framework-specific types (tokenization, pattern matching) are defined below.\n */\n\n// =============================================================================\n// Re-export everything from @lokascript/intent\n// =============================================================================\n\nexport type {\n ActionType,\n SemanticRole,\n SemanticValue,\n ExpectedType,\n LiteralValue,\n SelectorValue,\n ReferenceValue,\n PropertyPathValue,\n ExpressionValue,\n FlagValue,\n Annotation,\n ProtocolDiagnostic,\n AsyncVariant,\n MatchArm,\n SemanticNode,\n SemanticMetadata,\n SourcePosition,\n CommandSemanticNode,\n EventHandlerSemanticNode,\n EventModifiers,\n ConditionalSemanticNode,\n CompoundSemanticNode,\n LoopVariant,\n LoopSemanticNode,\n LSEEnvelope,\n} from '@lokascript/intent';\n\nexport {\n createLiteral,\n createSelector,\n createReference,\n createPropertyPath,\n createExpression,\n createFlag,\n createCommandNode,\n createEventHandlerNode,\n createConditionalNode,\n createCompoundNode,\n createLoopNode,\n createTryNode,\n createAsyncNode,\n createMatchNode,\n extractValue,\n extractRoleValue,\n getRoleValue,\n} from '@lokascript/intent';\n\n// =============================================================================\n// Framework-specific types (multilingual DSL infrastructure)\n// =============================================================================\n\nimport type {\n ActionType,\n SemanticRole,\n SemanticValue,\n SelectorValue,\n ExpectedType,\n SourcePosition,\n} from '@lokascript/intent';\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 readonly normalized?: string;\n readonly stem?: string;\n readonly stemConfidence?: number;\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 peek(offset?: number): LanguageToken | null;\n advance(): LanguageToken;\n isAtEnd(): boolean;\n mark(): StreamMark;\n reset(mark: StreamMark): void;\n position(): number;\n}\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 tokenize(input: string): TokenStream;\n classifyToken(token: string): TokenKind;\n}\n\n// =============================================================================\n// Pattern Matching Types\n// =============================================================================\n\nexport interface LanguagePattern {\n readonly id: string;\n readonly language: string;\n readonly command: ActionType;\n readonly priority: number;\n readonly template: PatternTemplate;\n readonly extraction: ExtractionRules;\n readonly constraints?: PatternConstraints;\n}\n\nexport interface PatternTemplate {\n readonly format: string;\n readonly tokens: PatternToken[];\n}\n\nexport type PatternToken = LiteralPatternToken | RolePatternToken | GroupPatternToken;\n\nexport interface LiteralPatternToken {\n readonly type: 'literal';\n readonly value: string;\n readonly alternatives?: string[];\n}\n\nexport interface RolePatternToken {\n readonly type: 'role';\n readonly role: SemanticRole;\n readonly optional?: boolean;\n readonly expectedTypes?: Array<ExpectedType>;\n readonly greedy?: boolean;\n}\n\nexport interface GroupPatternToken {\n readonly type: 'group';\n readonly tokens: PatternToken[];\n readonly optional?: boolean;\n}\n\nexport interface ExtractionRules {\n readonly [role: string]: ExtractionRule;\n}\n\nexport interface ExtractionRule {\n readonly position?: number;\n readonly marker?: string;\n readonly markerAlternatives?: string[];\n readonly transform?: (raw: string) => SemanticValue;\n readonly default?: SemanticValue;\n readonly value?: string;\n readonly fromRole?: string;\n}\n\nexport interface PatternConstraints {\n readonly requiredRoles?: SemanticRole[];\n readonly forbiddenRoles?: SemanticRole[];\n readonly validPatientTypes?: Array<SelectorValue['selectorKind']>;\n readonly conflictsWith?: string[];\n}\n\nexport interface PatternMatchResult {\n readonly pattern: LanguagePattern;\n readonly captured: ReadonlyMap<SemanticRole, SemanticValue>;\n readonly consumedTokens: number;\n readonly confidence: number;\n}\n\nexport interface PatternMatchError {\n readonly message: string;\n readonly position: SourcePosition;\n readonly expectedPatterns?: string[];\n readonly partialMatch?: Partial<PatternMatchResult>;\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 — re-exported from @lokascript/intent\n */\n\nexport {\n toProtocolJSON,\n fromProtocolJSON,\n validateProtocolJSON,\n toEnvelopeJSON,\n fromEnvelopeJSON,\n isEnvelope,\n} from '@lokascript/intent';\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 * Marker-keyword sets — mirror the runtime command parsers' skip lists so the\n * inferred roles point at the real value, not the literal marker word.\n */\nconst SCROLL_MARKERS: ReadonlySet<string> = new Set([\n 'to',\n 'of',\n 'the',\n 'top',\n 'bottom',\n 'middle',\n 'center',\n 'nearest',\n 'left',\n 'right',\n 'smoothly',\n 'instantly',\n]);\nconst URL_MARKERS: ReadonlySet<string> = new Set(['url']);\nconst PARTIALS_IN_MARKERS: ReadonlySet<string> = new Set(['partials', 'in']);\n\n/**\n * Return the first arg that isn't a marker identifier from the given set.\n * Identifier args carry the marker word in `name` (or `value` as a fallback).\n */\nfunction firstNonMarkerArg(args: INode[], markers: ReadonlySet<string>): INode | undefined {\n for (const a of args) {\n if (a.type === 'identifier') {\n const ident = a as { name?: unknown; value?: unknown };\n const word = typeof ident.name === 'string' ? ident.name : ident.value;\n if (typeof word === 'string' && markers.has(word)) continue;\n }\n return a;\n }\n return undefined;\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 // scroll [to] [position] target [smoothly|instantly] → destination=target\n case 'scroll': {\n const t = firstNonMarkerArg(args, SCROLL_MARKERS);\n if (t) roles.destination = convertValue(t);\n break;\n }\n\n // push|replace url <X> → patient=X\n case 'push':\n case 'replace': {\n const t = firstNonMarkerArg(args, URL_MARKERS);\n if (t) roles.patient = convertValue(t);\n break;\n }\n\n // process partials in <X> → patient=X\n case 'process': {\n const t = firstNonMarkerArg(args, PARTIALS_IN_MARKERS);\n if (t) roles.patient = convertValue(t);\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","convertCommand"]}
|
|
1
|
+
{"version":3,"sources":["../../src/ir/references.ts","../../src/ir/explicit-parser.ts","../../src/ir/explicit-renderer.ts","../../src/core/types.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 — re-exported from @lokascript/intent\n */\n\nexport { DEFAULT_REFERENCES, isValidReference } from '@lokascript/intent';\n","/**\n * Explicit Syntax Parser — re-exported from @lokascript/intent\n */\n\nexport {\n STRUCTURAL_ROLES,\n parseExplicit,\n isExplicitSyntax,\n parseCompound,\n parseDocument,\n isCompoundSyntax,\n isDocumentSyntax,\n} from '@lokascript/intent';\n","/**\n * Explicit Syntax Renderer — re-exported from @lokascript/intent\n */\n\nexport { renderExplicit, renderDocument } from '@lokascript/intent';\n","/**\n * Core Types — re-exported from @lokascript/intent + framework-specific extensions\n *\n * The universal semantic types (SemanticNode, SemanticValue, etc.) now live in\n * @lokascript/intent and are re-exported here for backward compatibility.\n *\n * Framework-specific types (tokenization, pattern matching) are defined below.\n */\n\n// =============================================================================\n// Re-export everything from @lokascript/intent\n// =============================================================================\n\nexport type {\n ActionType,\n SemanticRole,\n SemanticValue,\n ExpectedType,\n LiteralValue,\n SelectorValue,\n ReferenceValue,\n PropertyPathValue,\n ExpressionValue,\n FlagValue,\n Annotation,\n ProtocolDiagnostic,\n AsyncVariant,\n MatchArm,\n SemanticNode,\n SemanticMetadata,\n SourcePosition,\n CommandSemanticNode,\n EventHandlerSemanticNode,\n EventModifiers,\n ConditionalSemanticNode,\n CompoundSemanticNode,\n LoopVariant,\n LoopSemanticNode,\n LSEEnvelope,\n} from '@lokascript/intent';\n\nexport {\n createLiteral,\n createSelector,\n createReference,\n createPropertyPath,\n createExpression,\n createFlag,\n createCommandNode,\n createEventHandlerNode,\n createConditionalNode,\n createCompoundNode,\n createLoopNode,\n createTryNode,\n createAsyncNode,\n createMatchNode,\n extractValue,\n extractRoleValue,\n getRoleValue,\n} from '@lokascript/intent';\n\n// =============================================================================\n// Framework-specific types (multilingual DSL infrastructure)\n// =============================================================================\n\nimport type {\n ActionType,\n SemanticRole,\n SemanticValue,\n SelectorValue,\n ExpectedType,\n SourcePosition,\n} from '@lokascript/intent';\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 readonly normalized?: string;\n readonly stem?: string;\n readonly stemConfidence?: number;\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 peek(offset?: number): LanguageToken | null;\n advance(): LanguageToken;\n isAtEnd(): boolean;\n mark(): StreamMark;\n reset(mark: StreamMark): void;\n position(): number;\n}\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 tokenize(input: string): TokenStream;\n classifyToken(token: string): TokenKind;\n}\n\n// =============================================================================\n// Pattern Matching Types\n// =============================================================================\n\nexport interface LanguagePattern {\n readonly id: string;\n readonly language: string;\n readonly command: ActionType;\n readonly priority: number;\n readonly template: PatternTemplate;\n readonly extraction: ExtractionRules;\n readonly constraints?: PatternConstraints;\n}\n\nexport interface PatternTemplate {\n readonly format: string;\n readonly tokens: PatternToken[];\n}\n\nexport type PatternToken = LiteralPatternToken | RolePatternToken | GroupPatternToken;\n\nexport interface LiteralPatternToken {\n readonly type: 'literal';\n readonly value: string;\n readonly alternatives?: string[];\n}\n\nexport interface RolePatternToken {\n readonly type: 'role';\n readonly role: SemanticRole;\n readonly optional?: boolean;\n readonly expectedTypes?: Array<ExpectedType>;\n readonly greedy?: boolean;\n}\n\nexport interface GroupPatternToken {\n readonly type: 'group';\n readonly tokens: PatternToken[];\n readonly optional?: boolean;\n}\n\nexport interface ExtractionRules {\n readonly [role: string]: ExtractionRule;\n}\n\nexport interface ExtractionRule {\n readonly position?: number;\n readonly marker?: string;\n readonly markerAlternatives?: string[];\n readonly transform?: (raw: string) => SemanticValue;\n readonly default?: SemanticValue;\n readonly value?: string;\n readonly fromRole?: string;\n}\n\nexport interface PatternConstraints {\n readonly requiredRoles?: SemanticRole[];\n readonly forbiddenRoles?: SemanticRole[];\n readonly validPatientTypes?: Array<SelectorValue['selectorKind']>;\n readonly conflictsWith?: string[];\n}\n\nexport interface PatternMatchResult {\n readonly pattern: LanguagePattern;\n readonly captured: ReadonlyMap<SemanticRole, SemanticValue>;\n readonly consumedTokens: number;\n readonly confidence: number;\n}\n\nexport interface PatternMatchError {\n readonly message: string;\n readonly position: SourcePosition;\n readonly expectedPatterns?: string[];\n readonly partialMatch?: Partial<PatternMatchResult>;\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 — re-exported from @lokascript/intent\n */\n\nexport {\n toProtocolJSON,\n fromProtocolJSON,\n validateProtocolJSON,\n toEnvelopeJSON,\n fromEnvelopeJSON,\n isEnvelope,\n} from '@lokascript/intent';\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[] }> | 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 * Marker-keyword sets — mirror the runtime command parsers' skip lists so the\n * inferred roles point at the real value, not the literal marker word.\n */\nconst SCROLL_MARKERS: ReadonlySet<string> = new Set([\n 'to',\n 'of',\n 'the',\n 'top',\n 'bottom',\n 'middle',\n 'center',\n 'nearest',\n 'left',\n 'right',\n 'smoothly',\n 'instantly',\n]);\nconst URL_MARKERS: ReadonlySet<string> = new Set(['url']);\nconst PARTIALS_IN_MARKERS: ReadonlySet<string> = new Set(['partials', 'in']);\n\n/**\n * Return the first arg that isn't a marker identifier from the given set.\n * Identifier args carry the marker word in `name` (or `value` as a fallback).\n */\nfunction firstNonMarkerArg(args: INode[], markers: ReadonlySet<string>): INode | undefined {\n for (const a of args) {\n if (a.type === 'identifier') {\n const ident = a as { name?: unknown; value?: unknown };\n const word = typeof ident.name === 'string' ? ident.name : ident.value;\n if (typeof word === 'string' && markers.has(word)) continue;\n }\n return a;\n }\n return undefined;\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 // scroll [to] [position] target [smoothly|instantly] → destination=target\n case 'scroll': {\n const t = firstNonMarkerArg(args, SCROLL_MARKERS);\n if (t) roles.destination = convertValue(t);\n break;\n }\n\n // push|replace url <X> → patient=X\n case 'push':\n case 'replace': {\n const t = firstNonMarkerArg(args, URL_MARKERS);\n if (t) roles.patient = convertValue(t);\n break;\n }\n\n // process partials in <X> → patient=X\n case 'process': {\n const t = firstNonMarkerArg(args, PARTIALS_IN_MARKERS);\n if (t) roles.patient = convertValue(t);\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","convertCommand"]}
|