@lokascript/framework 3.1.1 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +186 -1
- package/dist/core/index.js +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/tokenization/index.js +1 -1
- package/dist/core/tokenization/index.js.map +1 -1
- package/dist/index.cjs +65 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +65 -23
- package/dist/index.js.map +1 -1
- package/dist/interfaces/value-extractor.d.ts.map +1 -1
- package/dist/ir/from-interchange.d.ts.map +1 -1
- package/dist/ir/index.js +61 -19
- package/dist/ir/index.js.map +1 -1
- package/dist/ir/to-runtime-ast.d.ts.map +1 -1
- package/dist/multilingual/index.js +1 -1
- package/dist/multilingual/index.js.map +1 -1
- package/dist/testing/index.js +8178 -8572
- package/dist/testing/index.js.map +1 -1
- package/package.json +5 -5
- package/src/core/tokenization/apostrophe-possessive.test.ts +12 -0
- package/src/interfaces/value-extractor.ts +5 -1
- package/src/ir/from-interchange.test.ts +16 -2
- package/src/ir/from-interchange.ts +17 -5
- package/src/ir/to-runtime-ast.test.ts +113 -0
- package/src/ir/to-runtime-ast.ts +82 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-extractor.d.ts","sourceRoot":"","sources":["../../src/interfaces/value-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAMrF;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAMD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAErD;;;;;;;;;;OAUG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;CACnE;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,QAAQ,CAAC,IAAI,oBAAoB;IAEjC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"value-extractor.d.ts","sourceRoot":"","sources":["../../src/interfaces/value-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -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;AAiLD;;;;;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
CHANGED
|
@@ -321,11 +321,18 @@ function convertRepeat(node) {
|
|
|
321
321
|
roles.condition = convertValue(node.whileCondition);
|
|
322
322
|
} else if (typeof node.untilEvent === "string") {
|
|
323
323
|
variant = "until";
|
|
324
|
-
roles.
|
|
324
|
+
roles.loopType = createLiteral("until-event");
|
|
325
|
+
roles.event = createLiteral(node.untilEvent);
|
|
326
|
+
if (node.untilEventTarget && typeof node.untilEventTarget === "object") {
|
|
327
|
+
roles.source = convertValue(node.untilEventTarget);
|
|
328
|
+
}
|
|
325
329
|
} else {
|
|
326
330
|
variant = "forever";
|
|
327
331
|
}
|
|
328
|
-
return createLoopNode("repeat", roles, variant, body);
|
|
332
|
+
return createLoopNode("repeat", roles, variant, body, void 0, indexNameOf(node));
|
|
333
|
+
}
|
|
334
|
+
function indexNameOf(node) {
|
|
335
|
+
return typeof node.indexName === "string" ? node.indexName : void 0;
|
|
329
336
|
}
|
|
330
337
|
function convertForEach(node) {
|
|
331
338
|
const bodyNodes = Array.isArray(node.body) ? node.body : [];
|
|
@@ -335,8 +342,7 @@ function convertForEach(node) {
|
|
|
335
342
|
roles.source = convertValue(node.collection);
|
|
336
343
|
}
|
|
337
344
|
const itemName = typeof node.itemName === "string" ? node.itemName : void 0;
|
|
338
|
-
|
|
339
|
-
return createLoopNode("repeat", roles, "for", body, itemName, indexName);
|
|
345
|
+
return createLoopNode("repeat", roles, "for", body, itemName, indexNameOf(node));
|
|
340
346
|
}
|
|
341
347
|
function convertWhile(node) {
|
|
342
348
|
const bodyNodes = Array.isArray(node.body) ? node.body : [];
|
|
@@ -345,7 +351,7 @@ function convertWhile(node) {
|
|
|
345
351
|
if (node.condition && typeof node.condition === "object") {
|
|
346
352
|
roles.condition = convertValue(node.condition);
|
|
347
353
|
}
|
|
348
|
-
return createLoopNode("repeat", roles, "while", body);
|
|
354
|
+
return createLoopNode("repeat", roles, "while", body, void 0, indexNameOf(node));
|
|
349
355
|
}
|
|
350
356
|
function convertValue(node) {
|
|
351
357
|
switch (node.type) {
|
|
@@ -672,28 +678,64 @@ function convertCommand2(node) {
|
|
|
672
678
|
roles
|
|
673
679
|
};
|
|
674
680
|
}
|
|
681
|
+
function block(nodes) {
|
|
682
|
+
return { type: "block", commands: (nodes ?? []).map(semanticNodeToRuntimeAST) };
|
|
683
|
+
}
|
|
675
684
|
function convertConditional(node) {
|
|
685
|
+
const name = node.action === "unless" ? "unless" : "if";
|
|
676
686
|
const conditionValue = node.roles.get("condition");
|
|
687
|
+
if (!conditionValue) return { type: "command", name, args: [] };
|
|
677
688
|
return {
|
|
678
689
|
type: "command",
|
|
679
|
-
name
|
|
680
|
-
args:
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
690
|
+
name,
|
|
691
|
+
args: [
|
|
692
|
+
semanticValueToAST(conditionValue),
|
|
693
|
+
block(node.thenBranch),
|
|
694
|
+
...node.elseBranch && node.elseBranch.length > 0 ? [block(node.elseBranch)] : []
|
|
695
|
+
]
|
|
684
696
|
};
|
|
685
697
|
}
|
|
698
|
+
var LOOP_FORMS = /* @__PURE__ */ new Set(["for", "times", "while", "until", "until-event", "forever"]);
|
|
699
|
+
function valueText(value) {
|
|
700
|
+
if (!value) return void 0;
|
|
701
|
+
if (value.type === "literal") return String(value.value);
|
|
702
|
+
if (value.type === "expression") return value.raw;
|
|
703
|
+
if (value.type === "reference" || value.type === "selector") return value.value;
|
|
704
|
+
return void 0;
|
|
705
|
+
}
|
|
686
706
|
function convertLoop(node) {
|
|
687
|
-
const
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
args: countValue ? [semanticValueToAST(countValue)] : [],
|
|
692
|
-
loopVariant: node.loopVariant ?? "forever",
|
|
693
|
-
body: (node.body ?? []).map(semanticNodeToRuntimeAST),
|
|
694
|
-
loopVariable: node.loopVariable,
|
|
695
|
-
indexVariable: node.indexVariable
|
|
707
|
+
const text = (value) => ({ type: "string", value });
|
|
708
|
+
const operand = (role) => {
|
|
709
|
+
const value = node.roles.get(role);
|
|
710
|
+
return value ? semanticValueToAST(value) : void 0;
|
|
696
711
|
};
|
|
712
|
+
const declared = valueText(node.roles.get("loopType"));
|
|
713
|
+
const form = node.action === "for" ? "for" : declared && LOOP_FORMS.has(declared) ? declared : node.loopVariant ?? "forever";
|
|
714
|
+
const modifiers = { loopType: text(form) };
|
|
715
|
+
const slot = (name, value) => {
|
|
716
|
+
if (value) modifiers[name] = value;
|
|
717
|
+
};
|
|
718
|
+
switch (form) {
|
|
719
|
+
case "for":
|
|
720
|
+
if (node.loopVariable) slot("for", text(node.loopVariable));
|
|
721
|
+
slot("in", operand("source"));
|
|
722
|
+
break;
|
|
723
|
+
case "times":
|
|
724
|
+
slot("times", operand("quantity") ?? operand("patient") ?? operand("count"));
|
|
725
|
+
break;
|
|
726
|
+
case "while":
|
|
727
|
+
case "until":
|
|
728
|
+
slot(form, operand("condition"));
|
|
729
|
+
break;
|
|
730
|
+
case "until-event": {
|
|
731
|
+
const event = valueText(node.roles.get("event"));
|
|
732
|
+
if (event) slot("event", text(event));
|
|
733
|
+
slot("from", operand("source"));
|
|
734
|
+
break;
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
if (node.indexVariable) slot("index", text(node.indexVariable));
|
|
738
|
+
return { type: "command", name: "repeat", args: [block(node.body)], modifiers };
|
|
697
739
|
}
|
|
698
740
|
function semanticValueToAST(value) {
|
|
699
741
|
switch (value.type) {
|
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[] }> | 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 // `repeat until event e from t`: the event and where it listens, as the\n // semantic parser holds them, plus the exact form `loopVariant` folds into\n // `until`. The event name was the CONDITION, an `until \"e\"` loop that a\n // truthy string ends at once.\n variant = 'until';\n roles.loopType = createLiteral('until-event');\n roles.event = createLiteral(node.untilEvent);\n if (node.untilEventTarget && typeof node.untilEventTarget === 'object') {\n roles.source = convertValue(node.untilEventTarget as INode);\n }\n } else {\n variant = 'forever';\n }\n\n return createLoopNode('repeat', roles, variant, body, undefined, indexNameOf(node));\n}\n\n/** `index i`, which every loop form can name. */\nfunction indexNameOf(node: INode): string | undefined {\n return typeof node.indexName === 'string' ? node.indexName : undefined;\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\n return createLoopNode('repeat', roles, 'for', body, itemName, indexNameOf(node));\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, undefined, indexNameOf(node));\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\n/** A body as core's parser holds one: a block of commands. */\nfunction block(nodes: readonly SemanticNode[] | undefined): RuntimeASTNode {\n return { type: 'block', commands: (nodes ?? []).map(semanticNodeToRuntimeAST) };\n}\n\n/**\n * An `if` as core's parser builds it: `args: [condition, then-block,\n * else-block?]`. This wrote the branches beside `args: [condition]`, so every\n * `if` through `evalLSE` threw \"if command requires \"then\" branch with\n * commands\".\n */\nfunction convertConditional(node: ConditionalSemanticNode): RuntimeASTNode {\n const name = node.action === 'unless' ? 'unless' : 'if';\n const conditionValue = node.roles.get('condition');\n // No condition is malformed: empty args make core say so.\n if (!conditionValue) return { type: 'command', name, args: [] };\n return {\n type: 'command',\n name,\n args: [\n semanticValueToAST(conditionValue),\n block(node.thenBranch),\n ...(node.elseBranch && node.elseBranch.length > 0 ? [block(node.elseBranch)] : []),\n ],\n };\n}\n\n/** The loop forms core's `repeat` runs: its parser's `loopType`. */\nconst LOOP_FORMS = new Set(['for', 'times', 'while', 'until', 'until-event', 'forever']);\n\n/** The text of a name-like value: a loop form, an event name. */\nfunction valueText(value: SemanticValue | undefined): string | undefined {\n if (!value) return undefined;\n if (value.type === 'literal') return String(value.value);\n if (value.type === 'expression') return value.raw;\n if (value.type === 'reference' || value.type === 'selector') return value.value;\n return undefined;\n}\n\n/**\n * A loop as core's parser builds it (Arc 3 step 3): the form in\n * `modifiers.loopType`, the operands in `for`/`in`, `times`, `while`/`until`,\n * `event`/`from` and `index`, the body the one positional block.\n *\n * This emitted `args: [count]` with the variant and body beside it, a shape\n * `repeat` has not read since the slot migration, so every loop through\n * `evalLSE` / `compileLSE` threw \"repeat command requires a loop type\". The\n * form comes from a `loopType` role when it names one, since it keeps the\n * exact form (`until-event`) that `loopVariant` folds into `until`.\n */\nfunction convertLoop(node: LoopSemanticNode): RuntimeASTNode {\n const text = (value: string): RuntimeASTNode => ({ type: 'string', value });\n const operand = (role: string): RuntimeASTNode | undefined => {\n const value = node.roles.get(role);\n return value ? semanticValueToAST(value) : undefined;\n };\n const declared = valueText(node.roles.get('loopType'));\n const form =\n node.action === 'for'\n ? 'for'\n : declared && LOOP_FORMS.has(declared)\n ? declared\n : (node.loopVariant ?? 'forever');\n\n const modifiers: Record<string, RuntimeASTNode> = { loopType: text(form) };\n const slot = (name: string, value: RuntimeASTNode | undefined) => {\n if (value) modifiers[name] = value;\n };\n switch (form) {\n case 'for':\n if (node.loopVariable) slot('for', text(node.loopVariable));\n slot('in', operand('source'));\n break;\n case 'times':\n // `patient` and `count` are what this read before the slot shape.\n slot('times', operand('quantity') ?? operand('patient') ?? operand('count'));\n break;\n case 'while':\n case 'until':\n slot(form, operand('condition'));\n break;\n case 'until-event': {\n const event = valueText(node.roles.get('event'));\n if (event) slot('event', text(event));\n slot('from', operand('source'));\n break;\n }\n }\n if (node.indexVariable) slot('index', text(node.indexVariable));\n\n return { type: 'command', name: 'repeat', args: [block(node.body)], modifiers };\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-runtime-ast.d.ts","sourceRoot":"","sources":["../../src/ir/to-runtime-ast.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAId,MAAM,eAAe,CAAC;AAMvB,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,iEAAiE;AACjE,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C;AAED,4DAA4D;AAC5D,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;CACjC;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAwB3E;
|
|
1
|
+
{"version":3,"file":"to-runtime-ast.d.ts","sourceRoot":"","sources":["../../src/ir/to-runtime-ast.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EAId,MAAM,eAAe,CAAC;AAMvB,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACjC;AAED,iEAAiE;AACjE,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACxD,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9C;AAED,4DAA4D;AAC5D,MAAM,WAAW,gBAAiB,SAAQ,cAAc;IACtD,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,cAAc,EAAE,CAAC;CACjC;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,YAAY,GAAG,cAAc,CAwB3E;AAqID;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,CA4CvE"}
|
|
@@ -5,7 +5,7 @@ var StringLiteralExtractor = class {
|
|
|
5
5
|
}
|
|
6
6
|
canExtract(input, position) {
|
|
7
7
|
const char = input[position];
|
|
8
|
-
if (char === "'" && position > 0 && /[\p{L}\p{N}_)\]]/u.test(input[position - 1])) {
|
|
8
|
+
if (char === "'" && position > 0 && /[\p{L}\p{M}\p{N}_)\]]/u.test(input[position - 1])) {
|
|
9
9
|
return false;
|
|
10
10
|
}
|
|
11
11
|
return char === '"' || char === "'" || char === "`" || char === "\u201C" || // Chinese double quote open "
|