@almadar/agent 1.0.12 → 1.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/index.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tools/index.js.map +1 -1
- package/package.json +10 -8
package/dist/agent/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/orbitals/cache/orbital-fingerprint.ts","../../src/orbitals/cache/structural-templates.ts","../../src/orbitals/cache/prompt-assembler.ts","../../src/orbitals/cache/index.ts","../../src/tools/execute.ts","../../src/tools/validate-schema.ts","../../src/tools/generate-schema.ts","../../src/orbitals/combiner/index.ts","../../src/orbitals/domain-language/tokens.ts","../../src/orbitals/domain-language/lexer.ts","../../src/orbitals/domain-language/parsers/entity-parser.ts","../../src/orbitals/domain-language/parsers/page-parser.ts","../../src/orbitals/domain-language/parsers/guard-parser.ts","../../src/orbitals/domain-language/parsers/sexpr-parser.ts","../../src/orbitals/domain-language/parsers/behavior-parser.ts","../../src/orbitals/domain-language/sync/domain-to-schema.ts","../../src/tools/finish-task.ts","../../src/tools/domain-orbital.ts","../../src/orbitals/generation/orbital-generator.ts","../../src/tools/orbital-subagent.ts","../../src/tools/trait-subagent.ts","../../src/tools/combine-schemas.ts","../../src/tools/schema-chunking.ts","../../src/tools/github.ts","../../src/persistence/memory-backend.ts","../../src/persistence/firestore-checkpointer.ts","../../src/persistence/firestore-session-store.ts","../../src/agent/session-manager.ts","../../src/agent/interrupt-config.ts","../../src/agent/skill-agent.ts","../../src/agent/event-budget.ts"],"names":["isEntityReference","getTraitName","getInlineEntity","resolve","path2","tool","fs","z","entity","toKebabCase","nameParts","name","page","parseValue","toCamelCase","splitAtTopLevel","parseComparison","path","behavior","text","toPascalCase","isPageReferenceString","isPageReferenceObject","execAsync","promisify","exec","path3","fs2","path4","getEntityName","LLMClient","path5","fss","isOrbitalDefinition","uuid"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Orbital Fingerprinting for Caching\n *\n * Computes structural fingerprints for Orbital Units to enable\n * prompt caching based on similar structures.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalUnit, OrbitalEntity, EntityField, OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isOrbitalDefinition, getTraitName, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity from EntityRef for signature computation.\n * Returns null if entity is a reference string.\n */\nfunction getInlineEntity(entity: EntityRef): OrbitalEntity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\n\n// ============================================================================\n// Fingerprint Computation\n// ============================================================================\n\n/**\n * Compute a structural fingerprint for an Orbital Unit.\n * Units with the same fingerprint can share cached prompts.\n * Only works with full orbital definitions (not references).\n */\nexport function computeOrbitalFingerprint(orbital: OrbitalUnit): string {\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // The isOrbitalDefinition check is kept for backwards compatibility but always true\n\n // Get inline entity or use fallback for references\n const inlineEntity = getInlineEntity(orbital.entity);\n\n // 1. Entity structure signature\n const entitySig = inlineEntity ? computeEntitySignature(inlineEntity) : 'ref';\n\n // 2. Trait categories (sorted)\n const traitSig = orbital.traits\n .map(getTraitName)\n .sort()\n .join(',');\n\n // 3. Persistence type\n const persistSig = inlineEntity?.persistence || 'persistent';\n\n return `${persistSig}:e[${entitySig}]_t[${traitSig}]`;\n}\n\n/**\n * Compute entity structure signature based on field types.\n */\nexport function computeEntitySignature(entity: OrbitalEntity): string {\n const typeCounts: Record<string, number> = {};\n\n for (const field of entity.fields) {\n const baseType = getFieldTypeKey(field);\n typeCounts[baseType] = (typeCounts[baseType] || 0) + 1;\n }\n\n return Object.entries(typeCounts)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([type, count]) => `${type}:${count}`)\n .join('-');\n}\n\n/**\n * Get field type key for fingerprinting.\n */\nfunction getFieldTypeKey(field: EntityField): string {\n if (field.type === 'relation') {\n const cardinality = field.relation?.cardinality || 'one';\n return `rel:${cardinality}`;\n }\n if (field.type === 'enum') {\n return 'enum';\n }\n return field.type;\n}\n\n// ============================================================================\n// Fingerprint Matching\n// ============================================================================\n\n/**\n * Check if two fingerprints are structurally similar.\n * Similar fingerprints can share template guidance.\n */\nexport function fingerprintsMatch(fp1: string, fp2: string): boolean {\n return fp1 === fp2;\n}\n\n/**\n * Extract fingerprint components.\n */\nexport function parseFingerprint(fingerprint: string): {\n persistence: string;\n entity: string;\n traits: string[];\n patterns: string[];\n} {\n const match = fingerprint.match(/^(\\w+):e\\[([^\\]]*)\\]_t\\[([^\\]]*)\\]_p\\[([^\\]]*)\\]$/);\n if (!match) {\n return { persistence: 'unknown', entity: '', traits: [], patterns: [] };\n }\n\n return {\n persistence: match[1],\n entity: match[2],\n traits: match[3] ? match[3].split(',') : [],\n patterns: match[4] ? match[4].split(',') : [],\n };\n}\n\n/**\n * Compute similarity score between two fingerprints (0-1).\n */\nexport function fingerprintSimilarity(fp1: string, fp2: string): number {\n if (fp1 === fp2) return 1.0;\n\n const p1 = parseFingerprint(fp1);\n const p2 = parseFingerprint(fp2);\n\n let score = 0;\n let total = 4;\n\n // Persistence match\n if (p1.persistence === p2.persistence) score += 1;\n\n // Entity structure match\n if (p1.entity === p2.entity) score += 1;\n\n // Trait overlap\n const traitOverlap = p1.traits.filter((t) => p2.traits.includes(t)).length;\n const traitUnion = new Set([...p1.traits, ...p2.traits]).size;\n if (traitUnion > 0) {\n score += traitOverlap / traitUnion;\n } else {\n score += 1;\n }\n\n // Pattern overlap\n const patternOverlap = p1.patterns.filter((p) => p2.patterns.includes(p)).length;\n const patternUnion = new Set([...p1.patterns, ...p2.patterns]).size;\n if (patternUnion > 0) {\n score += patternOverlap / patternUnion;\n } else {\n score += 1;\n }\n\n return score / total;\n}\n","/**\n * Structural Templates for Cached Generation\n *\n * Pre-defined templates for common structural patterns.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Template Types\n// ============================================================================\n\nexport interface StructuralTemplate {\n /** Fingerprint pattern this template matches */\n fingerprintPattern: string;\n /** Human-readable name */\n name: string;\n /** Template guidance for generation */\n guidance: string;\n /** Example sections */\n exampleSections: string[];\n}\n\n// ============================================================================\n// Common Templates\n// ============================================================================\n\n/**\n * Templates for common structural patterns.\n */\nexport const STRUCTURAL_TEMPLATES: StructuralTemplate[] = [\n {\n fingerprintPattern: 'persistent:e[*]_t[FormSubmission*]_p[*form*]',\n name: 'CRUD Form Entity',\n guidance: `\nThis is a standard CRUD entity with form submission.\nGenerate pages for:\n- List view with search/filter\n- Create form with validation\n- Edit form with existing data\n- Detail view with actions\n`,\n exampleSections: ['page-header', 'search-filters', 'entity-list', 'form-section', 'form-actions'],\n },\n {\n fingerprintPattern: 'persistent:e[*]_t[*Workflow*]_p[*]',\n name: 'Workflow Entity',\n guidance: `\nThis entity has workflow/state machine behavior.\nInclude:\n- Status indicators in list view\n- Transition actions in detail view\n- Workflow history display\n`,\n exampleSections: ['page-header', 'entity-table', 'entity-detail', 'form-actions'],\n },\n {\n fingerprintPattern: 'runtime:e[*]_t[*]_p[dashboard*]',\n name: 'Dashboard View',\n guidance: `\nThis is a runtime dashboard entity.\nFocus on:\n- Statistics and metrics display\n- Charts and visualizations\n- Recent activity lists\n`,\n exampleSections: ['page-header', 'dashboard-stats', 'chart', 'entity-cards'],\n },\n {\n fingerprintPattern: '*:e[*]_t[Platformer*]_p[game*]',\n name: 'Game Entity',\n guidance: `\nThis is a game entity with platformer mechanics.\nInclude:\n- Game canvas for rendering\n- HUD for score/health display\n- Controls panel for input\n`,\n exampleSections: ['game-canvas', 'game-hud', 'game-controls'],\n },\n];\n\n// ============================================================================\n// Template Matching\n// ============================================================================\n\n/**\n * Find matching templates for a fingerprint.\n */\nexport function findMatchingTemplates(fingerprint: string): StructuralTemplate[] {\n return STRUCTURAL_TEMPLATES.filter((template) =>\n matchesPattern(fingerprint, template.fingerprintPattern)\n );\n}\n\n/**\n * Get the best matching template for a fingerprint.\n */\nexport function getBestTemplate(fingerprint: string): StructuralTemplate | null {\n const matches = findMatchingTemplates(fingerprint);\n return matches.length > 0 ? matches[0] : null;\n}\n\n/**\n * Check if fingerprint matches a pattern.\n * Patterns support * as wildcard.\n */\nfunction matchesPattern(fingerprint: string, pattern: string): boolean {\n // Convert pattern to regex\n const regexStr = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special chars\n .replace(/\\*/g, '.*'); // Replace * with .*\n\n const regex = new RegExp(`^${regexStr}$`);\n return regex.test(fingerprint);\n}\n\n/**\n * Get guidance for a fingerprint.\n */\nexport function getTemplateGuidance(fingerprint: string): string {\n const template = getBestTemplate(fingerprint);\n if (template) {\n return template.guidance;\n }\n\n return `\nNo specific template matched. Use standard patterns:\n- page-header for page titles\n- entity-list or entity-table for list views\n- form-section for input forms\n- entity-detail for detail views\n`;\n}\n","/**\n * Prompt Assembler for Cache-Aware Prompt Construction\n *\n * Assembles prompts with cache markers for efficient LLM caching.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalUnit, OrbitalDefinition, EntityRef, Entity } from '@almadar/core/types';\nimport { isOrbitalDefinition, getTraitName, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity name safely from EntityRef\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n/**\n * Get inline entity for detailed access, or null for references\n */\nfunction getInlineEntity(entity: EntityRef): Entity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\nimport { computeOrbitalFingerprint } from './orbital-fingerprint.js';\nimport { getTemplateGuidance, getBestTemplate } from './structural-templates.js';\nimport type { CacheableBlock } from '../../llm/index.js';\n\n// ============================================================================\n// Cache Markers\n// ============================================================================\n\n/** Anthropic cache control marker (deprecated - use CacheableBlock instead) */\nconst CACHE_BREAK = '<!-- cache_break -->';\n\n// ============================================================================\n// Context Helpers\n// ============================================================================\n\n/**\n * Build context section from orbital's domainContext and design fields.\n * Passes through existing context to the subagent.\n */\nfunction buildContextSection(orbital: OrbitalDefinition): string {\n const parts: string[] = [];\n\n if (orbital.domainContext) {\n const ctx = orbital.domainContext;\n parts.push(`DomainContext: category=${ctx.category || 'business'}`);\n if (ctx.vocabulary) {\n parts.push(`Vocabulary: ${JSON.stringify(ctx.vocabulary)}`);\n }\n if (ctx.requestFragment) {\n parts.push(`RequestFragment: \"${ctx.requestFragment}\"`);\n }\n }\n\n if (orbital.design) {\n const d = orbital.design;\n if (d.style) parts.push(`Style: ${d.style}`);\n if (d.uxHints) {\n const hints = d.uxHints;\n if (hints.flowPattern) parts.push(`FlowPattern: ${hints.flowPattern}`);\n if (hints.listPattern) parts.push(`ListPattern: ${hints.listPattern}`);\n if (hints.formPattern) parts.push(`FormPattern: ${hints.formPattern}`);\n }\n }\n\n return parts.length > 0 ? `Context: ${parts.join(', ')}\\n` : '';\n}\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport interface AssembledPrompt {\n /** The full prompt text */\n prompt: string;\n /** Fingerprint for this orbital */\n fingerprint: string;\n /** Whether a cached template was used */\n usedCachedTemplate: boolean;\n /** Template name if used */\n templateName?: string;\n}\n\n/**\n * Cache-aware assembled prompt with separate blocks.\n */\nexport interface CacheableAssembledPrompt {\n /** System blocks (cacheable) */\n systemBlocks: CacheableBlock[];\n /** User blocks (usually not cacheable) */\n userBlocks: CacheableBlock[];\n /** Fingerprint for this orbital */\n fingerprint: string;\n /** Whether a cached template was used */\n usedCachedTemplate: boolean;\n /** Template name if used */\n templateName?: string;\n}\n\n/**\n * Assemble a prompt for orbital unit generation.\n * Organizes content to maximize cache hits.\n * Only works with full orbital definitions (not references).\n */\nexport function assembleOrbitalPrompt(\n orbital: OrbitalUnit,\n baseSystemPrompt: string\n): AssembledPrompt {\n const fingerprint = computeOrbitalFingerprint(orbital);\n const template = getBestTemplate(fingerprint);\n const guidance = getTemplateGuidance(fingerprint);\n\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // This check is kept for backwards compatibility but always passes\n\n // Structure prompt for optimal caching:\n // 1. Static system prompt (cacheable across all calls)\n // 2. Template guidance (cacheable for similar structures)\n // 3. Specific orbital details (unique per call)\n\n const contextSection = buildContextSection(orbital);\n\n // Get entity details safely\n const entityName = getEntityName(orbital.entity);\n const inlineEntity = getInlineEntity(orbital.entity);\n const persistence = inlineEntity?.persistence || 'persistent';\n const fieldNames = inlineEntity?.fields.map((f: { name: string }) => f.name).join(', ') || 'N/A';\n\n const prompt = `${baseSystemPrompt}\n\n${CACHE_BREAK}\n\n## Structural Template\n${guidance}\n\n${CACHE_BREAK}\n\n## Current Orbital Unit\nName: ${orbital.name}\nEntity: ${entityName}\nPersistence: ${persistence}\nFields: ${fieldNames}\nTraits: ${orbital.traits.map(getTraitName).join(', ')}\n${contextSection}\nGenerate a complete FullOrbitalUnit with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" (singular, NOT \"guards\") S-expression on SAVE transitions\n- Pages with trait references\n- domainContext with category, vocabulary, and requestFragment\n- design with style and uxHints (flowPattern, listPattern, formPattern)\n`;\n\n return {\n prompt,\n fingerprint,\n usedCachedTemplate: template !== null,\n templateName: template?.name,\n };\n}\n\n/**\n * Assemble cacheable blocks for Anthropic prompt caching.\n *\n * Structure:\n * - System block 1: Base system prompt (highly cacheable, rarely changes)\n * - System block 2: Template guidance (cacheable per fingerprint)\n * - User block: Specific orbital details (not cached)\n *\n * Only works with full orbital definitions (not references).\n */\nexport function assembleCacheableOrbitalPrompt(\n orbital: OrbitalUnit,\n baseSystemPrompt: string\n): CacheableAssembledPrompt {\n const fingerprint = computeOrbitalFingerprint(orbital);\n const template = getBestTemplate(fingerprint);\n const guidance = getTemplateGuidance(fingerprint);\n\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // This check is kept for backwards compatibility but always passes\n\n // System blocks - mark as cacheable\n const systemBlocks: CacheableBlock[] = [\n // Block 1: Base system prompt (very stable, max cache benefit)\n {\n type: 'text',\n text: baseSystemPrompt,\n cache_control: { type: 'ephemeral' },\n },\n // Block 2: Template guidance (stable per fingerprint)\n {\n type: 'text',\n text: `\\n## Structural Template\\n${guidance}`,\n cache_control: { type: 'ephemeral' },\n },\n ];\n\n // Build context section if available\n const contextSection = buildContextSection(orbital);\n\n // Build cross-orbital connectivity section\n const emitsSection = orbital.emits?.length ? `Emits: ${orbital.emits.join(', ')}` : '';\n const listensSection = orbital.listens?.length\n ? `Listens: ${orbital.listens.map((l) => `${l.event}→${l.triggers}`).join(', ')}`\n : '';\n const connectivitySection = [emitsSection, listensSection].filter(Boolean).join('\\n');\n\n // Get entity details safely\n const entityName = getEntityName(orbital.entity);\n const inlineEntity = getInlineEntity(orbital.entity);\n const persistence = inlineEntity?.persistence || 'persistent';\n const fieldNames = inlineEntity?.fields.map((f: { name: string }) => f.name).join(', ') || 'N/A';\n\n // User block - unique per request (not cached)\n const userBlocks: CacheableBlock[] = [\n {\n type: 'text',\n text: `## Current Orbital Unit\nName: ${orbital.name}\nEntity: ${entityName}\nPersistence: ${persistence}\nFields: ${fieldNames}\nTraits: ${orbital.traits.map(getTraitName).join(', ')}\n${contextSection}${connectivitySection ? `\\n${connectivitySection}` : ''}\nGenerate a complete FullOrbitalUnit with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" (singular, NOT \"guards\") S-expression on SAVE transitions\n- Pages with trait references\n- domainContext with category, vocabulary, and requestFragment\n- design with style and uxHints (flowPattern, listPattern, formPattern)\n- PRESERVE emits and listens from input if provided`,\n },\n ];\n\n return {\n systemBlocks,\n userBlocks,\n fingerprint,\n usedCachedTemplate: template !== null,\n templateName: template?.name,\n };\n}\n\n/**\n * Assemble prompts for multiple orbitals.\n * Groups by fingerprint for batch efficiency.\n */\nexport function assembleMultiOrbitalPrompts(\n orbitals: OrbitalUnit[],\n baseSystemPrompt: string\n): Map<string, AssembledPrompt[]> {\n const grouped = new Map<string, AssembledPrompt[]>();\n\n for (const orbital of orbitals) {\n const assembled = assembleOrbitalPrompt(orbital, baseSystemPrompt);\n const existing = grouped.get(assembled.fingerprint) || [];\n existing.push(assembled);\n grouped.set(assembled.fingerprint, existing);\n }\n\n return grouped;\n}\n\n/**\n * Get cache statistics for a set of orbitals.\n */\nexport function getCacheStats(orbitals: OrbitalUnit[]): {\n totalOrbitals: number;\n uniqueFingerprints: number;\n potentialCacheHits: number;\n templateMatches: number;\n} {\n const fingerprints = orbitals.map(computeOrbitalFingerprint);\n const unique = new Set(fingerprints);\n\n let templateMatches = 0;\n for (const orbital of orbitals) {\n const fp = computeOrbitalFingerprint(orbital);\n if (getBestTemplate(fp)) {\n templateMatches++;\n }\n }\n\n return {\n totalOrbitals: orbitals.length,\n uniqueFingerprints: unique.size,\n potentialCacheHits: orbitals.length - unique.size,\n templateMatches,\n };\n}\n\n","/**\n * Orbital Cache Module\n *\n * Exports fingerprinting, templates, and prompt assembly utilities\n * for efficient LLM prompt caching.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Fingerprinting\n// ============================================================================\n\nexport {\n computeOrbitalFingerprint,\n computeEntitySignature,\n fingerprintsMatch,\n parseFingerprint,\n fingerprintSimilarity,\n} from './orbital-fingerprint.js';\n\n// ============================================================================\n// Structural Templates\n// ============================================================================\n\nexport {\n type StructuralTemplate,\n STRUCTURAL_TEMPLATES,\n findMatchingTemplates,\n getBestTemplate,\n getTemplateGuidance,\n} from './structural-templates.js';\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport {\n type AssembledPrompt,\n type CacheableAssembledPrompt,\n assembleOrbitalPrompt,\n assembleCacheableOrbitalPrompt,\n assembleMultiOrbitalPrompts,\n getCacheStats,\n} from './prompt-assembler.js';\n","/**\n * Execute Tool\n *\n * Sandboxed shell command execution within a workspace directory.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { spawn } from 'child_process';\nimport * as path from 'path';\n\n/**\n * Dangerous commands that should be blocked when targeting outside workspace.\n */\nconst DANGEROUS_COMMANDS = [\n 'rm', 'rmdir', 'mv', 'cp', 'ln', 'chmod', 'chown', 'touch', 'mkdir',\n];\n\n/**\n * Commands that should be blocked entirely for security.\n */\nconst BLOCKED_COMMANDS = [\n 'curl', 'wget', 'nc', 'netcat', 'ssh', 'scp', 'rsync', 'ftp', 'sftp',\n 'sudo', 'su', 'doas', 'pkexec', 'eval', 'exec', 'source',\n 'crontab', 'at', 'systemctl', 'service',\n 'dd', 'mkfs', 'fdisk', 'mount', 'umount',\n 'iptables', 'firewall-cmd',\n 'useradd', 'userdel', 'usermod', 'groupadd', 'passwd',\n];\n\n/**\n * Check if a command contains paths outside the workspace.\n * Returns an error message if unsafe, null if safe.\n */\nexport function validateCommandPaths(command: string, workDir: string): string | null {\n const normalizedWorkDir = path.resolve(workDir);\n\n const firstWord = command.trim().split(/[\\s;|&]/)[0];\n if (BLOCKED_COMMANDS.includes(firstWord)) {\n return `Command blocked: \"${firstWord}\" is not allowed for security reasons.`;\n }\n\n // Block shell output/append redirections to absolute paths outside workspace\n const redirectPattern = /(?:>>?|[12&]>>?)\\s*(\\/([\\w.-]+\\/)*[\\w.-]+)/g;\n let redirectMatch;\n while ((redirectMatch = redirectPattern.exec(command)) !== null) {\n const targetPath = redirectMatch[1];\n if (targetPath !== '/dev/null') {\n const resolvedPath = path.resolve(targetPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: output redirection to \"${targetPath}\" is outside workspace.`;\n }\n }\n }\n\n // Block tee command writing outside workspace\n const teePattern = /\\btee\\s+(?:-a\\s+)?(\\/([\\w.-]+\\/)*[\\w.-]+)/g;\n let teeMatch;\n while ((teeMatch = teePattern.exec(command)) !== null) {\n const targetPath = teeMatch[1];\n const resolvedPath = path.resolve(targetPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: tee to \"${targetPath}\" is outside workspace.`;\n }\n }\n\n // Check dangerous commands for path arguments\n for (const cmd of DANGEROUS_COMMANDS) {\n const cmdPattern = new RegExp(`\\\\b${cmd}\\\\s+[^|;&]*`, 'g');\n let cmdMatch;\n while ((cmdMatch = cmdPattern.exec(command)) !== null) {\n const cmdWithArgs = cmdMatch[0];\n const pathsInCmd = cmdWithArgs.match(/\\/([\\w.-]+\\/)*[\\w.-]+/g) || [];\n for (const foundPath of pathsInCmd) {\n if (foundPath === '/dev/null' || foundPath.startsWith('/tmp/')) continue;\n const resolvedPath = path.resolve(foundPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: \"${cmd}\" with path \"${foundPath}\" is outside workspace.`;\n }\n }\n }\n }\n\n // Check absolute paths\n const absolutePathPattern = /(?:^|[\\s'\"=])(\\/([\\w.-]+\\/)+[\\w.-]*)/g;\n let match;\n while ((match = absolutePathPattern.exec(command)) !== null) {\n const foundPath = match[1];\n if (foundPath.startsWith('/dev/') || foundPath.startsWith('/tmp/') || foundPath === '/dev/null') {\n continue;\n }\n const resolvedPath = path.resolve(foundPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: path \"${foundPath}\" is outside workspace.`;\n }\n }\n\n // Block cd to outside workspace\n if (command.includes('cd /') && !command.includes(`cd ${normalizedWorkDir}`)) {\n const cdMatch = command.match(/cd\\s+(\\/[^\\s;|&]+)/);\n if (cdMatch) {\n const cdTarget = path.resolve(cdMatch[1]);\n if (!cdTarget.startsWith(normalizedWorkDir)) {\n return `Command blocked: \"cd ${cdMatch[1]}\" would navigate outside workspace.`;\n }\n }\n }\n\n // Block complex command substitution\n if (command.includes('`') || /\\$\\([^)]+\\)/.test(command)) {\n const simpleSubstitutions = /\\$\\((pwd|echo|date|whoami)\\)/g;\n const strippedCommand = command.replace(simpleSubstitutions, '');\n if (strippedCommand.includes('`') || /\\$\\([^)]+\\)/.test(strippedCommand)) {\n return `Command blocked: complex command substitution detected.`;\n }\n }\n\n return null;\n}\n\n/**\n * Create an execute tool that runs shell commands in the workspace directory.\n */\nexport function createExecuteTool(workDir: string) {\n const normalizedWorkDir = path.resolve(workDir);\n\n return tool(\n async ({ command, timeout = 60000 }) => {\n const validationError = validateCommandPaths(command, workDir);\n if (validationError) {\n return validationError;\n }\n\n return new Promise<string>((resolve) => {\n const parts = command.split(' ');\n const cmd = parts[0];\n const args = parts.slice(1);\n\n const proc = spawn(cmd, args, {\n cwd: workDir,\n shell: true,\n timeout,\n env: {\n PATH: process.env.PATH,\n NODE_PATH: process.env.NODE_PATH,\n NVM_DIR: process.env.NVM_DIR,\n NVM_BIN: process.env.NVM_BIN,\n SHELL: '/bin/sh',\n TERM: 'dumb',\n LANG: process.env.LANG || 'en_US.UTF-8',\n CI: 'true',\n HOME: normalizedWorkDir,\n TMPDIR: path.join(normalizedWorkDir, '.tmp'),\n TEMP: path.join(normalizedWorkDir, '.tmp'),\n TMP: path.join(normalizedWorkDir, '.tmp'),\n HISTFILE: '/dev/null',\n npm_config_cache: path.join(normalizedWorkDir, '.npm-cache'),\n npm_config_prefix: normalizedWorkDir,\n },\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('error', (error) => {\n resolve(`Error executing command: ${error.message}`);\n });\n\n proc.on('close', (code) => {\n const output = stdout + (stderr ? `\\n\\nStderr:\\n${stderr}` : '');\n if (code === 0) {\n resolve(output || 'Command completed successfully (no output)');\n } else {\n resolve(`Command exited with code ${code}\\n\\n${output}`);\n }\n });\n\n setTimeout(() => {\n proc.kill('SIGTERM');\n resolve(`Command timed out after ${timeout}ms`);\n }, timeout);\n });\n },\n {\n name: 'execute',\n description: `Execute a shell command in the workspace directory.\n\nIMPORTANT: You are restricted to your workspace directory. Use RELATIVE paths only:\n- ./schema.json (NOT /schema.json or absolute paths)\n- ./app (NOT /app or absolute paths)\n\nExamples:\n- orbital validate ./schema.json --json\n- npx kflow compile ./schema.json -o ./app --verify\n- cd ./app && npm install\n\nCommands using absolute paths outside your workspace will be blocked.`,\n schema: z.object({\n command: z.string().describe('The shell command to execute'),\n timeout: z.number().optional().describe('Timeout in milliseconds (default: 60000)'),\n }),\n },\n );\n}\n","/**\n * Schema Validation Tool\n *\n * Validates orbital schemas using the @almadar/cli npm package.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\n\nconst execAsync = promisify(exec);\n\n/**\n * Maximum number of validation attempts before forcing stop.\n */\nconst MAX_VALIDATION_ATTEMPTS = 5;\n\n/**\n * Create a validate_schema tool that validates schema.json in the workspace.\n *\n * Uses `npx @almadar/cli validate --json` for comprehensive Rust-based validation.\n *\n * Has a built-in cap of MAX_VALIDATION_ATTEMPTS to prevent\n * infinite validation-fix loops.\n */\nexport function createValidateSchemaTool(workDir: string) {\n const schemaPath = path.join(workDir, 'schema.json');\n let validationAttempts = 0;\n\n return tool(\n async () => {\n validationAttempts++;\n\n if (validationAttempts > MAX_VALIDATION_ATTEMPTS) {\n return JSON.stringify({\n success: true,\n valid: false,\n cappedValidation: true,\n message:\n `⚠️ VALIDATION CAP REACHED (${MAX_VALIDATION_ATTEMPTS} attempts). ` +\n `You've tried to fix this schema ${validationAttempts} times. ` +\n `STOP fixing validation errors and proceed with what you have.`,\n recommendation: 'STOP_FIXING',\n });\n }\n\n try {\n try {\n await fs.access(schemaPath);\n } catch {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'FILE_NOT_FOUND',\n path: '',\n message: 'File not found: schema.json. Create it first with write_file.',\n }],\n });\n }\n\n const { stdout, stderr } = await execAsync(\n `npx @almadar/cli validate \"${schemaPath}\" --json`,\n { timeout: 30000 },\n );\n\n let cliResult: {\n success: boolean;\n valid: boolean;\n errors?: Array<{\n code: string;\n path: string;\n message: string;\n suggestion?: string;\n fixGuidance?: string;\n expectedShape?: string;\n validValues?: string[];\n }>;\n warnings?: Array<{\n code: string;\n path: string;\n message: string;\n suggestion?: string;\n }>;\n stats?: {\n orbitals: number;\n entities: number;\n traits: number;\n pages: number;\n };\n };\n\n try {\n cliResult = JSON.parse(stdout);\n } catch {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'CLI_OUTPUT_ERROR',\n path: '',\n message: `Failed to parse orbital CLI output: ${stdout || stderr}`,\n }],\n });\n }\n\n const response = {\n ...cliResult,\n validationAttempt: validationAttempts,\n remainingAttempts: MAX_VALIDATION_ATTEMPTS - validationAttempts,\n ...(validationAttempts >= MAX_VALIDATION_ATTEMPTS - 1 && !cliResult.valid\n ? {\n warning:\n `⚠️ Only ${MAX_VALIDATION_ATTEMPTS - validationAttempts} validation attempt(s) remaining.`,\n }\n : {}),\n };\n\n return JSON.stringify(response);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (errorMessage.includes('ENOENT') || errorMessage.includes('not found')) {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'CLI_NOT_FOUND',\n path: '',\n message: '@almadar/cli not found. Ensure it is installed or accessible via npx.',\n suggestion: 'Install with: npm install -g @almadar/cli or ensure npx can access it.',\n }],\n });\n }\n\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'VALIDATION_ERROR',\n path: '',\n message: `Validation error: ${errorMessage}`,\n }],\n });\n }\n },\n {\n name: 'validate_schema',\n description: `Validate the schema.json file in the workspace.\n\nRuns validation using \\`npx @almadar/cli validate --json\\`.\n\nReturns detailed errors with code, path, message, suggestion, and expectedShape.\n\n⚠️ VALIDATION CAP: You have a maximum of 5 validation attempts.`,\n schema: z.object({}),\n },\n );\n}\n","/**\n * Schema Generation Tool (via Structured Output LLM)\n *\n * Generates KFlow schemas using OpenAI's structured output mode.\n * Uses @almadar/llm StructuredOutputClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalSchema } from '@almadar/core/types';\nimport {\n getStructuredOutputClient,\n isStructuredOutputAvailable,\n} from '@almadar/llm';\n\nconst GenerateSchemaInputSchema = z.object({\n userRequest: z.string().describe('The user\\'s natural language description'),\n suggestedTraits: z.array(z.string()).optional().describe('Suggested traits'),\n suggestedEntities: z.array(z.string()).optional().describe('Suggested entity names'),\n suggestedPages: z.array(z.string()).optional().describe('Suggested page types/names'),\n suggestedPatterns: z.array(z.string()).optional().describe('Suggested section patterns'),\n additionalInstructions: z.string().optional().describe('Additional instructions'),\n existingSchema: z.string().optional().describe('Existing schema JSON to update'),\n});\n\n/**\n * Create a tool that generates KFlow schemas using structured output.\n */\nexport function createGenerateSchemaTool() {\n return tool(\n async (input) => {\n if (!isStructuredOutputAvailable()) {\n return JSON.stringify({\n success: false,\n error: 'Structured output generation is not available. Set OPENAI_API_KEY.',\n });\n }\n\n try {\n let enhancedRequest = input.userRequest;\n\n if (input.suggestedEntities?.length) {\n enhancedRequest += `\\n\\nSuggested entities: ${input.suggestedEntities.join(', ')}`;\n }\n if (input.suggestedTraits?.length) {\n enhancedRequest += `\\n\\nSuggested traits: ${input.suggestedTraits.join(', ')}`;\n }\n if (input.suggestedPages?.length) {\n enhancedRequest += `\\n\\nSuggested pages: ${input.suggestedPages.join(', ')}`;\n }\n if (input.suggestedPatterns?.length) {\n enhancedRequest += `\\n\\nSuggested section patterns: ${input.suggestedPatterns.join(', ')}`;\n }\n\n const client = getStructuredOutputClient();\n\n const result = await client.generate<OrbitalSchema>({\n userRequest: enhancedRequest,\n schemaName: 'kflow_schema',\n additionalInstructions: input.additionalInstructions,\n existingContext: input.existingSchema,\n });\n\n return JSON.stringify({\n success: true,\n schema: result.data,\n usage: result.usage,\n latencyMs: result.latencyMs,\n model: result.model,\n zodValidation: result.zodValidation,\n }, null, 2);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return JSON.stringify({\n success: false,\n error: errorMessage,\n suggestion: 'Check the error message and try again with adjusted guidance.',\n });\n }\n },\n {\n name: 'generate_schema',\n description: `Generate a KFlow schema using structured output LLM.\n\nUse this to generate the BULK of the schema quickly, then surgically edit as needed.\n\nGUIDANCE YOU CAN PROVIDE:\n- suggestedTraits, suggestedEntities, suggestedPages, suggestedPatterns\n- additionalInstructions\n- existingSchema (for updates)`,\n schema: GenerateSchemaInputSchema,\n },\n );\n}\n","/**\n * Orbital Combiner\n *\n * Deterministically combines multiple Orbitals into a single OrbitalSchema.\n * This removes the need for LLM involvement in the combining step.\n *\n * All UI is rendered via render_ui effects from traits (no static sections).\n *\n * NOTE: Validation is handled externally via `orbital validate` CLI.\n * The combiner only assembles schemas - it does not validate them.\n *\n * @packageDocumentation\n */\n\nimport type {\n Orbital,\n OrbitalSchema,\n DomainContext,\n OrbitalDefinition,\n PageRef,\n Page,\n} from \"@almadar/core/types\";\nimport { isOrbitalDefinition, isPageReferenceString, isPageReferenceObject } from \"@almadar/core/types\";\n\n/**\n * Check if page is an inline definition (not a reference)\n */\nfunction isInlinePage(page: PageRef): page is Page {\n return !isPageReferenceString(page) && !isPageReferenceObject(page);\n}\n\n// Validation result type for API compatibility (actual validation done via Rust CLI)\nexport interface OrbitalSchemaValidationResult {\n valid: boolean;\n errors: Array<{ code: string; message: string; path?: string }>;\n warnings: Array<{ code: string; message: string; path?: string }>;\n}\n\n// Backward compatibility alias\ntype FullOrbitalUnit = Orbital;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CombinerOptions {\n /** Application name */\n name: string;\n /** Optional description */\n description?: string;\n /** Schema version */\n version?: string;\n /** Domain context */\n domain?: DomainContext;\n /** Whether to run validation (default: true) */\n validate?: boolean;\n /** Global theme */\n theme?: string;\n /** Default route (first page if not specified) */\n defaultRoute?: string;\n}\n\nexport interface CombinerResult {\n /** Whether combining succeeded */\n success: boolean;\n /** The combined OrbitalSchema (if successful) */\n schema?: OrbitalSchema;\n /** Validation result (if validation was run) */\n validation?: OrbitalSchemaValidationResult;\n /** Error message (if failed) */\n error?: string;\n /** Statistics about the combining */\n stats: {\n totalOrbitals: number;\n totalEntities: number;\n totalPages: number;\n totalTraits: number;\n };\n}\n\n// ============================================================================\n// Combiner Implementation\n// ============================================================================\n\n/**\n * Combine multiple Orbitals into a single OrbitalSchema.\n *\n * This function performs deterministic merging:\n * 1. Builds an OrbitalSchema from the Orbitals\n * 2. Optionally runs validation\n *\n * Note: All UI is rendered via render_ui effects from traits.\n *\n * @example\n * ```typescript\n * const result = combineOrbitals([taskOrbital, userOrbital], {\n * name: 'My App',\n * validate: true,\n * });\n *\n * if (result.success) {\n * // Write schema to file\n * await fs.writeFile('schema.json', JSON.stringify(result.schema, null, 2));\n * } else {\n * console.error(result.error);\n * console.error(result.validation?.errors);\n * }\n * ```\n */\nexport function combineOrbitals(\n orbitals: FullOrbitalUnit[],\n options: CombinerOptions,\n): CombinerResult {\n const {\n name,\n description,\n version = \"1.0.0\",\n domain,\n validate = true,\n theme,\n } = options;\n\n // Filter to only full orbital definitions for stats\n const orbitalDefs = orbitals.filter(isOrbitalDefinition);\n\n // Stats\n const stats = {\n totalOrbitals: orbitals.length,\n totalEntities: orbitalDefs.length, // 1 entity per orbital definition\n totalPages: orbitalDefs.reduce((sum, o) => sum + o.pages.length, 0),\n totalTraits: orbitalDefs.reduce((sum, o) => sum + o.traits.length, 0),\n };\n\n // Handle empty input\n if (orbitals.length === 0) {\n return {\n success: false,\n error: \"No orbitals provided. At least one Orbital is required.\",\n stats,\n };\n }\n\n try {\n // Build OrbitalSchema from Orbitals\n const orbitalSchema: OrbitalSchema = {\n name,\n description,\n version,\n domainContext: domain,\n orbitals,\n config: theme\n ? {\n theme: { primary: theme },\n }\n : undefined,\n };\n\n // NOTE: Validation is deprecated in combiner - use `orbital validate` CLI instead\n // The validate option is kept for API compatibility but does not run validation\n const validation: OrbitalSchemaValidationResult | undefined = validate\n ? { valid: true, errors: [], warnings: [] }\n : undefined;\n\n return {\n success: true,\n schema: orbitalSchema,\n validation,\n stats,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stats,\n };\n }\n}\n\n// Legacy alias removed - use combineOrbitals() directly\n\n/**\n * Combine orbitals and return only the schema (throws on error).\n * Use this when you want a simple API and will handle errors upstream.\n */\nexport function combineOrbitalsToSchema(\n orbitals: FullOrbitalUnit[],\n options: CombinerOptions,\n): OrbitalSchema {\n const result = combineOrbitals(orbitals, options);\n if (!result.success || !result.schema) {\n throw new Error(result.error || \"Failed to combine orbitals\");\n }\n return result.schema;\n}\n\n/**\n * Estimate the combination complexity (for progress indication).\n */\nexport function estimateCombineComplexity(orbitals: FullOrbitalUnit[]): {\n entities: number;\n pages: number;\n traits: number;\n totalSections: number;\n} {\n // Filter to only full orbital definitions\n const orbitalDefs = orbitals.filter(isOrbitalDefinition);\n return {\n entities: orbitalDefs.length,\n pages: orbitalDefs.reduce((sum, o) => sum + o.pages.length, 0),\n traits: orbitalDefs.reduce((sum, o) => sum + o.traits.length, 0),\n // Note: sections are no longer supported in trait-driven pages\n // Only count traits from inline page definitions (not references)\n totalSections: orbitalDefs.reduce(\n (sum, o) =>\n sum +\n o.pages.filter(isInlinePage).reduce((pSum: number, p) => pSum + (p.traits?.length ?? 0), 0),\n 0,\n ),\n };\n}\n","/**\n * Domain Language Tokens\n *\n * Token definitions for the domain language lexer.\n */\n\nexport enum TokenType {\n // Whitespace & Structure\n NEWLINE = 'NEWLINE',\n INDENT = 'INDENT',\n DEDENT = 'DEDENT',\n\n // Template Variables (e.g., {linkedEntity})\n TEMPLATE_VAR = 'TEMPLATE_VAR',\n\n // Keywords - Entity\n A = 'A',\n AN = 'AN',\n IS = 'IS',\n IT = 'IT',\n HAS = 'HAS',\n BELONGS = 'BELONGS',\n TO = 'TO',\n MANY = 'MANY',\n ONE = 'ONE',\n AS = 'AS',\n CAN = 'CAN',\n BE = 'BE',\n STARTS = 'STARTS',\n\n // Keywords - Page\n THE = 'THE',\n SHOWS = 'SHOWS',\n ENTITY = 'ENTITY', // Explicit entity reference for pages\n PURPOSE = 'PURPOSE',\n URL = 'URL',\n DISPLAYS = 'DISPLAYS',\n USERS = 'USERS',\n WHEN = 'WHEN',\n ACCESSED = 'ACCESSED',\n\n // Keywords - Behavior\n LIFECYCLE = 'LIFECYCLE',\n BEHAVIOR = 'BEHAVIOR',\n STATES = 'STATES',\n INITIAL = 'INITIAL',\n TRANSITIONS = 'TRANSITIONS',\n FROM = 'FROM',\n IF = 'IF',\n THEN = 'THEN',\n RULES = 'RULES',\n EVERY = 'EVERY',\n CHECK = 'CHECK',\n\n // Keywords - Guard\n AND = 'AND',\n OR = 'OR',\n NOT = 'NOT',\n PROVIDED = 'PROVIDED',\n EMPTY = 'EMPTY',\n USER = 'USER',\n OWNS = 'OWNS',\n THIS = 'THIS',\n\n // Field Types\n TEXT = 'TEXT',\n LONG_TEXT = 'LONG_TEXT',\n NUMBER = 'NUMBER',\n CURRENCY = 'CURRENCY',\n DATE = 'DATE',\n TIMESTAMP = 'TIMESTAMP',\n YES_NO = 'YES_NO',\n ENUM = 'ENUM',\n LIST = 'LIST',\n\n // Constraints\n REQUIRED = 'REQUIRED',\n UNIQUE = 'UNIQUE',\n AUTO = 'AUTO',\n DEFAULT = 'DEFAULT',\n\n // Operators\n COLON = 'COLON',\n COMMA = 'COMMA',\n PIPE = 'PIPE',\n DOT = 'DOT',\n DASH = 'DASH',\n LBRACKET = 'LBRACKET',\n RBRACKET = 'RBRACKET',\n LPAREN = 'LPAREN',\n RPAREN = 'RPAREN',\n GREATER_THAN = 'GREATER_THAN',\n LESS_THAN = 'LESS_THAN',\n GREATER_EQUAL = 'GREATER_EQUAL',\n LESS_EQUAL = 'LESS_EQUAL',\n EQUALS = 'EQUALS',\n NOT_EQUALS = 'NOT_EQUALS',\n\n // Literals\n IDENTIFIER = 'IDENTIFIER',\n STRING = 'STRING',\n NUMBER_LITERAL = 'NUMBER_LITERAL',\n BOOLEAN = 'BOOLEAN',\n\n // Special\n EOF = 'EOF',\n ERROR = 'ERROR',\n}\n\nexport interface Token {\n type: TokenType;\n value: string;\n line: number;\n column: number;\n offset: number;\n}\n\n// Keyword mappings (case-insensitive)\nexport const KEYWORDS: Record<string, TokenType> = {\n 'a': TokenType.A,\n 'an': TokenType.AN,\n 'is': TokenType.IS,\n 'it': TokenType.IT,\n 'has': TokenType.HAS,\n 'belongs': TokenType.BELONGS,\n 'to': TokenType.TO,\n 'many': TokenType.MANY,\n 'one': TokenType.ONE,\n 'as': TokenType.AS,\n 'can': TokenType.CAN,\n 'be': TokenType.BE,\n 'starts': TokenType.STARTS,\n 'the': TokenType.THE,\n 'shows': TokenType.SHOWS,\n 'entity': TokenType.ENTITY,\n 'purpose': TokenType.PURPOSE,\n 'url': TokenType.URL,\n 'displays': TokenType.DISPLAYS,\n 'users': TokenType.USERS,\n 'when': TokenType.WHEN,\n 'on': TokenType.WHEN, // \"on EVENT\" is equivalent to \"when EVENT\"\n 'accessed': TokenType.ACCESSED,\n 'lifecycle': TokenType.LIFECYCLE,\n 'behavior': TokenType.BEHAVIOR,\n 'states': TokenType.STATES,\n 'initial': TokenType.INITIAL,\n 'transitions': TokenType.TRANSITIONS,\n 'from': TokenType.FROM,\n 'if': TokenType.IF,\n 'then': TokenType.THEN,\n 'rules': TokenType.RULES,\n 'every': TokenType.EVERY,\n 'check': TokenType.CHECK,\n 'and': TokenType.AND,\n 'or': TokenType.OR,\n 'not': TokenType.NOT,\n 'provided': TokenType.PROVIDED,\n 'empty': TokenType.EMPTY,\n 'user': TokenType.USER,\n 'owns': TokenType.OWNS,\n 'this': TokenType.THIS,\n 'text': TokenType.TEXT,\n 'number': TokenType.NUMBER,\n 'currency': TokenType.CURRENCY,\n 'date': TokenType.DATE,\n 'timestamp': TokenType.TIMESTAMP,\n 'required': TokenType.REQUIRED,\n 'unique': TokenType.UNIQUE,\n 'auto': TokenType.AUTO,\n 'default': TokenType.DEFAULT,\n 'true': TokenType.BOOLEAN,\n 'false': TokenType.BOOLEAN,\n};\n\n// Multi-word keywords\nexport const MULTI_WORD_KEYWORDS: Record<string, TokenType> = {\n 'long text': TokenType.LONG_TEXT,\n 'yes/no': TokenType.YES_NO,\n 'belongs to': TokenType.BELONGS,\n 'has many': TokenType.HAS,\n 'has one': TokenType.HAS,\n 'starts as': TokenType.STARTS,\n 'can be': TokenType.CAN,\n 'it has': TokenType.IT,\n};\n","/**\n * Domain Language Lexer\n *\n * Tokenizes domain language text into tokens for parsing.\n */\n\nimport { Token, TokenType, KEYWORDS } from './tokens.js';\n\nexport class Lexer {\n private input: string;\n private pos: number = 0;\n private line: number = 1;\n private column: number = 1;\n private indentStack: number[] = [0];\n\n constructor(input: string) {\n this.input = input;\n }\n\n /**\n * Tokenize the entire input\n */\n tokenize(): Token[] {\n const tokens: Token[] = [];\n\n while (!this.isAtEnd()) {\n const token = this.nextToken();\n if (token) {\n tokens.push(token);\n }\n }\n\n // Add any remaining DEDENT tokens\n while (this.indentStack.length > 1) {\n this.indentStack.pop();\n tokens.push(this.makeToken(TokenType.DEDENT, ''));\n }\n\n tokens.push(this.makeToken(TokenType.EOF, ''));\n return tokens;\n }\n\n private nextToken(): Token | null {\n // Handle start of line (indentation)\n if (this.column === 1) {\n const indentToken = this.handleIndentation();\n if (indentToken) {\n return indentToken;\n }\n }\n\n this.skipWhitespace();\n\n if (this.isAtEnd()) {\n return null;\n }\n\n const char = this.peek();\n\n // Newline\n if (char === '\\n') {\n return this.consumeNewline();\n }\n\n // Skip comments\n if (char === '#') {\n this.skipToEndOfLine();\n return this.nextToken();\n }\n\n // String literal\n if (char === '\"' || char === \"'\") {\n return this.consumeString(char);\n }\n\n // Number\n if (this.isDigit(char)) {\n return this.consumeNumber();\n }\n\n // Operators and punctuation\n switch (char) {\n case ':':\n return this.consumeChar(TokenType.COLON);\n case ',':\n return this.consumeChar(TokenType.COMMA);\n case '|':\n return this.consumeChar(TokenType.PIPE);\n case '.':\n return this.consumeChar(TokenType.DOT);\n case '-':\n return this.consumeChar(TokenType.DASH);\n case '[':\n return this.consumeChar(TokenType.LBRACKET);\n case ']':\n return this.consumeChar(TokenType.RBRACKET);\n case '(':\n return this.consumeChar(TokenType.LPAREN);\n case ')':\n return this.consumeChar(TokenType.RPAREN);\n case '>':\n if (this.peekNext() === '=') {\n return this.consumeChars(2, TokenType.GREATER_EQUAL);\n }\n return this.consumeChar(TokenType.GREATER_THAN);\n case '<':\n if (this.peekNext() === '=') {\n return this.consumeChars(2, TokenType.LESS_EQUAL);\n }\n return this.consumeChar(TokenType.LESS_THAN);\n case '=':\n if (this.peekNext() === '=') {\n return this.consumeChars(2, TokenType.EQUALS);\n }\n break;\n case '!':\n if (this.peekNext() === '=') {\n return this.consumeChars(2, TokenType.NOT_EQUALS);\n }\n break;\n }\n\n // Template variable: {varName}\n if (char === '{') {\n return this.consumeTemplateVar();\n }\n\n // Identifier or keyword\n if (this.isAlpha(char)) {\n return this.consumeIdentifier();\n }\n\n // Unknown character - skip it\n this.advance();\n return this.nextToken();\n }\n\n private consumeTemplateVar(): Token {\n const start = this.pos;\n this.advance(); // consume '{'\n\n // Track nested braces to handle JSON objects with nested objects/arrays\n let braceDepth = 1;\n\n // Collect characters until matching closing '}'\n while (!this.isAtEnd() && braceDepth > 0 && this.peek() !== '\\n') {\n const ch = this.peek();\n if (ch === '{') {\n braceDepth++;\n } else if (ch === '}') {\n braceDepth--;\n if (braceDepth === 0) {\n this.advance(); // consume final '}'\n break;\n }\n }\n this.advance();\n }\n\n const value = this.input.substring(start, this.pos);\n return this.makeToken(TokenType.TEMPLATE_VAR, value);\n }\n\n private handleIndentation(): Token | null {\n if (this.isAtEnd() || this.peek() === '\\n') {\n return null;\n }\n\n let indent = 0;\n while (this.peek() === ' ' || this.peek() === '\\t') {\n indent += this.peek() === '\\t' ? 4 : 1;\n this.advance();\n }\n\n // Skip blank lines\n if (this.peek() === '\\n' || this.peek() === '#') {\n return null;\n }\n\n const currentIndent = this.indentStack[this.indentStack.length - 1];\n\n if (indent > currentIndent) {\n this.indentStack.push(indent);\n return this.makeToken(TokenType.INDENT, '');\n } else if (indent < currentIndent) {\n // Pop indent levels until we match\n while (this.indentStack.length > 1 &&\n this.indentStack[this.indentStack.length - 1] > indent) {\n this.indentStack.pop();\n }\n return this.makeToken(TokenType.DEDENT, '');\n }\n\n return null;\n }\n\n private consumeNewline(): Token {\n const token = this.makeToken(TokenType.NEWLINE, '\\n');\n this.advance();\n this.line++;\n this.column = 1;\n return token;\n }\n\n private consumeString(quote: string): Token {\n const startLine = this.line;\n const startColumn = this.column;\n const startOffset = this.pos;\n\n this.advance(); // Opening quote\n\n let value = '';\n while (!this.isAtEnd() && this.peek() !== quote) {\n if (this.peek() === '\\\\' && this.peekNext() === quote) {\n this.advance();\n value += quote;\n } else if (this.peek() === '\\n') {\n // Multi-line strings not supported\n break;\n } else {\n value += this.peek();\n }\n this.advance();\n }\n\n if (this.peek() === quote) {\n this.advance(); // Closing quote\n }\n\n return {\n type: TokenType.STRING,\n value,\n line: startLine,\n column: startColumn,\n offset: startOffset,\n };\n }\n\n private consumeNumber(): Token {\n const startLine = this.line;\n const startColumn = this.column;\n const startOffset = this.pos;\n\n let value = '';\n while (this.isDigit(this.peek())) {\n value += this.advance();\n }\n\n // Decimal part\n if (this.peek() === '.' && this.isDigit(this.peekNext())) {\n value += this.advance(); // .\n while (this.isDigit(this.peek())) {\n value += this.advance();\n }\n }\n\n return {\n type: TokenType.NUMBER_LITERAL,\n value,\n line: startLine,\n column: startColumn,\n offset: startOffset,\n };\n }\n\n private consumeIdentifier(): Token {\n const startLine = this.line;\n const startColumn = this.column;\n const startOffset = this.pos;\n\n let value = '';\n while (this.isAlphaNumeric(this.peek()) || this.peek() === '_' || this.peek() === '/') {\n value += this.advance();\n }\n\n // Check for keywords\n const lowerValue = value.toLowerCase();\n const keywordType = KEYWORDS[lowerValue];\n\n return {\n type: keywordType || TokenType.IDENTIFIER,\n value,\n line: startLine,\n column: startColumn,\n offset: startOffset,\n };\n }\n\n private consumeChar(type: TokenType): Token {\n const token = this.makeToken(type, this.peek());\n this.advance();\n return token;\n }\n\n private consumeChars(count: number, type: TokenType): Token {\n let value = '';\n for (let i = 0; i < count; i++) {\n value += this.advance();\n }\n return {\n type,\n value,\n line: this.line,\n column: this.column - count,\n offset: this.pos - count,\n };\n }\n\n private skipWhitespace(): void {\n while (!this.isAtEnd() && (this.peek() === ' ' || this.peek() === '\\t')) {\n this.advance();\n }\n }\n\n private skipToEndOfLine(): void {\n while (!this.isAtEnd() && this.peek() !== '\\n') {\n this.advance();\n }\n }\n\n private makeToken(type: TokenType, value: string): Token {\n return {\n type,\n value,\n line: this.line,\n column: this.column,\n offset: this.pos,\n };\n }\n\n private peek(): string {\n return this.input[this.pos] || '\\0';\n }\n\n private peekNext(): string {\n return this.input[this.pos + 1] || '\\0';\n }\n\n private advance(): string {\n const char = this.peek();\n this.pos++;\n this.column++;\n return char;\n }\n\n private isAtEnd(): boolean {\n return this.pos >= this.input.length;\n }\n\n private isDigit(char: string): boolean {\n return char >= '0' && char <= '9';\n }\n\n private isAlpha(char: string): boolean {\n return (char >= 'a' && char <= 'z') ||\n (char >= 'A' && char <= 'Z') ||\n char === '_';\n }\n\n private isAlphaNumeric(char: string): boolean {\n return this.isAlpha(char) || this.isDigit(char);\n }\n}\n\n/**\n * Convenience function to tokenize a string\n */\nexport function tokenize(input: string): Token[] {\n const lexer = new Lexer(input);\n return lexer.tokenize();\n}\n","/**\n * Entity Parser\n *\n * Parses entity definitions from domain language.\n * All entity references are explicit (e.g., Order, User, Task).\n */\n\nimport type {\n DomainEntity,\n DomainField,\n DomainFieldType,\n DomainRelationship,\n RelationshipType,\n ParseResult,\n ParseError,\n} from '../types.js';\nimport { Lexer } from '../lexer.js';\nimport { TokenType, Token } from '../tokens.js';\n\ninterface EntityParseContext {\n errors: ParseError[];\n warnings: ParseError[];\n}\n\n/**\n * Parse an entity definition from domain text\n *\n * @example\n * parseEntity(`\n * A Order is a customer purchase request\n * It has:\n * - order number: text, required, unique\n * - amount: currency\n * - status: Pending | Confirmed | Shipped\n * It belongs to User\n * It can be: Pending, Confirmed, Shipped, Delivered, Cancelled\n * It starts as Pending\n * `)\n */\nexport function parseEntity(text: string): ParseResult<DomainEntity> {\n const ctx: EntityParseContext = { errors: [], warnings: [] };\n const lexer = new Lexer(text);\n const tokens = lexer.tokenize();\n\n let pos = 0;\n\n // Helper to get current token\n const current = () => tokens[pos] || { type: TokenType.EOF, value: '', line: 0, column: 0, offset: 0 };\n const peek = (offset = 0) => tokens[pos + offset] || { type: TokenType.EOF, value: '', line: 0, column: 0, offset: 0 };\n const advance = () => tokens[pos++];\n const isAtEnd = () => current().type === TokenType.EOF;\n const skip = (type: TokenType) => {\n while (current().type === type) advance();\n };\n\n // Skip leading whitespace\n skip(TokenType.NEWLINE);\n\n // Parse \"A [Name] is [description]\"\n const entityHeader = parseEntityHeader();\n if (!entityHeader) {\n return {\n success: false,\n errors: ctx.errors.length > 0 ? ctx.errors : [{\n message: 'Expected entity definition starting with \"A [Name] is...\"',\n }],\n warnings: [],\n };\n }\n\n const entity: DomainEntity = {\n type: 'entity',\n name: entityHeader.name,\n description: entityHeader.description,\n fields: [],\n relationships: [],\n };\n\n skip(TokenType.NEWLINE);\n\n // Parse remaining sections (fields, relationships, states)\n while (!isAtEnd()) {\n skip(TokenType.NEWLINE);\n if (isAtEnd()) break;\n\n const sectionResult = parseSection(entity);\n if (!sectionResult) {\n // Skip unknown content\n advance();\n }\n }\n\n return {\n success: true,\n data: entity,\n errors: ctx.errors,\n warnings: ctx.warnings,\n };\n\n // === Helper Functions ===\n\n // Check if a token can be used as an entity name\n // Some keywords like \"User\", \"Task\", \"Order\" are valid entity names\n function isEntityName(token: Token): boolean {\n // Identifiers are always valid\n if (token.type === TokenType.IDENTIFIER) return true;\n\n // Certain keywords can also be entity names when capitalized\n const keywordEntityNames = [\n TokenType.USER, // \"User\"\n TokenType.TEXT, // \"Text\" (unlikely but possible)\n TokenType.NUMBER, // \"Number\" (unlikely but possible)\n TokenType.DATE, // \"Date\" (unlikely but possible)\n ];\n return keywordEntityNames.includes(token.type);\n }\n\n function parseEntityHeader(): { name: string; description: string } | null {\n // Expect \"A\" or \"An\"\n if (current().type !== TokenType.A && current().type !== TokenType.AN) {\n ctx.errors.push({ message: 'Expected \"A\" or \"An\" at start of entity definition' });\n return null;\n }\n advance();\n\n // Get entity name (identifier or keyword that can be an entity name)\n if (!isEntityName(current())) {\n ctx.errors.push({ message: 'Expected entity name after \"A\"' });\n return null;\n }\n const name = current().value;\n advance();\n\n // Expect \"is\"\n if (current().type !== TokenType.IS) {\n ctx.errors.push({ message: `Expected \"is\" after entity name \"${name}\"` });\n return null;\n }\n advance();\n\n // Collect description until newline\n const descParts: string[] = [];\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n descParts.push(current().value);\n advance();\n }\n\n return {\n name,\n description: descParts.join(' ').trim(),\n };\n }\n\n function parseSection(entity: DomainEntity): boolean {\n const token = current();\n\n // INDENT followed by \"- has [field] as [type]\" (SKILL.md format)\n if (token.type === TokenType.INDENT) {\n advance();\n parseIndentedFields(entity);\n return true;\n }\n\n // \"It has:\" - fields section (old format)\n if (token.type === TokenType.IT) {\n advance();\n if (current().type === TokenType.HAS) {\n advance();\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n parseFieldsSection(entity);\n return true;\n }\n\n // \"It belongs to [Entity]\"\n if (current().type === TokenType.BELONGS) {\n advance();\n if (current().type === TokenType.TO) {\n advance();\n parseRelationship(entity, 'belongs_to');\n return true;\n }\n }\n\n // \"It can be: [states]\"\n if (current().type === TokenType.CAN) {\n advance();\n if (current().type === TokenType.BE) {\n advance();\n skip(TokenType.COLON);\n parseStates(entity);\n return true;\n }\n }\n\n // \"It starts as [state]\"\n if (current().type === TokenType.STARTS) {\n advance();\n if (current().type === TokenType.AS) {\n advance();\n parseInitialState(entity);\n return true;\n }\n }\n }\n\n // \"has many [Entity]\" - relationship\n if (token.type === TokenType.HAS) {\n advance();\n if (current().type === TokenType.MANY) {\n advance();\n parseRelationship(entity, 'has_many');\n return true;\n }\n if (current().type === TokenType.ONE) {\n advance();\n parseRelationship(entity, 'has_one');\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Parse indented field lines in SKILL.md format:\n * - has [field] as [type] (constraints)\n * - belongs to [Entity]\n * - has many [Entity]s\n */\n function parseIndentedFields(entity: DomainEntity): void {\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Skip leading dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n // \"has [field] as [type]\" pattern\n if (current().type === TokenType.HAS) {\n advance();\n\n // Check for \"has many [Entity]s\" pattern\n if (current().type === TokenType.MANY) {\n advance();\n parseRelationship(entity, 'has_many');\n continue;\n }\n\n // Parse field: \"[name] as [type] (constraints)\"\n const field = parseHasFieldLine();\n if (field) {\n entity.fields.push(field);\n }\n continue;\n }\n\n // \"belongs to [Entity]\" pattern\n if (current().type === TokenType.BELONGS) {\n advance();\n if (current().type === TokenType.TO) {\n advance();\n parseRelationship(entity, 'belongs_to');\n continue;\n }\n }\n\n // Skip unrecognized content to end of line\n while (!isAtEnd() && current().type !== TokenType.NEWLINE && current().type !== TokenType.DEDENT) {\n advance();\n }\n skip(TokenType.NEWLINE);\n }\n\n // Consume DEDENT\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n /**\n * Parse \"has [field] as [type] (constraints)\" pattern\n */\n function parseHasFieldLine(): DomainField | null {\n // Get field name\n if (current().type !== TokenType.IDENTIFIER) {\n return null;\n }\n const fieldName = toCamelCase(current().value);\n advance();\n\n // Expect \"as\"\n if (current().type !== TokenType.AS) {\n // Skip to end of line\n while (!isAtEnd() && current().type !== TokenType.NEWLINE && current().type !== TokenType.DEDENT) {\n advance();\n }\n return null;\n }\n advance();\n\n // Parse field type\n const field: DomainField = {\n type: 'field',\n name: fieldName,\n fieldType: 'text',\n required: false,\n unique: false,\n auto: false,\n };\n\n // Get field type (may be multiple tokens like \"long text\" or \"yes/no\")\n const typeParts: string[] = [];\n while (!isAtEnd() &&\n current().type !== TokenType.NEWLINE &&\n current().type !== TokenType.DEDENT &&\n current().type !== TokenType.LPAREN &&\n current().value !== 'with') {\n typeParts.push(current().value);\n advance();\n }\n const typeText = typeParts.join(' ').trim().toLowerCase();\n\n // Map type text to DomainFieldType\n if (typeText.includes('long text')) {\n field.fieldType = 'long text';\n } else if (typeText === 'text' || typeText === 'string') {\n field.fieldType = 'text';\n } else if (typeText === 'number' || typeText === 'integer') {\n field.fieldType = 'number';\n } else if (typeText === 'currency') {\n field.fieldType = 'currency';\n } else if (typeText === 'yes/no' || typeText === 'boolean') {\n field.fieldType = 'yes/no';\n } else if (typeText === 'date') {\n field.fieldType = 'date';\n } else if (typeText === 'timestamp' || typeText === 'datetime') {\n field.fieldType = 'timestamp';\n } else if (typeText.startsWith('enum')) {\n field.fieldType = 'enum';\n // Extract enum values from \"enum [val1, val2, val3]\"\n const enumMatch = typeText.match(/enum\\s*\\[([^\\]]+)\\]/);\n if (enumMatch) {\n field.enumValues = enumMatch[1].split(',').map(v => v.trim());\n }\n } else if (typeText === 'list' || typeText === 'array') {\n field.fieldType = 'list';\n } else if (typeText === 'object') {\n field.fieldType = 'object';\n } else {\n field.fieldType = 'text';\n }\n\n // Parse constraints in parentheses: (required), (optional), with default [value]\n if (current().type === TokenType.LPAREN) {\n advance();\n while (!isAtEnd() && current().type !== TokenType.RPAREN && current().type !== TokenType.NEWLINE) {\n const constraint = current().value.toLowerCase();\n if (constraint === 'required') {\n field.required = true;\n } else if (constraint === 'optional') {\n field.required = false;\n } else if (constraint === 'unique') {\n field.unique = true;\n }\n advance();\n }\n if (current().type === TokenType.RPAREN) {\n advance();\n }\n }\n\n // Parse \"with default [value]\"\n if (current().type === TokenType.IDENTIFIER && current().value.toLowerCase() === 'with') {\n advance();\n if (current().type === TokenType.DEFAULT) {\n advance();\n // Get default value\n if (current().type === TokenType.STRING) {\n field.default = current().value;\n advance();\n } else if (current().type === TokenType.NUMBER_LITERAL) {\n field.default = parseFloat(current().value);\n advance();\n } else if (current().type === TokenType.BOOLEAN) {\n field.default = current().value === 'true';\n advance();\n } else if (current().type === TokenType.IDENTIFIER) {\n field.default = current().value;\n advance();\n }\n }\n }\n\n return field;\n }\n\n function parseFieldsSection(entity: DomainEntity): void {\n // Expect INDENT\n if (current().type !== TokenType.INDENT) {\n return;\n }\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Parse field line: \"- [name]: [type], [constraints]\"\n const field = parseFieldLine();\n if (field) {\n entity.fields.push(field);\n }\n\n skip(TokenType.NEWLINE);\n }\n\n // Consume DEDENT\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n function parseFieldLine(): DomainField | null {\n // Optional dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n // Field name (may be multiple words)\n const nameParts: string[] = [];\n while (!isAtEnd() &&\n current().type !== TokenType.COLON &&\n current().type !== TokenType.NEWLINE) {\n nameParts.push(current().value);\n advance();\n }\n\n if (nameParts.length === 0) {\n return null;\n }\n\n const fieldName = toCamelCase(nameParts.join(' '));\n\n // Expect colon\n if (current().type !== TokenType.COLON) {\n ctx.errors.push({ message: `Expected \":\" after field name \"${fieldName}\"` });\n return null;\n }\n advance();\n\n // Parse field type and constraints\n return parseFieldTypeAndConstraints(fieldName);\n }\n\n function parseFieldTypeAndConstraints(fieldName: string): DomainField {\n const field: DomainField = {\n type: 'field',\n name: fieldName,\n fieldType: 'text',\n required: false,\n unique: false,\n auto: false,\n };\n\n const parts: string[] = [];\n\n // Collect all tokens until newline\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n parts.push(current().value);\n advance();\n }\n\n // Parse the parts\n const content = parts.join(' ').trim();\n\n // Check for enum (contains |)\n if (content.includes('|')) {\n field.fieldType = 'enum';\n field.enumValues = content.split('|').map(v => v.trim()).filter(v => v);\n return field;\n }\n\n // Split by comma for type and constraints\n const segments = content.split(',').map(s => s.trim().toLowerCase());\n\n for (const segment of segments) {\n // Check for field types (all types from DOMAIN_TO_SCHEMA_FIELD_TYPE)\n if (segment === 'text') field.fieldType = 'text';\n else if (segment === 'long text') field.fieldType = 'long text';\n else if (segment === 'number') field.fieldType = 'number';\n else if (segment === 'currency') field.fieldType = 'currency';\n else if (segment === 'date') field.fieldType = 'date';\n else if (segment === 'timestamp') field.fieldType = 'timestamp';\n else if (segment === 'datetime') field.fieldType = 'datetime';\n else if (segment === 'yes/no' || segment === 'boolean') field.fieldType = 'yes/no';\n else if (segment === 'list') field.fieldType = 'list';\n else if (segment === 'object') field.fieldType = 'object';\n // Check for constraints\n else if (segment === 'required') field.required = true;\n else if (segment === 'unique') field.unique = true;\n else if (segment === 'auto') field.auto = true;\n else if (segment.startsWith('default ')) {\n field.default = parseValue(segment.slice(8));\n }\n }\n\n return field;\n }\n\n function parseRelationship(entity: DomainEntity, relType: RelationshipType): void {\n // Get target entity name\n if (current().type !== TokenType.IDENTIFIER) {\n return;\n }\n const targetEntity = current().value;\n advance();\n\n let alias: string | undefined;\n\n // Check for \"as [Alias]\"\n if (current().type === TokenType.AS) {\n advance();\n if (current().type === TokenType.IDENTIFIER) {\n alias = current().value;\n advance();\n }\n }\n\n entity.relationships.push({\n type: 'relationship',\n relationshipType: relType,\n targetEntity,\n alias,\n });\n }\n\n function parseStates(entity: DomainEntity): void {\n const states: string[] = [];\n\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n if (current().type === TokenType.IDENTIFIER) {\n states.push(current().value);\n }\n advance();\n }\n\n entity.states = states;\n }\n\n function parseInitialState(entity: DomainEntity): void {\n if (current().type === TokenType.IDENTIFIER) {\n entity.initialState = current().value;\n advance();\n }\n }\n}\n\n/**\n * Format an entity AST back to domain text\n */\nexport function formatEntityToDomain(entity: DomainEntity): string {\n const lines: string[] = [];\n\n // Header line\n const article = startsWithVowel(entity.name) ? 'An' : 'A';\n lines.push(`${article} ${entity.name} is ${entity.description}`);\n\n // Fields section\n if (entity.fields.length > 0) {\n lines.push('');\n lines.push('It has:');\n for (const field of entity.fields) {\n lines.push(` - ${toSpaceSeparated(field.name)}: ${formatFieldType(field)}`);\n }\n }\n\n // Relationships\n for (const rel of entity.relationships) {\n lines.push('');\n if (rel.relationshipType === 'belongs_to') {\n const aliasStr = rel.alias ? ` as ${rel.alias}` : '';\n lines.push(`It belongs to ${rel.targetEntity}${aliasStr}`);\n } else if (rel.relationshipType === 'has_many') {\n lines.push(`It has many ${rel.targetEntity}`);\n } else if (rel.relationshipType === 'has_one') {\n lines.push(`It has one ${rel.targetEntity}`);\n }\n }\n\n // States\n if (entity.states && entity.states.length > 0) {\n lines.push('');\n lines.push(`It can be: ${entity.states.join(', ')}`);\n if (entity.initialState) {\n lines.push(`It starts as ${entity.initialState}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format entity AST to KFlow schema\n */\nexport function formatEntityToSchema(entity: DomainEntity): Record<string, unknown> {\n const fields = entity.fields.map(field => ({\n name: field.name,\n type: mapFieldTypeToSchema(field.fieldType),\n required: field.required || undefined,\n unique: field.unique || undefined,\n auto: field.auto || undefined,\n values: field.enumValues, // OrbitalSchema uses 'values' not 'enumValues'\n default: field.default,\n }));\n\n // Add relationship fields\n for (const rel of entity.relationships) {\n if (rel.relationshipType === 'belongs_to') {\n const fieldName = rel.alias\n ? toCamelCase(rel.alias) + 'Id'\n : toCamelCase(rel.targetEntity) + 'Id';\n fields.push({\n name: fieldName,\n type: 'relation',\n required: undefined,\n unique: undefined,\n auto: undefined,\n values: undefined,\n default: undefined,\n relation: {\n entity: rel.targetEntity,\n type: 'many-to-one',\n },\n } as any);\n }\n }\n\n return {\n name: entity.name,\n collection: toKebabCase(entity.name) + 's',\n fields: fields.filter(f => Object.keys(f).length > 0),\n states: entity.states,\n initialState: entity.initialState,\n };\n}\n\n// === Utility Functions ===\n\nfunction toCamelCase(text: string): string {\n return text\n .toLowerCase()\n .split(/\\s+/)\n .map((word, index) =>\n index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join('');\n}\n\nfunction toSpaceSeparated(text: string): string {\n return text.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\n}\n\nfunction toKebabCase(text: string): string {\n return text\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .toLowerCase();\n}\n\n/**\n * Check if a word starts with a vowel SOUND (not just vowel letter)\n * Used for determining \"A\" vs \"An\" article\n */\nfunction startsWithVowel(text: string): boolean {\n const lower = text.toLowerCase();\n\n // Words that start with vowel letter but consonant sound (use \"A\")\n // \"U\" pronounced as \"yoo\": user, unicorn, unique, universal, union, etc.\n // \"Eu\" pronounced as \"yoo\": European, eureka, etc.\n if (/^(u[^aeiou]|uni|euro)/i.test(lower)) {\n return false;\n }\n\n // Words that start with consonant letter but vowel sound (use \"An\")\n // Silent \"H\": hour, honest, honor, heir, etc.\n if (/^(hour|honest|honor|heir)/i.test(lower)) {\n return true;\n }\n\n // Default: check if first letter is a vowel\n return /^[aeiou]/i.test(text);\n}\n\nfunction parseValue(text: string): string | number | boolean {\n text = text.trim();\n if (text.toLowerCase() === 'true') return true;\n if (text.toLowerCase() === 'false') return false;\n const num = parseFloat(text);\n if (!isNaN(num)) return num;\n return text.replace(/^[\"']|[\"']$/g, '');\n}\n\nfunction formatFieldType(field: DomainField): string {\n const parts: string[] = [];\n\n if (field.enumValues && field.enumValues.length > 0) {\n parts.push(field.enumValues.join(' | '));\n } else {\n parts.push(field.fieldType);\n }\n\n if (field.required) parts.push('required');\n if (field.unique) parts.push('unique');\n if (field.auto) parts.push('auto');\n if (field.default !== undefined) {\n parts.push(`default ${field.default}`);\n }\n\n return parts.join(', ');\n}\n\nfunction mapFieldTypeToSchema(fieldType: DomainFieldType): string {\n // Use the centralized DOMAIN_TO_SCHEMA_FIELD_TYPE from types.ts\n const mapping: Record<DomainFieldType, string> = {\n 'text': 'string',\n 'long text': 'string',\n 'number': 'number',\n 'currency': 'number',\n 'date': 'date',\n 'timestamp': 'timestamp',\n 'datetime': 'datetime',\n 'yes/no': 'boolean',\n 'enum': 'enum',\n 'list': 'array',\n 'object': 'object',\n 'relation': 'relation',\n };\n return mapping[fieldType] || 'string';\n}\n","/**\n * Page Parser\n *\n * Parses page definitions from domain language.\n */\n\nimport type {\n DomainPage,\n DomainPageSection,\n DomainPageAction,\n ParseResult,\n ParseError,\n} from '../types.js';\nimport { Lexer } from '../lexer.js';\nimport { TokenType } from '../tokens.js';\n\ninterface PageParseContext {\n errors: ParseError[];\n warnings: ParseError[];\n}\n\n/**\n * Parse a page definition from domain text\n *\n * @example\n * parsePage(`\n * The Dashboard shows an overview of system activity\n * Purpose: Help users monitor their tasks and orders\n * URL: /dashboard\n *\n * It displays:\n * - Summary statistics for today\n * - Recent orders list\n * - Pending tasks requiring attention\n *\n * Users can:\n * - Click a task to view details\n * - Filter orders by status\n * `)\n */\nexport function parsePage(text: string): ParseResult<DomainPage> {\n const ctx: PageParseContext = { errors: [], warnings: [] };\n const lexer = new Lexer(text);\n const tokens = lexer.tokenize();\n\n let pos = 0;\n\n // Helper functions\n const current = () => tokens[pos] || { type: TokenType.EOF, value: '', line: 0, column: 0, offset: 0 };\n const advance = () => tokens[pos++];\n const isAtEnd = () => current().type === TokenType.EOF;\n const skip = (type: TokenType) => {\n while (current().type === type) advance();\n };\n\n // Skip leading whitespace\n skip(TokenType.NEWLINE);\n\n // Parse \"The [PageName] shows [description]\"\n const pageHeader = parsePageHeader();\n if (!pageHeader) {\n return {\n success: false,\n errors: ctx.errors.length > 0 ? ctx.errors : [{\n message: 'Expected page definition starting with \"The [PageName] shows...\"',\n }],\n warnings: [],\n };\n }\n\n const page: DomainPage = {\n type: 'page',\n name: pageHeader.name,\n description: pageHeader.description,\n purpose: '',\n url: pageHeader.url || '',\n primaryEntity: pageHeader.primaryEntity,\n traitName: pageHeader.traitName,\n sections: [],\n actions: [],\n };\n\n skip(TokenType.NEWLINE);\n\n // Parse remaining sections\n while (!isAtEnd()) {\n skip(TokenType.NEWLINE);\n if (isAtEnd()) break;\n\n const parsed = parsePageSection(page);\n if (!parsed) {\n advance();\n }\n }\n\n // Generate URL if not provided\n if (!page.url) {\n page.url = '/' + toKebabCase(page.name.replace(/Page$/i, ''));\n }\n\n return {\n success: true,\n data: page,\n errors: ctx.errors,\n warnings: ctx.warnings,\n };\n\n // === Helper Functions ===\n\n function parsePageHeader(): { name: string; description: string; url?: string; primaryEntity?: string; traitName?: string } | null {\n // Check for alternative format: \"[PageName] at /[path]:\"\n if (current().type === TokenType.IDENTIFIER) {\n const firstToken = current().value;\n advance();\n\n // Check if next token is \"at\" or more identifiers followed by \"at\"\n const nameParts: string[] = [firstToken];\n while (current().type === TokenType.IDENTIFIER && current().value.toLowerCase() !== 'at') {\n nameParts.push(current().value);\n advance();\n }\n\n // Check for \"at\" keyword (which is just an identifier)\n if (current().type === TokenType.IDENTIFIER && current().value.toLowerCase() === 'at') {\n advance();\n\n // Collect URL path\n const pathParts: string[] = [];\n while (!isAtEnd() && current().type !== TokenType.COLON && current().type !== TokenType.NEWLINE) {\n pathParts.push(current().value);\n advance();\n }\n const url = pathParts.join('');\n\n // Skip colon\n if (current().type === TokenType.COLON) {\n advance();\n }\n\n // Normalize page name - preserve PascalCase\n let name = nameParts.map(p => toPascalCase(p)).join('');\n if (!name.toLowerCase().endsWith('page')) {\n name += 'Page';\n }\n\n // Parse the page body for additional info\n skip(TokenType.NEWLINE);\n let primaryEntity: string | undefined;\n let traitName: string | undefined;\n\n // Parse indented lines for \"shows\", \"view type\", \"is initial page\"\n if (current().type === TokenType.INDENT) {\n advance();\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Skip dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n // Check for \"shows [Entity] using [Trait]\"\n if (current().type === TokenType.SHOWS) {\n advance();\n if (current().type === TokenType.IDENTIFIER) {\n primaryEntity = current().value;\n advance();\n }\n // Check for \"using [TraitName]\"\n if (current().type === TokenType.IDENTIFIER && current().value.toLowerCase() === 'using') {\n advance();\n if (current().type === TokenType.IDENTIFIER) {\n traitName = current().value;\n advance();\n }\n }\n }\n\n // Skip to end of line\n while (!isAtEnd() && current().type !== TokenType.NEWLINE && current().type !== TokenType.DEDENT) {\n advance();\n }\n skip(TokenType.NEWLINE);\n }\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n return {\n name,\n description: `Page at ${url}`,\n url,\n primaryEntity,\n traitName,\n };\n }\n\n // Reset position if not \"at\" format - rewind not possible with current design\n // Fall through to old format check\n }\n\n // Original format: \"The [PageName] shows [description]\"\n // Expect \"The\"\n if (current().type !== TokenType.THE) {\n ctx.errors.push({ message: 'Expected \"The\" at start of page definition' });\n return null;\n }\n advance();\n\n // Get page name (may be multiple identifiers like \"Task List Page\")\n const nameParts: string[] = [];\n while (current().type === TokenType.IDENTIFIER) {\n nameParts.push(current().value);\n advance();\n }\n\n if (nameParts.length === 0) {\n ctx.errors.push({ message: 'Expected page name after \"The\"' });\n return null;\n }\n\n // Normalize page name - preserve PascalCase\n let name = nameParts.map(p => toPascalCase(p)).join('');\n if (!name.toLowerCase().endsWith('page')) {\n name += 'Page';\n }\n\n // Expect \"shows\"\n if (current().type !== TokenType.SHOWS) {\n ctx.errors.push({ message: `Expected \"shows\" after page name \"${name}\"` });\n return null;\n }\n advance();\n\n // Collect description until newline\n const descParts: string[] = [];\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n descParts.push(current().value);\n advance();\n }\n\n return {\n name,\n description: descParts.join(' ').trim(),\n };\n }\n\n function parsePageSection(page: DomainPage): boolean {\n const token = current();\n\n // \"Entity: [EntityName]\" - EXPLICIT entity reference (no inference!)\n if (token.type === TokenType.ENTITY) {\n advance();\n skip(TokenType.COLON);\n page.primaryEntity = collectUntilNewline();\n return true;\n }\n\n // \"Purpose: [text]\"\n if (token.type === TokenType.PURPOSE) {\n advance();\n skip(TokenType.COLON);\n page.purpose = collectUntilNewline();\n return true;\n }\n\n // \"URL: [path]\"\n if (token.type === TokenType.URL) {\n advance();\n skip(TokenType.COLON);\n page.url = collectUntilNewline();\n return true;\n }\n\n // \"It displays:\" - sections\n if (token.type === TokenType.IT) {\n advance();\n if (current().type === TokenType.DISPLAYS) {\n advance();\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n parseDisplaysSection(page);\n return true;\n }\n }\n\n // \"Users can:\" or \"Users\" - actions\n if (token.type === TokenType.USERS) {\n advance();\n if (current().type === TokenType.CAN) {\n advance();\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n parseActionsSection(page);\n return true;\n }\n }\n\n // \"When accessed:\" - onAccess\n if (token.type === TokenType.WHEN) {\n advance();\n if (current().type === TokenType.ACCESSED) {\n advance();\n skip(TokenType.COLON);\n page.onAccess = collectUntilNewline();\n return true;\n }\n }\n\n return false;\n }\n\n function parseDisplaysSection(page: DomainPage): void {\n // Expect INDENT\n if (current().type !== TokenType.INDENT) {\n return;\n }\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Parse section line: \"- [description]\"\n const section = parseSectionLine();\n if (section) {\n page.sections.push(section);\n }\n\n skip(TokenType.NEWLINE);\n }\n\n // Consume DEDENT\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n function parseSectionLine(): DomainPageSection | null {\n // Optional dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n const description = collectUntilNewline();\n if (!description) {\n return null;\n }\n\n return {\n type: 'page_section',\n description,\n };\n }\n\n function parseActionsSection(page: DomainPage): void {\n // Expect INDENT\n if (current().type !== TokenType.INDENT) {\n return;\n }\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Parse action line: \"- [trigger] to [action]\"\n const action = parseActionLine();\n if (action) {\n page.actions.push(action);\n }\n\n skip(TokenType.NEWLINE);\n }\n\n // Consume DEDENT\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n function parseActionLine(): DomainPageAction | null {\n // Optional dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n const fullText = collectUntilNewline();\n if (!fullText) {\n return null;\n }\n\n // Split on \" to \" to separate trigger and action\n const toIndex = fullText.toLowerCase().indexOf(' to ');\n if (toIndex === -1) {\n // No \"to\" found, treat whole thing as trigger\n return {\n type: 'page_action',\n trigger: fullText,\n action: '',\n };\n }\n\n return {\n type: 'page_action',\n trigger: fullText.slice(0, toIndex).trim(),\n action: fullText.slice(toIndex + 4).trim(),\n };\n }\n\n function collectUntilNewline(): string {\n const parts: string[] = [];\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n parts.push(current().value);\n advance();\n }\n return parts.join(' ').trim();\n }\n}\n\n/**\n * Format a page AST back to domain text\n */\nexport function formatPageToDomain(page: DomainPage): string {\n const lines: string[] = [];\n\n // Header line\n const displayName = page.name.replace(/Page$/, '');\n lines.push(`The ${displayName} shows ${page.description}`);\n\n // Entity - EXPLICIT reference (no inference on parse!)\n if (page.primaryEntity) {\n lines.push(`Entity: ${page.primaryEntity}`);\n }\n\n // Purpose\n if (page.purpose) {\n lines.push(`Purpose: ${page.purpose}`);\n }\n\n // URL\n if (page.url) {\n lines.push(`URL: ${page.url}`);\n }\n\n // Sections\n if (page.sections.length > 0) {\n lines.push('');\n lines.push('It displays:');\n for (const section of page.sections) {\n lines.push(` - ${section.description}`);\n }\n }\n\n // Actions\n if (page.actions.length > 0) {\n lines.push('');\n lines.push('Users can:');\n for (const action of page.actions) {\n if (action.action) {\n lines.push(` - ${action.trigger} to ${action.action}`);\n } else {\n lines.push(` - ${action.trigger}`);\n }\n }\n }\n\n // On access\n if (page.onAccess) {\n lines.push('');\n lines.push(`When accessed: ${page.onAccess}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format page AST to KFlow schema\n */\nexport function formatPageToSchema(page: DomainPage): Record<string, unknown> {\n // Infer viewType from page name (this is acceptable - it's a display hint, not critical data)\n const viewType = inferViewTypeFromPageName(page.name);\n\n // Use EXPLICIT primaryEntity from domain text - NO INFERENCE!\n const primaryEntity = page.primaryEntity;\n\n return {\n name: page.name,\n path: page.url.startsWith('/') ? page.url : `/${page.url}`,\n purpose: page.purpose || page.description,\n sections: page.sections.map((section, index) => {\n const pattern = inferPatternFromDescription(section.description);\n const patternConfig = inferPatternConfigFromDescription(section.description, page.primaryEntity);\n\n return {\n id: `section-${index}`,\n purpose: section.description,\n order: index,\n estimatedSize: 'medium',\n pattern: {\n type: pattern,\n ...patternConfig,\n },\n };\n }),\n traits: [],\n primaryEntity,\n viewType,\n isInitial: page.url === '/' || page.url === '/dashboard',\n };\n}\n\n/**\n * Infer view type from page name\n */\nfunction inferViewTypeFromPageName(name: string): string {\n const lower = name.toLowerCase();\n\n if (lower.includes('list') || lower.includes('index')) {\n return 'list';\n }\n if (lower.includes('detail') || lower.includes('view')) {\n return 'detail';\n }\n if (lower.includes('create') || lower.includes('new')) {\n return 'create';\n }\n if (lower.includes('edit')) {\n return 'edit';\n }\n if (lower.includes('dashboard')) {\n return 'dashboard';\n }\n\n return 'list';\n}\n\n/**\n * Get pattern config from description, using explicit entity when available\n * IMPORTANT: Use primaryEntity from explicit \"Entity:\" line when available.\n * Pattern detection from description is acceptable (e.g., \"list\" → entity-list pattern)\n * but entity association MUST come from explicit data.\n */\nfunction inferPatternConfigFromDescription(description: string, primaryEntity?: string): Record<string, unknown> {\n const lower = description.toLowerCase();\n\n // Use explicit entity when available, otherwise use a placeholder\n // The placeholder indicates the schema needs explicit entity data\n const entityName = primaryEntity || 'Item';\n\n // Header pattern - doesn't need entity\n if (lower.includes('header') || lower.includes('title')) {\n const titleMatch = description.match(/title\\s*[\"']?([^\"']+)[\"']?/i) ||\n description.match(/[\"']([^\"']+)[\"']/);\n return {\n title: titleMatch ? titleMatch[1] : 'Page Title',\n };\n }\n\n // Entity list pattern\n if (lower.includes('list') || lower.includes('table')) {\n return {\n entity: entityName,\n fieldNames: ['id', 'name', 'createdAt'],\n };\n }\n\n // Entity detail pattern\n if (lower.includes('detail')) {\n return {\n entity: entityName,\n fieldNames: ['id', 'name', 'description', 'createdAt'],\n };\n }\n\n // Form pattern\n if (lower.includes('form')) {\n return {\n entity: entityName,\n fields: [\n { field: 'name', label: 'Name', type: 'text', required: true },\n { field: 'description', label: 'Description', type: 'textarea' },\n ],\n };\n }\n\n // Stats/statistics/summary patterns\n if (lower.includes('stats') || lower.includes('statistics') ||\n lower.includes('summary') || lower.includes('overview')) {\n return {\n entity: entityName,\n fieldNames: ['id', 'name', 'value'],\n };\n }\n\n // Default: entity-list needs entity and fieldNames\n return {\n entity: entityName,\n fieldNames: ['id', 'name', 'createdAt'],\n };\n}\n\n// === Utility Functions ===\n\nfunction capitalize(text: string): string {\n return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n}\n\n/**\n * Convert text to PascalCase, preserving existing PascalCase words.\n * \"notesPage\" → \"NotesPage\"\n * \"NotesPage\" → \"NotesPage\" (preserved)\n * \"notes page\" → \"NotesPage\"\n */\nfunction toPascalCase(text: string): string {\n // If already PascalCase (starts with uppercase, has lowercase), preserve it\n if (/^[A-Z][a-zA-Z]*$/.test(text)) {\n return text;\n }\n // If it's all lowercase or has spaces, convert to PascalCase\n if (text.includes(' ')) {\n return text.split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join('');\n }\n // Single word - capitalize first letter, preserve rest\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\nfunction toKebabCase(text: string): string {\n return text\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/\\s+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Infer a section pattern from its natural language description\n * Valid pattern types: page-header, title-only, entity-list, entity-table, entity-detail, form-section\n */\nfunction inferPatternFromDescription(description: string): string {\n const lower = description.toLowerCase();\n\n // Header patterns - check FIRST to prevent \"Header with title Details\" being matched as detail\n if (lower.includes('header')) {\n return 'page-header';\n }\n\n // List patterns\n if (lower.includes('list') || lower.includes('table')) {\n return 'entity-list';\n }\n\n // Statistics/dashboard - map to entity-list for now\n if (lower.includes('statistics') || lower.includes('stats') ||\n lower.includes('summary') || lower.includes('overview')) {\n return 'entity-list';\n }\n\n // Form patterns\n if (lower.includes('form') || lower.includes('input') || lower.includes('edit')) {\n return 'form-section';\n }\n\n // Detail patterns\n if (lower.includes('detail') || lower.includes('view')) {\n return 'entity-detail';\n }\n\n // Chart patterns - map to entity-list for now\n if (lower.includes('chart') || lower.includes('graph')) {\n return 'entity-list';\n }\n\n // Timeline - map to entity-list for now\n if (lower.includes('timeline') || lower.includes('history') || lower.includes('activity')) {\n return 'entity-list';\n }\n\n // Title-only patterns (without \"header\" keyword)\n if (lower.includes('title')) {\n return 'page-header';\n }\n\n // Default to entity-list\n return 'entity-list';\n}\n","/**\n * Guard Expression Parser\n *\n * Parses guard expressions deterministically from domain language.\n * All entity references are explicit (e.g., Order.amount, CurrentUser.role).\n */\n\nimport type {\n GuardCondition,\n FieldReference,\n FieldCheckCondition,\n ComparisonCondition,\n UserCheckCondition,\n LogicalCondition,\n DomainGuard,\n ParseResult,\n ParseError,\n ComparisonOperator,\n} from '../types.js';\n\ninterface GuardParseContext {\n entityName: string; // Current entity context (e.g., \"Order\")\n errors: ParseError[];\n}\n\n/**\n * Parse a guard expression from domain text\n *\n * @example\n * parseGuard(\"if amount > 1000\", \"Order\")\n * // Returns: { field: { entityName: \"Order\", fieldName: \"amount\" }, operator: \">\", value: 1000 }\n */\nexport function parseGuard(text: string, entityName: string): ParseResult<DomainGuard> {\n const ctx: GuardParseContext = { entityName, errors: [] };\n\n // Remove leading \"if \" if present\n let expression = text.trim();\n if (expression.toLowerCase().startsWith('if ')) {\n expression = expression.slice(3).trim();\n }\n\n const condition = parseCondition(expression, ctx);\n\n if (!condition) {\n return {\n success: false,\n errors: ctx.errors.length > 0 ? ctx.errors : [{\n message: `Failed to parse guard expression: \"${text}\"`,\n }],\n warnings: [],\n };\n }\n\n return {\n success: true,\n data: {\n type: 'guard',\n condition,\n raw: text,\n },\n errors: [],\n warnings: [],\n };\n}\n\n/**\n * Parse a condition (may be simple or compound with AND/OR)\n */\nfunction parseCondition(text: string, ctx: GuardParseContext): GuardCondition | null {\n text = text.trim();\n\n // Check for logical operators (AND/OR) - split at top level\n const andMatch = splitAtTopLevel(text, ' AND ');\n if (andMatch) {\n const left = parseCondition(andMatch.left, ctx);\n const right = parseCondition(andMatch.right, ctx);\n if (left && right) {\n return {\n type: 'logical',\n operator: 'AND',\n left,\n right,\n };\n }\n }\n\n const orMatch = splitAtTopLevel(text, ' OR ');\n if (orMatch) {\n const left = parseCondition(orMatch.left, ctx);\n const right = parseCondition(orMatch.right, ctx);\n if (left && right) {\n return {\n type: 'logical',\n operator: 'OR',\n left,\n right,\n };\n }\n }\n\n // Try each simple condition type\n return parseUserCheck(text, ctx) ||\n parseFieldCheck(text, ctx) ||\n parseComparison(text, ctx);\n}\n\n/**\n * Parse user check conditions\n * - \"user is manager\" → CurrentUser.role == \"manager\"\n * - \"user owns this\" → Order.ownerId == CurrentUser.id\n */\nfunction parseUserCheck(text: string, ctx: GuardParseContext): UserCheckCondition | null {\n const lowerText = text.toLowerCase();\n\n // \"user is [role]\"\n const roleMatch = lowerText.match(/^user\\s+is\\s+(\\w+)$/);\n if (roleMatch) {\n return {\n type: 'user_check',\n check: 'is_role',\n role: roleMatch[1],\n };\n }\n\n // \"user owns this\"\n if (lowerText === 'user owns this') {\n return {\n type: 'user_check',\n check: 'owns_this',\n ownerField: 'ownerId',\n };\n }\n\n return null;\n}\n\n/**\n * Parse field check conditions\n * - \"amount is provided\" → Order.amount != null\n * - \"amount is empty\" → Order.amount == null\n * - \"status is Pending\" → Order.status == \"Pending\"\n * - \"status is not Cancelled\" → Order.status != \"Cancelled\"\n */\nfunction parseFieldCheck(text: string, ctx: GuardParseContext): FieldCheckCondition | null {\n const lowerText = text.toLowerCase();\n\n // \"[field] is provided\"\n const providedMatch = text.match(/^(.+?)\\s+is\\s+provided$/i);\n if (providedMatch) {\n const field = parseFieldReference(providedMatch[1], ctx);\n if (field) {\n return {\n type: 'field_check',\n field,\n check: 'provided',\n };\n }\n }\n\n // \"[field] is empty\"\n const emptyMatch = text.match(/^(.+?)\\s+is\\s+empty$/i);\n if (emptyMatch) {\n const field = parseFieldReference(emptyMatch[1], ctx);\n if (field) {\n return {\n type: 'field_check',\n field,\n check: 'empty',\n };\n }\n }\n\n // \"[field] is not [value]\" (negated equality)\n const notEqualsMatch = text.match(/^(.+?)\\s+is\\s+not\\s+(.+)$/i);\n if (notEqualsMatch) {\n // This should be handled as a comparison with !=\n return null; // Let comparison parser handle it\n }\n\n // \"[field] is [value]\" (equality check)\n const equalsMatch = text.match(/^(.+?)\\s+is\\s+(.+)$/i);\n if (equalsMatch) {\n const fieldName = equalsMatch[1].trim();\n const value = equalsMatch[2].trim();\n\n // Skip if value is a keyword\n if (['provided', 'empty', 'not'].includes(value.toLowerCase())) {\n return null;\n }\n\n const field = parseFieldReference(fieldName, ctx);\n if (field) {\n return {\n type: 'field_check',\n field,\n check: 'equals',\n value: parseValue(value),\n };\n }\n }\n\n return null;\n}\n\n/**\n * Parse comparison conditions\n * - \"amount > 1000\" → Order.amount > 1000\n * - \"amount >= 1000\" → Order.amount >= 1000\n * - \"status != 'Cancelled'\" → Order.status != \"Cancelled\"\n */\nfunction parseComparison(text: string, ctx: GuardParseContext): ComparisonCondition | null {\n // Try each operator\n const operators: { pattern: RegExp; operator: ComparisonOperator }[] = [\n { pattern: /^(.+?)\\s*>=\\s*(.+)$/, operator: '>=' },\n { pattern: /^(.+?)\\s*<=\\s*(.+)$/, operator: '<=' },\n { pattern: /^(.+?)\\s*!=\\s*(.+)$/, operator: '!=' },\n { pattern: /^(.+?)\\s*==\\s*(.+)$/, operator: '==' },\n { pattern: /^(.+?)\\s*>\\s*(.+)$/, operator: '>' },\n { pattern: /^(.+?)\\s*<\\s*(.+)$/, operator: '<' },\n ];\n\n // Also handle \"is not\" as !=\n const isNotMatch = text.match(/^(.+?)\\s+is\\s+not\\s+(.+)$/i);\n if (isNotMatch) {\n const field = parseFieldReference(isNotMatch[1], ctx);\n if (field) {\n return {\n type: 'comparison',\n field,\n operator: '!=',\n value: parseValue(isNotMatch[2]),\n };\n }\n }\n\n for (const { pattern, operator } of operators) {\n const match = text.match(pattern);\n if (match) {\n const field = parseFieldReference(match[1], ctx);\n if (field) {\n return {\n type: 'comparison',\n field,\n operator,\n value: parseValue(match[2]),\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Parse a field reference\n * - \"amount\" → { entityName: \"Order\", fieldName: \"amount\" } (uses context)\n * - \"Order.amount\" → { entityName: \"Order\", fieldName: \"amount\" }\n * - \"tracking number\" → { entityName: \"Order\", fieldName: \"trackingNumber\" }\n */\nfunction parseFieldReference(text: string, ctx: GuardParseContext): FieldReference | null {\n text = text.trim();\n\n // Check for explicit entity reference (Entity.field)\n const dotMatch = text.match(/^(\\w+)\\.(\\w+)$/);\n if (dotMatch) {\n return {\n type: 'field_reference',\n entityName: dotMatch[1],\n fieldName: dotMatch[2],\n };\n }\n\n // Convert \"tracking number\" style to \"trackingNumber\"\n const fieldName = toCamelCase(text);\n\n return {\n type: 'field_reference',\n entityName: ctx.entityName,\n fieldName,\n };\n}\n\n/**\n * Parse a value (string, number, or boolean)\n */\nfunction parseValue(text: string): string | number | boolean {\n text = text.trim();\n\n // Remove quotes if present\n if ((text.startsWith('\"') && text.endsWith('\"')) ||\n (text.startsWith(\"'\") && text.endsWith(\"'\"))) {\n return text.slice(1, -1);\n }\n\n // Boolean\n if (text.toLowerCase() === 'true') return true;\n if (text.toLowerCase() === 'false') return false;\n\n // Number\n const num = parseFloat(text);\n if (!isNaN(num)) return num;\n\n // String (identifier-style value like \"Pending\")\n return text;\n}\n\n/**\n * Convert space-separated words to camelCase\n * \"tracking number\" → \"trackingNumber\"\n */\nfunction toCamelCase(text: string): string {\n return text\n .toLowerCase()\n .split(/\\s+/)\n .map((word, index) =>\n index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join('');\n}\n\n/**\n * Split at top-level operator (not inside parentheses)\n */\nfunction splitAtTopLevel(text: string, separator: string): { left: string; right: string } | null {\n const separatorLower = separator.toLowerCase();\n const textLower = text.toLowerCase();\n\n let depth = 0;\n for (let i = 0; i <= textLower.length - separatorLower.length; i++) {\n const char = text[i];\n if (char === '(') depth++;\n else if (char === ')') depth--;\n else if (depth === 0 && textLower.slice(i, i + separatorLower.length) === separatorLower) {\n return {\n left: text.slice(0, i),\n right: text.slice(i + separator.length),\n };\n }\n }\n\n return null;\n}\n\n/**\n * Format a guard condition back to KFlow schema guard string\n */\nexport function formatGuardToSchema(guard: DomainGuard): string {\n return formatConditionToSchema(guard.condition);\n}\n\nfunction formatConditionToSchema(condition: GuardCondition): string {\n switch (condition.type) {\n case 'field_check': {\n const fieldRef = `${condition.field.entityName}.${condition.field.fieldName}`;\n switch (condition.check) {\n case 'provided':\n return `${fieldRef} != null`;\n case 'empty':\n return `${fieldRef} == null`;\n case 'equals':\n const value = typeof condition.value === 'string'\n ? `\"${condition.value}\"`\n : condition.value;\n return `${fieldRef} == ${value}`;\n }\n break;\n }\n\n case 'comparison': {\n const fieldRef = `${condition.field.entityName}.${condition.field.fieldName}`;\n const value = typeof condition.value === 'string'\n ? `\"${condition.value}\"`\n : condition.value;\n return `${fieldRef} ${condition.operator} ${value}`;\n }\n\n case 'user_check': {\n if (condition.check === 'is_role') {\n return `CurrentUser.role == \"${condition.role}\"`;\n } else {\n return `${condition.ownerField} == CurrentUser.id`;\n }\n }\n\n case 'logical': {\n const left = formatConditionToSchema(condition.left);\n const right = formatConditionToSchema(condition.right);\n const op = condition.operator === 'AND' ? '&&' : '||';\n return `(${left}) ${op} (${right})`;\n }\n }\n\n return '';\n}\n\n/**\n * Format a guard condition back to domain language\n */\nexport function formatGuardToDomain(guard: DomainGuard): string {\n return 'if ' + formatConditionToDomain(guard.condition);\n}\n\nfunction formatConditionToDomain(condition: GuardCondition): string {\n switch (condition.type) {\n case 'field_check': {\n const fieldName = toSpaceSeparated(condition.field.fieldName);\n switch (condition.check) {\n case 'provided':\n return `${fieldName} is provided`;\n case 'empty':\n return `${fieldName} is empty`;\n case 'equals':\n return `${fieldName} is ${condition.value}`;\n }\n break;\n }\n\n case 'comparison': {\n const fieldName = toSpaceSeparated(condition.field.fieldName);\n const opMap: Record<string, string> = {\n '==': 'is',\n '!=': 'is not',\n '>': '>',\n '<': '<',\n '>=': '>=',\n '<=': '<=',\n };\n return `${fieldName} ${opMap[condition.operator] || condition.operator} ${condition.value}`;\n }\n\n case 'user_check': {\n if (condition.check === 'is_role') {\n return `user is ${condition.role}`;\n } else {\n return 'user owns this';\n }\n }\n\n case 'logical': {\n const left = formatConditionToDomain(condition.left);\n const right = formatConditionToDomain(condition.right);\n return `${left} ${condition.operator} ${right}`;\n }\n }\n\n return '';\n}\n\n/**\n * Convert camelCase to space-separated words\n * \"trackingNumber\" → \"tracking number\"\n */\nfunction toSpaceSeparated(text: string): string {\n return text.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\n}\n","/**\n * S-Expression Parser\n *\n * Parses domain language text (guards/effects) back to S-Expression arrays.\n * This is the reverse of what sexpr-formatter.ts does.\n *\n * @example\n * parseDomainGuard(\"health is at least 0\") → [\">=\", \"@entity.health\", 0]\n * parseDomainEffect(\"update status to 'done'\") → [\"set\", \"@entity.status\", \"done\"]\n *\n * @packageDocumentation\n */\n\nimport type { SExpr } from '@almadar/core/types';\nimport { getPatternDefinition } from '@almadar/patterns';\n\n// Helper functions for pattern validation\nfunction isKnownPattern(pattern: string): boolean {\n return getPatternDefinition(pattern) !== null;\n}\n\nfunction validatePatternReference(pattern: string): string | null {\n // Simple suggestion logic - could be enhanced\n return null;\n}\n\n// ============================================================================\n// Parse Warnings (collected during parsing)\n// ============================================================================\n\nexport interface ParseWarning {\n message: string;\n type: 'unknown-pattern' | 'invalid-syntax';\n}\n\nlet parseWarnings: ParseWarning[] = [];\n\n/**\n * Get and clear parse warnings from the last parse operation.\n */\nexport function getParseWarnings(): ParseWarning[] {\n const warnings = parseWarnings;\n parseWarnings = [];\n return warnings;\n}\n\n/**\n * Add a parse warning.\n */\nfunction addWarning(message: string, type: ParseWarning['type']): void {\n parseWarnings.push({ message, type });\n}\n\n// ============================================================================\n// Main API\n// ============================================================================\n\n/**\n * Parse a domain guard expression to S-Expression.\n *\n * @param text - Domain language guard (e.g., \"health is at least 0\", \"status is 'active'\")\n * @param entityName - The entity context for unqualified field references\n * @returns S-Expression array\n *\n * @example\n * parseDomainGuard(\"health is at least 0\") → [\">=\", \"@entity.health\", 0]\n * parseDomainGuard(\"status is 'active'\") → [\"=\", \"@entity.status\", \"active\"]\n * parseDomainGuard(\"x > 0 and y < 100\") → [\"and\", [\">\", \"@entity.x\", 0], [\"<\", \"@entity.y\", 100]]\n */\nexport function parseDomainGuard(text: string, entityName?: string): SExpr {\n const ctx: ParseContext = { entityName: entityName || '' };\n let expr = text.trim();\n\n // Remove \"if \" prefix if present\n if (expr.toLowerCase().startsWith('if ')) {\n expr = expr.slice(3).trim();\n }\n\n return parseExpression(expr, ctx);\n}\n\n/**\n * Parse a domain effect expression to S-Expression.\n *\n * @param text - Domain language effect (e.g., \"update status to 'done'\", \"emit ORDER_PLACED\")\n * @param entityName - The entity context for unqualified field references\n * @returns S-Expression array\n *\n * @example\n * parseDomainEffect(\"update status to 'done'\") → [\"set\", \"@entity.status\", \"done\"]\n * parseDomainEffect(\"emit ORDER_PLACED\") → [\"emit\", \"ORDER_PLACED\"]\n * parseDomainEffect(\"render entity-table to main\") → [\"render-ui\", \"main\", { type: \"entity-table\" }]\n */\nexport function parseDomainEffect(text: string, entityName?: string): SExpr {\n const ctx: ParseContext = { entityName: entityName || '' };\n let expr = text.trim();\n\n // Remove \"then \" prefix if present\n if (expr.toLowerCase().startsWith('then ')) {\n expr = expr.slice(5).trim();\n }\n\n return parseEffect(expr, ctx);\n}\n\n/**\n * Parse multiple domain effects (comma or \"then\" separated).\n *\n * @param text - Domain language effects\n * @param entityName - The entity context\n * @returns Array of S-Expressions (wrapped in [\"do\", ...] if multiple)\n */\nexport function parseDomainEffects(text: string, entityName?: string): SExpr[] {\n const ctx: ParseContext = { entityName: entityName || '' };\n let expr = text.trim();\n\n // Remove \"then \" prefix\n if (expr.toLowerCase().startsWith('then ')) {\n expr = expr.slice(5).trim();\n }\n\n // Split by \", then \" or just \"then\"\n const parts = expr.split(/,\\s*then\\s+|\\s+then\\s+/i).filter(p => p.trim());\n\n return parts.map(p => parseEffect(p.trim(), ctx));\n}\n\n// ============================================================================\n// Parse Context\n// ============================================================================\n\ninterface ParseContext {\n entityName: string;\n}\n\n// ============================================================================\n// Inline S-Expression / JSON Parsing\n// ============================================================================\n\n/**\n * Check if text is an inline S-Expression or JSON.\n *\n * Supports:\n * - JSON array: [...]\n * - JSON object: {...}\n * - Lisp S-Expression: (op args...)\n */\nfunction isInlineSExpr(text: string): boolean {\n const trimmed = text.trim();\n return trimmed.startsWith('[') || trimmed.startsWith('{') || trimmed.startsWith('(');\n}\n\n/**\n * Parse inline S-Expression or JSON to SExpr.\n *\n * Supports:\n * - JSON: [\"emit\", \"EVENT\"] or {\"type\": \"stats\"}\n * - Lisp: (emit EVENT) or (render-ui main {type: \"stats\"})\n */\nfunction parseInlineSExpr(text: string): SExpr {\n const trimmed = text.trim();\n\n // JSON array or object\n if (trimmed.startsWith('[') || trimmed.startsWith('{')) {\n try {\n return JSON.parse(trimmed);\n } catch {\n // Try relaxed JSON (single quotes, unquoted keys)\n return parseRelaxedJson(trimmed);\n }\n }\n\n // Lisp-style S-Expression: (op args...)\n if (trimmed.startsWith('(')) {\n return parseLispSExpr(trimmed);\n }\n\n throw new Error(`Invalid inline S-Expression: ${text}`);\n}\n\n/**\n * Parse relaxed JSON (allows single quotes, unquoted keys).\n */\nfunction parseRelaxedJson(text: string): SExpr {\n // Replace single quotes with double quotes (simple approach)\n let normalized = text;\n\n // Handle single-quoted strings\n normalized = normalized.replace(/'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'/g, '\"$1\"');\n\n // Handle unquoted keys in objects: {key: value} → {\"key\": value}\n normalized = normalized.replace(/(\\{|,)\\s*(\\w+)\\s*:/g, '$1\"$2\":');\n\n try {\n return JSON.parse(normalized);\n } catch (e) {\n throw new Error(`Failed to parse relaxed JSON: ${text}`);\n }\n}\n\n/**\n * Parse Lisp-style S-Expression: (op arg1 arg2 ...)\n *\n * Examples:\n * - (emit EVENT) → [\"emit\", \"EVENT\"]\n * - (render-ui main {type: \"stats\"}) → [\"render-ui\", \"main\", {type: \"stats\"}]\n * - (and (> x 0) (< x 100)) → [\"and\", [\">\", \"x\", 0], [\"<\", \"x\", 100]]\n */\nfunction parseLispSExpr(text: string): SExpr {\n const trimmed = text.trim();\n\n if (!trimmed.startsWith('(') || !trimmed.endsWith(')')) {\n throw new Error(`Invalid Lisp S-Expression: ${text}`);\n }\n\n const inner = trimmed.slice(1, -1).trim();\n const tokens = tokenizeLisp(inner);\n\n if (tokens.length === 0) {\n return [];\n }\n\n return tokens.map(parseLispToken);\n}\n\n/**\n * Tokenize Lisp expression, respecting nested parens, braces, and quotes.\n */\nfunction tokenizeLisp(text: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let depth = 0;\n let inString = false;\n let stringChar = '';\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n\n if (inString) {\n current += char;\n if (char === stringChar && text[i - 1] !== '\\\\') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n inString = true;\n stringChar = char;\n current += char;\n continue;\n }\n\n if (char === '(' || char === '[' || char === '{') {\n depth++;\n current += char;\n continue;\n }\n\n if (char === ')' || char === ']' || char === '}') {\n depth--;\n current += char;\n continue;\n }\n\n if (char === ' ' || char === '\\t' || char === '\\n') {\n if (depth === 0 && current.trim()) {\n tokens.push(current.trim());\n current = '';\n } else if (depth > 0) {\n current += char;\n }\n continue;\n }\n\n current += char;\n }\n\n if (current.trim()) {\n tokens.push(current.trim());\n }\n\n return tokens;\n}\n\n/**\n * Parse a single Lisp token to SExpr value.\n */\nfunction parseLispToken(token: string): SExpr {\n const trimmed = token.trim();\n\n // Nested S-Expression\n if (trimmed.startsWith('(')) {\n return parseLispSExpr(trimmed);\n }\n\n // JSON object or array\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return parseRelaxedJson(trimmed);\n }\n\n // Quoted string\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n return trimmed.slice(1, -1);\n }\n\n // Number\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return parseFloat(trimmed);\n }\n\n // Boolean\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (trimmed === 'null') return null;\n\n // Binding (starts with @)\n if (trimmed.startsWith('@')) {\n return trimmed;\n }\n\n // Symbol/identifier\n return trimmed;\n}\n\n// ============================================================================\n// Expression Parsing (Guards)\n// ============================================================================\n\n/**\n * Parse a general expression (guard context).\n */\nfunction parseExpression(text: string, ctx: ParseContext): SExpr {\n text = text.trim();\n\n // Check for inline S-Expression/JSON first\n if (isInlineSExpr(text)) {\n return parseInlineSExpr(text);\n }\n\n // Handle logical operators at top level\n const andMatch = splitAtTopLevel(text, ' and ');\n if (andMatch) {\n const left = parseExpression(andMatch.left, ctx);\n const right = parseExpression(andMatch.right, ctx);\n return ['and', left, right];\n }\n\n const orMatch = splitAtTopLevel(text, ' or ');\n if (orMatch) {\n const left = parseExpression(orMatch.left, ctx);\n const right = parseExpression(orMatch.right, ctx);\n return ['or', left, right];\n }\n\n // Handle \"not X\"\n if (text.toLowerCase().startsWith('not ')) {\n const inner = parseExpression(text.slice(4).trim(), ctx);\n return ['not', inner];\n }\n\n // Handle parentheses\n if (text.startsWith('(') && text.endsWith(')')) {\n return parseExpression(text.slice(1, -1), ctx);\n }\n\n // Parse comparison/condition\n return parseComparison(text, ctx);\n}\n\n/**\n * Parse a comparison expression.\n */\nfunction parseComparison(text: string, ctx: ParseContext): SExpr {\n // \"X is at least Y\" → [\">=\", X, Y]\n const atLeastMatch = text.match(/^(.+?)\\s+is\\s+at\\s+least\\s+(.+)$/i);\n if (atLeastMatch) {\n const field = parseFieldRef(atLeastMatch[1], ctx);\n const value = parseValue(atLeastMatch[2]);\n return ['>=', field, value];\n }\n\n // \"X is at most Y\" → [\"<=\", X, Y]\n const atMostMatch = text.match(/^(.+?)\\s+is\\s+at\\s+most\\s+(.+)$/i);\n if (atMostMatch) {\n const field = parseFieldRef(atMostMatch[1], ctx);\n const value = parseValue(atMostMatch[2]);\n return ['<=', field, value];\n }\n\n // \"X is greater than Y\" → [\">\", X, Y]\n const greaterThanMatch = text.match(/^(.+?)\\s+is\\s+greater\\s+than\\s+(.+)$/i);\n if (greaterThanMatch) {\n const field = parseFieldRef(greaterThanMatch[1], ctx);\n const value = parseValue(greaterThanMatch[2]);\n return ['>', field, value];\n }\n\n // \"X is less than Y\" → [\"<\", X, Y]\n const lessThanMatch = text.match(/^(.+?)\\s+is\\s+less\\s+than\\s+(.+)$/i);\n if (lessThanMatch) {\n const field = parseFieldRef(lessThanMatch[1], ctx);\n const value = parseValue(lessThanMatch[2]);\n return ['<', field, value];\n }\n\n // \"X is not Y\" → [\"!=\", X, Y]\n const isNotMatch = text.match(/^(.+?)\\s+is\\s+not\\s+(.+)$/i);\n if (isNotMatch) {\n const field = parseFieldRef(isNotMatch[1], ctx);\n const value = parseValue(isNotMatch[2]);\n return ['!=', field, value];\n }\n\n // \"X is Y\" → [\"=\", X, Y]\n const isMatch = text.match(/^(.+?)\\s+is\\s+(.+)$/i);\n if (isMatch) {\n const field = parseFieldRef(isMatch[1], ctx);\n const value = parseValue(isMatch[2]);\n return ['=', field, value];\n }\n\n // Operator-based comparisons: >=, <=, !=, ==, >, <\n const opPatterns: { pattern: RegExp; op: string }[] = [\n { pattern: /^(.+?)\\s*>=\\s*(.+)$/, op: '>=' },\n { pattern: /^(.+?)\\s*<=\\s*(.+)$/, op: '<=' },\n { pattern: /^(.+?)\\s*!=\\s*(.+)$/, op: '!=' },\n { pattern: /^(.+?)\\s*==\\s*(.+)$/, op: '=' },\n { pattern: /^(.+?)\\s*>\\s*(.+)$/, op: '>' },\n { pattern: /^(.+?)\\s*<\\s*(.+)$/, op: '<' },\n ];\n\n for (const { pattern, op } of opPatterns) {\n const match = text.match(pattern);\n if (match) {\n const left = parseFieldRef(match[1], ctx);\n const right = parseValue(match[2]);\n return [op, left, right];\n }\n }\n\n // Default: return as binding or literal\n return parseFieldRef(text, ctx);\n}\n\n// ============================================================================\n// Effect Parsing\n// ============================================================================\n\n/**\n * Parse an effect expression.\n *\n * Supports both human-readable syntax and inline S-Expressions:\n * - Human: update status to 'done'\n * - S-Expr: [\"set\", \"@entity.status\", \"done\"]\n * - Lisp: (set @entity.status \"done\")\n * - JSON: {\"type\": \"stats\", \"metrics\": [...]}\n */\nfunction parseEffect(text: string, ctx: ParseContext): SExpr {\n text = text.trim();\n\n // Check for inline S-Expression/JSON first (highest priority)\n if (isInlineSExpr(text)) {\n return parseInlineSExpr(text);\n }\n\n // \"update X to Y\" → [\"set\", \"@entity.X\", Y]\n const updateMatch = text.match(/^update\\s+(.+?)\\s+to\\s+(.+)$/i);\n if (updateMatch) {\n const field = parseFieldRef(updateMatch[1], ctx);\n const value = parseEffectValue(updateMatch[2], ctx);\n return ['set', field, value];\n }\n\n // \"emit EVENT with PAYLOAD\" → [\"emit\", \"EVENT\", PAYLOAD]\n const emitWithMatch = text.match(/^emit\\s+(\\S+)\\s+with\\s+(.+)$/i);\n if (emitWithMatch) {\n const event = emitWithMatch[1];\n const payload = parseEffectValue(emitWithMatch[2], ctx);\n return ['emit', event, payload];\n }\n\n // \"emit EVENT\" → [\"emit\", \"EVENT\"]\n const emitMatch = text.match(/^emit\\s+(\\S+)$/i);\n if (emitMatch) {\n return ['emit', emitMatch[1]];\n }\n\n // \"render null to SLOT\" → [\"render-ui\", \"SLOT\", null]\n const renderNullMatch = text.match(/^render\\s+null\\s+to\\s+(\\S+)$/i);\n if (renderNullMatch) {\n return ['render-ui', renderNullMatch[1], null];\n }\n\n // \"render PATTERN to SLOT for ENTITY with PROPS\" → [\"render-ui\", \"SLOT\", { type, entity, props }]\n const renderFullMatch = text.match(/^render\\s+(\\S+)\\s+to\\s+(\\S+)\\s+for\\s+(\\S+)\\s+with\\s+(.+)$/i);\n if (renderFullMatch) {\n const pattern = renderFullMatch[1];\n const slot = renderFullMatch[2];\n const entity = renderFullMatch[3];\n const propsText = renderFullMatch[4];\n const props = parseRenderProps(propsText);\n // Validate pattern type\n validatePatternType(pattern);\n return ['render-ui', slot, { type: pattern, entity, ...props }];\n }\n\n // \"render PATTERN to SLOT for ENTITY\" → [\"render-ui\", \"SLOT\", { type, entity }]\n const renderEntityMatch = text.match(/^render\\s+(\\S+)\\s+to\\s+(\\S+)\\s+for\\s+(\\S+)$/i);\n if (renderEntityMatch) {\n const pattern = renderEntityMatch[1];\n const slot = renderEntityMatch[2];\n const entity = renderEntityMatch[3];\n // Validate pattern type\n validatePatternType(pattern);\n return ['render-ui', slot, { type: pattern, entity }];\n }\n\n // \"render PATTERN to SLOT with PROPS\" → [\"render-ui\", \"SLOT\", { type, props }]\n const renderPropsMatch = text.match(/^render\\s+(\\S+)\\s+to\\s+(\\S+)\\s+with\\s+(.+)$/i);\n if (renderPropsMatch) {\n const pattern = renderPropsMatch[1];\n const slot = renderPropsMatch[2];\n const propsText = renderPropsMatch[3];\n const props = parseRenderProps(propsText);\n // Validate pattern type\n validatePatternType(pattern);\n return ['render-ui', slot, { type: pattern, ...props }];\n }\n\n // \"render PATTERN to SLOT\" → [\"render-ui\", \"SLOT\", { type: \"PATTERN\" }]\n const renderMatch = text.match(/^render\\s+(\\S+)\\s+to\\s+(\\S+)$/i);\n if (renderMatch) {\n const pattern = renderMatch[1];\n const slot = renderMatch[2];\n // Validate pattern type\n validatePatternType(pattern);\n return ['render-ui', slot, { type: pattern }];\n }\n\n // \"render to SLOT\" → [\"render-ui\", \"SLOT\"]\n const renderSlotMatch = text.match(/^render\\s+to\\s+(\\S+)$/i);\n if (renderSlotMatch) {\n return ['render-ui', renderSlotMatch[1]];\n }\n\n // \"navigate to PATH with PARAMS\" → [\"navigate\", \"PATH\", PARAMS]\n const navWithMatch = text.match(/^navigate\\s+to\\s+(.+?)\\s+with\\s+(.+)$/i);\n if (navWithMatch) {\n const path = navWithMatch[1];\n const params = parseEffectValue(navWithMatch[2], ctx);\n return ['navigate', path, params];\n }\n\n // \"navigate to PATH\" → [\"navigate\", \"PATH\"]\n const navMatch = text.match(/^navigate\\s+to\\s+(.+)$/i);\n if (navMatch) {\n return ['navigate', navMatch[1]];\n }\n\n // \"show TYPE notification MESSAGE\" → [\"notify\", \"MESSAGE\", \"TYPE\"]\n const showNotifyMatch = text.match(/^show\\s+(\\w+)\\s+notification\\s+\"(.+)\"$/i);\n if (showNotifyMatch) {\n return ['notify', showNotifyMatch[2], showNotifyMatch[1]];\n }\n\n // \"notify MESSAGE\" → [\"notify\", \"MESSAGE\"]\n const notifyMatch = text.match(/^notify\\s+\"(.+)\"$/i);\n if (notifyMatch) {\n return ['notify', notifyMatch[1]];\n }\n\n // \"persist ACTION DATA\" → [\"persist\", \"ACTION\", DATA]\n const persistWithMatch = text.match(/^persist\\s+(\\w+)\\s+(.+)$/i);\n if (persistWithMatch) {\n const action = persistWithMatch[1];\n const data = parseFieldRef(persistWithMatch[2], ctx);\n return ['persist', action, data];\n }\n\n // \"persist ACTION\" → [\"persist\", \"ACTION\"]\n const persistMatch = text.match(/^persist\\s+(\\w+)$/i);\n if (persistMatch) {\n return ['persist', persistMatch[1]];\n }\n\n // \"spawn ENTITY with PROPS\" → [\"spawn\", \"ENTITY\", PROPS]\n const spawnWithMatch = text.match(/^spawn\\s+(\\S+)\\s+with\\s+(.+)$/i);\n if (spawnWithMatch) {\n const entityType = spawnWithMatch[1];\n const props = parseEffectValue(spawnWithMatch[2], ctx);\n return ['spawn', entityType, props];\n }\n\n // \"spawn ENTITY\" → [\"spawn\", \"ENTITY\"]\n const spawnMatch = text.match(/^spawn\\s+(\\S+)$/i);\n if (spawnMatch) {\n return ['spawn', spawnMatch[1]];\n }\n\n // \"despawn ID\" → [\"despawn\", ID]\n const despawnIdMatch = text.match(/^despawn\\s+(.+)$/i);\n if (despawnIdMatch && despawnIdMatch[1] !== 'this') {\n return ['despawn', parseFieldRef(despawnIdMatch[1], ctx)];\n }\n\n // \"despawn this\" or \"despawn\" → [\"despawn\"]\n if (text.toLowerCase() === 'despawn' || text.toLowerCase() === 'despawn this') {\n return ['despawn'];\n }\n\n // \"call SERVICE.ACTION\" → [\"call-service\", \"SERVICE\", \"ACTION\"]\n const callServiceMatch = text.match(/^call\\s+(\\w+)\\.(\\w+)$/i);\n if (callServiceMatch) {\n return ['call-service', callServiceMatch[1], callServiceMatch[2]];\n }\n\n // \"call SERVICE\" → [\"call-service\", \"SERVICE\"]\n const callMatch = text.match(/^call\\s+(\\S+)$/i);\n if (callMatch) {\n return ['call-service', callMatch[1]];\n }\n\n // Fallback: return as literal\n return text;\n}\n\n// ============================================================================\n// Field Reference Parsing\n// ============================================================================\n\n/**\n * Parse a field reference to a binding.\n * Converts domain text to @entity.field format.\n */\nfunction parseFieldRef(text: string, ctx: ParseContext): string {\n text = text.trim();\n\n // Already a binding (@entity.field, @payload.field, etc.)\n if (text.startsWith('@')) {\n return text;\n }\n\n // \"current state\" → \"@state\"\n if (text.toLowerCase() === 'current state') {\n return '@state';\n }\n\n // \"current time\" → \"@now\"\n if (text.toLowerCase() === 'current time') {\n return '@now';\n }\n\n // \"entity\" alone → \"@entity\"\n if (text.toLowerCase() === 'entity') {\n return '@entity';\n }\n\n // \"payload\" alone → \"@payload\"\n if (text.toLowerCase() === 'payload') {\n return '@payload';\n }\n\n // \"incoming X\" → \"@payload.X\"\n if (text.toLowerCase().startsWith('incoming ')) {\n const field = toCamelCase(text.slice(9).trim());\n return `@payload.${field}`;\n }\n\n // \"X's Y\" → \"@X.Y\" (singleton binding)\n const possessiveMatch = text.match(/^(\\w+)'s\\s+(.+)$/);\n if (possessiveMatch) {\n const entity = possessiveMatch[1];\n const field = toCamelCase(possessiveMatch[2]);\n return `@${entity}.${field}`;\n }\n\n // \"Entity.field\" → \"@Entity.field\"\n if (text.includes('.')) {\n // Check if first part is capitalized (entity reference)\n const parts = text.split('.');\n if (parts[0] && /^[A-Z]/.test(parts[0])) {\n return `@${text}`;\n }\n // Otherwise it's an entity field\n return `@entity.${text}`;\n }\n\n // Simple field name → \"@entity.fieldName\"\n const fieldName = toCamelCase(text);\n return `@entity.${fieldName}`;\n}\n\n// ============================================================================\n// Value Parsing\n// ============================================================================\n\n/**\n * Parse a value (can be literal or binding).\n */\nfunction parseValue(text: string): SExpr {\n text = text.trim();\n\n // Quoted string\n if ((text.startsWith('\"') && text.endsWith('\"')) ||\n (text.startsWith(\"'\") && text.endsWith(\"'\"))) {\n return text.slice(1, -1);\n }\n\n // \"nothing\" or \"null\" → null\n if (text.toLowerCase() === 'nothing' || text.toLowerCase() === 'null') {\n return null as unknown as SExpr;\n }\n\n // Boolean\n if (text.toLowerCase() === 'true') return true;\n if (text.toLowerCase() === 'false') return false;\n\n // Number\n const num = parseFloat(text);\n if (!isNaN(num) && text.match(/^-?\\d+(\\.\\d+)?$/)) {\n return num;\n }\n\n // Already a binding\n if (text.startsWith('@')) {\n return text;\n }\n\n // Simple identifier - could be an enum value or string\n if (/^[a-zA-Z_]\\w*$/.test(text)) {\n return text;\n }\n\n // Default: return as string\n return text;\n}\n\n/**\n * Parse a value in effect context (handles nested expressions).\n */\nfunction parseEffectValue(text: string, ctx: ParseContext): SExpr {\n text = text.trim();\n\n // JSON object literal\n if (text.startsWith('{') && text.endsWith('}')) {\n try {\n // Handle binding references in JSON\n const processed = text.replace(/@[\\w.]+/g, (match) => `\"${match}\"`);\n const obj = JSON.parse(processed);\n // Convert quoted bindings back\n return processBindingsInObject(obj);\n } catch {\n // Not valid JSON, return as-is\n return text;\n }\n }\n\n // Arithmetic expression\n const arithmeticMatch = text.match(/^\\((.+?)\\s+(plus|minus|times|divided by)\\s+(.+)\\)$/i);\n if (arithmeticMatch) {\n const left = parseEffectValue(arithmeticMatch[1], ctx);\n const right = parseEffectValue(arithmeticMatch[3], ctx);\n const opMap: Record<string, string> = {\n 'plus': '+',\n 'minus': '-',\n 'times': '*',\n 'divided by': '/',\n };\n return [opMap[arithmeticMatch[2].toLowerCase()] || arithmeticMatch[2], left, right];\n }\n\n // Field reference\n if (text.includes('.') || text.toLowerCase().startsWith('incoming ') ||\n text.match(/^\\w+'s\\s+/) || /^[a-z]/.test(text)) {\n // Looks like a field reference\n return parseFieldRef(text, ctx);\n }\n\n // Delegate to parseValue\n return parseValue(text);\n}\n\n/**\n * Process bindings in a parsed JSON object.\n */\nfunction processBindingsInObject(obj: unknown): SExpr {\n if (obj === null || obj === undefined) {\n return null as unknown as SExpr;\n }\n\n if (typeof obj === 'string') {\n // Convert quoted binding back\n if (obj.startsWith('@')) {\n return obj;\n }\n return obj;\n }\n\n if (typeof obj !== 'object') {\n return obj as SExpr;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(processBindingsInObject) as SExpr;\n }\n\n // Object\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = processBindingsInObject(value);\n }\n return result as SExpr;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Split at top-level separator (not inside parentheses).\n */\nfunction splitAtTopLevel(text: string, separator: string): { left: string; right: string } | null {\n const separatorLower = separator.toLowerCase();\n const textLower = text.toLowerCase();\n\n let depth = 0;\n for (let i = 0; i <= textLower.length - separatorLower.length; i++) {\n const char = text[i];\n if (char === '(' || char === '[' || char === '{') depth++;\n else if (char === ')' || char === ']' || char === '}') depth--;\n else if (depth === 0 && textLower.slice(i, i + separatorLower.length) === separatorLower) {\n return {\n left: text.slice(0, i).trim(),\n right: text.slice(i + separator.length).trim(),\n };\n }\n }\n\n return null;\n}\n\n/**\n * Convert space-separated text to camelCase.\n * Preserves existing camelCase (single word with mixed case).\n */\nfunction toCamelCase(text: string): string {\n const words = text.split(/\\s+/);\n\n // If single word, preserve its casing (e.g., \"isActive\" stays \"isActive\")\n if (words.length === 1) {\n return words[0];\n }\n\n // Multiple words: convert to camelCase\n return words\n .map((word, index) =>\n index === 0\n ? word.toLowerCase()\n : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n )\n .join('');\n}\n\n/**\n * Split array content by commas, respecting quoted strings\n */\nfunction splitArrayItems(content: string): string[] {\n const items: string[] = [];\n let current = '';\n let inQuote = false;\n let quoteChar = '';\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n\n if ((char === \"'\" || char === '\"') && (i === 0 || content[i - 1] !== '\\\\')) {\n if (!inQuote) {\n inQuote = true;\n quoteChar = char;\n } else if (char === quoteChar) {\n inQuote = false;\n }\n current += char;\n } else if (char === ',' && !inQuote) {\n if (current.trim()) {\n items.push(current.trim());\n }\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n items.push(current.trim());\n }\n\n return items;\n}\n\n/**\n * Remove quotes from a string value\n */\nfunction unquote(value: string): string {\n const trimmed = value.trim();\n if ((trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) ||\n (trimmed.startsWith('\"') && trimmed.endsWith('\"'))) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\n/**\n * Generic syntax patterns detected by markers:\n *\n * 1. \"as\" pattern: field as 'Label' → {field, label}\n * Used for: metrics, columns, any labeled field\n *\n * 2. \"->\" pattern: Label -> EVENT → {label, event}\n * With variant: Label -> EVENT:variant → {label, event, variant}\n * Used for: itemActions, buttons, any action binding\n *\n * 3. \":\" + \"->\" pattern: id: 'Label' -> EVENT → {id, label, event}\n * Used for: tabs, navigation items\n *\n * 4. \"@\" pattern: section @ span → {section, colSpan}\n * With row span: section @ colxrow → {section, colSpan, rowSpan}\n * Used for: cells, grid layouts\n *\n * The parser auto-detects which pattern based on syntax markers,\n * so any prop can use any pattern without hardcoding prop names.\n */\nfunction parseArrayItem(item: string): unknown {\n const trimmed = item.trim();\n\n // Pattern 3: id: 'Label' -> EVENT (has both : and ->)\n const tabMatch = trimmed.match(/^(\\w+):\\s*['\"]([^'\"]+)['\"]\\s*->\\s*(\\w+)$/);\n if (tabMatch) {\n return { id: tabMatch[1], label: tabMatch[2], event: tabMatch[3] };\n }\n\n // Pattern 2 with variant: Label -> EVENT:variant\n const actionVariantMatch = trimmed.match(/^([^->]+)\\s*->\\s*(\\w+):(\\w+)$/);\n if (actionVariantMatch) {\n return {\n label: actionVariantMatch[1].trim(),\n event: actionVariantMatch[2],\n variant: actionVariantMatch[3],\n };\n }\n\n // Pattern 2: Label -> EVENT or 'Label' -> EVENT\n const actionMatch = trimmed.match(/^(['\"]?)([^'\"->]+)\\1\\s*->\\s*(\\w+)$/);\n if (actionMatch) {\n return { label: actionMatch[2].trim(), event: actionMatch[3] };\n }\n\n // Pattern 4 with rowSpan: section @ colxrow\n const cellSpanMatch = trimmed.match(/^(\\w+)\\s*@\\s*(\\d+)x(\\d+)$/);\n if (cellSpanMatch) {\n return {\n section: cellSpanMatch[1],\n colSpan: parseInt(cellSpanMatch[2], 10),\n rowSpan: parseInt(cellSpanMatch[3], 10),\n };\n }\n\n // Pattern 4: section @ span\n const cellMatch = trimmed.match(/^(\\w+)\\s*@\\s*(\\d+)$/);\n if (cellMatch) {\n return {\n section: cellMatch[1],\n colSpan: parseInt(cellMatch[2], 10),\n };\n }\n\n // Pattern 1: field as 'Label' or field as \"Label\"\n const asMatch = trimmed.match(/^(\\w+)\\s+as\\s+['\"]([^'\"]+)['\"]$/);\n if (asMatch) {\n return { field: asMatch[1], label: asMatch[2] };\n }\n\n // No pattern detected - return as simple string\n return unquote(trimmed);\n}\n\n/**\n * Parse array content, auto-detecting complex syntax patterns\n */\nfunction parseArrayProp(content: string): unknown[] {\n const items = splitArrayItems(content);\n return items.map(parseArrayItem);\n}\n\n/**\n * Check if array content contains complex syntax markers\n */\nfunction hasComplexSyntax(content: string): boolean {\n return /\\s+as\\s+['\"]/.test(content) || // \"as\" pattern\n /->\\s*\\w+/.test(content) || // \"->\" pattern\n /\\w+\\s*@\\s*\\d+/.test(content); // \"@\" pattern\n}\n\n/**\n * Parse render props from text like \"title 'Notes'\" or \"columns [title, createdAt]\"\n *\n * Auto-detects complex array syntax based on markers:\n * - \"as\" pattern: field as 'Label' → {field, label}\n * - \"->\" pattern: Label -> EVENT → {label, event}\n * - \":\" + \"->\" pattern: id: 'Label' -> EVENT → {id, label, event}\n * - \"@\" pattern: section @ span → {section, colSpan}\n *\n * Works generically for any prop name - no need to hardcode specific keys.\n */\nfunction parseRenderProps(text: string): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n\n // Match \"key 'value'\" or \"key [array]\" or \"key value\"\n const propsRegex = /(\\w+)\\s+(?:'([^']+)'|\"([^\"]+)\"|\\[([^\\]]+)\\]|(\\S+))/g;\n let match;\n\n while ((match = propsRegex.exec(text)) !== null) {\n const key = match[1];\n const singleQuoted = match[2];\n const doubleQuoted = match[3];\n const arrayContent = match[4];\n const bareValue = match[5];\n\n if (singleQuoted !== undefined) {\n props[key] = singleQuoted;\n } else if (doubleQuoted !== undefined) {\n props[key] = doubleQuoted;\n } else if (arrayContent !== undefined) {\n // Auto-detect complex syntax based on markers, not key names\n if (hasComplexSyntax(arrayContent)) {\n props[key] = parseArrayProp(arrayContent);\n } else {\n // Simple array: \"title, createdAt\" → [\"title\", \"createdAt\"]\n props[key] = arrayContent.split(/\\s*,\\s*/).map(s => s.trim());\n }\n } else if (bareValue !== undefined) {\n // Try to parse as number or boolean\n if (bareValue === 'true') props[key] = true;\n else if (bareValue === 'false') props[key] = false;\n else if (/^\\d+(\\.\\d+)?$/.test(bareValue)) props[key] = parseFloat(bareValue);\n else props[key] = bareValue;\n }\n }\n\n return props;\n}\n\n/**\n * Validate a pattern type against the registry.\n * Adds a warning if the pattern is unknown.\n */\nfunction validatePatternType(pattern: string): void {\n if (!isKnownPattern(pattern)) {\n const suggestion = validatePatternReference(pattern);\n addWarning(\n suggestion || `Unknown pattern type: \"${pattern}\"`,\n 'unknown-pattern'\n );\n }\n}\n","/**\n * Behavior Parser\n *\n * Parses behavior/trait definitions from domain language.\n * Behaviors define state machines with transitions, guards, and effects.\n * All entity references are explicit (e.g., Order.status, CurrentUser.role).\n */\n\nimport type {\n DomainBehavior,\n DomainTransition,\n DomainTick,\n DomainGuard,\n DomainEffect,\n ParseResult,\n ParseError,\n} from '../types.js';\nimport { Lexer } from '../lexer.js';\nimport { TokenType } from '../tokens.js';\nimport { parseGuard } from './guard-parser.js';\nimport { parseDomainEffect, parseDomainGuard } from './sexpr-parser.js';\n\ninterface BehaviorParseContext {\n entityName: string;\n errors: ParseError[];\n warnings: ParseError[];\n}\n\n/**\n * Parse a behavior definition from domain text\n *\n * @example\n * parseBehavior(`\n * Order Lifecycle\n *\n * States: Pending, Confirmed, Shipped, Delivered, Cancelled\n *\n * Transitions:\n * - From Pending to Confirmed when CONFIRM\n * if Order.amount > 0\n * then notify customer\n * - From Confirmed to Shipped when SHIP\n * - From Shipped to Delivered when DELIVER\n * - From any to Cancelled when CANCEL\n * if Order.status is not Delivered\n *\n * Rules:\n * - Orders over $1000 require manager approval\n * - Cancelled orders cannot be reactivated\n * `, \"Order\")\n */\nexport function parseBehavior(text: string, entityName: string): ParseResult<DomainBehavior> {\n const ctx: BehaviorParseContext = { entityName, errors: [], warnings: [] };\n const lexer = new Lexer(text);\n const tokens = lexer.tokenize();\n\n let pos = 0;\n\n // Helper functions\n const current = () => tokens[pos] || { type: TokenType.EOF, value: '', line: 0, column: 0, offset: 0 };\n const advance = () => tokens[pos++];\n const isAtEnd = () => current().type === TokenType.EOF;\n const skip = (type: TokenType) => {\n while (current().type === type) advance();\n };\n\n // Skip leading whitespace\n skip(TokenType.NEWLINE);\n\n // Parse behavior name (first line)\n const behaviorName = parseBehaviorName();\n if (!behaviorName) {\n return {\n success: false,\n errors: ctx.errors.length > 0 ? ctx.errors : [{\n message: 'Expected behavior name at start of definition',\n }],\n warnings: [],\n };\n }\n\n const behavior: DomainBehavior = {\n type: 'behavior',\n name: behaviorName,\n entityName,\n states: [],\n initialState: '',\n transitions: [],\n ticks: [],\n rules: [],\n };\n\n skip(TokenType.NEWLINE);\n\n // Parse remaining sections\n while (!isAtEnd()) {\n skip(TokenType.NEWLINE);\n if (isAtEnd()) break;\n\n const parsed = parseBehaviorSection(behavior);\n if (!parsed) {\n advance();\n }\n }\n\n // Set initial state if not specified\n if (!behavior.initialState && behavior.states.length > 0) {\n behavior.initialState = behavior.states[0];\n }\n\n return {\n success: true,\n data: behavior,\n errors: ctx.errors,\n warnings: ctx.warnings,\n };\n\n // === Helper Functions ===\n\n function parseBehaviorName(): string | null {\n const nameParts: string[] = [];\n\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n // Check for \"Entity:\" section - extract entity name\n if (current().type === TokenType.IDENTIFIER && current().value.toLowerCase() === 'entity') {\n advance(); // skip \"Entity\"\n if (current().type === TokenType.COLON) {\n advance(); // skip \":\"\n // Next identifier is the entity name\n if (current().type === TokenType.IDENTIFIER) {\n ctx.entityName = current().value;\n advance();\n }\n }\n continue;\n }\n\n // Skip parentheses (for syntax like \"behavior (Entity: X)\")\n if (current().type === TokenType.LPAREN || current().type === TokenType.RPAREN) {\n advance();\n continue;\n }\n\n // Collect identifiers, lifecycle keywords, and AUTO keyword (for names like \"Auto Save\")\n // Skip \"behavior\" keyword and colon\n if (current().type === TokenType.IDENTIFIER ||\n current().type === TokenType.LIFECYCLE ||\n current().type === TokenType.AUTO) {\n nameParts.push(current().value);\n }\n // Skip the \"behavior\" keyword (don't include it in the name)\n // Also skip colon\n advance();\n }\n\n if (nameParts.length === 0) {\n return null;\n }\n\n return nameParts.join(' ');\n }\n\n function parseBehaviorSection(behavior: DomainBehavior): boolean {\n const token = current();\n\n // \"Entity: [entityName]\" - explicit entity association\n if (token.type === TokenType.IDENTIFIER && token.value.toLowerCase() === 'entity') {\n advance();\n skip(TokenType.COLON);\n if (current().type === TokenType.IDENTIFIER) {\n ctx.entityName = current().value;\n behavior.entityName = current().value;\n advance();\n }\n return true;\n }\n\n // \"States: [state1], [state2], ...\"\n if (token.type === TokenType.STATES) {\n advance();\n skip(TokenType.COLON);\n parseStatesLine(behavior);\n return true;\n }\n\n // \"Initial: [state]\"\n if (token.type === TokenType.INITIAL) {\n advance();\n skip(TokenType.COLON);\n if (current().type === TokenType.IDENTIFIER) {\n behavior.initialState = current().value;\n advance();\n }\n return true;\n }\n\n // \"Transitions:\"\n if (token.type === TokenType.TRANSITIONS) {\n advance();\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n parseTransitionsSection(behavior);\n return true;\n }\n\n // \"Rules:\"\n if (token.type === TokenType.RULES) {\n advance();\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n parseRulesSection(behavior);\n return true;\n }\n\n // \"Every [interval]:\" - ticks\n if (token.type === TokenType.EVERY) {\n advance();\n parseTick(behavior);\n return true;\n }\n\n // \"Lifecycle\" keyword at section level\n if (token.type === TokenType.LIFECYCLE) {\n advance();\n return true;\n }\n\n return false;\n }\n\n function parseStatesLine(behavior: DomainBehavior): void {\n const states: string[] = [];\n\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n if (current().type === TokenType.IDENTIFIER) {\n states.push(current().value);\n }\n advance();\n }\n\n behavior.states = states;\n }\n\n function parseTransitionsSection(behavior: DomainBehavior): void {\n // Check for INDENT\n if (current().type === TokenType.INDENT) {\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Only try to parse if we see DASH or FROM (transition markers)\n if (current().type === TokenType.DASH ||\n current().type === TokenType.FROM) {\n const transition = parseTransitionLine();\n if (transition) {\n behavior.transitions.push(transition);\n }\n } else {\n // Skip unrecognized content (e.g., \"filter\" effects that aren't standard)\n // Advance to next line to avoid infinite loop\n while (!isAtEnd() &&\n current().type !== TokenType.NEWLINE &&\n current().type !== TokenType.DEDENT) {\n advance();\n }\n }\n }\n\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n } else {\n // Parse inline transitions (non-indented)\n while (!isAtEnd() &&\n current().type !== TokenType.RULES &&\n current().type !== TokenType.EVERY) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.RULES ||\n current().type === TokenType.EVERY ||\n isAtEnd()) break;\n\n if (current().type === TokenType.DASH ||\n current().type === TokenType.FROM) {\n const transition = parseTransitionLine();\n if (transition) {\n behavior.transitions.push(transition);\n }\n } else {\n advance();\n }\n }\n }\n }\n\n function parseTransitionLine(): DomainTransition | null {\n // Skip dash if present\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n // Expect \"From\"\n if (current().type !== TokenType.FROM) {\n return null;\n }\n advance();\n\n // Get \"from\" state\n let fromState = '';\n if (current().type === TokenType.IDENTIFIER) {\n fromState = current().value;\n advance();\n }\n\n // Handle \"any\" as wildcard\n if (fromState.toLowerCase() === 'any') {\n fromState = '*';\n }\n\n // Expect \"to\"\n if (current().type !== TokenType.TO) {\n ctx.errors.push({ message: `Expected \"to\" in transition from \"${fromState}\"` });\n return null;\n }\n advance();\n\n // Get \"to\" state\n let toState = '';\n if (current().type === TokenType.IDENTIFIER) {\n toState = current().value;\n advance();\n }\n\n // Expect \"when\" for event\n let event = '';\n if (current().type === TokenType.WHEN) {\n advance();\n if (current().type === TokenType.IDENTIFIER) {\n event = current().value;\n advance();\n }\n }\n\n const transition: DomainTransition = {\n type: 'transition',\n fromState,\n toState,\n event: event.toUpperCase(),\n guards: [],\n effects: [],\n };\n\n skip(TokenType.NEWLINE);\n\n // Parse optional guard (\"if ...\")\n if (current().type === TokenType.INDENT) {\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // \"if [condition]\"\n if (current().type === TokenType.IF) {\n const guardText = collectLine();\n const guardResult = parseGuard(guardText, entityName);\n if (guardResult.success && guardResult.data) {\n transition.guards.push(guardResult.data);\n }\n continue;\n }\n\n // \"then [effect]\"\n if (current().type === TokenType.THEN) {\n advance();\n const effectText = collectUntilNewline();\n const effect = parseEffectText(effectText);\n if (effect) {\n transition.effects.push(effect);\n }\n continue;\n }\n\n // Skip any other token to prevent infinite loop\n if (current().type !== TokenType.NEWLINE && current().type !== TokenType.DEDENT) {\n advance();\n }\n\n skip(TokenType.NEWLINE);\n }\n\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n } else {\n // Check for inline \"if\" on same line\n if (current().type === TokenType.IF) {\n const guardText = collectLine();\n const guardResult = parseGuard(guardText, entityName);\n if (guardResult.success && guardResult.data) {\n transition.guards.push(guardResult.data);\n }\n }\n }\n\n return transition;\n }\n\n function parseRulesSection(behavior: DomainBehavior): void {\n if (current().type === TokenType.INDENT) {\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Skip dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n const rule = collectUntilNewline();\n if (rule) {\n behavior.rules.push(rule);\n }\n\n skip(TokenType.NEWLINE);\n }\n\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n }\n\n function parseTick(behavior: DomainBehavior): void {\n // Collect interval specification\n const intervalParts: string[] = [];\n while (!isAtEnd() &&\n current().type !== TokenType.COLON &&\n current().type !== TokenType.NEWLINE) {\n intervalParts.push(current().value);\n advance();\n }\n\n const interval = intervalParts.join(' ');\n\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n\n const tick: DomainTick = {\n type: 'tick',\n name: `tick_${interval.replace(/\\s+/g, '_').toLowerCase()}`,\n interval,\n intervalMs: parseInterval(interval),\n effects: [],\n };\n\n // Parse tick body (guard and effects)\n if (current().type === TokenType.INDENT) {\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // \"if [condition]\" - guard\n if (current().type === TokenType.IF) {\n const guardText = collectLine();\n const guardResult = parseGuard(guardText, entityName);\n if (guardResult.success && guardResult.data) {\n tick.guard = guardResult.data;\n }\n }\n\n // \"then [effect]\" or \"[effect]\"\n if (current().type === TokenType.THEN) {\n advance();\n }\n\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n const effectText = collectUntilNewline();\n if (effectText && current().type !== TokenType.IF) {\n const effect = parseEffectText(effectText);\n if (effect) {\n tick.effects.push(effect);\n }\n }\n\n skip(TokenType.NEWLINE);\n }\n\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n behavior.ticks.push(tick);\n }\n\n function collectLine(): string {\n return collectTokensSmartJoin();\n }\n\n function collectUntilNewline(): string {\n return collectTokensSmartJoin();\n }\n\n /**\n * Collect tokens and join them smartly - no spaces around dashes/dots\n * to preserve patterns like \"page-header\" and \"entity.field\"\n *\n * When insideArray is detected (starts with [), STRING tokens are quoted\n * to preserve valid JSON for S-expression parsing.\n */\n function collectTokensSmartJoin(): string {\n const parts: { value: string; type: TokenType }[] = [];\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n parts.push({ value: current().value, type: current().type });\n advance();\n }\n\n // Check if this looks like an S-expression (starts with [)\n // If so, we need to quote STRING tokens to preserve valid JSON\n const startsWithBracket = parts.length > 0 && parts[0].type === TokenType.LBRACKET;\n\n // Smart join: no spaces before/after DASH, DOT, or brackets\n let result = '';\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const prev = parts[i - 1];\n\n // Don't add space before dash, dot, comma, colon, or closing brackets\n const noSpaceBefore = part.type === TokenType.DASH ||\n part.type === TokenType.DOT ||\n part.type === TokenType.COMMA ||\n part.type === TokenType.COLON ||\n part.type === TokenType.RBRACKET ||\n part.type === TokenType.RPAREN;\n\n // Don't add space after dash, dot, or open brackets\n const prevNoSpaceAfter = prev &&\n (prev.type === TokenType.DASH ||\n prev.type === TokenType.DOT ||\n prev.type === TokenType.LBRACKET ||\n prev.type === TokenType.LPAREN);\n\n if (i > 0 && !noSpaceBefore && !prevNoSpaceAfter) {\n result += ' ';\n }\n\n // Quote STRING tokens if we're inside an S-expression to preserve valid JSON\n if (startsWithBracket && part.type === TokenType.STRING) {\n result += `\"${part.value}\"`;\n } else {\n result += part.value;\n }\n }\n\n return result.trim();\n }\n\n function parseEffectText(text: string): DomainEffect | null {\n const trimmed = text.trim();\n const lower = trimmed.toLowerCase();\n\n // First, check if this is a raw S-expression (JSON array like [\"render-ui\", ...])\n // Domain text from LLM may contain S-expressions directly\n if (trimmed.startsWith('[')) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed) && parsed.length > 0) {\n const effectOp = String(parsed[0]);\n // Return with effectType from first element\n // Keep the raw JSON in description - formatBehaviorToSchema will handle it\n // Cast to DomainEffect['effectType'] since we're parsing dynamic LLM content\n return {\n type: 'effect',\n effectType: effectOp as DomainEffect['effectType'],\n description: trimmed,\n config: { _rawSExpr: parsed }, // Store parsed S-expression\n };\n }\n } catch {\n // Not valid JSON, fall through to other handlers\n }\n }\n\n // \"persist [action] [entity]\" - persist effect\n const persistMatch = text.match(/^persist\\s+(\\w+)(?:\\s+(\\w+))?$/i);\n if (persistMatch) {\n return {\n type: 'effect',\n effectType: 'persist',\n description: text,\n config: {\n dataAction: persistMatch[1].toLowerCase(),\n entity: persistMatch[2] || undefined,\n },\n };\n }\n\n // \"send_in_app to [userId] title [title] message [message] type [type]\" - notify effect\n const sendInAppMatch = text.match(/^send_in_app\\s+to\\s+(.+?)\\s+title\\s+\"([^\"]+)\"\\s+message\\s+\"([^\"]+)\"(?:\\s+type\\s+(\\w+))?$/i);\n if (sendInAppMatch) {\n return {\n type: 'effect',\n effectType: 'notify',\n description: text,\n config: {\n userId: sendInAppMatch[1],\n title: sendInAppMatch[2],\n message: sendInAppMatch[3],\n type: sendInAppMatch[4] || 'info',\n },\n };\n }\n\n // Generic JSON config format: \"effectType:{...json...}\"\n const jsonMatch = text.match(/^(\\w+):(\\{.+\\})$/);\n if (jsonMatch) {\n try {\n const config = JSON.parse(jsonMatch[2]);\n return {\n type: 'effect',\n effectType: jsonMatch[1] as any,\n description: text,\n config,\n };\n } catch {\n // Fall through to other handlers\n }\n }\n\n // \"notify [recipient] [message]\" - notify with recipient\n const notifyWithRecipientMatch = text.match(/^notify\\s+(\\S+)\\s+\"([^\"]+)\"$/i);\n if (notifyWithRecipientMatch) {\n return {\n type: 'effect',\n effectType: 'notify',\n description: text,\n config: {\n recipient: notifyWithRecipientMatch[1],\n message: notifyWithRecipientMatch[2],\n },\n };\n }\n\n // \"notify [target]\"\n if (lower.startsWith('notify')) {\n const remaining = text.slice(6).trim();\n // Check if it's a quoted message\n const quotedMatch = remaining.match(/^\"([^\"]+)\"$/);\n return {\n type: 'effect',\n effectType: 'notify',\n description: text,\n config: {\n message: quotedMatch ? quotedMatch[1] : remaining,\n },\n };\n }\n\n // \"update [field] to [value]\" - set effect\n const updateMatch = text.match(/^update\\s+(.+?)\\s+to\\s+(.+)$/i);\n if (updateMatch) {\n return {\n type: 'effect',\n effectType: 'set',\n description: text,\n config: {\n field: preserveTemplateVars(updateMatch[1]),\n value: updateMatch[2],\n },\n };\n }\n\n // \"navigate to [path]\"\n const navMatch = text.match(/^navigate\\s+to\\s+(.+)$/i);\n if (navMatch) {\n return {\n type: 'effect',\n effectType: 'navigate',\n description: text,\n config: {\n path: navMatch[1],\n },\n };\n }\n\n // \"emit [event]\" - emit effect\n const emitMatch = text.match(/^emit\\s+(.+)$/i);\n if (emitMatch) {\n return {\n type: 'effect',\n effectType: 'emit',\n description: text,\n config: {\n eventKey: emitMatch[1].toUpperCase().replace(/\\s+/g, '_'),\n },\n };\n }\n\n // \"call [endpoint]\" - call-service effect\n const callMatch = text.match(/^call\\s+(.+)$/i);\n if (callMatch) {\n return {\n type: 'effect',\n effectType: 'call-service',\n description: text,\n config: {\n service: callMatch[1],\n },\n };\n }\n\n // \"render [pattern] to [slot]\" - render-ui effect (delegate to S-expression parser)\n if (lower.startsWith('render ')) {\n // This is a render effect - delegate to sexpr-parser for proper handling\n // Note: the sexpr-parser will validate the pattern type\n try {\n const result = parseDomainEffect(text);\n if (Array.isArray(result) && result[0] === 'render-ui') {\n return {\n type: 'effect',\n effectType: 'render-ui',\n description: text,\n config: {\n slot: result[1] as string,\n pattern: result[2] as Record<string, unknown>,\n },\n };\n }\n } catch {\n // Fall through to unknown effect warning\n }\n }\n\n // Unknown effect - warn and return null instead of silently converting to notify\n // This prevents masking of invalid effects that should be caught during validation\n ctx.warnings.push({\n message: `Unknown effect syntax: \"${text}\". Effect will be ignored. Use a valid effect format like \"update X to Y\", \"emit EVENT\", \"navigate to /path\", \"notify 'message'\", or \"render pattern to slot\".`,\n });\n return null;\n }\n\n function parseInterval(text: string): number {\n const lower = text.toLowerCase();\n\n // Match patterns like \"30 seconds\", \"1 hour\", \"5 minutes\"\n const match = lower.match(/(\\d+)\\s*(second|minute|hour|day|week)s?/);\n if (match) {\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 'second': return value * 1000;\n case 'minute': return value * 60 * 1000;\n case 'hour': return value * 60 * 60 * 1000;\n case 'day': return value * 24 * 60 * 60 * 1000;\n case 'week': return value * 7 * 24 * 60 * 60 * 1000;\n }\n }\n\n // Default to 1 hour\n return 60 * 60 * 1000;\n }\n}\n\n/**\n * Format a behavior AST back to domain text\n */\nexport function formatBehaviorToDomain(behavior: DomainBehavior): string {\n const lines: string[] = [];\n\n // Behavior name\n lines.push(behavior.name);\n lines.push('');\n\n // States\n if (behavior.states.length > 0) {\n lines.push(`States: ${behavior.states.join(', ')}`);\n lines.push('');\n }\n\n // Transitions\n if (behavior.transitions.length > 0) {\n lines.push('Transitions:');\n for (const transition of behavior.transitions) {\n const fromState = transition.fromState === '*' ? 'any' : transition.fromState;\n let line = ` - From ${fromState} to ${transition.toState}`;\n if (transition.event) {\n line += ` when ${transition.event}`;\n }\n lines.push(line);\n\n // Guards\n for (const guard of transition.guards) {\n lines.push(` ${guard.raw || formatGuardForDomain(guard)}`);\n }\n\n // Effects\n for (const effect of transition.effects) {\n lines.push(` then ${effect.description}`);\n }\n }\n lines.push('');\n }\n\n // Ticks\n for (const tick of behavior.ticks) {\n lines.push(`Every ${tick.interval}:`);\n if (tick.guard) {\n lines.push(` ${tick.guard.raw || formatGuardForDomain(tick.guard)}`);\n }\n for (const effect of tick.effects) {\n lines.push(` - ${effect.description}`);\n }\n lines.push('');\n }\n\n // Rules\n if (behavior.rules.length > 0) {\n lines.push('Rules:');\n for (const rule of behavior.rules) {\n lines.push(` - ${rule}`);\n }\n }\n\n return lines.join('\\n').trim();\n}\n\n/**\n * Format behavior AST to KFlow schema trait\n */\nexport function formatBehaviorToSchema(behavior: DomainBehavior): Record<string, unknown> {\n const trait: Record<string, unknown> = {\n // Just remove spaces, preserve the casing from the source\n // Trust the LLM/author to use consistent PascalCase naming\n name: behavior.name.replace(/\\s+/g, ''),\n description: behavior.name,\n };\n\n // Only include stateMachine if there are states\n if (behavior.states.length > 0) {\n trait.stateMachine = {\n states: behavior.states.map((state, index) => ({\n name: state,\n isInitial: state === behavior.initialState || (index === 0 && !behavior.initialState),\n })),\n events: extractEventsFromTransitions(behavior.transitions),\n transitions: behavior.transitions.map(t => {\n const transition: Record<string, unknown> = {\n from: t.fromState,\n to: t.toState,\n event: t.event,\n };\n\n // Only include guard if present - convert to S-Expression\n if (t.guards.length > 0) {\n // Convert guards to S-Expressions\n const guardExprs = t.guards.map(g => {\n // Use the raw text to parse to S-Expression\n if (g.raw) {\n return parseDomainGuard(g.raw, behavior.entityName);\n }\n return parseDomainGuard(formatGuardToCondition(g), behavior.entityName);\n });\n // Combine multiple guards with AND\n transition.guard = guardExprs.length === 1\n ? guardExprs[0]\n : ['and', ...guardExprs];\n }\n\n // Only include effects if present - convert to S-Expressions\n if (t.effects.length > 0) {\n transition.effects = t.effects.map(e => {\n // If effect has pre-parsed S-expression (from raw JSON in domain text), use it directly\n if (e.config && '_rawSExpr' in e.config && Array.isArray(e.config._rawSExpr)) {\n return e.config._rawSExpr;\n }\n // Otherwise, parse the description text to S-Expression\n return parseDomainEffect(e.description, behavior.entityName);\n });\n }\n\n return transition;\n }),\n };\n }\n\n // Only include ticks if there are any - convert to S-Expressions\n if (behavior.ticks.length > 0) {\n trait.ticks = behavior.ticks.map(t => ({\n name: toPascalCase(t.name.replace(/\\s+/g, '')),\n interval: t.intervalMs, // Direct number in ms\n guard: t.guard\n ? parseDomainGuard(t.guard.raw || formatGuardToCondition(t.guard), behavior.entityName)\n : undefined,\n effects: t.effects.map(e => {\n // If effect has pre-parsed S-expression (from raw JSON in domain text), use it directly\n if (e.config && '_rawSExpr' in e.config && Array.isArray(e.config._rawSExpr)) {\n return e.config._rawSExpr;\n }\n // Otherwise, parse the description text to S-Expression\n return parseDomainEffect(e.description, behavior.entityName);\n }),\n }));\n }\n\n return trait;\n}\n\n// === Utility Functions ===\n\nfunction toCamelCase(text: string): string {\n return text\n .toLowerCase()\n .split(/\\s+/)\n .map((word, index) =>\n index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join('');\n}\n\nfunction toPascalCase(text: string): string {\n // If no spaces, the text is likely already PascalCase (e.g., \"TraineeManager\")\n // Just ensure first letter is uppercase and preserve the rest\n if (!text.includes(' ')) {\n return text.charAt(0).toUpperCase() + text.slice(1);\n }\n // If has spaces, convert each word: \"trainee manager\" -> \"TraineeManager\"\n return text\n .split(/\\s+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\nfunction extractEventsFromTransitions(transitions: DomainTransition[]): { key: string; name: string }[] {\n const events = new Map<string, string>();\n\n for (const t of transitions) {\n if (t.event && !events.has(t.event)) {\n events.set(t.event, toTitleCase(t.event.replace(/_/g, ' ')));\n }\n }\n\n return Array.from(events.entries()).map(([key, name]) => ({ key, name }));\n}\n\nfunction toTitleCase(text: string): string {\n return text\n .toLowerCase()\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\nfunction formatGuardForDomain(guard: DomainGuard): string {\n return guard.raw || 'if condition';\n}\n\nfunction formatGuardToCondition(guard: DomainGuard): string {\n // Use the raw text if available, otherwise reconstruct\n if (guard.raw) {\n // Strip \"if \" prefix if present\n return guard.raw.replace(/^if\\s+/i, '');\n }\n return 'true';\n}\n\n/**\n * Preserve template variables like {linkedEntity} while converting the rest to camelCase\n * Input: \"{linkedEntity}.status\" -> \"{linkedEntity}.status\"\n * Input: \"entity . status\" -> \"entity.status\" (preserve dot paths)\n * Input: \"entity status\" -> \"entityStatus\" (convert spaces to camelCase)\n */\nfunction preserveTemplateVars(text: string): string {\n // If it contains template syntax {xxx}, preserve it\n if (text.includes('{') && text.includes('}')) {\n // Just clean up whitespace around dots\n return text.replace(/\\s*\\.\\s*/g, '.');\n }\n\n // Check if this is a dot-separated path (like \"entity . status\" from token reconstruction)\n // Clean up whitespace around dots first\n const cleanedText = text.replace(/\\s*\\.\\s*/g, '.');\n\n // If it's a dot path (like \"entity.status\" or \"entity.fieldName\"), preserve it as-is\n if (cleanedText.includes('.')) {\n return cleanedText;\n }\n\n // Otherwise convert spaces to camelCase\n return toCamelCase(text);\n}\n","/**\n * Domain to Schema Converter\n *\n * Applies domain language text changes to an OrbitalSchema.\n * Supports incremental updates (single section) and full replacement.\n * \n * Updated to use OrbitalSchema where entities, pages, and traits\n * are grouped into Orbital units instead of flat arrays.\n */\n\nimport type { DomainDocument, ParseError, SectionMapping } from '../types.js';\nimport { parseEntity, formatEntityToSchema } from '../parsers/entity-parser.js';\nimport { parsePage, formatPageToSchema } from '../parsers/page-parser.js';\nimport { parseBehavior, formatBehaviorToSchema } from '../parsers/behavior-parser.js';\nimport { parseDomainEffect } from '../parsers/sexpr-parser.js';\nimport type {\n OrbitalSchema,\n Orbital,\n OrbitalDefinition,\n Entity,\n Page,\n TraitRef,\n Trait,\n} from '@almadar/core/types';\nimport { isOrbitalDefinition, getTraitName, isEntityReference, isPageReferenceString, isPageReferenceObject, EntityRef, PageRef } from '@almadar/core/types';\n\n/**\n * Helper to get entity name from EntityRef (handles string references)\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n // Reference format: \"Alias.entity\" - extract alias\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n/**\n * Helper to get page name from PageRef\n */\nfunction getPageName(page: PageRef): string {\n if (isPageReferenceString(page)) {\n // \"Alias.pages.PageName\" -> \"PageName\"\n const parts = page.split('.');\n return parts[parts.length - 1];\n }\n if (isPageReferenceObject(page)) {\n const parts = page.ref.split('.');\n return parts[parts.length - 1];\n }\n return page.name;\n}\n\nexport interface DomainToSchemaResult {\n /** Whether the conversion was successful */\n success: boolean;\n\n /** The updated schema */\n schema: OrbitalSchema;\n\n /** Any parse errors encountered */\n errors: ParseError[];\n\n /** Warnings (non-fatal issues) */\n warnings: ParseError[];\n\n /** Updated section mappings */\n mappings: SectionMapping[];\n}\n\n/**\n * Parse a complete domain document and convert to OrbitalSchema\n */\nexport function convertDomainToSchema(domainText: string, baseSchema?: OrbitalSchema): DomainToSchemaResult {\n const errors: ParseError[] = [];\n const warnings: ParseError[] = [];\n const mappings: SectionMapping[] = [];\n\n // Start with base schema or empty\n // Note: OrbitalSchema no longer has top-level traits - they are inside orbitals\n const schema: OrbitalSchema = baseSchema ? {\n ...baseSchema,\n orbitals: [...(baseSchema.orbitals || [])],\n } : {\n name: 'Application',\n orbitals: [],\n };\n\n // Split document into sections\n const sections = splitDomainDocument(domainText);\n\n // Parse entities, pages, and behaviors\n const parsedEntities: Array<{ name: string; entity: Entity; text: string }> = [];\n const parsedPages: Array<{ name: string; page: Page; forEntity?: string; text: string }> = [];\n const parsedTraits: Array<{ name: string; trait: Trait; forEntity?: string; text: string }> = [];\n const parsedTicks: Array<Record<string, unknown>> = [];\n\n // Parse entities\n for (const text of sections.entities) {\n const result = parseEntity(text);\n if (result.success && result.data) {\n const entityRecord = formatEntityToSchema(result.data);\n const entity: Entity = {\n name: entityRecord.name as string,\n fields: (entityRecord.fields || []) as Entity['fields'],\n persistence: 'persistent',\n };\n parsedEntities.push({\n name: result.data.name,\n entity,\n text,\n });\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n }\n\n // Parse pages\n for (const text of sections.pages) {\n const result = parsePage(text);\n if (result.success && result.data) {\n const pageRecord = formatPageToSchema(result.data);\n const page: Page = {\n name: pageRecord.name as string,\n path: (pageRecord.path || '/') as string,\n primaryEntity: pageRecord.primaryEntity as string | undefined,\n };\n\n // Add trait reference if specified in domain text\n if (result.data.traitName) {\n page.traits = [{\n ref: result.data.traitName,\n linkedEntity: result.data.primaryEntity,\n }];\n }\n\n // Use EXPLICIT primaryEntity from domain text - NO INFERENCE!\n // If primaryEntity is not specified, page becomes orphaned (not attached to orbital)\n const forEntity = result.data.primaryEntity || page.primaryEntity;\n parsedPages.push({\n name: result.data.name,\n page,\n forEntity,\n text,\n });\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n }\n\n // Parse behaviors/traits\n for (const text of sections.behaviors) {\n // Check if it's a tick (starts with \"Every\")\n if (text.trim().toLowerCase().startsWith('every')) {\n const tick = parseTickFromDomain(text);\n if (tick) {\n parsedTicks.push(tick);\n }\n continue;\n }\n\n // Parse as behavior/trait\n const result = parseBehavior(text, '');\n if (result.success && result.data) {\n const traitRecord = formatBehaviorToSchema(result.data);\n const trait: Trait = {\n name: traitRecord.name as string,\n stateMachine: traitRecord.stateMachine as Trait['stateMachine'],\n };\n // Use explicit \"Entity: X\" from behavior syntax if present\n // Behaviors without explicit entity go to schema level (assigned via page references or name matching)\n const forEntity = result.data.entityName || undefined;\n parsedTraits.push({\n name: result.data.name,\n trait,\n forEntity,\n text,\n });\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n }\n\n // Log what was parsed\n console.log(`[DomainToSchema] Parsed: ${parsedEntities.length} entities, ${parsedPages.length} pages, ${parsedTraits.length} traits`);\n if (parsedEntities.length > 0) {\n console.log(`[DomainToSchema] Entities: ${parsedEntities.map(e => e.name).join(', ')}`);\n }\n if (parsedTraits.length > 0) {\n console.log(`[DomainToSchema] Traits: ${parsedTraits.map(t => t.name).join(', ')}`);\n }\n\n // Build a map of trait names to their linked entities from page trait references\n // This connects traits to orbitals via the pages that use them\n const traitToEntityMap = new Map<string, string>();\n for (const { page } of parsedPages) {\n if (page.traits && page.primaryEntity) {\n for (const traitRef of page.traits) {\n // PageTraitRef is always an object with ref property\n if (traitRef.ref) {\n // Use linkedEntity if specified, otherwise use page's primaryEntity\n const linkedEntity = traitRef.linkedEntity || page.primaryEntity;\n if (linkedEntity) {\n traitToEntityMap.set(traitRef.ref.toLowerCase(), linkedEntity);\n }\n }\n }\n }\n }\n\n // Log traitToEntityMap for debugging\n if (traitToEntityMap.size > 0) {\n console.log(`[DomainToSchema] Page trait references: ${Array.from(traitToEntityMap.entries()).map(([t, e]) => `${t}→${e}`).join(', ')}`);\n } else {\n console.log(`[DomainToSchema] No page trait references found (pages may be missing primaryEntity or traits)`);\n }\n\n // Group into Orbitals - each entity becomes an Orbital\n const orbitals: OrbitalDefinition[] = [];\n\n for (let i = 0; i < parsedEntities.length; i++) {\n const { name, entity, text } = parsedEntities[i];\n\n // Find pages for this entity\n const entityPages = parsedPages\n .filter(p => p.forEntity === name || p.page.primaryEntity === name)\n .map(p => p.page);\n\n // Find traits for this entity using CONCRETE strategies only:\n // 1. Explicit forEntity from \"Entity: X\" syntax in behavior definition\n // 2. Page trait references via \"shows Entity using Trait\" syntax\n // NO name-based inference - all associations must be explicit\n const entityTraits: TraitRef[] = parsedTraits\n .filter(t => {\n const traitNameLower = t.name.toLowerCase();\n\n // Strategy 1: Explicit forEntity from \"Entity: X\" syntax\n if (t.forEntity === name) {\n console.log(`[DomainToSchema] ✓ Trait \"${t.name}\" → Entity \"${name}\" (explicit Entity: syntax)`);\n return true;\n }\n\n // Strategy 2: Check if trait is linked to this entity via page trait references\n // This uses \"shows Entity using Trait\" syntax in page definitions\n const linkedEntity = traitToEntityMap.get(traitNameLower);\n if (linkedEntity === name) {\n console.log(`[DomainToSchema] ✓ Trait \"${t.name}\" → Entity \"${name}\" (page trait reference)`);\n return true;\n }\n\n return false;\n })\n .map(t => t.trait.name); // TraitRef can be just a string\n\n const orbital: OrbitalDefinition = {\n name,\n entity,\n traits: entityTraits,\n pages: entityPages,\n };\n\n orbitals.push(orbital);\n\n // Add mapping for entity\n mappings.push({\n sectionId: `entity_${name}`,\n sectionType: 'entity',\n schemaPath: `orbitals[${i}].entity`,\n domainText: text,\n });\n }\n\n // Add mappings for pages and traits\n for (const { name, forEntity, text } of parsedPages) {\n const orbitalIndex = parsedEntities.findIndex(e => e.name === forEntity);\n const pageIndex = orbitalIndex >= 0\n ? orbitals[orbitalIndex].pages.findIndex(p => getPageName(p) === name)\n : -1;\n\n mappings.push({\n sectionId: `page_${name}`,\n sectionType: 'page',\n schemaPath: orbitalIndex >= 0 && pageIndex >= 0\n ? `orbitals[${orbitalIndex}].pages[${pageIndex}]`\n : `orphanedPages`,\n domainText: text,\n });\n }\n\n for (const { name, forEntity, text } of parsedTraits) {\n const orbitalIndex = parsedEntities.findIndex(e => e.name === forEntity);\n const traitIndex = orbitalIndex >= 0\n ? orbitals[orbitalIndex].traits.findIndex(t => getTraitName(t) === name)\n : -1;\n\n mappings.push({\n sectionId: `behavior_${name}`,\n sectionType: 'behavior',\n schemaPath: orbitalIndex >= 0 && traitIndex >= 0\n ? `orbitals[${orbitalIndex}].traits[${traitIndex}]`\n : `traits`,\n domainText: text,\n });\n }\n\n // Collect all trait names that were assigned to orbitals\n const assignedTraitNames = new Set<string>();\n for (const orbital of orbitals) {\n for (const traitRef of orbital.traits) {\n const traitName = getTraitName(traitRef);\n assignedTraitNames.add(traitName.toLowerCase());\n }\n }\n\n // Note: OrbitalSchema no longer has top-level traits.\n // Traits are now inline in orbitals. Each orbital's traits array can contain\n // either trait references (strings) or inline trait definitions.\n // The traits are already assigned to orbitals via assignedTraitNames above.\n\n // Log for debugging\n console.log(`[DomainToSchema] ${parsedTraits.length} traits parsed, ${assignedTraitNames.size} assigned to orbitals`);\n for (const orbital of orbitals) {\n if (orbital.traits.length > 0) {\n console.log(`[DomainToSchema] Orbital ${orbital.name}: ${orbital.traits.length} traits - ${orbital.traits.join(', ')}`);\n }\n }\n\n schema.orbitals = orbitals;\n\n return {\n success: errors.length === 0,\n schema,\n errors,\n warnings,\n mappings,\n };\n}\n\n/**\n * Apply a single section update to an OrbitalSchema\n */\nexport function applySectionUpdate(\n schema: OrbitalSchema,\n sectionType: 'entity' | 'page' | 'behavior' | 'tick',\n sectionId: string,\n newDomainText: string,\n): DomainToSchemaResult {\n const errors: ParseError[] = [];\n const warnings: ParseError[] = [];\n const updatedSchema: OrbitalSchema = JSON.parse(JSON.stringify(schema));\n\n // Extract the name from sectionId (e.g., \"entity_Order\" -> \"Order\")\n const name = sectionId.replace(/^(entity|page|behavior|tick)_/, '');\n\n switch (sectionType) {\n case 'entity': {\n const result = parseEntity(newDomainText);\n if (result.success && result.data) {\n const entityRecord = formatEntityToSchema(result.data);\n const entity: Entity = {\n name: entityRecord.name as string,\n fields: (entityRecord.fields || []) as Entity['fields'],\n persistence: 'persistent',\n };\n\n // Find and update existing orbital or create new\n const orbitalIndex = updatedSchema.orbitals.findIndex(\n o => isOrbitalDefinition(o) && getEntityName(o.entity) === name\n );\n\n if (orbitalIndex >= 0) {\n const orbital = updatedSchema.orbitals[orbitalIndex] as OrbitalDefinition;\n orbital.entity = entity;\n } else {\n // Create new orbital for this entity\n updatedSchema.orbitals.push({\n name: result.data.name,\n entity,\n traits: [],\n pages: [],\n });\n }\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n break;\n }\n\n case 'page': {\n const result = parsePage(newDomainText);\n if (result.success && result.data) {\n const pageRecord = formatPageToSchema(result.data);\n const page: Page = {\n name: pageRecord.name as string,\n path: (pageRecord.path || '/') as string,\n primaryEntity: pageRecord.primaryEntity as string | undefined,\n };\n\n // Find orbital that contains this page or matches primary entity\n for (const orbital of updatedSchema.orbitals) {\n if (!isOrbitalDefinition(orbital)) continue;\n\n const pageIndex = orbital.pages.findIndex(p => getPageName(p) === name);\n if (pageIndex >= 0) {\n orbital.pages[pageIndex] = page;\n break;\n }\n\n // Add to matching entity's orbital\n if (page.primaryEntity && getEntityName(orbital.entity) === page.primaryEntity) {\n orbital.pages.push(page);\n break;\n }\n }\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n break;\n }\n\n case 'behavior': {\n const result = parseBehavior(newDomainText, '');\n if (result.success && result.data) {\n const traitRecord = formatBehaviorToSchema(result.data);\n const trait: Trait = {\n name: traitRecord.name as string,\n stateMachine: traitRecord.stateMachine as Trait['stateMachine'],\n };\n const traitRef: TraitRef = trait.name; // Simple string ref\n\n // NO INFERENCE! Traits without explicit entity reference go to schema level.\n // First, try to find existing trait by name in any orbital or schema-level\n let found = false;\n\n // Check if trait already exists in an orbital (update in place)\n for (const orbital of updatedSchema.orbitals) {\n if (!isOrbitalDefinition(orbital)) continue;\n const traitIndex = orbital.traits.findIndex(t => getTraitName(t) === name);\n if (traitIndex >= 0) {\n orbital.traits[traitIndex] = traitRef;\n found = true;\n break;\n }\n }\n\n // If not found in orbitals, add to the first orbital\n // OrbitalSchema no longer has top-level traits - traits must be in orbitals\n if (!found) {\n // Find first orbital definition and add the trait there\n const firstOrbital = updatedSchema.orbitals.find(o => isOrbitalDefinition(o));\n if (firstOrbital && isOrbitalDefinition(firstOrbital)) {\n firstOrbital.traits.push(traitRef);\n } else {\n errors.push({ message: `No orbital found to attach trait \"${name}\" to` });\n }\n }\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n break;\n }\n\n case 'tick': {\n // Ticks are converted to trait ticks - add as schema-level trait\n const tick = parseTickFromDomain(newDomainText);\n if (tick) {\n warnings.push({ message: 'Tick conversion to traits is not fully implemented' });\n } else {\n errors.push({ message: 'Failed to parse tick from domain text' });\n }\n break;\n }\n }\n\n return {\n success: errors.length === 0,\n schema: updatedSchema,\n errors,\n warnings,\n mappings: [],\n };\n}\n\n/**\n * Delete a section from the schema\n */\nexport function deleteSection(\n schema: OrbitalSchema,\n sectionType: 'entity' | 'page' | 'behavior' | 'tick',\n sectionId: string,\n): OrbitalSchema {\n const updatedSchema: OrbitalSchema = JSON.parse(JSON.stringify(schema));\n\n // Extract the name from sectionId\n const name = sectionId.replace(/^(entity|page|behavior|tick)_/, '');\n\n switch (sectionType) {\n case 'entity': {\n // Remove the entire orbital containing this entity\n updatedSchema.orbitals = updatedSchema.orbitals.filter(\n o => !isOrbitalDefinition(o) || getEntityName(o.entity) !== name\n );\n break;\n }\n\n case 'page': {\n // Remove page from its orbital\n for (const orbital of updatedSchema.orbitals) {\n if (!isOrbitalDefinition(orbital)) continue;\n orbital.pages = orbital.pages.filter(p => getPageName(p) !== name);\n }\n break;\n }\n\n case 'behavior': {\n // Remove trait reference from orbitals\n // OrbitalSchema no longer has top-level traits - all traits are in orbitals\n for (const orbital of updatedSchema.orbitals) {\n if (!isOrbitalDefinition(orbital)) continue;\n orbital.traits = orbital.traits.filter(t => getTraitName(t) !== name);\n }\n break;\n }\n\n case 'tick': {\n // Ticks would be in schema.traits - not fully implemented\n break;\n }\n }\n\n return updatedSchema;\n}\n\n/**\n * Split a domain document into its component sections\n */\nfunction splitDomainDocument(text: string): { entities: string[]; pages: string[]; behaviors: string[] } {\n const result = {\n entities: [] as string[],\n pages: [] as string[],\n behaviors: [] as string[],\n };\n\n // Split by major headers\n const normalizedText = text.replace(/\\r\\n/g, '\\n');\n\n // Find section boundaries\n let currentSection: 'entities' | 'pages' | 'behaviors' | null = null;\n let currentContent: string[] = [];\n\n const lines = normalizedText.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim().toLowerCase();\n\n // Check for section headers\n if (trimmed === '# entities' || trimmed === '#entities') {\n flushSection();\n currentSection = 'entities';\n continue;\n }\n if (trimmed === '# pages' || trimmed === '#pages') {\n flushSection();\n currentSection = 'pages';\n continue;\n }\n if (trimmed === '# behaviors' || trimmed === '#behaviors' ||\n trimmed === '# traits' || trimmed === '#traits') {\n flushSection();\n currentSection = 'behaviors';\n continue;\n }\n\n // Add line to current content\n currentContent.push(line);\n }\n\n // Flush final section\n flushSection();\n\n // If no headers were found, try to auto-detect sections\n if (result.entities.length === 0 && result.pages.length === 0 && result.behaviors.length === 0) {\n return autoDetectSections(normalizedText);\n }\n\n return result;\n\n function flushSection() {\n if (!currentSection || currentContent.length === 0) {\n currentContent = [];\n return;\n }\n\n const content = currentContent.join('\\n').trim();\n if (content) {\n // Split by --- separator first\n let items = content.split(/\\n---\\n/).map((s) => s.trim()).filter((s) => s);\n\n // For entities section, also split by \"A/An [Name] is\" patterns\n // This handles cases where LLM doesn't use --- separators\n if (currentSection === 'entities') {\n items = splitEntitiesByPattern(items);\n }\n // For pages section, split by \"[Name] at /\" patterns\n else if (currentSection === 'pages') {\n items = splitPagesByPattern(items);\n }\n // For behaviors section, split by \"[Name] behavior:\" patterns\n else if (currentSection === 'behaviors') {\n items = splitBehaviorsByPattern(items);\n }\n\n result[currentSection].push(...items);\n }\n\n currentContent = [];\n }\n}\n\n/**\n * Split entity content by \"A/An [Name] is\" patterns\n */\nfunction splitEntitiesByPattern(items: string[]): string[] {\n const result: string[] = [];\n\n for (const item of items) {\n // Check if this item contains multiple entities\n const lines = item.split('\\n');\n let currentEntity: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n // Check for entity definition start: \"A X is\" or \"An X is\"\n if (/^an?\\s+\\w+\\s+is\\s/i.test(trimmed) && currentEntity.length > 0) {\n // Flush previous entity\n result.push(currentEntity.join('\\n').trim());\n currentEntity = [line];\n } else {\n currentEntity.push(line);\n }\n }\n\n // Flush last entity\n if (currentEntity.length > 0) {\n result.push(currentEntity.join('\\n').trim());\n }\n }\n\n return result.filter(s => s);\n}\n\n/**\n * Split page content by \"[Name] at /\" patterns\n */\nfunction splitPagesByPattern(items: string[]): string[] {\n const result: string[] = [];\n\n for (const item of items) {\n const lines = item.split('\\n');\n let currentPage: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n // Check for page definition start: \"[Name] at /path\" or \"[Name]Page at /path\"\n if (/^\\w+(?:page)?\\s+at\\s+\\//i.test(trimmed) && currentPage.length > 0) {\n // Flush previous page\n result.push(currentPage.join('\\n').trim());\n currentPage = [line];\n } else {\n currentPage.push(line);\n }\n }\n\n // Flush last page\n if (currentPage.length > 0) {\n result.push(currentPage.join('\\n').trim());\n }\n }\n\n return result.filter(s => s);\n}\n\n/**\n * Split behavior content by \"[Name] behavior:\" patterns\n */\nfunction splitBehaviorsByPattern(items: string[]): string[] {\n const result: string[] = [];\n\n for (const item of items) {\n const lines = item.split('\\n');\n let currentBehavior: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n // Check for behavior definition start: \"[Name] behavior:\" or \"Every X\"\n if ((/^\\w+\\s+behavior:?$/i.test(trimmed) || /^every\\s+/i.test(trimmed)) && currentBehavior.length > 0) {\n // Flush previous behavior\n result.push(currentBehavior.join('\\n').trim());\n currentBehavior = [line];\n } else {\n currentBehavior.push(line);\n }\n }\n\n // Flush last behavior\n if (currentBehavior.length > 0) {\n result.push(currentBehavior.join('\\n').trim());\n }\n }\n\n return result.filter(s => s);\n}\n\n/**\n * Auto-detect sections when no headers are present\n */\nfunction autoDetectSections(text: string): { entities: string[]; pages: string[]; behaviors: string[] } {\n const result = {\n entities: [] as string[],\n pages: [] as string[],\n behaviors: [] as string[],\n };\n\n // Split by --- separator\n const sections = text.split(/\\n---\\n/).map((s) => s.trim()).filter((s) => s);\n\n for (const section of sections) {\n const firstLine = section.split('\\n')[0].toLowerCase();\n\n // Entity: starts with \"A\" or \"An\"\n if (firstLine.match(/^an?\\s+\\w+\\s+is/)) {\n result.entities.push(section);\n }\n // Page: starts with \"The\"\n else if (firstLine.match(/^the\\s+\\w+.*shows/)) {\n result.pages.push(section);\n }\n // Tick: starts with \"Every\"\n else if (firstLine.match(/^every\\s+/)) {\n result.behaviors.push(section);\n }\n // Behavior: Has \"States:\" or \"Transitions:\"\n else if (section.toLowerCase().includes('states:') ||\n section.toLowerCase().includes('transitions:')) {\n result.behaviors.push(section);\n }\n // Default: try to detect based on content\n else if (section.toLowerCase().includes('it has:')) {\n result.entities.push(section);\n }\n else if (section.toLowerCase().includes('it displays:')) {\n result.pages.push(section);\n }\n else {\n // Unknown section - try as entity\n result.entities.push(section);\n }\n }\n\n return result;\n}\n\n/**\n * Parse a tick from domain text\n */\nfunction parseTickFromDomain(text: string): Record<string, unknown> | null {\n const lines = text.trim().split('\\n');\n if (lines.length === 0) return null;\n\n const firstLine = lines[0].trim();\n\n // Parse \"Every [interval]:\"\n const intervalMatch = firstLine.match(/^every\\s+(.+?):?$/i);\n if (!intervalMatch) return null;\n\n const intervalStr = intervalMatch[1];\n const intervalMs = parseIntervalToMs(intervalStr);\n\n // Convert interval to PascalCase name\n const tickName = intervalStr\n .split(/\\s+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n\n const tick: Record<string, unknown> = {\n name: tickName,\n interval: intervalMs,\n effects: [] as Array<unknown[]>, // S-Expression arrays\n };\n\n // Parse remaining lines for guard and effects\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i].trim();\n\n if (line.toLowerCase().startsWith('if ')) {\n tick.guard = line.slice(3).trim();\n } else if (line.startsWith('-')) {\n const effectText = line.slice(1).trim();\n const effect = parseEffectFromText(effectText);\n if (effect) {\n (tick.effects as Array<unknown[]>).push(effect);\n }\n }\n }\n\n return tick;\n}\n\n/**\n * Parse an interval string to milliseconds\n */\nfunction parseIntervalToMs(text: string): number {\n const lower = text.toLowerCase();\n\n const match = lower.match(/(\\d+)\\s*(second|minute|hour|day|week)s?/);\n if (match) {\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 'second': return value * 1000;\n case 'minute': return value * 60 * 1000;\n case 'hour': return value * 60 * 60 * 1000;\n case 'day': return value * 24 * 60 * 60 * 1000;\n case 'week': return value * 7 * 24 * 60 * 60 * 1000;\n }\n }\n\n // Default to 1 hour\n return 60 * 60 * 1000;\n}\n\n/**\n * Parse an effect from text description to S-Expression format.\n * Delegates to the existing parseDomainEffect function from sexpr-parser.\n */\nfunction parseEffectFromText(text: string): unknown[] | null {\n try {\n const result = parseDomainEffect(text);\n // parseDomainEffect returns SExpr which can be a primitive or array\n // We only want arrays for effects\n if (Array.isArray(result)) {\n return result;\n }\n // If it returned a primitive, wrap in array or return null\n return null;\n } catch {\n return null;\n }\n}\n\n","/**\n * Finish Task Tool\n *\n * Signals the agent has completed the workflow. Automatically combines\n * orbitals and validates the result.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport type { FullOrbitalUnit } from '@almadar/core/types';\nimport { combineOrbitals } from '../orbitals/combiner/index.js';\nimport { convertDomainToSchema } from '../orbitals/domain-language/index.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Auto-collect orbitals from the .orbitals/ directory in the workspace.\n */\nasync function collectOrbitalsFromDir(workDir: string): Promise<FullOrbitalUnit[]> {\n const orbitalsDir = path.join(workDir, '.orbitals');\n\n try {\n const dirStat = await fs.stat(orbitalsDir);\n if (!dirStat.isDirectory()) {\n return [];\n }\n } catch {\n return [];\n }\n\n const files = await fs.readdir(orbitalsDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n if (jsonFiles.length === 0) {\n return [];\n }\n\n const orbitals: FullOrbitalUnit[] = [];\n for (const file of jsonFiles) {\n try {\n const content = await fs.readFile(path.join(orbitalsDir, file), 'utf-8');\n orbitals.push(JSON.parse(content));\n } catch {\n // Skip invalid files\n }\n }\n\n return orbitals;\n}\n\n/**\n * Validate schema using orbital CLI.\n */\nasync function validateSchemaWithCLI(schemaPath: string): Promise<{\n valid: boolean;\n errors: Array<{ code: string; path: string; message: string; suggestion?: string }>;\n warnings: Array<{ code: string; path: string; message: string }>;\n stats?: { orbitals: number; entities: number; traits: number; pages: number };\n}> {\n try {\n const { stdout } = await execAsync(\n `orbital validate \"${schemaPath}\" --json`,\n { timeout: 30000 },\n );\n const result = JSON.parse(stdout);\n return {\n valid: result.valid,\n errors: result.errors || [],\n warnings: result.warnings || [],\n stats: result.stats,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return {\n valid: false,\n errors: [{ code: 'CLI_ERROR', path: '', message: `Validation CLI error: ${errorMessage}` }],\n warnings: [],\n };\n }\n}\n\n/**\n * Create a finish_task tool that signals the agent has completed the workflow.\n *\n * Automatically combines orbitals from:\n * 1. .orbitals/ directory (for kflow-orbitals skill)\n * 2. domain.txt (for lean skills) - converted to schema via convertDomainToSchema\n */\nexport function createFinishTaskTool(workDir: string | undefined) {\n return tool(\n async (input) => {\n let combinedSchema = null;\n let stats = null;\n let validationResult: {\n valid: boolean;\n errors: Array<{ code: string; path: string; message: string }>;\n warnings: Array<{ code: string; path: string; message: string }>;\n } | null = null;\n let source: 'orbitals' | 'domain' | null = null;\n\n if (workDir) {\n // Strategy 1: Try .orbitals/ directory\n const orbitals = await collectOrbitalsFromDir(workDir);\n\n if (orbitals.length > 0) {\n source = 'orbitals';\n const appName =\n input.summary?.match(/Generated \\d+ orbitals?:?\\s*(.+)/)?.[1] ||\n orbitals[0]?.name ||\n 'Application';\n\n const result = combineOrbitals(orbitals, {\n name: appName,\n validate: false,\n });\n\n if (result.success && result.schema) {\n combinedSchema = result.schema;\n stats = result.stats;\n }\n } else {\n // Strategy 2: Try domain.txt\n const domainPath = path.join(workDir, 'domain.txt');\n try {\n const domainText = await fs.readFile(domainPath, 'utf-8');\n if (domainText.trim()) {\n source = 'domain';\n const appName =\n input.summary?.match(/Generated \\d+ orbitals?:?\\s*(.+)/)?.[1] ||\n 'Application';\n\n const domainResult = convertDomainToSchema(domainText, {\n name: appName,\n orbitals: [],\n });\n\n if (domainResult.success && domainResult.schema) {\n combinedSchema = domainResult.schema;\n const traitCount = (domainResult.schema.orbitals || []).reduce(\n (count, o) => count + ('traits' in o ? (o as { traits?: unknown[] }).traits?.length || 0 : 0),\n 0,\n );\n stats = {\n totalOrbitals: domainResult.schema.orbitals?.length || 0,\n totalEntities: domainResult.schema.orbitals?.length || 0,\n totalTraits: traitCount,\n totalPages:\n domainResult.schema.orbitals?.reduce(\n (sum, o) => sum + ('pages' in o ? (o as { pages?: unknown[] }).pages?.length || 0 : 0),\n 0,\n ) || 0,\n };\n }\n }\n } catch {\n // No domain.txt found\n }\n }\n\n // Write combined schema if we got one\n if (combinedSchema) {\n const schemaPath = path.join(workDir, 'schema.json');\n await fs.writeFile(schemaPath, JSON.stringify(combinedSchema, null, 2));\n validationResult = await validateSchemaWithCLI(schemaPath);\n }\n }\n\n return {\n success: true,\n status: 'TASK_COMPLETE',\n message: '✅ Task completed successfully. STOP HERE - do not make any more tool calls.',\n summary: input.summary,\n autoCombined: combinedSchema ? true : false,\n source: source || undefined,\n stats: stats || undefined,\n validation: validationResult\n ? {\n valid: validationResult.valid,\n errorCount: validationResult.errors?.length || 0,\n warningCount: validationResult.warnings?.length || 0,\n }\n : undefined,\n schemaPath: combinedSchema\n ? path.join(workDir!, 'schema.json')\n : input.schemaPath,\n nextAction: 'NONE - Task is complete. Output a brief success message to the user.',\n };\n },\n {\n name: 'finish_task',\n description: `Signal that the orbital generation workflow is COMPLETE.\n\n⚠️ IMPORTANT: After calling this tool, STOP. Do not make any more tool calls.\n\nWHAT IT DOES:\n1. Automatically collects orbitals from .orbitals/ directory\n2. Combines them into a single OrbitalSchema\n3. Validates the combined schema\n4. Writes schema.json to workspace\n5. Returns success with stats`,\n schema: z.object({\n summary: z.string().describe('Brief summary of what was accomplished'),\n schemaPath: z.string().optional().describe('Path to the combined schema file if already written'),\n }),\n },\n );\n}\n","/**\n * Domain Orbital Tool\n *\n * Generates domain language orbitals incrementally using LLM.\n * Uses @almadar/llm for LLM access and @almadar/skills for prompt sections.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport crypto from 'crypto';\nimport { LLMClient } from '@almadar/llm';\nimport {\n getSExprQuickRef,\n getKeyBehaviorsReference,\n getCommonErrorsSection,\n getArchitectureSection,\n} from '@almadar/skills';\nimport type { SSEEventType } from '../api-types.js';\nimport { convertDomainToSchema } from '../orbitals/domain-language/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DomainOrbitalEventCallback = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n }\n) => void;\n\nexport type DomainOrbitalCompleteCallback = (\n domainText: string,\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number\n) => void | Promise<void>;\n\nexport interface DomainOrbitalToolOptions {\n onEvent?: DomainOrbitalEventCallback;\n onOrbitalComplete?: DomainOrbitalCompleteCallback;\n workDir?: string;\n}\n\nexport interface DomainOrbitalSpec {\n name: string;\n entity: {\n name: string;\n persistence: 'persistent' | 'runtime' | 'singleton';\n fields: Array<{\n name: string;\n type: string;\n required?: boolean;\n default?: unknown;\n }>;\n relations?: Array<{\n entity: string;\n alias?: string;\n type: 'belongs_to' | 'has_many';\n }>;\n };\n pages: Array<{\n name: string;\n path: string;\n viewType: string;\n isInitial?: boolean;\n }>;\n traits: string[];\n patterns: string[];\n domainContext?: {\n request: string;\n requestFragment?: string;\n category: 'game' | 'business' | 'dashboard' | 'form' | 'content' | 'social';\n vocabulary?: Record<string, string>;\n };\n design?: {\n style?: 'minimal' | 'modern' | 'playful' | 'data-driven' | 'immersive';\n uxHints?: {\n flowPattern?: 'hub-spoke' | 'master-detail' | 'crud-cycle' | 'linear' | 'role-based';\n listPattern?: 'entity-table' | 'entity-cards' | 'entity-list';\n formPattern?: 'modal' | 'drawer' | 'page';\n detailPattern?: 'drawer' | 'page' | 'split';\n };\n };\n emits?: string[];\n listens?: Array<{\n event: string;\n triggers: string;\n }>;\n}\n\n// ============================================================================\n// Cache\n// ============================================================================\n\ninterface CacheEntry {\n domainText: string;\n timestamp: number;\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n}\n\nconst domainOrbitalCache = new Map<string, CacheEntry>();\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst CACHE_VERSION = 5;\n\nfunction generateFingerprint(spec: DomainOrbitalSpec): string {\n const normalized = JSON.stringify({\n version: CACHE_VERSION,\n entity: spec.entity,\n pages: spec.pages,\n traits: spec.traits.sort(),\n patterns: spec.patterns.sort(),\n emits: spec.emits?.sort() || [],\n listens: spec.listens?.map(l => `${l.event}:${l.triggers}`).sort() || [],\n });\n return crypto.createHash('sha256').update(normalized).digest('hex').slice(0, 16);\n}\n\nfunction getCached(fingerprint: string): CacheEntry | null {\n const entry = domainOrbitalCache.get(fingerprint);\n if (!entry) return null;\n if (Date.now() - entry.timestamp > CACHE_TTL_MS) {\n domainOrbitalCache.delete(fingerprint);\n return null;\n }\n return entry;\n}\n\nfunction setCache(fingerprint: string, entry: CacheEntry): void {\n domainOrbitalCache.set(fingerprint, entry);\n}\n\n// ============================================================================\n// File-based domain accumulation\n// ============================================================================\n\nfunction appendToDomainFile(workDir: string, domainText: string, _orbitalName: string): void {\n const domainPath = path.join(workDir, 'domain.txt');\n const separator = `\\n\\n---\\n`;\n let existingContent = '';\n if (fs.existsSync(domainPath)) {\n existingContent = fs.readFileSync(domainPath, 'utf-8');\n }\n const newContent = existingContent + separator + domainText;\n fs.writeFileSync(domainPath, newContent, 'utf-8');\n}\n\nfunction readDomainFile(workDir: string): string | null {\n const domainPath = path.join(workDir, 'domain.txt');\n if (!fs.existsSync(domainPath)) {\n return null;\n }\n return fs.readFileSync(domainPath, 'utf-8');\n}\n\n// ============================================================================\n// LLM Generation Prompt (uses @almadar/skills)\n// ============================================================================\n\nfunction buildStaticSystemPrompt(): string {\n const behaviorsRef = getKeyBehaviorsReference();\n const sExprRef = getSExprQuickRef();\n const errorsRef = getCommonErrorsSection();\n const architectureRef = getArchitectureSection();\n\n return `You are a domain language expert. Generate clean, complete domain language for OrbitalSchema applications.\n\n${behaviorsRef}\n\n---\n\n${sExprRef}\n\n---\n\n${architectureRef}\n\n---\n\n${errorsRef}\n\n---\n\n## Output Requirements\n\nGenerate ONLY the domain language text with these EXACT formats:\n\n### Entity Format (CRITICAL)\n\\`\\`\\`\n# Entities\n\nA [EntityName] is a [persistent|runtime|singleton] entity that:\n - has [fieldName] as [type] (required)\n - has [fieldName] as [type] with default [value]\n - belongs to [RelatedEntity]\n - has many [RelatedEntity]s\n\\`\\`\\`\n\n### Page Format (CRITICAL)\n\\`\\`\\`\n# Pages\n\n[PageName] at /[path]:\n - shows [Entity] using [TraitName]\n - view type: list\n - is initial page\n\\`\\`\\`\n\n### Behavior Format (CRITICAL)\n\\`\\`\\`\n# Behaviors\n\n[TraitName] behavior:\n Entity: [EntityName]\n States: [State1], [State2], ...\n Initial: [State1]\n\n Transitions:\n - From [State1] to [State2] on [EVENT]\n then [S-Expression effect]\n\\`\\`\\`\n\n**CRITICAL RULES:**\n1. Entities MUST start with \"A\" or \"An\"\n2. Behaviors MUST have \"Entity: [EntityName]\" line after the behavior name\n3. Pages MUST use \"shows [Entity] using [TraitName]\" format\n\nGenerate ONLY the domain language text, no explanations or markdown code blocks.`;\n}\n\nfunction buildDynamicUserPrompt(spec: DomainOrbitalSpec): string {\n const entityFields = spec.entity.fields\n .map(f => {\n let fieldDef = ` - ${f.name}: ${f.type}`;\n if (f.required) fieldDef += ', required';\n if (f.default !== undefined) fieldDef += `, default ${JSON.stringify(f.default)}`;\n return fieldDef;\n })\n .join('\\n');\n\n const relations = spec.entity.relations\n ?.map(r => {\n if (r.type === 'belongs_to') {\n return r.alias\n ? ` - belongs to ${r.entity} as ${r.alias}`\n : ` - belongs to ${r.entity}`;\n }\n return ` - has many ${r.entity}s`;\n })\n .join('\\n') || '';\n\n const pagesInfo = spec.pages\n .map(p => `- ${p.name} at ${p.path} (${p.viewType}${p.isInitial ? ', initial' : ''})`)\n .join('\\n');\n\n const emitsInfo = spec.emits?.length\n ? `**Emits Events**: ${spec.emits.join(', ')}`\n : '';\n const listensInfo = spec.listens?.length\n ? `**Listens**: ${spec.listens.map(l => `${l.event} → ${l.triggers}`).join(', ')}`\n : '';\n\n return `Generate domain language for the following orbital.\n\n## Orbital Specification\n\n**Entity**: ${spec.entity.name} (${spec.entity.persistence})\n**Fields**:\n${entityFields}\n${relations ? `**Relations**:\\n${relations}` : ''}\n\n**Pages**:\n${pagesInfo}\n\n**Behaviors**: ${spec.traits.join(', ')}\n**UI Patterns**: ${spec.patterns.join(', ')}\n${emitsInfo}\n${listensInfo}\n\nReplace [Entity] placeholders with \"${spec.entity.name}\" in all patterns.`;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst GenerateOrbitalDomainSchema = z.object({\n sessionId: z.string().describe('Unique session ID for this generation batch'),\n orbital: z.object({\n name: z.string(),\n entity: z.object({\n name: z.string(),\n persistence: z.enum(['persistent', 'runtime', 'singleton']),\n fields: z.array(z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean().optional(),\n default: z.any().optional(),\n })),\n relations: z.array(z.object({\n entity: z.string(),\n alias: z.string().optional(),\n type: z.enum(['belongs_to', 'has_many']),\n })).optional(),\n }),\n pages: z.array(z.object({\n name: z.string(),\n path: z.string(),\n viewType: z.string(),\n isInitial: z.boolean().optional(),\n })),\n traits: z.array(z.string()),\n patterns: z.array(z.string()),\n domainContext: z.object({\n request: z.string(),\n requestFragment: z.string().optional(),\n category: z.enum(['game', 'business', 'dashboard', 'form', 'content', 'social']),\n vocabulary: z.record(z.string(), z.string()).optional(),\n }).optional(),\n design: z.object({\n style: z.enum(['minimal', 'modern', 'playful', 'data-driven', 'immersive']).optional(),\n uxHints: z.object({\n flowPattern: z.enum(['hub-spoke', 'master-detail', 'crud-cycle', 'linear', 'role-based']).optional(),\n listPattern: z.enum(['entity-table', 'entity-cards', 'entity-list']).optional(),\n formPattern: z.enum(['modal', 'drawer', 'page']).optional(),\n detailPattern: z.enum(['drawer', 'page', 'split']).optional(),\n }).optional(),\n }).optional(),\n emits: z.array(z.string()).optional(),\n listens: z.array(z.object({\n event: z.string(),\n triggers: z.string(),\n })).optional(),\n }).describe('The orbital specification'),\n orbitalIndex: z.number().describe('Index in the batch (0-based)'),\n totalOrbitals: z.number().describe('Total orbitals in the batch'),\n});\n\nconst ConstructCombinedDomainSchema = z.object({\n appName: z.string().describe('Name of the application'),\n});\n\n// ============================================================================\n// Tool Factories\n// ============================================================================\n\n/**\n * Create the generate_orbital_domain tool.\n * Uses @almadar/llm LLMClient directly for Anthropic calls.\n */\nexport function createGenerateOrbitalDomainTool(\n \n options: DomainOrbitalToolOptions = {},\n) {\n let eventCallback: DomainOrbitalEventCallback | undefined = options.onEvent;\n let completeCallback: DomainOrbitalCompleteCallback | undefined = options.onOrbitalComplete;\n const workDir = options.workDir || process.cwd();\n\n const STATIC_SYSTEM_PROMPT = buildStaticSystemPrompt();\n\n const setEventCallback = (callback: DomainOrbitalEventCallback) => {\n eventCallback = callback;\n };\n\n const setCompleteCallback = (callback: DomainOrbitalCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback(orbitalName, orbitalIndex, totalOrbitals, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const generateOrbitalDomainTool = tool(\n async ({ sessionId, orbital, orbitalIndex, totalOrbitals }) => {\n const spec = orbital as DomainOrbitalSpec;\n const fingerprint = generateFingerprint(spec);\n\n try {\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generating domain orbital: ${spec.name} (${orbitalIndex + 1}/${totalOrbitals})`,\n role: 'assistant',\n isComplete: false,\n });\n\n // Check cache\n const cached = getCached(fingerprint);\n if (cached) {\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Cache HIT for ${spec.name}`,\n data: { fingerprint, cachedAt: new Date(cached.timestamp).toISOString() },\n orbitalName: spec.name,\n });\n\n appendToDomainFile(workDir, cached.domainText, spec.name);\n\n if (completeCallback) {\n await completeCallback(cached.domainText, spec.name, orbitalIndex, totalOrbitals);\n }\n\n return JSON.stringify({\n success: true,\n orbitalName: spec.name,\n fingerprint,\n cached: true,\n domainWritten: true,\n usage: cached.usage,\n });\n }\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Cache MISS for ${spec.name}, generating with LLM`,\n data: { fingerprint },\n orbitalName: spec.name,\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n temperature: 0,\n });\n\n const userPrompt = buildDynamicUserPrompt(spec);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'tool_call', {\n tool: 'llm_generate_domain',\n args: {\n orbital: spec.name,\n entity: spec.entity.name,\n traits: spec.traits,\n },\n });\n\n const response = await client.callWithCache<string>({\n systemPrompt: '',\n systemBlocks: [{\n type: 'text',\n text: STATIC_SYSTEM_PROMPT,\n cache_control: { type: 'ephemeral' },\n }],\n userPrompt,\n maxTokens: 8192,\n rawText: true,\n });\n\n const domainText = (response.raw || String(response.data) || '').trim();\n\n const usage = {\n inputTokens: response.usage?.promptTokens || 0,\n outputTokens: response.usage?.completionTokens || 0,\n totalTokens: response.usage?.totalTokens || 0,\n };\n\n setCache(fingerprint, {\n domainText,\n timestamp: Date.now(),\n usage,\n });\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'llm_generate_domain',\n result: { fingerprint, textLength: domainText.length, usage },\n success: true,\n });\n\n appendToDomainFile(workDir, domainText, spec.name);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generated domain for ${spec.name} (${usage.totalTokens} tokens) - written to domain.txt`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback) {\n try {\n await completeCallback(domainText, spec.name, orbitalIndex, totalOrbitals);\n } catch (error) {\n console.error(`[DomainOrbitalTool] Callback error for ${spec.name}:`, error);\n }\n }\n\n return JSON.stringify({\n success: true,\n orbitalName: spec.name,\n fingerprint,\n cached: false,\n domainWritten: true,\n usage,\n domainText,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'error', {\n error: errorMessage,\n code: 'DOMAIN_ORBITAL_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbitalName: spec.name,\n });\n }\n },\n {\n name: 'generate_orbital_domain',\n description: `Generate domain language for a single orbital using LLM.\n\nTakes a lightweight orbital specification and generates complete domain language text.\nResults are cached by fingerprint to avoid regenerating identical orbitals.\n\nUSAGE:\n1. Decompose app into orbital specs\n2. For each orbital, call generate_orbital_domain\n3. After all orbitals, call construct_combined_domain`,\n schema: GenerateOrbitalDomainSchema,\n }\n );\n\n return {\n tool: generateOrbitalDomainTool,\n setEventCallback,\n setCompleteCallback,\n };\n}\n\n/**\n * Create the construct_combined_domain tool.\n */\nexport function createConstructCombinedDomainTool(\n \n options: { onEvent?: DomainOrbitalEventCallback; workDir?: string } = {},\n) {\n let eventCallback = options.onEvent;\n const workDir = options.workDir || process.cwd();\n\n const setEventCallback = (callback: DomainOrbitalEventCallback) => {\n eventCallback = callback;\n };\n\n const emitEvent = (\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback('combined', 0, 1, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const constructCombinedDomainTool = tool(\n async ({ appName }) => {\n try {\n const domainText = readDomainFile(workDir);\n if (!domainText) {\n return JSON.stringify({\n success: false,\n error: 'No domain.txt found. Call generate_orbital_domain first.',\n });\n }\n\n emitEvent('message', {\n content: `Converting domain.txt to OrbitalSchema for ${appName}`,\n role: 'assistant',\n isComplete: false,\n });\n\n const schemaResult = convertDomainToSchema(domainText, {\n name: appName,\n orbitals: [],\n });\n\n if (!schemaResult.success) {\n const errorMessages = schemaResult.errors?.map(e => e.message).join('; ') || 'Unknown conversion error';\n\n emitEvent('error', {\n error: errorMessages,\n code: 'DOMAIN_CONVERSION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessages,\n domainText,\n });\n }\n\n emitEvent('message', {\n content: `Successfully converted domain.txt to OrbitalSchema for ${appName}`,\n role: 'assistant',\n isComplete: true,\n });\n\n const traitCount = (schemaResult.schema?.orbitals || []).reduce((count, o) => {\n if (typeof o === 'object' && o !== null && 'traits' in o) {\n return count + ((o as { traits?: unknown[] }).traits?.length || 0);\n }\n return count;\n }, 0);\n\n return JSON.stringify({\n success: true,\n appName,\n domainText,\n schema: schemaResult.schema,\n stats: {\n orbitalCount: schemaResult.schema?.orbitals?.length || 0,\n traitCount,\n },\n domainPath: path.join(workDir, 'domain.txt'),\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent('error', {\n error: errorMessage,\n code: 'CONSTRUCT_COMBINED_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n });\n }\n },\n {\n name: 'construct_combined_domain',\n description: `Convert accumulated domain.txt to OrbitalSchema.\n\nCall this after all orbitals have been generated via generate_orbital_domain.`,\n schema: ConstructCombinedDomainSchema,\n }\n );\n\n return {\n tool: constructCombinedDomainTool,\n setEventCallback,\n };\n}\n\n/**\n * Create both domain orbital tools together.\n */\nexport function createDomainOrbitalTools(\n options: DomainOrbitalToolOptions = {},\n) {\n const generateTool = createGenerateOrbitalDomainTool(options);\n const constructTool = createConstructCombinedDomainTool({\n onEvent: options.onEvent,\n workDir: options.workDir,\n });\n\n return {\n generateOrbitalDomain: generateTool.tool,\n constructCombinedDomain: constructTool.tool,\n setEventCallback: (callback: DomainOrbitalEventCallback) => {\n generateTool.setEventCallback(callback);\n constructTool.setEventCallback(callback);\n },\n setCompleteCallback: generateTool.setCompleteCallback,\n };\n}\n","/**\n * Orbital Generator\n *\n * Provides utilities for generating FullOrbitalUnit definitions from\n * lightweight OrbitalUnit inputs. Designed for SUBAGENT use where each\n * orbital is generated separately for better caching.\n *\n * ## Subagent Caching Pattern\n *\n * When generating multiple orbitals in a subagent pattern:\n * 1. Main agent decomposes request → OrbitalUnit[]\n * 2. For each orbital, subagent calls generateFullOrbital()\n * 3. Each subagent call uses the SAME cached system prompt blocks\n * 4. Anthropic caches at request level → subsequent calls get 90% discount\n *\n * This is MORE efficient than batch generation because:\n * - System prompt is cached and reused across subagent calls\n * - Template guidance is cached per fingerprint\n * - Only the orbital-specific content varies\n *\n * @packageDocumentation\n */\n\nimport type { LLMClient, LLMProvider } from '@almadar/llm';\nimport { assembleCacheableOrbitalPrompt, assembleOrbitalPrompt } from '../cache/index.js';\nimport { getOrbitalDecompositionPrompt, getFullOrbitalPrompt, getRequirementsDecomposePrompt, getRequirementsTraitPrompt } from '@almadar/skills';\nimport type { OrbitalDefinition, FullOrbitalUnit, EntityRef } from '@almadar/core/types';\nimport { isEntityReference } from '@almadar/core/types';\n// DEPRECATED: Validation removed - use orbital-rust validator instead\n// import { validateFullOrbitalUnit } from '../../validation/index.js';\n\n/**\n * Get entity name safely from EntityRef\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n// ============================================================================\n// Requirements Types (imported structure from analysis)\n// ============================================================================\n\n/**\n * Extracted requirements from the analysis phase.\n * Matches ExtractedRequirements from agents/orchestrator/shared/requirements.ts\n */\nexport interface ExtractedRequirements {\n /** Entity names to create */\n entities: string[];\n /** State names that should exist */\n states: string[];\n /** Event/action names */\n events: string[];\n /** Business rules (become guards) */\n guards: string[];\n /** Page types needed */\n pages: string[];\n /** Notifications/side-effects */\n effects: string[];\n /** Raw requirement statements */\n rawRequirements: string[];\n}\n\n// Type alias - OrbitalUnit in generator context is always a full definition\ntype OrbitalUnit = OrbitalDefinition;\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A structured log entry from the generation process.\n * Used for debugging and observability of subagent reasoning.\n */\nexport interface GenerationLog {\n /** Timestamp of the log entry */\n timestamp: number;\n /** Log level */\n level: 'info' | 'warn' | 'error' | 'debug';\n /** Log message */\n message: string;\n /** Optional structured data */\n data?: Record<string, unknown>;\n}\n\nexport interface OrbitalGenerationOptions {\n /** Maximum tokens for generation */\n maxTokens?: number;\n /** Enable validation after generation */\n validate?: boolean;\n /** Callback for real-time log streaming (SSE integration) */\n onLog?: (log: GenerationLog, orbitalName?: string) => void;\n /** Optional requirements relevant to this orbital (from analysis) */\n requirements?: Partial<ExtractedRequirements>;\n}\n\nexport interface OrbitalGenerationResult {\n /** Generated full orbital unit */\n orbital: FullOrbitalUnit;\n /** Fingerprint used for caching */\n fingerprint: string;\n /** Whether template guidance was used */\n usedTemplate: boolean;\n /** Token usage */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n /** Validation result */\n validation?: {\n valid: boolean;\n errorCount: number;\n warningCount: number;\n };\n /** Structured logs from the generation process */\n logs: GenerationLog[];\n}\n\n// ============================================================================\n// Provider Concurrency Limits\n// ============================================================================\n\n/**\n * Default concurrency limits per LLM provider.\n * These are conservative defaults to avoid rate limiting.\n */\nexport const PROVIDER_CONCURRENCY_LIMITS: Record<LLMProvider, number> = {\n anthropic: 3,\n openai: 5,\n deepseek: 3,\n kimi: 3,\n};\n\nexport interface ParallelGenerationOptions extends OrbitalGenerationOptions {\n /** Maximum concurrent generations (default: provider-specific) */\n concurrency?: number;\n}\n\nexport interface ParallelGenerationResult {\n /** Results for each orbital (same order as input) */\n results: OrbitalGenerationResult[];\n /** Total duration in milliseconds */\n totalDurationMs: number;\n /** Aggregate logs from all generations */\n aggregateLogs: GenerationLog[];\n /** Summary statistics */\n summary: {\n total: number;\n successful: number;\n failed: number;\n totalTokens: number;\n };\n}\n\n// ============================================================================\n// Logging Utility\n// ============================================================================\n\nfunction createLog(level: GenerationLog['level'], message: string, data?: Record<string, unknown>): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message,\n data,\n };\n}\n\n// ============================================================================\n// Single Orbital Generation (For Subagent Use)\n// ============================================================================\n\n/**\n * Generate a full orbital unit from a lightweight orbital input.\n *\n * DESIGNED FOR SUBAGENT USE: Call this once per orbital in separate\n * subagent invocations. Caching works across calls because:\n * - System prompt blocks are marked as cacheable\n * - Anthropic caches at the request level\n * - Subsequent calls with same system prompt get cache hits\n *\n * @example\n * ```typescript\n * // In subagent for each orbital:\n * const result = await generateFullOrbital(client, orbitalUnit, { validate: true });\n * // First call: Cache WRITE: 3500 tokens\n * // Second call: Cache HIT: 3500 tokens (90% discount!)\n * ```\n */\nexport async function generateFullOrbital(\n client: LLMClient,\n orbital: OrbitalUnit,\n options: OrbitalGenerationOptions = {}\n): Promise<OrbitalGenerationResult> {\n const {\n maxTokens = 8192,\n validate = true,\n requirements,\n } = options;\n\n const logs: GenerationLog[] = [];\n const startTime = Date.now();\n\n logs.push(createLog('info', `Starting generation for orbital: ${orbital.name}`, {\n entityName: getEntityName(orbital.entity),\n traitCount: orbital.traits.length,\n hasRequirements: !!requirements,\n }));\n\n // Use requirements-aware prompt if requirements provided\n const systemPrompt = requirements\n ? getRequirementsAwareFullOrbitalPrompt(requirements)\n : getFullOrbitalPrompt();\n\n // Check if using Anthropic for cache support\n const useCache = client.getProvider() === 'anthropic';\n\n let result;\n let fingerprint: string;\n let usedTemplate = false;\n\n if (useCache) {\n // Use cache-aware call - this is where the magic happens\n const cacheablePrompt = assembleCacheableOrbitalPrompt(orbital, systemPrompt);\n fingerprint = cacheablePrompt.fingerprint;\n usedTemplate = cacheablePrompt.usedCachedTemplate;\n\n logs.push(createLog('info', `Using Anthropic caching`, { fingerprint, usedTemplate }));\n console.log(`[OrbitalGenerator] Using Anthropic caching (fingerprint: ${fingerprint})`);\n\n result = await client.callWithCache({\n systemBlocks: cacheablePrompt.systemBlocks,\n userBlocks: cacheablePrompt.userBlocks,\n systemPrompt: '', // Overridden by blocks\n userPrompt: '', // Overridden by blocks\n maxTokens,\n skipSchemaValidation: true, // Parse JSON only\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: result.usage?.promptTokens,\n completionTokens: result.usage?.completionTokens,\n }));\n } else {\n // Standard call for non-Anthropic providers\n const assembledPrompt = assembleOrbitalPrompt(orbital, systemPrompt);\n fingerprint = assembledPrompt.fingerprint;\n usedTemplate = assembledPrompt.usedCachedTemplate;\n\n logs.push(createLog('info', `Using standard generation (${client.getProvider()})`, { fingerprint, usedTemplate }));\n\n const userPrompt = `Generate a complete FullOrbitalUnit for this orbital:\n\n${JSON.stringify(orbital, null, 2)}\n\nReturn valid JSON matching the FullOrbitalUnit schema.`;\n\n result = await client.callWithMetadata({\n systemPrompt: assembledPrompt.prompt,\n userPrompt,\n maxTokens,\n skipSchemaValidation: true,\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: result.usage?.promptTokens,\n completionTokens: result.usage?.completionTokens,\n }));\n }\n\n const generatedOrbital = result.data as OrbitalDefinition;\n\n // Validate if requested\n let validation;\n if (validate) {\n // Use direct per-unit validation\n // DEPRECATED: Validation removed - use orbital-rust validator instead\n // const validationResult = validateFullOrbitalUnit(generatedOrbital);\n const validationResult: any = { valid: true, errors: [], warnings: [] };\n validation = {\n valid: validationResult.valid,\n errorCount: validationResult.errors.length,\n warningCount: (validationResult.warnings || []).length,\n };\n\n if (validationResult.valid) {\n logs.push(createLog('info', `Validation passed`));\n } else {\n logs.push(createLog('warn', `Validation failed`, {\n errorCount: validationResult.errors.length,\n warningCount: (validationResult.warnings || []).length,\n errors: validationResult.errors.slice(0, 3).map((e: any) => e.message || e),\n }));\n }\n }\n\n const durationMs = Date.now() - startTime;\n logs.push(createLog('info', `Generation completed`, { durationMs }));\n\n return {\n orbital: generatedOrbital,\n fingerprint,\n usedTemplate,\n usage: result.usage ?? undefined,\n validation,\n logs,\n };\n}\n\n// ============================================================================\n// Parallel Orbital Generation\n// ============================================================================\n\n/**\n * Generate multiple orbitals in parallel with concurrency control.\n *\n * Uses provider-specific concurrency limits to avoid rate limiting.\n * All orbital units are independent, so parallel execution is safe.\n *\n * @example\n * ```typescript\n * // Generate all orbitals in parallel (max 3 concurrent for Anthropic)\n * const result = await generateFullOrbitalsParallel(client, orbitals, { validate: true });\n * console.log(`Generated ${result.summary.successful}/${result.summary.total} orbitals`);\n * ```\n */\nexport async function generateFullOrbitalsParallel(\n client: LLMClient,\n orbitals: OrbitalUnit[],\n options: ParallelGenerationOptions = {}\n): Promise<ParallelGenerationResult> {\n const provider = client.getProvider();\n const defaultConcurrency = PROVIDER_CONCURRENCY_LIMITS[provider] ?? 3;\n const concurrency = options.concurrency ?? defaultConcurrency;\n\n const aggregateLogs: GenerationLog[] = [];\n const startTime = Date.now();\n\n aggregateLogs.push(createLog('info', `Starting parallel generation`, {\n totalOrbitals: orbitals.length,\n concurrency,\n provider,\n }));\n\n console.log(`[OrbitalGenerator] Parallel generation: ${orbitals.length} orbitals, concurrency=${concurrency}`);\n\n // Simple concurrency limiter using a semaphore pattern\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n const acquire = (): Promise<void> => {\n return new Promise((resolve) => {\n if (activeCount < concurrency) {\n activeCount++;\n resolve();\n } else {\n queue.push(resolve);\n }\n });\n };\n\n const release = () => {\n activeCount--;\n const next = queue.shift();\n if (next) {\n activeCount++;\n next();\n }\n };\n\n // Generate all orbitals in parallel with concurrency control\n const results = await Promise.all(\n orbitals.map(async (orbital, index) => {\n await acquire();\n try {\n aggregateLogs.push(createLog('debug', `Starting orbital ${index + 1}/${orbitals.length}: ${orbital.name}`));\n const result = await generateFullOrbital(client, orbital, options);\n aggregateLogs.push(createLog('info', `Completed orbital ${index + 1}/${orbitals.length}: ${orbital.name}`, {\n valid: result.validation?.valid,\n tokens: result.usage?.totalTokens,\n }));\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n aggregateLogs.push(createLog('error', `Failed orbital ${index + 1}/${orbitals.length}: ${orbital.name}`, {\n error: errorMessage,\n }));\n // Return a failed result instead of throwing\n return {\n orbital: null as unknown as FullOrbitalUnit,\n fingerprint: '',\n usedTemplate: false,\n logs: [createLog('error', errorMessage)],\n validation: { valid: false, errorCount: 1, warningCount: 0 },\n } as OrbitalGenerationResult;\n } finally {\n release();\n }\n })\n );\n\n const totalDurationMs = Date.now() - startTime;\n const successful = results.filter(r => r.validation?.valid !== false && r.orbital !== null).length;\n const failed = results.length - successful;\n const totalTokens = results.reduce((sum, r) => sum + (r.usage?.totalTokens ?? 0), 0);\n\n aggregateLogs.push(createLog('info', `Parallel generation completed`, {\n totalDurationMs,\n successful,\n failed,\n totalTokens,\n }));\n\n console.log(`[OrbitalGenerator] Parallel generation complete: ${successful}/${results.length} successful in ${totalDurationMs}ms`);\n\n return {\n results,\n totalDurationMs,\n aggregateLogs,\n summary: {\n total: results.length,\n successful,\n failed,\n totalTokens,\n },\n };\n}\n\n// ============================================================================\n// Decomposition (For Main Agent Use)\n// ============================================================================\n\n/**\n * Options for decomposing requests into orbitals.\n */\nexport interface DecomposeOptions {\n /** Maximum tokens for generation */\n maxTokens?: number;\n /** Optional extracted requirements from analysis phase */\n requirements?: ExtractedRequirements;\n}\n\n/**\n * Decompose a user request into OrbitalUnits using LLM.\n *\n * This is typically called by the MAIN AGENT before delegating\n * to subagents for full orbital generation.\n *\n * @example\n * ```typescript\n * // Without requirements (existing behavior):\n * const orbitals = await decomposeToOrbitals(client, \"Build a task manager\");\n *\n * // With requirements (from analysis phase):\n * const orbitals = await decomposeToOrbitals(client, \"Build a task manager\", {\n * requirements: { entities: [\"Task\"], guards: [\"only admins can delete\"], ... }\n * });\n *\n * // Then generate all orbitals in parallel:\n * const result = await generateFullOrbitalsParallel(client, orbitals);\n * ```\n */\nexport async function decomposeToOrbitals(\n client: LLMClient,\n userRequest: string,\n options: DecomposeOptions = {}\n): Promise<OrbitalUnit[]> {\n const { maxTokens = 4096, requirements } = options;\n\n // Use requirements-aware prompt if requirements provided\n const systemPrompt = requirements\n ? getRequirementsAwareDecompositionPrompt(requirements)\n : getOrbitalDecompositionPrompt();\n\n const userPrompt = `Decompose this application request into Orbital Units:\n\n${userRequest}\n\nReturn a JSON array of OrbitalUnit objects.`;\n\n const result = await client.call({\n systemPrompt,\n userPrompt,\n maxTokens,\n skipSchemaValidation: true,\n });\n\n return result as OrbitalUnit[];\n}\n\n/**\n * Build a requirements-aware decomposition prompt.\n */\nfunction getRequirementsAwareDecompositionPrompt(requirements: ExtractedRequirements): string {\n const basePrompt = getOrbitalDecompositionPrompt();\n const requirementsGuidance = getRequirementsDecomposePrompt();\n\n const requirementsList = `\n## Extracted Requirements (Use These!)\n\n### Entities to Create\n${requirements.entities.length > 0 ? requirements.entities.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### States (Map to State Machines)\n${requirements.states.length > 0 ? requirements.states.map(s => `- ${s}`).join('\\n') : '- (none specified)'}\n\n### Events (Map to Transitions)\n${requirements.events.length > 0 ? requirements.events.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Guards (Map to Transition Guards)\n${requirements.guards.length > 0 ? requirements.guards.map(g => `- ${g}`).join('\\n') : '- (none specified)'}\n\n### Effects (Map to Transition Effects)\n${requirements.effects.length > 0 ? requirements.effects.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Pages (Map to Page Definitions)\n${requirements.pages.length > 0 ? requirements.pages.map(p => `- ${p}`).join('\\n') : '- (none specified)'}\n\nUse these requirements to:\n1. Create one OrbitalUnit per primary entity in the list\n2. Distribute guards to relevant orbitals\n3. Distribute effects to relevant orbitals\n4. Ensure state machines cover the required states\n`;\n\n return `${basePrompt}\n\n---\n\n${requirementsGuidance}\n\n---\n\n${requirementsList}`;\n}\n\n/**\n * Build a requirements-aware full orbital generation prompt.\n */\nfunction getRequirementsAwareFullOrbitalPrompt(requirements: Partial<ExtractedRequirements>): string {\n const basePrompt = getFullOrbitalPrompt();\n const requirementsGuidance = getRequirementsTraitPrompt();\n\n const sections: string[] = [];\n\n if (requirements.guards && requirements.guards.length > 0) {\n sections.push(`### Guards to Implement\n${requirements.guards.map(g => `- ${g}`).join('\\n')}\n\nConvert these to \\`guard\\` expressions on transitions with \\`guardError\\` messages.`);\n }\n\n if (requirements.effects && requirements.effects.length > 0) {\n sections.push(`### Effects to Implement\n${requirements.effects.map(e => `- ${e}`).join('\\n')}\n\nConvert these to \\`effects\\` arrays on transitions (emit_event or call_service).`);\n }\n\n if (requirements.states && requirements.states.length > 0) {\n sections.push(`### States to Include\n${requirements.states.map(s => `- ${s}`).join('\\n')}\n\nUse these exact states in the state machine. First is initial, identify final states.`);\n }\n\n if (requirements.events && requirements.events.length > 0) {\n sections.push(`### Events to Include\n${requirements.events.map(e => `- ${e}`).join('\\n')}\n\nUse these event names in transitions.`);\n }\n\n if (sections.length === 0) {\n return basePrompt;\n }\n\n return `${basePrompt}\n\n---\n\n${requirementsGuidance}\n\n---\n\n## Requirements for This Orbital\n\n${sections.join('\\n\\n')}\n`;\n}\n\n// ============================================================================\n// Cache Statistics\n// ============================================================================\n\n/**\n * Estimate cache savings for a set of orbitals.\n *\n * Use this to predict how much caching will help for a decomposition.\n */\nexport function estimateCacheSavings(orbitals: OrbitalUnit[]): {\n totalOrbitals: number;\n uniqueFingerprints: number;\n estimatedCacheHits: number;\n estimatedSavingsPercent: number;\n} {\n const { getCacheStats } = require('../cache/index.js');\n const stats = getCacheStats(orbitals);\n\n // Each call after the first with same fingerprint is a cache hit\n const cacheHits = stats.potentialCacheHits;\n const savingsPercent = orbitals.length > 0\n ? Math.round((cacheHits / orbitals.length) * 90) // 90% discount on cache hits\n : 0;\n\n return {\n totalOrbitals: stats.totalOrbitals,\n uniqueFingerprints: stats.uniqueFingerprints,\n estimatedCacheHits: cacheHits,\n estimatedSavingsPercent: savingsPercent,\n };\n}\n","/**\n * Orbital Subagent Tool\n *\n * Spawns nested DeepAgents for orbital generation and forwards\n * their events to the parent stream.\n * Uses @almadar/llm LLMClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isEntityReference } from '@almadar/core/types';\nimport { LLMClient } from '@almadar/llm';\nimport type { SSEEvent, SSEEventType } from '../api-types.js';\nimport { generateFullOrbital } from '../orbitals/generation/index.js';\n\n/**\n * Get entity name safely from EntityRef.\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n// Type alias for backward compatibility\ntype OrbitalUnit = OrbitalDefinition;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type SubagentEventCallback = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n },\n) => void;\n\nexport type OrbitalCompleteCallback = (\n orbital: unknown,\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n) => void | Promise<void>;\n\nexport interface OrbitalRequirements {\n entities?: string[];\n states?: string[];\n events?: string[];\n guards?: string[];\n pages?: string[];\n effects?: string[];\n rawRequirements?: string[];\n}\n\nexport interface OrbitalSubagentToolOptions {\n onSubagentEvent?: SubagentEventCallback;\n onOrbitalComplete?: OrbitalCompleteCallback;\n requirements?: OrbitalRequirements;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst OrbitalInputSchema = z.object({\n orbital: z\n .object({\n name: z.string(),\n entity: z.object({\n name: z.string(),\n persistence: z.enum(['persistent', 'runtime', 'singleton', 'instance']),\n fields: z.array(\n z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean().optional(),\n }),\n ),\n }),\n traits: z.array(z.string()),\n patterns: z.array(z.string()),\n pages: z.array(\n z.object({\n name: z.string(),\n path: z.string(),\n viewType: z.string(),\n }),\n ).optional(),\n domainContext: z.object({\n request: z.string(),\n requestFragment: z.string().optional(),\n category: z.enum(['game', 'business', 'dashboard', 'form', 'content', 'social']),\n vocabulary: z.record(z.string(), z.string()).optional(),\n }).optional(),\n design: z.object({\n style: z.enum(['minimal', 'modern', 'playful', 'data-driven', 'immersive']).optional(),\n uxHints: z.object({\n flowPattern: z.string().optional(),\n listPattern: z.string().optional(),\n formPattern: z.string().optional(),\n detailPattern: z.string().optional(),\n }).optional(),\n }).optional(),\n emits: z.array(z.string()).optional(),\n listens: z.array(\n z.object({\n event: z.string(),\n triggers: z.string(),\n }),\n ).optional(),\n relations: z.array(\n z.object({\n entity: z.string(),\n alias: z.string().optional(),\n cardinality: z.enum(['one', 'many']),\n }),\n ).optional(),\n })\n .describe('The OrbitalUnit to generate'),\n orbitalIndex: z.number().optional().describe('Index in the batch (0-based)'),\n totalOrbitals: z.number().optional().describe('Total orbitals in the batch'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for generating orbitals with subagent event streaming.\n * Uses @almadar/llm LLMClient directly.\n */\nexport function createOrbitalSubagentTool(\n options: OrbitalSubagentToolOptions = {},\n) {\n let eventCallback: SubagentEventCallback | undefined = options.onSubagentEvent;\n let completeCallback: OrbitalCompleteCallback | undefined = options.onOrbitalComplete;\n const requirements = options.requirements;\n\n const setEventCallback = (callback: SubagentEventCallback) => {\n eventCallback = callback;\n };\n\n const setOrbitalCompleteCallback = (callback: OrbitalCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>,\n ) => {\n if (eventCallback) {\n eventCallback(orbitalName, orbitalIndex, totalOrbitals, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const orbitalTool = tool(\n async ({ orbital, orbitalIndex = 0, totalOrbitals = 1 }) => {\n if (!orbital) {\n const errorMsg = 'Missing required parameter: orbital.';\n return JSON.stringify({ success: false, error: errorMsg, orbital: null });\n }\n\n const orbitalUnit = orbital as OrbitalUnit;\n\n if (!orbitalUnit.entity || !orbitalUnit.name) {\n const errorMsg = `Invalid orbital: missing required fields (name: ${orbitalUnit.name}, entity: ${orbitalUnit.entity}).`;\n return JSON.stringify({ success: false, error: errorMsg, orbital: orbitalUnit.name || 'unknown' });\n }\n\n try {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Starting generation for orbital: ${orbitalUnit.name}${requirements ? ' (with requirements from analysis)' : ''}`,\n role: 'assistant',\n isComplete: false,\n });\n\n if (requirements) {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: 'Using requirements from analysis phase',\n data: {\n guards: requirements.guards?.length ?? 0,\n effects: requirements.effects?.length ?? 0,\n states: requirements.states?.length ?? 0,\n },\n orbitalName: orbitalUnit.name,\n });\n }\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'in_progress' },\n { id: 'generate', task: 'Generate full schema', status: 'pending' },\n { id: 'validate', task: 'Validate output', status: 'pending' },\n ],\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Analyzing entity: ${getEntityName(orbitalUnit.entity)} with ${orbitalUnit.traits.length} traits`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'in_progress' },\n { id: 'validate', task: 'Validate output', status: 'pending' },\n ],\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_call', {\n tool: 'llm_generate',\n args: {\n orbital: orbitalUnit.name,\n entity: getEntityName(orbitalUnit.entity),\n traits: orbitalUnit.traits,\n },\n });\n\n const result = await generateFullOrbital(client, orbitalUnit, {\n validate: true,\n requirements,\n onLog: (log) => {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: log.level,\n message: log.message,\n data: log.data,\n orbitalName: orbitalUnit.name,\n });\n },\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'llm_generate',\n result: {\n fingerprint: result.fingerprint,\n usedTemplate: result.usedTemplate,\n usage: result.usage,\n },\n success: true,\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'completed' },\n { id: 'validate', task: 'Validate output', status: 'in_progress' },\n ],\n });\n\n const finalOrbital = result.orbital;\n const finalValidation = result.validation;\n\n if (finalValidation) {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'validate_orbital',\n result: finalValidation,\n success: finalValidation.valid,\n });\n }\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'completed' },\n { id: 'validate', task: 'Validate output', status: 'completed' },\n ],\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generated orbital: ${orbitalUnit.name} (${result.usage?.totalTokens ?? 0} tokens)`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback && finalOrbital) {\n try {\n await completeCallback(finalOrbital, orbitalUnit.name, orbitalIndex, totalOrbitals);\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Persisted orbital: ${orbitalUnit.name}`,\n orbitalName: orbitalUnit.name,\n });\n } catch (persistError) {\n console.error(`[OrbitalSubagent] Failed to persist ${orbitalUnit.name}:`, persistError);\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'warn',\n message: `Failed to persist orbital: ${orbitalUnit.name}`,\n data: { error: String(persistError) },\n orbitalName: orbitalUnit.name,\n });\n }\n }\n\n return JSON.stringify({\n success: true,\n orbital: finalOrbital,\n fingerprint: result.fingerprint,\n usage: result.usage,\n validation: result.validation,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'error', {\n error: errorMessage,\n code: 'ORBITAL_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbital: orbitalUnit.name,\n });\n }\n },\n {\n name: 'generate_orbital',\n description: `Generate a full orbital schema from an OrbitalUnit.\n\nSpawns a subagent to expand a lightweight OrbitalUnit into a complete\nFullOrbitalUnit with all sections, layouts, and configurations.\n\nUSAGE:\n1. Decompose user request into OrbitalUnits\n2. For each orbital, call generate_orbital with embedded context\n3. Collect results and merge into final schema`,\n schema: OrbitalInputSchema,\n },\n );\n\n return {\n tool: orbitalTool,\n setEventCallback,\n setOrbitalCompleteCallback,\n };\n}\n\n/**\n * Create a helper to wrap subagent events into SSE format.\n */\nexport function createSubagentEventWrapper(\n writeEvent: (event: SSEEvent) => void,\n): SubagentEventCallback {\n return (orbitalName, orbitalIndex, totalOrbitals, event) => {\n const sseEvent: SSEEvent = {\n type: 'subagent_event',\n timestamp: Date.now(),\n data: {\n orbitalName,\n orbitalIndex,\n totalOrbitals,\n event,\n },\n };\n writeEvent(sseEvent);\n };\n}\n","/**\n * Trait Subagent Tool\n *\n * Generates custom trait definitions for orbital schemas.\n * Uses @almadar/llm LLMClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { Trait } from '@almadar/core/types';\nimport { LLMClient } from '@almadar/llm';\nimport type { SSEEventType } from '../api-types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TraitEventCallback = (\n traitName: string,\n traitIndex: number,\n totalTraits: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n }\n) => void;\n\nexport type TraitCompleteCallback = (\n trait: Trait,\n traitName: string,\n traitIndex: number,\n totalTraits: number\n) => void | Promise<void>;\n\nexport interface TraitSubagentToolOptions {\n onTraitEvent?: TraitEventCallback;\n onTraitComplete?: TraitCompleteCallback;\n}\n\nexport interface TraitSpec {\n name: string;\n description: string;\n category?: string;\n states?: string[];\n events?: string[];\n requiredFields?: Array<{\n name: string;\n type: string;\n description?: string;\n }>;\n needsTicks?: boolean;\n needsEmit?: boolean;\n needsListens?: boolean;\n}\n\n// ============================================================================\n// Trait Generation Prompt\n// ============================================================================\n\nfunction getTraitGenerationPrompt(): string {\n return `You are a Trait Generator for KFlow orbital schemas.\n\n## Your Task\n\nGenerate a complete, valid Trait definition that implements the requested behavior.\n\n## Trait Structure\n\n\\`\\`\\`typescript\ninterface Trait {\n name: string;\n description?: string;\n category?: TraitCategory;\n requiredFields?: RequiredField[];\n dataEntities?: TraitDataEntity[];\n stateMachine?: StateMachine;\n initialEffects?: Effect[];\n ticks?: TraitTick[];\n listens?: TraitEventListener[];\n}\n\\`\\`\\`\n\n## State Machine Structure\n\n\\`\\`\\`typescript\ninterface StateMachine {\n states: State[];\n events: Event[];\n transitions: Transition[];\n guards?: Guard[];\n}\n\\`\\`\\`\n\n## Best Practices\n\n1. **State Names**: Use PascalCase (e.g., \"Idle\", \"Loading\", \"Playing\")\n2. **Event Keys**: Use UPPER_SNAKE_CASE (e.g., \"START_GAME\", \"PLAYER_HIT\")\n3. **Initial State**: Always mark exactly one state as \\`isInitial: true\\`\n4. **Terminal States**: Mark end states as \\`isFinal: true\\`\n\n## Output Format\n\nReturn ONLY valid JSON matching the Trait interface. No markdown, no explanation.`;\n}\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\nconst TraitSpecSchema = z.object({\n name: z.string().describe('Name of the trait'),\n description: z.string().describe('Description of what this trait does'),\n category: z.string().optional().describe('Category'),\n states: z.array(z.string()).optional().describe('States the trait should have'),\n events: z.array(z.string()).optional().describe('Events the trait should handle'),\n requiredFields: z.array(z.object({\n name: z.string(),\n type: z.string(),\n description: z.string().optional(),\n })).optional().describe('Fields required from the linked entity'),\n needsTicks: z.boolean().optional().describe('Whether this trait needs temporal behavior'),\n needsEmit: z.boolean().optional().describe('Whether this trait emits events'),\n needsListens: z.boolean().optional().describe('Whether this trait listens for events'),\n});\n\nconst TraitInputSchema = z.object({\n traitSpec: TraitSpecSchema.describe('Specification for the trait to generate'),\n traitIndex: z.number().optional().describe('Index in the batch (0-based)'),\n totalTraits: z.number().optional().describe('Total traits in the batch'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for generating custom traits.\n * Uses @almadar/llm LLMClient directly.\n */\nexport function createTraitSubagentTool(\n options: TraitSubagentToolOptions = {},\n) {\n let eventCallback: TraitEventCallback | undefined = options.onTraitEvent;\n let completeCallback: TraitCompleteCallback | undefined = options.onTraitComplete;\n\n const setEventCallback = (callback: TraitEventCallback) => {\n eventCallback = callback;\n };\n\n const setTraitCompleteCallback = (callback: TraitCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n traitName: string,\n traitIndex: number,\n totalTraits: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback(traitName, traitIndex, totalTraits, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const traitTool = tool(\n async ({ traitSpec, traitIndex = 0, totalTraits = 1 }) => {\n const spec = traitSpec as TraitSpec;\n\n try {\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Starting generation for custom trait: ${spec.name}`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'in_progress' },\n { id: 'generate', task: 'Generate state machine', status: 'pending' },\n { id: 'validate', task: 'Validate trait', status: 'pending' },\n ],\n });\n\n const userPrompt = buildTraitUserPrompt(spec);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Analyzing: ${spec.description}`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'in_progress' },\n { id: 'validate', task: 'Validate trait', status: 'pending' },\n ],\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_call', {\n tool: 'llm_generate_trait',\n args: {\n traitName: spec.name,\n states: spec.states,\n events: spec.events,\n },\n });\n\n const result = await client.call({\n systemPrompt: getTraitGenerationPrompt(),\n userPrompt,\n maxTokens: 4096,\n skipSchemaValidation: true,\n });\n\n const generatedTrait = result as Trait;\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_result', {\n tool: 'llm_generate_trait',\n result: {\n traitName: generatedTrait.name,\n stateCount: generatedTrait.stateMachine?.states?.length ?? 0,\n transitionCount: generatedTrait.stateMachine?.transitions?.length ?? 0,\n },\n success: true,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'completed' },\n { id: 'validate', task: 'Validate trait', status: 'in_progress' },\n ],\n });\n\n const validation = validateGeneratedTrait(generatedTrait, spec);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_result', {\n tool: 'validate_trait',\n result: validation,\n success: validation.valid,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'completed' },\n { id: 'validate', task: 'Validate trait', status: 'completed' },\n ],\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Generated trait: ${generatedTrait.name} with ${generatedTrait.stateMachine?.states?.length ?? 0} states`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback) {\n try {\n await completeCallback(generatedTrait, spec.name, traitIndex, totalTraits);\n } catch (persistError) {\n console.error(`[TraitSubagent] Failed to persist ${spec.name}:`, persistError);\n }\n }\n\n return JSON.stringify({\n success: true,\n trait: generatedTrait,\n validation,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'error', {\n error: errorMessage,\n code: 'TRAIT_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n traitName: spec.name,\n });\n }\n },\n {\n name: 'generate_custom_trait',\n description: `Generate a custom trait definition for the orbital schema.\n\nUse this when the decomposition identifies custom traits that don't exist in the\ntrait library.`,\n schema: TraitInputSchema,\n }\n );\n\n return {\n tool: traitTool,\n setEventCallback,\n setTraitCompleteCallback,\n };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction buildTraitUserPrompt(spec: TraitSpec): string {\n const parts: string[] = [\n `Generate a Trait definition for: **${spec.name}**`,\n '',\n `## Description`,\n spec.description,\n ];\n\n if (spec.category) {\n parts.push('', `## Category`, spec.category);\n }\n if (spec.states && spec.states.length > 0) {\n parts.push('', `## Required States`, spec.states.map(s => `- ${s}`).join('\\n'));\n }\n if (spec.events && spec.events.length > 0) {\n parts.push('', `## Events to Handle`, spec.events.map(e => `- ${e}`).join('\\n'));\n }\n if (spec.requiredFields && spec.requiredFields.length > 0) {\n parts.push(\n '', `## Required Fields from Linked Entity`,\n spec.requiredFields.map(f => `- ${f.name}: ${f.type}${f.description ? ` (${f.description})` : ''}`).join('\\n')\n );\n }\n if (spec.needsTicks) {\n parts.push('', '## Temporal Behavior', 'This trait needs tick-based updates.');\n }\n if (spec.needsEmit) {\n parts.push('', '## Event Emission', 'This trait should emit events for other traits.');\n }\n if (spec.needsListens) {\n parts.push('', '## Event Listening', 'This trait should listen for events from other traits.');\n }\n\n parts.push('', '## Output', 'Return the complete Trait definition as valid JSON.');\n\n return parts.join('\\n');\n}\n\nfunction validateGeneratedTrait(trait: Trait, spec: TraitSpec): {\n valid: boolean;\n errors: string[];\n warnings: string[];\n} {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (trait.name !== spec.name) {\n errors.push(`Trait name mismatch: expected \"${spec.name}\", got \"${trait.name}\"`);\n }\n\n if (spec.states && spec.states.length > 0) {\n if (!trait.stateMachine) {\n errors.push('State machine is required but not generated');\n } else {\n const hasInitial = trait.stateMachine.states?.some(s => s.isInitial);\n if (!hasInitial) {\n warnings.push('No initial state marked');\n }\n const stateNames = new Set(trait.stateMachine.states?.map(s => s.name) ?? []);\n for (const requiredState of spec.states) {\n if (!stateNames.has(requiredState)) {\n warnings.push(`Specified state \"${requiredState}\" not found in generated trait`);\n }\n }\n }\n }\n\n if (spec.needsTicks && (!trait.ticks || trait.ticks.length === 0)) {\n warnings.push('Temporal behavior requested but no ticks defined');\n }\n if (spec.needsListens && (!trait.listens || trait.listens.length === 0)) {\n warnings.push('Event listening requested but no listeners defined');\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\n/**\n * Create a helper to wrap trait events into SSE format.\n */\nexport function createTraitEventWrapper(\n writeEvent: (event: { type: string; timestamp: number; data: unknown }) => void\n): TraitEventCallback {\n return (traitName, traitIndex, totalTraits, event) => {\n writeEvent({\n type: 'subagent_event',\n timestamp: Date.now(),\n data: { traitName, traitIndex, totalTraits, event },\n });\n };\n}\n","/**\n * Construct Combined Schema Tool\n *\n * Deterministically combines generated orbitals into a single OrbitalSchema\n * without LLM involvement.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { FullOrbitalUnit } from '@almadar/core/types';\nimport { combineOrbitals } from '../orbitals/combiner/index.js';\n\n// ============================================================================\n// Tool Schema\n// ============================================================================\n\nconst FullOrbitalUnitInputSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n entity: z.object({\n name: z.string(),\n collection: z.string().optional(),\n fields: z.array(z.any()),\n timestamps: z.boolean().optional(),\n }),\n traits: z.array(z.any()),\n pages: z.array(z.any()),\n emits: z.array(z.string()).optional(),\n listens: z.array(z.any()).optional(),\n});\n\nconst CombineSchemaInputSchema = z.object({\n orbitals: z.array(FullOrbitalUnitInputSchema).optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n version: z.string().optional(),\n theme: z.string().optional(),\n defaultRoute: z.string().optional(),\n validate: z.boolean().optional().default(true),\n});\n\n// ============================================================================\n// Auto-Collection Helper\n// ============================================================================\n\nasync function autoCollectOrbitals(workDir: string): Promise<FullOrbitalUnit[]> {\n const fs = await import('fs');\n const path = await import('path');\n\n const orbitalsDir = path.join(workDir, '.orbitals');\n\n if (!fs.existsSync(orbitalsDir)) {\n const files = fs.readdirSync(workDir).filter((f: string) =>\n f.endsWith('.json') && (f.startsWith('orbital-') || f.includes('orbital'))\n );\n\n if (files.length === 0) {\n throw new Error('No orbitals found. Generate orbitals first using generate_orbital, or provide them directly.');\n }\n\n return files.map((f: string) => {\n const content = fs.readFileSync(path.join(workDir, f), 'utf-8');\n return JSON.parse(content);\n });\n }\n\n const files = fs.readdirSync(orbitalsDir).filter((f: string) => f.endsWith('.json'));\n\n if (files.length === 0) {\n throw new Error('No orbitals found in .orbitals/ directory.');\n }\n\n return files.map((f: string) => {\n const content = fs.readFileSync(path.join(orbitalsDir, f), 'utf-8');\n return JSON.parse(content);\n });\n}\n\n// ============================================================================\n// Validation Cap\n// ============================================================================\n\nconst MAX_COMBINE_VALIDATION_ATTEMPTS = 3;\nlet combineValidationAttempts = 0;\n\n// ============================================================================\n// Tool Implementation\n// ============================================================================\n\n/**\n * Create the construct_combined_schema tool.\n */\nexport function createCombineSchemasTool(workDir?: string) {\n combineValidationAttempts = 0;\n\n return tool(\n async (input) => {\n let orbitals: FullOrbitalUnit[];\n\n if (input.orbitals && input.orbitals.length > 0) {\n orbitals = input.orbitals as FullOrbitalUnit[];\n } else if (workDir) {\n orbitals = await autoCollectOrbitals(workDir);\n } else {\n orbitals = await autoCollectOrbitals(process.cwd());\n }\n\n const appName = input.name ||\n (orbitals.length > 0 ? `${orbitals[0].name} Application` : 'Application');\n\n const result = combineOrbitals(orbitals, {\n name: appName,\n description: input.description,\n version: input.version,\n theme: input.theme,\n defaultRoute: input.defaultRoute,\n validate: input.validate ?? true,\n });\n\n if (result.success) {\n combineValidationAttempts = 0;\n\n return JSON.stringify({\n success: true,\n schema: result.schema,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errorCount: result.validation.errors.length,\n warningCount: result.validation.warnings.length,\n } : undefined,\n __TASK_COMPLETE__: true,\n __STOP_SIGNAL__: 'WORKFLOW_FINISHED',\n message: `✅ SCHEMA GENERATION COMPLETE. Generated ${result.stats?.totalOrbitals || orbitals.length} orbitals. ` +\n `DO NOT call any more tools.`,\n }, null, 2);\n } else {\n combineValidationAttempts++;\n\n if (combineValidationAttempts >= MAX_COMBINE_VALIDATION_ATTEMPTS) {\n return JSON.stringify({\n success: false,\n cappedValidation: true,\n validationAttempt: combineValidationAttempts,\n error: result.error,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errors: result.validation.errors.slice(0, 3),\n errorCount: result.validation.errors.length,\n } : undefined,\n __STOP_FIXING__: true,\n message: `⚠️ VALIDATION CAP REACHED (${MAX_COMBINE_VALIDATION_ATTEMPTS} attempts). STOP editing orbitals.`,\n recommendation: 'STOP_FIXING',\n }, null, 2);\n }\n\n return JSON.stringify({\n success: false,\n validationAttempt: combineValidationAttempts,\n remainingAttempts: MAX_COMBINE_VALIDATION_ATTEMPTS - combineValidationAttempts,\n error: result.error,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errors: result.validation.errors.slice(0, 5),\n errorCount: result.validation.errors.length,\n } : undefined,\n partialSchema: result.schema,\n }, null, 2);\n }\n },\n {\n name: 'construct_combined_schema',\n description: `Deterministically combine generated orbitals into a single OrbitalSchema.\n\n⚠️ IMPORTANT: This is the FINAL STEP. When this tool returns success,\nyour task is COMPLETE. Do NOT call any other tools after this succeeds.\n\nSIMPLE USAGE (RECOMMENDED):\n construct_combined_schema({})\n\nOrbitals are auto-collected from .orbitals/ directory.`,\n schema: CombineSchemaInputSchema,\n }\n );\n}\n","/**\n * Schema Chunking Tools\n *\n * Tools for extracting and merging chunks of large orbital schemas.\n * Enables LLM-driven schema updates without hitting token limits.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { randomUUID } from 'crypto';\nimport * as fs from 'fs/promises';\nimport * as fss from 'fs';\nimport * as path from 'path';\nimport type { OrbitalSchema, Trait, TraitRef, Orbital, OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isOrbitalDefinition, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity name safely from EntityRef.\n */\nfunction getEntityName(entity: EntityRef | undefined): string {\n if (!entity) return 'Unknown';\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\nconst CHUNKS_DIR = '.chunks';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface OrbitalSummary {\n name: string;\n entity: string;\n traits: string[];\n inlineTraits: string[];\n}\n\ninterface SchemaStructure {\n name: string;\n orbitals: OrbitalSummary[];\n traits: string[];\n totalSize: string;\n}\n\ninterface ChunkMeta {\n sourceFile: string;\n type: 'orbital' | 'trait' | 'inline-trait';\n orbitalIndex?: number;\n traitIndex?: number;\n inlineTraitIndex?: number;\n parentOrbitalName?: string;\n extractedAt: string;\n}\n\ninterface ChunkFile {\n meta: ChunkMeta;\n orbital?: unknown;\n referencedTraits?: unknown[];\n trait?: unknown;\n inlineTrait?: unknown;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nasync function ensureChunksDir(workspaceDir: string): Promise<string> {\n const chunksPath = path.join(workspaceDir, CHUNKS_DIR);\n try {\n await fs.mkdir(chunksPath, { recursive: true });\n } catch {\n // Directory may already exist\n }\n return chunksPath;\n}\n\nfunction getTraitInfo(traits: unknown[]): { refs: string[]; inlines: string[] } {\n const refs: string[] = [];\n const inlines: string[] = [];\n\n for (const t of traits || []) {\n if (typeof t === 'object' && t !== null) {\n if ('ref' in t && typeof (t as { ref: unknown }).ref === 'string') {\n refs.push((t as { ref: string }).ref);\n } else if ('name' in t && typeof (t as { name: unknown }).name === 'string') {\n inlines.push((t as { name: string }).name);\n }\n }\n }\n\n return { refs, inlines };\n}\n\n// ============================================================================\n// Tool: query_schema_structure\n// ============================================================================\n\nexport function createQuerySchemaStructureTool(workDir: string) {\n return tool(\n async ({ file }) => {\n const filePath = path.isAbsolute(file) ? file : path.join(workDir, file);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const stats = fss.statSync(filePath);\n\n const structure: SchemaStructure = {\n name: schema.name,\n orbitals: (schema.orbitals || [])\n .filter((o): o is OrbitalDefinition => isOrbitalDefinition(o))\n .map(o => {\n const { refs, inlines } = getTraitInfo(o.traits || []);\n return {\n name: o.name,\n entity: getEntityName(o.entity),\n traits: refs,\n inlineTraits: inlines,\n };\n }),\n traits: [],\n totalSize: `${Math.round(stats.size / 1024)}KB`,\n };\n\n return JSON.stringify(structure, null, 2);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to query schema structure: ${msg}` });\n }\n },\n {\n name: 'query_schema_structure',\n description: `Get a lightweight map of schema structure (names only, not content).\n\nUSE THIS FIRST before extracting chunks to understand what orbitals and traits exist.`,\n schema: z.object({\n file: z.string().describe('Path to schema file (e.g., \"schema.json\")'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Tool: extract_chunk\n// ============================================================================\n\nexport function createExtractChunkTool(workDir: string) {\n return tool(\n async ({ file, type, name, parentOrbital, includeTraits = true }) => {\n const filePath = path.isAbsolute(file) ? file : path.join(workDir, file);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const chunkId = randomUUID().slice(0, 8);\n const chunksDir = await ensureChunksDir(workDir);\n const chunkFile = path.join(chunksDir, `chunk-${chunkId}.json`);\n\n const chunkData: ChunkFile = {\n meta: {\n sourceFile: filePath,\n type,\n extractedAt: new Date().toISOString(),\n },\n };\n\n if (type === 'orbital') {\n const orbitalIndex = schema.orbitals.findIndex(o => o.name === name);\n if (orbitalIndex === -1) {\n return JSON.stringify({ error: `Orbital \"${name}\" not found in schema` });\n }\n\n const orbital = schema.orbitals[orbitalIndex];\n chunkData.meta.orbitalIndex = orbitalIndex;\n chunkData.orbital = orbital;\n\n if (includeTraits) {\n const { refs } = getTraitInfo(orbital.traits || []);\n chunkData.referencedTraits = (orbital.traits || []).filter(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n refs.includes((t as { name: string }).name)\n );\n }\n } else if (type === 'trait') {\n return JSON.stringify({\n error: `Schema-level traits no longer exist. Use type \"inline-trait\" with parentOrbital.`,\n });\n } else if (type === 'inline-trait') {\n if (!parentOrbital) {\n return JSON.stringify({ error: 'parentOrbital is required for inline-trait extraction' });\n }\n\n const orbitalIndex = schema.orbitals.findIndex(o => o.name === parentOrbital);\n if (orbitalIndex === -1) {\n return JSON.stringify({ error: `Parent orbital \"${parentOrbital}\" not found` });\n }\n\n const orbital = schema.orbitals[orbitalIndex];\n const inlineTraitIndex = (orbital.traits || []).findIndex(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n (t as { name: string }).name === name\n );\n\n if (inlineTraitIndex === -1) {\n return JSON.stringify({ error: `Inline trait \"${name}\" not found in orbital \"${parentOrbital}\"` });\n }\n\n chunkData.meta.parentOrbitalName = parentOrbital;\n chunkData.meta.orbitalIndex = orbitalIndex;\n chunkData.meta.inlineTraitIndex = inlineTraitIndex;\n chunkData.inlineTrait = orbital.traits![inlineTraitIndex];\n }\n\n const chunkContent = JSON.stringify(chunkData, null, 2);\n await fs.writeFile(chunkFile, chunkContent);\n\n const relativeChunkFile = path.relative(workDir, chunkFile);\n\n return JSON.stringify({\n success: true,\n chunkId,\n chunkFile: relativeChunkFile,\n size: `${Math.round(chunkContent.length / 1024)}KB`,\n message: `Chunk extracted to ${relativeChunkFile}. Use edit_file then apply_chunk with chunkId \"${chunkId}\".`,\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to extract chunk: ${msg}` });\n }\n },\n {\n name: 'extract_chunk',\n description: `Extract a specific orbital or trait to a chunk file for editing.\n\nAfter extracting, use edit_file on the returned chunkFile path, then call apply_chunk.\n\nTypes: \"orbital\", \"inline-trait\" (requires parentOrbital).`,\n schema: z.object({\n file: z.string().describe('Path to schema file'),\n type: z.enum(['orbital', 'trait', 'inline-trait']).describe('Type of chunk to extract'),\n name: z.string().describe('Name of orbital or trait to extract'),\n parentOrbital: z.string().optional().describe('Required for inline-trait'),\n includeTraits: z.boolean().default(true).describe('For orbital: also extract referenced traits'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Tool: apply_chunk\n// ============================================================================\n\nexport function createApplyChunkTool(workDir: string) {\n return tool(\n async ({ chunkId }) => {\n const chunkFileName = `chunk-${chunkId}.json`;\n const chunkFilePath = path.join(workDir, CHUNKS_DIR, chunkFileName);\n\n try {\n try {\n await fs.access(chunkFilePath);\n } catch {\n return JSON.stringify({ error: `Chunk file not found: ${chunkFileName}.` });\n }\n\n const chunkContent = await fs.readFile(chunkFilePath, 'utf-8');\n const chunkData = JSON.parse(chunkContent) as ChunkFile;\n const { meta } = chunkData;\n\n const schemaContent = await fs.readFile(meta.sourceFile, 'utf-8');\n const schema = JSON.parse(schemaContent) as OrbitalSchema;\n\n if (meta.type === 'orbital' && chunkData.orbital) {\n schema.orbitals[meta.orbitalIndex!] = chunkData.orbital as Orbital;\n\n if (chunkData.referencedTraits && Array.isArray(chunkData.referencedTraits)) {\n const orbital = schema.orbitals[meta.orbitalIndex!];\n if (orbital && isOrbitalDefinition(orbital) && orbital.traits) {\n for (const editedTrait of chunkData.referencedTraits) {\n if (typeof editedTrait === 'object' && editedTrait !== null && 'name' in editedTrait) {\n const traitName = (editedTrait as { name: string }).name;\n const idx = orbital.traits.findIndex(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n (t as { name: string }).name === traitName\n );\n if (idx !== -1) {\n orbital.traits[idx] = editedTrait as TraitRef;\n }\n }\n }\n }\n }\n }\n\n if (meta.type === 'trait' && chunkData.trait) {\n console.warn('Schema-level traits are deprecated. Trait was not applied.');\n }\n\n if (meta.type === 'inline-trait' && chunkData.inlineTrait) {\n const orbital = schema.orbitals[meta.orbitalIndex!];\n if (orbital && isOrbitalDefinition(orbital) && orbital.traits && meta.inlineTraitIndex !== undefined) {\n orbital.traits[meta.inlineTraitIndex] = chunkData.inlineTrait as TraitRef;\n }\n }\n\n const output = JSON.stringify(schema, null, 2);\n await fs.writeFile(meta.sourceFile, output);\n await fs.unlink(chunkFilePath);\n\n return JSON.stringify({\n success: true,\n message: `Changes merged into ${path.basename(meta.sourceFile)}`,\n updatedSize: `${Math.round(output.length / 1024)}KB`,\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to apply chunk: ${msg}` });\n }\n },\n {\n name: 'apply_chunk',\n description: `Merge an edited chunk file back into the schema.\n\nCall this AFTER editing the chunk file with edit_file.`,\n schema: z.object({\n chunkId: z.string().describe('Chunk ID from extract_chunk'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Factory function\n// ============================================================================\n\nexport function createSchemaChunkingTools(workDir: string) {\n return {\n querySchemaStructure: createQuerySchemaStructureTool(workDir),\n extractChunk: createExtractChunkTool(workDir),\n applyChunk: createApplyChunkTool(workDir),\n };\n}\n","/**\n * GitHub Tools for DeepAgent\n *\n * LangChain tools that wrap GitHubIntegration operations.\n * These tools enable the agent to clone repos, create branches, commit, push, and create PRs.\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { GitHubIntegration } from '@almadar/integrations';\nimport type { IntegrationConfig } from '@almadar/integrations';\n\n/**\n * GitHub tools configuration\n */\nexport interface GitHubToolsConfig {\n /** GitHub personal access token */\n token: string;\n /** Repository owner (e.g., 'octocat') */\n owner?: string;\n /** Repository name (e.g., 'hello-world') */\n repo?: string;\n /** Working directory for git operations */\n workDir: string;\n}\n\n/**\n * Create GitHub tools for the agent\n */\nexport function createGitHubTools(config: GitHubToolsConfig) {\n const { token, owner = '', repo = '', workDir } = config;\n\n // Create GitHub integration instance\n const integrationConfig: IntegrationConfig = {\n name: 'github',\n env: {\n GITHUB_TOKEN: token,\n GITHUB_OWNER: owner,\n GITHUB_REPO: repo,\n GITHUB_WORK_DIR: workDir,\n },\n };\n\n const github = new GitHubIntegration(integrationConfig);\n\n // =========================================================================\n // Git Operations\n // =========================================================================\n\n /**\n * Clone a GitHub repository\n */\n const github_clone = tool(\n async ({ repoUrl, branch, depth }) => {\n try {\n const result = await github.execute('cloneRepo', {\n repoUrl,\n targetDir: workDir,\n branch,\n depth: depth || 1,\n });\n\n if (!result.success) {\n return `Failed to clone repository: ${result.error?.message}`;\n }\n\n return `Successfully cloned ${repoUrl} to ${workDir}${branch ? ` (branch: ${branch})` : ''}`;\n } catch (error) {\n return `Error cloning repository: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_clone',\n description: `Clone a GitHub repository into the workspace.\n\nUsage:\n- Clones the repository into the current workspace directory\n- Defaults to shallow clone (depth: 1) for faster cloning\n- Can optionally specify a branch to checkout\n\nExample:\ngithub_clone({ repoUrl: \"https://github.com/owner/repo\", branch: \"main\" })`,\n schema: z.object({\n repoUrl: z.string().describe('GitHub repository URL (e.g., https://github.com/owner/repo)'),\n branch: z.string().optional().describe('Branch to checkout (defaults to repo default branch)'),\n depth: z.number().optional().describe('Clone depth (default: 1 for shallow clone)'),\n }),\n }\n );\n\n /**\n * Create a new git branch\n */\n const github_create_branch = tool(\n async ({ branchName, baseBranch }) => {\n try {\n const result = await github.execute('createBranch', {\n branchName,\n baseBranch,\n workDir,\n });\n\n if (!result.success) {\n return `Failed to create branch: ${result.error?.message}`;\n }\n\n return `Successfully created and checked out branch: ${branchName}`;\n } catch (error) {\n return `Error creating branch: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_create_branch',\n description: `Create and checkout a new git branch.\n\nUsage:\n- Creates a new branch from the current branch or specified base branch\n- Automatically checks out the new branch\n- Branch name should follow format: feature/name, fix/name, etc.\n\nExample:\ngithub_create_branch({ branchName: \"fix/issue-42-null-pointer\" })`,\n schema: z.object({\n branchName: z.string().describe('Name of the branch to create (e.g., fix/issue-42)'),\n baseBranch: z.string().optional().describe('Base branch to create from (defaults to current branch)'),\n }),\n }\n );\n\n /**\n * Commit changes\n */\n const github_commit = tool(\n async ({ message, files }) => {\n try {\n const result = await github.execute('commit', {\n message,\n files,\n workDir,\n });\n\n if (!result.success) {\n return `Failed to commit: ${result.error?.message}`;\n }\n\n return `Successfully committed: ${message}`;\n } catch (error) {\n return `Error committing changes: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_commit',\n description: `Stage and commit changes to git.\n\nUsage:\n- Stages files (or all changes if files not specified)\n- Creates a commit with the provided message\n- Commit message should be clear and descriptive\n\nExample:\ngithub_commit({ message: \"Fix null pointer in UserService\\\\n\\\\nCloses #42\" })`,\n schema: z.object({\n message: z.string().describe('Commit message (can include multiple lines)'),\n files: z.array(z.string()).optional().describe('Specific files to commit (defaults to all changes)'),\n }),\n }\n );\n\n /**\n * Push branch to remote\n */\n const github_push = tool(\n async ({ branchName }) => {\n try {\n const result = await github.execute('push', {\n branchName,\n force: false, // Never allow force push\n workDir,\n });\n\n if (!result.success) {\n return `Failed to push: ${result.error?.message}`;\n }\n\n return `Successfully pushed branch: ${branchName}`;\n } catch (error) {\n return `Error pushing branch: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_push',\n description: `Push a branch to GitHub.\n\nUsage:\n- Pushes the specified branch to origin\n- Sets upstream tracking (-u flag)\n- Force push is NEVER allowed for safety\n\nExample:\ngithub_push({ branchName: \"fix/issue-42\" })`,\n schema: z.object({\n branchName: z.string().describe('Name of the branch to push'),\n }),\n }\n );\n\n // =========================================================================\n // GitHub API Operations\n // =========================================================================\n\n /**\n * Create a pull request\n */\n const github_create_pr = tool(\n async ({ title, body, baseBranch, headBranch, draft }) => {\n try {\n const result = await github.execute('createPR', {\n title,\n body,\n baseBranch,\n headBranch,\n draft: draft || false,\n });\n\n if (!result.success) {\n return `Failed to create pull request: ${result.error?.message}`;\n }\n\n const pr = result.data as { number: number; url: string };\n return `Successfully created PR #${pr.number}: ${pr.url}`;\n } catch (error) {\n return `Error creating pull request: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_create_pr',\n description: `Create a pull request on GitHub.\n\nUsage:\n- Creates a PR from headBranch to baseBranch\n- Title should be concise (under 70 chars)\n- Body should include:\n - Summary of changes\n - Test plan or verification steps\n - References to issues (e.g., \"Closes #42\")\n\nExample:\ngithub_create_pr({\n title: \"Fix null pointer in UserService\",\n body: \"## Summary\\\\n- Fixed null check...\\\\n\\\\nCloses #42\",\n baseBranch: \"main\",\n headBranch: \"fix/issue-42\"\n})`,\n schema: z.object({\n title: z.string().describe('PR title (concise, under 70 chars)'),\n body: z.string().describe('PR description/body (markdown supported)'),\n baseBranch: z.string().describe('Base branch (usually \"main\" or \"master\")'),\n headBranch: z.string().describe('Head branch (your feature/fix branch)'),\n draft: z.boolean().optional().describe('Create as draft PR (default: false)'),\n }),\n }\n );\n\n /**\n * List repository issues\n */\n const github_list_issues = tool(\n async ({ state, labels, limit }) => {\n try {\n const result = await github.execute('listIssues', {\n state: state || 'open',\n labels: labels || [],\n limit: limit || 30,\n });\n\n if (!result.success) {\n return `Failed to list issues: ${result.error?.message}`;\n }\n\n const data = result.data as { issues: Array<{ number: number; title: string; state: string; labels: Array<{ name: string }> }> };\n const issues = data.issues;\n\n if (issues.length === 0) {\n return 'No issues found matching the criteria.';\n }\n\n const issueList = issues\n .map((issue) => {\n const labelsStr = issue.labels.map((l) => l.name).join(', ');\n return `#${issue.number}: ${issue.title} [${issue.state}]${labelsStr ? ` (${labelsStr})` : ''}`;\n })\n .join('\\n');\n\n return `Found ${issues.length} issue(s):\\n${issueList}`;\n } catch (error) {\n return `Error listing issues: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_list_issues',\n description: `List repository issues from GitHub.\n\nUsage:\n- Lists issues with optional filters\n- Returns issue number, title, state, and labels\n- Useful for finding issues to work on\n\nExample:\ngithub_list_issues({ state: \"open\", labels: [\"bug\"], limit: 10 })`,\n schema: z.object({\n state: z.enum(['open', 'closed', 'all']).optional().describe('Issue state filter (default: \"open\")'),\n labels: z.array(z.string()).optional().describe('Filter by labels'),\n limit: z.number().optional().describe('Maximum number of issues to return (default: 30)'),\n }),\n }\n );\n\n /**\n * Get issue details\n */\n const github_get_issue = tool(\n async ({ issueNumber }) => {\n try {\n const result = await github.execute('getIssue', {\n issueNumber,\n });\n\n if (!result.success) {\n return `Failed to get issue: ${result.error?.message}`;\n }\n\n const data = result.data as {\n issue: {\n number: number;\n title: string;\n body: string | null;\n state: string;\n labels: Array<{ name: string }>;\n };\n comments: Array<{\n body: string;\n user: { login: string };\n created_at: string;\n }>;\n };\n\n const { issue, comments } = data;\n const labelsStr = issue.labels.map((l) => l.name).join(', ');\n\n let output = `Issue #${issue.number}: ${issue.title}\\n`;\n output += `State: ${issue.state}\\n`;\n if (labelsStr) {\n output += `Labels: ${labelsStr}\\n`;\n }\n output += `\\nDescription:\\n${issue.body || '(No description)'}\\n`;\n\n if (comments.length > 0) {\n output += `\\n${comments.length} Comment(s):\\n`;\n comments.forEach((comment) => {\n output += `\\n@${comment.user.login} (${comment.created_at}):\\n${comment.body}\\n`;\n });\n }\n\n return output;\n } catch (error) {\n return `Error getting issue: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_get_issue',\n description: `Get detailed information about a specific issue.\n\nUsage:\n- Retrieves issue details including description and comments\n- Useful for understanding what needs to be fixed\n- Use this before working on an issue\n\nExample:\ngithub_get_issue({ issueNumber: 42 })`,\n schema: z.object({\n issueNumber: z.number().describe('Issue number to retrieve'),\n }),\n }\n );\n\n /**\n * Get PR review comments\n */\n const github_get_pr_comments = tool(\n async ({ prNumber }) => {\n try {\n const result = await github.execute('getPRComments', {\n prNumber,\n });\n\n if (!result.success) {\n return `Failed to get PR comments: ${result.error?.message}`;\n }\n\n const data = result.data as {\n comments: Array<{\n body: string;\n user: { login: string };\n created_at: string;\n }>;\n };\n\n const comments = data.comments;\n\n if (comments.length === 0) {\n return `No comments on PR #${prNumber}`;\n }\n\n let output = `${comments.length} Comment(s) on PR #${prNumber}:\\n`;\n comments.forEach((comment) => {\n output += `\\n@${comment.user.login} (${comment.created_at}):\\n${comment.body}\\n`;\n });\n\n return output;\n } catch (error) {\n return `Error getting PR comments: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_get_pr_comments',\n description: `Get review comments on a pull request.\n\nUsage:\n- Retrieves all comments on a PR\n- Useful for addressing review feedback\n- Shows commenter and timestamp\n\nExample:\ngithub_get_pr_comments({ prNumber: 87 })`,\n schema: z.object({\n prNumber: z.number().describe('Pull request number'),\n }),\n }\n );\n\n return {\n github_clone,\n github_create_branch,\n github_commit,\n github_push,\n github_create_pr,\n github_list_issues,\n github_get_issue,\n github_get_pr_comments,\n };\n}\n\n/**\n * Create GitHub tools as array (for easy spreading into agent tools)\n */\nexport function createGitHubToolsArray(config: GitHubToolsConfig) {\n const tools = createGitHubTools(config);\n return Object.values(tools);\n}\n","/**\n * In-Memory Persistence Backend\n *\n * Provides in-memory session metadata storage for development.\n * Data is lost on process restart.\n */\n\nimport type { SessionMetadata, SessionRecord } from './types.js';\n\n// ============================================================================\n// MemorySessionBackend\n// ============================================================================\n\n/**\n * In-memory session metadata store.\n */\nexport class MemorySessionBackend {\n private sessions = new Map<string, SessionMetadata>();\n\n /**\n * Store session metadata.\n */\n store(threadId: string, metadata: SessionMetadata): void {\n this.sessions.set(threadId, metadata);\n }\n\n /**\n * Get session metadata.\n */\n get(threadId: string): SessionMetadata | undefined {\n return this.sessions.get(threadId);\n }\n\n /**\n * Delete session metadata.\n */\n delete(threadId: string): boolean {\n return this.sessions.delete(threadId);\n }\n\n /**\n * List all sessions.\n */\n list(): SessionRecord[] {\n return Array.from(this.sessions.entries()).map(([threadId, meta]) => ({\n threadId,\n ...meta,\n }));\n }\n\n /**\n * Check if a session exists.\n */\n has(threadId: string): boolean {\n return this.sessions.has(threadId);\n }\n}\n","/**\n * Firestore Checkpointer for LangGraph\n *\n * Custom implementation of BaseCheckpointSaver using Firebase Firestore.\n * This is required because LangGraph only provides Postgres/Redis savers.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n * This keeps the @almadar/agent package free of firebase-admin as a direct dependency.\n */\n\nimport {\n BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointTuple,\n type CheckpointMetadata,\n type CheckpointListOptions,\n type PendingWrite,\n} from '@langchain/langgraph-checkpoint';\nimport type { RunnableConfig } from '@langchain/core/runnables';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal Firestore interface to avoid importing firebase-admin.\n * Consumers pass their own Firestore instance.\n */\nexport interface FirestoreDb {\n collection(path: string): FirestoreCollectionRef;\n batch(): FirestoreBatch;\n}\n\nexport interface FirestoreCollectionRef {\n doc(id: string): FirestoreDocRef;\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n}\n\nexport interface FirestoreDocRef {\n set(data: unknown): Promise<unknown>;\n get(): Promise<FirestoreDocSnapshot>;\n update(data: unknown): Promise<unknown>;\n delete(): Promise<unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreDocSnapshot {\n exists: boolean;\n data(): Record<string, unknown> | undefined;\n readonly ref: unknown;\n}\n\nexport interface FirestoreQuery {\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n startAfter(doc: unknown): FirestoreQuery;\n get(): Promise<FirestoreQuerySnapshot>;\n}\n\nexport interface FirestoreQuerySnapshot {\n empty: boolean;\n docs: FirestoreQueryDocSnapshot[];\n size: number;\n}\n\nexport interface FirestoreQueryDocSnapshot {\n data(): Record<string, unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreBatch {\n set(ref: unknown, data: unknown): void;\n delete(ref: unknown): void;\n commit(): Promise<unknown>;\n}\n\n/**\n * Firestore Timestamp-like interface.\n */\nexport interface FirestoreTimestamp {\n toDate(): Date;\n}\n\n/**\n * Options for FirestoreCheckpointer.\n */\nexport interface FirestoreCheckpointerOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for checkpoints.\n * @default 'agent_checkpoints'\n */\n checkpointsCollection?: string;\n\n /**\n * Collection name for pending writes.\n * @default 'agent_writes'\n */\n writesCollection?: string;\n}\n\n/**\n * Document structure for checkpoint storage.\n */\ninterface CheckpointDocument {\n threadId: string;\n checkpointId: string;\n parentCheckpointId?: string;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n createdAt: unknown;\n updatedAt: unknown;\n}\n\n/**\n * Document structure for pending writes.\n */\ninterface WriteDocument {\n threadId: string;\n checkpointId: string;\n taskId: string;\n channel: string;\n value: unknown;\n createdAt: unknown;\n}\n\n// ============================================================================\n// FirestoreCheckpointer\n// ============================================================================\n\n/**\n * Firestore-backed checkpointer for LangGraph agents.\n *\n * Provides persistent checkpoint storage across server restarts.\n * Thread checkpoints are stored as Firestore documents.\n *\n * @example\n * ```typescript\n * import { getFirestore } from 'firebase-admin/firestore';\n *\n * const checkpointer = new FirestoreCheckpointer({\n * db: getFirestore(),\n * checkpointsCollection: 'agent_checkpoints',\n * });\n *\n * const agent = createDeepAgent({\n * // ...\n * checkpointer,\n * });\n * ```\n */\nexport class FirestoreCheckpointer extends BaseCheckpointSaver {\n private db: FirestoreDb;\n private checkpointsCollection: string;\n private writesCollection: string;\n\n constructor(options: FirestoreCheckpointerOptions) {\n super();\n this.db = options.db;\n this.checkpointsCollection = options.checkpointsCollection ?? 'agent_checkpoints';\n this.writesCollection = options.writesCollection ?? 'agent_writes';\n }\n\n /**\n * Get thread ID from config.\n */\n private getThreadId(config: RunnableConfig): string {\n const threadId = config.configurable?.thread_id;\n if (!threadId || typeof threadId !== 'string') {\n throw new Error('thread_id is required in config.configurable');\n }\n return threadId;\n }\n\n /**\n * Get checkpoint ID from config, or undefined for latest.\n */\n private getCheckpointId(config: RunnableConfig): string | undefined {\n return config.configurable?.checkpoint_id as string | undefined;\n }\n\n /**\n * Get checkpoint by config.\n */\n async getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId);\n\n if (checkpointId) {\n query = query.where('checkpointId', '==', checkpointId);\n } else {\n query = query.orderBy('createdAt', 'desc').limit(1);\n }\n\n const snapshot = await query.get();\n if (snapshot.empty) {\n return undefined;\n }\n\n const doc = snapshot.docs[0];\n const data = doc.data() as unknown as CheckpointDocument;\n\n // Get pending writes for this checkpoint\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', data.checkpointId)\n .get();\n\n const pendingWrites = writesSnapshot.docs.map((writeDoc) => {\n const writeData = writeDoc.data() as unknown as WriteDocument;\n return [writeData.taskId, writeData.channel, writeData.value] as [string, string, unknown];\n });\n\n // Build parent config if available\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n return {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n pendingWrites,\n };\n }\n\n /**\n * List checkpoints for a thread.\n */\n async *list(\n config: RunnableConfig,\n options?: CheckpointListOptions\n ): AsyncGenerator<CheckpointTuple> {\n const threadId = this.getThreadId(config);\n const limit = options?.limit ?? 10;\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .orderBy('createdAt', 'desc')\n .limit(limit);\n\n // Apply filter if provided\n if (options?.filter) {\n for (const [key, value] of Object.entries(options.filter)) {\n query = query.where(`metadata.${key}`, '==', value);\n }\n }\n\n // Apply before cursor if provided\n if (options?.before?.configurable?.checkpoint_id) {\n const beforeDoc = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', options.before.configurable.checkpoint_id)\n .get();\n\n if (!beforeDoc.empty) {\n query = query.startAfter(beforeDoc.docs[0]);\n }\n }\n\n const snapshot = await query.get();\n\n for (const doc of snapshot.docs) {\n const data = doc.data() as unknown as CheckpointDocument;\n\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n yield {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n };\n }\n }\n\n /**\n * Save a checkpoint.\n */\n async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>\n ): Promise<RunnableConfig> {\n const threadId = this.getThreadId(config);\n const checkpointId = checkpoint.id;\n const parentCheckpointId = this.getCheckpointId(config);\n\n const now = new Date();\n\n const docData: CheckpointDocument = {\n threadId,\n checkpointId,\n parentCheckpointId,\n checkpoint,\n metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n // Use checkpointId as document ID for easy lookup\n const docId = `${threadId}_${checkpointId}`;\n await this.db.collection(this.checkpointsCollection).doc(docId).set(docData);\n\n return {\n configurable: {\n thread_id: threadId,\n checkpoint_id: checkpointId,\n },\n };\n }\n\n /**\n * Store pending writes for a checkpoint.\n */\n async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string\n ): Promise<void> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n if (!checkpointId) {\n throw new Error('checkpoint_id is required for putWrites');\n }\n\n const batch = this.db.batch();\n const now = new Date();\n\n for (const [idx, [channel, value]] of writes.entries()) {\n const docId = `${threadId}_${checkpointId}_${taskId}_${idx}`;\n const docRef = this.db.collection(this.writesCollection).doc(docId);\n\n const writeData: WriteDocument = {\n threadId,\n checkpointId,\n taskId,\n channel,\n value,\n createdAt: now,\n };\n\n batch.set(docRef, writeData);\n }\n\n await batch.commit();\n }\n\n /**\n * Delete all checkpoints and writes for a thread.\n */\n async deleteThread(threadId: string): Promise<void> {\n // Delete checkpoints\n const checkpointsSnapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const checkpointBatch = this.db.batch();\n for (const doc of checkpointsSnapshot.docs) {\n checkpointBatch.delete(doc.ref);\n }\n await checkpointBatch.commit();\n\n // Delete writes\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const writesBatch = this.db.batch();\n for (const doc of writesSnapshot.docs) {\n writesBatch.delete(doc.ref);\n }\n await writesBatch.commit();\n }\n}\n","/**\n * Firestore Session Store for DeepAgent\n *\n * Provides persistent session storage for skill-based agents.\n * Sessions are stored in Firestore and persist across server restarts.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n */\n\nimport type { Session } from './types.js';\nimport type { FirestoreDb, FirestoreTimestamp } from './firestore-checkpointer.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for FirestoreSessionStore.\n */\nexport interface FirestoreSessionStoreOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for sessions.\n * @default 'agent_sessions'\n */\n collection?: string;\n}\n\n/**\n * Document structure for session storage.\n */\ninterface SessionDocument {\n threadId: string;\n skill: string;\n workDir: string;\n userId?: string;\n createdAt: FirestoreTimestamp;\n lastActivityAt: FirestoreTimestamp;\n}\n\n// ============================================================================\n// FirestoreSessionStore\n// ============================================================================\n\n/**\n * Firestore-backed session store for skill agents.\n *\n * @example\n * ```typescript\n * const sessionStore = new FirestoreSessionStore({ db: getFirestore() });\n *\n * await sessionStore.save({\n * threadId: 'abc-123',\n * skill: 'kflow-generating-m',\n * workDir: '/tmp/workspace',\n * createdAt: new Date(),\n * lastActivityAt: new Date(),\n * });\n *\n * const session = await sessionStore.get('abc-123');\n * ```\n */\nexport class FirestoreSessionStore {\n private db: FirestoreDb;\n private collection: string;\n\n constructor(options: FirestoreSessionStoreOptions) {\n this.db = options.db;\n this.collection = options.collection ?? 'agent_sessions';\n }\n\n /**\n * Save a session.\n */\n async save(session: Session): Promise<void> {\n const now = new Date();\n\n const docData = {\n threadId: session.threadId,\n skill: session.skill,\n workDir: session.workDir,\n userId: session.userId,\n createdAt: session.createdAt,\n lastActivityAt: now,\n };\n\n await this.db.collection(this.collection).doc(session.threadId).set(docData);\n }\n\n /**\n * Get a session by thread ID.\n */\n async get(threadId: string): Promise<Session | null> {\n const doc = await this.db.collection(this.collection).doc(threadId).get();\n\n if (!doc.exists) {\n return null;\n }\n\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n }\n\n /**\n * Update session's last activity timestamp.\n */\n async touch(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).update({\n lastActivityAt: new Date(),\n });\n }\n\n /**\n * Delete a session.\n */\n async delete(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).delete();\n }\n\n /**\n * List sessions, optionally filtered by user ID.\n */\n async list(options?: { userId?: string; limit?: number }): Promise<Session[]> {\n let query = this.db\n .collection(this.collection)\n .orderBy('lastActivityAt', 'desc');\n\n if (options?.userId) {\n query = query.where('userId', '==', options.userId);\n }\n\n const limit = options?.limit ?? 100;\n query = query.limit(limit);\n\n const snapshot = await query.get();\n\n return snapshot.docs.map((doc) => {\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n });\n }\n\n /**\n * Delete expired sessions (older than specified hours).\n */\n async deleteExpired(maxAgeHours: number = 24): Promise<number> {\n const cutoff = new Date(Date.now() - maxAgeHours * 60 * 60 * 1000);\n\n const snapshot = await this.db\n .collection(this.collection)\n .where('lastActivityAt', '<', cutoff)\n .get();\n\n const batch = this.db.batch();\n for (const doc of snapshot.docs) {\n batch.delete(doc.ref);\n }\n\n await batch.commit();\n return snapshot.size;\n }\n}\n","/**\n * Session Manager\n *\n * Unified session management API with pluggable persistence backends.\n * Supports in-memory (development) and Firestore (production) backends.\n */\n\nimport { MemorySaver } from '@langchain/langgraph';\nimport type { BaseCheckpointSaver } from '@langchain/langgraph-checkpoint';\n\nimport type { SessionMetadata, SessionRecord, PersistenceMode, Session } from '../persistence/types.js';\nimport { MemorySessionBackend } from '../persistence/memory-backend.js';\nimport { FirestoreCheckpointer, type FirestoreDb } from '../persistence/firestore-checkpointer.js';\nimport { FirestoreSessionStore } from '../persistence/firestore-session-store.js';\n\n// Re-export for convenience\nexport type { SessionMetadata, SessionRecord, PersistenceMode };\n\n// ============================================================================\n// Session Manager\n// ============================================================================\n\nexport interface SessionManagerOptions {\n /**\n * Persistence mode.\n * @default 'memory'\n */\n mode?: PersistenceMode;\n\n /**\n * Firestore database instance. Required when mode is 'firestore'.\n */\n firestoreDb?: FirestoreDb;\n}\n\n/**\n * Unified session management for agent sessions.\n *\n * Handles both session metadata and LangGraph checkpointers.\n */\nexport class SessionManager {\n private mode: PersistenceMode;\n private memoryBackend: MemorySessionBackend;\n private memoryCheckpointers: Map<string, MemorySaver>;\n private firestoreCheckpointer: FirestoreCheckpointer | null = null;\n private firestoreSessionStore: FirestoreSessionStore | null = null;\n\n constructor(options: SessionManagerOptions = {}) {\n this.mode = options.mode ?? 'memory';\n this.memoryBackend = new MemorySessionBackend();\n this.memoryCheckpointers = new Map();\n\n if (this.mode === 'firestore' && options.firestoreDb) {\n this.firestoreCheckpointer = new FirestoreCheckpointer({ db: options.firestoreDb });\n this.firestoreSessionStore = new FirestoreSessionStore({ db: options.firestoreDb });\n }\n }\n\n /**\n * Get the persistence mode.\n */\n getMode(): PersistenceMode {\n return this.mode;\n }\n\n /**\n * Get or create a checkpointer for a session.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getCheckpointer(threadId: string): BaseCheckpointSaver<any> {\n if (this.mode === 'firestore' && this.firestoreCheckpointer) {\n return this.firestoreCheckpointer;\n }\n\n let checkpointer = this.memoryCheckpointers.get(threadId);\n if (!checkpointer) {\n checkpointer = new MemorySaver();\n this.memoryCheckpointers.set(threadId, checkpointer);\n }\n // Cast to BaseCheckpointSaver - MemorySaver may not implement all methods (e.g., deleteThread)\n return checkpointer as unknown as BaseCheckpointSaver<any>;\n }\n\n /**\n * Store session metadata.\n */\n store(threadId: string, metadata: SessionMetadata): void {\n // Always store in memory for sync access\n this.memoryBackend.store(threadId, metadata);\n\n // Also store in Firestore if that mode is active\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const session: Session = {\n threadId,\n skill: metadata.skill,\n workDir: metadata.workDir,\n createdAt: new Date(metadata.createdAt),\n lastActivityAt: new Date(metadata.lastActivityAt),\n };\n this.firestoreSessionStore.save(session).catch(console.error);\n }\n }\n\n /**\n * Get session metadata (sync, memory only).\n */\n get(threadId: string): SessionMetadata | undefined {\n return this.memoryBackend.get(threadId);\n }\n\n /**\n * Get session metadata (async, supports Firestore).\n */\n async getAsync(threadId: string): Promise<SessionMetadata | undefined> {\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const session = await this.firestoreSessionStore.get(threadId);\n if (!session) return undefined;\n return {\n skill: session.skill,\n workDir: session.workDir,\n createdAt: session.createdAt.getTime(),\n lastActivityAt: session.lastActivityAt.getTime(),\n };\n }\n return this.memoryBackend.get(threadId);\n }\n\n /**\n * Clear a session's checkpointer and metadata.\n */\n clear(threadId: string): boolean {\n if (this.mode === 'firestore') {\n this.firestoreCheckpointer?.deleteThread(threadId).catch(console.error);\n this.firestoreSessionStore?.delete(threadId).catch(console.error);\n this.memoryBackend.delete(threadId);\n return true;\n }\n this.memoryBackend.delete(threadId);\n return this.memoryCheckpointers.delete(threadId);\n }\n\n /**\n * List all sessions (sync, memory only).\n */\n list(): SessionRecord[] {\n return this.memoryBackend.list();\n }\n\n /**\n * List all sessions (async, supports Firestore).\n */\n async listAsync(): Promise<SessionRecord[]> {\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const sessions = await this.firestoreSessionStore.list();\n return sessions.map((s) => ({\n threadId: s.threadId,\n skill: s.skill,\n workDir: s.workDir,\n createdAt: s.createdAt.getTime(),\n lastActivityAt: s.lastActivityAt.getTime(),\n }));\n }\n return this.memoryBackend.list();\n }\n}\n","/**\n * Interrupt Configuration\n *\n * Human-in-the-loop configuration for agent tools.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Skill metadata (minimal interface for interrupt config).\n */\nexport interface SkillMeta {\n name: string;\n allowedTools?: string[];\n}\n\n// ============================================================================\n// Interrupt Configuration\n// ============================================================================\n\n/**\n * Default interrupt configuration for tools requiring human approval.\n * Using `true` means the tool requires approval with default options.\n */\nconst DEFAULT_INTERRUPT_CONFIG: Record<string, boolean> = {\n // Shell commands always require approval\n execute: true,\n};\n\n/**\n * Get interrupt configuration for a skill.\n *\n * Default: require approval for execute tool.\n * Skills can override via frontmatter (future enhancement).\n */\nexport function getInterruptConfig(_skill: SkillMeta): Record<string, boolean> {\n const config = { ...DEFAULT_INTERRUPT_CONFIG };\n return config;\n}\n","/**\n * Skill-Based DeepAgent Factory\n *\n * Creates DeepAgent instances that use skills as the primary prompt source.\n * No custom system prompts - all agent behavior is defined through skills.\n *\n * Uses deepagents library primitives:\n * - createDeepAgent() for agent creation\n * - FilesystemBackend for file operations\n *\n * Skill loading is injected via SkillLoader functions, keeping this package\n * independent of any specific skill registry location.\n */\n\nimport { createDeepAgent, FilesystemBackend } from 'deepagents';\nimport { Command } from '@langchain/langgraph';\nimport { v4 as uuid } from 'uuid';\n\nimport {\n createAnthropicClient,\n createDeepSeekClient,\n createOpenAIClient,\n ANTHROPIC_MODELS,\n DEEPSEEK_MODELS,\n OPENAI_MODELS,\n type LLMProvider,\n} from '@almadar/llm';\n\nimport {\n createExecuteTool,\n createFinishTaskTool,\n createValidateSchemaTool,\n createOrbitalSubagentTool,\n createSchemaChunkingTools,\n createDomainOrbitalTools,\n createGitHubToolsArray,\n type SubagentEventCallback,\n type OrbitalCompleteCallback,\n type DomainOrbitalCompleteCallback,\n} from '../tools/index.js';\n\nimport { SessionManager, type SessionMetadata } from './session-manager.js';\nimport { getInterruptConfig, type SkillMeta } from './interrupt-config.js';\n\n// Re-export Command for resume operations\nexport { Command };\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Skill definition loaded by the consumer.\n */\nexport interface Skill {\n name: string;\n description: string;\n content: string;\n allowedTools?: string[];\n version?: string;\n references: string[];\n path?: string;\n}\n\n/**\n * Function to load a skill by name.\n */\nexport type SkillLoader = (name: string) => Skill | null;\n\n/**\n * Function to load a skill reference by skill name and ref name.\n */\nexport type SkillRefLoader = (skillName: string, refName: string) => string | null;\n\n/**\n * Options for creating a skill agent.\n */\nexport interface SkillAgentOptions {\n /** Required: The skill(s) to use. Can be a single skill or array of skills. */\n skill: string | string[];\n /** Required: Working directory for the agent */\n workDir: string;\n /** Required: Function to load skills */\n skillLoader: SkillLoader;\n /** Optional: Function to load skill references */\n skillRefLoader?: SkillRefLoader;\n /** Optional: Thread ID for session continuity */\n threadId?: string;\n /** Optional: LLM provider */\n provider?: LLMProvider;\n /** Optional: Model name */\n model?: string;\n /** Optional: Enable verbose logging */\n verbose?: boolean;\n /** Optional: Disable human-in-the-loop interrupts (for eval/testing) */\n noInterrupt?: boolean;\n /** Optional: Callback for subagent events (orbital generation) */\n onSubagentEvent?: SubagentEventCallback;\n /** Optional: Session manager instance (shared across requests) */\n sessionManager?: SessionManager;\n /** Optional: Extracted requirements from analysis phase (for orbital skill) */\n requirements?: {\n entities?: string[];\n states?: string[];\n events?: string[];\n guards?: string[];\n pages?: string[];\n effects?: string[];\n rawRequirements?: string[];\n };\n /** Optional: GitHub integration configuration */\n githubConfig?: {\n /** GitHub personal access token */\n token: string;\n /** Repository owner (e.g., 'octocat') */\n owner?: string;\n /** Repository name (e.g., 'hello-world') */\n repo?: string;\n };\n}\n\n/**\n * Result from creating a skill agent.\n */\nexport interface SkillAgentResult {\n /** The agent instance (from deepagents library) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n agent: any;\n /** Thread ID for session resumption */\n threadId: string;\n /** The loaded skill(s) - primary skill when single, all skills when multiple */\n skill: Skill;\n /** All loaded skills (same as skill when single) */\n skills: Skill[];\n /** Working directory */\n workDir: string;\n /** Orbital tool setter for wiring SSE callback (if orbital tool enabled) */\n setOrbitalEventCallback?: (callback: SubagentEventCallback) => void;\n /** Orbital tool setter for wiring persistence callback */\n setOrbitalCompleteCallback?: (callback: OrbitalCompleteCallback) => void;\n /** Domain orbital callback for lean skill Firestore persistence */\n setDomainCompleteCallback?: (callback: DomainOrbitalCompleteCallback) => void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Base system prompt that provides core agent behavior.\n * Skill-specific instructions are appended to this.\n */\nconst BASE_SYSTEM_PROMPT = `You are a KFlow agent that helps users create and manage application schemas.\n\nYou have access to:\n- File operations (ls, read_file, write_file, edit_file) for managing files\n- Execute tool for running shell commands in your workspace\n\n## Guidelines\n\n1. **Plan First**: Think through the steps needed before executing\n2. **Work Incrementally**: Complete one step at a time, verify before moving on\n3. **Stay in Workspace**: All file operations are restricted to your workspace directory\n4. **Validate Often**: After generating schemas, validate them with orbital validate\n\n## Batch Repair Strategy (CRITICAL)\n\nWhen fixing validation errors:\n1. **Fix ALL errors at once**: Do not fix one by one. Read the validation report, identify all issues, and apply a single comprehensive fix.\n2. **Avoid Loops**: If you fix an error and it persists, STOP and rethink. Do not try the same fix twice.\n\n## ⛔ JSON FILE OPERATIONS (MANDATORY)\n\n**NEVER use \\`edit_file\\` on JSON files (schema.json, *.json).**\n\n\\`edit_file\\` on JSON causes:\n- Trailing comma errors\n- Missing bracket errors\n- Whitespace/newline corruption\n- Endless fix loops\n\n**ALWAYS use \\`write_file\\` to overwrite the ENTIRE JSON file.**\n\nWorkflow for JSON changes:\n1. Read the current file content\n2. Modify in memory (add/remove/change)\n3. Write the COMPLETE updated JSON with \\`write_file\\`\n\nThis applies to ALL JSON modifications - initial creation, adding pages, fixing errors.\n\n## Workspace\n\nYour workspace is a sandboxed directory. Use relative paths like:\n- ./schema.json (for the KFlow schema)\n- ./app (for the compiled application)\n\nAll paths are relative to your workspace root.`;\n\n// ============================================================================\n// LLM Client Factory\n// ============================================================================\n\n/**\n * Create LLM client based on provider.\n */\nfunction createLLMClient(\n provider: LLMProvider,\n model?: string,\n verbose?: boolean,\n) {\n const temperature = 0; // Deterministic for schema generation\n\n switch (provider) {\n case 'deepseek':\n if (verbose)\n console.log(`[SkillAgent] Using DeepSeek: ${model || DEEPSEEK_MODELS.CHAT}`);\n return createDeepSeekClient({\n model: model || DEEPSEEK_MODELS.CHAT,\n temperature,\n });\n\n case 'openai':\n if (verbose)\n console.log(`[SkillAgent] Using OpenAI: ${model || OPENAI_MODELS.GPT4O}`);\n return createOpenAIClient({\n model: model || OPENAI_MODELS.GPT4O,\n temperature,\n });\n\n case 'anthropic':\n default:\n if (verbose)\n console.log(`[SkillAgent] Using Anthropic: ${model || ANTHROPIC_MODELS.CLAUDE_SONNET_4_5}`);\n return createAnthropicClient({\n model: model || ANTHROPIC_MODELS.CLAUDE_SONNET_4_5,\n temperature,\n });\n }\n}\n\n// ============================================================================\n// Default Session Manager (singleton for backward compatibility)\n// ============================================================================\n\nlet defaultSessionManager: SessionManager | null = null;\n\nfunction getDefaultSessionManager(): SessionManager {\n if (!defaultSessionManager) {\n defaultSessionManager = new SessionManager();\n }\n return defaultSessionManager;\n}\n\n// ============================================================================\n// Skill Agent Factory\n// ============================================================================\n\n/**\n * Create a skill-based DeepAgent.\n *\n * Uses the specified skill's content as the system prompt.\n * When multiple skills are provided, the agent sees all skill descriptions\n * and can choose the appropriate one based on the user's request.\n *\n * @throws Error if any skill is not found\n */\nexport async function createSkillAgent(\n options: SkillAgentOptions,\n): Promise<SkillAgentResult> {\n const {\n skill: skillInput,\n workDir,\n threadId: providedThreadId,\n provider = 'anthropic',\n model,\n verbose = false,\n skillLoader,\n skillRefLoader,\n } = options;\n\n const sessions = options.sessionManager ?? getDefaultSessionManager();\n\n // 1. Normalize skill input to array\n const skillNames = Array.isArray(skillInput) ? skillInput : [skillInput];\n\n // 2. Load all skills (throws if any not found)\n const skills: Skill[] = [];\n for (const skillName of skillNames) {\n const skill = skillLoader(skillName);\n if (!skill) {\n throw new Error(\n `Skill not found: '${skillName}'. ` +\n `Run 'npm run skills:install ${skillName}' to install it, ` +\n `or 'npm run skills:list' to see available skills.`,\n );\n }\n skills.push(skill);\n\n if (verbose) {\n console.log(`[SkillAgent] Loading skill: ${skillName}`);\n console.log(`[SkillAgent] Description: ${skill.description}`);\n if (skill.allowedTools?.length) {\n console.log(`[SkillAgent] Allowed tools: ${skill.allowedTools.join(', ')}`);\n }\n }\n }\n\n // Primary skill is the first one (for backward compatibility)\n const primarySkill = skills[0];\n\n // 3. Load references for all skills\n const allReferences: string[] = [];\n if (skillRefLoader) {\n for (const skill of skills) {\n const refs = skill.references\n .map((ref) => {\n const content = skillRefLoader(skill.name, ref);\n if (content && verbose) {\n console.log(`[SkillAgent] Loaded reference: ${skill.name}/${ref}`);\n }\n return content;\n })\n .filter((ref): ref is string => ref !== null);\n allReferences.push(...refs);\n }\n }\n const references = allReferences.join('\\n\\n---\\n\\n');\n\n // 4. Assemble system prompt from skill(s)\n let skillInstructions: string;\n\n if (skills.length === 1) {\n skillInstructions = skills[0].content;\n } else {\n const skillSummaries = skills\n .map((s) => `- **${s.name}**: ${s.description}`)\n .join('\\n');\n\n const skillContents = skills\n .map((s) => `### Skill: ${s.name}\\n\\n${s.content}`)\n .join('\\n\\n---\\n\\n');\n\n skillInstructions = `## Available Skills\n\nYou have access to multiple skills. Choose the most appropriate one based on the user's request:\n\n${skillSummaries}\n\n**Selection Guidelines:**\n- Read the user's request carefully\n- Match the request to the skill that best fits (based on the descriptions above)\n- Follow that skill's instructions completely\n\n---\n\n${skillContents}`;\n }\n\n const systemPrompt = [\n BASE_SYSTEM_PROMPT,\n '\\n## Skill Instructions\\n\\n' + skillInstructions,\n references ? '\\n## Reference Documentation\\n\\n' + references : '',\n ]\n .filter(Boolean)\n .join('\\n');\n\n // 5. Generate or use provided thread ID\n const threadId = providedThreadId || uuid();\n\n // 6. Create LLM client\n const llmClient = createLLMClient(provider, model, verbose);\n\n // 7. Create filesystem backend with sandbox mode\n const backend = new FilesystemBackend({\n rootDir: workDir,\n virtualMode: true,\n });\n\n // 8. Create base tools\n const executeTool = createExecuteTool(workDir);\n const finishTaskTool = createFinishTaskTool(workDir);\n const validateSchemaTool = createValidateSchemaTool(workDir);\n\n // 9. Create optional orbital-specific tools\n const ORBITAL_SKILLS = ['kflow-orbitals', 'kflow-orbital-games', 'kflow-orbital-fixing'];\n const LEAN_SKILLS = ['kflow-lean-orbitals', 'kflow-lean-fixing'];\n const DESIGN_SKILLS = ['kflow-design', 'kflow-lean-design'];\n const isOrbitalSkill = primarySkill.name === 'kflow-orbitals';\n const isLeanSkill = LEAN_SKILLS.includes(primarySkill.name);\n const isDesignSkill = DESIGN_SKILLS.includes(primarySkill.name);\n const needsChunkingTools = ORBITAL_SKILLS.includes(primarySkill.name) || isDesignSkill;\n\n let orbitalTool: ReturnType<typeof createOrbitalSubagentTool>['tool'] | undefined;\n let setOrbitalEventCallback: ReturnType<typeof createOrbitalSubagentTool>['setEventCallback'] | undefined;\n let setOrbitalCompleteCallback: ReturnType<typeof createOrbitalSubagentTool>['setOrbitalCompleteCallback'] | undefined;\n\n let domainOrbitalTools: ReturnType<typeof createDomainOrbitalTools> | undefined;\n\n const chunkingTools = needsChunkingTools ? createSchemaChunkingTools(workDir) : null;\n\n if (isOrbitalSkill) {\n const orbitalResult = createOrbitalSubagentTool({\n requirements: options.requirements,\n });\n orbitalTool = orbitalResult.tool;\n setOrbitalEventCallback = orbitalResult.setEventCallback;\n setOrbitalCompleteCallback = orbitalResult.setOrbitalCompleteCallback;\n\n if (options.onSubagentEvent) {\n setOrbitalEventCallback(options.onSubagentEvent);\n }\n\n if (verbose) {\n console.log(`[SkillAgent] Orbital tools enabled for kflow-orbitals skill`);\n }\n }\n\n if (isLeanSkill) {\n domainOrbitalTools = createDomainOrbitalTools({ workDir });\n if (verbose) {\n console.log(`[SkillAgent] Domain orbital tools enabled for ${primarySkill.name} skill`);\n }\n }\n\n // Create GitHub tools if configuration is provided\n const githubTools = options.githubConfig\n ? createGitHubToolsArray({\n token: options.githubConfig.token,\n owner: options.githubConfig.owner,\n repo: options.githubConfig.repo,\n workDir,\n })\n : null;\n\n if (githubTools && verbose) {\n console.log(`[SkillAgent] GitHub tools enabled`);\n }\n\n // 10. Build tools array based on skill type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tools: any[] = [\n executeTool,\n finishTaskTool,\n ...(isOrbitalSkill ? [] : [validateSchemaTool]),\n ...(orbitalTool ? [orbitalTool] : []),\n ...(domainOrbitalTools\n ? [\n domainOrbitalTools.generateOrbitalDomain,\n domainOrbitalTools.constructCombinedDomain,\n ]\n : []),\n ...(chunkingTools\n ? [\n chunkingTools.querySchemaStructure,\n chunkingTools.extractChunk,\n chunkingTools.applyChunk,\n ]\n : []),\n ...(githubTools || []),\n ];\n\n // 11. Get or create checkpointer\n const checkpointer = sessions.getCheckpointer(threadId);\n\n // 12. Get interrupt configuration\n const interruptConfig = options.noInterrupt\n ? undefined\n : getInterruptConfig(primarySkill as SkillMeta);\n\n // 13. Create agent with deepagents primitives\n const agent = createDeepAgent({\n model: llmClient.getModel(),\n systemPrompt,\n backend,\n tools,\n checkpointer,\n ...(interruptConfig && { interruptOn: interruptConfig }),\n });\n\n // 14. Store session metadata\n sessions.store(threadId, {\n skill: primarySkill.name,\n workDir,\n createdAt: Date.now(),\n lastActivityAt: Date.now(),\n });\n\n if (verbose) {\n const skillNamesStr = skillNames.join(', ');\n console.log(`[SkillAgent] Created agent with skill(s): ${skillNamesStr}, threadId: ${threadId}`);\n }\n\n const setDomainCompleteCallback = domainOrbitalTools?.setCompleteCallback;\n\n return {\n agent,\n threadId,\n skill: primarySkill,\n skills,\n workDir,\n setOrbitalEventCallback,\n setOrbitalCompleteCallback,\n setDomainCompleteCallback,\n };\n}\n\n/**\n * Resume a skill agent session.\n *\n * Loads the skill from session metadata and creates agent with same threadId.\n *\n * @throws Error if session not found\n */\nexport async function resumeSkillAgent(\n threadId: string,\n options: {\n verbose?: boolean;\n noInterrupt?: boolean;\n skillLoader: SkillLoader;\n skillRefLoader?: SkillRefLoader;\n sessionManager?: SessionManager;\n },\n): Promise<SkillAgentResult> {\n const sessions = options.sessionManager ?? getDefaultSessionManager();\n const metadata = sessions.get(threadId);\n if (!metadata) {\n throw new Error(\n `Session not found: '${threadId}'. ` +\n `The session may have expired or been cleared.`,\n );\n }\n\n // Update last activity\n metadata.lastActivityAt = Date.now();\n sessions.store(threadId, metadata);\n\n return createSkillAgent({\n skill: metadata.skill,\n workDir: metadata.workDir,\n threadId,\n verbose: options.verbose,\n noInterrupt: options.noInterrupt,\n skillLoader: options.skillLoader,\n skillRefLoader: options.skillRefLoader,\n sessionManager: sessions,\n });\n}\n","/**\n * Event Budget Configuration\n *\n * Prevents runaway agent loops with soft/hard event limits per skill.\n */\n\n// ============================================================================\n// Event Budget Configuration\n// ============================================================================\n\n/**\n * Event budget limits for different skills.\n * - soft: Warning threshold (agent reminded to finish up)\n * - hard: Maximum events before forced completion\n */\nexport const EVENT_BUDGETS: Record<string, { soft: number; hard: number }> = {\n // Generation skills - complex tasks\n 'kflow-generating-m': { soft: 40, hard: 60 },\n 'kflow-domain-generating': { soft: 40, hard: 60 },\n 'kflow-game-designer': { soft: 50, hard: 80 },\n\n // Editing skills - medium complexity\n 'kflow-editing-m': { soft: 30, hard: 50 },\n 'kflow-domain-editing': { soft: 30, hard: 50 },\n\n // Fixing skills - should be fast\n 'kflow-domain-fixing': { soft: 25, hard: 40 },\n 'kflow-validating': { soft: 15, hard: 25 },\n\n // Default for unknown skills\n default: { soft: 50, hard: 80 },\n};\n\n/**\n * Get event budget for a skill.\n */\nexport function getEventBudget(skillName: string): { soft: number; hard: number } {\n return EVENT_BUDGETS[skillName] || EVENT_BUDGETS['default'];\n}\n\n/**\n * Generate a budget warning message to inject into the agent.\n */\nexport function getBudgetWarningMessage(\n eventCount: number,\n budget: { soft: number; hard: number },\n): string | null {\n if (eventCount >= budget.hard) {\n return `⚠️ CRITICAL: You have reached your event budget (${budget.hard} events). You MUST complete now. Mark remaining todos complete and stop immediately.`;\n }\n if (eventCount >= budget.soft) {\n return `📊 Note: You are at ${eventCount}/${budget.hard} events. Please finish your current task efficiently. Avoid re-reading files or redundant validation.`;\n }\n return null;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/orbitals/cache/orbital-fingerprint.ts","../../src/orbitals/cache/structural-templates.ts","../../src/orbitals/cache/prompt-assembler.ts","../../src/orbitals/cache/index.ts","../../src/tools/execute.ts","../../src/tools/validate-schema.ts","../../src/tools/generate-schema.ts","../../src/orbitals/combiner/index.ts","../../src/orbitals/domain-language/tokens.ts","../../src/orbitals/domain-language/lexer.ts","../../src/orbitals/domain-language/parsers/entity-parser.ts","../../src/orbitals/domain-language/parsers/page-parser.ts","../../src/orbitals/domain-language/parsers/guard-parser.ts","../../src/orbitals/domain-language/parsers/sexpr-parser.ts","../../src/orbitals/domain-language/parsers/behavior-parser.ts","../../src/orbitals/domain-language/sync/domain-to-schema.ts","../../src/tools/finish-task.ts","../../src/tools/domain-orbital.ts","../../src/orbitals/generation/orbital-generator.ts","../../src/tools/orbital-subagent.ts","../../src/tools/trait-subagent.ts","../../src/tools/combine-schemas.ts","../../src/tools/schema-chunking.ts","../../src/tools/github.ts","../../src/persistence/memory-backend.ts","../../src/persistence/firestore-checkpointer.ts","../../src/persistence/firestore-session-store.ts","../../src/agent/session-manager.ts","../../src/agent/interrupt-config.ts","../../src/agent/skill-agent.ts","../../src/agent/event-budget.ts"],"names":["isEntityReference","getTraitName","getInlineEntity","resolve","path2","tool","fs","z","entity","toKebabCase","nameParts","name","page","parseValue","toCamelCase","splitAtTopLevel","parseComparison","path","behavior","text","toPascalCase","isPageReferenceString","isPageReferenceObject","execAsync","promisify","exec","path3","fs2","path4","getEntityName","LLMClient","path5","fss","isOrbitalDefinition","uuid"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAgBA,SAAS,gBAAgB,MAAA,EAAyC;AAC9D,EAAA,IAAIA,iBAAAA,CAAkB,MAAM,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACX;AACA,EAAA,OAAO,MAAA;AACX;AAWO,SAAS,0BAA0B,OAAA,EAA8B;AAKpE,EAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,OAAA,CAAQ,MAAM,CAAA;AAGnD,EAAA,MAAM,SAAA,GAAY,YAAA,GAAe,sBAAA,CAAuB,YAAY,CAAA,GAAI,KAAA;AAGxE,EAAA,MAAM,QAAA,GAAW,QAAQ,MAAA,CACpB,GAAA,CAAIC,YAAY,CAAA,CAChB,IAAA,EAAK,CACL,IAAA,CAAK,GAAG,CAAA;AAGb,EAAA,MAAM,UAAA,GAAa,cAAc,WAAA,IAAe,YAAA;AAEhD,EAAA,OAAO,CAAA,EAAG,UAAU,CAAA,GAAA,EAAM,SAAS,OAAO,QAAQ,CAAA,CAAA,CAAA;AACtD;AAKO,SAAS,uBAAuB,MAAA,EAA+B;AAClE,EAAA,MAAM,aAAqC,EAAC;AAE5C,EAAA,KAAA,MAAW,KAAA,IAAS,OAAO,MAAA,EAAQ;AAC/B,IAAA,MAAM,QAAA,GAAW,gBAAgB,KAAK,CAAA;AACtC,IAAA,UAAA,CAAW,QAAQ,CAAA,GAAA,CAAK,UAAA,CAAW,QAAQ,KAAK,CAAA,IAAK,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAC3B,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,EAAE,aAAA,CAAc,CAAC,CAAC,CAAA,CACrC,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA,CACzC,KAAK,GAAG,CAAA;AACjB;AAKA,SAAS,gBAAgB,KAAA,EAA4B;AACjD,EAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC3B,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,QAAA,EAAU,WAAA,IAAe,KAAA;AACnD,IAAA,OAAO,OAAO,WAAW,CAAA,CAAA;AAAA,EAC7B;AACA,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACvB,IAAA,OAAO,MAAA;AAAA,EACX;AACA,EAAA,OAAO,KAAA,CAAM,IAAA;AACjB;AAnFA,IAAA,wBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2CAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACyFO,SAAS,sBAAsB,WAAA,EAA2C;AAC7E,EAAA,OAAO,oBAAA,CAAqB,MAAA;AAAA,IAAO,CAAC,QAAA,KAChC,cAAA,CAAe,WAAA,EAAa,SAAS,kBAAkB;AAAA,GAC3D;AACJ;AAKO,SAAS,gBAAgB,WAAA,EAAgD;AAC5E,EAAA,MAAM,OAAA,GAAU,sBAAsB,WAAW,CAAA;AACjD,EAAA,OAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,CAAQ,CAAC,CAAA,GAAI,IAAA;AAC7C;AAMA,SAAS,cAAA,CAAe,aAAqB,OAAA,EAA0B;AAEnE,EAAA,MAAM,QAAA,GAAW,QACZ,OAAA,CAAQ,oBAAA,EAAsB,MAAM,CAAA,CACpC,OAAA,CAAQ,OAAO,IAAI,CAAA;AAExB,EAAA,MAAM,KAAA,GAAQ,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAG,CAAA;AACxC,EAAA,OAAO,KAAA,CAAM,KAAK,WAAW,CAAA;AACjC;AAKO,SAAS,oBAAoB,WAAA,EAA6B;AAC7D,EAAA,MAAM,QAAA,GAAW,gBAAgB,WAAW,CAAA;AAC5C,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,OAAO,QAAA,CAAS,QAAA;AAAA,EACpB;AAEA,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAOX;AArIA,IA8Ba,oBAAA;AA9Bb,IAAA,yBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,4CAAA,GAAA;AA8BO,IAAM,oBAAA,GAA6C;AAAA,MACtD;AAAA,QACI,kBAAA,EAAoB,8CAAA;AAAA,QACpB,IAAA,EAAM,kBAAA;AAAA,QACN,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,QAQV,iBAAiB,CAAC,aAAA,EAAe,gBAAA,EAAkB,aAAA,EAAe,gBAAgB,cAAc;AAAA,OACpG;AAAA,MACA;AAAA,QACI,kBAAA,EAAoB,oCAAA;AAAA,QACpB,IAAA,EAAM,iBAAA;AAAA,QACN,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,QAOV,eAAA,EAAiB,CAAC,aAAA,EAAe,cAAA,EAAgB,iBAAiB,cAAc;AAAA,OACpF;AAAA,MACA;AAAA,QACI,kBAAA,EAAoB,iCAAA;AAAA,QACpB,IAAA,EAAM,gBAAA;AAAA,QACN,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,QAOV,eAAA,EAAiB,CAAC,aAAA,EAAe,iBAAA,EAAmB,SAAS,cAAc;AAAA,OAC/E;AAAA,MACA;AAAA,QACI,kBAAA,EAAoB,gCAAA;AAAA,QACpB,IAAA,EAAM,aAAA;AAAA,QACN,QAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAAA,QAOV,eAAA,EAAiB,CAAC,aAAA,EAAe,UAAA,EAAY,eAAe;AAAA;AAChE,KACJ;AAAA,EAAA;AAAA,CAAA,CAAA;AClEA,SAAS,cAAc,MAAA,EAA2B;AAC9C,EAAA,IAAID,iBAAAA,CAAkB,MAAM,CAAA,EAAG;AAC3B,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAClB;AAKA,SAASE,iBAAgB,MAAA,EAAkC;AACvD,EAAA,IAAIF,iBAAAA,CAAkB,MAAM,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACX;AACA,EAAA,OAAO,MAAA;AACX;AAoBA,SAAS,oBAAoB,OAAA,EAAoC;AAC7D,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,QAAQ,aAAA,EAAe;AACvB,IAAA,MAAM,MAAM,OAAA,CAAQ,aAAA;AACpB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,wBAAA,EAA2B,GAAA,CAAI,QAAA,IAAY,UAAU,CAAA,CAAE,CAAA;AAClE,IAAA,IAAI,IAAI,UAAA,EAAY;AAChB,MAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,IAAA,CAAK,UAAU,GAAA,CAAI,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,IAAI,eAAA,EAAiB;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,GAAA,CAAI,eAAe,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1D;AAAA,EACJ;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAChB,IAAA,MAAM,IAAI,OAAA,CAAQ,MAAA;AAClB,IAAA,IAAI,EAAE,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,CAAA,CAAE,KAAK,CAAA,CAAE,CAAA;AAC3C,IAAA,IAAI,EAAE,OAAA,EAAS;AACX,MAAA,MAAM,QAAQ,CAAA,CAAE,OAAA;AAChB,MAAA,IAAI,MAAM,WAAA,EAAa,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,WAAW,CAAA,CAAE,CAAA;AACrE,MAAA,IAAI,MAAM,WAAA,EAAa,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,WAAW,CAAA,CAAE,CAAA;AACrE,MAAA,IAAI,MAAM,WAAA,EAAa,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,WAAW,CAAA,CAAE,CAAA;AAAA,IACzE;AAAA,EACJ;AAEA,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,YAAY,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,GAAO,EAAA;AACjE;AAsCO,SAAS,qBAAA,CACZ,SACA,gBAAA,EACe;AACf,EAAA,MAAM,WAAA,GAAc,0BAA0B,OAAO,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,gBAAgB,WAAW,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,oBAAoB,WAAW,CAAA;AAUhD,EAAA,MAAM,cAAA,GAAiB,oBAAoB,OAAO,CAAA;AAGlD,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC/C,EAAA,MAAM,YAAA,GAAeE,gBAAAA,CAAgB,OAAA,CAAQ,MAAM,CAAA;AACnD,EAAA,MAAM,WAAA,GAAc,cAAc,WAAA,IAAe,YAAA;AACjD,EAAA,MAAM,UAAA,GAAa,YAAA,EAAc,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAwB,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AAE3F,EAAA,MAAM,MAAA,GAAS,GAAG,gBAAgB;;AAAA,EAEpC,WAAW;;AAAA;AAAA,EAGX,QAAQ;;AAAA,EAER,WAAW;;AAAA;AAAA,MAAA,EAGL,QAAQ,IAAI;AAAA,QAAA,EACV,UAAU;AAAA,aAAA,EACL,WAAW;AAAA,QAAA,EAChB,UAAU;AAAA,QAAA,EACV,QAAQ,MAAA,CAAO,GAAA,CAAID,YAAY,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA,EACnD,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAUZ,EAAA,OAAO;AAAA,IACH,MAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAoB,QAAA,KAAa,IAAA;AAAA,IACjC,cAAc,QAAA,EAAU;AAAA,GAC5B;AACJ;AAYO,SAAS,8BAAA,CACZ,SACA,gBAAA,EACwB;AACxB,EAAA,MAAM,WAAA,GAAc,0BAA0B,OAAO,CAAA;AACrD,EAAA,MAAM,QAAA,GAAW,gBAAgB,WAAW,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,oBAAoB,WAAW,CAAA;AAMhD,EAAA,MAAM,YAAA,GAAiC;AAAA;AAAA,IAEnC;AAAA,MACI,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,gBAAA;AAAA,MACN,aAAA,EAAe,EAAE,IAAA,EAAM,WAAA;AAAY,KACvC;AAAA;AAAA,IAEA;AAAA,MACI,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM;AAAA;AAAA,EAA6B,QAAQ,CAAA,CAAA;AAAA,MAC3C,aAAA,EAAe,EAAE,IAAA,EAAM,WAAA;AAAY;AACvC,GACJ;AAGA,EAAA,MAAM,cAAA,GAAiB,oBAAoB,OAAO,CAAA;AAGlD,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,EAAO,MAAA,GAAS,CAAA,OAAA,EAAU,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AACpF,EAAA,MAAM,cAAA,GAAiB,QAAQ,OAAA,EAAS,MAAA,GAClC,YAAY,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,GAAG,CAAA,CAAE,KAAK,SAAI,CAAA,CAAE,QAAQ,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAC7E,EAAA;AACN,EAAA,MAAM,mBAAA,GAAsB,CAAC,YAAA,EAAc,cAAc,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAGpF,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC/C,EAAA,MAAM,YAAA,GAAeC,gBAAAA,CAAgB,OAAA,CAAQ,MAAM,CAAA;AACnD,EAAA,MAAM,WAAA,GAAc,cAAc,WAAA,IAAe,YAAA;AACjD,EAAA,MAAM,UAAA,GAAa,YAAA,EAAc,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAwB,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,KAAA;AAG3F,EAAA,MAAM,UAAA,GAA+B;AAAA,IACjC;AAAA,MACI,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,CAAA;AAAA,MAAA,EACV,QAAQ,IAAI;AAAA,QAAA,EACV,UAAU;AAAA,aAAA,EACL,WAAW;AAAA,QAAA,EAChB,UAAU;AAAA,QAAA,EACV,QAAQ,MAAA,CAAO,GAAA,CAAID,YAAY,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA,EACnD,cAAc,GAAG,mBAAA,GAAsB;AAAA,EAAK,mBAAmB,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mDAAA;AAAA;AAShE,GACJ;AAEA,EAAA,OAAO;AAAA,IACH,YAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,oBAAoB,QAAA,KAAa,IAAA;AAAA,IACjC,cAAc,QAAA,EAAU;AAAA,GAC5B;AACJ;AA5PA,IAuCM,WAAA;AAvCN,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AA8BA,IAAA,wBAAA,EAAA;AACA,IAAA,yBAAA,EAAA;AAQA,IAAM,WAAA,GAAc,sBAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACvCpB,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6BAAA,GAAA;AAaA,IAAA,wBAAA,EAAA;AAYA,IAAA,yBAAA,EAAA;AAYA,IAAA,qBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACrBA,IAAM,kBAAA,GAAqB;AAAA,EACzB,IAAA;AAAA,EAAM,OAAA;AAAA,EAAS,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,IAAA;AAAA,EAAM,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS;AAC9D,CAAA;AAKA,IAAM,gBAAA,GAAmB;AAAA,EACvB,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,OAAA;AAAA,EAAS,KAAA;AAAA,EAAO,MAAA;AAAA,EAC9D,MAAA;AAAA,EAAQ,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,MAAA;AAAA,EAAQ,MAAA;AAAA,EAAQ,QAAA;AAAA,EAChD,SAAA;AAAA,EAAW,IAAA;AAAA,EAAM,WAAA;AAAA,EAAa,SAAA;AAAA,EAC9B,IAAA;AAAA,EAAM,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS,OAAA;AAAA,EAAS,QAAA;AAAA,EAChC,UAAA;AAAA,EAAY,cAAA;AAAA,EACZ,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY;AAC/C,CAAA;AAMO,SAAS,oBAAA,CAAqB,SAAiB,OAAA,EAAgC;AACpF,EAAA,MAAM,iBAAA,GAAyB,aAAQ,OAAO,CAAA;AAE9C,EAAA,MAAM,YAAY,OAAA,CAAQ,IAAA,GAAO,KAAA,CAAM,SAAS,EAAE,CAAC,CAAA;AACnD,EAAA,IAAI,gBAAA,CAAiB,QAAA,CAAS,SAAS,CAAA,EAAG;AACxC,IAAA,OAAO,qBAAqB,SAAS,CAAA,sCAAA,CAAA;AAAA,EACvC;AAGA,EAAA,MAAM,eAAA,GAAkB,6CAAA;AACxB,EAAA,IAAI,aAAA;AACJ,EAAA,OAAA,CAAQ,aAAA,GAAgB,eAAA,CAAgB,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC/D,IAAA,MAAM,UAAA,GAAa,cAAc,CAAC,CAAA;AAClC,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,MAAM,YAAA,GAAoB,aAAQ,UAAU,CAAA;AAC5C,MAAA,IAAI,CAAC,YAAA,CAAa,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAC/C,QAAA,OAAO,2CAA2C,UAAU,CAAA,uBAAA,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,4CAAA;AACnB,EAAA,IAAI,QAAA;AACJ,EAAA,OAAA,CAAQ,QAAA,GAAW,UAAA,CAAW,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AACrD,IAAA,MAAM,UAAA,GAAa,SAAS,CAAC,CAAA;AAC7B,IAAA,MAAM,YAAA,GAAoB,aAAQ,UAAU,CAAA;AAC5C,IAAA,IAAI,CAAC,YAAA,CAAa,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAC/C,MAAA,OAAO,4BAA4B,UAAU,CAAA,uBAAA,CAAA;AAAA,IAC/C;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,OAAO,kBAAA,EAAoB;AACpC,IAAA,MAAM,aAAa,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,GAAG,eAAe,GAAG,CAAA;AACzD,IAAA,IAAI,QAAA;AACJ,IAAA,OAAA,CAAQ,QAAA,GAAW,UAAA,CAAW,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AACrD,MAAA,MAAM,WAAA,GAAc,SAAS,CAAC,CAAA;AAC9B,MAAA,MAAM,UAAA,GAAa,WAAA,CAAY,KAAA,CAAM,wBAAwB,KAAK,EAAC;AACnE,MAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,QAAA,IAAI,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,UAAA,CAAW,OAAO,CAAA,EAAG;AAChE,QAAA,MAAM,YAAA,GAAoB,aAAQ,SAAS,CAAA;AAC3C,QAAA,IAAI,CAAC,YAAA,CAAa,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAC/C,UAAA,OAAO,CAAA,kBAAA,EAAqB,GAAG,CAAA,aAAA,EAAgB,SAAS,CAAA,uBAAA,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,mBAAA,GAAsB,uCAAA;AAC5B,EAAA,IAAI,KAAA;AACJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,mBAAA,CAAoB,IAAA,CAAK,OAAO,OAAO,IAAA,EAAM;AAC3D,IAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AACzB,IAAA,IAAI,SAAA,CAAU,WAAW,OAAO,CAAA,IAAK,UAAU,UAAA,CAAW,OAAO,CAAA,IAAK,SAAA,KAAc,WAAA,EAAa;AAC/F,MAAA;AAAA,IACF;AACA,IAAA,MAAM,YAAA,GAAoB,aAAQ,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,YAAA,CAAa,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAC/C,MAAA,OAAO,0BAA0B,SAAS,CAAA,uBAAA,CAAA;AAAA,IAC5C;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,MAAM,CAAA,IAAK,CAAC,QAAQ,QAAA,CAAS,CAAA,GAAA,EAAM,iBAAiB,CAAA,CAAE,CAAA,EAAG;AAC5E,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,oBAAoB,CAAA;AAClD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,QAAA,GAAgB,IAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA;AACxC,MAAA,IAAI,CAAC,QAAA,CAAS,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAC3C,QAAA,OAAO,CAAA,qBAAA,EAAwB,OAAA,CAAQ,CAAC,CAAC,CAAA,mCAAA,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,QAAA,CAAS,GAAG,KAAK,aAAA,CAAc,IAAA,CAAK,OAAO,CAAA,EAAG;AACxD,IAAA,MAAM,mBAAA,GAAsB,+BAAA;AAC5B,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA;AAC/D,IAAA,IAAI,gBAAgB,QAAA,CAAS,GAAG,KAAK,aAAA,CAAc,IAAA,CAAK,eAAe,CAAA,EAAG;AACxE,MAAA,OAAO,CAAA,uDAAA,CAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,kBAAkB,OAAA,EAAiB;AACjD,EAAA,MAAM,iBAAA,GAAyB,aAAQ,OAAO,CAAA;AAE9C,EAAA,OAAO,IAAA;AAAA,IACL,OAAO,EAAE,OAAA,EAAS,OAAA,GAAU,KAAM,KAAM;AACtC,MAAA,MAAM,eAAA,GAAkB,oBAAA,CAAqB,OAAA,EAAS,OAAO,CAAA;AAC7D,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,OAAO,eAAA;AAAA,MACT;AAEA,MAAA,OAAO,IAAI,OAAA,CAAgB,CAACE,QAAAA,KAAY;AACtC,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA;AAC/B,QAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAE1B,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,GAAA,EAAK,IAAA,EAAM;AAAA,UAC5B,GAAA,EAAK,OAAA;AAAA,UACL,KAAA,EAAO,IAAA;AAAA,UACP,OAAA;AAAA,UACA,GAAA,EAAK;AAAA,YACH,IAAA,EAAM,QAAQ,GAAA,CAAI,IAAA;AAAA,YAClB,SAAA,EAAW,QAAQ,GAAA,CAAI,SAAA;AAAA,YACvB,OAAA,EAAS,QAAQ,GAAA,CAAI,OAAA;AAAA,YACrB,OAAA,EAAS,QAAQ,GAAA,CAAI,OAAA;AAAA,YACrB,KAAA,EAAO,SAAA;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,IAAA,IAAQ,aAAA;AAAA,YAC1B,EAAA,EAAI,MAAA;AAAA,YACJ,IAAA,EAAM,iBAAA;AAAA,YACN,MAAA,EAAa,IAAA,CAAA,IAAA,CAAK,iBAAA,EAAmB,MAAM,CAAA;AAAA,YAC3C,IAAA,EAAW,IAAA,CAAA,IAAA,CAAK,iBAAA,EAAmB,MAAM,CAAA;AAAA,YACzC,GAAA,EAAU,IAAA,CAAA,IAAA,CAAK,iBAAA,EAAmB,MAAM,CAAA;AAAA,YACxC,QAAA,EAAU,WAAA;AAAA,YACV,gBAAA,EAAuB,IAAA,CAAA,IAAA,CAAK,iBAAA,EAAmB,YAAY,CAAA;AAAA,YAC3D,iBAAA,EAAmB;AAAA;AACrB,SACD,CAAA;AAED,QAAA,IAAI,MAAA,GAAS,EAAA;AACb,QAAA,IAAI,MAAA,GAAS,EAAA;AAEb,QAAA,IAAA,CAAK,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AAChC,UAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,QAC1B,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AAChC,UAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,QAC1B,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC1B,UAAAA,QAAAA,CAAQ,CAAA,yBAAA,EAA4B,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,QACrD,CAAC,CAAA;AAED,QAAA,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AACzB,UAAA,MAAM,MAAA,GAAS,UAAU,MAAA,GAAS;;AAAA;AAAA,EAAgB,MAAM,CAAA,CAAA,GAAK,EAAA,CAAA;AAC7D,UAAA,IAAI,SAAS,CAAA,EAAG;AACd,YAAAA,QAAAA,CAAQ,UAAU,4CAA4C,CAAA;AAAA,UAChE,CAAA,MAAO;AACL,YAAAA,QAAAA,CAAQ,4BAA4B,IAAI;;AAAA,EAAO,MAAM,CAAA,CAAE,CAAA;AAAA,UACzD;AAAA,QACF,CAAC,CAAA;AAED,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AACnB,UAAAA,QAAAA,CAAQ,CAAA,wBAAA,EAA2B,OAAO,CAAA,EAAA,CAAI,CAAA;AAAA,QAChD,GAAG,OAAO,CAAA;AAAA,MACZ,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,qEAAA,CAAA;AAAA,MAYb,MAAA,EAAQ,EAAE,MAAA,CAAO;AAAA,QACf,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8BAA8B,CAAA;AAAA,QAC3D,SAAS,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,0CAA0C;AAAA,OACnF;AAAA;AACH,GACF;AACF;ACtMA,IAAM,SAAA,GAAY,UAAU,IAAI,CAAA;AAKhC,IAAM,uBAAA,GAA0B,CAAA;AAUzB,SAAS,yBAAyB,OAAA,EAAiB;AACxD,EAAA,MAAM,UAAA,GAAkBC,IAAA,CAAA,IAAA,CAAK,OAAA,EAAS,aAAa,CAAA;AACnD,EAAA,IAAI,kBAAA,GAAqB,CAAA;AAEzB,EAAA,OAAOC,IAAAA;AAAA,IACL,YAAY;AACV,MAAA,kBAAA,EAAA;AAEA,MAAA,IAAI,qBAAqB,uBAAA,EAAyB;AAChD,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,IAAA;AAAA,UACT,KAAA,EAAO,KAAA;AAAA,UACP,gBAAA,EAAkB,IAAA;AAAA,UAClB,OAAA,EACE,CAAA,qCAAA,EAA8B,uBAAuB,CAAA,4CAAA,EAClB,kBAAkB,CAAA,qEAAA,CAAA;AAAA,UAEvD,cAAA,EAAgB;AAAA,SACjB,CAAA;AAAA,MACH;AAEA,MAAA,IAAI;AACF,QAAA,IAAI;AACF,UAAA,MAASC,WAAO,UAAU,CAAA;AAAA,QAC5B,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAK,SAAA,CAAU;AAAA,YACpB,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,KAAA;AAAA,YACP,iBAAA,EAAmB,kBAAA;AAAA,YACnB,QAAQ,CAAC;AAAA,cACP,IAAA,EAAM,gBAAA;AAAA,cACN,IAAA,EAAM,EAAA;AAAA,cACN,OAAA,EAAS;AAAA,aACV;AAAA,WACF,CAAA;AAAA,QACH;AAEA,QAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAM,SAAA;AAAA,UAC/B,8BAA8B,UAAU,CAAA,QAAA,CAAA;AAAA,UACxC,EAAE,SAAS,GAAA;AAAM,SACnB;AAEA,QAAA,IAAI,SAAA;AA0BJ,QAAA,IAAI;AACF,UAAA,SAAA,GAAY,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,QAC/B,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAK,SAAA,CAAU;AAAA,YACpB,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,KAAA;AAAA,YACP,iBAAA,EAAmB,kBAAA;AAAA,YACnB,QAAQ,CAAC;AAAA,cACP,IAAA,EAAM,kBAAA;AAAA,cACN,IAAA,EAAM,EAAA;AAAA,cACN,OAAA,EAAS,CAAA,oCAAA,EAAuC,MAAA,IAAU,MAAM,CAAA;AAAA,aACjE;AAAA,WACF,CAAA;AAAA,QACH;AAEA,QAAA,MAAM,QAAA,GAAW;AAAA,UACf,GAAG,SAAA;AAAA,UACH,iBAAA,EAAmB,kBAAA;AAAA,UACnB,mBAAmB,uBAAA,GAA0B,kBAAA;AAAA,UAC7C,GAAI,kBAAA,IAAsB,uBAAA,GAA0B,CAAA,IAAK,CAAC,UAAU,KAAA,GAChE;AAAA,YACE,OAAA,EACE,CAAA,kBAAA,EAAW,uBAAA,GAA0B,kBAAkB,CAAA,iCAAA;AAAA,cAE3D;AAAC,SACP;AAEA,QAAA,OAAO,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,MAChC,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAE1E,QAAA,IAAI,aAAa,QAAA,CAAS,QAAQ,KAAK,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA,EAAG;AACzE,UAAA,OAAO,KAAK,SAAA,CAAU;AAAA,YACpB,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,KAAA;AAAA,YACP,iBAAA,EAAmB,kBAAA;AAAA,YACnB,QAAQ,CAAC;AAAA,cACP,IAAA,EAAM,eAAA;AAAA,cACN,IAAA,EAAM,EAAA;AAAA,cACN,OAAA,EAAS,uEAAA;AAAA,cACT,UAAA,EAAY;AAAA,aACb;AAAA,WACF,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,KAAA;AAAA,UACP,iBAAA,EAAmB,kBAAA;AAAA,UACnB,QAAQ,CAAC;AAAA,YACP,IAAA,EAAM,kBAAA;AAAA,YACN,IAAA,EAAM,EAAA;AAAA,YACN,OAAA,EAAS,qBAAqB,YAAY,CAAA;AAAA,WAC3C;AAAA,SACF,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;;AAAA;;AAAA,yEAAA,CAAA;AAAA,MAOb,MAAA,EAAQC,CAAAA,CAAE,MAAA,CAAO,EAAE;AAAA;AACrB,GACF;AACF;ACtJkCA,EAAE,MAAA,CAAO;AAAA,EACzC,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yCAA0C,CAAA;AAAA,EAC3E,eAAA,EAAiBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,kBAAkB,CAAA;AAAA,EAC3E,iBAAA,EAAmBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,wBAAwB,CAAA;AAAA,EACnF,cAAA,EAAgBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,4BAA4B,CAAA;AAAA,EACpF,iBAAA,EAAmBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,4BAA4B,CAAA;AAAA,EACvF,wBAAwBA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yBAAyB,CAAA;AAAA,EAChF,gBAAgBA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,gCAAgC;AACjF,CAAC;ACoFM,SAAS,eAAA,CACd,UACA,OAAA,EACgB;AAChB,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA,GAAU,OAAA;AAAA,IACV,MAAA;AAAA,IACA,QAAA,GAAW,IAAA;AAAA,IACX;AAAA,GACF,GAAI,OAAA;AAGJ,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,MAAA,CAAO,mBAAmB,CAAA;AAGvD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,eAAe,QAAA,CAAS,MAAA;AAAA,IACxB,eAAe,WAAA,CAAY,MAAA;AAAA;AAAA,IAC3B,UAAA,EAAY,WAAA,CAAY,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAAA,IAClE,WAAA,EAAa,WAAA,CAAY,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ,CAAC;AAAA,GACtE;AAGA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,yDAAA;AAAA,MACP;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,aAAA,GAA+B;AAAA,MACnC,IAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA,EAAe,MAAA;AAAA,MACf,QAAA;AAAA,MACA,QAAQ,KAAA,GACJ;AAAA,QACE,KAAA,EAAO,EAAE,OAAA,EAAS,KAAA;AAAM,OAC1B,GACA,KAAA;AAAA,KACN;AAIA,IAAA,MAAM,UAAA,GAAwD,QAAA,GAC1D,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE,GACxC,KAAA,CAAA;AAEJ,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ,aAAA;AAAA,MACR,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,MAC5D;AAAA,KACF;AAAA,EACF;AACF;;;AC1DO,IAAM,QAAA,GAAsC;AAAA,EACjD,GAAA,EAAK,GAAA;AAAA,EACL,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,KAAA;AAAA,EACP,SAAA,EAAW,SAAA;AAAA,EACX,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,MAAA;AAAA,EACR,KAAA,EAAO,KAAA;AAAA,EACP,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,KAAA;AAAA,EACP,IAAA,EAAM,IAAA;AAAA,EACN,QAAA,EAAU,QAAA;AAAA,EACV,KAAA,EAAO,KAAA;AAAA,EACP,OAAA,EAAS,OAAA;AAAA,EACT,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,SAAA;AAAA,EACX,KAAA,EAAO,KAAA;AAAA,EACP,UAAA,EAAY,UAAA;AAAA,EACZ,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA;AAAA,EACN,UAAA,EAAY,UAAA;AAAA,EACZ,WAAA,EAAa,WAAA;AAAA,EACb,UAAA,EAAY,UAAA;AAAA,EACZ,QAAA,EAAU,QAAA;AAAA,EACV,SAAA,EAAW,SAAA;AAAA,EACX,aAAA,EAAe,aAAA;AAAA,EACf,MAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAM,IAAA;AAAA,EACN,MAAA,EAAQ,MAAA;AAAA,EACR,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS,OAAA;AAAA,EACT,OAAA,EAAS,OAAA;AAAA,EACT,KAAA,EAAO,KAAA;AAAA,EACP,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,KAAA;AAAA,EACP,UAAA,EAAY,UAAA;AAAA,EACZ,OAAA,EAAS,OAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,MAAA,EAAQ,MAAA;AAAA,EACR,MAAA,EAAQ,MAAA;AAAA,EACR,MAAA,EAAQ,MAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,UAAA,EAAY,UAAA;AAAA,EACZ,MAAA,EAAQ,MAAA;AAAA,EACR,WAAA,EAAa,WAAA;AAAA,EACb,UAAA,EAAY,UAAA;AAAA,EACZ,QAAA,EAAU,QAAA;AAAA,EACV,MAAA,EAAQ,MAAA;AAAA,EACR,SAAA,EAAW,SAAA;AAAA,EACX,MAAA,EAAQ,SAAA;AAAA,EACR,OAAA,EAAS,SAAA;AACX,CAAA;;;ACpKO,IAAM,QAAN,MAAY;AAAA,EAOjB,YAAY,KAAA,EAAe;AAL3B,IAAA,IAAA,CAAQ,GAAA,GAAc,CAAA;AACtB,IAAA,IAAA,CAAQ,IAAA,GAAe,CAAA;AACvB,IAAA,IAAA,CAAQ,MAAA,GAAiB,CAAA;AACzB,IAAA,IAAA,CAAQ,WAAA,GAAwB,CAAC,CAAC,CAAA;AAGhC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAoB;AAClB,IAAA,MAAM,SAAkB,EAAC;AAEzB,IAAA,OAAO,CAAC,IAAA,CAAK,OAAA,EAAQ,EAAG;AACtB,MAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,EAAU;AAC7B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAGA,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,YAAY,GAAA,EAAI;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAA,QAAA,eAA4B,EAAE,CAAC,CAAA;AAAA,IAClD;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAA,KAAA,YAAyB,EAAE,CAAC,CAAA;AAC7C,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,SAAA,GAA0B;AAEhC,IAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AACrB,MAAA,MAAM,WAAA,GAAc,KAAK,iBAAA,EAAkB;AAC3C,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAO,WAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,cAAA,EAAe;AAEpB,IAAA,IAAI,IAAA,CAAK,SAAQ,EAAG;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AAGvB,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAO,KAAK,cAAA,EAAe;AAAA,IAC7B;AAGA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,IAAA,CAAK,eAAA,EAAgB;AACrB,MAAA,OAAO,KAAK,SAAA,EAAU;AAAA,IACxB;AAGA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK;AAChC,MAAA,OAAO,IAAA,CAAK,cAAc,IAAI,CAAA;AAAA,IAChC;AAGA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG;AACtB,MAAA,OAAO,KAAK,aAAA,EAAc;AAAA,IAC5B;AAGA,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,GAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAA,OAAA,aAA2B;AAAA,MACzC,KAAK,GAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAA,OAAA,aAA2B;AAAA,MACzC,KAAK,GAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAA,MAAA,YAA0B;AAAA,MACxC,KAAK,GAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAA,KAAA,WAAyB;AAAA,MACvC,KAAK,GAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAA,MAAA,YAA0B;AAAA,MACxC,KAAK,GAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAA,UAAA,gBAA8B;AAAA,MAC5C,KAAK,GAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAA,UAAA,gBAA8B;AAAA,MAC5C,KAAK,GAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAA,QAAA,cAA4B;AAAA,MAC1C,KAAK,GAAA;AACH,QAAA,OAAO,KAAK,WAAA,CAAA,QAAA,cAA4B;AAAA,MAC1C,KAAK,GAAA;AACH,QAAA,IAAI,IAAA,CAAK,QAAA,EAAS,KAAM,GAAA,EAAK;AAC3B,UAAA,OAAO,IAAA,CAAK,aAAa,CAAA,EAAA,eAAA,qBAA0B;AAAA,QACrD;AACA,QAAA,OAAO,KAAK,WAAA,CAAA,cAAA,oBAAkC;AAAA,MAChD,KAAK,GAAA;AACH,QAAA,IAAI,IAAA,CAAK,QAAA,EAAS,KAAM,GAAA,EAAK;AAC3B,UAAA,OAAO,IAAA,CAAK,aAAa,CAAA,EAAA,YAAA,kBAAuB;AAAA,QAClD;AACA,QAAA,OAAO,KAAK,WAAA,CAAA,WAAA,iBAA+B;AAAA,MAC7C,KAAK,GAAA;AACH,QAAA,IAAI,IAAA,CAAK,QAAA,EAAS,KAAM,GAAA,EAAK;AAC3B,UAAA,OAAO,IAAA,CAAK,aAAa,CAAA,EAAA,QAAA,cAAmB;AAAA,QAC9C;AACA,QAAA;AAAA,MACF,KAAK,GAAA;AACH,QAAA,IAAI,IAAA,CAAK,QAAA,EAAS,KAAM,GAAA,EAAK;AAC3B,UAAA,OAAO,IAAA,CAAK,aAAa,CAAA,EAAA,YAAA,kBAAuB;AAAA,QAClD;AACA,QAAA;AAAA;AAIJ,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,OAAO,KAAK,kBAAA,EAAmB;AAAA,IACjC;AAGA,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,EAAG;AACtB,MAAA,OAAO,KAAK,iBAAA,EAAkB;AAAA,IAChC;AAGA,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,OAAO,KAAK,SAAA,EAAU;AAAA,EACxB;AAAA,EAEQ,kBAAA,GAA4B;AAClC,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AACnB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAGb,IAAA,IAAI,UAAA,GAAa,CAAA;AAGjB,IAAA,OAAO,CAAC,KAAK,OAAA,EAAQ,IAAK,aAAa,CAAA,IAAK,IAAA,CAAK,IAAA,EAAK,KAAM,IAAA,EAAM;AAChE,MAAA,MAAM,EAAA,GAAK,KAAK,IAAA,EAAK;AACrB,MAAA,IAAI,OAAO,GAAA,EAAK;AACd,QAAA,UAAA,EAAA;AAAA,MACF,CAAA,MAAA,IAAW,OAAO,GAAA,EAAK;AACrB,QAAA,UAAA,EAAA;AACA,QAAA,IAAI,eAAe,CAAA,EAAG;AACpB,UAAA,IAAA,CAAK,OAAA,EAAQ;AACb,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAEA,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,KAAA,EAAO,KAAK,GAAG,CAAA;AAClD,IAAA,OAAO,IAAA,CAAK,6CAAkC,KAAK,CAAA;AAAA,EACrD;AAAA,EAEQ,iBAAA,GAAkC;AACxC,IAAA,IAAI,KAAK,OAAA,EAAQ,IAAK,IAAA,CAAK,IAAA,OAAW,IAAA,EAAM;AAC1C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,OAAO,KAAK,IAAA,EAAK,KAAM,OAAO,IAAA,CAAK,IAAA,OAAW,GAAA,EAAM;AAClD,MAAA,MAAA,IAAU,IAAA,CAAK,IAAA,EAAK,KAAM,GAAA,GAAO,CAAA,GAAI,CAAA;AACrC,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAGA,IAAA,IAAI,KAAK,IAAA,EAAK,KAAM,QAAQ,IAAA,CAAK,IAAA,OAAW,GAAA,EAAK;AAC/C,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,gBAAgB,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,SAAS,CAAC,CAAA;AAElE,IAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,MAAA,IAAA,CAAK,WAAA,CAAY,KAAK,MAAM,CAAA;AAC5B,MAAA,OAAO,IAAA,CAAK,iCAA4B,EAAE,CAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,SAAS,aAAA,EAAe;AAEjC,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAA,IAC1B,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA,GAAI,MAAA,EAAQ;AAC7D,QAAA,IAAA,CAAK,YAAY,GAAA,EAAI;AAAA,MACvB;AACA,MAAA,OAAO,IAAA,CAAK,iCAA4B,EAAE,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,cAAA,GAAwB;AAC9B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAA,SAAA,gBAA6B,IAAI,CAAA;AACpD,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,IAAA,EAAA;AACL,IAAA,IAAA,CAAK,MAAA,GAAS,CAAA;AACd,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,cAAc,KAAA,EAAsB;AAC1C,IAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AACvB,IAAA,MAAM,cAAc,IAAA,CAAK,MAAA;AACzB,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA;AAEzB,IAAA,IAAA,CAAK,OAAA,EAAQ;AAEb,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,OAAO,CAAC,IAAA,CAAK,OAAA,MAAa,IAAA,CAAK,IAAA,OAAW,KAAA,EAAO;AAC/C,MAAA,IAAI,KAAK,IAAA,EAAK,KAAM,QAAQ,IAAA,CAAK,QAAA,OAAe,KAAA,EAAO;AACrD,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,KAAA,IAAS,KAAA;AAAA,MACX,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,EAAK,KAAM,IAAA,EAAM;AAE/B,QAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA,KAAA,IAAS,KAAK,IAAA,EAAK;AAAA,MACrB;AACA,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,EAAK,KAAM,KAAA,EAAO;AACzB,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAA,QAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEQ,aAAA,GAAuB;AAC7B,IAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AACvB,IAAA,MAAM,cAAc,IAAA,CAAK,MAAA;AACzB,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA;AAEzB,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAChC,MAAA,KAAA,IAAS,KAAK,OAAA,EAAQ;AAAA,IACxB;AAGA,IAAA,IAAI,IAAA,CAAK,MAAK,KAAM,GAAA,IAAO,KAAK,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,CAAA,EAAG;AACxD,MAAA,KAAA,IAAS,KAAK,OAAA,EAAQ;AACtB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AAChC,QAAA,KAAA,IAAS,KAAK,OAAA,EAAQ;AAAA,MACxB;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAA,gBAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEQ,iBAAA,GAA2B;AACjC,IAAA,MAAM,YAAY,IAAA,CAAK,IAAA;AACvB,IAAA,MAAM,cAAc,IAAA,CAAK,MAAA;AACzB,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA;AAEzB,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,IAAA,EAAM,CAAA,IAAK,IAAA,CAAK,IAAA,EAAK,KAAM,GAAA,IAAO,IAAA,CAAK,IAAA,OAAW,GAAA,EAAK;AACrF,MAAA,KAAA,IAAS,KAAK,OAAA,EAAQ;AAAA,IACxB;AAGA,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,IAAA,MAAM,WAAA,GAAc,SAAS,UAAU,CAAA;AAEvC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,WAAA,IAAA,YAAA;AAAA,MACN,KAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,WAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAAA,EACF;AAAA,EAEQ,YAAY,IAAA,EAAwB;AAC1C,IAAA,MAAM,QAAQ,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAC9C,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CAAa,OAAe,IAAA,EAAwB;AAC1D,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,MAAA,KAAA,IAAS,KAAK,OAAA,EAAQ;AAAA,IACxB;AACA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAA,EAAQ,KAAK,MAAA,GAAS,KAAA;AAAA,MACtB,MAAA,EAAQ,KAAK,GAAA,GAAM;AAAA,KACrB;AAAA,EACF;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,OAAO,CAAC,IAAA,CAAK,OAAA,EAAQ,KAAM,IAAA,CAAK,IAAA,EAAK,KAAM,GAAA,IAAO,IAAA,CAAK,IAAA,EAAK,KAAM,GAAA,CAAA,EAAO;AACvE,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,eAAA,GAAwB;AAC9B,IAAA,OAAO,CAAC,IAAA,CAAK,OAAA,MAAa,IAAA,CAAK,IAAA,OAAW,IAAA,EAAM;AAC9C,MAAA,IAAA,CAAK,OAAA,EAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,SAAA,CAAU,MAAiB,KAAA,EAAsB;AACvD,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA,EAEQ,IAAA,GAAe;AACrB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,IAAK,IAAA;AAAA,EACjC;AAAA,EAEQ,QAAA,GAAmB;AACzB,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA,IAAK,IAAA;AAAA,EACrC;AAAA,EAEQ,OAAA,GAAkB;AACxB,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,IAAA,IAAA,CAAK,GAAA,EAAA;AACL,IAAA,IAAA,CAAK,MAAA,EAAA;AACL,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,OAAA,GAAmB;AACzB,IAAA,OAAO,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,KAAA,CAAM,MAAA;AAAA,EAChC;AAAA,EAEQ,QAAQ,IAAA,EAAuB;AACrC,IAAA,OAAO,IAAA,IAAQ,OAAO,IAAA,IAAQ,GAAA;AAAA,EAChC;AAAA,EAEQ,QAAQ,IAAA,EAAuB;AACrC,IAAA,OAAQ,IAAA,IAAQ,OAAO,IAAA,IAAQ,GAAA,IACvB,QAAQ,GAAA,IAAO,IAAA,IAAQ,OACxB,IAAA,KAAS,GAAA;AAAA,EAClB;AAAA,EAEQ,eAAe,IAAA,EAAuB;AAC5C,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,EAChD;AACF,CAAA;;;ACnUO,SAAS,YAAY,IAAA,EAAyC;AACnE,EAAA,MAAM,MAA0B,EAAE,MAAA,EAAQ,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAC3D,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,EAAS;AAE9B,EAAA,IAAI,GAAA,GAAM,CAAA;AAGV,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,GAAG,KAAK,EAAE,IAAA,EAAA,KAAA,YAAqB,KAAA,EAAO,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,EAAE;AAErG,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,EAAK,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,EAAQ,CAAE,IAAA,KAAA,KAAA;AAChC,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAoB;AAChC,IAAA,OAAO,OAAA,EAAQ,CAAE,IAAA,KAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC1C,CAAA;AAGA,EAAA,IAAA,CAAA,SAAA,eAAsB;AAGtB,EAAA,MAAM,eAAe,iBAAA,EAAkB;AACvC,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAQ,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,GAAI,GAAA,CAAI,SAAS,CAAC;AAAA,QAC5C,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,MACD,UAAU;AAAC,KACb;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAuB;AAAA,IAC3B,IAAA,EAAM,QAAA;AAAA,IACN,MAAM,YAAA,CAAa,IAAA;AAAA,IACnB,aAAa,YAAA,CAAa,WAAA;AAAA,IAC1B,QAAQ,EAAC;AAAA,IACT,eAAe;AAAC,GAClB;AAEA,EAAA,IAAA,CAAA,SAAA,eAAsB;AAGtB,EAAA,OAAO,CAAC,SAAQ,EAAG;AACjB,IAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,IAAA,IAAI,SAAQ,EAAG;AAEf,IAAA,MAAM,aAAA,GAAgB,aAAa,MAAM,CAAA;AACzC,IAAA,IAAI,CAAC,aAAA,EAAe;AAElB,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,MAAA;AAAA,IACN,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,UAAU,GAAA,CAAI;AAAA,GAChB;AAMA,EAAA,SAAS,aAAa,KAAA,EAAuB;AAE3C,IAAA,IAAI,KAAA,CAAM,wCAA+B,OAAO,IAAA;AAGhD,IAAA,MAAM,kBAAA,GAAqB;AAAA,MAAA,MAAA;AAAA;AAAA,MAAA,MAAA;AAAA;AAAA,MAAA,QAAA;AAAA;AAAA,MAAA,MAAA;AAAA;AAAA,KAK3B;AACA,IAAA,OAAO,kBAAA,CAAmB,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AAAA,EAC/C;AAEA,EAAA,SAAS,iBAAA,GAAkE;AAEzE,IAAA,IAAI,OAAA,EAAQ,CAAE,IAAA,KAAA,GAAA,YAAwB,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AACrE,MAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,OAAA,EAAS,sDAAsD,CAAA;AACjF,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAA,EAAQ;AAGR,IAAA,IAAI,CAAC,YAAA,CAAa,OAAA,EAAS,CAAA,EAAG;AAC5B,MAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,OAAA,EAAS,kCAAkC,CAAA;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAA,GAAO,SAAQ,CAAE,KAAA;AACvB,IAAA,OAAA,EAAQ;AAGR,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AACnC,MAAA,GAAA,CAAI,OAAO,IAAA,CAAK,EAAE,SAAS,CAAA,iCAAA,EAAoC,IAAI,KAAK,CAAA;AACxE,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAA,EAAQ;AAGR,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AACzD,MAAA,SAAA,CAAU,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAC9B,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,WAAA,EAAa,SAAA,CAAU,IAAA,CAAK,GAAG,EAAE,IAAA;AAAK,KACxC;AAAA,EACF;AAEA,EAAA,SAAS,aAAaC,OAAAA,EAA+B;AACnD,IAAA,MAAM,QAAQ,OAAA,EAAQ;AAGtB,IAAA,IAAI,MAAM,IAAA,KAAA,QAAA,eAA2B;AACnC,MAAA,OAAA,EAAQ;AACR,MAAA,mBAAA,CAAoBA,OAAM,CAAA;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,IAAA,WAAuB;AAC/B,MAAA,OAAA,EAAQ;AACR,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,KAAA,YAAwB;AACpC,QAAA,OAAA,EAAQ;AACR,QAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,QAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,QAAA,kBAAA,CAAmBA,OAAM,CAAA;AACzB,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AACxC,QAAA,OAAA,EAAQ;AACR,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AACnC,UAAA,OAAA,EAAQ;AACR,UAAA,iBAAA,CAAkBA,SAAQ,YAAY,CAAA;AACtC,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,KAAA,YAAwB;AACpC,QAAA,OAAA,EAAQ;AACR,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AACnC,UAAA,OAAA,EAAQ;AACR,UAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,UAAA,WAAA,CAAYA,OAAM,CAAA;AAClB,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,QAAA,OAAA,EAAQ;AACR,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AACnC,UAAA,OAAA,EAAQ;AACR,UAAA,iBAAA,CAAkBA,OAAM,CAAA;AACxB,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,KAAA,YAAwB;AAChC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,QAAA,OAAA,EAAQ;AACR,QAAA,iBAAA,CAAkBA,SAAQ,UAAU,CAAA;AACpC,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,KAAA,YAAwB;AACpC,QAAA,OAAA,EAAQ;AACR,QAAA,iBAAA,CAAkBA,SAAQ,SAAS,CAAA;AACnC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAQA,EAAA,SAAS,oBAAoBA,OAAAA,EAA4B;AACvD,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACxD,MAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAGzC,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,QAAA,OAAA,EAAQ;AAAA,MACV;AAGA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,KAAA,YAAwB;AACpC,QAAA,OAAA,EAAQ;AAGR,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,UAAA,OAAA,EAAQ;AACR,UAAA,iBAAA,CAAkBA,SAAQ,UAAU,CAAA;AACpC,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,QAAQ,iBAAA,EAAkB;AAChC,QAAA,IAAI,KAAA,EAAO;AACT,UAAAA,OAAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,QAC1B;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AACxC,QAAA,OAAA,EAAQ;AACR,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AACnC,UAAA,OAAA,EAAQ;AACR,UAAA,iBAAA,CAAkBA,SAAQ,YAAY,CAAA;AACtC,UAAA;AAAA,QACF;AAAA,MACF;AAGA,MAAA,OAAO,CAAC,SAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,SAAA,kBAA8B,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAChG,QAAA,OAAA,EAAQ;AAAA,MACV;AACA,MAAA,IAAA,CAAA,SAAA,eAAsB;AAAA,IACxB;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AAKA,EAAA,SAAS,iBAAA,GAAwC;AAE/C,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,OAAA,EAAQ,CAAE,KAAK,CAAA;AAC7C,IAAA,OAAA,EAAQ;AAGR,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AAEnC,MAAA,OAAO,CAAC,SAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,SAAA,kBAA8B,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAChG,QAAA,OAAA,EAAQ;AAAA,MACV;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAA,EAAQ;AAGR,IAAA,MAAM,KAAA,GAAqB;AAAA,MACzB,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAW,MAAA;AAAA,MACX,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACR;AAGA,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,OAAO,CAAC,OAAA,EAAQ,IACT,OAAA,GAAU,IAAA,KAAA,SAAA,kBACV,OAAA,EAAQ,CAAE,IAAA,KAAA,QAAA,iBACV,SAAQ,CAAE,IAAA,KAAA,QAAA,iBACV,OAAA,EAAQ,CAAE,UAAU,MAAA,EAAQ;AACjC,MAAA,SAAA,CAAU,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAC9B,MAAA,OAAA,EAAQ;AAAA,IACV;AACA,IAAA,MAAM,WAAW,SAAA,CAAU,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAGxD,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,WAAW,CAAA,EAAG;AAClC,MAAA,KAAA,CAAM,SAAA,GAAY,WAAA;AAAA,IACpB,CAAA,MAAA,IAAW,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,QAAA,EAAU;AACvD,MAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAAA,IACpB,CAAA,MAAA,IAAW,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,SAAA,EAAW;AAC1D,MAAA,KAAA,CAAM,SAAA,GAAY,QAAA;AAAA,IACpB,CAAA,MAAA,IAAW,aAAa,UAAA,EAAY;AAClC,MAAA,KAAA,CAAM,SAAA,GAAY,UAAA;AAAA,IACpB,CAAA,MAAA,IAAW,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,SAAA,EAAW;AAC1D,MAAA,KAAA,CAAM,SAAA,GAAY,QAAA;AAAA,IACpB,CAAA,MAAA,IAAW,aAAa,MAAA,EAAQ;AAC9B,MAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAAA,IACpB,CAAA,MAAA,IAAW,QAAA,KAAa,WAAA,IAAe,QAAA,KAAa,UAAA,EAAY;AAC9D,MAAA,KAAA,CAAM,SAAA,GAAY,WAAA;AAAA,IACpB,CAAA,MAAA,IAAW,QAAA,CAAS,UAAA,CAAW,MAAM,CAAA,EAAG;AACtC,MAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAElB,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,qBAAqB,CAAA;AACtD,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,KAAA,CAAM,UAAA,GAAa,SAAA,CAAU,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,MAC9D;AAAA,IACF,CAAA,MAAA,IAAW,QAAA,KAAa,MAAA,IAAU,QAAA,KAAa,OAAA,EAAS;AACtD,MAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAAA,IACpB,CAAA,MAAA,IAAW,aAAa,QAAA,EAAU;AAChC,MAAA,KAAA,CAAM,SAAA,GAAY,QAAA;AAAA,IACpB,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAAA,IACpB;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA,OAAA,EAAQ;AACR,MAAA,OAAO,CAAC,SAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,QAAA,iBAA6B,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AAChG,QAAA,MAAM,UAAA,GAAa,OAAA,EAAQ,CAAE,KAAA,CAAM,WAAA,EAAY;AAC/C,QAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,UAAA,KAAA,CAAM,QAAA,GAAW,IAAA;AAAA,QACnB,CAAA,MAAA,IAAW,eAAe,UAAA,EAAY;AACpC,UAAA,KAAA,CAAM,QAAA,GAAW,KAAA;AAAA,QACnB,CAAA,MAAA,IAAW,eAAe,QAAA,EAAU;AAClC,UAAA,KAAA,CAAM,MAAA,GAAS,IAAA;AAAA,QACjB;AACA,QAAA,OAAA,EAAQ;AAAA,MACV;AACA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,qBAAiC,OAAA,GAAU,KAAA,CAAM,WAAA,OAAkB,MAAA,EAAQ;AACvF,MAAA,OAAA,EAAQ;AACR,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AACxC,QAAA,OAAA,EAAQ;AAER,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,UAAA,KAAA,CAAM,OAAA,GAAU,SAAQ,CAAE,KAAA;AAC1B,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA,MAAA,IAAW,OAAA,EAAQ,CAAE,IAAA,KAAA,gBAAA,uBAAmC;AACtD,UAAA,KAAA,CAAM,OAAA,GAAU,UAAA,CAAW,OAAA,EAAQ,CAAE,KAAK,CAAA;AAC1C,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA,MAAA,IAAW,OAAA,EAAQ,CAAE,IAAA,KAAA,SAAA,gBAA4B;AAC/C,UAAA,KAAA,CAAM,OAAA,GAAU,OAAA,EAAQ,CAAE,KAAA,KAAU,MAAA;AACpC,UAAA,OAAA,EAAQ;AAAA,QACV,CAAA,MAAA,IAAW,OAAA,EAAQ,CAAE,IAAA,KAAA,YAAA,mBAA+B;AAClD,UAAA,KAAA,CAAM,OAAA,GAAU,SAAQ,CAAE,KAAA;AAC1B,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,SAAS,mBAAmBA,OAAAA,EAA4B;AAEtD,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA;AAAA,IACF;AACA,IAAA,OAAA,EAAQ;AAER,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACxD,MAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAGzC,MAAA,MAAM,QAAQ,cAAA,EAAe;AAC7B,MAAA,IAAI,KAAA,EAAO;AACT,QAAAA,OAAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AAAA,MAC1B;AAEA,MAAA,IAAA,CAAA,SAAA,eAAsB;AAAA,IACxB;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AAEA,EAAA,SAAS,cAAA,GAAqC;AAE5C,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,MAAA,OAAA,EAAQ;AAAA,IACV;AAGA,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,OAAO,CAAC,SAAQ,IACT,OAAA,GAAU,IAAA,KAAA,OAAA,gBACV,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AAC3C,MAAA,SAAA,CAAU,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAC9B,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA;AAGjD,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,OAAA,cAA0B;AACtC,MAAA,GAAA,CAAI,OAAO,IAAA,CAAK,EAAE,SAAS,CAAA,+BAAA,EAAkC,SAAS,KAAK,CAAA;AAC3E,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAA,EAAQ;AAGR,IAAA,OAAO,6BAA6B,SAAS,CAAA;AAAA,EAC/C;AAEA,EAAA,SAAS,6BAA6B,SAAA,EAAgC;AACpE,IAAA,MAAM,KAAA,GAAqB;AAAA,MACzB,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA,MACN,SAAA,EAAW,MAAA;AAAA,MACX,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAM;AAAA,KACR;AAEA,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AACzD,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAC1B,MAAA,OAAA,EAAQ;AAAA,IACV;AAGA,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,CAAK,GAAG,EAAE,IAAA,EAAK;AAGrC,IAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACzB,MAAA,KAAA,CAAM,SAAA,GAAY,MAAA;AAClB,MAAA,KAAA,CAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAK,CAAC,CAAA;AACtE,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAa,CAAA;AAEnE,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAE9B,MAAA,IAAI,OAAA,KAAY,MAAA,EAAQ,KAAA,CAAM,SAAA,GAAY,MAAA;AAAA,WAAA,IACjC,OAAA,KAAY,WAAA,EAAa,KAAA,CAAM,SAAA,GAAY,WAAA;AAAA,WAAA,IAC3C,OAAA,KAAY,QAAA,EAAU,KAAA,CAAM,SAAA,GAAY,QAAA;AAAA,WAAA,IACxC,OAAA,KAAY,UAAA,EAAY,KAAA,CAAM,SAAA,GAAY,UAAA;AAAA,WAAA,IAC1C,OAAA,KAAY,MAAA,EAAQ,KAAA,CAAM,SAAA,GAAY,MAAA;AAAA,WAAA,IACtC,OAAA,KAAY,WAAA,EAAa,KAAA,CAAM,SAAA,GAAY,WAAA;AAAA,WAAA,IAC3C,OAAA,KAAY,UAAA,EAAY,KAAA,CAAM,SAAA,GAAY,UAAA;AAAA,WAAA,IAC1C,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,SAAA,QAAiB,SAAA,GAAY,QAAA;AAAA,WAAA,IACjE,OAAA,KAAY,MAAA,EAAQ,KAAA,CAAM,SAAA,GAAY,MAAA;AAAA,WAAA,IACtC,OAAA,KAAY,QAAA,EAAU,KAAA,CAAM,SAAA,GAAY,QAAA;AAAA,WAAA,IAExC,OAAA,KAAY,UAAA,EAAY,KAAA,CAAM,QAAA,GAAW,IAAA;AAAA,WAAA,IACzC,OAAA,KAAY,QAAA,EAAU,KAAA,CAAM,MAAA,GAAS,IAAA;AAAA,WAAA,IACrC,OAAA,KAAY,MAAA,EAAQ,KAAA,CAAM,IAAA,GAAO,IAAA;AAAA,WAAA,IACjC,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,EAAG;AACvC,QAAA,KAAA,CAAM,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MAC7C;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,SAAS,iBAAA,CAAkBA,SAAsB,OAAA,EAAiC;AAEhF,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,MAAM,YAAA,GAAe,SAAQ,CAAE,KAAA;AAC/B,IAAA,OAAA,EAAQ;AAER,IAAA,IAAI,KAAA;AAGJ,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AACnC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,QAAA,KAAA,GAAQ,SAAQ,CAAE,KAAA;AAClB,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF;AAEA,IAAAA,OAAAA,CAAO,cAAc,IAAA,CAAK;AAAA,MACxB,IAAA,EAAM,cAAA;AAAA,MACN,gBAAA,EAAkB,OAAA;AAAA,MAClB,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,SAAS,YAAYA,OAAAA,EAA4B;AAC/C,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AACzD,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,QAAA,MAAA,CAAO,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAAA,MAC7B;AACA,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAAA,QAAO,MAAA,GAAS,MAAA;AAAA,EAClB;AAEA,EAAA,SAAS,kBAAkBA,OAAAA,EAA4B;AACrD,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,MAAAA,OAAAA,CAAO,YAAA,GAAe,OAAA,EAAQ,CAAE,KAAA;AAChC,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AACF;AAiDO,SAAS,qBAAqB,MAAA,EAA+C;AAClF,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,IACzC,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,IAAA,EAAM,oBAAA,CAAqB,KAAA,CAAM,SAAS,CAAA;AAAA,IAC1C,QAAA,EAAU,MAAM,QAAA,IAAY,MAAA;AAAA,IAC5B,MAAA,EAAQ,MAAM,MAAA,IAAU,MAAA;AAAA,IACxB,IAAA,EAAM,MAAM,IAAA,IAAQ,MAAA;AAAA,IACpB,QAAQ,KAAA,CAAM,UAAA;AAAA;AAAA,IACd,SAAS,KAAA,CAAM;AAAA,GACjB,CAAE,CAAA;AAGF,EAAA,KAAA,MAAW,GAAA,IAAO,OAAO,aAAA,EAAe;AACtC,IAAA,IAAI,GAAA,CAAI,qBAAqB,YAAA,EAAc;AACzC,MAAA,MAAM,SAAA,GAAY,GAAA,CAAI,KAAA,GAClB,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,GAAI,IAAA,GACzB,WAAA,CAAY,GAAA,CAAI,YAAY,CAAA,GAAI,IAAA;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,IAAA,EAAM,UAAA;AAAA,QACN,QAAA,EAAU,MAAA;AAAA,QACV,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS,MAAA;AAAA,QACT,QAAA,EAAU;AAAA,UACR,QAAQ,GAAA,CAAI,YAAA;AAAA,UACZ,IAAA,EAAM;AAAA;AACR,OACM,CAAA;AAAA,IACV;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,UAAA,EAAY,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,GAAI,GAAA;AAAA,IACvC,MAAA,EAAQ,OAAO,MAAA,CAAO,CAAA,CAAA,KAAK,OAAO,IAAA,CAAK,CAAC,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AAAA,IACpD,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,cAAc,MAAA,CAAO;AAAA,GACvB;AACF;AAIA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,OAAO,IAAA,CACJ,WAAA,EAAY,CACZ,KAAA,CAAM,KAAK,CAAA,CACX,GAAA;AAAA,IAAI,CAAC,IAAA,EAAM,KAAA,KACV,KAAA,KAAU,IAAI,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,MAAM,CAAC;AAAA,GAClE,CACC,KAAK,EAAE,CAAA;AACZ;AAMA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,OAAO,IAAA,CACJ,OAAA,CAAQ,iBAAA,EAAmB,OAAO,EAClC,WAAA,EAAY;AACjB;AA0BA,SAAS,WAAW,IAAA,EAAyC;AAC3D,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AACjB,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,KAAM,MAAA,EAAQ,OAAO,IAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,KAAM,OAAA,EAAS,OAAO,KAAA;AAC3C,EAAA,MAAM,GAAA,GAAM,WAAW,IAAI,CAAA;AAC3B,EAAA,IAAI,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,GAAA;AACxB,EAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA;AACxC;AAqBA,SAAS,qBAAqB,SAAA,EAAoC;AAEhE,EAAA,MAAM,OAAA,GAA2C;AAAA,IAC/C,MAAA,EAAQ,QAAA;AAAA,IACR,WAAA,EAAa,QAAA;AAAA,IACb,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY,QAAA;AAAA,IACZ,MAAA,EAAQ,MAAA;AAAA,IACR,WAAA,EAAa,WAAA;AAAA,IACb,UAAA,EAAY,UAAA;AAAA,IACZ,QAAA,EAAU,SAAA;AAAA,IACV,MAAA,EAAQ,MAAA;AAAA,IACR,MAAA,EAAQ,OAAA;AAAA,IACR,QAAA,EAAU,QAAA;AAAA,IACV,UAAA,EAAY;AAAA,GACd;AACA,EAAA,OAAO,OAAA,CAAQ,SAAS,CAAA,IAAK,QAAA;AAC/B;;;AC5rBO,SAAS,UAAU,IAAA,EAAuC;AAC/D,EAAA,MAAM,MAAwB,EAAE,MAAA,EAAQ,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AACzD,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,EAAS;AAE9B,EAAA,IAAI,GAAA,GAAM,CAAA;AAGV,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,GAAG,KAAK,EAAE,IAAA,EAAA,KAAA,YAAqB,KAAA,EAAO,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,EAAE;AACrG,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,EAAK,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,EAAQ,CAAE,IAAA,KAAA,KAAA;AAChC,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAoB;AAChC,IAAA,OAAO,OAAA,EAAQ,CAAE,IAAA,KAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC1C,CAAA;AAGA,EAAA,IAAA,CAAA,SAAA,eAAsB;AAGtB,EAAA,MAAM,aAAa,eAAA,EAAgB;AACnC,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAQ,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,GAAI,GAAA,CAAI,SAAS,CAAC;AAAA,QAC5C,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,MACD,UAAU;AAAC,KACb;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAmB;AAAA,IACvB,IAAA,EAAM,MAAA;AAAA,IACN,MAAM,UAAA,CAAW,IAAA;AAAA,IACjB,aAAa,UAAA,CAAW,WAAA;AAAA,IACxB,OAAA,EAAS,EAAA;AAAA,IACT,GAAA,EAAK,WAAW,GAAA,IAAO,EAAA;AAAA,IACvB,eAAe,UAAA,CAAW,aAAA;AAAA,IAC1B,WAAW,UAAA,CAAW,SAAA;AAAA,IACtB,UAAU,EAAC;AAAA,IACX,SAAS;AAAC,GACZ;AAEA,EAAA,IAAA,CAAA,SAAA,eAAsB;AAGtB,EAAA,OAAO,CAAC,SAAQ,EAAG;AACjB,IAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,IAAA,IAAI,SAAQ,EAAG;AAEf,IAAA,MAAM,MAAA,GAAS,iBAAiB,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,IAAA,IAAA,CAAK,GAAA,GAAM,MAAMC,YAAAA,CAAY,IAAA,CAAK,KAAK,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAC,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,IAAA;AAAA,IACN,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,UAAU,GAAA,CAAI;AAAA,GAChB;AAIA,EAAA,SAAS,eAAA,GAA0H;AAEjI,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,MAAA,MAAM,UAAA,GAAa,SAAQ,CAAE,KAAA;AAC7B,MAAA,OAAA,EAAQ;AAGR,MAAA,MAAMC,UAAAA,GAAsB,CAAC,UAAU,CAAA;AACvC,MAAA,OAAO,OAAA,GAAU,IAAA,KAAA,YAAA,qBAAiC,OAAA,GAAU,KAAA,CAAM,WAAA,OAAkB,IAAA,EAAM;AACxF,QAAAA,UAAAA,CAAU,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAC9B,QAAA,OAAA,EAAQ;AAAA,MACV;AAGA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,qBAAiC,OAAA,GAAU,KAAA,CAAM,WAAA,OAAkB,IAAA,EAAM;AACrF,QAAA,OAAA,EAAQ;AAGR,QAAA,MAAM,YAAsB,EAAC;AAC7B,QAAA,OAAO,CAAC,SAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,OAAA,gBAA4B,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AAC/F,UAAA,SAAA,CAAU,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAC9B,UAAA,OAAA,EAAQ;AAAA,QACV;AACA,QAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,CAAK,EAAE,CAAA;AAG7B,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,OAAA,cAA0B;AACtC,UAAA,OAAA,EAAQ;AAAA,QACV;AAGA,QAAA,IAAIC,KAAAA,GAAOD,WAAU,GAAA,CAAI,CAAA,CAAA,KAAK,aAAa,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACtD,QAAA,IAAI,CAACC,KAAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AACxC,UAAAA,KAAAA,IAAQ,MAAA;AAAA,QACV;AAGA,QAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,QAAA,IAAI,aAAA;AACJ,QAAA,IAAI,SAAA;AAGJ,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,UAAA,OAAA,EAAQ;AACR,UAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACxD,YAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,YAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAGzC,YAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,cAAA,OAAA,EAAQ;AAAA,YACV;AAGA,YAAA,IAAI,OAAA,GAAU,IAAA,KAAA,OAAA,cAA0B;AACtC,cAAA,OAAA,EAAQ;AACR,cAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,gBAAA,aAAA,GAAgB,SAAQ,CAAE,KAAA;AAC1B,gBAAA,OAAA,EAAQ;AAAA,cACV;AAEA,cAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,qBAAiC,OAAA,GAAU,KAAA,CAAM,WAAA,OAAkB,OAAA,EAAS;AACxF,gBAAA,OAAA,EAAQ;AACR,gBAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,kBAAA,SAAA,GAAY,SAAQ,CAAE,KAAA;AACtB,kBAAA,OAAA,EAAQ;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAGA,YAAA,OAAO,CAAC,SAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,SAAA,kBAA8B,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAChG,cAAA,OAAA,EAAQ;AAAA,YACV;AACA,YAAA,IAAA,CAAA,SAAA,eAAsB;AAAA,UACxB;AACA,UAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF;AAEA,QAAA,OAAO;AAAA,UACL,IAAA,EAAAA,KAAAA;AAAA,UACA,WAAA,EAAa,WAAW,GAAG,CAAA,CAAA;AAAA,UAC3B,GAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IAIF;AAIA,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,KAAA,YAAwB;AACpC,MAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,OAAA,EAAS,8CAA8C,CAAA;AACzE,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAA,EAAQ;AAGR,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,OAAO,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC9C,MAAA,SAAA,CAAU,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAC9B,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,EAAE,OAAA,EAAS,kCAAkC,CAAA;AAC7D,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,IAAA,GAAO,UAAU,GAAA,CAAI,CAAA,CAAA,KAAK,aAAa,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAA;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,MAAM,CAAA,EAAG;AACxC,MAAA,IAAA,IAAQ,MAAA;AAAA,IACV;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,OAAA,cAA0B;AACtC,MAAA,GAAA,CAAI,OAAO,IAAA,CAAK,EAAE,SAAS,CAAA,kCAAA,EAAqC,IAAI,KAAK,CAAA;AACzE,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAA,EAAQ;AAGR,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AACzD,MAAA,SAAA,CAAU,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAC9B,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,WAAA,EAAa,SAAA,CAAU,IAAA,CAAK,GAAG,EAAE,IAAA;AAAK,KACxC;AAAA,EACF;AAEA,EAAA,SAAS,iBAAiBC,KAAAA,EAA2B;AACnD,IAAA,MAAM,QAAQ,OAAA,EAAQ;AAGtB,IAAA,IAAI,MAAM,IAAA,KAAA,QAAA,eAA2B;AACnC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,MAAAA,KAAAA,CAAK,gBAAgB,mBAAA,EAAoB;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,SAAA,gBAA4B;AACpC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,MAAAA,KAAAA,CAAK,UAAU,mBAAA,EAAoB;AACnC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,KAAA,YAAwB;AAChC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,MAAAA,KAAAA,CAAK,MAAM,mBAAA,EAAoB;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,IAAA,WAAuB;AAC/B,MAAA,OAAA,EAAQ;AACR,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,UAAA,iBAA6B;AACzC,QAAA,OAAA,EAAQ;AACR,QAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,QAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,QAAA,oBAAA,CAAqBA,KAAI,CAAA;AACzB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,OAAA,cAA0B;AAClC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,KAAA,YAAwB;AACpC,QAAA,OAAA,EAAQ;AACR,QAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,QAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,QAAA,mBAAA,CAAoBA,KAAI,CAAA;AACxB,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,MAAA,aAAyB;AACjC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,UAAA,iBAA6B;AACzC,QAAA,OAAA,EAAQ;AACR,QAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,QAAAA,KAAAA,CAAK,WAAW,mBAAA,EAAoB;AACpC,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,SAAS,qBAAqBA,KAAAA,EAAwB;AAEpD,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA;AAAA,IACF;AACA,IAAA,OAAA,EAAQ;AAER,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACxD,MAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAGzC,MAAA,MAAM,UAAU,gBAAA,EAAiB;AACjC,MAAA,IAAI,OAAA,EAAS;AACX,QAAAA,KAAAA,CAAK,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAAA,MAC5B;AAEA,MAAA,IAAA,CAAA,SAAA,eAAsB;AAAA,IACxB;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AAEA,EAAA,SAAS,gBAAA,GAA6C;AAEpD,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,MAAM,cAAc,mBAAA,EAAoB;AACxC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,cAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,SAAS,oBAAoBA,KAAAA,EAAwB;AAEnD,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA;AAAA,IACF;AACA,IAAA,OAAA,EAAQ;AAER,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACxD,MAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAGzC,MAAA,MAAM,SAAS,eAAA,EAAgB;AAC/B,MAAA,IAAI,MAAA,EAAQ;AACV,QAAAA,KAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,MAC1B;AAEA,MAAA,IAAA,CAAA,SAAA,eAAsB;AAAA,IACxB;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AAEA,EAAA,SAAS,eAAA,GAA2C;AAElD,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,MAAM,WAAW,mBAAA,EAAoB;AACrC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,WAAA,EAAY,CAAE,QAAQ,MAAM,CAAA;AACrD,IAAA,IAAI,YAAY,EAAA,EAAI;AAElB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,OAAA,EAAS,QAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,SAAS,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,OAAO,EAAE,IAAA,EAAK;AAAA,MACzC,QAAQ,QAAA,CAAS,KAAA,CAAM,OAAA,GAAU,CAAC,EAAE,IAAA;AAAK,KAC3C;AAAA,EACF;AAEA,EAAA,SAAS,mBAAA,GAA8B;AACrC,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AACzD,MAAA,KAAA,CAAM,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAC1B,MAAA,OAAA,EAAQ;AAAA,IACV;AACA,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK;AAAA,EAC9B;AACF;AA6DO,SAAS,mBAAmB,IAAA,EAA2C;AAE5E,EAAA,MAAM,QAAA,GAAW,yBAAA,CAA0B,IAAA,CAAK,IAAI,CAAA;AAGpD,EAAA,MAAM,gBAAgB,IAAA,CAAK,aAAA;AAE3B,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,GAAG,IAAI,IAAA,CAAK,GAAA,GAAM,CAAA,CAAA,EAAI,IAAA,CAAK,GAAG,CAAA,CAAA;AAAA,IACxD,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,WAAA;AAAA,IAC9B,UAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AAC9C,MAAA,MAAM,OAAA,GAAU,2BAAA,CAA4B,OAAA,CAAQ,WAAW,CAAA;AAC/D,MAAA,MAAM,aAAA,GAAgB,iCAAA,CAAkC,OAAA,CAAQ,WAAA,EAAa,KAAK,aAAa,CAAA;AAE/F,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,WAAW,KAAK,CAAA,CAAA;AAAA,QACpB,SAAS,OAAA,CAAQ,WAAA;AAAA,QACjB,KAAA,EAAO,KAAA;AAAA,QACP,aAAA,EAAe,QAAA;AAAA,QACf,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,OAAA;AAAA,UACN,GAAG;AAAA;AACL,OACF;AAAA,IACF,CAAC,CAAA;AAAA,IACD,QAAQ,EAAC;AAAA,IACT,aAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,EAAW,IAAA,CAAK,GAAA,KAAQ,GAAA,IAAO,KAAK,GAAA,KAAQ;AAAA,GAC9C;AACF;AAKA,SAAS,0BAA0B,IAAA,EAAsB;AACvD,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAE/B,EAAA,IAAI,MAAM,QAAA,CAAS,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AACrD,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAM,QAAA,CAAS,QAAQ,KAAK,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AACtD,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,MAAM,QAAA,CAAS,QAAQ,KAAK,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG;AACrD,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1B,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,EAAG;AAC/B,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAQA,SAAS,iCAAA,CAAkC,aAAqB,aAAA,EAAiD;AAC/G,EAAA,MAAM,KAAA,GAAQ,YAAY,WAAA,EAAY;AAItC,EAAA,MAAM,aAAa,aAAA,IAAiB,MAAA;AAGpC,EAAA,IAAI,MAAM,QAAA,CAAS,QAAQ,KAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AACvD,IAAA,MAAM,aAAa,WAAA,CAAY,KAAA,CAAM,6BAA6B,CAAA,IAChD,WAAA,CAAY,MAAM,kBAAkB,CAAA;AACtD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,GAAI;AAAA,KACtC;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,QAAA,CAAS,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AACrD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,UAAA;AAAA,MACR,UAAA,EAAY,CAAC,IAAA,EAAM,MAAA,EAAQ,WAAW;AAAA,KACxC;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,UAAA;AAAA,MACR,UAAA,EAAY,CAAC,IAAA,EAAM,MAAA,EAAQ,eAAe,WAAW;AAAA,KACvD;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AAC1B,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ;AAAA,QACN,EAAE,OAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,IAAA,EAAM,MAAA,EAAQ,UAAU,IAAA,EAAK;AAAA,QAC7D,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,aAAA,EAAe,MAAM,UAAA;AAAW;AACjE,KACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IAAK,MAAM,QAAA,CAAS,YAAY,CAAA,IACtD,KAAA,CAAM,SAAS,SAAS,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA,EAAG;AAC3D,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,UAAA;AAAA,MACR,UAAA,EAAY,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAO;AAAA,KACpC;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,UAAA;AAAA,IACR,UAAA,EAAY,CAAC,IAAA,EAAM,MAAA,EAAQ,WAAW;AAAA,GACxC;AACF;AAcA,SAAS,aAAa,IAAA,EAAsB;AAE1C,EAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,EAAG;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,aAAa,CAAA,CAAE,KAAK,EAAE,CAAA;AAAA,EAC/F;AAEA,EAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AACpD;AAEA,SAASH,aAAY,IAAA,EAAsB;AACzC,EAAA,OAAO,IAAA,CACJ,QAAQ,iBAAA,EAAmB,OAAO,EAClC,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAA,CACnB,WAAA,EAAY;AACjB;AAMA,SAAS,4BAA4B,WAAA,EAA6B;AAChE,EAAA,MAAM,KAAA,GAAQ,YAAY,WAAA,EAAY;AAGtC,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC5B,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAM,QAAA,CAAS,MAAM,KAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AACrD,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,YAAY,CAAA,IAAK,MAAM,QAAA,CAAS,OAAO,CAAA,IACtD,KAAA,CAAM,SAAS,SAAS,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA,EAAG;AAC3D,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AAC/E,IAAA,OAAO,cAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAM,QAAA,CAAS,QAAQ,KAAK,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,EAAG;AACtD,IAAA,OAAO,eAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAM,QAAA,CAAS,OAAO,KAAK,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AACtD,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,UAAU,CAAA,EAAG;AACzF,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3B,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,OAAO,aAAA;AACT;;;AC9oBO,SAAS,UAAA,CAAW,MAAc,UAAA,EAA8C;AACrF,EAAA,MAAM,GAAA,GAAyB,EAAE,UAAA,EAAY,MAAA,EAAQ,EAAC,EAAE;AAGxD,EAAA,IAAI,UAAA,GAAa,KAAK,IAAA,EAAK;AAC3B,EAAA,IAAI,UAAA,CAAW,WAAA,EAAY,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AAC9C,IAAA,UAAA,GAAa,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,EACxC;AAEA,EAAA,MAAM,SAAA,GAAY,cAAA,CAAe,UAAA,EAAY,GAAG,CAAA;AAEhD,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAQ,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,GAAI,GAAA,CAAI,SAAS,CAAC;AAAA,QAC5C,OAAA,EAAS,sCAAsC,IAAI,CAAA,CAAA;AAAA,OACpD,CAAA;AAAA,MACD,UAAU;AAAC,KACb;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,OAAA;AAAA,MACN,SAAA;AAAA,MACA,GAAA,EAAK;AAAA,KACP;AAAA,IACA,QAAQ,EAAC;AAAA,IACT,UAAU;AAAC,GACb;AACF;AAKA,SAAS,cAAA,CAAe,MAAc,GAAA,EAA+C;AACnF,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AAGjB,EAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,IAAA,EAAM,OAAO,CAAA;AAC9C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,QAAA,CAAS,IAAA,EAAM,GAAG,CAAA;AAC9C,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,QAAA,CAAS,KAAA,EAAO,GAAG,CAAA;AAChD,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,KAAA;AAAA,QACV,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,IAAA,EAAM,MAAM,CAAA;AAC5C,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,IAAA,GAAO,cAAA,CAAe,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA;AAC7C,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AAC/C,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,SAAA;AAAA,QACN,QAAA,EAAU,IAAA;AAAA,QACV,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO,cAAA,CAAe,IAAS,CAAA,IACxB,eAAA,CAAgB,MAAM,GAAG,CAAA,IACzB,eAAA,CAAgB,IAAA,EAAM,GAAG,CAAA;AAClC;AAOA,SAAS,cAAA,CAAe,MAAc,GAAA,EAAmD;AACvF,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AAGnC,EAAA,MAAM,SAAA,GAAY,SAAA,CAAU,KAAA,CAAM,qBAAqB,CAAA;AACvD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM,UAAU,CAAC;AAAA,KACnB;AAAA,EACF;AAGA,EAAA,IAAI,cAAc,gBAAA,EAAkB;AAClC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,KAAA,EAAO,WAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AASA,SAAS,eAAA,CAAgB,MAAc,GAAA,EAAoD;AACzF,EAAkB,KAAK,WAAA;AAGvB,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,0BAA0B,CAAA;AAC3D,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,aAAA,CAAc,CAAC,GAAG,GAAG,CAAA;AACvD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,KAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,uBAAuB,CAAA;AACrD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,UAAA,CAAW,CAAC,GAAG,GAAG,CAAA;AACpD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,KAAA;AAAA,QACA,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA;AAC9D,EAAA,IAAI,cAAA,EAAgB;AAElB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA;AACrD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,CAAC,CAAA,CAAE,IAAA,EAAK;AACtC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAC,CAAA,CAAE,IAAA,EAAK;AAGlC,IAAA,IAAI,CAAC,YAAY,OAAA,EAAS,KAAK,EAAE,QAAA,CAAS,KAAA,CAAM,WAAA,EAAa,CAAA,EAAG;AAC9D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,SAAA,EAAW,GAAG,CAAA;AAChD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,KAAA;AAAA,QACA,KAAA,EAAO,QAAA;AAAA,QACP,KAAA,EAAOI,YAAW,KAAK;AAAA,OACzB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAQA,SAAS,eAAA,CAAgB,MAAc,GAAA,EAAoD;AAEzF,EAAA,MAAM,SAAA,GAAiE;AAAA,IACrE,EAAE,OAAA,EAAS,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAK;AAAA,IACjD,EAAE,OAAA,EAAS,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAK;AAAA,IACjD,EAAE,OAAA,EAAS,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAK;AAAA,IACjD,EAAE,OAAA,EAAS,qBAAA,EAAuB,QAAA,EAAU,IAAA,EAAK;AAAA,IACjD,EAAE,OAAA,EAAS,oBAAA,EAAsB,QAAA,EAAU,GAAA,EAAI;AAAA,IAC/C,EAAE,OAAA,EAAS,oBAAA,EAAsB,QAAA,EAAU,GAAA;AAAI,GACjD;AAGA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA;AAC1D,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,UAAA,CAAW,CAAC,GAAG,GAAG,CAAA;AACpD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,KAAA;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,KAAA,EAAOA,WAAAA,CAAW,UAAA,CAAW,CAAC,CAAC;AAAA,OACjC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,EAAE,OAAA,EAAS,QAAA,EAAS,IAAK,SAAA,EAAW;AAC7C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,KAAA,CAAM,CAAC,GAAG,GAAG,CAAA;AAC/C,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,YAAA;AAAA,UACN,KAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA,EAAOA,WAAAA,CAAW,KAAA,CAAM,CAAC,CAAC;AAAA,SAC5B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAQA,SAAS,mBAAA,CAAoB,MAAc,GAAA,EAA+C;AACxF,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AAGjB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA;AAC5C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,iBAAA;AAAA,MACN,UAAA,EAAY,SAAS,CAAC,CAAA;AAAA,MACtB,SAAA,EAAW,SAAS,CAAC;AAAA,KACvB;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAYC,aAAY,IAAI,CAAA;AAElC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB;AAAA,GACF;AACF;AAKA,SAASD,YAAW,IAAA,EAAyC;AAC3D,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AAGjB,EAAA,IAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,KAAK,QAAA,CAAS,GAAG,CAAA,IACzC,IAAA,CAAK,WAAW,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAI;AAChD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACzB;AAGA,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,KAAM,MAAA,EAAQ,OAAO,IAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,KAAM,OAAA,EAAS,OAAO,KAAA;AAG3C,EAAA,MAAM,GAAA,GAAM,WAAW,IAAI,CAAA;AAC3B,EAAA,IAAI,CAAC,KAAA,CAAM,GAAG,CAAA,EAAG,OAAO,GAAA;AAGxB,EAAA,OAAO,IAAA;AACT;AAMA,SAASC,aAAY,IAAA,EAAsB;AACzC,EAAA,OAAO,IAAA,CACJ,WAAA,EAAY,CACZ,KAAA,CAAM,KAAK,CAAA,CACX,GAAA;AAAA,IAAI,CAAC,IAAA,EAAM,KAAA,KACV,KAAA,KAAU,IAAI,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,MAAM,CAAC;AAAA,GAClE,CACC,KAAK,EAAE,CAAA;AACZ;AAKA,SAAS,eAAA,CAAgB,MAAc,SAAA,EAA2D;AAChG,EAAA,MAAM,cAAA,GAAiB,UAAU,WAAA,EAAY;AAC7C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AAEnC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,UAAU,MAAA,GAAS,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAClE,IAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AACnB,IAAA,IAAI,SAAS,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACT,SAAS,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACd,KAAA,KAAU,KAAK,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,GAAI,cAAA,CAAe,MAAM,CAAA,KAAM,cAAA,EAAgB;AACxF,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,QACrB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,UAAU,MAAM;AAAA,OACxC;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;ACpUA,SAAS,eAAe,OAAA,EAA0B;AAChD,EAAA,OAAO,oBAAA,CAAqB,OAAO,CAAA,KAAM,IAAA;AAC3C;AAkDO,SAAS,gBAAA,CAAiB,MAAc,UAAA,EAA4B;AAEzE,EAAA,IAAI,IAAA,GAAO,KAAK,IAAA,EAAK;AAGrB,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AACxC,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,EAC5B;AAEA,EAAA,OAAO,eAAA,CAAgB,IAAS,CAAA;AAClC;AAcO,SAAS,iBAAA,CAAkB,MAAc,UAAA,EAA4B;AAE1E,EAAA,IAAI,IAAA,GAAO,KAAK,IAAA,EAAK;AAGrB,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,OAAO,CAAA,EAAG;AAC1C,IAAA,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,EAC5B;AAEA,EAAA,OAAO,WAAA,CAAY,IAAS,CAAA;AAC9B;AA4CA,SAAS,cAAc,IAAA,EAAuB;AAC5C,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,EAAA,OAAO,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,OAAA,CAAQ,WAAW,GAAG,CAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA;AACrF;AASA,SAAS,iBAAiB,IAAA,EAAqB;AAC7C,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAG1B,EAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACtD,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,iBAAiB,OAAO,CAAA;AAAA,IACjC;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAO,eAAe,OAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,IAAI,CAAA,CAAE,CAAA;AACxD;AAKA,SAAS,iBAAiB,IAAA,EAAqB;AAE7C,EAAA,IAAI,UAAA,GAAa,IAAA;AAGjB,EAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,6BAAA,EAA+B,MAAM,CAAA;AAGrE,EAAA,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,qBAAA,EAAuB,SAAS,CAAA;AAEhE,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,EAC9B,SAAS,CAAA,EAAG;AACV,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,8BAAA,EAAiC,IAAI,CAAA,CAAE,CAAA;AAAA,EACzD;AACF;AAUA,SAAS,eAAe,IAAA,EAAqB;AAC3C,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAE1B,EAAA,IAAI,CAAC,QAAQ,UAAA,CAAW,GAAG,KAAK,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAG;AACtD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAE,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,EAAE,IAAA,EAAK;AACxC,EAAA,MAAM,MAAA,GAAS,aAAa,KAAK,CAAA;AAEjC,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAO,MAAA,CAAO,IAAI,cAAc,CAAA;AAClC;AAKA,SAAS,aAAa,IAAA,EAAwB;AAC5C,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,UAAA,GAAa,EAAA;AAEjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AAEnB,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAA,IAAW,IAAA;AACX,MAAA,IAAI,SAAS,UAAA,IAAc,IAAA,CAAK,CAAA,GAAI,CAAC,MAAM,IAAA,EAAM;AAC/C,QAAA,QAAA,GAAW,KAAA;AAAA,MACb;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,EAAK;AAChC,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,OAAA,IAAW,IAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAO,SAAS,GAAA,EAAK;AAChD,MAAA,KAAA,EAAA;AACA,MAAA,OAAA,IAAW,IAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAO,SAAS,GAAA,EAAK;AAChD,MAAA,KAAA,EAAA;AACA,MAAA,OAAA,IAAW,IAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAQ,SAAS,IAAA,EAAM;AAClD,MAAA,IAAI,KAAA,KAAU,CAAA,IAAK,OAAA,CAAQ,IAAA,EAAK,EAAG;AACjC,QAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAC1B,QAAA,OAAA,GAAU,EAAA;AAAA,MACZ,CAAA,MAAA,IAAW,QAAQ,CAAA,EAAG;AACpB,QAAA,OAAA,IAAW,IAAA;AAAA,MACb;AACA,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,IAAW,IAAA;AAAA,EACb;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAK,EAAG;AAClB,IAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,eAAe,KAAA,EAAsB;AAC5C,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAG3B,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAO,eAAe,OAAO,CAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACtD,IAAA,OAAO,iBAAiB,OAAO,CAAA;AAAA,EACjC;AAGA,EAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,QAAQ,QAAA,CAAS,GAAG,CAAA,IAC/C,OAAA,CAAQ,WAAW,GAAG,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAI;AACtD,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA,EAAG;AACnC,IAAA,OAAO,WAAW,OAAO,CAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,IAAA;AAC/B,EAAA,IAAI,OAAA,KAAY,SAAS,OAAO,KAAA;AAChC,EAAA,IAAI,OAAA,KAAY,QAAQ,OAAO,IAAA;AAG/B,EAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,OAAO,OAAA;AACT;AASA,SAAS,eAAA,CAAgB,MAAc,GAAA,EAA0B;AAC/D,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AAGjB,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,iBAAiB,IAAI,CAAA;AAAA,EAC9B;AAGA,EAAA,MAAM,QAAA,GAAWC,gBAAAA,CAAgB,IAAA,EAAM,OAAO,CAAA;AAC9C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,QAAA,CAAS,IAAS,CAAA;AAC/C,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,QAAA,CAAS,KAAU,CAAA;AACjD,IAAA,OAAO,CAAC,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,OAAA,GAAUA,gBAAAA,CAAgB,IAAA,EAAM,MAAM,CAAA;AAC5C,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,OAAA,CAAQ,IAAS,CAAA;AAC9C,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,CAAQ,KAAU,CAAA;AAChD,IAAA,OAAO,CAAC,IAAA,EAAM,IAAA,EAAM,KAAK,CAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG;AACzC,IAAA,MAAM,KAAA,GAAQ,gBAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAW,CAAA;AACvD,IAAA,OAAO,CAAC,OAAO,KAAK,CAAA;AAAA,EACtB;AAGA,EAAA,IAAI,KAAK,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9C,IAAA,OAAO,gBAAgB,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAM,CAAA;AAAA,EAC/C;AAGA,EAAA,OAAOC,gBAAAA,CAAgB,IAAS,CAAA;AAClC;AAKA,SAASA,gBAAAA,CAAgB,MAAc,GAAA,EAA0B;AAE/D,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,mCAAmC,CAAA;AACnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,YAAA,CAAa,CAAC,CAAM,CAAA;AAChD,IAAA,MAAM,KAAA,GAAQH,WAAAA,CAAW,YAAA,CAAa,CAAC,CAAC,CAAA;AACxC,IAAA,OAAO,CAAC,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,kCAAkC,CAAA;AACjE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,WAAA,CAAY,CAAC,CAAM,CAAA;AAC/C,IAAA,MAAM,KAAA,GAAQA,WAAAA,CAAW,WAAA,CAAY,CAAC,CAAC,CAAA;AACvC,IAAA,OAAO,CAAC,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,uCAAuC,CAAA;AAC3E,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,gBAAA,CAAiB,CAAC,CAAM,CAAA;AACpD,IAAA,MAAM,KAAA,GAAQA,WAAAA,CAAW,gBAAA,CAAiB,CAAC,CAAC,CAAA;AAC5C,IAAA,OAAO,CAAC,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,oCAAoC,CAAA;AACrE,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,aAAA,CAAc,CAAC,CAAM,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQA,WAAAA,CAAW,aAAA,CAAc,CAAC,CAAC,CAAA;AACzC,IAAA,OAAO,CAAC,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,4BAA4B,CAAA;AAC1D,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,UAAA,CAAW,CAAC,CAAM,CAAA;AAC9C,IAAA,MAAM,KAAA,GAAQA,WAAAA,CAAW,UAAA,CAAW,CAAC,CAAC,CAAA;AACtC,IAAA,OAAO,CAAC,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAA;AACjD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAM,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQA,WAAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA;AACnC,IAAA,OAAO,CAAC,GAAA,EAAK,KAAA,EAAO,KAAK,CAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,UAAA,GAAgD;AAAA,IACpD,EAAE,OAAA,EAAS,qBAAA,EAAuB,EAAA,EAAI,IAAA,EAAK;AAAA,IAC3C,EAAE,OAAA,EAAS,qBAAA,EAAuB,EAAA,EAAI,IAAA,EAAK;AAAA,IAC3C,EAAE,OAAA,EAAS,qBAAA,EAAuB,EAAA,EAAI,IAAA,EAAK;AAAA,IAC3C,EAAE,OAAA,EAAS,qBAAA,EAAuB,EAAA,EAAI,GAAA,EAAI;AAAA,IAC1C,EAAE,OAAA,EAAS,oBAAA,EAAsB,EAAA,EAAI,GAAA,EAAI;AAAA,IACzC,EAAE,OAAA,EAAS,oBAAA,EAAsB,EAAA,EAAI,GAAA;AAAI,GAC3C;AAEA,EAAA,KAAA,MAAW,EAAE,OAAA,EAAS,EAAA,EAAG,IAAK,UAAA,EAAY;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,KAAA,CAAM,CAAC,CAAM,CAAA;AACxC,MAAA,MAAM,KAAA,GAAQA,WAAAA,CAAW,KAAA,CAAM,CAAC,CAAC,CAAA;AACjC,MAAA,OAAO,CAAC,EAAA,EAAI,IAAA,EAAM,KAAK,CAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAA,OAAO,aAAA,CAAc,IAAS,CAAA;AAChC;AAeA,SAAS,WAAA,CAAY,MAAc,GAAA,EAA0B;AAC3D,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AAGjB,EAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,IAAA,OAAO,iBAAiB,IAAI,CAAA;AAAA,EAC9B;AAGA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AAC9D,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,WAAA,CAAY,CAAC,CAAM,CAAA;AAC/C,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,WAAA,CAAY,CAAC,CAAM,CAAA;AAClD,IAAA,OAAO,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAAA,EAC7B;AAGA,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AAChE,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,KAAA,GAAQ,cAAc,CAAC,CAAA;AAC7B,IAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,aAAA,CAAc,CAAC,CAAM,CAAA;AACtD,IAAA,OAAO,CAAC,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAA;AAAA,EAChC;AAGA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,iBAAiB,CAAA;AAC9C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,CAAC,MAAA,EAAQ,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EAC9B;AAGA,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AAClE,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,CAAC,WAAA,EAAa,eAAA,CAAgB,CAAC,GAAG,IAAI,CAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,4DAA4D,CAAA;AAC/F,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,OAAA,GAAU,gBAAgB,CAAC,CAAA;AACjC,IAAA,MAAM,IAAA,GAAO,gBAAgB,CAAC,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,gBAAgB,CAAC,CAAA;AAChC,IAAA,MAAM,SAAA,GAAY,gBAAgB,CAAC,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,iBAAiB,SAAS,CAAA;AAExC,IAAA,mBAAA,CAAoB,OAAO,CAAA;AAC3B,IAAA,OAAO,CAAC,aAAa,IAAA,EAAM,EAAE,MAAM,OAAA,EAAS,MAAA,EAAQ,GAAG,KAAA,EAAO,CAAA;AAAA,EAChE;AAGA,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,KAAA,CAAM,8CAA8C,CAAA;AACnF,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,MAAM,OAAA,GAAU,kBAAkB,CAAC,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,kBAAkB,CAAC,CAAA;AAChC,IAAA,MAAM,MAAA,GAAS,kBAAkB,CAAC,CAAA;AAElC,IAAA,mBAAA,CAAoB,OAAO,CAAA;AAC3B,IAAA,OAAO,CAAC,WAAA,EAAa,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,QAAQ,CAAA;AAAA,EACtD;AAGA,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,8CAA8C,CAAA;AAClF,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,OAAA,GAAU,iBAAiB,CAAC,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,iBAAiB,CAAC,CAAA;AAC/B,IAAA,MAAM,SAAA,GAAY,iBAAiB,CAAC,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,iBAAiB,SAAS,CAAA;AAExC,IAAA,mBAAA,CAAoB,OAAO,CAAA;AAC3B,IAAA,OAAO,CAAC,aAAa,IAAA,EAAM,EAAE,MAAM,OAAA,EAAS,GAAG,OAAO,CAAA;AAAA,EACxD;AAGA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,gCAAgC,CAAA;AAC/D,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,OAAA,GAAU,YAAY,CAAC,CAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,YAAY,CAAC,CAAA;AAE1B,IAAA,mBAAA,CAAoB,OAAO,CAAA;AAC3B,IAAA,OAAO,CAAC,WAAA,EAAa,IAAA,EAAM,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,EAC9C;AAGA,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,wBAAwB,CAAA;AAC3D,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,CAAC,WAAA,EAAa,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,EACzC;AAGA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,wCAAwC,CAAA;AACxE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAMI,KAAAA,GAAO,aAAa,CAAC,CAAA;AAC3B,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,YAAA,CAAa,CAAC,CAAM,CAAA;AACpD,IAAA,OAAO,CAAC,UAAA,EAAYA,KAAAA,EAAM,MAAM,CAAA;AAAA,EAClC;AAGA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA;AACrD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,CAAC,UAAA,EAAY,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EACjC;AAGA,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,yCAAyC,CAAA;AAC5E,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO,CAAC,QAAA,EAAU,eAAA,CAAgB,CAAC,CAAA,EAAG,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,EAC1D;AAGA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,oBAAoB,CAAA;AACnD,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,CAAC,QAAA,EAAU,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EAClC;AAGA,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,2BAA2B,CAAA;AAC/D,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,MAAA,GAAS,iBAAiB,CAAC,CAAA;AACjC,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,gBAAA,CAAiB,CAAC,CAAM,CAAA;AACnD,IAAA,OAAO,CAAC,SAAA,EAAW,MAAA,EAAQ,IAAI,CAAA;AAAA,EACjC;AAGA,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,oBAAoB,CAAA;AACpD,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAO,CAAC,SAAA,EAAW,YAAA,CAAa,CAAC,CAAC,CAAA;AAAA,EACpC;AAGA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,gCAAgC,CAAA;AAClE,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,UAAA,GAAa,eAAe,CAAC,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,cAAA,CAAe,CAAC,CAAM,CAAA;AACrD,IAAA,OAAO,CAAC,OAAA,EAAS,UAAA,EAAY,KAAK,CAAA;AAAA,EACpC;AAGA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA;AAChD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,CAAC,OAAA,EAAS,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,EAChC;AAGA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AACrD,EAAA,IAAI,cAAA,IAAkB,cAAA,CAAe,CAAC,CAAA,KAAM,MAAA,EAAQ;AAClD,IAAA,OAAO,CAAC,SAAA,EAAW,aAAA,CAAc,eAAe,CAAC,CAAM,CAAC,CAAA;AAAA,EAC1D;AAGA,EAAA,IAAI,KAAK,WAAA,EAAY,KAAM,aAAa,IAAA,CAAK,WAAA,OAAkB,cAAA,EAAgB;AAC7E,IAAA,OAAO,CAAC,SAAS,CAAA;AAAA,EACnB;AAGA,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,wBAAwB,CAAA;AAC5D,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,OAAO,CAAC,cAAA,EAAgB,gBAAA,CAAiB,CAAC,CAAA,EAAG,gBAAA,CAAiB,CAAC,CAAC,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,iBAAiB,CAAA;AAC9C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,CAAC,cAAA,EAAgB,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EACtC;AAGA,EAAA,OAAO,IAAA;AACT;AAUA,SAAS,aAAA,CAAc,MAAc,GAAA,EAA2B;AAC9D,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AAGjB,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,KAAM,eAAA,EAAiB;AAC1C,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,KAAM,cAAA,EAAgB;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,KAAM,QAAA,EAAU;AACnC,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,KAAM,SAAA,EAAW;AACpC,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,WAAW,CAAA,EAAG;AAC9C,IAAA,MAAM,QAAQH,YAAAA,CAAY,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAC9C,IAAA,OAAO,YAAY,KAAK,CAAA,CAAA;AAAA,EAC1B;AAGA,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA;AACrD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,MAAA,GAAS,gBAAgB,CAAC,CAAA;AAChC,IAAA,MAAM,KAAA,GAAQA,YAAAA,CAAY,eAAA,CAAgB,CAAC,CAAC,CAAA;AAC5C,IAAA,OAAO,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAEtB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,IAAK,QAAA,CAAS,KAAK,KAAA,CAAM,CAAC,CAAC,CAAA,EAAG;AACvC,MAAA,OAAO,IAAI,IAAI,CAAA,CAAA;AAAA,IACjB;AAEA,IAAA,OAAO,WAAW,IAAI,CAAA,CAAA;AAAA,EACxB;AAGA,EAAA,MAAM,SAAA,GAAYA,aAAY,IAAI,CAAA;AAClC,EAAA,OAAO,WAAW,SAAS,CAAA,CAAA;AAC7B;AASA,SAASD,YAAW,IAAA,EAAqB;AACvC,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AAGjB,EAAA,IAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,KAAK,QAAA,CAAS,GAAG,CAAA,IACzC,IAAA,CAAK,WAAW,GAAG,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAI;AAChD,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACzB;AAGA,EAAA,IAAI,KAAK,WAAA,EAAY,KAAM,aAAa,IAAA,CAAK,WAAA,OAAkB,MAAA,EAAQ;AACrE,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,KAAM,MAAA,EAAQ,OAAO,IAAA;AAC1C,EAAA,IAAI,IAAA,CAAK,WAAA,EAAY,KAAM,OAAA,EAAS,OAAO,KAAA;AAG3C,EAAA,MAAM,GAAA,GAAM,WAAW,IAAI,CAAA;AAC3B,EAAA,IAAI,CAAC,KAAA,CAAM,GAAG,KAAK,IAAA,CAAK,KAAA,CAAM,iBAAiB,CAAA,EAAG;AAChD,IAAA,OAAO,GAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACxB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,gBAAA,CAAiB,MAAc,GAAA,EAA0B;AAChE,EAAA,IAAA,GAAO,KAAK,IAAA,EAAK;AAGjB,EAAA,IAAI,KAAK,UAAA,CAAW,GAAG,KAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9C,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,KAAK,OAAA,CAAQ,UAAA,EAAY,CAAC,KAAA,KAAU,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAG,CAAA;AAClE,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAEhC,MAAA,OAAO,wBAAwB,GAAG,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,qDAAqD,CAAA;AACxF,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,eAAA,CAAgB,CAAC,CAAM,CAAA;AACrD,IAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,eAAA,CAAgB,CAAC,CAAM,CAAA;AACtD,IAAA,MAAM,KAAA,GAAgC;AAAA,MACpC,MAAA,EAAQ,GAAA;AAAA,MACR,OAAA,EAAS,GAAA;AAAA,MACT,OAAA,EAAS,GAAA;AAAA,MACT,YAAA,EAAc;AAAA,KAChB;AACA,IAAA,OAAO,CAAC,KAAA,CAAM,eAAA,CAAgB,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,IAAK,eAAA,CAAgB,CAAC,CAAA,EAAG,IAAA,EAAM,KAAK,CAAA;AAAA,EACpF;AAGA,EAAA,IAAI,KAAK,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA,CAAK,aAAY,CAAE,UAAA,CAAW,WAAW,CAAA,IAC/D,KAAK,KAAA,CAAM,WAAW,KAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AAElD,IAAA,OAAO,aAAA,CAAc,IAAS,CAAA;AAAA,EAChC;AAGA,EAAA,OAAOA,YAAW,IAAI,CAAA;AACxB;AAKA,SAAS,wBAAwB,GAAA,EAAqB;AACpD,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,GAAA,KAAQ,MAAA,EAAW;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAE3B,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACvB,MAAA,OAAO,GAAA;AAAA,IACT;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,GAAA,CAAI,IAAI,uBAAuB,CAAA;AAAA,EACxC;AAGA,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9C,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,uBAAA,CAAwB,KAAK,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,MAAA;AACT;AASA,SAASE,gBAAAA,CAAgB,MAAc,SAAA,EAA2D;AAChG,EAAA,MAAM,cAAA,GAAiB,UAAU,WAAA,EAAY;AAC7C,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AAEnC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,IAAK,UAAU,MAAA,GAAS,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAClE,IAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AACnB,IAAA,IAAI,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAO,SAAS,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IACzC,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,IAAO,SAAS,GAAA,EAAK,KAAA,EAAA;AAAA,SAAA,IAC9C,KAAA,KAAU,KAAK,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,GAAI,cAAA,CAAe,MAAM,CAAA,KAAM,cAAA,EAAgB;AACxF,MAAA,OAAO;AAAA,QACL,MAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,EAAE,IAAA,EAAK;AAAA,QAC5B,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,SAAA,CAAU,MAAM,EAAE,IAAA;AAAK,OAC/C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,SAASD,aAAY,IAAA,EAAsB;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAG9B,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,MAAM,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,OAAO,KAAA,CACJ,GAAA;AAAA,IAAI,CAAC,IAAA,EAAM,KAAA,KACV,UAAU,CAAA,GACN,IAAA,CAAK,aAAY,GACjB,IAAA,CAAK,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,KAAK,KAAA,CAAM,CAAC,EAAE,WAAA;AAAY,GAC/D,CACC,KAAK,EAAE,CAAA;AACZ;AAKA,SAAS,gBAAgB,OAAA,EAA2B;AAClD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AAEtB,IAAA,IAAA,CAAK,IAAA,KAAS,GAAA,IAAO,IAAA,KAAS,GAAA,MAAS,CAAA,KAAM,KAAK,OAAA,CAAQ,CAAA,GAAI,CAAC,CAAA,KAAM,IAAA,CAAA,EAAO;AAC1E,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,GAAU,IAAA;AACV,QAAA,SAAA,GAAY,IAAA;AAAA,MACd,CAAA,MAAA,IAAW,SAAS,SAAA,EAAW;AAC7B,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AACA,MAAA,OAAA,IAAW,IAAA;AAAA,IACb,CAAA,MAAA,IAAW,IAAA,KAAS,GAAA,IAAO,CAAC,OAAA,EAAS;AACnC,MAAA,IAAI,OAAA,CAAQ,MAAK,EAAG;AAClB,QAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,MAC3B;AACA,MAAA,OAAA,GAAU,EAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,OAAA,IAAW,IAAA;AAAA,IACb;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,MAAK,EAAG;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,QAAQ,KAAA,EAAuB;AACtC,EAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,EAAA,IAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,IAAK,QAAQ,QAAA,CAAS,GAAG,CAAA,IAC/C,OAAA,CAAQ,WAAW,GAAG,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,EAAI;AACtD,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,OAAA;AACT;AAsBA,SAAS,eAAe,IAAA,EAAuB;AAC7C,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAG1B,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,CAAM,0CAA0C,CAAA;AACzE,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,EAAE,EAAA,EAAI,QAAA,CAAS,CAAC,CAAA,EAAG,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA,EAAG,KAAA,EAAO,QAAA,CAAS,CAAC,CAAA,EAAE;AAAA,EACnE;AAGA,EAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,KAAA,CAAM,+BAA+B,CAAA;AACxE,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,kBAAA,CAAmB,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,MAClC,KAAA,EAAO,mBAAmB,CAAC,CAAA;AAAA,MAC3B,OAAA,EAAS,mBAAmB,CAAC;AAAA,KAC/B;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,oCAAoC,CAAA;AACtE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,EAAE,KAAA,EAAO,WAAA,CAAY,CAAC,CAAA,CAAE,MAAK,EAAG,KAAA,EAAO,WAAA,CAAY,CAAC,CAAA,EAAE;AAAA,EAC/D;AAGA,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,2BAA2B,CAAA;AAC/D,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,cAAc,CAAC,CAAA;AAAA,MACxB,OAAA,EAAS,QAAA,CAAS,aAAA,CAAc,CAAC,GAAG,EAAE,CAAA;AAAA,MACtC,OAAA,EAAS,QAAA,CAAS,aAAA,CAAc,CAAC,GAAG,EAAE;AAAA,KACxC;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,qBAAqB,CAAA;AACrD,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,MACpB,OAAA,EAAS,QAAA,CAAS,SAAA,CAAU,CAAC,GAAG,EAAE;AAAA,KACpC;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,iCAAiC,CAAA;AAC/D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,OAAO,EAAE,OAAO,OAAA,CAAQ,CAAC,GAAG,KAAA,EAAO,OAAA,CAAQ,CAAC,CAAA,EAAE;AAAA,EAChD;AAGA,EAAA,OAAO,QAAQ,OAAO,CAAA;AACxB;AAKA,SAAS,eAAe,OAAA,EAA4B;AAClD,EAAA,MAAM,KAAA,GAAQ,gBAAgB,OAAO,CAAA;AACrC,EAAA,OAAO,KAAA,CAAM,IAAI,cAAc,CAAA;AACjC;AAKA,SAAS,iBAAiB,OAAA,EAA0B;AAClD,EAAA,OAAO,cAAA,CAAe,KAAK,OAAO,CAAA;AAAA,EAC3B,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,EACvB,eAAA,CAAgB,KAAK,OAAO,CAAA;AACrC;AAaA,SAAS,iBAAiB,IAAA,EAAuC;AAC/D,EAAA,MAAM,QAAiC,EAAC;AAGxC,EAAA,MAAM,UAAA,GAAa,qDAAA;AACnB,EAAA,IAAI,KAAA;AAEJ,EAAA,OAAA,CAAQ,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,IAAI,OAAO,IAAA,EAAM;AAC/C,IAAA,MAAM,GAAA,GAAM,MAAM,CAAC,CAAA;AACnB,IAAA,MAAM,YAAA,GAAe,MAAM,CAAC,CAAA;AAC5B,IAAA,MAAM,YAAA,GAAe,MAAM,CAAC,CAAA;AAC5B,IAAA,MAAM,YAAA,GAAe,MAAM,CAAC,CAAA;AAC5B,IAAA,MAAM,SAAA,GAAY,MAAM,CAAC,CAAA;AAEzB,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,MAAA,KAAA,CAAM,GAAG,CAAA,GAAI,YAAA;AAAA,IACf,CAAA,MAAA,IAAW,iBAAiB,MAAA,EAAW;AACrC,MAAA,KAAA,CAAM,GAAG,CAAA,GAAI,YAAA;AAAA,IACf,CAAA,MAAA,IAAW,iBAAiB,MAAA,EAAW;AAErC,MAAA,IAAI,gBAAA,CAAiB,YAAY,CAAA,EAAG;AAClC,QAAA,KAAA,CAAM,GAAG,CAAA,GAAI,cAAA,CAAe,YAAY,CAAA;AAAA,MAC1C,CAAA,MAAO;AAEL,QAAA,KAAA,CAAM,GAAG,CAAA,GAAI,YAAA,CAAa,KAAA,CAAM,SAAS,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,MAC9D;AAAA,IACF,CAAA,MAAA,IAAW,cAAc,MAAA,EAAW;AAElC,MAAA,IAAI,SAAA,KAAc,MAAA,EAAQ,KAAA,CAAM,GAAG,CAAA,GAAI,IAAA;AAAA,WAAA,IAC9B,SAAA,KAAc,OAAA,EAAS,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA;AAAA,WAAA,IACpC,eAAA,CAAgB,KAAK,SAAS,CAAA,QAAS,GAAG,CAAA,GAAI,WAAW,SAAS,CAAA;AAAA,WACtE,KAAA,CAAM,GAAG,CAAA,GAAI,SAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAMA,SAAS,oBAAoB,OAAA,EAAuB;AAClD,EAAA,IAAI,CAAC,cAAA,CAAe,OAAO,CAAA,EAAG;AAOhC;;;ACv/BO,SAAS,aAAA,CAAc,MAAc,UAAA,EAAiD;AAC3F,EAAA,MAAM,GAAA,GAA4B,EAAE,UAAA,EAAY,MAAA,EAAQ,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AACzE,EAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,IAAI,CAAA;AAC5B,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,EAAS;AAE9B,EAAA,IAAI,GAAA,GAAM,CAAA;AAGV,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,GAAG,KAAK,EAAE,IAAA,EAAA,KAAA,YAAqB,KAAA,EAAO,EAAA,EAAI,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,QAAQ,CAAA,EAAE;AACrG,EAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,EAAK,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,EAAQ,CAAE,IAAA,KAAA,KAAA;AAChC,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAAoB;AAChC,IAAA,OAAO,OAAA,EAAQ,CAAE,IAAA,KAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,EAC1C,CAAA;AAGA,EAAA,IAAA,CAAA,SAAA,eAAsB;AAGtB,EAAA,MAAM,eAAe,iBAAA,EAAkB;AACvC,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAQ,GAAA,CAAI,MAAA,CAAO,SAAS,CAAA,GAAI,GAAA,CAAI,SAAS,CAAC;AAAA,QAC5C,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,MACD,UAAU;AAAC,KACb;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAA2B;AAAA,IAC/B,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,YAAA;AAAA,IACN,UAAA;AAAA,IACA,QAAQ,EAAC;AAAA,IACT,YAAA,EAAc,EAAA;AAAA,IACd,aAAa,EAAC;AAAA,IACd,OAAO,EAAC;AAAA,IACR,OAAO;AAAC,GACV;AAEA,EAAA,IAAA,CAAA,SAAA,eAAsB;AAGtB,EAAA,OAAO,CAAC,SAAQ,EAAG;AACjB,IAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,IAAA,IAAI,SAAQ,EAAG;AAEf,IAAA,MAAM,MAAA,GAAS,qBAAqB,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAA,EAAQ;AAAA,IACV;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,QAAA,CAAS,YAAA,IAAgB,QAAA,CAAS,MAAA,CAAO,SAAS,CAAA,EAAG;AACxD,IAAA,QAAA,CAAS,YAAA,GAAe,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA;AAAA,EAC3C;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,QAAA;AAAA,IACN,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,UAAU,GAAA,CAAI;AAAA,GAChB;AAIA,EAAA,SAAS,iBAAA,GAAmC;AAC1C,IAAA,MAAM,YAAsB,EAAC;AAE7B,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AAEzD,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,qBAAiC,OAAA,GAAU,KAAA,CAAM,WAAA,OAAkB,QAAA,EAAU;AACzF,QAAA,OAAA,EAAQ;AACR,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,OAAA,cAA0B;AACtC,UAAA,OAAA,EAAQ;AAER,UAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,YAAA,GAAA,CAAI,UAAA,GAAa,SAAQ,CAAE,KAAA;AAC3B,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF;AACA,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,OAAA,EAAQ,CAAE,IAAA,KAAA,QAAA,iBAA6B,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAC9E,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACF;AAIA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,qBACV,OAAA,GAAU,IAAA,KAAA,WAAA,oBACV,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,QAAA,SAAA,CAAU,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAAA,MAChC;AAGA,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,EAC3B;AAEA,EAAA,SAAS,qBAAqBI,SAAAA,EAAmC;AAC/D,IAAA,MAAM,QAAQ,OAAA,EAAQ;AAGtB,IAAA,IAAI,MAAM,IAAA,KAAA,YAAA,qBAAiC,KAAA,CAAM,KAAA,CAAM,WAAA,OAAkB,QAAA,EAAU;AACjF,MAAA,OAAA,EAAQ;AACR,MAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,QAAA,GAAA,CAAI,UAAA,GAAa,SAAQ,CAAE,KAAA;AAC3B,QAAAA,SAAAA,CAAS,UAAA,GAAa,OAAA,EAAQ,CAAE,KAAA;AAChC,QAAA,OAAA,EAAQ;AAAA,MACV;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,QAAA,eAA2B;AACnC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,MAAA,eAAA,CAAgBA,SAAQ,CAAA;AACxB,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,SAAA,gBAA4B;AACpC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,QAAAA,SAAAA,CAAS,YAAA,GAAe,OAAA,EAAQ,CAAE,KAAA;AAClC,QAAA,OAAA,EAAQ;AAAA,MACV;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,aAAA,oBAAgC;AACxC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,MAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,MAAA,uBAAA,CAAwBA,SAAQ,CAAA;AAChC,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,OAAA,cAA0B;AAClC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,MAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,MAAA,iBAAA,CAAkBA,SAAQ,CAAA;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,OAAA,cAA0B;AAClC,MAAA,OAAA,EAAQ;AACR,MAAA,SAAA,CAAUA,SAAQ,CAAA;AAClB,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,MAAM,IAAA,KAAA,WAAA,kBAA8B;AACtC,MAAA,OAAA,EAAQ;AACR,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,SAAS,gBAAgBA,SAAAA,EAAgC;AACvD,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AACzD,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,QAAA,MAAA,CAAO,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAAA,MAC7B;AACA,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAAA,UAAS,MAAA,GAAS,MAAA;AAAA,EACpB;AAEA,EAAA,SAAS,wBAAwBA,SAAAA,EAAgC;AAE/D,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA,OAAA,EAAQ;AAER,MAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACxD,QAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAGzC,QAAA,IAAI,OAAA,EAAQ,CAAE,IAAA,KAAA,MAAA,eACV,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,UAAA,MAAM,aAAa,mBAAA,EAAoB;AACvC,UAAA,IAAI,UAAA,EAAY;AACd,YAAAA,SAAAA,CAAS,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAAA,UACtC;AAAA,QACF,CAAA,MAAO;AAGL,UAAA,OAAO,CAAC,SAAQ,IACT,OAAA,GAAU,IAAA,KAAA,SAAA,kBACV,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAC1C,YAAA,OAAA,EAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,OAAO,CAAC,SAAQ,IACT,OAAA,GAAU,IAAA,KAAA,OAAA,gBACV,OAAA,GAAU,IAAA,KAAA,OAAA,cAA0B;AACzC,QAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,QAAA,IAAI,SAAQ,CAAE,IAAA,KAAA,OAAA,gBACV,SAAQ,CAAE,IAAA,KAAA,OAAA,gBACV,SAAQ,EAAG;AAEf,QAAA,IAAI,OAAA,EAAQ,CAAE,IAAA,KAAA,MAAA,eACV,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,UAAA,MAAM,aAAa,mBAAA,EAAoB;AACvC,UAAA,IAAI,UAAA,EAAY;AACd,YAAAA,SAAAA,CAAS,WAAA,CAAY,IAAA,CAAK,UAAU,CAAA;AAAA,UACtC;AAAA,QACF,CAAA,MAAO;AACL,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAS,mBAAA,GAA+C;AAEtD,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,MAAA,OAAA,EAAQ;AAAA,IACV;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAA,EAAQ;AAGR,IAAA,IAAI,SAAA,GAAY,EAAA;AAChB,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,MAAA,SAAA,GAAY,SAAQ,CAAE,KAAA;AACtB,MAAA,OAAA,EAAQ;AAAA,IACV;AAGA,IAAA,IAAI,SAAA,CAAU,WAAA,EAAY,KAAM,KAAA,EAAO;AACrC,MAAA,SAAA,GAAY,GAAA;AAAA,IACd;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AACnC,MAAA,GAAA,CAAI,OAAO,IAAA,CAAK,EAAE,SAAS,CAAA,kCAAA,EAAqC,SAAS,KAAK,CAAA;AAC9E,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAA,EAAQ;AAGR,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,MAAA,OAAA,GAAU,SAAQ,CAAE,KAAA;AACpB,MAAA,OAAA,EAAQ;AAAA,IACV;AAGA,IAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,MAAA,OAAA,EAAQ;AACR,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,YAAA,mBAA+B;AAC3C,QAAA,KAAA,GAAQ,SAAQ,CAAE,KAAA;AAClB,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAA+B;AAAA,MACnC,IAAA,EAAM,YAAA;AAAA,MACN,SAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA,EAAO,MAAM,WAAA,EAAY;AAAA,MACzB,QAAQ,EAAC;AAAA,MACT,SAAS;AAAC,KACZ;AAEA,IAAA,IAAA,CAAA,SAAA,eAAsB;AAGtB,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA,OAAA,EAAQ;AAER,MAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACxD,QAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAGzC,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AACnC,UAAA,MAAM,YAAY,WAAA,EAAY;AAC9B,UAAA,MAAM,WAAA,GAAc,UAAA,CAAW,SAAA,EAAW,UAAU,CAAA;AACpD,UAAA,IAAI,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,IAAA,EAAM;AAC3C,YAAA,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAAA,UACzC;AACA,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,UAAA,OAAA,EAAQ;AACR,UAAA,MAAM,aAAa,mBAAA,EAAoB;AACvC,UAAA,MAAM,MAAA,GAAS,gBAAgB,UAAU,CAAA;AACzC,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,UAAA,CAAW,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,UAChC;AACA,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,OAAA,EAAQ,CAAE,IAAA,KAAA,SAAA,kBAA8B,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAC/E,UAAA,OAAA,EAAQ;AAAA,QACV;AAEA,QAAA,IAAA,CAAA,SAAA,eAAsB;AAAA,MACxB;AAEA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AACnC,QAAA,MAAM,YAAY,WAAA,EAAY;AAC9B,QAAA,MAAM,WAAA,GAAc,UAAA,CAAW,SAAA,EAAW,UAAU,CAAA;AACpD,QAAA,IAAI,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,IAAA,EAAM;AAC3C,UAAA,UAAA,CAAW,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,SAAS,kBAAkBA,SAAAA,EAAgC;AACzD,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA,OAAA,EAAQ;AAER,MAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACxD,QAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAGzC,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,UAAA,OAAA,EAAQ;AAAA,QACV;AAEA,QAAA,MAAM,OAAO,mBAAA,EAAoB;AACjC,QAAA,IAAI,IAAA,EAAM;AACR,UAAAA,SAAAA,CAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,QAC1B;AAEA,QAAA,IAAA,CAAA,SAAA,eAAsB;AAAA,MACxB;AAEA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAS,UAAUA,SAAAA,EAAgC;AAEjD,IAAA,MAAM,gBAA0B,EAAC;AACjC,IAAA,OAAO,CAAC,SAAQ,IACT,OAAA,GAAU,IAAA,KAAA,OAAA,gBACV,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AAC3C,MAAA,aAAA,CAAc,IAAA,CAAK,OAAA,EAAQ,CAAE,KAAK,CAAA;AAClC,MAAA,OAAA,EAAQ;AAAA,IACV;AAEA,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA;AAEvC,IAAA,IAAA,CAAA,OAAA,aAAoB;AACpB,IAAA,IAAA,CAAA,SAAA,eAAsB;AAEtB,IAAA,MAAM,IAAA,GAAmB;AAAA,MACvB,IAAA,EAAM,MAAA;AAAA,MACN,IAAA,EAAM,QAAQ,QAAA,CAAS,OAAA,CAAQ,QAAQ,GAAG,CAAA,CAAE,aAAa,CAAA,CAAA;AAAA,MACzD,QAAA;AAAA,MACA,UAAA,EAAY,cAAc,QAAQ,CAAA;AAAA,MAClC,SAAS;AAAC,KACZ;AAGA,IAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,MAAA,OAAA,EAAQ;AAER,MAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACxD,QAAA,IAAA,CAAA,SAAA,eAAsB;AACtB,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AAGzC,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,IAAA,WAAuB;AACnC,UAAA,MAAM,YAAY,WAAA,EAAY;AAC9B,UAAA,MAAM,WAAA,GAAc,UAAA,CAAW,SAAA,EAAW,UAAU,CAAA;AACpD,UAAA,IAAI,WAAA,CAAY,OAAA,IAAW,WAAA,CAAY,IAAA,EAAM;AAC3C,YAAA,IAAA,CAAK,QAAQ,WAAA,CAAY,IAAA;AAAA,UAC3B;AAAA,QACF;AAGA,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,UAAA,OAAA,EAAQ;AAAA,QACV;AAEA,QAAA,IAAI,OAAA,GAAU,IAAA,KAAA,MAAA,aAAyB;AACrC,UAAA,OAAA,EAAQ;AAAA,QACV;AAEA,QAAA,MAAM,aAAa,mBAAA,EAAoB;AACvC,QAAA,IAAI,UAAA,IAAc,OAAA,EAAQ,CAAE,IAAA,KAAA,IAAA,WAAuB;AACjD,UAAA,MAAM,MAAA,GAAS,gBAAgB,UAAU,CAAA;AACzC,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,UAC1B;AAAA,QACF;AAEA,QAAA,IAAA,CAAA,SAAA,eAAsB;AAAA,MACxB;AAEA,MAAA,IAAI,OAAA,GAAU,IAAA,KAAA,QAAA,eAA2B;AACvC,QAAA,OAAA,EAAQ;AAAA,MACV;AAAA,IACF;AAEA,IAAAA,SAAAA,CAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC1B;AAEA,EAAA,SAAS,WAAA,GAAsB;AAC7B,IAAA,OAAO,sBAAA,EAAuB;AAAA,EAChC;AAEA,EAAA,SAAS,mBAAA,GAA8B;AACrC,IAAA,OAAO,sBAAA,EAAuB;AAAA,EAChC;AASA,EAAA,SAAS,sBAAA,GAAiC;AACxC,IAAA,MAAM,QAA8C,EAAC;AACrD,IAAA,OAAO,CAAC,OAAA,EAAQ,IAAK,OAAA,GAAU,IAAA,KAAA,SAAA,gBAA4B;AACzD,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAQ,CAAE,OAAO,IAAA,EAAM,OAAA,EAAQ,CAAE,IAAA,EAAM,CAAA;AAC3D,MAAA,OAAA,EAAQ;AAAA,IACV;AAIA,IAAA,MAAM,oBAAoB,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,KAAA,UAAA;AAGvD,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA;AAGxB,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,IAAA,KAAA,MAAA,eACL,IAAA,CAAK,IAAA,KAAA,KAAA,cACL,IAAA,CAAK,IAAA,KAAA,OAAA,gBACL,IAAA,CAAK,IAAA,KAAA,OAAA,gBACL,IAAA,CAAK,IAAA,KAAA,UAAA,mBACL,IAAA,CAAK,IAAA,KAAA,QAAA;AAG3B,MAAA,MAAM,gBAAA,GAAmB,SACC,IAAA,CAAK,IAAA,KAAA,MAAA,eACL,KAAK,IAAA,KAAA,KAAA,cACL,IAAA,CAAK,sCACL,IAAA,CAAK,IAAA,KAAA,QAAA,cAAA;AAE/B,MAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAC,aAAA,IAAiB,CAAC,gBAAA,EAAkB;AAChD,QAAA,MAAA,IAAU,GAAA;AAAA,MACZ;AAGA,MAAA,IAAI,iBAAA,IAAqB,KAAK,IAAA,KAAA,QAAA,eAA2B;AACvD,QAAA,MAAA,IAAU,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,MAC1B,CAAA,MAAO;AACL,QAAA,MAAA,IAAU,IAAA,CAAK,KAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,OAAO,OAAO,IAAA,EAAK;AAAA,EACrB;AAEA,EAAA,SAAS,gBAAgBC,KAAAA,EAAmC;AAC1D,IAAA,MAAM,OAAA,GAAUA,MAAK,IAAA,EAAK;AAC1B,IAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAIlC,IAAA,IAAI,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,IAAI,MAAM,OAAA,CAAQ,MAAM,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC9C,UAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC,CAAA;AAIjC,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY,QAAA;AAAA,YACZ,WAAA,EAAa,OAAA;AAAA,YACb,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAA;AAAO;AAAA,WAC9B;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,GAAeA,KAAAA,CAAK,KAAA,CAAM,iCAAiC,CAAA;AACjE,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,SAAA;AAAA,QACZ,WAAA,EAAaA,KAAAA;AAAA,QACb,MAAA,EAAQ;AAAA,UACN,UAAA,EAAY,YAAA,CAAa,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,UACxC,MAAA,EAAQ,YAAA,CAAa,CAAC,CAAA,IAAK;AAAA;AAC7B,OACF;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiBA,KAAAA,CAAK,KAAA,CAAM,2FAA2F,CAAA;AAC7H,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,QAAA;AAAA,QACZ,WAAA,EAAaA,KAAAA;AAAA,QACb,MAAA,EAAQ;AAAA,UACN,MAAA,EAAQ,eAAe,CAAC,CAAA;AAAA,UACxB,KAAA,EAAO,eAAe,CAAC,CAAA;AAAA,UACvB,OAAA,EAAS,eAAe,CAAC,CAAA;AAAA,UACzB,IAAA,EAAM,cAAA,CAAe,CAAC,CAAA,IAAK;AAAA;AAC7B,OACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,KAAA,CAAM,kBAAkB,CAAA;AAC/C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AACtC,QAAA,OAAO;AAAA,UACL,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY,UAAU,CAAC,CAAA;AAAA,UACvB,WAAA,EAAaA,KAAAA;AAAA,UACb;AAAA,SACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,MAAM,wBAAA,GAA2BA,KAAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AAC3E,IAAA,IAAI,wBAAA,EAA0B;AAC5B,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,QAAA;AAAA,QACZ,WAAA,EAAaA,KAAAA;AAAA,QACb,MAAA,EAAQ;AAAA,UACN,SAAA,EAAW,yBAAyB,CAAC,CAAA;AAAA,UACrC,OAAA,EAAS,yBAAyB,CAAC;AAAA;AACrC,OACF;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC9B,MAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAErC,MAAA,MAAM,WAAA,GAAc,SAAA,CAAU,KAAA,CAAM,aAAa,CAAA;AACjD,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,QAAA;AAAA,QACZ,WAAA,EAAaA,KAAAA;AAAA,QACb,MAAA,EAAQ;AAAA,UACN,OAAA,EAAS,WAAA,GAAc,WAAA,CAAY,CAAC,CAAA,GAAI;AAAA;AAC1C,OACF;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAcA,KAAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AAC9D,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,KAAA;AAAA,QACZ,WAAA,EAAaA,KAAAA;AAAA,QACb,MAAA,EAAQ;AAAA,UACN,KAAA,EAAO,oBAAA,CAAqB,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,UAC1C,KAAA,EAAO,YAAY,CAAC;AAAA;AACtB,OACF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA;AACrD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,UAAA;AAAA,QACZ,WAAA,EAAaA,KAAAA;AAAA,QACb,MAAA,EAAQ;AAAA,UACN,IAAA,EAAM,SAAS,CAAC;AAAA;AAClB,OACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA;AAC7C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,MAAA;AAAA,QACZ,WAAA,EAAaA,KAAAA;AAAA,QACb,MAAA,EAAQ;AAAA,UACN,QAAA,EAAU,UAAU,CAAC,CAAA,CAAE,aAAY,CAAE,OAAA,CAAQ,QAAQ,GAAG;AAAA;AAC1D,OACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA;AAC7C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN,UAAA,EAAY,cAAA;AAAA,QACZ,WAAA,EAAaA,KAAAA;AAAA,QACb,MAAA,EAAQ;AAAA,UACN,OAAA,EAAS,UAAU,CAAC;AAAA;AACtB,OACF;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAG/B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,kBAAkBA,KAAI,CAAA;AACrC,QAAA,IAAI,MAAM,OAAA,CAAQ,MAAM,KAAK,MAAA,CAAO,CAAC,MAAM,WAAA,EAAa;AACtD,UAAA,OAAO;AAAA,YACL,IAAA,EAAM,QAAA;AAAA,YACN,UAAA,EAAY,WAAA;AAAA,YACZ,WAAA,EAAaA,KAAAA;AAAA,YACb,MAAA,EAAQ;AAAA,cACN,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,cACd,OAAA,EAAS,OAAO,CAAC;AAAA;AACnB,WACF;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAIA,IAAA,GAAA,CAAI,SAAS,IAAA,CAAK;AAAA,MAChB,OAAA,EAAS,2BAA2BA,KAAI,CAAA,8JAAA;AAAA,KACzC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,SAAS,cAAcA,KAAAA,EAAsB;AAC3C,IAAA,MAAM,KAAA,GAAQA,MAAK,WAAA,EAAY;AAG/B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,yCAAyC,CAAA;AACnE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACnC,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAEpB,MAAA,QAAQ,IAAA;AAAM,QACZ,KAAK,QAAA;AAAU,UAAA,OAAO,KAAA,GAAQ,GAAA;AAAA,QAC9B,KAAK,QAAA;AAAU,UAAA,OAAO,QAAQ,EAAA,GAAK,GAAA;AAAA,QACnC,KAAK,MAAA;AAAQ,UAAA,OAAO,KAAA,GAAQ,KAAK,EAAA,GAAK,GAAA;AAAA,QACtC,KAAK,KAAA;AAAO,UAAA,OAAO,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA,QAC1C,KAAK,MAAA;AAAQ,UAAA,OAAO,KAAA,GAAQ,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA;AACjD,IACF;AAGA,IAAA,OAAO,KAAK,EAAA,GAAK,GAAA;AAAA,EACnB;AACF;AAoEO,SAAS,uBAAuB,QAAA,EAAmD;AACxF,EAAA,MAAM,KAAA,GAAiC;AAAA;AAAA;AAAA,IAGrC,IAAA,EAAM,QAAA,CAAS,IAAA,CAAK,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAAA,IACtC,aAAa,QAAA,CAAS;AAAA,GACxB;AAGA,EAAA,IAAI,QAAA,CAAS,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC9B,IAAA,KAAA,CAAM,YAAA,GAAe;AAAA,MACnB,QAAQ,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,CAAC,OAAO,KAAA,MAAW;AAAA,QAC7C,IAAA,EAAM,KAAA;AAAA,QACN,WAAW,KAAA,KAAU,QAAA,CAAS,gBAAiB,KAAA,KAAU,CAAA,IAAK,CAAC,QAAA,CAAS;AAAA,OAC1E,CAAE,CAAA;AAAA,MACF,MAAA,EAAQ,4BAAA,CAA6B,QAAA,CAAS,WAAW,CAAA;AAAA,MACzD,WAAA,EAAa,QAAA,CAAS,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK;AACzC,QAAA,MAAM,UAAA,GAAsC;AAAA,UAC1C,MAAM,CAAA,CAAE,SAAA;AAAA,UACR,IAAI,CAAA,CAAE,OAAA;AAAA,UACN,OAAO,CAAA,CAAE;AAAA,SACX;AAGA,QAAA,IAAI,CAAA,CAAE,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAEvB,UAAA,MAAM,UAAA,GAAa,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK;AAEnC,YAAA,IAAI,EAAE,GAAA,EAAK;AACT,cAAA,OAAO,gBAAA,CAAiB,CAAA,CAAE,GAAA,EAAK,QAAA,CAAS,UAAU,CAAA;AAAA,YACpD;AACA,YAAA,OAAO,gBAAA,CAAiB,sBAAA,CAAuB,CAAC,CAAA,EAAG,SAAS,UAAU,CAAA;AAAA,UACxE,CAAC,CAAA;AAED,UAAA,UAAA,CAAW,KAAA,GAAQ,UAAA,CAAW,MAAA,KAAW,CAAA,GACrC,UAAA,CAAW,CAAC,CAAA,GACZ,CAAC,KAAA,EAAO,GAAG,UAAU,CAAA;AAAA,QAC3B;AAGA,QAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG;AACxB,UAAA,UAAA,CAAW,OAAA,GAAU,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK;AAEtC,YAAA,IAAI,CAAA,CAAE,MAAA,IAAU,WAAA,IAAe,CAAA,CAAE,MAAA,IAAU,MAAM,OAAA,CAAQ,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5E,cAAA,OAAO,EAAE,MAAA,CAAO,SAAA;AAAA,YAClB;AAEA,YAAA,OAAO,iBAAA,CAAkB,CAAA,CAAE,WAAA,EAAa,QAAA,CAAS,UAAU,CAAA;AAAA,UAC7D,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,UAAA;AAAA,MACT,CAAC;AAAA,KACH;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,CAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,KAAA,CAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACrC,MAAMC,aAAAA,CAAa,CAAA,CAAE,KAAK,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA;AAAA,MAC7C,UAAU,CAAA,CAAE,UAAA;AAAA;AAAA,MACZ,KAAA,EAAO,CAAA,CAAE,KAAA,GACL,gBAAA,CAAiB,CAAA,CAAE,KAAA,CAAM,GAAA,IAAO,sBAAA,CAAuB,CAAA,CAAE,KAAK,CAAA,EAAG,QAAA,CAAS,UAAU,CAAA,GACpF,MAAA;AAAA,MACJ,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK;AAE1B,QAAA,IAAI,CAAA,CAAE,MAAA,IAAU,WAAA,IAAe,CAAA,CAAE,MAAA,IAAU,MAAM,OAAA,CAAQ,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5E,UAAA,OAAO,EAAE,MAAA,CAAO,SAAA;AAAA,QAClB;AAEA,QAAA,OAAO,iBAAA,CAAkB,CAAA,CAAE,WAAA,EAAa,QAAA,CAAS,UAAU,CAAA;AAAA,MAC7D,CAAC;AAAA,KACH,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,OAAO,KAAA;AACT;AAIA,SAASN,aAAY,IAAA,EAAsB;AACzC,EAAA,OAAO,IAAA,CACJ,WAAA,EAAY,CACZ,KAAA,CAAM,KAAK,CAAA,CACX,GAAA;AAAA,IAAI,CAAC,IAAA,EAAM,KAAA,KACV,KAAA,KAAU,IAAI,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,MAAM,CAAC;AAAA,GAClE,CACC,KAAK,EAAE,CAAA;AACZ;AAEA,SAASM,cAAa,IAAA,EAAsB;AAG1C,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,IAAA,CACJ,MAAM,KAAK,CAAA,CACX,IAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,aAAa,CAAA,CACtE,KAAK,EAAE,CAAA;AACZ;AAEA,SAAS,6BAA6B,WAAA,EAAkE;AACtG,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AAEvC,EAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,IAAA,IAAI,EAAE,KAAA,IAAS,CAAC,OAAO,GAAA,CAAI,CAAA,CAAE,KAAK,CAAA,EAAG;AACnC,MAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,KAAA,EAAO,WAAA,CAAY,CAAA,CAAE,MAAM,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,KAAK,IAAI,CAAA,MAAO,EAAE,GAAA,EAAK,MAAK,CAAE,CAAA;AAC1E;AAEA,SAAS,YAAY,IAAA,EAAsB;AACzC,EAAA,OAAO,IAAA,CACJ,aAAY,CACZ,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,UAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,KAAgB,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA,CACxD,KAAK,GAAG,CAAA;AACb;AAMA,SAAS,uBAAuB,KAAA,EAA4B;AAE1D,EAAA,IAAI,MAAM,GAAA,EAAK;AAEb,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT;AAQA,SAAS,qBAAqB,IAAA,EAAsB;AAElD,EAAA,IAAI,KAAK,QAAA,CAAS,GAAG,KAAK,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAE5C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,GAAG,CAAA;AAAA,EACtC;AAIA,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,GAAG,CAAA;AAGjD,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG;AAC7B,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,OAAON,aAAY,IAAI,CAAA;AACzB;AC/7BA,SAAS,YAAY,IAAA,EAAuB;AAC1C,EAAA,IAAIO,qBAAAA,CAAsB,IAAI,CAAA,EAAG;AAE/B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,IAAIC,qBAAAA,CAAsB,IAAI,CAAA,EAAG;AAC/B,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAChC,IAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,OAAO,IAAA,CAAK,IAAA;AACd;AAsBO,SAAS,qBAAA,CAAsB,YAAoB,UAAA,EAAkD;AAC1G,EAAA,MAAM,SAAuB,EAAC;AAC9B,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,MAAM,WAA6B,EAAC;AAIpC,EAAA,MAAM,SAAwB,UAAA,GAAa;AAAA,IACzC,GAAG,UAAA;AAAA,IACH,UAAU,CAAC,GAAI,UAAA,CAAW,QAAA,IAAY,EAAG;AAAA,GAC3C,GAAI;AAAA,IACF,IAAA,EAAM,aAAA;AAAA,IACN,UAAU;AAAC,GACb;AAGA,EAAA,MAAM,QAAA,GAAW,oBAAoB,UAAU,CAAA;AAG/C,EAAA,MAAM,iBAAwE,EAAC;AAC/E,EAAA,MAAM,cAAqF,EAAC;AAC5F,EAAA,MAAM,eAAwF,EAAC;AAI/F,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,QAAA,EAAU;AACpC,IAAA,MAAM,MAAA,GAAS,YAAY,IAAI,CAAA;AAC/B,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,MAAA,MAAM,YAAA,GAAe,oBAAA,CAAqB,MAAA,CAAO,IAAI,CAAA;AACrD,MAAA,MAAM,MAAA,GAAiB;AAAA,QACrB,MAAM,YAAA,CAAa,IAAA;AAAA,QACnB,MAAA,EAAS,YAAA,CAAa,MAAA,IAAU,EAAC;AAAA,QACjC,WAAA,EAAa;AAAA,OACf;AACA,MAAA,cAAA,CAAe,IAAA,CAAK;AAAA,QAClB,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAAA,QAClB,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAAA,IAC9B;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAAA,EAClC;AAGA,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,EAAO;AACjC,IAAA,MAAM,MAAA,GAAS,UAAU,IAAI,CAAA;AAC7B,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,MAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,MAAA,CAAO,IAAI,CAAA;AACjD,MAAA,MAAM,IAAA,GAAa;AAAA,QACjB,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,IAAA,EAAO,WAAW,IAAA,IAAQ,GAAA;AAAA,QAC1B,eAAe,UAAA,CAAW;AAAA,OAC5B;AAGA,MAAA,IAAI,MAAA,CAAO,KAAK,SAAA,EAAW;AACzB,QAAA,IAAA,CAAK,SAAS,CAAC;AAAA,UACb,GAAA,EAAK,OAAO,IAAA,CAAK,SAAA;AAAA,UACjB,YAAA,EAAc,OAAO,IAAA,CAAK;AAAA,SAC3B,CAAA;AAAA,MACH;AAIA,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,aAAA,IAAiB,IAAA,CAAK,aAAA;AACpD,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAAA,QAClB,IAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAAA,IAC9B;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAAA,EAClC;AAGA,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,SAAA,EAAW;AAErC,IAAA,IAAI,KAAK,IAAA,EAAK,CAAE,aAAY,CAAE,UAAA,CAAW,OAAO,CAAA,EAAG;AACjD,MAAa,oBAAoB,IAAI;AAIrC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,IAAA,EAAM,EAAE,CAAA;AACrC,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,MAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,MAAA,CAAO,IAAI,CAAA;AACtD,MAAA,MAAM,KAAA,GAAe;AAAA,QACnB,MAAM,WAAA,CAAY,IAAA;AAAA,QAClB,cAAc,WAAA,CAAY;AAAA,OAC5B;AAGA,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,UAAA,IAAc,MAAA;AAC5C,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QAChB,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAAA,QAClB,KAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,MAAA,CAAO,MAAM,CAAA;AAAA,IAC9B;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,MAAA,CAAO,QAAQ,CAAA;AAAA,EAClC;AAGA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yBAAA,EAA4B,cAAA,CAAe,MAAM,CAAA,WAAA,EAAc,YAAY,MAAM,CAAA,QAAA,EAAW,YAAA,CAAa,MAAM,CAAA,OAAA,CAAS,CAAA;AACpI,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAA8B,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACxF;AACA,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yBAAA,EAA4B,YAAA,CAAa,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACpF;AAIA,EAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAoB;AACjD,EAAA,KAAA,MAAW,EAAE,IAAA,EAAK,IAAK,WAAA,EAAa;AAClC,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,aAAA,EAAe;AACrC,MAAA,KAAA,MAAW,QAAA,IAAY,KAAK,MAAA,EAAQ;AAElC,QAAA,IAAI,SAAS,GAAA,EAAK;AAEhB,UAAA,MAAM,YAAA,GAAe,QAAA,CAAS,YAAA,IAAgB,IAAA,CAAK,aAAA;AACnD,UAAA,IAAI,YAAA,EAAc;AAChB,YAAA,gBAAA,CAAiB,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,WAAA,IAAe,YAAY,CAAA;AAAA,UAC/D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,GAAA,CAAI,2CAA2C,KAAA,CAAM,IAAA,CAAK,iBAAiB,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,EAAG,CAAC,CAAA,MAAA,EAAI,CAAC,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACzI,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAI,CAAA,8FAAA,CAAgG,CAAA;AAAA,EAC9G;AAGA,EAAA,MAAM,WAAgC,EAAC;AAEvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAK,GAAI,eAAe,CAAC,CAAA;AAG/C,IAAA,MAAM,WAAA,GAAc,WAAA,CACjB,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,SAAA,KAAc,IAAA,IAAQ,CAAA,CAAE,IAAA,CAAK,kBAAkB,IAAI,CAAA,CACjE,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA;AAMlB,IAAA,MAAM,YAAA,GAA2B,YAAA,CAC9B,MAAA,CAAO,CAAA,CAAA,KAAK;AACX,MAAA,MAAM,cAAA,GAAiB,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY;AAG1C,MAAA,IAAI,CAAA,CAAE,cAAc,IAAA,EAAM;AACxB,QAAA,OAAA,CAAQ,IAAI,CAAA,+BAAA,EAA6B,CAAA,CAAE,IAAI,CAAA,iBAAA,EAAe,IAAI,CAAA,2BAAA,CAA6B,CAAA;AAC/F,QAAA,OAAO,IAAA;AAAA,MACT;AAIA,MAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,GAAA,CAAI,cAAc,CAAA;AACxD,MAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,QAAA,OAAA,CAAQ,IAAI,CAAA,+BAAA,EAA6B,CAAA,CAAE,IAAI,CAAA,iBAAA,EAAe,IAAI,CAAA,wBAAA,CAA0B,CAAA;AAC5F,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,OAAO,KAAA;AAAA,IACT,CAAC,CAAA,CACA,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,IAAI,CAAA;AAExB,IAAA,MAAM,OAAA,GAA6B;AAAA,MACjC,IAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA,EAAQ,YAAA;AAAA,MACR,KAAA,EAAO;AAAA,KACT;AAEA,IAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAGrB,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,SAAA,EAAW,UAAU,IAAI,CAAA,CAAA;AAAA,MACzB,WAAA,EAAa,QAAA;AAAA,MACb,UAAA,EAAY,YAAY,CAAC,CAAA,QAAA,CAAA;AAAA,MACzB,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAGA,EAAA,KAAA,MAAW,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,MAAU,WAAA,EAAa;AACnD,IAAA,MAAM,eAAe,cAAA,CAAe,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,SAAS,CAAA;AACvE,IAAA,MAAM,SAAA,GAAY,YAAA,IAAgB,CAAA,GAC9B,QAAA,CAAS,YAAY,CAAA,CAAE,KAAA,CAAM,SAAA,CAAU,CAAA,CAAA,KAAK,WAAA,CAAY,CAAC,CAAA,KAAM,IAAI,CAAA,GACnE,EAAA;AAEJ,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,SAAA,EAAW,QAAQ,IAAI,CAAA,CAAA;AAAA,MACvB,WAAA,EAAa,MAAA;AAAA,MACb,UAAA,EAAY,gBAAgB,CAAA,IAAK,SAAA,IAAa,IAC1C,CAAA,SAAA,EAAY,YAAY,CAAA,QAAA,EAAW,SAAS,CAAA,CAAA,CAAA,GAC5C,CAAA,aAAA,CAAA;AAAA,MACJ,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,MAAW,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,MAAU,YAAA,EAAc;AACpD,IAAA,MAAM,eAAe,cAAA,CAAe,SAAA,CAAU,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,SAAS,CAAA;AACvE,IAAA,MAAM,UAAA,GAAa,YAAA,IAAgB,CAAA,GAC/B,QAAA,CAAS,YAAY,CAAA,CAAE,MAAA,CAAO,SAAA,CAAU,CAAA,CAAA,KAAKrB,YAAAA,CAAa,CAAC,CAAA,KAAM,IAAI,CAAA,GACrE,EAAA;AAEJ,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,SAAA,EAAW,YAAY,IAAI,CAAA,CAAA;AAAA,MAC3B,WAAA,EAAa,UAAA;AAAA,MACb,UAAA,EAAY,gBAAgB,CAAA,IAAK,UAAA,IAAc,IAC3C,CAAA,SAAA,EAAY,YAAY,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA,CAAA,GAC9C,CAAA,MAAA,CAAA;AAAA,MACJ,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,kBAAA,uBAAyB,GAAA,EAAY;AAC3C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,MAAW,QAAA,IAAY,QAAQ,MAAA,EAAQ;AACrC,MAAA,MAAM,SAAA,GAAYA,aAAa,QAAQ,CAAA;AACvC,MAAA,kBAAA,CAAmB,GAAA,CAAI,SAAA,CAAU,WAAA,EAAa,CAAA;AAAA,IAChD;AAAA,EACF;AAQA,EAAA,OAAA,CAAQ,IAAI,CAAA,iBAAA,EAAoB,YAAA,CAAa,MAAM,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,IAAI,CAAA,qBAAA,CAAuB,CAAA;AACpH,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yBAAA,EAA4B,OAAA,CAAQ,IAAI,KAAK,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,UAAA,EAAa,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACxH;AAAA,EACF;AAEA,EAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAElB,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAO,MAAA,KAAW,CAAA;AAAA,IAC3B,MAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AA2MA,SAAS,oBAAoB,IAAA,EAA4E;AACvG,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,UAAU,EAAC;AAAA,IACX,OAAO,EAAC;AAAA,IACR,WAAW;AAAC,GACd;AAGA,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AAGjD,EAAA,IAAI,cAAA,GAA4D,IAAA;AAChE,EAAA,IAAI,iBAA2B,EAAC;AAEhC,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA;AAEvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,IAAA,EAAK,CAAE,WAAA,EAAY;AAGxC,IAAA,IAAI,OAAA,KAAY,YAAA,IAAgB,OAAA,KAAY,WAAA,EAAa;AACvD,MAAA,YAAA,EAAa;AACb,MAAA,cAAA,GAAiB,UAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAA,KAAY,SAAA,IAAa,OAAA,KAAY,QAAA,EAAU;AACjD,MAAA,YAAA,EAAa;AACb,MAAA,cAAA,GAAiB,OAAA;AACjB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,YAAY,aAAA,IAAiB,OAAA,KAAY,gBAC3C,OAAA,KAAY,UAAA,IAAc,YAAY,SAAA,EAAW;AACjD,MAAA,YAAA,EAAa;AACb,MAAA,cAAA,GAAiB,WAAA;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,cAAA,CAAe,KAAK,IAAI,CAAA;AAAA,EAC1B;AAGA,EAAA,YAAA,EAAa;AAGb,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AAC9F,IAAA,OAAO,mBAAmB,cAAc,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,MAAA;AAEP,EAAA,SAAS,YAAA,GAAe;AACtB,IAAA,IAAI,CAAC,cAAA,IAAkB,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AAClD,MAAA,cAAA,GAAiB,EAAC;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAC/C,IAAA,IAAI,OAAA,EAAS;AAEX,MAAA,IAAI,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,SAAS,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA;AAIzE,MAAA,IAAI,mBAAmB,UAAA,EAAY;AACjC,QAAA,KAAA,GAAQ,uBAAuB,KAAK,CAAA;AAAA,MACtC,CAAA,MAAA,IAES,mBAAmB,OAAA,EAAS;AACnC,QAAA,KAAA,GAAQ,oBAAoB,KAAK,CAAA;AAAA,MACnC,CAAA,MAAA,IAES,mBAAmB,WAAA,EAAa;AACvC,QAAA,KAAA,GAAQ,wBAAwB,KAAK,CAAA;AAAA,MACvC;AAEA,MAAA,MAAA,CAAO,cAAc,CAAA,CAAE,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,IACtC;AAEA,IAAA,cAAA,GAAiB,EAAC;AAAA,EACpB;AACF;AAKA,SAAS,uBAAuB,KAAA,EAA2B;AACzD,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,IAAA,IAAI,gBAA0B,EAAC;AAE/B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAE1B,MAAA,IAAI,qBAAqB,IAAA,CAAK,OAAO,CAAA,IAAK,aAAA,CAAc,SAAS,CAAA,EAAG;AAElE,QAAA,MAAA,CAAO,KAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,CAAE,MAAM,CAAA;AAC3C,QAAA,aAAA,GAAgB,CAAC,IAAI,CAAA;AAAA,MACvB,CAAA,MAAO;AACL,QAAA,aAAA,CAAc,KAAK,IAAI,CAAA;AAAA,MACzB;AAAA,IACF;AAGA,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,KAAK,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA,CAAE,MAAM,CAAA;AAAA,IAC7C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA;AAC7B;AAKA,SAAS,oBAAoB,KAAA,EAA2B;AACtD,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,IAAA,IAAI,cAAwB,EAAC;AAE7B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAE1B,MAAA,IAAI,2BAA2B,IAAA,CAAK,OAAO,CAAA,IAAK,WAAA,CAAY,SAAS,CAAA,EAAG;AAEtE,QAAA,MAAA,CAAO,KAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,CAAE,MAAM,CAAA;AACzC,QAAA,WAAA,GAAc,CAAC,IAAI,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,MACvB;AAAA,IACF;AAGA,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,KAAK,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,CAAE,MAAM,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA;AAC7B;AAKA,SAAS,wBAAwB,KAAA,EAA2B;AAC1D,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,IAAA,IAAI,kBAA4B,EAAC;AAEjC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAE1B,MAAA,IAAA,CAAK,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA,IAAK,YAAA,CAAa,KAAK,OAAO,CAAA,KAAM,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AAErG,QAAA,MAAA,CAAO,KAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,CAAE,MAAM,CAAA;AAC7C,QAAA,eAAA,GAAkB,CAAC,IAAI,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,eAAA,CAAgB,KAAK,IAAI,CAAA;AAAA,MAC3B;AAAA,IACF;AAGA,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,MAAA,CAAO,KAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,CAAE,MAAM,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA;AAC7B;AAKA,SAAS,mBAAmB,IAAA,EAA4E;AACtG,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,UAAU,EAAC;AAAA,IACX,OAAO,EAAC;AAAA,IACR,WAAW;AAAC,GACd;AAGA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,SAAS,EAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAA,CAAE,MAAA,CAAO,CAAC,MAAM,CAAC,CAAA;AAE3E,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,YAAY,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,EAAE,WAAA,EAAY;AAGrD,IAAA,IAAI,SAAA,CAAU,KAAA,CAAM,iBAAiB,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAC9B,CAAA,MAAA,IAES,SAAA,CAAU,KAAA,CAAM,mBAAmB,CAAA,EAAG;AAC7C,MAAA,MAAA,CAAO,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,IAC3B,CAAA,MAAA,IAES,SAAA,CAAU,KAAA,CAAM,WAAW,CAAA,EAAG;AACrC,MAAA,MAAA,CAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,IAC/B,CAAA,MAAA,IAES,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,SAAS,CAAA,IAC/C,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,cAAc,CAAA,EAAG;AAChD,MAAA,MAAA,CAAO,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,IAC/B,WAES,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AAClD,MAAA,MAAA,CAAO,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAC9B,WACS,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,cAAc,CAAA,EAAG;AACvD,MAAA,MAAA,CAAO,KAAA,CAAM,KAAK,OAAO,CAAA;AAAA,IAC3B,CAAA,MACK;AAEH,MAAA,MAAA,CAAO,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,oBAAoB,IAAA,EAA8C;AACzE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,EAAK,CAAE,MAAM,IAAI,CAAA;AACpC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAGhC,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,KAAA,CAAM,oBAAoB,CAAA;AAC1D,EAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,EAAA,MAAM,WAAA,GAAc,cAAc,CAAC,CAAA;AACnC,EAAA,MAAM,UAAA,GAAa,kBAAkB,WAAW,CAAA;AAGhD,EAAA,MAAM,QAAA,GAAW,YACd,KAAA,CAAM,KAAK,EACX,GAAA,CAAI,CAAA,IAAA,KAAQ,KAAK,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,KAAK,KAAA,CAAM,CAAC,EAAE,WAAA,EAAa,CAAA,CACtE,IAAA,CAAK,EAAE,CAAA;AAEV,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,IAAA,EAAM,QAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,SAAS;AAAC;AAAA,GACZ;AAGA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAE3B,IAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,UAAA,CAAW,KAAK,CAAA,EAAG;AACxC,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AAAA,IAClC,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAC/B,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,CAAC,EAAE,IAAA,EAAK;AACtC,MAAA,MAAM,MAAA,GAAS,oBAAoB,UAAU,CAAA;AAC7C,MAAA,IAAI,MAAA,EAAQ;AACV,QAAC,IAAA,CAAK,OAAA,CAA6B,IAAA,CAAK,MAAM,CAAA;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,kBAAkB,IAAA,EAAsB;AAC/C,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAE/B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,yCAAyC,CAAA;AACnE,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AAEpB,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAK,QAAA;AAAU,QAAA,OAAO,KAAA,GAAQ,GAAA;AAAA,MAC9B,KAAK,QAAA;AAAU,QAAA,OAAO,QAAQ,EAAA,GAAK,GAAA;AAAA,MACnC,KAAK,MAAA;AAAQ,QAAA,OAAO,KAAA,GAAQ,KAAK,EAAA,GAAK,GAAA;AAAA,MACtC,KAAK,KAAA;AAAO,QAAA,OAAO,KAAA,GAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA,MAC1C,KAAK,MAAA;AAAQ,QAAA,OAAO,KAAA,GAAQ,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AAAA;AACjD,EACF;AAGA,EAAA,OAAO,KAAK,EAAA,GAAK,GAAA;AACnB;AAMA,SAAS,oBAAoB,IAAA,EAAgC;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,kBAAkB,IAAI,CAAA;AAGrC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACp0BA,IAAMsB,UAAAA,GAAYC,UAAUC,IAAI,CAAA;AAKhC,eAAe,uBAAuB,OAAA,EAA6C;AACjF,EAAA,MAAM,WAAA,GAAmBC,IAAA,CAAA,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAElD,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAASC,GAAA,CAAA,IAAA,CAAK,WAAW,CAAA;AACzC,IAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,EAAY,EAAG;AAC1B,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,KAAA,GAAQ,MAASA,GAAA,CAAA,OAAA,CAAQ,WAAW,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,OAAO,CAAC,CAAA;AAEzD,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,MAASA,GAAA,CAAA,QAAA,CAAcD,UAAK,WAAA,EAAa,IAAI,GAAG,OAAO,CAAA;AACvE,MAAA,QAAA,CAAS,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,IACnC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,eAAe,sBAAsB,UAAA,EAKlC;AACD,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAMH,UAAAA;AAAA,MACvB,qBAAqB,UAAU,CAAA,QAAA,CAAA;AAAA,MAC/B,EAAE,SAAS,GAAA;AAAM,KACnB;AACA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU,EAAC;AAAA,MAC1B,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,EAAC;AAAA,MAC9B,OAAO,MAAA,CAAO;AAAA,KAChB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,CAAC,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,EAAA,EAAI,OAAA,EAAS,CAAA,sBAAA,EAAyB,YAAY,CAAA,CAAA,EAAI,CAAA;AAAA,MAC1F,UAAU;AAAC,KACb;AAAA,EACF;AACF;AASO,SAAS,qBAAqB,OAAA,EAA6B;AAChE,EAAA,OAAOlB,IAAAA;AAAA,IACL,OAAO,KAAA,KAAU;AACf,MAAA,IAAI,cAAA,GAAiB,IAAA;AACrB,MAAA,IAAI,KAAA,GAAQ,IAAA;AACZ,MAAA,IAAI,gBAAA,GAIO,IAAA;AACX,MAAA,IAAI,MAAA,GAAuC,IAAA;AAE3C,MAAA,IAAI,OAAA,EAAS;AAEX,QAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,CAAuB,OAAO,CAAA;AAErD,QAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,UAAA,MAAA,GAAS,UAAA;AACT,UAAA,MAAM,OAAA,GACJ,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,kCAAkC,CAAA,GAAI,CAAC,CAAA,IAC5D,QAAA,CAAS,CAAC,CAAA,EAAG,IAAA,IACb,aAAA;AAEF,UAAA,MAAM,MAAA,GAAS,gBAAgB,QAAA,EAAU;AAAA,YACvC,IAAA,EAAM,OAAA;AAAA,YACN,QAAA,EAAU;AAAA,WACX,CAAA;AAED,UAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,MAAA,EAAQ;AACnC,YAAA,cAAA,GAAiB,MAAA,CAAO,MAAA;AACxB,YAAA,KAAA,GAAQ,MAAA,CAAO,KAAA;AAAA,UACjB;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,MAAM,UAAA,GAAkBqB,IAAA,CAAA,IAAA,CAAK,OAAA,EAAS,YAAY,CAAA;AAClD,UAAA,IAAI;AACF,YAAA,MAAM,UAAA,GAAa,MAASC,GAAA,CAAA,QAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AACxD,YAAA,IAAI,UAAA,CAAW,MAAK,EAAG;AACrB,cAAA,MAAA,GAAS,QAAA;AACT,cAAA,MAAM,UACJ,KAAA,CAAM,OAAA,EAAS,MAAM,kCAAkC,CAAA,GAAI,CAAC,CAAA,IAC5D,aAAA;AAEF,cAAA,MAAM,YAAA,GAAe,sBAAsB,UAAA,EAAY;AAAA,gBACrD,IAAA,EAAM,OAAA;AAAA,gBACN,UAAU;AAAC,eACZ,CAAA;AAED,cAAA,IAAI,YAAA,CAAa,OAAA,IAAW,YAAA,CAAa,MAAA,EAAQ;AAC/C,gBAAA,cAAA,GAAiB,YAAA,CAAa,MAAA;AAC9B,gBAAA,MAAM,UAAA,GAAA,CAAc,YAAA,CAAa,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG,MAAA;AAAA,kBACtD,CAAC,OAAO,CAAA,KAAM,KAAA,IAAS,YAAY,CAAA,GAAK,CAAA,CAA6B,MAAA,EAAQ,MAAA,IAAU,CAAA,GAAI,CAAA,CAAA;AAAA,kBAC3F;AAAA,iBACF;AACA,gBAAA,KAAA,GAAQ;AAAA,kBACN,aAAA,EAAe,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,CAAA;AAAA,kBACvD,aAAA,EAAe,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,MAAA,IAAU,CAAA;AAAA,kBACvD,WAAA,EAAa,UAAA;AAAA,kBACb,UAAA,EACE,YAAA,CAAa,MAAA,CAAO,QAAA,EAAU,MAAA;AAAA,oBAC5B,CAAC,KAAK,CAAA,KAAM,GAAA,IAAO,WAAW,CAAA,GAAK,CAAA,CAA4B,KAAA,EAAO,MAAA,IAAU,CAAA,GAAI,CAAA,CAAA;AAAA,oBACpF;AAAA,mBACF,IAAK;AAAA,iBACT;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAGA,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,MAAM,UAAA,GAAkBD,IAAA,CAAA,IAAA,CAAK,OAAA,EAAS,aAAa,CAAA;AACnD,UAAA,MAASC,cAAU,UAAA,EAAY,IAAA,CAAK,UAAU,cAAA,EAAgB,IAAA,EAAM,CAAC,CAAC,CAAA;AACtE,UAAA,gBAAA,GAAmB,MAAM,sBAAsB,UAAU,CAAA;AAAA,QAC3D;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,eAAA;AAAA,QACR,OAAA,EAAS,kFAAA;AAAA,QACT,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,YAAA,EAAc,iBAAiB,IAAA,GAAO,KAAA;AAAA,QACtC,QAAQ,MAAA,IAAU,MAAA;AAAA,QAClB,OAAO,KAAA,IAAS,MAAA;AAAA,QAChB,YAAY,gBAAA,GACR;AAAA,UACE,OAAO,gBAAA,CAAiB,KAAA;AAAA,UACxB,UAAA,EAAY,gBAAA,CAAiB,MAAA,EAAQ,MAAA,IAAU,CAAA;AAAA,UAC/C,YAAA,EAAc,gBAAA,CAAiB,QAAA,EAAU,MAAA,IAAU;AAAA,SACrD,GACA,MAAA;AAAA,QACJ,YAAY,cAAA,GACHD,IAAA,CAAA,IAAA,CAAK,OAAA,EAAU,aAAa,IACjC,KAAA,CAAM,UAAA;AAAA,QACV,UAAA,EAAY;AAAA,OACd;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,CAAA;AAAA,MAUb,MAAA,EAAQnB,EAAE,MAAA,CAAO;AAAA,QACf,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wCAAwC,CAAA;AAAA,QACrE,YAAYA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qDAAqD;AAAA,OACjG;AAAA;AACH,GACF;AACF;ACvGA,IAAM,kBAAA,uBAAyB,GAAA,EAAwB;AACvD,IAAM,YAAA,GAAe,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAA;AACpC,IAAM,aAAA,GAAgB,CAAA;AAEtB,SAAS,oBAAoB,IAAA,EAAiC;AAC5D,EAAA,MAAM,UAAA,GAAa,KAAK,SAAA,CAAU;AAAA,IAChC,OAAA,EAAS,aAAA;AAAA,IACT,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK;AAAA,IACzB,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK;AAAA,IAC7B,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,IAAA,MAAU,EAAC;AAAA,IAC9B,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,GAAA,CAAI,OAAK,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,EAAE,QAAQ,CAAA,CAAE,CAAA,CAAE,IAAA,MAAU;AAAC,GACxE,CAAA;AACD,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,MAAA,CAAO,UAAU,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACjF;AAEA,SAAS,UAAU,WAAA,EAAwC;AACzD,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,GAAA,CAAI,WAAW,CAAA;AAChD,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,YAAY,YAAA,EAAc;AAC/C,IAAA,kBAAA,CAAmB,OAAO,WAAW,CAAA;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,QAAA,CAAS,aAAqB,KAAA,EAAyB;AAC9D,EAAA,kBAAA,CAAmB,GAAA,CAAI,aAAa,KAAK,CAAA;AAC3C;AAMA,SAAS,kBAAA,CAAmB,OAAA,EAAiB,UAAA,EAAoB,YAAA,EAA4B;AAC3F,EAAA,MAAM,UAAA,GAAkBqB,IAAA,CAAA,IAAA,CAAK,OAAA,EAAS,YAAY,CAAA;AAClD,EAAA,MAAM,SAAA,GAAY;;AAAA;AAAA,CAAA;AAClB,EAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,EAAA,IAAO,GAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC7B,IAAA,eAAA,GAAqB,GAAA,CAAA,YAAA,CAAa,YAAY,OAAO,CAAA;AAAA,EACvD;AACA,EAAA,MAAM,UAAA,GAAa,kBAAkB,SAAA,GAAY,UAAA;AACjD,EAAG,GAAA,CAAA,aAAA,CAAc,UAAA,EAAY,UAAA,EAAY,OAAO,CAAA;AAClD;AAEA,SAAS,eAAe,OAAA,EAAgC;AACtD,EAAA,MAAM,UAAA,GAAkBA,IAAA,CAAA,IAAA,CAAK,OAAA,EAAS,YAAY,CAAA;AAClD,EAAA,IAAI,CAAI,GAAA,CAAA,UAAA,CAAW,UAAU,CAAA,EAAG;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAU,GAAA,CAAA,YAAA,CAAa,YAAY,OAAO,CAAA;AAC5C;AAMA,SAAS,uBAAA,GAAkC;AACzC,EAAA,MAAM,eAAe,wBAAA,EAAyB;AAC9C,EAAA,MAAM,WAAW,gBAAA,EAAiB;AAClC,EAAA,MAAM,YAAY,sBAAA,EAAuB;AACzC,EAAA,MAAM,kBAAkB,sBAAA,EAAuB;AAE/C,EAAA,OAAO,CAAA;;AAAA,EAEP,YAAY;;AAAA;;AAAA,EAIZ,QAAQ;;AAAA;;AAAA,EAIR,eAAe;;AAAA;;AAAA,EAIf,SAAS;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,gFAAA,CAAA;AAiDX;AAEA,SAAS,uBAAuB,IAAA,EAAiC;AAC/D,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,MAAA,CAAO,MAAA,CAC9B,IAAI,CAAA,CAAA,KAAK;AACR,IAAA,IAAI,WAAW,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,CAAA;AACvC,IAAA,IAAI,CAAA,CAAE,UAAU,QAAA,IAAY,YAAA;AAC5B,IAAA,IAAI,CAAA,CAAE,YAAY,MAAA,EAAW,QAAA,IAAY,aAAa,IAAA,CAAK,SAAA,CAAU,CAAA,CAAE,OAAO,CAAC,CAAA,CAAA;AAC/E,IAAA,OAAO,QAAA;AAAA,EACT,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,SAAA,EAC1B,IAAI,CAAA,CAAA,KAAK;AACT,IAAA,IAAI,CAAA,CAAE,SAAS,YAAA,EAAc;AAC3B,MAAA,OAAO,CAAA,CAAE,KAAA,GACL,CAAA,eAAA,EAAkB,CAAA,CAAE,MAAM,CAAA,IAAA,EAAO,CAAA,CAAE,KAAK,CAAA,CAAA,GACxC,CAAA,eAAA,EAAkB,CAAA,CAAE,MAAM,CAAA,CAAA;AAAA,IAChC;AACA,IAAA,OAAO,CAAA,aAAA,EAAgB,EAAE,MAAM,CAAA,CAAA,CAAA;AAAA,EACjC,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA,IAAK,EAAA;AAEjB,EAAA,MAAM,SAAA,GAAY,KAAK,KAAA,CACpB,GAAA,CAAI,OAAK,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,KAAK,CAAA,CAAE,QAAQ,GAAG,CAAA,CAAE,SAAA,GAAY,cAAc,EAAE,CAAA,CAAA,CAAG,CAAA,CACpF,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,EAAO,MAAA,GAC1B,CAAA,kBAAA,EAAqB,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAC1C,EAAA;AACJ,EAAA,MAAM,WAAA,GAAc,KAAK,OAAA,EAAS,MAAA,GAC9B,gBAAgB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,CAAA,KAAK,CAAA,EAAG,EAAE,KAAK,CAAA,QAAA,EAAM,EAAE,QAAQ,CAAA,CAAE,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAC9E,EAAA;AAEJ,EAAA,OAAO,CAAA;;AAAA;;AAAA,YAAA,EAIK,KAAK,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,WAAW,CAAA;AAAA;AAAA,EAExD,YAAY;AAAA,EACZ,SAAA,GAAY,CAAA;AAAA,EAAmB,SAAS,KAAK,EAAE;;AAAA;AAAA,EAG/C,SAAS;;AAAA,eAAA,EAEM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC;AAAA,iBAAA,EACpB,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC;AAAA,EACzC,SAAS;AAAA,EACT,WAAW;;AAAA,oCAAA,EAEyB,IAAA,CAAK,OAAO,IAAI,CAAA,kBAAA,CAAA;AACtD;AAMA,IAAM,2BAAA,GAA8BrB,EAAE,MAAA,CAAO;AAAA,EAC3C,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,6CAA6C,CAAA;AAAA,EAC5E,OAAA,EAASA,EAAE,MAAA,CAAO;AAAA,IAChB,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,IACf,MAAA,EAAQA,EAAE,MAAA,CAAO;AAAA,MACf,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,MACf,aAAaA,CAAAA,CAAE,IAAA,CAAK,CAAC,YAAA,EAAc,SAAA,EAAW,WAAW,CAAC,CAAA;AAAA,MAC1D,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,CAAO;AAAA,QACvB,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,QACf,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,QACf,QAAA,EAAUA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,QAC/B,OAAA,EAASA,CAAAA,CAAE,GAAA,EAAI,CAAE,QAAA;AAAS,OAC3B,CAAC,CAAA;AAAA,MACF,SAAA,EAAWA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,CAAO;AAAA,QAC1B,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,QACjB,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC3B,MAAMA,CAAAA,CAAE,IAAA,CAAK,CAAC,YAAA,EAAc,UAAU,CAAC;AAAA,OACxC,CAAC,CAAA,CAAE,QAAA;AAAS,KACd,CAAA;AAAA,IACD,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,CAAO;AAAA,MACtB,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,MACf,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,MACf,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,MACnB,SAAA,EAAWA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,KACjC,CAAC,CAAA;AAAA,IACF,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC1B,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC5B,aAAA,EAAeA,EAAE,MAAA,CAAO;AAAA,MACtB,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,MAClB,eAAA,EAAiBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACrC,QAAA,EAAUA,CAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,YAAY,WAAA,EAAa,MAAA,EAAQ,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,MAC/E,UAAA,EAAYA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA;AAAS,KACvD,EAAE,QAAA,EAAS;AAAA,IACZ,MAAA,EAAQA,EAAE,MAAA,CAAO;AAAA,MACf,KAAA,EAAOA,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,aAAA,EAAe,WAAW,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,MACrF,OAAA,EAASA,EAAE,MAAA,CAAO;AAAA,QAChB,WAAA,EAAaA,CAAAA,CAAE,IAAA,CAAK,CAAC,WAAA,EAAa,eAAA,EAAiB,YAAA,EAAc,QAAA,EAAU,YAAY,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,QACnG,WAAA,EAAaA,EAAE,IAAA,CAAK,CAAC,gBAAgB,cAAA,EAAgB,aAAa,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,QAC9E,WAAA,EAAaA,EAAE,IAAA,CAAK,CAAC,SAAS,QAAA,EAAU,MAAM,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,QAC1D,aAAA,EAAeA,EAAE,IAAA,CAAK,CAAC,UAAU,MAAA,EAAQ,OAAO,CAAC,CAAA,CAAE,QAAA;AAAS,OAC7D,EAAE,QAAA;AAAS,KACb,EAAE,QAAA,EAAS;AAAA,IACZ,OAAOA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IACpC,OAAA,EAASA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,CAAO;AAAA,MACxB,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,MAChB,QAAA,EAAUA,EAAE,MAAA;AAAO,KACpB,CAAC,CAAA,CAAE,QAAA;AAAS,GACd,CAAA,CAAE,QAAA,CAAS,2BAA2B,CAAA;AAAA,EACvC,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8BAA8B,CAAA;AAAA,EAChE,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,6BAA6B;AAClE,CAAC,CAAA;AAED,IAAM,6BAAA,GAAgCA,EAAE,MAAA,CAAO;AAAA,EAC7C,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yBAAyB;AACxD,CAAC,CAAA;AAUM,SAAS,+BAAA,CAEd,OAAA,GAAoC,EAAC,EACrC;AACA,EAAA,IAAI,gBAAwD,OAAA,CAAQ,OAAA;AACpE,EAAA,IAAI,mBAA8D,OAAA,CAAQ,iBAAA;AAC1E,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAE/C,EAAA,MAAM,uBAAuB,uBAAA,EAAwB;AAErD,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAyC;AACjE,IAAA,aAAA,GAAgB,QAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,mBAAA,GAAsB,CAAC,QAAA,KAA4C;AACvE,IAAA,gBAAA,GAAmB,QAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,YAAY,CAChB,WAAA,EACA,YAAA,EACA,aAAA,EACA,MACA,IAAA,KACG;AACH,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,WAAA,EAAa,cAAc,aAAA,EAAe;AAAA,QACtD,IAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,yBAAA,GAA4BF,IAAAA;AAAA,IAChC,OAAO,EAAE,SAAA,EAAW,OAAA,EAAS,YAAA,EAAc,eAAc,KAAM;AAC7D,MAAA,MAAM,IAAA,GAAO,OAAA;AACb,MAAA,MAAM,WAAA,GAAc,oBAAoB,IAAI,CAAA;AAE5C,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,SAAA,EAAW;AAAA,UAC3D,OAAA,EAAS,8BAA8B,IAAA,CAAK,IAAI,KAAK,YAAA,GAAe,CAAC,IAAI,aAAa,CAAA,CAAA,CAAA;AAAA,UACtF,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAGD,QAAA,MAAM,MAAA,GAAS,UAAU,WAAW,CAAA;AACpC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,gBAAA,EAAkB;AAAA,YAClE,KAAA,EAAO,MAAA;AAAA,YACP,OAAA,EAAS,CAAA,cAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,YACnC,IAAA,EAAM,EAAE,WAAA,EAAa,QAAA,EAAU,IAAI,KAAK,MAAA,CAAO,SAAS,CAAA,CAAE,WAAA,EAAY,EAAE;AAAA,YACxE,aAAa,IAAA,CAAK;AAAA,WACnB,CAAA;AAED,UAAA,kBAAA,CAAmB,OAAA,EAAS,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,IAAI,CAAA;AAExD,UAAA,IAAI,gBAAA,EAAkB;AACpB,YAAA,MAAM,iBAAiB,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,cAAc,aAAa,CAAA;AAAA,UAClF;AAEA,UAAA,OAAO,KAAK,SAAA,CAAU;AAAA,YACpB,OAAA,EAAS,IAAA;AAAA,YACT,aAAa,IAAA,CAAK,IAAA;AAAA,YAClB,WAAA;AAAA,YACA,MAAA,EAAQ,IAAA;AAAA,YACR,aAAA,EAAe,IAAA;AAAA,YACf,OAAO,MAAA,CAAO;AAAA,WACf,CAAA;AAAA,QACH;AAEA,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,gBAAA,EAAkB;AAAA,UAClE,KAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,CAAA,eAAA,EAAkB,IAAA,CAAK,IAAI,CAAA,qBAAA,CAAA;AAAA,UACpC,IAAA,EAAM,EAAE,WAAA,EAAY;AAAA,UACpB,aAAa,IAAA,CAAK;AAAA,SACnB,CAAA;AAGD,QAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU;AAAA,UAC3B,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO,0BAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACd,CAAA;AAED,QAAA,MAAM,UAAA,GAAa,uBAAuB,IAAI,CAAA;AAE9C,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,WAAA,EAAa;AAAA,UAC7D,IAAA,EAAM,qBAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,SAAS,IAAA,CAAK,IAAA;AAAA,YACd,MAAA,EAAQ,KAAK,MAAA,CAAO,IAAA;AAAA,YACpB,QAAQ,IAAA,CAAK;AAAA;AACf,SACD,CAAA;AAED,QAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,aAAA,CAAsB;AAAA,UAClD,YAAA,EAAc,EAAA;AAAA,UACd,cAAc,CAAC;AAAA,YACb,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,oBAAA;AAAA,YACN,aAAA,EAAe,EAAE,IAAA,EAAM,WAAA;AAAY,WACpC,CAAA;AAAA,UACD,UAAA;AAAA,UACA,SAAA,EAAW,IAAA;AAAA,UACX,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,MAAM,UAAA,GAAA,CAAc,SAAS,GAAA,IAAO,MAAA,CAAO,SAAS,IAAI,CAAA,IAAK,IAAI,IAAA,EAAK;AAEtE,QAAA,MAAM,KAAA,GAAQ;AAAA,UACZ,WAAA,EAAa,QAAA,CAAS,KAAA,EAAO,YAAA,IAAgB,CAAA;AAAA,UAC7C,YAAA,EAAc,QAAA,CAAS,KAAA,EAAO,gBAAA,IAAoB,CAAA;AAAA,UAClD,WAAA,EAAa,QAAA,CAAS,KAAA,EAAO,WAAA,IAAe;AAAA,SAC9C;AAEA,QAAA,QAAA,CAAS,WAAA,EAAa;AAAA,UACpB,UAAA;AAAA,UACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB;AAAA,SACD,CAAA;AAED,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,aAAA,EAAe;AAAA,UAC/D,IAAA,EAAM,qBAAA;AAAA,UACN,QAAQ,EAAE,WAAA,EAAa,UAAA,EAAY,UAAA,CAAW,QAAQ,KAAA,EAAM;AAAA,UAC5D,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,kBAAA,CAAmB,OAAA,EAAS,UAAA,EAAY,IAAA,CAAK,IAAI,CAAA;AAEjD,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,SAAA,EAAW;AAAA,UAC3D,SAAS,CAAA,qBAAA,EAAwB,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,MAAM,WAAW,CAAA,gCAAA,CAAA;AAAA,UAChE,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,IAAI;AACF,YAAA,MAAM,gBAAA,CAAiB,UAAA,EAAY,IAAA,CAAK,IAAA,EAAM,cAAc,aAAa,CAAA;AAAA,UAC3E,SAAS,KAAA,EAAO;AACd,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,IAAA,CAAK,IAAI,KAAK,KAAK,CAAA;AAAA,UAC7E;AAAA,QACF;AAEA,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,IAAA;AAAA,UACT,aAAa,IAAA,CAAK,IAAA;AAAA,UAClB,WAAA;AAAA,UACA,MAAA,EAAQ,KAAA;AAAA,UACR,aAAA,EAAe,IAAA;AAAA,UACf,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAE1E,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,OAAA,EAAS;AAAA,UACzD,KAAA,EAAO,YAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACP,CAAA;AAED,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,YAAA;AAAA,UACP,aAAa,IAAA,CAAK;AAAA,SACnB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,yBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,qDAAA,CAAA;AAAA,MASb,MAAA,EAAQ;AAAA;AACV,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,yBAAA;AAAA,IACN,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,iCAAA,CAEd,OAAA,GAAsE,EAAC,EACvE;AACA,EAAA,IAAI,gBAAgB,OAAA,CAAQ,OAAA;AAC5B,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,GAAA,EAAI;AAE/C,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAyC;AACjE,IAAA,aAAA,GAAgB,QAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAChB,IAAA,EACA,IAAA,KACG;AACH,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,UAAA,EAAY,GAAG,CAAA,EAAG;AAAA,QAC9B,IAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,2BAAA,GAA8BA,IAAAA;AAAA,IAClC,OAAO,EAAE,OAAA,EAAQ,KAAM;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,eAAe,OAAO,CAAA;AACzC,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAO,KAAK,SAAA,CAAU;AAAA,YACpB,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO;AAAA,WACR,CAAA;AAAA,QACH;AAEA,QAAA,SAAA,CAAU,SAAA,EAAW;AAAA,UACnB,OAAA,EAAS,8CAA8C,OAAO,CAAA,CAAA;AAAA,UAC9D,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,MAAM,YAAA,GAAe,sBAAsB,UAAA,EAAY;AAAA,UACrD,IAAA,EAAM,OAAA;AAAA,UACN,UAAU;AAAC,SACZ,CAAA;AAED,QAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,UAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,MAAA,EAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,0BAAA;AAE7E,UAAA,SAAA,CAAU,OAAA,EAAS;AAAA,YACjB,KAAA,EAAO,aAAA;AAAA,YACP,IAAA,EAAM;AAAA,WACP,CAAA;AAED,UAAA,OAAO,KAAK,SAAA,CAAU;AAAA,YACpB,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,aAAA;AAAA,YACP;AAAA,WACD,CAAA;AAAA,QACH;AAEA,QAAA,SAAA,CAAU,SAAA,EAAW;AAAA,UACnB,OAAA,EAAS,0DAA0D,OAAO,CAAA,CAAA;AAAA,UAC1E,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,MAAM,UAAA,GAAA,CAAc,aAAa,MAAA,EAAQ,QAAA,IAAY,EAAC,EAAG,MAAA,CAAO,CAAC,KAAA,EAAO,CAAA,KAAM;AAC5E,UAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAQ,YAAY,CAAA,EAAG;AACxD,YAAA,OAAO,KAAA,IAAU,CAAA,CAA6B,MAAA,EAAQ,MAAA,IAAU,CAAA,CAAA;AAAA,UAClE;AACA,UAAA,OAAO,KAAA;AAAA,QACT,GAAG,CAAC,CAAA;AAEJ,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,IAAA;AAAA,UACT,OAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAQ,YAAA,CAAa,MAAA;AAAA,UACrB,KAAA,EAAO;AAAA,YACL,YAAA,EAAc,YAAA,CAAa,MAAA,EAAQ,QAAA,EAAU,MAAA,IAAU,CAAA;AAAA,YACvD;AAAA,WACF;AAAA,UACA,UAAA,EAAiBuB,IAAA,CAAA,IAAA,CAAK,OAAA,EAAS,YAAY;AAAA,SAC5C,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAE1E,QAAA,SAAA,CAAU,OAAA,EAAS;AAAA,UACjB,KAAA,EAAO,YAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACP,CAAA;AAED,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,2BAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA,6EAAA,CAAA;AAAA,MAGb,MAAA,EAAQ;AAAA;AACV,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,2BAAA;AAAA,IACN;AAAA,GACF;AACF;AAKO,SAAS,wBAAA,CACd,OAAA,GAAoC,EAAC,EACrC;AACA,EAAA,MAAM,YAAA,GAAe,gCAAgC,OAAO,CAAA;AAC5D,EAAA,MAAM,gBAAgB,iCAAA,CAAkC;AAAA,IACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAS,OAAA,CAAQ;AAAA,GAClB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,uBAAuB,YAAA,CAAa,IAAA;AAAA,IACpC,yBAAyB,aAAA,CAAc,IAAA;AAAA,IACvC,gBAAA,EAAkB,CAAC,QAAA,KAAyC;AAC1D,MAAA,YAAA,CAAa,iBAAiB,QAAQ,CAAA;AACtC,MAAA,aAAA,CAAc,iBAAiB,QAAQ,CAAA;AAAA,IACzC,CAAA;AAAA,IACA,qBAAqB,YAAA,CAAa;AAAA,GACpC;AACF;;;ACvpBA,UAAA,EAAA;AAUA,SAASC,eAAc,MAAA,EAA2B;AAC9C,EAAA,IAAI7B,iBAAAA,CAAkB,MAAM,CAAA,EAAG;AAC3B,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAClB;AA2HA,SAAS,SAAA,CAAU,KAAA,EAA+B,OAAA,EAAiB,IAAA,EAA+C;AAC9G,EAAA,OAAO;AAAA,IACH,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,KAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAuBA,eAAsB,mBAAA,CAClB,MAAA,EACA,OAAA,EACA,OAAA,GAAoC,EAAC,EACL;AAChC,EAAA,MAAM;AAAA,IACF,SAAA,GAAY,IAAA;AAAA,IACZ,QAAA,GAAW,IAAA;AAAA,IACX;AAAA,GACJ,GAAI,OAAA;AAEJ,EAAA,MAAM,OAAwB,EAAC;AAC/B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,IAAA,CAAK,KAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,iCAAA,EAAoC,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI;AAAA,IAC5E,UAAA,EAAY6B,cAAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAAA,IACxC,UAAA,EAAY,QAAQ,MAAA,CAAO,MAAA;AAAA,IAC3B,eAAA,EAAiB,CAAC,CAAC;AAAA,GACtB,CAAC,CAAA;AAGF,EAAA,MAAM,YAAA,GAAe,YAAA,GACf,qCAAA,CAAsC,YAAY,IAClD,oBAAA,EAAqB;AAG3B,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,EAAY,KAAM,WAAA;AAE1C,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,IAAI,QAAA,EAAU;AAEV,IAAA,MAAM,eAAA,GAAkB,8BAAA,CAA+B,OAAA,EAAS,YAAY,CAAA;AAC5E,IAAA,WAAA,GAAc,eAAA,CAAgB,WAAA;AAC9B,IAAA,YAAA,GAAe,eAAA,CAAgB,kBAAA;AAE/B,IAAA,IAAA,CAAK,IAAA,CAAK,UAAU,MAAA,EAAQ,CAAA,uBAAA,CAAA,EAA2B,EAAE,WAAA,EAAa,YAAA,EAAc,CAAC,CAAA;AACrF,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yDAAA,EAA4D,WAAW,CAAA,CAAA,CAAG,CAAA;AAEtF,IAAA,MAAA,GAAS,MAAM,OAAO,aAAA,CAAc;AAAA,MAChC,cAAc,eAAA,CAAgB,YAAA;AAAA,MAC9B,YAAY,eAAA,CAAgB,UAAA;AAAA,MAC5B,YAAA,EAAc,EAAA;AAAA;AAAA,MACd,UAAA,EAAY,EAAA;AAAA;AAAA,MACZ,SAAA;AAAA,MACA,oBAAA,EAAsB;AAAA;AAAA,KACzB,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,kBAAA,CAAA,EAAsB;AAAA,MAC9C,YAAA,EAAc,OAAO,KAAA,EAAO,YAAA;AAAA,MAC5B,gBAAA,EAAkB,OAAO,KAAA,EAAO;AAAA,KACnC,CAAC,CAAA;AAAA,EACN,CAAA,MAAO;AAEH,IAAA,MAAM,eAAA,GAAkB,qBAAA,CAAsB,OAAA,EAAS,YAAY,CAAA;AACnE,IAAA,WAAA,GAAc,eAAA,CAAgB,WAAA;AAC9B,IAAA,YAAA,GAAe,eAAA,CAAgB,kBAAA;AAE/B,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,2BAAA,EAA8B,MAAA,CAAO,WAAA,EAAa,CAAA,CAAA,CAAA,EAAK,EAAE,WAAA,EAAa,YAAA,EAAc,CAAC,CAAA;AAEjH,IAAA,MAAM,UAAA,GAAa,CAAA;;AAAA,EAEzB,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC;;AAAA,sDAAA,CAAA;AAI1B,IAAA,MAAA,GAAS,MAAM,OAAO,gBAAA,CAAiB;AAAA,MACnC,cAAc,eAAA,CAAgB,MAAA;AAAA,MAC9B,UAAA;AAAA,MACA,SAAA;AAAA,MACA,oBAAA,EAAsB;AAAA,KACzB,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,kBAAA,CAAA,EAAsB;AAAA,MAC9C,YAAA,EAAc,OAAO,KAAA,EAAO,YAAA;AAAA,MAC5B,gBAAA,EAAkB,OAAO,KAAA,EAAO;AAAA,KACnC,CAAC,CAAA;AAAA,EACN;AAEA,EAAA,MAAM,mBAAmB,MAAA,CAAO,IAAA;AAGhC,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,QAAA,EAAU;AAIV,IAAA,MAAM,gBAAA,GAAwB,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AACtE,IAAA,UAAA,GAAa;AAAA,MACT,OAAO,gBAAA,CAAiB,KAAA;AAAA,MACxB,UAAA,EAAY,iBAAiB,MAAA,CAAO,MAAA;AAAA,MACpC,YAAA,EAAA,CAAe,gBAAA,CAAiB,QAAA,IAAY,EAAC,EAAG;AAAA,KACpD;AAEA,IAA4B;AACxB,MAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,iBAAA,CAAmB,CAAC,CAAA;AAAA,IACpD;AAMA,EACJ;AAEA,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAChC,EAAA,IAAA,CAAK,KAAK,SAAA,CAAU,MAAA,EAAQ,wBAAwB,EAAE,UAAA,EAAY,CAAC,CAAA;AAEnE,EAAA,OAAO;AAAA,IACH,OAAA,EAAS,gBAAA;AAAA,IACT,WAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA,EAAO,OAAO,KAAA,IAAS,MAAA;AAAA,IACvB,UAAA;AAAA,IACA;AAAA,GACJ;AACJ;AAwOA,SAAS,sCAAsC,YAAA,EAAsD;AACjG,EAAA,MAAM,aAAa,oBAAA,EAAqB;AACxC,EAAA,MAAM,uBAAuB,0BAAA,EAA2B;AAExD,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,YAAA,CAAa,MAAA,IAAU,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA,EAAG;AACvD,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EACpB,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA,mFAAA,CAEiC,CAAA;AAAA,EAChF;AAEA,EAAA,IAAI,YAAA,CAAa,OAAA,IAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA,EAAG;AACzD,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EACpB,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA,gFAAA,CAE6B,CAAA;AAAA,EAC7E;AAEA,EAAA,IAAI,YAAA,CAAa,MAAA,IAAU,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA,EAAG;AACvD,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EACpB,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA,qFAAA,CAEmC,CAAA;AAAA,EAClF;AAEA,EAAA,IAAI,YAAA,CAAa,MAAA,IAAU,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA,EAAG;AACvD,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EACpB,YAAA,CAAa,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA,qCAAA,CAEb,CAAA;AAAA,EAClC;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,UAAA;AAAA,EACX;AAEA,EAAA,OAAO,GAAG,UAAU;;AAAA;;AAAA,EAItB,oBAAoB;;AAAA;;AAAA;;AAAA,EAMpB,QAAA,CAAS,IAAA,CAAK,MAAM,CAAC;AAAA,CAAA;AAEvB;;;AC3jBA,SAASA,eAAc,MAAA,EAA2B;AAChD,EAAA,IAAI7B,iBAAAA,CAAkB,MAAM,CAAA,EAAG;AAC7B,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AA+CA,IAAM,kBAAA,GAAqBO,EAAE,MAAA,CAAO;AAAA,EAClC,OAAA,EAASA,EACN,MAAA,CAAO;AAAA,IACN,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,IACf,MAAA,EAAQA,EAAE,MAAA,CAAO;AAAA,MACf,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,MACf,WAAA,EAAaA,EAAE,IAAA,CAAK,CAAC,cAAc,SAAA,EAAW,WAAA,EAAa,UAAU,CAAC,CAAA;AAAA,MACtE,QAAQA,CAAAA,CAAE,KAAA;AAAA,QACRA,EAAE,MAAA,CAAO;AAAA,UACP,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,UACf,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,UACf,QAAA,EAAUA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,SAChC;AAAA;AACH,KACD,CAAA;AAAA,IACD,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC1B,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC5B,OAAOA,CAAAA,CAAE,KAAA;AAAA,MACPA,EAAE,MAAA,CAAO;AAAA,QACP,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,QACf,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,QACf,QAAA,EAAUA,EAAE,MAAA;AAAO,OACpB;AAAA,MACD,QAAA,EAAS;AAAA,IACX,aAAA,EAAeA,EAAE,MAAA,CAAO;AAAA,MACtB,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,MAClB,eAAA,EAAiBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACrC,QAAA,EAAUA,CAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,YAAY,WAAA,EAAa,MAAA,EAAQ,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,MAC/E,UAAA,EAAYA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,IAAUA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA;AAAS,KACvD,EAAE,QAAA,EAAS;AAAA,IACZ,MAAA,EAAQA,EAAE,MAAA,CAAO;AAAA,MACf,KAAA,EAAOA,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,QAAA,EAAU,SAAA,EAAW,aAAA,EAAe,WAAW,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,MACrF,OAAA,EAASA,EAAE,MAAA,CAAO;AAAA,QAChB,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACjC,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACjC,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACjC,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,OACpC,EAAE,QAAA;AAAS,KACb,EAAE,QAAA,EAAS;AAAA,IACZ,OAAOA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IACpC,SAASA,CAAAA,CAAE,KAAA;AAAA,MACTA,EAAE,MAAA,CAAO;AAAA,QACP,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,QAChB,QAAA,EAAUA,EAAE,MAAA;AAAO,OACpB;AAAA,MACD,QAAA,EAAS;AAAA,IACX,WAAWA,CAAAA,CAAE,KAAA;AAAA,MACXA,EAAE,MAAA,CAAO;AAAA,QACP,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,QACjB,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC3B,aAAaA,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,MAAM,CAAC;AAAA,OACpC;AAAA,MACD,QAAA;AAAS,GACZ,CAAA,CACA,QAAA,CAAS,6BAA6B,CAAA;AAAA,EACzC,cAAcA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8BAA8B,CAAA;AAAA,EAC3E,eAAeA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,6BAA6B;AAC7E,CAAC,CAAA;AAUM,SAAS,yBAAA,CACd,OAAA,GAAsC,EAAC,EACvC;AACA,EAAA,IAAI,gBAAmD,OAAA,CAAQ,eAAA;AAC/D,EAAA,IAAI,mBAAwD,OAAA,CAAQ,iBAAA;AACpE,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAE7B,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAoC;AAC5D,IAAA,aAAA,GAAgB,QAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,0BAAA,GAA6B,CAAC,QAAA,KAAsC;AACxE,IAAA,gBAAA,GAAmB,QAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,YAAY,CAChB,WAAA,EACA,YAAA,EACA,aAAA,EACA,MACA,IAAA,KACG;AACH,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,WAAA,EAAa,cAAc,aAAA,EAAe;AAAA,QACtD,IAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAcF,IAAAA;AAAA,IAClB,OAAO,EAAE,OAAA,EAAS,eAAe,CAAA,EAAG,aAAA,GAAgB,GAAE,KAAM;AAC1D,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,QAAA,GAAW,sCAAA;AACjB,QAAA,OAAO,IAAA,CAAK,UAAU,EAAE,OAAA,EAAS,OAAO,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,MAC1E;AAEA,MAAA,MAAM,WAAA,GAAc,OAAA;AAEpB,MAAA,IAAI,CAAC,WAAA,CAAY,MAAA,IAAU,CAAC,YAAY,IAAA,EAAM;AAC5C,QAAA,MAAM,WAAW,CAAA,gDAAA,EAAmD,WAAA,CAAY,IAAI,CAAA,UAAA,EAAa,YAAY,MAAM,CAAA,EAAA,CAAA;AACnH,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,WAAA,CAAY,IAAA,IAAQ,SAAA,EAAW,CAAA;AAAA,MACnG;AAEA,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,SAAA,EAAW;AAAA,UAClE,SAAS,CAAA,iCAAA,EAAoC,WAAA,CAAY,IAAI,CAAA,EAAG,YAAA,GAAe,uCAAuC,EAAE,CAAA,CAAA;AAAA,UACxH,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,gBAAA,EAAkB;AAAA,YACzE,KAAA,EAAO,MAAA;AAAA,YACP,OAAA,EAAS,wCAAA;AAAA,YACT,IAAA,EAAM;AAAA,cACJ,MAAA,EAAQ,YAAA,CAAa,MAAA,EAAQ,MAAA,IAAU,CAAA;AAAA,cACvC,OAAA,EAAS,YAAA,CAAa,OAAA,EAAS,MAAA,IAAU,CAAA;AAAA,cACzC,MAAA,EAAQ,YAAA,CAAa,MAAA,EAAQ,MAAA,IAAU;AAAA,aACzC;AAAA,YACA,aAAa,WAAA,CAAY;AAAA,WAC1B,CAAA;AAAA,QACH;AAEA,QAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,aAAA,EAAe;AAAA,UACtE,KAAA,EAAO;AAAA,YACL,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,2BAAA,EAA6B,QAAQ,aAAA,EAAc;AAAA,YAC1E,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,sBAAA,EAAwB,QAAQ,SAAA,EAAU;AAAA,YAClE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,iBAAA,EAAmB,QAAQ,SAAA;AAAU;AAC/D,SACD,CAAA;AAED,QAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,SAAA,EAAW;AAAA,UAClE,OAAA,EAAS,qBAAqBwB,cAAAA,CAAc,WAAA,CAAY,MAAM,CAAC,CAAA,MAAA,EAAS,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA,OAAA,CAAA;AAAA,UACjG,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,aAAA,EAAe;AAAA,UACtE,KAAA,EAAO;AAAA,YACL,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,2BAAA,EAA6B,QAAQ,WAAA,EAAY;AAAA,YACxE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,sBAAA,EAAwB,QAAQ,aAAA,EAAc;AAAA,YACtE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,iBAAA,EAAmB,QAAQ,SAAA;AAAU;AAC/D,SACD,CAAA;AAGD,QAAA,MAAM,MAAA,GAAS,IAAIC,SAAAA,CAAU;AAAA,UAC3B,QAAA,EAAU,WAAA;AAAA,UACV,KAAA,EAAO;AAAA,SACR,CAAA;AAED,QAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,WAAA,EAAa;AAAA,UACpE,IAAA,EAAM,cAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,SAAS,WAAA,CAAY,IAAA;AAAA,YACrB,MAAA,EAAQD,cAAAA,CAAc,WAAA,CAAY,MAAM,CAAA;AAAA,YACxC,QAAQ,WAAA,CAAY;AAAA;AACtB,SACD,CAAA;AAED,QAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,MAAA,EAAQ,WAAA,EAAa;AAAA,UAC5D,QAAA,EAAU,IAAA;AAAA,UACV,YAAA;AAAA,UACA,KAAA,EAAO,CAAC,GAAA,KAAQ;AACd,YAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,gBAAA,EAAkB;AAAA,cACzE,OAAO,GAAA,CAAI,KAAA;AAAA,cACX,SAAS,GAAA,CAAI,OAAA;AAAA,cACb,MAAM,GAAA,CAAI,IAAA;AAAA,cACV,aAAa,WAAA,CAAY;AAAA,aAC1B,CAAA;AAAA,UACH;AAAA,SACD,CAAA;AAED,QAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,aAAA,EAAe;AAAA,UACtE,IAAA,EAAM,cAAA;AAAA,UACN,MAAA,EAAQ;AAAA,YACN,aAAa,MAAA,CAAO,WAAA;AAAA,YACpB,cAAc,MAAA,CAAO,YAAA;AAAA,YACrB,OAAO,MAAA,CAAO;AAAA,WAChB;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,aAAA,EAAe;AAAA,UACtE,KAAA,EAAO;AAAA,YACL,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,2BAAA,EAA6B,QAAQ,WAAA,EAAY;AAAA,YACxE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,sBAAA,EAAwB,QAAQ,WAAA,EAAY;AAAA,YACpE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,iBAAA,EAAmB,QAAQ,aAAA;AAAc;AACnE,SACD,CAAA;AAED,QAAA,MAAM,eAAe,MAAA,CAAO,OAAA;AAC5B,QAAA,MAAM,kBAAkB,MAAA,CAAO,UAAA;AAE/B,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,aAAA,EAAe;AAAA,YACtE,IAAA,EAAM,kBAAA;AAAA,YACN,MAAA,EAAQ,eAAA;AAAA,YACR,SAAS,eAAA,CAAgB;AAAA,WAC1B,CAAA;AAAA,QACH;AAEA,QAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,aAAA,EAAe;AAAA,UACtE,KAAA,EAAO;AAAA,YACL,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,2BAAA,EAA6B,QAAQ,WAAA,EAAY;AAAA,YACxE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,sBAAA,EAAwB,QAAQ,WAAA,EAAY;AAAA,YACpE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,iBAAA,EAAmB,QAAQ,WAAA;AAAY;AACjE,SACD,CAAA;AAED,QAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,SAAA,EAAW;AAAA,UAClE,OAAA,EAAS,sBAAsB,WAAA,CAAY,IAAI,KAAK,MAAA,CAAO,KAAA,EAAO,eAAe,CAAC,CAAA,QAAA,CAAA;AAAA,UAClF,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,IAAI,oBAAoB,YAAA,EAAc;AACpC,UAAA,IAAI;AACF,YAAA,MAAM,gBAAA,CAAiB,YAAA,EAAc,WAAA,CAAY,IAAA,EAAM,cAAc,aAAa,CAAA;AAClF,YAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,gBAAA,EAAkB;AAAA,cACzE,KAAA,EAAO,MAAA;AAAA,cACP,OAAA,EAAS,CAAA,mBAAA,EAAsB,WAAA,CAAY,IAAI,CAAA,CAAA;AAAA,cAC/C,aAAa,WAAA,CAAY;AAAA,aAC1B,CAAA;AAAA,UACH,SAAS,YAAA,EAAc;AACrB,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,WAAA,CAAY,IAAI,KAAK,YAAY,CAAA;AACtF,YAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,gBAAA,EAAkB;AAAA,cACzE,KAAA,EAAO,MAAA;AAAA,cACP,OAAA,EAAS,CAAA,2BAAA,EAA8B,WAAA,CAAY,IAAI,CAAA,CAAA;AAAA,cACvD,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,CAAO,YAAY,CAAA,EAAE;AAAA,cACpC,aAAa,WAAA,CAAY;AAAA,aAC1B,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,YAAA;AAAA,UACT,aAAa,MAAA,CAAO,WAAA;AAAA,UACpB,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,YAAY,MAAA,CAAO;AAAA,SACpB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAE1E,QAAA,SAAA,CAAU,WAAA,CAAY,IAAA,EAAM,YAAA,EAAc,aAAA,EAAe,OAAA,EAAS;AAAA,UAChE,KAAA,EAAO,YAAA;AAAA,UACP,IAAA,EAAM;AAAA,SACP,CAAA;AAED,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,YAAA;AAAA,UACP,SAAS,WAAA,CAAY;AAAA,SACtB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,kBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,8CAAA,CAAA;AAAA,MASb,MAAA,EAAQ;AAAA;AACV,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,gBAAA;AAAA,IACA;AAAA,GACF;AACF;ACvPA,IAAM,eAAA,GAAkBtB,EAAE,MAAA,CAAO;AAAA,EAC/B,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mBAAmB,CAAA;AAAA,EAC7C,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qCAAqC,CAAA;AAAA,EACtE,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,UAAU,CAAA;AAAA,EACnD,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,8BAA8B,CAAA;AAAA,EAC9E,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,gCAAgC,CAAA;AAAA,EAChF,cAAA,EAAgBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,CAAO;AAAA,IAC/B,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,IACf,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,IACf,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAClC,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,wCAAwC,CAAA;AAAA,EAChE,YAAYA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,4CAA4C,CAAA;AAAA,EACxF,WAAWA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,iCAAiC,CAAA;AAAA,EAC5E,cAAcA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,uCAAuC;AACvF,CAAC,CAAA;AAEwBA,EAAE,MAAA,CAAO;AAAA,EAChC,SAAA,EAAW,eAAA,CAAgB,QAAA,CAAS,yCAAyC,CAAA;AAAA,EAC7E,YAAYA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8BAA8B,CAAA;AAAA,EACzE,aAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,2BAA2B;AACzE,CAAC;AClHD,IAAM,0BAAA,GAA6BA,EAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,EACf,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,MAAA,EAAQA,EAAE,MAAA,CAAO;AAAA,IACf,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,IACf,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IAChC,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,KAAK,CAAA;AAAA,IACvB,UAAA,EAAYA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAClC,CAAA;AAAA,EACD,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,KAAK,CAAA;AAAA,EACvB,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,KAAK,CAAA;AAAA,EACtB,OAAOA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACpC,SAASA,CAAAA,CAAE,KAAA,CAAMA,EAAE,GAAA,EAAK,EAAE,QAAA;AAC5B,CAAC,CAAA;AAEgCA,EAAE,MAAA,CAAO;AAAA,EACxC,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAM,0BAA0B,EAAE,QAAA,EAAS;AAAA,EACvD,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC3B,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,UAAUA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI;AAC/C,CAAC;ACpBD,SAASsB,eAAc,MAAA,EAAuC;AAC5D,EAAA,IAAI,CAAC,QAAQ,OAAO,SAAA;AACpB,EAAA,IAAI7B,iBAAAA,CAAkB,MAAM,CAAA,EAAG;AAC7B,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAAA,EACrC;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAEA,IAAM,UAAA,GAAa,SAAA;AA0CnB,eAAe,gBAAgB,YAAA,EAAuC;AACpE,EAAA,MAAM,UAAA,GAAkB+B,IAAA,CAAA,IAAA,CAAK,YAAA,EAAc,UAAU,CAAA;AACrD,EAAA,IAAI;AACF,IAAA,MAAS,GAAA,CAAA,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAChD,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,aAAa,MAAA,EAA0D;AAC9E,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,KAAA,MAAW,CAAA,IAAK,MAAA,IAAU,EAAC,EAAG;AAC5B,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,EAAM;AACvC,MAAA,IAAI,KAAA,IAAS,CAAA,IAAK,OAAQ,CAAA,CAAuB,QAAQ,QAAA,EAAU;AACjE,QAAA,IAAA,CAAK,IAAA,CAAM,EAAsB,GAAG,CAAA;AAAA,MACtC,WAAW,MAAA,IAAU,CAAA,IAAK,OAAQ,CAAA,CAAwB,SAAS,QAAA,EAAU;AAC3E,QAAA,OAAA,CAAQ,IAAA,CAAM,EAAuB,IAAI,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,MAAM,OAAA,EAAQ;AACzB;AAMO,SAAS,+BAA+B,OAAA,EAAiB;AAC9D,EAAA,OAAO1B,IAAAA;AAAA,IACL,OAAO,EAAE,IAAA,EAAK,KAAM;AAClB,MAAA,MAAM,WAAgB0B,IAAA,CAAA,UAAA,CAAW,IAAI,IAAI,IAAA,GAAYA,IAAA,CAAA,IAAA,CAAK,SAAS,IAAI,CAAA;AAEvE,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAS,GAAA,CAAA,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACnD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,MAAM,KAAA,GAAYC,aAAS,QAAQ,CAAA;AAEnC,QAAA,MAAM,SAAA,GAA6B;AAAA,UACjC,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,QAAA,EAAA,CAAW,MAAA,CAAO,QAAA,IAAY,EAAC,EAC5B,MAAA,CAAO,CAAC,CAAA,KAA8BC,mBAAAA,CAAoB,CAAC,CAAC,CAAA,CAC5D,IAAI,CAAA,CAAA,KAAK;AACR,YAAA,MAAM,EAAE,MAAM,OAAA,EAAQ,GAAI,aAAa,CAAA,CAAE,MAAA,IAAU,EAAE,CAAA;AACrD,YAAA,OAAO;AAAA,cACL,MAAM,CAAA,CAAE,IAAA;AAAA,cACR,MAAA,EAAQJ,cAAAA,CAAc,CAAA,CAAE,MAAM,CAAA;AAAA,cAC9B,MAAA,EAAQ,IAAA;AAAA,cACR,YAAA,EAAc;AAAA,aAChB;AAAA,UACF,CAAC,CAAA;AAAA,UACH,QAAQ,EAAC;AAAA,UACT,WAAW,CAAA,EAAG,IAAA,CAAK,MAAM,KAAA,CAAM,IAAA,GAAO,IAAI,CAAC,CAAA,EAAA;AAAA,SAC7C;AAEA,QAAA,OAAO,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAA;AAAA,MAC1C,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACjE,QAAA,OAAO,KAAK,SAAA,CAAU,EAAE,OAAO,CAAA,kCAAA,EAAqC,GAAG,IAAI,CAAA;AAAA,MAC7E;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,wBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA,qFAAA,CAAA;AAAA,MAGb,MAAA,EAAQtB,EAAE,MAAA,CAAO;AAAA,QACf,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2CAA2C;AAAA,OACtE;AAAA;AACH,GACF;AACF;AAMO,SAAS,uBAAuB,OAAA,EAAiB;AACtD,EAAA,OAAOF,IAAAA;AAAA,IACL,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,MAAM,aAAA,EAAe,aAAA,GAAgB,MAAK,KAAM;AACnE,MAAA,MAAM,WAAgB0B,IAAA,CAAA,UAAA,CAAW,IAAI,IAAI,IAAA,GAAYA,IAAA,CAAA,IAAA,CAAK,SAAS,IAAI,CAAA;AAEvE,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAS,GAAA,CAAA,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACnD,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,MAAM,OAAA,GAAU,UAAA,EAAW,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACvC,QAAA,MAAM,SAAA,GAAY,MAAM,eAAA,CAAgB,OAAO,CAAA;AAC/C,QAAA,MAAM,SAAA,GAAiBA,IAAA,CAAA,IAAA,CAAK,SAAA,EAAW,CAAA,MAAA,EAAS,OAAO,CAAA,KAAA,CAAO,CAAA;AAE9D,QAAA,MAAM,SAAA,GAAuB;AAAA,UAC3B,IAAA,EAAM;AAAA,YACJ,UAAA,EAAY,QAAA;AAAA,YACZ,IAAA;AAAA,YACA,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY;AACtC,SACF;AAEA,QAAA,IAAI,SAAS,SAAA,EAAW;AACtB,UAAA,MAAM,eAAe,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AACnE,UAAA,IAAI,iBAAiB,CAAA,CAAA,EAAI;AACvB,YAAA,OAAO,KAAK,SAAA,CAAU,EAAE,OAAO,CAAA,SAAA,EAAY,IAAI,yBAAyB,CAAA;AAAA,UAC1E;AAEA,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA;AAC5C,UAAA,SAAA,CAAU,KAAK,YAAA,GAAe,YAAA;AAC9B,UAAA,SAAA,CAAU,OAAA,GAAU,OAAA;AAEpB,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,MAAM,EAAE,IAAA,EAAK,GAAI,aAAa,OAAA,CAAQ,MAAA,IAAU,EAAE,CAAA;AAClD,YAAA,SAAA,CAAU,gBAAA,GAAA,CAAoB,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG,MAAA;AAAA,cAAO,CAAA,CAAA,KACzD,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAQ,MAAA,IAAU,CAAA,IACjD,IAAA,CAAK,QAAA,CAAU,CAAA,CAAuB,IAAI;AAAA,aAC5C;AAAA,UACF;AAAA,QACF,CAAA,MAAA,IAAW,SAAS,OAAA,EAAS;AAC3B,UAAA,OAAO,KAAK,SAAA,CAAU;AAAA,YACpB,KAAA,EAAO,CAAA,gFAAA;AAAA,WACR,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,SAAS,cAAA,EAAgB;AAClC,UAAA,IAAI,CAAC,aAAA,EAAe;AAClB,YAAA,OAAO,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,yDAAyD,CAAA;AAAA,UAC1F;AAEA,UAAA,MAAM,eAAe,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,aAAa,CAAA;AAC5E,UAAA,IAAI,iBAAiB,CAAA,CAAA,EAAI;AACvB,YAAA,OAAO,KAAK,SAAA,CAAU,EAAE,OAAO,CAAA,gBAAA,EAAmB,aAAa,eAAe,CAAA;AAAA,UAChF;AAEA,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,YAAY,CAAA;AAC5C,UAAA,MAAM,gBAAA,GAAA,CAAoB,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG,SAAA;AAAA,YAAU,CAAA,CAAA,KACxD,OAAO,CAAA,KAAM,QAAA,IAAY,MAAM,IAAA,IAAQ,MAAA,IAAU,CAAA,IAChD,CAAA,CAAuB,IAAA,KAAS;AAAA,WACnC;AAEA,UAAA,IAAI,qBAAqB,CAAA,CAAA,EAAI;AAC3B,YAAA,OAAO,IAAA,CAAK,UAAU,EAAE,KAAA,EAAO,iBAAiB,IAAI,CAAA,wBAAA,EAA2B,aAAa,CAAA,CAAA,CAAA,EAAK,CAAA;AAAA,UACnG;AAEA,UAAA,SAAA,CAAU,KAAK,iBAAA,GAAoB,aAAA;AACnC,UAAA,SAAA,CAAU,KAAK,YAAA,GAAe,YAAA;AAC9B,UAAA,SAAA,CAAU,KAAK,gBAAA,GAAmB,gBAAA;AAClC,UAAA,SAAA,CAAU,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAQ,gBAAgB,CAAA;AAAA,QAC1D;AAEA,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,MAAM,CAAC,CAAA;AACtD,QAAA,MAAS,GAAA,CAAA,SAAA,CAAU,WAAW,YAAY,CAAA;AAE1C,QAAA,MAAM,iBAAA,GAAyBA,IAAA,CAAA,QAAA,CAAS,OAAA,EAAS,SAAS,CAAA;AAE1D,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,IAAA;AAAA,UACT,OAAA;AAAA,UACA,SAAA,EAAW,iBAAA;AAAA,UACX,MAAM,CAAA,EAAG,IAAA,CAAK,MAAM,YAAA,CAAa,MAAA,GAAS,IAAI,CAAC,CAAA,EAAA,CAAA;AAAA,UAC/C,OAAA,EAAS,CAAA,mBAAA,EAAsB,iBAAiB,CAAA,+CAAA,EAAkD,OAAO,CAAA,EAAA;AAAA,SAC1G,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACjE,QAAA,OAAO,KAAK,SAAA,CAAU,EAAE,OAAO,CAAA,yBAAA,EAA4B,GAAG,IAAI,CAAA;AAAA,MACpE;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,eAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;;AAAA,0DAAA,CAAA;AAAA,MAKb,MAAA,EAAQxB,EAAE,MAAA,CAAO;AAAA,QACf,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qBAAqB,CAAA;AAAA,QAC/C,IAAA,EAAMA,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,SAAS,cAAc,CAAC,CAAA,CAAE,QAAA,CAAS,0BAA0B,CAAA;AAAA,QACtF,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qCAAqC,CAAA;AAAA,QAC/D,eAAeA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,2BAA2B,CAAA;AAAA,QACzE,aAAA,EAAeA,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,6CAA6C;AAAA,OAChG;AAAA;AACH,GACF;AACF;AAMO,SAAS,qBAAqB,OAAA,EAAiB;AACpD,EAAA,OAAOF,IAAAA;AAAA,IACL,OAAO,EAAE,OAAA,EAAQ,KAAM;AACrB,MAAA,MAAM,aAAA,GAAgB,SAAS,OAAO,CAAA,KAAA,CAAA;AACtC,MAAA,MAAM,aAAA,GAAqB0B,IAAA,CAAA,IAAA,CAAK,OAAA,EAAS,UAAA,EAAY,aAAa,CAAA;AAElE,MAAA,IAAI;AACF,QAAA,IAAI;AACF,UAAA,MAAS,WAAO,aAAa,CAAA;AAAA,QAC/B,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAK,SAAA,CAAU,EAAE,OAAO,CAAA,sBAAA,EAAyB,aAAa,KAAK,CAAA;AAAA,QAC5E;AAEA,QAAA,MAAM,YAAA,GAAe,MAAS,GAAA,CAAA,QAAA,CAAS,aAAA,EAAe,OAAO,CAAA;AAC7D,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AACzC,QAAA,MAAM,EAAE,MAAK,GAAI,SAAA;AAEjB,QAAA,MAAM,aAAA,GAAgB,MAAS,GAAA,CAAA,QAAA,CAAS,IAAA,CAAK,YAAY,OAAO,CAAA;AAChE,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAEvC,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,SAAA,CAAU,OAAA,EAAS;AAChD,UAAA,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,YAAa,CAAA,GAAI,SAAA,CAAU,OAAA;AAEhD,UAAA,IAAI,UAAU,gBAAA,IAAoB,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,gBAAgB,CAAA,EAAG;AAC3E,YAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,YAAa,CAAA;AAClD,YAAA,IAAI,OAAA,IAAWE,mBAAAA,CAAoB,OAAO,CAAA,IAAK,QAAQ,MAAA,EAAQ;AAC7D,cAAA,KAAA,MAAW,WAAA,IAAe,UAAU,gBAAA,EAAkB;AACpD,gBAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,WAAA,KAAgB,IAAA,IAAQ,UAAU,WAAA,EAAa;AACpF,kBAAA,MAAM,YAAa,WAAA,CAAiC,IAAA;AACpD,kBAAA,MAAM,GAAA,GAAM,QAAQ,MAAA,CAAO,SAAA;AAAA,oBAAU,CAAA,CAAA,KACnC,OAAO,CAAA,KAAM,QAAA,IAAY,MAAM,IAAA,IAAQ,MAAA,IAAU,CAAA,IAChD,CAAA,CAAuB,IAAA,KAAS;AAAA,mBACnC;AACA,kBAAA,IAAI,QAAQ,CAAA,CAAA,EAAI;AACd,oBAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,kBACxB;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,SAAA,CAAU,KAAA,EAAO;AAC5C,UAAA,OAAA,CAAQ,KAAK,4DAA4D,CAAA;AAAA,QAC3E;AAEA,QAAA,IAAI,IAAA,CAAK,IAAA,KAAS,cAAA,IAAkB,SAAA,CAAU,WAAA,EAAa;AACzD,UAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,YAAa,CAAA;AAClD,UAAA,IAAI,OAAA,IAAWA,oBAAoB,OAAO,CAAA,IAAK,QAAQ,MAAA,IAAU,IAAA,CAAK,qBAAqB,KAAA,CAAA,EAAW;AACpG,YAAA,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,GAAI,SAAA,CAAU,WAAA;AAAA,UACpD;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA;AAC7C,QAAA,MAAS,GAAA,CAAA,SAAA,CAAU,IAAA,CAAK,UAAA,EAAY,MAAM,CAAA;AAC1C,QAAA,MAAS,WAAO,aAAa,CAAA;AAE7B,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,CAAA,oBAAA,EAA4BF,IAAA,CAAA,QAAA,CAAS,IAAA,CAAK,UAAU,CAAC,CAAA,CAAA;AAAA,UAC9D,aAAa,CAAA,EAAG,IAAA,CAAK,MAAM,MAAA,CAAO,MAAA,GAAS,IAAI,CAAC,CAAA,EAAA;AAAA,SACjD,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAM,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACjE,QAAA,OAAO,KAAK,SAAA,CAAU,EAAE,OAAO,CAAA,uBAAA,EAA0B,GAAG,IAAI,CAAA;AAAA,MAClE;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA,sDAAA,CAAA;AAAA,MAGb,MAAA,EAAQxB,EAAE,MAAA,CAAO;AAAA,QACf,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,6BAA6B;AAAA,OAC3D;AAAA;AACH,GACF;AACF;AAMO,SAAS,0BAA0B,OAAA,EAAiB;AACzD,EAAA,OAAO;AAAA,IACL,oBAAA,EAAsB,+BAA+B,OAAO,CAAA;AAAA,IAC5D,YAAA,EAAc,uBAAuB,OAAO,CAAA;AAAA,IAC5C,UAAA,EAAY,qBAAqB,OAAO;AAAA,GAC1C;AACF;AC7TO,SAAS,kBAAkB,MAAA,EAA2B;AAC3D,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,GAAQ,IAAI,IAAA,GAAO,EAAA,EAAI,SAAQ,GAAI,MAAA;AAGlD,EAAA,MAAM,iBAAA,GAAuC;AAAA,IAC3C,IAAA,EAAM,QAAA;AAAA,IACN,GAAA,EAAK;AAAA,MACH,YAAA,EAAc,KAAA;AAAA,MACd,YAAA,EAAc,KAAA;AAAA,MACd,WAAA,EAAa,IAAA;AAAA,MACb,eAAA,EAAiB;AAAA;AACnB,GACF;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,iBAAA,CAAkB,iBAAiB,CAAA;AAStD,EAAA,MAAM,YAAA,GAAeF,IAAAA;AAAA,IACnB,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAM,KAAM;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa;AAAA,UAC/C,OAAA;AAAA,UACA,SAAA,EAAW,OAAA;AAAA,UACX,MAAA;AAAA,UACA,OAAO,KAAA,IAAS;AAAA,SACjB,CAAA;AAED,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,4BAAA,EAA+B,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QAC7D;AAEA,QAAA,OAAO,CAAA,oBAAA,EAAuB,OAAO,CAAA,IAAA,EAAO,OAAO,GAAG,MAAA,GAAS,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAA;AAAA,MAC5F,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC5F;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,cAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,0EAAA,CAAA;AAAA,MASb,MAAA,EAAQE,EAAE,MAAA,CAAO;AAAA,QACf,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,6DAA6D,CAAA;AAAA,QAC1F,QAAQA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,sDAAsD,CAAA;AAAA,QAC7F,OAAOA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,4CAA4C;AAAA,OACnF;AAAA;AACH,GACF;AAKA,EAAA,MAAM,oBAAA,GAAuBF,IAAAA;AAAA,IAC3B,OAAO,EAAE,UAAA,EAAY,UAAA,EAAW,KAAM;AACpC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,cAAA,EAAgB;AAAA,UAClD,UAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,yBAAA,EAA4B,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QAC1D;AAEA,QAAA,OAAO,gDAAgD,UAAU,CAAA,CAAA;AAAA,MACnE,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,0BAA0B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACzF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,sBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,iEAAA,CAAA;AAAA,MASb,MAAA,EAAQE,EAAE,MAAA,CAAO;AAAA,QACf,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mDAAmD,CAAA;AAAA,QACnF,YAAYA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yDAAyD;AAAA,OACrG;AAAA;AACH,GACF;AAKA,EAAA,MAAM,aAAA,GAAgBF,IAAAA;AAAA,IACpB,OAAO,EAAE,OAAA,EAAS,KAAA,EAAM,KAAM;AAC5B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,QAAA,EAAU;AAAA,UAC5C,OAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACD,CAAA;AAED,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,kBAAA,EAAqB,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QACnD;AAEA,QAAA,OAAO,2BAA2B,OAAO,CAAA,CAAA;AAAA,MAC3C,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,6BAA6B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC5F;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,eAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,6EAAA,CAAA;AAAA,MASb,MAAA,EAAQE,EAAE,MAAA,CAAO;AAAA,QACf,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,6CAA6C,CAAA;AAAA,QAC1E,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,oDAAoD;AAAA,OACpG;AAAA;AACH,GACF;AAKA,EAAA,MAAM,WAAA,GAAcF,IAAAA;AAAA,IAClB,OAAO,EAAE,UAAA,EAAW,KAAM;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ;AAAA,UAC1C,UAAA;AAAA,UACA,KAAA,EAAO,KAAA;AAAA;AAAA,UACP;AAAA,SACD,CAAA;AAED,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,gBAAA,EAAmB,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QACjD;AAEA,QAAA,OAAO,+BAA+B,UAAU,CAAA,CAAA;AAAA,MAClD,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,yBAAyB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACxF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,aAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,2CAAA,CAAA;AAAA,MASb,MAAA,EAAQE,EAAE,MAAA,CAAO;AAAA,QACf,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4BAA4B;AAAA,OAC7D;AAAA;AACH,GACF;AASA,EAAA,MAAM,gBAAA,GAAmBF,IAAAA;AAAA,IACvB,OAAO,EAAE,KAAA,EAAO,MAAM,UAAA,EAAY,UAAA,EAAY,OAAM,KAAM;AACxD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,UAAA,EAAY;AAAA,UAC9C,KAAA;AAAA,UACA,IAAA;AAAA,UACA,UAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAO,KAAA,IAAS;AAAA,SACjB,CAAA;AAED,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,+BAAA,EAAkC,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QAChE;AAEA,QAAA,MAAM,KAAK,MAAA,CAAO,IAAA;AAClB,QAAA,OAAO,CAAA,yBAAA,EAA4B,EAAA,CAAG,MAAM,CAAA,EAAA,EAAK,GAAG,GAAG,CAAA,CAAA;AAAA,MACzD,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,gCAAgC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC/F;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,kBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAAA,MAiBb,MAAA,EAAQE,EAAE,MAAA,CAAO;AAAA,QACf,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oCAAoC,CAAA;AAAA,QAC/D,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0CAA0C,CAAA;AAAA,QACpE,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0CAA0C,CAAA;AAAA,QAC1E,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uCAAuC,CAAA;AAAA,QACvE,OAAOA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,qCAAqC;AAAA,OAC7E;AAAA;AACH,GACF;AAKA,EAAA,MAAM,kBAAA,GAAqBF,IAAAA;AAAA,IACzB,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAM,KAAM;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,YAAA,EAAc;AAAA,UAChD,OAAO,KAAA,IAAS,MAAA;AAAA,UAChB,MAAA,EAAQ,UAAU,EAAC;AAAA,UACnB,OAAO,KAAA,IAAS;AAAA,SACjB,CAAA;AAED,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,uBAAA,EAA0B,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QACxD;AAEA,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AAEpB,QAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,UAAA,OAAO,wCAAA;AAAA,QACT;AAEA,QAAA,MAAM,SAAA,GAAY,MAAA,CACf,GAAA,CAAI,CAAC,KAAA,KAAU;AACd,UAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC3D,UAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK,MAAM,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,KAAK,CAAA,CAAA,EAAI,SAAA,GAAY,CAAA,EAAA,EAAK,SAAS,MAAM,EAAE,CAAA,CAAA;AAAA,QAC/F,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,QAAA,OAAO,CAAA,MAAA,EAAS,OAAO,MAAM,CAAA;AAAA,EAAe,SAAS,CAAA,CAAA;AAAA,MACvD,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,yBAAyB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACxF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,oBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,iEAAA,CAAA;AAAA,MASb,MAAA,EAAQE,EAAE,MAAA,CAAO;AAAA,QACf,KAAA,EAAOA,CAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,QAAA,EAAU,KAAK,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,sCAAsC,CAAA;AAAA,QACnG,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,kBAAkB,CAAA;AAAA,QAClE,OAAOA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kDAAkD;AAAA,OACzF;AAAA;AACH,GACF;AAKA,EAAA,MAAM,gBAAA,GAAmBF,IAAAA;AAAA,IACvB,OAAO,EAAE,WAAA,EAAY,KAAM;AACzB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,UAAA,EAAY;AAAA,UAC9C;AAAA,SACD,CAAA;AAED,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,qBAAA,EAAwB,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QACtD;AAEA,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAepB,QAAA,MAAM,EAAE,KAAA,EAAO,QAAA,EAAS,GAAI,IAAA;AAC5B,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE3D,QAAA,IAAI,SAAS,CAAA,OAAA,EAAU,KAAA,CAAM,MAAM,CAAA,EAAA,EAAK,MAAM,KAAK;AAAA,CAAA;AACnD,QAAA,MAAA,IAAU,CAAA,OAAA,EAAU,MAAM,KAAK;AAAA,CAAA;AAC/B,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAA,IAAU,WAAW,SAAS;AAAA,CAAA;AAAA,QAChC;AACA,QAAA,MAAA,IAAU;AAAA;AAAA,EAAmB,KAAA,CAAM,QAAQ,kBAAkB;AAAA,CAAA;AAE7D,QAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,UAAA,MAAA,IAAU;AAAA,EAAK,SAAS,MAAM,CAAA;AAAA,CAAA;AAC9B,UAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,YAAA,MAAA,IAAU;AAAA,CAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,QAAQ,UAAU,CAAA;AAAA,EAAO,QAAQ,IAAI;AAAA,CAAA;AAAA,UAC9E,CAAC,CAAA;AAAA,QACH;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,wBAAwB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACvF;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,kBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,qCAAA,CAAA;AAAA,MASb,MAAA,EAAQE,EAAE,MAAA,CAAO;AAAA,QACf,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0BAA0B;AAAA,OAC5D;AAAA;AACH,GACF;AAKA,EAAA,MAAM,sBAAA,GAAyBF,IAAAA;AAAA,IAC7B,OAAO,EAAE,QAAA,EAAS,KAAM;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,OAAA,CAAQ,eAAA,EAAiB;AAAA,UACnD;AAAA,SACD,CAAA;AAED,QAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,UAAA,OAAO,CAAA,2BAAA,EAA8B,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA,CAAA;AAAA,QAC5D;AAEA,QAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAQpB,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AAEtB,QAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,UAAA,OAAO,sBAAsB,QAAQ,CAAA,CAAA;AAAA,QACvC;AAEA,QAAA,IAAI,MAAA,GAAS,CAAA,EAAG,QAAA,CAAS,MAAM,sBAAsB,QAAQ,CAAA;AAAA,CAAA;AAC7D,QAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC5B,UAAA,MAAA,IAAU;AAAA,CAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAA,EAAK,QAAQ,UAAU,CAAA;AAAA,EAAO,QAAQ,IAAI;AAAA,CAAA;AAAA,QAC9E,CAAC,CAAA;AAED,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,OAAO,8BAA8B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MAC7F;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,wBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,wCAAA,CAAA;AAAA,MASb,MAAA,EAAQE,EAAE,MAAA,CAAO;AAAA,QACf,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qBAAqB;AAAA,OACpD;AAAA;AACH,GACF;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,oBAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,kBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,uBAAuB,MAAA,EAA2B;AAChE,EAAA,MAAM,KAAA,GAAQ,kBAAkB,MAAM,CAAA;AACtC,EAAA,OAAO,MAAA,CAAO,OAAO,KAAK,CAAA;AAC5B;;;AC1bO,IAAM,uBAAN,MAA2B;AAAA,EAA3B,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAA6B;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKpD,KAAA,CAAM,UAAkB,QAAA,EAAiC;AACvD,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,EAA+C;AACjD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,QAAA,EAA2B;AAChC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAwB;AACtB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,QAAA,EAAU,IAAI,CAAA,MAAO;AAAA,MACpE,QAAA;AAAA,MACA,GAAG;AAAA,KACL,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,EAA2B;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AAAA,EACnC;AACF,CAAA;ACuGO,IAAM,qBAAA,GAAN,cAAoC,mBAAA,CAAoB;AAAA,EAK7D,YAAY,OAAA,EAAuC;AACjD,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAA;AAClB,IAAA,IAAA,CAAK,qBAAA,GAAwB,QAAQ,qBAAA,IAAyB,mBAAA;AAC9D,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAQ,gBAAA,IAAoB,cAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,MAAA,EAAgC;AAClD,IAAA,MAAM,QAAA,GAAW,OAAO,YAAA,EAAc,SAAA;AACtC,IAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,MAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,IAChE;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,MAAA,EAA4C;AAClE,IAAA,OAAO,OAAO,YAAA,EAAc,aAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,MAAA,EAA8D;AAC3E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACxC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAEhD,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,EAAA,CACd,UAAA,CAAW,IAAA,CAAK,qBAAqB,CAAA,CACrC,KAAA,CAAM,UAAA,EAAY,IAAA,EAAM,QAAQ,CAAA;AAEnC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,cAAA,EAAgB,IAAA,EAAM,YAAY,CAAA;AAAA,IACxD,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,MAAM,OAAA,CAAQ,WAAA,EAAa,MAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAI;AACjC,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA;AAC3B,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AAGtB,IAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,GAC/B,UAAA,CAAW,IAAA,CAAK,gBAAgB,CAAA,CAChC,KAAA,CAAM,YAAY,IAAA,EAAM,QAAQ,EAChC,KAAA,CAAM,cAAA,EAAgB,MAAM,IAAA,CAAK,YAAY,EAC7C,GAAA,EAAI;AAEP,IAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,IAAA,CAAK,GAAA,CAAI,CAAC,QAAA,KAAa;AAC1D,MAAA,MAAM,SAAA,GAAY,SAAS,IAAA,EAAK;AAChC,MAAA,OAAO,CAAC,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,OAAA,EAAS,UAAU,KAAK,CAAA;AAAA,IAC9D,CAAC,CAAA;AAGD,IAAA,MAAM,YAAA,GAAe,KAAK,kBAAA,GACtB;AAAA,MACE,YAAA,EAAc;AAAA,QACZ,SAAA,EAAW,QAAA;AAAA,QACX,eAAe,IAAA,CAAK;AAAA;AACtB,KACF,GACA,MAAA;AAEJ,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ;AAAA,QACN,YAAA,EAAc;AAAA,UACZ,SAAA,EAAW,QAAA;AAAA,UACX,eAAe,IAAA,CAAK;AAAA;AACtB,OACF;AAAA,MACA,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAA,CACL,MAAA,EACA,OAAA,EACiC;AACjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,EAAA;AAEhC,IAAA,IAAI,QAAQ,IAAA,CAAK,EAAA,CACd,UAAA,CAAW,IAAA,CAAK,qBAAqB,CAAA,CACrC,KAAA,CAAM,UAAA,EAAY,IAAA,EAAM,QAAQ,CAAA,CAChC,OAAA,CAAQ,aAAa,MAAM,CAAA,CAC3B,MAAM,KAAK,CAAA;AAGd,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzD,QAAA,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA,EAAI,MAAM,KAAK,CAAA;AAAA,MACpD;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,EAAS,MAAA,EAAQ,YAAA,EAAc,aAAA,EAAe;AAChD,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,EAAA,CAC1B,WAAW,IAAA,CAAK,qBAAqB,EACrC,KAAA,CAAM,UAAA,EAAY,MAAM,QAAQ,CAAA,CAChC,MAAM,cAAA,EAAgB,IAAA,EAAM,QAAQ,MAAA,CAAO,YAAA,CAAa,aAAa,CAAA,CACrE,GAAA,EAAI;AAEP,MAAA,IAAI,CAAC,UAAU,KAAA,EAAO;AACpB,QAAA,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,SAAA,CAAU,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAI;AAEjC,IAAA,KAAA,MAAW,GAAA,IAAO,SAAS,IAAA,EAAM;AAC/B,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AAEtB,MAAA,MAAM,YAAA,GAAe,KAAK,kBAAA,GACtB;AAAA,QACE,YAAA,EAAc;AAAA,UACZ,SAAA,EAAW,QAAA;AAAA,UACX,eAAe,IAAA,CAAK;AAAA;AACtB,OACF,GACA,MAAA;AAEJ,MAAA,MAAM;AAAA,QACJ,MAAA,EAAQ;AAAA,UACN,YAAA,EAAc;AAAA,YACZ,SAAA,EAAW,QAAA;AAAA,YACX,eAAe,IAAA,CAAK;AAAA;AACtB,SACF;AAAA,QACA,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,UAAU,IAAA,CAAK,QAAA;AAAA,QACf;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,GAAA,CACJ,MAAA,EACA,UAAA,EACA,UACA,YAAA,EACyB;AACzB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACxC,IAAA,MAAM,eAAe,UAAA,CAAW,EAAA;AAChC,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAEtD,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,MAAM,OAAA,GAA8B;AAAA,MAClC,QAAA;AAAA,MACA,YAAA;AAAA,MACA,kBAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW;AAAA,KACb;AAGA,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA;AACzC,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,qBAAqB,EAAE,GAAA,CAAI,KAAK,CAAA,CAAE,GAAA,CAAI,OAAO,CAAA;AAE3E,IAAA,OAAO;AAAA,MACL,YAAA,EAAc;AAAA,QACZ,SAAA,EAAW,QAAA;AAAA,QACX,aAAA,EAAe;AAAA;AACjB,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CACJ,MAAA,EACA,MAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACxC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,eAAA,CAAgB,MAAM,CAAA;AAEhD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,IAC3D;AAEA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,KAAA,EAAM;AAC5B,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,KAAA,MAAW,CAAC,KAAK,CAAC,OAAA,EAAS,KAAK,CAAC,CAAA,IAAK,MAAA,CAAO,OAAA,EAAQ,EAAG;AACtD,MAAA,MAAM,KAAA,GAAQ,GAAG,QAAQ,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,EAAI,MAAM,IAAI,GAAG,CAAA,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,KAAK,EAAA,CAAG,UAAA,CAAW,KAAK,gBAAgB,CAAA,CAAE,IAAI,KAAK,CAAA;AAElE,MAAA,MAAM,SAAA,GAA2B;AAAA,QAC/B,QAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA,EAAW;AAAA,OACb;AAEA,MAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,SAAS,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,MAAM,MAAA,EAAO;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,QAAA,EAAiC;AAElD,IAAA,MAAM,mBAAA,GAAsB,MAAM,IAAA,CAAK,EAAA,CACpC,UAAA,CAAW,IAAA,CAAK,qBAAqB,CAAA,CACrC,KAAA,CAAM,UAAA,EAAY,IAAA,EAAM,QAAQ,EAChC,GAAA,EAAI;AAEP,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,EAAA,CAAG,KAAA,EAAM;AACtC,IAAA,KAAA,MAAW,GAAA,IAAO,oBAAoB,IAAA,EAAM;AAC1C,MAAA,eAAA,CAAgB,MAAA,CAAO,IAAI,GAAG,CAAA;AAAA,IAChC;AACA,IAAA,MAAM,gBAAgB,MAAA,EAAO;AAG7B,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,EAAA,CAC/B,UAAA,CAAW,IAAA,CAAK,gBAAgB,CAAA,CAChC,KAAA,CAAM,UAAA,EAAY,IAAA,EAAM,QAAQ,EAChC,GAAA,EAAI;AAEP,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,EAAA,CAAG,KAAA,EAAM;AAClC,IAAA,KAAA,MAAW,GAAA,IAAO,eAAe,IAAA,EAAM;AACrC,MAAA,WAAA,CAAY,MAAA,CAAO,IAAI,GAAG,CAAA;AAAA,IAC5B;AACA,IAAA,MAAM,YAAY,MAAA,EAAO;AAAA,EAC3B;AACF,CAAA;;;AC7VO,IAAM,wBAAN,MAA4B;AAAA,EAIjC,YAAY,OAAA,EAAuC;AACjD,IAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,gBAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAA,EAAiC;AAC1C,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,CAAE,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA,CAAE,GAAA,CAAI,OAAO,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAI,QAAA,EAA2C;AACnD,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA,CAAE,GAAA,EAAI;AAExE,IAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,OAAO;AAAA,MACL,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW,KAAK,SAAA,EAAW,MAAA,QAAc,IAAI,IAAA,CAAK,KAAK,SAA8B,CAAA;AAAA,MACrF,cAAA,EAAgB,KAAK,cAAA,EAAgB,MAAA,QAAc,IAAI,IAAA,CAAK,KAAK,cAAmC;AAAA,KACtG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAM,QAAA,EAAiC;AAC3C,IAAA,MAAM,IAAA,CAAK,GAAG,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA,CAAE,MAAA,CAAO;AAAA,MAC7D,cAAA,sBAAoB,IAAA;AAAK,KAC1B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,QAAA,EAAiC;AAC5C,IAAA,MAAM,IAAA,CAAK,GAAG,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA,CAAE,MAAA,EAAO;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAA,EAAmE;AAC5E,IAAA,IAAI,KAAA,GAAQ,KAAK,EAAA,CACd,UAAA,CAAW,KAAK,UAAU,CAAA,CAC1B,OAAA,CAAQ,gBAAA,EAAkB,MAAM,CAAA;AAEnC,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,QAAQ,MAAM,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAS,KAAA,IAAS,GAAA;AAChC,IAAA,KAAA,GAAQ,KAAA,CAAM,MAAM,KAAK,CAAA;AAEzB,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAI;AAEjC,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AAChC,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,MAAA,OAAO;AAAA,QACL,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,SAAA,EAAW,KAAK,SAAA,EAAW,MAAA,QAAc,IAAI,IAAA,CAAK,KAAK,SAA8B,CAAA;AAAA,QACrF,cAAA,EAAgB,KAAK,cAAA,EAAgB,MAAA,QAAc,IAAI,IAAA,CAAK,KAAK,cAAmC;AAAA,OACtG;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,WAAA,GAAsB,EAAA,EAAqB;AAC7D,IAAA,MAAM,MAAA,GAAS,IAAI,IAAA,CAAK,IAAA,CAAK,KAAI,GAAI,WAAA,GAAc,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAEjE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CACzB,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,CAC1B,KAAA,CAAM,gBAAA,EAAkB,GAAA,EAAK,MAAM,EACnC,GAAA,EAAI;AAEP,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,KAAA,EAAM;AAC5B,IAAA,KAAA,MAAW,GAAA,IAAO,SAAS,IAAA,EAAM;AAC/B,MAAA,KAAA,CAAM,MAAA,CAAO,IAAI,GAAG,CAAA;AAAA,IACtB;AAEA,IAAA,MAAM,MAAM,MAAA,EAAO;AACnB,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AACF,CAAA;;;AC5IO,IAAM,iBAAN,MAAqB;AAAA,EAO1B,WAAA,CAAY,OAAA,GAAiC,EAAC,EAAG;AAHjD,IAAA,IAAA,CAAQ,qBAAA,GAAsD,IAAA;AAC9D,IAAA,IAAA,CAAQ,qBAAA,GAAsD,IAAA;AAG5D,IAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAA,IAAQ,QAAA;AAC5B,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,oBAAA,EAAqB;AAC9C,IAAA,IAAA,CAAK,mBAAA,uBAA0B,GAAA,EAAI;AAEnC,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,OAAA,CAAQ,WAAA,EAAa;AACpD,MAAA,IAAA,CAAK,wBAAwB,IAAI,qBAAA,CAAsB,EAAE,EAAA,EAAI,OAAA,CAAQ,aAAa,CAAA;AAClF,MAAA,IAAA,CAAK,wBAAwB,IAAI,qBAAA,CAAsB,EAAE,EAAA,EAAI,OAAA,CAAQ,aAAa,CAAA;AAAA,IACpF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,QAAA,EAA4C;AAC1D,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,IAAA,CAAK,qBAAA,EAAuB;AAC3D,MAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,IACd;AAEA,IAAA,IAAI,YAAA,GAAe,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,QAAQ,CAAA;AACxD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,YAAA,GAAe,IAAI,WAAA,EAAY;AAC/B,MAAA,IAAA,CAAK,mBAAA,CAAoB,GAAA,CAAI,QAAA,EAAU,YAAY,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,UAAkB,QAAA,EAAiC;AAEvD,IAAA,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,QAAA,EAAU,QAAQ,CAAA;AAG3C,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,IAAA,CAAK,qBAAA,EAAuB;AAC3D,MAAA,MAAM,OAAA,GAAmB;AAAA,QACvB,QAAA;AAAA,QACA,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,SAAS,QAAA,CAAS,OAAA;AAAA,QAClB,SAAA,EAAW,IAAI,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA;AAAA,QACtC,cAAA,EAAgB,IAAI,IAAA,CAAK,QAAA,CAAS,cAAc;AAAA,OAClD;AACA,MAAA,IAAA,CAAK,sBAAsB,IAAA,CAAK,OAAO,CAAA,CAAE,KAAA,CAAM,QAAQ,KAAK,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,EAA+C;AACjD,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,QAAA,EAAwD;AACrE,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,IAAA,CAAK,qBAAA,EAAuB;AAC3D,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,qBAAA,CAAsB,IAAI,QAAQ,CAAA;AAC7D,MAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,MAAA,OAAO;AAAA,QACL,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,SAAA,EAAW,OAAA,CAAQ,SAAA,CAAU,OAAA,EAAQ;AAAA,QACrC,cAAA,EAAgB,OAAA,CAAQ,cAAA,CAAe,OAAA;AAAQ,OACjD;AAAA,IACF;AACA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,EAA2B;AAC/B,IAAA,IAAI,IAAA,CAAK,SAAS,WAAA,EAAa;AAC7B,MAAA,IAAA,CAAK,uBAAuB,YAAA,CAAa,QAAQ,CAAA,CAAE,KAAA,CAAM,QAAQ,KAAK,CAAA;AACtE,MAAA,IAAA,CAAK,uBAAuB,MAAA,CAAO,QAAQ,CAAA,CAAE,KAAA,CAAM,QAAQ,KAAK,CAAA;AAChE,MAAA,IAAA,CAAK,aAAA,CAAc,OAAO,QAAQ,CAAA;AAClC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAA,CAAK,aAAA,CAAc,OAAO,QAAQ,CAAA;AAClC,IAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,MAAA,CAAO,QAAQ,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,cAAc,IAAA,EAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAAsC;AAC1C,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,WAAA,IAAe,IAAA,CAAK,qBAAA,EAAuB;AAC3D,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,qBAAA,CAAsB,IAAA,EAAK;AACvD,MAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC1B,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,SAAA,EAAW,CAAA,CAAE,SAAA,CAAU,OAAA,EAAQ;AAAA,QAC/B,cAAA,EAAgB,CAAA,CAAE,cAAA,CAAe,OAAA;AAAQ,OAC3C,CAAE,CAAA;AAAA,IACJ;AACA,IAAA,OAAO,IAAA,CAAK,cAAc,IAAA,EAAK;AAAA,EACjC;AACF;;;AC1IA,IAAM,wBAAA,GAAoD;AAAA;AAAA,EAExD,OAAA,EAAS;AACX,CAAA;AAQO,SAAS,mBAAmB,MAAA,EAA4C;AAC7E,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,wBAAA,EAAyB;AAC7C,EAAA,OAAO,MAAA;AACT;;;ACgHA,IAAM,kBAAA,GAAqB,CAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA,8CAAA,CAAA;AAqD3B,SAAS,eAAA,CACP,QAAA,EACA,KAAA,EACA,OAAA,EACA;AACA,EAAA,MAAM,WAAA,GAAc,CAAA;AAEpB,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,UAAA;AACH,MAAA,IAAI,OAAA;AACF,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,KAAA,IAAS,eAAA,CAAgB,IAAI,CAAA,CAAE,CAAA;AAC7E,MAAA,OAAO,oBAAA,CAAqB;AAAA,QAC1B,KAAA,EAAO,SAAS,eAAA,CAAgB,IAAA;AAAA,QAChC;AAAA,OACD,CAAA;AAAA,IAEH,KAAK,QAAA;AACH,MAAA,IAAI,OAAA;AACF,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAA8B,KAAA,IAAS,aAAA,CAAc,KAAK,CAAA,CAAE,CAAA;AAC1E,MAAA,OAAO,kBAAA,CAAmB;AAAA,QACxB,KAAA,EAAO,SAAS,aAAA,CAAc,KAAA;AAAA,QAC9B;AAAA,OACD,CAAA;AAAA,IAEH,KAAK,WAAA;AAAA,IACL;AACE,MAAA,IAAI,OAAA;AACF,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8BAAA,EAAiC,KAAA,IAAS,gBAAA,CAAiB,iBAAiB,CAAA,CAAE,CAAA;AAC5F,MAAA,OAAO,qBAAA,CAAsB;AAAA,QAC3B,KAAA,EAAO,SAAS,gBAAA,CAAiB,iBAAA;AAAA,QACjC;AAAA,OACD,CAAA;AAAA;AAEP;AAMA,IAAI,qBAAA,GAA+C,IAAA;AAEnD,SAAS,wBAAA,GAA2C;AAClD,EAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,IAAA,qBAAA,GAAwB,IAAI,cAAA,EAAe;AAAA,EAC7C;AACA,EAAA,OAAO,qBAAA;AACT;AAeA,eAAsB,iBACpB,OAAA,EAC2B;AAC3B,EAAA,MAAM;AAAA,IACJ,KAAA,EAAO,UAAA;AAAA,IACP,OAAA;AAAA,IACA,QAAA,EAAU,gBAAA;AAAA,IACV,QAAA,GAAW,WAAA;AAAA,IACX,KAAA;AAAA,IACA,OAAA,GAAU,KAAA;AAAA,IACV,WAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,cAAA,IAAkB,wBAAA,EAAyB;AAGpE,EAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,GAAI,UAAA,GAAa,CAAC,UAAU,CAAA;AAGvE,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,KAAA,GAAQ,YAAY,SAAS,CAAA;AACnC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,SAAS,CAAA,+BAAA,EACG,SAAS,CAAA,kEAAA;AAAA,OAE5C;AAAA,IACF;AACA,IAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAEjB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,SAAS,CAAA,CAAE,CAAA;AACtD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0BAAA,EAA6B,KAAA,CAAM,WAAW,CAAA,CAAE,CAAA;AAC5D,MAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAQ;AAC9B,QAAA,OAAA,CAAQ,IAAI,CAAA,4BAAA,EAA+B,KAAA,CAAM,aAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,OAAO,CAAC,CAAA;AAG7B,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,UAAA,CAChB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,QAAA,MAAM,OAAA,GAAU,cAAA,CAAe,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC9C,QAAA,IAAI,WAAW,OAAA,EAAS;AACtB,UAAA,OAAA,CAAQ,IAAI,CAAA,+BAAA,EAAkC,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAA;AAAA,QACnE;AACA,QAAA,OAAO,OAAA;AAAA,MACT,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,GAAA,KAAuB,QAAQ,IAAI,CAAA;AAC9C,MAAA,aAAA,CAAc,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,IAC5B;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,IAAA,CAAK,aAAa,CAAA;AAGnD,EAAA,IAAI,iBAAA;AAEJ,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,iBAAA,GAAoB,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA;AAAA,EAChC,CAAA,MAAO;AACL,IAAA,MAAM,cAAA,GAAiB,MAAA,CACpB,GAAA,CAAI,CAAC,MAAM,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,IAAA,EAAO,CAAA,CAAE,WAAW,CAAA,CAAE,CAAA,CAC9C,KAAK,IAAI,CAAA;AAEZ,IAAA,MAAM,gBAAgB,MAAA,CACnB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,WAAA,EAAc,EAAE,IAAI;;AAAA,EAAO,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA,CACjD,KAAK,aAAa,CAAA;AAErB,IAAA,iBAAA,GAAoB,CAAA;;AAAA;;AAAA,EAItB,cAAc;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,EASd,aAAa,CAAA,CAAA;AAAA,EACb;AAEA,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,kBAAA;AAAA,IACA,6BAAA,GAAgC,iBAAA;AAAA,IAChC,UAAA,GAAa,qCAAqC,UAAA,GAAa;AAAA,GACjE,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AAGZ,EAAA,MAAM,QAAA,GAAW,oBAAoB2B,EAAA,EAAK;AAG1C,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,QAAA,EAAU,KAAA,EAAO,OAAO,CAAA;AAG1D,EAAA,MAAM,OAAA,GAAU,IAAI,iBAAA,CAAkB;AAAA,IACpC,OAAA,EAAS,OAAA;AAAA,IACT,WAAA,EAAa;AAAA,GACd,CAAA;AAGD,EAAA,MAAM,WAAA,GAAc,kBAAkB,OAAO,CAAA;AAC7C,EAAA,MAAM,cAAA,GAAiB,qBAAqB,OAAO,CAAA;AACnD,EAAA,MAAM,kBAAA,GAAqB,yBAAyB,OAAO,CAAA;AAG3D,EAAA,MAAM,cAAA,GAAiB,CAAC,gBAAA,EAAkB,qBAAA,EAAuB,sBAAsB,CAAA;AACvF,EAAA,MAAM,WAAA,GAAc,CAAC,qBAAA,EAAuB,mBAAmB,CAAA;AAC/D,EAAA,MAAM,aAAA,GAAgB,CAAC,cAAA,EAAgB,mBAAmB,CAAA;AAC1D,EAAA,MAAM,cAAA,GAAiB,aAAa,IAAA,KAAS,gBAAA;AAC7C,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA;AAC1D,EAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA;AAC9D,EAAA,MAAM,kBAAA,GAAqB,cAAA,CAAe,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA,IAAK,aAAA;AAEzE,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,uBAAA;AACJ,EAAA,IAAI,0BAAA;AAEJ,EAAA,IAAI,kBAAA;AAEJ,EAAA,MAAM,aAAA,GAAgB,kBAAA,GAAqB,yBAAA,CAA0B,OAAO,CAAA,GAAI,IAAA;AAEhF,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,gBAAgB,yBAAA,CAA0B;AAAA,MAC9C,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AACD,IAAA,WAAA,GAAc,aAAA,CAAc,IAAA;AAC5B,IAAA,uBAAA,GAA0B,aAAA,CAAc,gBAAA;AACxC,IAAA,0BAAA,GAA6B,aAAA,CAAc,0BAAA;AAE3C,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,uBAAA,CAAwB,QAAQ,eAAe,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAI,CAAA,2DAAA,CAA6D,CAAA;AAAA,IAC3E;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,kBAAA,GAAqB,wBAAA,CAAyB,EAAE,OAAA,EAAS,CAAA;AACzD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,8CAAA,EAAiD,YAAA,CAAa,IAAI,CAAA,MAAA,CAAQ,CAAA;AAAA,IACxF;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,YAAA,GACxB,sBAAA,CAAuB;AAAA,IACrB,KAAA,EAAO,QAAQ,YAAA,CAAa,KAAA;AAAA,IAC5B,KAAA,EAAO,QAAQ,YAAA,CAAa,KAAA;AAAA,IAC5B,IAAA,EAAM,QAAQ,YAAA,CAAa,IAAA;AAAA,IAC3B;AAAA,GACD,CAAA,GACD,IAAA;AAEJ,EAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,IAAA,OAAA,CAAQ,IAAI,CAAA,iCAAA,CAAmC,CAAA;AAAA,EACjD;AAIA,EAAA,MAAM,KAAA,GAAe;AAAA,IACnB,WAAA;AAAA,IACA,cAAA;AAAA,IACA,GAAI,cAAA,GAAiB,EAAC,GAAI,CAAC,kBAAkB,CAAA;AAAA,IAC7C,GAAI,WAAA,GAAc,CAAC,WAAW,IAAI,EAAC;AAAA,IACnC,GAAI,kBAAA,GACA;AAAA,MACE,kBAAA,CAAmB,qBAAA;AAAA,MACnB,kBAAA,CAAmB;AAAA,QAErB,EAAC;AAAA,IACL,GAAI,aAAA,GACA;AAAA,MACE,aAAA,CAAc,oBAAA;AAAA,MACd,aAAA,CAAc,YAAA;AAAA,MACd,aAAA,CAAc;AAAA,QAEhB,EAAC;AAAA,IACL,GAAI,eAAe;AAAC,GACtB;AAGA,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,eAAA,CAAgB,QAAQ,CAAA;AAGtD,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,WAAA,GAC5B,MAAA,GACA,mBAA4C,CAAA;AAGhD,EAAA,MAAM,QAAQ,eAAA,CAAgB;AAAA,IAC5B,KAAA,EAAO,UAAU,QAAA,EAAS;AAAA,IAC1B,YAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,GAAI,eAAA,IAAmB,EAAE,WAAA,EAAa,eAAA;AAAgB,GACvD,CAAA;AAGD,EAAA,QAAA,CAAS,MAAM,QAAA,EAAU;AAAA,IACvB,OAAO,YAAA,CAAa,IAAA;AAAA,IACpB,OAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,cAAA,EAAgB,KAAK,GAAA;AAAI,GAC1B,CAAA;AAED,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,0CAAA,EAA6C,aAAa,CAAA,YAAA,EAAe,QAAQ,CAAA,CAAE,CAAA;AAAA,EACjG;AAEA,EAAA,MAAM,4BAA4B,kBAAA,EAAoB,mBAAA;AAEtD,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,YAAA;AAAA,IACP,MAAA;AAAA,IACA,OAAA;AAAA,IACA,uBAAA;AAAA,IACA,0BAAA;AAAA,IACA;AAAA,GACF;AACF;AASA,eAAsB,gBAAA,CACpB,UACA,OAAA,EAO2B;AAC3B,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,cAAA,IAAkB,wBAAA,EAAyB;AACpE,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AACtC,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,uBAAuB,QAAQ,CAAA,gDAAA;AAAA,KAEjC;AAAA,EACF;AAGA,EAAA,QAAA,CAAS,cAAA,GAAiB,KAAK,GAAA,EAAI;AACnC,EAAA,QAAA,CAAS,KAAA,CAAM,UAAU,QAAQ,CAAA;AAEjC,EAAA,OAAO,gBAAA,CAAiB;AAAA,IACtB,OAAO,QAAA,CAAS,KAAA;AAAA,IAChB,SAAS,QAAA,CAAS,OAAA;AAAA,IAClB,QAAA;AAAA,IACA,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,cAAA,EAAgB;AAAA,GACjB,CAAA;AACH;;;ACnhBO,IAAM,aAAA,GAAgE;AAAA;AAAA,EAE3E,oBAAA,EAAsB,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,EAAA,EAAG;AAAA,EAC3C,yBAAA,EAA2B,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,EAAA,EAAG;AAAA,EAChD,qBAAA,EAAuB,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,EAAA,EAAG;AAAA;AAAA,EAG5C,iBAAA,EAAmB,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,EAAA,EAAG;AAAA,EACxC,sBAAA,EAAwB,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,EAAA,EAAG;AAAA;AAAA,EAG7C,qBAAA,EAAuB,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,EAAA,EAAG;AAAA,EAC5C,kBAAA,EAAoB,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,EAAA,EAAG;AAAA;AAAA,EAGzC,OAAA,EAAS,EAAE,IAAA,EAAM,EAAA,EAAI,MAAM,EAAA;AAC7B;AAKO,SAAS,eAAe,SAAA,EAAmD;AAChF,EAAA,OAAO,aAAA,CAAc,SAAS,CAAA,IAAK,aAAA,CAAc,SAAS,CAAA;AAC5D;AAKO,SAAS,uBAAA,CACd,YACA,MAAA,EACe;AACf,EAAA,IAAI,UAAA,IAAc,OAAO,IAAA,EAAM;AAC7B,IAAA,OAAO,CAAA,2DAAA,EAAoD,OAAO,IAAI,CAAA,oFAAA,CAAA;AAAA,EACxE;AACA,EAAA,IAAI,UAAA,IAAc,OAAO,IAAA,EAAM;AAC7B,IAAA,OAAO,CAAA,2BAAA,EAAuB,UAAU,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,qGAAA,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,IAAA;AACT","file":"index.js","sourcesContent":["/**\n * Orbital Fingerprinting for Caching\n *\n * Computes structural fingerprints for Orbital Units to enable\n * prompt caching based on similar structures.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalUnit, OrbitalEntity, EntityField, OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isOrbitalDefinition, getTraitName, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity from EntityRef for signature computation.\n * Returns null if entity is a reference string.\n */\nfunction getInlineEntity(entity: EntityRef): OrbitalEntity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\n\n// ============================================================================\n// Fingerprint Computation\n// ============================================================================\n\n/**\n * Compute a structural fingerprint for an Orbital Unit.\n * Units with the same fingerprint can share cached prompts.\n * Only works with full orbital definitions (not references).\n */\nexport function computeOrbitalFingerprint(orbital: OrbitalUnit): string {\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // The isOrbitalDefinition check is kept for backwards compatibility but always true\n\n // Get inline entity or use fallback for references\n const inlineEntity = getInlineEntity(orbital.entity);\n\n // 1. Entity structure signature\n const entitySig = inlineEntity ? computeEntitySignature(inlineEntity) : 'ref';\n\n // 2. Trait categories (sorted)\n const traitSig = orbital.traits\n .map(getTraitName)\n .sort()\n .join(',');\n\n // 3. Persistence type\n const persistSig = inlineEntity?.persistence || 'persistent';\n\n return `${persistSig}:e[${entitySig}]_t[${traitSig}]`;\n}\n\n/**\n * Compute entity structure signature based on field types.\n */\nexport function computeEntitySignature(entity: OrbitalEntity): string {\n const typeCounts: Record<string, number> = {};\n\n for (const field of entity.fields) {\n const baseType = getFieldTypeKey(field);\n typeCounts[baseType] = (typeCounts[baseType] || 0) + 1;\n }\n\n return Object.entries(typeCounts)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([type, count]) => `${type}:${count}`)\n .join('-');\n}\n\n/**\n * Get field type key for fingerprinting.\n */\nfunction getFieldTypeKey(field: EntityField): string {\n if (field.type === 'relation') {\n const cardinality = field.relation?.cardinality || 'one';\n return `rel:${cardinality}`;\n }\n if (field.type === 'enum') {\n return 'enum';\n }\n return field.type;\n}\n\n// ============================================================================\n// Fingerprint Matching\n// ============================================================================\n\n/**\n * Check if two fingerprints are structurally similar.\n * Similar fingerprints can share template guidance.\n */\nexport function fingerprintsMatch(fp1: string, fp2: string): boolean {\n return fp1 === fp2;\n}\n\n/**\n * Extract fingerprint components.\n */\nexport function parseFingerprint(fingerprint: string): {\n persistence: string;\n entity: string;\n traits: string[];\n patterns: string[];\n} {\n const match = fingerprint.match(/^(\\w+):e\\[([^\\]]*)\\]_t\\[([^\\]]*)\\]_p\\[([^\\]]*)\\]$/);\n if (!match) {\n return { persistence: 'unknown', entity: '', traits: [], patterns: [] };\n }\n\n return {\n persistence: match[1],\n entity: match[2],\n traits: match[3] ? match[3].split(',') : [],\n patterns: match[4] ? match[4].split(',') : [],\n };\n}\n\n/**\n * Compute similarity score between two fingerprints (0-1).\n */\nexport function fingerprintSimilarity(fp1: string, fp2: string): number {\n if (fp1 === fp2) return 1.0;\n\n const p1 = parseFingerprint(fp1);\n const p2 = parseFingerprint(fp2);\n\n let score = 0;\n let total = 4;\n\n // Persistence match\n if (p1.persistence === p2.persistence) score += 1;\n\n // Entity structure match\n if (p1.entity === p2.entity) score += 1;\n\n // Trait overlap\n const traitOverlap = p1.traits.filter((t) => p2.traits.includes(t)).length;\n const traitUnion = new Set([...p1.traits, ...p2.traits]).size;\n if (traitUnion > 0) {\n score += traitOverlap / traitUnion;\n } else {\n score += 1;\n }\n\n // Pattern overlap\n const patternOverlap = p1.patterns.filter((p) => p2.patterns.includes(p)).length;\n const patternUnion = new Set([...p1.patterns, ...p2.patterns]).size;\n if (patternUnion > 0) {\n score += patternOverlap / patternUnion;\n } else {\n score += 1;\n }\n\n return score / total;\n}\n","/**\n * Structural Templates for Cached Generation\n *\n * Pre-defined templates for common structural patterns.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Template Types\n// ============================================================================\n\nexport interface StructuralTemplate {\n /** Fingerprint pattern this template matches */\n fingerprintPattern: string;\n /** Human-readable name */\n name: string;\n /** Template guidance for generation */\n guidance: string;\n /** Example sections */\n exampleSections: string[];\n}\n\n// ============================================================================\n// Common Templates\n// ============================================================================\n\n/**\n * Templates for common structural patterns.\n */\nexport const STRUCTURAL_TEMPLATES: StructuralTemplate[] = [\n {\n fingerprintPattern: 'persistent:e[*]_t[FormSubmission*]_p[*form*]',\n name: 'CRUD Form Entity',\n guidance: `\nThis is a standard CRUD entity with form submission.\nGenerate pages for:\n- List view with search/filter\n- Create form with validation\n- Edit form with existing data\n- Detail view with actions\n`,\n exampleSections: ['page-header', 'search-filters', 'entity-list', 'form-section', 'form-actions'],\n },\n {\n fingerprintPattern: 'persistent:e[*]_t[*Workflow*]_p[*]',\n name: 'Workflow Entity',\n guidance: `\nThis entity has workflow/state machine behavior.\nInclude:\n- Status indicators in list view\n- Transition actions in detail view\n- Workflow history display\n`,\n exampleSections: ['page-header', 'entity-table', 'entity-detail', 'form-actions'],\n },\n {\n fingerprintPattern: 'runtime:e[*]_t[*]_p[dashboard*]',\n name: 'Dashboard View',\n guidance: `\nThis is a runtime dashboard entity.\nFocus on:\n- Statistics and metrics display\n- Charts and visualizations\n- Recent activity lists\n`,\n exampleSections: ['page-header', 'dashboard-stats', 'chart', 'entity-cards'],\n },\n {\n fingerprintPattern: '*:e[*]_t[Platformer*]_p[game*]',\n name: 'Game Entity',\n guidance: `\nThis is a game entity with platformer mechanics.\nInclude:\n- Game canvas for rendering\n- HUD for score/health display\n- Controls panel for input\n`,\n exampleSections: ['game-canvas', 'game-hud', 'game-controls'],\n },\n];\n\n// ============================================================================\n// Template Matching\n// ============================================================================\n\n/**\n * Find matching templates for a fingerprint.\n */\nexport function findMatchingTemplates(fingerprint: string): StructuralTemplate[] {\n return STRUCTURAL_TEMPLATES.filter((template) =>\n matchesPattern(fingerprint, template.fingerprintPattern)\n );\n}\n\n/**\n * Get the best matching template for a fingerprint.\n */\nexport function getBestTemplate(fingerprint: string): StructuralTemplate | null {\n const matches = findMatchingTemplates(fingerprint);\n return matches.length > 0 ? matches[0] : null;\n}\n\n/**\n * Check if fingerprint matches a pattern.\n * Patterns support * as wildcard.\n */\nfunction matchesPattern(fingerprint: string, pattern: string): boolean {\n // Convert pattern to regex\n const regexStr = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&') // Escape special chars\n .replace(/\\*/g, '.*'); // Replace * with .*\n\n const regex = new RegExp(`^${regexStr}$`);\n return regex.test(fingerprint);\n}\n\n/**\n * Get guidance for a fingerprint.\n */\nexport function getTemplateGuidance(fingerprint: string): string {\n const template = getBestTemplate(fingerprint);\n if (template) {\n return template.guidance;\n }\n\n return `\nNo specific template matched. Use standard patterns:\n- page-header for page titles\n- entity-list or entity-table for list views\n- form-section for input forms\n- entity-detail for detail views\n`;\n}\n","/**\n * Prompt Assembler for Cache-Aware Prompt Construction\n *\n * Assembles prompts with cache markers for efficient LLM caching.\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalUnit, OrbitalDefinition, EntityRef, Entity } from '@almadar/core/types';\nimport { isOrbitalDefinition, getTraitName, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity name safely from EntityRef\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n/**\n * Get inline entity for detailed access, or null for references\n */\nfunction getInlineEntity(entity: EntityRef): Entity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\nimport { computeOrbitalFingerprint } from './orbital-fingerprint.js';\nimport { getTemplateGuidance, getBestTemplate } from './structural-templates.js';\nimport type { CacheableBlock } from '@almadar/llm';\n\n// ============================================================================\n// Cache Markers\n// ============================================================================\n\n/** Anthropic cache control marker (deprecated - use CacheableBlock instead) */\nconst CACHE_BREAK = '<!-- cache_break -->';\n\n// ============================================================================\n// Context Helpers\n// ============================================================================\n\n/**\n * Build context section from orbital's domainContext and design fields.\n * Passes through existing context to the subagent.\n */\nfunction buildContextSection(orbital: OrbitalDefinition): string {\n const parts: string[] = [];\n\n if (orbital.domainContext) {\n const ctx = orbital.domainContext;\n parts.push(`DomainContext: category=${ctx.category || 'business'}`);\n if (ctx.vocabulary) {\n parts.push(`Vocabulary: ${JSON.stringify(ctx.vocabulary)}`);\n }\n if (ctx.requestFragment) {\n parts.push(`RequestFragment: \"${ctx.requestFragment}\"`);\n }\n }\n\n if (orbital.design) {\n const d = orbital.design;\n if (d.style) parts.push(`Style: ${d.style}`);\n if (d.uxHints) {\n const hints = d.uxHints;\n if (hints.flowPattern) parts.push(`FlowPattern: ${hints.flowPattern}`);\n if (hints.listPattern) parts.push(`ListPattern: ${hints.listPattern}`);\n if (hints.formPattern) parts.push(`FormPattern: ${hints.formPattern}`);\n }\n }\n\n return parts.length > 0 ? `Context: ${parts.join(', ')}\\n` : '';\n}\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport interface AssembledPrompt {\n /** The full prompt text */\n prompt: string;\n /** Fingerprint for this orbital */\n fingerprint: string;\n /** Whether a cached template was used */\n usedCachedTemplate: boolean;\n /** Template name if used */\n templateName?: string;\n}\n\n/**\n * Cache-aware assembled prompt with separate blocks.\n */\nexport interface CacheableAssembledPrompt {\n /** System blocks (cacheable) */\n systemBlocks: CacheableBlock[];\n /** User blocks (usually not cacheable) */\n userBlocks: CacheableBlock[];\n /** Fingerprint for this orbital */\n fingerprint: string;\n /** Whether a cached template was used */\n usedCachedTemplate: boolean;\n /** Template name if used */\n templateName?: string;\n}\n\n/**\n * Assemble a prompt for orbital unit generation.\n * Organizes content to maximize cache hits.\n * Only works with full orbital definitions (not references).\n */\nexport function assembleOrbitalPrompt(\n orbital: OrbitalUnit,\n baseSystemPrompt: string\n): AssembledPrompt {\n const fingerprint = computeOrbitalFingerprint(orbital);\n const template = getBestTemplate(fingerprint);\n const guidance = getTemplateGuidance(fingerprint);\n\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // This check is kept for backwards compatibility but always passes\n\n // Structure prompt for optimal caching:\n // 1. Static system prompt (cacheable across all calls)\n // 2. Template guidance (cacheable for similar structures)\n // 3. Specific orbital details (unique per call)\n\n const contextSection = buildContextSection(orbital);\n\n // Get entity details safely\n const entityName = getEntityName(orbital.entity);\n const inlineEntity = getInlineEntity(orbital.entity);\n const persistence = inlineEntity?.persistence || 'persistent';\n const fieldNames = inlineEntity?.fields.map((f: { name: string }) => f.name).join(', ') || 'N/A';\n\n const prompt = `${baseSystemPrompt}\n\n${CACHE_BREAK}\n\n## Structural Template\n${guidance}\n\n${CACHE_BREAK}\n\n## Current Orbital Unit\nName: ${orbital.name}\nEntity: ${entityName}\nPersistence: ${persistence}\nFields: ${fieldNames}\nTraits: ${orbital.traits.map(getTraitName).join(', ')}\n${contextSection}\nGenerate a complete FullOrbitalUnit with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" (singular, NOT \"guards\") S-expression on SAVE transitions\n- Pages with trait references\n- domainContext with category, vocabulary, and requestFragment\n- design with style and uxHints (flowPattern, listPattern, formPattern)\n`;\n\n return {\n prompt,\n fingerprint,\n usedCachedTemplate: template !== null,\n templateName: template?.name,\n };\n}\n\n/**\n * Assemble cacheable blocks for Anthropic prompt caching.\n *\n * Structure:\n * - System block 1: Base system prompt (highly cacheable, rarely changes)\n * - System block 2: Template guidance (cacheable per fingerprint)\n * - User block: Specific orbital details (not cached)\n *\n * Only works with full orbital definitions (not references).\n */\nexport function assembleCacheableOrbitalPrompt(\n orbital: OrbitalUnit,\n baseSystemPrompt: string\n): CacheableAssembledPrompt {\n const fingerprint = computeOrbitalFingerprint(orbital);\n const template = getBestTemplate(fingerprint);\n const guidance = getTemplateGuidance(fingerprint);\n\n // Note: Orbital is now always OrbitalDefinition (no more OrbitalReference type)\n // This check is kept for backwards compatibility but always passes\n\n // System blocks - mark as cacheable\n const systemBlocks: CacheableBlock[] = [\n // Block 1: Base system prompt (very stable, max cache benefit)\n {\n type: 'text',\n text: baseSystemPrompt,\n cache_control: { type: 'ephemeral' },\n },\n // Block 2: Template guidance (stable per fingerprint)\n {\n type: 'text',\n text: `\\n## Structural Template\\n${guidance}`,\n cache_control: { type: 'ephemeral' },\n },\n ];\n\n // Build context section if available\n const contextSection = buildContextSection(orbital);\n\n // Build cross-orbital connectivity section\n const emitsSection = orbital.emits?.length ? `Emits: ${orbital.emits.join(', ')}` : '';\n const listensSection = orbital.listens?.length\n ? `Listens: ${orbital.listens.map((l) => `${l.event}→${l.triggers}`).join(', ')}`\n : '';\n const connectivitySection = [emitsSection, listensSection].filter(Boolean).join('\\n');\n\n // Get entity details safely\n const entityName = getEntityName(orbital.entity);\n const inlineEntity = getInlineEntity(orbital.entity);\n const persistence = inlineEntity?.persistence || 'persistent';\n const fieldNames = inlineEntity?.fields.map((f: { name: string }) => f.name).join(', ') || 'N/A';\n\n // User block - unique per request (not cached)\n const userBlocks: CacheableBlock[] = [\n {\n type: 'text',\n text: `## Current Orbital Unit\nName: ${orbital.name}\nEntity: ${entityName}\nPersistence: ${persistence}\nFields: ${fieldNames}\nTraits: ${orbital.traits.map(getTraitName).join(', ')}\n${contextSection}${connectivitySection ? `\\n${connectivitySection}` : ''}\nGenerate a complete FullOrbitalUnit with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" (singular, NOT \"guards\") S-expression on SAVE transitions\n- Pages with trait references\n- domainContext with category, vocabulary, and requestFragment\n- design with style and uxHints (flowPattern, listPattern, formPattern)\n- PRESERVE emits and listens from input if provided`,\n },\n ];\n\n return {\n systemBlocks,\n userBlocks,\n fingerprint,\n usedCachedTemplate: template !== null,\n templateName: template?.name,\n };\n}\n\n/**\n * Assemble prompts for multiple orbitals.\n * Groups by fingerprint for batch efficiency.\n */\nexport function assembleMultiOrbitalPrompts(\n orbitals: OrbitalUnit[],\n baseSystemPrompt: string\n): Map<string, AssembledPrompt[]> {\n const grouped = new Map<string, AssembledPrompt[]>();\n\n for (const orbital of orbitals) {\n const assembled = assembleOrbitalPrompt(orbital, baseSystemPrompt);\n const existing = grouped.get(assembled.fingerprint) || [];\n existing.push(assembled);\n grouped.set(assembled.fingerprint, existing);\n }\n\n return grouped;\n}\n\n/**\n * Get cache statistics for a set of orbitals.\n */\nexport function getCacheStats(orbitals: OrbitalUnit[]): {\n totalOrbitals: number;\n uniqueFingerprints: number;\n potentialCacheHits: number;\n templateMatches: number;\n} {\n const fingerprints = orbitals.map(computeOrbitalFingerprint);\n const unique = new Set(fingerprints);\n\n let templateMatches = 0;\n for (const orbital of orbitals) {\n const fp = computeOrbitalFingerprint(orbital);\n if (getBestTemplate(fp)) {\n templateMatches++;\n }\n }\n\n return {\n totalOrbitals: orbitals.length,\n uniqueFingerprints: unique.size,\n potentialCacheHits: orbitals.length - unique.size,\n templateMatches,\n };\n}\n\n","/**\n * Orbital Cache Module\n *\n * Exports fingerprinting, templates, and prompt assembly utilities\n * for efficient LLM prompt caching.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Fingerprinting\n// ============================================================================\n\nexport {\n computeOrbitalFingerprint,\n computeEntitySignature,\n fingerprintsMatch,\n parseFingerprint,\n fingerprintSimilarity,\n} from './orbital-fingerprint.js';\n\n// ============================================================================\n// Structural Templates\n// ============================================================================\n\nexport {\n type StructuralTemplate,\n STRUCTURAL_TEMPLATES,\n findMatchingTemplates,\n getBestTemplate,\n getTemplateGuidance,\n} from './structural-templates.js';\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport {\n type AssembledPrompt,\n type CacheableAssembledPrompt,\n assembleOrbitalPrompt,\n assembleCacheableOrbitalPrompt,\n assembleMultiOrbitalPrompts,\n getCacheStats,\n} from './prompt-assembler.js';\n","/**\n * Execute Tool\n *\n * Sandboxed shell command execution within a workspace directory.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { spawn } from 'child_process';\nimport * as path from 'path';\n\n/**\n * Dangerous commands that should be blocked when targeting outside workspace.\n */\nconst DANGEROUS_COMMANDS = [\n 'rm', 'rmdir', 'mv', 'cp', 'ln', 'chmod', 'chown', 'touch', 'mkdir',\n];\n\n/**\n * Commands that should be blocked entirely for security.\n */\nconst BLOCKED_COMMANDS = [\n 'curl', 'wget', 'nc', 'netcat', 'ssh', 'scp', 'rsync', 'ftp', 'sftp',\n 'sudo', 'su', 'doas', 'pkexec', 'eval', 'exec', 'source',\n 'crontab', 'at', 'systemctl', 'service',\n 'dd', 'mkfs', 'fdisk', 'mount', 'umount',\n 'iptables', 'firewall-cmd',\n 'useradd', 'userdel', 'usermod', 'groupadd', 'passwd',\n];\n\n/**\n * Check if a command contains paths outside the workspace.\n * Returns an error message if unsafe, null if safe.\n */\nexport function validateCommandPaths(command: string, workDir: string): string | null {\n const normalizedWorkDir = path.resolve(workDir);\n\n const firstWord = command.trim().split(/[\\s;|&]/)[0];\n if (BLOCKED_COMMANDS.includes(firstWord)) {\n return `Command blocked: \"${firstWord}\" is not allowed for security reasons.`;\n }\n\n // Block shell output/append redirections to absolute paths outside workspace\n const redirectPattern = /(?:>>?|[12&]>>?)\\s*(\\/([\\w.-]+\\/)*[\\w.-]+)/g;\n let redirectMatch;\n while ((redirectMatch = redirectPattern.exec(command)) !== null) {\n const targetPath = redirectMatch[1];\n if (targetPath !== '/dev/null') {\n const resolvedPath = path.resolve(targetPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: output redirection to \"${targetPath}\" is outside workspace.`;\n }\n }\n }\n\n // Block tee command writing outside workspace\n const teePattern = /\\btee\\s+(?:-a\\s+)?(\\/([\\w.-]+\\/)*[\\w.-]+)/g;\n let teeMatch;\n while ((teeMatch = teePattern.exec(command)) !== null) {\n const targetPath = teeMatch[1];\n const resolvedPath = path.resolve(targetPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: tee to \"${targetPath}\" is outside workspace.`;\n }\n }\n\n // Check dangerous commands for path arguments\n for (const cmd of DANGEROUS_COMMANDS) {\n const cmdPattern = new RegExp(`\\\\b${cmd}\\\\s+[^|;&]*`, 'g');\n let cmdMatch;\n while ((cmdMatch = cmdPattern.exec(command)) !== null) {\n const cmdWithArgs = cmdMatch[0];\n const pathsInCmd = cmdWithArgs.match(/\\/([\\w.-]+\\/)*[\\w.-]+/g) || [];\n for (const foundPath of pathsInCmd) {\n if (foundPath === '/dev/null' || foundPath.startsWith('/tmp/')) continue;\n const resolvedPath = path.resolve(foundPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: \"${cmd}\" with path \"${foundPath}\" is outside workspace.`;\n }\n }\n }\n }\n\n // Check absolute paths\n const absolutePathPattern = /(?:^|[\\s'\"=])(\\/([\\w.-]+\\/)+[\\w.-]*)/g;\n let match;\n while ((match = absolutePathPattern.exec(command)) !== null) {\n const foundPath = match[1];\n if (foundPath.startsWith('/dev/') || foundPath.startsWith('/tmp/') || foundPath === '/dev/null') {\n continue;\n }\n const resolvedPath = path.resolve(foundPath);\n if (!resolvedPath.startsWith(normalizedWorkDir)) {\n return `Command blocked: path \"${foundPath}\" is outside workspace.`;\n }\n }\n\n // Block cd to outside workspace\n if (command.includes('cd /') && !command.includes(`cd ${normalizedWorkDir}`)) {\n const cdMatch = command.match(/cd\\s+(\\/[^\\s;|&]+)/);\n if (cdMatch) {\n const cdTarget = path.resolve(cdMatch[1]);\n if (!cdTarget.startsWith(normalizedWorkDir)) {\n return `Command blocked: \"cd ${cdMatch[1]}\" would navigate outside workspace.`;\n }\n }\n }\n\n // Block complex command substitution\n if (command.includes('`') || /\\$\\([^)]+\\)/.test(command)) {\n const simpleSubstitutions = /\\$\\((pwd|echo|date|whoami)\\)/g;\n const strippedCommand = command.replace(simpleSubstitutions, '');\n if (strippedCommand.includes('`') || /\\$\\([^)]+\\)/.test(strippedCommand)) {\n return `Command blocked: complex command substitution detected.`;\n }\n }\n\n return null;\n}\n\n/**\n * Create an execute tool that runs shell commands in the workspace directory.\n */\nexport function createExecuteTool(workDir: string) {\n const normalizedWorkDir = path.resolve(workDir);\n\n return tool(\n async ({ command, timeout = 60000 }) => {\n const validationError = validateCommandPaths(command, workDir);\n if (validationError) {\n return validationError;\n }\n\n return new Promise<string>((resolve) => {\n const parts = command.split(' ');\n const cmd = parts[0];\n const args = parts.slice(1);\n\n const proc = spawn(cmd, args, {\n cwd: workDir,\n shell: true,\n timeout,\n env: {\n PATH: process.env.PATH,\n NODE_PATH: process.env.NODE_PATH,\n NVM_DIR: process.env.NVM_DIR,\n NVM_BIN: process.env.NVM_BIN,\n SHELL: '/bin/sh',\n TERM: 'dumb',\n LANG: process.env.LANG || 'en_US.UTF-8',\n CI: 'true',\n HOME: normalizedWorkDir,\n TMPDIR: path.join(normalizedWorkDir, '.tmp'),\n TEMP: path.join(normalizedWorkDir, '.tmp'),\n TMP: path.join(normalizedWorkDir, '.tmp'),\n HISTFILE: '/dev/null',\n npm_config_cache: path.join(normalizedWorkDir, '.npm-cache'),\n npm_config_prefix: normalizedWorkDir,\n },\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('error', (error) => {\n resolve(`Error executing command: ${error.message}`);\n });\n\n proc.on('close', (code) => {\n const output = stdout + (stderr ? `\\n\\nStderr:\\n${stderr}` : '');\n if (code === 0) {\n resolve(output || 'Command completed successfully (no output)');\n } else {\n resolve(`Command exited with code ${code}\\n\\n${output}`);\n }\n });\n\n setTimeout(() => {\n proc.kill('SIGTERM');\n resolve(`Command timed out after ${timeout}ms`);\n }, timeout);\n });\n },\n {\n name: 'execute',\n description: `Execute a shell command in the workspace directory.\n\nIMPORTANT: You are restricted to your workspace directory. Use RELATIVE paths only:\n- ./schema.json (NOT /schema.json or absolute paths)\n- ./app (NOT /app or absolute paths)\n\nExamples:\n- orbital validate ./schema.json --json\n- npx kflow compile ./schema.json -o ./app --verify\n- cd ./app && npm install\n\nCommands using absolute paths outside your workspace will be blocked.`,\n schema: z.object({\n command: z.string().describe('The shell command to execute'),\n timeout: z.number().optional().describe('Timeout in milliseconds (default: 60000)'),\n }),\n },\n );\n}\n","/**\n * Schema Validation Tool\n *\n * Validates orbital schemas using the @almadar/cli npm package.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\n\nconst execAsync = promisify(exec);\n\n/**\n * Maximum number of validation attempts before forcing stop.\n */\nconst MAX_VALIDATION_ATTEMPTS = 5;\n\n/**\n * Create a validate_schema tool that validates schema.json in the workspace.\n *\n * Uses `npx @almadar/cli validate --json` for comprehensive Rust-based validation.\n *\n * Has a built-in cap of MAX_VALIDATION_ATTEMPTS to prevent\n * infinite validation-fix loops.\n */\nexport function createValidateSchemaTool(workDir: string) {\n const schemaPath = path.join(workDir, 'schema.json');\n let validationAttempts = 0;\n\n return tool(\n async () => {\n validationAttempts++;\n\n if (validationAttempts > MAX_VALIDATION_ATTEMPTS) {\n return JSON.stringify({\n success: true,\n valid: false,\n cappedValidation: true,\n message:\n `⚠️ VALIDATION CAP REACHED (${MAX_VALIDATION_ATTEMPTS} attempts). ` +\n `You've tried to fix this schema ${validationAttempts} times. ` +\n `STOP fixing validation errors and proceed with what you have.`,\n recommendation: 'STOP_FIXING',\n });\n }\n\n try {\n try {\n await fs.access(schemaPath);\n } catch {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'FILE_NOT_FOUND',\n path: '',\n message: 'File not found: schema.json. Create it first with write_file.',\n }],\n });\n }\n\n const { stdout, stderr } = await execAsync(\n `npx @almadar/cli validate \"${schemaPath}\" --json`,\n { timeout: 30000 },\n );\n\n let cliResult: {\n success: boolean;\n valid: boolean;\n errors?: Array<{\n code: string;\n path: string;\n message: string;\n suggestion?: string;\n fixGuidance?: string;\n expectedShape?: string;\n validValues?: string[];\n }>;\n warnings?: Array<{\n code: string;\n path: string;\n message: string;\n suggestion?: string;\n }>;\n stats?: {\n orbitals: number;\n entities: number;\n traits: number;\n pages: number;\n };\n };\n\n try {\n cliResult = JSON.parse(stdout);\n } catch {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'CLI_OUTPUT_ERROR',\n path: '',\n message: `Failed to parse orbital CLI output: ${stdout || stderr}`,\n }],\n });\n }\n\n const response = {\n ...cliResult,\n validationAttempt: validationAttempts,\n remainingAttempts: MAX_VALIDATION_ATTEMPTS - validationAttempts,\n ...(validationAttempts >= MAX_VALIDATION_ATTEMPTS - 1 && !cliResult.valid\n ? {\n warning:\n `⚠️ Only ${MAX_VALIDATION_ATTEMPTS - validationAttempts} validation attempt(s) remaining.`,\n }\n : {}),\n };\n\n return JSON.stringify(response);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n if (errorMessage.includes('ENOENT') || errorMessage.includes('not found')) {\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'CLI_NOT_FOUND',\n path: '',\n message: '@almadar/cli not found. Ensure it is installed or accessible via npx.',\n suggestion: 'Install with: npm install -g @almadar/cli or ensure npx can access it.',\n }],\n });\n }\n\n return JSON.stringify({\n success: false,\n valid: false,\n validationAttempt: validationAttempts,\n errors: [{\n code: 'VALIDATION_ERROR',\n path: '',\n message: `Validation error: ${errorMessage}`,\n }],\n });\n }\n },\n {\n name: 'validate_schema',\n description: `Validate the schema.json file in the workspace.\n\nRuns validation using \\`npx @almadar/cli validate --json\\`.\n\nReturns detailed errors with code, path, message, suggestion, and expectedShape.\n\n⚠️ VALIDATION CAP: You have a maximum of 5 validation attempts.`,\n schema: z.object({}),\n },\n );\n}\n","/**\n * Schema Generation Tool (via Structured Output LLM)\n *\n * Generates KFlow schemas using OpenAI's structured output mode.\n * Uses @almadar/llm StructuredOutputClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalSchema } from '@almadar/core/types';\nimport {\n getStructuredOutputClient,\n isStructuredOutputAvailable,\n} from '@almadar/llm';\n\nconst GenerateSchemaInputSchema = z.object({\n userRequest: z.string().describe('The user\\'s natural language description'),\n suggestedTraits: z.array(z.string()).optional().describe('Suggested traits'),\n suggestedEntities: z.array(z.string()).optional().describe('Suggested entity names'),\n suggestedPages: z.array(z.string()).optional().describe('Suggested page types/names'),\n suggestedPatterns: z.array(z.string()).optional().describe('Suggested section patterns'),\n additionalInstructions: z.string().optional().describe('Additional instructions'),\n existingSchema: z.string().optional().describe('Existing schema JSON to update'),\n});\n\n/**\n * Create a tool that generates KFlow schemas using structured output.\n */\nexport function createGenerateSchemaTool() {\n return tool(\n async (input) => {\n if (!isStructuredOutputAvailable()) {\n return JSON.stringify({\n success: false,\n error: 'Structured output generation is not available. Set OPENAI_API_KEY.',\n });\n }\n\n try {\n let enhancedRequest = input.userRequest;\n\n if (input.suggestedEntities?.length) {\n enhancedRequest += `\\n\\nSuggested entities: ${input.suggestedEntities.join(', ')}`;\n }\n if (input.suggestedTraits?.length) {\n enhancedRequest += `\\n\\nSuggested traits: ${input.suggestedTraits.join(', ')}`;\n }\n if (input.suggestedPages?.length) {\n enhancedRequest += `\\n\\nSuggested pages: ${input.suggestedPages.join(', ')}`;\n }\n if (input.suggestedPatterns?.length) {\n enhancedRequest += `\\n\\nSuggested section patterns: ${input.suggestedPatterns.join(', ')}`;\n }\n\n const client = getStructuredOutputClient();\n\n const result = await client.generate<OrbitalSchema>({\n userRequest: enhancedRequest,\n schemaName: 'kflow_schema',\n additionalInstructions: input.additionalInstructions,\n existingContext: input.existingSchema,\n });\n\n return JSON.stringify({\n success: true,\n schema: result.data,\n usage: result.usage,\n latencyMs: result.latencyMs,\n model: result.model,\n zodValidation: result.zodValidation,\n }, null, 2);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return JSON.stringify({\n success: false,\n error: errorMessage,\n suggestion: 'Check the error message and try again with adjusted guidance.',\n });\n }\n },\n {\n name: 'generate_schema',\n description: `Generate a KFlow schema using structured output LLM.\n\nUse this to generate the BULK of the schema quickly, then surgically edit as needed.\n\nGUIDANCE YOU CAN PROVIDE:\n- suggestedTraits, suggestedEntities, suggestedPages, suggestedPatterns\n- additionalInstructions\n- existingSchema (for updates)`,\n schema: GenerateSchemaInputSchema,\n },\n );\n}\n","/**\n * Orbital Combiner\n *\n * Deterministically combines multiple Orbitals into a single OrbitalSchema.\n * This removes the need for LLM involvement in the combining step.\n *\n * All UI is rendered via render_ui effects from traits (no static sections).\n *\n * NOTE: Validation is handled externally via `orbital validate` CLI.\n * The combiner only assembles schemas - it does not validate them.\n *\n * @packageDocumentation\n */\n\nimport type {\n Orbital,\n OrbitalSchema,\n DomainContext,\n OrbitalDefinition,\n PageRef,\n Page,\n} from \"@almadar/core/types\";\nimport { isOrbitalDefinition, isPageReferenceString, isPageReferenceObject } from \"@almadar/core/types\";\n\n/**\n * Check if page is an inline definition (not a reference)\n */\nfunction isInlinePage(page: PageRef): page is Page {\n return !isPageReferenceString(page) && !isPageReferenceObject(page);\n}\n\n// Validation result type for API compatibility (actual validation done via Rust CLI)\nexport interface OrbitalSchemaValidationResult {\n valid: boolean;\n errors: Array<{ code: string; message: string; path?: string }>;\n warnings: Array<{ code: string; message: string; path?: string }>;\n}\n\n// Backward compatibility alias\ntype FullOrbitalUnit = Orbital;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface CombinerOptions {\n /** Application name */\n name: string;\n /** Optional description */\n description?: string;\n /** Schema version */\n version?: string;\n /** Domain context */\n domain?: DomainContext;\n /** Whether to run validation (default: true) */\n validate?: boolean;\n /** Global theme */\n theme?: string;\n /** Default route (first page if not specified) */\n defaultRoute?: string;\n}\n\nexport interface CombinerResult {\n /** Whether combining succeeded */\n success: boolean;\n /** The combined OrbitalSchema (if successful) */\n schema?: OrbitalSchema;\n /** Validation result (if validation was run) */\n validation?: OrbitalSchemaValidationResult;\n /** Error message (if failed) */\n error?: string;\n /** Statistics about the combining */\n stats: {\n totalOrbitals: number;\n totalEntities: number;\n totalPages: number;\n totalTraits: number;\n };\n}\n\n// ============================================================================\n// Combiner Implementation\n// ============================================================================\n\n/**\n * Combine multiple Orbitals into a single OrbitalSchema.\n *\n * This function performs deterministic merging:\n * 1. Builds an OrbitalSchema from the Orbitals\n * 2. Optionally runs validation\n *\n * Note: All UI is rendered via render_ui effects from traits.\n *\n * @example\n * ```typescript\n * const result = combineOrbitals([taskOrbital, userOrbital], {\n * name: 'My App',\n * validate: true,\n * });\n *\n * if (result.success) {\n * // Write schema to file\n * await fs.writeFile('schema.json', JSON.stringify(result.schema, null, 2));\n * } else {\n * console.error(result.error);\n * console.error(result.validation?.errors);\n * }\n * ```\n */\nexport function combineOrbitals(\n orbitals: FullOrbitalUnit[],\n options: CombinerOptions,\n): CombinerResult {\n const {\n name,\n description,\n version = \"1.0.0\",\n domain,\n validate = true,\n theme,\n } = options;\n\n // Filter to only full orbital definitions for stats\n const orbitalDefs = orbitals.filter(isOrbitalDefinition);\n\n // Stats\n const stats = {\n totalOrbitals: orbitals.length,\n totalEntities: orbitalDefs.length, // 1 entity per orbital definition\n totalPages: orbitalDefs.reduce((sum, o) => sum + o.pages.length, 0),\n totalTraits: orbitalDefs.reduce((sum, o) => sum + o.traits.length, 0),\n };\n\n // Handle empty input\n if (orbitals.length === 0) {\n return {\n success: false,\n error: \"No orbitals provided. At least one Orbital is required.\",\n stats,\n };\n }\n\n try {\n // Build OrbitalSchema from Orbitals\n const orbitalSchema: OrbitalSchema = {\n name,\n description,\n version,\n domainContext: domain,\n orbitals,\n config: theme\n ? {\n theme: { primary: theme },\n }\n : undefined,\n };\n\n // NOTE: Validation is deprecated in combiner - use `orbital validate` CLI instead\n // The validate option is kept for API compatibility but does not run validation\n const validation: OrbitalSchemaValidationResult | undefined = validate\n ? { valid: true, errors: [], warnings: [] }\n : undefined;\n\n return {\n success: true,\n schema: orbitalSchema,\n validation,\n stats,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n stats,\n };\n }\n}\n\n// Legacy alias removed - use combineOrbitals() directly\n\n/**\n * Combine orbitals and return only the schema (throws on error).\n * Use this when you want a simple API and will handle errors upstream.\n */\nexport function combineOrbitalsToSchema(\n orbitals: FullOrbitalUnit[],\n options: CombinerOptions,\n): OrbitalSchema {\n const result = combineOrbitals(orbitals, options);\n if (!result.success || !result.schema) {\n throw new Error(result.error || \"Failed to combine orbitals\");\n }\n return result.schema;\n}\n\n/**\n * Estimate the combination complexity (for progress indication).\n */\nexport function estimateCombineComplexity(orbitals: FullOrbitalUnit[]): {\n entities: number;\n pages: number;\n traits: number;\n totalSections: number;\n} {\n // Filter to only full orbital definitions\n const orbitalDefs = orbitals.filter(isOrbitalDefinition);\n return {\n entities: orbitalDefs.length,\n pages: orbitalDefs.reduce((sum, o) => sum + o.pages.length, 0),\n traits: orbitalDefs.reduce((sum, o) => sum + o.traits.length, 0),\n // Note: sections are no longer supported in trait-driven pages\n // Only count traits from inline page definitions (not references)\n totalSections: orbitalDefs.reduce(\n (sum, o) =>\n sum +\n o.pages.filter(isInlinePage).reduce((pSum: number, p) => pSum + (p.traits?.length ?? 0), 0),\n 0,\n ),\n };\n}\n","/**\n * Domain Language Tokens\n *\n * Token definitions for the domain language lexer.\n */\n\nexport enum TokenType {\n // Whitespace & Structure\n NEWLINE = 'NEWLINE',\n INDENT = 'INDENT',\n DEDENT = 'DEDENT',\n\n // Template Variables (e.g., {linkedEntity})\n TEMPLATE_VAR = 'TEMPLATE_VAR',\n\n // Keywords - Entity\n A = 'A',\n AN = 'AN',\n IS = 'IS',\n IT = 'IT',\n HAS = 'HAS',\n BELONGS = 'BELONGS',\n TO = 'TO',\n MANY = 'MANY',\n ONE = 'ONE',\n AS = 'AS',\n CAN = 'CAN',\n BE = 'BE',\n STARTS = 'STARTS',\n\n // Keywords - Page\n THE = 'THE',\n SHOWS = 'SHOWS',\n ENTITY = 'ENTITY', // Explicit entity reference for pages\n PURPOSE = 'PURPOSE',\n URL = 'URL',\n DISPLAYS = 'DISPLAYS',\n USERS = 'USERS',\n WHEN = 'WHEN',\n ACCESSED = 'ACCESSED',\n\n // Keywords - Behavior\n LIFECYCLE = 'LIFECYCLE',\n BEHAVIOR = 'BEHAVIOR',\n STATES = 'STATES',\n INITIAL = 'INITIAL',\n TRANSITIONS = 'TRANSITIONS',\n FROM = 'FROM',\n IF = 'IF',\n THEN = 'THEN',\n RULES = 'RULES',\n EVERY = 'EVERY',\n CHECK = 'CHECK',\n\n // Keywords - Guard\n AND = 'AND',\n OR = 'OR',\n NOT = 'NOT',\n PROVIDED = 'PROVIDED',\n EMPTY = 'EMPTY',\n USER = 'USER',\n OWNS = 'OWNS',\n THIS = 'THIS',\n\n // Field Types\n TEXT = 'TEXT',\n LONG_TEXT = 'LONG_TEXT',\n NUMBER = 'NUMBER',\n CURRENCY = 'CURRENCY',\n DATE = 'DATE',\n TIMESTAMP = 'TIMESTAMP',\n YES_NO = 'YES_NO',\n ENUM = 'ENUM',\n LIST = 'LIST',\n\n // Constraints\n REQUIRED = 'REQUIRED',\n UNIQUE = 'UNIQUE',\n AUTO = 'AUTO',\n DEFAULT = 'DEFAULT',\n\n // Operators\n COLON = 'COLON',\n COMMA = 'COMMA',\n PIPE = 'PIPE',\n DOT = 'DOT',\n DASH = 'DASH',\n LBRACKET = 'LBRACKET',\n RBRACKET = 'RBRACKET',\n LPAREN = 'LPAREN',\n RPAREN = 'RPAREN',\n GREATER_THAN = 'GREATER_THAN',\n LESS_THAN = 'LESS_THAN',\n GREATER_EQUAL = 'GREATER_EQUAL',\n LESS_EQUAL = 'LESS_EQUAL',\n EQUALS = 'EQUALS',\n NOT_EQUALS = 'NOT_EQUALS',\n\n // Literals\n IDENTIFIER = 'IDENTIFIER',\n STRING = 'STRING',\n NUMBER_LITERAL = 'NUMBER_LITERAL',\n BOOLEAN = 'BOOLEAN',\n\n // Special\n EOF = 'EOF',\n ERROR = 'ERROR',\n}\n\nexport interface Token {\n type: TokenType;\n value: string;\n line: number;\n column: number;\n offset: number;\n}\n\n// Keyword mappings (case-insensitive)\nexport const KEYWORDS: Record<string, TokenType> = {\n 'a': TokenType.A,\n 'an': TokenType.AN,\n 'is': TokenType.IS,\n 'it': TokenType.IT,\n 'has': TokenType.HAS,\n 'belongs': TokenType.BELONGS,\n 'to': TokenType.TO,\n 'many': TokenType.MANY,\n 'one': TokenType.ONE,\n 'as': TokenType.AS,\n 'can': TokenType.CAN,\n 'be': TokenType.BE,\n 'starts': TokenType.STARTS,\n 'the': TokenType.THE,\n 'shows': TokenType.SHOWS,\n 'entity': TokenType.ENTITY,\n 'purpose': TokenType.PURPOSE,\n 'url': TokenType.URL,\n 'displays': TokenType.DISPLAYS,\n 'users': TokenType.USERS,\n 'when': TokenType.WHEN,\n 'on': TokenType.WHEN, // \"on EVENT\" is equivalent to \"when EVENT\"\n 'accessed': TokenType.ACCESSED,\n 'lifecycle': TokenType.LIFECYCLE,\n 'behavior': TokenType.BEHAVIOR,\n 'states': TokenType.STATES,\n 'initial': TokenType.INITIAL,\n 'transitions': TokenType.TRANSITIONS,\n 'from': TokenType.FROM,\n 'if': TokenType.IF,\n 'then': TokenType.THEN,\n 'rules': TokenType.RULES,\n 'every': TokenType.EVERY,\n 'check': TokenType.CHECK,\n 'and': TokenType.AND,\n 'or': TokenType.OR,\n 'not': TokenType.NOT,\n 'provided': TokenType.PROVIDED,\n 'empty': TokenType.EMPTY,\n 'user': TokenType.USER,\n 'owns': TokenType.OWNS,\n 'this': TokenType.THIS,\n 'text': TokenType.TEXT,\n 'number': TokenType.NUMBER,\n 'currency': TokenType.CURRENCY,\n 'date': TokenType.DATE,\n 'timestamp': TokenType.TIMESTAMP,\n 'required': TokenType.REQUIRED,\n 'unique': TokenType.UNIQUE,\n 'auto': TokenType.AUTO,\n 'default': TokenType.DEFAULT,\n 'true': TokenType.BOOLEAN,\n 'false': TokenType.BOOLEAN,\n};\n\n// Multi-word keywords\nexport const MULTI_WORD_KEYWORDS: Record<string, TokenType> = {\n 'long text': TokenType.LONG_TEXT,\n 'yes/no': TokenType.YES_NO,\n 'belongs to': TokenType.BELONGS,\n 'has many': TokenType.HAS,\n 'has one': TokenType.HAS,\n 'starts as': TokenType.STARTS,\n 'can be': TokenType.CAN,\n 'it has': TokenType.IT,\n};\n","/**\n * Domain Language Lexer\n *\n * Tokenizes domain language text into tokens for parsing.\n */\n\nimport { Token, TokenType, KEYWORDS } from './tokens.js';\n\nexport class Lexer {\n private input: string;\n private pos: number = 0;\n private line: number = 1;\n private column: number = 1;\n private indentStack: number[] = [0];\n\n constructor(input: string) {\n this.input = input;\n }\n\n /**\n * Tokenize the entire input\n */\n tokenize(): Token[] {\n const tokens: Token[] = [];\n\n while (!this.isAtEnd()) {\n const token = this.nextToken();\n if (token) {\n tokens.push(token);\n }\n }\n\n // Add any remaining DEDENT tokens\n while (this.indentStack.length > 1) {\n this.indentStack.pop();\n tokens.push(this.makeToken(TokenType.DEDENT, ''));\n }\n\n tokens.push(this.makeToken(TokenType.EOF, ''));\n return tokens;\n }\n\n private nextToken(): Token | null {\n // Handle start of line (indentation)\n if (this.column === 1) {\n const indentToken = this.handleIndentation();\n if (indentToken) {\n return indentToken;\n }\n }\n\n this.skipWhitespace();\n\n if (this.isAtEnd()) {\n return null;\n }\n\n const char = this.peek();\n\n // Newline\n if (char === '\\n') {\n return this.consumeNewline();\n }\n\n // Skip comments\n if (char === '#') {\n this.skipToEndOfLine();\n return this.nextToken();\n }\n\n // String literal\n if (char === '\"' || char === \"'\") {\n return this.consumeString(char);\n }\n\n // Number\n if (this.isDigit(char)) {\n return this.consumeNumber();\n }\n\n // Operators and punctuation\n switch (char) {\n case ':':\n return this.consumeChar(TokenType.COLON);\n case ',':\n return this.consumeChar(TokenType.COMMA);\n case '|':\n return this.consumeChar(TokenType.PIPE);\n case '.':\n return this.consumeChar(TokenType.DOT);\n case '-':\n return this.consumeChar(TokenType.DASH);\n case '[':\n return this.consumeChar(TokenType.LBRACKET);\n case ']':\n return this.consumeChar(TokenType.RBRACKET);\n case '(':\n return this.consumeChar(TokenType.LPAREN);\n case ')':\n return this.consumeChar(TokenType.RPAREN);\n case '>':\n if (this.peekNext() === '=') {\n return this.consumeChars(2, TokenType.GREATER_EQUAL);\n }\n return this.consumeChar(TokenType.GREATER_THAN);\n case '<':\n if (this.peekNext() === '=') {\n return this.consumeChars(2, TokenType.LESS_EQUAL);\n }\n return this.consumeChar(TokenType.LESS_THAN);\n case '=':\n if (this.peekNext() === '=') {\n return this.consumeChars(2, TokenType.EQUALS);\n }\n break;\n case '!':\n if (this.peekNext() === '=') {\n return this.consumeChars(2, TokenType.NOT_EQUALS);\n }\n break;\n }\n\n // Template variable: {varName}\n if (char === '{') {\n return this.consumeTemplateVar();\n }\n\n // Identifier or keyword\n if (this.isAlpha(char)) {\n return this.consumeIdentifier();\n }\n\n // Unknown character - skip it\n this.advance();\n return this.nextToken();\n }\n\n private consumeTemplateVar(): Token {\n const start = this.pos;\n this.advance(); // consume '{'\n\n // Track nested braces to handle JSON objects with nested objects/arrays\n let braceDepth = 1;\n\n // Collect characters until matching closing '}'\n while (!this.isAtEnd() && braceDepth > 0 && this.peek() !== '\\n') {\n const ch = this.peek();\n if (ch === '{') {\n braceDepth++;\n } else if (ch === '}') {\n braceDepth--;\n if (braceDepth === 0) {\n this.advance(); // consume final '}'\n break;\n }\n }\n this.advance();\n }\n\n const value = this.input.substring(start, this.pos);\n return this.makeToken(TokenType.TEMPLATE_VAR, value);\n }\n\n private handleIndentation(): Token | null {\n if (this.isAtEnd() || this.peek() === '\\n') {\n return null;\n }\n\n let indent = 0;\n while (this.peek() === ' ' || this.peek() === '\\t') {\n indent += this.peek() === '\\t' ? 4 : 1;\n this.advance();\n }\n\n // Skip blank lines\n if (this.peek() === '\\n' || this.peek() === '#') {\n return null;\n }\n\n const currentIndent = this.indentStack[this.indentStack.length - 1];\n\n if (indent > currentIndent) {\n this.indentStack.push(indent);\n return this.makeToken(TokenType.INDENT, '');\n } else if (indent < currentIndent) {\n // Pop indent levels until we match\n while (this.indentStack.length > 1 &&\n this.indentStack[this.indentStack.length - 1] > indent) {\n this.indentStack.pop();\n }\n return this.makeToken(TokenType.DEDENT, '');\n }\n\n return null;\n }\n\n private consumeNewline(): Token {\n const token = this.makeToken(TokenType.NEWLINE, '\\n');\n this.advance();\n this.line++;\n this.column = 1;\n return token;\n }\n\n private consumeString(quote: string): Token {\n const startLine = this.line;\n const startColumn = this.column;\n const startOffset = this.pos;\n\n this.advance(); // Opening quote\n\n let value = '';\n while (!this.isAtEnd() && this.peek() !== quote) {\n if (this.peek() === '\\\\' && this.peekNext() === quote) {\n this.advance();\n value += quote;\n } else if (this.peek() === '\\n') {\n // Multi-line strings not supported\n break;\n } else {\n value += this.peek();\n }\n this.advance();\n }\n\n if (this.peek() === quote) {\n this.advance(); // Closing quote\n }\n\n return {\n type: TokenType.STRING,\n value,\n line: startLine,\n column: startColumn,\n offset: startOffset,\n };\n }\n\n private consumeNumber(): Token {\n const startLine = this.line;\n const startColumn = this.column;\n const startOffset = this.pos;\n\n let value = '';\n while (this.isDigit(this.peek())) {\n value += this.advance();\n }\n\n // Decimal part\n if (this.peek() === '.' && this.isDigit(this.peekNext())) {\n value += this.advance(); // .\n while (this.isDigit(this.peek())) {\n value += this.advance();\n }\n }\n\n return {\n type: TokenType.NUMBER_LITERAL,\n value,\n line: startLine,\n column: startColumn,\n offset: startOffset,\n };\n }\n\n private consumeIdentifier(): Token {\n const startLine = this.line;\n const startColumn = this.column;\n const startOffset = this.pos;\n\n let value = '';\n while (this.isAlphaNumeric(this.peek()) || this.peek() === '_' || this.peek() === '/') {\n value += this.advance();\n }\n\n // Check for keywords\n const lowerValue = value.toLowerCase();\n const keywordType = KEYWORDS[lowerValue];\n\n return {\n type: keywordType || TokenType.IDENTIFIER,\n value,\n line: startLine,\n column: startColumn,\n offset: startOffset,\n };\n }\n\n private consumeChar(type: TokenType): Token {\n const token = this.makeToken(type, this.peek());\n this.advance();\n return token;\n }\n\n private consumeChars(count: number, type: TokenType): Token {\n let value = '';\n for (let i = 0; i < count; i++) {\n value += this.advance();\n }\n return {\n type,\n value,\n line: this.line,\n column: this.column - count,\n offset: this.pos - count,\n };\n }\n\n private skipWhitespace(): void {\n while (!this.isAtEnd() && (this.peek() === ' ' || this.peek() === '\\t')) {\n this.advance();\n }\n }\n\n private skipToEndOfLine(): void {\n while (!this.isAtEnd() && this.peek() !== '\\n') {\n this.advance();\n }\n }\n\n private makeToken(type: TokenType, value: string): Token {\n return {\n type,\n value,\n line: this.line,\n column: this.column,\n offset: this.pos,\n };\n }\n\n private peek(): string {\n return this.input[this.pos] || '\\0';\n }\n\n private peekNext(): string {\n return this.input[this.pos + 1] || '\\0';\n }\n\n private advance(): string {\n const char = this.peek();\n this.pos++;\n this.column++;\n return char;\n }\n\n private isAtEnd(): boolean {\n return this.pos >= this.input.length;\n }\n\n private isDigit(char: string): boolean {\n return char >= '0' && char <= '9';\n }\n\n private isAlpha(char: string): boolean {\n return (char >= 'a' && char <= 'z') ||\n (char >= 'A' && char <= 'Z') ||\n char === '_';\n }\n\n private isAlphaNumeric(char: string): boolean {\n return this.isAlpha(char) || this.isDigit(char);\n }\n}\n\n/**\n * Convenience function to tokenize a string\n */\nexport function tokenize(input: string): Token[] {\n const lexer = new Lexer(input);\n return lexer.tokenize();\n}\n","/**\n * Entity Parser\n *\n * Parses entity definitions from domain language.\n * All entity references are explicit (e.g., Order, User, Task).\n */\n\nimport type {\n DomainEntity,\n DomainField,\n DomainFieldType,\n DomainRelationship,\n RelationshipType,\n ParseResult,\n ParseError,\n} from '../types.js';\nimport { Lexer } from '../lexer.js';\nimport { TokenType, Token } from '../tokens.js';\n\ninterface EntityParseContext {\n errors: ParseError[];\n warnings: ParseError[];\n}\n\n/**\n * Parse an entity definition from domain text\n *\n * @example\n * parseEntity(`\n * A Order is a customer purchase request\n * It has:\n * - order number: text, required, unique\n * - amount: currency\n * - status: Pending | Confirmed | Shipped\n * It belongs to User\n * It can be: Pending, Confirmed, Shipped, Delivered, Cancelled\n * It starts as Pending\n * `)\n */\nexport function parseEntity(text: string): ParseResult<DomainEntity> {\n const ctx: EntityParseContext = { errors: [], warnings: [] };\n const lexer = new Lexer(text);\n const tokens = lexer.tokenize();\n\n let pos = 0;\n\n // Helper to get current token\n const current = () => tokens[pos] || { type: TokenType.EOF, value: '', line: 0, column: 0, offset: 0 };\n const peek = (offset = 0) => tokens[pos + offset] || { type: TokenType.EOF, value: '', line: 0, column: 0, offset: 0 };\n const advance = () => tokens[pos++];\n const isAtEnd = () => current().type === TokenType.EOF;\n const skip = (type: TokenType) => {\n while (current().type === type) advance();\n };\n\n // Skip leading whitespace\n skip(TokenType.NEWLINE);\n\n // Parse \"A [Name] is [description]\"\n const entityHeader = parseEntityHeader();\n if (!entityHeader) {\n return {\n success: false,\n errors: ctx.errors.length > 0 ? ctx.errors : [{\n message: 'Expected entity definition starting with \"A [Name] is...\"',\n }],\n warnings: [],\n };\n }\n\n const entity: DomainEntity = {\n type: 'entity',\n name: entityHeader.name,\n description: entityHeader.description,\n fields: [],\n relationships: [],\n };\n\n skip(TokenType.NEWLINE);\n\n // Parse remaining sections (fields, relationships, states)\n while (!isAtEnd()) {\n skip(TokenType.NEWLINE);\n if (isAtEnd()) break;\n\n const sectionResult = parseSection(entity);\n if (!sectionResult) {\n // Skip unknown content\n advance();\n }\n }\n\n return {\n success: true,\n data: entity,\n errors: ctx.errors,\n warnings: ctx.warnings,\n };\n\n // === Helper Functions ===\n\n // Check if a token can be used as an entity name\n // Some keywords like \"User\", \"Task\", \"Order\" are valid entity names\n function isEntityName(token: Token): boolean {\n // Identifiers are always valid\n if (token.type === TokenType.IDENTIFIER) return true;\n\n // Certain keywords can also be entity names when capitalized\n const keywordEntityNames = [\n TokenType.USER, // \"User\"\n TokenType.TEXT, // \"Text\" (unlikely but possible)\n TokenType.NUMBER, // \"Number\" (unlikely but possible)\n TokenType.DATE, // \"Date\" (unlikely but possible)\n ];\n return keywordEntityNames.includes(token.type);\n }\n\n function parseEntityHeader(): { name: string; description: string } | null {\n // Expect \"A\" or \"An\"\n if (current().type !== TokenType.A && current().type !== TokenType.AN) {\n ctx.errors.push({ message: 'Expected \"A\" or \"An\" at start of entity definition' });\n return null;\n }\n advance();\n\n // Get entity name (identifier or keyword that can be an entity name)\n if (!isEntityName(current())) {\n ctx.errors.push({ message: 'Expected entity name after \"A\"' });\n return null;\n }\n const name = current().value;\n advance();\n\n // Expect \"is\"\n if (current().type !== TokenType.IS) {\n ctx.errors.push({ message: `Expected \"is\" after entity name \"${name}\"` });\n return null;\n }\n advance();\n\n // Collect description until newline\n const descParts: string[] = [];\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n descParts.push(current().value);\n advance();\n }\n\n return {\n name,\n description: descParts.join(' ').trim(),\n };\n }\n\n function parseSection(entity: DomainEntity): boolean {\n const token = current();\n\n // INDENT followed by \"- has [field] as [type]\" (SKILL.md format)\n if (token.type === TokenType.INDENT) {\n advance();\n parseIndentedFields(entity);\n return true;\n }\n\n // \"It has:\" - fields section (old format)\n if (token.type === TokenType.IT) {\n advance();\n if (current().type === TokenType.HAS) {\n advance();\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n parseFieldsSection(entity);\n return true;\n }\n\n // \"It belongs to [Entity]\"\n if (current().type === TokenType.BELONGS) {\n advance();\n if (current().type === TokenType.TO) {\n advance();\n parseRelationship(entity, 'belongs_to');\n return true;\n }\n }\n\n // \"It can be: [states]\"\n if (current().type === TokenType.CAN) {\n advance();\n if (current().type === TokenType.BE) {\n advance();\n skip(TokenType.COLON);\n parseStates(entity);\n return true;\n }\n }\n\n // \"It starts as [state]\"\n if (current().type === TokenType.STARTS) {\n advance();\n if (current().type === TokenType.AS) {\n advance();\n parseInitialState(entity);\n return true;\n }\n }\n }\n\n // \"has many [Entity]\" - relationship\n if (token.type === TokenType.HAS) {\n advance();\n if (current().type === TokenType.MANY) {\n advance();\n parseRelationship(entity, 'has_many');\n return true;\n }\n if (current().type === TokenType.ONE) {\n advance();\n parseRelationship(entity, 'has_one');\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Parse indented field lines in SKILL.md format:\n * - has [field] as [type] (constraints)\n * - belongs to [Entity]\n * - has many [Entity]s\n */\n function parseIndentedFields(entity: DomainEntity): void {\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Skip leading dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n // \"has [field] as [type]\" pattern\n if (current().type === TokenType.HAS) {\n advance();\n\n // Check for \"has many [Entity]s\" pattern\n if (current().type === TokenType.MANY) {\n advance();\n parseRelationship(entity, 'has_many');\n continue;\n }\n\n // Parse field: \"[name] as [type] (constraints)\"\n const field = parseHasFieldLine();\n if (field) {\n entity.fields.push(field);\n }\n continue;\n }\n\n // \"belongs to [Entity]\" pattern\n if (current().type === TokenType.BELONGS) {\n advance();\n if (current().type === TokenType.TO) {\n advance();\n parseRelationship(entity, 'belongs_to');\n continue;\n }\n }\n\n // Skip unrecognized content to end of line\n while (!isAtEnd() && current().type !== TokenType.NEWLINE && current().type !== TokenType.DEDENT) {\n advance();\n }\n skip(TokenType.NEWLINE);\n }\n\n // Consume DEDENT\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n /**\n * Parse \"has [field] as [type] (constraints)\" pattern\n */\n function parseHasFieldLine(): DomainField | null {\n // Get field name\n if (current().type !== TokenType.IDENTIFIER) {\n return null;\n }\n const fieldName = toCamelCase(current().value);\n advance();\n\n // Expect \"as\"\n if (current().type !== TokenType.AS) {\n // Skip to end of line\n while (!isAtEnd() && current().type !== TokenType.NEWLINE && current().type !== TokenType.DEDENT) {\n advance();\n }\n return null;\n }\n advance();\n\n // Parse field type\n const field: DomainField = {\n type: 'field',\n name: fieldName,\n fieldType: 'text',\n required: false,\n unique: false,\n auto: false,\n };\n\n // Get field type (may be multiple tokens like \"long text\" or \"yes/no\")\n const typeParts: string[] = [];\n while (!isAtEnd() &&\n current().type !== TokenType.NEWLINE &&\n current().type !== TokenType.DEDENT &&\n current().type !== TokenType.LPAREN &&\n current().value !== 'with') {\n typeParts.push(current().value);\n advance();\n }\n const typeText = typeParts.join(' ').trim().toLowerCase();\n\n // Map type text to DomainFieldType\n if (typeText.includes('long text')) {\n field.fieldType = 'long text';\n } else if (typeText === 'text' || typeText === 'string') {\n field.fieldType = 'text';\n } else if (typeText === 'number' || typeText === 'integer') {\n field.fieldType = 'number';\n } else if (typeText === 'currency') {\n field.fieldType = 'currency';\n } else if (typeText === 'yes/no' || typeText === 'boolean') {\n field.fieldType = 'yes/no';\n } else if (typeText === 'date') {\n field.fieldType = 'date';\n } else if (typeText === 'timestamp' || typeText === 'datetime') {\n field.fieldType = 'timestamp';\n } else if (typeText.startsWith('enum')) {\n field.fieldType = 'enum';\n // Extract enum values from \"enum [val1, val2, val3]\"\n const enumMatch = typeText.match(/enum\\s*\\[([^\\]]+)\\]/);\n if (enumMatch) {\n field.enumValues = enumMatch[1].split(',').map(v => v.trim());\n }\n } else if (typeText === 'list' || typeText === 'array') {\n field.fieldType = 'list';\n } else if (typeText === 'object') {\n field.fieldType = 'object';\n } else {\n field.fieldType = 'text';\n }\n\n // Parse constraints in parentheses: (required), (optional), with default [value]\n if (current().type === TokenType.LPAREN) {\n advance();\n while (!isAtEnd() && current().type !== TokenType.RPAREN && current().type !== TokenType.NEWLINE) {\n const constraint = current().value.toLowerCase();\n if (constraint === 'required') {\n field.required = true;\n } else if (constraint === 'optional') {\n field.required = false;\n } else if (constraint === 'unique') {\n field.unique = true;\n }\n advance();\n }\n if (current().type === TokenType.RPAREN) {\n advance();\n }\n }\n\n // Parse \"with default [value]\"\n if (current().type === TokenType.IDENTIFIER && current().value.toLowerCase() === 'with') {\n advance();\n if (current().type === TokenType.DEFAULT) {\n advance();\n // Get default value\n if (current().type === TokenType.STRING) {\n field.default = current().value;\n advance();\n } else if (current().type === TokenType.NUMBER_LITERAL) {\n field.default = parseFloat(current().value);\n advance();\n } else if (current().type === TokenType.BOOLEAN) {\n field.default = current().value === 'true';\n advance();\n } else if (current().type === TokenType.IDENTIFIER) {\n field.default = current().value;\n advance();\n }\n }\n }\n\n return field;\n }\n\n function parseFieldsSection(entity: DomainEntity): void {\n // Expect INDENT\n if (current().type !== TokenType.INDENT) {\n return;\n }\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Parse field line: \"- [name]: [type], [constraints]\"\n const field = parseFieldLine();\n if (field) {\n entity.fields.push(field);\n }\n\n skip(TokenType.NEWLINE);\n }\n\n // Consume DEDENT\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n function parseFieldLine(): DomainField | null {\n // Optional dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n // Field name (may be multiple words)\n const nameParts: string[] = [];\n while (!isAtEnd() &&\n current().type !== TokenType.COLON &&\n current().type !== TokenType.NEWLINE) {\n nameParts.push(current().value);\n advance();\n }\n\n if (nameParts.length === 0) {\n return null;\n }\n\n const fieldName = toCamelCase(nameParts.join(' '));\n\n // Expect colon\n if (current().type !== TokenType.COLON) {\n ctx.errors.push({ message: `Expected \":\" after field name \"${fieldName}\"` });\n return null;\n }\n advance();\n\n // Parse field type and constraints\n return parseFieldTypeAndConstraints(fieldName);\n }\n\n function parseFieldTypeAndConstraints(fieldName: string): DomainField {\n const field: DomainField = {\n type: 'field',\n name: fieldName,\n fieldType: 'text',\n required: false,\n unique: false,\n auto: false,\n };\n\n const parts: string[] = [];\n\n // Collect all tokens until newline\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n parts.push(current().value);\n advance();\n }\n\n // Parse the parts\n const content = parts.join(' ').trim();\n\n // Check for enum (contains |)\n if (content.includes('|')) {\n field.fieldType = 'enum';\n field.enumValues = content.split('|').map(v => v.trim()).filter(v => v);\n return field;\n }\n\n // Split by comma for type and constraints\n const segments = content.split(',').map(s => s.trim().toLowerCase());\n\n for (const segment of segments) {\n // Check for field types (all types from DOMAIN_TO_SCHEMA_FIELD_TYPE)\n if (segment === 'text') field.fieldType = 'text';\n else if (segment === 'long text') field.fieldType = 'long text';\n else if (segment === 'number') field.fieldType = 'number';\n else if (segment === 'currency') field.fieldType = 'currency';\n else if (segment === 'date') field.fieldType = 'date';\n else if (segment === 'timestamp') field.fieldType = 'timestamp';\n else if (segment === 'datetime') field.fieldType = 'datetime';\n else if (segment === 'yes/no' || segment === 'boolean') field.fieldType = 'yes/no';\n else if (segment === 'list') field.fieldType = 'list';\n else if (segment === 'object') field.fieldType = 'object';\n // Check for constraints\n else if (segment === 'required') field.required = true;\n else if (segment === 'unique') field.unique = true;\n else if (segment === 'auto') field.auto = true;\n else if (segment.startsWith('default ')) {\n field.default = parseValue(segment.slice(8));\n }\n }\n\n return field;\n }\n\n function parseRelationship(entity: DomainEntity, relType: RelationshipType): void {\n // Get target entity name\n if (current().type !== TokenType.IDENTIFIER) {\n return;\n }\n const targetEntity = current().value;\n advance();\n\n let alias: string | undefined;\n\n // Check for \"as [Alias]\"\n if (current().type === TokenType.AS) {\n advance();\n if (current().type === TokenType.IDENTIFIER) {\n alias = current().value;\n advance();\n }\n }\n\n entity.relationships.push({\n type: 'relationship',\n relationshipType: relType,\n targetEntity,\n alias,\n });\n }\n\n function parseStates(entity: DomainEntity): void {\n const states: string[] = [];\n\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n if (current().type === TokenType.IDENTIFIER) {\n states.push(current().value);\n }\n advance();\n }\n\n entity.states = states;\n }\n\n function parseInitialState(entity: DomainEntity): void {\n if (current().type === TokenType.IDENTIFIER) {\n entity.initialState = current().value;\n advance();\n }\n }\n}\n\n/**\n * Format an entity AST back to domain text\n */\nexport function formatEntityToDomain(entity: DomainEntity): string {\n const lines: string[] = [];\n\n // Header line\n const article = startsWithVowel(entity.name) ? 'An' : 'A';\n lines.push(`${article} ${entity.name} is ${entity.description}`);\n\n // Fields section\n if (entity.fields.length > 0) {\n lines.push('');\n lines.push('It has:');\n for (const field of entity.fields) {\n lines.push(` - ${toSpaceSeparated(field.name)}: ${formatFieldType(field)}`);\n }\n }\n\n // Relationships\n for (const rel of entity.relationships) {\n lines.push('');\n if (rel.relationshipType === 'belongs_to') {\n const aliasStr = rel.alias ? ` as ${rel.alias}` : '';\n lines.push(`It belongs to ${rel.targetEntity}${aliasStr}`);\n } else if (rel.relationshipType === 'has_many') {\n lines.push(`It has many ${rel.targetEntity}`);\n } else if (rel.relationshipType === 'has_one') {\n lines.push(`It has one ${rel.targetEntity}`);\n }\n }\n\n // States\n if (entity.states && entity.states.length > 0) {\n lines.push('');\n lines.push(`It can be: ${entity.states.join(', ')}`);\n if (entity.initialState) {\n lines.push(`It starts as ${entity.initialState}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format entity AST to KFlow schema\n */\nexport function formatEntityToSchema(entity: DomainEntity): Record<string, unknown> {\n const fields = entity.fields.map(field => ({\n name: field.name,\n type: mapFieldTypeToSchema(field.fieldType),\n required: field.required || undefined,\n unique: field.unique || undefined,\n auto: field.auto || undefined,\n values: field.enumValues, // OrbitalSchema uses 'values' not 'enumValues'\n default: field.default,\n }));\n\n // Add relationship fields\n for (const rel of entity.relationships) {\n if (rel.relationshipType === 'belongs_to') {\n const fieldName = rel.alias\n ? toCamelCase(rel.alias) + 'Id'\n : toCamelCase(rel.targetEntity) + 'Id';\n fields.push({\n name: fieldName,\n type: 'relation',\n required: undefined,\n unique: undefined,\n auto: undefined,\n values: undefined,\n default: undefined,\n relation: {\n entity: rel.targetEntity,\n type: 'many-to-one',\n },\n } as any);\n }\n }\n\n return {\n name: entity.name,\n collection: toKebabCase(entity.name) + 's',\n fields: fields.filter(f => Object.keys(f).length > 0),\n states: entity.states,\n initialState: entity.initialState,\n };\n}\n\n// === Utility Functions ===\n\nfunction toCamelCase(text: string): string {\n return text\n .toLowerCase()\n .split(/\\s+/)\n .map((word, index) =>\n index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join('');\n}\n\nfunction toSpaceSeparated(text: string): string {\n return text.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\n}\n\nfunction toKebabCase(text: string): string {\n return text\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .toLowerCase();\n}\n\n/**\n * Check if a word starts with a vowel SOUND (not just vowel letter)\n * Used for determining \"A\" vs \"An\" article\n */\nfunction startsWithVowel(text: string): boolean {\n const lower = text.toLowerCase();\n\n // Words that start with vowel letter but consonant sound (use \"A\")\n // \"U\" pronounced as \"yoo\": user, unicorn, unique, universal, union, etc.\n // \"Eu\" pronounced as \"yoo\": European, eureka, etc.\n if (/^(u[^aeiou]|uni|euro)/i.test(lower)) {\n return false;\n }\n\n // Words that start with consonant letter but vowel sound (use \"An\")\n // Silent \"H\": hour, honest, honor, heir, etc.\n if (/^(hour|honest|honor|heir)/i.test(lower)) {\n return true;\n }\n\n // Default: check if first letter is a vowel\n return /^[aeiou]/i.test(text);\n}\n\nfunction parseValue(text: string): string | number | boolean {\n text = text.trim();\n if (text.toLowerCase() === 'true') return true;\n if (text.toLowerCase() === 'false') return false;\n const num = parseFloat(text);\n if (!isNaN(num)) return num;\n return text.replace(/^[\"']|[\"']$/g, '');\n}\n\nfunction formatFieldType(field: DomainField): string {\n const parts: string[] = [];\n\n if (field.enumValues && field.enumValues.length > 0) {\n parts.push(field.enumValues.join(' | '));\n } else {\n parts.push(field.fieldType);\n }\n\n if (field.required) parts.push('required');\n if (field.unique) parts.push('unique');\n if (field.auto) parts.push('auto');\n if (field.default !== undefined) {\n parts.push(`default ${field.default}`);\n }\n\n return parts.join(', ');\n}\n\nfunction mapFieldTypeToSchema(fieldType: DomainFieldType): string {\n // Use the centralized DOMAIN_TO_SCHEMA_FIELD_TYPE from types.ts\n const mapping: Record<DomainFieldType, string> = {\n 'text': 'string',\n 'long text': 'string',\n 'number': 'number',\n 'currency': 'number',\n 'date': 'date',\n 'timestamp': 'timestamp',\n 'datetime': 'datetime',\n 'yes/no': 'boolean',\n 'enum': 'enum',\n 'list': 'array',\n 'object': 'object',\n 'relation': 'relation',\n };\n return mapping[fieldType] || 'string';\n}\n","/**\n * Page Parser\n *\n * Parses page definitions from domain language.\n */\n\nimport type {\n DomainPage,\n DomainPageSection,\n DomainPageAction,\n ParseResult,\n ParseError,\n} from '../types.js';\nimport { Lexer } from '../lexer.js';\nimport { TokenType } from '../tokens.js';\n\ninterface PageParseContext {\n errors: ParseError[];\n warnings: ParseError[];\n}\n\n/**\n * Parse a page definition from domain text\n *\n * @example\n * parsePage(`\n * The Dashboard shows an overview of system activity\n * Purpose: Help users monitor their tasks and orders\n * URL: /dashboard\n *\n * It displays:\n * - Summary statistics for today\n * - Recent orders list\n * - Pending tasks requiring attention\n *\n * Users can:\n * - Click a task to view details\n * - Filter orders by status\n * `)\n */\nexport function parsePage(text: string): ParseResult<DomainPage> {\n const ctx: PageParseContext = { errors: [], warnings: [] };\n const lexer = new Lexer(text);\n const tokens = lexer.tokenize();\n\n let pos = 0;\n\n // Helper functions\n const current = () => tokens[pos] || { type: TokenType.EOF, value: '', line: 0, column: 0, offset: 0 };\n const advance = () => tokens[pos++];\n const isAtEnd = () => current().type === TokenType.EOF;\n const skip = (type: TokenType) => {\n while (current().type === type) advance();\n };\n\n // Skip leading whitespace\n skip(TokenType.NEWLINE);\n\n // Parse \"The [PageName] shows [description]\"\n const pageHeader = parsePageHeader();\n if (!pageHeader) {\n return {\n success: false,\n errors: ctx.errors.length > 0 ? ctx.errors : [{\n message: 'Expected page definition starting with \"The [PageName] shows...\"',\n }],\n warnings: [],\n };\n }\n\n const page: DomainPage = {\n type: 'page',\n name: pageHeader.name,\n description: pageHeader.description,\n purpose: '',\n url: pageHeader.url || '',\n primaryEntity: pageHeader.primaryEntity,\n traitName: pageHeader.traitName,\n sections: [],\n actions: [],\n };\n\n skip(TokenType.NEWLINE);\n\n // Parse remaining sections\n while (!isAtEnd()) {\n skip(TokenType.NEWLINE);\n if (isAtEnd()) break;\n\n const parsed = parsePageSection(page);\n if (!parsed) {\n advance();\n }\n }\n\n // Generate URL if not provided\n if (!page.url) {\n page.url = '/' + toKebabCase(page.name.replace(/Page$/i, ''));\n }\n\n return {\n success: true,\n data: page,\n errors: ctx.errors,\n warnings: ctx.warnings,\n };\n\n // === Helper Functions ===\n\n function parsePageHeader(): { name: string; description: string; url?: string; primaryEntity?: string; traitName?: string } | null {\n // Check for alternative format: \"[PageName] at /[path]:\"\n if (current().type === TokenType.IDENTIFIER) {\n const firstToken = current().value;\n advance();\n\n // Check if next token is \"at\" or more identifiers followed by \"at\"\n const nameParts: string[] = [firstToken];\n while (current().type === TokenType.IDENTIFIER && current().value.toLowerCase() !== 'at') {\n nameParts.push(current().value);\n advance();\n }\n\n // Check for \"at\" keyword (which is just an identifier)\n if (current().type === TokenType.IDENTIFIER && current().value.toLowerCase() === 'at') {\n advance();\n\n // Collect URL path\n const pathParts: string[] = [];\n while (!isAtEnd() && current().type !== TokenType.COLON && current().type !== TokenType.NEWLINE) {\n pathParts.push(current().value);\n advance();\n }\n const url = pathParts.join('');\n\n // Skip colon\n if (current().type === TokenType.COLON) {\n advance();\n }\n\n // Normalize page name - preserve PascalCase\n let name = nameParts.map(p => toPascalCase(p)).join('');\n if (!name.toLowerCase().endsWith('page')) {\n name += 'Page';\n }\n\n // Parse the page body for additional info\n skip(TokenType.NEWLINE);\n let primaryEntity: string | undefined;\n let traitName: string | undefined;\n\n // Parse indented lines for \"shows\", \"view type\", \"is initial page\"\n if (current().type === TokenType.INDENT) {\n advance();\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Skip dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n // Check for \"shows [Entity] using [Trait]\"\n if (current().type === TokenType.SHOWS) {\n advance();\n if (current().type === TokenType.IDENTIFIER) {\n primaryEntity = current().value;\n advance();\n }\n // Check for \"using [TraitName]\"\n if (current().type === TokenType.IDENTIFIER && current().value.toLowerCase() === 'using') {\n advance();\n if (current().type === TokenType.IDENTIFIER) {\n traitName = current().value;\n advance();\n }\n }\n }\n\n // Skip to end of line\n while (!isAtEnd() && current().type !== TokenType.NEWLINE && current().type !== TokenType.DEDENT) {\n advance();\n }\n skip(TokenType.NEWLINE);\n }\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n return {\n name,\n description: `Page at ${url}`,\n url,\n primaryEntity,\n traitName,\n };\n }\n\n // Reset position if not \"at\" format - rewind not possible with current design\n // Fall through to old format check\n }\n\n // Original format: \"The [PageName] shows [description]\"\n // Expect \"The\"\n if (current().type !== TokenType.THE) {\n ctx.errors.push({ message: 'Expected \"The\" at start of page definition' });\n return null;\n }\n advance();\n\n // Get page name (may be multiple identifiers like \"Task List Page\")\n const nameParts: string[] = [];\n while (current().type === TokenType.IDENTIFIER) {\n nameParts.push(current().value);\n advance();\n }\n\n if (nameParts.length === 0) {\n ctx.errors.push({ message: 'Expected page name after \"The\"' });\n return null;\n }\n\n // Normalize page name - preserve PascalCase\n let name = nameParts.map(p => toPascalCase(p)).join('');\n if (!name.toLowerCase().endsWith('page')) {\n name += 'Page';\n }\n\n // Expect \"shows\"\n if (current().type !== TokenType.SHOWS) {\n ctx.errors.push({ message: `Expected \"shows\" after page name \"${name}\"` });\n return null;\n }\n advance();\n\n // Collect description until newline\n const descParts: string[] = [];\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n descParts.push(current().value);\n advance();\n }\n\n return {\n name,\n description: descParts.join(' ').trim(),\n };\n }\n\n function parsePageSection(page: DomainPage): boolean {\n const token = current();\n\n // \"Entity: [EntityName]\" - EXPLICIT entity reference (no inference!)\n if (token.type === TokenType.ENTITY) {\n advance();\n skip(TokenType.COLON);\n page.primaryEntity = collectUntilNewline();\n return true;\n }\n\n // \"Purpose: [text]\"\n if (token.type === TokenType.PURPOSE) {\n advance();\n skip(TokenType.COLON);\n page.purpose = collectUntilNewline();\n return true;\n }\n\n // \"URL: [path]\"\n if (token.type === TokenType.URL) {\n advance();\n skip(TokenType.COLON);\n page.url = collectUntilNewline();\n return true;\n }\n\n // \"It displays:\" - sections\n if (token.type === TokenType.IT) {\n advance();\n if (current().type === TokenType.DISPLAYS) {\n advance();\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n parseDisplaysSection(page);\n return true;\n }\n }\n\n // \"Users can:\" or \"Users\" - actions\n if (token.type === TokenType.USERS) {\n advance();\n if (current().type === TokenType.CAN) {\n advance();\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n parseActionsSection(page);\n return true;\n }\n }\n\n // \"When accessed:\" - onAccess\n if (token.type === TokenType.WHEN) {\n advance();\n if (current().type === TokenType.ACCESSED) {\n advance();\n skip(TokenType.COLON);\n page.onAccess = collectUntilNewline();\n return true;\n }\n }\n\n return false;\n }\n\n function parseDisplaysSection(page: DomainPage): void {\n // Expect INDENT\n if (current().type !== TokenType.INDENT) {\n return;\n }\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Parse section line: \"- [description]\"\n const section = parseSectionLine();\n if (section) {\n page.sections.push(section);\n }\n\n skip(TokenType.NEWLINE);\n }\n\n // Consume DEDENT\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n function parseSectionLine(): DomainPageSection | null {\n // Optional dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n const description = collectUntilNewline();\n if (!description) {\n return null;\n }\n\n return {\n type: 'page_section',\n description,\n };\n }\n\n function parseActionsSection(page: DomainPage): void {\n // Expect INDENT\n if (current().type !== TokenType.INDENT) {\n return;\n }\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Parse action line: \"- [trigger] to [action]\"\n const action = parseActionLine();\n if (action) {\n page.actions.push(action);\n }\n\n skip(TokenType.NEWLINE);\n }\n\n // Consume DEDENT\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n function parseActionLine(): DomainPageAction | null {\n // Optional dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n const fullText = collectUntilNewline();\n if (!fullText) {\n return null;\n }\n\n // Split on \" to \" to separate trigger and action\n const toIndex = fullText.toLowerCase().indexOf(' to ');\n if (toIndex === -1) {\n // No \"to\" found, treat whole thing as trigger\n return {\n type: 'page_action',\n trigger: fullText,\n action: '',\n };\n }\n\n return {\n type: 'page_action',\n trigger: fullText.slice(0, toIndex).trim(),\n action: fullText.slice(toIndex + 4).trim(),\n };\n }\n\n function collectUntilNewline(): string {\n const parts: string[] = [];\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n parts.push(current().value);\n advance();\n }\n return parts.join(' ').trim();\n }\n}\n\n/**\n * Format a page AST back to domain text\n */\nexport function formatPageToDomain(page: DomainPage): string {\n const lines: string[] = [];\n\n // Header line\n const displayName = page.name.replace(/Page$/, '');\n lines.push(`The ${displayName} shows ${page.description}`);\n\n // Entity - EXPLICIT reference (no inference on parse!)\n if (page.primaryEntity) {\n lines.push(`Entity: ${page.primaryEntity}`);\n }\n\n // Purpose\n if (page.purpose) {\n lines.push(`Purpose: ${page.purpose}`);\n }\n\n // URL\n if (page.url) {\n lines.push(`URL: ${page.url}`);\n }\n\n // Sections\n if (page.sections.length > 0) {\n lines.push('');\n lines.push('It displays:');\n for (const section of page.sections) {\n lines.push(` - ${section.description}`);\n }\n }\n\n // Actions\n if (page.actions.length > 0) {\n lines.push('');\n lines.push('Users can:');\n for (const action of page.actions) {\n if (action.action) {\n lines.push(` - ${action.trigger} to ${action.action}`);\n } else {\n lines.push(` - ${action.trigger}`);\n }\n }\n }\n\n // On access\n if (page.onAccess) {\n lines.push('');\n lines.push(`When accessed: ${page.onAccess}`);\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format page AST to KFlow schema\n */\nexport function formatPageToSchema(page: DomainPage): Record<string, unknown> {\n // Infer viewType from page name (this is acceptable - it's a display hint, not critical data)\n const viewType = inferViewTypeFromPageName(page.name);\n\n // Use EXPLICIT primaryEntity from domain text - NO INFERENCE!\n const primaryEntity = page.primaryEntity;\n\n return {\n name: page.name,\n path: page.url.startsWith('/') ? page.url : `/${page.url}`,\n purpose: page.purpose || page.description,\n sections: page.sections.map((section, index) => {\n const pattern = inferPatternFromDescription(section.description);\n const patternConfig = inferPatternConfigFromDescription(section.description, page.primaryEntity);\n\n return {\n id: `section-${index}`,\n purpose: section.description,\n order: index,\n estimatedSize: 'medium',\n pattern: {\n type: pattern,\n ...patternConfig,\n },\n };\n }),\n traits: [],\n primaryEntity,\n viewType,\n isInitial: page.url === '/' || page.url === '/dashboard',\n };\n}\n\n/**\n * Infer view type from page name\n */\nfunction inferViewTypeFromPageName(name: string): string {\n const lower = name.toLowerCase();\n\n if (lower.includes('list') || lower.includes('index')) {\n return 'list';\n }\n if (lower.includes('detail') || lower.includes('view')) {\n return 'detail';\n }\n if (lower.includes('create') || lower.includes('new')) {\n return 'create';\n }\n if (lower.includes('edit')) {\n return 'edit';\n }\n if (lower.includes('dashboard')) {\n return 'dashboard';\n }\n\n return 'list';\n}\n\n/**\n * Get pattern config from description, using explicit entity when available\n * IMPORTANT: Use primaryEntity from explicit \"Entity:\" line when available.\n * Pattern detection from description is acceptable (e.g., \"list\" → entity-list pattern)\n * but entity association MUST come from explicit data.\n */\nfunction inferPatternConfigFromDescription(description: string, primaryEntity?: string): Record<string, unknown> {\n const lower = description.toLowerCase();\n\n // Use explicit entity when available, otherwise use a placeholder\n // The placeholder indicates the schema needs explicit entity data\n const entityName = primaryEntity || 'Item';\n\n // Header pattern - doesn't need entity\n if (lower.includes('header') || lower.includes('title')) {\n const titleMatch = description.match(/title\\s*[\"']?([^\"']+)[\"']?/i) ||\n description.match(/[\"']([^\"']+)[\"']/);\n return {\n title: titleMatch ? titleMatch[1] : 'Page Title',\n };\n }\n\n // Entity list pattern\n if (lower.includes('list') || lower.includes('table')) {\n return {\n entity: entityName,\n fieldNames: ['id', 'name', 'createdAt'],\n };\n }\n\n // Entity detail pattern\n if (lower.includes('detail')) {\n return {\n entity: entityName,\n fieldNames: ['id', 'name', 'description', 'createdAt'],\n };\n }\n\n // Form pattern\n if (lower.includes('form')) {\n return {\n entity: entityName,\n fields: [\n { field: 'name', label: 'Name', type: 'text', required: true },\n { field: 'description', label: 'Description', type: 'textarea' },\n ],\n };\n }\n\n // Stats/statistics/summary patterns\n if (lower.includes('stats') || lower.includes('statistics') ||\n lower.includes('summary') || lower.includes('overview')) {\n return {\n entity: entityName,\n fieldNames: ['id', 'name', 'value'],\n };\n }\n\n // Default: entity-list needs entity and fieldNames\n return {\n entity: entityName,\n fieldNames: ['id', 'name', 'createdAt'],\n };\n}\n\n// === Utility Functions ===\n\nfunction capitalize(text: string): string {\n return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();\n}\n\n/**\n * Convert text to PascalCase, preserving existing PascalCase words.\n * \"notesPage\" → \"NotesPage\"\n * \"NotesPage\" → \"NotesPage\" (preserved)\n * \"notes page\" → \"NotesPage\"\n */\nfunction toPascalCase(text: string): string {\n // If already PascalCase (starts with uppercase, has lowercase), preserve it\n if (/^[A-Z][a-zA-Z]*$/.test(text)) {\n return text;\n }\n // If it's all lowercase or has spaces, convert to PascalCase\n if (text.includes(' ')) {\n return text.split(' ').map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join('');\n }\n // Single word - capitalize first letter, preserve rest\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\nfunction toKebabCase(text: string): string {\n return text\n .replace(/([a-z])([A-Z])/g, '$1-$2')\n .replace(/\\s+/g, '-')\n .toLowerCase();\n}\n\n/**\n * Infer a section pattern from its natural language description\n * Valid pattern types: page-header, title-only, entity-list, entity-table, entity-detail, form-section\n */\nfunction inferPatternFromDescription(description: string): string {\n const lower = description.toLowerCase();\n\n // Header patterns - check FIRST to prevent \"Header with title Details\" being matched as detail\n if (lower.includes('header')) {\n return 'page-header';\n }\n\n // List patterns\n if (lower.includes('list') || lower.includes('table')) {\n return 'entity-list';\n }\n\n // Statistics/dashboard - map to entity-list for now\n if (lower.includes('statistics') || lower.includes('stats') ||\n lower.includes('summary') || lower.includes('overview')) {\n return 'entity-list';\n }\n\n // Form patterns\n if (lower.includes('form') || lower.includes('input') || lower.includes('edit')) {\n return 'form-section';\n }\n\n // Detail patterns\n if (lower.includes('detail') || lower.includes('view')) {\n return 'entity-detail';\n }\n\n // Chart patterns - map to entity-list for now\n if (lower.includes('chart') || lower.includes('graph')) {\n return 'entity-list';\n }\n\n // Timeline - map to entity-list for now\n if (lower.includes('timeline') || lower.includes('history') || lower.includes('activity')) {\n return 'entity-list';\n }\n\n // Title-only patterns (without \"header\" keyword)\n if (lower.includes('title')) {\n return 'page-header';\n }\n\n // Default to entity-list\n return 'entity-list';\n}\n","/**\n * Guard Expression Parser\n *\n * Parses guard expressions deterministically from domain language.\n * All entity references are explicit (e.g., Order.amount, CurrentUser.role).\n */\n\nimport type {\n GuardCondition,\n FieldReference,\n FieldCheckCondition,\n ComparisonCondition,\n UserCheckCondition,\n LogicalCondition,\n DomainGuard,\n ParseResult,\n ParseError,\n ComparisonOperator,\n} from '../types.js';\n\ninterface GuardParseContext {\n entityName: string; // Current entity context (e.g., \"Order\")\n errors: ParseError[];\n}\n\n/**\n * Parse a guard expression from domain text\n *\n * @example\n * parseGuard(\"if amount > 1000\", \"Order\")\n * // Returns: { field: { entityName: \"Order\", fieldName: \"amount\" }, operator: \">\", value: 1000 }\n */\nexport function parseGuard(text: string, entityName: string): ParseResult<DomainGuard> {\n const ctx: GuardParseContext = { entityName, errors: [] };\n\n // Remove leading \"if \" if present\n let expression = text.trim();\n if (expression.toLowerCase().startsWith('if ')) {\n expression = expression.slice(3).trim();\n }\n\n const condition = parseCondition(expression, ctx);\n\n if (!condition) {\n return {\n success: false,\n errors: ctx.errors.length > 0 ? ctx.errors : [{\n message: `Failed to parse guard expression: \"${text}\"`,\n }],\n warnings: [],\n };\n }\n\n return {\n success: true,\n data: {\n type: 'guard',\n condition,\n raw: text,\n },\n errors: [],\n warnings: [],\n };\n}\n\n/**\n * Parse a condition (may be simple or compound with AND/OR)\n */\nfunction parseCondition(text: string, ctx: GuardParseContext): GuardCondition | null {\n text = text.trim();\n\n // Check for logical operators (AND/OR) - split at top level\n const andMatch = splitAtTopLevel(text, ' AND ');\n if (andMatch) {\n const left = parseCondition(andMatch.left, ctx);\n const right = parseCondition(andMatch.right, ctx);\n if (left && right) {\n return {\n type: 'logical',\n operator: 'AND',\n left,\n right,\n };\n }\n }\n\n const orMatch = splitAtTopLevel(text, ' OR ');\n if (orMatch) {\n const left = parseCondition(orMatch.left, ctx);\n const right = parseCondition(orMatch.right, ctx);\n if (left && right) {\n return {\n type: 'logical',\n operator: 'OR',\n left,\n right,\n };\n }\n }\n\n // Try each simple condition type\n return parseUserCheck(text, ctx) ||\n parseFieldCheck(text, ctx) ||\n parseComparison(text, ctx);\n}\n\n/**\n * Parse user check conditions\n * - \"user is manager\" → CurrentUser.role == \"manager\"\n * - \"user owns this\" → Order.ownerId == CurrentUser.id\n */\nfunction parseUserCheck(text: string, ctx: GuardParseContext): UserCheckCondition | null {\n const lowerText = text.toLowerCase();\n\n // \"user is [role]\"\n const roleMatch = lowerText.match(/^user\\s+is\\s+(\\w+)$/);\n if (roleMatch) {\n return {\n type: 'user_check',\n check: 'is_role',\n role: roleMatch[1],\n };\n }\n\n // \"user owns this\"\n if (lowerText === 'user owns this') {\n return {\n type: 'user_check',\n check: 'owns_this',\n ownerField: 'ownerId',\n };\n }\n\n return null;\n}\n\n/**\n * Parse field check conditions\n * - \"amount is provided\" → Order.amount != null\n * - \"amount is empty\" → Order.amount == null\n * - \"status is Pending\" → Order.status == \"Pending\"\n * - \"status is not Cancelled\" → Order.status != \"Cancelled\"\n */\nfunction parseFieldCheck(text: string, ctx: GuardParseContext): FieldCheckCondition | null {\n const lowerText = text.toLowerCase();\n\n // \"[field] is provided\"\n const providedMatch = text.match(/^(.+?)\\s+is\\s+provided$/i);\n if (providedMatch) {\n const field = parseFieldReference(providedMatch[1], ctx);\n if (field) {\n return {\n type: 'field_check',\n field,\n check: 'provided',\n };\n }\n }\n\n // \"[field] is empty\"\n const emptyMatch = text.match(/^(.+?)\\s+is\\s+empty$/i);\n if (emptyMatch) {\n const field = parseFieldReference(emptyMatch[1], ctx);\n if (field) {\n return {\n type: 'field_check',\n field,\n check: 'empty',\n };\n }\n }\n\n // \"[field] is not [value]\" (negated equality)\n const notEqualsMatch = text.match(/^(.+?)\\s+is\\s+not\\s+(.+)$/i);\n if (notEqualsMatch) {\n // This should be handled as a comparison with !=\n return null; // Let comparison parser handle it\n }\n\n // \"[field] is [value]\" (equality check)\n const equalsMatch = text.match(/^(.+?)\\s+is\\s+(.+)$/i);\n if (equalsMatch) {\n const fieldName = equalsMatch[1].trim();\n const value = equalsMatch[2].trim();\n\n // Skip if value is a keyword\n if (['provided', 'empty', 'not'].includes(value.toLowerCase())) {\n return null;\n }\n\n const field = parseFieldReference(fieldName, ctx);\n if (field) {\n return {\n type: 'field_check',\n field,\n check: 'equals',\n value: parseValue(value),\n };\n }\n }\n\n return null;\n}\n\n/**\n * Parse comparison conditions\n * - \"amount > 1000\" → Order.amount > 1000\n * - \"amount >= 1000\" → Order.amount >= 1000\n * - \"status != 'Cancelled'\" → Order.status != \"Cancelled\"\n */\nfunction parseComparison(text: string, ctx: GuardParseContext): ComparisonCondition | null {\n // Try each operator\n const operators: { pattern: RegExp; operator: ComparisonOperator }[] = [\n { pattern: /^(.+?)\\s*>=\\s*(.+)$/, operator: '>=' },\n { pattern: /^(.+?)\\s*<=\\s*(.+)$/, operator: '<=' },\n { pattern: /^(.+?)\\s*!=\\s*(.+)$/, operator: '!=' },\n { pattern: /^(.+?)\\s*==\\s*(.+)$/, operator: '==' },\n { pattern: /^(.+?)\\s*>\\s*(.+)$/, operator: '>' },\n { pattern: /^(.+?)\\s*<\\s*(.+)$/, operator: '<' },\n ];\n\n // Also handle \"is not\" as !=\n const isNotMatch = text.match(/^(.+?)\\s+is\\s+not\\s+(.+)$/i);\n if (isNotMatch) {\n const field = parseFieldReference(isNotMatch[1], ctx);\n if (field) {\n return {\n type: 'comparison',\n field,\n operator: '!=',\n value: parseValue(isNotMatch[2]),\n };\n }\n }\n\n for (const { pattern, operator } of operators) {\n const match = text.match(pattern);\n if (match) {\n const field = parseFieldReference(match[1], ctx);\n if (field) {\n return {\n type: 'comparison',\n field,\n operator,\n value: parseValue(match[2]),\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Parse a field reference\n * - \"amount\" → { entityName: \"Order\", fieldName: \"amount\" } (uses context)\n * - \"Order.amount\" → { entityName: \"Order\", fieldName: \"amount\" }\n * - \"tracking number\" → { entityName: \"Order\", fieldName: \"trackingNumber\" }\n */\nfunction parseFieldReference(text: string, ctx: GuardParseContext): FieldReference | null {\n text = text.trim();\n\n // Check for explicit entity reference (Entity.field)\n const dotMatch = text.match(/^(\\w+)\\.(\\w+)$/);\n if (dotMatch) {\n return {\n type: 'field_reference',\n entityName: dotMatch[1],\n fieldName: dotMatch[2],\n };\n }\n\n // Convert \"tracking number\" style to \"trackingNumber\"\n const fieldName = toCamelCase(text);\n\n return {\n type: 'field_reference',\n entityName: ctx.entityName,\n fieldName,\n };\n}\n\n/**\n * Parse a value (string, number, or boolean)\n */\nfunction parseValue(text: string): string | number | boolean {\n text = text.trim();\n\n // Remove quotes if present\n if ((text.startsWith('\"') && text.endsWith('\"')) ||\n (text.startsWith(\"'\") && text.endsWith(\"'\"))) {\n return text.slice(1, -1);\n }\n\n // Boolean\n if (text.toLowerCase() === 'true') return true;\n if (text.toLowerCase() === 'false') return false;\n\n // Number\n const num = parseFloat(text);\n if (!isNaN(num)) return num;\n\n // String (identifier-style value like \"Pending\")\n return text;\n}\n\n/**\n * Convert space-separated words to camelCase\n * \"tracking number\" → \"trackingNumber\"\n */\nfunction toCamelCase(text: string): string {\n return text\n .toLowerCase()\n .split(/\\s+/)\n .map((word, index) =>\n index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join('');\n}\n\n/**\n * Split at top-level operator (not inside parentheses)\n */\nfunction splitAtTopLevel(text: string, separator: string): { left: string; right: string } | null {\n const separatorLower = separator.toLowerCase();\n const textLower = text.toLowerCase();\n\n let depth = 0;\n for (let i = 0; i <= textLower.length - separatorLower.length; i++) {\n const char = text[i];\n if (char === '(') depth++;\n else if (char === ')') depth--;\n else if (depth === 0 && textLower.slice(i, i + separatorLower.length) === separatorLower) {\n return {\n left: text.slice(0, i),\n right: text.slice(i + separator.length),\n };\n }\n }\n\n return null;\n}\n\n/**\n * Format a guard condition back to KFlow schema guard string\n */\nexport function formatGuardToSchema(guard: DomainGuard): string {\n return formatConditionToSchema(guard.condition);\n}\n\nfunction formatConditionToSchema(condition: GuardCondition): string {\n switch (condition.type) {\n case 'field_check': {\n const fieldRef = `${condition.field.entityName}.${condition.field.fieldName}`;\n switch (condition.check) {\n case 'provided':\n return `${fieldRef} != null`;\n case 'empty':\n return `${fieldRef} == null`;\n case 'equals':\n const value = typeof condition.value === 'string'\n ? `\"${condition.value}\"`\n : condition.value;\n return `${fieldRef} == ${value}`;\n }\n break;\n }\n\n case 'comparison': {\n const fieldRef = `${condition.field.entityName}.${condition.field.fieldName}`;\n const value = typeof condition.value === 'string'\n ? `\"${condition.value}\"`\n : condition.value;\n return `${fieldRef} ${condition.operator} ${value}`;\n }\n\n case 'user_check': {\n if (condition.check === 'is_role') {\n return `CurrentUser.role == \"${condition.role}\"`;\n } else {\n return `${condition.ownerField} == CurrentUser.id`;\n }\n }\n\n case 'logical': {\n const left = formatConditionToSchema(condition.left);\n const right = formatConditionToSchema(condition.right);\n const op = condition.operator === 'AND' ? '&&' : '||';\n return `(${left}) ${op} (${right})`;\n }\n }\n\n return '';\n}\n\n/**\n * Format a guard condition back to domain language\n */\nexport function formatGuardToDomain(guard: DomainGuard): string {\n return 'if ' + formatConditionToDomain(guard.condition);\n}\n\nfunction formatConditionToDomain(condition: GuardCondition): string {\n switch (condition.type) {\n case 'field_check': {\n const fieldName = toSpaceSeparated(condition.field.fieldName);\n switch (condition.check) {\n case 'provided':\n return `${fieldName} is provided`;\n case 'empty':\n return `${fieldName} is empty`;\n case 'equals':\n return `${fieldName} is ${condition.value}`;\n }\n break;\n }\n\n case 'comparison': {\n const fieldName = toSpaceSeparated(condition.field.fieldName);\n const opMap: Record<string, string> = {\n '==': 'is',\n '!=': 'is not',\n '>': '>',\n '<': '<',\n '>=': '>=',\n '<=': '<=',\n };\n return `${fieldName} ${opMap[condition.operator] || condition.operator} ${condition.value}`;\n }\n\n case 'user_check': {\n if (condition.check === 'is_role') {\n return `user is ${condition.role}`;\n } else {\n return 'user owns this';\n }\n }\n\n case 'logical': {\n const left = formatConditionToDomain(condition.left);\n const right = formatConditionToDomain(condition.right);\n return `${left} ${condition.operator} ${right}`;\n }\n }\n\n return '';\n}\n\n/**\n * Convert camelCase to space-separated words\n * \"trackingNumber\" → \"tracking number\"\n */\nfunction toSpaceSeparated(text: string): string {\n return text.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase();\n}\n","/**\n * S-Expression Parser\n *\n * Parses domain language text (guards/effects) back to S-Expression arrays.\n * This is the reverse of what sexpr-formatter.ts does.\n *\n * @example\n * parseDomainGuard(\"health is at least 0\") → [\">=\", \"@entity.health\", 0]\n * parseDomainEffect(\"update status to 'done'\") → [\"set\", \"@entity.status\", \"done\"]\n *\n * @packageDocumentation\n */\n\nimport type { SExpr } from '@almadar/core/types';\nimport { getPatternDefinition } from '@almadar/patterns';\n\n// Helper functions for pattern validation\nfunction isKnownPattern(pattern: string): boolean {\n return getPatternDefinition(pattern) !== null;\n}\n\nfunction validatePatternReference(pattern: string): string | null {\n // Simple suggestion logic - could be enhanced\n return null;\n}\n\n// ============================================================================\n// Parse Warnings (collected during parsing)\n// ============================================================================\n\nexport interface ParseWarning {\n message: string;\n type: 'unknown-pattern' | 'invalid-syntax';\n}\n\nlet parseWarnings: ParseWarning[] = [];\n\n/**\n * Get and clear parse warnings from the last parse operation.\n */\nexport function getParseWarnings(): ParseWarning[] {\n const warnings = parseWarnings;\n parseWarnings = [];\n return warnings;\n}\n\n/**\n * Add a parse warning.\n */\nfunction addWarning(message: string, type: ParseWarning['type']): void {\n parseWarnings.push({ message, type });\n}\n\n// ============================================================================\n// Main API\n// ============================================================================\n\n/**\n * Parse a domain guard expression to S-Expression.\n *\n * @param text - Domain language guard (e.g., \"health is at least 0\", \"status is 'active'\")\n * @param entityName - The entity context for unqualified field references\n * @returns S-Expression array\n *\n * @example\n * parseDomainGuard(\"health is at least 0\") → [\">=\", \"@entity.health\", 0]\n * parseDomainGuard(\"status is 'active'\") → [\"=\", \"@entity.status\", \"active\"]\n * parseDomainGuard(\"x > 0 and y < 100\") → [\"and\", [\">\", \"@entity.x\", 0], [\"<\", \"@entity.y\", 100]]\n */\nexport function parseDomainGuard(text: string, entityName?: string): SExpr {\n const ctx: ParseContext = { entityName: entityName || '' };\n let expr = text.trim();\n\n // Remove \"if \" prefix if present\n if (expr.toLowerCase().startsWith('if ')) {\n expr = expr.slice(3).trim();\n }\n\n return parseExpression(expr, ctx);\n}\n\n/**\n * Parse a domain effect expression to S-Expression.\n *\n * @param text - Domain language effect (e.g., \"update status to 'done'\", \"emit ORDER_PLACED\")\n * @param entityName - The entity context for unqualified field references\n * @returns S-Expression array\n *\n * @example\n * parseDomainEffect(\"update status to 'done'\") → [\"set\", \"@entity.status\", \"done\"]\n * parseDomainEffect(\"emit ORDER_PLACED\") → [\"emit\", \"ORDER_PLACED\"]\n * parseDomainEffect(\"render entity-table to main\") → [\"render-ui\", \"main\", { type: \"entity-table\" }]\n */\nexport function parseDomainEffect(text: string, entityName?: string): SExpr {\n const ctx: ParseContext = { entityName: entityName || '' };\n let expr = text.trim();\n\n // Remove \"then \" prefix if present\n if (expr.toLowerCase().startsWith('then ')) {\n expr = expr.slice(5).trim();\n }\n\n return parseEffect(expr, ctx);\n}\n\n/**\n * Parse multiple domain effects (comma or \"then\" separated).\n *\n * @param text - Domain language effects\n * @param entityName - The entity context\n * @returns Array of S-Expressions (wrapped in [\"do\", ...] if multiple)\n */\nexport function parseDomainEffects(text: string, entityName?: string): SExpr[] {\n const ctx: ParseContext = { entityName: entityName || '' };\n let expr = text.trim();\n\n // Remove \"then \" prefix\n if (expr.toLowerCase().startsWith('then ')) {\n expr = expr.slice(5).trim();\n }\n\n // Split by \", then \" or just \"then\"\n const parts = expr.split(/,\\s*then\\s+|\\s+then\\s+/i).filter(p => p.trim());\n\n return parts.map(p => parseEffect(p.trim(), ctx));\n}\n\n// ============================================================================\n// Parse Context\n// ============================================================================\n\ninterface ParseContext {\n entityName: string;\n}\n\n// ============================================================================\n// Inline S-Expression / JSON Parsing\n// ============================================================================\n\n/**\n * Check if text is an inline S-Expression or JSON.\n *\n * Supports:\n * - JSON array: [...]\n * - JSON object: {...}\n * - Lisp S-Expression: (op args...)\n */\nfunction isInlineSExpr(text: string): boolean {\n const trimmed = text.trim();\n return trimmed.startsWith('[') || trimmed.startsWith('{') || trimmed.startsWith('(');\n}\n\n/**\n * Parse inline S-Expression or JSON to SExpr.\n *\n * Supports:\n * - JSON: [\"emit\", \"EVENT\"] or {\"type\": \"stats\"}\n * - Lisp: (emit EVENT) or (render-ui main {type: \"stats\"})\n */\nfunction parseInlineSExpr(text: string): SExpr {\n const trimmed = text.trim();\n\n // JSON array or object\n if (trimmed.startsWith('[') || trimmed.startsWith('{')) {\n try {\n return JSON.parse(trimmed);\n } catch {\n // Try relaxed JSON (single quotes, unquoted keys)\n return parseRelaxedJson(trimmed);\n }\n }\n\n // Lisp-style S-Expression: (op args...)\n if (trimmed.startsWith('(')) {\n return parseLispSExpr(trimmed);\n }\n\n throw new Error(`Invalid inline S-Expression: ${text}`);\n}\n\n/**\n * Parse relaxed JSON (allows single quotes, unquoted keys).\n */\nfunction parseRelaxedJson(text: string): SExpr {\n // Replace single quotes with double quotes (simple approach)\n let normalized = text;\n\n // Handle single-quoted strings\n normalized = normalized.replace(/'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'/g, '\"$1\"');\n\n // Handle unquoted keys in objects: {key: value} → {\"key\": value}\n normalized = normalized.replace(/(\\{|,)\\s*(\\w+)\\s*:/g, '$1\"$2\":');\n\n try {\n return JSON.parse(normalized);\n } catch (e) {\n throw new Error(`Failed to parse relaxed JSON: ${text}`);\n }\n}\n\n/**\n * Parse Lisp-style S-Expression: (op arg1 arg2 ...)\n *\n * Examples:\n * - (emit EVENT) → [\"emit\", \"EVENT\"]\n * - (render-ui main {type: \"stats\"}) → [\"render-ui\", \"main\", {type: \"stats\"}]\n * - (and (> x 0) (< x 100)) → [\"and\", [\">\", \"x\", 0], [\"<\", \"x\", 100]]\n */\nfunction parseLispSExpr(text: string): SExpr {\n const trimmed = text.trim();\n\n if (!trimmed.startsWith('(') || !trimmed.endsWith(')')) {\n throw new Error(`Invalid Lisp S-Expression: ${text}`);\n }\n\n const inner = trimmed.slice(1, -1).trim();\n const tokens = tokenizeLisp(inner);\n\n if (tokens.length === 0) {\n return [];\n }\n\n return tokens.map(parseLispToken);\n}\n\n/**\n * Tokenize Lisp expression, respecting nested parens, braces, and quotes.\n */\nfunction tokenizeLisp(text: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let depth = 0;\n let inString = false;\n let stringChar = '';\n\n for (let i = 0; i < text.length; i++) {\n const char = text[i];\n\n if (inString) {\n current += char;\n if (char === stringChar && text[i - 1] !== '\\\\') {\n inString = false;\n }\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n inString = true;\n stringChar = char;\n current += char;\n continue;\n }\n\n if (char === '(' || char === '[' || char === '{') {\n depth++;\n current += char;\n continue;\n }\n\n if (char === ')' || char === ']' || char === '}') {\n depth--;\n current += char;\n continue;\n }\n\n if (char === ' ' || char === '\\t' || char === '\\n') {\n if (depth === 0 && current.trim()) {\n tokens.push(current.trim());\n current = '';\n } else if (depth > 0) {\n current += char;\n }\n continue;\n }\n\n current += char;\n }\n\n if (current.trim()) {\n tokens.push(current.trim());\n }\n\n return tokens;\n}\n\n/**\n * Parse a single Lisp token to SExpr value.\n */\nfunction parseLispToken(token: string): SExpr {\n const trimmed = token.trim();\n\n // Nested S-Expression\n if (trimmed.startsWith('(')) {\n return parseLispSExpr(trimmed);\n }\n\n // JSON object or array\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return parseRelaxedJson(trimmed);\n }\n\n // Quoted string\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n return trimmed.slice(1, -1);\n }\n\n // Number\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) {\n return parseFloat(trimmed);\n }\n\n // Boolean\n if (trimmed === 'true') return true;\n if (trimmed === 'false') return false;\n if (trimmed === 'null') return null;\n\n // Binding (starts with @)\n if (trimmed.startsWith('@')) {\n return trimmed;\n }\n\n // Symbol/identifier\n return trimmed;\n}\n\n// ============================================================================\n// Expression Parsing (Guards)\n// ============================================================================\n\n/**\n * Parse a general expression (guard context).\n */\nfunction parseExpression(text: string, ctx: ParseContext): SExpr {\n text = text.trim();\n\n // Check for inline S-Expression/JSON first\n if (isInlineSExpr(text)) {\n return parseInlineSExpr(text);\n }\n\n // Handle logical operators at top level\n const andMatch = splitAtTopLevel(text, ' and ');\n if (andMatch) {\n const left = parseExpression(andMatch.left, ctx);\n const right = parseExpression(andMatch.right, ctx);\n return ['and', left, right];\n }\n\n const orMatch = splitAtTopLevel(text, ' or ');\n if (orMatch) {\n const left = parseExpression(orMatch.left, ctx);\n const right = parseExpression(orMatch.right, ctx);\n return ['or', left, right];\n }\n\n // Handle \"not X\"\n if (text.toLowerCase().startsWith('not ')) {\n const inner = parseExpression(text.slice(4).trim(), ctx);\n return ['not', inner];\n }\n\n // Handle parentheses\n if (text.startsWith('(') && text.endsWith(')')) {\n return parseExpression(text.slice(1, -1), ctx);\n }\n\n // Parse comparison/condition\n return parseComparison(text, ctx);\n}\n\n/**\n * Parse a comparison expression.\n */\nfunction parseComparison(text: string, ctx: ParseContext): SExpr {\n // \"X is at least Y\" → [\">=\", X, Y]\n const atLeastMatch = text.match(/^(.+?)\\s+is\\s+at\\s+least\\s+(.+)$/i);\n if (atLeastMatch) {\n const field = parseFieldRef(atLeastMatch[1], ctx);\n const value = parseValue(atLeastMatch[2]);\n return ['>=', field, value];\n }\n\n // \"X is at most Y\" → [\"<=\", X, Y]\n const atMostMatch = text.match(/^(.+?)\\s+is\\s+at\\s+most\\s+(.+)$/i);\n if (atMostMatch) {\n const field = parseFieldRef(atMostMatch[1], ctx);\n const value = parseValue(atMostMatch[2]);\n return ['<=', field, value];\n }\n\n // \"X is greater than Y\" → [\">\", X, Y]\n const greaterThanMatch = text.match(/^(.+?)\\s+is\\s+greater\\s+than\\s+(.+)$/i);\n if (greaterThanMatch) {\n const field = parseFieldRef(greaterThanMatch[1], ctx);\n const value = parseValue(greaterThanMatch[2]);\n return ['>', field, value];\n }\n\n // \"X is less than Y\" → [\"<\", X, Y]\n const lessThanMatch = text.match(/^(.+?)\\s+is\\s+less\\s+than\\s+(.+)$/i);\n if (lessThanMatch) {\n const field = parseFieldRef(lessThanMatch[1], ctx);\n const value = parseValue(lessThanMatch[2]);\n return ['<', field, value];\n }\n\n // \"X is not Y\" → [\"!=\", X, Y]\n const isNotMatch = text.match(/^(.+?)\\s+is\\s+not\\s+(.+)$/i);\n if (isNotMatch) {\n const field = parseFieldRef(isNotMatch[1], ctx);\n const value = parseValue(isNotMatch[2]);\n return ['!=', field, value];\n }\n\n // \"X is Y\" → [\"=\", X, Y]\n const isMatch = text.match(/^(.+?)\\s+is\\s+(.+)$/i);\n if (isMatch) {\n const field = parseFieldRef(isMatch[1], ctx);\n const value = parseValue(isMatch[2]);\n return ['=', field, value];\n }\n\n // Operator-based comparisons: >=, <=, !=, ==, >, <\n const opPatterns: { pattern: RegExp; op: string }[] = [\n { pattern: /^(.+?)\\s*>=\\s*(.+)$/, op: '>=' },\n { pattern: /^(.+?)\\s*<=\\s*(.+)$/, op: '<=' },\n { pattern: /^(.+?)\\s*!=\\s*(.+)$/, op: '!=' },\n { pattern: /^(.+?)\\s*==\\s*(.+)$/, op: '=' },\n { pattern: /^(.+?)\\s*>\\s*(.+)$/, op: '>' },\n { pattern: /^(.+?)\\s*<\\s*(.+)$/, op: '<' },\n ];\n\n for (const { pattern, op } of opPatterns) {\n const match = text.match(pattern);\n if (match) {\n const left = parseFieldRef(match[1], ctx);\n const right = parseValue(match[2]);\n return [op, left, right];\n }\n }\n\n // Default: return as binding or literal\n return parseFieldRef(text, ctx);\n}\n\n// ============================================================================\n// Effect Parsing\n// ============================================================================\n\n/**\n * Parse an effect expression.\n *\n * Supports both human-readable syntax and inline S-Expressions:\n * - Human: update status to 'done'\n * - S-Expr: [\"set\", \"@entity.status\", \"done\"]\n * - Lisp: (set @entity.status \"done\")\n * - JSON: {\"type\": \"stats\", \"metrics\": [...]}\n */\nfunction parseEffect(text: string, ctx: ParseContext): SExpr {\n text = text.trim();\n\n // Check for inline S-Expression/JSON first (highest priority)\n if (isInlineSExpr(text)) {\n return parseInlineSExpr(text);\n }\n\n // \"update X to Y\" → [\"set\", \"@entity.X\", Y]\n const updateMatch = text.match(/^update\\s+(.+?)\\s+to\\s+(.+)$/i);\n if (updateMatch) {\n const field = parseFieldRef(updateMatch[1], ctx);\n const value = parseEffectValue(updateMatch[2], ctx);\n return ['set', field, value];\n }\n\n // \"emit EVENT with PAYLOAD\" → [\"emit\", \"EVENT\", PAYLOAD]\n const emitWithMatch = text.match(/^emit\\s+(\\S+)\\s+with\\s+(.+)$/i);\n if (emitWithMatch) {\n const event = emitWithMatch[1];\n const payload = parseEffectValue(emitWithMatch[2], ctx);\n return ['emit', event, payload];\n }\n\n // \"emit EVENT\" → [\"emit\", \"EVENT\"]\n const emitMatch = text.match(/^emit\\s+(\\S+)$/i);\n if (emitMatch) {\n return ['emit', emitMatch[1]];\n }\n\n // \"render null to SLOT\" → [\"render-ui\", \"SLOT\", null]\n const renderNullMatch = text.match(/^render\\s+null\\s+to\\s+(\\S+)$/i);\n if (renderNullMatch) {\n return ['render-ui', renderNullMatch[1], null];\n }\n\n // \"render PATTERN to SLOT for ENTITY with PROPS\" → [\"render-ui\", \"SLOT\", { type, entity, props }]\n const renderFullMatch = text.match(/^render\\s+(\\S+)\\s+to\\s+(\\S+)\\s+for\\s+(\\S+)\\s+with\\s+(.+)$/i);\n if (renderFullMatch) {\n const pattern = renderFullMatch[1];\n const slot = renderFullMatch[2];\n const entity = renderFullMatch[3];\n const propsText = renderFullMatch[4];\n const props = parseRenderProps(propsText);\n // Validate pattern type\n validatePatternType(pattern);\n return ['render-ui', slot, { type: pattern, entity, ...props }];\n }\n\n // \"render PATTERN to SLOT for ENTITY\" → [\"render-ui\", \"SLOT\", { type, entity }]\n const renderEntityMatch = text.match(/^render\\s+(\\S+)\\s+to\\s+(\\S+)\\s+for\\s+(\\S+)$/i);\n if (renderEntityMatch) {\n const pattern = renderEntityMatch[1];\n const slot = renderEntityMatch[2];\n const entity = renderEntityMatch[3];\n // Validate pattern type\n validatePatternType(pattern);\n return ['render-ui', slot, { type: pattern, entity }];\n }\n\n // \"render PATTERN to SLOT with PROPS\" → [\"render-ui\", \"SLOT\", { type, props }]\n const renderPropsMatch = text.match(/^render\\s+(\\S+)\\s+to\\s+(\\S+)\\s+with\\s+(.+)$/i);\n if (renderPropsMatch) {\n const pattern = renderPropsMatch[1];\n const slot = renderPropsMatch[2];\n const propsText = renderPropsMatch[3];\n const props = parseRenderProps(propsText);\n // Validate pattern type\n validatePatternType(pattern);\n return ['render-ui', slot, { type: pattern, ...props }];\n }\n\n // \"render PATTERN to SLOT\" → [\"render-ui\", \"SLOT\", { type: \"PATTERN\" }]\n const renderMatch = text.match(/^render\\s+(\\S+)\\s+to\\s+(\\S+)$/i);\n if (renderMatch) {\n const pattern = renderMatch[1];\n const slot = renderMatch[2];\n // Validate pattern type\n validatePatternType(pattern);\n return ['render-ui', slot, { type: pattern }];\n }\n\n // \"render to SLOT\" → [\"render-ui\", \"SLOT\"]\n const renderSlotMatch = text.match(/^render\\s+to\\s+(\\S+)$/i);\n if (renderSlotMatch) {\n return ['render-ui', renderSlotMatch[1]];\n }\n\n // \"navigate to PATH with PARAMS\" → [\"navigate\", \"PATH\", PARAMS]\n const navWithMatch = text.match(/^navigate\\s+to\\s+(.+?)\\s+with\\s+(.+)$/i);\n if (navWithMatch) {\n const path = navWithMatch[1];\n const params = parseEffectValue(navWithMatch[2], ctx);\n return ['navigate', path, params];\n }\n\n // \"navigate to PATH\" → [\"navigate\", \"PATH\"]\n const navMatch = text.match(/^navigate\\s+to\\s+(.+)$/i);\n if (navMatch) {\n return ['navigate', navMatch[1]];\n }\n\n // \"show TYPE notification MESSAGE\" → [\"notify\", \"MESSAGE\", \"TYPE\"]\n const showNotifyMatch = text.match(/^show\\s+(\\w+)\\s+notification\\s+\"(.+)\"$/i);\n if (showNotifyMatch) {\n return ['notify', showNotifyMatch[2], showNotifyMatch[1]];\n }\n\n // \"notify MESSAGE\" → [\"notify\", \"MESSAGE\"]\n const notifyMatch = text.match(/^notify\\s+\"(.+)\"$/i);\n if (notifyMatch) {\n return ['notify', notifyMatch[1]];\n }\n\n // \"persist ACTION DATA\" → [\"persist\", \"ACTION\", DATA]\n const persistWithMatch = text.match(/^persist\\s+(\\w+)\\s+(.+)$/i);\n if (persistWithMatch) {\n const action = persistWithMatch[1];\n const data = parseFieldRef(persistWithMatch[2], ctx);\n return ['persist', action, data];\n }\n\n // \"persist ACTION\" → [\"persist\", \"ACTION\"]\n const persistMatch = text.match(/^persist\\s+(\\w+)$/i);\n if (persistMatch) {\n return ['persist', persistMatch[1]];\n }\n\n // \"spawn ENTITY with PROPS\" → [\"spawn\", \"ENTITY\", PROPS]\n const spawnWithMatch = text.match(/^spawn\\s+(\\S+)\\s+with\\s+(.+)$/i);\n if (spawnWithMatch) {\n const entityType = spawnWithMatch[1];\n const props = parseEffectValue(spawnWithMatch[2], ctx);\n return ['spawn', entityType, props];\n }\n\n // \"spawn ENTITY\" → [\"spawn\", \"ENTITY\"]\n const spawnMatch = text.match(/^spawn\\s+(\\S+)$/i);\n if (spawnMatch) {\n return ['spawn', spawnMatch[1]];\n }\n\n // \"despawn ID\" → [\"despawn\", ID]\n const despawnIdMatch = text.match(/^despawn\\s+(.+)$/i);\n if (despawnIdMatch && despawnIdMatch[1] !== 'this') {\n return ['despawn', parseFieldRef(despawnIdMatch[1], ctx)];\n }\n\n // \"despawn this\" or \"despawn\" → [\"despawn\"]\n if (text.toLowerCase() === 'despawn' || text.toLowerCase() === 'despawn this') {\n return ['despawn'];\n }\n\n // \"call SERVICE.ACTION\" → [\"call-service\", \"SERVICE\", \"ACTION\"]\n const callServiceMatch = text.match(/^call\\s+(\\w+)\\.(\\w+)$/i);\n if (callServiceMatch) {\n return ['call-service', callServiceMatch[1], callServiceMatch[2]];\n }\n\n // \"call SERVICE\" → [\"call-service\", \"SERVICE\"]\n const callMatch = text.match(/^call\\s+(\\S+)$/i);\n if (callMatch) {\n return ['call-service', callMatch[1]];\n }\n\n // Fallback: return as literal\n return text;\n}\n\n// ============================================================================\n// Field Reference Parsing\n// ============================================================================\n\n/**\n * Parse a field reference to a binding.\n * Converts domain text to @entity.field format.\n */\nfunction parseFieldRef(text: string, ctx: ParseContext): string {\n text = text.trim();\n\n // Already a binding (@entity.field, @payload.field, etc.)\n if (text.startsWith('@')) {\n return text;\n }\n\n // \"current state\" → \"@state\"\n if (text.toLowerCase() === 'current state') {\n return '@state';\n }\n\n // \"current time\" → \"@now\"\n if (text.toLowerCase() === 'current time') {\n return '@now';\n }\n\n // \"entity\" alone → \"@entity\"\n if (text.toLowerCase() === 'entity') {\n return '@entity';\n }\n\n // \"payload\" alone → \"@payload\"\n if (text.toLowerCase() === 'payload') {\n return '@payload';\n }\n\n // \"incoming X\" → \"@payload.X\"\n if (text.toLowerCase().startsWith('incoming ')) {\n const field = toCamelCase(text.slice(9).trim());\n return `@payload.${field}`;\n }\n\n // \"X's Y\" → \"@X.Y\" (singleton binding)\n const possessiveMatch = text.match(/^(\\w+)'s\\s+(.+)$/);\n if (possessiveMatch) {\n const entity = possessiveMatch[1];\n const field = toCamelCase(possessiveMatch[2]);\n return `@${entity}.${field}`;\n }\n\n // \"Entity.field\" → \"@Entity.field\"\n if (text.includes('.')) {\n // Check if first part is capitalized (entity reference)\n const parts = text.split('.');\n if (parts[0] && /^[A-Z]/.test(parts[0])) {\n return `@${text}`;\n }\n // Otherwise it's an entity field\n return `@entity.${text}`;\n }\n\n // Simple field name → \"@entity.fieldName\"\n const fieldName = toCamelCase(text);\n return `@entity.${fieldName}`;\n}\n\n// ============================================================================\n// Value Parsing\n// ============================================================================\n\n/**\n * Parse a value (can be literal or binding).\n */\nfunction parseValue(text: string): SExpr {\n text = text.trim();\n\n // Quoted string\n if ((text.startsWith('\"') && text.endsWith('\"')) ||\n (text.startsWith(\"'\") && text.endsWith(\"'\"))) {\n return text.slice(1, -1);\n }\n\n // \"nothing\" or \"null\" → null\n if (text.toLowerCase() === 'nothing' || text.toLowerCase() === 'null') {\n return null as unknown as SExpr;\n }\n\n // Boolean\n if (text.toLowerCase() === 'true') return true;\n if (text.toLowerCase() === 'false') return false;\n\n // Number\n const num = parseFloat(text);\n if (!isNaN(num) && text.match(/^-?\\d+(\\.\\d+)?$/)) {\n return num;\n }\n\n // Already a binding\n if (text.startsWith('@')) {\n return text;\n }\n\n // Simple identifier - could be an enum value or string\n if (/^[a-zA-Z_]\\w*$/.test(text)) {\n return text;\n }\n\n // Default: return as string\n return text;\n}\n\n/**\n * Parse a value in effect context (handles nested expressions).\n */\nfunction parseEffectValue(text: string, ctx: ParseContext): SExpr {\n text = text.trim();\n\n // JSON object literal\n if (text.startsWith('{') && text.endsWith('}')) {\n try {\n // Handle binding references in JSON\n const processed = text.replace(/@[\\w.]+/g, (match) => `\"${match}\"`);\n const obj = JSON.parse(processed);\n // Convert quoted bindings back\n return processBindingsInObject(obj);\n } catch {\n // Not valid JSON, return as-is\n return text;\n }\n }\n\n // Arithmetic expression\n const arithmeticMatch = text.match(/^\\((.+?)\\s+(plus|minus|times|divided by)\\s+(.+)\\)$/i);\n if (arithmeticMatch) {\n const left = parseEffectValue(arithmeticMatch[1], ctx);\n const right = parseEffectValue(arithmeticMatch[3], ctx);\n const opMap: Record<string, string> = {\n 'plus': '+',\n 'minus': '-',\n 'times': '*',\n 'divided by': '/',\n };\n return [opMap[arithmeticMatch[2].toLowerCase()] || arithmeticMatch[2], left, right];\n }\n\n // Field reference\n if (text.includes('.') || text.toLowerCase().startsWith('incoming ') ||\n text.match(/^\\w+'s\\s+/) || /^[a-z]/.test(text)) {\n // Looks like a field reference\n return parseFieldRef(text, ctx);\n }\n\n // Delegate to parseValue\n return parseValue(text);\n}\n\n/**\n * Process bindings in a parsed JSON object.\n */\nfunction processBindingsInObject(obj: unknown): SExpr {\n if (obj === null || obj === undefined) {\n return null as unknown as SExpr;\n }\n\n if (typeof obj === 'string') {\n // Convert quoted binding back\n if (obj.startsWith('@')) {\n return obj;\n }\n return obj;\n }\n\n if (typeof obj !== 'object') {\n return obj as SExpr;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(processBindingsInObject) as SExpr;\n }\n\n // Object\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = processBindingsInObject(value);\n }\n return result as SExpr;\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Split at top-level separator (not inside parentheses).\n */\nfunction splitAtTopLevel(text: string, separator: string): { left: string; right: string } | null {\n const separatorLower = separator.toLowerCase();\n const textLower = text.toLowerCase();\n\n let depth = 0;\n for (let i = 0; i <= textLower.length - separatorLower.length; i++) {\n const char = text[i];\n if (char === '(' || char === '[' || char === '{') depth++;\n else if (char === ')' || char === ']' || char === '}') depth--;\n else if (depth === 0 && textLower.slice(i, i + separatorLower.length) === separatorLower) {\n return {\n left: text.slice(0, i).trim(),\n right: text.slice(i + separator.length).trim(),\n };\n }\n }\n\n return null;\n}\n\n/**\n * Convert space-separated text to camelCase.\n * Preserves existing camelCase (single word with mixed case).\n */\nfunction toCamelCase(text: string): string {\n const words = text.split(/\\s+/);\n\n // If single word, preserve its casing (e.g., \"isActive\" stays \"isActive\")\n if (words.length === 1) {\n return words[0];\n }\n\n // Multiple words: convert to camelCase\n return words\n .map((word, index) =>\n index === 0\n ? word.toLowerCase()\n : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()\n )\n .join('');\n}\n\n/**\n * Split array content by commas, respecting quoted strings\n */\nfunction splitArrayItems(content: string): string[] {\n const items: string[] = [];\n let current = '';\n let inQuote = false;\n let quoteChar = '';\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n\n if ((char === \"'\" || char === '\"') && (i === 0 || content[i - 1] !== '\\\\')) {\n if (!inQuote) {\n inQuote = true;\n quoteChar = char;\n } else if (char === quoteChar) {\n inQuote = false;\n }\n current += char;\n } else if (char === ',' && !inQuote) {\n if (current.trim()) {\n items.push(current.trim());\n }\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n items.push(current.trim());\n }\n\n return items;\n}\n\n/**\n * Remove quotes from a string value\n */\nfunction unquote(value: string): string {\n const trimmed = value.trim();\n if ((trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) ||\n (trimmed.startsWith('\"') && trimmed.endsWith('\"'))) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\n/**\n * Generic syntax patterns detected by markers:\n *\n * 1. \"as\" pattern: field as 'Label' → {field, label}\n * Used for: metrics, columns, any labeled field\n *\n * 2. \"->\" pattern: Label -> EVENT → {label, event}\n * With variant: Label -> EVENT:variant → {label, event, variant}\n * Used for: itemActions, buttons, any action binding\n *\n * 3. \":\" + \"->\" pattern: id: 'Label' -> EVENT → {id, label, event}\n * Used for: tabs, navigation items\n *\n * 4. \"@\" pattern: section @ span → {section, colSpan}\n * With row span: section @ colxrow → {section, colSpan, rowSpan}\n * Used for: cells, grid layouts\n *\n * The parser auto-detects which pattern based on syntax markers,\n * so any prop can use any pattern without hardcoding prop names.\n */\nfunction parseArrayItem(item: string): unknown {\n const trimmed = item.trim();\n\n // Pattern 3: id: 'Label' -> EVENT (has both : and ->)\n const tabMatch = trimmed.match(/^(\\w+):\\s*['\"]([^'\"]+)['\"]\\s*->\\s*(\\w+)$/);\n if (tabMatch) {\n return { id: tabMatch[1], label: tabMatch[2], event: tabMatch[3] };\n }\n\n // Pattern 2 with variant: Label -> EVENT:variant\n const actionVariantMatch = trimmed.match(/^([^->]+)\\s*->\\s*(\\w+):(\\w+)$/);\n if (actionVariantMatch) {\n return {\n label: actionVariantMatch[1].trim(),\n event: actionVariantMatch[2],\n variant: actionVariantMatch[3],\n };\n }\n\n // Pattern 2: Label -> EVENT or 'Label' -> EVENT\n const actionMatch = trimmed.match(/^(['\"]?)([^'\"->]+)\\1\\s*->\\s*(\\w+)$/);\n if (actionMatch) {\n return { label: actionMatch[2].trim(), event: actionMatch[3] };\n }\n\n // Pattern 4 with rowSpan: section @ colxrow\n const cellSpanMatch = trimmed.match(/^(\\w+)\\s*@\\s*(\\d+)x(\\d+)$/);\n if (cellSpanMatch) {\n return {\n section: cellSpanMatch[1],\n colSpan: parseInt(cellSpanMatch[2], 10),\n rowSpan: parseInt(cellSpanMatch[3], 10),\n };\n }\n\n // Pattern 4: section @ span\n const cellMatch = trimmed.match(/^(\\w+)\\s*@\\s*(\\d+)$/);\n if (cellMatch) {\n return {\n section: cellMatch[1],\n colSpan: parseInt(cellMatch[2], 10),\n };\n }\n\n // Pattern 1: field as 'Label' or field as \"Label\"\n const asMatch = trimmed.match(/^(\\w+)\\s+as\\s+['\"]([^'\"]+)['\"]$/);\n if (asMatch) {\n return { field: asMatch[1], label: asMatch[2] };\n }\n\n // No pattern detected - return as simple string\n return unquote(trimmed);\n}\n\n/**\n * Parse array content, auto-detecting complex syntax patterns\n */\nfunction parseArrayProp(content: string): unknown[] {\n const items = splitArrayItems(content);\n return items.map(parseArrayItem);\n}\n\n/**\n * Check if array content contains complex syntax markers\n */\nfunction hasComplexSyntax(content: string): boolean {\n return /\\s+as\\s+['\"]/.test(content) || // \"as\" pattern\n /->\\s*\\w+/.test(content) || // \"->\" pattern\n /\\w+\\s*@\\s*\\d+/.test(content); // \"@\" pattern\n}\n\n/**\n * Parse render props from text like \"title 'Notes'\" or \"columns [title, createdAt]\"\n *\n * Auto-detects complex array syntax based on markers:\n * - \"as\" pattern: field as 'Label' → {field, label}\n * - \"->\" pattern: Label -> EVENT → {label, event}\n * - \":\" + \"->\" pattern: id: 'Label' -> EVENT → {id, label, event}\n * - \"@\" pattern: section @ span → {section, colSpan}\n *\n * Works generically for any prop name - no need to hardcode specific keys.\n */\nfunction parseRenderProps(text: string): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n\n // Match \"key 'value'\" or \"key [array]\" or \"key value\"\n const propsRegex = /(\\w+)\\s+(?:'([^']+)'|\"([^\"]+)\"|\\[([^\\]]+)\\]|(\\S+))/g;\n let match;\n\n while ((match = propsRegex.exec(text)) !== null) {\n const key = match[1];\n const singleQuoted = match[2];\n const doubleQuoted = match[3];\n const arrayContent = match[4];\n const bareValue = match[5];\n\n if (singleQuoted !== undefined) {\n props[key] = singleQuoted;\n } else if (doubleQuoted !== undefined) {\n props[key] = doubleQuoted;\n } else if (arrayContent !== undefined) {\n // Auto-detect complex syntax based on markers, not key names\n if (hasComplexSyntax(arrayContent)) {\n props[key] = parseArrayProp(arrayContent);\n } else {\n // Simple array: \"title, createdAt\" → [\"title\", \"createdAt\"]\n props[key] = arrayContent.split(/\\s*,\\s*/).map(s => s.trim());\n }\n } else if (bareValue !== undefined) {\n // Try to parse as number or boolean\n if (bareValue === 'true') props[key] = true;\n else if (bareValue === 'false') props[key] = false;\n else if (/^\\d+(\\.\\d+)?$/.test(bareValue)) props[key] = parseFloat(bareValue);\n else props[key] = bareValue;\n }\n }\n\n return props;\n}\n\n/**\n * Validate a pattern type against the registry.\n * Adds a warning if the pattern is unknown.\n */\nfunction validatePatternType(pattern: string): void {\n if (!isKnownPattern(pattern)) {\n const suggestion = validatePatternReference(pattern);\n addWarning(\n suggestion || `Unknown pattern type: \"${pattern}\"`,\n 'unknown-pattern'\n );\n }\n}\n","/**\n * Behavior Parser\n *\n * Parses behavior/trait definitions from domain language.\n * Behaviors define state machines with transitions, guards, and effects.\n * All entity references are explicit (e.g., Order.status, CurrentUser.role).\n */\n\nimport type {\n DomainBehavior,\n DomainTransition,\n DomainTick,\n DomainGuard,\n DomainEffect,\n ParseResult,\n ParseError,\n} from '../types.js';\nimport { Lexer } from '../lexer.js';\nimport { TokenType } from '../tokens.js';\nimport { parseGuard } from './guard-parser.js';\nimport { parseDomainEffect, parseDomainGuard } from './sexpr-parser.js';\n\ninterface BehaviorParseContext {\n entityName: string;\n errors: ParseError[];\n warnings: ParseError[];\n}\n\n/**\n * Parse a behavior definition from domain text\n *\n * @example\n * parseBehavior(`\n * Order Lifecycle\n *\n * States: Pending, Confirmed, Shipped, Delivered, Cancelled\n *\n * Transitions:\n * - From Pending to Confirmed when CONFIRM\n * if Order.amount > 0\n * then notify customer\n * - From Confirmed to Shipped when SHIP\n * - From Shipped to Delivered when DELIVER\n * - From any to Cancelled when CANCEL\n * if Order.status is not Delivered\n *\n * Rules:\n * - Orders over $1000 require manager approval\n * - Cancelled orders cannot be reactivated\n * `, \"Order\")\n */\nexport function parseBehavior(text: string, entityName: string): ParseResult<DomainBehavior> {\n const ctx: BehaviorParseContext = { entityName, errors: [], warnings: [] };\n const lexer = new Lexer(text);\n const tokens = lexer.tokenize();\n\n let pos = 0;\n\n // Helper functions\n const current = () => tokens[pos] || { type: TokenType.EOF, value: '', line: 0, column: 0, offset: 0 };\n const advance = () => tokens[pos++];\n const isAtEnd = () => current().type === TokenType.EOF;\n const skip = (type: TokenType) => {\n while (current().type === type) advance();\n };\n\n // Skip leading whitespace\n skip(TokenType.NEWLINE);\n\n // Parse behavior name (first line)\n const behaviorName = parseBehaviorName();\n if (!behaviorName) {\n return {\n success: false,\n errors: ctx.errors.length > 0 ? ctx.errors : [{\n message: 'Expected behavior name at start of definition',\n }],\n warnings: [],\n };\n }\n\n const behavior: DomainBehavior = {\n type: 'behavior',\n name: behaviorName,\n entityName,\n states: [],\n initialState: '',\n transitions: [],\n ticks: [],\n rules: [],\n };\n\n skip(TokenType.NEWLINE);\n\n // Parse remaining sections\n while (!isAtEnd()) {\n skip(TokenType.NEWLINE);\n if (isAtEnd()) break;\n\n const parsed = parseBehaviorSection(behavior);\n if (!parsed) {\n advance();\n }\n }\n\n // Set initial state if not specified\n if (!behavior.initialState && behavior.states.length > 0) {\n behavior.initialState = behavior.states[0];\n }\n\n return {\n success: true,\n data: behavior,\n errors: ctx.errors,\n warnings: ctx.warnings,\n };\n\n // === Helper Functions ===\n\n function parseBehaviorName(): string | null {\n const nameParts: string[] = [];\n\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n // Check for \"Entity:\" section - extract entity name\n if (current().type === TokenType.IDENTIFIER && current().value.toLowerCase() === 'entity') {\n advance(); // skip \"Entity\"\n if (current().type === TokenType.COLON) {\n advance(); // skip \":\"\n // Next identifier is the entity name\n if (current().type === TokenType.IDENTIFIER) {\n ctx.entityName = current().value;\n advance();\n }\n }\n continue;\n }\n\n // Skip parentheses (for syntax like \"behavior (Entity: X)\")\n if (current().type === TokenType.LPAREN || current().type === TokenType.RPAREN) {\n advance();\n continue;\n }\n\n // Collect identifiers, lifecycle keywords, and AUTO keyword (for names like \"Auto Save\")\n // Skip \"behavior\" keyword and colon\n if (current().type === TokenType.IDENTIFIER ||\n current().type === TokenType.LIFECYCLE ||\n current().type === TokenType.AUTO) {\n nameParts.push(current().value);\n }\n // Skip the \"behavior\" keyword (don't include it in the name)\n // Also skip colon\n advance();\n }\n\n if (nameParts.length === 0) {\n return null;\n }\n\n return nameParts.join(' ');\n }\n\n function parseBehaviorSection(behavior: DomainBehavior): boolean {\n const token = current();\n\n // \"Entity: [entityName]\" - explicit entity association\n if (token.type === TokenType.IDENTIFIER && token.value.toLowerCase() === 'entity') {\n advance();\n skip(TokenType.COLON);\n if (current().type === TokenType.IDENTIFIER) {\n ctx.entityName = current().value;\n behavior.entityName = current().value;\n advance();\n }\n return true;\n }\n\n // \"States: [state1], [state2], ...\"\n if (token.type === TokenType.STATES) {\n advance();\n skip(TokenType.COLON);\n parseStatesLine(behavior);\n return true;\n }\n\n // \"Initial: [state]\"\n if (token.type === TokenType.INITIAL) {\n advance();\n skip(TokenType.COLON);\n if (current().type === TokenType.IDENTIFIER) {\n behavior.initialState = current().value;\n advance();\n }\n return true;\n }\n\n // \"Transitions:\"\n if (token.type === TokenType.TRANSITIONS) {\n advance();\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n parseTransitionsSection(behavior);\n return true;\n }\n\n // \"Rules:\"\n if (token.type === TokenType.RULES) {\n advance();\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n parseRulesSection(behavior);\n return true;\n }\n\n // \"Every [interval]:\" - ticks\n if (token.type === TokenType.EVERY) {\n advance();\n parseTick(behavior);\n return true;\n }\n\n // \"Lifecycle\" keyword at section level\n if (token.type === TokenType.LIFECYCLE) {\n advance();\n return true;\n }\n\n return false;\n }\n\n function parseStatesLine(behavior: DomainBehavior): void {\n const states: string[] = [];\n\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n if (current().type === TokenType.IDENTIFIER) {\n states.push(current().value);\n }\n advance();\n }\n\n behavior.states = states;\n }\n\n function parseTransitionsSection(behavior: DomainBehavior): void {\n // Check for INDENT\n if (current().type === TokenType.INDENT) {\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Only try to parse if we see DASH or FROM (transition markers)\n if (current().type === TokenType.DASH ||\n current().type === TokenType.FROM) {\n const transition = parseTransitionLine();\n if (transition) {\n behavior.transitions.push(transition);\n }\n } else {\n // Skip unrecognized content (e.g., \"filter\" effects that aren't standard)\n // Advance to next line to avoid infinite loop\n while (!isAtEnd() &&\n current().type !== TokenType.NEWLINE &&\n current().type !== TokenType.DEDENT) {\n advance();\n }\n }\n }\n\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n } else {\n // Parse inline transitions (non-indented)\n while (!isAtEnd() &&\n current().type !== TokenType.RULES &&\n current().type !== TokenType.EVERY) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.RULES ||\n current().type === TokenType.EVERY ||\n isAtEnd()) break;\n\n if (current().type === TokenType.DASH ||\n current().type === TokenType.FROM) {\n const transition = parseTransitionLine();\n if (transition) {\n behavior.transitions.push(transition);\n }\n } else {\n advance();\n }\n }\n }\n }\n\n function parseTransitionLine(): DomainTransition | null {\n // Skip dash if present\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n // Expect \"From\"\n if (current().type !== TokenType.FROM) {\n return null;\n }\n advance();\n\n // Get \"from\" state\n let fromState = '';\n if (current().type === TokenType.IDENTIFIER) {\n fromState = current().value;\n advance();\n }\n\n // Handle \"any\" as wildcard\n if (fromState.toLowerCase() === 'any') {\n fromState = '*';\n }\n\n // Expect \"to\"\n if (current().type !== TokenType.TO) {\n ctx.errors.push({ message: `Expected \"to\" in transition from \"${fromState}\"` });\n return null;\n }\n advance();\n\n // Get \"to\" state\n let toState = '';\n if (current().type === TokenType.IDENTIFIER) {\n toState = current().value;\n advance();\n }\n\n // Expect \"when\" for event\n let event = '';\n if (current().type === TokenType.WHEN) {\n advance();\n if (current().type === TokenType.IDENTIFIER) {\n event = current().value;\n advance();\n }\n }\n\n const transition: DomainTransition = {\n type: 'transition',\n fromState,\n toState,\n event: event.toUpperCase(),\n guards: [],\n effects: [],\n };\n\n skip(TokenType.NEWLINE);\n\n // Parse optional guard (\"if ...\")\n if (current().type === TokenType.INDENT) {\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // \"if [condition]\"\n if (current().type === TokenType.IF) {\n const guardText = collectLine();\n const guardResult = parseGuard(guardText, entityName);\n if (guardResult.success && guardResult.data) {\n transition.guards.push(guardResult.data);\n }\n continue;\n }\n\n // \"then [effect]\"\n if (current().type === TokenType.THEN) {\n advance();\n const effectText = collectUntilNewline();\n const effect = parseEffectText(effectText);\n if (effect) {\n transition.effects.push(effect);\n }\n continue;\n }\n\n // Skip any other token to prevent infinite loop\n if (current().type !== TokenType.NEWLINE && current().type !== TokenType.DEDENT) {\n advance();\n }\n\n skip(TokenType.NEWLINE);\n }\n\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n } else {\n // Check for inline \"if\" on same line\n if (current().type === TokenType.IF) {\n const guardText = collectLine();\n const guardResult = parseGuard(guardText, entityName);\n if (guardResult.success && guardResult.data) {\n transition.guards.push(guardResult.data);\n }\n }\n }\n\n return transition;\n }\n\n function parseRulesSection(behavior: DomainBehavior): void {\n if (current().type === TokenType.INDENT) {\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // Skip dash\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n const rule = collectUntilNewline();\n if (rule) {\n behavior.rules.push(rule);\n }\n\n skip(TokenType.NEWLINE);\n }\n\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n }\n\n function parseTick(behavior: DomainBehavior): void {\n // Collect interval specification\n const intervalParts: string[] = [];\n while (!isAtEnd() &&\n current().type !== TokenType.COLON &&\n current().type !== TokenType.NEWLINE) {\n intervalParts.push(current().value);\n advance();\n }\n\n const interval = intervalParts.join(' ');\n\n skip(TokenType.COLON);\n skip(TokenType.NEWLINE);\n\n const tick: DomainTick = {\n type: 'tick',\n name: `tick_${interval.replace(/\\s+/g, '_').toLowerCase()}`,\n interval,\n intervalMs: parseInterval(interval),\n effects: [],\n };\n\n // Parse tick body (guard and effects)\n if (current().type === TokenType.INDENT) {\n advance();\n\n while (!isAtEnd() && current().type !== TokenType.DEDENT) {\n skip(TokenType.NEWLINE);\n if (current().type === TokenType.DEDENT) break;\n\n // \"if [condition]\" - guard\n if (current().type === TokenType.IF) {\n const guardText = collectLine();\n const guardResult = parseGuard(guardText, entityName);\n if (guardResult.success && guardResult.data) {\n tick.guard = guardResult.data;\n }\n }\n\n // \"then [effect]\" or \"[effect]\"\n if (current().type === TokenType.THEN) {\n advance();\n }\n\n if (current().type === TokenType.DASH) {\n advance();\n }\n\n const effectText = collectUntilNewline();\n if (effectText && current().type !== TokenType.IF) {\n const effect = parseEffectText(effectText);\n if (effect) {\n tick.effects.push(effect);\n }\n }\n\n skip(TokenType.NEWLINE);\n }\n\n if (current().type === TokenType.DEDENT) {\n advance();\n }\n }\n\n behavior.ticks.push(tick);\n }\n\n function collectLine(): string {\n return collectTokensSmartJoin();\n }\n\n function collectUntilNewline(): string {\n return collectTokensSmartJoin();\n }\n\n /**\n * Collect tokens and join them smartly - no spaces around dashes/dots\n * to preserve patterns like \"page-header\" and \"entity.field\"\n *\n * When insideArray is detected (starts with [), STRING tokens are quoted\n * to preserve valid JSON for S-expression parsing.\n */\n function collectTokensSmartJoin(): string {\n const parts: { value: string; type: TokenType }[] = [];\n while (!isAtEnd() && current().type !== TokenType.NEWLINE) {\n parts.push({ value: current().value, type: current().type });\n advance();\n }\n\n // Check if this looks like an S-expression (starts with [)\n // If so, we need to quote STRING tokens to preserve valid JSON\n const startsWithBracket = parts.length > 0 && parts[0].type === TokenType.LBRACKET;\n\n // Smart join: no spaces before/after DASH, DOT, or brackets\n let result = '';\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const prev = parts[i - 1];\n\n // Don't add space before dash, dot, comma, colon, or closing brackets\n const noSpaceBefore = part.type === TokenType.DASH ||\n part.type === TokenType.DOT ||\n part.type === TokenType.COMMA ||\n part.type === TokenType.COLON ||\n part.type === TokenType.RBRACKET ||\n part.type === TokenType.RPAREN;\n\n // Don't add space after dash, dot, or open brackets\n const prevNoSpaceAfter = prev &&\n (prev.type === TokenType.DASH ||\n prev.type === TokenType.DOT ||\n prev.type === TokenType.LBRACKET ||\n prev.type === TokenType.LPAREN);\n\n if (i > 0 && !noSpaceBefore && !prevNoSpaceAfter) {\n result += ' ';\n }\n\n // Quote STRING tokens if we're inside an S-expression to preserve valid JSON\n if (startsWithBracket && part.type === TokenType.STRING) {\n result += `\"${part.value}\"`;\n } else {\n result += part.value;\n }\n }\n\n return result.trim();\n }\n\n function parseEffectText(text: string): DomainEffect | null {\n const trimmed = text.trim();\n const lower = trimmed.toLowerCase();\n\n // First, check if this is a raw S-expression (JSON array like [\"render-ui\", ...])\n // Domain text from LLM may contain S-expressions directly\n if (trimmed.startsWith('[')) {\n try {\n const parsed = JSON.parse(trimmed);\n if (Array.isArray(parsed) && parsed.length > 0) {\n const effectOp = String(parsed[0]);\n // Return with effectType from first element\n // Keep the raw JSON in description - formatBehaviorToSchema will handle it\n // Cast to DomainEffect['effectType'] since we're parsing dynamic LLM content\n return {\n type: 'effect',\n effectType: effectOp as DomainEffect['effectType'],\n description: trimmed,\n config: { _rawSExpr: parsed }, // Store parsed S-expression\n };\n }\n } catch {\n // Not valid JSON, fall through to other handlers\n }\n }\n\n // \"persist [action] [entity]\" - persist effect\n const persistMatch = text.match(/^persist\\s+(\\w+)(?:\\s+(\\w+))?$/i);\n if (persistMatch) {\n return {\n type: 'effect',\n effectType: 'persist',\n description: text,\n config: {\n dataAction: persistMatch[1].toLowerCase(),\n entity: persistMatch[2] || undefined,\n },\n };\n }\n\n // \"send_in_app to [userId] title [title] message [message] type [type]\" - notify effect\n const sendInAppMatch = text.match(/^send_in_app\\s+to\\s+(.+?)\\s+title\\s+\"([^\"]+)\"\\s+message\\s+\"([^\"]+)\"(?:\\s+type\\s+(\\w+))?$/i);\n if (sendInAppMatch) {\n return {\n type: 'effect',\n effectType: 'notify',\n description: text,\n config: {\n userId: sendInAppMatch[1],\n title: sendInAppMatch[2],\n message: sendInAppMatch[3],\n type: sendInAppMatch[4] || 'info',\n },\n };\n }\n\n // Generic JSON config format: \"effectType:{...json...}\"\n const jsonMatch = text.match(/^(\\w+):(\\{.+\\})$/);\n if (jsonMatch) {\n try {\n const config = JSON.parse(jsonMatch[2]);\n return {\n type: 'effect',\n effectType: jsonMatch[1] as any,\n description: text,\n config,\n };\n } catch {\n // Fall through to other handlers\n }\n }\n\n // \"notify [recipient] [message]\" - notify with recipient\n const notifyWithRecipientMatch = text.match(/^notify\\s+(\\S+)\\s+\"([^\"]+)\"$/i);\n if (notifyWithRecipientMatch) {\n return {\n type: 'effect',\n effectType: 'notify',\n description: text,\n config: {\n recipient: notifyWithRecipientMatch[1],\n message: notifyWithRecipientMatch[2],\n },\n };\n }\n\n // \"notify [target]\"\n if (lower.startsWith('notify')) {\n const remaining = text.slice(6).trim();\n // Check if it's a quoted message\n const quotedMatch = remaining.match(/^\"([^\"]+)\"$/);\n return {\n type: 'effect',\n effectType: 'notify',\n description: text,\n config: {\n message: quotedMatch ? quotedMatch[1] : remaining,\n },\n };\n }\n\n // \"update [field] to [value]\" - set effect\n const updateMatch = text.match(/^update\\s+(.+?)\\s+to\\s+(.+)$/i);\n if (updateMatch) {\n return {\n type: 'effect',\n effectType: 'set',\n description: text,\n config: {\n field: preserveTemplateVars(updateMatch[1]),\n value: updateMatch[2],\n },\n };\n }\n\n // \"navigate to [path]\"\n const navMatch = text.match(/^navigate\\s+to\\s+(.+)$/i);\n if (navMatch) {\n return {\n type: 'effect',\n effectType: 'navigate',\n description: text,\n config: {\n path: navMatch[1],\n },\n };\n }\n\n // \"emit [event]\" - emit effect\n const emitMatch = text.match(/^emit\\s+(.+)$/i);\n if (emitMatch) {\n return {\n type: 'effect',\n effectType: 'emit',\n description: text,\n config: {\n eventKey: emitMatch[1].toUpperCase().replace(/\\s+/g, '_'),\n },\n };\n }\n\n // \"call [endpoint]\" - call-service effect\n const callMatch = text.match(/^call\\s+(.+)$/i);\n if (callMatch) {\n return {\n type: 'effect',\n effectType: 'call-service',\n description: text,\n config: {\n service: callMatch[1],\n },\n };\n }\n\n // \"render [pattern] to [slot]\" - render-ui effect (delegate to S-expression parser)\n if (lower.startsWith('render ')) {\n // This is a render effect - delegate to sexpr-parser for proper handling\n // Note: the sexpr-parser will validate the pattern type\n try {\n const result = parseDomainEffect(text);\n if (Array.isArray(result) && result[0] === 'render-ui') {\n return {\n type: 'effect',\n effectType: 'render-ui',\n description: text,\n config: {\n slot: result[1] as string,\n pattern: result[2] as Record<string, unknown>,\n },\n };\n }\n } catch {\n // Fall through to unknown effect warning\n }\n }\n\n // Unknown effect - warn and return null instead of silently converting to notify\n // This prevents masking of invalid effects that should be caught during validation\n ctx.warnings.push({\n message: `Unknown effect syntax: \"${text}\". Effect will be ignored. Use a valid effect format like \"update X to Y\", \"emit EVENT\", \"navigate to /path\", \"notify 'message'\", or \"render pattern to slot\".`,\n });\n return null;\n }\n\n function parseInterval(text: string): number {\n const lower = text.toLowerCase();\n\n // Match patterns like \"30 seconds\", \"1 hour\", \"5 minutes\"\n const match = lower.match(/(\\d+)\\s*(second|minute|hour|day|week)s?/);\n if (match) {\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 'second': return value * 1000;\n case 'minute': return value * 60 * 1000;\n case 'hour': return value * 60 * 60 * 1000;\n case 'day': return value * 24 * 60 * 60 * 1000;\n case 'week': return value * 7 * 24 * 60 * 60 * 1000;\n }\n }\n\n // Default to 1 hour\n return 60 * 60 * 1000;\n }\n}\n\n/**\n * Format a behavior AST back to domain text\n */\nexport function formatBehaviorToDomain(behavior: DomainBehavior): string {\n const lines: string[] = [];\n\n // Behavior name\n lines.push(behavior.name);\n lines.push('');\n\n // States\n if (behavior.states.length > 0) {\n lines.push(`States: ${behavior.states.join(', ')}`);\n lines.push('');\n }\n\n // Transitions\n if (behavior.transitions.length > 0) {\n lines.push('Transitions:');\n for (const transition of behavior.transitions) {\n const fromState = transition.fromState === '*' ? 'any' : transition.fromState;\n let line = ` - From ${fromState} to ${transition.toState}`;\n if (transition.event) {\n line += ` when ${transition.event}`;\n }\n lines.push(line);\n\n // Guards\n for (const guard of transition.guards) {\n lines.push(` ${guard.raw || formatGuardForDomain(guard)}`);\n }\n\n // Effects\n for (const effect of transition.effects) {\n lines.push(` then ${effect.description}`);\n }\n }\n lines.push('');\n }\n\n // Ticks\n for (const tick of behavior.ticks) {\n lines.push(`Every ${tick.interval}:`);\n if (tick.guard) {\n lines.push(` ${tick.guard.raw || formatGuardForDomain(tick.guard)}`);\n }\n for (const effect of tick.effects) {\n lines.push(` - ${effect.description}`);\n }\n lines.push('');\n }\n\n // Rules\n if (behavior.rules.length > 0) {\n lines.push('Rules:');\n for (const rule of behavior.rules) {\n lines.push(` - ${rule}`);\n }\n }\n\n return lines.join('\\n').trim();\n}\n\n/**\n * Format behavior AST to KFlow schema trait\n */\nexport function formatBehaviorToSchema(behavior: DomainBehavior): Record<string, unknown> {\n const trait: Record<string, unknown> = {\n // Just remove spaces, preserve the casing from the source\n // Trust the LLM/author to use consistent PascalCase naming\n name: behavior.name.replace(/\\s+/g, ''),\n description: behavior.name,\n };\n\n // Only include stateMachine if there are states\n if (behavior.states.length > 0) {\n trait.stateMachine = {\n states: behavior.states.map((state, index) => ({\n name: state,\n isInitial: state === behavior.initialState || (index === 0 && !behavior.initialState),\n })),\n events: extractEventsFromTransitions(behavior.transitions),\n transitions: behavior.transitions.map(t => {\n const transition: Record<string, unknown> = {\n from: t.fromState,\n to: t.toState,\n event: t.event,\n };\n\n // Only include guard if present - convert to S-Expression\n if (t.guards.length > 0) {\n // Convert guards to S-Expressions\n const guardExprs = t.guards.map(g => {\n // Use the raw text to parse to S-Expression\n if (g.raw) {\n return parseDomainGuard(g.raw, behavior.entityName);\n }\n return parseDomainGuard(formatGuardToCondition(g), behavior.entityName);\n });\n // Combine multiple guards with AND\n transition.guard = guardExprs.length === 1\n ? guardExprs[0]\n : ['and', ...guardExprs];\n }\n\n // Only include effects if present - convert to S-Expressions\n if (t.effects.length > 0) {\n transition.effects = t.effects.map(e => {\n // If effect has pre-parsed S-expression (from raw JSON in domain text), use it directly\n if (e.config && '_rawSExpr' in e.config && Array.isArray(e.config._rawSExpr)) {\n return e.config._rawSExpr;\n }\n // Otherwise, parse the description text to S-Expression\n return parseDomainEffect(e.description, behavior.entityName);\n });\n }\n\n return transition;\n }),\n };\n }\n\n // Only include ticks if there are any - convert to S-Expressions\n if (behavior.ticks.length > 0) {\n trait.ticks = behavior.ticks.map(t => ({\n name: toPascalCase(t.name.replace(/\\s+/g, '')),\n interval: t.intervalMs, // Direct number in ms\n guard: t.guard\n ? parseDomainGuard(t.guard.raw || formatGuardToCondition(t.guard), behavior.entityName)\n : undefined,\n effects: t.effects.map(e => {\n // If effect has pre-parsed S-expression (from raw JSON in domain text), use it directly\n if (e.config && '_rawSExpr' in e.config && Array.isArray(e.config._rawSExpr)) {\n return e.config._rawSExpr;\n }\n // Otherwise, parse the description text to S-Expression\n return parseDomainEffect(e.description, behavior.entityName);\n }),\n }));\n }\n\n return trait;\n}\n\n// === Utility Functions ===\n\nfunction toCamelCase(text: string): string {\n return text\n .toLowerCase()\n .split(/\\s+/)\n .map((word, index) =>\n index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join('');\n}\n\nfunction toPascalCase(text: string): string {\n // If no spaces, the text is likely already PascalCase (e.g., \"TraineeManager\")\n // Just ensure first letter is uppercase and preserve the rest\n if (!text.includes(' ')) {\n return text.charAt(0).toUpperCase() + text.slice(1);\n }\n // If has spaces, convert each word: \"trainee manager\" -> \"TraineeManager\"\n return text\n .split(/\\s+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n}\n\nfunction extractEventsFromTransitions(transitions: DomainTransition[]): { key: string; name: string }[] {\n const events = new Map<string, string>();\n\n for (const t of transitions) {\n if (t.event && !events.has(t.event)) {\n events.set(t.event, toTitleCase(t.event.replace(/_/g, ' ')));\n }\n }\n\n return Array.from(events.entries()).map(([key, name]) => ({ key, name }));\n}\n\nfunction toTitleCase(text: string): string {\n return text\n .toLowerCase()\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n}\n\nfunction formatGuardForDomain(guard: DomainGuard): string {\n return guard.raw || 'if condition';\n}\n\nfunction formatGuardToCondition(guard: DomainGuard): string {\n // Use the raw text if available, otherwise reconstruct\n if (guard.raw) {\n // Strip \"if \" prefix if present\n return guard.raw.replace(/^if\\s+/i, '');\n }\n return 'true';\n}\n\n/**\n * Preserve template variables like {linkedEntity} while converting the rest to camelCase\n * Input: \"{linkedEntity}.status\" -> \"{linkedEntity}.status\"\n * Input: \"entity . status\" -> \"entity.status\" (preserve dot paths)\n * Input: \"entity status\" -> \"entityStatus\" (convert spaces to camelCase)\n */\nfunction preserveTemplateVars(text: string): string {\n // If it contains template syntax {xxx}, preserve it\n if (text.includes('{') && text.includes('}')) {\n // Just clean up whitespace around dots\n return text.replace(/\\s*\\.\\s*/g, '.');\n }\n\n // Check if this is a dot-separated path (like \"entity . status\" from token reconstruction)\n // Clean up whitespace around dots first\n const cleanedText = text.replace(/\\s*\\.\\s*/g, '.');\n\n // If it's a dot path (like \"entity.status\" or \"entity.fieldName\"), preserve it as-is\n if (cleanedText.includes('.')) {\n return cleanedText;\n }\n\n // Otherwise convert spaces to camelCase\n return toCamelCase(text);\n}\n","/**\n * Domain to Schema Converter\n *\n * Applies domain language text changes to an OrbitalSchema.\n * Supports incremental updates (single section) and full replacement.\n * \n * Updated to use OrbitalSchema where entities, pages, and traits\n * are grouped into Orbital units instead of flat arrays.\n */\n\nimport type { DomainDocument, ParseError, SectionMapping } from '../types.js';\nimport { parseEntity, formatEntityToSchema } from '../parsers/entity-parser.js';\nimport { parsePage, formatPageToSchema } from '../parsers/page-parser.js';\nimport { parseBehavior, formatBehaviorToSchema } from '../parsers/behavior-parser.js';\nimport { parseDomainEffect } from '../parsers/sexpr-parser.js';\nimport type {\n OrbitalSchema,\n Orbital,\n OrbitalDefinition,\n Entity,\n Page,\n TraitRef,\n Trait,\n} from '@almadar/core/types';\nimport { isOrbitalDefinition, getTraitName, isEntityReference, isPageReferenceString, isPageReferenceObject, EntityRef, PageRef } from '@almadar/core/types';\n\n/**\n * Helper to get entity name from EntityRef (handles string references)\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n // Reference format: \"Alias.entity\" - extract alias\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n/**\n * Helper to get page name from PageRef\n */\nfunction getPageName(page: PageRef): string {\n if (isPageReferenceString(page)) {\n // \"Alias.pages.PageName\" -> \"PageName\"\n const parts = page.split('.');\n return parts[parts.length - 1];\n }\n if (isPageReferenceObject(page)) {\n const parts = page.ref.split('.');\n return parts[parts.length - 1];\n }\n return page.name;\n}\n\nexport interface DomainToSchemaResult {\n /** Whether the conversion was successful */\n success: boolean;\n\n /** The updated schema */\n schema: OrbitalSchema;\n\n /** Any parse errors encountered */\n errors: ParseError[];\n\n /** Warnings (non-fatal issues) */\n warnings: ParseError[];\n\n /** Updated section mappings */\n mappings: SectionMapping[];\n}\n\n/**\n * Parse a complete domain document and convert to OrbitalSchema\n */\nexport function convertDomainToSchema(domainText: string, baseSchema?: OrbitalSchema): DomainToSchemaResult {\n const errors: ParseError[] = [];\n const warnings: ParseError[] = [];\n const mappings: SectionMapping[] = [];\n\n // Start with base schema or empty\n // Note: OrbitalSchema no longer has top-level traits - they are inside orbitals\n const schema: OrbitalSchema = baseSchema ? {\n ...baseSchema,\n orbitals: [...(baseSchema.orbitals || [])],\n } : {\n name: 'Application',\n orbitals: [],\n };\n\n // Split document into sections\n const sections = splitDomainDocument(domainText);\n\n // Parse entities, pages, and behaviors\n const parsedEntities: Array<{ name: string; entity: Entity; text: string }> = [];\n const parsedPages: Array<{ name: string; page: Page; forEntity?: string; text: string }> = [];\n const parsedTraits: Array<{ name: string; trait: Trait; forEntity?: string; text: string }> = [];\n const parsedTicks: Array<Record<string, unknown>> = [];\n\n // Parse entities\n for (const text of sections.entities) {\n const result = parseEntity(text);\n if (result.success && result.data) {\n const entityRecord = formatEntityToSchema(result.data);\n const entity: Entity = {\n name: entityRecord.name as string,\n fields: (entityRecord.fields || []) as Entity['fields'],\n persistence: 'persistent',\n };\n parsedEntities.push({\n name: result.data.name,\n entity,\n text,\n });\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n }\n\n // Parse pages\n for (const text of sections.pages) {\n const result = parsePage(text);\n if (result.success && result.data) {\n const pageRecord = formatPageToSchema(result.data);\n const page: Page = {\n name: pageRecord.name as string,\n path: (pageRecord.path || '/') as string,\n primaryEntity: pageRecord.primaryEntity as string | undefined,\n };\n\n // Add trait reference if specified in domain text\n if (result.data.traitName) {\n page.traits = [{\n ref: result.data.traitName,\n linkedEntity: result.data.primaryEntity,\n }];\n }\n\n // Use EXPLICIT primaryEntity from domain text - NO INFERENCE!\n // If primaryEntity is not specified, page becomes orphaned (not attached to orbital)\n const forEntity = result.data.primaryEntity || page.primaryEntity;\n parsedPages.push({\n name: result.data.name,\n page,\n forEntity,\n text,\n });\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n }\n\n // Parse behaviors/traits\n for (const text of sections.behaviors) {\n // Check if it's a tick (starts with \"Every\")\n if (text.trim().toLowerCase().startsWith('every')) {\n const tick = parseTickFromDomain(text);\n if (tick) {\n parsedTicks.push(tick);\n }\n continue;\n }\n\n // Parse as behavior/trait\n const result = parseBehavior(text, '');\n if (result.success && result.data) {\n const traitRecord = formatBehaviorToSchema(result.data);\n const trait: Trait = {\n name: traitRecord.name as string,\n stateMachine: traitRecord.stateMachine as Trait['stateMachine'],\n };\n // Use explicit \"Entity: X\" from behavior syntax if present\n // Behaviors without explicit entity go to schema level (assigned via page references or name matching)\n const forEntity = result.data.entityName || undefined;\n parsedTraits.push({\n name: result.data.name,\n trait,\n forEntity,\n text,\n });\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n }\n\n // Log what was parsed\n console.log(`[DomainToSchema] Parsed: ${parsedEntities.length} entities, ${parsedPages.length} pages, ${parsedTraits.length} traits`);\n if (parsedEntities.length > 0) {\n console.log(`[DomainToSchema] Entities: ${parsedEntities.map(e => e.name).join(', ')}`);\n }\n if (parsedTraits.length > 0) {\n console.log(`[DomainToSchema] Traits: ${parsedTraits.map(t => t.name).join(', ')}`);\n }\n\n // Build a map of trait names to their linked entities from page trait references\n // This connects traits to orbitals via the pages that use them\n const traitToEntityMap = new Map<string, string>();\n for (const { page } of parsedPages) {\n if (page.traits && page.primaryEntity) {\n for (const traitRef of page.traits) {\n // PageTraitRef is always an object with ref property\n if (traitRef.ref) {\n // Use linkedEntity if specified, otherwise use page's primaryEntity\n const linkedEntity = traitRef.linkedEntity || page.primaryEntity;\n if (linkedEntity) {\n traitToEntityMap.set(traitRef.ref.toLowerCase(), linkedEntity);\n }\n }\n }\n }\n }\n\n // Log traitToEntityMap for debugging\n if (traitToEntityMap.size > 0) {\n console.log(`[DomainToSchema] Page trait references: ${Array.from(traitToEntityMap.entries()).map(([t, e]) => `${t}→${e}`).join(', ')}`);\n } else {\n console.log(`[DomainToSchema] No page trait references found (pages may be missing primaryEntity or traits)`);\n }\n\n // Group into Orbitals - each entity becomes an Orbital\n const orbitals: OrbitalDefinition[] = [];\n\n for (let i = 0; i < parsedEntities.length; i++) {\n const { name, entity, text } = parsedEntities[i];\n\n // Find pages for this entity\n const entityPages = parsedPages\n .filter(p => p.forEntity === name || p.page.primaryEntity === name)\n .map(p => p.page);\n\n // Find traits for this entity using CONCRETE strategies only:\n // 1. Explicit forEntity from \"Entity: X\" syntax in behavior definition\n // 2. Page trait references via \"shows Entity using Trait\" syntax\n // NO name-based inference - all associations must be explicit\n const entityTraits: TraitRef[] = parsedTraits\n .filter(t => {\n const traitNameLower = t.name.toLowerCase();\n\n // Strategy 1: Explicit forEntity from \"Entity: X\" syntax\n if (t.forEntity === name) {\n console.log(`[DomainToSchema] ✓ Trait \"${t.name}\" → Entity \"${name}\" (explicit Entity: syntax)`);\n return true;\n }\n\n // Strategy 2: Check if trait is linked to this entity via page trait references\n // This uses \"shows Entity using Trait\" syntax in page definitions\n const linkedEntity = traitToEntityMap.get(traitNameLower);\n if (linkedEntity === name) {\n console.log(`[DomainToSchema] ✓ Trait \"${t.name}\" → Entity \"${name}\" (page trait reference)`);\n return true;\n }\n\n return false;\n })\n .map(t => t.trait.name); // TraitRef can be just a string\n\n const orbital: OrbitalDefinition = {\n name,\n entity,\n traits: entityTraits,\n pages: entityPages,\n };\n\n orbitals.push(orbital);\n\n // Add mapping for entity\n mappings.push({\n sectionId: `entity_${name}`,\n sectionType: 'entity',\n schemaPath: `orbitals[${i}].entity`,\n domainText: text,\n });\n }\n\n // Add mappings for pages and traits\n for (const { name, forEntity, text } of parsedPages) {\n const orbitalIndex = parsedEntities.findIndex(e => e.name === forEntity);\n const pageIndex = orbitalIndex >= 0\n ? orbitals[orbitalIndex].pages.findIndex(p => getPageName(p) === name)\n : -1;\n\n mappings.push({\n sectionId: `page_${name}`,\n sectionType: 'page',\n schemaPath: orbitalIndex >= 0 && pageIndex >= 0\n ? `orbitals[${orbitalIndex}].pages[${pageIndex}]`\n : `orphanedPages`,\n domainText: text,\n });\n }\n\n for (const { name, forEntity, text } of parsedTraits) {\n const orbitalIndex = parsedEntities.findIndex(e => e.name === forEntity);\n const traitIndex = orbitalIndex >= 0\n ? orbitals[orbitalIndex].traits.findIndex(t => getTraitName(t) === name)\n : -1;\n\n mappings.push({\n sectionId: `behavior_${name}`,\n sectionType: 'behavior',\n schemaPath: orbitalIndex >= 0 && traitIndex >= 0\n ? `orbitals[${orbitalIndex}].traits[${traitIndex}]`\n : `traits`,\n domainText: text,\n });\n }\n\n // Collect all trait names that were assigned to orbitals\n const assignedTraitNames = new Set<string>();\n for (const orbital of orbitals) {\n for (const traitRef of orbital.traits) {\n const traitName = getTraitName(traitRef);\n assignedTraitNames.add(traitName.toLowerCase());\n }\n }\n\n // Note: OrbitalSchema no longer has top-level traits.\n // Traits are now inline in orbitals. Each orbital's traits array can contain\n // either trait references (strings) or inline trait definitions.\n // The traits are already assigned to orbitals via assignedTraitNames above.\n\n // Log for debugging\n console.log(`[DomainToSchema] ${parsedTraits.length} traits parsed, ${assignedTraitNames.size} assigned to orbitals`);\n for (const orbital of orbitals) {\n if (orbital.traits.length > 0) {\n console.log(`[DomainToSchema] Orbital ${orbital.name}: ${orbital.traits.length} traits - ${orbital.traits.join(', ')}`);\n }\n }\n\n schema.orbitals = orbitals;\n\n return {\n success: errors.length === 0,\n schema,\n errors,\n warnings,\n mappings,\n };\n}\n\n/**\n * Apply a single section update to an OrbitalSchema\n */\nexport function applySectionUpdate(\n schema: OrbitalSchema,\n sectionType: 'entity' | 'page' | 'behavior' | 'tick',\n sectionId: string,\n newDomainText: string,\n): DomainToSchemaResult {\n const errors: ParseError[] = [];\n const warnings: ParseError[] = [];\n const updatedSchema: OrbitalSchema = JSON.parse(JSON.stringify(schema));\n\n // Extract the name from sectionId (e.g., \"entity_Order\" -> \"Order\")\n const name = sectionId.replace(/^(entity|page|behavior|tick)_/, '');\n\n switch (sectionType) {\n case 'entity': {\n const result = parseEntity(newDomainText);\n if (result.success && result.data) {\n const entityRecord = formatEntityToSchema(result.data);\n const entity: Entity = {\n name: entityRecord.name as string,\n fields: (entityRecord.fields || []) as Entity['fields'],\n persistence: 'persistent',\n };\n\n // Find and update existing orbital or create new\n const orbitalIndex = updatedSchema.orbitals.findIndex(\n o => isOrbitalDefinition(o) && getEntityName(o.entity) === name\n );\n\n if (orbitalIndex >= 0) {\n const orbital = updatedSchema.orbitals[orbitalIndex] as OrbitalDefinition;\n orbital.entity = entity;\n } else {\n // Create new orbital for this entity\n updatedSchema.orbitals.push({\n name: result.data.name,\n entity,\n traits: [],\n pages: [],\n });\n }\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n break;\n }\n\n case 'page': {\n const result = parsePage(newDomainText);\n if (result.success && result.data) {\n const pageRecord = formatPageToSchema(result.data);\n const page: Page = {\n name: pageRecord.name as string,\n path: (pageRecord.path || '/') as string,\n primaryEntity: pageRecord.primaryEntity as string | undefined,\n };\n\n // Find orbital that contains this page or matches primary entity\n for (const orbital of updatedSchema.orbitals) {\n if (!isOrbitalDefinition(orbital)) continue;\n\n const pageIndex = orbital.pages.findIndex(p => getPageName(p) === name);\n if (pageIndex >= 0) {\n orbital.pages[pageIndex] = page;\n break;\n }\n\n // Add to matching entity's orbital\n if (page.primaryEntity && getEntityName(orbital.entity) === page.primaryEntity) {\n orbital.pages.push(page);\n break;\n }\n }\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n break;\n }\n\n case 'behavior': {\n const result = parseBehavior(newDomainText, '');\n if (result.success && result.data) {\n const traitRecord = formatBehaviorToSchema(result.data);\n const trait: Trait = {\n name: traitRecord.name as string,\n stateMachine: traitRecord.stateMachine as Trait['stateMachine'],\n };\n const traitRef: TraitRef = trait.name; // Simple string ref\n\n // NO INFERENCE! Traits without explicit entity reference go to schema level.\n // First, try to find existing trait by name in any orbital or schema-level\n let found = false;\n\n // Check if trait already exists in an orbital (update in place)\n for (const orbital of updatedSchema.orbitals) {\n if (!isOrbitalDefinition(orbital)) continue;\n const traitIndex = orbital.traits.findIndex(t => getTraitName(t) === name);\n if (traitIndex >= 0) {\n orbital.traits[traitIndex] = traitRef;\n found = true;\n break;\n }\n }\n\n // If not found in orbitals, add to the first orbital\n // OrbitalSchema no longer has top-level traits - traits must be in orbitals\n if (!found) {\n // Find first orbital definition and add the trait there\n const firstOrbital = updatedSchema.orbitals.find(o => isOrbitalDefinition(o));\n if (firstOrbital && isOrbitalDefinition(firstOrbital)) {\n firstOrbital.traits.push(traitRef);\n } else {\n errors.push({ message: `No orbital found to attach trait \"${name}\" to` });\n }\n }\n } else {\n errors.push(...result.errors);\n }\n warnings.push(...result.warnings);\n break;\n }\n\n case 'tick': {\n // Ticks are converted to trait ticks - add as schema-level trait\n const tick = parseTickFromDomain(newDomainText);\n if (tick) {\n warnings.push({ message: 'Tick conversion to traits is not fully implemented' });\n } else {\n errors.push({ message: 'Failed to parse tick from domain text' });\n }\n break;\n }\n }\n\n return {\n success: errors.length === 0,\n schema: updatedSchema,\n errors,\n warnings,\n mappings: [],\n };\n}\n\n/**\n * Delete a section from the schema\n */\nexport function deleteSection(\n schema: OrbitalSchema,\n sectionType: 'entity' | 'page' | 'behavior' | 'tick',\n sectionId: string,\n): OrbitalSchema {\n const updatedSchema: OrbitalSchema = JSON.parse(JSON.stringify(schema));\n\n // Extract the name from sectionId\n const name = sectionId.replace(/^(entity|page|behavior|tick)_/, '');\n\n switch (sectionType) {\n case 'entity': {\n // Remove the entire orbital containing this entity\n updatedSchema.orbitals = updatedSchema.orbitals.filter(\n o => !isOrbitalDefinition(o) || getEntityName(o.entity) !== name\n );\n break;\n }\n\n case 'page': {\n // Remove page from its orbital\n for (const orbital of updatedSchema.orbitals) {\n if (!isOrbitalDefinition(orbital)) continue;\n orbital.pages = orbital.pages.filter(p => getPageName(p) !== name);\n }\n break;\n }\n\n case 'behavior': {\n // Remove trait reference from orbitals\n // OrbitalSchema no longer has top-level traits - all traits are in orbitals\n for (const orbital of updatedSchema.orbitals) {\n if (!isOrbitalDefinition(orbital)) continue;\n orbital.traits = orbital.traits.filter(t => getTraitName(t) !== name);\n }\n break;\n }\n\n case 'tick': {\n // Ticks would be in schema.traits - not fully implemented\n break;\n }\n }\n\n return updatedSchema;\n}\n\n/**\n * Split a domain document into its component sections\n */\nfunction splitDomainDocument(text: string): { entities: string[]; pages: string[]; behaviors: string[] } {\n const result = {\n entities: [] as string[],\n pages: [] as string[],\n behaviors: [] as string[],\n };\n\n // Split by major headers\n const normalizedText = text.replace(/\\r\\n/g, '\\n');\n\n // Find section boundaries\n let currentSection: 'entities' | 'pages' | 'behaviors' | null = null;\n let currentContent: string[] = [];\n\n const lines = normalizedText.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim().toLowerCase();\n\n // Check for section headers\n if (trimmed === '# entities' || trimmed === '#entities') {\n flushSection();\n currentSection = 'entities';\n continue;\n }\n if (trimmed === '# pages' || trimmed === '#pages') {\n flushSection();\n currentSection = 'pages';\n continue;\n }\n if (trimmed === '# behaviors' || trimmed === '#behaviors' ||\n trimmed === '# traits' || trimmed === '#traits') {\n flushSection();\n currentSection = 'behaviors';\n continue;\n }\n\n // Add line to current content\n currentContent.push(line);\n }\n\n // Flush final section\n flushSection();\n\n // If no headers were found, try to auto-detect sections\n if (result.entities.length === 0 && result.pages.length === 0 && result.behaviors.length === 0) {\n return autoDetectSections(normalizedText);\n }\n\n return result;\n\n function flushSection() {\n if (!currentSection || currentContent.length === 0) {\n currentContent = [];\n return;\n }\n\n const content = currentContent.join('\\n').trim();\n if (content) {\n // Split by --- separator first\n let items = content.split(/\\n---\\n/).map((s) => s.trim()).filter((s) => s);\n\n // For entities section, also split by \"A/An [Name] is\" patterns\n // This handles cases where LLM doesn't use --- separators\n if (currentSection === 'entities') {\n items = splitEntitiesByPattern(items);\n }\n // For pages section, split by \"[Name] at /\" patterns\n else if (currentSection === 'pages') {\n items = splitPagesByPattern(items);\n }\n // For behaviors section, split by \"[Name] behavior:\" patterns\n else if (currentSection === 'behaviors') {\n items = splitBehaviorsByPattern(items);\n }\n\n result[currentSection].push(...items);\n }\n\n currentContent = [];\n }\n}\n\n/**\n * Split entity content by \"A/An [Name] is\" patterns\n */\nfunction splitEntitiesByPattern(items: string[]): string[] {\n const result: string[] = [];\n\n for (const item of items) {\n // Check if this item contains multiple entities\n const lines = item.split('\\n');\n let currentEntity: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n // Check for entity definition start: \"A X is\" or \"An X is\"\n if (/^an?\\s+\\w+\\s+is\\s/i.test(trimmed) && currentEntity.length > 0) {\n // Flush previous entity\n result.push(currentEntity.join('\\n').trim());\n currentEntity = [line];\n } else {\n currentEntity.push(line);\n }\n }\n\n // Flush last entity\n if (currentEntity.length > 0) {\n result.push(currentEntity.join('\\n').trim());\n }\n }\n\n return result.filter(s => s);\n}\n\n/**\n * Split page content by \"[Name] at /\" patterns\n */\nfunction splitPagesByPattern(items: string[]): string[] {\n const result: string[] = [];\n\n for (const item of items) {\n const lines = item.split('\\n');\n let currentPage: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n // Check for page definition start: \"[Name] at /path\" or \"[Name]Page at /path\"\n if (/^\\w+(?:page)?\\s+at\\s+\\//i.test(trimmed) && currentPage.length > 0) {\n // Flush previous page\n result.push(currentPage.join('\\n').trim());\n currentPage = [line];\n } else {\n currentPage.push(line);\n }\n }\n\n // Flush last page\n if (currentPage.length > 0) {\n result.push(currentPage.join('\\n').trim());\n }\n }\n\n return result.filter(s => s);\n}\n\n/**\n * Split behavior content by \"[Name] behavior:\" patterns\n */\nfunction splitBehaviorsByPattern(items: string[]): string[] {\n const result: string[] = [];\n\n for (const item of items) {\n const lines = item.split('\\n');\n let currentBehavior: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n // Check for behavior definition start: \"[Name] behavior:\" or \"Every X\"\n if ((/^\\w+\\s+behavior:?$/i.test(trimmed) || /^every\\s+/i.test(trimmed)) && currentBehavior.length > 0) {\n // Flush previous behavior\n result.push(currentBehavior.join('\\n').trim());\n currentBehavior = [line];\n } else {\n currentBehavior.push(line);\n }\n }\n\n // Flush last behavior\n if (currentBehavior.length > 0) {\n result.push(currentBehavior.join('\\n').trim());\n }\n }\n\n return result.filter(s => s);\n}\n\n/**\n * Auto-detect sections when no headers are present\n */\nfunction autoDetectSections(text: string): { entities: string[]; pages: string[]; behaviors: string[] } {\n const result = {\n entities: [] as string[],\n pages: [] as string[],\n behaviors: [] as string[],\n };\n\n // Split by --- separator\n const sections = text.split(/\\n---\\n/).map((s) => s.trim()).filter((s) => s);\n\n for (const section of sections) {\n const firstLine = section.split('\\n')[0].toLowerCase();\n\n // Entity: starts with \"A\" or \"An\"\n if (firstLine.match(/^an?\\s+\\w+\\s+is/)) {\n result.entities.push(section);\n }\n // Page: starts with \"The\"\n else if (firstLine.match(/^the\\s+\\w+.*shows/)) {\n result.pages.push(section);\n }\n // Tick: starts with \"Every\"\n else if (firstLine.match(/^every\\s+/)) {\n result.behaviors.push(section);\n }\n // Behavior: Has \"States:\" or \"Transitions:\"\n else if (section.toLowerCase().includes('states:') ||\n section.toLowerCase().includes('transitions:')) {\n result.behaviors.push(section);\n }\n // Default: try to detect based on content\n else if (section.toLowerCase().includes('it has:')) {\n result.entities.push(section);\n }\n else if (section.toLowerCase().includes('it displays:')) {\n result.pages.push(section);\n }\n else {\n // Unknown section - try as entity\n result.entities.push(section);\n }\n }\n\n return result;\n}\n\n/**\n * Parse a tick from domain text\n */\nfunction parseTickFromDomain(text: string): Record<string, unknown> | null {\n const lines = text.trim().split('\\n');\n if (lines.length === 0) return null;\n\n const firstLine = lines[0].trim();\n\n // Parse \"Every [interval]:\"\n const intervalMatch = firstLine.match(/^every\\s+(.+?):?$/i);\n if (!intervalMatch) return null;\n\n const intervalStr = intervalMatch[1];\n const intervalMs = parseIntervalToMs(intervalStr);\n\n // Convert interval to PascalCase name\n const tickName = intervalStr\n .split(/\\s+/)\n .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())\n .join('');\n\n const tick: Record<string, unknown> = {\n name: tickName,\n interval: intervalMs,\n effects: [] as Array<unknown[]>, // S-Expression arrays\n };\n\n // Parse remaining lines for guard and effects\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i].trim();\n\n if (line.toLowerCase().startsWith('if ')) {\n tick.guard = line.slice(3).trim();\n } else if (line.startsWith('-')) {\n const effectText = line.slice(1).trim();\n const effect = parseEffectFromText(effectText);\n if (effect) {\n (tick.effects as Array<unknown[]>).push(effect);\n }\n }\n }\n\n return tick;\n}\n\n/**\n * Parse an interval string to milliseconds\n */\nfunction parseIntervalToMs(text: string): number {\n const lower = text.toLowerCase();\n\n const match = lower.match(/(\\d+)\\s*(second|minute|hour|day|week)s?/);\n if (match) {\n const value = parseInt(match[1], 10);\n const unit = match[2];\n\n switch (unit) {\n case 'second': return value * 1000;\n case 'minute': return value * 60 * 1000;\n case 'hour': return value * 60 * 60 * 1000;\n case 'day': return value * 24 * 60 * 60 * 1000;\n case 'week': return value * 7 * 24 * 60 * 60 * 1000;\n }\n }\n\n // Default to 1 hour\n return 60 * 60 * 1000;\n}\n\n/**\n * Parse an effect from text description to S-Expression format.\n * Delegates to the existing parseDomainEffect function from sexpr-parser.\n */\nfunction parseEffectFromText(text: string): unknown[] | null {\n try {\n const result = parseDomainEffect(text);\n // parseDomainEffect returns SExpr which can be a primitive or array\n // We only want arrays for effects\n if (Array.isArray(result)) {\n return result;\n }\n // If it returned a primitive, wrap in array or return null\n return null;\n } catch {\n return null;\n }\n}\n\n","/**\n * Finish Task Tool\n *\n * Signals the agent has completed the workflow. Automatically combines\n * orbitals and validates the result.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport * as path from 'path';\nimport * as fs from 'fs/promises';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport type { FullOrbitalUnit } from '@almadar/core/types';\nimport { combineOrbitals } from '../orbitals/combiner/index.js';\nimport { convertDomainToSchema } from '../orbitals/domain-language/index.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Auto-collect orbitals from the .orbitals/ directory in the workspace.\n */\nasync function collectOrbitalsFromDir(workDir: string): Promise<FullOrbitalUnit[]> {\n const orbitalsDir = path.join(workDir, '.orbitals');\n\n try {\n const dirStat = await fs.stat(orbitalsDir);\n if (!dirStat.isDirectory()) {\n return [];\n }\n } catch {\n return [];\n }\n\n const files = await fs.readdir(orbitalsDir);\n const jsonFiles = files.filter((f) => f.endsWith('.json'));\n\n if (jsonFiles.length === 0) {\n return [];\n }\n\n const orbitals: FullOrbitalUnit[] = [];\n for (const file of jsonFiles) {\n try {\n const content = await fs.readFile(path.join(orbitalsDir, file), 'utf-8');\n orbitals.push(JSON.parse(content));\n } catch {\n // Skip invalid files\n }\n }\n\n return orbitals;\n}\n\n/**\n * Validate schema using orbital CLI.\n */\nasync function validateSchemaWithCLI(schemaPath: string): Promise<{\n valid: boolean;\n errors: Array<{ code: string; path: string; message: string; suggestion?: string }>;\n warnings: Array<{ code: string; path: string; message: string }>;\n stats?: { orbitals: number; entities: number; traits: number; pages: number };\n}> {\n try {\n const { stdout } = await execAsync(\n `orbital validate \"${schemaPath}\" --json`,\n { timeout: 30000 },\n );\n const result = JSON.parse(stdout);\n return {\n valid: result.valid,\n errors: result.errors || [],\n warnings: result.warnings || [],\n stats: result.stats,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n return {\n valid: false,\n errors: [{ code: 'CLI_ERROR', path: '', message: `Validation CLI error: ${errorMessage}` }],\n warnings: [],\n };\n }\n}\n\n/**\n * Create a finish_task tool that signals the agent has completed the workflow.\n *\n * Automatically combines orbitals from:\n * 1. .orbitals/ directory (for kflow-orbitals skill)\n * 2. domain.txt (for lean skills) - converted to schema via convertDomainToSchema\n */\nexport function createFinishTaskTool(workDir: string | undefined) {\n return tool(\n async (input) => {\n let combinedSchema = null;\n let stats = null;\n let validationResult: {\n valid: boolean;\n errors: Array<{ code: string; path: string; message: string }>;\n warnings: Array<{ code: string; path: string; message: string }>;\n } | null = null;\n let source: 'orbitals' | 'domain' | null = null;\n\n if (workDir) {\n // Strategy 1: Try .orbitals/ directory\n const orbitals = await collectOrbitalsFromDir(workDir);\n\n if (orbitals.length > 0) {\n source = 'orbitals';\n const appName =\n input.summary?.match(/Generated \\d+ orbitals?:?\\s*(.+)/)?.[1] ||\n orbitals[0]?.name ||\n 'Application';\n\n const result = combineOrbitals(orbitals, {\n name: appName,\n validate: false,\n });\n\n if (result.success && result.schema) {\n combinedSchema = result.schema;\n stats = result.stats;\n }\n } else {\n // Strategy 2: Try domain.txt\n const domainPath = path.join(workDir, 'domain.txt');\n try {\n const domainText = await fs.readFile(domainPath, 'utf-8');\n if (domainText.trim()) {\n source = 'domain';\n const appName =\n input.summary?.match(/Generated \\d+ orbitals?:?\\s*(.+)/)?.[1] ||\n 'Application';\n\n const domainResult = convertDomainToSchema(domainText, {\n name: appName,\n orbitals: [],\n });\n\n if (domainResult.success && domainResult.schema) {\n combinedSchema = domainResult.schema;\n const traitCount = (domainResult.schema.orbitals || []).reduce(\n (count, o) => count + ('traits' in o ? (o as { traits?: unknown[] }).traits?.length || 0 : 0),\n 0,\n );\n stats = {\n totalOrbitals: domainResult.schema.orbitals?.length || 0,\n totalEntities: domainResult.schema.orbitals?.length || 0,\n totalTraits: traitCount,\n totalPages:\n domainResult.schema.orbitals?.reduce(\n (sum, o) => sum + ('pages' in o ? (o as { pages?: unknown[] }).pages?.length || 0 : 0),\n 0,\n ) || 0,\n };\n }\n }\n } catch {\n // No domain.txt found\n }\n }\n\n // Write combined schema if we got one\n if (combinedSchema) {\n const schemaPath = path.join(workDir, 'schema.json');\n await fs.writeFile(schemaPath, JSON.stringify(combinedSchema, null, 2));\n validationResult = await validateSchemaWithCLI(schemaPath);\n }\n }\n\n return {\n success: true,\n status: 'TASK_COMPLETE',\n message: '✅ Task completed successfully. STOP HERE - do not make any more tool calls.',\n summary: input.summary,\n autoCombined: combinedSchema ? true : false,\n source: source || undefined,\n stats: stats || undefined,\n validation: validationResult\n ? {\n valid: validationResult.valid,\n errorCount: validationResult.errors?.length || 0,\n warningCount: validationResult.warnings?.length || 0,\n }\n : undefined,\n schemaPath: combinedSchema\n ? path.join(workDir!, 'schema.json')\n : input.schemaPath,\n nextAction: 'NONE - Task is complete. Output a brief success message to the user.',\n };\n },\n {\n name: 'finish_task',\n description: `Signal that the orbital generation workflow is COMPLETE.\n\n⚠️ IMPORTANT: After calling this tool, STOP. Do not make any more tool calls.\n\nWHAT IT DOES:\n1. Automatically collects orbitals from .orbitals/ directory\n2. Combines them into a single OrbitalSchema\n3. Validates the combined schema\n4. Writes schema.json to workspace\n5. Returns success with stats`,\n schema: z.object({\n summary: z.string().describe('Brief summary of what was accomplished'),\n schemaPath: z.string().optional().describe('Path to the combined schema file if already written'),\n }),\n },\n );\n}\n","/**\n * Domain Orbital Tool\n *\n * Generates domain language orbitals incrementally using LLM.\n * Uses @almadar/llm for LLM access and @almadar/skills for prompt sections.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport crypto from 'crypto';\nimport { LLMClient } from '@almadar/llm';\nimport {\n getSExprQuickRef,\n getKeyBehaviorsReference,\n getCommonErrorsSection,\n getArchitectureSection,\n} from '@almadar/skills';\nimport type { SSEEventType } from '../api-types.js';\nimport { convertDomainToSchema } from '../orbitals/domain-language/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type DomainOrbitalEventCallback = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n }\n) => void;\n\nexport type DomainOrbitalCompleteCallback = (\n domainText: string,\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number\n) => void | Promise<void>;\n\nexport interface DomainOrbitalToolOptions {\n onEvent?: DomainOrbitalEventCallback;\n onOrbitalComplete?: DomainOrbitalCompleteCallback;\n workDir?: string;\n}\n\nexport interface DomainOrbitalSpec {\n name: string;\n entity: {\n name: string;\n persistence: 'persistent' | 'runtime' | 'singleton';\n fields: Array<{\n name: string;\n type: string;\n required?: boolean;\n default?: unknown;\n }>;\n relations?: Array<{\n entity: string;\n alias?: string;\n type: 'belongs_to' | 'has_many';\n }>;\n };\n pages: Array<{\n name: string;\n path: string;\n viewType: string;\n isInitial?: boolean;\n }>;\n traits: string[];\n patterns: string[];\n domainContext?: {\n request: string;\n requestFragment?: string;\n category: 'game' | 'business' | 'dashboard' | 'form' | 'content' | 'social';\n vocabulary?: Record<string, string>;\n };\n design?: {\n style?: 'minimal' | 'modern' | 'playful' | 'data-driven' | 'immersive';\n uxHints?: {\n flowPattern?: 'hub-spoke' | 'master-detail' | 'crud-cycle' | 'linear' | 'role-based';\n listPattern?: 'entity-table' | 'entity-cards' | 'entity-list';\n formPattern?: 'modal' | 'drawer' | 'page';\n detailPattern?: 'drawer' | 'page' | 'split';\n };\n };\n emits?: string[];\n listens?: Array<{\n event: string;\n triggers: string;\n }>;\n}\n\n// ============================================================================\n// Cache\n// ============================================================================\n\ninterface CacheEntry {\n domainText: string;\n timestamp: number;\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n}\n\nconst domainOrbitalCache = new Map<string, CacheEntry>();\nconst CACHE_TTL_MS = 24 * 60 * 60 * 1000;\nconst CACHE_VERSION = 5;\n\nfunction generateFingerprint(spec: DomainOrbitalSpec): string {\n const normalized = JSON.stringify({\n version: CACHE_VERSION,\n entity: spec.entity,\n pages: spec.pages,\n traits: spec.traits.sort(),\n patterns: spec.patterns.sort(),\n emits: spec.emits?.sort() || [],\n listens: spec.listens?.map(l => `${l.event}:${l.triggers}`).sort() || [],\n });\n return crypto.createHash('sha256').update(normalized).digest('hex').slice(0, 16);\n}\n\nfunction getCached(fingerprint: string): CacheEntry | null {\n const entry = domainOrbitalCache.get(fingerprint);\n if (!entry) return null;\n if (Date.now() - entry.timestamp > CACHE_TTL_MS) {\n domainOrbitalCache.delete(fingerprint);\n return null;\n }\n return entry;\n}\n\nfunction setCache(fingerprint: string, entry: CacheEntry): void {\n domainOrbitalCache.set(fingerprint, entry);\n}\n\n// ============================================================================\n// File-based domain accumulation\n// ============================================================================\n\nfunction appendToDomainFile(workDir: string, domainText: string, _orbitalName: string): void {\n const domainPath = path.join(workDir, 'domain.txt');\n const separator = `\\n\\n---\\n`;\n let existingContent = '';\n if (fs.existsSync(domainPath)) {\n existingContent = fs.readFileSync(domainPath, 'utf-8');\n }\n const newContent = existingContent + separator + domainText;\n fs.writeFileSync(domainPath, newContent, 'utf-8');\n}\n\nfunction readDomainFile(workDir: string): string | null {\n const domainPath = path.join(workDir, 'domain.txt');\n if (!fs.existsSync(domainPath)) {\n return null;\n }\n return fs.readFileSync(domainPath, 'utf-8');\n}\n\n// ============================================================================\n// LLM Generation Prompt (uses @almadar/skills)\n// ============================================================================\n\nfunction buildStaticSystemPrompt(): string {\n const behaviorsRef = getKeyBehaviorsReference();\n const sExprRef = getSExprQuickRef();\n const errorsRef = getCommonErrorsSection();\n const architectureRef = getArchitectureSection();\n\n return `You are a domain language expert. Generate clean, complete domain language for OrbitalSchema applications.\n\n${behaviorsRef}\n\n---\n\n${sExprRef}\n\n---\n\n${architectureRef}\n\n---\n\n${errorsRef}\n\n---\n\n## Output Requirements\n\nGenerate ONLY the domain language text with these EXACT formats:\n\n### Entity Format (CRITICAL)\n\\`\\`\\`\n# Entities\n\nA [EntityName] is a [persistent|runtime|singleton] entity that:\n - has [fieldName] as [type] (required)\n - has [fieldName] as [type] with default [value]\n - belongs to [RelatedEntity]\n - has many [RelatedEntity]s\n\\`\\`\\`\n\n### Page Format (CRITICAL)\n\\`\\`\\`\n# Pages\n\n[PageName] at /[path]:\n - shows [Entity] using [TraitName]\n - view type: list\n - is initial page\n\\`\\`\\`\n\n### Behavior Format (CRITICAL)\n\\`\\`\\`\n# Behaviors\n\n[TraitName] behavior:\n Entity: [EntityName]\n States: [State1], [State2], ...\n Initial: [State1]\n\n Transitions:\n - From [State1] to [State2] on [EVENT]\n then [S-Expression effect]\n\\`\\`\\`\n\n**CRITICAL RULES:**\n1. Entities MUST start with \"A\" or \"An\"\n2. Behaviors MUST have \"Entity: [EntityName]\" line after the behavior name\n3. Pages MUST use \"shows [Entity] using [TraitName]\" format\n\nGenerate ONLY the domain language text, no explanations or markdown code blocks.`;\n}\n\nfunction buildDynamicUserPrompt(spec: DomainOrbitalSpec): string {\n const entityFields = spec.entity.fields\n .map(f => {\n let fieldDef = ` - ${f.name}: ${f.type}`;\n if (f.required) fieldDef += ', required';\n if (f.default !== undefined) fieldDef += `, default ${JSON.stringify(f.default)}`;\n return fieldDef;\n })\n .join('\\n');\n\n const relations = spec.entity.relations\n ?.map(r => {\n if (r.type === 'belongs_to') {\n return r.alias\n ? ` - belongs to ${r.entity} as ${r.alias}`\n : ` - belongs to ${r.entity}`;\n }\n return ` - has many ${r.entity}s`;\n })\n .join('\\n') || '';\n\n const pagesInfo = spec.pages\n .map(p => `- ${p.name} at ${p.path} (${p.viewType}${p.isInitial ? ', initial' : ''})`)\n .join('\\n');\n\n const emitsInfo = spec.emits?.length\n ? `**Emits Events**: ${spec.emits.join(', ')}`\n : '';\n const listensInfo = spec.listens?.length\n ? `**Listens**: ${spec.listens.map(l => `${l.event} → ${l.triggers}`).join(', ')}`\n : '';\n\n return `Generate domain language for the following orbital.\n\n## Orbital Specification\n\n**Entity**: ${spec.entity.name} (${spec.entity.persistence})\n**Fields**:\n${entityFields}\n${relations ? `**Relations**:\\n${relations}` : ''}\n\n**Pages**:\n${pagesInfo}\n\n**Behaviors**: ${spec.traits.join(', ')}\n**UI Patterns**: ${spec.patterns.join(', ')}\n${emitsInfo}\n${listensInfo}\n\nReplace [Entity] placeholders with \"${spec.entity.name}\" in all patterns.`;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst GenerateOrbitalDomainSchema = z.object({\n sessionId: z.string().describe('Unique session ID for this generation batch'),\n orbital: z.object({\n name: z.string(),\n entity: z.object({\n name: z.string(),\n persistence: z.enum(['persistent', 'runtime', 'singleton']),\n fields: z.array(z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean().optional(),\n default: z.any().optional(),\n })),\n relations: z.array(z.object({\n entity: z.string(),\n alias: z.string().optional(),\n type: z.enum(['belongs_to', 'has_many']),\n })).optional(),\n }),\n pages: z.array(z.object({\n name: z.string(),\n path: z.string(),\n viewType: z.string(),\n isInitial: z.boolean().optional(),\n })),\n traits: z.array(z.string()),\n patterns: z.array(z.string()),\n domainContext: z.object({\n request: z.string(),\n requestFragment: z.string().optional(),\n category: z.enum(['game', 'business', 'dashboard', 'form', 'content', 'social']),\n vocabulary: z.record(z.string(), z.string()).optional(),\n }).optional(),\n design: z.object({\n style: z.enum(['minimal', 'modern', 'playful', 'data-driven', 'immersive']).optional(),\n uxHints: z.object({\n flowPattern: z.enum(['hub-spoke', 'master-detail', 'crud-cycle', 'linear', 'role-based']).optional(),\n listPattern: z.enum(['entity-table', 'entity-cards', 'entity-list']).optional(),\n formPattern: z.enum(['modal', 'drawer', 'page']).optional(),\n detailPattern: z.enum(['drawer', 'page', 'split']).optional(),\n }).optional(),\n }).optional(),\n emits: z.array(z.string()).optional(),\n listens: z.array(z.object({\n event: z.string(),\n triggers: z.string(),\n })).optional(),\n }).describe('The orbital specification'),\n orbitalIndex: z.number().describe('Index in the batch (0-based)'),\n totalOrbitals: z.number().describe('Total orbitals in the batch'),\n});\n\nconst ConstructCombinedDomainSchema = z.object({\n appName: z.string().describe('Name of the application'),\n});\n\n// ============================================================================\n// Tool Factories\n// ============================================================================\n\n/**\n * Create the generate_orbital_domain tool.\n * Uses @almadar/llm LLMClient directly for Anthropic calls.\n */\nexport function createGenerateOrbitalDomainTool(\n \n options: DomainOrbitalToolOptions = {},\n) {\n let eventCallback: DomainOrbitalEventCallback | undefined = options.onEvent;\n let completeCallback: DomainOrbitalCompleteCallback | undefined = options.onOrbitalComplete;\n const workDir = options.workDir || process.cwd();\n\n const STATIC_SYSTEM_PROMPT = buildStaticSystemPrompt();\n\n const setEventCallback = (callback: DomainOrbitalEventCallback) => {\n eventCallback = callback;\n };\n\n const setCompleteCallback = (callback: DomainOrbitalCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback(orbitalName, orbitalIndex, totalOrbitals, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const generateOrbitalDomainTool = tool(\n async ({ sessionId, orbital, orbitalIndex, totalOrbitals }) => {\n const spec = orbital as DomainOrbitalSpec;\n const fingerprint = generateFingerprint(spec);\n\n try {\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generating domain orbital: ${spec.name} (${orbitalIndex + 1}/${totalOrbitals})`,\n role: 'assistant',\n isComplete: false,\n });\n\n // Check cache\n const cached = getCached(fingerprint);\n if (cached) {\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Cache HIT for ${spec.name}`,\n data: { fingerprint, cachedAt: new Date(cached.timestamp).toISOString() },\n orbitalName: spec.name,\n });\n\n appendToDomainFile(workDir, cached.domainText, spec.name);\n\n if (completeCallback) {\n await completeCallback(cached.domainText, spec.name, orbitalIndex, totalOrbitals);\n }\n\n return JSON.stringify({\n success: true,\n orbitalName: spec.name,\n fingerprint,\n cached: true,\n domainWritten: true,\n usage: cached.usage,\n });\n }\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Cache MISS for ${spec.name}, generating with LLM`,\n data: { fingerprint },\n orbitalName: spec.name,\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n temperature: 0,\n });\n\n const userPrompt = buildDynamicUserPrompt(spec);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'tool_call', {\n tool: 'llm_generate_domain',\n args: {\n orbital: spec.name,\n entity: spec.entity.name,\n traits: spec.traits,\n },\n });\n\n const response = await client.callWithCache<string>({\n systemPrompt: '',\n systemBlocks: [{\n type: 'text',\n text: STATIC_SYSTEM_PROMPT,\n cache_control: { type: 'ephemeral' },\n }],\n userPrompt,\n maxTokens: 8192,\n rawText: true,\n });\n\n const domainText = (response.raw || String(response.data) || '').trim();\n\n const usage = {\n inputTokens: response.usage?.promptTokens || 0,\n outputTokens: response.usage?.completionTokens || 0,\n totalTokens: response.usage?.totalTokens || 0,\n };\n\n setCache(fingerprint, {\n domainText,\n timestamp: Date.now(),\n usage,\n });\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'llm_generate_domain',\n result: { fingerprint, textLength: domainText.length, usage },\n success: true,\n });\n\n appendToDomainFile(workDir, domainText, spec.name);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generated domain for ${spec.name} (${usage.totalTokens} tokens) - written to domain.txt`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback) {\n try {\n await completeCallback(domainText, spec.name, orbitalIndex, totalOrbitals);\n } catch (error) {\n console.error(`[DomainOrbitalTool] Callback error for ${spec.name}:`, error);\n }\n }\n\n return JSON.stringify({\n success: true,\n orbitalName: spec.name,\n fingerprint,\n cached: false,\n domainWritten: true,\n usage,\n domainText,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(spec.name, orbitalIndex, totalOrbitals, 'error', {\n error: errorMessage,\n code: 'DOMAIN_ORBITAL_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbitalName: spec.name,\n });\n }\n },\n {\n name: 'generate_orbital_domain',\n description: `Generate domain language for a single orbital using LLM.\n\nTakes a lightweight orbital specification and generates complete domain language text.\nResults are cached by fingerprint to avoid regenerating identical orbitals.\n\nUSAGE:\n1. Decompose app into orbital specs\n2. For each orbital, call generate_orbital_domain\n3. After all orbitals, call construct_combined_domain`,\n schema: GenerateOrbitalDomainSchema,\n }\n );\n\n return {\n tool: generateOrbitalDomainTool,\n setEventCallback,\n setCompleteCallback,\n };\n}\n\n/**\n * Create the construct_combined_domain tool.\n */\nexport function createConstructCombinedDomainTool(\n \n options: { onEvent?: DomainOrbitalEventCallback; workDir?: string } = {},\n) {\n let eventCallback = options.onEvent;\n const workDir = options.workDir || process.cwd();\n\n const setEventCallback = (callback: DomainOrbitalEventCallback) => {\n eventCallback = callback;\n };\n\n const emitEvent = (\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback('combined', 0, 1, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const constructCombinedDomainTool = tool(\n async ({ appName }) => {\n try {\n const domainText = readDomainFile(workDir);\n if (!domainText) {\n return JSON.stringify({\n success: false,\n error: 'No domain.txt found. Call generate_orbital_domain first.',\n });\n }\n\n emitEvent('message', {\n content: `Converting domain.txt to OrbitalSchema for ${appName}`,\n role: 'assistant',\n isComplete: false,\n });\n\n const schemaResult = convertDomainToSchema(domainText, {\n name: appName,\n orbitals: [],\n });\n\n if (!schemaResult.success) {\n const errorMessages = schemaResult.errors?.map(e => e.message).join('; ') || 'Unknown conversion error';\n\n emitEvent('error', {\n error: errorMessages,\n code: 'DOMAIN_CONVERSION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessages,\n domainText,\n });\n }\n\n emitEvent('message', {\n content: `Successfully converted domain.txt to OrbitalSchema for ${appName}`,\n role: 'assistant',\n isComplete: true,\n });\n\n const traitCount = (schemaResult.schema?.orbitals || []).reduce((count, o) => {\n if (typeof o === 'object' && o !== null && 'traits' in o) {\n return count + ((o as { traits?: unknown[] }).traits?.length || 0);\n }\n return count;\n }, 0);\n\n return JSON.stringify({\n success: true,\n appName,\n domainText,\n schema: schemaResult.schema,\n stats: {\n orbitalCount: schemaResult.schema?.orbitals?.length || 0,\n traitCount,\n },\n domainPath: path.join(workDir, 'domain.txt'),\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent('error', {\n error: errorMessage,\n code: 'CONSTRUCT_COMBINED_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n });\n }\n },\n {\n name: 'construct_combined_domain',\n description: `Convert accumulated domain.txt to OrbitalSchema.\n\nCall this after all orbitals have been generated via generate_orbital_domain.`,\n schema: ConstructCombinedDomainSchema,\n }\n );\n\n return {\n tool: constructCombinedDomainTool,\n setEventCallback,\n };\n}\n\n/**\n * Create both domain orbital tools together.\n */\nexport function createDomainOrbitalTools(\n options: DomainOrbitalToolOptions = {},\n) {\n const generateTool = createGenerateOrbitalDomainTool(options);\n const constructTool = createConstructCombinedDomainTool({\n onEvent: options.onEvent,\n workDir: options.workDir,\n });\n\n return {\n generateOrbitalDomain: generateTool.tool,\n constructCombinedDomain: constructTool.tool,\n setEventCallback: (callback: DomainOrbitalEventCallback) => {\n generateTool.setEventCallback(callback);\n constructTool.setEventCallback(callback);\n },\n setCompleteCallback: generateTool.setCompleteCallback,\n };\n}\n","/**\n * Orbital Generator\n *\n * Provides utilities for generating FullOrbitalUnit definitions from\n * lightweight OrbitalUnit inputs. Designed for SUBAGENT use where each\n * orbital is generated separately for better caching.\n *\n * ## Subagent Caching Pattern\n *\n * When generating multiple orbitals in a subagent pattern:\n * 1. Main agent decomposes request → OrbitalUnit[]\n * 2. For each orbital, subagent calls generateFullOrbital()\n * 3. Each subagent call uses the SAME cached system prompt blocks\n * 4. Anthropic caches at request level → subsequent calls get 90% discount\n *\n * This is MORE efficient than batch generation because:\n * - System prompt is cached and reused across subagent calls\n * - Template guidance is cached per fingerprint\n * - Only the orbital-specific content varies\n *\n * @packageDocumentation\n */\n\nimport type { LLMClient, LLMProvider } from '@almadar/llm';\nimport { assembleCacheableOrbitalPrompt, assembleOrbitalPrompt } from '../cache/index.js';\nimport { getOrbitalDecompositionPrompt, getFullOrbitalPrompt, getRequirementsDecomposePrompt, getRequirementsTraitPrompt } from '@almadar/skills';\nimport type { OrbitalDefinition, FullOrbitalUnit, EntityRef } from '@almadar/core/types';\nimport { isEntityReference } from '@almadar/core/types';\n// DEPRECATED: Validation removed - use orbital-rust validator instead\n// import { validateFullOrbitalUnit } from '../../validation/index.js';\n\n/**\n * Get entity name safely from EntityRef\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n// ============================================================================\n// Requirements Types (imported structure from analysis)\n// ============================================================================\n\n/**\n * Extracted requirements from the analysis phase.\n * Matches ExtractedRequirements from agents/orchestrator/shared/requirements.ts\n */\nexport interface ExtractedRequirements {\n /** Entity names to create */\n entities: string[];\n /** State names that should exist */\n states: string[];\n /** Event/action names */\n events: string[];\n /** Business rules (become guards) */\n guards: string[];\n /** Page types needed */\n pages: string[];\n /** Notifications/side-effects */\n effects: string[];\n /** Raw requirement statements */\n rawRequirements: string[];\n}\n\n// Type alias - OrbitalUnit in generator context is always a full definition\ntype OrbitalUnit = OrbitalDefinition;\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * A structured log entry from the generation process.\n * Used for debugging and observability of subagent reasoning.\n */\nexport interface GenerationLog {\n /** Timestamp of the log entry */\n timestamp: number;\n /** Log level */\n level: 'info' | 'warn' | 'error' | 'debug';\n /** Log message */\n message: string;\n /** Optional structured data */\n data?: Record<string, unknown>;\n}\n\nexport interface OrbitalGenerationOptions {\n /** Maximum tokens for generation */\n maxTokens?: number;\n /** Enable validation after generation */\n validate?: boolean;\n /** Callback for real-time log streaming (SSE integration) */\n onLog?: (log: GenerationLog, orbitalName?: string) => void;\n /** Optional requirements relevant to this orbital (from analysis) */\n requirements?: Partial<ExtractedRequirements>;\n}\n\nexport interface OrbitalGenerationResult {\n /** Generated full orbital unit */\n orbital: FullOrbitalUnit;\n /** Fingerprint used for caching */\n fingerprint: string;\n /** Whether template guidance was used */\n usedTemplate: boolean;\n /** Token usage */\n usage?: {\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n };\n /** Validation result */\n validation?: {\n valid: boolean;\n errorCount: number;\n warningCount: number;\n };\n /** Structured logs from the generation process */\n logs: GenerationLog[];\n}\n\n// ============================================================================\n// Provider Concurrency Limits\n// ============================================================================\n\n/**\n * Default concurrency limits per LLM provider.\n * These are conservative defaults to avoid rate limiting.\n */\nexport const PROVIDER_CONCURRENCY_LIMITS: Record<LLMProvider, number> = {\n anthropic: 3,\n openai: 5,\n deepseek: 3,\n kimi: 3,\n};\n\nexport interface ParallelGenerationOptions extends OrbitalGenerationOptions {\n /** Maximum concurrent generations (default: provider-specific) */\n concurrency?: number;\n}\n\nexport interface ParallelGenerationResult {\n /** Results for each orbital (same order as input) */\n results: OrbitalGenerationResult[];\n /** Total duration in milliseconds */\n totalDurationMs: number;\n /** Aggregate logs from all generations */\n aggregateLogs: GenerationLog[];\n /** Summary statistics */\n summary: {\n total: number;\n successful: number;\n failed: number;\n totalTokens: number;\n };\n}\n\n// ============================================================================\n// Logging Utility\n// ============================================================================\n\nfunction createLog(level: GenerationLog['level'], message: string, data?: Record<string, unknown>): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message,\n data,\n };\n}\n\n// ============================================================================\n// Single Orbital Generation (For Subagent Use)\n// ============================================================================\n\n/**\n * Generate a full orbital unit from a lightweight orbital input.\n *\n * DESIGNED FOR SUBAGENT USE: Call this once per orbital in separate\n * subagent invocations. Caching works across calls because:\n * - System prompt blocks are marked as cacheable\n * - Anthropic caches at the request level\n * - Subsequent calls with same system prompt get cache hits\n *\n * @example\n * ```typescript\n * // In subagent for each orbital:\n * const result = await generateFullOrbital(client, orbitalUnit, { validate: true });\n * // First call: Cache WRITE: 3500 tokens\n * // Second call: Cache HIT: 3500 tokens (90% discount!)\n * ```\n */\nexport async function generateFullOrbital(\n client: LLMClient,\n orbital: OrbitalUnit,\n options: OrbitalGenerationOptions = {}\n): Promise<OrbitalGenerationResult> {\n const {\n maxTokens = 8192,\n validate = true,\n requirements,\n } = options;\n\n const logs: GenerationLog[] = [];\n const startTime = Date.now();\n\n logs.push(createLog('info', `Starting generation for orbital: ${orbital.name}`, {\n entityName: getEntityName(orbital.entity),\n traitCount: orbital.traits.length,\n hasRequirements: !!requirements,\n }));\n\n // Use requirements-aware prompt if requirements provided\n const systemPrompt = requirements\n ? getRequirementsAwareFullOrbitalPrompt(requirements)\n : getFullOrbitalPrompt();\n\n // Check if using Anthropic for cache support\n const useCache = client.getProvider() === 'anthropic';\n\n let result;\n let fingerprint: string;\n let usedTemplate = false;\n\n if (useCache) {\n // Use cache-aware call - this is where the magic happens\n const cacheablePrompt = assembleCacheableOrbitalPrompt(orbital, systemPrompt);\n fingerprint = cacheablePrompt.fingerprint;\n usedTemplate = cacheablePrompt.usedCachedTemplate;\n\n logs.push(createLog('info', `Using Anthropic caching`, { fingerprint, usedTemplate }));\n console.log(`[OrbitalGenerator] Using Anthropic caching (fingerprint: ${fingerprint})`);\n\n result = await client.callWithCache({\n systemBlocks: cacheablePrompt.systemBlocks,\n userBlocks: cacheablePrompt.userBlocks,\n systemPrompt: '', // Overridden by blocks\n userPrompt: '', // Overridden by blocks\n maxTokens,\n skipSchemaValidation: true, // Parse JSON only\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: result.usage?.promptTokens,\n completionTokens: result.usage?.completionTokens,\n }));\n } else {\n // Standard call for non-Anthropic providers\n const assembledPrompt = assembleOrbitalPrompt(orbital, systemPrompt);\n fingerprint = assembledPrompt.fingerprint;\n usedTemplate = assembledPrompt.usedCachedTemplate;\n\n logs.push(createLog('info', `Using standard generation (${client.getProvider()})`, { fingerprint, usedTemplate }));\n\n const userPrompt = `Generate a complete FullOrbitalUnit for this orbital:\n\n${JSON.stringify(orbital, null, 2)}\n\nReturn valid JSON matching the FullOrbitalUnit schema.`;\n\n result = await client.callWithMetadata({\n systemPrompt: assembledPrompt.prompt,\n userPrompt,\n maxTokens,\n skipSchemaValidation: true,\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: result.usage?.promptTokens,\n completionTokens: result.usage?.completionTokens,\n }));\n }\n\n const generatedOrbital = result.data as OrbitalDefinition;\n\n // Validate if requested\n let validation;\n if (validate) {\n // Use direct per-unit validation\n // DEPRECATED: Validation removed - use orbital-rust validator instead\n // const validationResult = validateFullOrbitalUnit(generatedOrbital);\n const validationResult: any = { valid: true, errors: [], warnings: [] };\n validation = {\n valid: validationResult.valid,\n errorCount: validationResult.errors.length,\n warningCount: (validationResult.warnings || []).length,\n };\n\n if (validationResult.valid) {\n logs.push(createLog('info', `Validation passed`));\n } else {\n logs.push(createLog('warn', `Validation failed`, {\n errorCount: validationResult.errors.length,\n warningCount: (validationResult.warnings || []).length,\n errors: validationResult.errors.slice(0, 3).map((e: any) => e.message || e),\n }));\n }\n }\n\n const durationMs = Date.now() - startTime;\n logs.push(createLog('info', `Generation completed`, { durationMs }));\n\n return {\n orbital: generatedOrbital,\n fingerprint,\n usedTemplate,\n usage: result.usage ?? undefined,\n validation,\n logs,\n };\n}\n\n// ============================================================================\n// Parallel Orbital Generation\n// ============================================================================\n\n/**\n * Generate multiple orbitals in parallel with concurrency control.\n *\n * Uses provider-specific concurrency limits to avoid rate limiting.\n * All orbital units are independent, so parallel execution is safe.\n *\n * @example\n * ```typescript\n * // Generate all orbitals in parallel (max 3 concurrent for Anthropic)\n * const result = await generateFullOrbitalsParallel(client, orbitals, { validate: true });\n * console.log(`Generated ${result.summary.successful}/${result.summary.total} orbitals`);\n * ```\n */\nexport async function generateFullOrbitalsParallel(\n client: LLMClient,\n orbitals: OrbitalUnit[],\n options: ParallelGenerationOptions = {}\n): Promise<ParallelGenerationResult> {\n const provider = client.getProvider();\n const defaultConcurrency = PROVIDER_CONCURRENCY_LIMITS[provider] ?? 3;\n const concurrency = options.concurrency ?? defaultConcurrency;\n\n const aggregateLogs: GenerationLog[] = [];\n const startTime = Date.now();\n\n aggregateLogs.push(createLog('info', `Starting parallel generation`, {\n totalOrbitals: orbitals.length,\n concurrency,\n provider,\n }));\n\n console.log(`[OrbitalGenerator] Parallel generation: ${orbitals.length} orbitals, concurrency=${concurrency}`);\n\n // Simple concurrency limiter using a semaphore pattern\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n const acquire = (): Promise<void> => {\n return new Promise((resolve) => {\n if (activeCount < concurrency) {\n activeCount++;\n resolve();\n } else {\n queue.push(resolve);\n }\n });\n };\n\n const release = () => {\n activeCount--;\n const next = queue.shift();\n if (next) {\n activeCount++;\n next();\n }\n };\n\n // Generate all orbitals in parallel with concurrency control\n const results = await Promise.all(\n orbitals.map(async (orbital, index) => {\n await acquire();\n try {\n aggregateLogs.push(createLog('debug', `Starting orbital ${index + 1}/${orbitals.length}: ${orbital.name}`));\n const result = await generateFullOrbital(client, orbital, options);\n aggregateLogs.push(createLog('info', `Completed orbital ${index + 1}/${orbitals.length}: ${orbital.name}`, {\n valid: result.validation?.valid,\n tokens: result.usage?.totalTokens,\n }));\n return result;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n aggregateLogs.push(createLog('error', `Failed orbital ${index + 1}/${orbitals.length}: ${orbital.name}`, {\n error: errorMessage,\n }));\n // Return a failed result instead of throwing\n return {\n orbital: null as unknown as FullOrbitalUnit,\n fingerprint: '',\n usedTemplate: false,\n logs: [createLog('error', errorMessage)],\n validation: { valid: false, errorCount: 1, warningCount: 0 },\n } as OrbitalGenerationResult;\n } finally {\n release();\n }\n })\n );\n\n const totalDurationMs = Date.now() - startTime;\n const successful = results.filter(r => r.validation?.valid !== false && r.orbital !== null).length;\n const failed = results.length - successful;\n const totalTokens = results.reduce((sum, r) => sum + (r.usage?.totalTokens ?? 0), 0);\n\n aggregateLogs.push(createLog('info', `Parallel generation completed`, {\n totalDurationMs,\n successful,\n failed,\n totalTokens,\n }));\n\n console.log(`[OrbitalGenerator] Parallel generation complete: ${successful}/${results.length} successful in ${totalDurationMs}ms`);\n\n return {\n results,\n totalDurationMs,\n aggregateLogs,\n summary: {\n total: results.length,\n successful,\n failed,\n totalTokens,\n },\n };\n}\n\n// ============================================================================\n// Decomposition (For Main Agent Use)\n// ============================================================================\n\n/**\n * Options for decomposing requests into orbitals.\n */\nexport interface DecomposeOptions {\n /** Maximum tokens for generation */\n maxTokens?: number;\n /** Optional extracted requirements from analysis phase */\n requirements?: ExtractedRequirements;\n}\n\n/**\n * Decompose a user request into OrbitalUnits using LLM.\n *\n * This is typically called by the MAIN AGENT before delegating\n * to subagents for full orbital generation.\n *\n * @example\n * ```typescript\n * // Without requirements (existing behavior):\n * const orbitals = await decomposeToOrbitals(client, \"Build a task manager\");\n *\n * // With requirements (from analysis phase):\n * const orbitals = await decomposeToOrbitals(client, \"Build a task manager\", {\n * requirements: { entities: [\"Task\"], guards: [\"only admins can delete\"], ... }\n * });\n *\n * // Then generate all orbitals in parallel:\n * const result = await generateFullOrbitalsParallel(client, orbitals);\n * ```\n */\nexport async function decomposeToOrbitals(\n client: LLMClient,\n userRequest: string,\n options: DecomposeOptions = {}\n): Promise<OrbitalUnit[]> {\n const { maxTokens = 4096, requirements } = options;\n\n // Use requirements-aware prompt if requirements provided\n const systemPrompt = requirements\n ? getRequirementsAwareDecompositionPrompt(requirements)\n : getOrbitalDecompositionPrompt();\n\n const userPrompt = `Decompose this application request into Orbital Units:\n\n${userRequest}\n\nReturn a JSON array of OrbitalUnit objects.`;\n\n const result = await client.call({\n systemPrompt,\n userPrompt,\n maxTokens,\n skipSchemaValidation: true,\n });\n\n return result as OrbitalUnit[];\n}\n\n/**\n * Build a requirements-aware decomposition prompt.\n */\nfunction getRequirementsAwareDecompositionPrompt(requirements: ExtractedRequirements): string {\n const basePrompt = getOrbitalDecompositionPrompt();\n const requirementsGuidance = getRequirementsDecomposePrompt();\n\n const requirementsList = `\n## Extracted Requirements (Use These!)\n\n### Entities to Create\n${requirements.entities.length > 0 ? requirements.entities.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### States (Map to State Machines)\n${requirements.states.length > 0 ? requirements.states.map(s => `- ${s}`).join('\\n') : '- (none specified)'}\n\n### Events (Map to Transitions)\n${requirements.events.length > 0 ? requirements.events.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Guards (Map to Transition Guards)\n${requirements.guards.length > 0 ? requirements.guards.map(g => `- ${g}`).join('\\n') : '- (none specified)'}\n\n### Effects (Map to Transition Effects)\n${requirements.effects.length > 0 ? requirements.effects.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Pages (Map to Page Definitions)\n${requirements.pages.length > 0 ? requirements.pages.map(p => `- ${p}`).join('\\n') : '- (none specified)'}\n\nUse these requirements to:\n1. Create one OrbitalUnit per primary entity in the list\n2. Distribute guards to relevant orbitals\n3. Distribute effects to relevant orbitals\n4. Ensure state machines cover the required states\n`;\n\n return `${basePrompt}\n\n---\n\n${requirementsGuidance}\n\n---\n\n${requirementsList}`;\n}\n\n/**\n * Build a requirements-aware full orbital generation prompt.\n */\nfunction getRequirementsAwareFullOrbitalPrompt(requirements: Partial<ExtractedRequirements>): string {\n const basePrompt = getFullOrbitalPrompt();\n const requirementsGuidance = getRequirementsTraitPrompt();\n\n const sections: string[] = [];\n\n if (requirements.guards && requirements.guards.length > 0) {\n sections.push(`### Guards to Implement\n${requirements.guards.map(g => `- ${g}`).join('\\n')}\n\nConvert these to \\`guard\\` expressions on transitions with \\`guardError\\` messages.`);\n }\n\n if (requirements.effects && requirements.effects.length > 0) {\n sections.push(`### Effects to Implement\n${requirements.effects.map(e => `- ${e}`).join('\\n')}\n\nConvert these to \\`effects\\` arrays on transitions (emit_event or call_service).`);\n }\n\n if (requirements.states && requirements.states.length > 0) {\n sections.push(`### States to Include\n${requirements.states.map(s => `- ${s}`).join('\\n')}\n\nUse these exact states in the state machine. First is initial, identify final states.`);\n }\n\n if (requirements.events && requirements.events.length > 0) {\n sections.push(`### Events to Include\n${requirements.events.map(e => `- ${e}`).join('\\n')}\n\nUse these event names in transitions.`);\n }\n\n if (sections.length === 0) {\n return basePrompt;\n }\n\n return `${basePrompt}\n\n---\n\n${requirementsGuidance}\n\n---\n\n## Requirements for This Orbital\n\n${sections.join('\\n\\n')}\n`;\n}\n\n// ============================================================================\n// Cache Statistics\n// ============================================================================\n\n/**\n * Estimate cache savings for a set of orbitals.\n *\n * Use this to predict how much caching will help for a decomposition.\n */\nexport function estimateCacheSavings(orbitals: OrbitalUnit[]): {\n totalOrbitals: number;\n uniqueFingerprints: number;\n estimatedCacheHits: number;\n estimatedSavingsPercent: number;\n} {\n const { getCacheStats } = require('../cache/index.js');\n const stats = getCacheStats(orbitals);\n\n // Each call after the first with same fingerprint is a cache hit\n const cacheHits = stats.potentialCacheHits;\n const savingsPercent = orbitals.length > 0\n ? Math.round((cacheHits / orbitals.length) * 90) // 90% discount on cache hits\n : 0;\n\n return {\n totalOrbitals: stats.totalOrbitals,\n uniqueFingerprints: stats.uniqueFingerprints,\n estimatedCacheHits: cacheHits,\n estimatedSavingsPercent: savingsPercent,\n };\n}\n","/**\n * Orbital Subagent Tool\n *\n * Spawns nested DeepAgents for orbital generation and forwards\n * their events to the parent stream.\n * Uses @almadar/llm LLMClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isEntityReference } from '@almadar/core/types';\nimport { LLMClient } from '@almadar/llm';\nimport type { SSEEvent, SSEEventType } from '../api-types.js';\nimport { generateFullOrbital } from '../orbitals/generation/index.js';\n\n/**\n * Get entity name safely from EntityRef.\n */\nfunction getEntityName(entity: EntityRef): string {\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\n// Type alias for backward compatibility\ntype OrbitalUnit = OrbitalDefinition;\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type SubagentEventCallback = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n },\n) => void;\n\nexport type OrbitalCompleteCallback = (\n orbital: unknown,\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n) => void | Promise<void>;\n\nexport interface OrbitalRequirements {\n entities?: string[];\n states?: string[];\n events?: string[];\n guards?: string[];\n pages?: string[];\n effects?: string[];\n rawRequirements?: string[];\n}\n\nexport interface OrbitalSubagentToolOptions {\n onSubagentEvent?: SubagentEventCallback;\n onOrbitalComplete?: OrbitalCompleteCallback;\n requirements?: OrbitalRequirements;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst OrbitalInputSchema = z.object({\n orbital: z\n .object({\n name: z.string(),\n entity: z.object({\n name: z.string(),\n persistence: z.enum(['persistent', 'runtime', 'singleton', 'instance']),\n fields: z.array(\n z.object({\n name: z.string(),\n type: z.string(),\n required: z.boolean().optional(),\n }),\n ),\n }),\n traits: z.array(z.string()),\n patterns: z.array(z.string()),\n pages: z.array(\n z.object({\n name: z.string(),\n path: z.string(),\n viewType: z.string(),\n }),\n ).optional(),\n domainContext: z.object({\n request: z.string(),\n requestFragment: z.string().optional(),\n category: z.enum(['game', 'business', 'dashboard', 'form', 'content', 'social']),\n vocabulary: z.record(z.string(), z.string()).optional(),\n }).optional(),\n design: z.object({\n style: z.enum(['minimal', 'modern', 'playful', 'data-driven', 'immersive']).optional(),\n uxHints: z.object({\n flowPattern: z.string().optional(),\n listPattern: z.string().optional(),\n formPattern: z.string().optional(),\n detailPattern: z.string().optional(),\n }).optional(),\n }).optional(),\n emits: z.array(z.string()).optional(),\n listens: z.array(\n z.object({\n event: z.string(),\n triggers: z.string(),\n }),\n ).optional(),\n relations: z.array(\n z.object({\n entity: z.string(),\n alias: z.string().optional(),\n cardinality: z.enum(['one', 'many']),\n }),\n ).optional(),\n })\n .describe('The OrbitalUnit to generate'),\n orbitalIndex: z.number().optional().describe('Index in the batch (0-based)'),\n totalOrbitals: z.number().optional().describe('Total orbitals in the batch'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for generating orbitals with subagent event streaming.\n * Uses @almadar/llm LLMClient directly.\n */\nexport function createOrbitalSubagentTool(\n options: OrbitalSubagentToolOptions = {},\n) {\n let eventCallback: SubagentEventCallback | undefined = options.onSubagentEvent;\n let completeCallback: OrbitalCompleteCallback | undefined = options.onOrbitalComplete;\n const requirements = options.requirements;\n\n const setEventCallback = (callback: SubagentEventCallback) => {\n eventCallback = callback;\n };\n\n const setOrbitalCompleteCallback = (callback: OrbitalCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n orbitalName: string,\n orbitalIndex: number,\n totalOrbitals: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>,\n ) => {\n if (eventCallback) {\n eventCallback(orbitalName, orbitalIndex, totalOrbitals, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const orbitalTool = tool(\n async ({ orbital, orbitalIndex = 0, totalOrbitals = 1 }) => {\n if (!orbital) {\n const errorMsg = 'Missing required parameter: orbital.';\n return JSON.stringify({ success: false, error: errorMsg, orbital: null });\n }\n\n const orbitalUnit = orbital as OrbitalUnit;\n\n if (!orbitalUnit.entity || !orbitalUnit.name) {\n const errorMsg = `Invalid orbital: missing required fields (name: ${orbitalUnit.name}, entity: ${orbitalUnit.entity}).`;\n return JSON.stringify({ success: false, error: errorMsg, orbital: orbitalUnit.name || 'unknown' });\n }\n\n try {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Starting generation for orbital: ${orbitalUnit.name}${requirements ? ' (with requirements from analysis)' : ''}`,\n role: 'assistant',\n isComplete: false,\n });\n\n if (requirements) {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: 'Using requirements from analysis phase',\n data: {\n guards: requirements.guards?.length ?? 0,\n effects: requirements.effects?.length ?? 0,\n states: requirements.states?.length ?? 0,\n },\n orbitalName: orbitalUnit.name,\n });\n }\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'in_progress' },\n { id: 'generate', task: 'Generate full schema', status: 'pending' },\n { id: 'validate', task: 'Validate output', status: 'pending' },\n ],\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Analyzing entity: ${getEntityName(orbitalUnit.entity)} with ${orbitalUnit.traits.length} traits`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'in_progress' },\n { id: 'validate', task: 'Validate output', status: 'pending' },\n ],\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_call', {\n tool: 'llm_generate',\n args: {\n orbital: orbitalUnit.name,\n entity: getEntityName(orbitalUnit.entity),\n traits: orbitalUnit.traits,\n },\n });\n\n const result = await generateFullOrbital(client, orbitalUnit, {\n validate: true,\n requirements,\n onLog: (log) => {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: log.level,\n message: log.message,\n data: log.data,\n orbitalName: orbitalUnit.name,\n });\n },\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'llm_generate',\n result: {\n fingerprint: result.fingerprint,\n usedTemplate: result.usedTemplate,\n usage: result.usage,\n },\n success: true,\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'completed' },\n { id: 'validate', task: 'Validate output', status: 'in_progress' },\n ],\n });\n\n const finalOrbital = result.orbital;\n const finalValidation = result.validation;\n\n if (finalValidation) {\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'tool_result', {\n tool: 'validate_orbital',\n result: finalValidation,\n success: finalValidation.valid,\n });\n }\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze orbital structure', status: 'completed' },\n { id: 'generate', task: 'Generate full schema', status: 'completed' },\n { id: 'validate', task: 'Validate output', status: 'completed' },\n ],\n });\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'message', {\n content: `Generated orbital: ${orbitalUnit.name} (${result.usage?.totalTokens ?? 0} tokens)`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback && finalOrbital) {\n try {\n await completeCallback(finalOrbital, orbitalUnit.name, orbitalIndex, totalOrbitals);\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'info',\n message: `Persisted orbital: ${orbitalUnit.name}`,\n orbitalName: orbitalUnit.name,\n });\n } catch (persistError) {\n console.error(`[OrbitalSubagent] Failed to persist ${orbitalUnit.name}:`, persistError);\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'generation_log', {\n level: 'warn',\n message: `Failed to persist orbital: ${orbitalUnit.name}`,\n data: { error: String(persistError) },\n orbitalName: orbitalUnit.name,\n });\n }\n }\n\n return JSON.stringify({\n success: true,\n orbital: finalOrbital,\n fingerprint: result.fingerprint,\n usage: result.usage,\n validation: result.validation,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(orbitalUnit.name, orbitalIndex, totalOrbitals, 'error', {\n error: errorMessage,\n code: 'ORBITAL_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbital: orbitalUnit.name,\n });\n }\n },\n {\n name: 'generate_orbital',\n description: `Generate a full orbital schema from an OrbitalUnit.\n\nSpawns a subagent to expand a lightweight OrbitalUnit into a complete\nFullOrbitalUnit with all sections, layouts, and configurations.\n\nUSAGE:\n1. Decompose user request into OrbitalUnits\n2. For each orbital, call generate_orbital with embedded context\n3. Collect results and merge into final schema`,\n schema: OrbitalInputSchema,\n },\n );\n\n return {\n tool: orbitalTool,\n setEventCallback,\n setOrbitalCompleteCallback,\n };\n}\n\n/**\n * Create a helper to wrap subagent events into SSE format.\n */\nexport function createSubagentEventWrapper(\n writeEvent: (event: SSEEvent) => void,\n): SubagentEventCallback {\n return (orbitalName, orbitalIndex, totalOrbitals, event) => {\n const sseEvent: SSEEvent = {\n type: 'subagent_event',\n timestamp: Date.now(),\n data: {\n orbitalName,\n orbitalIndex,\n totalOrbitals,\n event,\n },\n };\n writeEvent(sseEvent);\n };\n}\n","/**\n * Trait Subagent Tool\n *\n * Generates custom trait definitions for orbital schemas.\n * Uses @almadar/llm LLMClient directly.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { Trait } from '@almadar/core/types';\nimport { LLMClient } from '@almadar/llm';\nimport type { SSEEventType } from '../api-types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type TraitEventCallback = (\n traitName: string,\n traitIndex: number,\n totalTraits: number,\n event: {\n type: Exclude<SSEEventType, 'subagent_event'>;\n data: Record<string, unknown>;\n timestamp: number;\n }\n) => void;\n\nexport type TraitCompleteCallback = (\n trait: Trait,\n traitName: string,\n traitIndex: number,\n totalTraits: number\n) => void | Promise<void>;\n\nexport interface TraitSubagentToolOptions {\n onTraitEvent?: TraitEventCallback;\n onTraitComplete?: TraitCompleteCallback;\n}\n\nexport interface TraitSpec {\n name: string;\n description: string;\n category?: string;\n states?: string[];\n events?: string[];\n requiredFields?: Array<{\n name: string;\n type: string;\n description?: string;\n }>;\n needsTicks?: boolean;\n needsEmit?: boolean;\n needsListens?: boolean;\n}\n\n// ============================================================================\n// Trait Generation Prompt\n// ============================================================================\n\nfunction getTraitGenerationPrompt(): string {\n return `You are a Trait Generator for KFlow orbital schemas.\n\n## Your Task\n\nGenerate a complete, valid Trait definition that implements the requested behavior.\n\n## Trait Structure\n\n\\`\\`\\`typescript\ninterface Trait {\n name: string;\n description?: string;\n category?: TraitCategory;\n requiredFields?: RequiredField[];\n dataEntities?: TraitDataEntity[];\n stateMachine?: StateMachine;\n initialEffects?: Effect[];\n ticks?: TraitTick[];\n listens?: TraitEventListener[];\n}\n\\`\\`\\`\n\n## State Machine Structure\n\n\\`\\`\\`typescript\ninterface StateMachine {\n states: State[];\n events: Event[];\n transitions: Transition[];\n guards?: Guard[];\n}\n\\`\\`\\`\n\n## Best Practices\n\n1. **State Names**: Use PascalCase (e.g., \"Idle\", \"Loading\", \"Playing\")\n2. **Event Keys**: Use UPPER_SNAKE_CASE (e.g., \"START_GAME\", \"PLAYER_HIT\")\n3. **Initial State**: Always mark exactly one state as \\`isInitial: true\\`\n4. **Terminal States**: Mark end states as \\`isFinal: true\\`\n\n## Output Format\n\nReturn ONLY valid JSON matching the Trait interface. No markdown, no explanation.`;\n}\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\nconst TraitSpecSchema = z.object({\n name: z.string().describe('Name of the trait'),\n description: z.string().describe('Description of what this trait does'),\n category: z.string().optional().describe('Category'),\n states: z.array(z.string()).optional().describe('States the trait should have'),\n events: z.array(z.string()).optional().describe('Events the trait should handle'),\n requiredFields: z.array(z.object({\n name: z.string(),\n type: z.string(),\n description: z.string().optional(),\n })).optional().describe('Fields required from the linked entity'),\n needsTicks: z.boolean().optional().describe('Whether this trait needs temporal behavior'),\n needsEmit: z.boolean().optional().describe('Whether this trait emits events'),\n needsListens: z.boolean().optional().describe('Whether this trait listens for events'),\n});\n\nconst TraitInputSchema = z.object({\n traitSpec: TraitSpecSchema.describe('Specification for the trait to generate'),\n traitIndex: z.number().optional().describe('Index in the batch (0-based)'),\n totalTraits: z.number().optional().describe('Total traits in the batch'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for generating custom traits.\n * Uses @almadar/llm LLMClient directly.\n */\nexport function createTraitSubagentTool(\n options: TraitSubagentToolOptions = {},\n) {\n let eventCallback: TraitEventCallback | undefined = options.onTraitEvent;\n let completeCallback: TraitCompleteCallback | undefined = options.onTraitComplete;\n\n const setEventCallback = (callback: TraitEventCallback) => {\n eventCallback = callback;\n };\n\n const setTraitCompleteCallback = (callback: TraitCompleteCallback) => {\n completeCallback = callback;\n };\n\n const emitEvent = (\n traitName: string,\n traitIndex: number,\n totalTraits: number,\n type: Exclude<SSEEventType, 'subagent_event'>,\n data: Record<string, unknown>\n ) => {\n if (eventCallback) {\n eventCallback(traitName, traitIndex, totalTraits, {\n type,\n data,\n timestamp: Date.now(),\n });\n }\n };\n\n const traitTool = tool(\n async ({ traitSpec, traitIndex = 0, totalTraits = 1 }) => {\n const spec = traitSpec as TraitSpec;\n\n try {\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Starting generation for custom trait: ${spec.name}`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'in_progress' },\n { id: 'generate', task: 'Generate state machine', status: 'pending' },\n { id: 'validate', task: 'Validate trait', status: 'pending' },\n ],\n });\n\n const userPrompt = buildTraitUserPrompt(spec);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Analyzing: ${spec.description}`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'in_progress' },\n { id: 'validate', task: 'Validate trait', status: 'pending' },\n ],\n });\n\n // Use @almadar/llm directly\n const client = new LLMClient({\n provider: 'anthropic',\n model: 'claude-sonnet-4-20250514',\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_call', {\n tool: 'llm_generate_trait',\n args: {\n traitName: spec.name,\n states: spec.states,\n events: spec.events,\n },\n });\n\n const result = await client.call({\n systemPrompt: getTraitGenerationPrompt(),\n userPrompt,\n maxTokens: 4096,\n skipSchemaValidation: true,\n });\n\n const generatedTrait = result as Trait;\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_result', {\n tool: 'llm_generate_trait',\n result: {\n traitName: generatedTrait.name,\n stateCount: generatedTrait.stateMachine?.states?.length ?? 0,\n transitionCount: generatedTrait.stateMachine?.transitions?.length ?? 0,\n },\n success: true,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'completed' },\n { id: 'validate', task: 'Validate trait', status: 'in_progress' },\n ],\n });\n\n const validation = validateGeneratedTrait(generatedTrait, spec);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'tool_result', {\n tool: 'validate_trait',\n result: validation,\n success: validation.valid,\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'todo_update', {\n todos: [\n { id: 'analyze', task: 'Analyze trait requirements', status: 'completed' },\n { id: 'generate', task: 'Generate state machine', status: 'completed' },\n { id: 'validate', task: 'Validate trait', status: 'completed' },\n ],\n });\n\n emitEvent(spec.name, traitIndex, totalTraits, 'message', {\n content: `Generated trait: ${generatedTrait.name} with ${generatedTrait.stateMachine?.states?.length ?? 0} states`,\n role: 'assistant',\n isComplete: true,\n });\n\n if (completeCallback) {\n try {\n await completeCallback(generatedTrait, spec.name, traitIndex, totalTraits);\n } catch (persistError) {\n console.error(`[TraitSubagent] Failed to persist ${spec.name}:`, persistError);\n }\n }\n\n return JSON.stringify({\n success: true,\n trait: generatedTrait,\n validation,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n emitEvent(spec.name, traitIndex, totalTraits, 'error', {\n error: errorMessage,\n code: 'TRAIT_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n traitName: spec.name,\n });\n }\n },\n {\n name: 'generate_custom_trait',\n description: `Generate a custom trait definition for the orbital schema.\n\nUse this when the decomposition identifies custom traits that don't exist in the\ntrait library.`,\n schema: TraitInputSchema,\n }\n );\n\n return {\n tool: traitTool,\n setEventCallback,\n setTraitCompleteCallback,\n };\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction buildTraitUserPrompt(spec: TraitSpec): string {\n const parts: string[] = [\n `Generate a Trait definition for: **${spec.name}**`,\n '',\n `## Description`,\n spec.description,\n ];\n\n if (spec.category) {\n parts.push('', `## Category`, spec.category);\n }\n if (spec.states && spec.states.length > 0) {\n parts.push('', `## Required States`, spec.states.map(s => `- ${s}`).join('\\n'));\n }\n if (spec.events && spec.events.length > 0) {\n parts.push('', `## Events to Handle`, spec.events.map(e => `- ${e}`).join('\\n'));\n }\n if (spec.requiredFields && spec.requiredFields.length > 0) {\n parts.push(\n '', `## Required Fields from Linked Entity`,\n spec.requiredFields.map(f => `- ${f.name}: ${f.type}${f.description ? ` (${f.description})` : ''}`).join('\\n')\n );\n }\n if (spec.needsTicks) {\n parts.push('', '## Temporal Behavior', 'This trait needs tick-based updates.');\n }\n if (spec.needsEmit) {\n parts.push('', '## Event Emission', 'This trait should emit events for other traits.');\n }\n if (spec.needsListens) {\n parts.push('', '## Event Listening', 'This trait should listen for events from other traits.');\n }\n\n parts.push('', '## Output', 'Return the complete Trait definition as valid JSON.');\n\n return parts.join('\\n');\n}\n\nfunction validateGeneratedTrait(trait: Trait, spec: TraitSpec): {\n valid: boolean;\n errors: string[];\n warnings: string[];\n} {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (trait.name !== spec.name) {\n errors.push(`Trait name mismatch: expected \"${spec.name}\", got \"${trait.name}\"`);\n }\n\n if (spec.states && spec.states.length > 0) {\n if (!trait.stateMachine) {\n errors.push('State machine is required but not generated');\n } else {\n const hasInitial = trait.stateMachine.states?.some(s => s.isInitial);\n if (!hasInitial) {\n warnings.push('No initial state marked');\n }\n const stateNames = new Set(trait.stateMachine.states?.map(s => s.name) ?? []);\n for (const requiredState of spec.states) {\n if (!stateNames.has(requiredState)) {\n warnings.push(`Specified state \"${requiredState}\" not found in generated trait`);\n }\n }\n }\n }\n\n if (spec.needsTicks && (!trait.ticks || trait.ticks.length === 0)) {\n warnings.push('Temporal behavior requested but no ticks defined');\n }\n if (spec.needsListens && (!trait.listens || trait.listens.length === 0)) {\n warnings.push('Event listening requested but no listeners defined');\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\n/**\n * Create a helper to wrap trait events into SSE format.\n */\nexport function createTraitEventWrapper(\n writeEvent: (event: { type: string; timestamp: number; data: unknown }) => void\n): TraitEventCallback {\n return (traitName, traitIndex, totalTraits, event) => {\n writeEvent({\n type: 'subagent_event',\n timestamp: Date.now(),\n data: { traitName, traitIndex, totalTraits, event },\n });\n };\n}\n","/**\n * Construct Combined Schema Tool\n *\n * Deterministically combines generated orbitals into a single OrbitalSchema\n * without LLM involvement.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { FullOrbitalUnit } from '@almadar/core/types';\nimport { combineOrbitals } from '../orbitals/combiner/index.js';\n\n// ============================================================================\n// Tool Schema\n// ============================================================================\n\nconst FullOrbitalUnitInputSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n entity: z.object({\n name: z.string(),\n collection: z.string().optional(),\n fields: z.array(z.any()),\n timestamps: z.boolean().optional(),\n }),\n traits: z.array(z.any()),\n pages: z.array(z.any()),\n emits: z.array(z.string()).optional(),\n listens: z.array(z.any()).optional(),\n});\n\nconst CombineSchemaInputSchema = z.object({\n orbitals: z.array(FullOrbitalUnitInputSchema).optional(),\n name: z.string().optional(),\n description: z.string().optional(),\n version: z.string().optional(),\n theme: z.string().optional(),\n defaultRoute: z.string().optional(),\n validate: z.boolean().optional().default(true),\n});\n\n// ============================================================================\n// Auto-Collection Helper\n// ============================================================================\n\nasync function autoCollectOrbitals(workDir: string): Promise<FullOrbitalUnit[]> {\n const fs = await import('fs');\n const path = await import('path');\n\n const orbitalsDir = path.join(workDir, '.orbitals');\n\n if (!fs.existsSync(orbitalsDir)) {\n const files = fs.readdirSync(workDir).filter((f: string) =>\n f.endsWith('.json') && (f.startsWith('orbital-') || f.includes('orbital'))\n );\n\n if (files.length === 0) {\n throw new Error('No orbitals found. Generate orbitals first using generate_orbital, or provide them directly.');\n }\n\n return files.map((f: string) => {\n const content = fs.readFileSync(path.join(workDir, f), 'utf-8');\n return JSON.parse(content);\n });\n }\n\n const files = fs.readdirSync(orbitalsDir).filter((f: string) => f.endsWith('.json'));\n\n if (files.length === 0) {\n throw new Error('No orbitals found in .orbitals/ directory.');\n }\n\n return files.map((f: string) => {\n const content = fs.readFileSync(path.join(orbitalsDir, f), 'utf-8');\n return JSON.parse(content);\n });\n}\n\n// ============================================================================\n// Validation Cap\n// ============================================================================\n\nconst MAX_COMBINE_VALIDATION_ATTEMPTS = 3;\nlet combineValidationAttempts = 0;\n\n// ============================================================================\n// Tool Implementation\n// ============================================================================\n\n/**\n * Create the construct_combined_schema tool.\n */\nexport function createCombineSchemasTool(workDir?: string) {\n combineValidationAttempts = 0;\n\n return tool(\n async (input) => {\n let orbitals: FullOrbitalUnit[];\n\n if (input.orbitals && input.orbitals.length > 0) {\n orbitals = input.orbitals as FullOrbitalUnit[];\n } else if (workDir) {\n orbitals = await autoCollectOrbitals(workDir);\n } else {\n orbitals = await autoCollectOrbitals(process.cwd());\n }\n\n const appName = input.name ||\n (orbitals.length > 0 ? `${orbitals[0].name} Application` : 'Application');\n\n const result = combineOrbitals(orbitals, {\n name: appName,\n description: input.description,\n version: input.version,\n theme: input.theme,\n defaultRoute: input.defaultRoute,\n validate: input.validate ?? true,\n });\n\n if (result.success) {\n combineValidationAttempts = 0;\n\n return JSON.stringify({\n success: true,\n schema: result.schema,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errorCount: result.validation.errors.length,\n warningCount: result.validation.warnings.length,\n } : undefined,\n __TASK_COMPLETE__: true,\n __STOP_SIGNAL__: 'WORKFLOW_FINISHED',\n message: `✅ SCHEMA GENERATION COMPLETE. Generated ${result.stats?.totalOrbitals || orbitals.length} orbitals. ` +\n `DO NOT call any more tools.`,\n }, null, 2);\n } else {\n combineValidationAttempts++;\n\n if (combineValidationAttempts >= MAX_COMBINE_VALIDATION_ATTEMPTS) {\n return JSON.stringify({\n success: false,\n cappedValidation: true,\n validationAttempt: combineValidationAttempts,\n error: result.error,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errors: result.validation.errors.slice(0, 3),\n errorCount: result.validation.errors.length,\n } : undefined,\n __STOP_FIXING__: true,\n message: `⚠️ VALIDATION CAP REACHED (${MAX_COMBINE_VALIDATION_ATTEMPTS} attempts). STOP editing orbitals.`,\n recommendation: 'STOP_FIXING',\n }, null, 2);\n }\n\n return JSON.stringify({\n success: false,\n validationAttempt: combineValidationAttempts,\n remainingAttempts: MAX_COMBINE_VALIDATION_ATTEMPTS - combineValidationAttempts,\n error: result.error,\n stats: result.stats,\n validation: result.validation ? {\n valid: result.validation.valid,\n errors: result.validation.errors.slice(0, 5),\n errorCount: result.validation.errors.length,\n } : undefined,\n partialSchema: result.schema,\n }, null, 2);\n }\n },\n {\n name: 'construct_combined_schema',\n description: `Deterministically combine generated orbitals into a single OrbitalSchema.\n\n⚠️ IMPORTANT: This is the FINAL STEP. When this tool returns success,\nyour task is COMPLETE. Do NOT call any other tools after this succeeds.\n\nSIMPLE USAGE (RECOMMENDED):\n construct_combined_schema({})\n\nOrbitals are auto-collected from .orbitals/ directory.`,\n schema: CombineSchemaInputSchema,\n }\n );\n}\n","/**\n * Schema Chunking Tools\n *\n * Tools for extracting and merging chunks of large orbital schemas.\n * Enables LLM-driven schema updates without hitting token limits.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { randomUUID } from 'crypto';\nimport * as fs from 'fs/promises';\nimport * as fss from 'fs';\nimport * as path from 'path';\nimport type { OrbitalSchema, Trait, TraitRef, Orbital, OrbitalDefinition, EntityRef } from '@almadar/core/types';\nimport { isOrbitalDefinition, isEntityReference } from '@almadar/core/types';\n\n/**\n * Get entity name safely from EntityRef.\n */\nfunction getEntityName(entity: EntityRef | undefined): string {\n if (!entity) return 'Unknown';\n if (isEntityReference(entity)) {\n return entity.replace('.entity', '');\n }\n return entity.name;\n}\n\nconst CHUNKS_DIR = '.chunks';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface OrbitalSummary {\n name: string;\n entity: string;\n traits: string[];\n inlineTraits: string[];\n}\n\ninterface SchemaStructure {\n name: string;\n orbitals: OrbitalSummary[];\n traits: string[];\n totalSize: string;\n}\n\ninterface ChunkMeta {\n sourceFile: string;\n type: 'orbital' | 'trait' | 'inline-trait';\n orbitalIndex?: number;\n traitIndex?: number;\n inlineTraitIndex?: number;\n parentOrbitalName?: string;\n extractedAt: string;\n}\n\ninterface ChunkFile {\n meta: ChunkMeta;\n orbital?: unknown;\n referencedTraits?: unknown[];\n trait?: unknown;\n inlineTrait?: unknown;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nasync function ensureChunksDir(workspaceDir: string): Promise<string> {\n const chunksPath = path.join(workspaceDir, CHUNKS_DIR);\n try {\n await fs.mkdir(chunksPath, { recursive: true });\n } catch {\n // Directory may already exist\n }\n return chunksPath;\n}\n\nfunction getTraitInfo(traits: unknown[]): { refs: string[]; inlines: string[] } {\n const refs: string[] = [];\n const inlines: string[] = [];\n\n for (const t of traits || []) {\n if (typeof t === 'object' && t !== null) {\n if ('ref' in t && typeof (t as { ref: unknown }).ref === 'string') {\n refs.push((t as { ref: string }).ref);\n } else if ('name' in t && typeof (t as { name: unknown }).name === 'string') {\n inlines.push((t as { name: string }).name);\n }\n }\n }\n\n return { refs, inlines };\n}\n\n// ============================================================================\n// Tool: query_schema_structure\n// ============================================================================\n\nexport function createQuerySchemaStructureTool(workDir: string) {\n return tool(\n async ({ file }) => {\n const filePath = path.isAbsolute(file) ? file : path.join(workDir, file);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const stats = fss.statSync(filePath);\n\n const structure: SchemaStructure = {\n name: schema.name,\n orbitals: (schema.orbitals || [])\n .filter((o): o is OrbitalDefinition => isOrbitalDefinition(o))\n .map(o => {\n const { refs, inlines } = getTraitInfo(o.traits || []);\n return {\n name: o.name,\n entity: getEntityName(o.entity),\n traits: refs,\n inlineTraits: inlines,\n };\n }),\n traits: [],\n totalSize: `${Math.round(stats.size / 1024)}KB`,\n };\n\n return JSON.stringify(structure, null, 2);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to query schema structure: ${msg}` });\n }\n },\n {\n name: 'query_schema_structure',\n description: `Get a lightweight map of schema structure (names only, not content).\n\nUSE THIS FIRST before extracting chunks to understand what orbitals and traits exist.`,\n schema: z.object({\n file: z.string().describe('Path to schema file (e.g., \"schema.json\")'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Tool: extract_chunk\n// ============================================================================\n\nexport function createExtractChunkTool(workDir: string) {\n return tool(\n async ({ file, type, name, parentOrbital, includeTraits = true }) => {\n const filePath = path.isAbsolute(file) ? file : path.join(workDir, file);\n\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const schema = JSON.parse(content) as OrbitalSchema;\n const chunkId = randomUUID().slice(0, 8);\n const chunksDir = await ensureChunksDir(workDir);\n const chunkFile = path.join(chunksDir, `chunk-${chunkId}.json`);\n\n const chunkData: ChunkFile = {\n meta: {\n sourceFile: filePath,\n type,\n extractedAt: new Date().toISOString(),\n },\n };\n\n if (type === 'orbital') {\n const orbitalIndex = schema.orbitals.findIndex(o => o.name === name);\n if (orbitalIndex === -1) {\n return JSON.stringify({ error: `Orbital \"${name}\" not found in schema` });\n }\n\n const orbital = schema.orbitals[orbitalIndex];\n chunkData.meta.orbitalIndex = orbitalIndex;\n chunkData.orbital = orbital;\n\n if (includeTraits) {\n const { refs } = getTraitInfo(orbital.traits || []);\n chunkData.referencedTraits = (orbital.traits || []).filter(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n refs.includes((t as { name: string }).name)\n );\n }\n } else if (type === 'trait') {\n return JSON.stringify({\n error: `Schema-level traits no longer exist. Use type \"inline-trait\" with parentOrbital.`,\n });\n } else if (type === 'inline-trait') {\n if (!parentOrbital) {\n return JSON.stringify({ error: 'parentOrbital is required for inline-trait extraction' });\n }\n\n const orbitalIndex = schema.orbitals.findIndex(o => o.name === parentOrbital);\n if (orbitalIndex === -1) {\n return JSON.stringify({ error: `Parent orbital \"${parentOrbital}\" not found` });\n }\n\n const orbital = schema.orbitals[orbitalIndex];\n const inlineTraitIndex = (orbital.traits || []).findIndex(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n (t as { name: string }).name === name\n );\n\n if (inlineTraitIndex === -1) {\n return JSON.stringify({ error: `Inline trait \"${name}\" not found in orbital \"${parentOrbital}\"` });\n }\n\n chunkData.meta.parentOrbitalName = parentOrbital;\n chunkData.meta.orbitalIndex = orbitalIndex;\n chunkData.meta.inlineTraitIndex = inlineTraitIndex;\n chunkData.inlineTrait = orbital.traits![inlineTraitIndex];\n }\n\n const chunkContent = JSON.stringify(chunkData, null, 2);\n await fs.writeFile(chunkFile, chunkContent);\n\n const relativeChunkFile = path.relative(workDir, chunkFile);\n\n return JSON.stringify({\n success: true,\n chunkId,\n chunkFile: relativeChunkFile,\n size: `${Math.round(chunkContent.length / 1024)}KB`,\n message: `Chunk extracted to ${relativeChunkFile}. Use edit_file then apply_chunk with chunkId \"${chunkId}\".`,\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to extract chunk: ${msg}` });\n }\n },\n {\n name: 'extract_chunk',\n description: `Extract a specific orbital or trait to a chunk file for editing.\n\nAfter extracting, use edit_file on the returned chunkFile path, then call apply_chunk.\n\nTypes: \"orbital\", \"inline-trait\" (requires parentOrbital).`,\n schema: z.object({\n file: z.string().describe('Path to schema file'),\n type: z.enum(['orbital', 'trait', 'inline-trait']).describe('Type of chunk to extract'),\n name: z.string().describe('Name of orbital or trait to extract'),\n parentOrbital: z.string().optional().describe('Required for inline-trait'),\n includeTraits: z.boolean().default(true).describe('For orbital: also extract referenced traits'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Tool: apply_chunk\n// ============================================================================\n\nexport function createApplyChunkTool(workDir: string) {\n return tool(\n async ({ chunkId }) => {\n const chunkFileName = `chunk-${chunkId}.json`;\n const chunkFilePath = path.join(workDir, CHUNKS_DIR, chunkFileName);\n\n try {\n try {\n await fs.access(chunkFilePath);\n } catch {\n return JSON.stringify({ error: `Chunk file not found: ${chunkFileName}.` });\n }\n\n const chunkContent = await fs.readFile(chunkFilePath, 'utf-8');\n const chunkData = JSON.parse(chunkContent) as ChunkFile;\n const { meta } = chunkData;\n\n const schemaContent = await fs.readFile(meta.sourceFile, 'utf-8');\n const schema = JSON.parse(schemaContent) as OrbitalSchema;\n\n if (meta.type === 'orbital' && chunkData.orbital) {\n schema.orbitals[meta.orbitalIndex!] = chunkData.orbital as Orbital;\n\n if (chunkData.referencedTraits && Array.isArray(chunkData.referencedTraits)) {\n const orbital = schema.orbitals[meta.orbitalIndex!];\n if (orbital && isOrbitalDefinition(orbital) && orbital.traits) {\n for (const editedTrait of chunkData.referencedTraits) {\n if (typeof editedTrait === 'object' && editedTrait !== null && 'name' in editedTrait) {\n const traitName = (editedTrait as { name: string }).name;\n const idx = orbital.traits.findIndex(t =>\n typeof t === 'object' && t !== null && 'name' in t &&\n (t as { name: string }).name === traitName\n );\n if (idx !== -1) {\n orbital.traits[idx] = editedTrait as TraitRef;\n }\n }\n }\n }\n }\n }\n\n if (meta.type === 'trait' && chunkData.trait) {\n console.warn('Schema-level traits are deprecated. Trait was not applied.');\n }\n\n if (meta.type === 'inline-trait' && chunkData.inlineTrait) {\n const orbital = schema.orbitals[meta.orbitalIndex!];\n if (orbital && isOrbitalDefinition(orbital) && orbital.traits && meta.inlineTraitIndex !== undefined) {\n orbital.traits[meta.inlineTraitIndex] = chunkData.inlineTrait as TraitRef;\n }\n }\n\n const output = JSON.stringify(schema, null, 2);\n await fs.writeFile(meta.sourceFile, output);\n await fs.unlink(chunkFilePath);\n\n return JSON.stringify({\n success: true,\n message: `Changes merged into ${path.basename(meta.sourceFile)}`,\n updatedSize: `${Math.round(output.length / 1024)}KB`,\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: `Failed to apply chunk: ${msg}` });\n }\n },\n {\n name: 'apply_chunk',\n description: `Merge an edited chunk file back into the schema.\n\nCall this AFTER editing the chunk file with edit_file.`,\n schema: z.object({\n chunkId: z.string().describe('Chunk ID from extract_chunk'),\n }),\n }\n );\n}\n\n// ============================================================================\n// Factory function\n// ============================================================================\n\nexport function createSchemaChunkingTools(workDir: string) {\n return {\n querySchemaStructure: createQuerySchemaStructureTool(workDir),\n extractChunk: createExtractChunkTool(workDir),\n applyChunk: createApplyChunkTool(workDir),\n };\n}\n","/**\n * GitHub Tools for DeepAgent\n *\n * LangChain tools that wrap GitHubIntegration operations.\n * These tools enable the agent to clone repos, create branches, commit, push, and create PRs.\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport { GitHubIntegration } from '@almadar/integrations';\nimport type { IntegrationConfig } from '@almadar/integrations';\n\n/**\n * GitHub tools configuration\n */\nexport interface GitHubToolsConfig {\n /** GitHub personal access token */\n token: string;\n /** Repository owner (e.g., 'octocat') */\n owner?: string;\n /** Repository name (e.g., 'hello-world') */\n repo?: string;\n /** Working directory for git operations */\n workDir: string;\n}\n\n/**\n * Create GitHub tools for the agent\n */\nexport function createGitHubTools(config: GitHubToolsConfig) {\n const { token, owner = '', repo = '', workDir } = config;\n\n // Create GitHub integration instance\n const integrationConfig: IntegrationConfig = {\n name: 'github',\n env: {\n GITHUB_TOKEN: token,\n GITHUB_OWNER: owner,\n GITHUB_REPO: repo,\n GITHUB_WORK_DIR: workDir,\n },\n };\n\n const github = new GitHubIntegration(integrationConfig);\n\n // =========================================================================\n // Git Operations\n // =========================================================================\n\n /**\n * Clone a GitHub repository\n */\n const github_clone = tool(\n async ({ repoUrl, branch, depth }) => {\n try {\n const result = await github.execute('cloneRepo', {\n repoUrl,\n targetDir: workDir,\n branch,\n depth: depth || 1,\n });\n\n if (!result.success) {\n return `Failed to clone repository: ${result.error?.message}`;\n }\n\n return `Successfully cloned ${repoUrl} to ${workDir}${branch ? ` (branch: ${branch})` : ''}`;\n } catch (error) {\n return `Error cloning repository: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_clone',\n description: `Clone a GitHub repository into the workspace.\n\nUsage:\n- Clones the repository into the current workspace directory\n- Defaults to shallow clone (depth: 1) for faster cloning\n- Can optionally specify a branch to checkout\n\nExample:\ngithub_clone({ repoUrl: \"https://github.com/owner/repo\", branch: \"main\" })`,\n schema: z.object({\n repoUrl: z.string().describe('GitHub repository URL (e.g., https://github.com/owner/repo)'),\n branch: z.string().optional().describe('Branch to checkout (defaults to repo default branch)'),\n depth: z.number().optional().describe('Clone depth (default: 1 for shallow clone)'),\n }),\n }\n );\n\n /**\n * Create a new git branch\n */\n const github_create_branch = tool(\n async ({ branchName, baseBranch }) => {\n try {\n const result = await github.execute('createBranch', {\n branchName,\n baseBranch,\n workDir,\n });\n\n if (!result.success) {\n return `Failed to create branch: ${result.error?.message}`;\n }\n\n return `Successfully created and checked out branch: ${branchName}`;\n } catch (error) {\n return `Error creating branch: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_create_branch',\n description: `Create and checkout a new git branch.\n\nUsage:\n- Creates a new branch from the current branch or specified base branch\n- Automatically checks out the new branch\n- Branch name should follow format: feature/name, fix/name, etc.\n\nExample:\ngithub_create_branch({ branchName: \"fix/issue-42-null-pointer\" })`,\n schema: z.object({\n branchName: z.string().describe('Name of the branch to create (e.g., fix/issue-42)'),\n baseBranch: z.string().optional().describe('Base branch to create from (defaults to current branch)'),\n }),\n }\n );\n\n /**\n * Commit changes\n */\n const github_commit = tool(\n async ({ message, files }) => {\n try {\n const result = await github.execute('commit', {\n message,\n files,\n workDir,\n });\n\n if (!result.success) {\n return `Failed to commit: ${result.error?.message}`;\n }\n\n return `Successfully committed: ${message}`;\n } catch (error) {\n return `Error committing changes: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_commit',\n description: `Stage and commit changes to git.\n\nUsage:\n- Stages files (or all changes if files not specified)\n- Creates a commit with the provided message\n- Commit message should be clear and descriptive\n\nExample:\ngithub_commit({ message: \"Fix null pointer in UserService\\\\n\\\\nCloses #42\" })`,\n schema: z.object({\n message: z.string().describe('Commit message (can include multiple lines)'),\n files: z.array(z.string()).optional().describe('Specific files to commit (defaults to all changes)'),\n }),\n }\n );\n\n /**\n * Push branch to remote\n */\n const github_push = tool(\n async ({ branchName }) => {\n try {\n const result = await github.execute('push', {\n branchName,\n force: false, // Never allow force push\n workDir,\n });\n\n if (!result.success) {\n return `Failed to push: ${result.error?.message}`;\n }\n\n return `Successfully pushed branch: ${branchName}`;\n } catch (error) {\n return `Error pushing branch: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_push',\n description: `Push a branch to GitHub.\n\nUsage:\n- Pushes the specified branch to origin\n- Sets upstream tracking (-u flag)\n- Force push is NEVER allowed for safety\n\nExample:\ngithub_push({ branchName: \"fix/issue-42\" })`,\n schema: z.object({\n branchName: z.string().describe('Name of the branch to push'),\n }),\n }\n );\n\n // =========================================================================\n // GitHub API Operations\n // =========================================================================\n\n /**\n * Create a pull request\n */\n const github_create_pr = tool(\n async ({ title, body, baseBranch, headBranch, draft }) => {\n try {\n const result = await github.execute('createPR', {\n title,\n body,\n baseBranch,\n headBranch,\n draft: draft || false,\n });\n\n if (!result.success) {\n return `Failed to create pull request: ${result.error?.message}`;\n }\n\n const pr = result.data as { number: number; url: string };\n return `Successfully created PR #${pr.number}: ${pr.url}`;\n } catch (error) {\n return `Error creating pull request: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_create_pr',\n description: `Create a pull request on GitHub.\n\nUsage:\n- Creates a PR from headBranch to baseBranch\n- Title should be concise (under 70 chars)\n- Body should include:\n - Summary of changes\n - Test plan or verification steps\n - References to issues (e.g., \"Closes #42\")\n\nExample:\ngithub_create_pr({\n title: \"Fix null pointer in UserService\",\n body: \"## Summary\\\\n- Fixed null check...\\\\n\\\\nCloses #42\",\n baseBranch: \"main\",\n headBranch: \"fix/issue-42\"\n})`,\n schema: z.object({\n title: z.string().describe('PR title (concise, under 70 chars)'),\n body: z.string().describe('PR description/body (markdown supported)'),\n baseBranch: z.string().describe('Base branch (usually \"main\" or \"master\")'),\n headBranch: z.string().describe('Head branch (your feature/fix branch)'),\n draft: z.boolean().optional().describe('Create as draft PR (default: false)'),\n }),\n }\n );\n\n /**\n * List repository issues\n */\n const github_list_issues = tool(\n async ({ state, labels, limit }) => {\n try {\n const result = await github.execute('listIssues', {\n state: state || 'open',\n labels: labels || [],\n limit: limit || 30,\n });\n\n if (!result.success) {\n return `Failed to list issues: ${result.error?.message}`;\n }\n\n const data = result.data as { issues: Array<{ number: number; title: string; state: string; labels: Array<{ name: string }> }> };\n const issues = data.issues;\n\n if (issues.length === 0) {\n return 'No issues found matching the criteria.';\n }\n\n const issueList = issues\n .map((issue) => {\n const labelsStr = issue.labels.map((l) => l.name).join(', ');\n return `#${issue.number}: ${issue.title} [${issue.state}]${labelsStr ? ` (${labelsStr})` : ''}`;\n })\n .join('\\n');\n\n return `Found ${issues.length} issue(s):\\n${issueList}`;\n } catch (error) {\n return `Error listing issues: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_list_issues',\n description: `List repository issues from GitHub.\n\nUsage:\n- Lists issues with optional filters\n- Returns issue number, title, state, and labels\n- Useful for finding issues to work on\n\nExample:\ngithub_list_issues({ state: \"open\", labels: [\"bug\"], limit: 10 })`,\n schema: z.object({\n state: z.enum(['open', 'closed', 'all']).optional().describe('Issue state filter (default: \"open\")'),\n labels: z.array(z.string()).optional().describe('Filter by labels'),\n limit: z.number().optional().describe('Maximum number of issues to return (default: 30)'),\n }),\n }\n );\n\n /**\n * Get issue details\n */\n const github_get_issue = tool(\n async ({ issueNumber }) => {\n try {\n const result = await github.execute('getIssue', {\n issueNumber,\n });\n\n if (!result.success) {\n return `Failed to get issue: ${result.error?.message}`;\n }\n\n const data = result.data as {\n issue: {\n number: number;\n title: string;\n body: string | null;\n state: string;\n labels: Array<{ name: string }>;\n };\n comments: Array<{\n body: string;\n user: { login: string };\n created_at: string;\n }>;\n };\n\n const { issue, comments } = data;\n const labelsStr = issue.labels.map((l) => l.name).join(', ');\n\n let output = `Issue #${issue.number}: ${issue.title}\\n`;\n output += `State: ${issue.state}\\n`;\n if (labelsStr) {\n output += `Labels: ${labelsStr}\\n`;\n }\n output += `\\nDescription:\\n${issue.body || '(No description)'}\\n`;\n\n if (comments.length > 0) {\n output += `\\n${comments.length} Comment(s):\\n`;\n comments.forEach((comment) => {\n output += `\\n@${comment.user.login} (${comment.created_at}):\\n${comment.body}\\n`;\n });\n }\n\n return output;\n } catch (error) {\n return `Error getting issue: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_get_issue',\n description: `Get detailed information about a specific issue.\n\nUsage:\n- Retrieves issue details including description and comments\n- Useful for understanding what needs to be fixed\n- Use this before working on an issue\n\nExample:\ngithub_get_issue({ issueNumber: 42 })`,\n schema: z.object({\n issueNumber: z.number().describe('Issue number to retrieve'),\n }),\n }\n );\n\n /**\n * Get PR review comments\n */\n const github_get_pr_comments = tool(\n async ({ prNumber }) => {\n try {\n const result = await github.execute('getPRComments', {\n prNumber,\n });\n\n if (!result.success) {\n return `Failed to get PR comments: ${result.error?.message}`;\n }\n\n const data = result.data as {\n comments: Array<{\n body: string;\n user: { login: string };\n created_at: string;\n }>;\n };\n\n const comments = data.comments;\n\n if (comments.length === 0) {\n return `No comments on PR #${prNumber}`;\n }\n\n let output = `${comments.length} Comment(s) on PR #${prNumber}:\\n`;\n comments.forEach((comment) => {\n output += `\\n@${comment.user.login} (${comment.created_at}):\\n${comment.body}\\n`;\n });\n\n return output;\n } catch (error) {\n return `Error getting PR comments: ${error instanceof Error ? error.message : String(error)}`;\n }\n },\n {\n name: 'github_get_pr_comments',\n description: `Get review comments on a pull request.\n\nUsage:\n- Retrieves all comments on a PR\n- Useful for addressing review feedback\n- Shows commenter and timestamp\n\nExample:\ngithub_get_pr_comments({ prNumber: 87 })`,\n schema: z.object({\n prNumber: z.number().describe('Pull request number'),\n }),\n }\n );\n\n return {\n github_clone,\n github_create_branch,\n github_commit,\n github_push,\n github_create_pr,\n github_list_issues,\n github_get_issue,\n github_get_pr_comments,\n };\n}\n\n/**\n * Create GitHub tools as array (for easy spreading into agent tools)\n */\nexport function createGitHubToolsArray(config: GitHubToolsConfig) {\n const tools = createGitHubTools(config);\n return Object.values(tools);\n}\n","/**\n * In-Memory Persistence Backend\n *\n * Provides in-memory session metadata storage for development.\n * Data is lost on process restart.\n */\n\nimport type { SessionMetadata, SessionRecord } from './types.js';\n\n// ============================================================================\n// MemorySessionBackend\n// ============================================================================\n\n/**\n * In-memory session metadata store.\n */\nexport class MemorySessionBackend {\n private sessions = new Map<string, SessionMetadata>();\n\n /**\n * Store session metadata.\n */\n store(threadId: string, metadata: SessionMetadata): void {\n this.sessions.set(threadId, metadata);\n }\n\n /**\n * Get session metadata.\n */\n get(threadId: string): SessionMetadata | undefined {\n return this.sessions.get(threadId);\n }\n\n /**\n * Delete session metadata.\n */\n delete(threadId: string): boolean {\n return this.sessions.delete(threadId);\n }\n\n /**\n * List all sessions.\n */\n list(): SessionRecord[] {\n return Array.from(this.sessions.entries()).map(([threadId, meta]) => ({\n threadId,\n ...meta,\n }));\n }\n\n /**\n * Check if a session exists.\n */\n has(threadId: string): boolean {\n return this.sessions.has(threadId);\n }\n}\n","/**\n * Firestore Checkpointer for LangGraph\n *\n * Custom implementation of BaseCheckpointSaver using Firebase Firestore.\n * This is required because LangGraph only provides Postgres/Redis savers.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n * This keeps the @almadar/agent package free of firebase-admin as a direct dependency.\n */\n\nimport {\n BaseCheckpointSaver,\n type Checkpoint,\n type CheckpointTuple,\n type CheckpointMetadata,\n type CheckpointListOptions,\n type PendingWrite,\n} from '@langchain/langgraph-checkpoint';\nimport type { RunnableConfig } from '@langchain/core/runnables';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal Firestore interface to avoid importing firebase-admin.\n * Consumers pass their own Firestore instance.\n */\nexport interface FirestoreDb {\n collection(path: string): FirestoreCollectionRef;\n batch(): FirestoreBatch;\n}\n\nexport interface FirestoreCollectionRef {\n doc(id: string): FirestoreDocRef;\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n}\n\nexport interface FirestoreDocRef {\n set(data: unknown): Promise<unknown>;\n get(): Promise<FirestoreDocSnapshot>;\n update(data: unknown): Promise<unknown>;\n delete(): Promise<unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreDocSnapshot {\n exists: boolean;\n data(): Record<string, unknown> | undefined;\n readonly ref: unknown;\n}\n\nexport interface FirestoreQuery {\n where(field: string, op: string, value: unknown): FirestoreQuery;\n orderBy(field: string, direction?: string): FirestoreQuery;\n limit(n: number): FirestoreQuery;\n startAfter(doc: unknown): FirestoreQuery;\n get(): Promise<FirestoreQuerySnapshot>;\n}\n\nexport interface FirestoreQuerySnapshot {\n empty: boolean;\n docs: FirestoreQueryDocSnapshot[];\n size: number;\n}\n\nexport interface FirestoreQueryDocSnapshot {\n data(): Record<string, unknown>;\n readonly ref: unknown;\n}\n\nexport interface FirestoreBatch {\n set(ref: unknown, data: unknown): void;\n delete(ref: unknown): void;\n commit(): Promise<unknown>;\n}\n\n/**\n * Firestore Timestamp-like interface.\n */\nexport interface FirestoreTimestamp {\n toDate(): Date;\n}\n\n/**\n * Options for FirestoreCheckpointer.\n */\nexport interface FirestoreCheckpointerOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for checkpoints.\n * @default 'agent_checkpoints'\n */\n checkpointsCollection?: string;\n\n /**\n * Collection name for pending writes.\n * @default 'agent_writes'\n */\n writesCollection?: string;\n}\n\n/**\n * Document structure for checkpoint storage.\n */\ninterface CheckpointDocument {\n threadId: string;\n checkpointId: string;\n parentCheckpointId?: string;\n checkpoint: Checkpoint;\n metadata: CheckpointMetadata;\n createdAt: unknown;\n updatedAt: unknown;\n}\n\n/**\n * Document structure for pending writes.\n */\ninterface WriteDocument {\n threadId: string;\n checkpointId: string;\n taskId: string;\n channel: string;\n value: unknown;\n createdAt: unknown;\n}\n\n// ============================================================================\n// FirestoreCheckpointer\n// ============================================================================\n\n/**\n * Firestore-backed checkpointer for LangGraph agents.\n *\n * Provides persistent checkpoint storage across server restarts.\n * Thread checkpoints are stored as Firestore documents.\n *\n * @example\n * ```typescript\n * import { getFirestore } from 'firebase-admin/firestore';\n *\n * const checkpointer = new FirestoreCheckpointer({\n * db: getFirestore(),\n * checkpointsCollection: 'agent_checkpoints',\n * });\n *\n * const agent = createDeepAgent({\n * // ...\n * checkpointer,\n * });\n * ```\n */\nexport class FirestoreCheckpointer extends BaseCheckpointSaver {\n private db: FirestoreDb;\n private checkpointsCollection: string;\n private writesCollection: string;\n\n constructor(options: FirestoreCheckpointerOptions) {\n super();\n this.db = options.db;\n this.checkpointsCollection = options.checkpointsCollection ?? 'agent_checkpoints';\n this.writesCollection = options.writesCollection ?? 'agent_writes';\n }\n\n /**\n * Get thread ID from config.\n */\n private getThreadId(config: RunnableConfig): string {\n const threadId = config.configurable?.thread_id;\n if (!threadId || typeof threadId !== 'string') {\n throw new Error('thread_id is required in config.configurable');\n }\n return threadId;\n }\n\n /**\n * Get checkpoint ID from config, or undefined for latest.\n */\n private getCheckpointId(config: RunnableConfig): string | undefined {\n return config.configurable?.checkpoint_id as string | undefined;\n }\n\n /**\n * Get checkpoint by config.\n */\n async getTuple(config: RunnableConfig): Promise<CheckpointTuple | undefined> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId);\n\n if (checkpointId) {\n query = query.where('checkpointId', '==', checkpointId);\n } else {\n query = query.orderBy('createdAt', 'desc').limit(1);\n }\n\n const snapshot = await query.get();\n if (snapshot.empty) {\n return undefined;\n }\n\n const doc = snapshot.docs[0];\n const data = doc.data() as unknown as CheckpointDocument;\n\n // Get pending writes for this checkpoint\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', data.checkpointId)\n .get();\n\n const pendingWrites = writesSnapshot.docs.map((writeDoc) => {\n const writeData = writeDoc.data() as unknown as WriteDocument;\n return [writeData.taskId, writeData.channel, writeData.value] as [string, string, unknown];\n });\n\n // Build parent config if available\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n return {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n pendingWrites,\n };\n }\n\n /**\n * List checkpoints for a thread.\n */\n async *list(\n config: RunnableConfig,\n options?: CheckpointListOptions\n ): AsyncGenerator<CheckpointTuple> {\n const threadId = this.getThreadId(config);\n const limit = options?.limit ?? 10;\n\n let query = this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .orderBy('createdAt', 'desc')\n .limit(limit);\n\n // Apply filter if provided\n if (options?.filter) {\n for (const [key, value] of Object.entries(options.filter)) {\n query = query.where(`metadata.${key}`, '==', value);\n }\n }\n\n // Apply before cursor if provided\n if (options?.before?.configurable?.checkpoint_id) {\n const beforeDoc = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .where('checkpointId', '==', options.before.configurable.checkpoint_id)\n .get();\n\n if (!beforeDoc.empty) {\n query = query.startAfter(beforeDoc.docs[0]);\n }\n }\n\n const snapshot = await query.get();\n\n for (const doc of snapshot.docs) {\n const data = doc.data() as unknown as CheckpointDocument;\n\n const parentConfig = data.parentCheckpointId\n ? {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.parentCheckpointId,\n },\n }\n : undefined;\n\n yield {\n config: {\n configurable: {\n thread_id: threadId,\n checkpoint_id: data.checkpointId,\n },\n },\n checkpoint: data.checkpoint,\n metadata: data.metadata,\n parentConfig,\n };\n }\n }\n\n /**\n * Save a checkpoint.\n */\n async put(\n config: RunnableConfig,\n checkpoint: Checkpoint,\n metadata: CheckpointMetadata,\n _newVersions: Record<string, number | string>\n ): Promise<RunnableConfig> {\n const threadId = this.getThreadId(config);\n const checkpointId = checkpoint.id;\n const parentCheckpointId = this.getCheckpointId(config);\n\n const now = new Date();\n\n const docData: CheckpointDocument = {\n threadId,\n checkpointId,\n parentCheckpointId,\n checkpoint,\n metadata,\n createdAt: now,\n updatedAt: now,\n };\n\n // Use checkpointId as document ID for easy lookup\n const docId = `${threadId}_${checkpointId}`;\n await this.db.collection(this.checkpointsCollection).doc(docId).set(docData);\n\n return {\n configurable: {\n thread_id: threadId,\n checkpoint_id: checkpointId,\n },\n };\n }\n\n /**\n * Store pending writes for a checkpoint.\n */\n async putWrites(\n config: RunnableConfig,\n writes: PendingWrite[],\n taskId: string\n ): Promise<void> {\n const threadId = this.getThreadId(config);\n const checkpointId = this.getCheckpointId(config);\n\n if (!checkpointId) {\n throw new Error('checkpoint_id is required for putWrites');\n }\n\n const batch = this.db.batch();\n const now = new Date();\n\n for (const [idx, [channel, value]] of writes.entries()) {\n const docId = `${threadId}_${checkpointId}_${taskId}_${idx}`;\n const docRef = this.db.collection(this.writesCollection).doc(docId);\n\n const writeData: WriteDocument = {\n threadId,\n checkpointId,\n taskId,\n channel,\n value,\n createdAt: now,\n };\n\n batch.set(docRef, writeData);\n }\n\n await batch.commit();\n }\n\n /**\n * Delete all checkpoints and writes for a thread.\n */\n async deleteThread(threadId: string): Promise<void> {\n // Delete checkpoints\n const checkpointsSnapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const checkpointBatch = this.db.batch();\n for (const doc of checkpointsSnapshot.docs) {\n checkpointBatch.delete(doc.ref);\n }\n await checkpointBatch.commit();\n\n // Delete writes\n const writesSnapshot = await this.db\n .collection(this.writesCollection)\n .where('threadId', '==', threadId)\n .get();\n\n const writesBatch = this.db.batch();\n for (const doc of writesSnapshot.docs) {\n writesBatch.delete(doc.ref);\n }\n await writesBatch.commit();\n }\n}\n","/**\n * Firestore Session Store for DeepAgent\n *\n * Provides persistent session storage for skill-based agents.\n * Sessions are stored in Firestore and persist across server restarts.\n *\n * IMPORTANT: This module does NOT import firebase-admin directly.\n * The Firestore `db` instance must be injected via constructor options.\n */\n\nimport type { Session } from './types.js';\nimport type { FirestoreDb, FirestoreTimestamp } from './firestore-checkpointer.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for FirestoreSessionStore.\n */\nexport interface FirestoreSessionStoreOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for sessions.\n * @default 'agent_sessions'\n */\n collection?: string;\n}\n\n/**\n * Document structure for session storage.\n */\ninterface SessionDocument {\n threadId: string;\n skill: string;\n workDir: string;\n userId?: string;\n createdAt: FirestoreTimestamp;\n lastActivityAt: FirestoreTimestamp;\n}\n\n// ============================================================================\n// FirestoreSessionStore\n// ============================================================================\n\n/**\n * Firestore-backed session store for skill agents.\n *\n * @example\n * ```typescript\n * const sessionStore = new FirestoreSessionStore({ db: getFirestore() });\n *\n * await sessionStore.save({\n * threadId: 'abc-123',\n * skill: 'kflow-generating-m',\n * workDir: '/tmp/workspace',\n * createdAt: new Date(),\n * lastActivityAt: new Date(),\n * });\n *\n * const session = await sessionStore.get('abc-123');\n * ```\n */\nexport class FirestoreSessionStore {\n private db: FirestoreDb;\n private collection: string;\n\n constructor(options: FirestoreSessionStoreOptions) {\n this.db = options.db;\n this.collection = options.collection ?? 'agent_sessions';\n }\n\n /**\n * Save a session.\n */\n async save(session: Session): Promise<void> {\n const now = new Date();\n\n const docData = {\n threadId: session.threadId,\n skill: session.skill,\n workDir: session.workDir,\n userId: session.userId,\n createdAt: session.createdAt,\n lastActivityAt: now,\n };\n\n await this.db.collection(this.collection).doc(session.threadId).set(docData);\n }\n\n /**\n * Get a session by thread ID.\n */\n async get(threadId: string): Promise<Session | null> {\n const doc = await this.db.collection(this.collection).doc(threadId).get();\n\n if (!doc.exists) {\n return null;\n }\n\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n }\n\n /**\n * Update session's last activity timestamp.\n */\n async touch(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).update({\n lastActivityAt: new Date(),\n });\n }\n\n /**\n * Delete a session.\n */\n async delete(threadId: string): Promise<void> {\n await this.db.collection(this.collection).doc(threadId).delete();\n }\n\n /**\n * List sessions, optionally filtered by user ID.\n */\n async list(options?: { userId?: string; limit?: number }): Promise<Session[]> {\n let query = this.db\n .collection(this.collection)\n .orderBy('lastActivityAt', 'desc');\n\n if (options?.userId) {\n query = query.where('userId', '==', options.userId);\n }\n\n const limit = options?.limit ?? 100;\n query = query.limit(limit);\n\n const snapshot = await query.get();\n\n return snapshot.docs.map((doc) => {\n const data = doc.data() as unknown as SessionDocument;\n return {\n threadId: data.threadId,\n skill: data.skill,\n workDir: data.workDir,\n userId: data.userId,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n lastActivityAt: data.lastActivityAt?.toDate?.() ?? new Date(data.lastActivityAt as unknown as string),\n };\n });\n }\n\n /**\n * Delete expired sessions (older than specified hours).\n */\n async deleteExpired(maxAgeHours: number = 24): Promise<number> {\n const cutoff = new Date(Date.now() - maxAgeHours * 60 * 60 * 1000);\n\n const snapshot = await this.db\n .collection(this.collection)\n .where('lastActivityAt', '<', cutoff)\n .get();\n\n const batch = this.db.batch();\n for (const doc of snapshot.docs) {\n batch.delete(doc.ref);\n }\n\n await batch.commit();\n return snapshot.size;\n }\n}\n","/**\n * Session Manager\n *\n * Unified session management API with pluggable persistence backends.\n * Supports in-memory (development) and Firestore (production) backends.\n */\n\nimport { MemorySaver } from '@langchain/langgraph';\nimport type { BaseCheckpointSaver } from '@langchain/langgraph-checkpoint';\n\nimport type { SessionMetadata, SessionRecord, PersistenceMode, Session } from '../persistence/types.js';\nimport { MemorySessionBackend } from '../persistence/memory-backend.js';\nimport { FirestoreCheckpointer, type FirestoreDb } from '../persistence/firestore-checkpointer.js';\nimport { FirestoreSessionStore } from '../persistence/firestore-session-store.js';\n\n// Re-export for convenience\nexport type { SessionMetadata, SessionRecord, PersistenceMode };\n\n// ============================================================================\n// Session Manager\n// ============================================================================\n\nexport interface SessionManagerOptions {\n /**\n * Persistence mode.\n * @default 'memory'\n */\n mode?: PersistenceMode;\n\n /**\n * Firestore database instance. Required when mode is 'firestore'.\n */\n firestoreDb?: FirestoreDb;\n}\n\n/**\n * Unified session management for agent sessions.\n *\n * Handles both session metadata and LangGraph checkpointers.\n */\nexport class SessionManager {\n private mode: PersistenceMode;\n private memoryBackend: MemorySessionBackend;\n private memoryCheckpointers: Map<string, MemorySaver>;\n private firestoreCheckpointer: FirestoreCheckpointer | null = null;\n private firestoreSessionStore: FirestoreSessionStore | null = null;\n\n constructor(options: SessionManagerOptions = {}) {\n this.mode = options.mode ?? 'memory';\n this.memoryBackend = new MemorySessionBackend();\n this.memoryCheckpointers = new Map();\n\n if (this.mode === 'firestore' && options.firestoreDb) {\n this.firestoreCheckpointer = new FirestoreCheckpointer({ db: options.firestoreDb });\n this.firestoreSessionStore = new FirestoreSessionStore({ db: options.firestoreDb });\n }\n }\n\n /**\n * Get the persistence mode.\n */\n getMode(): PersistenceMode {\n return this.mode;\n }\n\n /**\n * Get or create a checkpointer for a session.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n getCheckpointer(threadId: string): BaseCheckpointSaver<any> {\n if (this.mode === 'firestore' && this.firestoreCheckpointer) {\n return this.firestoreCheckpointer;\n }\n\n let checkpointer = this.memoryCheckpointers.get(threadId);\n if (!checkpointer) {\n checkpointer = new MemorySaver();\n this.memoryCheckpointers.set(threadId, checkpointer);\n }\n // Cast to BaseCheckpointSaver - MemorySaver may not implement all methods (e.g., deleteThread)\n return checkpointer as unknown as BaseCheckpointSaver<any>;\n }\n\n /**\n * Store session metadata.\n */\n store(threadId: string, metadata: SessionMetadata): void {\n // Always store in memory for sync access\n this.memoryBackend.store(threadId, metadata);\n\n // Also store in Firestore if that mode is active\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const session: Session = {\n threadId,\n skill: metadata.skill,\n workDir: metadata.workDir,\n createdAt: new Date(metadata.createdAt),\n lastActivityAt: new Date(metadata.lastActivityAt),\n };\n this.firestoreSessionStore.save(session).catch(console.error);\n }\n }\n\n /**\n * Get session metadata (sync, memory only).\n */\n get(threadId: string): SessionMetadata | undefined {\n return this.memoryBackend.get(threadId);\n }\n\n /**\n * Get session metadata (async, supports Firestore).\n */\n async getAsync(threadId: string): Promise<SessionMetadata | undefined> {\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const session = await this.firestoreSessionStore.get(threadId);\n if (!session) return undefined;\n return {\n skill: session.skill,\n workDir: session.workDir,\n createdAt: session.createdAt.getTime(),\n lastActivityAt: session.lastActivityAt.getTime(),\n };\n }\n return this.memoryBackend.get(threadId);\n }\n\n /**\n * Clear a session's checkpointer and metadata.\n */\n clear(threadId: string): boolean {\n if (this.mode === 'firestore') {\n this.firestoreCheckpointer?.deleteThread(threadId).catch(console.error);\n this.firestoreSessionStore?.delete(threadId).catch(console.error);\n this.memoryBackend.delete(threadId);\n return true;\n }\n this.memoryBackend.delete(threadId);\n return this.memoryCheckpointers.delete(threadId);\n }\n\n /**\n * List all sessions (sync, memory only).\n */\n list(): SessionRecord[] {\n return this.memoryBackend.list();\n }\n\n /**\n * List all sessions (async, supports Firestore).\n */\n async listAsync(): Promise<SessionRecord[]> {\n if (this.mode === 'firestore' && this.firestoreSessionStore) {\n const sessions = await this.firestoreSessionStore.list();\n return sessions.map((s) => ({\n threadId: s.threadId,\n skill: s.skill,\n workDir: s.workDir,\n createdAt: s.createdAt.getTime(),\n lastActivityAt: s.lastActivityAt.getTime(),\n }));\n }\n return this.memoryBackend.list();\n }\n}\n","/**\n * Interrupt Configuration\n *\n * Human-in-the-loop configuration for agent tools.\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Skill metadata (minimal interface for interrupt config).\n */\nexport interface SkillMeta {\n name: string;\n allowedTools?: string[];\n}\n\n// ============================================================================\n// Interrupt Configuration\n// ============================================================================\n\n/**\n * Default interrupt configuration for tools requiring human approval.\n * Using `true` means the tool requires approval with default options.\n */\nconst DEFAULT_INTERRUPT_CONFIG: Record<string, boolean> = {\n // Shell commands always require approval\n execute: true,\n};\n\n/**\n * Get interrupt configuration for a skill.\n *\n * Default: require approval for execute tool.\n * Skills can override via frontmatter (future enhancement).\n */\nexport function getInterruptConfig(_skill: SkillMeta): Record<string, boolean> {\n const config = { ...DEFAULT_INTERRUPT_CONFIG };\n return config;\n}\n","/**\n * Skill-Based DeepAgent Factory\n *\n * Creates DeepAgent instances that use skills as the primary prompt source.\n * No custom system prompts - all agent behavior is defined through skills.\n *\n * Uses deepagents library primitives:\n * - createDeepAgent() for agent creation\n * - FilesystemBackend for file operations\n *\n * Skill loading is injected via SkillLoader functions, keeping this package\n * independent of any specific skill registry location.\n */\n\nimport { createDeepAgent, FilesystemBackend } from 'deepagents';\nimport { Command } from '@langchain/langgraph';\nimport { v4 as uuid } from 'uuid';\n\nimport {\n createAnthropicClient,\n createDeepSeekClient,\n createOpenAIClient,\n ANTHROPIC_MODELS,\n DEEPSEEK_MODELS,\n OPENAI_MODELS,\n type LLMProvider,\n} from '@almadar/llm';\n\nimport {\n createExecuteTool,\n createFinishTaskTool,\n createValidateSchemaTool,\n createOrbitalSubagentTool,\n createSchemaChunkingTools,\n createDomainOrbitalTools,\n createGitHubToolsArray,\n type SubagentEventCallback,\n type OrbitalCompleteCallback,\n type DomainOrbitalCompleteCallback,\n} from '../tools/index.js';\n\nimport { SessionManager, type SessionMetadata } from './session-manager.js';\nimport { getInterruptConfig, type SkillMeta } from './interrupt-config.js';\n\n// Re-export Command for resume operations\nexport { Command };\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Skill definition loaded by the consumer.\n */\nexport interface Skill {\n name: string;\n description: string;\n content: string;\n allowedTools?: string[];\n version?: string;\n references: string[];\n path?: string;\n}\n\n/**\n * Function to load a skill by name.\n */\nexport type SkillLoader = (name: string) => Skill | null;\n\n/**\n * Function to load a skill reference by skill name and ref name.\n */\nexport type SkillRefLoader = (skillName: string, refName: string) => string | null;\n\n/**\n * Options for creating a skill agent.\n */\nexport interface SkillAgentOptions {\n /** Required: The skill(s) to use. Can be a single skill or array of skills. */\n skill: string | string[];\n /** Required: Working directory for the agent */\n workDir: string;\n /** Required: Function to load skills */\n skillLoader: SkillLoader;\n /** Optional: Function to load skill references */\n skillRefLoader?: SkillRefLoader;\n /** Optional: Thread ID for session continuity */\n threadId?: string;\n /** Optional: LLM provider */\n provider?: LLMProvider;\n /** Optional: Model name */\n model?: string;\n /** Optional: Enable verbose logging */\n verbose?: boolean;\n /** Optional: Disable human-in-the-loop interrupts (for eval/testing) */\n noInterrupt?: boolean;\n /** Optional: Callback for subagent events (orbital generation) */\n onSubagentEvent?: SubagentEventCallback;\n /** Optional: Session manager instance (shared across requests) */\n sessionManager?: SessionManager;\n /** Optional: Extracted requirements from analysis phase (for orbital skill) */\n requirements?: {\n entities?: string[];\n states?: string[];\n events?: string[];\n guards?: string[];\n pages?: string[];\n effects?: string[];\n rawRequirements?: string[];\n };\n /** Optional: GitHub integration configuration */\n githubConfig?: {\n /** GitHub personal access token */\n token: string;\n /** Repository owner (e.g., 'octocat') */\n owner?: string;\n /** Repository name (e.g., 'hello-world') */\n repo?: string;\n };\n}\n\n/**\n * Result from creating a skill agent.\n */\nexport interface SkillAgentResult {\n /** The agent instance (from deepagents library) */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n agent: any;\n /** Thread ID for session resumption */\n threadId: string;\n /** The loaded skill(s) - primary skill when single, all skills when multiple */\n skill: Skill;\n /** All loaded skills (same as skill when single) */\n skills: Skill[];\n /** Working directory */\n workDir: string;\n /** Orbital tool setter for wiring SSE callback (if orbital tool enabled) */\n setOrbitalEventCallback?: (callback: SubagentEventCallback) => void;\n /** Orbital tool setter for wiring persistence callback */\n setOrbitalCompleteCallback?: (callback: OrbitalCompleteCallback) => void;\n /** Domain orbital callback for lean skill Firestore persistence */\n setDomainCompleteCallback?: (callback: DomainOrbitalCompleteCallback) => void;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Base system prompt that provides core agent behavior.\n * Skill-specific instructions are appended to this.\n */\nconst BASE_SYSTEM_PROMPT = `You are a KFlow agent that helps users create and manage application schemas.\n\nYou have access to:\n- File operations (ls, read_file, write_file, edit_file) for managing files\n- Execute tool for running shell commands in your workspace\n\n## Guidelines\n\n1. **Plan First**: Think through the steps needed before executing\n2. **Work Incrementally**: Complete one step at a time, verify before moving on\n3. **Stay in Workspace**: All file operations are restricted to your workspace directory\n4. **Validate Often**: After generating schemas, validate them with orbital validate\n\n## Batch Repair Strategy (CRITICAL)\n\nWhen fixing validation errors:\n1. **Fix ALL errors at once**: Do not fix one by one. Read the validation report, identify all issues, and apply a single comprehensive fix.\n2. **Avoid Loops**: If you fix an error and it persists, STOP and rethink. Do not try the same fix twice.\n\n## ⛔ JSON FILE OPERATIONS (MANDATORY)\n\n**NEVER use \\`edit_file\\` on JSON files (schema.json, *.json).**\n\n\\`edit_file\\` on JSON causes:\n- Trailing comma errors\n- Missing bracket errors\n- Whitespace/newline corruption\n- Endless fix loops\n\n**ALWAYS use \\`write_file\\` to overwrite the ENTIRE JSON file.**\n\nWorkflow for JSON changes:\n1. Read the current file content\n2. Modify in memory (add/remove/change)\n3. Write the COMPLETE updated JSON with \\`write_file\\`\n\nThis applies to ALL JSON modifications - initial creation, adding pages, fixing errors.\n\n## Workspace\n\nYour workspace is a sandboxed directory. Use relative paths like:\n- ./schema.json (for the KFlow schema)\n- ./app (for the compiled application)\n\nAll paths are relative to your workspace root.`;\n\n// ============================================================================\n// LLM Client Factory\n// ============================================================================\n\n/**\n * Create LLM client based on provider.\n */\nfunction createLLMClient(\n provider: LLMProvider,\n model?: string,\n verbose?: boolean,\n) {\n const temperature = 0; // Deterministic for schema generation\n\n switch (provider) {\n case 'deepseek':\n if (verbose)\n console.log(`[SkillAgent] Using DeepSeek: ${model || DEEPSEEK_MODELS.CHAT}`);\n return createDeepSeekClient({\n model: model || DEEPSEEK_MODELS.CHAT,\n temperature,\n });\n\n case 'openai':\n if (verbose)\n console.log(`[SkillAgent] Using OpenAI: ${model || OPENAI_MODELS.GPT4O}`);\n return createOpenAIClient({\n model: model || OPENAI_MODELS.GPT4O,\n temperature,\n });\n\n case 'anthropic':\n default:\n if (verbose)\n console.log(`[SkillAgent] Using Anthropic: ${model || ANTHROPIC_MODELS.CLAUDE_SONNET_4_5}`);\n return createAnthropicClient({\n model: model || ANTHROPIC_MODELS.CLAUDE_SONNET_4_5,\n temperature,\n });\n }\n}\n\n// ============================================================================\n// Default Session Manager (singleton for backward compatibility)\n// ============================================================================\n\nlet defaultSessionManager: SessionManager | null = null;\n\nfunction getDefaultSessionManager(): SessionManager {\n if (!defaultSessionManager) {\n defaultSessionManager = new SessionManager();\n }\n return defaultSessionManager;\n}\n\n// ============================================================================\n// Skill Agent Factory\n// ============================================================================\n\n/**\n * Create a skill-based DeepAgent.\n *\n * Uses the specified skill's content as the system prompt.\n * When multiple skills are provided, the agent sees all skill descriptions\n * and can choose the appropriate one based on the user's request.\n *\n * @throws Error if any skill is not found\n */\nexport async function createSkillAgent(\n options: SkillAgentOptions,\n): Promise<SkillAgentResult> {\n const {\n skill: skillInput,\n workDir,\n threadId: providedThreadId,\n provider = 'anthropic',\n model,\n verbose = false,\n skillLoader,\n skillRefLoader,\n } = options;\n\n const sessions = options.sessionManager ?? getDefaultSessionManager();\n\n // 1. Normalize skill input to array\n const skillNames = Array.isArray(skillInput) ? skillInput : [skillInput];\n\n // 2. Load all skills (throws if any not found)\n const skills: Skill[] = [];\n for (const skillName of skillNames) {\n const skill = skillLoader(skillName);\n if (!skill) {\n throw new Error(\n `Skill not found: '${skillName}'. ` +\n `Run 'npm run skills:install ${skillName}' to install it, ` +\n `or 'npm run skills:list' to see available skills.`,\n );\n }\n skills.push(skill);\n\n if (verbose) {\n console.log(`[SkillAgent] Loading skill: ${skillName}`);\n console.log(`[SkillAgent] Description: ${skill.description}`);\n if (skill.allowedTools?.length) {\n console.log(`[SkillAgent] Allowed tools: ${skill.allowedTools.join(', ')}`);\n }\n }\n }\n\n // Primary skill is the first one (for backward compatibility)\n const primarySkill = skills[0];\n\n // 3. Load references for all skills\n const allReferences: string[] = [];\n if (skillRefLoader) {\n for (const skill of skills) {\n const refs = skill.references\n .map((ref) => {\n const content = skillRefLoader(skill.name, ref);\n if (content && verbose) {\n console.log(`[SkillAgent] Loaded reference: ${skill.name}/${ref}`);\n }\n return content;\n })\n .filter((ref): ref is string => ref !== null);\n allReferences.push(...refs);\n }\n }\n const references = allReferences.join('\\n\\n---\\n\\n');\n\n // 4. Assemble system prompt from skill(s)\n let skillInstructions: string;\n\n if (skills.length === 1) {\n skillInstructions = skills[0].content;\n } else {\n const skillSummaries = skills\n .map((s) => `- **${s.name}**: ${s.description}`)\n .join('\\n');\n\n const skillContents = skills\n .map((s) => `### Skill: ${s.name}\\n\\n${s.content}`)\n .join('\\n\\n---\\n\\n');\n\n skillInstructions = `## Available Skills\n\nYou have access to multiple skills. Choose the most appropriate one based on the user's request:\n\n${skillSummaries}\n\n**Selection Guidelines:**\n- Read the user's request carefully\n- Match the request to the skill that best fits (based on the descriptions above)\n- Follow that skill's instructions completely\n\n---\n\n${skillContents}`;\n }\n\n const systemPrompt = [\n BASE_SYSTEM_PROMPT,\n '\\n## Skill Instructions\\n\\n' + skillInstructions,\n references ? '\\n## Reference Documentation\\n\\n' + references : '',\n ]\n .filter(Boolean)\n .join('\\n');\n\n // 5. Generate or use provided thread ID\n const threadId = providedThreadId || uuid();\n\n // 6. Create LLM client\n const llmClient = createLLMClient(provider, model, verbose);\n\n // 7. Create filesystem backend with sandbox mode\n const backend = new FilesystemBackend({\n rootDir: workDir,\n virtualMode: true,\n });\n\n // 8. Create base tools\n const executeTool = createExecuteTool(workDir);\n const finishTaskTool = createFinishTaskTool(workDir);\n const validateSchemaTool = createValidateSchemaTool(workDir);\n\n // 9. Create optional orbital-specific tools\n const ORBITAL_SKILLS = ['kflow-orbitals', 'kflow-orbital-games', 'kflow-orbital-fixing'];\n const LEAN_SKILLS = ['kflow-lean-orbitals', 'kflow-lean-fixing'];\n const DESIGN_SKILLS = ['kflow-design', 'kflow-lean-design'];\n const isOrbitalSkill = primarySkill.name === 'kflow-orbitals';\n const isLeanSkill = LEAN_SKILLS.includes(primarySkill.name);\n const isDesignSkill = DESIGN_SKILLS.includes(primarySkill.name);\n const needsChunkingTools = ORBITAL_SKILLS.includes(primarySkill.name) || isDesignSkill;\n\n let orbitalTool: ReturnType<typeof createOrbitalSubagentTool>['tool'] | undefined;\n let setOrbitalEventCallback: ReturnType<typeof createOrbitalSubagentTool>['setEventCallback'] | undefined;\n let setOrbitalCompleteCallback: ReturnType<typeof createOrbitalSubagentTool>['setOrbitalCompleteCallback'] | undefined;\n\n let domainOrbitalTools: ReturnType<typeof createDomainOrbitalTools> | undefined;\n\n const chunkingTools = needsChunkingTools ? createSchemaChunkingTools(workDir) : null;\n\n if (isOrbitalSkill) {\n const orbitalResult = createOrbitalSubagentTool({\n requirements: options.requirements,\n });\n orbitalTool = orbitalResult.tool;\n setOrbitalEventCallback = orbitalResult.setEventCallback;\n setOrbitalCompleteCallback = orbitalResult.setOrbitalCompleteCallback;\n\n if (options.onSubagentEvent) {\n setOrbitalEventCallback(options.onSubagentEvent);\n }\n\n if (verbose) {\n console.log(`[SkillAgent] Orbital tools enabled for kflow-orbitals skill`);\n }\n }\n\n if (isLeanSkill) {\n domainOrbitalTools = createDomainOrbitalTools({ workDir });\n if (verbose) {\n console.log(`[SkillAgent] Domain orbital tools enabled for ${primarySkill.name} skill`);\n }\n }\n\n // Create GitHub tools if configuration is provided\n const githubTools = options.githubConfig\n ? createGitHubToolsArray({\n token: options.githubConfig.token,\n owner: options.githubConfig.owner,\n repo: options.githubConfig.repo,\n workDir,\n })\n : null;\n\n if (githubTools && verbose) {\n console.log(`[SkillAgent] GitHub tools enabled`);\n }\n\n // 10. Build tools array based on skill type\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tools: any[] = [\n executeTool,\n finishTaskTool,\n ...(isOrbitalSkill ? [] : [validateSchemaTool]),\n ...(orbitalTool ? [orbitalTool] : []),\n ...(domainOrbitalTools\n ? [\n domainOrbitalTools.generateOrbitalDomain,\n domainOrbitalTools.constructCombinedDomain,\n ]\n : []),\n ...(chunkingTools\n ? [\n chunkingTools.querySchemaStructure,\n chunkingTools.extractChunk,\n chunkingTools.applyChunk,\n ]\n : []),\n ...(githubTools || []),\n ];\n\n // 11. Get or create checkpointer\n const checkpointer = sessions.getCheckpointer(threadId);\n\n // 12. Get interrupt configuration\n const interruptConfig = options.noInterrupt\n ? undefined\n : getInterruptConfig(primarySkill as SkillMeta);\n\n // 13. Create agent with deepagents primitives\n const agent = createDeepAgent({\n model: llmClient.getModel(),\n systemPrompt,\n backend,\n tools,\n checkpointer,\n ...(interruptConfig && { interruptOn: interruptConfig }),\n });\n\n // 14. Store session metadata\n sessions.store(threadId, {\n skill: primarySkill.name,\n workDir,\n createdAt: Date.now(),\n lastActivityAt: Date.now(),\n });\n\n if (verbose) {\n const skillNamesStr = skillNames.join(', ');\n console.log(`[SkillAgent] Created agent with skill(s): ${skillNamesStr}, threadId: ${threadId}`);\n }\n\n const setDomainCompleteCallback = domainOrbitalTools?.setCompleteCallback;\n\n return {\n agent,\n threadId,\n skill: primarySkill,\n skills,\n workDir,\n setOrbitalEventCallback,\n setOrbitalCompleteCallback,\n setDomainCompleteCallback,\n };\n}\n\n/**\n * Resume a skill agent session.\n *\n * Loads the skill from session metadata and creates agent with same threadId.\n *\n * @throws Error if session not found\n */\nexport async function resumeSkillAgent(\n threadId: string,\n options: {\n verbose?: boolean;\n noInterrupt?: boolean;\n skillLoader: SkillLoader;\n skillRefLoader?: SkillRefLoader;\n sessionManager?: SessionManager;\n },\n): Promise<SkillAgentResult> {\n const sessions = options.sessionManager ?? getDefaultSessionManager();\n const metadata = sessions.get(threadId);\n if (!metadata) {\n throw new Error(\n `Session not found: '${threadId}'. ` +\n `The session may have expired or been cleared.`,\n );\n }\n\n // Update last activity\n metadata.lastActivityAt = Date.now();\n sessions.store(threadId, metadata);\n\n return createSkillAgent({\n skill: metadata.skill,\n workDir: metadata.workDir,\n threadId,\n verbose: options.verbose,\n noInterrupt: options.noInterrupt,\n skillLoader: options.skillLoader,\n skillRefLoader: options.skillRefLoader,\n sessionManager: sessions,\n });\n}\n","/**\n * Event Budget Configuration\n *\n * Prevents runaway agent loops with soft/hard event limits per skill.\n */\n\n// ============================================================================\n// Event Budget Configuration\n// ============================================================================\n\n/**\n * Event budget limits for different skills.\n * - soft: Warning threshold (agent reminded to finish up)\n * - hard: Maximum events before forced completion\n */\nexport const EVENT_BUDGETS: Record<string, { soft: number; hard: number }> = {\n // Generation skills - complex tasks\n 'kflow-generating-m': { soft: 40, hard: 60 },\n 'kflow-domain-generating': { soft: 40, hard: 60 },\n 'kflow-game-designer': { soft: 50, hard: 80 },\n\n // Editing skills - medium complexity\n 'kflow-editing-m': { soft: 30, hard: 50 },\n 'kflow-domain-editing': { soft: 30, hard: 50 },\n\n // Fixing skills - should be fast\n 'kflow-domain-fixing': { soft: 25, hard: 40 },\n 'kflow-validating': { soft: 15, hard: 25 },\n\n // Default for unknown skills\n default: { soft: 50, hard: 80 },\n};\n\n/**\n * Get event budget for a skill.\n */\nexport function getEventBudget(skillName: string): { soft: number; hard: number } {\n return EVENT_BUDGETS[skillName] || EVENT_BUDGETS['default'];\n}\n\n/**\n * Generate a budget warning message to inject into the agent.\n */\nexport function getBudgetWarningMessage(\n eventCount: number,\n budget: { soft: number; hard: number },\n): string | null {\n if (eventCount >= budget.hard) {\n return `⚠️ CRITICAL: You have reached your event budget (${budget.hard} events). You MUST complete now. Mark remaining todos complete and stop immediately.`;\n }\n if (eventCount >= budget.soft) {\n return `📊 Note: You are at ${eventCount}/${budget.hard} events. Please finish your current task efficiently. Avoid re-reading files or redundant validation.`;\n }\n return null;\n}\n"]}
|