react-agentic 0.0.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/parser/parser.ts","../src/parser/utils/project.ts","../src/parser/utils/jsx-traversal.ts","../src/parser/utils/text-extraction.ts","../src/parser/utils/spread-resolution.ts","../src/parser/utils/component-resolution.ts","../src/parser/utils/type-resolution.ts","../src/parser/utils/variable-extraction.ts","../src/parser/utils/index.ts","../src/parser/transformers/shared.ts","../src/parser/transformers/semantic.ts","../src/parser/transformers/control.ts","../src/parser/transformers/spawner.ts","../src/parser/transformers/variables.ts","../src/parser/transformers/state.ts","../src/parser/transformers/primitives.ts","../src/parser/transformers/markdown.ts","../src/parser/transformers/inline.ts","../src/parser/transformers/dispatch.ts","../src/parser/transformers/html.ts","../src/emitter/emitter.ts","../src/emitter/utils.ts","../src/emitter/settings.ts","../src/emitter/runtime-markdown-emitter.ts","../src/emitter/runtime-emitter.ts","../src/emitter/type-stripper.ts","../src/emitter/runtime-template.ts","../src/emitter/esbuild-bundler.ts","../src/parser/transformers/runtime-types.ts","../src/parser/transformers/runtime-var.ts","../src/parser/transformers/runtime-fn.ts","../src/parser/transformers/runtime-dispatch.ts","../src/parser/transformers/runtime-utils.ts","../src/parser/transformers/runtime-control.ts","../src/parser/transformers/runtime-call.ts","../src/parser/transformers/runtime-ask-user.ts","../src/parser/transformers/runtime-spawner.ts","../src/parser/transformers/runtime-component.ts","../src/parser/transformers/runtime-inline.ts","../src/parser/transformers/index.ts","../src/parser/transformers/document.ts","../src/cli/runtime-build.ts","../src/cli/errors.ts"],"sourcesContent":["/**\n * ts-morph Parser - TSX file parsing and JSX AST extraction\n *\n * Provides utilities for parsing TSX files and extracting JSX elements\n * for transformation into IR nodes.\n */\n\nimport {\n Project,\n SourceFile,\n ScriptTarget,\n ModuleKind,\n ts,\n Node,\n JsxElement,\n JsxSelfClosingElement,\n JsxOpeningElement,\n JsxFragment,\n JsxText,\n JsxExpression,\n ArrayLiteralExpression,\n JsxSpreadAttribute,\n ObjectLiteralExpression,\n SyntaxKind,\n InterfaceDeclaration,\n TemplateExpression,\n CallExpression,\n ArrowFunction,\n} from 'ts-morph';\n\nexport interface CreateProjectOptions {\n /**\n * Use in-memory filesystem (default: false)\n * Set to true for test scenarios where files don't exist on disk\n */\n inMemory?: boolean;\n}\n\n/**\n * Create a ts-morph Project configured for JSX parsing\n *\n * @param options.inMemory - Use in-memory filesystem (default: false)\n */\nexport function createProject(options: CreateProjectOptions = {}): Project {\n return new Project({\n compilerOptions: {\n jsx: ts.JsxEmit.Preserve,\n target: ScriptTarget.ESNext,\n module: ModuleKind.ESNext,\n },\n useInMemoryFileSystem: options.inMemory ?? false,\n });\n}\n\n/**\n * Add and parse a file from the filesystem\n */\nexport function parseFile(project: Project, filePath: string): SourceFile {\n return project.addSourceFileAtPath(filePath);\n}\n\n/**\n * Parse an in-memory TSX string\n */\nexport function parseSource(\n project: Project,\n source: string,\n fileName = 'source.tsx'\n): SourceFile {\n return project.createSourceFile(fileName, source, { overwrite: true });\n}\n\n// ============================================================================\n// JSX Traversal Utilities\n// ============================================================================\n\n/**\n * Get the element tag name from a JSX element or self-closing element\n */\nexport function getElementName(\n node: JsxElement | JsxSelfClosingElement\n): string {\n if (Node.isJsxElement(node)) {\n return node.getOpeningElement().getTagNameNode().getText();\n }\n return node.getTagNameNode().getText();\n}\n\n/**\n * JSX child node types\n */\nexport type JsxChild = JsxElement | JsxSelfClosingElement | JsxText | JsxExpression;\n\n/**\n * Get the JSX children of an element\n */\nexport function getJsxChildren(node: JsxElement): JsxChild[] {\n return node.getJsxChildren() as JsxChild[];\n}\n\n/**\n * Get the value of a JSX attribute by name\n *\n * Handles both string literals (attr=\"value\") and JSX expressions with\n * string literals (attr={\"value\"}).\n *\n * Returns undefined if attribute is missing or not a string.\n */\nexport function getAttributeValue(\n element: JsxOpeningElement | JsxSelfClosingElement,\n name: string\n): string | undefined {\n const attr = element.getAttribute(name);\n if (!attr || !Node.isJsxAttribute(attr)) {\n return undefined;\n }\n\n const init = attr.getInitializer();\n if (!init) {\n return undefined;\n }\n\n // String literal: attr=\"value\"\n if (Node.isStringLiteral(init)) {\n return init.getLiteralValue();\n }\n\n // JSX expression: attr={value} or attr={\"value\"}\n if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n return expr.getLiteralValue();\n }\n }\n\n return undefined;\n}\n\n/**\n * Known test helper function names from jsx.ts\n */\nconst TEST_HELPERS = new Set(['fileExists', 'dirExists', 'isEmpty', 'notEmpty', 'equals', 'and', 'or']);\n\n/**\n * Get the value of a test attribute, supporting both string literals\n * and test helper function calls like fileExists(varRef), isEmpty(varRef), etc.\n *\n * @param element - The JSX element to get the attribute from\n * @param name - The attribute name (typically 'test')\n * @param variables - Map of declared useVariable results for resolving identifiers\n * @returns The test expression string, or undefined if not found/invalid\n */\nexport function getTestAttributeValue(\n element: JsxOpeningElement | JsxSelfClosingElement,\n name: string,\n variables: Map<string, ExtractedVariable>\n): string | undefined {\n const attr = element.getAttribute(name);\n if (!attr || !Node.isJsxAttribute(attr)) {\n return undefined;\n }\n\n const init = attr.getInitializer();\n if (!init) {\n return undefined;\n }\n\n // String literal: attr=\"value\"\n if (Node.isStringLiteral(init)) {\n return init.getLiteralValue();\n }\n\n // JSX expression: attr={value}, attr={\"value\"}, or attr={helperFn(var)}\n if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (!expr) {\n return undefined;\n }\n\n // String literal inside expression: attr={\"value\"}\n if (Node.isStringLiteral(expr)) {\n return expr.getLiteralValue();\n }\n\n // Call expression: attr={fileExists(varRef)} or attr={equals(varRef, \"value\")}\n if (Node.isCallExpression(expr)) {\n return evaluateTestHelperCall(expr, variables);\n }\n }\n\n return undefined;\n}\n\n/**\n * ts-morph Node type alias for use in local function signatures\n */\ntype TsMorphNode = import('ts-morph').Node;\n\n/**\n * Evaluate a test helper function call at compile time.\n *\n * Supports:\n * - fileExists(varRef) -> [ -f $VAR_NAME ]\n * - dirExists(varRef) -> [ -d $VAR_NAME ]\n * - isEmpty(varRef) -> [ -z \"$VAR_NAME\" ]\n * - notEmpty(varRef) -> [ -n \"$VAR_NAME\" ]\n * - equals(varRef, \"value\") -> [ $VAR_NAME = value ]\n * - and(...tests) -> test1 && test2 && ...\n * - or(...tests) -> test1 || test2 || ...\n */\nfunction evaluateTestHelperCall(\n callExpr: CallExpression,\n variables: Map<string, ExtractedVariable>\n): string | undefined {\n const callee = callExpr.getExpression();\n if (!Node.isIdentifier(callee)) {\n return undefined;\n }\n\n const funcName = callee.getText();\n if (!TEST_HELPERS.has(funcName)) {\n return undefined;\n }\n\n const args = callExpr.getArguments();\n\n switch (funcName) {\n case 'fileExists': {\n const varName = resolveVariableArg(args[0], variables);\n return varName ? `[ -f $${varName} ]` : undefined;\n }\n case 'dirExists': {\n const varName = resolveVariableArg(args[0], variables);\n return varName ? `[ -d $${varName} ]` : undefined;\n }\n case 'isEmpty': {\n const varName = resolveVariableArg(args[0], variables);\n return varName ? `[ -z \"$${varName}\" ]` : undefined;\n }\n case 'notEmpty': {\n const varName = resolveVariableArg(args[0], variables);\n return varName ? `[ -n \"$${varName}\" ]` : undefined;\n }\n case 'equals': {\n const varName = resolveVariableArg(args[0], variables);\n const value = args[1] && Node.isStringLiteral(args[1]) ? args[1].getLiteralValue() : undefined;\n return varName && value ? `[ $${varName} = ${value} ]` : undefined;\n }\n case 'and': {\n const tests = args.map((arg: TsMorphNode) => evaluateTestArg(arg, variables)).filter((t: string | undefined): t is string => t !== undefined);\n return tests.length > 0 ? tests.join(' && ') : undefined;\n }\n case 'or': {\n const tests = args.map((arg: TsMorphNode) => evaluateTestArg(arg, variables)).filter((t: string | undefined): t is string => t !== undefined);\n return tests.length > 0 ? tests.join(' || ') : undefined;\n }\n default:\n return undefined;\n }\n}\n\n/**\n * Resolve a variable reference argument to its shell variable name.\n */\nfunction resolveVariableArg(\n arg: TsMorphNode | undefined,\n variables: Map<string, ExtractedVariable>\n): string | undefined {\n if (!arg || !Node.isIdentifier(arg)) {\n return undefined;\n }\n const variable = variables.get(arg.getText());\n return variable?.envName;\n}\n\n/**\n * Evaluate a test argument for and/or composition.\n * Handles both string literals and nested helper calls.\n */\nfunction evaluateTestArg(\n arg: TsMorphNode,\n variables: Map<string, ExtractedVariable>\n): string | undefined {\n if (Node.isStringLiteral(arg)) {\n return arg.getLiteralValue();\n }\n if (Node.isCallExpression(arg)) {\n return evaluateTestHelperCall(arg, variables);\n }\n return undefined;\n}\n\n/**\n * Find the root JSX element returned by the default export function\n *\n * Searches for a ReturnStatement containing JSX within the file.\n * Returns null if no JSX is found.\n */\nexport function findRootJsxElement(\n sourceFile: SourceFile\n): JsxElement | JsxSelfClosingElement | JsxFragment | null {\n let result: JsxElement | JsxSelfClosingElement | JsxFragment | null = null;\n\n sourceFile.forEachDescendant((node, traversal) => {\n // Look for return statements\n if (Node.isReturnStatement(node)) {\n const expr = node.getExpression();\n if (expr) {\n // Check if the return expression is JSX\n if (Node.isJsxElement(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isJsxSelfClosingElement(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isJsxFragment(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isParenthesizedExpression(expr)) {\n // Handle parenthesized JSX: return (<div>...</div>)\n const inner = expr.getExpression();\n if (Node.isJsxElement(inner)) {\n result = inner;\n traversal.stop();\n } else if (Node.isJsxSelfClosingElement(inner)) {\n result = inner;\n traversal.stop();\n } else if (Node.isJsxFragment(inner)) {\n result = inner;\n traversal.stop();\n }\n }\n }\n }\n });\n\n return result;\n}\n\n// ============================================================================\n// Text Extraction Utilities\n// ============================================================================\n\n/**\n * Check if a JsxText node contains only whitespace (formatting between elements)\n */\nexport function isWhitespaceOnlyText(node: JsxText): boolean {\n return node.containsOnlyTriviaWhiteSpaces();\n}\n\n/**\n * Normalize whitespace in text content\n *\n * Collapses multiple spaces/newlines to a single space and trims edges.\n */\nexport function normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Normalize whitespace for inline text content\n *\n * Collapses multiple spaces/newlines to a single space but preserves\n * leading/trailing spaces (they separate inline elements).\n */\nexport function normalizeInlineWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ');\n}\n\n/**\n * Extract text content from a JsxText node\n *\n * Returns null for whitespace-only nodes (formatting between elements).\n * Otherwise returns normalized text content.\n */\nexport function extractText(node: JsxText): string | null {\n if (isWhitespaceOnlyText(node)) {\n return null;\n }\n const normalized = normalizeWhitespace(node.getText());\n return normalized || null;\n}\n\n/**\n * Extract text content from a JsxText node for inline context\n *\n * For inline context, we need to preserve whitespace that separates\n * inline elements. Only skip nodes that are purely formatting whitespace\n * (newlines + indentation between block elements).\n *\n * Preserves leading/trailing spaces as they separate inline elements.\n */\nexport function extractInlineText(node: JsxText): string | null {\n const raw = node.getText();\n\n // Skip purely structural whitespace (newlines with optional indentation)\n // These are formatting between block-level elements\n if (/^\\s*\\n\\s*$/.test(raw)) {\n return null;\n }\n\n // Normalize multiple whitespace to single space, preserving edges\n const normalized = normalizeInlineWhitespace(raw);\n return normalized || null;\n}\n\n/**\n * Get the value of a JSX array attribute by name\n *\n * Handles JSX expressions containing array literals: attr={[\"a\", \"b\"]}\n * Returns undefined if attribute is missing or not a string array.\n */\nexport function getArrayAttributeValue(\n element: JsxOpeningElement | JsxSelfClosingElement,\n name: string\n): string[] | undefined {\n const attr = element.getAttribute(name);\n if (!attr || !Node.isJsxAttribute(attr)) {\n return undefined;\n }\n\n const init = attr.getInitializer();\n if (!init || !Node.isJsxExpression(init)) {\n return undefined;\n }\n\n const expr = init.getExpression();\n if (!expr || !Node.isArrayLiteralExpression(expr)) {\n return undefined;\n }\n\n const elements: string[] = [];\n for (const el of expr.getElements()) {\n if (Node.isStringLiteral(el)) {\n elements.push(el.getLiteralValue());\n }\n }\n return elements.length > 0 ? elements : undefined;\n}\n\n// ============================================================================\n// Spread Attribute Resolution\n// ============================================================================\n\n/**\n * Extract property values from an ObjectLiteralExpression\n *\n * Handles StringLiteral, ArrayLiteralExpression, NumericLiteral, TrueKeyword, FalseKeyword.\n * Returns a Record of property names to their values.\n */\nexport function extractObjectLiteralProps(\n objLiteral: ObjectLiteralExpression\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const prop of objLiteral.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const name = prop.getName();\n const initializer = prop.getInitializer();\n\n if (!initializer) continue;\n\n if (Node.isStringLiteral(initializer)) {\n result[name] = initializer.getLiteralValue();\n } else if (Node.isArrayLiteralExpression(initializer)) {\n // Reuse array extraction pattern\n const elements: string[] = [];\n for (const el of initializer.getElements()) {\n if (Node.isStringLiteral(el)) {\n elements.push(el.getLiteralValue());\n }\n }\n if (elements.length > 0) {\n result[name] = elements;\n }\n } else if (Node.isNumericLiteral(initializer)) {\n result[name] = initializer.getLiteralValue();\n } else if (initializer.getKind() === SyntaxKind.TrueKeyword) {\n result[name] = true;\n } else if (initializer.getKind() === SyntaxKind.FalseKeyword) {\n result[name] = false;\n }\n // Other types (nested objects, functions) are not supported\n }\n // ShorthandPropertyAssignment and SpreadAssignment not supported\n }\n\n return result;\n}\n\n/**\n * Resolve a JsxSpreadAttribute to its object literal values\n *\n * Only supports simple identifiers referencing object literals:\n * const props = { name: \"x\", desc: \"y\" };\n * <Command {...props} />\n *\n * Throws for:\n * - Non-identifier expressions: {...getProps()}\n * - Non-object-literal sources: const props = someFunc();\n */\nexport function resolveSpreadAttribute(\n spreadAttr: JsxSpreadAttribute\n): Record<string, unknown> {\n const expression = spreadAttr.getExpression();\n\n // Only handle simple identifiers: {...props}\n if (!Node.isIdentifier(expression)) {\n throw new Error('Spread expressions must be simple identifiers');\n }\n\n // Get the symbol for the identifier\n const symbol = expression.getSymbol();\n if (!symbol) {\n throw new Error(`Cannot resolve '${expression.getText()}'`);\n }\n\n // Get the declaration (variable declaration)\n const declarations = symbol.getDeclarations();\n const varDecl = declarations?.find(d => Node.isVariableDeclaration(d));\n if (!varDecl || !Node.isVariableDeclaration(varDecl)) {\n throw new Error('Spread source must be a variable declaration');\n }\n\n // Get the initializer (object literal)\n const initializer = varDecl.getInitializer();\n if (!initializer || !Node.isObjectLiteralExpression(initializer)) {\n throw new Error('Spread source must be an object literal');\n }\n\n // Extract properties\n return extractObjectLiteralProps(initializer);\n}\n\n// ============================================================================\n// Component Import Resolution\n// ============================================================================\n\n/**\n * Result of resolving a component import\n */\nexport interface ResolvedComponent {\n jsx: JsxElement | JsxSelfClosingElement | JsxFragment;\n sourceFile: SourceFile;\n visitedPaths: Set<string>;\n}\n\n/**\n * Resolve a component import and extract its JSX\n *\n * Follows import declarations to find the component's source file,\n * then extracts the JSX returned by the component function.\n *\n * @param componentName - Name of the component to resolve\n * @param sourceFile - Source file containing the import\n * @param visitedPaths - Set of already visited file paths (for circular detection)\n * @throws Error if component not imported, not exported, circular import detected,\n * or import is not relative\n */\nexport function resolveComponentImport(\n componentName: string,\n sourceFile: SourceFile,\n visitedPaths?: Set<string>\n): ResolvedComponent {\n // Initialize visitedPaths if not provided\n const visited = visitedPaths ?? new Set<string>();\n\n // Add current file to visited paths\n const currentPath = sourceFile.getFilePath();\n visited.add(currentPath);\n\n // Find import declaration for this component\n const importDecl = sourceFile.getImportDeclaration((decl) => {\n const namedImports = decl.getNamedImports();\n return namedImports.some((ni) => ni.getName() === componentName);\n });\n\n if (!importDecl) {\n throw new Error(`Component '${componentName}' not imported`);\n }\n\n // Validate module specifier is relative import\n const specifier = importDecl.getModuleSpecifierValue();\n if (!specifier.startsWith('.')) {\n throw new Error(\n `Only relative imports supported for components: '${specifier}'`\n );\n }\n\n // Resolve to source file\n const componentSourceFile = importDecl.getModuleSpecifierSourceFile();\n if (!componentSourceFile) {\n throw new Error(`Cannot resolve import for '${componentName}'`);\n }\n\n // Check for circular import\n const componentPath = componentSourceFile.getFilePath();\n if (visited.has(componentPath)) {\n throw new Error(`Circular import detected: ${componentName}`);\n }\n\n // Find the exported component declaration\n const exportedDecls = componentSourceFile.getExportedDeclarations();\n const componentDecls = exportedDecls.get(componentName);\n\n if (!componentDecls || componentDecls.length === 0) {\n throw new Error(`Component '${componentName}' not exported`);\n }\n\n // Extract JSX from component function\n const jsx = extractJsxFromComponent(componentDecls[0]);\n if (!jsx) {\n throw new Error(`Component '${componentName}' does not return JSX`);\n }\n\n return {\n jsx,\n sourceFile: componentSourceFile,\n visitedPaths: visited,\n };\n}\n\n/**\n * Extract the JSX returned by a component function\n *\n * Handles:\n * - Function declarations: function Foo() { return <div />; }\n * - Arrow functions: const Foo = () => <div />;\n * - Arrow functions with body: const Foo = () => { return <div />; };\n *\n * @param decl - The component's declaration node\n * @returns The JSX element/fragment returned, or null if not found\n */\n/**\n * Extract generic type arguments from a JSX element\n *\n * For <SpawnAgent<ResearcherInput>> returns ['ResearcherInput']\n * For <Agent<MyInput>> returns ['MyInput']\n * Returns undefined if no type arguments present\n *\n * Uses ts-morph's getDescendantsOfKind to find TypeReference nodes within the\n * opening element's tag, which is where JSX type arguments are attached.\n */\nexport function extractTypeArguments(\n element: JsxElement | JsxSelfClosingElement\n): string[] | undefined {\n // Get the opening element (where generics are attached in JSX)\n const openingElement = Node.isJsxElement(element)\n ? element.getOpeningElement()\n : element;\n\n // Get all TypeReference descendants of the opening tag\n // In JSX, type arguments appear as TypeReference children of the tag name\n const typeRefNodes = openingElement.getDescendantsOfKind(SyntaxKind.TypeReference);\n\n if (typeRefNodes.length === 0) {\n return undefined;\n }\n\n // Extract the type name text from each TypeReference\n return typeRefNodes.map(node => node.getText());\n}\n\nexport function extractJsxFromComponent(\n decl: Node\n): JsxElement | JsxSelfClosingElement | JsxFragment | null {\n let functionBody: Node | undefined;\n\n if (Node.isFunctionDeclaration(decl)) {\n functionBody = decl.getBody();\n } else if (Node.isVariableDeclaration(decl)) {\n const init = decl.getInitializer();\n if (Node.isArrowFunction(init) || Node.isFunctionExpression(init)) {\n // Check for concise body (arrow function returning JSX directly)\n const body = init.getBody();\n if (Node.isJsxElement(body)) {\n return body;\n } else if (Node.isJsxSelfClosingElement(body)) {\n return body;\n } else if (Node.isJsxFragment(body)) {\n return body;\n } else if (Node.isParenthesizedExpression(body)) {\n const inner = body.getExpression();\n if (Node.isJsxElement(inner)) {\n return inner;\n } else if (Node.isJsxSelfClosingElement(inner)) {\n return inner;\n } else if (Node.isJsxFragment(inner)) {\n return inner;\n }\n }\n functionBody = body;\n }\n }\n\n if (!functionBody) return null;\n\n // Find return statement with JSX\n let result: JsxElement | JsxSelfClosingElement | JsxFragment | null = null;\n functionBody.forEachDescendant((node, traversal) => {\n if (Node.isReturnStatement(node)) {\n const expr = node.getExpression();\n if (Node.isJsxElement(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isJsxSelfClosingElement(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isJsxFragment(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isParenthesizedExpression(expr)) {\n const inner = expr.getExpression();\n if (Node.isJsxElement(inner)) {\n result = inner;\n traversal.stop();\n } else if (Node.isJsxSelfClosingElement(inner)) {\n result = inner;\n traversal.stop();\n } else if (Node.isJsxFragment(inner)) {\n result = inner;\n traversal.stop();\n }\n }\n }\n });\n\n return result;\n}\n\n// ============================================================================\n// Cross-File Type Resolution Utilities\n// ============================================================================\n\n/**\n * Result of resolving a type import\n */\nexport interface ResolvedType {\n sourceFile: SourceFile;\n interfaceName: string;\n interface: InterfaceDeclaration;\n}\n\n/**\n * Resolve a type name to its interface declaration\n * Follows import declarations to find the source file and interface\n *\n * @param typeName - Name of the type to resolve (e.g., 'ResearcherInput')\n * @param sourceFile - Source file containing the import\n * @returns ResolvedType with source file and interface, or undefined if not found\n */\nexport function resolveTypeImport(\n typeName: string,\n sourceFile: SourceFile\n): ResolvedType | undefined {\n // Check if type is defined locally first\n const localInterface = sourceFile.getInterface(typeName);\n if (localInterface) {\n return {\n sourceFile,\n interfaceName: typeName,\n interface: localInterface,\n };\n }\n\n // Find import declaration for this type\n for (const importDecl of sourceFile.getImportDeclarations()) {\n // Check named imports: import { TypeName } from '...'\n for (const namedImport of importDecl.getNamedImports()) {\n if (namedImport.getName() === typeName) {\n const resolved = importDecl.getModuleSpecifierSourceFile();\n if (!resolved) {\n return undefined;\n }\n\n // Handle aliased imports: import { X as Y } from '...'\n const originalName = namedImport.getAliasNode()?.getText() ?? typeName;\n\n // Get the interface from the resolved file\n const iface = resolved.getInterface(originalName);\n if (!iface) {\n // Try exported declarations (for re-exports)\n const exported = resolved.getExportedDeclarations().get(originalName);\n const exportedIface = exported?.find(d => Node.isInterfaceDeclaration(d));\n if (exportedIface && Node.isInterfaceDeclaration(exportedIface)) {\n return {\n sourceFile: resolved,\n interfaceName: originalName,\n interface: exportedIface,\n };\n }\n return undefined;\n }\n\n return {\n sourceFile: resolved,\n interfaceName: originalName,\n interface: iface,\n };\n }\n }\n\n // Check type-only imports: import type { TypeName } from '...'\n if (importDecl.isTypeOnly()) {\n for (const namedImport of importDecl.getNamedImports()) {\n if (namedImport.getName() === typeName) {\n const resolved = importDecl.getModuleSpecifierSourceFile();\n if (!resolved) {\n return undefined;\n }\n\n const originalName = namedImport.getAliasNode()?.getText() ?? typeName;\n const iface = resolved.getInterface(originalName);\n if (iface) {\n return {\n sourceFile: resolved,\n interfaceName: originalName,\n interface: iface,\n };\n }\n }\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Property information extracted from an interface\n */\nexport interface InterfaceProperty {\n name: string;\n required: boolean;\n type: string;\n}\n\n/**\n * Extract property information from an interface\n *\n * @param iface - Interface declaration to extract from\n * @returns Array of property information\n */\nexport function extractInterfaceProperties(\n iface: InterfaceDeclaration\n): InterfaceProperty[] {\n const properties: InterfaceProperty[] = [];\n\n for (const prop of iface.getProperties()) {\n properties.push({\n name: prop.getName(),\n required: !prop.hasQuestionToken(),\n type: prop.getType().getText(),\n });\n }\n\n return properties;\n}\n\n/**\n * Extract {placeholder} patterns from a prompt string\n *\n * @param prompt - Prompt string with {variable} placeholders\n * @returns Set of placeholder names (without braces)\n */\nexport function extractPromptPlaceholders(prompt: string): Set<string> {\n const matches = prompt.matchAll(/\\{(\\w+)\\}/g);\n return new Set([...matches].map(m => m[1]));\n}\n\n// ============================================================================\n// Variable Declaration Extraction (useVariable hook)\n// ============================================================================\n\n/**\n * Extracted variable information from useVariable() call\n */\nexport interface ExtractedVariable {\n /** Local const name (e.g., \"phaseDir\") */\n localName: string;\n /** Shell variable name (e.g., \"PHASE_DIR\") */\n envName: string;\n}\n\n/**\n * Extract all useVariable() and defineVars() declarations from a source file\n *\n * Finds patterns like:\n * const phaseDir = useVariable(\"PHASE_DIR\");\n * const vars = defineVars({ MODEL_PROFILE: { type: 'string' } });\n *\n * For defineVars, each property becomes a separate entry:\n * vars.MODEL_PROFILE -> { localName: 'vars.MODEL_PROFILE', envName: 'MODEL_PROFILE' }\n *\n * @param sourceFile - Source file to extract from\n * @returns Map from local variable name to ExtractedVariable info\n */\nexport function extractVariableDeclarations(\n sourceFile: SourceFile\n): Map<string, ExtractedVariable> {\n const result = new Map<string, ExtractedVariable>();\n\n // Find all variable declarations\n sourceFile.forEachDescendant((node) => {\n if (!Node.isVariableDeclaration(node)) return;\n\n const initializer = node.getInitializer();\n if (!initializer || !Node.isCallExpression(initializer)) return;\n\n const callExpr = initializer.getExpression();\n if (!Node.isIdentifier(callExpr)) return;\n\n const funcName = callExpr.getText();\n\n // Handle useVariable() call\n if (funcName === 'useVariable') {\n const args = initializer.getArguments();\n if (args.length < 1) return;\n\n // First arg: string literal for env name\n const firstArg = args[0];\n if (!Node.isStringLiteral(firstArg)) return;\n const envName = firstArg.getLiteralValue();\n\n // Get local variable name\n const localName = node.getName();\n\n result.set(localName, {\n localName,\n envName,\n });\n }\n\n // Handle defineVars() call\n if (funcName === 'defineVars') {\n const args = initializer.getArguments();\n if (args.length < 1) return;\n\n const schemaArg = args[0];\n if (!Node.isObjectLiteralExpression(schemaArg)) return;\n\n // Get the variable name (e.g., \"vars\")\n const varName = node.getName();\n\n // Extract each property from the schema\n for (const prop of schemaArg.getProperties()) {\n if (!Node.isPropertyAssignment(prop)) continue;\n\n // Get property name (e.g., \"MODEL_PROFILE\")\n const propName = prop.getName();\n\n // Create entry like \"vars.MODEL_PROFILE\" -> \"MODEL_PROFILE\"\n const localName = `${varName}.${propName}`;\n result.set(localName, {\n localName,\n envName: propName,\n });\n }\n }\n });\n\n return result;\n}\n\n\n// ============================================================================\n// SpawnAgent Input Utilities\n// ============================================================================\n\nimport type { StateSchema, StateSchemaField } from '../ir/nodes.js';\nimport type { InputProperty, InputValue } from '../ir/runtime-nodes.js';\n\n/**\n * Check if an identifier references a useVariable result\n *\n * @param identifier - The identifier node to check\n * @param variables - Map of declared useVariable results\n * @returns true if identifier references a known useVariable\n */\nexport function isVariableRef(\n identifier: string,\n variables: Map<string, ExtractedVariable>\n): boolean {\n return variables.has(identifier);\n}\n\n/**\n * Extract SpawnAgent input object literal properties\n *\n * Handles property values:\n * - String literal: { propName: \"value\" } -> { type: 'string', value: str }\n * - {placeholder} pattern: { propName: \"{var}\" } -> { type: 'placeholder', name: var }\n * - Identifier referencing variable: { propName: varRef } -> { type: 'variable', name: envName }\n *\n * @param objLiteral - The ObjectLiteralExpression from JSX input prop\n * @param variables - Map of declared useVariable results\n * @returns Array of InputProperty with proper InputValue types\n */\nexport function extractInputObjectLiteral(\n objLiteral: ObjectLiteralExpression,\n variables: Map<string, ExtractedVariable>\n): InputProperty[] {\n const properties: InputProperty[] = [];\n\n for (const prop of objLiteral.getProperties()) {\n if (!Node.isPropertyAssignment(prop)) continue;\n\n const name = prop.getName();\n const initializer = prop.getInitializer();\n if (!initializer) continue;\n\n let value: InputValue;\n\n if (Node.isStringLiteral(initializer)) {\n const strValue = initializer.getLiteralValue();\n value = { type: 'string', value: strValue };\n } else if (Node.isNoSubstitutionTemplateLiteral(initializer)) {\n const strValue = initializer.getLiteralValue();\n value = { type: 'string', value: strValue };\n } else if (Node.isIdentifier(initializer)) {\n // Identifier referencing a variable - treat as string\n // V3 RuntimeVar references are handled by v3-spawner.ts using parseRuntimeVarRef\n const varName = initializer.getText();\n value = { type: 'string', value: varName };\n } else {\n // Unsupported initializer type - skip this property\n continue;\n }\n\n properties.push({ name, value });\n }\n\n return properties;\n}\n\n// ============================================================================\n// State Schema Extraction\n// ============================================================================\n\n/**\n * Map TypeScript type to SQL type\n */\nfunction mapTsTypeToSql(tsType: string): 'TEXT' | 'INTEGER' {\n switch (tsType) {\n case 'number':\n return 'INTEGER';\n case 'boolean':\n return 'INTEGER'; // 0/1\n default:\n return 'TEXT'; // string, Date, enums, etc.\n }\n}\n\n/**\n * Get default value for a type\n */\nfunction getDefaultValue(tsType: string, sqlType: 'TEXT' | 'INTEGER'): string {\n if (sqlType === 'INTEGER') {\n return '0';\n }\n return ''; // Empty string for TEXT\n}\n\n/**\n * Extract enum values from union type\n * 'major' | 'minor' | 'patch' -> ['major', 'minor', 'patch']\n */\nfunction extractEnumValues(typeText: string): string[] | undefined {\n // Match pattern like \"'value1' | 'value2' | 'value3'\"\n const matches = typeText.match(/'([^']+)'/g);\n if (matches && matches.length > 1) {\n return matches.map(m => m.replace(/'/g, ''));\n }\n return undefined;\n}\n\n/**\n * Flatten interface properties into schema fields\n * Handles nested objects with underscore separation\n *\n * @param sourceFile - Source file containing the interface\n * @param interfaceName - Name of the interface to extract\n */\nexport function extractStateSchema(\n sourceFile: SourceFile,\n interfaceName: string\n): StateSchema | undefined {\n const fields: StateSchemaField[] = [];\n\n // Find the interface declaration\n const interfaceDecl = sourceFile.getInterface(interfaceName);\n if (!interfaceDecl) {\n return undefined;\n }\n\n // Recursive helper to flatten nested properties\n function processProperties(\n properties: ReturnType<InterfaceDeclaration['getProperties']>,\n prefix: string = ''\n ): void {\n for (const prop of properties) {\n const propName = prop.getName();\n const typeNode = prop.getTypeNode();\n const fullName = prefix ? `${prefix}_${propName}` : propName;\n\n if (!typeNode) continue;\n\n const typeText = typeNode.getText();\n\n // Check if this is a nested object type (TypeLiteral or interface reference)\n if (Node.isTypeLiteral(typeNode)) {\n // Inline object type: { debug: boolean; timeout: number; }\n const nestedProps = typeNode.getProperties();\n // Process nested properties with updated prefix\n for (const nestedProp of nestedProps) {\n const nestedName = nestedProp.getName();\n const nestedType = nestedProp.getTypeNode();\n if (!nestedType) continue;\n\n const nestedTypeText = nestedType.getText();\n const nestedFullName = `${fullName}_${nestedName}`;\n\n // For now, only go one level deep (can extend later)\n const tsType = nestedTypeText.includes('|') ? 'string' : nestedTypeText;\n const sqlType = mapTsTypeToSql(tsType);\n const enumValues = extractEnumValues(nestedTypeText);\n\n fields.push({\n name: nestedFullName,\n tsType,\n sqlType,\n defaultValue: getDefaultValue(tsType, sqlType),\n enumValues\n });\n }\n } else {\n // Simple type\n const tsType = typeText.includes('|') ? 'string' : typeText;\n const sqlType = mapTsTypeToSql(tsType);\n const enumValues = extractEnumValues(typeText);\n\n fields.push({\n name: fullName,\n tsType,\n sqlType,\n defaultValue: getDefaultValue(tsType, sqlType),\n enumValues\n });\n }\n }\n }\n\n processProperties(interfaceDecl.getProperties());\n\n return {\n interfaceName,\n fields\n };\n}\n\n/**\n * Extract $variable arguments from SQL template\n * Returns unique argument names without the $ prefix\n */\nexport function extractSqlArguments(sqlTemplate: string): string[] {\n const regex = /\\$([a-z_][a-z0-9_]*)/gi;\n const args = new Set<string>();\n let match;\n while ((match = regex.exec(sqlTemplate)) !== null) {\n args.add(match[1].toLowerCase());\n }\n return Array.from(args);\n}\n\n// ============================================================================\n// Render Props Pattern Detection\n// ============================================================================\n\n/**\n * Result of analyzing JSX children for render props pattern\n */\nexport interface RenderPropsInfo {\n /** True if children is a single arrow function */\n isRenderProps: boolean;\n /** Parameter name used in arrow function (e.g., 'ctx') */\n paramName?: string;\n /** The arrow function AST node */\n arrowFunction?: ArrowFunction;\n}\n\n/**\n * Analyze JSX element children for render props pattern\n *\n * Detects when children is a single arrow function: {(ctx) => ...}\n * Returns info about the arrow function for transformer use.\n *\n * @param element - JSX element to analyze\n * @returns RenderPropsInfo with detection results\n */\nexport function analyzeRenderPropsChildren(\n element: JsxElement\n): RenderPropsInfo {\n const children = element.getJsxChildren();\n\n // Filter out whitespace-only text nodes\n const nonWhitespace = children.filter(child => {\n if (Node.isJsxText(child)) {\n return child.getText().trim().length > 0;\n }\n return true;\n });\n\n // Must have exactly one child that's a JSX expression\n if (nonWhitespace.length !== 1) {\n return { isRenderProps: false };\n }\n\n const child = nonWhitespace[0];\n if (!Node.isJsxExpression(child)) {\n return { isRenderProps: false };\n }\n\n const expr = child.getExpression();\n if (!expr || !Node.isArrowFunction(expr)) {\n return { isRenderProps: false };\n }\n\n // Extract parameter (zero or one parameter supported)\n const params = expr.getParameters();\n if (params.length > 1) {\n return { isRenderProps: false };\n }\n\n return {\n isRenderProps: true,\n paramName: params.length > 0 ? params[0].getName() : undefined,\n arrowFunction: expr,\n };\n}\n","/**\n * ts-morph Project creation and file parsing utilities\n */\n\nimport {\n Project,\n SourceFile,\n ScriptTarget,\n ModuleKind,\n ts,\n} from 'ts-morph';\n\nexport interface CreateProjectOptions {\n /**\n * Use in-memory filesystem (default: false)\n * Set to true for test scenarios where files don't exist on disk\n */\n inMemory?: boolean;\n}\n\n/**\n * Create a ts-morph Project configured for JSX parsing\n *\n * @param options.inMemory - Use in-memory filesystem (default: false)\n */\nexport function createProject(options: CreateProjectOptions = {}): Project {\n return new Project({\n compilerOptions: {\n jsx: ts.JsxEmit.Preserve,\n target: ScriptTarget.ESNext,\n module: ModuleKind.ESNext,\n },\n useInMemoryFileSystem: options.inMemory ?? false,\n });\n}\n\n/**\n * Add and parse a file from the filesystem\n */\nexport function parseFile(project: Project, filePath: string): SourceFile {\n return project.addSourceFileAtPath(filePath);\n}\n\n/**\n * Parse an in-memory TSX string\n */\nexport function parseSource(\n project: Project,\n source: string,\n fileName = 'source.tsx'\n): SourceFile {\n return project.createSourceFile(fileName, source, { overwrite: true });\n}\n","/**\n * JSX traversal and attribute extraction utilities\n */\n\nimport {\n Node,\n JsxElement,\n JsxSelfClosingElement,\n JsxOpeningElement,\n JsxFragment,\n JsxText,\n JsxExpression,\n ArrayLiteralExpression,\n CallExpression,\n SourceFile,\n} from 'ts-morph';\n\n/**\n * Forward reference for ExtractedVariable type (defined in variable-extraction.ts)\n */\ninterface ExtractedVariable {\n localName: string;\n envName: string;\n}\n\n/**\n * Get the element tag name from a JSX element or self-closing element\n */\nexport function getElementName(\n node: JsxElement | JsxSelfClosingElement\n): string {\n if (Node.isJsxElement(node)) {\n return node.getOpeningElement().getTagNameNode().getText();\n }\n return node.getTagNameNode().getText();\n}\n\n/**\n * JSX child node types\n */\nexport type JsxChild = JsxElement | JsxSelfClosingElement | JsxText | JsxExpression;\n\n/**\n * Get the JSX children of an element\n */\nexport function getJsxChildren(node: JsxElement): JsxChild[] {\n return node.getJsxChildren() as JsxChild[];\n}\n\n/**\n * Get the value of a JSX attribute by name\n *\n * Handles both string literals (attr=\"value\") and JSX expressions with\n * string literals (attr={\"value\"}).\n *\n * Returns undefined if attribute is missing or not a string.\n */\nexport function getAttributeValue(\n element: JsxOpeningElement | JsxSelfClosingElement,\n name: string\n): string | undefined {\n const attr = element.getAttribute(name);\n if (!attr || !Node.isJsxAttribute(attr)) {\n return undefined;\n }\n\n const init = attr.getInitializer();\n if (!init) {\n return undefined;\n }\n\n // String literal: attr=\"value\"\n if (Node.isStringLiteral(init)) {\n return init.getLiteralValue();\n }\n\n // JSX expression: attr={value} or attr={\"value\"}\n if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n return expr.getLiteralValue();\n }\n }\n\n return undefined;\n}\n\n/**\n * Known test helper function names from jsx.ts\n */\nconst TEST_HELPERS = new Set(['fileExists', 'dirExists', 'isEmpty', 'notEmpty', 'equals', 'and', 'or']);\n\n/**\n * Get the value of a test attribute, supporting both string literals\n * and test helper function calls like fileExists(varRef), isEmpty(varRef), etc.\n *\n * @param element - The JSX element to get the attribute from\n * @param name - The attribute name (typically 'test')\n * @param variables - Map of declared useVariable results for resolving identifiers\n * @returns The test expression string, or undefined if not found/invalid\n */\nexport function getTestAttributeValue(\n element: JsxOpeningElement | JsxSelfClosingElement,\n name: string,\n variables: Map<string, ExtractedVariable>\n): string | undefined {\n const attr = element.getAttribute(name);\n if (!attr || !Node.isJsxAttribute(attr)) {\n return undefined;\n }\n\n const init = attr.getInitializer();\n if (!init) {\n return undefined;\n }\n\n // String literal: attr=\"value\"\n if (Node.isStringLiteral(init)) {\n return init.getLiteralValue();\n }\n\n // JSX expression: attr={value}, attr={\"value\"}, or attr={helperFn(var)}\n if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (!expr) {\n return undefined;\n }\n\n // String literal inside expression: attr={\"value\"}\n if (Node.isStringLiteral(expr)) {\n return expr.getLiteralValue();\n }\n\n // Call expression: attr={fileExists(varRef)} or attr={equals(varRef, \"value\")}\n if (Node.isCallExpression(expr)) {\n return evaluateTestHelperCall(expr, variables);\n }\n }\n\n return undefined;\n}\n\n/**\n * ts-morph Node type alias for use in local function signatures\n */\ntype TsMorphNode = import('ts-morph').Node;\n\n/**\n * Evaluate a test helper function call at compile time.\n *\n * Supports:\n * - fileExists(varRef) -> [ -f $VAR_NAME ]\n * - dirExists(varRef) -> [ -d $VAR_NAME ]\n * - isEmpty(varRef) -> [ -z \"$VAR_NAME\" ]\n * - notEmpty(varRef) -> [ -n \"$VAR_NAME\" ]\n * - equals(varRef, \"value\") -> [ $VAR_NAME = value ]\n * - and(...tests) -> test1 && test2 && ...\n * - or(...tests) -> test1 || test2 || ...\n */\nfunction evaluateTestHelperCall(\n callExpr: CallExpression,\n variables: Map<string, ExtractedVariable>\n): string | undefined {\n const callee = callExpr.getExpression();\n if (!Node.isIdentifier(callee)) {\n return undefined;\n }\n\n const funcName = callee.getText();\n if (!TEST_HELPERS.has(funcName)) {\n return undefined;\n }\n\n const args = callExpr.getArguments();\n\n switch (funcName) {\n case 'fileExists': {\n const varName = resolveVariableArg(args[0], variables);\n return varName ? `[ -f $${varName} ]` : undefined;\n }\n case 'dirExists': {\n const varName = resolveVariableArg(args[0], variables);\n return varName ? `[ -d $${varName} ]` : undefined;\n }\n case 'isEmpty': {\n const varName = resolveVariableArg(args[0], variables);\n return varName ? `[ -z \"$${varName}\" ]` : undefined;\n }\n case 'notEmpty': {\n const varName = resolveVariableArg(args[0], variables);\n return varName ? `[ -n \"$${varName}\" ]` : undefined;\n }\n case 'equals': {\n const varName = resolveVariableArg(args[0], variables);\n const value = args[1] && Node.isStringLiteral(args[1]) ? args[1].getLiteralValue() : undefined;\n return varName && value ? `[ $${varName} = ${value} ]` : undefined;\n }\n case 'and': {\n const tests = args.map((arg: TsMorphNode) => evaluateTestArg(arg, variables)).filter((t: string | undefined): t is string => t !== undefined);\n return tests.length > 0 ? tests.join(' && ') : undefined;\n }\n case 'or': {\n const tests = args.map((arg: TsMorphNode) => evaluateTestArg(arg, variables)).filter((t: string | undefined): t is string => t !== undefined);\n return tests.length > 0 ? tests.join(' || ') : undefined;\n }\n default:\n return undefined;\n }\n}\n\n/**\n * Resolve a variable reference argument to its shell variable name.\n */\nfunction resolveVariableArg(\n arg: TsMorphNode | undefined,\n variables: Map<string, ExtractedVariable>\n): string | undefined {\n if (!arg || !Node.isIdentifier(arg)) {\n return undefined;\n }\n const variable = variables.get(arg.getText());\n return variable?.envName;\n}\n\n/**\n * Evaluate a test argument for and/or composition.\n * Handles both string literals and nested helper calls.\n */\nfunction evaluateTestArg(\n arg: TsMorphNode,\n variables: Map<string, ExtractedVariable>\n): string | undefined {\n if (Node.isStringLiteral(arg)) {\n return arg.getLiteralValue();\n }\n if (Node.isCallExpression(arg)) {\n return evaluateTestHelperCall(arg, variables);\n }\n return undefined;\n}\n\n/**\n * Find the root JSX element returned by the default export function\n *\n * Searches for a ReturnStatement containing JSX within the file.\n * Returns null if no JSX is found.\n */\nexport function findRootJsxElement(\n sourceFile: SourceFile\n): JsxElement | JsxSelfClosingElement | JsxFragment | null {\n let result: JsxElement | JsxSelfClosingElement | JsxFragment | null = null;\n\n sourceFile.forEachDescendant((node, traversal) => {\n // Look for return statements\n if (Node.isReturnStatement(node)) {\n const expr = node.getExpression();\n if (expr) {\n // Check if the return expression is JSX\n if (Node.isJsxElement(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isJsxSelfClosingElement(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isJsxFragment(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isParenthesizedExpression(expr)) {\n // Handle parenthesized JSX: return (<div>...</div>)\n const inner = expr.getExpression();\n if (Node.isJsxElement(inner)) {\n result = inner;\n traversal.stop();\n } else if (Node.isJsxSelfClosingElement(inner)) {\n result = inner;\n traversal.stop();\n } else if (Node.isJsxFragment(inner)) {\n result = inner;\n traversal.stop();\n }\n }\n }\n }\n });\n\n return result;\n}\n\n/**\n * Get the value of a JSX array attribute by name\n *\n * Handles JSX expressions containing array literals: attr={[\"a\", \"b\"]}\n * Returns undefined if attribute is missing or not a string array.\n */\nexport function getArrayAttributeValue(\n element: JsxOpeningElement | JsxSelfClosingElement,\n name: string\n): string[] | undefined {\n const attr = element.getAttribute(name);\n if (!attr || !Node.isJsxAttribute(attr)) {\n return undefined;\n }\n\n const init = attr.getInitializer();\n if (!init || !Node.isJsxExpression(init)) {\n return undefined;\n }\n\n const expr = init.getExpression();\n if (!expr || !Node.isArrayLiteralExpression(expr)) {\n return undefined;\n }\n\n const elements: string[] = [];\n for (const el of expr.getElements()) {\n if (Node.isStringLiteral(el)) {\n elements.push(el.getLiteralValue());\n }\n }\n return elements.length > 0 ? elements : undefined;\n}\n","/**\n * Text extraction and normalization utilities\n */\n\nimport { JsxText } from 'ts-morph';\n\n/**\n * Check if a JsxText node contains only whitespace (formatting between elements)\n */\nexport function isWhitespaceOnlyText(node: JsxText): boolean {\n return node.containsOnlyTriviaWhiteSpaces();\n}\n\n/**\n * Normalize whitespace in text content\n *\n * Collapses multiple spaces/newlines to a single space and trims edges.\n */\nexport function normalizeWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Normalize whitespace for markdown block content\n *\n * Preserves line breaks (meaningful in markdown) while:\n * - Removing leading indentation from each line\n * - Collapsing multiple blank lines to single blank lines\n * - Trimming overall content\n */\nexport function normalizeMarkdownWhitespace(text: string): string {\n // Split into lines, trim each line's indentation, rejoin\n const lines = text.split('\\n').map(line => line.trim());\n // Collapse multiple blank lines to single blank line\n const collapsed = lines.join('\\n').replace(/\\n{3,}/g, '\\n\\n');\n return collapsed.trim();\n}\n\n/**\n * Normalize whitespace for inline text content\n *\n * Collapses multiple spaces/newlines to a single space but preserves\n * leading/trailing spaces (they separate inline elements).\n */\nexport function normalizeInlineWhitespace(text: string): string {\n return text.replace(/\\s+/g, ' ');\n}\n\n/**\n * Extract text content from a JsxText node\n *\n * Returns null for whitespace-only nodes (formatting between elements).\n * Otherwise returns normalized text content.\n */\nexport function extractText(node: JsxText): string | null {\n if (isWhitespaceOnlyText(node)) {\n return null;\n }\n const normalized = normalizeWhitespace(node.getText());\n return normalized || null;\n}\n\n/**\n * Extract markdown text content from a JsxText node\n *\n * Like extractText but preserves line breaks for markdown structure.\n * Returns null for whitespace-only nodes.\n */\nexport function extractMarkdownText(node: JsxText): string | null {\n if (isWhitespaceOnlyText(node)) {\n return null;\n }\n const normalized = normalizeMarkdownWhitespace(node.getText());\n return normalized || null;\n}\n\n/**\n * Extract text content from a JsxText node for inline context\n *\n * For inline context, we need to preserve whitespace that separates\n * inline elements. Only skip nodes that are purely formatting whitespace\n * (newlines + indentation between block elements).\n *\n * Preserves leading/trailing spaces as they separate inline elements.\n *\n * Note: We use getFullText() instead of getText() to preserve leading\n * trivia (whitespace) that separates this text from previous elements.\n */\nexport function extractInlineText(node: JsxText): string | null {\n // Use getFullText() to include leading trivia (whitespace)\n // getText() strips leading whitespace which breaks inline spacing\n const raw = node.getFullText();\n\n // Skip purely structural whitespace (newlines with optional indentation)\n // These are formatting between block-level elements\n if (/^\\s*\\n\\s*$/.test(raw)) {\n return null;\n }\n\n // Normalize multiple whitespace to single space, preserving edges\n const normalized = normalizeInlineWhitespace(raw);\n return normalized || null;\n}\n","/**\n * JSX spread attribute resolution utilities\n */\n\nimport {\n Node,\n JsxSpreadAttribute,\n ObjectLiteralExpression,\n SyntaxKind,\n} from 'ts-morph';\n\n/**\n * Extract property values from an ObjectLiteralExpression\n *\n * Handles StringLiteral, ArrayLiteralExpression, NumericLiteral, TrueKeyword, FalseKeyword.\n * Returns a Record of property names to their values.\n */\nexport function extractObjectLiteralProps(\n objLiteral: ObjectLiteralExpression\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const prop of objLiteral.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const name = prop.getName();\n const initializer = prop.getInitializer();\n\n if (!initializer) continue;\n\n if (Node.isStringLiteral(initializer)) {\n result[name] = initializer.getLiteralValue();\n } else if (Node.isArrayLiteralExpression(initializer)) {\n // Reuse array extraction pattern\n const elements: string[] = [];\n for (const el of initializer.getElements()) {\n if (Node.isStringLiteral(el)) {\n elements.push(el.getLiteralValue());\n }\n }\n if (elements.length > 0) {\n result[name] = elements;\n }\n } else if (Node.isNumericLiteral(initializer)) {\n result[name] = initializer.getLiteralValue();\n } else if (initializer.getKind() === SyntaxKind.TrueKeyword) {\n result[name] = true;\n } else if (initializer.getKind() === SyntaxKind.FalseKeyword) {\n result[name] = false;\n }\n // Other types (nested objects, functions) are not supported\n }\n // ShorthandPropertyAssignment and SpreadAssignment not supported\n }\n\n return result;\n}\n\n/**\n * Resolve a JsxSpreadAttribute to its object literal values\n *\n * Only supports simple identifiers referencing object literals:\n * const props = { name: \"x\", desc: \"y\" };\n * <Command {...props} />\n *\n * Throws for:\n * - Non-identifier expressions: {...getProps()}\n * - Non-object-literal sources: const props = someFunc();\n */\nexport function resolveSpreadAttribute(\n spreadAttr: JsxSpreadAttribute\n): Record<string, unknown> {\n const expression = spreadAttr.getExpression();\n\n // Only handle simple identifiers: {...props}\n if (!Node.isIdentifier(expression)) {\n throw new Error('Spread expressions must be simple identifiers');\n }\n\n // Get the symbol for the identifier\n const symbol = expression.getSymbol();\n if (!symbol) {\n throw new Error(`Cannot resolve '${expression.getText()}'`);\n }\n\n // Get the declaration (variable declaration)\n const declarations = symbol.getDeclarations();\n const varDecl = declarations?.find(d => Node.isVariableDeclaration(d));\n if (!varDecl || !Node.isVariableDeclaration(varDecl)) {\n throw new Error('Spread source must be a variable declaration');\n }\n\n // Get the initializer (object literal)\n const initializer = varDecl.getInitializer();\n if (!initializer || !Node.isObjectLiteralExpression(initializer)) {\n throw new Error('Spread source must be an object literal');\n }\n\n // Extract properties\n return extractObjectLiteralProps(initializer);\n}\n","/**\n * Component import resolution utilities\n */\n\nimport {\n Node,\n JsxElement,\n JsxSelfClosingElement,\n JsxFragment,\n SourceFile,\n SyntaxKind,\n} from 'ts-morph';\n\n/**\n * Result of resolving a component import\n */\nexport interface ResolvedComponent {\n jsx: JsxElement | JsxSelfClosingElement | JsxFragment;\n sourceFile: SourceFile;\n visitedPaths: Set<string>;\n}\n\n/**\n * Resolve a component import and extract its JSX\n *\n * Follows import declarations to find the component's source file,\n * then extracts the JSX returned by the component function.\n *\n * @param componentName - Name of the component to resolve\n * @param sourceFile - Source file containing the import\n * @param visitedPaths - Set of already visited file paths (for circular detection)\n * @throws Error if component not imported, not exported, circular import detected,\n * or import is not relative\n */\nexport function resolveComponentImport(\n componentName: string,\n sourceFile: SourceFile,\n visitedPaths?: Set<string>\n): ResolvedComponent {\n // Initialize visitedPaths if not provided\n const visited = visitedPaths ?? new Set<string>();\n\n // Add current file to visited paths\n const currentPath = sourceFile.getFilePath();\n visited.add(currentPath);\n\n // Find import declaration for this component\n const importDecl = sourceFile.getImportDeclaration((decl) => {\n const namedImports = decl.getNamedImports();\n return namedImports.some((ni) => ni.getName() === componentName);\n });\n\n if (!importDecl) {\n throw new Error(`Component '${componentName}' not imported`);\n }\n\n // Validate module specifier is relative import\n const specifier = importDecl.getModuleSpecifierValue();\n if (!specifier.startsWith('.')) {\n throw new Error(\n `Only relative imports supported for components: '${specifier}'`\n );\n }\n\n // Resolve to source file\n const componentSourceFile = importDecl.getModuleSpecifierSourceFile();\n if (!componentSourceFile) {\n throw new Error(`Cannot resolve import for '${componentName}'`);\n }\n\n // Check for circular import\n const componentPath = componentSourceFile.getFilePath();\n if (visited.has(componentPath)) {\n throw new Error(`Circular import detected: ${componentName}`);\n }\n\n // Find the exported component declaration\n const exportedDecls = componentSourceFile.getExportedDeclarations();\n const componentDecls = exportedDecls.get(componentName);\n\n if (!componentDecls || componentDecls.length === 0) {\n throw new Error(`Component '${componentName}' not exported`);\n }\n\n // Extract JSX from component function\n const jsx = extractJsxFromComponent(componentDecls[0]);\n if (!jsx) {\n throw new Error(`Component '${componentName}' does not return JSX`);\n }\n\n return {\n jsx,\n sourceFile: componentSourceFile,\n visitedPaths: visited,\n };\n}\n\n/**\n * Extract the JSX returned by a component function\n *\n * Handles:\n * - Function declarations: function Foo() { return <div />; }\n * - Arrow functions: const Foo = () => <div />;\n * - Arrow functions with body: const Foo = () => { return <div />; };\n *\n * @param decl - The component's declaration node\n * @returns The JSX element/fragment returned, or null if not found\n */\nexport function extractJsxFromComponent(\n decl: Node\n): JsxElement | JsxSelfClosingElement | JsxFragment | null {\n let functionBody: Node | undefined;\n\n if (Node.isFunctionDeclaration(decl)) {\n functionBody = decl.getBody();\n } else if (Node.isVariableDeclaration(decl)) {\n const init = decl.getInitializer();\n if (Node.isArrowFunction(init) || Node.isFunctionExpression(init)) {\n // Check for concise body (arrow function returning JSX directly)\n const body = init.getBody();\n if (Node.isJsxElement(body)) {\n return body;\n } else if (Node.isJsxSelfClosingElement(body)) {\n return body;\n } else if (Node.isJsxFragment(body)) {\n return body;\n } else if (Node.isParenthesizedExpression(body)) {\n const inner = body.getExpression();\n if (Node.isJsxElement(inner)) {\n return inner;\n } else if (Node.isJsxSelfClosingElement(inner)) {\n return inner;\n } else if (Node.isJsxFragment(inner)) {\n return inner;\n }\n }\n functionBody = body;\n }\n }\n\n if (!functionBody) return null;\n\n // Find return statement with JSX\n let result: JsxElement | JsxSelfClosingElement | JsxFragment | null = null;\n functionBody.forEachDescendant((node, traversal) => {\n if (Node.isReturnStatement(node)) {\n const expr = node.getExpression();\n if (Node.isJsxElement(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isJsxSelfClosingElement(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isJsxFragment(expr)) {\n result = expr;\n traversal.stop();\n } else if (Node.isParenthesizedExpression(expr)) {\n const inner = expr.getExpression();\n if (Node.isJsxElement(inner)) {\n result = inner;\n traversal.stop();\n } else if (Node.isJsxSelfClosingElement(inner)) {\n result = inner;\n traversal.stop();\n } else if (Node.isJsxFragment(inner)) {\n result = inner;\n traversal.stop();\n }\n }\n }\n });\n\n return result;\n}\n\n/**\n * Extract generic type arguments from a JSX element\n *\n * For <SpawnAgent<ResearcherInput>> returns ['ResearcherInput']\n * For <Agent<MyInput>> returns ['MyInput']\n * Returns undefined if no type arguments present\n *\n * Uses ts-morph's getDescendantsOfKind to find TypeReference nodes within the\n * opening element's tag, which is where JSX type arguments are attached.\n */\nexport function extractTypeArguments(\n element: JsxElement | JsxSelfClosingElement\n): string[] | undefined {\n // Get the opening element (where generics are attached in JSX)\n const openingElement = Node.isJsxElement(element)\n ? element.getOpeningElement()\n : element;\n\n // Get all TypeReference descendants of the opening tag\n // In JSX, type arguments appear as TypeReference children of the tag name\n const typeRefNodes = openingElement.getDescendantsOfKind(SyntaxKind.TypeReference);\n\n if (typeRefNodes.length === 0) {\n return undefined;\n }\n\n // Extract the type name text from each TypeReference\n return typeRefNodes.map(node => node.getText());\n}\n","/**\n * Cross-file type resolution utilities\n */\n\nimport {\n Node,\n SourceFile,\n InterfaceDeclaration,\n} from 'ts-morph';\n\n/**\n * Result of resolving a type import\n */\nexport interface ResolvedType {\n sourceFile: SourceFile;\n interfaceName: string;\n interface: InterfaceDeclaration;\n}\n\n/**\n * Resolve a type name to its interface declaration\n * Follows import declarations to find the source file and interface\n *\n * @param typeName - Name of the type to resolve (e.g., 'ResearcherInput')\n * @param sourceFile - Source file containing the import\n * @returns ResolvedType with source file and interface, or undefined if not found\n */\nexport function resolveTypeImport(\n typeName: string,\n sourceFile: SourceFile\n): ResolvedType | undefined {\n // Check if type is defined locally first\n const localInterface = sourceFile.getInterface(typeName);\n if (localInterface) {\n return {\n sourceFile,\n interfaceName: typeName,\n interface: localInterface,\n };\n }\n\n // Find import declaration for this type\n for (const importDecl of sourceFile.getImportDeclarations()) {\n // Check named imports: import { TypeName } from '...'\n for (const namedImport of importDecl.getNamedImports()) {\n if (namedImport.getName() === typeName) {\n const resolved = importDecl.getModuleSpecifierSourceFile();\n if (!resolved) {\n return undefined;\n }\n\n // Handle aliased imports: import { X as Y } from '...'\n const originalName = namedImport.getAliasNode()?.getText() ?? typeName;\n\n // Get the interface from the resolved file\n const iface = resolved.getInterface(originalName);\n if (!iface) {\n // Try exported declarations (for re-exports)\n const exported = resolved.getExportedDeclarations().get(originalName);\n const exportedIface = exported?.find(d => Node.isInterfaceDeclaration(d));\n if (exportedIface && Node.isInterfaceDeclaration(exportedIface)) {\n return {\n sourceFile: resolved,\n interfaceName: originalName,\n interface: exportedIface,\n };\n }\n return undefined;\n }\n\n return {\n sourceFile: resolved,\n interfaceName: originalName,\n interface: iface,\n };\n }\n }\n\n // Check type-only imports: import type { TypeName } from '...'\n if (importDecl.isTypeOnly()) {\n for (const namedImport of importDecl.getNamedImports()) {\n if (namedImport.getName() === typeName) {\n const resolved = importDecl.getModuleSpecifierSourceFile();\n if (!resolved) {\n return undefined;\n }\n\n const originalName = namedImport.getAliasNode()?.getText() ?? typeName;\n const iface = resolved.getInterface(originalName);\n if (iface) {\n return {\n sourceFile: resolved,\n interfaceName: originalName,\n interface: iface,\n };\n }\n }\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Property information extracted from an interface\n */\nexport interface InterfaceProperty {\n name: string;\n required: boolean;\n type: string;\n}\n\n/**\n * Extract property information from an interface\n *\n * @param iface - Interface declaration to extract from\n * @returns Array of property information\n */\nexport function extractInterfaceProperties(\n iface: InterfaceDeclaration\n): InterfaceProperty[] {\n const properties: InterfaceProperty[] = [];\n\n for (const prop of iface.getProperties()) {\n properties.push({\n name: prop.getName(),\n required: !prop.hasQuestionToken(),\n type: prop.getType().getText(),\n });\n }\n\n return properties;\n}\n\n/**\n * Extract {placeholder} patterns from a prompt string\n *\n * @param prompt - Prompt string with {variable} placeholders\n * @returns Set of placeholder names (without braces)\n */\nexport function extractPromptPlaceholders(prompt: string): Set<string> {\n const matches = prompt.matchAll(/\\{(\\w+)\\}/g);\n return new Set([...matches].map(m => m[1]));\n}\n","/**\n * Variable declaration extraction and input/state schema utilities\n */\n\nimport {\n Node,\n SourceFile,\n ObjectLiteralExpression,\n JsxElement,\n InterfaceDeclaration,\n ArrowFunction,\n} from 'ts-morph';\nimport type { StateSchema, StateSchemaField } from '../../ir/nodes.js';\nimport type { InputProperty, InputValue } from '../../ir/runtime-nodes.js';\n\n// ============================================================================\n// Variable Declaration Extraction (useVariable hook)\n// ============================================================================\n\n/**\n * Extracted variable information from useVariable() call\n */\nexport interface ExtractedVariable {\n /** Local const name (e.g., \"phaseDir\") */\n localName: string;\n /** Shell variable name (e.g., \"PHASE_DIR\") */\n envName: string;\n}\n\n/**\n * Extract all useVariable() and defineVars() declarations from a source file\n *\n * Finds patterns like:\n * const phaseDir = useVariable(\"PHASE_DIR\");\n * const vars = defineVars({ MODEL_PROFILE: { type: 'string' } });\n *\n * For defineVars, each property becomes a separate entry:\n * vars.MODEL_PROFILE -> { localName: 'vars.MODEL_PROFILE', envName: 'MODEL_PROFILE' }\n *\n * @param sourceFile - Source file to extract from\n * @returns Map from local variable name to ExtractedVariable info\n */\nexport function extractVariableDeclarations(\n sourceFile: SourceFile\n): Map<string, ExtractedVariable> {\n const result = new Map<string, ExtractedVariable>();\n\n // Find all variable declarations\n sourceFile.forEachDescendant((node) => {\n if (!Node.isVariableDeclaration(node)) return;\n\n const initializer = node.getInitializer();\n if (!initializer || !Node.isCallExpression(initializer)) return;\n\n const callExpr = initializer.getExpression();\n if (!Node.isIdentifier(callExpr)) return;\n\n const funcName = callExpr.getText();\n\n // Handle useVariable() call\n if (funcName === 'useVariable') {\n const args = initializer.getArguments();\n if (args.length < 1) return;\n\n // First arg: string literal for env name\n const firstArg = args[0];\n if (!Node.isStringLiteral(firstArg)) return;\n const envName = firstArg.getLiteralValue();\n\n // Get local variable name\n const localName = node.getName();\n\n result.set(localName, {\n localName,\n envName,\n });\n }\n\n // Handle defineVars() call\n if (funcName === 'defineVars') {\n const args = initializer.getArguments();\n if (args.length < 1) return;\n\n const schemaArg = args[0];\n if (!Node.isObjectLiteralExpression(schemaArg)) return;\n\n // Get the variable name (e.g., \"vars\")\n const varName = node.getName();\n\n // Extract each property from the schema\n for (const prop of schemaArg.getProperties()) {\n if (!Node.isPropertyAssignment(prop)) continue;\n\n // Get property name (e.g., \"MODEL_PROFILE\")\n const propName = prop.getName();\n\n // Create entry like \"vars.MODEL_PROFILE\" -> \"MODEL_PROFILE\"\n const localName = `${varName}.${propName}`;\n result.set(localName, {\n localName,\n envName: propName,\n });\n }\n }\n });\n\n return result;\n}\n\n// ============================================================================\n// SpawnAgent Input Utilities\n// ============================================================================\n\n/**\n * Check if an identifier references a useVariable result\n *\n * @param identifier - The identifier node to check\n * @param variables - Map of declared useVariable results\n * @returns true if identifier references a known useVariable\n */\nexport function isVariableRef(\n identifier: string,\n variables: Map<string, ExtractedVariable>\n): boolean {\n return variables.has(identifier);\n}\n\n/**\n * Extract SpawnAgent input object literal properties\n *\n * Handles property values:\n * - String literal: { propName: \"value\" } -> { type: 'string', value: str }\n * - Identifier: treated as string value\n *\n * Note: RuntimeVar references are handled by v3-spawner.ts using parseRuntimeVarRef\n *\n * @param objLiteral - The ObjectLiteralExpression from JSX input prop\n * @param variables - Map of declared useVariable results\n * @returns Array of InputProperty with InputValue types\n */\nexport function extractInputObjectLiteral(\n objLiteral: ObjectLiteralExpression,\n variables: Map<string, ExtractedVariable>\n): InputProperty[] {\n const properties: InputProperty[] = [];\n\n for (const prop of objLiteral.getProperties()) {\n if (!Node.isPropertyAssignment(prop)) continue;\n\n const name = prop.getName();\n const initializer = prop.getInitializer();\n if (!initializer) continue;\n\n let value: InputValue;\n\n if (Node.isStringLiteral(initializer)) {\n const strValue = initializer.getLiteralValue();\n value = { type: 'string', value: strValue };\n } else if (Node.isNoSubstitutionTemplateLiteral(initializer)) {\n const strValue = initializer.getLiteralValue();\n value = { type: 'string', value: strValue };\n } else if (Node.isIdentifier(initializer)) {\n // Identifier referencing a variable - treat as string\n // V3 RuntimeVar references are handled by v3-spawner.ts using parseRuntimeVarRef\n const varName = initializer.getText();\n value = { type: 'string', value: varName };\n } else {\n // Unsupported initializer type - skip this property\n continue;\n }\n\n properties.push({ name, value });\n }\n\n return properties;\n}\n\n// ============================================================================\n// State Schema Extraction\n// ============================================================================\n\n/**\n * Map TypeScript type to SQL type\n */\nfunction mapTsTypeToSql(tsType: string): 'TEXT' | 'INTEGER' {\n switch (tsType) {\n case 'number':\n return 'INTEGER';\n case 'boolean':\n return 'INTEGER'; // 0/1\n default:\n return 'TEXT'; // string, Date, enums, etc.\n }\n}\n\n/**\n * Get default value for a type\n */\nfunction getDefaultValue(tsType: string, sqlType: 'TEXT' | 'INTEGER'): string {\n if (sqlType === 'INTEGER') {\n return '0';\n }\n return ''; // Empty string for TEXT\n}\n\n/**\n * Extract enum values from union type\n * 'major' | 'minor' | 'patch' -> ['major', 'minor', 'patch']\n */\nfunction extractEnumValues(typeText: string): string[] | undefined {\n // Match pattern like \"'value1' | 'value2' | 'value3'\"\n const matches = typeText.match(/'([^']+)'/g);\n if (matches && matches.length > 1) {\n return matches.map(m => m.replace(/'/g, ''));\n }\n return undefined;\n}\n\n/**\n * Flatten interface properties into schema fields\n * Handles nested objects with underscore separation\n *\n * @param sourceFile - Source file containing the interface\n * @param interfaceName - Name of the interface to extract\n */\nexport function extractStateSchema(\n sourceFile: SourceFile,\n interfaceName: string\n): StateSchema | undefined {\n const fields: StateSchemaField[] = [];\n\n // Find the interface declaration\n const interfaceDecl = sourceFile.getInterface(interfaceName);\n if (!interfaceDecl) {\n return undefined;\n }\n\n // Recursive helper to flatten nested properties\n function processProperties(\n properties: ReturnType<InterfaceDeclaration['getProperties']>,\n prefix: string = ''\n ): void {\n for (const prop of properties) {\n const propName = prop.getName();\n const typeNode = prop.getTypeNode();\n const fullName = prefix ? `${prefix}_${propName}` : propName;\n\n if (!typeNode) continue;\n\n const typeText = typeNode.getText();\n\n // Check if this is a nested object type (TypeLiteral or interface reference)\n if (Node.isTypeLiteral(typeNode)) {\n // Inline object type: { debug: boolean; timeout: number; }\n const nestedProps = typeNode.getProperties();\n // Process nested properties with updated prefix\n for (const nestedProp of nestedProps) {\n const nestedName = nestedProp.getName();\n const nestedType = nestedProp.getTypeNode();\n if (!nestedType) continue;\n\n const nestedTypeText = nestedType.getText();\n const nestedFullName = `${fullName}_${nestedName}`;\n\n // For now, only go one level deep (can extend later)\n const tsType = nestedTypeText.includes('|') ? 'string' : nestedTypeText;\n const sqlType = mapTsTypeToSql(tsType);\n const enumValues = extractEnumValues(nestedTypeText);\n\n fields.push({\n name: nestedFullName,\n tsType,\n sqlType,\n defaultValue: getDefaultValue(tsType, sqlType),\n enumValues\n });\n }\n } else {\n // Simple type\n const tsType = typeText.includes('|') ? 'string' : typeText;\n const sqlType = mapTsTypeToSql(tsType);\n const enumValues = extractEnumValues(typeText);\n\n fields.push({\n name: fullName,\n tsType,\n sqlType,\n defaultValue: getDefaultValue(tsType, sqlType),\n enumValues\n });\n }\n }\n }\n\n processProperties(interfaceDecl.getProperties());\n\n return {\n interfaceName,\n fields\n };\n}\n\n/**\n * Extract $variable arguments from SQL template\n * Returns unique argument names without the $ prefix\n */\nexport function extractSqlArguments(sqlTemplate: string): string[] {\n const regex = /\\$([a-z_][a-z0-9_]*)/gi;\n const args = new Set<string>();\n let match;\n while ((match = regex.exec(sqlTemplate)) !== null) {\n args.add(match[1].toLowerCase());\n }\n return Array.from(args);\n}\n\n// ============================================================================\n// Render Props Pattern Detection\n// ============================================================================\n\n/**\n * Result of analyzing JSX children for render props pattern\n */\nexport interface RenderPropsInfo {\n /** True if children is a single arrow function */\n isRenderProps: boolean;\n /** Parameter name used in arrow function (e.g., 'ctx') */\n paramName?: string;\n /** The arrow function AST node */\n arrowFunction?: ArrowFunction;\n}\n\n/**\n * Analyze JSX element children for render props pattern\n *\n * Detects when children is a single arrow function: {(ctx) => ...}\n * Returns info about the arrow function for transformer use.\n *\n * @param element - JSX element to analyze\n * @returns RenderPropsInfo with detection results\n */\nexport function analyzeRenderPropsChildren(\n element: JsxElement\n): RenderPropsInfo {\n const children = element.getJsxChildren();\n\n // Filter out whitespace-only text nodes\n const nonWhitespace = children.filter(child => {\n if (Node.isJsxText(child)) {\n return child.getText().trim().length > 0;\n }\n return true;\n });\n\n // Must have exactly one child that's a JSX expression\n if (nonWhitespace.length !== 1) {\n return { isRenderProps: false };\n }\n\n const child = nonWhitespace[0];\n if (!Node.isJsxExpression(child)) {\n return { isRenderProps: false };\n }\n\n const expr = child.getExpression();\n if (!expr || !Node.isArrowFunction(expr)) {\n return { isRenderProps: false };\n }\n\n // Extract parameter (zero or one parameter supported)\n const params = expr.getParameters();\n if (params.length > 1) {\n return { isRenderProps: false };\n }\n\n return {\n isRenderProps: true,\n paramName: params.length > 0 ? params[0].getName() : undefined,\n arrowFunction: expr,\n };\n}\n\n/**\n * Extract generic type arguments from a JSX element\n *\n * For <SpawnAgent<ResearcherInput>> returns ['ResearcherInput']\n * For <Agent<MyInput>> returns ['MyInput']\n * Returns undefined if no type arguments present\n *\n * Uses ts-morph's getDescendantsOfKind to find TypeReference nodes within the\n * opening element's tag, which is where JSX type arguments are attached.\n *\n * NOTE: This function is duplicated from component-resolution.ts for now.\n * Will be resolved when parser.ts imports are updated to use utils/.\n */\nimport { SyntaxKind } from 'ts-morph';\n\nexport function extractTypeArguments(\n element: JsxElement | import('ts-morph').JsxSelfClosingElement\n): string[] | undefined {\n // Get the opening element (where generics are attached in JSX)\n const openingElement = Node.isJsxElement(element)\n ? element.getOpeningElement()\n : element;\n\n // Get all TypeReference descendants of the opening tag\n // In JSX, type arguments appear as TypeReference children of the tag name\n const typeRefNodes = openingElement.getDescendantsOfKind(SyntaxKind.TypeReference);\n\n if (typeRefNodes.length === 0) {\n return undefined;\n }\n\n // Extract the type name text from each TypeReference\n return typeRefNodes.map(node => node.getText());\n}\n","/**\n * Parser utilities barrel export\n *\n * Re-exports all public APIs from utility modules for convenient importing.\n */\n\n// Project creation and parsing\nexport {\n createProject,\n parseFile,\n parseSource,\n type CreateProjectOptions\n} from './project.js';\n\n// JSX traversal\nexport {\n getElementName,\n getJsxChildren,\n getAttributeValue,\n getArrayAttributeValue,\n getTestAttributeValue,\n findRootJsxElement,\n type JsxChild\n} from './jsx-traversal.js';\n\n// Text extraction\nexport {\n extractText,\n extractInlineText,\n normalizeWhitespace,\n normalizeInlineWhitespace,\n isWhitespaceOnlyText\n} from './text-extraction.js';\n\n// Spread resolution\nexport {\n resolveSpreadAttribute,\n extractObjectLiteralProps\n} from './spread-resolution.js';\n\n// Component resolution\nexport {\n resolveComponentImport,\n extractJsxFromComponent,\n type ResolvedComponent\n} from './component-resolution.js';\n\n// Type resolution\nexport {\n resolveTypeImport,\n extractInterfaceProperties,\n extractPromptPlaceholders,\n type ResolvedType,\n type InterfaceProperty\n} from './type-resolution.js';\n\n// Variable and state extraction\nexport {\n extractVariableDeclarations,\n extractTypeArguments,\n analyzeRenderPropsChildren,\n extractInputObjectLiteral,\n extractStateSchema,\n extractSqlArguments,\n isVariableRef,\n type ExtractedVariable,\n type RenderPropsInfo\n} from './variable-extraction.js';\n","/**\n * Shared utilities for transformer modules\n *\n * Pure utility functions and constants used across multiple transformers.\n * Functions that recurse into other transforms are in dispatch.ts.\n */\n\nimport { Node, TemplateExpression } from 'ts-morph';\nimport type { BlockNode, InlineNode } from '../../ir/index.js';\nimport type { TransformContext } from './types.js';\nimport { getElementName, extractText } from '../parser.js';\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Convert PascalCase component name to snake_case XML tag name\n * Example: DeviationRules -> deviation_rules\n */\nexport function toSnakeCase(name: string): string {\n return name.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');\n}\n\n// ============================================================================\n// Template Extraction\n// ============================================================================\n\n/**\n * Extract content from a template expression, preserving ${var} syntax\n *\n * Used for bash/code content where variable interpolation should be preserved.\n * Converts TypeScript template expressions like `cmd ${var}` to \"cmd ${var}\".\n *\n * @param expr - The TemplateExpression node from ts-morph\n * @returns The extracted string with ${...} syntax preserved\n */\nexport function extractTemplateContent(expr: TemplateExpression): string {\n const parts: string[] = [];\n\n // Head: text before first ${...}\n parts.push(expr.getHead().getLiteralText());\n\n // Spans: each has expression + literal text after\n for (const span of expr.getTemplateSpans()) {\n const spanExpr = span.getExpression();\n // Preserve ${...} syntax for bash/code\n parts.push(`\\${${spanExpr.getText()}}`);\n parts.push(span.getLiteral().getLiteralText());\n }\n\n return parts.join('');\n}\n\n// ============================================================================\n// Element Classification\n// ============================================================================\n\n/**\n * HTML elements supported by the transformer\n */\nexport const HTML_ELEMENTS = new Set([\n 'h1', 'h2', 'h3', 'h4', 'h5', 'h6',\n 'p', 'div', 'span', 'ul', 'ol', 'li',\n 'a', 'b', 'i', 'strong', 'em', 'code',\n 'pre', 'blockquote', 'br', 'hr',\n]);\n\n/**\n * Inline HTML elements that should be wrapped in paragraphs when at block level\n */\nexport const INLINE_ELEMENTS = new Set([\n 'a', 'b', 'i', 'strong', 'em', 'code', 'span', 'br',\n]);\n\n/**\n * Check if a tag name represents an inline element\n */\nexport function isInlineElement(tagName: string): boolean {\n return INLINE_ELEMENTS.has(tagName);\n}\n\n/**\n * Special component names that are NOT custom user components\n */\nexport const SPECIAL_COMPONENTS = new Set([\n 'Command', 'Markdown', 'XmlBlock', 'Agent', 'SpawnAgent', 'Assign', 'AssignGroup', 'If', 'Else', 'Loop', 'OnStatus',\n 'Skill', 'SkillFile', 'SkillStatic', 'ReadState', 'WriteState',\n 'MCPServer', 'MCPStdioServer', 'MCPHTTPServer', 'MCPConfig', 'State', 'Operation', 'Table', 'List',\n // Semantic workflow components\n 'ExecutionContext', 'SuccessCriteria', 'OfferNext', 'XmlSection',\n 'DeviationRules', 'CommitRules', 'WaveExecution', 'CheckpointHandling',\n // Step workflow primitive\n 'Step',\n // Code block primitives\n 'Bash',\n // File reading\n 'ReadFiles',\n // Template primitives\n 'PromptTemplate',\n]);\n\n/**\n * Check if a tag name represents a custom user-defined component\n *\n * Custom components:\n * - Are NOT HTML elements\n * - Are NOT special components (Command, Markdown)\n * - Start with uppercase (React convention)\n */\nexport function isCustomComponent(tagName: string): boolean {\n if (HTML_ELEMENTS.has(tagName)) return false;\n if (SPECIAL_COMPONENTS.has(tagName)) return false;\n // React convention: custom components start with uppercase\n return /^[A-Z]/.test(tagName);\n}\n\n/**\n * Validate that a string is a valid XML tag name\n * Per XML 1.0 spec (simplified): starts with letter or underscore,\n * followed by letters, digits, underscores, hyphens, or periods.\n * Cannot start with 'xml' (case-insensitive).\n */\nconst XML_NAME_REGEX = /^[a-zA-Z_][a-zA-Z0-9_.\\-]*$/;\n\nexport function isValidXmlName(name: string): boolean {\n if (!name) return false;\n if (!XML_NAME_REGEX.test(name)) return false;\n if (name.toLowerCase().startsWith('xml')) return false;\n return true;\n}\n\n// ============================================================================\n// Text Node Utilities\n// ============================================================================\n\n/**\n * Trim leading/trailing whitespace from boundary text nodes in an inline array\n * Modifies the array in place by trimming first and last text nodes\n * Preserves internal spacing between inline elements\n */\nexport function trimBoundaryTextNodes(inlines: InlineNode[]): void {\n if (inlines.length === 0) return;\n\n // Trim leading whitespace from first text node\n const first = inlines[0];\n if (first.kind === 'text') {\n first.value = first.value.trimStart();\n if (!first.value) {\n inlines.shift();\n }\n }\n\n if (inlines.length === 0) return;\n\n // Trim trailing whitespace from last text node\n const last = inlines[inlines.length - 1];\n if (last.kind === 'text') {\n last.value = last.value.trimEnd();\n if (!last.value) {\n inlines.pop();\n }\n }\n}\n\n// ============================================================================\n// Inline Node Transformation\n// ============================================================================\n\n/**\n * Transform a list of nodes to inline nodes\n * Used by transformMixedChildren for inline accumulation\n *\n * This is a helper that doesn't recurse - it only handles basic inline elements.\n * More complex inline transformations should use the dispatch mechanism.\n */\nexport function transformInlineNodes(\n nodes: Node[],\n ctx: TransformContext,\n transformInlineElement: (name: string, node: Node) => InlineNode | null\n): InlineNode[] {\n const result: InlineNode[] = [];\n\n for (const node of nodes) {\n if (Node.isJsxText(node)) {\n const text = extractText(node);\n if (text) {\n result.push({ kind: 'text', value: text });\n }\n } else if (Node.isJsxElement(node)) {\n const name = getElementName(node);\n const inlineNode = transformInlineElement(name, node);\n if (inlineNode) result.push(inlineNode);\n } else if (Node.isJsxSelfClosingElement(node)) {\n // Handle self-closing inline elements (like <br />)\n const name = getElementName(node);\n if (name === 'br') {\n result.push({ kind: 'lineBreak' });\n }\n } else if (Node.isJsxExpression(node)) {\n // Handle JSX expressions - delegate to context's error handler\n const expr = node.getExpression();\n if (!expr) {\n continue; // Empty expression {}\n }\n\n throw ctx.createError(\n 'JSX expressions in inline context not yet supported',\n node\n );\n }\n }\n\n return result;\n}\n\n/**\n * Transform mixed children (inline + block elements)\n * Consecutive inline elements and text are wrapped in a single paragraph\n * Block elements are transformed normally\n *\n * NOTE: This function imports dispatchBlockTransform to avoid circular dependencies.\n * Individual transformer modules should import from dispatch.ts.\n */\nexport function transformMixedChildren(\n jsxChildren: Node[],\n ctx: TransformContext,\n transformToBlock: (child: Node) => BlockNode | null,\n transformInlineElement: (name: string, node: Node) => InlineNode | null\n): BlockNode[] {\n const blocks: BlockNode[] = [];\n let inlineAccumulator: Node[] = [];\n\n const flushInline = () => {\n if (inlineAccumulator.length > 0) {\n // Transform accumulated inline content as a paragraph\n const inlineNodes = transformInlineNodes(inlineAccumulator, ctx, transformInlineElement);\n if (inlineNodes.length > 0) {\n blocks.push({ kind: 'paragraph', children: inlineNodes });\n }\n inlineAccumulator = [];\n }\n };\n\n for (const child of jsxChildren) {\n // Check if this is an inline element or text\n if (Node.isJsxText(child)) {\n const text = extractText(child);\n if (text) {\n inlineAccumulator.push(child);\n }\n // Skip whitespace-only text if accumulator is empty\n } else if (Node.isJsxElement(child)) {\n const name = getElementName(child);\n if (isInlineElement(name)) {\n // Inline element - accumulate\n inlineAccumulator.push(child);\n } else {\n // Block element\n // Flush any accumulated inline content before block element\n flushInline();\n // Transform block element\n const block = transformToBlock(child);\n if (block) blocks.push(block);\n }\n } else if (Node.isJsxExpression(child)) {\n // JSX expressions treated as inline\n inlineAccumulator.push(child);\n }\n }\n\n // Flush remaining inline content\n flushInline();\n\n return blocks;\n}\n","/**\n * Semantic component transformer functions\n *\n * Transforms semantic workflow components to IR nodes:\n * - Table → TableNode\n * - List (prop-based) → ListNode\n * - ExecutionContext → ExecutionContextNode\n * - SuccessCriteria → SuccessCriteriaNode\n * - OfferNext → OfferNextNode\n * - XmlSection → XmlBlockNode\n * - XML wrapper components (DeviationRules, etc.) → XmlBlockNode\n *\n * Extracted from Transformer class for maintainability and modularity.\n */\n\nimport {\n Node,\n JsxElement,\n JsxSelfClosingElement,\n JsxOpeningElement,\n PropertyAccessExpression,\n} from 'ts-morph';\nimport type {\n TableNode,\n ListNode,\n ListItemNode,\n ExecutionContextNode,\n SuccessCriteriaNode,\n SuccessCriteriaItemData,\n OfferNextNode,\n OfferNextRouteData,\n XmlBlockNode,\n BaseBlockNode,\n BlockNode,\n} from '../../ir/index.js';\nimport {\n getElementName,\n getAttributeValue,\n getArrayAttributeValue,\n} from '../utils/index.js';\nimport type { TransformContext } from './types.js';\nimport { transformBlockChildren } from './dispatch.js';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Convert PascalCase component name to snake_case XML tag name\n * Example: DeviationRules -> deviation_rules\n */\nfunction toSnakeCase(name: string): string {\n return name.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/^_/, '');\n}\n\n/**\n * Interpolate a PropertyAccessExpression if it references render props context\n * Returns the interpolated value or null if not a context access\n */\nfunction interpolatePropertyAccess(\n expr: PropertyAccessExpression,\n ctx: TransformContext\n): string | null {\n const objExpr = expr.getExpression();\n const propName = expr.getName();\n\n if (Node.isIdentifier(objExpr) && ctx.renderPropsContext) {\n const objName = objExpr.getText();\n if (objName === ctx.renderPropsContext.paramName) {\n const value = ctx.renderPropsContext.values[propName];\n if (value !== undefined) {\n return value;\n }\n }\n }\n return null;\n}\n\n// ============================================================================\n// Table Transformer\n// ============================================================================\n\n/**\n * Transform Table component to TableNode\n */\nexport function transformTable(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): TableNode {\n const opening = Node.isJsxElement(node) ? node.getOpeningElement() : node;\n\n // Parse array props\n const headers = getArrayAttributeValue(opening, 'headers');\n const rows = parseRowsAttribute(opening, ctx);\n const alignRaw = getArrayAttributeValue(opening, 'align');\n const emptyCell = getAttributeValue(opening, 'emptyCell');\n\n // Convert align strings to typed array\n const align = alignRaw?.map(a => {\n if (a === 'left' || a === 'center' || a === 'right') return a;\n return 'left'; // Default invalid values to left\n }) as ('left' | 'center' | 'right')[] | undefined;\n\n return {\n kind: 'table',\n headers: headers?.length ? headers : undefined,\n rows: rows,\n align: align,\n emptyCell: emptyCell || undefined,\n };\n}\n\n/**\n * Parse rows attribute (array of arrays)\n * Handles string literals, numbers, and context property access\n */\nexport function parseRowsAttribute(\n opening: JsxOpeningElement | JsxSelfClosingElement,\n ctx: TransformContext\n): string[][] {\n const attr = opening.getAttribute('rows');\n if (!attr || !Node.isJsxAttribute(attr)) return [];\n\n const init = attr.getInitializer();\n if (!init || !Node.isJsxExpression(init)) return [];\n\n const expr = init.getExpression();\n if (!expr || !Node.isArrayLiteralExpression(expr)) return [];\n\n const rows: string[][] = [];\n for (const element of expr.getElements()) {\n if (Node.isArrayLiteralExpression(element)) {\n const row: string[] = [];\n for (const cell of element.getElements()) {\n // Handle string literals, numbers, and expressions\n if (Node.isStringLiteral(cell)) {\n row.push(cell.getLiteralValue());\n } else if (Node.isNumericLiteral(cell)) {\n row.push(cell.getLiteralValue().toString());\n } else if (Node.isPropertyAccessExpression(cell)) {\n // Handle context property access (e.g., ctx.name)\n const interpolated = interpolatePropertyAccess(cell, ctx);\n row.push(interpolated ?? cell.getText());\n } else {\n row.push(cell.getText());\n }\n }\n rows.push(row);\n }\n }\n return rows;\n}\n\n// ============================================================================\n// Prop-based List Transformer\n// ============================================================================\n\n/**\n * Transform List component (prop-based) to ListNode IR\n * This is separate from HTML <ul>/<ol> transformation\n */\nexport function transformPropList(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): ListNode {\n const opening = Node.isJsxElement(node) ? node.getOpeningElement() : node;\n\n // Parse props\n const items = getArrayAttributeValue(opening, 'items') ?? [];\n const ordered = getAttributeValue(opening, 'ordered') === 'true' ||\n opening.getAttribute('ordered') !== undefined; // Handle boolean attr\n\n // Parse start attribute (numeric)\n let start: number | undefined = undefined;\n const startAttr = opening.getAttribute('start');\n if (startAttr && Node.isJsxAttribute(startAttr)) {\n const init = startAttr.getInitializer();\n if (init && Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (expr && Node.isNumericLiteral(expr)) {\n start = expr.getLiteralValue();\n }\n }\n }\n\n // Convert items to ListItemNode[]\n const listItems: ListItemNode[] = items.map(item => ({\n kind: 'listItem' as const,\n children: [{\n kind: 'paragraph' as const,\n children: [{ kind: 'text' as const, value: String(item) }]\n }]\n }));\n\n return {\n kind: 'list',\n ordered,\n items: listItems,\n start,\n };\n}\n\n// ============================================================================\n// Semantic Workflow Components\n// ============================================================================\n\n/**\n * Transform ExecutionContext component to ExecutionContextNode\n */\nexport function transformExecutionContext(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): ExecutionContextNode {\n const opening = Node.isJsxElement(node) ? node.getOpeningElement() : node;\n\n const paths = getArrayAttributeValue(opening, 'paths') ?? [];\n const prefix = getAttributeValue(opening, 'prefix') ?? '@';\n\n // Transform children if present\n const children: BlockNode[] = Node.isJsxElement(node)\n ? transformBlockChildren(node.getJsxChildren(), ctx)\n : [];\n\n return {\n kind: 'executionContext',\n paths,\n prefix,\n children: children as BaseBlockNode[],\n };\n}\n\n/**\n * Transform SuccessCriteria component to SuccessCriteriaNode\n */\nexport function transformSuccessCriteria(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): SuccessCriteriaNode {\n const opening = Node.isJsxElement(node) ? node.getOpeningElement() : node;\n\n const items = parseSuccessCriteriaItems(opening);\n\n return {\n kind: 'successCriteria',\n items,\n };\n}\n\n/**\n * Parse items attribute for SuccessCriteria\n * Handles both string shorthand and {text, checked} objects\n */\nexport function parseSuccessCriteriaItems(\n opening: JsxOpeningElement | JsxSelfClosingElement\n): SuccessCriteriaItemData[] {\n const attr = opening.getAttribute('items');\n if (!attr || !Node.isJsxAttribute(attr)) return [];\n\n const init = attr.getInitializer();\n if (!init || !Node.isJsxExpression(init)) return [];\n\n const expr = init.getExpression();\n if (!expr || !Node.isArrayLiteralExpression(expr)) return [];\n\n const items: SuccessCriteriaItemData[] = [];\n for (const element of expr.getElements()) {\n if (Node.isStringLiteral(element)) {\n // String shorthand: \"item text\"\n items.push({ text: element.getLiteralValue(), checked: false });\n } else if (Node.isObjectLiteralExpression(element)) {\n // Object: { text: \"...\", checked: true }\n let text = '';\n let checked = false;\n\n for (const prop of element.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const propName = prop.getName();\n const propInit = prop.getInitializer();\n\n if (propName === 'text' && propInit && Node.isStringLiteral(propInit)) {\n text = propInit.getLiteralValue();\n } else if (propName === 'checked' && propInit) {\n // Handle both boolean literal and truthy values\n if (propInit.getKind() === 112) { // TrueKeyword\n checked = true;\n } else if (propInit.getKind() === 97) { // FalseKeyword\n checked = false;\n }\n }\n }\n }\n\n items.push({ text, checked });\n }\n }\n\n return items;\n}\n\n/**\n * Transform OfferNext component to OfferNextNode\n */\nexport function transformOfferNext(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): OfferNextNode {\n const opening = Node.isJsxElement(node) ? node.getOpeningElement() : node;\n\n const routes = parseOfferNextRoutes(opening);\n\n return {\n kind: 'offerNext',\n routes,\n };\n}\n\n/**\n * Parse routes attribute for OfferNext\n * Each route is an object with name, path, and optional description\n */\nexport function parseOfferNextRoutes(\n opening: JsxOpeningElement | JsxSelfClosingElement\n): OfferNextRouteData[] {\n const attr = opening.getAttribute('routes');\n if (!attr || !Node.isJsxAttribute(attr)) return [];\n\n const init = attr.getInitializer();\n if (!init || !Node.isJsxExpression(init)) return [];\n\n const expr = init.getExpression();\n if (!expr || !Node.isArrayLiteralExpression(expr)) return [];\n\n const routes: OfferNextRouteData[] = [];\n for (const element of expr.getElements()) {\n if (Node.isObjectLiteralExpression(element)) {\n let name = '';\n let path = '';\n let description: string | undefined = undefined;\n\n for (const prop of element.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const propName = prop.getName();\n const propInit = prop.getInitializer();\n\n if (propInit && Node.isStringLiteral(propInit)) {\n const value = propInit.getLiteralValue();\n if (propName === 'name') {\n name = value;\n } else if (propName === 'path') {\n path = value;\n } else if (propName === 'description') {\n description = value;\n }\n }\n }\n }\n\n if (name && path) {\n routes.push({ name, path, description });\n }\n }\n }\n\n return routes;\n}\n\n// ============================================================================\n// XML Block Transformers\n// ============================================================================\n\n/**\n * Transform XmlSection component to XmlBlockNode\n * Dynamic XML block with custom tag name\n */\nexport function transformXmlSection(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): XmlBlockNode {\n const opening = Node.isJsxElement(node) ? node.getOpeningElement() : node;\n\n const name = getAttributeValue(opening, 'name') ?? 'section';\n\n // Transform children\n const children: BlockNode[] = Node.isJsxElement(node)\n ? transformBlockChildren(node.getJsxChildren(), ctx)\n : [];\n\n return {\n kind: 'xmlBlock',\n name,\n children: children as BaseBlockNode[],\n };\n}\n\n/**\n * Transform XML wrapper components to XmlBlockNode\n * Used for: DeviationRules, CommitRules, WaveExecution, CheckpointHandling\n */\nexport function transformXmlWrapper(\n componentName: string,\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): XmlBlockNode {\n // Convert component name to snake_case for XML tag\n const tagName = toSnakeCase(componentName);\n\n // Transform children\n const children: BlockNode[] = Node.isJsxElement(node)\n ? transformBlockChildren(node.getJsxChildren(), ctx)\n : [];\n\n return {\n kind: 'xmlBlock',\n name: tagName,\n children: children as BaseBlockNode[],\n };\n}\n","/**\n * Control flow transformer functions\n *\n * Transforms control flow components to IR nodes:\n * - If → IfNode\n * - Else → ElseNode\n * - Loop → LoopNode\n * - OnStatus → OnStatusNode\n *\n * Extracted from Transformer class for maintainability and modularity.\n */\n\nimport {\n Node,\n JsxElement,\n JsxSelfClosingElement,\n JsxOpeningElement,\n SourceFile,\n} from 'ts-morph';\nimport type {\n IfNode,\n ElseNode,\n LoopNode,\n OnStatusNode,\n BlockNode,\n} from '../../ir/index.js';\nimport {\n getAttributeValue,\n} from '../utils/index.js';\nimport type { TransformContext } from './types.js';\nimport { transformBlockChildren } from './dispatch.js';\nimport type { BaseBlockNode } from '../../ir/index.js';\n\n// ============================================================================\n// If/Else Transformers\n// ============================================================================\n\n/**\n * Transform If component to IfNode\n *\n * NOTE: Control flow (If/Else/Loop) is only supported in V3 Commands with runtime features.\n * Use the V3 transformers (v3-control.ts) for Commands.\n * This V1 transformer throws an error since Agent/Skill documents don't support control flow.\n */\nexport function transformIf(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): IfNode {\n throw ctx.createError(\n 'If/Else control flow is only supported in V3 Commands. ' +\n 'Use useRuntimeVar and the V3 If component, or remove control flow from Agent/Skill documents.',\n node\n );\n}\n\n/**\n * Transform an Else element to ElseNode\n *\n * NOTE: Control flow (If/Else/Loop) is only supported in V3 Commands with runtime features.\n * This V1 transformer throws an error since Agent/Skill documents don't support control flow.\n */\nexport function transformElse(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): ElseNode {\n throw ctx.createError(\n 'Else control flow is only supported in V3 Commands. ' +\n 'Use useRuntimeVar and the V3 Else component, or remove control flow from Agent/Skill documents.',\n node\n );\n}\n\n// ============================================================================\n// Loop Transformer\n// ============================================================================\n\n/**\n * Transform Loop component to LoopNode IR\n *\n * NOTE: Control flow (If/Else/Loop) is only supported in V3 Commands with runtime features.\n * This V1 transformer throws an error since Agent/Skill documents don't support control flow.\n */\nexport function transformLoop(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): LoopNode {\n throw ctx.createError(\n 'Loop control flow is only supported in V3 Commands. ' +\n 'Use useRuntimeVar and the V3 Loop component, or remove control flow from Agent/Skill documents.',\n node\n );\n}\n\n// ============================================================================\n// OnStatus Transformer\n// ============================================================================\n\n/**\n * Transform OnStatus component to OnStatusNode\n * Handles agent output status checking\n */\nexport function transformOnStatus(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): OnStatusNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract output prop (required) - must be a JSX expression referencing an identifier\n const outputAttr = openingElement.getAttribute('output');\n if (!outputAttr || !Node.isJsxAttribute(outputAttr)) {\n throw ctx.createError('OnStatus requires output prop', openingElement);\n }\n\n const outputInit = outputAttr.getInitializer();\n if (!outputInit || !Node.isJsxExpression(outputInit)) {\n throw ctx.createError('OnStatus output must be a JSX expression: output={outputRef}', openingElement);\n }\n\n const outputExpr = outputInit.getExpression();\n if (!outputExpr || !Node.isIdentifier(outputExpr)) {\n throw ctx.createError('OnStatus output must reference a useOutput result', openingElement);\n }\n\n // Get the identifier text\n const outputIdentifier = outputExpr.getText();\n\n // Look up agent name from outputs map\n const agentName = ctx.outputs.get(outputIdentifier);\n if (!agentName) {\n throw ctx.createError(\n `Output '${outputIdentifier}' not found. Did you declare it with useOutput()?`,\n openingElement\n );\n }\n\n // Extract status prop (required)\n const status = getAttributeValue(openingElement, 'status');\n if (!status) {\n throw ctx.createError('OnStatus requires status prop', openingElement);\n }\n\n // Validate status is one of the allowed values\n const validStatuses = ['SUCCESS', 'BLOCKED', 'NOT_FOUND', 'ERROR', 'CHECKPOINT'];\n if (!validStatuses.includes(status)) {\n throw ctx.createError(\n `OnStatus status must be one of: ${validStatuses.join(', ')}. Got: ${status}`,\n openingElement\n );\n }\n\n // Transform children as block content\n const children = Node.isJsxElement(node)\n ? transformBlockChildren(node.getJsxChildren(), ctx)\n : [];\n\n return {\n kind: 'onStatus',\n outputRef: {\n kind: 'outputReference',\n agent: agentName,\n },\n status: status as OnStatusNode['status'],\n children: children as BaseBlockNode[],\n };\n}\n\n// ============================================================================\n// Helper Functions for Hook Extraction\n// ============================================================================\n\n/**\n * Extract useOutput declarations from source file\n * Returns map of identifier name -> agent name\n *\n * Uses forEachDescendant to find declarations inside function bodies,\n * following the same pattern as extractVariableDeclarations in parser.ts\n */\nexport function extractOutputDeclarations(sourceFile: SourceFile): Map<string, string> {\n const outputs = new Map<string, string>();\n\n // Find all variable declarations (including inside functions)\n sourceFile.forEachDescendant((node) => {\n if (!Node.isVariableDeclaration(node)) return;\n\n const init = node.getInitializer();\n if (!init || !Node.isCallExpression(init)) return;\n\n // Check if it's a useOutput call\n const expr = init.getExpression();\n if (!Node.isIdentifier(expr) || expr.getText() !== 'useOutput') return;\n\n const args = init.getArguments();\n if (args.length < 1) return;\n\n const agentArg = args[0];\n // Get the string literal value (agent name)\n if (Node.isStringLiteral(agentArg)) {\n const agentName = agentArg.getLiteralValue();\n const identName = node.getName();\n outputs.set(identName, agentName);\n }\n });\n\n return outputs;\n}\n\n/**\n * Extract useStateRef declarations from source file\n * Returns map of identifier name -> state key\n *\n * Uses forEachDescendant to find declarations inside function bodies,\n * following the same pattern as extractOutputDeclarations\n */\nexport function extractStateRefDeclarations(sourceFile: SourceFile): Map<string, string> {\n const stateRefs = new Map<string, string>();\n\n // Find all variable declarations (including inside functions)\n sourceFile.forEachDescendant((node) => {\n if (!Node.isVariableDeclaration(node)) return;\n\n const init = node.getInitializer();\n if (!init || !Node.isCallExpression(init)) return;\n\n // Check if it's a useStateRef call\n const expr = init.getExpression();\n if (!Node.isIdentifier(expr) || expr.getText() !== 'useStateRef') return;\n\n const args = init.getArguments();\n if (args.length < 1) return;\n\n const keyArg = args[0];\n // Get the string literal value (state key)\n if (Node.isStringLiteral(keyArg)) {\n const stateKey = keyArg.getLiteralValue();\n const identName = node.getName();\n stateRefs.set(identName, stateKey);\n }\n });\n\n return stateRefs;\n}\n","/**\n * SpawnAgent transformation module\n *\n * Handles transformSpawnAgent and related helper functions for agent spawning.\n */\n\nimport { Node, JsxElement, JsxSelfClosingElement, JsxOpeningElement, PropertyAccessExpression, ObjectLiteralExpression, TemplateExpression } from 'ts-morph';\nimport type { SpawnAgentNode, SpawnAgentInput, TypeReference } from '../../ir/index.js';\nimport type { TransformContext } from './types.js';\nimport { getAttributeValue, extractTypeArguments, extractInputObjectLiteral, resolveTypeImport, extractInterfaceProperties } from '../utils/index.js';\n\n/**\n * Transform a SpawnAgent element to SpawnAgentNode\n * SpawnAgent is a block-level element that emits Task() syntax\n *\n * Supports two modes:\n * 1. prompt prop (deprecated): Manual prompt string\n * 2. input prop (preferred): Typed input - VariableRef or object literal\n *\n * Also supports:\n * - agent={AgentRef} for type-safe agent references\n * - loadFromFile prop for \"load from file\" pattern\n */\nexport function transformSpawnAgent(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): SpawnAgentNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract agent prop - can be string OR AgentRef identifier\n const { agentName, agentPath } = extractAgentProp(openingElement, ctx);\n const model = getAttributeValue(openingElement, 'model');\n const description = getAttributeValue(openingElement, 'description');\n\n // Extract loadFromFile prop\n const loadFromFile = extractLoadFromFileProp(openingElement, agentPath, ctx);\n\n // Extract prompt, promptVariable, and input props\n const prompt = extractPromptProp(openingElement, ctx);\n const promptVariable = getAttributeValue(openingElement, 'promptVariable');\n const input = extractInputProp(openingElement, ctx);\n\n // Extract extra instructions from children (when using input prop)\n const extraInstructions = Node.isJsxElement(node)\n ? extractExtraInstructions(node, ctx)\n : undefined;\n\n // Validate required props\n if (!agentName) {\n throw ctx.createError('SpawnAgent requires agent prop', openingElement);\n }\n if (!model) {\n throw ctx.createError('SpawnAgent requires model prop', openingElement);\n }\n if (!description) {\n throw ctx.createError('SpawnAgent requires description prop', openingElement);\n }\n\n // Validate mutual exclusivity of prompt, promptVariable, and input\n const promptProps = [prompt, promptVariable, input].filter(Boolean).length;\n if (promptProps > 1) {\n throw ctx.createError(\n 'Cannot use multiple prompt props on SpawnAgent. Use one of: prompt, promptVariable, or input.',\n openingElement\n );\n }\n\n // Require one of prompt, promptVariable, or input\n if (promptProps === 0) {\n throw ctx.createError(\n 'SpawnAgent requires either prompt, promptVariable, or input prop',\n openingElement\n );\n }\n\n // Extract generic type argument if present\n const typeArgs = extractTypeArguments(node);\n let inputType: TypeReference | undefined;\n const typeParam = typeArgs && typeArgs.length > 0 ? typeArgs[0] : undefined;\n if (typeParam) {\n inputType = {\n kind: 'typeReference',\n name: typeParam,\n resolved: false, // Will be resolved in validation phase\n };\n }\n\n // Validate input object against interface if both present\n if (input) {\n validateInputAgainstInterface(input, typeParam, openingElement, ctx);\n }\n\n return {\n kind: 'spawnAgent',\n agent: agentName,\n model,\n description,\n ...(prompt && { prompt }),\n ...(promptVariable && { promptVariable }),\n ...(input && { input }),\n ...(extraInstructions && { extraInstructions }),\n ...(inputType && { inputType }),\n ...(loadFromFile && { loadFromFile }),\n };\n}\n\n/**\n * Extract agent prop - handles string OR AgentRef identifier\n *\n * Returns:\n * - agentName: The agent name string (required)\n * - agentPath: The agent's file path (if AgentRef with path)\n */\nfunction extractAgentProp(\n element: JsxOpeningElement | JsxSelfClosingElement,\n ctx: TransformContext\n): { agentName: string | undefined; agentPath: string | undefined } {\n const attr = element.getAttribute('agent');\n if (!attr || !Node.isJsxAttribute(attr)) {\n return { agentName: undefined, agentPath: undefined };\n }\n\n const init = attr.getInitializer();\n\n // Case 1: String literal - agent=\"my-agent\"\n if (init && Node.isStringLiteral(init)) {\n return { agentName: init.getLiteralValue(), agentPath: undefined };\n }\n\n // Case 2: JSX expression - agent={AgentRef}\n if (init && Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n\n // Case 2a: Identifier referencing an AgentRef (e.g., agent={PhaseResearcher})\n if (expr && Node.isIdentifier(expr)) {\n const identName = expr.getText();\n\n // Try to resolve the identifier to find AgentRef properties\n const agentRef = resolveAgentRef(identName, ctx);\n if (agentRef) {\n return { agentName: agentRef.name, agentPath: agentRef.path };\n }\n\n // If not resolvable as AgentRef, treat identifier text as agent name\n // This allows for dynamic agent names from variables\n return { agentName: identName, agentPath: undefined };\n }\n\n // Case 2b: String literal in expression - agent={\"my-agent\"}\n if (expr && Node.isStringLiteral(expr)) {\n return { agentName: expr.getLiteralValue(), agentPath: undefined };\n }\n }\n\n return { agentName: undefined, agentPath: undefined };\n}\n\n/**\n * Try to resolve an identifier to an AgentRef definition\n *\n * Looks for:\n * 1. Imported AgentRef (from defineAgent call in source file)\n * 2. Local AgentRef constant\n */\nfunction resolveAgentRef(\n identName: string,\n ctx: TransformContext\n): { name: string; path?: string } | undefined {\n if (!ctx.sourceFile) return undefined;\n\n // Find the symbol for this identifier\n const symbol = ctx.sourceFile.getLocal(identName);\n if (!symbol) return undefined;\n\n // Get the declaration\n const declarations = symbol.getDeclarations();\n if (!declarations || declarations.length === 0) return undefined;\n\n for (const decl of declarations) {\n // Check for import declaration\n if (Node.isImportSpecifier(decl)) {\n // Trace through import to find the defineAgent call in source file\n const resolved = resolveImportedAgentRef(decl, identName);\n if (resolved) return resolved;\n continue;\n }\n\n // Check for variable declaration with defineAgent call\n if (Node.isVariableDeclaration(decl)) {\n const init = decl.getInitializer();\n if (init && Node.isCallExpression(init)) {\n const callExpr = init.getExpression();\n if (callExpr && callExpr.getText() === 'defineAgent') {\n // Extract the config object from defineAgent({...})\n const args = init.getArguments();\n if (args.length > 0 && Node.isObjectLiteralExpression(args[0])) {\n return extractAgentRefFromObject(args[0]);\n }\n }\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Resolve an imported AgentRef by tracing to its source file\n */\nfunction resolveImportedAgentRef(\n importSpec: Node,\n identName: string\n): { name: string; path?: string } | undefined {\n // Navigate up the tree to find ImportDeclaration\n // ImportSpecifier -> NamedImports -> ImportClause -> ImportDeclaration\n let current: Node | undefined = importSpec;\n while (current && !Node.isImportDeclaration(current)) {\n current = current.getParent();\n }\n\n if (!current || !Node.isImportDeclaration(current)) {\n return undefined;\n }\n\n const importDecl = current;\n\n // Resolve the source file\n const resolvedSourceFile = importDecl.getModuleSpecifierSourceFile();\n if (!resolvedSourceFile) {\n return undefined;\n }\n\n // Find the exported variable with the same name\n const exportedVar = resolvedSourceFile.getVariableDeclaration(identName);\n if (!exportedVar) {\n return undefined;\n }\n\n // Check if it's a defineAgent call\n const init = exportedVar.getInitializer();\n if (init && Node.isCallExpression(init)) {\n const callExpr = init.getExpression();\n if (callExpr && callExpr.getText() === 'defineAgent') {\n const args = init.getArguments();\n if (args.length > 0 && Node.isObjectLiteralExpression(args[0])) {\n return extractAgentRefFromObject(args[0]);\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Extract AgentRef properties from defineAgent config object\n */\nfunction extractAgentRefFromObject(\n obj: ObjectLiteralExpression\n): { name: string; path?: string } | undefined {\n let name: string | undefined;\n let path: string | undefined;\n\n for (const prop of obj.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const propName = prop.getName();\n const init = prop.getInitializer();\n\n if (propName === 'name' && init && Node.isStringLiteral(init)) {\n name = init.getLiteralValue();\n }\n if (propName === 'path' && init && Node.isStringLiteral(init)) {\n path = init.getLiteralValue();\n }\n }\n }\n\n if (name) {\n return { name, path };\n }\n return undefined;\n}\n\n/**\n * Extract loadFromFile prop\n *\n * Supports:\n * - loadFromFile (boolean true shorthand)\n * - loadFromFile={true}\n * - loadFromFile=\"explicit/path.md\"\n *\n * When true, uses agentPath from AgentRef.\n * Returns resolved path string or undefined.\n */\nfunction extractLoadFromFileProp(\n element: JsxOpeningElement | JsxSelfClosingElement,\n agentPath: string | undefined,\n ctx: TransformContext\n): string | undefined {\n const attr = element.getAttribute('loadFromFile');\n if (!attr || !Node.isJsxAttribute(attr)) {\n return undefined;\n }\n\n const init = attr.getInitializer();\n\n // Case 1: Boolean shorthand - loadFromFile (no value = true)\n if (!init) {\n if (!agentPath) {\n throw ctx.createError(\n 'loadFromFile={true} requires an AgentRef with a path property. ' +\n 'Either use agent={AgentRef} where AgentRef has a path, or provide an explicit path: loadFromFile=\"path/to/agent.md\"',\n element\n );\n }\n return agentPath;\n }\n\n // Case 2: String literal - loadFromFile=\"path/to/agent.md\"\n if (Node.isStringLiteral(init)) {\n return init.getLiteralValue();\n }\n\n // Case 3: JSX expression\n if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n\n // Case 3a: Boolean true - loadFromFile={true}\n if (expr && expr.getText() === 'true') {\n if (!agentPath) {\n throw ctx.createError(\n 'loadFromFile={true} requires an AgentRef with a path property. ' +\n 'Either use agent={AgentRef} where AgentRef has a path, or provide an explicit path: loadFromFile=\"path/to/agent.md\"',\n element\n );\n }\n return agentPath;\n }\n\n // Case 3b: Boolean false - loadFromFile={false}\n if (expr && expr.getText() === 'false') {\n return undefined;\n }\n\n // Case 3c: String literal - loadFromFile={\"path/to/agent.md\"}\n if (expr && Node.isStringLiteral(expr)) {\n return expr.getLiteralValue();\n }\n\n // Case 3d: Property access - loadFromFile={AGENT_PATHS.researcher}\n if (expr && Node.isPropertyAccessExpression(expr)) {\n const resolvedPath = resolvePropertyAccess(expr);\n if (resolvedPath) {\n return resolvedPath;\n }\n throw ctx.createError(\n `Cannot resolve property access ${expr.getText()} for loadFromFile. ` +\n 'Make sure the object is a const with string literal values.',\n element\n );\n }\n }\n\n throw ctx.createError(\n 'loadFromFile must be a boolean or string path',\n element\n );\n}\n\n/**\n * Resolve a property access expression (e.g., AGENT_PATHS.researcher) to its value.\n * Only works for const declarations with object literals.\n */\nfunction resolvePropertyAccess(expr: PropertyAccessExpression): string | null {\n const objectExpr = expr.getExpression();\n const propertyName = expr.getName();\n\n if (!Node.isIdentifier(objectExpr)) {\n return null;\n }\n\n const objectName = objectExpr.getText();\n\n // Find the variable declaration in the source file\n const sourceFile = expr.getSourceFile();\n const varDecls = sourceFile.getVariableDeclarations();\n\n for (const varDecl of varDecls) {\n if (varDecl.getName() === objectName) {\n let initializer = varDecl.getInitializer();\n // Unwrap AsExpression (from \"as const\" syntax)\n if (initializer && Node.isAsExpression(initializer)) {\n initializer = initializer.getExpression();\n }\n if (initializer && Node.isObjectLiteralExpression(initializer)) {\n // Look for the property in the object literal\n for (const prop of initializer.getProperties()) {\n if (Node.isPropertyAssignment(prop) && prop.getName() === propertyName) {\n const propInit = prop.getInitializer();\n if (propInit && Node.isStringLiteral(propInit)) {\n return propInit.getLiteralValue();\n }\n if (propInit && Node.isNoSubstitutionTemplateLiteral(propInit)) {\n return propInit.getLiteralValue();\n }\n }\n }\n }\n break;\n }\n }\n\n return null;\n}\n\n/**\n * Extract input prop - handles VariableRef identifier or object literal\n *\n * Supports:\n * - input={varRef} - Reference to useVariable result\n * - input={{ key: \"value\" }} - Object literal with properties\n */\nfunction extractInputProp(\n element: JsxOpeningElement | JsxSelfClosingElement,\n ctx: TransformContext\n): SpawnAgentInput | undefined {\n const attr = element.getAttribute('input');\n if (!attr || !Node.isJsxAttribute(attr)) return undefined;\n\n const init = attr.getInitializer();\n if (!init || !Node.isJsxExpression(init)) return undefined;\n\n const expr = init.getExpression();\n if (!expr) return undefined;\n\n // Case 1: Identifier referencing useVariable result\n if (Node.isIdentifier(expr)) {\n const variable = ctx.variables.get(expr.getText());\n if (variable) {\n return { type: 'variable', varName: variable.envName };\n }\n // Not a known variable - error\n throw ctx.createError(\n `Input '${expr.getText()}' not found. Use useVariable() or object literal.`,\n element\n );\n }\n\n // Case 2: Object literal\n if (Node.isObjectLiteralExpression(expr)) {\n const properties = extractInputObjectLiteral(expr, ctx.variables);\n return { type: 'object', properties };\n }\n\n throw ctx.createError('Input must be a VariableRef or object literal', element);\n}\n\n/**\n * Extract extra instructions from SpawnAgent children\n *\n * Treats children as raw text content (like Markdown component).\n * Returns undefined if no children or only whitespace.\n */\nfunction extractExtraInstructions(node: JsxElement, ctx: TransformContext): string | undefined {\n const parts: string[] = [];\n\n for (const child of node.getJsxChildren()) {\n if (Node.isJsxText(child)) {\n const text = child.getText();\n if (text.trim()) {\n parts.push(text);\n }\n } else if (Node.isJsxExpression(child)) {\n // Handle {`template`} and {\"string\"} expressions\n const expr = child.getExpression();\n if (expr) {\n if (Node.isStringLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (Node.isTemplateExpression(expr)) {\n parts.push(extractTemplateText(expr));\n }\n }\n }\n }\n\n const content = parts.join('').trim();\n return content || undefined;\n}\n\n/**\n * Extract text from a template expression, converting ${var} to {var}\n * This preserves GSD's {variable} placeholder syntax\n */\nfunction extractTemplateText(expr: TemplateExpression): string {\n const parts: string[] = [];\n\n // Head: text before first ${...}\n parts.push(expr.getHead().getLiteralText());\n\n // Spans: each has expression + literal text after\n for (const span of expr.getTemplateSpans()) {\n const spanExpr = span.getExpression();\n // Convert ${variable} to {variable} for GSD format\n parts.push(`{${spanExpr.getText()}}`);\n parts.push(span.getLiteral().getLiteralText());\n }\n\n return parts.join('');\n}\n\n/**\n * Extract prompt prop value, preserving multi-line content and {variable} placeholders\n * Supports: prompt=\"string\", prompt={\"string\"}, prompt={`template`}\n */\nfunction extractPromptProp(element: JsxOpeningElement | JsxSelfClosingElement, ctx: TransformContext): string | undefined {\n const attr = element.getAttribute('prompt');\n if (!attr || !Node.isJsxAttribute(attr)) {\n return undefined;\n }\n\n const init = attr.getInitializer();\n if (!init) {\n return undefined;\n }\n\n // String literal: prompt=\"simple string\"\n if (Node.isStringLiteral(init)) {\n return init.getLiteralValue();\n }\n\n // JSX expression: prompt={...}\n if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (!expr) {\n return undefined;\n }\n\n // String literal in JSX expression: prompt={\"string\"}\n if (Node.isStringLiteral(expr)) {\n return expr.getLiteralValue();\n }\n\n // No-substitution template literal: prompt={`simple template`}\n if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n return expr.getLiteralValue();\n }\n\n // Template expression with substitutions: prompt={`text ${var}`}\n // Note: ${var} in TSX templates become {var} in output (GSD format)\n if (Node.isTemplateExpression(expr)) {\n return extractTemplateText(expr);\n }\n }\n\n return undefined;\n}\n\n/**\n * Validate input object properties against SpawnAgent<T> type parameter.\n *\n * Throws compile error if required interface properties are missing.\n * Only validates object literal inputs (VariableRef is runtime-checked).\n *\n * @param input - The parsed SpawnAgentInput (may be variable or object)\n * @param typeParam - The type parameter name (e.g., \"ResearcherInput\")\n * @param element - The JSX element for error reporting\n */\nfunction validateInputAgainstInterface(\n input: SpawnAgentInput,\n typeParam: string | undefined,\n element: JsxOpeningElement | JsxSelfClosingElement,\n ctx: TransformContext\n): void {\n // Only validate object literal inputs (VariableRef is runtime-checked)\n if (input.type !== 'object') return;\n\n // No type param = no validation (backward compat)\n if (!typeParam) return;\n\n // Require source file for type resolution\n if (!ctx.sourceFile) {\n // Can't resolve types without source file context - skip validation\n return;\n }\n\n // Resolve the interface (local or imported)\n const resolved = resolveTypeImport(typeParam, ctx.sourceFile);\n if (!resolved?.interface) {\n // Interface not found - skip validation (warning logged elsewhere)\n return;\n }\n\n // Extract required properties from interface\n const interfaceProps = extractInterfaceProperties(resolved.interface);\n const requiredProps = interfaceProps.filter(p => p.required);\n\n // Get property names from input object\n const inputPropNames = input.properties.map(p => p.name);\n\n // Find missing required properties\n const missing = requiredProps.filter(p => !inputPropNames.includes(p.name));\n\n if (missing.length > 0) {\n const missingNames = missing.map(p => p.name).join(', ');\n const requiredNames = requiredProps.map(p => p.name).join(', ');\n throw ctx.createError(\n `SpawnAgent input missing required properties: ${missingNames}. ` +\n `Interface '${typeParam}' requires: ${requiredNames}`,\n element\n );\n }\n}\n","/**\n * Variable transformation module\n *\n * Handles transformAssign, transformAssignGroup, and related helper functions\n * for shell variable assignment components.\n */\n\nimport { Node, JsxElement, JsxSelfClosingElement, JsxOpeningElement, TemplateExpression } from 'ts-morph';\nimport type { AssignNode, AssignGroupNode } from '../../ir/index.js';\nimport type { TransformContext } from './types.js';\nimport { extractTemplateContent } from './shared.js';\n\n/**\n * Transform an Assign element to AssignNode\n * Assign emits a bash code block with variable assignment\n *\n * Supports three assignment types (exactly one required):\n * - bash: VAR=$(command)\n * - value: VAR=value (quoted if spaces)\n * - env: VAR=$ENV_VAR\n */\nexport function transformAssign(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): AssignNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Get the var prop - must be a JSX expression referencing an identifier\n const varAttr = openingElement.getAttribute('var');\n if (!varAttr || !Node.isJsxAttribute(varAttr)) {\n throw ctx.createError('Assign requires var prop', openingElement);\n }\n\n const init = varAttr.getInitializer();\n if (!init || !Node.isJsxExpression(init)) {\n throw ctx.createError('Assign var must be a JSX expression: var={variableName}', openingElement);\n }\n\n const expr = init.getExpression();\n if (!expr) {\n throw ctx.createError('Assign var must reference a useVariable or defineVars result', openingElement);\n }\n\n // Support both patterns:\n // - Identifier: var={phaseDir} (from useVariable)\n // - PropertyAccessExpression: var={vars.PHASE_DIR} (from defineVars)\n let localName: string;\n if (Node.isIdentifier(expr)) {\n localName = expr.getText();\n } else if (Node.isPropertyAccessExpression(expr)) {\n // e.g., vars.MODEL_PROFILE -> \"vars.MODEL_PROFILE\"\n localName = expr.getText();\n } else {\n throw ctx.createError('Assign var must reference a useVariable or defineVars result', openingElement);\n }\n\n // Look up in extracted variables to get the env name\n const variable = ctx.variables.get(localName);\n if (!variable) {\n throw ctx.createError(\n `Variable '${localName}' not found. Did you declare it with useVariable() or defineVars()?`,\n openingElement\n );\n }\n\n // Extract assignment from props (exactly one of bash, value, env)\n const bashProp = extractAssignPropValue(openingElement, 'bash');\n const valueProp = extractAssignPropValue(openingElement, 'value');\n const envProp = extractAssignPropValue(openingElement, 'env');\n\n const propCount = [bashProp, valueProp, envProp].filter(p => p !== undefined).length;\n if (propCount === 0) {\n throw ctx.createError(\n 'Assign requires one of: bash, value, or env prop',\n openingElement\n );\n }\n if (propCount > 1) {\n throw ctx.createError(\n 'Assign accepts only one of: bash, value, or env prop',\n openingElement\n );\n }\n\n let assignment: { type: 'bash' | 'value' | 'env'; content: string };\n if (bashProp !== undefined) {\n assignment = { type: 'bash', content: bashProp };\n } else if (valueProp !== undefined) {\n assignment = { type: 'value', content: valueProp };\n } else {\n assignment = { type: 'env', content: envProp! };\n }\n\n // Extract optional comment prop\n const commentProp = extractAssignPropValue(openingElement, 'comment');\n\n return {\n kind: 'assign',\n variableName: variable.envName,\n assignment,\n ...(commentProp && { comment: commentProp }),\n };\n}\n\n/**\n * Transform an AssignGroup element to AssignGroupNode\n * AssignGroup collects Assign children into a single bash code block\n */\nexport function transformAssignGroup(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): AssignGroupNode {\n // AssignGroup must have children\n if (Node.isJsxSelfClosingElement(node)) {\n throw ctx.createError('AssignGroup must have Assign children', node);\n }\n\n const children = node.getJsxChildren();\n const assignments: AssignNode[] = [];\n let pendingBlankBefore = false; // Track <br/> for next assignment\n\n for (const child of children) {\n // Skip whitespace text nodes\n if (Node.isJsxText(child)) {\n const text = child.getText().trim();\n if (text === '') continue;\n throw ctx.createError('AssignGroup can only contain Assign or br elements, not text', child);\n }\n\n // Must be JSX element\n if (!Node.isJsxElement(child) && !Node.isJsxSelfClosingElement(child)) {\n throw ctx.createError('AssignGroup can only contain Assign or br elements', child);\n }\n\n // Get element name\n const opening = Node.isJsxElement(child) ? child.getOpeningElement() : child;\n const tagNameNode = opening.getTagNameNode();\n const name = tagNameNode.getText();\n\n // Handle <br/> - mark that next assignment should have extra blank line\n if (name === 'br') {\n pendingBlankBefore = true;\n continue;\n }\n\n // Must be Assign\n if (name !== 'Assign') {\n throw ctx.createError(`AssignGroup can only contain Assign or br elements, found: ${name}`, child);\n }\n\n // Transform the Assign element\n const assignNode = transformAssign(child, ctx);\n\n // Apply pending blank before flag\n if (pendingBlankBefore) {\n assignNode.blankBefore = true;\n pendingBlankBefore = false;\n }\n\n assignments.push(assignNode);\n }\n\n if (assignments.length === 0) {\n throw ctx.createError('AssignGroup must contain at least one Assign element', node);\n }\n\n return {\n kind: 'assignGroup',\n assignments,\n };\n}\n\n/**\n * Extract assignment prop value from Assign element\n * Handles string literals, JSX expressions with strings, and template literals\n */\nfunction extractAssignPropValue(\n element: JsxOpeningElement | JsxSelfClosingElement,\n propName: string\n): string | undefined {\n const attr = element.getAttribute(propName);\n if (!attr || !Node.isJsxAttribute(attr)) return undefined;\n\n const init = attr.getInitializer();\n if (!init) return undefined;\n\n // String literal: prop=\"value\"\n if (Node.isStringLiteral(init)) {\n return init.getLiteralValue();\n }\n\n // JSX expression: prop={...}\n if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (!expr) return undefined;\n\n // String literal: prop={\"value\"}\n if (Node.isStringLiteral(expr)) {\n return expr.getLiteralValue();\n }\n\n // Template literal without substitution: prop={`value`}\n if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n return expr.getLiteralValue();\n }\n\n // Template expression with substitution: prop={`ls ${VAR}`}\n if (Node.isTemplateExpression(expr)) {\n return extractTemplateContent(expr);\n }\n }\n\n return undefined;\n}\n","/**\n * State transformation module\n *\n * Handles transformReadState, transformWriteState, and related helper functions\n * for state management components.\n */\n\nimport { Node, JsxElement, JsxSelfClosingElement, JsxOpeningElement } from 'ts-morph';\nimport type { ReadStateNode, WriteStateNode } from '../../ir/index.js';\nimport type { TransformContext } from './types.js';\n\n/**\n * Transform ReadState JSX element into IR node\n *\n * Extracts:\n * - state: StateRef with key property\n * - into: VariableRef with name property\n * - field: optional nested path string\n */\nexport function transformReadState(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): ReadStateNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract state prop (StateRef object with key property)\n const stateAttr = openingElement.getAttribute('state');\n if (!stateAttr || !Node.isJsxAttribute(stateAttr)) {\n throw ctx.createError('ReadState requires state prop', openingElement);\n }\n const stateInit = stateAttr.getInitializer();\n if (!stateInit || !Node.isJsxExpression(stateInit)) {\n throw ctx.createError('ReadState state prop must be JSX expression', openingElement);\n }\n // Extract key from StateRef: { key: \"...\" }\n const stateExpr = stateInit.getExpression();\n if (!stateExpr) {\n throw ctx.createError('ReadState state prop expression is empty', openingElement);\n }\n // Get the identifier name, then resolve to find the key\n const stateKey = extractStateKey(stateExpr, openingElement, ctx);\n\n // Extract into prop (VariableRef)\n const intoAttr = openingElement.getAttribute('into');\n if (!intoAttr || !Node.isJsxAttribute(intoAttr)) {\n throw ctx.createError('ReadState requires into prop', openingElement);\n }\n const intoInit = intoAttr.getInitializer();\n if (!intoInit || !Node.isJsxExpression(intoInit)) {\n throw ctx.createError('ReadState into prop must be JSX expression', openingElement);\n }\n const intoExpr = intoInit.getExpression();\n if (!intoExpr) {\n throw ctx.createError('ReadState into prop expression is empty', openingElement);\n }\n const variableName = extractVariableName(intoExpr, openingElement, ctx);\n\n // Extract optional field prop (string)\n const fieldAttr = openingElement.getAttribute('field');\n let field: string | undefined;\n if (fieldAttr && Node.isJsxAttribute(fieldAttr)) {\n const fieldInit = fieldAttr.getInitializer();\n if (fieldInit && Node.isStringLiteral(fieldInit)) {\n field = fieldInit.getLiteralText();\n }\n }\n\n return {\n kind: 'readState',\n stateKey,\n variableName,\n field,\n };\n}\n\n/**\n * Transform WriteState JSX element into IR node\n *\n * Two modes:\n * 1. Field mode: field=\"path\" value={val}\n * 2. Merge mode: merge={partial}\n */\nexport function transformWriteState(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): WriteStateNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract state prop (required)\n const stateAttr = openingElement.getAttribute('state');\n if (!stateAttr || !Node.isJsxAttribute(stateAttr)) {\n throw ctx.createError('WriteState requires state prop', openingElement);\n }\n const stateInit = stateAttr.getInitializer();\n if (!stateInit || !Node.isJsxExpression(stateInit)) {\n throw ctx.createError('WriteState state prop must be JSX expression', openingElement);\n }\n const stateExpr = stateInit.getExpression();\n if (!stateExpr) {\n throw ctx.createError('WriteState state prop expression is empty', openingElement);\n }\n const stateKey = extractStateKey(stateExpr, openingElement, ctx);\n\n // Check for field prop (field mode)\n const fieldAttr = openingElement.getAttribute('field');\n const mergeAttr = openingElement.getAttribute('merge');\n\n if (fieldAttr && Node.isJsxAttribute(fieldAttr)) {\n // Field mode: field + value\n const fieldInit = fieldAttr.getInitializer();\n if (!fieldInit || !Node.isStringLiteral(fieldInit)) {\n throw ctx.createError('WriteState field prop must be string literal', openingElement);\n }\n const field = fieldInit.getLiteralText();\n\n // Extract value prop\n const valueAttr = openingElement.getAttribute('value');\n if (!valueAttr || !Node.isJsxAttribute(valueAttr)) {\n throw ctx.createError('WriteState with field requires value prop', openingElement);\n }\n const valueInit = valueAttr.getInitializer();\n if (!valueInit) {\n throw ctx.createError('WriteState value prop is empty', openingElement);\n }\n\n let value: { type: 'variable' | 'literal'; content: string };\n if (Node.isStringLiteral(valueInit)) {\n value = { type: 'literal', content: valueInit.getLiteralText() };\n } else if (Node.isJsxExpression(valueInit)) {\n const valueExpr = valueInit.getExpression();\n if (!valueExpr) {\n throw ctx.createError('WriteState value expression is empty', openingElement);\n }\n // Check if it's a variable reference\n if (Node.isIdentifier(valueExpr)) {\n const varName = valueExpr.getText();\n const tracked = ctx.variables.get(varName);\n if (tracked) {\n value = { type: 'variable', content: tracked.envName };\n } else {\n // Not a tracked variable - treat as literal expression text\n value = { type: 'literal', content: valueExpr.getText() };\n }\n } else {\n // Treat as literal expression\n value = { type: 'literal', content: valueExpr.getText() };\n }\n } else {\n throw ctx.createError('WriteState value must be string or expression', openingElement);\n }\n\n return {\n kind: 'writeState',\n stateKey,\n mode: 'field',\n field,\n value,\n };\n } else if (mergeAttr && Node.isJsxAttribute(mergeAttr)) {\n // Merge mode\n const mergeInit = mergeAttr.getInitializer();\n if (!mergeInit || !Node.isJsxExpression(mergeInit)) {\n throw ctx.createError('WriteState merge prop must be JSX expression', openingElement);\n }\n const mergeExpr = mergeInit.getExpression();\n if (!mergeExpr) {\n throw ctx.createError('WriteState merge expression is empty', openingElement);\n }\n\n // For merge, we serialize the object literal to JSON\n // This supports simple object literals at compile time\n const content = mergeExpr.getText();\n\n return {\n kind: 'writeState',\n stateKey,\n mode: 'merge',\n value: { type: 'literal', content },\n };\n } else {\n throw ctx.createError('WriteState requires either field+value or merge prop', openingElement);\n }\n}\n\n/**\n * Extract state key from StateRef expression\n * Handles: identifier pointing to useStateRef result\n */\nfunction extractStateKey(\n expr: Node,\n element: JsxOpeningElement | JsxSelfClosingElement,\n ctx: TransformContext\n): string {\n // Handle identifier (e.g., projectState from useStateRef)\n if (Node.isIdentifier(expr)) {\n const name = expr.getText();\n // Look up in tracked state refs (similar to variables tracking)\n const tracked = ctx.stateRefs.get(name);\n if (tracked) return tracked;\n // Not found - error\n throw ctx.createError(\n `State reference '${name}' not found. Did you declare it with useStateRef()?`,\n element\n );\n }\n throw ctx.createError(`Cannot extract state key from: ${expr.getText()}`, element);\n}\n\n/**\n * Extract variable name from VariableRef expression\n * Handles: identifier pointing to useVariable result\n */\nfunction extractVariableName(\n expr: Node,\n element: JsxOpeningElement | JsxSelfClosingElement,\n ctx: TransformContext\n): string {\n // Handle identifier (e.g., nameVar from useVariable)\n if (Node.isIdentifier(expr)) {\n const name = expr.getText();\n // Look up in tracked variables\n const tracked = ctx.variables.get(name);\n if (tracked) return tracked.envName;\n // Not found - error\n throw ctx.createError(\n `Variable '${name}' not found. Did you declare it with useVariable()?`,\n element\n );\n }\n throw ctx.createError(`Cannot extract variable name from: ${expr.getText()}`, element);\n}\n","/**\n * Primitive components transformation module\n *\n * Handles transformStep, transformBash, transformReadFiles, transformPromptTemplate\n * and related helper functions for primitive markdown components.\n */\n\nimport { Node, JsxElement, JsxSelfClosingElement, JsxOpeningElement, ObjectLiteralExpression, TemplateExpression } from 'ts-morph';\nimport type { StepNode, StepVariant, CodeBlockNode, ReadFilesNode, ReadFileEntry, PromptTemplateNode, BlockNode, BaseBlockNode } from '../../ir/index.js';\nimport type { TransformContext } from './types.js';\nimport { getAttributeValue } from '../utils/index.js';\nimport { transformBlockChildren } from './dispatch.js';\nimport { extractTemplateContent } from './shared.js';\n\n/**\n * Transform Step component to StepNode IR\n */\nexport function transformStep(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): StepNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract number prop (supports both string and numeric literals)\n let stepNumber: string | undefined = undefined;\n const numberAttr = openingElement.getAttribute('number');\n if (numberAttr && Node.isJsxAttribute(numberAttr)) {\n const init = numberAttr.getInitializer();\n if (init) {\n // String literal: number=\"1.1\"\n if (Node.isStringLiteral(init)) {\n stepNumber = init.getLiteralValue();\n }\n // JSX expression: number={1} or number={\"1.1\"}\n else if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (expr) {\n if (Node.isNumericLiteral(expr)) {\n stepNumber = String(expr.getLiteralValue());\n } else if (Node.isStringLiteral(expr)) {\n stepNumber = expr.getLiteralValue();\n }\n }\n }\n }\n }\n\n // Extract name prop\n const name = getAttributeValue(openingElement, 'name');\n\n if (!stepNumber) {\n throw ctx.createError('Step requires number prop', openingElement);\n }\n if (!name) {\n throw ctx.createError('Step requires name prop', openingElement);\n }\n\n // Extract variant with default\n const variantAttr = getAttributeValue(openingElement, 'variant');\n let variant: StepVariant = 'heading'; // Default\n if (variantAttr === 'heading' || variantAttr === 'bold' || variantAttr === 'xml') {\n variant = variantAttr;\n }\n\n // Transform children\n const children = Node.isJsxElement(node)\n ? transformBlockChildren(node.getJsxChildren(), ctx)\n : [];\n\n return {\n kind: 'step',\n number: stepNumber,\n name,\n variant,\n children: children as BaseBlockNode[],\n };\n}\n\n/**\n * Transform <Bash> to CodeBlockNode with language 'bash'\n *\n * <Bash>ls -la</Bash>\n * becomes:\n * ```bash\n * ls -la\n * ```\n */\nexport function transformBash(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): CodeBlockNode {\n if (Node.isJsxSelfClosingElement(node)) {\n return { kind: 'codeBlock', language: 'bash', content: '' };\n }\n\n // Use extractCodeContent to preserve whitespace\n const content = extractCodeContent(node);\n\n return {\n kind: 'codeBlock',\n language: 'bash',\n content,\n };\n}\n\n/**\n * Transform <ReadFiles> to ReadFilesNode\n *\n * Extracts the files prop (which should be a defineFiles() result)\n * and creates a ReadFilesNode with file entries.\n */\nexport function transformReadFiles(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): ReadFilesNode {\n const opening = Node.isJsxElement(node) ? node.getOpeningElement() : node;\n\n // Get the 'files' prop - should be an identifier referencing defineFiles result\n const filesAttr = opening.getAttribute('files');\n if (!filesAttr || !Node.isJsxAttribute(filesAttr)) {\n throw ctx.createError('ReadFiles requires files prop', node);\n }\n\n const init = filesAttr.getInitializer();\n if (!init || !Node.isJsxExpression(init)) {\n throw ctx.createError('ReadFiles files prop must be a JSX expression', node);\n }\n\n const expr = init.getExpression();\n if (!expr) {\n throw ctx.createError('ReadFiles files prop expression is empty', node);\n }\n\n // The files prop should reference a variable that holds defineFiles() result\n // We need to trace back to find the defineFiles() call and extract its schema\n const files: ReadFileEntry[] = [];\n\n // If it's an identifier, look up the variable declaration\n if (Node.isIdentifier(expr)) {\n const varName = expr.getText();\n // Find the variable declaration in the source file\n const sourceFile = ctx.sourceFile;\n if (sourceFile) {\n const statements = sourceFile.getStatements();\n for (const stmt of statements) {\n if (Node.isVariableStatement(stmt)) {\n for (const decl of stmt.getDeclarationList().getDeclarations()) {\n if (decl.getName() === varName) {\n const initializer = decl.getInitializer();\n if (initializer && Node.isCallExpression(initializer)) {\n const callee = initializer.getExpression();\n if (Node.isIdentifier(callee) && callee.getText() === 'defineFiles') {\n // Found the defineFiles call - extract the schema\n const args = initializer.getArguments();\n if (args.length > 0 && Node.isObjectLiteralExpression(args[0])) {\n extractFilesFromSchema(args[0], files);\n }\n }\n }\n }\n }\n }\n }\n }\n }\n // If it's a call expression directly: <ReadFiles files={defineFiles({...})} />\n else if (Node.isCallExpression(expr)) {\n const callee = expr.getExpression();\n if (Node.isIdentifier(callee) && callee.getText() === 'defineFiles') {\n const args = expr.getArguments();\n if (args.length > 0 && Node.isObjectLiteralExpression(args[0])) {\n extractFilesFromSchema(args[0], files);\n }\n }\n }\n\n if (files.length === 0) {\n throw ctx.createError('ReadFiles: could not extract files from defineFiles schema', node);\n }\n\n return {\n kind: 'readFiles',\n files,\n };\n}\n\n/**\n * Transform <PromptTemplate> to PromptTemplateNode\n *\n * <PromptTemplate>\n * <XmlBlock name=\"objective\">...</XmlBlock>\n * </PromptTemplate>\n *\n * Becomes:\n * ```markdown\n * <objective>\n * ...\n * </objective>\n * ```\n */\nexport function transformPromptTemplate(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): PromptTemplateNode {\n if (Node.isJsxSelfClosingElement(node)) {\n return { kind: 'promptTemplate', children: [] };\n }\n\n // Transform children normally\n const children = transformBlockChildren(node.getJsxChildren(), ctx);\n\n return {\n kind: 'promptTemplate',\n children: children as BaseBlockNode[],\n };\n}\n\n/**\n * Extract code content from JSX element, preserving whitespace\n * Used by transformBash and similar code block transformers\n */\nfunction extractCodeContent(node: JsxElement): string {\n const parts: string[] = [];\n\n for (const child of node.getJsxChildren()) {\n if (Node.isJsxText(child)) {\n parts.push(child.getText());\n } else if (Node.isJsxExpression(child)) {\n // Handle {`template`} and {\"string\"} expressions\n const expr = child.getExpression();\n if (expr) {\n if (Node.isStringLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (Node.isTemplateExpression(expr)) {\n parts.push(extractTemplateContent(expr));\n }\n }\n }\n }\n\n // Join all parts\n let content = parts.join('');\n\n // Strip leading and trailing newlines (but preserve internal whitespace)\n content = content.replace(/^\\n+/, '').replace(/\\n+$/, '');\n\n return content;\n}\n\n/**\n * Extract file entries from defineFiles schema object literal\n */\nfunction extractFilesFromSchema(obj: ObjectLiteralExpression, files: ReadFileEntry[]): void {\n for (const prop of obj.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const key = prop.getName();\n const value = prop.getInitializer();\n\n if (value && Node.isObjectLiteralExpression(value)) {\n // Extract path and required from the FileDef object\n let path: string | undefined;\n let required = true; // Default true\n\n for (const fileProp of value.getProperties()) {\n if (Node.isPropertyAssignment(fileProp)) {\n const propName = fileProp.getName();\n const propValue = fileProp.getInitializer();\n\n if (propName === 'path' && propValue) {\n if (Node.isStringLiteral(propValue)) {\n path = propValue.getLiteralValue();\n } else if (Node.isNoSubstitutionTemplateLiteral(propValue)) {\n path = propValue.getLiteralValue();\n } else if (Node.isTemplateExpression(propValue)) {\n // Template with ${} - preserve as-is for shell interpolation\n path = extractTemplatePath(propValue);\n }\n } else if (propName === 'required' && propValue) {\n if (propValue.getText() === 'false') {\n required = false;\n }\n }\n }\n }\n\n if (path) {\n // Convert key to UPPER_SNAKE_CASE + _CONTENT\n const varName = key.replace(/([a-z])([A-Z])/g, '$1_$2').toUpperCase() + '_CONTENT';\n files.push({ varName, path, required });\n }\n }\n }\n }\n}\n\n/**\n * Extract path from template expression, preserving ${} for shell\n */\nfunction extractTemplatePath(tmpl: TemplateExpression): string {\n let result = tmpl.getHead().getLiteralText();\n\n for (const span of tmpl.getTemplateSpans()) {\n const spanExpr = span.getExpression();\n // Convert TS ${expr} to shell ${expr}\n result += '${' + spanExpr.getText() + '}';\n result += span.getLiteral().getLiteralText();\n }\n\n return result;\n}\n","/**\n * Markdown transformation module\n *\n * Handles transformMarkdown, transformXmlBlock, transformCustomComponent\n * and related helper functions for markdown content and XML blocks.\n */\n\nimport { Node, JsxElement, JsxSelfClosingElement, JsxFragment, TemplateExpression, BinaryExpression, PropertyAccessExpression } from 'ts-morph';\nimport type { BlockNode, XmlBlockNode } from '../../ir/index.js';\nimport type { TransformContext } from './types.js';\nimport { getAttributeValue, resolveComponentImport } from '../utils/index.js';\nimport { isValidXmlName } from './shared.js';\n\n/**\n * Transform XmlBlock component to XmlBlockNode IR\n */\nexport function transformXmlBlock(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): XmlBlockNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Get required name attribute\n const nameAttr = getAttributeValue(openingElement, 'name');\n if (!nameAttr) {\n throw ctx.createError('XmlBlock requires name prop', node);\n }\n\n // Validate XML name\n if (!isValidXmlName(nameAttr)) {\n throw ctx.createError(\n `Invalid XML tag name '${nameAttr}' - must start with letter/underscore, contain only letters, digits, underscores, hyphens, or periods, and not start with 'xml'`,\n node\n );\n }\n\n // Import transformBlockChildren from dispatch to avoid circular dependency\n const { transformBlockChildren } = require('./dispatch.js');\n\n // Transform children as blocks (with If/Else sibling detection)\n const children = Node.isJsxElement(node)\n ? transformBlockChildren(node.getJsxChildren(), ctx)\n : [];\n\n return {\n kind: 'xmlBlock',\n name: nameAttr,\n children,\n };\n}\n\n/**\n * Transform Markdown component to raw content\n */\nexport function transformMarkdown(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): BlockNode {\n if (Node.isJsxSelfClosingElement(node)) {\n // Self-closing <Markdown /> - empty content\n return { kind: 'raw', content: '' };\n }\n\n // Extract raw content from children\n // JSX strips whitespace after expressions, so we need to detect and restore it\n //\n // In markdown, we need to preserve:\n // - Newlines before section headers (## )\n // - Newlines between paragraphs/blocks\n // - Spaces between inline elements\n const parts: string[] = [];\n const jsxChildren = node.getJsxChildren();\n\n for (let i = 0; i < jsxChildren.length; i++) {\n const child = jsxChildren[i];\n const prev = parts[parts.length - 1];\n\n if (Node.isJsxText(child)) {\n let text = child.getText();\n\n // Empty text between two expressions likely had a newline that JSX stripped\n // We restore it as a newline (inside code blocks, between list items, etc.)\n if (text === '' && i > 0 && i < jsxChildren.length - 1) {\n const prevChild = jsxChildren[i - 1];\n const nextChild = jsxChildren[i + 1];\n if (Node.isJsxExpression(prevChild) && Node.isJsxExpression(nextChild)) {\n // Two adjacent expressions had whitespace between them that was stripped\n parts.push('\\n');\n continue;\n }\n }\n\n // Check if we need to restore stripped whitespace before this text\n // JSX eats leading whitespace from text following an expression\n if (prev && !/\\s$/.test(prev) && !/^\\s/.test(text) && text !== '') {\n // Detect what kind of whitespace was likely stripped:\n // - If text starts with ## (heading), add double newline\n // - If text starts with ``` (code fence), add double newline\n // - If text starts with ** (bold), add newline (often a new paragraph)\n // - If text starts with - or * or digit. (list item), add newline\n // - For | (table), only add newline if prev ends with | (new row)\n // Otherwise it's a cell separator, just needs space\n // - Otherwise add space\n if (/^#{1,6}\\s/.test(text) || /^```/.test(text)) {\n parts.push('\\n\\n');\n } else if (/^\\*\\*/.test(text)) {\n // Bold at start of line usually means new paragraph or list item\n parts.push('\\n');\n } else if (/^[-*]\\s/.test(text) || /^\\d+\\.\\s/.test(text)) {\n parts.push('\\n');\n } else if (/^[|]/.test(text)) {\n // Table pipe: if previous content ended with | it's a new row\n // Otherwise it's a cell separator (just needs space)\n if (/[|]\\s*$/.test(prev)) {\n parts.push('\\n');\n } else {\n parts.push(' ');\n }\n } else if (!/^[.,;:!?)}\\]>`\"'/]/.test(text)) {\n parts.push(' ');\n }\n }\n\n parts.push(text);\n } else if (Node.isJsxExpression(child)) {\n // Handle {variable} or {\"literal\"} or {`template`} expressions\n const expr = child.getExpression();\n if (expr) {\n if (Node.isStringLiteral(expr)) {\n // String literal: {\"text\"} -> text\n parts.push(expr.getLiteralValue());\n } else if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n // Template literal without substitutions: {`text`} -> text\n parts.push(expr.getLiteralValue());\n } else if (Node.isTemplateExpression(expr)) {\n // Template expression with substitutions: {`text ${var} more`}\n // Reconstruct the template by joining head, spans, and tail\n let result = expr.getHead().getLiteralText();\n for (const span of expr.getTemplateSpans()) {\n // Get the expression between ${...}\n const spanExpr = span.getExpression();\n // Try to get static value, otherwise use ${expr}\n if (Node.isIdentifier(spanExpr)) {\n result += `\\${${spanExpr.getText()}}`;\n } else if (Node.isStringLiteral(spanExpr)) {\n result += spanExpr.getLiteralValue();\n } else {\n // For complex expressions, preserve the ${...} syntax\n result += `\\${${spanExpr.getText()}}`;\n }\n // Add the literal text after the expression\n const literal = span.getLiteral();\n if (Node.isTemplateMiddle(literal)) {\n result += literal.getLiteralText();\n } else if (Node.isTemplateTail(literal)) {\n result += literal.getLiteralText();\n }\n }\n parts.push(result);\n } else if (Node.isIdentifier(expr)) {\n // Identifier expression: {var} was likely ${var} in bash\n // JSX splits ${var} into \"$\" + {var}, so reconstruct as {var}\n // which preserves the intent for code blocks\n parts.push(`{${expr.getText()}}`);\n } else if (Node.isBinaryExpression(expr)) {\n // Binary expression: string concatenation like `text ` + var + ` more`\n const concat = evaluateStringConcatenation(expr, ctx);\n if (concat !== null) {\n parts.push(concat);\n }\n } else if (Node.isPropertyAccessExpression(expr)) {\n // Property access: obj.prop (like AGENT_PATHS.researcher)\n // Try to resolve the value from a const declaration\n const value = resolvePropertyAccess(expr);\n if (value !== null) {\n parts.push(value);\n }\n }\n // Other expressions (function calls, etc.) cannot be evaluated at transpile time\n }\n }\n }\n\n // Trim outer boundaries, preserve internal whitespace\n const content = parts.join('').trim();\n\n return { kind: 'raw', content };\n}\n\n/**\n * Transform a custom component by resolving its import and inlining its JSX\n *\n * Custom components are user-defined TSX fragments that get inlined at\n * transpile time. Component props are NOT supported in v1 - only parameterless\n * composition.\n */\nexport function transformCustomComponent(\n name: string,\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): BlockNode | null {\n // Validate no props on the component (v1 limitation)\n const openingElement = Node.isJsxElement(node) ? node.getOpeningElement() : node;\n const attributes = openingElement.getAttributes();\n if (attributes.length > 0) {\n throw ctx.createError(`Component props not supported: <${name}> has ${attributes.length} prop(s)`, node);\n }\n\n // Require source file for component resolution\n if (!ctx.sourceFile) {\n throw ctx.createError(\n `Cannot resolve component '${name}': no source file context. ` +\n `Pass sourceFile to transformer.transform() for component composition.`,\n node\n );\n }\n\n // Resolve the component import\n const resolved = resolveComponentImport(name, ctx.sourceFile, ctx.visitedPaths);\n\n // Update visited paths for nested resolution\n ctx.visitedPaths = resolved.visitedPaths;\n\n // Save current sourceFile and set to component's sourceFile for nested resolution\n const previousSourceFile = ctx.sourceFile;\n ctx.sourceFile = resolved.sourceFile;\n\n // Import transformToBlock from dispatch to avoid circular dependency\n const { transformToBlock } = require('./dispatch.js');\n const { transformFragmentChildren } = require('./html.js');\n\n let result: BlockNode | null = null;\n\n // Transform the resolved JSX\n if (Node.isJsxFragment(resolved.jsx)) {\n // Fragment: transform children and return first block\n // (multiple root blocks from a component isn't fully supported - take first)\n const blocks = transformFragmentChildren(resolved.jsx, ctx);\n result = blocks[0] ?? null;\n } else {\n // Single element or self-closing\n result = transformToBlock(resolved.jsx, ctx);\n }\n\n // Restore sourceFile\n ctx.sourceFile = previousSourceFile;\n\n return result;\n}\n\n/**\n * Evaluate a binary expression that represents string concatenation.\n * Handles chains like: `text ` + AGENT_PATHS.researcher + ` more`\n * Returns the concatenated string or null if not evaluable.\n */\nfunction evaluateStringConcatenation(expr: BinaryExpression, ctx: TransformContext): string | null {\n const operator = expr.getOperatorToken().getText();\n if (operator !== '+') {\n return null;\n }\n\n const left = expr.getLeft();\n const right = expr.getRight();\n\n const leftValue = evaluateStringExpression(left, ctx);\n const rightValue = evaluateStringExpression(right, ctx);\n\n if (leftValue === null || rightValue === null) {\n return null;\n }\n\n return leftValue + rightValue;\n}\n\n/**\n * Evaluate an expression that should resolve to a string value.\n * Handles: string literals, template literals, property access, binary expressions.\n */\nfunction evaluateStringExpression(expr: Node, ctx: TransformContext): string | null {\n if (Node.isStringLiteral(expr)) {\n return expr.getLiteralValue();\n }\n if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n return expr.getLiteralValue();\n }\n if (Node.isTemplateExpression(expr)) {\n // Template expression with substitutions - get the literal text\n let result = expr.getHead().getLiteralText();\n for (const span of expr.getTemplateSpans()) {\n const spanExpr = span.getExpression();\n // Try to evaluate the span expression\n const spanValue = evaluateStringExpression(spanExpr, ctx);\n if (spanValue !== null) {\n result += spanValue;\n } else if (Node.isIdentifier(spanExpr)) {\n result += `\\${${spanExpr.getText()}}`;\n } else {\n result += `\\${${spanExpr.getText()}}`;\n }\n const literal = span.getLiteral();\n if (Node.isTemplateMiddle(literal)) {\n result += literal.getLiteralText();\n } else if (Node.isTemplateTail(literal)) {\n result += literal.getLiteralText();\n }\n }\n return result;\n }\n if (Node.isPropertyAccessExpression(expr)) {\n return resolvePropertyAccess(expr);\n }\n if (Node.isBinaryExpression(expr)) {\n return evaluateStringConcatenation(expr, ctx);\n }\n if (Node.isParenthesizedExpression(expr)) {\n return evaluateStringExpression(expr.getExpression(), ctx);\n }\n\n return null;\n}\n\n/**\n * Resolve a property access expression (e.g., AGENT_PATHS.researcher) to its value.\n * Only works for const declarations with object literals.\n */\nfunction resolvePropertyAccess(expr: PropertyAccessExpression): string | null {\n const objectExpr = expr.getExpression();\n const propertyName = expr.getName();\n\n if (!Node.isIdentifier(objectExpr)) {\n return null;\n }\n\n const objectName = objectExpr.getText();\n\n // Find the variable declaration in the source file\n const sourceFile = expr.getSourceFile();\n const varDecls = sourceFile.getVariableDeclarations();\n\n for (const varDecl of varDecls) {\n if (varDecl.getName() === objectName) {\n let initializer = varDecl.getInitializer();\n // Unwrap AsExpression (from \"as const\" syntax)\n if (initializer && Node.isAsExpression(initializer)) {\n initializer = initializer.getExpression();\n }\n if (initializer && Node.isObjectLiteralExpression(initializer)) {\n // Look for the property in the object literal\n for (const prop of initializer.getProperties()) {\n if (Node.isPropertyAssignment(prop) && prop.getName() === propertyName) {\n const propInit = prop.getInitializer();\n if (propInit && Node.isStringLiteral(propInit)) {\n return propInit.getLiteralValue();\n }\n if (propInit && Node.isNoSubstitutionTemplateLiteral(propInit)) {\n return propInit.getLiteralValue();\n }\n }\n }\n }\n break;\n }\n }\n\n return null;\n}\n\n/**\n * Extract text from a template expression, converting ${var} to {var}\n * This preserves GSD's {variable} placeholder syntax\n */\nexport function extractTemplateText(expr: TemplateExpression): string {\n const parts: string[] = [];\n\n // Head: text before first ${...}\n parts.push(expr.getHead().getLiteralText());\n\n // Spans: each has expression + literal text after\n for (const span of expr.getTemplateSpans()) {\n const spanExpr = span.getExpression();\n // Convert ${variable} to {variable} for GSD format\n parts.push(`{${spanExpr.getText()}}`);\n parts.push(span.getLiteral().getLiteralText());\n }\n\n return parts.join('');\n}\n","/**\n * Inline content transformer functions\n *\n * Transforms inline JSX content to InlineNode types:\n * - Text nodes → TextNode\n * - b/strong → BoldNode\n * - i/em → ItalicNode\n * - code → InlineCodeNode\n * - a → LinkNode\n * - br → LineBreakNode\n *\n * Extracted from Transformer class for maintainability and modularity.\n */\n\nimport {\n Node,\n JsxElement,\n JsxSelfClosingElement,\n} from 'ts-morph';\nimport type {\n InlineNode,\n LinkNode,\n} from '../../ir/index.js';\nimport {\n getElementName,\n getAttributeValue,\n extractInlineText,\n} from '../utils/index.js';\nimport type { TransformContext } from './types.js';\nimport { extractAllText } from './html.js';\n\n// ============================================================================\n// Inline Content Transformation\n// ============================================================================\n\n/**\n * Transform JSX children to array of InlineNodes\n * Used for elements that contain inline content (p, h1-h6, b, i, a, etc.)\n */\nexport function transformInlineChildren(\n node: JsxElement,\n ctx: TransformContext\n): InlineNode[] {\n const children = node.getJsxChildren();\n const inlines: InlineNode[] = [];\n\n for (const child of children) {\n const inline = transformToInline(child, ctx);\n if (inline) inlines.push(inline);\n }\n\n // Trim leading/trailing whitespace from first and last text nodes\n // (preserves internal spacing between inline elements)\n trimBoundaryTextNodes(inlines);\n\n return inlines;\n}\n\n/**\n * Trim leading/trailing whitespace from boundary text nodes\n * Preserves internal spacing between inline elements\n */\nexport function trimBoundaryTextNodes(inlines: InlineNode[]): void {\n if (inlines.length === 0) return;\n\n // Trim leading whitespace from first text node\n const first = inlines[0];\n if (first.kind === 'text') {\n first.value = first.value.trimStart();\n if (!first.value) {\n inlines.shift();\n }\n }\n\n if (inlines.length === 0) return;\n\n // Trim trailing whitespace from last text node\n const last = inlines[inlines.length - 1];\n if (last.kind === 'text') {\n last.value = last.value.trimEnd();\n if (!last.value) {\n inlines.pop();\n }\n }\n}\n\n// ============================================================================\n// Node to Inline Transformation\n// ============================================================================\n\n/**\n * Transform a single node to InlineNode\n * Handles text, inline elements, expressions\n */\nexport function transformToInline(\n node: Node,\n ctx: TransformContext\n): InlineNode | null {\n if (Node.isJsxText(node)) {\n // Use extractInlineText to preserve leading/trailing spaces\n const text = extractInlineText(node);\n if (!text) return null;\n return { kind: 'text', value: text };\n }\n\n if (Node.isJsxSelfClosingElement(node)) {\n const name = getElementName(node);\n if (name === 'br') {\n return { kind: 'lineBreak' };\n }\n throw ctx.createError(`Unsupported inline self-closing element: <${name}>`, node);\n }\n\n if (Node.isJsxElement(node)) {\n const name = getElementName(node);\n return transformInlineElement(name, node, ctx);\n }\n\n // Handle JSX expressions\n if (Node.isJsxExpression(node)) {\n const expr = node.getExpression();\n if (!expr) return null;\n\n // String literals: {' '} or {'text'}\n if (Node.isStringLiteral(expr)) {\n const value = expr.getLiteralValue();\n if (value) {\n return { kind: 'text', value };\n }\n return null;\n }\n\n // Call expressions: output.field('key') -> '{output.key}'\n if (Node.isCallExpression(expr)) {\n const propAccess = expr.getExpression();\n // Check if it's a method call like output.field('key')\n if (Node.isPropertyAccessExpression(propAccess)) {\n const methodName = propAccess.getName();\n const objExpr = propAccess.getExpression();\n\n // Check if it's calling .field() on a useOutput result\n if (methodName === 'field' && Node.isIdentifier(objExpr)) {\n const outputName = objExpr.getText();\n // Verify this is a tracked output\n if (ctx.outputs.has(outputName)) {\n // Get the field key from the argument\n const args = expr.getArguments();\n if (args.length >= 1) {\n const keyArg = args[0];\n if (Node.isStringLiteral(keyArg)) {\n const fieldKey = keyArg.getLiteralValue();\n return { kind: 'text', value: `{output.${fieldKey}}` };\n }\n }\n }\n }\n }\n }\n\n // Property access expressions: ctx.name, ctx.outputPath, etc.\n if (Node.isPropertyAccessExpression(expr)) {\n const objExpr = expr.getExpression();\n const propName = expr.getName();\n\n // Check if accessing render props context (e.g., ctx.name)\n if (Node.isIdentifier(objExpr) && ctx.renderPropsContext) {\n const objName = objExpr.getText();\n if (objName === ctx.renderPropsContext.paramName) {\n const value = ctx.renderPropsContext.values[propName];\n if (value !== undefined) {\n return { kind: 'text', value };\n }\n }\n }\n }\n\n // Other expressions are ignored\n return null;\n }\n\n return null;\n}\n\n// ============================================================================\n// Inline Element Transformation\n// ============================================================================\n\n/**\n * Transform inline JSX element to InlineNode\n * Handles b, i, strong, em, code, a\n */\nexport function transformInlineElement(\n name: string,\n node: JsxElement,\n ctx: TransformContext\n): InlineNode {\n // Bold\n if (name === 'b' || name === 'strong') {\n return { kind: 'bold', children: transformInlineChildren(node, ctx) };\n }\n\n // Italic\n if (name === 'i' || name === 'em') {\n return { kind: 'italic', children: transformInlineChildren(node, ctx) };\n }\n\n // Inline code\n if (name === 'code') {\n // Inline code: extract raw text content\n const text = extractAllText(node);\n return { kind: 'inlineCode', value: text };\n }\n\n // Link\n if (name === 'a') {\n return transformLink(node, ctx);\n }\n\n throw ctx.createError(`Unsupported inline element: <${name}>`, node);\n}\n\n// ============================================================================\n// Link Transformer\n// ============================================================================\n\n/**\n * Transform a link element to LinkNode\n */\nexport function transformLink(\n node: JsxElement,\n ctx: TransformContext\n): LinkNode {\n const href = getAttributeValue(node.getOpeningElement(), 'href');\n if (!href) {\n throw ctx.createError('<a> element requires href attribute', node);\n }\n\n const children = transformInlineChildren(node, ctx);\n return { kind: 'link', url: href, children };\n}\n","/**\n * Central transform dispatcher\n *\n * Prevents circular imports by providing a single entry point\n * for recursive transform calls. Individual transformer modules\n * import transformBlockChildren and transformToBlock instead of each other.\n */\n\nimport { Node, JsxElement, JsxSelfClosingElement, TemplateExpression } from 'ts-morph';\nimport type { BlockNode } from '../../ir/index.js';\nimport type { TransformContext } from './types.js';\nimport { getElementName, extractText } from '../utils/index.js';\nimport { isCustomComponent, extractTemplateContent } from './shared.js';\n\n// Import all transform functions from modules\nimport { transformList, transformBlockquote, transformCodeBlock, transformDiv } from './html.js';\nimport { transformTable, transformPropList, transformExecutionContext, transformSuccessCriteria, transformOfferNext, transformXmlSection, transformXmlWrapper } from './semantic.js';\nimport { transformIf, transformElse, transformLoop, transformOnStatus } from './control.js';\nimport { transformSpawnAgent } from './spawner.js';\nimport { transformAssign, transformAssignGroup } from './variables.js';\nimport { transformReadState, transformWriteState } from './state.js';\nimport { transformStep, transformBash, transformReadFiles, transformPromptTemplate } from './primitives.js';\nimport { transformMarkdown, transformXmlBlock, transformCustomComponent } from './markdown.js';\nimport { transformInlineChildren } from './inline.js';\n\n/**\n * Extract raw markdown text from JSX text node, preserving newlines\n * Uses source file positions to bypass JSX whitespace normalization\n */\nfunction extractRawMarkdownText(node: Node): string | null {\n if (!Node.isJsxText(node)) return null;\n\n // Use raw source text extraction to bypass JSX whitespace normalization\n const sourceFile = node.getSourceFile();\n const text = sourceFile.getFullText().slice(node.getStart(), node.getEnd());\n\n // For single-line content, use standard normalization (inline text)\n if (!text.includes('\\n')) {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n return normalized || null;\n }\n\n // Multi-line content: preserve newlines, dedent, and clean up\n const lines = text.split('\\n');\n\n // Find minimum indentation (ignoring empty lines and first line)\n let minIndent = Infinity;\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim().length > 0) {\n const leadingSpaces = line.match(/^[ \\t]*/)?.[0].length ?? 0;\n minIndent = Math.min(minIndent, leadingSpaces);\n }\n }\n if (minIndent === Infinity) minIndent = 0;\n\n // Dedent all lines (except first line which has no indent from opening tag)\n const dedented = lines.map((line, i) => {\n if (line.trim().length === 0) return '';\n if (i === 0) return line;\n return line.slice(minIndent);\n });\n\n // Join and clean up\n let result = dedented.join('\\n').replace(/\\n{3,}/g, '\\n\\n');\n\n // Remove ONLY the first newline after opening tag (not intentional blank lines)\n // Use [ \\t]* instead of \\s* to avoid matching multiple newlines\n result = result.replace(/^[ \\t]*\\n/, '');\n\n // Preserve trailing newline as content separator\n // (emitter will handle stripping final newline before closing tag)\n result = result.trimEnd();\n // Add back ONE trailing newline if there was content\n if (result) {\n result += '\\n';\n }\n\n return result || null;\n}\n\n/**\n * Transform a JSX node to BlockNode\n * Called by various transformer modules for recursive transformation\n */\nexport function transformToBlock(node: Node, ctx: TransformContext): BlockNode | null {\n if (Node.isJsxText(node)) {\n // Use raw source extraction to preserve newlines in markdown content\n const text = extractRawMarkdownText(node);\n if (!text) return null;\n\n // Multi-line content becomes raw block (preserves newlines)\n // Single-line content becomes paragraph (inline text)\n if (text.includes('\\n')) {\n return { kind: 'raw', content: text };\n }\n return { kind: 'paragraph', children: [{ kind: 'text', value: text }] };\n }\n\n if (Node.isJsxElement(node) || Node.isJsxSelfClosingElement(node)) {\n const name = getElementName(node);\n return transformElement(name, node, ctx);\n }\n\n // Handle JSX expressions: {`template`}, {\"string\"}, etc.\n if (Node.isJsxExpression(node)) {\n const expr = node.getExpression();\n if (expr) {\n let content: string | null = null;\n\n if (Node.isStringLiteral(expr)) {\n content = expr.getLiteralValue();\n } else if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n // Use getText() and strip backticks to preserve raw content including backslashes\n // getLiteralValue() interprets escape sequences which loses backslashes\n const text = expr.getText();\n content = text.slice(1, -1); // Remove surrounding backticks\n } else if (Node.isTemplateExpression(expr)) {\n content = extractTemplateContent(expr);\n }\n\n if (content !== null) {\n // Add trailing newline if content doesn't end with one\n // This ensures proper separation from following content\n if (!content.endsWith('\\n')) {\n content += '\\n';\n }\n // Return raw content block\n return { kind: 'raw', content };\n }\n }\n }\n\n return null; // Other expressions not yet handled\n}\n\n/**\n * Route element transformation based on tag name\n */\nfunction transformElement(\n name: string,\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): BlockNode | null {\n // Heading elements\n const headingMatch = name.match(/^h([1-6])$/);\n if (headingMatch) {\n const level = parseInt(headingMatch[1], 10) as 1 | 2 | 3 | 4 | 5 | 6;\n const children = Node.isJsxElement(node)\n ? transformInlineChildren(node, ctx)\n : [];\n return { kind: 'heading', level, children };\n }\n\n // Paragraph\n if (name === 'p') {\n const children = Node.isJsxElement(node)\n ? transformInlineChildren(node, ctx)\n : [];\n return { kind: 'paragraph', children };\n }\n\n // Self-closing hr\n if (name === 'hr') {\n return { kind: 'thematicBreak' };\n }\n\n // Unordered list\n if (name === 'ul') {\n return transformList(node, false, ctx);\n }\n\n // Ordered list\n if (name === 'ol') {\n return transformList(node, true, ctx);\n }\n\n // Blockquote\n if (name === 'blockquote') {\n return transformBlockquote(node, ctx);\n }\n\n // Code block (pre containing code)\n if (name === 'pre') {\n return transformCodeBlock(node, ctx);\n }\n\n // XML block via div with name attribute\n if (name === 'div') {\n return transformDiv(node, ctx);\n }\n\n // XmlBlock component\n if (name === 'XmlBlock') {\n return transformXmlBlock(node, ctx);\n }\n\n // SpawnAgent block element (inside Command)\n if (name === 'SpawnAgent') {\n return transformSpawnAgent(node, ctx);\n }\n\n // Assign block element (variable assignment)\n if (name === 'Assign') {\n return transformAssign(node, ctx);\n }\n\n // AssignGroup block element (grouped variable assignments)\n if (name === 'AssignGroup') {\n return transformAssignGroup(node, ctx);\n }\n\n // If component - conditional block\n if (name === 'If') {\n return transformIf(node, ctx);\n }\n\n // Else component - standalone is an error (must follow If as sibling)\n if (name === 'Else') {\n throw ctx.createError('<Else> must follow <If> as sibling', node);\n }\n\n // Loop component - iteration block\n if (name === 'Loop') {\n return transformLoop(node, ctx);\n }\n\n // OnStatus component - status-based conditional block\n if (name === 'OnStatus') {\n return transformOnStatus(node, ctx);\n }\n\n // ReadState component - read state from registry\n if (name === 'ReadState') {\n return transformReadState(node, ctx);\n }\n\n // WriteState component - write state to registry\n if (name === 'WriteState') {\n return transformWriteState(node, ctx);\n }\n\n // Table component - structured props\n if (name === 'Table') {\n return transformTable(node, ctx);\n }\n\n // List component - structured props\n if (name === 'List') {\n return transformPropList(node, ctx);\n }\n\n // Semantic workflow components\n if (name === 'ExecutionContext') {\n return transformExecutionContext(node, ctx);\n }\n\n if (name === 'SuccessCriteria') {\n return transformSuccessCriteria(node, ctx);\n }\n\n if (name === 'OfferNext') {\n return transformOfferNext(node, ctx);\n }\n\n if (name === 'XmlSection') {\n return transformXmlSection(node, ctx);\n }\n\n if (name === 'DeviationRules' || name === 'CommitRules' || name === 'WaveExecution' || name === 'CheckpointHandling') {\n return transformXmlWrapper(name, node, ctx);\n }\n\n // Step workflow primitive\n if (name === 'Step') {\n return transformStep(node, ctx);\n }\n\n // Bash code block primitive\n if (name === 'Bash') {\n return transformBash(node, ctx);\n }\n\n // ReadFiles - batch file reading\n if (name === 'ReadFiles') {\n return transformReadFiles(node, ctx);\n }\n\n // PromptTemplate - wrap content in markdown code fence\n if (name === 'PromptTemplate') {\n return transformPromptTemplate(node, ctx);\n }\n\n // Markdown passthrough\n if (name === 'Markdown') {\n return transformMarkdown(node, ctx);\n }\n\n // Custom component composition\n if (isCustomComponent(name)) {\n return transformCustomComponent(name, node, ctx);\n }\n\n throw ctx.createError(`Unsupported block element: <${name}>`, node);\n}\n\n/**\n * Transform JSX children to BlockNodes, handling If/Else sibling pairs\n *\n * This is the main workhorse for transforming arrays of JSX children.\n * It handles:\n * - Filtering out whitespace-only text nodes\n * - Pairing If/Else siblings (Else must immediately follow If)\n * - Dispatching each child to appropriate transformer\n * - Skipping null results (filtered nodes)\n */\nexport function transformBlockChildren(\n jsxChildren: Node[],\n ctx: TransformContext\n): BlockNode[] {\n const blocks: BlockNode[] = [];\n let i = 0;\n\n while (i < jsxChildren.length) {\n const child = jsxChildren[i];\n\n // Skip whitespace-only text\n if (Node.isJsxText(child)) {\n const text = extractText(child);\n if (!text) {\n i++;\n continue;\n }\n }\n\n if (Node.isJsxElement(child) || Node.isJsxSelfClosingElement(child)) {\n const childName = getElementName(child);\n\n if (childName === 'If') {\n // Transform If\n const ifNode = transformIf(child, ctx);\n blocks.push(ifNode);\n\n // Check for Else sibling\n let nextIndex = i + 1;\n while (nextIndex < jsxChildren.length) {\n const sibling = jsxChildren[nextIndex];\n // Skip whitespace-only text\n if (Node.isJsxText(sibling)) {\n const text = extractText(sibling);\n if (!text) {\n nextIndex++;\n continue;\n }\n }\n // Check if next non-whitespace is Else\n if ((Node.isJsxElement(sibling) || Node.isJsxSelfClosingElement(sibling))\n && getElementName(sibling) === 'Else') {\n const elseNode = transformElse(sibling, ctx);\n blocks.push(elseNode);\n i = nextIndex; // Skip past Else in outer loop\n }\n break;\n }\n } else {\n const block = transformToBlock(child, ctx);\n if (block) blocks.push(block);\n }\n } else {\n const block = transformToBlock(child, ctx);\n if (block) blocks.push(block);\n }\n\n i++;\n }\n\n return blocks;\n}\n","/**\n * HTML element transformer functions\n *\n * Transforms HTML-like JSX elements to IR nodes:\n * - ul/ol → ListNode\n * - li → ListItemNode\n * - blockquote → BlockquoteNode\n * - pre → CodeBlockNode\n * - div → XmlBlockNode or GroupNode\n *\n * Extracted from Transformer class for maintainability and modularity.\n */\n\nimport {\n Node,\n JsxElement,\n JsxSelfClosingElement,\n JsxOpeningElement,\n TemplateExpression,\n} from 'ts-morph';\nimport type {\n ListNode,\n ListItemNode,\n BlockquoteNode,\n CodeBlockNode,\n XmlBlockNode,\n GroupNode,\n BaseBlockNode,\n BlockNode,\n InlineNode,\n} from '../../ir/index.js';\nimport {\n getElementName,\n getAttributeValue,\n extractText,\n} from '../utils/index.js';\nimport type { TransformContext } from './types.js';\nimport { transformBlockChildren, transformToBlock } from './dispatch.js';\nimport { transformToInline } from './inline.js';\n\n// ============================================================================\n// Inline Element Classification\n// ============================================================================\n\n/**\n * Inline HTML elements that should be wrapped in paragraphs when at block level\n */\nconst INLINE_ELEMENTS = new Set([\n 'a', 'b', 'i', 'strong', 'em', 'code', 'span', 'br',\n]);\n\n/**\n * Check if a tag name represents an inline element\n */\nfunction isInlineElement(tagName: string): boolean {\n return INLINE_ELEMENTS.has(tagName);\n}\n\n/**\n * Validate that a string is a valid XML tag name\n * Per XML 1.0 spec (simplified): starts with letter or underscore,\n * followed by letters, digits, underscores, hyphens, or periods.\n * Cannot start with 'xml' (case-insensitive).\n */\nconst XML_NAME_REGEX = /^[a-zA-Z_][a-zA-Z0-9_.\\-]*$/;\n\nfunction isValidXmlName(name: string): boolean {\n if (!name) return false;\n if (!XML_NAME_REGEX.test(name)) return false;\n if (name.toLowerCase().startsWith('xml')) return false;\n return true;\n}\n\n// ============================================================================\n// List Transformers\n// ============================================================================\n\n/**\n * Transform ul/ol element to ListNode\n */\nexport function transformList(\n node: JsxElement | JsxSelfClosingElement,\n ordered: boolean,\n ctx: TransformContext\n): ListNode {\n if (Node.isJsxSelfClosingElement(node)) {\n return { kind: 'list', ordered, items: [] };\n }\n\n const items: ListItemNode[] = [];\n for (const child of node.getJsxChildren()) {\n if (Node.isJsxElement(child)) {\n const childName = getElementName(child);\n if (childName === 'li') {\n items.push(transformListItem(child, ctx));\n } else {\n throw ctx.createError(`Expected <li> inside list, got <${childName}>`, child);\n }\n } else if (Node.isJsxText(child) && !child.containsOnlyTriviaWhiteSpaces()) {\n throw ctx.createError('Lists can only contain <li> elements', child);\n }\n // Skip whitespace-only text nodes\n }\n\n return { kind: 'list', ordered, items };\n}\n\n/**\n * Transform li element to ListItemNode\n * Handles both block-level and inline content within list items\n */\nexport function transformListItem(\n node: JsxElement,\n ctx: TransformContext\n): ListItemNode {\n // List items can contain blocks (paragraphs, nested lists) or inline content\n // We need to collect inline content together to preserve spacing between elements\n const children: BlockNode[] = [];\n const jsxChildren = node.getJsxChildren();\n\n // Helper to check if a child is block-level content\n const isBlockContent = (child: Node): boolean => {\n if (Node.isJsxElement(child) || Node.isJsxSelfClosingElement(child)) {\n const name = getElementName(child);\n return name === 'ul' || name === 'ol' || name === 'p';\n }\n return false;\n };\n\n // Collect inline content sequences and process them together\n let inlineSequence: Node[] = [];\n\n const flushInlineSequence = () => {\n if (inlineSequence.length === 0) return;\n\n // Transform accumulated inline content to a paragraph\n const inlineNodes: InlineNode[] = [];\n for (const inlineChild of inlineSequence) {\n const inline = transformToInline(inlineChild, ctx);\n if (inline) inlineNodes.push(inline);\n }\n\n if (inlineNodes.length > 0) {\n // Trim boundary whitespace while preserving internal spacing\n trimBoundaryInlines(inlineNodes);\n if (inlineNodes.length > 0) {\n children.push({ kind: 'paragraph', children: inlineNodes });\n }\n }\n\n inlineSequence = [];\n };\n\n for (const child of jsxChildren) {\n if (isBlockContent(child)) {\n // Flush any pending inline content before block\n flushInlineSequence();\n\n // Transform block content via dispatch\n const block = transformToBlock(child, ctx);\n if (block) children.push(block);\n } else {\n // Accumulate inline content (text, expressions, inline elements)\n inlineSequence.push(child);\n }\n }\n\n // Flush any remaining inline content\n flushInlineSequence();\n\n return { kind: 'listItem', children: children as BaseBlockNode[] };\n}\n\n/**\n * Trim boundary whitespace from inline nodes while preserving internal spacing\n */\nfunction trimBoundaryInlines(inlines: InlineNode[]): void {\n if (inlines.length === 0) return;\n\n // Trim leading whitespace from first text node\n const first = inlines[0];\n if (first.kind === 'text') {\n first.value = first.value.trimStart();\n if (!first.value) {\n inlines.shift();\n }\n }\n\n if (inlines.length === 0) return;\n\n // Trim trailing whitespace from last text node\n const last = inlines[inlines.length - 1];\n if (last.kind === 'text') {\n last.value = last.value.trimEnd();\n if (!last.value) {\n inlines.pop();\n }\n }\n}\n\n// ============================================================================\n// Blockquote Transformer\n// ============================================================================\n\n/**\n * Transform blockquote element to BlockquoteNode\n */\nexport function transformBlockquote(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): BlockquoteNode {\n if (Node.isJsxSelfClosingElement(node)) {\n return { kind: 'blockquote', children: [] };\n }\n\n // Transform children as blocks (with If/Else sibling detection)\n const children = transformBlockChildren(node.getJsxChildren(), ctx);\n\n return { kind: 'blockquote', children: children as BaseBlockNode[] };\n}\n\n// ============================================================================\n// Code Block Transformer\n// ============================================================================\n\n/**\n * Transform pre element to CodeBlockNode\n */\nexport function transformCodeBlock(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): CodeBlockNode {\n if (Node.isJsxSelfClosingElement(node)) {\n return { kind: 'codeBlock', content: '' };\n }\n\n // Look for <code> child with optional language\n const children = node.getJsxChildren();\n for (const child of children) {\n if (Node.isJsxElement(child) && getElementName(child) === 'code') {\n const language = getAttributeValue(\n child.getOpeningElement(),\n 'className'\n )?.replace(/^language-/, '');\n\n // Extract raw text content preserving whitespace\n const content = extractCodeContent(child, ctx);\n return { kind: 'codeBlock', language, content };\n }\n }\n\n // Pre without code child - extract text directly\n const content = extractCodeContent(node, ctx);\n return { kind: 'codeBlock', content };\n}\n\n/**\n * Extract code content from pre/code element, preserving whitespace\n */\nexport function extractCodeContent(\n node: JsxElement,\n ctx: TransformContext\n): string {\n // Preserve whitespace in code blocks - don't normalize\n const parts: string[] = [];\n for (const child of node.getJsxChildren()) {\n if (Node.isJsxText(child)) {\n parts.push(child.getText());\n } else if (Node.isJsxExpression(child)) {\n // Handle {`template`} and {\"string\"} expressions\n const expr = child.getExpression();\n if (expr) {\n if (Node.isStringLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (Node.isTemplateExpression(expr)) {\n // Template with substitutions: {`text ${var} more`}\n parts.push(extractTemplateText(expr));\n }\n }\n }\n }\n // Trim only the outermost whitespace (leading/trailing)\n return parts.join('').trim();\n}\n\n/**\n * Extract template text with variable substitution\n * Converts ${variable} to {variable} for GSD format\n */\nfunction extractTemplateText(expr: TemplateExpression): string {\n const parts: string[] = [];\n\n // Head: text before first ${...}\n parts.push(expr.getHead().getLiteralText());\n\n // Spans: each has expression + literal text after\n for (const span of expr.getTemplateSpans()) {\n const spanExpr = span.getExpression();\n // Convert ${variable} to {variable} for GSD format\n parts.push(`{${spanExpr.getText()}}`);\n parts.push(span.getLiteral().getLiteralText());\n }\n\n return parts.join('');\n}\n\n// ============================================================================\n// Div Transformer\n// ============================================================================\n\n/**\n * Transform div element to XmlBlockNode (if has name attribute) or GroupNode (invisible container)\n */\nexport function transformDiv(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): XmlBlockNode | GroupNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Get name attribute (optional - if missing, create invisible group)\n const nameAttr = getAttributeValue(openingElement, 'name');\n\n // Transform children as mixed content (inline elements get wrapped in paragraphs)\n const children = Node.isJsxElement(node)\n ? transformMixedChildren(node.getJsxChildren(), ctx)\n : [];\n\n // No name attribute: invisible grouping container with tight spacing\n if (!nameAttr) {\n return {\n kind: 'group',\n children: children as BaseBlockNode[],\n };\n }\n\n // Has name attribute: XML block with wrapper tags\n // Validate XML name\n if (!isValidXmlName(nameAttr)) {\n throw ctx.createError(\n `Invalid XML tag name '${nameAttr}' - must start with letter/underscore, contain only letters, digits, underscores, hyphens, or periods, and not start with 'xml'`,\n node\n );\n }\n\n // Extract other attributes (excluding 'name' which becomes the tag)\n const attributes: Record<string, string> = {};\n for (const attr of openingElement.getAttributes()) {\n if (Node.isJsxAttribute(attr)) {\n const attrName = attr.getNameNode().getText();\n if (attrName !== 'name') {\n const value = getAttributeValue(openingElement, attrName);\n if (value !== undefined) {\n attributes[attrName] = value;\n }\n }\n }\n }\n\n return {\n kind: 'xmlBlock',\n name: nameAttr,\n attributes: Object.keys(attributes).length > 0 ? attributes : undefined,\n children: children as BaseBlockNode[],\n };\n}\n\n// ============================================================================\n// Mixed Content Handling\n// ============================================================================\n\n/**\n * Transform mixed children (inline + block elements)\n * Consecutive inline elements and text are wrapped in a single paragraph\n * Block elements are transformed normally\n */\nexport function transformMixedChildren(\n jsxChildren: Node[],\n ctx: TransformContext\n): BlockNode[] {\n const blocks: BlockNode[] = [];\n let inlineAccumulator: Node[] = [];\n\n const flushInline = () => {\n if (inlineAccumulator.length === 0) return;\n\n // Transform accumulated inline content as a paragraph\n const inlineNodes: InlineNode[] = [];\n for (const inlineChild of inlineAccumulator) {\n const inline = transformToInline(inlineChild, ctx);\n if (inline) inlineNodes.push(inline);\n }\n\n if (inlineNodes.length > 0) {\n // Trim boundary whitespace while preserving internal spacing\n trimBoundaryInlines(inlineNodes);\n if (inlineNodes.length > 0) {\n blocks.push({ kind: 'paragraph', children: inlineNodes });\n }\n }\n\n inlineAccumulator = [];\n };\n\n for (const child of jsxChildren) {\n // Check if this is an inline element or text\n if (Node.isJsxText(child)) {\n const text = extractText(child);\n if (text) {\n inlineAccumulator.push(child);\n }\n // Skip whitespace-only text if accumulator is empty\n continue;\n }\n\n if (Node.isJsxElement(child) || Node.isJsxSelfClosingElement(child)) {\n const name = getElementName(child);\n\n if (isInlineElement(name)) {\n // Accumulate inline elements\n inlineAccumulator.push(child);\n } else {\n // Flush any accumulated inline content before block element\n flushInline();\n // Transform block element via dispatch\n const block = transformToBlock(child, ctx);\n if (block) blocks.push(block);\n }\n } else if (Node.isJsxExpression(child)) {\n // JSX expressions treated as inline\n inlineAccumulator.push(child);\n }\n }\n\n // Flush remaining inline content\n flushInline();\n\n return blocks;\n}\n\n/**\n * Recursively extract all text content from children\n * Handles both JsxText and JsxExpression (string literals, template literals)\n */\nexport function extractAllText(node: JsxElement): string {\n const parts: string[] = [];\n for (const child of node.getJsxChildren()) {\n if (Node.isJsxText(child)) {\n const text = extractText(child);\n if (text) parts.push(text);\n } else if (Node.isJsxExpression(child)) {\n // Handle {`template`}, {\"string\"}, and {'string'} expressions\n const expr = child.getExpression();\n if (expr) {\n if (Node.isStringLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (Node.isTemplateExpression(expr)) {\n // Template with substitutions: {`text ${var} more`}\n parts.push(extractTemplateText(expr));\n }\n }\n }\n }\n return parts.join('');\n}\n","/**\n * Markdown Emitter - Converts IR to Markdown output\n *\n * Uses switch-based emission with exhaustiveness checking.\n * Handles nested structures (lists, inline formatting) through recursive calls.\n */\n\nimport matter from 'gray-matter';\nimport yaml from 'js-yaml';\nimport type { SourceFile } from 'ts-morph';\nimport type {\n AgentDocumentNode,\n AgentFrontmatterNode,\n AssignNode,\n AssignGroupNode,\n BlockNode,\n BlockquoteNode,\n CodeBlockNode,\n DocumentNode,\n ExecutionContextNode,\n FrontmatterNode,\n GroupNode,\n HeadingNode,\n IndentNode,\n InlineNode,\n ListItemNode,\n ListNode,\n OfferNextNode,\n OnStatusNode,\n ParagraphNode,\n ReadStateNode,\n ReadFilesNode,\n PromptTemplateNode,\n SkillDocumentNode,\n SkillFileNode,\n SkillFrontmatterNode,\n SuccessCriteriaNode,\n StepNode,\n StepVariant,\n TableNode,\n TypeReference,\n WriteStateNode,\n XmlBlockNode,\n} from '../ir/index.js';\nimport { resolveTypeImport, extractInterfaceProperties } from '../parser/parser.js';\nimport { assertNever } from './utils.js';\n\n/**\n * Context for tracking nested list state\n */\ninterface ListContext {\n ordered: boolean;\n index: number;\n}\n\n/**\n * MarkdownEmitter class - Encapsulates emission state and logic\n *\n * Uses a stack to track nested list context for proper indentation\n * and marker selection.\n */\nexport class MarkdownEmitter {\n private listStack: ListContext[] = [];\n\n /**\n * Main entry point - emit a complete document\n */\n emit(doc: DocumentNode): string {\n const parts: string[] = [];\n\n if (doc.frontmatter) {\n parts.push(this.emitFrontmatter(doc.frontmatter));\n }\n\n for (const child of doc.children) {\n parts.push(this.emitBlock(child));\n }\n\n // Join with double newlines for block separation, then ensure single trailing newline\n const result = parts.join('\\n\\n');\n return result ? result + '\\n' : '';\n }\n\n /**\n * Emit YAML frontmatter using gray-matter\n */\n private emitFrontmatter(node: FrontmatterNode): string {\n // gray-matter.stringify adds content after frontmatter, we just want the frontmatter\n const result = matter.stringify('', node.data);\n // Result is \"---\\nkey: value\\n---\\n\", trim trailing newline\n return result.trimEnd();\n }\n\n /**\n * Emit Agent frontmatter (GSD format: tools as string)\n */\n private emitAgentFrontmatter(node: AgentFrontmatterNode): string {\n // Build YAML manually to match GSD format exactly (no unnecessary quoting)\n const lines: string[] = [\n '---',\n `name: ${node.name}`,\n `description: ${node.description}`,\n ];\n if (node.tools) {\n lines.push(`tools: ${node.tools}`);\n }\n if (node.color) {\n lines.push(`color: ${node.color}`);\n }\n lines.push('---');\n return lines.join('\\n');\n }\n\n /**\n * Emit Skill frontmatter (Claude Code format: kebab-case keys)\n */\n private emitSkillFrontmatter(node: SkillFrontmatterNode): string {\n const data: Record<string, unknown> = {\n name: node.name,\n description: node.description,\n };\n\n // Map camelCase props to kebab-case YAML keys\n if (node.disableModelInvocation !== undefined) {\n data['disable-model-invocation'] = node.disableModelInvocation;\n }\n if (node.userInvocable !== undefined) {\n data['user-invocable'] = node.userInvocable;\n }\n if (node.allowedTools && node.allowedTools.length > 0) {\n data['allowed-tools'] = node.allowedTools;\n }\n if (node.argumentHint) {\n data['argument-hint'] = node.argumentHint;\n }\n if (node.model) {\n data['model'] = node.model;\n }\n if (node.context) {\n data['context'] = node.context;\n }\n if (node.agent) {\n data['agent'] = node.agent;\n }\n\n return matter.stringify('', data).trimEnd();\n }\n\n /**\n * Emit an AgentDocumentNode to markdown\n * @param doc - The agent document node\n * @param sourceFile - Optional source file for type resolution (needed for structured_returns)\n */\n emitAgent(doc: AgentDocumentNode, sourceFile?: SourceFile): string {\n const parts: string[] = [];\n\n // Agent frontmatter (GSD format)\n parts.push(this.emitAgentFrontmatter(doc.frontmatter));\n\n // Body content (same as Command)\n for (const child of doc.children) {\n parts.push(this.emitBlock(child));\n }\n\n // Auto-generate structured_returns if outputType present\n if (doc.frontmatter.outputType && sourceFile) {\n const structuredReturns = this.emitStructuredReturns(doc.frontmatter.outputType, sourceFile);\n if (structuredReturns) {\n parts.push(structuredReturns);\n }\n }\n\n // Join with double newlines for block separation, then ensure single trailing newline\n const result = parts.join('\\n\\n');\n return result ? result + '\\n' : '';\n }\n\n /**\n * Emit a SkillDocumentNode to markdown (SKILL.md content)\n */\n emitSkill(doc: SkillDocumentNode): string {\n const parts: string[] = [];\n\n // Skill frontmatter\n parts.push(this.emitSkillFrontmatter(doc.frontmatter));\n\n // Body content\n for (const child of doc.children) {\n parts.push(this.emitBlock(child));\n }\n\n // Join with double newlines for block separation, then ensure single trailing newline\n const result = parts.join('\\n\\n');\n return result ? result + '\\n' : '';\n }\n\n /**\n * Emit a SkillFileNode to markdown (supporting file content)\n */\n emitSkillFile(node: SkillFileNode): string {\n const parts: string[] = [];\n\n for (const child of node.children) {\n parts.push(this.emitBlock(child));\n }\n\n // Join with double newlines, ensure trailing newline\n const result = parts.join('\\n\\n');\n return result ? result + '\\n' : '';\n }\n\n /**\n * Emit a block node - switch on kind with exhaustiveness\n */\n private emitBlock(node: BlockNode): string {\n switch (node.kind) {\n case 'heading':\n return this.emitHeading(node);\n case 'paragraph':\n return this.emitParagraph(node);\n case 'list':\n return this.emitList(node);\n case 'codeBlock':\n return this.emitCodeBlock(node);\n case 'blockquote':\n return this.emitBlockquote(node);\n case 'thematicBreak':\n return '---';\n case 'table':\n return this.emitTable(node);\n case 'executionContext':\n return this.emitExecutionContext(node);\n case 'successCriteria':\n return this.emitSuccessCriteria(node);\n case 'offerNext':\n return this.emitOfferNext(node);\n case 'xmlBlock':\n return this.emitXmlBlock(node);\n case 'group':\n return this.emitGroup(node);\n case 'raw':\n return node.content;\n case 'indent':\n return this.emitIndent(node);\n case 'assign':\n return this.emitAssign(node);\n case 'assignGroup':\n return this.emitAssignGroup(node);\n case 'onStatus':\n return this.emitOnStatus(node);\n case 'readState':\n return this.emitReadState(node);\n case 'writeState':\n return this.emitWriteState(node);\n case 'readFiles':\n return this.emitReadFiles(node);\n case 'promptTemplate':\n return this.emitPromptTemplate(node);\n case 'step':\n return this.emitStep(node);\n case 'mcpServer':\n // MCP servers are not emitted via markdown emitter\n // They go through settings.ts emitter to settings.json\n throw new Error('MCPServerNode should not be emitted via markdown emitter');\n // Runtime-specific nodes - use V3 emitter for these\n case 'spawnAgent':\n case 'if':\n case 'else':\n case 'loop':\n case 'break':\n case 'return':\n case 'askUser':\n case 'runtimeCall':\n case 'runtimeVarDecl':\n throw new Error(`Runtime node '${node.kind}' should not be emitted via V1 emitter. Use emitDocument() instead.`);\n default:\n return assertNever(node);\n }\n }\n\n /**\n * Emit an inline node - switch on kind with exhaustiveness\n */\n private emitInline(node: InlineNode): string {\n switch (node.kind) {\n case 'text':\n return node.value;\n case 'bold':\n return `**${this.emitInlineChildren(node.children)}**`;\n case 'italic':\n return `*${this.emitInlineChildren(node.children)}*`;\n case 'inlineCode':\n return `\\`${node.value}\\``;\n case 'link':\n return `[${this.emitInlineChildren(node.children)}](${node.url})`;\n case 'lineBreak':\n return '\\n';\n default:\n return assertNever(node);\n }\n }\n\n /**\n * Emit a sequence of inline nodes with proper spacing\n *\n * JSX whitespace handling can strip spaces between elements like:\n * `</code> → ` becomes `→ ` (space before arrow lost)\n *\n * This method ensures inline formatting elements (code, bold, italic)\n * have proper spacing when adjacent to text that doesn't end/start with space.\n */\n private emitInlineChildren(nodes: InlineNode[]): string {\n const parts: string[] = [];\n\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i];\n const emitted = this.emitInline(node);\n const prev = parts[parts.length - 1];\n\n // Check if we need to insert a space between elements\n if (prev !== undefined && this.needsSpaceBetween(nodes[i - 1], node, prev, emitted)) {\n parts.push(' ');\n }\n\n parts.push(emitted);\n }\n\n return parts.join('');\n }\n\n /**\n * Determine if a space is needed between two inline elements\n *\n * We need a space when:\n * - Previous element is formatting (code/bold/italic) AND doesn't end with space\n * - Current element is text AND doesn't start with space or punctuation\n *\n * OR:\n * - Previous element is text AND doesn't end with space\n * - Current element is formatting (code/bold/italic)\n */\n private needsSpaceBetween(\n prevNode: InlineNode,\n currNode: InlineNode,\n prevEmitted: string,\n currEmitted: string\n ): boolean {\n // Don't add space if previous ends with whitespace\n if (/\\s$/.test(prevEmitted)) return false;\n\n // Don't add space if current starts with whitespace or punctuation\n if (/^[\\s.,;:!?)}\\]>]/.test(currEmitted)) return false;\n\n const prevIsFormatting = prevNode.kind === 'inlineCode' || prevNode.kind === 'bold' || prevNode.kind === 'italic';\n const currIsFormatting = currNode.kind === 'inlineCode' || currNode.kind === 'bold' || currNode.kind === 'italic';\n\n // Space needed: formatting → text (that doesn't start with space/punct)\n if (prevIsFormatting && currNode.kind === 'text') return true;\n\n // Space needed: text → formatting (when text doesn't end with space)\n if (prevNode.kind === 'text' && currIsFormatting) return true;\n\n // Space needed: formatting → formatting\n if (prevIsFormatting && currIsFormatting) return true;\n\n return false;\n }\n\n /**\n * Emit heading - '#' repeated level times + content\n */\n private emitHeading(node: HeadingNode): string {\n const hashes = '#'.repeat(node.level);\n const content = this.emitInlineChildren(node.children);\n return `${hashes} ${content}`;\n }\n\n /**\n * Emit paragraph - just inline content\n */\n private emitParagraph(node: ParagraphNode): string {\n return this.emitInlineChildren(node.children);\n }\n\n /**\n * Emit list - uses listStack for nesting context\n */\n private emitList(node: ListNode): string {\n this.listStack.push({\n ordered: node.ordered,\n index: node.start ?? 1 // Use start if provided, default to 1\n });\n\n const items = node.items.map((item) => this.emitListItem(item));\n\n this.listStack.pop();\n\n return items.join('\\n');\n }\n\n /**\n * Emit list item - marker + indented content\n */\n private emitListItem(item: ListItemNode): string {\n const current = this.listStack[this.listStack.length - 1];\n const marker = current.ordered ? `${current.index++}.` : '-';\n const indent = ' '.repeat(this.listStack.length - 1);\n\n // Handle the item's children - could be paragraphs, nested lists, etc.\n const contentParts: string[] = [];\n\n for (let i = 0; i < item.children.length; i++) {\n const child = item.children[i];\n\n if (child.kind === 'list') {\n // Nested list: emitList already handles indentation via listStack\n // The nested list items will have their own indent based on stack depth\n const nestedList = this.emitBlock(child);\n contentParts.push(nestedList);\n } else if (child.kind === 'paragraph' && i === 0) {\n // First paragraph is inline with marker\n contentParts.push(this.emitBlock(child));\n } else {\n // Subsequent paragraphs get their own line with indent\n const blockContent = this.emitBlock(child);\n const indentedContent = blockContent\n .split('\\n')\n .map((line) => indent + ' ' + line)\n .join('\\n');\n contentParts.push(indentedContent);\n }\n }\n\n // First content item is inline with marker\n const firstContent = contentParts[0] || '';\n const restContent = contentParts.slice(1);\n\n let result = `${indent}${marker} ${firstContent}`;\n\n if (restContent.length > 0) {\n result += '\\n' + restContent.join('\\n');\n }\n\n return result;\n }\n\n /**\n * Emit code block - triple backticks with optional language\n */\n private emitCodeBlock(node: CodeBlockNode): string {\n const lang = node.language || '';\n return `\\`\\`\\`${lang}\\n${node.content}\\n\\`\\`\\``;\n }\n\n /**\n * Emit blockquote - '> ' prefix per line\n */\n private emitBlockquote(node: BlockquoteNode): string {\n const content = node.children.map((child) => this.emitBlock(child)).join('\\n\\n');\n\n // Prefix each line with '> '\n return content\n .split('\\n')\n .map((line) => (line ? `> ${line}` : '>'))\n .join('\\n');\n }\n\n /**\n * Emit TableNode as markdown table\n *\n * Output format:\n * | Header1 | Header2 |\n * | :--- | :---: |\n * | Cell1 | Cell2 |\n */\n private emitTable(node: TableNode): string {\n const { headers, rows, align, emptyCell = '' } = node;\n\n // Empty table: no headers and no rows\n if (!headers?.length && rows.length === 0) return '';\n\n // Determine column count from headers or first row\n const columnCount = headers?.length ?? rows[0]?.length ?? 0;\n if (columnCount === 0) return '';\n\n // Build alignments array (default to 'left')\n const alignments = align ?? [];\n const getAlign = (i: number): 'left' | 'center' | 'right' =>\n alignments[i] ?? 'left';\n\n const lines: string[] = [];\n\n // Header row (if present)\n if (headers?.length) {\n const headerCells = headers.map(h => this.escapeTableCell(h, emptyCell));\n lines.push('| ' + headerCells.join(' | ') + ' |');\n }\n\n // Separator row with alignment markers\n const separators: string[] = [];\n for (let i = 0; i < columnCount; i++) {\n const a = getAlign(i);\n switch (a) {\n case 'left':\n separators.push(':---');\n break;\n case 'center':\n separators.push(':---:');\n break;\n case 'right':\n separators.push('---:');\n break;\n }\n }\n lines.push('| ' + separators.join(' | ') + ' |');\n\n // Data rows\n for (const row of rows) {\n // Pad row to column count if needed\n const cells: string[] = [];\n for (let i = 0; i < columnCount; i++) {\n const value = row[i] ?? '';\n cells.push(this.escapeTableCell(String(value), emptyCell));\n }\n lines.push('| ' + cells.join(' | ') + ' |');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Escape table cell content\n * - Strips newlines (converts to space)\n * - Escapes pipe characters\n * - Replaces empty with emptyCell value\n */\n private escapeTableCell(content: string, emptyCell: string): string {\n if (!content) return emptyCell;\n\n // Strip newlines (convert to single space)\n let escaped = content.replace(/\\n/g, ' ');\n\n // Escape pipe characters\n escaped = escaped.replace(/\\|/g, '\\\\|');\n\n return escaped || emptyCell;\n }\n\n\n /**\n * Emit Assign node as bash code block with variable assignment\n *\n * Output format for bash:\n * ```bash\n * VAR_NAME=$(command)\n * ```\n *\n * Output format for value:\n * ```bash\n * VAR_NAME=value\n * ```\n * (with quotes if value contains spaces)\n *\n * Output format for env:\n * ```bash\n * VAR_NAME=$ENV_VAR\n * ```\n */\n /**\n * Generate assignment line for a single AssignNode (without code fence)\n * Used by both emitAssign and emitAssignGroup\n */\n private emitAssignmentLine(node: AssignNode): string {\n const { variableName, assignment, comment } = node;\n\n let line: string;\n switch (assignment.type) {\n case 'bash':\n // Bash command: VAR=$(command)\n line = `${variableName}=$(${assignment.content})`;\n break;\n case 'value': {\n // Static value: quote if contains spaces\n const val = assignment.content;\n line = /\\s/.test(val)\n ? `${variableName}=\"${val}\"`\n : `${variableName}=${val}`;\n break;\n }\n case 'env':\n // Environment variable: VAR=$ENV\n line = `${variableName}=$${assignment.content}`;\n break;\n }\n\n // Prepend comment if present\n if (comment) {\n return `# ${comment}\\n${line}`;\n }\n return line;\n }\n\n private emitAssign(node: AssignNode): string {\n const line = this.emitAssignmentLine(node);\n return `\\`\\`\\`bash\\n${line}\\n\\`\\`\\``;\n }\n\n /**\n * Emit AssignGroup node as single bash code block\n * with all assignments grouped together\n *\n * Blank lines appear only:\n * - Before assignments with comments (for visual grouping)\n * - Before assignments with blankBefore (from <br/>)\n *\n * Output format:\n * ```bash\n * # Comment 1\n * VAR1=$(command1)\n *\n * # Comment 2\n * VAR2=$(command2)\n * VAR3=$(command3)\n *\n * # After br\n * VAR4=$(command4)\n * ```\n */\n private emitAssignGroup(node: AssignGroupNode): string {\n const lines: string[] = [];\n\n for (let i = 0; i < node.assignments.length; i++) {\n const assign = node.assignments[i];\n const isFirst = i === 0;\n\n // Add blank line before if not first AND (has comment OR has blankBefore)\n if (!isFirst && (assign.comment || assign.blankBefore)) {\n lines.push('');\n }\n\n lines.push(this.emitAssignmentLine(assign));\n }\n\n return `\\`\\`\\`bash\\n${lines.join('\\n')}\\n\\`\\`\\``;\n }\n\n\n /**\n * Emit OnStatus node as prose-based status conditional\n *\n * Output format:\n * **On SUCCESS:**\n *\n * {content}\n */\n private emitOnStatus(node: OnStatusNode): string {\n const parts: string[] = [];\n\n // Emit status header\n parts.push(`**On ${node.status}:**`);\n\n // Emit block content with blank line after header\n for (const child of node.children) {\n parts.push(this.emitBlock(child));\n }\n\n return parts.join('\\n\\n');\n }\n\n /**\n * Emit ReadState node as skill invocation\n *\n * Output format varies by whether field is specified:\n * - Full state: Use /react-agentic:state-read {key} and store in variable\n * - Field read: Use /react-agentic:state-read {key} --field {path}\n */\n private emitReadState(node: ReadStateNode): string {\n const { stateKey, variableName, field } = node;\n\n if (field) {\n // Read specific field\n return `Use skill \\`/react-agentic:state-read ${stateKey} --field \"${field}\"\\` and store result in \\`${variableName}\\`.`;\n } else {\n // Read full state\n return `Use skill \\`/react-agentic:state-read ${stateKey}\\` and store result in \\`${variableName}\\`.`;\n }\n }\n\n /**\n * Emit WriteState node as skill invocation\n *\n * Output format varies by mode:\n * - Field mode: /react-agentic:state-write {key} --field {path} --value {val}\n * - Merge mode: /react-agentic:state-write {key} --merge '{json}'\n */\n private emitWriteState(node: WriteStateNode): string {\n const { stateKey, mode, field, value } = node;\n\n if (mode === 'field') {\n // Field write mode\n const valueStr = value.type === 'variable'\n ? `$${value.content}`\n : `\"${value.content}\"`;\n return `Use skill \\`/react-agentic:state-write ${stateKey} --field \"${field}\" --value ${valueStr}\\`.`;\n } else {\n // Merge mode\n const mergeJson = value.content;\n return `Use skill \\`/react-agentic:state-write ${stateKey} --merge '${mergeJson}'\\`.`;\n }\n }\n\n /**\n * Emit ReadFilesNode as bash code block with cat commands\n *\n * Output format:\n * ```bash\n * STATE_CONTENT=$(cat .planning/STATE.md)\n * REQUIREMENTS_CONTENT=$(cat .planning/REQUIREMENTS.md 2>/dev/null)\n * ```\n *\n * Required files use plain cat, optional files add 2>/dev/null\n */\n private emitReadFiles(node: ReadFilesNode): string {\n const lines: string[] = [];\n\n for (const file of node.files) {\n // Quote path if it contains variable references\n const quotedPath = file.path.includes('$') ? `\"${file.path}\"` : file.path;\n\n if (file.required) {\n // Required file - fail loudly if missing\n lines.push(`${file.varName}=$(cat ${quotedPath})`);\n } else {\n // Optional file - suppress errors\n lines.push(`${file.varName}=$(cat ${quotedPath} 2>/dev/null)`);\n }\n }\n\n return `\\`\\`\\`bash\\n${lines.join('\\n')}\\n\\`\\`\\``;\n }\n\n /**\n * Emit PromptTemplateNode as markdown code fence\n *\n * Output format:\n * ```markdown\n * {children content}\n * ```\n */\n private emitPromptTemplate(node: PromptTemplateNode): string {\n // Emit children as markdown\n const content = node.children\n .map(child => this.emitBlock(child))\n .join('\\n\\n');\n\n return `\\`\\`\\`markdown\\n${content}\\n\\`\\`\\``;\n }\n\n /**\n * Emit StepNode as formatted step section\n *\n * Variants:\n * - 'heading': ## Step 1: Name\n * - 'bold': **Step 1: Name**\n * - 'xml': <step number=\"1\" name=\"Name\">...</step>\n */\n private emitStep(node: StepNode): string {\n const { number, name, variant, children } = node;\n const parts: string[] = [];\n\n // Emit children content\n const childContent = children\n .map(child => this.emitBlock(child))\n .filter(s => s.length > 0)\n .join('\\n\\n');\n\n switch (variant) {\n case 'heading':\n // ## Step 1: Setup\n parts.push(`## Step ${number}: ${name}`);\n if (childContent) {\n parts.push(childContent);\n }\n break;\n\n case 'bold':\n // **Step 1: Setup**\n parts.push(`**Step ${number}: ${name}**`);\n if (childContent) {\n parts.push(childContent);\n }\n break;\n\n case 'xml':\n // <step number=\"1\" name=\"Setup\">...</step>\n parts.push(`<step number=\"${number}\" name=\"${name}\">`);\n if (childContent) {\n parts.push(childContent);\n }\n parts.push('</step>');\n break;\n\n default:\n // Fallback to heading\n parts.push(`## Step ${number}: ${name}`);\n if (childContent) {\n parts.push(childContent);\n }\n }\n\n return parts.join('\\n\\n');\n }\n\n /**\n * Generate <structured_returns> section from output type interface\n *\n * Resolves the TypeReference to its interface definition, extracts properties,\n * and generates status-specific templates based on field names.\n */\n private emitStructuredReturns(outputType: TypeReference, sourceFile: SourceFile): string | null {\n // Resolve the interface\n const resolved = resolveTypeImport(outputType.name, sourceFile);\n if (!resolved?.interface) {\n return null;\n }\n\n // Extract properties\n const props = extractInterfaceProperties(resolved.interface);\n if (props.length === 0) {\n return null;\n }\n\n // Find status property (should always exist if extending BaseOutput)\n const statusProp = props.find(p => p.name === 'status');\n const otherProps = props.filter(p => p.name !== 'status' && p.name !== 'message');\n\n // Generate template showing all fields\n const lines: string[] = [\n '<structured_returns>',\n '',\n '## Output Format',\n '',\n 'Return a YAML code block with the following structure:',\n '',\n '```yaml',\n 'status: SUCCESS | BLOCKED | NOT_FOUND | ERROR | CHECKPOINT',\n ];\n\n // Add message if in interface\n const messageProp = props.find(p => p.name === 'message');\n if (messageProp) {\n lines.push('message: \"Human-readable status message\"');\n }\n\n // Add other fields\n for (const prop of otherProps) {\n const required = prop.required ? '' : ' # optional';\n const typeHint = this.formatTypeHint(prop.type);\n lines.push(`${prop.name}: ${typeHint}${required}`);\n }\n\n lines.push('```');\n\n // Add status-specific guidance\n lines.push('');\n lines.push('### Status Codes');\n lines.push('');\n lines.push('- **SUCCESS**: Task completed successfully');\n lines.push('- **BLOCKED**: Cannot proceed, needs external input');\n lines.push('- **NOT_FOUND**: Requested resource not found');\n lines.push('- **ERROR**: Execution error occurred');\n lines.push('- **CHECKPOINT**: Milestone reached, pausing for verification');\n\n lines.push('');\n lines.push('</structured_returns>');\n\n return lines.join('\\n');\n }\n\n /**\n * Format a TypeScript type as a hint for YAML output\n */\n private formatTypeHint(type: string): string {\n // Handle common types\n if (type === 'string') return '\"...\"';\n if (type === 'number') return '0';\n if (type === 'boolean') return 'true | false';\n if (type.includes('[]')) return '[...]';\n if (type.includes(\"'HIGH'\") || type.includes(\"'MEDIUM'\") || type.includes(\"'LOW'\")) {\n return 'HIGH | MEDIUM | LOW';\n }\n // For complex types, show placeholder\n return `<${type.replace(/['\"]/g, '')}>`;\n }\n\n /**\n * Emit ExecutionContext as XML with @-prefixed paths\n *\n * Output:\n * <execution_context>\n * @path/to/file1.md\n * @path/to/file2.md\n * </execution_context>\n */\n private emitExecutionContext(node: ExecutionContextNode): string {\n const lines: string[] = ['<execution_context>'];\n\n // Add paths with prefix (avoid double-prefixing if path already starts with prefix)\n for (const path of node.paths) {\n const prefixedPath = path.startsWith(node.prefix) ? path : `${node.prefix}${path}`;\n lines.push(prefixedPath);\n }\n\n // Add children if present\n if (node.children.length > 0) {\n lines.push('');\n for (const child of node.children) {\n lines.push(this.emitBlock(child));\n }\n }\n\n lines.push('</execution_context>');\n return lines.join('\\n');\n }\n\n /**\n * Emit SuccessCriteria as XML with checkbox list\n *\n * Output:\n * <success_criteria>\n * - [ ] First criterion\n * - [x] Pre-checked item\n * </success_criteria>\n */\n private emitSuccessCriteria(node: SuccessCriteriaNode): string {\n const lines: string[] = ['<success_criteria>'];\n\n for (const item of node.items) {\n const checkbox = item.checked ? '[x]' : '[ ]';\n lines.push(`- ${checkbox} ${item.text}`);\n }\n\n lines.push('</success_criteria>');\n return lines.join('\\n');\n }\n\n /**\n * Emit OfferNext as XML with route bullet list\n *\n * Output:\n * <offer_next>\n * - **Route Name**: Description\n * `/path/to/command`\n * </offer_next>\n */\n private emitOfferNext(node: OfferNextNode): string {\n const lines: string[] = ['<offer_next>'];\n\n for (const route of node.routes) {\n if (route.description) {\n lines.push(`- **${route.name}**: ${route.description}`);\n } else {\n lines.push(`- **${route.name}**`);\n }\n lines.push(` \\`${route.path}\\``);\n }\n\n lines.push('</offer_next>');\n return lines.join('\\n');\n }\n\n /**\n * Emit XML block - <name attrs>content</name>\n */\n private emitXmlBlock(node: XmlBlockNode): string {\n // Serialize attributes if present\n const attrs = node.attributes\n ? ' ' + Object.entries(node.attributes)\n .map(([k, v]) => `${k}=\"${v}\"`)\n .join(' ')\n : '';\n\n // Join children with empty string - raw blocks already have trailing newlines\n // For non-raw blocks, add blank line separation\n const parts: string[] = [];\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const emitted = this.emitBlock(child);\n\n // Raw blocks already include newlines; other blocks need separation\n if (i > 0 && child.kind !== 'raw' && node.children[i - 1].kind !== 'raw') {\n parts.push('\\n\\n' + emitted);\n } else {\n parts.push(emitted);\n }\n }\n const innerContent = parts.join('');\n\n // Strip trailing newline before closing tag (but preserve content structure)\n const normalizedContent = innerContent.replace(/\\n+$/, '');\n\n return `<${node.name}${attrs}>\\n${normalizedContent}\\n</${node.name}>`;\n }\n\n /**\n * Emit Group - invisible container with tight spacing (single newlines)\n * No wrapper output, just children with single newlines between them\n */\n private emitGroup(node: GroupNode): string {\n // Join with single newline for tight spacing (vs double for normal blocks)\n return node.children.map((child) => this.emitBlock(child)).join('\\n');\n }\n\n /**\n * Emit Indent - prepends spaces to each line of content\n */\n private emitIndent(node: IndentNode): string {\n const content = node.children.map((child) => this.emitBlock(child)).join('\\n\\n');\n const indent = ' '.repeat(node.spaces);\n return content.split('\\n').map(line => line ? indent + line : line).join('\\n');\n }\n}\n\n/**\n * Convenience function for emitting a document\n */\nexport function emit(doc: DocumentNode): string {\n const emitter = new MarkdownEmitter();\n return emitter.emit(doc);\n}\n\n/**\n * Convenience function for emitting an agent document\n */\nexport function emitAgent(doc: AgentDocumentNode, sourceFile?: SourceFile): string {\n const emitter = new MarkdownEmitter();\n return emitter.emitAgent(doc, sourceFile);\n}\n\n/**\n * Convenience function for emitting a skill document\n */\nexport function emitSkill(doc: SkillDocumentNode): string {\n const emitter = new MarkdownEmitter();\n return emitter.emitSkill(doc);\n}\n\n/**\n * Convenience function for emitting a skill file\n */\nexport function emitSkillFile(node: SkillFileNode): string {\n const emitter = new MarkdownEmitter();\n return emitter.emitSkillFile(node);\n}\n","/**\n * Emitter Utilities\n */\n\n/**\n * Helper for exhaustiveness checking in switch statements.\n * If TypeScript complains that the argument is not of type 'never',\n * it means there's an unhandled case in the switch.\n */\nexport function assertNever(x: never): never {\n throw new Error(`Unexpected node: ${JSON.stringify(x)}`);\n}\n","/**\n * MCP Configuration Emitter - MCP configuration to Claude Code .mcp.json\n *\n * Converts MCPConfigDocumentNode to JSON format and handles\n * merging with existing .mcp.json content.\n *\n * Output: .mcp.json in project root (project-level MCP configuration)\n * Format: { \"mcpServers\": { \"name\": { command, args, env } } }\n */\nimport { readFile, writeFile, mkdir } from 'fs/promises';\nimport path from 'path';\nimport type { MCPServerNode, MCPConfigDocumentNode } from '../ir/nodes.js';\n\n/**\n * MCP server configuration format for settings.json\n */\ninterface MCPServerConfig {\n type: 'stdio' | 'http' | 'sse';\n command?: string;\n args?: string[];\n url?: string;\n headers?: Record<string, string>;\n env?: Record<string, string>;\n}\n\n/**\n * Convert MCPServerNode to .mcp.json config format\n *\n * Note: For stdio servers (the default), we omit the `type` field\n * to match Claude Code's expected format.\n */\nfunction serverNodeToConfig(node: MCPServerNode): MCPServerConfig {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const config: any = {};\n\n // Stdio-specific (type field omitted - stdio is the default)\n if (node.command) config.command = node.command;\n if (node.args && node.args.length > 0) config.args = node.args;\n\n // HTTP/SSE-specific - these need the type field\n if (node.type === 'http' || node.type === 'sse') {\n config.type = node.type;\n }\n if (node.url) config.url = node.url;\n if (node.headers && Object.keys(node.headers).length > 0) {\n config.headers = node.headers;\n }\n\n // Common\n if (node.env && Object.keys(node.env).length > 0) {\n config.env = node.env;\n }\n\n return config as MCPServerConfig;\n}\n\n/**\n * Convert MCPConfigDocumentNode to mcpServers object\n *\n * @param doc - MCP config document from transformer\n * @returns mcpServers object keyed by server name\n */\nexport function emitSettings(\n doc: MCPConfigDocumentNode\n): Record<string, MCPServerConfig> {\n const servers: Record<string, MCPServerConfig> = {};\n\n for (const server of doc.servers) {\n servers[server.name] = serverNodeToConfig(server);\n }\n\n return servers;\n}\n\n/**\n * Merge MCP servers into existing .mcp.json\n *\n * Read-modify-write pattern:\n * 1. Read existing .mcp.json (or start fresh)\n * 2. Update only mcpServers section\n * 3. Write back with pretty formatting\n *\n * @param mcpPath - Path to .mcp.json (typically in project root)\n * @param servers - New mcpServers to merge\n */\nexport async function mergeSettings(\n mcpPath: string,\n servers: Record<string, MCPServerConfig>\n): Promise<void> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let existing: Record<string, any> = {};\n\n // Read existing .mcp.json if present\n try {\n const content = await readFile(mcpPath, 'utf-8');\n existing = JSON.parse(content);\n } catch (error) {\n // File doesn't exist or invalid JSON - start fresh\n // Only mcpServers section will be created\n }\n\n // Merge mcpServers section (TSX wins on conflicts)\n existing.mcpServers = {\n ...(existing.mcpServers || {}),\n ...servers,\n };\n\n // Ensure directory exists (for nested paths, no-op for project root)\n const dir = path.dirname(mcpPath);\n if (dir && dir !== '.') {\n await mkdir(dir, { recursive: true });\n }\n\n // Write back with pretty formatting (2-space indent)\n await writeFile(mcpPath, JSON.stringify(existing, null, 2) + '\\n', 'utf-8');\n}\n","/**\n * V3 Markdown Emitter\n *\n * Converts V3 IR nodes to Markdown output with jq expressions.\n * Extends v1 emitter patterns for shared block types.\n *\n * Key differences from v1:\n * - RuntimeCallNode emits as bash code block with node invocation\n * - IfNode emits with jq-based conditions\n * - RuntimeVar interpolation uses jq expressions\n */\n\nimport matter from 'gray-matter';\nimport type {\n DocumentNode,\n BlockNode,\n IfNode,\n ElseNode,\n LoopNode,\n BreakNode,\n ReturnNode,\n AskUserNode,\n RuntimeCallNode,\n SpawnAgentNode,\n Condition,\n RuntimeVarRefNode,\n RuntimeVarDeclNode,\n InputValue,\n} from '../ir/index.js';\nimport type { InlineNode } from '../ir/nodes.js';\nimport { assertNever } from './utils.js';\n\n// ============================================================================\n// jq Expression Generation\n// ============================================================================\n\n/**\n * Convert RuntimeVarRefNode to jq shell expression\n *\n * @example\n * toJqExpression({ varName: 'CTX', path: ['user', 'name'] })\n * // Returns: $(echo \"$CTX\" | jq -r '.user.name')\n */\nfunction toJqExpression(ref: RuntimeVarRefNode): string {\n const jqPath = ref.path.length === 0 ? '.' : '.' + ref.path.join('.');\n return `$(echo \"$${ref.varName}\" | jq -r '${jqPath}')`;\n}\n\n/**\n * Convert Condition to shell condition string\n */\nfunction conditionToShell(condition: Condition): string {\n switch (condition.type) {\n case 'ref': {\n // Truthy check: non-empty and not \"null\" and not \"false\"\n const jq = toJqExpression(condition.ref);\n return `${jq} != \"\" && ${jq} != \"null\" && ${jq} != \"false\"`;\n }\n\n case 'literal':\n return condition.value ? 'true' : 'false';\n\n case 'not': {\n const inner = conditionToShell(condition.operand);\n return `! (${inner})`;\n }\n\n case 'and': {\n const left = conditionToShell(condition.left);\n const right = conditionToShell(condition.right);\n return `(${left}) && (${right})`;\n }\n\n case 'or': {\n const left = conditionToShell(condition.left);\n const right = conditionToShell(condition.right);\n return `(${left}) || (${right})`;\n }\n\n case 'eq': {\n const left = conditionToShell(condition.left);\n const rightVal = JSON.stringify(condition.right);\n // For ref on left, compare the jq output\n if (condition.left.type === 'ref') {\n const jq = toJqExpression(condition.left.ref);\n return `${jq} = ${rightVal}`;\n }\n return `${left} = ${rightVal}`;\n }\n\n case 'neq': {\n const left = conditionToShell(condition.left);\n const rightVal = JSON.stringify(condition.right);\n if (condition.left.type === 'ref') {\n const jq = toJqExpression(condition.left.ref);\n return `${jq} != ${rightVal}`;\n }\n return `${left} != ${rightVal}`;\n }\n\n case 'gt': {\n if (condition.left.type === 'ref') {\n const jq = toJqExpression(condition.left.ref);\n return `${jq} -gt ${condition.right}`;\n }\n return `${conditionToShell(condition.left)} -gt ${condition.right}`;\n }\n\n case 'gte': {\n if (condition.left.type === 'ref') {\n const jq = toJqExpression(condition.left.ref);\n return `${jq} -ge ${condition.right}`;\n }\n return `${conditionToShell(condition.left)} -ge ${condition.right}`;\n }\n\n case 'lt': {\n if (condition.left.type === 'ref') {\n const jq = toJqExpression(condition.left.ref);\n return `${jq} -lt ${condition.right}`;\n }\n return `${conditionToShell(condition.left)} -lt ${condition.right}`;\n }\n\n case 'lte': {\n if (condition.left.type === 'ref') {\n const jq = toJqExpression(condition.left.ref);\n return `${jq} -le ${condition.right}`;\n }\n return `${conditionToShell(condition.left)} -le ${condition.right}`;\n }\n }\n}\n\n/**\n * Convert Condition to prose-friendly string\n *\n * Used in markdown output like: **If ctx.error:**\n */\nfunction conditionToProse(condition: Condition): string {\n switch (condition.type) {\n case 'ref': {\n const path = condition.ref.path.length === 0\n ? condition.ref.varName.toLowerCase()\n : `${condition.ref.varName.toLowerCase()}.${condition.ref.path.join('.')}`;\n return path;\n }\n\n case 'literal':\n return condition.value ? 'true' : 'false';\n\n case 'not':\n return `!${conditionToProse(condition.operand)}`;\n\n case 'and':\n return `${conditionToProse(condition.left)} && ${conditionToProse(condition.right)}`;\n\n case 'or':\n return `${conditionToProse(condition.left)} || ${conditionToProse(condition.right)}`;\n\n case 'eq':\n return `${conditionToProse(condition.left)} === ${JSON.stringify(condition.right)}`;\n\n case 'neq':\n return `${conditionToProse(condition.left)} !== ${JSON.stringify(condition.right)}`;\n\n case 'gt':\n return `${conditionToProse(condition.left)} > ${condition.right}`;\n\n case 'gte':\n return `${conditionToProse(condition.left)} >= ${condition.right}`;\n\n case 'lt':\n return `${conditionToProse(condition.left)} < ${condition.right}`;\n\n case 'lte':\n return `${conditionToProse(condition.left)} <= ${condition.right}`;\n }\n}\n\n// ============================================================================\n// V3 Markdown Emitter Class\n// ============================================================================\n\n/**\n * Emitter for V3 documents\n */\nexport class RuntimeMarkdownEmitter {\n /**\n * Emit a complete V3 document\n */\n emit(doc: DocumentNode): string {\n const parts: string[] = [];\n\n // Emit frontmatter using simple YAML to avoid unnecessary quoting\n if (doc.frontmatter) {\n const lines: string[] = ['---'];\n for (const [key, value] of Object.entries(doc.frontmatter.data)) {\n if (value === undefined || value === null) continue;\n if (Array.isArray(value)) {\n // Handle arrays (like arguments)\n lines.push(`${key}:`);\n for (const item of value) {\n if (typeof item === 'object' && item !== null) {\n // Object in array - emit as indented YAML\n const entries = Object.entries(item);\n for (let i = 0; i < entries.length; i++) {\n const [k, v] = entries[i];\n if (i === 0) {\n // First key gets the dash\n lines.push(` - ${k}: ${this.formatYamlValue(v)}`);\n } else {\n // Subsequent keys are indented\n lines.push(` ${k}: ${this.formatYamlValue(v)}`);\n }\n }\n } else {\n // Simple value in array\n lines.push(` - ${item}`);\n }\n }\n } else {\n lines.push(`${key}: ${value}`);\n }\n }\n lines.push('---');\n parts.push(lines.join('\\n'));\n }\n\n // Emit body content\n for (const child of doc.children) {\n parts.push(this.emitBlock(child));\n }\n\n const result = parts.join('\\n\\n');\n return result ? result + '\\n' : '';\n }\n\n /**\n * Emit a block node\n */\n private emitBlock(node: BlockNode): string {\n switch (node.kind) {\n // V3-specific nodes\n case 'runtimeCall':\n return this.emitRuntimeCall(node);\n case 'if':\n return this.emitIf(node);\n case 'else':\n return this.emitElse(node);\n case 'loop':\n return this.emitLoop(node);\n case 'break':\n return this.emitBreak(node);\n case 'return':\n return this.emitReturn(node);\n case 'askUser':\n return this.emitAskUser(node);\n case 'spawnAgent':\n return this.emitSpawnAgent(node);\n\n // Shared V1 nodes\n case 'heading':\n return '#'.repeat(node.level) + ' ' + this.emitInlineChildren(node.children);\n case 'paragraph':\n return this.emitInlineChildren(node.children);\n case 'list':\n return this.emitList(node);\n case 'codeBlock':\n return `\\`\\`\\`${node.language || ''}\\n${node.content}\\n\\`\\`\\``;\n case 'blockquote':\n return this.emitBlockquote(node);\n case 'thematicBreak':\n return '---';\n case 'table':\n return this.emitTable(node);\n case 'xmlBlock':\n return this.emitXmlBlock(node);\n case 'executionContext':\n return this.emitExecutionContext(node as import('../ir/nodes.js').ExecutionContextNode);\n case 'group':\n return node.children.map(c => this.emitBlock(c)).join('\\n\\n');\n case 'raw':\n return node.content;\n case 'indent':\n return this.emitIndent(node as import('../ir/nodes.js').IndentNode);\n\n // V1 nodes that shouldn't appear in runtime documents\n case 'assign':\n case 'assignGroup':\n case 'onStatus':\n case 'readState':\n case 'writeState':\n case 'readFiles':\n case 'promptTemplate':\n case 'step':\n case 'successCriteria':\n case 'offerNext':\n case 'mcpServer':\n case 'runtimeVarDecl':\n throw new Error(`Unexpected node kind in runtime document: ${node.kind}`);\n\n default:\n return assertNever(node);\n }\n }\n\n /**\n * Emit RuntimeCallNode as bash code block\n *\n * Output:\n * ```bash\n * CTX=$(node runtime.js fnName '{\"args\"}')\n * ```\n */\n private emitRuntimeCall(node: RuntimeCallNode): string {\n const argsJson = JSON.stringify(node.args);\n // Escape single quotes in JSON for shell\n const escapedArgs = argsJson.replace(/'/g, \"'\\\"'\\\"'\");\n return `\\`\\`\\`bash\\n${node.outputVar}=$(node runtime.js ${node.fnName} '${escapedArgs}')\\n\\`\\`\\``;\n }\n\n /**\n * Emit IfNode as prose conditional with jq\n *\n * Output:\n * **If ctx.error:**\n *\n * {children}\n */\n private emitIf(node: IfNode): string {\n const parts: string[] = [];\n const condProse = conditionToProse(node.condition);\n parts.push(`**If ${condProse}:**`);\n\n for (const child of node.children) {\n parts.push(this.emitBlock(child));\n }\n\n return parts.join('\\n\\n');\n }\n\n /**\n * Emit ElseNode\n */\n private emitElse(node: ElseNode): string {\n const parts: string[] = [];\n parts.push('**Otherwise:**');\n\n for (const child of node.children) {\n parts.push(this.emitBlock(child));\n }\n\n return parts.join('\\n\\n');\n }\n\n /**\n * Emit LoopNode as bounded loop\n *\n * Output:\n * **Loop up to N times:**\n *\n * {children}\n */\n private emitLoop(node: LoopNode): string {\n const parts: string[] = [];\n\n const counterInfo = node.counterVar ? ` (counter: $${node.counterVar})` : '';\n parts.push(`**Loop up to ${node.max} times${counterInfo}:**`);\n\n for (const child of node.children) {\n parts.push(this.emitBlock(child));\n }\n\n return parts.join('\\n\\n');\n }\n\n /**\n * Emit BreakNode\n */\n private emitBreak(node: BreakNode): string {\n if (node.message) {\n return `**Break loop:** ${node.message}`;\n }\n return '**Break loop**';\n }\n\n /**\n * Emit ReturnNode\n */\n private emitReturn(node: ReturnNode): string {\n const parts: string[] = ['**End command'];\n if (node.status) {\n parts[0] += ` (${node.status})`;\n }\n parts[0] += '**';\n if (node.message) {\n parts.push(node.message);\n }\n return parts.join(': ');\n }\n\n /**\n * Emit AskUserNode as AskUserQuestion syntax\n */\n private emitAskUser(node: AskUserNode): string {\n const lines: string[] = ['Use the AskUserQuestion tool:'];\n lines.push('');\n lines.push(`- Question: \"${node.question}\"`);\n\n if (node.header) {\n lines.push(`- Header: \"${node.header}\"`);\n }\n\n lines.push('- Options:');\n for (const opt of node.options) {\n const desc = opt.description ? ` - ${opt.description}` : '';\n lines.push(` - \"${opt.label}\" (value: \"${opt.value}\")${desc}`);\n }\n\n lines.push('');\n lines.push(`Store the user's response in \\`$${node.outputVar}\\`.`);\n\n return lines.join('\\n');\n }\n\n /**\n * Emit SpawnAgentNode as Task() syntax\n */\n private emitSpawnAgent(node: SpawnAgentNode): string {\n const escapeQuotes = (s: string): string => s.replace(/\"/g, '\\\\\"');\n\n // Build prompt\n let promptContent: string;\n if (node.prompt) {\n promptContent = node.prompt;\n } else if (node.input) {\n promptContent = this.formatInput(node.input);\n } else {\n promptContent = '';\n }\n\n // Handle loadFromFile\n let subagentType = node.agent;\n let promptOutput: string;\n\n if (node.loadFromFile) {\n subagentType = 'general-purpose';\n const prefix = `First, read ${node.loadFromFile} for your role and instructions.\\\\n\\\\n`;\n promptOutput = `\"${escapeQuotes(prefix + promptContent)}\"`;\n } else {\n promptOutput = `\"${escapeQuotes(promptContent)}\"`;\n }\n\n const taskBlock = `\\`\\`\\`\nTask(\n prompt=${promptOutput},\n subagent_type=\"${escapeQuotes(subagentType)}\",\n model=\"${escapeQuotes(node.model)}\",\n description=\"${escapeQuotes(node.description)}\"\n)\n\\`\\`\\``;\n\n // Add output capture if specified\n if (node.outputVar) {\n return `${taskBlock}\\n\\nStore the agent's result in \\`$${node.outputVar}\\`.`;\n }\n\n return taskBlock;\n }\n\n /**\n * Format V3 input for prompt\n */\n private formatInput(input: import('../ir/index.js').SpawnAgentInput): string {\n if (input.type === 'variable') {\n return `<input>\\n{$${input.varName.toLowerCase()}}\\n</input>`;\n }\n\n const sections: string[] = [];\n for (const prop of input.properties) {\n const value = this.formatInputValue(prop.value);\n sections.push(`<${prop.name}>\\n${value}\\n</${prop.name}>`);\n }\n return sections.join('\\n\\n');\n }\n\n /**\n * Format InputValue\n */\n private formatInputValue(value: InputValue): string {\n switch (value.type) {\n case 'string':\n return value.value;\n case 'runtimeVarRef':\n return toJqExpression(value.ref);\n case 'json':\n return JSON.stringify(value.value, null, 2);\n }\n }\n\n // ===========================================================================\n // Shared V1 Node Emitters\n // ===========================================================================\n\n private emitInlineChildren(nodes: InlineNode[]): string {\n return nodes.map(n => this.emitInline(n)).join('');\n }\n\n private emitInline(node: InlineNode): string {\n switch (node.kind) {\n case 'text':\n return node.value;\n case 'bold':\n return `**${this.emitInlineChildren(node.children)}**`;\n case 'italic':\n return `*${this.emitInlineChildren(node.children)}*`;\n case 'inlineCode':\n return `\\`${node.value}\\``;\n case 'link':\n return `[${this.emitInlineChildren(node.children)}](${node.url})`;\n case 'lineBreak':\n return '\\n';\n }\n }\n\n private emitList(node: import('../ir/nodes.js').ListNode): string {\n const items = node.items.map((item, idx) => {\n const marker = node.ordered ? `${(node.start ?? 1) + idx}.` : '-';\n const content = item.children.map(c => this.emitBlock(c as BlockNode)).join('\\n');\n return `${marker} ${content}`;\n });\n return items.join('\\n');\n }\n\n private emitBlockquote(node: import('../ir/nodes.js').BlockquoteNode): string {\n const content = node.children.map(c => this.emitBlock(c as BlockNode)).join('\\n\\n');\n return content.split('\\n').map(line => `> ${line}`).join('\\n');\n }\n\n private emitTable(node: import('../ir/nodes.js').TableNode): string {\n const lines: string[] = [];\n const colCount = node.headers?.length ?? node.rows[0]?.length ?? 0;\n\n if (node.headers?.length) {\n lines.push('| ' + node.headers.join(' | ') + ' |');\n }\n\n // Separator\n const seps = Array(colCount).fill(':---');\n lines.push('| ' + seps.join(' | ') + ' |');\n\n for (const row of node.rows) {\n lines.push('| ' + row.map(c => c ?? '').join(' | ') + ' |');\n }\n\n return lines.join('\\n');\n }\n\n private emitXmlBlock(node: import('../ir/nodes.js').XmlBlockNode): string {\n const attrs = node.attributes\n ? ' ' + Object.entries(node.attributes).map(([k, v]) => `${k}=\"${v}\"`).join(' ')\n : '';\n // Emit children and join with double newlines for block separation\n const parts: string[] = [];\n for (const child of node.children) {\n const emitted = this.emitBlock(child as BlockNode);\n if (emitted) parts.push(emitted);\n }\n // Join blocks with double newlines (same as document-level emission)\n const content = parts.join('\\n\\n');\n // Strip leading/trailing newlines, then add exactly one newline before closing tag\n const normalizedContent = content.replace(/^\\n+/, '').replace(/\\n+$/, '');\n return `<${node.name}${attrs}>\\n${normalizedContent}\\n</${node.name}>`;\n }\n\n /**\n * Format a value for YAML output\n * Quotes strings that contain special YAML characters\n */\n private formatYamlValue(value: unknown): string {\n if (typeof value === 'string') {\n // Quote if contains colon followed by space, or starts/ends with special chars\n if (value.includes(': ') || /^['\"@&*!|>%]/.test(value) || /[\"'\\n]/.test(value)) {\n return `\"${value.replace(/\"/g, '\\\\\"')}\"`;\n }\n return value;\n }\n if (typeof value === 'boolean') {\n return value.toString();\n }\n if (typeof value === 'number') {\n return value.toString();\n }\n return String(value);\n }\n\n private emitExecutionContext(node: import('../ir/nodes.js').ExecutionContextNode): string {\n const lines: string[] = ['<execution_context>'];\n\n // Emit each path with prefix\n for (const path of node.paths) {\n const prefixedPath = path.startsWith(node.prefix) ? path : `${node.prefix}${path}`;\n lines.push(prefixedPath);\n }\n\n // Emit children if any\n if (node.children.length > 0) {\n const content = node.children.map(c => this.emitBlock(c as BlockNode)).join('\\n\\n');\n lines.push(content);\n }\n\n lines.push('</execution_context>');\n return lines.join('\\n');\n }\n\n private emitIndent(node: import('../ir/nodes.js').IndentNode): string {\n // Emit children content\n const content = node.children.map(c => this.emitBlock(c as BlockNode)).join('\\n\\n');\n\n // Prepend spaces to each line\n const indent = ' '.repeat(node.spaces);\n return content.split('\\n').map(line => line ? indent + line : line).join('\\n');\n }\n}\n\n// ============================================================================\n// Convenience Function\n// ============================================================================\n\n/**\n * Emit a V3 document to markdown\n */\nexport function emitDocument(doc: DocumentNode): string {\n const emitter = new RuntimeMarkdownEmitter();\n return emitter.emit(doc);\n}\n","/**\n * Runtime Emitter\n *\n * Extracts runtime functions from source files and generates runtime.js.\n * The runtime.js file is a CLI-invocable bundle that Claude calls via bash.\n *\n * Output format:\n * ```javascript\n * #!/usr/bin/env node\n * // Extracted functions\n * async function init(args) { ... }\n * async function getContext(args) { ... }\n *\n * // Registry\n * const registry = { init, getContext };\n *\n * // CLI entry\n * const [,, fnName, argsJson] = process.argv;\n * const result = await registry[fnName](JSON.parse(argsJson));\n * console.log(JSON.stringify(result));\n * ```\n */\n\nimport { Node, SourceFile, Project, FunctionDeclaration, VariableDeclarationKind } from 'ts-morph';\nimport path from 'path';\n\n// Extracted modules for DRY\nimport { stripTypesFromFunction } from './type-stripper.js';\nimport { generateRuntimeContent } from './runtime-template.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Extracted function information\n */\nexport interface ExtractedFunction {\n /** Function name */\n name: string;\n /** Function source code (body only, without signature) */\n body: string;\n /** Parameter names */\n params: string[];\n /** Whether it's async */\n isAsync: boolean;\n /** Original source file path */\n sourcePath: string;\n}\n\n/**\n * Extracted constant information\n */\nexport interface ExtractedConstant {\n /** Constant name */\n name: string;\n /** Constant value as source code */\n value: string;\n /** Original source file path */\n sourcePath: string;\n}\n\n/**\n * Runtime emission result\n */\nexport interface RuntimeEmitResult {\n /** Generated runtime.js content */\n content: string;\n /** List of functions included (namespaced if applicable) */\n functions: string[];\n /** Function bodies for merging (keyed by namespaced name) */\n functionBodies: Map<string, string>;\n /** Constants for merging (keyed by name) */\n constants: Map<string, string>;\n /** Any warnings during extraction */\n warnings: string[];\n}\n\n// ============================================================================\n// Function Extraction\n// ============================================================================\n\n/**\n * Extract ALL function declarations from a source file\n *\n * When extractAll is true, extracts all functions (for runtime files).\n * Otherwise, only extracts functions in functionNames set.\n *\n * @param sourceFile - Source file to scan\n * @param functionNames - Names of functions to extract (if extractAll is false)\n * @param extractAll - If true, extract all functions regardless of names\n * @returns Map of function name -> extracted info\n */\nexport function extractFunctions(\n sourceFile: SourceFile,\n functionNames: Set<string>,\n extractAll = false\n): Map<string, ExtractedFunction> {\n const extracted = new Map<string, ExtractedFunction>();\n\n // Find function declarations\n sourceFile.forEachDescendant((node) => {\n if (!Node.isFunctionDeclaration(node)) return;\n\n const name = node.getName();\n if (!name) return;\n if (!extractAll && !functionNames.has(name)) return;\n\n const body = node.getBody();\n if (!body) return;\n\n // Get the full function text and strip TypeScript types\n const fullText = stripTypesFromFunction(node.getText());\n\n extracted.set(name, {\n name,\n body: fullText,\n params: node.getParameters().map(p => p.getName()),\n isAsync: node.isAsync(),\n sourcePath: sourceFile.getFilePath(),\n });\n });\n\n // Also check variable declarations with arrow functions\n sourceFile.forEachDescendant((node) => {\n if (!Node.isVariableDeclaration(node)) return;\n\n const name = node.getName();\n if (!extractAll && !functionNames.has(name)) return;\n if (extracted.has(name)) return; // Already found as function declaration\n\n const init = node.getInitializer();\n if (!init) return;\n\n // Arrow function\n if (Node.isArrowFunction(init)) {\n const params = init.getParameters().map(p => p.getName());\n const body = init.getBody();\n if (!body) return;\n\n // Reconstruct as regular async function for consistency\n const bodyText = Node.isBlock(body)\n ? body.getText()\n : `{ return ${body.getText()}; }`;\n\n const asyncKeyword = init.isAsync() ? 'async ' : '';\n const funcText = `${asyncKeyword}function ${name}(${params.join(', ')}) ${bodyText}`;\n\n extracted.set(name, {\n name,\n body: funcText,\n params,\n isAsync: init.isAsync(),\n sourcePath: sourceFile.getFilePath(),\n });\n }\n });\n\n return extracted;\n}\n\n/**\n * Extract top-level constants from a source file\n *\n * Extracts const declarations that are object literals, arrays, or primitives.\n * These are needed when functions reference module-level constants.\n *\n * @param sourceFile - Source file to scan\n * @returns Map of constant name -> extracted info\n */\nexport function extractConstants(\n sourceFile: SourceFile\n): Map<string, ExtractedConstant> {\n const extracted = new Map<string, ExtractedConstant>();\n\n // Look for top-level variable statements\n for (const statement of sourceFile.getStatements()) {\n if (!Node.isVariableStatement(statement)) continue;\n\n // Only extract const declarations\n const declList = statement.getDeclarationList();\n if (declList.getDeclarationKind() !== VariableDeclarationKind.Const) continue;\n\n for (const decl of declList.getDeclarations()) {\n const name = decl.getName();\n const init = decl.getInitializer();\n if (!init) continue;\n\n // Skip functions (already handled by extractFunctions)\n if (Node.isArrowFunction(init) || Node.isFunctionExpression(init)) {\n continue;\n }\n\n // Extract object literals, array literals, and primitives\n if (\n Node.isObjectLiteralExpression(init) ||\n Node.isArrayLiteralExpression(init) ||\n Node.isStringLiteral(init) ||\n Node.isNumericLiteral(init) ||\n Node.isTrueLiteral(init) ||\n Node.isFalseLiteral(init)\n ) {\n // Get the value, stripping any type annotations\n let value = init.getText();\n\n // For object literals, strip type annotations from values\n // e.g., { key: 'value' as const } -> { key: 'value' }\n value = value.replace(/\\s+as\\s+\\w+(?:<[^>]+>)?/g, '');\n value = value.replace(/\\s+as\\s+const/g, '');\n\n extracted.set(name, {\n name,\n value,\n sourcePath: sourceFile.getFilePath(),\n });\n }\n }\n }\n\n return extracted;\n}\n\n/**\n * Extract functions from import paths\n *\n * Resolves import paths relative to the main source file and extracts\n * ALL functions from those files (runtime files need all helpers).\n */\n/**\n * Result of extracting from import paths\n */\nexport interface ExtractFromImportsResult {\n functions: Map<string, ExtractedFunction>;\n constants: Map<string, ExtractedConstant>;\n}\n\nexport function extractFromImports(\n project: Project,\n mainSourcePath: string,\n importPaths: string[],\n functionNames: Set<string>\n): ExtractFromImportsResult {\n const allFunctions = new Map<string, ExtractedFunction>();\n const allConstants = new Map<string, ExtractedConstant>();\n const mainDir = path.dirname(mainSourcePath);\n\n for (const importPath of importPaths) {\n // Resolve relative import to absolute path\n let resolvedPath: string;\n if (importPath.startsWith('.')) {\n resolvedPath = path.resolve(mainDir, importPath);\n // Convert .js extension to .ts for TypeScript source lookup\n // (TSX files import from .js but actual sources are .ts)\n if (resolvedPath.endsWith('.js')) {\n resolvedPath = resolvedPath.replace(/\\.js$/, '.ts');\n } else if (!resolvedPath.endsWith('.ts')) {\n resolvedPath += '.ts';\n }\n } else {\n // Node module - skip for now (would need node_modules resolution)\n continue;\n }\n\n try {\n const sourceFile = project.addSourceFileAtPath(resolvedPath);\n\n // Extract ALL functions from runtime files (they need helper functions)\n const extractedFunctions = extractFunctions(sourceFile, functionNames, true);\n extractedFunctions.forEach((info, name) => {\n allFunctions.set(name, info);\n });\n\n // Extract constants from runtime files\n const extractedConstants = extractConstants(sourceFile);\n extractedConstants.forEach((info, name) => {\n allConstants.set(name, info);\n });\n } catch (e) {\n // File not found - will be reported as warning\n continue;\n }\n }\n\n return { functions: allFunctions, constants: allConstants };\n}\n\n// ============================================================================\n// Runtime Generation\n// ============================================================================\n\n/**\n * Analyze function bodies to detect required imports\n */\nfunction detectRequiredImports(functionBodies: string[]): string[] {\n const imports: string[] = [];\n const allBodies = functionBodies.join('\\n');\n\n // Check for fs usage (fs.promises, fs.readFile, fs.stat, fs.mkdir, etc.)\n if (/\\bfs\\./.test(allBodies) || /await import\\(['\"]fs/.test(allBodies)) {\n imports.push(\"const fs = await import('fs/promises');\");\n }\n\n // Check for path usage (path.join, path.dirname, path.basename, etc.)\n if (/\\bpath\\./.test(allBodies)) {\n imports.push(\"const path = await import('path');\");\n }\n\n return imports;\n}\n\n/**\n * Rename a function declaration in its source text\n *\n * @example renameFunctionDeclaration('async function init(args) { ... }', 'init', 'planPhase_init')\n * → 'async function planPhase_init(args) { ... }'\n */\nfunction renameFunctionDeclaration(source: string, originalName: string, newName: string): string {\n // Match \"function name\" or \"async function name\" and replace name\n const pattern = new RegExp(`((?:async\\\\s+)?function\\\\s+)${originalName}(\\\\s*\\\\()`);\n return source.replace(pattern, `$1${newName}$2`);\n}\n\n/**\n * Rename function calls in source code\n *\n * Replaces standalone function calls like `fnName(...)` with `newName(...)`.\n * Avoids replacing object method calls like `obj.fnName(...)` or `await fnName(...)`.\n *\n * @example renameFunctionCalls('fileExists(path)', { 'fileExists': 'ns_fileExists' })\n * → 'ns_fileExists(path)'\n */\nfunction renameFunctionCalls(source: string, nameMap: Map<string, string>): string {\n let result = source;\n\n nameMap.forEach((newName, oldName) => {\n // Match function calls: word boundary + name + (\n // But NOT: .name( (method call) or name without (\n // Use negative lookbehind for . and positive lookahead for (\n const pattern = new RegExp(`(?<![.\\\\w])\\\\b${oldName}\\\\s*\\\\(`, 'g');\n result = result.replace(pattern, `${newName}(`);\n });\n\n return result;\n}\n\n/**\n * Generate runtime.js content from extracted functions and constants\n *\n * @param functions - Map of original function name -> extracted info\n * @param constants - Map of constant name -> extracted info\n * @param namespace - Optional namespace prefix for function names\n */\nexport function generateRuntime(\n functions: Map<string, ExtractedFunction>,\n constants: Map<string, ExtractedConstant> = new Map(),\n namespace?: string\n): RuntimeEmitResult {\n const warnings: string[] = [];\n const functionNames: string[] = [];\n const functionBodies: string[] = [];\n\n // Build name mapping for internal call renaming\n const nameMap = new Map<string, string>();\n if (namespace) {\n functions.forEach((_, originalName) => {\n nameMap.set(originalName, `${namespace}_${originalName}`);\n });\n }\n\n functions.forEach((info, originalName) => {\n // Apply namespace prefix if provided\n const finalName = namespace ? `${namespace}_${originalName}` : originalName;\n functionNames.push(finalName);\n\n let body = info.body;\n if (namespace) {\n // Rename the function declaration\n body = renameFunctionDeclaration(body, originalName, finalName);\n // Rename internal function calls\n body = renameFunctionCalls(body, nameMap);\n }\n functionBodies.push(body);\n });\n\n if (functionNames.length === 0) {\n return {\n content: '',\n functions: [],\n functionBodies: new Map(),\n constants: new Map(),\n warnings: ['No runtime functions to extract'],\n };\n }\n\n // Build maps for merging support\n const functionBodiesMap = new Map<string, string>();\n const constantsMap = new Map<string, string>();\n\n for (let i = 0; i < functionNames.length; i++) {\n functionBodiesMap.set(functionNames[i], functionBodies[i]);\n }\n\n constants.forEach((info) => {\n constantsMap.set(info.name, info.value);\n });\n\n // Generate constant definitions\n const constantDefs: string[] = [];\n constants.forEach((info) => {\n constantDefs.push(`const ${info.name} = ${info.value};`);\n });\n\n // Generate runtime content using shared template\n const content = generateRuntimeContent({\n functionNames,\n functionBodies,\n imports: detectRequiredImports(functionBodies),\n constants: constantDefs,\n });\n\n return {\n content,\n functions: functionNames,\n functionBodies: functionBodiesMap,\n constants: constantsMap,\n warnings,\n };\n}\n\n// ============================================================================\n// Main Entry Point\n// ============================================================================\n\n/**\n * Emit runtime.js from a V3 document's runtime function usage\n *\n * @param project - ts-morph project for file resolution\n * @param mainSourcePath - Path to the main TSX source file\n * @param functionNames - Names of functions that need to be extracted\n * @param importPaths - Import paths where functions might be defined\n * @param namespace - Optional namespace prefix for function names (e.g., 'planPhase')\n * @returns Runtime emit result with content and metadata\n */\nexport function emitRuntime(\n project: Project,\n mainSourcePath: string,\n functionNames: string[],\n importPaths: string[],\n namespace?: string\n): RuntimeEmitResult {\n if (functionNames.length === 0) {\n return {\n content: '',\n functions: [],\n functionBodies: new Map(),\n constants: new Map(),\n warnings: [],\n };\n }\n\n const namesSet = new Set(functionNames);\n const warnings: string[] = [];\n\n // First try to extract from the main source file\n const mainSource = project.getSourceFile(mainSourcePath);\n let extractedFunctions = new Map<string, ExtractedFunction>();\n let extractedConstants = new Map<string, ExtractedConstant>();\n\n if (mainSource) {\n extractedFunctions = extractFunctions(mainSource, namesSet);\n extractedConstants = extractConstants(mainSource);\n }\n\n // Then try import paths for any missing functions (also gets constants)\n const missing = new Set(\n functionNames.filter(n => !extractedFunctions.has(n))\n );\n\n if (missing.size > 0 && importPaths.length > 0) {\n const fromImports = extractFromImports(project, mainSourcePath, importPaths, missing);\n\n fromImports.functions.forEach((info, name) => {\n extractedFunctions.set(name, info);\n });\n\n fromImports.constants.forEach((info, name) => {\n extractedConstants.set(name, info);\n });\n }\n\n // Check for still-missing functions\n for (const name of functionNames) {\n if (!extractedFunctions.has(name)) {\n warnings.push(`Could not extract function: ${name}`);\n }\n }\n\n return generateRuntime(extractedFunctions, extractedConstants, namespace);\n}\n\n/**\n * Merge multiple RuntimeEmitResults into a single result\n *\n * Used when building multiple V3 files that share a single runtime.js.\n * Each file's functions are already namespaced to avoid collisions.\n *\n * @param results - Array of RuntimeEmitResults to merge\n * @returns Merged result with combined functions and constants\n */\nexport function mergeRuntimeResults(results: RuntimeEmitResult[]): RuntimeEmitResult {\n const mergedFunctions = new Map<string, string>();\n const mergedConstants = new Map<string, string>();\n const allFunctionNames: string[] = [];\n const allWarnings: string[] = [];\n\n for (const result of results) {\n result.functionBodies.forEach((body, name) => {\n if (!mergedFunctions.has(name)) {\n mergedFunctions.set(name, body);\n allFunctionNames.push(name);\n }\n });\n\n result.constants.forEach((value, name) => {\n if (!mergedConstants.has(name)) {\n mergedConstants.set(name, value);\n }\n });\n\n allWarnings.push(...result.warnings);\n }\n\n if (allFunctionNames.length === 0) {\n return {\n content: '',\n functions: [],\n functionBodies: new Map(),\n constants: new Map(),\n warnings: allWarnings,\n };\n }\n\n // Generate merged runtime content\n const functionBodies = allFunctionNames.map(name => mergedFunctions.get(name)!);\n\n // Generate constant definitions\n const constantDefs: string[] = [];\n mergedConstants.forEach((value, name) => {\n constantDefs.push(`const ${name} = ${value};`);\n });\n\n // Generate runtime content using shared template\n const content = generateRuntimeContent({\n functionNames: allFunctionNames,\n functionBodies,\n imports: detectRequiredImports(functionBodies),\n constants: constantDefs,\n });\n\n return {\n content,\n functions: allFunctionNames,\n functionBodies: mergedFunctions,\n constants: mergedConstants,\n warnings: allWarnings,\n };\n}\n\n/**\n * Check if a source file contains V3 runtime usage\n *\n * Looks for:\n * - useRuntimeVar imports/usage\n * - runtimeFn imports/usage\n *\n * @param sourceFile - Source file to check\n * @returns true if file uses V3 runtime features\n */\nexport function isRuntimeFile(sourceFile: SourceFile): boolean {\n let hasV3Usage = false;\n\n sourceFile.forEachDescendant((node) => {\n if (hasV3Usage) return; // Early exit\n\n // Check for useRuntimeVar call\n if (Node.isCallExpression(node)) {\n const expr = node.getExpression();\n if (Node.isIdentifier(expr)) {\n const name = expr.getText();\n if (name === 'useRuntimeVar' || name === 'runtimeFn') {\n hasV3Usage = true;\n }\n }\n }\n\n // Check for imports from react-agentic/v3\n if (Node.isImportDeclaration(node)) {\n const moduleSpec = node.getModuleSpecifierValue();\n if (moduleSpec.includes('/v3') || moduleSpec.endsWith('/v3')) {\n hasV3Usage = true;\n }\n }\n });\n\n return hasV3Usage;\n}\n","/**\n * TypeScript Type Stripping Module\n *\n * Strips TypeScript type annotations from function source code for runtime emission.\n * Used when extracting functions that will run as plain JavaScript in Node.js.\n */\n\n// ============================================================================\n// Type Stripping Functions\n// ============================================================================\n\n/**\n * Find the index of the function body opening brace\n * Handles nested braces in type annotations (e.g., Promise<{ foo: string }>)\n */\nfunction findFunctionBodyStart(funcText: string): number {\n // Find the last ) that's part of the parameter list\n // Then skip the return type (which may contain nested braces)\n // Then find the { that starts the function body\n\n // Strategy: Find \"function name(\" or \"(\" and track brace/paren depth\n const funcMatch = funcText.match(/(?:async\\s+)?function\\s+\\w+\\s*\\(/);\n if (!funcMatch) return -1;\n\n let pos = funcMatch.index! + funcMatch[0].length;\n let parenDepth = 1;\n\n // Find the closing ) of the parameter list\n while (pos < funcText.length && parenDepth > 0) {\n const char = funcText[pos];\n if (char === '(') parenDepth++;\n else if (char === ')') parenDepth--;\n pos++;\n }\n\n // Now pos is just after the closing )\n // Skip whitespace and optional return type annotation to find the {\n // Return type starts with : and can contain nested <> {} []\n let inReturnType = false;\n let braceDepth = 0;\n let angleDepth = 0;\n let bracketDepth = 0;\n\n while (pos < funcText.length) {\n const char = funcText[pos];\n\n if (!inReturnType && char === ':') {\n // Start of return type annotation\n inReturnType = true;\n pos++;\n continue;\n }\n\n if (inReturnType) {\n // Track nested brackets in return type\n if (char === '<') angleDepth++;\n else if (char === '>') angleDepth--;\n else if (char === '[') bracketDepth++;\n else if (char === ']') bracketDepth--;\n else if (char === '{') {\n if (angleDepth === 0 && bracketDepth === 0) {\n // Found the function body opening brace\n return pos;\n }\n braceDepth++;\n } else if (char === '}') {\n braceDepth--;\n }\n } else if (char === '{') {\n // Found the function body opening brace (no return type)\n return pos;\n }\n\n pos++;\n }\n\n return -1;\n}\n\n/**\n * Find the position of the closing paren of the parameter list\n */\nfunction findParamListEnd(funcText: string): number {\n const funcMatch = funcText.match(/(?:async\\s+)?function\\s+\\w+\\s*\\(/);\n if (!funcMatch) return -1;\n\n let pos = funcMatch.index! + funcMatch[0].length;\n let parenDepth = 1;\n\n while (pos < funcText.length && parenDepth > 0) {\n const char = funcText[pos];\n if (char === '(') parenDepth++;\n else if (char === ')') parenDepth--;\n pos++;\n }\n\n return pos - 1; // Position of the closing )\n}\n\n/**\n * Strip type annotations from variable declarations in code\n * Uses a state machine to handle complex types with nested braces/brackets\n */\nfunction stripVariableTypeAnnotations(code: string): string {\n let result = '';\n let i = 0;\n\n while (i < code.length) {\n // Look for const/let/var followed by identifier and colon\n const declMatch = code.slice(i).match(/^(const|let|var)\\s+(\\w+)\\s*:/);\n if (declMatch) {\n // Found a typed variable declaration\n const keyword = declMatch[1];\n const name = declMatch[2];\n\n // Skip past the match\n let j = i + declMatch[0].length;\n\n // Skip the type annotation - track depth of {}, [], <>\n let depth = 0;\n while (j < code.length) {\n const char = code[j];\n if (char === '{' || char === '[' || char === '<') {\n depth++;\n } else if (char === '}' || char === ']' || char === '>') {\n depth--;\n } else if (depth === 0 && (char === '=' || char === ';' || char === '\\n')) {\n // End of type annotation\n break;\n }\n j++;\n }\n\n // Output the declaration without the type\n result += keyword + ' ' + name;\n\n // Continue from where we left off\n i = j;\n continue;\n }\n\n // No match, copy character as-is\n result += code[i];\n i++;\n }\n\n return result;\n}\n\n/**\n * Strip type assertions from code\n * Handles: value as Type, <Type>value\n */\nfunction stripTypeAssertions(code: string): string {\n // Strip \"as Type\" assertions - handle nested generics\n let result = code;\n\n // Strip \" as Type\" or \" as Type<...>\"\n // Match \"as\" followed by type identifier and optional generic args\n result = result.replace(/\\s+as\\s+\\w+(?:<[^>]+>)?/g, '');\n\n // Strip angle bracket assertions: <Type>value or <Type<...>>value\n result = result.replace(/<\\w+(?:<[^>]+>)?>/g, '');\n\n return result;\n}\n\n/**\n * Strip arrow function type annotations from code\n * Handles: (param: Type): ReturnType => ... → (param) => ...\n */\nfunction stripArrowFunctionTypes(code: string): string {\n let result = '';\n let i = 0;\n\n while (i < code.length) {\n // Look for arrow function patterns: (params) or (params): ReturnType followed by =>\n // Pattern: = (params): ReturnType => or = (params) =>\n const arrowMatch = code.slice(i).match(/^=\\s*\\(/);\n if (arrowMatch) {\n result += '= (';\n i += arrowMatch[0].length;\n\n // Parse parameter list, stripping types\n let parenDepth = 1;\n let inType = false;\n let paramChars = '';\n\n while (i < code.length && parenDepth > 0) {\n const char = code[i];\n\n if (char === '(') {\n parenDepth++;\n if (!inType) paramChars += char;\n } else if (char === ')') {\n parenDepth--;\n if (parenDepth > 0 && !inType) paramChars += char;\n } else if (char === ':' && parenDepth === 1) {\n // Start of type annotation for this param\n inType = true;\n } else if (char === ',' && parenDepth === 1) {\n // End of param, reset type tracking\n inType = false;\n paramChars += char;\n } else if (!inType) {\n paramChars += char;\n }\n\n i++;\n }\n\n result += paramChars + ')';\n\n // Now check for return type annotation: ): ReturnType =>\n // Skip whitespace\n while (i < code.length && /\\s/.test(code[i])) {\n i++;\n }\n\n // Check for return type annotation\n if (code[i] === ':') {\n i++; // Skip the colon\n // Skip the return type - track depth for nested types like { a: b }\n let depth = 0;\n while (i < code.length) {\n const char = code[i];\n if (char === '{' || char === '<' || char === '(' || char === '[') {\n depth++;\n } else if (char === '}' || char === '>' || char === ')' || char === ']') {\n depth--;\n } else if (depth === 0 && code.slice(i, i + 2) === '=>') {\n // Found the arrow, stop skipping\n break;\n }\n i++;\n }\n }\n\n // Add space before arrow if needed\n if (result[result.length - 1] !== ' ') {\n result += ' ';\n }\n\n continue;\n }\n\n // No match, copy character as-is\n result += code[i];\n i++;\n }\n\n return result;\n}\n\n/**\n * Strip TypeScript type annotations from function source code\n *\n * Handles:\n * - Function parameter types\n * - Return type annotations\n * - Variable declarations in body\n * - Type assertions (as Type)\n * - Arrow function type annotations\n *\n * @param funcText - Full function source code\n * @returns Function source with types removed\n */\nexport function stripTypesFromFunction(funcText: string): string {\n const bodyStart = findFunctionBodyStart(funcText);\n if (bodyStart === -1) return funcText;\n\n const paramListEnd = findParamListEnd(funcText);\n if (paramListEnd === -1) return funcText;\n\n // Match the function declaration to get prefix\n const funcMatch = funcText.match(/(?:async\\s+)?function\\s+\\w+\\s*\\(/);\n if (!funcMatch) return funcText;\n\n // Extract parts:\n // - prefix: \"async function name(\" or \"function name(\"\n // - params: everything between ( and ) of parameter list\n // - body: from the opening { of function body to the end\n const prefix = funcText.slice(0, funcMatch.index! + funcMatch[0].length);\n const params = funcText.slice(funcMatch.index! + funcMatch[0].length, paramListEnd);\n let body = funcText.slice(bodyStart);\n\n // Remove 'export' keyword from prefix\n let cleanPrefix = prefix.replace(/^export\\s+/, '');\n\n // Remove generic type parameters on function: function name<T>( -> function name(\n cleanPrefix = cleanPrefix.replace(/function\\s+(\\w+)\\s*<[^>]+>\\s*\\(/, 'function $1(');\n\n // Extract just parameter names from params string\n // Handle complex types like { foo: string } by tracking brace depth\n const paramNames: string[] = [];\n let depth = 0;\n let current = '';\n let inName = true;\n\n for (const char of params) {\n if (char === '{' || char === '<' || char === '(') {\n depth++;\n if (!inName) continue;\n } else if (char === '}' || char === '>' || char === ')') {\n depth--;\n if (!inName) continue;\n } else if (char === ':' && depth === 0) {\n inName = false;\n continue;\n } else if (char === ',' && depth === 0) {\n if (current.trim()) paramNames.push(current.trim());\n current = '';\n inName = true;\n continue;\n }\n\n if (inName) {\n current += char;\n }\n }\n if (current.trim()) paramNames.push(current.trim());\n\n // Build clean signature: prefix + stripped params + )\n const cleanSignature = cleanPrefix + paramNames.join(', ') + ')';\n\n // Strip type annotations from variable declarations in the body\n // Uses a state machine to handle complex types with nested braces/brackets\n body = stripVariableTypeAnnotations(body);\n\n // Strip type assertions: value as Type -> value\n // Must be careful to handle nested generics\n body = stripTypeAssertions(body);\n\n // Strip arrow function type annotations: (param: Type): ReturnType => ...\n body = stripArrowFunctionTypes(body);\n\n return cleanSignature + ' ' + body;\n}\n","/**\n * Runtime Template Generator\n *\n * Generates the V3 runtime.js template structure.\n * Used by both generateRuntime and mergeRuntimeResults.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for generating runtime content\n */\nexport interface RuntimeTemplateOptions {\n /** Function names in registry order */\n functionNames: string[];\n /** Function bodies (must match functionNames order) */\n functionBodies: string[];\n /** Import statements to include */\n imports: string[];\n /** Constant definitions (const NAME = value;) */\n constants: string[];\n}\n\n// ============================================================================\n// Template Generator\n// ============================================================================\n\n/**\n * Generate the runtime.js file content\n *\n * Creates a Node.js executable with:\n * - Dynamic imports (ESM compatible)\n * - Extracted constants\n * - Extracted functions\n * - Function registry\n * - CLI entry point\n *\n * @param options - Template configuration\n * @returns Complete runtime.js file content\n */\nexport function generateRuntimeContent(options: RuntimeTemplateOptions): string {\n const { functionNames, functionBodies, imports, constants } = options;\n\n // Generate imports section\n const importsSection = imports.length > 0\n ? ` // Imports (dynamic for ESM compatibility)\n${imports.map(i => ' ' + i).join('\\n')}\n\n`\n : '';\n\n // Generate constants section\n const constantsSection = constants.length > 0\n ? ` // ============================================================================\n // Constants\n // ============================================================================\n\n${constants.map(c => ' ' + c).join('\\n')}\n\n`\n : '';\n\n // Generate the runtime.js content wrapped in async IIFE\n return `#!/usr/bin/env node\n/**\n * V3 Runtime - Extracted functions for Claude Code execution\n * Generated by react-agentic\n *\n * Usage: node runtime.js <functionName> '<jsonArgs>'\n */\n\n(async () => {\n${importsSection}${constantsSection} // ============================================================================\n // Extracted Functions\n // ============================================================================\n\n${functionBodies.map(b => ' ' + b.split('\\n').join('\\n ')).join('\\n\\n')}\n\n // ============================================================================\n // Function Registry\n // ============================================================================\n\n const registry = {\n${functionNames.map(n => ` ${n},`).join('\\n')}\n };\n\n // ============================================================================\n // CLI Entry Point\n // ============================================================================\n\n const [,, fnName, argsJson] = process.argv;\n\n if (!fnName) {\n console.error('Usage: node runtime.js <functionName> <jsonArgs>');\n console.error('Available functions:', Object.keys(registry).join(', '));\n process.exit(1);\n }\n\n const fn = registry[fnName];\n if (!fn) {\n console.error(\\`Unknown function: \\${fnName}\\`);\n console.error('Available functions:', Object.keys(registry).join(', '));\n process.exit(1);\n }\n\n let args = {};\n if (argsJson) {\n try {\n args = JSON.parse(argsJson);\n } catch (e) {\n console.error(\\`Invalid JSON args: \\${e.message}\\`);\n process.exit(1);\n }\n }\n\n try {\n const result = await fn(args);\n console.log(JSON.stringify(result));\n } catch (e) {\n console.error(\\`Function error: \\${e.message}\\`);\n process.exit(1);\n }\n})();\n`;\n}\n","/**\n * esbuild-based Runtime Bundler\n *\n * Uses esbuild to bundle .runtime.ts files with full npm package support.\n * This replaces the manual type-stripping approach with proper bundling.\n */\n\nimport * as esbuild from 'esbuild';\nimport { SourceFile, Node } from 'ts-morph';\nimport path from 'path';\nimport { mkdir, writeFile, rm } from 'fs/promises';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Information about a runtime file for single-entry bundling\n */\nexport interface RuntimeFileInfo {\n /** Absolute path to the .runtime.ts source file */\n sourcePath: string;\n /** Namespace prefix for functions (e.g., 'planPhase') */\n namespace: string;\n /** Exported function names found in source (without namespace prefix) */\n exportedFunctions: string[];\n}\n\n/**\n * Options for single-entry bundling\n */\nexport interface SingleEntryBundleOptions {\n /** Runtime file info from all V3 files */\n runtimeFiles: RuntimeFileInfo[];\n /** Output path for the final runtime.js */\n outputPath: string;\n /** Directory for temporary entry file (default: .generated) */\n entryDir?: string;\n /** Minify the output bundle (default: false) */\n minify?: boolean;\n}\n\n/**\n * Options for code-split bundling\n */\nexport interface CodeSplitBundleOptions {\n /** Runtime file info from all V3 files */\n runtimeFiles: RuntimeFileInfo[];\n /** Output directory for split bundles */\n outputDir: string;\n /** Directory for temporary entry files (default: .generated) */\n entryDir?: string;\n /** Minify output bundles (default: false) */\n minify?: boolean;\n}\n\n/**\n * Result from code-split bundling\n */\nexport interface CodeSplitBundleResult {\n /** Dispatcher runtime.js content */\n dispatcherContent: string;\n /** Map of namespace -> bundled module content */\n moduleContents: Map<string, string>;\n /** All function names (with namespace prefixes) */\n functions: string[];\n /** Warnings from bundling */\n warnings: string[];\n}\n\n/**\n * Result from single-entry bundling\n */\nexport interface SingleEntryBundleResult {\n /** Final runtime.js content */\n content: string;\n /** All function names in registry (with namespace prefixes) */\n functions: string[];\n /** Warnings from bundling */\n warnings: string[];\n}\n\nexport interface BundledRuntime {\n /** Bundled JavaScript code (without CLI wrapper) */\n code: string;\n /** Exported function names found in source */\n exportedFunctions: string[];\n /** Source file path */\n sourcePath: string;\n /** Any warnings */\n warnings: string[];\n}\n\nexport interface BundleRuntimeOptions {\n /** Namespace prefix for functions (e.g., 'planPhase' -> 'planPhase_init') */\n namespace?: string;\n /** External modules to exclude from bundle (default: []) */\n external?: string[];\n}\n\nexport interface MergedRuntimeResult {\n /** Final runtime.js content */\n content: string;\n /** All function names in registry */\n functions: string[];\n /** Warnings from bundling */\n warnings: string[];\n}\n\n// ============================================================================\n// Function Extraction (from TypeScript source)\n// ============================================================================\n\n/**\n * Extract exported function names from a TypeScript source file\n */\nexport function extractExportedFunctionNames(sourceFile: SourceFile): string[] {\n const names: string[] = [];\n\n sourceFile.forEachDescendant((node) => {\n // Exported function declarations: export async function init() {}\n if (Node.isFunctionDeclaration(node)) {\n if (node.isExported()) {\n const name = node.getName();\n if (name) names.push(name);\n }\n }\n\n // Exported variable declarations with arrow functions:\n // export const init = async () => {}\n if (Node.isVariableStatement(node)) {\n if (node.isExported()) {\n for (const decl of node.getDeclarationList().getDeclarations()) {\n const init = decl.getInitializer();\n if (init && (Node.isArrowFunction(init) || Node.isFunctionExpression(init))) {\n names.push(decl.getName());\n }\n }\n }\n }\n });\n\n return names;\n}\n\n// ============================================================================\n// Esbuild Bundling\n// ============================================================================\n\n/**\n * Bundle a .runtime.ts file using esbuild\n *\n * This bundles the TypeScript file with all its npm dependencies inlined,\n * producing a self-contained JavaScript module.\n */\nexport async function bundleRuntimeFile(\n runtimeFilePath: string,\n options: BundleRuntimeOptions = {}\n): Promise<BundledRuntime> {\n const warnings: string[] = [];\n const { namespace, external = [] } = options;\n\n // Bundle with esbuild\n const result = await esbuild.build({\n entryPoints: [runtimeFilePath],\n bundle: true,\n platform: 'node',\n format: 'esm',\n write: false,\n // Keep node built-ins external, they'll be imported at runtime\n external: ['fs', 'fs/promises', 'path', 'node:fs', 'node:path', ...external],\n // Target modern Node.js\n target: 'node18',\n // Don't minify for readability\n minify: false,\n // Keep names for debugging\n keepNames: true,\n // Tree-shake unused exports\n treeShaking: true,\n });\n\n if (result.errors.length > 0) {\n for (const error of result.errors) {\n warnings.push(`esbuild error: ${error.text}`);\n }\n }\n\n if (result.warnings.length > 0) {\n for (const warning of result.warnings) {\n warnings.push(`esbuild warning: ${warning.text}`);\n }\n }\n\n let code = result.outputFiles?.[0]?.text || '';\n\n // The bundled code has ESM exports. We need to extract the function bodies\n // and make them available as regular functions for the registry.\n //\n // esbuild output looks like:\n // ```\n // // ... bundled deps ...\n // async function init(args) { ... }\n // export { init, otherFn };\n // ```\n //\n // We need to:\n // 1. Remove the export statement\n // 2. Rename functions if namespace is provided\n\n // Remove ESM export statements\n code = code.replace(/^export\\s*\\{[^}]*\\};?\\s*$/gm, '');\n\n // Remove ESM import statements (they'll be added once in the wrapper)\n // Handles: import * as fs from \"fs/promises\"; import { x } from \"y\";\n code = code.replace(/^import\\s+.*?from\\s+['\"][^'\"]+['\"];?\\s*$/gm, '');\n code = code.replace(/^import\\s+['\"][^'\"]+['\"];?\\s*$/gm, ''); // import \"side-effect\";\n\n // Also remove any leading comments about the source file that esbuild adds\n // e.g., \"// src/app/v3/map-codebase.runtime.ts\"\n code = code.replace(/^\\/\\/\\s+src\\/.*\\.ts\\s*$/gm, '');\n\n // Extract function names from the export statement before removing it\n // (we already have them from ts-morph, but this is a backup)\n const exportedFunctions: string[] = [];\n const exportMatch = code.match(/export\\s*\\{\\s*([^}]+)\\s*\\}/);\n if (exportMatch) {\n const exports = exportMatch[1].split(',').map(s => s.trim().split(/\\s+as\\s+/)[0]);\n exportedFunctions.push(...exports);\n }\n\n // If namespace provided, rename functions\n if (namespace) {\n // Build a map of old name -> new name\n const renameMap = new Map<string, string>();\n for (const fn of exportedFunctions) {\n renameMap.set(fn, `${namespace}_${fn}`);\n }\n\n // Rename function declarations\n for (const [oldName, newName] of renameMap) {\n // Match \"async function name\" or \"function name\"\n const fnDeclPattern = new RegExp(`((?:async\\\\s+)?function\\\\s+)${oldName}(\\\\s*\\\\()`, 'g');\n code = code.replace(fnDeclPattern, `$1${newName}$2`);\n\n // Rename calls to other functions in this module\n // Be careful not to rename method calls (obj.name) or property access\n const fnCallPattern = new RegExp(`(?<![.\\\\w])\\\\b${oldName}(\\\\s*\\\\()`, 'g');\n code = code.replace(fnCallPattern, `${newName}$1`);\n }\n\n // Update exportedFunctions with new names\n exportedFunctions.length = 0;\n for (const [, newName] of renameMap) {\n exportedFunctions.push(newName);\n }\n }\n\n return {\n code: code.trim(),\n exportedFunctions,\n sourcePath: runtimeFilePath,\n warnings,\n };\n}\n\n// ============================================================================\n// Runtime Merging\n// ============================================================================\n\n/**\n * Merge multiple bundled runtimes into a single runtime.js\n */\nexport function mergeAndWrapRuntimes(bundledRuntimes: BundledRuntime[]): MergedRuntimeResult {\n const allFunctions: string[] = [];\n const allWarnings: string[] = [];\n const codeBlocks: string[] = [];\n\n for (const runtime of bundledRuntimes) {\n allFunctions.push(...runtime.exportedFunctions);\n allWarnings.push(...runtime.warnings);\n codeBlocks.push(runtime.code);\n }\n\n // Generate the final runtime.js with CLI wrapper\n const content = `#!/usr/bin/env node\n/**\n * V3 Runtime - Bundled functions for Claude Code execution\n * Generated by react-agentic (esbuild bundler)\n *\n * Usage: node runtime.js <functionName> '<jsonArgs>'\n */\n\n// ============================================================================\n// Imports (Node.js built-ins)\n// ============================================================================\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\n// ============================================================================\n// Bundled Runtime Code\n// ============================================================================\n\n${codeBlocks.join('\\n\\n// ----------------------------------------------------------------------------\\n\\n')}\n\n// ============================================================================\n// Function Registry\n// ============================================================================\n\nconst registry = {\n${allFunctions.map(n => ` ${n},`).join('\\n')}\n};\n\n// ============================================================================\n// CLI Entry Point\n// ============================================================================\n\nconst [,, fnName, argsJson] = process.argv;\n\nif (!fnName) {\n console.error('Usage: node runtime.js <functionName> <jsonArgs>');\n console.error('Available functions:', Object.keys(registry).join(', '));\n process.exit(1);\n}\n\nconst fn = registry[fnName];\nif (!fn) {\n console.error(\\`Unknown function: \\${fnName}\\`);\n console.error('Available functions:', Object.keys(registry).join(', '));\n process.exit(1);\n}\n\nlet args = {};\nif (argsJson) {\n try {\n args = JSON.parse(argsJson);\n } catch (e) {\n console.error(\\`Invalid JSON args: \\${e.message}\\`);\n process.exit(1);\n }\n}\n\ntry {\n const result = await fn(args);\n console.log(JSON.stringify(result));\n} catch (e) {\n console.error(\\`Function error: \\${e.message}\\`);\n process.exit(1);\n}\n`;\n\n return {\n content,\n functions: allFunctions,\n warnings: allWarnings,\n };\n}\n\n// ============================================================================\n// Single-Entry Bundling (New Approach)\n// ============================================================================\n\n/**\n * Generate a TypeScript entry point that imports all runtime modules\n *\n * Creates content like:\n * ```typescript\n * import * as mapCodebase from '../src/app/v3/map-codebase.runtime.js';\n * import * as planPhase from '../src/app/v3/plan-phase.runtime.js';\n *\n * export const registry = {\n * mapCodebase_init: mapCodebase.init,\n * planPhase_init: planPhase.init,\n * };\n * ```\n */\nexport function generateRuntimeEntryPoint(\n runtimeFiles: RuntimeFileInfo[],\n entryDir: string\n): { content: string; functions: string[] } {\n const imports: string[] = [];\n const registryEntries: string[] = [];\n const allFunctions: string[] = [];\n\n for (const file of runtimeFiles) {\n const { sourcePath, namespace, exportedFunctions } = file;\n\n // Calculate relative path from entry dir to source file\n // Entry will be in entryDir, source is absolute path\n let relativePath = path.relative(entryDir, sourcePath);\n\n // Convert to .js extension for ESM imports\n relativePath = relativePath.replace(/\\.ts$/, '.js');\n\n // Ensure path starts with ./ or ../\n if (!relativePath.startsWith('.')) {\n relativePath = './' + relativePath;\n }\n\n // Add import statement\n imports.push(`import * as ${namespace} from '${relativePath}';`);\n\n // Add registry entries for each exported function\n for (const fn of exportedFunctions) {\n const qualifiedName = `${namespace}_${fn}`;\n registryEntries.push(` ${qualifiedName}: ${namespace}.${fn},`);\n allFunctions.push(qualifiedName);\n }\n }\n\n const content = `/**\n * Runtime Entry Point - Generated by react-agentic\n * DO NOT EDIT - This file is auto-generated\n */\n\n${imports.join('\\n')}\n\nexport const registry = {\n${registryEntries.join('\\n')}\n};\n`;\n\n return { content, functions: allFunctions };\n}\n\n/**\n * Wrap bundled code with CLI entry point\n */\nexport function wrapWithCLI(bundledCode: string): string {\n return `#!/usr/bin/env node\n/**\n * V3 Runtime - Bundled functions for Claude Code execution\n * Generated by react-agentic (single-entry esbuild bundler)\n *\n * Usage: node runtime.js <functionName> '<jsonArgs>'\n */\n\n${bundledCode}\n\n// ============================================================================\n// CLI Entry Point\n// ============================================================================\n\nconst [,, fnName, argsJson] = process.argv;\n\nif (!fnName) {\n console.error('Usage: node runtime.js <functionName> <jsonArgs>');\n console.error('Available functions:', Object.keys(registry).join(', '));\n process.exit(1);\n}\n\nconst fn = registry[fnName];\nif (!fn) {\n console.error(\\`Unknown function: \\${fnName}\\`);\n console.error('Available functions:', Object.keys(registry).join(', '));\n process.exit(1);\n}\n\nlet args = {};\nif (argsJson) {\n try {\n args = JSON.parse(argsJson);\n } catch (e) {\n console.error(\\`Invalid JSON args: \\${e.message}\\`);\n process.exit(1);\n }\n}\n\ntry {\n const result = await fn(args);\n console.log(JSON.stringify(result));\n} catch (e) {\n console.error(\\`Function error: \\${e.message}\\`);\n process.exit(1);\n}\n`;\n}\n\n/**\n * Bundle all runtime files using a single entry point\n *\n * This approach:\n * 1. Generates a TypeScript entry file that imports all runtime modules\n * 2. Bundles with esbuild (deduplicates shared code automatically)\n * 3. Wraps with CLI entry point\n * 4. Cleans up temporary files\n */\nexport async function bundleSingleEntryRuntime(\n options: SingleEntryBundleOptions\n): Promise<SingleEntryBundleResult> {\n const { runtimeFiles, outputPath, entryDir = '.generated', minify = false } = options;\n const warnings: string[] = [];\n\n if (runtimeFiles.length === 0) {\n return { content: '', functions: [], warnings: [] };\n }\n\n // Ensure entry directory exists\n const entryDirPath = path.resolve(entryDir);\n await mkdir(entryDirPath, { recursive: true });\n\n // Generate entry point content\n const entryPath = path.join(entryDirPath, '_runtime_entry.ts');\n const { content: entryContent, functions } = generateRuntimeEntryPoint(\n runtimeFiles,\n entryDirPath\n );\n\n // Write temporary entry file\n await writeFile(entryPath, entryContent, 'utf-8');\n\n try {\n // Bundle with esbuild\n const result = await esbuild.build({\n entryPoints: [entryPath],\n bundle: true,\n platform: 'node',\n format: 'esm',\n write: false,\n // Keep node built-ins external\n external: ['fs', 'fs/promises', 'path', 'node:fs', 'node:path'],\n target: 'node18',\n minify,\n keepNames: !minify, // Keep names unless minifying\n treeShaking: true,\n });\n\n // Collect warnings\n if (result.errors.length > 0) {\n for (const error of result.errors) {\n warnings.push(`esbuild error: ${error.text}`);\n }\n }\n if (result.warnings.length > 0) {\n for (const warning of result.warnings) {\n warnings.push(`esbuild warning: ${warning.text}`);\n }\n }\n\n let bundledCode = result.outputFiles?.[0]?.text || '';\n\n // esbuild outputs with ESM exports. We need to ensure registry is available.\n // The bundled code should already have `export { registry }` or similar.\n // We just need to make registry accessible for CLI usage.\n\n // Handle the ESM export - when minified, the registry variable might be renamed\n // e.g., \"export { a as registry };\" where 'a' is the actual variable\n //\n // We need to:\n // 1. Find the export statement\n // 2. Extract the actual variable name (might be different from 'registry' when minified)\n // 3. Either remove the export (if var is already named 'registry')\n // or add an alias (if var was renamed)\n\n // Match export statements like: export { registry }, export { a as registry }, export{a as registry};\n const exportMatch = bundledCode.match(/export\\s*\\{\\s*(\\w+)(?:\\s+as\\s+registry)?\\s*\\};?\\s*$/m);\n if (exportMatch) {\n const actualVarName = exportMatch[1];\n // Remove the export statement\n bundledCode = bundledCode.replace(/^export\\s*\\{[^}]*\\};?\\s*$/gm, '');\n\n // If the variable was renamed (not 'registry'), add an alias\n if (actualVarName !== 'registry') {\n bundledCode = bundledCode.trim() + `\\nconst registry = ${actualVarName};`;\n }\n } else {\n // Fallback: just remove any export statement\n bundledCode = bundledCode.replace(/^export\\s*\\{[^}]*\\};?\\s*$/gm, '');\n }\n\n // Wrap with CLI entry point\n const finalContent = wrapWithCLI(bundledCode);\n\n return {\n content: finalContent,\n functions,\n warnings,\n };\n } finally {\n // Cleanup temporary entry file\n try {\n await rm(entryPath);\n // Try to remove entry dir if empty\n await rm(entryDirPath, { recursive: false }).catch(() => {\n // Ignore - directory not empty or doesn't exist\n });\n } catch {\n // Ignore cleanup errors\n }\n }\n}\n\n// ============================================================================\n// Code-Split Bundling\n// ============================================================================\n\n/**\n * Generate a TypeScript entry point for a single namespace\n *\n * Creates content like:\n * ```typescript\n * export { init, buildMapperPrompt } from '../src/app/v3/map-codebase.runtime.js';\n * ```\n */\nexport function generateNamespaceEntry(\n file: RuntimeFileInfo,\n entryDir: string\n): string {\n const { sourcePath, exportedFunctions } = file;\n\n // Calculate relative path from entry dir to source file\n let relativePath = path.relative(entryDir, sourcePath);\n\n // Convert to .js extension for ESM imports\n relativePath = relativePath.replace(/\\.ts$/, '.js');\n\n // Ensure path starts with ./ or ../\n if (!relativePath.startsWith('.')) {\n relativePath = './' + relativePath;\n }\n\n // Generate re-export statement\n const exports = exportedFunctions.join(', ');\n return `/**\n * Namespace Entry Point - Generated by react-agentic\n * DO NOT EDIT - This file is auto-generated\n */\n\nexport { ${exports} } from '${relativePath}';\n`;\n}\n\n/**\n * Generate the CLI dispatcher for code-split bundles\n *\n * The dispatcher is a small CLI wrapper that loads modules on-demand\n * based on the namespace prefix in the function name.\n */\nexport function generateDispatcher(namespaces: string[]): string {\n const moduleList = namespaces.map(n => `'${n}'`).join(', ');\n\n return `#!/usr/bin/env node\n/**\n * V3 Runtime Dispatcher\n * Loads modules on-demand for fast startup\n * Generated by react-agentic (code-split bundler)\n *\n * Usage: node runtime.js <namespace_function> '<jsonArgs>'\n */\n\nconst [,, fnName, argsJson] = process.argv;\n\nif (!fnName) {\n console.error('Usage: node runtime.js <namespace_function> <jsonArgs>');\n console.error('Run with --list to see available namespaces');\n process.exit(1);\n}\n\nif (fnName === '--list') {\n const modules = [${moduleList}];\n console.log('Available namespaces:', modules.join(', '));\n process.exit(0);\n}\n\nconst underscoreIdx = fnName.indexOf('_');\nif (underscoreIdx === -1) {\n console.error('Invalid format. Use: namespace_functionName');\n console.error('Example: planPhase_init');\n process.exit(1);\n}\n\nconst namespace = fnName.slice(0, underscoreIdx);\nconst fn = fnName.slice(underscoreIdx + 1);\n\ntry {\n const mod = await import(\\`./$\\{namespace}.js\\`);\n if (typeof mod[fn] !== 'function') {\n console.error(\\`Function not found: $\\{fn} in $\\{namespace}\\`);\n console.error('Available functions:', Object.keys(mod).filter(k => typeof mod[k] === 'function').join(', '));\n process.exit(1);\n }\n\n const args = argsJson ? JSON.parse(argsJson) : {};\n const result = await mod[fn](args);\n console.log(JSON.stringify(result));\n} catch (e) {\n if (e.code === 'ERR_MODULE_NOT_FOUND') {\n console.error(\\`Unknown namespace: $\\{namespace}\\`);\n console.error('Available namespaces: ${namespaces.join(', ')}');\n } else {\n console.error(\\`Error: $\\{e.message}\\`);\n }\n process.exit(1);\n}\n`;\n}\n\n/**\n * Bundle all runtime files using code-split approach\n *\n * This approach:\n * 1. Generates a TypeScript entry file for each namespace\n * 2. Bundles each namespace separately with esbuild (in parallel)\n * 3. Generates a small dispatcher that loads modules on-demand\n * 4. Cleans up temporary files\n *\n * Benefits:\n * - Faster startup (only loads dispatcher, ~2KB)\n * - Modules loaded on-demand when function is called\n * - Each module independently tree-shaken\n */\nexport async function bundleCodeSplit(\n options: CodeSplitBundleOptions\n): Promise<CodeSplitBundleResult> {\n const { runtimeFiles, outputDir, entryDir = '.generated', minify = false } = options;\n const warnings: string[] = [];\n const moduleContents = new Map<string, string>();\n const allFunctions: string[] = [];\n\n if (runtimeFiles.length === 0) {\n return {\n dispatcherContent: '',\n moduleContents,\n functions: [],\n warnings: [],\n };\n }\n\n // Ensure entry directory exists\n const entryDirPath = path.resolve(entryDir);\n await mkdir(entryDirPath, { recursive: true });\n\n // Track entry files for cleanup\n const entryFiles: string[] = [];\n\n try {\n // Generate entry points for each namespace\n const bundlePromises = runtimeFiles.map(async (file) => {\n const { namespace, exportedFunctions } = file;\n\n // Track functions with namespace prefix\n for (const fn of exportedFunctions) {\n allFunctions.push(`${namespace}_${fn}`);\n }\n\n // Generate entry point content\n const entryContent = generateNamespaceEntry(file, entryDirPath);\n const entryPath = path.join(entryDirPath, `_${namespace}_entry.ts`);\n entryFiles.push(entryPath);\n\n // Write temporary entry file\n await writeFile(entryPath, entryContent, 'utf-8');\n\n // Bundle with esbuild\n const result = await esbuild.build({\n entryPoints: [entryPath],\n bundle: true,\n platform: 'node',\n format: 'esm',\n write: false,\n external: ['fs', 'fs/promises', 'path', 'node:fs', 'node:path'],\n target: 'node18',\n minify,\n keepNames: !minify,\n treeShaking: true,\n });\n\n // Collect warnings\n if (result.errors.length > 0) {\n for (const error of result.errors) {\n warnings.push(`esbuild error (${namespace}): ${error.text}`);\n }\n }\n if (result.warnings.length > 0) {\n for (const warning of result.warnings) {\n warnings.push(`esbuild warning (${namespace}): ${warning.text}`);\n }\n }\n\n const bundledCode = result.outputFiles?.[0]?.text || '';\n return { namespace, bundledCode };\n });\n\n // Wait for all bundles to complete (parallel)\n const bundleResults = await Promise.all(bundlePromises);\n\n // Collect results\n const namespaces: string[] = [];\n for (const { namespace, bundledCode } of bundleResults) {\n namespaces.push(namespace);\n moduleContents.set(namespace, bundledCode);\n }\n\n // Generate dispatcher\n const dispatcherContent = generateDispatcher(namespaces);\n\n return {\n dispatcherContent,\n moduleContents,\n functions: allFunctions,\n warnings,\n };\n } finally {\n // Cleanup temporary entry files\n for (const entryPath of entryFiles) {\n try {\n await rm(entryPath);\n } catch {\n // Ignore cleanup errors\n }\n }\n\n // Try to remove entry dir if empty\n try {\n await rm(entryDirPath, { recursive: false });\n } catch {\n // Ignore - directory not empty or doesn't exist\n }\n }\n}\n","/**\n * Runtime Transform Context and Types\n *\n * Transform context with runtime-specific tracking:\n * - Runtime variable declarations\n * - Runtime function usage\n * - Import paths for extraction\n */\n\nimport type { SourceFile, Node, JsxElement, JsxSelfClosingElement, JsxFragment } from 'ts-morph';\nimport type { RuntimeVarDeclNode, BlockNode } from '../../ir/index.js';\n\n// ============================================================================\n// Runtime Variable Info\n// ============================================================================\n\n/**\n * Information about a useRuntimeVar declaration\n */\nexport interface RuntimeVarInfo {\n /** Variable name (shell variable) */\n varName: string;\n /** TypeScript identifier name in source */\n identifierName: string;\n /** TypeScript type argument (if provided) */\n tsType?: string;\n /** Source location for error messages */\n location: {\n line: number;\n column: number;\n };\n}\n\n\n// ============================================================================\n// Runtime Function Info\n// ============================================================================\n\n/**\n * Information about a runtimeFn declaration\n */\nexport interface RuntimeFunctionInfo {\n /** Function name */\n fnName: string;\n /** Identifier name of the wrapper (e.g., 'Init' from 'const Init = runtimeFn(init)') */\n wrapperName: string;\n /** Source file path where function is defined */\n sourceFilePath: string;\n /** Whether the function is imported vs defined locally */\n isImported: boolean;\n /** Import path if imported (e.g., './runtime/init') */\n importPath?: string;\n}\n\n// ============================================================================\n// Local Component Info\n// ============================================================================\n\n/**\n * Information about a local component definition\n *\n * Tracks PascalCase function components defined in the same file\n * or imported from external files for build-time inlining.\n */\nexport interface LocalComponentInfo {\n /** Component name (PascalCase) */\n name: string;\n /** The AST node of the declaration (VariableDeclaration or FunctionDeclaration) */\n declaration: Node;\n /** Names of props (from destructured params or single param name) */\n propNames: string[];\n /** Cached JSX returned by the component (filled on first expansion) */\n jsx?: JsxElement | JsxSelfClosingElement | JsxFragment;\n /** Source file path where component is defined (for external components) */\n sourceFilePath?: string;\n /** Whether this component is imported from an external file */\n isExternal?: boolean;\n /** Import path if imported (e.g., './components/banner') */\n importPath?: string;\n}\n\n// ============================================================================\n// Runtime Transform Context\n// ============================================================================\n\n/**\n * Context for runtime transformers\n *\n * Tracks:\n * - RuntimeVar declarations (for type-safe references)\n * - RuntimeFn usage (for extraction to runtime.js)\n */\nexport interface RuntimeTransformContext {\n /** Source file being transformed */\n sourceFile: SourceFile | undefined;\n\n /** Namespace for runtime functions (derived from filename) */\n namespace: string;\n\n /** Visited paths for circular import detection */\n visitedPaths: Set<string>;\n\n /** Runtime variable declarations: identifier name -> info */\n runtimeVars: Map<string, RuntimeVarInfo>;\n\n /** Runtime function wrappers: wrapper name -> info */\n runtimeFunctions: Map<string, RuntimeFunctionInfo>;\n\n /** Runtime function imports: paths to extract from */\n runtimeImports: Set<string>;\n\n /** Create error with source location */\n createError: (message: string, node: Node) => Error;\n\n /** Track runtime function usage during transformation */\n usedRuntimeFunctions: Set<string>;\n\n /** Local component definitions: name -> info */\n localComponents: Map<string, LocalComponentInfo>;\n\n /** Component expansion stack for circular reference detection */\n componentExpansionStack: Set<string>;\n\n /** Current component props during expansion (for prop substitution) */\n componentProps: Map<string, unknown> | null;\n\n /** Current component children during expansion (for children substitution) */\n componentChildren: BlockNode[] | null;\n}\n\n// ============================================================================\n// Context Creation\n// ============================================================================\n\n/**\n * Convert kebab-case or snake_case to camelCase\n * @example 'plan-phase' -> 'planPhase'\n * @example 'test_v3' -> 'testV3'\n */\nfunction toCamelCase(str: string): string {\n return str.replace(/[-_]([a-z0-9])/gi, (_, char) => char.toUpperCase());\n}\n\n/**\n * Create a fresh runtime transform context\n *\n * @param sourceFile - Source file being transformed (optional)\n * @param namespace - Namespace for runtime functions (defaults to basename of sourceFile)\n */\nexport function createRuntimeContext(\n sourceFile?: SourceFile,\n namespace?: string\n): RuntimeTransformContext {\n // Derive namespace from source file if not provided\n let ns = namespace ?? '';\n if (!ns && sourceFile) {\n const filePath = sourceFile.getFilePath();\n const basename = filePath.split('/').pop()?.replace(/\\.tsx?$/, '') ?? '';\n ns = toCamelCase(basename);\n }\n\n return {\n sourceFile,\n namespace: ns,\n visitedPaths: new Set(),\n runtimeVars: new Map(),\n runtimeFunctions: new Map(),\n runtimeImports: new Set(),\n usedRuntimeFunctions: new Set(),\n localComponents: new Map(),\n componentExpansionStack: new Set(),\n componentProps: null,\n componentChildren: null,\n createError: (message: string, node: Node) => {\n const startLine = node.getStartLineNumber();\n const file = node.getSourceFile().getFilePath();\n return new Error(`${message}\\n at ${file}:${startLine}`);\n },\n };\n}\n\n// ============================================================================\n// Result Types\n// ============================================================================\n\n/**\n * Result of runtime transformation\n *\n * Contains the document node and metadata needed for dual emission.\n */\nexport interface RuntimeTransformResult {\n /** Transformed document */\n document: import('../../ir/index.js').DocumentNode;\n\n /** Runtime variable declarations (for markdown emission) */\n runtimeVars: RuntimeVarDeclNode[];\n\n /** Runtime function names used (for runtime.js extraction) */\n runtimeFunctions: string[];\n\n /** Import paths to extract functions from */\n runtimeImportPaths: string[];\n}\n","/**\n * Runtime Variable Transformer\n *\n * Extracts useRuntimeVar<T>('NAME') declarations from source files.\n * Populates the RuntimeTransformContext with variable info for reference resolution.\n */\n\nimport { Node, SourceFile } from 'ts-morph';\nimport type { RuntimeVarInfo, RuntimeTransformContext } from './runtime-types.js';\nimport type { RuntimeVarDeclNode, RuntimeVarRefNode } from '../../ir/index.js';\n\n// ============================================================================\n// Extraction\n// ============================================================================\n\n/**\n * Extract all useRuntimeVar declarations from a source file\n *\n * Searches for patterns like:\n * - const ctx = useRuntimeVar<Type>('NAME')\n * - const { a, b } = useRuntimeVar<Type>('NAME') (not supported, error)\n *\n * @param sourceFile - Source file to scan\n * @param ctx - Transform context to populate\n */\nexport function extractRuntimeVarDeclarations(\n sourceFile: SourceFile,\n ctx: RuntimeTransformContext\n): void {\n // Find all variable declarations\n sourceFile.forEachDescendant((node) => {\n if (!Node.isVariableDeclaration(node)) return;\n\n const init = node.getInitializer();\n if (!init || !Node.isCallExpression(init)) return;\n\n // Check if it's a useRuntimeVar call\n const expr = init.getExpression();\n if (!Node.isIdentifier(expr) || expr.getText() !== 'useRuntimeVar') return;\n\n // Get the variable name argument (first arg)\n const args = init.getArguments();\n if (args.length < 1) {\n throw ctx.createError(\n 'useRuntimeVar requires a variable name argument',\n init\n );\n }\n\n const nameArg = args[0];\n if (!Node.isStringLiteral(nameArg)) {\n throw ctx.createError(\n 'useRuntimeVar argument must be a string literal',\n nameArg\n );\n }\n\n const varName = nameArg.getLiteralValue();\n const identifierName = node.getName();\n\n // Check for destructuring (not supported)\n if (identifierName.includes('{') || identifierName.includes('[')) {\n throw ctx.createError(\n 'useRuntimeVar does not support destructuring. Use: const ctx = useRuntimeVar<T>(\"NAME\")',\n node\n );\n }\n\n // Extract type argument if present\n const typeArgs = init.getTypeArguments();\n const tsType = typeArgs.length > 0 ? typeArgs[0].getText() : undefined;\n\n // Create info entry\n const info: RuntimeVarInfo = {\n varName,\n identifierName,\n tsType,\n location: {\n line: node.getStartLineNumber(),\n column: node.getStart() - node.getStartLineNumber(),\n },\n };\n\n // Check for duplicate identifier\n if (ctx.runtimeVars.has(identifierName)) {\n throw ctx.createError(\n `Duplicate runtime variable identifier: ${identifierName}`,\n node\n );\n }\n\n ctx.runtimeVars.set(identifierName, info);\n });\n}\n\n/**\n * Get RuntimeVarDeclNode array from context\n *\n * Used to include declarations in the V3Document.\n */\nexport function getRuntimeVarDecls(ctx: RuntimeTransformContext): RuntimeVarDeclNode[] {\n return Array.from(ctx.runtimeVars.values()).map(info => ({\n kind: 'runtimeVarDecl' as const,\n varName: info.varName,\n tsType: info.tsType,\n }));\n}\n\n// ============================================================================\n// Reference Resolution\n// ============================================================================\n\n/**\n * Resolve an identifier to its RuntimeVar info\n *\n * @param identifierName - The identifier text (e.g., 'ctx')\n * @param ctx - Transform context with declarations\n * @returns RuntimeVarInfo if found, undefined otherwise\n */\nexport function resolveRuntimeVar(\n identifierName: string,\n ctx: RuntimeTransformContext\n): RuntimeVarInfo | undefined {\n return ctx.runtimeVars.get(identifierName);\n}\n\n/**\n * Parse a property access expression to RuntimeVarRefNode\n *\n * Handles expressions like:\n * - ctx -> { varName: 'CTX', path: [] }\n * - ctx.error -> { varName: 'CTX', path: ['error'] }\n * - ctx.user.name -> { varName: 'CTX', path: ['user', 'name'] }\n *\n * @param node - Property access or identifier node\n * @param ctx - Transform context\n * @returns RuntimeVarRefNode if valid, null if not a RuntimeVar reference\n */\nexport function parseRuntimeVarRef(\n node: Node,\n ctx: RuntimeTransformContext\n): RuntimeVarRefNode | null {\n // Build path by walking property access chain\n const path: string[] = [];\n let current: Node = node;\n\n // Walk up the property access chain\n while (Node.isPropertyAccessExpression(current)) {\n const propName = current.getName();\n path.unshift(propName);\n current = current.getExpression();\n }\n\n // Current should now be the root identifier\n if (!Node.isIdentifier(current)) {\n return null;\n }\n\n const identName = current.getText();\n const info = ctx.runtimeVars.get(identName);\n\n if (!info) {\n return null;\n }\n\n return {\n kind: 'runtimeVarRef',\n varName: info.varName,\n path,\n };\n}\n\n/**\n * Check if a node is a RuntimeVar reference\n */\nexport function isRuntimeVarReference(\n node: Node,\n ctx: RuntimeTransformContext\n): boolean {\n return parseRuntimeVarRef(node, ctx) !== null;\n}\n","/**\n * Runtime Function Transformer\n *\n * Extracts runtimeFn(fn) declarations from source files.\n * Tracks wrapper names and import paths for runtime.js extraction.\n */\n\nimport { Node, SourceFile } from 'ts-morph';\nimport type { RuntimeFunctionInfo, RuntimeTransformContext } from './runtime-types.js';\n\n// ============================================================================\n// Extraction\n// ============================================================================\n\n/**\n * Extract all runtimeFn declarations from a source file\n *\n * Searches for patterns like:\n * - const Init = runtimeFn(initFunction)\n * - const GetContext = runtimeFn(getContext)\n *\n * Also tracks imports of the wrapped functions for extraction.\n *\n * @param sourceFile - Source file to scan\n * @param ctx - Transform context to populate\n */\nexport function extractRuntimeFnDeclarations(\n sourceFile: SourceFile,\n ctx: RuntimeTransformContext\n): void {\n // First, build a map of imports: local name -> import path\n const importMap = new Map<string, { path: string; isDefault: boolean }>();\n\n for (const importDecl of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = importDecl.getModuleSpecifierValue();\n\n // Default import\n const defaultImport = importDecl.getDefaultImport();\n if (defaultImport) {\n importMap.set(defaultImport.getText(), {\n path: moduleSpecifier,\n isDefault: true,\n });\n }\n\n // Named imports\n for (const namedImport of importDecl.getNamedImports()) {\n const localName = namedImport.getAliasNode()?.getText() ?? namedImport.getName();\n importMap.set(localName, {\n path: moduleSpecifier,\n isDefault: false,\n });\n }\n }\n\n // Find all runtimeFn wrapper declarations\n sourceFile.forEachDescendant((node) => {\n if (!Node.isVariableDeclaration(node)) return;\n\n const init = node.getInitializer();\n if (!init || !Node.isCallExpression(init)) return;\n\n // Check if it's a runtimeFn call\n const expr = init.getExpression();\n if (!Node.isIdentifier(expr) || expr.getText() !== 'runtimeFn') return;\n\n // Get the wrapped function (first arg)\n const args = init.getArguments();\n if (args.length < 1) {\n throw ctx.createError(\n 'runtimeFn requires a function argument',\n init\n );\n }\n\n const fnArg = args[0];\n if (!Node.isIdentifier(fnArg)) {\n throw ctx.createError(\n 'runtimeFn argument must be a function identifier',\n fnArg\n );\n }\n\n const fnName = fnArg.getText();\n const wrapperName = node.getName();\n\n // Check if function is imported\n const importInfo = importMap.get(fnName);\n\n const info: RuntimeFunctionInfo = {\n fnName,\n wrapperName,\n sourceFilePath: sourceFile.getFilePath(),\n isImported: !!importInfo,\n importPath: importInfo?.path,\n };\n\n // Check for duplicate wrapper name\n if (ctx.runtimeFunctions.has(wrapperName)) {\n throw ctx.createError(\n `Duplicate runtime function wrapper: ${wrapperName}`,\n node\n );\n }\n\n ctx.runtimeFunctions.set(wrapperName, info);\n\n // Track import path for extraction\n if (importInfo) {\n ctx.runtimeImports.add(importInfo.path);\n }\n });\n}\n\n/**\n * Get runtime function names from context\n *\n * Returns the list of function names (not wrapper names) that need\n * to be extracted to runtime.js.\n */\nexport function getRuntimeFunctionNames(ctx: RuntimeTransformContext): string[] {\n return Array.from(ctx.usedRuntimeFunctions);\n}\n\n/**\n * Get runtime import paths from context\n *\n * Returns paths that need to be parsed for function extraction.\n */\nexport function getRuntimeImportPaths(ctx: RuntimeTransformContext): string[] {\n return Array.from(ctx.runtimeImports);\n}\n\n// ============================================================================\n// Resolution\n// ============================================================================\n\n/**\n * Resolve a wrapper name to its runtime function info\n *\n * @param wrapperName - The wrapper identifier (e.g., 'Init')\n * @param ctx - Transform context\n * @returns RuntimeFunctionInfo if found\n */\nexport function resolveRuntimeFn(\n wrapperName: string,\n ctx: RuntimeTransformContext\n): RuntimeFunctionInfo | undefined {\n return ctx.runtimeFunctions.get(wrapperName);\n}\n\n/**\n * Check if an identifier is a RuntimeFn wrapper\n */\nexport function isRuntimeFnWrapper(\n identifierName: string,\n ctx: RuntimeTransformContext\n): boolean {\n return ctx.runtimeFunctions.has(identifierName);\n}\n\n/**\n * Mark a runtime function as used\n *\n * Called when transforming a .Call invocation.\n * Only used functions get extracted to runtime.js.\n */\nexport function markRuntimeFnUsed(\n wrapperName: string,\n ctx: RuntimeTransformContext\n): void {\n const info = ctx.runtimeFunctions.get(wrapperName);\n if (info) {\n ctx.usedRuntimeFunctions.add(info.fnName);\n }\n}\n","/**\n * Runtime Central Transform Dispatcher\n *\n * Routes JSX elements to appropriate runtime transformers.\n * Delegates unchanged elements (headings, lists, etc.) to shared transformers.\n */\n\nimport { Node, JsxElement, JsxSelfClosingElement, JsxFragment } from 'ts-morph';\nimport type { BlockNode, DocumentNode, BaseBlockNode } from '../../ir/index.js';\nimport type { RuntimeTransformContext } from './runtime-types.js';\nimport { getElementName, extractText, extractMarkdownText, getAttributeValue, camelToKebab, getStringArrayAttribute, isCustomComponent, processIfElseSiblings } from './runtime-utils.js';\nimport type { XmlBlockNode } from '../../ir/nodes.js';\n\n// Runtime transformers\nimport { transformRuntimeIf, transformRuntimeElse, transformRuntimeLoop, transformBreak, transformReturn } from './runtime-control.js';\nimport { transformRuntimeCall, isRuntimeFnCall } from './runtime-call.js';\nimport { transformAskUser } from './runtime-ask-user.js';\nimport { transformRuntimeSpawnAgent } from './runtime-spawner.js';\nimport { transformLocalComponent } from './runtime-component.js';\n\n// Runtime inline transformer for RuntimeVar interpolation\nimport { transformRuntimeInlineChildren } from './runtime-inline.js';\n\n// Shared element transformers\nimport { transformList, transformBlockquote, transformCodeBlock } from './html.js';\nimport { transformTable, transformXmlSection, transformXmlWrapper } from './semantic.js';\nimport { transformXmlBlock, transformMarkdown } from './markdown.js';\nimport type { TransformContext } from './types.js';\nimport type { GroupNode } from '../../ir/nodes.js';\n\n// ============================================================================\n// Fragment Handling\n// ============================================================================\n\n/**\n * Transform children of a JSX Fragment (<>...</>)\n * Handles If/Else sibling pairing via dedicated helper\n */\nfunction transformFragmentChildren(\n fragment: JsxFragment,\n ctx: RuntimeTransformContext\n): BlockNode[] {\n return transformChildArray(fragment.getJsxChildren(), ctx);\n}\n\n/**\n * Transform an array of JSX children to BlockNodes, handling If/Else sibling pairs\n */\nfunction transformChildArray(\n jsxChildren: Node[],\n ctx: RuntimeTransformContext\n): BlockNode[] {\n const blocks: BlockNode[] = [];\n let i = 0;\n\n while (i < jsxChildren.length) {\n const child = jsxChildren[i];\n\n // Skip whitespace-only text\n if (Node.isJsxText(child)) {\n const text = extractMarkdownText(child);\n if (!text) {\n i++;\n continue;\n }\n // Multi-line content -> raw markdown, single-line -> paragraph\n if (text.includes('\\n')) {\n blocks.push({ kind: 'raw', content: text });\n } else {\n blocks.push({ kind: 'paragraph', children: [{ kind: 'text', value: text }] });\n }\n i++;\n continue;\n }\n\n if (Node.isJsxElement(child) || Node.isJsxSelfClosingElement(child)) {\n const childName = getElementName(child);\n\n // Handle If with potential Else sibling\n if (childName === 'If' || childName === 'V3If') {\n const ifNode = transformRuntimeIf(child, ctx, transformRuntimeBlockChildrenWrapper);\n blocks.push(ifNode);\n\n // Check for Else sibling using helper\n const result = processIfElseSiblings(jsxChildren, i, (elseNode) => {\n const elseBlockNode = transformRuntimeElse(elseNode as JsxElement | JsxSelfClosingElement, ctx, transformRuntimeBlockChildrenWrapper);\n blocks.push(elseBlockNode);\n });\n if (result.hasElse) {\n i = result.nextIndex;\n }\n } else {\n const block = transformRuntimeElement(child, ctx);\n if (block) blocks.push(block);\n }\n } else if (Node.isJsxExpression(child)) {\n const block = transformToRuntimeBlock(child, ctx);\n if (block) blocks.push(block);\n }\n\n i++;\n }\n\n return blocks;\n}\n\n/**\n * Wrapper to match the expected signature for control transformer callbacks\n */\nfunction transformRuntimeBlockChildrenWrapper(\n parent: JsxElement,\n ctx: RuntimeTransformContext\n): BlockNode[] {\n return transformChildArray(parent.getJsxChildren(), ctx);\n}\n\n// ============================================================================\n// Context Adaptation\n// ============================================================================\n\n/**\n * Adapt V3 context to V1 context for shared transformers\n *\n * V1 transformers expect the v1 TransformContext, so we create\n * a compatible adapter that maps V3 fields.\n */\nfunction adaptToSharedContext(runtimeCtx: RuntimeTransformContext): TransformContext {\n return {\n sourceFile: runtimeCtx.sourceFile,\n visitedPaths: runtimeCtx.visitedPaths,\n variables: new Map(), // V3 uses runtimeVars, not variables\n outputs: new Map(),\n stateRefs: new Map(),\n renderPropsContext: undefined,\n createError: runtimeCtx.createError,\n };\n}\n\n// ============================================================================\n// Runtime Div Transformer\n// ============================================================================\n\n/**\n * Transform div element using V3 transformers for children\n *\n * - div without name attribute: creates GroupNode (tight spacing via '\\n' not '\\n\\n')\n * - div with name attribute: creates XmlBlockNode with wrapper tags\n */\nfunction transformRuntimeDiv(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): XmlBlockNode | GroupNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Get name attribute (optional - if missing, create invisible group)\n const nameAttr = getAttributeValue(openingElement, 'name');\n\n // Transform children using V3 transformers\n const children = Node.isJsxElement(node)\n ? transformRuntimeMixedChildren(node.getJsxChildren(), ctx)\n : [];\n\n // No name attribute: invisible grouping container with tight spacing\n if (!nameAttr) {\n return {\n kind: 'group',\n children,\n } as GroupNode;\n }\n\n // Has name attribute: XML block with wrapper tags\n // Validate XML name\n if (!isValidXmlName(nameAttr)) {\n throw ctx.createError(\n `Invalid XML tag name '${nameAttr}' - must start with letter/underscore, contain only letters, digits, underscores, hyphens, or periods, and not start with 'xml'`,\n node\n );\n }\n\n // Extract other attributes (excluding 'name' which becomes the tag)\n const attributes: Record<string, string> = {};\n for (const attr of openingElement.getAttributes()) {\n if (Node.isJsxAttribute(attr)) {\n const attrName = attr.getNameNode().getText();\n if (attrName !== 'name') {\n const value = getAttributeValue(openingElement, attrName);\n if (value !== undefined) {\n attributes[attrName] = value;\n }\n }\n }\n }\n\n return {\n kind: 'xmlBlock',\n name: nameAttr,\n attributes: Object.keys(attributes).length > 0 ? attributes : undefined,\n children: children as BaseBlockNode[],\n };\n}\n\n/**\n * Inline element set for V3 mixed content handling\n */\nconst RUNTIME_INLINE_ELEMENTS = new Set([\n 'a', 'b', 'i', 'strong', 'em', 'code', 'span', 'br',\n]);\n\n/**\n * Transform mixed children (inline + block elements) using V3 transformers\n * All content is accumulated and output as a single raw block to preserve exact structure\n * Block elements are transformed separately using V3 dispatch\n */\nfunction transformRuntimeMixedChildren(\n jsxChildren: Node[],\n ctx: RuntimeTransformContext\n): BlockNode[] {\n const blocks: BlockNode[] = [];\n let contentAccumulator: string[] = [];\n\n // Flush accumulated content as raw block\n const flushContent = () => {\n if (contentAccumulator.length === 0) return;\n const combined = contentAccumulator.join('');\n if (combined.trim()) {\n blocks.push({ kind: 'raw', content: combined });\n }\n contentAccumulator = [];\n };\n\n // Use index-based iteration to support If/Else sibling lookahead\n let i = 0;\n while (i < jsxChildren.length) {\n const child = jsxChildren[i];\n\n // Handle JSX text - preserve exact structure\n if (Node.isJsxText(child)) {\n const text = extractMarkdownText(child);\n if (text) {\n contentAccumulator.push(text);\n } else {\n // If text is whitespace-only but contains newlines, and we have accumulated content,\n // preserve newlines to separate lines (e.g., between two JSX expressions)\n // Cap at 2 newlines (one blank line) to avoid excessive whitespace\n // BUT: don't add trailing whitespace if remaining children are only whitespace\n // (this avoids adding formatting newlines between last content and closing tag)\n const rawText = child.getFullText();\n if (rawText.includes('\\n') && contentAccumulator.length > 0) {\n // Check if there's more non-whitespace content coming\n const hasMoreContent = jsxChildren.slice(i + 1).some(c => {\n if (Node.isJsxText(c)) {\n return !!extractMarkdownText(c);\n }\n // Any non-text child (expressions, elements) counts as content\n return true;\n });\n if (hasMoreContent) {\n const newlineCount = (rawText.match(/\\n/g) || []).length;\n contentAccumulator.push('\\n'.repeat(Math.min(newlineCount, 2)));\n }\n }\n }\n i++;\n continue;\n }\n\n // Handle JSX elements\n if (Node.isJsxElement(child) || Node.isJsxSelfClosingElement(child)) {\n const name = getElementName(child);\n\n if (RUNTIME_INLINE_ELEMENTS.has(name)) {\n // Inline elements - extract text and accumulate with markdown formatting\n const text = extractText(child);\n if (text) {\n if (name === 'b' || name === 'strong') {\n contentAccumulator.push(`**${text}**`);\n } else if (name === 'i' || name === 'em') {\n contentAccumulator.push(`*${text}*`);\n } else if (name === 'code') {\n contentAccumulator.push(`\\`${text}\\``);\n } else {\n contentAccumulator.push(text);\n }\n }\n } else if (name === 'If' || name === 'V3If') {\n // Handle If with Else sibling lookahead\n flushContent();\n const ifNode = transformRuntimeIf(child, ctx, transformRuntimeBlockChildren);\n blocks.push(ifNode);\n\n // Check for Else sibling using helper\n const result = processIfElseSiblings(jsxChildren, i, (elseNode) => {\n const elseBlockNode = transformRuntimeElse(elseNode as JsxElement | JsxSelfClosingElement, ctx, transformRuntimeBlockChildren);\n blocks.push(elseBlockNode);\n });\n if (result.hasElse) {\n i = result.nextIndex;\n }\n } else {\n // Block element - flush accumulated content first\n flushContent();\n // Transform block element via V3 dispatch\n const block = transformRuntimeElement(child, ctx);\n if (block) blocks.push(block);\n }\n i++;\n continue;\n }\n\n // Handle JSX expressions\n if (Node.isJsxExpression(child)) {\n const expr = child.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n // String literal - add value directly (handles escapes like {'>'})\n const value = expr.getLiteralValue();\n if (value) {\n contentAccumulator.push(value);\n }\n } else if (expr && Node.isNoSubstitutionTemplateLiteral(expr)) {\n // Template literal without interpolation - add value directly\n const value = expr.getLiteralValue();\n if (value) {\n contentAccumulator.push(value);\n }\n } else if (expr && Node.isTemplateExpression(expr)) {\n // Template literal with interpolation - substitute props if in component context\n const parts: string[] = [];\n parts.push(expr.getHead().getLiteralText());\n for (const span of expr.getTemplateSpans()) {\n const spanExpr = span.getExpression();\n const spanText = spanExpr.getText();\n\n // Check for prop substitution when in component context\n if (ctx.componentProps) {\n // Handle props.xxx pattern\n if (Node.isPropertyAccessExpression(spanExpr)) {\n const obj = spanExpr.getExpression();\n const propName = spanExpr.getName();\n if (Node.isIdentifier(obj) && obj.getText() === 'props' && ctx.componentProps.has(propName)) {\n const propValue = ctx.componentProps.get(propName);\n parts.push(propValue !== undefined && propValue !== null ? String(propValue) : '');\n parts.push(span.getLiteral().getLiteralText());\n continue;\n }\n }\n // Handle direct identifier (destructured props)\n if (Node.isIdentifier(spanExpr) && ctx.componentProps.has(spanText)) {\n const propValue = ctx.componentProps.get(spanText);\n parts.push(propValue !== undefined && propValue !== null ? String(propValue) : '');\n parts.push(span.getLiteral().getLiteralText());\n continue;\n }\n }\n\n // Not a prop reference - preserve as ${...}\n parts.push(`\\${${spanText}}`);\n parts.push(span.getLiteral().getLiteralText());\n }\n const value = parts.join('');\n if (value) {\n contentAccumulator.push(value);\n }\n } else if (expr) {\n const exprText = expr.getText();\n\n // Check for children prop substitution: {children} or {props.children}\n if ((exprText === 'children' || exprText === 'props.children') && ctx.componentChildren) {\n // Flush accumulated content first\n flushContent();\n // Insert the component children\n blocks.push(...ctx.componentChildren);\n } else if (ctx.componentProps) {\n // Component prop substitution - check both patterns\n let propValue: unknown = undefined;\n let matched = false;\n\n // Check props.xxx pattern\n if (Node.isPropertyAccessExpression(expr)) {\n const obj = expr.getExpression();\n const propName = expr.getName();\n if (Node.isIdentifier(obj) && obj.getText() === 'props' && ctx.componentProps.has(propName)) {\n propValue = ctx.componentProps.get(propName);\n matched = true;\n }\n }\n // Check direct identifier (destructured props)\n else if (Node.isIdentifier(expr) && ctx.componentProps.has(exprText)) {\n propValue = ctx.componentProps.get(exprText);\n matched = true;\n }\n\n if (matched) {\n if (propValue !== undefined && propValue !== null) {\n contentAccumulator.push(String(propValue));\n }\n } else {\n // Not a prop reference - add placeholder syntax\n contentAccumulator.push(`{${exprText}}`);\n }\n } else {\n // Not in component context - add placeholder syntax\n contentAccumulator.push(`{${exprText}}`);\n }\n }\n }\n\n i++;\n }\n\n // Flush any remaining content\n flushContent();\n\n return blocks;\n}\n\n// ============================================================================\n// Runtime XmlBlock Transformer\n// ============================================================================\n\n/**\n * Validate that a string is a valid XML tag name\n */\nconst XML_NAME_REGEX = /^[a-zA-Z_][a-zA-Z0-9_.\\-]*$/;\n\nfunction isValidXmlName(name: string): boolean {\n if (!name) return false;\n if (!XML_NAME_REGEX.test(name)) return false;\n if (name.toLowerCase().startsWith('xml')) return false;\n return true;\n}\n\n/**\n * Transform XmlBlock using V3 transformers for children\n *\n * This is a V3-specific version that uses transformRuntimeBlockChildren\n * instead of v1's transformBlockChildren, so nested V3 components\n * like Init.Call are properly recognized.\n */\nfunction transformRuntimeXmlBlock(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): XmlBlockNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Get required name attribute\n const nameAttr = getAttributeValue(openingElement, 'name');\n if (!nameAttr) {\n throw ctx.createError('XmlBlock requires name prop', node);\n }\n\n // Validate XML name\n if (!isValidXmlName(nameAttr)) {\n throw ctx.createError(\n `Invalid XML tag name '${nameAttr}' - must start with letter/underscore, contain only letters, digits, underscores, hyphens, or periods, and not start with 'xml'`,\n node\n );\n }\n\n // Transform children using mixed content handler (handles inline text + expressions properly)\n const children = Node.isJsxElement(node)\n ? transformRuntimeMixedChildren(node.getJsxChildren(), ctx)\n : [];\n\n return {\n kind: 'xmlBlock',\n name: nameAttr,\n children: children as any[], // Cast to BlockNode[] for IR compatibility\n };\n}\n\n// ============================================================================\n// Runtime Indent Transformer\n// ============================================================================\n\n/**\n * Transform Indent component\n *\n * Indents all children content by specified number of spaces.\n */\nfunction transformRuntimeIndent(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): BlockNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Get optional spaces attribute (default: 2)\n const spacesAttr = getAttributeValue(openingElement, 'spaces');\n const spaces = spacesAttr ? parseInt(spacesAttr, 10) : 2;\n\n if (isNaN(spaces) || spaces < 0) {\n throw ctx.createError('Indent spaces prop must be a non-negative number', node);\n }\n\n // Transform children using V3 transformers\n const children = Node.isJsxElement(node)\n ? transformRuntimeBlockChildren(node, ctx)\n : [];\n\n return {\n kind: 'indent',\n spaces,\n children: children as any[],\n };\n}\n\n// ============================================================================\n// Runtime Code Block Transformer\n// ============================================================================\n\n/**\n * Transform code block (pre element) with component prop substitution\n *\n * Uses V3 context to support props.xxx substitution in template literals.\n */\nfunction transformRuntimeCodeBlock(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): BlockNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Get optional language attribute\n const language = getAttributeValue(openingElement, 'lang') ||\n getAttributeValue(openingElement, 'language');\n\n if (Node.isJsxSelfClosingElement(node)) {\n return { kind: 'codeBlock', language, content: '' };\n }\n\n // Extract code content with prop substitution\n const parts: string[] = [];\n\n for (const child of node.getJsxChildren()) {\n if (Node.isJsxText(child)) {\n // Get raw text preserving whitespace\n const sourceFile = child.getSourceFile();\n const text = sourceFile.getFullText().slice(child.getStart(), child.getEnd());\n parts.push(text);\n } else if (Node.isJsxExpression(child)) {\n const expr = child.getExpression();\n if (expr) {\n if (Node.isStringLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (Node.isTemplateExpression(expr)) {\n // Template literal with interpolation - substitute props\n const templateParts: string[] = [];\n templateParts.push(expr.getHead().getLiteralText());\n\n for (const span of expr.getTemplateSpans()) {\n const spanExpr = span.getExpression();\n const spanText = spanExpr.getText();\n\n // Check for prop substitution when in component context\n if (ctx.componentProps) {\n // Handle props.xxx pattern\n if (Node.isPropertyAccessExpression(spanExpr)) {\n const obj = spanExpr.getExpression();\n const propName = spanExpr.getName();\n if (Node.isIdentifier(obj) && obj.getText() === 'props' && ctx.componentProps.has(propName)) {\n const propValue = ctx.componentProps.get(propName);\n templateParts.push(propValue !== undefined && propValue !== null ? String(propValue) : '');\n templateParts.push(span.getLiteral().getLiteralText());\n continue;\n }\n }\n // Handle direct identifier (destructured props)\n if (Node.isIdentifier(spanExpr) && ctx.componentProps.has(spanText)) {\n const propValue = ctx.componentProps.get(spanText);\n templateParts.push(propValue !== undefined && propValue !== null ? String(propValue) : '');\n templateParts.push(span.getLiteral().getLiteralText());\n continue;\n }\n }\n\n // Not a prop reference - preserve as ${...}\n templateParts.push(`\\${${spanText}}`);\n templateParts.push(span.getLiteral().getLiteralText());\n }\n\n parts.push(templateParts.join(''));\n } else {\n // Other expression - render as is\n parts.push(expr.getText());\n }\n }\n }\n }\n\n // Process the combined content\n let content = parts.join('');\n\n // Remove leading/trailing newlines that come from JSX formatting\n content = content.replace(/^\\n/, '').replace(/\\n$/, '');\n\n // Dedent the content (remove common leading whitespace)\n const lines = content.split('\\n');\n if (lines.length > 1) {\n let minIndent = Infinity;\n for (const line of lines) {\n if (line.trim().length > 0) {\n const leadingSpaces = line.match(/^[ \\t]*/)?.[0].length ?? 0;\n minIndent = Math.min(minIndent, leadingSpaces);\n }\n }\n if (minIndent !== Infinity && minIndent > 0) {\n content = lines.map(line => line.slice(minIndent)).join('\\n');\n }\n }\n\n return { kind: 'codeBlock', language, content: content };\n}\n\n// ============================================================================\n// Main Dispatch\n// ============================================================================\n\n/**\n * Transform a JSX node to BlockNode\n */\nexport function transformToRuntimeBlock(\n node: Node,\n ctx: RuntimeTransformContext\n): BlockNode | null {\n // Whitespace-only text - skip\n if (Node.isJsxText(node)) {\n const text = extractMarkdownText(node);\n if (!text) return null;\n // Multi-line content -> raw markdown, single-line -> paragraph\n if (text.includes('\\n')) {\n return { kind: 'raw', content: text };\n }\n return { kind: 'paragraph', children: [{ kind: 'text', value: text }] };\n }\n\n if (Node.isJsxElement(node) || Node.isJsxSelfClosingElement(node)) {\n return transformRuntimeElement(node, ctx);\n }\n\n // JSX expressions - handle render functions and interpolation\n if (Node.isJsxExpression(node)) {\n const expr = node.getExpression();\n if (expr) {\n // Check for render function pattern: {() => { return (<>...</>) }}\n if (Node.isArrowFunction(expr)) {\n const body = expr.getBody();\n\n // Block body: { return (...) }\n if (Node.isBlock(body)) {\n // Use object holder for TypeScript control flow\n const holder: { result: BlockNode[] | null } = { result: null };\n\n body.forEachDescendant((descendant, traversal) => {\n if (Node.isReturnStatement(descendant)) {\n const returnExpr = descendant.getExpression();\n if (returnExpr) {\n // Unwrap parentheses\n let inner = returnExpr;\n while (Node.isParenthesizedExpression(inner)) {\n inner = inner.getExpression();\n }\n\n // Fragment: <> ... </>\n if (Node.isJsxFragment(inner)) {\n holder.result = transformFragmentChildren(inner, ctx);\n traversal.stop();\n } else if (Node.isJsxElement(inner) || Node.isJsxSelfClosingElement(inner)) {\n const block = transformRuntimeElement(inner, ctx);\n if (block) holder.result = [block];\n traversal.stop();\n }\n }\n }\n });\n\n if (holder.result && holder.result.length > 0) {\n // Return first block if single, otherwise wrap in a group\n if (holder.result.length === 1) {\n return holder.result[0];\n }\n // Multiple blocks - return as group (this is a simplified approach)\n return { kind: 'group', children: holder.result } as BlockNode;\n }\n }\n\n // Expression body: () => <div>...</div>\n let inner = body;\n while (Node.isParenthesizedExpression(inner)) {\n inner = (inner as any).getExpression();\n }\n\n if (Node.isJsxFragment(inner)) {\n const blocks = transformFragmentChildren(inner, ctx);\n if (blocks.length === 1) return blocks[0];\n return { kind: 'group', children: blocks } as BlockNode;\n }\n\n if (Node.isJsxElement(inner) || Node.isJsxSelfClosingElement(inner)) {\n return transformRuntimeElement(inner, ctx);\n }\n }\n\n // Check if it's a string literal - extract the value directly\n if (Node.isStringLiteral(expr)) {\n const value = expr.getLiteralValue();\n if (value) {\n // Return as raw node - outputs content directly without newlines\n return { kind: 'raw', content: value };\n }\n return null;\n }\n\n // Not a render function or string literal - treat as text with the expression\n // TODO: Handle RuntimeVar interpolation properly\n return { kind: 'paragraph', children: [{ kind: 'text', value: `{${expr.getText()}}` }] };\n }\n }\n\n return null;\n}\n\n/**\n * Route element transformation based on tag name\n */\nfunction transformRuntimeElement(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): BlockNode | null {\n const name = getElementName(node);\n\n // ============================================================\n // Runtime-Specific Components\n // ============================================================\n\n // If component (condition-based)\n if (name === 'If' || name === 'V3If') {\n return transformRuntimeIf(node, ctx, transformRuntimeBlockChildren);\n }\n\n // Else component\n if (name === 'Else' || name === 'V3Else') {\n // Standalone Else is error (must follow If as sibling)\n throw ctx.createError('<Else> must follow <If> as sibling', node);\n }\n\n // Loop component (bounded)\n if (name === 'Loop' || name === 'V3Loop') {\n return transformRuntimeLoop(node, ctx, transformRuntimeBlockChildren);\n }\n\n // Break component\n if (name === 'Break') {\n return transformBreak(node, ctx);\n }\n\n // Return component\n if (name === 'Return') {\n return transformReturn(node, ctx);\n }\n\n // AskUser component\n if (name === 'AskUser') {\n return transformAskUser(node, ctx);\n }\n\n // RuntimeFn.Call (e.g., <Init.Call ... />)\n if (isRuntimeFnCall(node, ctx)) {\n return transformRuntimeCall(node, ctx);\n }\n\n // SpawnAgent (with output capture)\n if (name === 'SpawnAgent') {\n return transformRuntimeSpawnAgent(node, ctx);\n }\n\n // ============================================================\n // Delegate to Shared Transformers (shared elements)\n // ============================================================\n\n const sharedCtx = adaptToSharedContext(ctx);\n\n // Headings - use V3 inline transformer for RuntimeVar interpolation\n const headingMatch = name.match(/^h([1-6])$/);\n if (headingMatch) {\n const level = parseInt(headingMatch[1], 10) as 1 | 2 | 3 | 4 | 5 | 6;\n const children = Node.isJsxElement(node)\n ? transformRuntimeInlineChildren(node, ctx)\n : [];\n return { kind: 'heading', level, children };\n }\n\n // Paragraph - use V3 inline transformer for RuntimeVar interpolation\n if (name === 'p') {\n const children = Node.isJsxElement(node)\n ? transformRuntimeInlineChildren(node, ctx)\n : [];\n return { kind: 'paragraph', children };\n }\n\n // Thematic break\n if (name === 'hr') {\n return { kind: 'thematicBreak' };\n }\n\n // Lists\n if (name === 'ul') {\n return transformList(node, false, sharedCtx) as BlockNode;\n }\n if (name === 'ol') {\n return transformList(node, true, sharedCtx) as BlockNode;\n }\n\n // Blockquote\n if (name === 'blockquote') {\n return transformBlockquote(node, sharedCtx) as BlockNode;\n }\n\n // Code block - use v3 transformer for component prop support\n if (name === 'pre') {\n return transformRuntimeCodeBlock(node, ctx);\n }\n\n // Div (XML block or group) - use V3 transformer for proper children handling\n if (name === 'div') {\n return transformRuntimeDiv(node, ctx) as BlockNode;\n }\n\n // XmlBlock component - handle directly to use V3 transformers for children\n if (name === 'XmlBlock') {\n return transformRuntimeXmlBlock(node, ctx);\n }\n\n // ExecutionContext component\n if (name === 'ExecutionContext') {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n const paths = getStringArrayAttribute(openingElement, 'paths') ?? [];\n const prefix = getAttributeValue(openingElement, 'prefix') ?? '@';\n const children = Node.isJsxElement(node)\n ? transformRuntimeBlockChildren(node, ctx)\n : [];\n return {\n kind: 'executionContext',\n paths,\n prefix,\n children,\n } as BlockNode;\n }\n\n // Table component\n if (name === 'Table') {\n return transformTable(node, sharedCtx) as BlockNode;\n }\n\n // XmlSection\n if (name === 'XmlSection') {\n return transformXmlSection(node, sharedCtx) as BlockNode;\n }\n\n // XML wrapper components\n if (['DeviationRules', 'CommitRules', 'WaveExecution', 'CheckpointHandling'].includes(name)) {\n return transformXmlWrapper(name, node, sharedCtx) as BlockNode;\n }\n\n // Markdown passthrough\n if (name === 'Markdown') {\n return transformMarkdown(node, sharedCtx) as BlockNode;\n }\n\n // Indent component - indents children by specified spaces\n if (name === 'Indent') {\n return transformRuntimeIndent(node, ctx);\n }\n\n // Check for local component (same-file function components)\n if (isCustomComponent(name) && ctx.localComponents.has(name)) {\n const result = transformLocalComponent(node, ctx, transformRuntimeBlockChildren);\n if (result) {\n // If array, return first element (or wrap in group)\n if (Array.isArray(result)) {\n if (result.length === 1) return result[0];\n return { kind: 'group', children: result } as BlockNode;\n }\n return result;\n }\n }\n\n throw ctx.createError(`Unsupported V3 element: <${name}>`, node);\n}\n\n// ============================================================================\n// Children Transformation\n// ============================================================================\n\n/**\n * Transform JSX children to BlockNodes, handling If/Else sibling pairs\n */\nexport function transformRuntimeBlockChildren(\n parent: JsxElement,\n ctx: RuntimeTransformContext\n): BlockNode[] {\n const jsxChildren = parent.getJsxChildren();\n const blocks: BlockNode[] = [];\n let i = 0;\n\n while (i < jsxChildren.length) {\n const child = jsxChildren[i];\n\n // Skip whitespace-only text\n if (Node.isJsxText(child)) {\n const text = extractText(child);\n if (!text) {\n i++;\n continue;\n }\n }\n\n if (Node.isJsxElement(child) || Node.isJsxSelfClosingElement(child)) {\n const childName = getElementName(child);\n\n // Handle If with potential Else sibling\n if (childName === 'If' || childName === 'V3If') {\n const ifNode = transformRuntimeIf(child, ctx, transformRuntimeBlockChildren);\n blocks.push(ifNode);\n\n // Check for Else sibling using helper\n const siblingResult = processIfElseSiblings(jsxChildren, i, (elseNode) => {\n const elseBlock = transformRuntimeElse(\n elseNode as JsxElement | JsxSelfClosingElement,\n ctx,\n transformRuntimeBlockChildren\n );\n blocks.push(elseBlock);\n });\n if (siblingResult.hasElse) {\n i = siblingResult.nextIndex;\n }\n } else {\n const block = transformToRuntimeBlock(child, ctx);\n if (block) blocks.push(block);\n }\n } else {\n const block = transformToRuntimeBlock(child, ctx);\n if (block) blocks.push(block);\n }\n\n i++;\n }\n\n return blocks;\n}\n\n// ============================================================================\n// Document Transformation\n// ============================================================================\n\n/**\n * Transform a V3 Command element to DocumentNode\n *\n * Supports two patterns:\n * 1. Render props: <Command>{() => { return (<>...</>) }}</Command>\n * 2. Direct children: <Command>...</Command>\n */\nexport function transformRuntimeCommand(\n root: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): DocumentNode {\n // Extract frontmatter from Command props\n const openingElement = Node.isJsxElement(root)\n ? root.getOpeningElement()\n : root;\n\n const frontmatterData: Record<string, unknown> = {};\n let folder: string | undefined;\n\n // Get standard Command props\n for (const attr of openingElement.getAttributes()) {\n if (!Node.isJsxAttribute(attr)) continue;\n\n const name = attr.getNameNode().getText();\n const init = attr.getInitializer();\n\n if (!init) continue;\n\n // Skip 'folder' - it's metadata, not frontmatter\n if (name === 'folder') {\n if (Node.isStringLiteral(init)) {\n folder = init.getLiteralValue();\n } else if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n folder = expr.getLiteralValue();\n }\n }\n continue;\n }\n\n // Convert camelCase prop names to kebab-case for YAML frontmatter\n const yamlKey = camelToKebab(name);\n\n if (Node.isStringLiteral(init)) {\n frontmatterData[yamlKey] = init.getLiteralValue();\n } else if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n frontmatterData[yamlKey] = expr.getLiteralValue();\n }\n // Handle array literals for props like allowedTools or arguments\n else if (expr && Node.isArrayLiteralExpression(expr)) {\n const values: (string | Record<string, unknown>)[] = [];\n for (const el of expr.getElements()) {\n if (Node.isStringLiteral(el)) {\n values.push(el.getLiteralValue());\n } else if (Node.isObjectLiteralExpression(el)) {\n // Handle object literals in arrays (e.g., arguments array)\n const obj: Record<string, unknown> = {};\n for (const prop of el.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const propName = prop.getName();\n const propInit = prop.getInitializer();\n if (propInit && Node.isStringLiteral(propInit)) {\n obj[propName] = propInit.getLiteralValue();\n } else if (propInit && (Node.isTrueLiteral(propInit) || Node.isFalseLiteral(propInit))) {\n obj[propName] = Node.isTrueLiteral(propInit);\n }\n }\n }\n if (Object.keys(obj).length > 0) {\n values.push(obj);\n }\n }\n }\n if (values.length > 0) {\n frontmatterData[yamlKey] = values;\n }\n }\n }\n }\n\n // Transform children - detect render props vs direct JSX\n let children: BlockNode[] = [];\n\n if (Node.isJsxElement(root)) {\n const jsxChildren = root.getJsxChildren();\n\n // Find first meaningful child (skip whitespace)\n const firstChild = jsxChildren.find(c =>\n !Node.isJsxText(c) || !c.containsOnlyTriviaWhiteSpaces()\n );\n\n if (firstChild && Node.isJsxExpression(firstChild)) {\n const expr = firstChild.getExpression();\n if (expr && Node.isArrowFunction(expr)) {\n // Render props pattern - extract children from function body\n children = extractRenderPropsChildren(expr, ctx);\n } else {\n // Expression but not arrow function - treat as direct children\n children = transformRuntimeBlockChildren(root, ctx);\n }\n } else {\n // Direct JSX children - no wrapper needed\n children = transformRuntimeBlockChildren(root, ctx);\n }\n }\n\n // Collect runtime var declarations\n const runtimeVars = Array.from(ctx.runtimeVars.values()).map(info => ({\n kind: 'runtimeVarDecl' as const,\n varName: info.varName,\n tsType: info.tsType,\n }));\n\n // Collect used runtime function names\n const runtimeFunctions = Array.from(ctx.usedRuntimeFunctions);\n\n return {\n kind: 'document',\n frontmatter: Object.keys(frontmatterData).length > 0\n ? { kind: 'frontmatter', data: frontmatterData }\n : undefined,\n metadata: folder ? { folder } : undefined,\n runtimeVars,\n runtimeFunctions,\n children,\n };\n}\n\n/**\n * Extract children from render props arrow function\n *\n * Handles patterns like:\n * - () => { return (<>...</>) }\n * - () => (<>...</>)\n * - () => <div>...</div>\n */\nfunction extractRenderPropsChildren(\n arrowFn: Node,\n ctx: RuntimeTransformContext\n): BlockNode[] {\n if (!Node.isArrowFunction(arrowFn)) return [];\n\n const body = arrowFn.getBody();\n\n // Block body: { return (...) }\n if (Node.isBlock(body)) {\n const holder: { result: BlockNode[] | null } = { result: null };\n\n body.forEachDescendant((descendant, traversal) => {\n if (Node.isReturnStatement(descendant)) {\n const returnExpr = descendant.getExpression();\n if (returnExpr) {\n // Unwrap parentheses\n let inner = returnExpr;\n while (Node.isParenthesizedExpression(inner)) {\n inner = inner.getExpression();\n }\n\n // Fragment: <> ... </>\n if (Node.isJsxFragment(inner)) {\n holder.result = transformChildArray(inner.getJsxChildren(), ctx);\n traversal.stop();\n } else if (Node.isJsxElement(inner) || Node.isJsxSelfClosingElement(inner)) {\n const block = transformRuntimeElement(inner, ctx);\n if (block) holder.result = [block];\n traversal.stop();\n }\n }\n }\n });\n\n return holder.result ?? [];\n }\n\n // Expression body: () => <div>...</div> or () => (<>...</>)\n let inner = body;\n while (Node.isParenthesizedExpression(inner)) {\n inner = (inner as any).getExpression();\n }\n\n if (Node.isJsxFragment(inner)) {\n return transformChildArray(inner.getJsxChildren(), ctx);\n }\n\n if (Node.isJsxElement(inner) || Node.isJsxSelfClosingElement(inner)) {\n const block = transformRuntimeElement(inner, ctx);\n return block ? [block] : [];\n }\n\n return [];\n}\n","/**\n * Runtime Transformer Utilities\n *\n * Helper functions for runtime transformers.\n */\n\nimport { Node, JsxOpeningElement, JsxSelfClosingElement, Expression } from 'ts-morph';\n\n// ============================================================================\n// Attribute Extraction\n// ============================================================================\n\n/**\n * Get the string value of a JSX attribute\n *\n * Handles:\n * - prop=\"value\" -> \"value\"\n * - prop={'value'} -> \"value\"\n * - prop={123} -> \"123\"\n *\n * @returns String value or undefined if not found/not string\n */\nexport function getAttributeValue(\n element: JsxOpeningElement | JsxSelfClosingElement,\n attrName: string\n): string | undefined {\n const attr = element.getAttribute(attrName);\n if (!attr || !Node.isJsxAttribute(attr)) return undefined;\n\n const init = attr.getInitializer();\n if (!init) return undefined;\n\n // String literal: prop=\"value\"\n if (Node.isStringLiteral(init)) {\n return init.getLiteralValue();\n }\n\n // JSX expression: prop={value}\n if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (!expr) return undefined;\n\n // String literal in expression: prop={'value'}\n if (Node.isStringLiteral(expr)) {\n return expr.getLiteralValue();\n }\n\n // Numeric literal: prop={123}\n if (Node.isNumericLiteral(expr)) {\n return expr.getLiteralText();\n }\n\n // Template literal: prop={`value`}\n if (Node.isTemplateExpression(expr) || Node.isNoSubstitutionTemplateLiteral(expr)) {\n return expr.getText().slice(1, -1); // Remove backticks\n }\n }\n\n return undefined;\n}\n\n/**\n * Get the raw expression from a JSX attribute\n *\n * Returns the expression node for complex values like:\n * - prop={ctx.error}\n * - prop={!ctx.done}\n * - prop={{ key: value }}\n *\n * @returns Expression node or undefined if not found\n */\nexport function getAttributeExpression(\n element: JsxOpeningElement | JsxSelfClosingElement,\n attrName: string\n): Expression | undefined {\n const attr = element.getAttribute(attrName);\n if (!attr || !Node.isJsxAttribute(attr)) return undefined;\n\n const init = attr.getInitializer();\n if (!init || !Node.isJsxExpression(init)) return undefined;\n\n return init.getExpression();\n}\n\n/**\n * Get object literal from a JSX attribute\n *\n * For props like: prop={{ key: 'value', other: 123 }}\n *\n * @returns Record of property name -> value node\n */\nexport function getAttributeObject(\n element: JsxOpeningElement | JsxSelfClosingElement,\n attrName: string\n): Map<string, Expression> | undefined {\n const expr = getAttributeExpression(element, attrName);\n if (!expr || !Node.isObjectLiteralExpression(expr)) return undefined;\n\n const result = new Map<string, Expression>();\n\n for (const prop of expr.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const name = prop.getName();\n const value = prop.getInitializer();\n if (value) {\n result.set(name, value);\n }\n } else if (Node.isShorthandPropertyAssignment(prop)) {\n // { foo } is equivalent to { foo: foo }\n const name = prop.getName();\n const nameNode = prop.getNameNode();\n result.set(name, nameNode as unknown as Expression);\n }\n }\n\n return result;\n}\n\n/**\n * Get array literal from a JSX attribute\n *\n * For props like: prop={[item1, item2]}\n *\n * @returns Array of expression nodes\n */\nexport function getAttributeArray(\n element: JsxOpeningElement | JsxSelfClosingElement,\n attrName: string\n): Expression[] | undefined {\n const expr = getAttributeExpression(element, attrName);\n if (!expr || !Node.isArrayLiteralExpression(expr)) return undefined;\n\n return expr.getElements();\n}\n\n/**\n * Get string array from a JSX attribute\n *\n * For props like: prop={[\"item1\", \"item2\"]}\n *\n * @returns Array of strings\n */\nexport function getStringArrayAttribute(\n element: JsxOpeningElement | JsxSelfClosingElement,\n attrName: string\n): string[] | undefined {\n const elements = getAttributeArray(element, attrName);\n if (!elements) return undefined;\n\n const strings: string[] = [];\n for (const el of elements) {\n if (Node.isStringLiteral(el)) {\n strings.push(el.getLiteralValue());\n }\n }\n\n return strings.length > 0 ? strings : undefined;\n}\n\n// ============================================================================\n// Element Helpers\n// ============================================================================\n\n/**\n * Get the tag name of a JSX element\n */\nexport function getElementName(\n node: Node\n): string {\n if (Node.isJsxElement(node)) {\n return node.getOpeningElement().getTagNameNode().getText();\n }\n if (Node.isJsxSelfClosingElement(node)) {\n return node.getTagNameNode().getText();\n }\n return '';\n}\n\n/**\n * Check if a name looks like a custom component (PascalCase)\n */\nexport function isCustomComponent(name: string): boolean {\n return /^[A-Z]/.test(name);\n}\n\n/**\n * Extract text content from a JSX text node\n *\n * Normalizes whitespace:\n * - Collapses multiple whitespace to single space\n * - Trims leading/trailing whitespace\n */\nexport function extractText(node: Node): string {\n if (!Node.isJsxText(node)) return '';\n\n const text = node.getText();\n\n // Collapse whitespace\n const normalized = text.replace(/\\s+/g, ' ').trim();\n\n return normalized;\n}\n\n/**\n * Extract markdown text from a JSX text node, preserving line breaks\n *\n * For markdown content where line breaks are meaningful:\n * - Uses raw source text extraction to bypass JSX whitespace normalization\n * - Dedents by removing common leading whitespace (preserves relative indentation)\n * - Collapses 3+ consecutive blank lines to 2 (one blank line)\n * - Preserves leading/trailing newlines for block separation\n */\nexport function extractMarkdownText(node: Node): string {\n if (!Node.isJsxText(node)) return '';\n\n // CRITICAL: Use raw source text extraction to bypass JSX whitespace normalization\n // JSX normalizes whitespace (collapses newlines to spaces) but we need to preserve them\n // for markdown content. Extract directly from source file using positions.\n const sourceFile = node.getSourceFile();\n const text = sourceFile.getFullText().slice(node.getStart(), node.getEnd());\n\n // For single-line content, preserve as-is (inline text)\n // This ensures word-spacing is preserved (both leading \" plan(s)\" and trailing \"word \")\n if (!text.includes('\\n')) {\n return text;\n }\n\n // Split into lines for multi-line content\n const lines = text.split('\\n');\n\n // Find minimum indentation (ignoring empty lines and the first line which may have no indent)\n let minIndent = Infinity;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim().length > 0) {\n // Skip first line for indent calculation - it follows the opening tag\n if (i === 0) continue;\n const leadingSpaces = line.match(/^[ \\t]*/)?.[0].length ?? 0;\n minIndent = Math.min(minIndent, leadingSpaces);\n }\n }\n if (minIndent === Infinity) minIndent = 0;\n\n // Dedent all lines by the minimum indentation (except first line)\n const dedented = lines.map((line, i) => {\n if (line.trim().length === 0) return ''; // Preserve empty lines as empty\n if (i === 0) return line; // First line has no indent to strip\n return line.slice(minIndent);\n });\n\n // Join and collapse excessive blank lines (3+ newlines → 2 newlines)\n let result = dedented.join('\\n').replace(/\\n{3,}/g, '\\n\\n');\n\n // Remove ONLY the first newline after opening tag (not intentional blank lines)\n // Use [ \\t]* instead of \\s* to avoid matching multiple newlines\n result = result.replace(/^[ \\t]*\\n/, '');\n\n // Preserve trailing newline as content separator\n // (emitter will handle stripping final newline before closing tag)\n result = result.trimEnd();\n // Add back ONE trailing newline if there was content\n if (result) {\n result += '\\n';\n }\n\n // If content is only whitespace, return empty string\n if (!result.trim()) return '';\n\n return result;\n}\n\n// ============================================================================\n// String Utilities\n// ============================================================================\n\n/**\n * Convert camelCase to kebab-case\n *\n * @example\n * camelToKebab('allowedTools') // 'allowed-tools'\n * camelToKebab('argumentHint') // 'argument-hint'\n * camelToKebab('name') // 'name'\n */\nexport function camelToKebab(str: string): string {\n return str.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();\n}\n\n// ============================================================================\n// Value Extraction\n// ============================================================================\n\n/**\n * Extract a JSON-serializable value from an expression\n *\n * Handles:\n * - String literals\n * - Numeric literals\n * - Boolean literals\n * - Object literals (shallow)\n * - Array literals (shallow)\n */\nexport function extractJsonValue(expr: Expression): unknown {\n if (Node.isStringLiteral(expr)) {\n return expr.getLiteralValue();\n }\n\n if (Node.isNumericLiteral(expr)) {\n return Number(expr.getLiteralText());\n }\n\n if (Node.isTrueLiteral(expr)) {\n return true;\n }\n\n if (Node.isFalseLiteral(expr)) {\n return false;\n }\n\n if (Node.isNullLiteral(expr)) {\n return null;\n }\n\n if (Node.isObjectLiteralExpression(expr)) {\n const result: Record<string, unknown> = {};\n for (const prop of expr.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const name = prop.getName();\n const value = prop.getInitializer();\n if (value) {\n result[name] = extractJsonValue(value);\n }\n }\n }\n return result;\n }\n\n if (Node.isArrayLiteralExpression(expr)) {\n return expr.getElements().map(el => extractJsonValue(el));\n }\n\n // Template literal\n if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n return expr.getLiteralValue();\n }\n\n // Unknown - return as string representation\n return expr.getText();\n}\n\n// ============================================================================\n// If/Else Sibling Lookahead\n// ============================================================================\n\n/**\n * Get the element name from a JSX element\n * Local helper for sibling processing\n */\nfunction getJsxElementName(node: Node): string {\n if (Node.isJsxElement(node)) {\n return node.getOpeningElement().getTagNameNode().getText();\n }\n if (Node.isJsxSelfClosingElement(node)) {\n return node.getTagNameNode().getText();\n }\n return '';\n}\n\n/**\n * Result of processing If/Else siblings\n */\nexport interface IfElseSiblingResult {\n /** Whether an Else sibling was found and processed */\n hasElse: boolean;\n /** The index to continue from (points past the Else if found, or at original position if not) */\n nextIndex: number;\n}\n\n/**\n * Process potential Else sibling after an If element\n *\n * This is a helper to DRY up the If/Else sibling lookahead pattern that appears\n * multiple times in runtime-dispatch.ts.\n *\n * @param jsxChildren - Array of JSX children being processed\n * @param ifIndex - Current index of the If element\n * @param onElseFound - Callback when Else sibling is found, receives the Else node\n * @returns Result with hasElse flag and nextIndex to continue from\n */\nexport function processIfElseSiblings(\n jsxChildren: Node[],\n ifIndex: number,\n onElseFound: (elseNode: Node) => void\n): IfElseSiblingResult {\n let nextIndex = ifIndex + 1;\n\n while (nextIndex < jsxChildren.length) {\n const sibling = jsxChildren[nextIndex];\n\n // Skip whitespace-only text\n if (Node.isJsxText(sibling)) {\n const text = extractText(sibling);\n if (!text) {\n nextIndex++;\n continue;\n }\n }\n\n // Check if next non-whitespace is Else\n if (Node.isJsxElement(sibling) || Node.isJsxSelfClosingElement(sibling)) {\n const siblingName = getJsxElementName(sibling);\n if (siblingName === 'Else' || siblingName === 'V3Else') {\n onElseFound(sibling);\n return { hasElse: true, nextIndex };\n }\n }\n\n // Not an Else, break out\n break;\n }\n\n return { hasElse: false, nextIndex: ifIndex };\n}\n","/**\n * Runtime Control Flow Transformers\n *\n * Transforms runtime control flow components to IR nodes:\n * - If -> IfNode (with Condition tree)\n * - Else -> ElseNode\n * - Loop -> LoopNode\n * - Break -> BreakNode\n * - Return -> ReturnNode\n */\n\nimport { Node, JsxElement, JsxSelfClosingElement, SyntaxKind } from 'ts-morph';\nimport type {\n IfNode,\n ElseNode,\n LoopNode,\n BreakNode,\n ReturnNode,\n Condition,\n BlockNode,\n} from '../../ir/index.js';\nimport type { RuntimeTransformContext } from './runtime-types.js';\nimport { parseRuntimeVarRef } from './runtime-var.js';\nimport { getAttributeValue, getAttributeExpression } from './runtime-utils.js';\n\n// ============================================================================\n// Condition Parsing\n// ============================================================================\n\n/**\n * Parse a JSX expression to a Condition tree\n *\n * Handles:\n * - ctx.error -> { type: 'ref', ref: RuntimeVarRefNode }\n * - !ctx.error -> { type: 'not', operand: ... }\n * - ctx.a && ctx.b -> { type: 'and', left: ..., right: ... }\n * - ctx.status === 'DONE' -> { type: 'eq', left: ..., right: 'DONE' }\n */\nexport function parseConditionExpression(\n node: Node,\n ctx: RuntimeTransformContext\n): Condition {\n // Handle prefix unary expression (!expr)\n if (Node.isPrefixUnaryExpression(node)) {\n const operatorText = node.getOperatorToken();\n // Check for logical NOT (!)\n if (operatorText === SyntaxKind.ExclamationToken) {\n const operand = node.getOperand();\n return {\n type: 'not',\n operand: parseConditionExpression(operand, ctx),\n };\n }\n }\n\n // Handle binary expressions (&&, ||, ===, !==)\n if (Node.isBinaryExpression(node)) {\n const left = node.getLeft();\n const right = node.getRight();\n const operatorToken = node.getOperatorToken();\n const operatorText = operatorToken.getText();\n\n // Logical AND\n if (operatorText === '&&') {\n return {\n type: 'and',\n left: parseConditionExpression(left, ctx),\n right: parseConditionExpression(right, ctx),\n };\n }\n\n // Logical OR\n if (operatorText === '||') {\n return {\n type: 'or',\n left: parseConditionExpression(left, ctx),\n right: parseConditionExpression(right, ctx),\n };\n }\n\n // Equality (===, ==)\n if (operatorText === '===' || operatorText === '==') {\n const leftCond = parseConditionExpression(left, ctx);\n const rightValue = extractLiteralValue(right);\n if (rightValue !== undefined) {\n return {\n type: 'eq',\n left: leftCond,\n right: rightValue,\n };\n }\n }\n\n // Inequality (!==, !=)\n if (operatorText === '!==' || operatorText === '!=') {\n const leftCond = parseConditionExpression(left, ctx);\n const rightValue = extractLiteralValue(right);\n if (rightValue !== undefined) {\n return {\n type: 'neq',\n left: leftCond,\n right: rightValue,\n };\n }\n }\n\n // Greater than (>)\n if (operatorText === '>') {\n const leftCond = parseConditionExpression(left, ctx);\n const rightValue = extractLiteralValue(right);\n if (typeof rightValue === 'number') {\n return {\n type: 'gt',\n left: leftCond,\n right: rightValue,\n };\n }\n }\n\n // Greater than or equal (>=)\n if (operatorText === '>=') {\n const leftCond = parseConditionExpression(left, ctx);\n const rightValue = extractLiteralValue(right);\n if (typeof rightValue === 'number') {\n return {\n type: 'gte',\n left: leftCond,\n right: rightValue,\n };\n }\n }\n\n // Less than (<)\n if (operatorText === '<') {\n const leftCond = parseConditionExpression(left, ctx);\n const rightValue = extractLiteralValue(right);\n if (typeof rightValue === 'number') {\n return {\n type: 'lt',\n left: leftCond,\n right: rightValue,\n };\n }\n }\n\n // Less than or equal (<=)\n if (operatorText === '<=') {\n const leftCond = parseConditionExpression(left, ctx);\n const rightValue = extractLiteralValue(right);\n if (typeof rightValue === 'number') {\n return {\n type: 'lte',\n left: leftCond,\n right: rightValue,\n };\n }\n }\n }\n\n // Handle parenthesized expressions\n if (Node.isParenthesizedExpression(node)) {\n return parseConditionExpression(node.getExpression(), ctx);\n }\n\n // Handle boolean literals\n if (Node.isTrueLiteral(node)) {\n return { type: 'literal', value: true };\n }\n if (Node.isFalseLiteral(node)) {\n return { type: 'literal', value: false };\n }\n\n // Handle property access (ctx.error) or identifier (ctx)\n const ref = parseRuntimeVarRef(node, ctx);\n if (ref) {\n return { type: 'ref', ref };\n }\n\n // Unknown expression - throw error\n throw ctx.createError(\n `Cannot parse condition expression: ${node.getText()}. ` +\n 'Conditions must use RuntimeVar references.',\n node\n );\n}\n\n/**\n * Extract a literal value from a node\n */\nfunction extractLiteralValue(node: Node): string | number | boolean | undefined {\n if (Node.isStringLiteral(node)) {\n return node.getLiteralValue();\n }\n if (Node.isNumericLiteral(node)) {\n return Number(node.getLiteralText());\n }\n if (Node.isTrueLiteral(node)) {\n return true;\n }\n if (Node.isFalseLiteral(node)) {\n return false;\n }\n return undefined;\n}\n\n// ============================================================================\n// RuntimeIf Transformer\n// ============================================================================\n\n/**\n * Transform RuntimeIf component to IfNode\n */\nexport function transformRuntimeIf(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext,\n transformChildren: (node: JsxElement, ctx: RuntimeTransformContext) => BlockNode[]\n): IfNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract condition prop (required)\n const conditionExpr = getAttributeExpression(openingElement, 'condition');\n if (!conditionExpr) {\n throw ctx.createError('If requires condition prop', openingElement);\n }\n\n // Parse condition to Condition tree\n const condition = parseConditionExpression(conditionExpr, ctx);\n\n // Transform children\n const children = Node.isJsxElement(node)\n ? transformChildren(node, ctx)\n : [];\n\n return {\n kind: 'if',\n condition,\n children,\n };\n}\n\n// ============================================================================\n// RuntimeElse Transformer\n// ============================================================================\n\n/**\n * Transform RuntimeElse component to ElseNode\n */\nexport function transformRuntimeElse(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext,\n transformChildren: (node: JsxElement, ctx: RuntimeTransformContext) => BlockNode[]\n): ElseNode {\n const children = Node.isJsxElement(node)\n ? transformChildren(node, ctx)\n : [];\n\n return {\n kind: 'else',\n children,\n };\n}\n\n// ============================================================================\n// RuntimeLoop Transformer\n// ============================================================================\n\n/**\n * Transform RuntimeLoop component to LoopNode\n */\nexport function transformRuntimeLoop(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext,\n transformChildren: (node: JsxElement, ctx: RuntimeTransformContext) => BlockNode[]\n): LoopNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract max prop (required)\n const maxStr = getAttributeValue(openingElement, 'max');\n if (!maxStr) {\n throw ctx.createError('Loop requires max prop', openingElement);\n }\n\n const max = parseInt(maxStr, 10);\n if (isNaN(max) || max < 1) {\n throw ctx.createError('Loop max must be a positive integer', openingElement);\n }\n\n // Extract optional counter prop\n let counterVar: string | undefined;\n const counterExpr = getAttributeExpression(openingElement, 'counter');\n if (counterExpr) {\n const ref = parseRuntimeVarRef(counterExpr, ctx);\n if (!ref) {\n throw ctx.createError(\n 'Loop counter must be a useRuntimeVar reference',\n counterExpr\n );\n }\n counterVar = ref.varName;\n }\n\n // Transform children\n const children = Node.isJsxElement(node)\n ? transformChildren(node, ctx)\n : [];\n\n return {\n kind: 'loop',\n max,\n counterVar,\n children,\n };\n}\n\n// ============================================================================\n// Break Transformer\n// ============================================================================\n\n/**\n * Transform Break component to BreakNode\n */\nexport function transformBreak(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): BreakNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n const message = getAttributeValue(openingElement, 'message');\n\n return {\n kind: 'break',\n message,\n };\n}\n\n// ============================================================================\n// Return Transformer\n// ============================================================================\n\n/**\n * Transform Return component to ReturnNode\n */\nexport function transformReturn(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): ReturnNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n const status = getAttributeValue(openingElement, 'status') as ReturnNode['status'];\n const message = getAttributeValue(openingElement, 'message');\n\n // Validate status if provided\n if (status) {\n const validStatuses = ['SUCCESS', 'BLOCKED', 'NOT_FOUND', 'ERROR', 'CHECKPOINT'];\n if (!validStatuses.includes(status)) {\n throw ctx.createError(\n `Invalid return status: ${status}. Must be one of: ${validStatuses.join(', ')}`,\n openingElement\n );\n }\n }\n\n return {\n kind: 'return',\n status,\n message,\n };\n}\n","/**\n * Runtime Call Transformer\n *\n * Transforms <RuntimeFn.Call args={...} output={...} /> elements\n * to RuntimeCallNode IR nodes.\n */\n\nimport { Node, JsxElement, JsxSelfClosingElement } from 'ts-morph';\nimport type { RuntimeCallNode } from '../../ir/index.js';\nimport type { RuntimeTransformContext } from './runtime-types.js';\nimport { resolveRuntimeFn, markRuntimeFnUsed } from './runtime-fn.js';\nimport { parseRuntimeVarRef } from './runtime-var.js';\nimport { getAttributeExpression, extractJsonValue } from './runtime-utils.js';\n\n// ============================================================================\n// RuntimeFn.Call Detection\n// ============================================================================\n\n/**\n * Check if a JSX element is a RuntimeFn.Call invocation\n *\n * Looks for patterns like:\n * - <Init.Call ... />\n * - <GetContext.Call ... />\n *\n * Where Init/GetContext are registered RuntimeFn wrappers.\n */\nexport function isRuntimeFnCall(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): boolean {\n const tagName = getTagName(node);\n if (!tagName) return false;\n\n // Check for .Call suffix\n if (!tagName.endsWith('.Call')) return false;\n\n // Extract wrapper name\n const wrapperName = tagName.slice(0, -5); // Remove '.Call'\n\n // Check if wrapper is a registered RuntimeFn\n return ctx.runtimeFunctions.has(wrapperName);\n}\n\n/**\n * Get the tag name from a JSX element\n */\nfunction getTagName(node: JsxElement | JsxSelfClosingElement): string | null {\n if (Node.isJsxElement(node)) {\n const tagNode = node.getOpeningElement().getTagNameNode();\n return tagNode.getText();\n }\n if (Node.isJsxSelfClosingElement(node)) {\n const tagNode = node.getTagNameNode();\n return tagNode.getText();\n }\n return null;\n}\n\n// ============================================================================\n// Transformer\n// ============================================================================\n\n/**\n * Transform RuntimeFn.Call to RuntimeCallNode\n *\n * Input JSX:\n * <Init.Call args={{ projectPath: \".\" }} output={ctx} />\n *\n * Output IR:\n * {\n * kind: 'runtimeCall',\n * fnName: 'initProject',\n * args: { projectPath: '.' },\n * outputVar: 'CTX'\n * }\n */\nexport function transformRuntimeCall(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): RuntimeCallNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract wrapper name from tag\n const tagName = getTagName(node);\n if (!tagName || !tagName.endsWith('.Call')) {\n throw ctx.createError('Expected RuntimeFn.Call element', openingElement);\n }\n\n const wrapperName = tagName.slice(0, -5);\n const fnInfo = resolveRuntimeFn(wrapperName, ctx);\n\n if (!fnInfo) {\n throw ctx.createError(\n `Unknown RuntimeFn wrapper: ${wrapperName}. Did you declare it with runtimeFn()?`,\n openingElement\n );\n }\n\n // Mark function as used (for extraction)\n markRuntimeFnUsed(wrapperName, ctx);\n\n // Extract args prop (required)\n const argsExpr = getAttributeExpression(openingElement, 'args');\n if (!argsExpr) {\n throw ctx.createError(\n `${wrapperName}.Call requires args prop`,\n openingElement\n );\n }\n\n // Parse args to JSON-serializable object\n let args: Record<string, unknown>;\n if (Node.isObjectLiteralExpression(argsExpr)) {\n args = extractJsonValue(argsExpr) as Record<string, unknown>;\n } else {\n throw ctx.createError(\n `${wrapperName}.Call args must be an object literal`,\n argsExpr\n );\n }\n\n // Extract output prop (required)\n const outputExpr = getAttributeExpression(openingElement, 'output');\n if (!outputExpr) {\n throw ctx.createError(\n `${wrapperName}.Call requires output prop (RuntimeVar reference)`,\n openingElement\n );\n }\n\n // Parse output to RuntimeVar reference\n const outputRef = parseRuntimeVarRef(outputExpr, ctx);\n if (!outputRef) {\n throw ctx.createError(\n `${wrapperName}.Call output must be a useRuntimeVar reference`,\n outputExpr\n );\n }\n\n // Output should be the root variable (no path)\n if (outputRef.path.length > 0) {\n throw ctx.createError(\n `${wrapperName}.Call output must reference the variable directly, not a property`,\n outputExpr\n );\n }\n\n // Apply namespace prefix to function name\n const namespacedFnName = ctx.namespace\n ? `${ctx.namespace}_${fnInfo.fnName}`\n : fnInfo.fnName;\n\n return {\n kind: 'runtimeCall',\n fnName: namespacedFnName,\n args,\n outputVar: outputRef.varName,\n };\n}\n","/**\n * AskUser Transformer\n *\n * Transforms <AskUser ... /> elements to AskUserNode IR nodes.\n */\n\nimport { Node, JsxElement, JsxSelfClosingElement, Expression } from 'ts-morph';\nimport type { AskUserNode, AskUserOptionNode } from '../../ir/index.js';\nimport type { RuntimeTransformContext } from './runtime-types.js';\nimport { parseRuntimeVarRef } from './runtime-var.js';\nimport { getAttributeValue, getAttributeExpression, getAttributeArray } from './runtime-utils.js';\n\n// ============================================================================\n// Option Parsing\n// ============================================================================\n\n/**\n * Parse an option object literal to AskUserOptionNode\n *\n * Expected format: { value: 'val', label: 'Label', description?: 'Desc' }\n */\nfunction parseOption(\n expr: Expression,\n ctx: RuntimeTransformContext\n): AskUserOptionNode {\n if (!Node.isObjectLiteralExpression(expr)) {\n throw ctx.createError(\n 'AskUser option must be an object literal',\n expr\n );\n }\n\n let value: string | undefined;\n let label: string | undefined;\n let description: string | undefined;\n\n for (const prop of expr.getProperties()) {\n if (!Node.isPropertyAssignment(prop)) continue;\n\n const name = prop.getName();\n const init = prop.getInitializer();\n\n if (!init) continue;\n\n if (name === 'value' && Node.isStringLiteral(init)) {\n value = init.getLiteralValue();\n } else if (name === 'label' && Node.isStringLiteral(init)) {\n label = init.getLiteralValue();\n } else if (name === 'description' && Node.isStringLiteral(init)) {\n description = init.getLiteralValue();\n }\n }\n\n if (!value) {\n throw ctx.createError('AskUser option requires value property', expr);\n }\n if (!label) {\n throw ctx.createError('AskUser option requires label property', expr);\n }\n\n return { value, label, description };\n}\n\n// ============================================================================\n// Transformer\n// ============================================================================\n\n/**\n * Transform AskUser component to AskUserNode\n *\n * Input JSX:\n * <AskUser\n * question=\"Which database?\"\n * header=\"Database\"\n * options={[\n * { value: 'postgres', label: 'PostgreSQL' },\n * { value: 'sqlite', label: 'SQLite' }\n * ]}\n * output={dbChoice}\n * />\n *\n * Output IR:\n * {\n * kind: 'askUser',\n * question: 'Which database?',\n * header: 'Database',\n * options: [...],\n * outputVar: 'DB_CHOICE',\n * multiSelect: false\n * }\n */\nexport function transformAskUser(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): AskUserNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract question prop (required)\n const question = getAttributeValue(openingElement, 'question');\n if (!question) {\n throw ctx.createError('AskUser requires question prop', openingElement);\n }\n\n // Extract options prop (required)\n const optionsExprs = getAttributeArray(openingElement, 'options');\n if (!optionsExprs || optionsExprs.length === 0) {\n throw ctx.createError(\n 'AskUser requires options prop with at least one option',\n openingElement\n );\n }\n\n if (optionsExprs.length < 2) {\n throw ctx.createError(\n 'AskUser options must have at least 2 options',\n openingElement\n );\n }\n\n if (optionsExprs.length > 4) {\n throw ctx.createError(\n 'AskUser options must have at most 4 options',\n openingElement\n );\n }\n\n const options: AskUserOptionNode[] = optionsExprs.map(expr =>\n parseOption(expr, ctx)\n );\n\n // Extract output prop (required)\n const outputExpr = getAttributeExpression(openingElement, 'output');\n if (!outputExpr) {\n throw ctx.createError(\n 'AskUser requires output prop (RuntimeVar reference)',\n openingElement\n );\n }\n\n const outputRef = parseRuntimeVarRef(outputExpr, ctx);\n if (!outputRef) {\n throw ctx.createError(\n 'AskUser output must be a useRuntimeVar reference',\n outputExpr\n );\n }\n\n // Output should be root variable\n if (outputRef.path.length > 0) {\n throw ctx.createError(\n 'AskUser output must reference the variable directly, not a property',\n outputExpr\n );\n }\n\n // Extract optional props\n const header = getAttributeValue(openingElement, 'header');\n const multiSelectStr = getAttributeValue(openingElement, 'multiSelect');\n const multiSelect = multiSelectStr === 'true';\n\n return {\n kind: 'askUser',\n question,\n options,\n outputVar: outputRef.varName,\n header,\n multiSelect,\n };\n}\n","/**\n * Runtime SpawnAgent Transformer\n *\n * Transforms SpawnAgent elements with output capture.\n * Supports RuntimeVar output binding.\n */\n\nimport { Node, JsxElement, JsxSelfClosingElement, Expression } from 'ts-morph';\nimport type {\n SpawnAgentNode,\n SpawnAgentInput,\n InputProperty,\n InputValue,\n RuntimeVarRefNode,\n} from '../../ir/index.js';\nimport type { RuntimeTransformContext } from './runtime-types.js';\nimport { parseRuntimeVarRef } from './runtime-var.js';\nimport { getAttributeValue, getAttributeExpression, extractJsonValue } from './runtime-utils.js';\n\n// ============================================================================\n// Input Parsing\n// ============================================================================\n\n/**\n * Parse V3 input value from expression\n *\n * Handles:\n * - String literals -> { type: 'string', value: '...' }\n * - RuntimeVar references -> { type: 'runtimeVarRef', ref: ... }\n * - Other literals -> { type: 'json', value: ... }\n */\nfunction parseInputValue(\n expr: Expression,\n ctx: RuntimeTransformContext\n): InputValue {\n // Check for RuntimeVar reference first\n const ref = parseRuntimeVarRef(expr, ctx);\n if (ref) {\n return { type: 'runtimeVarRef', ref };\n }\n\n // String literal\n if (Node.isStringLiteral(expr)) {\n return { type: 'string', value: expr.getLiteralValue() };\n }\n\n // Template literal\n if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n return { type: 'string', value: expr.getLiteralValue() };\n }\n\n // Other JSON-serializable values\n const jsonValue = extractJsonValue(expr);\n return { type: 'json', value: jsonValue };\n}\n\n/**\n * Parse SpawnAgent input prop\n *\n * Handles:\n * - Object literal: input={{ key: value, ... }}\n * - Variable reference: input={someVar}\n */\nfunction parseInput(\n expr: Expression,\n ctx: RuntimeTransformContext\n): SpawnAgentInput {\n // Check for RuntimeVar reference (variable binding)\n const ref = parseRuntimeVarRef(expr, ctx);\n if (ref) {\n return {\n type: 'variable',\n varName: ref.varName,\n };\n }\n\n // Object literal\n if (Node.isObjectLiteralExpression(expr)) {\n const properties: InputProperty[] = [];\n\n for (const prop of expr.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const name = prop.getName();\n const init = prop.getInitializer();\n\n if (init) {\n properties.push({\n name,\n value: parseInputValue(init, ctx),\n });\n }\n } else if (Node.isShorthandPropertyAssignment(prop)) {\n // { foo } shorthand - check if it's a RuntimeVar\n const name = prop.getName();\n const nameNode = prop.getNameNode();\n const ref = parseRuntimeVarRef(nameNode, ctx);\n\n if (ref) {\n properties.push({\n name,\n value: { type: 'runtimeVarRef', ref },\n });\n } else {\n // Not a RuntimeVar - treat as identifier reference (will be resolved at runtime)\n properties.push({\n name,\n value: { type: 'string', value: `{${name}}` },\n });\n }\n }\n }\n\n return { type: 'object', properties };\n }\n\n throw ctx.createError(\n 'SpawnAgent input must be an object literal or RuntimeVar reference',\n expr\n );\n}\n\n// ============================================================================\n// Transformer\n// ============================================================================\n\n/**\n * Transform SpawnAgent to SpawnAgentNode\n *\n * Input JSX:\n * <SpawnAgent\n * agent=\"researcher\"\n * model=\"haiku\"\n * description=\"Research the topic\"\n * input={{ topic: ctx.topic }}\n * output={result}\n * />\n *\n * Output IR:\n * {\n * kind: 'spawnAgent',\n * agent: 'researcher',\n * model: 'haiku',\n * description: 'Research the topic',\n * input: { type: 'object', properties: [...] },\n * outputVar: 'RESULT'\n * }\n */\nexport function transformRuntimeSpawnAgent(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext\n): SpawnAgentNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract agent prop (required)\n const agent = getAttributeValue(openingElement, 'agent');\n if (!agent) {\n throw ctx.createError('SpawnAgent requires agent prop', openingElement);\n }\n\n // Extract model prop (required)\n const model = getAttributeValue(openingElement, 'model');\n if (!model) {\n throw ctx.createError('SpawnAgent requires model prop', openingElement);\n }\n\n // Extract description prop (required)\n const description = getAttributeValue(openingElement, 'description');\n if (!description) {\n throw ctx.createError('SpawnAgent requires description prop', openingElement);\n }\n\n // Extract prompt or input (one or the other)\n const prompt = getAttributeValue(openingElement, 'prompt');\n const inputExpr = getAttributeExpression(openingElement, 'input');\n\n let input: SpawnAgentInput | undefined;\n if (inputExpr) {\n input = parseInput(inputExpr, ctx);\n }\n\n if (!prompt && !input) {\n throw ctx.createError(\n 'SpawnAgent requires either prompt or input prop',\n openingElement\n );\n }\n\n // Extract optional output prop\n let outputVar: string | undefined;\n const outputExpr = getAttributeExpression(openingElement, 'output');\n if (outputExpr) {\n const outputRef = parseRuntimeVarRef(outputExpr, ctx);\n if (!outputRef) {\n throw ctx.createError(\n 'SpawnAgent output must be a useRuntimeVar reference',\n outputExpr\n );\n }\n if (outputRef.path.length > 0) {\n throw ctx.createError(\n 'SpawnAgent output must reference the variable directly',\n outputExpr\n );\n }\n outputVar = outputRef.varName;\n }\n\n // Extract optional loadFromFile prop\n const loadFromFile = getAttributeValue(openingElement, 'loadFromFile');\n\n return {\n kind: 'spawnAgent',\n agent,\n model,\n description,\n prompt,\n input,\n outputVar,\n loadFromFile,\n };\n}\n","/**\n * Runtime Component Transformer\n *\n * Handles build-time inlining of local function components.\n * Enables React-style component definitions:\n *\n * ```tsx\n * const Glenn = () => <h2>Glenn</h2>;\n * const Greeting = ({ name }: { name: string }) => <p>Hello {name}</p>;\n *\n * // Usage\n * <Glenn />\n * <Greeting name=\"World\" />\n * ```\n */\n\nimport {\n Node,\n SourceFile,\n ArrowFunction,\n FunctionExpression,\n FunctionDeclaration,\n JsxElement,\n JsxSelfClosingElement,\n JsxFragment,\n ImportDeclaration,\n} from 'ts-morph';\nimport type { BlockNode } from '../../ir/index.js';\nimport type { RuntimeTransformContext, LocalComponentInfo } from './runtime-types.js';\nimport { getElementName, extractJsonValue, isCustomComponent } from './runtime-utils.js';\n\n// Import will be resolved after this module is loaded (circular import handling)\nimport { transformToRuntimeBlock as dispatchTransform } from './runtime-dispatch.js';\n\n// ============================================================================\n// Component Extraction\n// ============================================================================\n\n/**\n * Extract all local component definitions from a source file\n *\n * Scans for:\n * - Variable declarations: `const Glenn = () => <h2>Glenn</h2>`\n * - Function declarations: `function Glenn() { return <h2>Glenn</h2> }`\n *\n * Components must:\n * - Have PascalCase names\n * - Be arrow functions, function expressions, or function declarations\n * - Return JSX\n */\nexport function extractLocalComponentDeclarations(\n sourceFile: SourceFile,\n ctx: RuntimeTransformContext\n): void {\n // Find variable declarations with PascalCase names that are arrow functions or function expressions\n for (const varDecl of sourceFile.getVariableDeclarations()) {\n const name = varDecl.getName();\n if (!isCustomComponent(name)) continue;\n\n const init = varDecl.getInitializer();\n if (!init) continue;\n\n if (Node.isArrowFunction(init) || Node.isFunctionExpression(init)) {\n ctx.localComponents.set(name, {\n name,\n declaration: varDecl,\n propNames: extractPropNames(init),\n });\n }\n }\n\n // Also check function declarations\n for (const funcDecl of sourceFile.getFunctions()) {\n const name = funcDecl.getName();\n if (!name || !isCustomComponent(name)) continue;\n\n ctx.localComponents.set(name, {\n name,\n declaration: funcDecl,\n propNames: extractFunctionPropNames(funcDecl),\n });\n }\n}\n\n/**\n * Extract external component declarations from imports\n *\n * Scans for relative imports that reference PascalCase components\n * and registers them in the context for build-time inlining.\n *\n * Supports:\n * - Default imports: `import Banner from './banner'`\n * - Named imports: `import { Header, Footer } from './ui'`\n */\nexport function extractExternalComponentDeclarations(\n sourceFile: SourceFile,\n ctx: RuntimeTransformContext\n): void {\n for (const importDecl of sourceFile.getImportDeclarations()) {\n const specifier = importDecl.getModuleSpecifierValue();\n\n // Skip non-relative imports (node_modules)\n if (!specifier.startsWith('.')) continue;\n\n // Process default imports\n const defaultImport = importDecl.getDefaultImport();\n if (defaultImport && isCustomComponent(defaultImport.getText())) {\n extractExternalComponent(defaultImport.getText(), importDecl, ctx, true);\n }\n\n // Process named imports\n for (const namedImport of importDecl.getNamedImports()) {\n const name = namedImport.getName();\n if (isCustomComponent(name)) {\n extractExternalComponent(name, importDecl, ctx, false);\n }\n }\n }\n}\n\n/**\n * Extract a single external component and add to context\n */\nfunction extractExternalComponent(\n name: string,\n importDecl: ImportDeclaration,\n ctx: RuntimeTransformContext,\n isDefault: boolean\n): void {\n // Skip if already defined locally (local definitions take precedence)\n if (ctx.localComponents.has(name)) return;\n\n const externalFile = importDecl.getModuleSpecifierSourceFile();\n if (!externalFile) {\n throw ctx.createError(`Cannot resolve import for '${name}'`, importDecl);\n }\n\n // Get exported declarations\n const exports = externalFile.getExportedDeclarations();\n const decls = isDefault ? exports.get('default') : exports.get(name);\n\n if (!decls || decls.length === 0) {\n throw ctx.createError(`Component '${name}' not exported from '${importDecl.getModuleSpecifierValue()}'`, importDecl);\n }\n\n const decl = decls[0];\n\n // Extract prop names from the component declaration\n const propNames = extractExternalPropNames(decl);\n\n // Store in localComponents (same map, isExternal flag differentiates)\n ctx.localComponents.set(name, {\n name,\n declaration: decl,\n propNames,\n sourceFilePath: externalFile.getFilePath(),\n isExternal: true,\n importPath: importDecl.getModuleSpecifierValue(),\n });\n}\n\n/**\n * Extract prop names from an external component declaration\n *\n * Handles both variable declarations (arrow functions) and function declarations.\n */\nfunction extractExternalPropNames(decl: Node): string[] {\n // Variable declaration with arrow function or function expression\n if (Node.isVariableDeclaration(decl)) {\n const init = decl.getInitializer();\n if (init && (Node.isArrowFunction(init) || Node.isFunctionExpression(init))) {\n return extractPropNames(init);\n }\n }\n\n // Function declaration\n if (Node.isFunctionDeclaration(decl)) {\n return extractFunctionPropNames(decl);\n }\n\n return [];\n}\n\n/**\n * Extract prop names from arrow function or function expression parameters\n */\nfunction extractPropNames(fn: ArrowFunction | FunctionExpression): string[] {\n const params = fn.getParameters();\n if (params.length === 0) return [];\n\n const firstParam = params[0];\n const bindingName = firstParam.getNameNode();\n\n // Destructured: ({ title, count, children }) => ...\n if (Node.isObjectBindingPattern(bindingName)) {\n return bindingName.getElements().map(el => el.getName());\n }\n\n // Simple: (props) => ...\n return [firstParam.getName()];\n}\n\n/**\n * Extract prop names from function declaration parameters\n */\nfunction extractFunctionPropNames(fn: FunctionDeclaration): string[] {\n const params = fn.getParameters();\n if (params.length === 0) return [];\n\n const firstParam = params[0];\n const bindingName = firstParam.getNameNode();\n\n // Destructured: function Foo({ title }) { ... }\n if (Node.isObjectBindingPattern(bindingName)) {\n return bindingName.getElements().map(el => el.getName());\n }\n\n // Simple: function Foo(props) { ... }\n return [firstParam.getName()];\n}\n\n// ============================================================================\n// JSX Extraction from Component\n// ============================================================================\n\n/**\n * Extract JSX from a component's body\n *\n * Handles:\n * - Arrow function with expression body: `() => <div>...</div>`\n * - Arrow function with block body: `() => { return <div>...</div> }`\n * - Function declaration: `function Foo() { return <div>...</div> }`\n */\nfunction extractJsxFromComponent(\n info: LocalComponentInfo\n): JsxElement | JsxSelfClosingElement | JsxFragment | null {\n const decl = info.declaration;\n\n // Variable declaration with arrow function or function expression\n if (Node.isVariableDeclaration(decl)) {\n const init = decl.getInitializer();\n if (!init) return null;\n\n if (Node.isArrowFunction(init)) {\n return extractJsxFromArrowFunction(init);\n }\n\n if (Node.isFunctionExpression(init)) {\n return extractJsxFromFunctionBody(init);\n }\n }\n\n // Function declaration\n if (Node.isFunctionDeclaration(decl)) {\n return extractJsxFromFunctionBody(decl);\n }\n\n return null;\n}\n\n/**\n * Extract JSX from arrow function\n */\nfunction extractJsxFromArrowFunction(fn: ArrowFunction): JsxElement | JsxSelfClosingElement | JsxFragment | null {\n const body = fn.getBody();\n\n // Expression body: () => <div>...</div>\n if (Node.isJsxElement(body) || Node.isJsxSelfClosingElement(body) || Node.isJsxFragment(body)) {\n return body;\n }\n\n // Parenthesized expression: () => (<div>...</div>)\n if (Node.isParenthesizedExpression(body)) {\n let inner = body.getExpression();\n while (Node.isParenthesizedExpression(inner)) {\n inner = inner.getExpression();\n }\n if (Node.isJsxElement(inner) || Node.isJsxSelfClosingElement(inner) || Node.isJsxFragment(inner)) {\n return inner;\n }\n }\n\n // Block body: () => { return <div>...</div> }\n if (Node.isBlock(body)) {\n return extractJsxFromBlock(body);\n }\n\n return null;\n}\n\n/**\n * Extract JSX from function body (function expression or declaration)\n */\nfunction extractJsxFromFunctionBody(fn: FunctionExpression | FunctionDeclaration): JsxElement | JsxSelfClosingElement | JsxFragment | null {\n const body = fn.getBody();\n if (!body || !Node.isBlock(body)) return null;\n return extractJsxFromBlock(body);\n}\n\n/**\n * Extract JSX from a block (looks for return statement)\n */\nfunction extractJsxFromBlock(block: Node): JsxElement | JsxSelfClosingElement | JsxFragment | null {\n let result: JsxElement | JsxSelfClosingElement | JsxFragment | null = null;\n\n block.forEachDescendant((node, traversal) => {\n if (Node.isReturnStatement(node)) {\n const expr = node.getExpression();\n if (expr) {\n // Unwrap parentheses\n let inner = expr;\n while (Node.isParenthesizedExpression(inner)) {\n inner = inner.getExpression();\n }\n\n if (Node.isJsxElement(inner) || Node.isJsxSelfClosingElement(inner) || Node.isJsxFragment(inner)) {\n result = inner;\n traversal.stop();\n }\n }\n }\n });\n\n return result;\n}\n\n// ============================================================================\n// Props Extraction from Usage Site\n// ============================================================================\n\n/**\n * Extract props from component usage site\n *\n * Handles:\n * - prop=\"value\" -> { prop: \"value\" }\n * - prop={123} -> { prop: 123 }\n * - prop={true} -> { prop: true }\n * - prop={{ key: \"value\" }} -> { prop: { key: \"value\" } }\n * - prop (no value) -> { prop: true }\n */\nfunction extractPropsFromUsage(\n node: JsxElement | JsxSelfClosingElement\n): Map<string, unknown> {\n const props = new Map<string, unknown>();\n const opening = Node.isJsxElement(node) ? node.getOpeningElement() : node;\n\n for (const attr of opening.getAttributes()) {\n if (!Node.isJsxAttribute(attr)) continue;\n\n const name = attr.getNameNode().getText();\n const init = attr.getInitializer();\n\n if (!init) {\n // Boolean shorthand: <Component enabled />\n props.set(name, true);\n } else if (Node.isStringLiteral(init)) {\n props.set(name, init.getLiteralValue());\n } else if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (expr) {\n props.set(name, extractJsonValue(expr));\n }\n }\n }\n\n return props;\n}\n\n// ============================================================================\n// Component Transformation\n// ============================================================================\n\n/**\n * Transform a local component usage to inlined JSX\n *\n * This is the main entry point called from runtime-dispatch.ts when\n * encountering a PascalCase element that matches a local component.\n */\nexport function transformLocalComponent(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext,\n transformRuntimeBlockChildren: (parent: JsxElement, ctx: RuntimeTransformContext) => BlockNode[]\n): BlockNode | BlockNode[] | null {\n const name = getElementName(node);\n const info = ctx.localComponents.get(name);\n if (!info) return null;\n\n // Circular reference detection\n if (ctx.componentExpansionStack.has(name)) {\n throw ctx.createError(`Circular component reference detected: ${name}`, node);\n }\n\n ctx.componentExpansionStack.add(name);\n\n // Save current context values\n const prevProps = ctx.componentProps;\n const prevChildren = ctx.componentChildren;\n\n try {\n // Get JSX from component (cache on first use)\n let jsx = info.jsx;\n if (!jsx) {\n const extracted = extractJsxFromComponent(info);\n if (!extracted) {\n throw ctx.createError(`Component '${name}' does not return JSX`, node);\n }\n jsx = extracted;\n info.jsx = extracted;\n }\n\n // Extract props from usage site\n const props = extractPropsFromUsage(node);\n\n // Extract children from usage site (for children prop support)\n const childrenBlocks = extractChildrenFromUsage(node, ctx, transformRuntimeBlockChildren);\n\n // Set component props and children in context for substitution\n ctx.componentProps = props;\n ctx.componentChildren = childrenBlocks;\n\n // Transform the component's JSX with prop substitution\n return transformComponentJsx(jsx, props, childrenBlocks, info.propNames, ctx, transformRuntimeBlockChildren);\n } finally {\n // Restore previous context values\n ctx.componentProps = prevProps;\n ctx.componentChildren = prevChildren;\n ctx.componentExpansionStack.delete(name);\n }\n}\n\n/**\n * Extract children from component usage for children prop\n */\nfunction extractChildrenFromUsage(\n node: JsxElement | JsxSelfClosingElement,\n ctx: RuntimeTransformContext,\n transformRuntimeBlockChildren: (parent: JsxElement, ctx: RuntimeTransformContext) => BlockNode[]\n): BlockNode[] | null {\n // Self-closing elements have no children\n if (Node.isJsxSelfClosingElement(node)) return null;\n\n // Get JSX children and transform them\n const jsxChildren = node.getJsxChildren();\n if (jsxChildren.length === 0) return null;\n\n // Check if there's any meaningful content\n const hasContent = jsxChildren.some(child => {\n if (Node.isJsxText(child)) {\n return child.getText().trim().length > 0;\n }\n return true;\n });\n\n if (!hasContent) return null;\n\n // Transform children using existing transformers\n return transformRuntimeBlockChildren(node, ctx);\n}\n\n/**\n * Transform component's JSX with prop substitution\n *\n * This walks the component's JSX and:\n * - Substitutes {propName} with actual values\n * - Substitutes {props.propName} with actual values\n * - Substitutes {children} with the children blocks\n */\nfunction transformComponentJsx(\n jsx: JsxElement | JsxSelfClosingElement | JsxFragment,\n props: Map<string, unknown>,\n childrenBlocks: BlockNode[] | null,\n propNames: string[],\n ctx: RuntimeTransformContext,\n transformRuntimeBlockChildren: (parent: JsxElement, ctx: RuntimeTransformContext) => BlockNode[]\n): BlockNode | BlockNode[] | null {\n // For fragments, transform all children and return as array\n if (Node.isJsxFragment(jsx)) {\n const blocks: BlockNode[] = [];\n for (const child of jsx.getJsxChildren()) {\n const block = transformComponentChild(child, props, childrenBlocks, propNames, ctx);\n if (block) {\n if (Array.isArray(block)) {\n blocks.push(...block);\n } else {\n blocks.push(block);\n }\n }\n }\n return blocks.length > 0 ? blocks : null;\n }\n\n // For single elements, transform directly\n return dispatchTransform(jsx, ctx);\n}\n\n/**\n * Transform a single child of the component's JSX\n */\nfunction transformComponentChild(\n child: Node,\n props: Map<string, unknown>,\n childrenBlocks: BlockNode[] | null,\n propNames: string[],\n ctx: RuntimeTransformContext\n): BlockNode | BlockNode[] | null {\n // Handle JSX expressions that might be {children}\n if (Node.isJsxExpression(child)) {\n const expr = child.getExpression();\n if (expr) {\n const text = expr.getText();\n // Check for {children} or {props.children}\n if (text === 'children' || text === 'props.children') {\n return childrenBlocks;\n }\n }\n }\n\n // For other nodes, use standard transformation\n return dispatchTransform(child, ctx);\n}\n","/**\n * Runtime Inline Transformer\n *\n * Inline content transformation with RuntimeVar interpolation.\n * When encountering property access expressions on RuntimeVar proxies,\n * emits jq expressions for runtime resolution.\n *\n * @example\n * // In TSX:\n * <p>Phase {ctx.phaseId}: {ctx.phaseName}</p>\n *\n * // Outputs:\n * Phase $(echo \"$CTX\" | jq -r '.phaseId'): $(echo \"$CTX\" | jq -r '.phaseName')\n */\n\nimport { Node, JsxElement } from 'ts-morph';\nimport type { InlineNode } from '../../ir/nodes.js';\nimport type { RuntimeTransformContext } from './runtime-types.js';\nimport { extractInlineText, getElementName, getAttributeValue } from '../utils/index.js';\nimport { extractAllText } from './html.js';\n\n// ============================================================================\n// Runtime Inline Children Transformation\n// ============================================================================\n\n/**\n * Transform JSX children to array of InlineNodes with RuntimeVar support\n *\n * Recognizes RuntimeVar property access and emits jq expressions for interpolation.\n */\nexport function transformRuntimeInlineChildren(\n node: JsxElement,\n ctx: RuntimeTransformContext\n): InlineNode[] {\n const children = node.getJsxChildren();\n const inlines: InlineNode[] = [];\n\n for (const child of children) {\n const inline = transformRuntimeToInline(child, ctx);\n if (inline) {\n // Handle arrays (from template literals)\n if (Array.isArray(inline)) {\n inlines.push(...inline);\n } else {\n inlines.push(inline);\n }\n }\n }\n\n // Trim leading/trailing whitespace from first and last text nodes\n trimBoundaryTextNodes(inlines);\n\n return inlines;\n}\n\n/**\n * Trim structural whitespace from boundary text nodes\n *\n * Only trims:\n * - Whitespace-only text nodes (structural)\n * - Leading newlines and their indentation (structural)\n *\n * Preserves:\n * - Single leading spaces that separate from previous inline elements\n * e.g., \"<b>Bold:</b> text\" should keep the space before \"text\"\n */\nfunction trimBoundaryTextNodes(inlines: InlineNode[]): void {\n if (inlines.length === 0) return;\n\n // Trim leading structural whitespace from first text node\n const first = inlines[0];\n if (first.kind === 'text') {\n // Only trim if whitespace-only or starts with newline (structural)\n if (/^\\s*$/.test(first.value)) {\n inlines.shift();\n } else if (/^\\n/.test(first.value)) {\n // Remove leading newlines but preserve inline spaces\n first.value = first.value.replace(/^\\n\\s*/, '');\n if (!first.value) inlines.shift();\n }\n // PRESERVE single leading spaces - they separate from previous inline\n }\n\n if (inlines.length === 0) return;\n\n // Trim trailing structural whitespace from last text node\n const last = inlines[inlines.length - 1];\n if (last.kind === 'text') {\n if (/^\\s*$/.test(last.value)) {\n inlines.pop();\n } else if (/\\n\\s*$/.test(last.value)) {\n // Remove trailing newlines but preserve inline spaces\n last.value = last.value.replace(/\\n\\s*$/, '');\n if (!last.value) inlines.pop();\n }\n // PRESERVE trailing spaces within content\n }\n}\n\n// ============================================================================\n// Node to Inline Transformation\n// ============================================================================\n\n/**\n * Transform a single node to InlineNode with RuntimeVar support\n */\nfunction transformRuntimeToInline(\n node: Node,\n ctx: RuntimeTransformContext\n): InlineNode | InlineNode[] | null {\n if (Node.isJsxText(node)) {\n const text = extractInlineText(node);\n if (!text) return null;\n return { kind: 'text', value: text };\n }\n\n if (Node.isJsxSelfClosingElement(node)) {\n const name = getElementName(node);\n if (name === 'br') {\n return { kind: 'lineBreak' };\n }\n throw ctx.createError(`Unsupported inline self-closing element: <${name}>`, node);\n }\n\n if (Node.isJsxElement(node)) {\n const name = getElementName(node);\n return transformRuntimeInlineElement(name, node, ctx);\n }\n\n // Handle JSX expressions - this is where RuntimeVar magic happens\n if (Node.isJsxExpression(node)) {\n const expr = node.getExpression();\n if (!expr) return null;\n\n // String literals: {' '} or {'text'}\n if (Node.isStringLiteral(expr)) {\n const value = expr.getLiteralValue();\n if (value) {\n return { kind: 'text', value };\n }\n return null;\n }\n\n // Template literals: {`Phase ${ctx.phaseId}`}\n if (Node.isTemplateExpression(expr)) {\n return transformTemplateLiteral(expr, ctx);\n }\n\n // No-substitution template literals: {`plain text`}\n if (Node.isNoSubstitutionTemplateLiteral(expr)) {\n const value = expr.getLiteralValue();\n if (value) {\n return { kind: 'text', value };\n }\n return null;\n }\n\n // Property access: ctx.phaseId, ctx.flags.gaps\n if (Node.isPropertyAccessExpression(expr)) {\n const result = transformPropertyAccess(expr, ctx);\n if (result) return result;\n }\n\n // Direct identifier reference: {iteration}, {userChoice}, or component props like {name}\n if (Node.isIdentifier(expr)) {\n const varName = expr.getText();\n\n // Check for component prop first\n if (ctx.componentProps && ctx.componentProps.has(varName)) {\n const propValue = ctx.componentProps.get(varName);\n if (propValue !== undefined && propValue !== null) {\n return { kind: 'text', value: String(propValue) };\n }\n }\n\n const runtimeVar = ctx.runtimeVars.get(varName);\n if (runtimeVar) {\n // This is a RuntimeVar reference - emit jq expression\n const value = `$(echo \"$${runtimeVar.varName}\" | jq -r '.')`;\n return { kind: 'text', value };\n }\n // Not a RuntimeVar or component prop - return raw text\n return { kind: 'text', value: varName };\n }\n\n // Binary expressions with === or !==: ctx.status === 'PASSED'\n if (Node.isBinaryExpression(expr)) {\n // Just render the expression as text - V3 handles conditions differently\n return { kind: 'text', value: expr.getText() };\n }\n\n // Unknown expression - render raw text\n return { kind: 'text', value: expr.getText() };\n }\n\n return null;\n}\n\n// ============================================================================\n// Property Access Transformation\n// ============================================================================\n\n/**\n * Collect property access path from a property access expression\n *\n * @example\n * ctx.user.name -> ['ctx', 'user', 'name']\n * ctx.flags.gaps -> ['ctx', 'flags', 'gaps']\n */\nfunction collectPropertyPath(expr: Node): string[] {\n const path: string[] = [];\n let current = expr;\n\n while (Node.isPropertyAccessExpression(current)) {\n path.unshift(current.getName());\n current = current.getExpression();\n }\n\n if (Node.isIdentifier(current)) {\n path.unshift(current.getText());\n }\n\n return path;\n}\n\n/**\n * Transform property access expression to inline node\n *\n * If the root identifier is a RuntimeVar, emit a jq expression.\n * If it's a component prop access (props.xxx), substitute the value.\n * Otherwise, return the raw text.\n */\nfunction transformPropertyAccess(\n expr: Node,\n ctx: RuntimeTransformContext\n): InlineNode | null {\n if (!Node.isPropertyAccessExpression(expr)) return null;\n\n const path = collectPropertyPath(expr);\n if (path.length === 0) return null;\n\n const rootName = path[0];\n\n // Check for component prop access: props.xxx\n if (rootName === 'props' && path.length >= 2 && ctx.componentProps) {\n const propName = path[1];\n if (ctx.componentProps.has(propName)) {\n const propValue = ctx.componentProps.get(propName);\n if (propValue !== undefined && propValue !== null) {\n return { kind: 'text', value: String(propValue) };\n }\n return null;\n }\n }\n\n const runtimeVar = ctx.runtimeVars.get(rootName);\n\n if (runtimeVar) {\n // This is a RuntimeVar reference - emit jq expression\n const jqPath = path.slice(1);\n const jqSelector = jqPath.length === 0 ? '.' : '.' + jqPath.join('.');\n const value = `$(echo \"$${runtimeVar.varName}\" | jq -r '${jqSelector}')`;\n return { kind: 'text', value };\n }\n\n // Not a RuntimeVar - return raw text\n return { kind: 'text', value: expr.getText() };\n}\n\n// ============================================================================\n// Template Literal Transformation\n// ============================================================================\n\n/**\n * Transform template literal with embedded expressions\n *\n * @example\n * `Phase ${ctx.phaseId}: ${ctx.phaseName}`\n * -> [\"Phase \", $(jq), \": \", $(jq)]\n */\nfunction transformTemplateLiteral(\n expr: Node,\n ctx: RuntimeTransformContext\n): InlineNode[] {\n if (!Node.isTemplateExpression(expr)) return [];\n\n const result: InlineNode[] = [];\n\n // Head text\n const head = expr.getHead();\n const headText = head.getLiteralText();\n if (headText) {\n result.push({ kind: 'text', value: headText });\n }\n\n // Template spans\n for (const span of expr.getTemplateSpans()) {\n // Expression in ${...}\n const spanExpr = span.getExpression();\n if (spanExpr) {\n if (Node.isPropertyAccessExpression(spanExpr)) {\n const inline = transformPropertyAccess(spanExpr, ctx);\n if (inline) result.push(inline);\n } else if (Node.isIdentifier(spanExpr)) {\n const varName = spanExpr.getText();\n\n // Check for component prop first\n if (ctx.componentProps && ctx.componentProps.has(varName)) {\n const propValue = ctx.componentProps.get(varName);\n if (propValue !== undefined && propValue !== null) {\n result.push({ kind: 'text', value: String(propValue) });\n }\n } else {\n // Check if it's a RuntimeVar\n const runtimeVar = ctx.runtimeVars.get(varName);\n if (runtimeVar) {\n const value = `$(echo \"$${runtimeVar.varName}\" | jq -r '.')`;\n result.push({ kind: 'text', value });\n } else {\n result.push({ kind: 'text', value: varName });\n }\n }\n } else {\n // Other expression - render raw\n result.push({ kind: 'text', value: spanExpr.getText() });\n }\n }\n\n // Trailing text in this span\n const literal = span.getLiteral();\n const literalText = literal.getLiteralText();\n if (literalText) {\n result.push({ kind: 'text', value: literalText });\n }\n }\n\n return result;\n}\n\n// ============================================================================\n// Inline Element Transformation\n// ============================================================================\n\n/**\n * Transform inline JSX element to InlineNode\n * Handles b, i, strong, em, code, a\n */\nfunction transformRuntimeInlineElement(\n name: string,\n node: JsxElement,\n ctx: RuntimeTransformContext\n): InlineNode {\n // Bold\n if (name === 'b' || name === 'strong') {\n return { kind: 'bold', children: transformRuntimeInlineChildren(node, ctx) };\n }\n\n // Italic\n if (name === 'i' || name === 'em') {\n return { kind: 'italic', children: transformRuntimeInlineChildren(node, ctx) };\n }\n\n // Inline code\n if (name === 'code') {\n // For code elements, we need to handle RuntimeVar interpolation too\n const children = node.getJsxChildren();\n const parts: string[] = [];\n\n for (const child of children) {\n if (Node.isJsxText(child)) {\n const text = child.getText();\n if (text) parts.push(text);\n } else if (Node.isJsxExpression(child)) {\n const expr = child.getExpression();\n if (expr) {\n if (Node.isStringLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (Node.isPropertyAccessExpression(expr)) {\n const inline = transformPropertyAccess(expr, ctx);\n if (inline && inline.kind === 'text') {\n parts.push(inline.value);\n }\n } else {\n parts.push(expr.getText());\n }\n }\n }\n }\n\n return { kind: 'inlineCode', value: parts.join('') };\n }\n\n // Link\n if (name === 'a') {\n const href = getAttributeValue(node.getOpeningElement(), 'href');\n if (!href) {\n throw ctx.createError('<a> element requires href attribute', node);\n }\n const children = transformRuntimeInlineChildren(node, ctx);\n return { kind: 'link', url: href, children };\n }\n\n throw ctx.createError(`Unsupported inline element: <${name}>`, node);\n}\n","/**\n * Transformer modules - JSX AST to IR transformation\n *\n * This directory contains the modularized transformer functions\n * extracted from the monolithic transformer.ts file.\n *\n * Architecture:\n * - types.ts: Shared type definitions (TransformContext, RenderPropsContext)\n * - shared.ts: Pure utility functions and constants\n * - dispatch.ts: Central routing to prevent circular imports\n * - [future modules]: Specialized transformer functions by domain\n *\n * NOTE: This is the foundation structure for Plan 26-02.\n * Individual transformer modules will be added in Plan 26-03/04.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type { TransformContext, RenderPropsContext } from './types.js';\n\n// ============================================================================\n// Shared Utilities\n// ============================================================================\n\nexport {\n // Utility functions\n toSnakeCase,\n isCustomComponent,\n isInlineElement,\n isValidXmlName,\n transformInlineNodes,\n // Constants\n HTML_ELEMENTS,\n INLINE_ELEMENTS,\n SPECIAL_COMPONENTS,\n} from './shared.js';\n\n// ============================================================================\n// Dispatch (recursive transform entry point)\n// ============================================================================\n\nexport { transformToBlock, transformBlockChildren } from './dispatch.js';\n\n// ============================================================================\n// Document Transformers (Plan 26-03)\n// ============================================================================\n\nexport {\n transformCommand,\n transformAgent,\n transformSkill,\n processSkillChildren,\n transformSkillFile,\n transformSkillStatic,\n transformMCPConfig,\n transformMCPServer,\n transformState,\n transformOperation,\n transformArrowFunctionBody,\n} from './document.js';\n\n// ============================================================================\n// HTML Element Transformers (Plan 26-03)\n// ============================================================================\n\nexport {\n transformList,\n transformListItem,\n transformBlockquote,\n transformCodeBlock,\n extractCodeContent,\n transformDiv,\n transformMixedChildren,\n extractAllText,\n} from './html.js';\n\n// ============================================================================\n// Inline Transformers (Plan 26-03)\n// ============================================================================\n\nexport {\n transformInlineChildren,\n transformToInline,\n transformInlineElement,\n transformLink,\n trimBoundaryTextNodes,\n} from './inline.js';\n\n// ============================================================================\n// Semantic Component Transformers (Plan 26-03)\n// ============================================================================\n\nexport {\n transformTable,\n parseRowsAttribute,\n transformPropList,\n transformExecutionContext,\n transformSuccessCriteria,\n parseSuccessCriteriaItems,\n transformOfferNext,\n parseOfferNextRoutes,\n transformXmlSection,\n transformXmlWrapper,\n} from './semantic.js';\n\n// ============================================================================\n// Control Flow Transformers (Plan 26-03)\n// ============================================================================\n\nexport {\n transformIf,\n transformElse,\n transformLoop,\n transformOnStatus,\n extractOutputDeclarations,\n extractStateRefDeclarations,\n} from './control.js';\n\n// ============================================================================\n// Future Transformer Modules (Plan 26-04+)\n// ============================================================================\n//\n// The following modules will be added as transformer.ts is refactored:\n//\n// Agent spawning transformers:\n// - transformSpawnAgent, extractAgentProp, etc.\n//\n// Variable transformers:\n// - transformAssign, transformAssignGroup\n//\n// State transformers:\n// - transformReadState, transformWriteState\n//\n// Primitive transformers:\n// - transformStep, transformBash, transformReadFiles, transformPromptTemplate\n//\n// Markdown transformers:\n// - transformMarkdown, transformXmlBlock\n\n// ============================================================================\n// SpawnAgent Transformers (Plan 26-04)\n// ============================================================================\n\nexport {\n transformSpawnAgent,\n} from './spawner.js';\n\n// ============================================================================\n// Variable Transformers (Plan 26-04)\n// ============================================================================\n\nexport {\n transformAssign,\n transformAssignGroup,\n} from './variables.js';\n\n// ============================================================================\n// State Transformers (Plan 26-04)\n// ============================================================================\n\nexport {\n transformReadState,\n transformWriteState,\n} from './state.js';\n\n// ============================================================================\n// Primitive Transformers (Plan 26-04)\n// ============================================================================\n\nexport {\n transformStep,\n transformBash,\n transformReadFiles,\n transformPromptTemplate,\n} from './primitives.js';\n\n// ============================================================================\n// Markdown Transformers (Plan 26-04)\n// ============================================================================\n\nexport {\n transformMarkdown,\n transformXmlBlock,\n transformCustomComponent,\n extractTemplateText,\n} from './markdown.js';\n\n// ============================================================================\n// Runtime Transformers\n// ============================================================================\n\nexport * from './runtime-index.js';\n","/**\n * Document-level transformer functions\n *\n * Transforms top-level document components:\n * - Command → DocumentNode\n * - Agent → AgentDocumentNode\n * - Skill → SkillDocumentNode\n * - MCPConfig → MCPConfigDocumentNode\n * - State → StateDocumentNode\n *\n * Extracted from Transformer class for maintainability and modularity.\n */\n\nimport {\n Node,\n JsxElement,\n JsxSelfClosingElement,\n JsxOpeningElement,\n ArrowFunction,\n} from 'ts-morph';\nimport type {\n DocumentNode,\n AgentDocumentNode,\n SkillDocumentNode,\n MCPConfigDocumentNode,\n StateDocumentNode,\n FrontmatterNode,\n AgentFrontmatterNode,\n SkillFrontmatterNode,\n SkillFileNode,\n SkillStaticNode,\n MCPServerNode,\n StateNode,\n OperationNode,\n StateSchema,\n BlockNode,\n BaseBlockNode,\n TypeReference,\n} from '../../ir/index.js';\nimport {\n getElementName,\n getAttributeValue,\n getArrayAttributeValue,\n extractText,\n resolveSpreadAttribute,\n extractTypeArguments,\n analyzeRenderPropsChildren,\n extractStateSchema,\n extractSqlArguments,\n} from '../utils/index.js';\nimport type { TransformContext } from './types.js';\nimport { transformBlockChildren as dispatchTransformBlockChildren } from './dispatch.js';\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get transformBlockChildren function - uses context version if provided (V1),\n * otherwise falls back to dispatch.js version (V3 runtime).\n * This allows document transformers to work in both contexts.\n */\nfunction getTransformBlockChildren(ctx: TransformContext) {\n return ctx.transformBlockChildren ?? dispatchTransformBlockChildren;\n}\n\n/**\n * Merge Command/Agent props from spread attributes and explicit attributes\n */\nfunction mergeCommandProps(\n opening: JsxOpeningElement | JsxSelfClosingElement\n): Record<string, unknown> {\n const merged: Record<string, unknown> = {};\n\n for (const attr of opening.getAttributes()) {\n if (Node.isJsxSpreadAttribute(attr)) {\n // Resolve spread and merge\n const spreadProps = resolveSpreadAttribute(attr);\n Object.assign(merged, spreadProps);\n } else if (Node.isJsxAttribute(attr)) {\n // Explicit prop\n const attrName = attr.getNameNode().getText();\n\n // Try string value first\n const stringValue = getAttributeValue(opening, attrName);\n if (stringValue !== undefined) {\n merged[attrName] = stringValue;\n continue;\n }\n\n // Try array value\n const arrayValue = getArrayAttributeValue(opening, attrName);\n if (arrayValue !== undefined) {\n merged[attrName] = arrayValue;\n }\n }\n }\n\n return merged;\n}\n\n/**\n * Get boolean attribute value from JSX element\n * Handles both boolean shorthand (disableModelInvocation) and explicit value (disableModelInvocation={true})\n */\nfunction getBooleanAttribute(\n element: JsxOpeningElement | JsxSelfClosingElement,\n name: string\n): boolean | undefined {\n const attr = element.getAttribute(name);\n if (!attr || !Node.isJsxAttribute(attr)) return undefined;\n\n const init = attr.getInitializer();\n // Boolean attribute without value: disableModelInvocation (means true)\n if (!init) return true;\n\n // JSX expression: disableModelInvocation={true}\n if (Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (expr && (expr.getText() === 'true' || expr.getText() === 'false')) {\n return expr.getText() === 'true';\n }\n }\n\n return undefined;\n}\n\n/**\n * Check if an attribute exists on an element (regardless of value)\n */\nfunction hasAttribute(\n element: JsxOpeningElement | JsxSelfClosingElement,\n name: string\n): boolean {\n const attr = element.getAttribute(name);\n return attr !== undefined;\n}\n\n/**\n * Extract array attribute value (e.g., args={[\"a\", \"b\"]})\n */\nfunction extractArrayAttribute(\n openingElement: JsxOpeningElement | JsxSelfClosingElement,\n name: string\n): string[] | undefined {\n const attr = openingElement.getAttribute(name);\n if (!attr || !Node.isJsxAttribute(attr)) return undefined;\n\n const initializer = attr.getInitializer();\n if (!initializer || !Node.isJsxExpression(initializer)) return undefined;\n\n const expr = initializer.getExpression();\n if (!expr || !Node.isArrayLiteralExpression(expr)) return undefined;\n\n return expr.getElements().map(el => {\n if (Node.isStringLiteral(el)) {\n return el.getLiteralText();\n }\n // Handle template literals or other expressions - preserve as-is\n return el.getText();\n });\n}\n\n/**\n * Extract object attribute value (e.g., env={{ KEY: \"value\" }})\n * Resolves process.env.X references at build time\n */\nfunction extractObjectAttribute(\n openingElement: JsxOpeningElement | JsxSelfClosingElement,\n name: string,\n ctx: TransformContext\n): Record<string, string> | undefined {\n const attr = openingElement.getAttribute(name);\n if (!attr || !Node.isJsxAttribute(attr)) return undefined;\n\n const initializer = attr.getInitializer();\n if (!initializer || !Node.isJsxExpression(initializer)) return undefined;\n\n const expr = initializer.getExpression();\n if (!expr || !Node.isObjectLiteralExpression(expr)) return undefined;\n\n const result: Record<string, string> = {};\n\n for (const prop of expr.getProperties()) {\n if (!Node.isPropertyAssignment(prop)) continue;\n\n const key = prop.getName();\n const valueExpr = prop.getInitializer();\n if (!valueExpr) continue;\n\n // Handle process.env.X\n if (Node.isPropertyAccessExpression(valueExpr)) {\n const text = valueExpr.getText();\n if (text.startsWith('process.env.')) {\n const envVar = text.replace('process.env.', '');\n const envValue = process.env[envVar];\n if (envValue === undefined) {\n throw ctx.createError(\n `Environment variable '${envVar}' is not defined`,\n openingElement\n );\n }\n result[key] = envValue;\n continue;\n }\n }\n\n if (Node.isStringLiteral(valueExpr)) {\n result[key] = valueExpr.getLiteralText();\n } else {\n // Preserve expressions as-is (e.g., template literals)\n // Strip surrounding quotes if present\n result[key] = valueExpr.getText().replace(/^[\"']|[\"']$/g, '');\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\n/**\n * Transform arrow function body to IR blocks\n * Handles both block body { return ... } and expression body\n * Used for render props pattern in Command/Agent\n */\nexport function transformArrowFunctionBody(\n arrowFn: ArrowFunction,\n ctx: TransformContext\n): BlockNode[] {\n const body = arrowFn.getBody();\n\n // Handle block body: { return <div>...</div>; }\n if (Node.isBlock(body)) {\n const returnStmt = body.getStatements()\n .find(stmt => Node.isReturnStatement(stmt));\n\n if (returnStmt && Node.isReturnStatement(returnStmt)) {\n const returnExpr = returnStmt.getExpression();\n if (returnExpr) {\n // Check if it's JSX\n if (Node.isJsxElement(returnExpr) || Node.isJsxSelfClosingElement(returnExpr)) {\n // We'll need dispatchBlockTransform for this\n throw new Error('transformArrowFunctionBody: JSX element transformation requires dispatch (Plan 26-04)');\n }\n if (Node.isJsxFragment(returnExpr)) {\n return getTransformBlockChildren(ctx)(returnExpr.getJsxChildren(), ctx);\n }\n // Handle parenthesized JSX: return (<div>...</div>)\n if (Node.isParenthesizedExpression(returnExpr)) {\n const inner = returnExpr.getExpression();\n if (Node.isJsxElement(inner) || Node.isJsxSelfClosingElement(inner)) {\n throw new Error('transformArrowFunctionBody: JSX element transformation requires dispatch (Plan 26-04)');\n }\n if (Node.isJsxFragment(inner)) {\n return getTransformBlockChildren(ctx)(inner.getJsxChildren(), ctx);\n }\n }\n }\n }\n return [];\n }\n\n // Handle expression body: (ctx) => <div>...</div>\n if (Node.isJsxElement(body) || Node.isJsxSelfClosingElement(body)) {\n throw new Error('transformArrowFunctionBody: JSX element transformation requires dispatch (Plan 26-04)');\n }\n if (Node.isJsxFragment(body)) {\n return getTransformBlockChildren(ctx)(body.getJsxChildren(), ctx);\n }\n // Handle parenthesized expression body: (ctx) => (<div>...</div>)\n if (Node.isParenthesizedExpression(body)) {\n const inner = body.getExpression();\n if (Node.isJsxElement(inner) || Node.isJsxSelfClosingElement(inner)) {\n throw new Error('transformArrowFunctionBody: JSX element transformation requires dispatch (Plan 26-04)');\n }\n if (Node.isJsxFragment(inner)) {\n return getTransformBlockChildren(ctx)(inner.getJsxChildren(), ctx);\n }\n }\n\n return [];\n}\n\n// ============================================================================\n// Command Transformer\n// ============================================================================\n\n/**\n * Transform a Command element to DocumentNode with frontmatter\n */\nexport function transformCommand(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): DocumentNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Merge all props (spread + explicit)\n const props = mergeCommandProps(openingElement);\n\n // Extract required props\n const name = props.name as string | undefined;\n const description = props.description as string | undefined;\n\n if (!name) {\n throw ctx.createError('Command requires name prop', openingElement);\n }\n if (!description) {\n throw ctx.createError('Command requires description prop', openingElement);\n }\n\n // Build frontmatter data\n const data: Record<string, unknown> = {\n name,\n description,\n };\n\n // Optional string props\n const argumentHint = props.argumentHint as string | undefined;\n if (argumentHint) {\n data['argument-hint'] = argumentHint;\n }\n\n const agent = props.agent as string | undefined;\n if (agent) {\n data['agent'] = agent;\n }\n\n // Optional folder prop (for subdirectory output path - not stored in frontmatter)\n const folder = props.folder as string | undefined;\n\n // Optional array prop (check for allowedTools, map to allowed-tools)\n const allowedTools = props.allowedTools as string[] | undefined;\n if (allowedTools) {\n data['allowed-tools'] = allowedTools;\n }\n\n // Optional arguments array (command arguments)\n const args = props.arguments as Array<{ name: string; description: string; required?: boolean }> | undefined;\n if (args && args.length > 0) {\n data['arguments'] = args;\n }\n\n const frontmatter: FrontmatterNode = { kind: 'frontmatter', data };\n\n // Transform children - check for render props pattern\n let children: BlockNode[] = [];\n if (Node.isJsxElement(node)) {\n const renderPropsInfo = analyzeRenderPropsChildren(node);\n\n if (renderPropsInfo.isRenderProps && renderPropsInfo.arrowFunction && renderPropsInfo.paramName) {\n // Build context values for interpolation\n // outputPath and sourcePath use placeholders - they're computed at build time\n const sourcePath = ctx.sourceFile?.getFilePath() ?? '';\n // Output path follows convention: .claude/commands/{folder?/}{name}.md\n const outputPath = folder\n ? `.claude/commands/${folder}/${name}.md`\n : `.claude/commands/${name}.md`;\n\n ctx.renderPropsContext = {\n paramName: renderPropsInfo.paramName,\n values: {\n name,\n description,\n ...(folder && { folder }),\n outputPath,\n sourcePath,\n },\n };\n\n // Render props pattern: transform arrow function body\n children = transformArrowFunctionBody(renderPropsInfo.arrowFunction, ctx);\n\n // Clear context after transformation\n ctx.renderPropsContext = undefined;\n } else {\n // Regular children pattern\n children = getTransformBlockChildren(ctx)(node.getJsxChildren(), ctx);\n }\n }\n\n return {\n kind: 'document',\n frontmatter,\n metadata: folder ? { folder } : undefined,\n runtimeVars: [], // V1 doesn't use runtime vars\n runtimeFunctions: [], // V1 doesn't use runtime functions\n children\n };\n}\n\n// ============================================================================\n// Agent Transformer\n// ============================================================================\n\n/**\n * Transform an Agent element to AgentDocumentNode with frontmatter\n */\nexport function transformAgent(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): AgentDocumentNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract required props\n const name = getAttributeValue(openingElement, 'name');\n const description = getAttributeValue(openingElement, 'description');\n\n if (!name) {\n throw ctx.createError('Agent requires name prop', openingElement);\n }\n if (!description) {\n throw ctx.createError('Agent requires description prop', openingElement);\n }\n\n // Extract optional props\n const tools = getAttributeValue(openingElement, 'tools');\n const color = getAttributeValue(openingElement, 'color');\n\n // Extract generic type arguments if present (TInput, TOutput)\n const typeArgs = extractTypeArguments(node);\n let inputType: TypeReference | undefined;\n let outputType: TypeReference | undefined;\n\n if (typeArgs && typeArgs.length > 0) {\n inputType = {\n kind: 'typeReference',\n name: typeArgs[0],\n resolved: false, // Will be resolved in validation phase\n };\n }\n if (typeArgs && typeArgs.length > 1) {\n outputType = {\n kind: 'typeReference',\n name: typeArgs[1],\n resolved: false, // Will be resolved in validation phase\n };\n }\n\n // Build frontmatter (using spread for optional fields)\n const frontmatter: AgentFrontmatterNode = {\n kind: 'agentFrontmatter',\n name,\n description,\n ...(tools && { tools }),\n ...(color && { color }),\n ...(inputType && { inputType }),\n ...(outputType && { outputType }),\n };\n\n // Transform children - check for render props pattern\n let children: BlockNode[] = [];\n if (Node.isJsxElement(node)) {\n const renderPropsInfo = analyzeRenderPropsChildren(node);\n\n if (renderPropsInfo.isRenderProps && renderPropsInfo.arrowFunction) {\n // Build context values for interpolation (only if paramName is defined)\n if (renderPropsInfo.paramName) {\n const sourcePath = ctx.sourceFile?.getFilePath() ?? '';\n // Output path follows convention: .claude/agents/{name}.md\n const outputPath = `.claude/agents/${name}.md`;\n\n ctx.renderPropsContext = {\n paramName: renderPropsInfo.paramName,\n values: {\n name,\n description,\n outputPath,\n sourcePath,\n },\n };\n }\n\n // Render props pattern: transform arrow function body\n children = transformArrowFunctionBody(renderPropsInfo.arrowFunction, ctx);\n\n // Clear context after transformation\n ctx.renderPropsContext = undefined;\n } else {\n // Regular children pattern\n children = getTransformBlockChildren(ctx)(node.getJsxChildren(), ctx);\n }\n }\n\n return { kind: 'agentDocument', frontmatter, children: children as BaseBlockNode[] };\n}\n\n// ============================================================================\n// Skill Transformer\n// ============================================================================\n\n/**\n * Transform a Skill element to SkillDocumentNode with frontmatter, body, files, and statics\n */\nexport function transformSkill(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): SkillDocumentNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n // Extract required props\n const name = getAttributeValue(openingElement, 'name');\n const description = getAttributeValue(openingElement, 'description');\n\n if (!name) {\n throw ctx.createError('Skill requires name prop', openingElement);\n }\n if (!description) {\n throw ctx.createError('Skill requires description prop', openingElement);\n }\n\n // Validate skill name (lowercase, numbers, hyphens only)\n if (!/^[a-z0-9-]+$/.test(name)) {\n throw ctx.createError(\n `Skill name must be lowercase letters, numbers, and hyphens only: '${name}'`,\n openingElement\n );\n }\n\n // Extract optional props\n const disableModelInvocation = getBooleanAttribute(openingElement, 'disableModelInvocation');\n const userInvocable = getBooleanAttribute(openingElement, 'userInvocable');\n const allowedTools = getArrayAttributeValue(openingElement, 'allowedTools');\n const argumentHint = getAttributeValue(openingElement, 'argumentHint');\n const model = getAttributeValue(openingElement, 'model');\n const context = getAttributeValue(openingElement, 'context') as 'fork' | undefined;\n const agent = getAttributeValue(openingElement, 'agent');\n\n // Build frontmatter\n const frontmatter: SkillFrontmatterNode = {\n kind: 'skillFrontmatter',\n name,\n description,\n ...(disableModelInvocation !== undefined && { disableModelInvocation }),\n ...(userInvocable !== undefined && { userInvocable }),\n ...(allowedTools && allowedTools.length > 0 && { allowedTools }),\n ...(argumentHint && { argumentHint }),\n ...(model && { model }),\n ...(context && { context }),\n ...(agent && { agent }),\n };\n\n // Process children: separate body content, SkillFile, and SkillStatic\n const { children, files, statics } = processSkillChildren(node, ctx);\n\n return {\n kind: 'skillDocument',\n frontmatter,\n children: children as BaseBlockNode[],\n files,\n statics,\n };\n}\n\n/**\n * Process Skill children into body content, SkillFile nodes, and SkillStatic nodes\n */\nexport function processSkillChildren(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): {\n children: BlockNode[];\n files: SkillFileNode[];\n statics: SkillStaticNode[];\n} {\n if (Node.isJsxSelfClosingElement(node)) {\n return { children: [], files: [], statics: [] };\n }\n\n const children: BlockNode[] = [];\n const files: SkillFileNode[] = [];\n const statics: SkillStaticNode[] = [];\n const jsxChildren = node.getJsxChildren();\n\n for (const child of jsxChildren) {\n // Skip whitespace-only text\n if (Node.isJsxText(child)) {\n const text = extractText(child);\n if (!text) continue;\n }\n\n if (Node.isJsxElement(child) || Node.isJsxSelfClosingElement(child)) {\n const childName = getElementName(child);\n\n if (childName === 'SkillFile') {\n files.push(transformSkillFile(child, ctx));\n continue;\n }\n\n if (childName === 'SkillStatic') {\n statics.push(transformSkillStatic(child, ctx));\n continue;\n }\n }\n\n // Regular body content - requires dispatch (Plan 26-04)\n throw new Error('processSkillChildren: transformToBlock requires dispatch (Plan 26-04)');\n }\n\n return { children, files, statics };\n}\n\n/**\n * Transform SkillFile element to SkillFileNode\n */\nexport function transformSkillFile(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): SkillFileNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n const name = getAttributeValue(openingElement, 'name');\n if (!name) {\n throw ctx.createError('SkillFile requires name prop', openingElement);\n }\n\n // Transform children as file content\n const children = Node.isJsxElement(node)\n ? getTransformBlockChildren(ctx)(node.getJsxChildren(), ctx)\n : [];\n\n return {\n kind: 'skillFile',\n name,\n children: children as BaseBlockNode[],\n };\n}\n\n/**\n * Transform SkillStatic element to SkillStaticNode\n */\nexport function transformSkillStatic(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): SkillStaticNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n const src = getAttributeValue(openingElement, 'src');\n if (!src) {\n throw ctx.createError('SkillStatic requires src prop', openingElement);\n }\n\n const dest = getAttributeValue(openingElement, 'dest');\n\n return {\n kind: 'skillStatic',\n src,\n ...(dest && { dest }),\n };\n}\n\n// ============================================================================\n// MCPConfig Transformer\n// ============================================================================\n\n/**\n * Transform an MCPConfig element to MCPConfigDocumentNode\n */\nexport function transformMCPConfig(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): MCPConfigDocumentNode {\n const servers: MCPServerNode[] = [];\n\n // Process children - expect MCPServer elements\n if (Node.isJsxElement(node)) {\n for (const child of node.getJsxChildren()) {\n // Skip whitespace-only text\n if (Node.isJsxText(child)) {\n const text = extractText(child);\n if (!text) continue;\n }\n\n if (Node.isJsxElement(child) || Node.isJsxSelfClosingElement(child)) {\n const tagName = getElementName(child);\n\n if (tagName === 'MCPServer' || tagName === 'MCPStdioServer' || tagName === 'MCPHTTPServer') {\n servers.push(transformMCPServer(child, ctx));\n } else {\n throw ctx.createError(\n `MCPConfig can only contain MCPServer, MCPStdioServer, or MCPHTTPServer elements. Got: <${tagName}>`,\n child\n );\n }\n }\n }\n }\n\n if (servers.length === 0) {\n throw ctx.createError('MCPConfig must contain at least one MCP server', node);\n }\n\n return {\n kind: 'mcpConfigDocument',\n servers,\n };\n}\n\n/**\n * Transform an MCPServer, MCPStdioServer, or MCPHTTPServer element to MCPServerNode\n * Validates prop combinations at compile time based on transport type\n */\nexport function transformMCPServer(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): MCPServerNode {\n const openingElement = Node.isJsxElement(node)\n ? node.getOpeningElement()\n : node;\n\n const tagName = getElementName(node);\n\n // Get name (required for all)\n const name = getAttributeValue(openingElement, 'name');\n if (!name) {\n throw ctx.createError(`${tagName} requires name prop`, openingElement);\n }\n\n // Determine type based on tag name or explicit prop\n let type: 'stdio' | 'http' | 'sse';\n if (tagName === 'MCPStdioServer') {\n type = 'stdio';\n } else if (tagName === 'MCPHTTPServer') {\n type = 'http';\n } else {\n const typeProp = getAttributeValue(openingElement, 'type') as 'stdio' | 'http' | 'sse' | undefined;\n if (!typeProp) {\n throw ctx.createError('MCPServer requires type prop', openingElement);\n }\n if (!['stdio', 'http', 'sse'].includes(typeProp)) {\n throw ctx.createError(\n `MCPServer type must be 'stdio', 'http', or 'sse'. Got: '${typeProp}'`,\n openingElement\n );\n }\n type = typeProp;\n }\n\n // Type-specific validation and extraction\n if (type === 'stdio') {\n const command = getAttributeValue(openingElement, 'command');\n if (!command) {\n throw ctx.createError(\n `${tagName} type=\"stdio\" requires command prop`,\n openingElement\n );\n }\n if (getAttributeValue(openingElement, 'url')) {\n throw ctx.createError(\n `${tagName} type=\"stdio\" cannot have url prop`,\n openingElement\n );\n }\n if (hasAttribute(openingElement, 'headers')) {\n throw ctx.createError(\n `${tagName} type=\"stdio\" cannot have headers prop`,\n openingElement\n );\n }\n\n // Extract stdio-specific props\n const args = extractArrayAttribute(openingElement, 'args');\n const env = extractObjectAttribute(openingElement, 'env', ctx);\n\n const result: MCPServerNode = {\n kind: 'mcpServer',\n name,\n type,\n command,\n };\n if (args) result.args = args;\n if (env) result.env = env;\n return result;\n } else {\n // http or sse\n const url = getAttributeValue(openingElement, 'url');\n if (!url) {\n throw ctx.createError(\n `${tagName} type=\"${type}\" requires url prop`,\n openingElement\n );\n }\n if (getAttributeValue(openingElement, 'command')) {\n throw ctx.createError(\n `${tagName} type=\"${type}\" cannot have command prop`,\n openingElement\n );\n }\n if (hasAttribute(openingElement, 'args')) {\n throw ctx.createError(\n `${tagName} type=\"${type}\" cannot have args prop`,\n openingElement\n );\n }\n\n // Extract http/sse-specific props\n const headers = extractObjectAttribute(openingElement, 'headers', ctx);\n\n const result: MCPServerNode = {\n kind: 'mcpServer',\n name,\n type,\n url,\n };\n if (headers) result.headers = headers;\n return result;\n }\n}\n\n// ============================================================================\n// State Transformer\n// ============================================================================\n\n/**\n * Transform a State element to StateDocumentNode\n */\nexport function transformState(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): StateDocumentNode {\n const opening = Node.isJsxElement(node) ? node.getOpeningElement() : node;\n\n // Extract required props\n const name = getAttributeValue(opening, 'name');\n if (!name) {\n throw ctx.createError('State component requires name prop', node);\n }\n\n const provider = getAttributeValue(opening, 'provider');\n if (provider !== 'sqlite') {\n throw ctx.createError('State component only supports provider=\"sqlite\"', node);\n }\n\n // Extract config prop (object literal)\n const configAttr = opening.getAttribute('config');\n let database = '.state/state.db'; // default\n if (configAttr && Node.isJsxAttribute(configAttr)) {\n const init = configAttr.getInitializer();\n if (init && Node.isJsxExpression(init)) {\n const expr = init.getExpression();\n if (expr && Node.isObjectLiteralExpression(expr)) {\n for (const prop of expr.getProperties()) {\n if (Node.isPropertyAssignment(prop)) {\n const propName = prop.getName();\n if (propName === 'database') {\n const propInit = prop.getInitializer();\n if (propInit && Node.isStringLiteral(propInit)) {\n database = propInit.getLiteralValue();\n }\n }\n }\n }\n }\n }\n }\n\n // Extract schema from generic type parameter\n let schema: StateSchema = { interfaceName: 'unknown', fields: [] };\n if (ctx.sourceFile) {\n const typeArgs = extractTypeArguments(node);\n if (typeArgs && typeArgs.length > 0) {\n const schemaTypeName = typeArgs[0];\n const extracted = extractStateSchema(ctx.sourceFile, schemaTypeName);\n if (extracted) {\n schema = extracted;\n } else {\n console.warn(`Warning: Could not find interface ${schemaTypeName} in source file`);\n }\n }\n }\n\n // Extract Operation children\n const operations: OperationNode[] = [];\n if (Node.isJsxElement(node)) {\n for (const child of node.getJsxChildren()) {\n if (Node.isJsxElement(child) || Node.isJsxSelfClosingElement(child)) {\n const childName = getElementName(child);\n if (childName === 'Operation') {\n operations.push(transformOperation(child, ctx));\n }\n }\n }\n }\n\n const stateNode: StateNode = {\n kind: 'state',\n name,\n provider: 'sqlite',\n config: { database },\n schema,\n operations\n };\n\n return {\n kind: 'stateDocument',\n state: stateNode\n };\n}\n\n/**\n * Transform an Operation component into OperationNode\n */\nexport function transformOperation(\n node: JsxElement | JsxSelfClosingElement,\n ctx: TransformContext\n): OperationNode {\n const opening = Node.isJsxElement(node) ? node.getOpeningElement() : node;\n\n // Extract required name prop\n const name = getAttributeValue(opening, 'name');\n if (!name) {\n throw ctx.createError('Operation component requires name prop', node);\n }\n\n // Extract SQL template from children (text content)\n let sqlTemplate = '';\n if (Node.isJsxElement(node)) {\n const parts: string[] = [];\n for (const child of node.getJsxChildren()) {\n if (Node.isJsxText(child)) {\n parts.push(child.getText());\n } else if (Node.isJsxExpression(child)) {\n // Handle template literals in expressions\n const expr = child.getExpression();\n if (expr && Node.isStringLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n } else if (expr && Node.isNoSubstitutionTemplateLiteral(expr)) {\n parts.push(expr.getLiteralValue());\n }\n }\n }\n sqlTemplate = parts.join('').trim();\n }\n\n // Infer arguments from $variable patterns in SQL\n const args = extractSqlArguments(sqlTemplate);\n\n return {\n kind: 'operation',\n name,\n sqlTemplate,\n args\n };\n}\n","/**\n * Runtime Build Pipeline\n *\n * Transforms TSX files to dual output:\n * - COMMAND.md (markdown for Claude)\n * - runtime.js (bundled TypeScript functions via esbuild)\n */\n\nimport { SourceFile, Project, Node } from 'ts-morph';\nimport path from 'path';\n\n// Runtime parser\nimport {\n createRuntimeContext,\n extractRuntimeVarDeclarations,\n extractRuntimeFnDeclarations,\n extractLocalComponentDeclarations,\n extractExternalComponentDeclarations,\n getRuntimeFunctionNames,\n getRuntimeImportPaths,\n transformRuntimeCommand,\n} from '../parser/transformers/index.js';\n\n// Runtime emitter\nimport {\n emitDocument,\n emitAgent,\n isRuntimeFile,\n // Esbuild bundler\n extractExportedFunctionNames,\n type RuntimeFileInfo,\n} from '../emitter/index.js';\n\n// V1 transformer for Agent support\nimport { transformAgent } from '../parser/transformers/document.js';\nimport type { TransformContext } from '../parser/transformers/types.js';\n\n// IR\nimport type { DocumentNode, AgentDocumentNode } from '../ir/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n// Re-export for build.ts compatibility (legacy)\nimport type { RuntimeEmitResult } from '../emitter/index.js';\nexport type { RuntimeEmitResult };\n\n/**\n * V3 build result\n */\nexport interface RuntimeBuildResult {\n /** Generated markdown content */\n markdown: string;\n /** Generated runtime.js content (empty - bundling happens at end) */\n runtime: string;\n /** Full runtime result for merging (null if no runtime functions) - LEGACY */\n runtimeResult: RuntimeEmitResult | null;\n /** Runtime file info for single-entry bundling (null if no runtime functions) */\n runtimeFileInfo: RuntimeFileInfo | null;\n /** Path where markdown should be written */\n markdownPath: string;\n /** Path where runtime should be written */\n runtimePath: string;\n /** List of runtime functions extracted (without namespace prefix) */\n runtimeFunctions: string[];\n /** Any warnings during build */\n warnings: string[];\n}\n\n/**\n * V3 build options\n */\nexport interface RuntimeBuildOptions {\n /** Output directory for commands */\n commandsOut: string;\n /** Output directory for runtime */\n runtimeOut: string;\n /** Dry run - don't write files */\n dryRun?: boolean;\n}\n\n// ============================================================================\n// Root Element Detection\n// ============================================================================\n\n/**\n * Unwrap parenthesized expressions to find inner JSX\n */\nfunction unwrapParens(node: Node): Node {\n if (Node.isParenthesizedExpression(node)) {\n return unwrapParens(node.getExpression());\n }\n return node;\n}\n\n/**\n * Find the root JSX element in a runtime source file\n *\n * Looks for JSX in:\n * 1. export default <Command>...</Command>\n * 2. export default (<Command>...</Command>)\n * 3. Return statements within the file\n */\nfunction findRuntimeRootElement(sourceFile: SourceFile): Node | null {\n let result: Node | null = null;\n\n // Pass 1: Look for export default (highest priority)\n sourceFile.forEachDescendant((node, traversal) => {\n if (Node.isExportAssignment(node)) {\n const expr = node.getExpression();\n if (expr) {\n const unwrapped = unwrapParens(expr);\n if (Node.isJsxElement(unwrapped) || Node.isJsxSelfClosingElement(unwrapped)) {\n result = unwrapped;\n traversal.stop();\n return;\n }\n }\n }\n });\n\n // If found via export default, return it\n if (result) return result;\n\n // Pass 2: Fall back to looking for return statements at module level\n // This is for files without export default\n sourceFile.forEachDescendant((node, traversal) => {\n if (Node.isReturnStatement(node)) {\n const expr = node.getExpression();\n if (expr) {\n const unwrapped = unwrapParens(expr);\n if (Node.isJsxElement(unwrapped) || Node.isJsxSelfClosingElement(unwrapped)) {\n result = unwrapped;\n traversal.stop();\n return;\n }\n }\n }\n });\n\n return result;\n}\n\n/**\n * Get the root element tag name\n */\nfunction getRootElementTagName(element: Node): string | null {\n if (Node.isJsxElement(element)) {\n return element.getOpeningElement().getTagNameNode().getText();\n } else if (Node.isJsxSelfClosingElement(element)) {\n return element.getTagNameNode().getText();\n }\n return null;\n}\n\n/**\n * Check if the root element is a Command\n */\nfunction isRuntimeCommand(element: Node): boolean {\n const tagName = getRootElementTagName(element);\n return tagName === 'Command' || tagName === 'RuntimeCommand';\n}\n\n/**\n * Check if the root element is an Agent\n */\nfunction isAgentElement(element: Node): boolean {\n const tagName = getRootElementTagName(element);\n return tagName === 'Agent';\n}\n\n/**\n * Check if the root element is a supported document type\n * Supported tags: Command, RuntimeCommand, Agent\n */\nfunction isSupportedRootElement(element: Node): boolean {\n const tagName = getRootElementTagName(element);\n // Note: Using inline check rather than SUPPORTED_ROOT_TAGS import to avoid\n // circular dependency issues with constants.ts\n return tagName === 'Command' || tagName === 'RuntimeCommand' || tagName === 'Agent';\n}\n\n// ============================================================================\n// Build Pipeline\n// ============================================================================\n\n/**\n * Resolve runtime file path from import path\n */\nfunction resolveRuntimePath(tsxFilePath: string, importPath: string): string {\n const tsxDir = path.dirname(tsxFilePath);\n let resolved = path.resolve(tsxDir, importPath);\n\n // Convert .js extension to .ts for TypeScript source\n if (resolved.endsWith('.js')) {\n resolved = resolved.replace(/\\.js$/, '.ts');\n } else if (!resolved.endsWith('.ts')) {\n resolved += '.ts';\n }\n\n return resolved;\n}\n\n/**\n * Build a Runtime file to markdown and runtime.js\n *\n * @param sourceFile - Source file to build\n * @param project - ts-morph project for resolution\n * @param options - Build options\n * @returns Build result with content and paths\n */\nexport async function buildRuntimeFile(\n sourceFile: SourceFile,\n project: Project,\n options: RuntimeBuildOptions\n): Promise<RuntimeBuildResult> {\n const filePath = sourceFile.getFilePath();\n const basename = path.basename(filePath, '.tsx');\n const warnings: string[] = [];\n\n // Create Runtime transform context\n const ctx = createRuntimeContext(sourceFile);\n\n // Phase 1: Extract declarations\n extractRuntimeVarDeclarations(sourceFile, ctx);\n extractRuntimeFnDeclarations(sourceFile, ctx);\n extractLocalComponentDeclarations(sourceFile, ctx);\n extractExternalComponentDeclarations(sourceFile, ctx);\n\n // Phase 2: Find root element\n const rootElement = findRuntimeRootElement(sourceFile);\n if (!rootElement) {\n throw new Error(`No JSX element found in ${filePath}`);\n }\n\n if (!isSupportedRootElement(rootElement)) {\n throw new Error(`File must have <Command> or <Agent> as root element`);\n }\n\n // Phase 3: Transform to IR\n if (!Node.isJsxElement(rootElement) && !Node.isJsxSelfClosingElement(rootElement)) {\n throw new Error('Root element must be JSX');\n }\n\n // Check if this is an Agent or Command\n const isAgent = isAgentElement(rootElement);\n let markdown: string;\n let document: DocumentNode | null = null;\n let agentDocument: AgentDocumentNode | null = null;\n\n if (isAgent) {\n // Transform Agent element using V1 transformer\n const agentCtx: TransformContext = {\n sourceFile,\n visitedPaths: new Set(),\n variables: new Map(),\n outputs: new Map(),\n stateRefs: new Map(),\n renderPropsContext: undefined,\n createError: (message: string, node: Node) => new Error(`${message} at ${node.getStartLineNumber()}`),\n };\n agentDocument = transformAgent(rootElement, agentCtx);\n markdown = emitAgent(agentDocument);\n } else {\n // Transform Command element\n document = transformRuntimeCommand(rootElement, ctx);\n markdown = emitDocument(document);\n }\n\n // Phase 5: Extract runtime info (bundling happens at the end for all files)\n const runtimeFunctionNames = getRuntimeFunctionNames(ctx);\n const runtimeImportPaths = getRuntimeImportPaths(ctx);\n\n let runtimeFileInfo: RuntimeFileInfo | null = null;\n\n if (runtimeFunctionNames.length > 0 && runtimeImportPaths.length > 0) {\n // Resolve the first runtime import path (typically the .runtime.ts file)\n const runtimeFilePath = resolveRuntimePath(filePath, runtimeImportPaths[0]);\n\n try {\n // Parse the runtime file to extract exported functions\n const runtimeSourceFile = project.addSourceFileAtPath(runtimeFilePath);\n const exportedFunctions = extractExportedFunctionNames(runtimeSourceFile);\n\n runtimeFileInfo = {\n sourcePath: runtimeFilePath,\n namespace: ctx.namespace!,\n exportedFunctions,\n };\n } catch (e) {\n warnings.push(`Failed to parse runtime file: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n // Extract folder from metadata (if present) - only for Command documents\n const folder = document?.metadata?.folder;\n\n // Determine output paths (with optional folder subdirectory)\n const markdownPath = folder\n ? path.join(options.commandsOut, folder, `${basename}.md`)\n : path.join(options.commandsOut, `${basename}.md`);\n const runtimePath = path.join(options.runtimeOut, 'runtime.js');\n\n return {\n markdown,\n runtime: '', // Bundling happens at the end\n runtimeResult: null, // Legacy field, no longer used\n runtimeFileInfo,\n markdownPath,\n runtimePath,\n runtimeFunctions: runtimeFunctionNames,\n warnings,\n };\n}\n\n/**\n * Check if a source file is a runtime file\n *\n * Uses import detection to determine if file uses runtime features.\n */\nexport function detectRuntime(sourceFile: SourceFile): boolean {\n return isRuntimeFile(sourceFile);\n}\n\n/**\n * Quick check for runtime markers in file content\n *\n * Faster than full parse - checks for import patterns.\n */\nexport function hasRuntimeImports(content: string): boolean {\n return (\n content.includes('useRuntimeVar') ||\n content.includes('runtimeFn') ||\n content.includes('from \\'react-agentic/v3\\'') ||\n content.includes('from \"react-agentic/v3\"')\n );\n}\n","/**\n * Error Utilities - Source-located errors for transpilation\n *\n * Provides TypeScript-style error formatting with file path, line, column,\n * code snippets, and caret indicators.\n */\nimport pc from 'picocolors';\nimport { Node, SourceFile } from 'ts-morph';\n\n/**\n * Source location information for an error\n */\nexport interface SourceLocation {\n /** Absolute path to the source file */\n file: string;\n /** 1-based line number */\n line: number;\n /** 1-based column number */\n column: number;\n}\n\n/**\n * Error class for transpilation errors with source location context\n */\nexport class TranspileError extends Error {\n readonly location: SourceLocation | undefined;\n readonly sourceCode: string | undefined;\n\n constructor(\n message: string,\n location?: SourceLocation,\n sourceCode?: string\n ) {\n super(message);\n this.name = 'TranspileError';\n this.location = location;\n this.sourceCode = sourceCode;\n }\n}\n\n/**\n * Get source location from a ts-morph Node\n *\n * @param node - The AST node to get location for\n * @returns SourceLocation with file path and 1-based line/column\n */\nexport function getNodeLocation(node: Node): SourceLocation {\n const sourceFile = node.getSourceFile();\n const pos = node.getStart();\n const { line, column } = sourceFile.getLineAndColumnAtPos(pos);\n\n return {\n file: sourceFile.getFilePath(),\n line,\n column,\n };\n}\n\n/**\n * Get source code from a source file for error display\n *\n * @param sourceFile - The source file\n * @returns The full source code text\n */\nexport function getSourceCode(sourceFile: SourceFile): string {\n return sourceFile.getFullText();\n}\n\n/**\n * Format a TranspileError for display\n *\n * Produces TypeScript-style error output:\n * ```\n * file.tsx:15:10 - error: Command requires name prop\n *\n * 15 | <Command description=\"test\">\n * | ^\n * ```\n *\n * @param error - The transpile error to format\n * @returns Formatted error string with colors\n */\nexport function formatTranspileError(error: TranspileError): string {\n const parts: string[] = [];\n\n // Header: file:line:col - error: message\n if (error.location) {\n const { file, line, column } = error.location;\n parts.push(\n `${pc.cyan(file)}:${pc.dim(String(line))}:${pc.dim(String(column))} - ${pc.red('error:')} ${error.message}`\n );\n } else {\n parts.push(`${pc.red('error:')} ${error.message}`);\n }\n\n // Code snippet with caret\n if (error.location && error.sourceCode) {\n const { line, column } = error.location;\n const lines = error.sourceCode.split('\\n');\n const errorLine = lines[line - 1]; // 0-indexed array\n\n if (errorLine !== undefined) {\n parts.push('');\n\n // Format: \" 15 | code here\"\n const lineNum = String(line);\n const padding = ' '.repeat(lineNum.length + 1);\n parts.push(`${pc.dim(` ${lineNum} |`)} ${errorLine}`);\n\n // Caret line: \" | ^\"\n const caretPadding = ' '.repeat(column - 1);\n parts.push(`${pc.dim(`${padding} |`)} ${caretPadding}${pc.red('^')}`);\n }\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Error class for cross-file validation errors\n * Includes source locations for both the usage site (Command) and definition site (Agent)\n */\nexport class CrossFileError extends TranspileError {\n readonly agentLocation: SourceLocation | undefined;\n\n constructor(\n message: string,\n commandLocation: SourceLocation,\n agentLocation?: SourceLocation,\n sourceCode?: string\n ) {\n super(message, commandLocation, sourceCode);\n this.name = 'CrossFileError';\n this.agentLocation = agentLocation;\n }\n}\n\n/**\n * Format a CrossFileError for display\n * Shows both the command (primary) and agent (secondary) locations\n *\n * Example output:\n * ```\n * commands/plan.tsx:15:5 - error: SpawnAgent prompt missing required property: 'phase'\n *\n * 15 | <SpawnAgent<ResearcherInput>\n * | ^\n *\n * Agent interface defined at: agents/researcher.tsx:3:1\n * ```\n */\nexport function formatCrossFileError(error: CrossFileError): string {\n const parts: string[] = [];\n\n // Primary location (command/usage site)\n parts.push(formatTranspileError(error));\n\n // Secondary location (agent/definition site)\n if (error.agentLocation) {\n const { file, line, column } = error.agentLocation;\n parts.push('');\n parts.push(\n `${pc.dim('Agent interface defined at:')} ${pc.cyan(file)}:${pc.dim(String(line))}:${pc.dim(String(column))}`\n );\n }\n\n return parts.join('\\n');\n}\n"],"mappings":"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","names":["Project","ScriptTarget","ModuleKind","ts","Node","getElementName","getAttributeValue","getArrayAttributeValue","isWhitespaceOnlyText","normalizeWhitespace","normalizeInlineWhitespace","extractText","extractInlineText","Node","SyntaxKind","Node","SyntaxKind","resolveComponentImport","extractJsxFromComponent","Node","resolveTypeImport","extractInterfaceProperties","Node","SyntaxKind","extractInputObjectLiteral","child","extractTypeArguments","Node","isCustomComponent","Node","getArrayAttributeValue","getAttributeValue","path","Node","getAttributeValue","Node","getAttributeValue","extractTypeArguments","path","extractInputObjectLiteral","resolveTypeImport","extractInterfaceProperties","Node","Node","Node","getAttributeValue","path","Node","getAttributeValue","transformBlockChildren","resolvePropertyAccess","resolveComponentImport","transformToBlock","transformFragmentChildren","Node","trimBoundaryTextNodes","extractInlineText","getElementName","getAttributeValue","Node","getElementName","isCustomComponent","extractText","extractCodeContent","Node","isValidXmlName","XML_NAME_REGEX","getElementName","getAttributeValue","content","extractTemplateText","extractText","path","path","Node","path","Node","path","Node","Node","path","mkdir","writeFile","path","mkdir","writeFile","Node","path","Node","Node","Node","Node","getAttributeValue","Node","getElementName","extractText","Node","SyntaxKind","Node","SyntaxKind","getAttributeValue","Node","Node","Node","Node","getAttributeValue","Node","Node","ref","getAttributeValue","Node","Node","extractJsxFromComponent","transformRuntimeBlockChildren","getElementName","Node","extractInlineText","getElementName","path","getAttributeValue","Node","getElementName","getAttributeValue","isValidXmlName","extractText","XML_NAME_REGEX","inner","Node","Node","Node","getAttributeValue","extractTypeArguments","getArrayAttributeValue","extractText","getElementName","Node","path","Node","path","Node"]}