@almadar/agent 1.3.1 → 1.3.3
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.d.ts +730 -2
- package/dist/agent/index.js +2057 -2
- package/dist/agent/index.js.map +1 -1
- package/dist/{firestore-checkpointer-CkNKXoun.d.ts → firestore-checkpointer-BkFR-sZM.d.ts} +1 -1
- package/dist/index.d.ts +767 -5
- package/dist/index.js +3311 -1801
- package/dist/index.js.map +1 -1
- package/dist/{index-BN4d3ObG.d.ts → interrupt-config-Bib_RCTB.d.ts} +2 -3
- package/dist/persistence/index.d.ts +2 -2
- package/package.json +4 -4
package/dist/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/orbitals/shared/constants.ts","../src/orbitals/shared/utils.ts","../src/orbitals/shared/index.ts","../src/orbitals/batch/prompt-assembler.ts","../src/orbitals/batch/concurrency.ts","../src/orbitals/batch/batch-generator.ts","../src/orbitals/batch/index.ts","../src/tools/orbital-batch-subagent.ts","../src/api-types.ts","../src/tools/execute.ts","../src/tools/validate-schema.ts","../src/tools/generate-schema.ts","../src/orbitals/combiner/index.ts","../src/orbitals/domain-language/index.ts","../src/orbitals/domain-language/prompts/odl-syntax.ts","../src/orbitals/domain-language/prompts/odl-examples.ts","../src/orbitals/domain-language/prompts/odl-patterns.ts","../src/orbitals/domain-language/prompts/odl-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/index.ts","../src/tools/trait-subagent.ts","../src/tools/combine-schemas.ts","../src/tools/schema-chunking.ts","../src/tools/github.ts","../src/prompts/system-prompt.ts","../src/subagents.ts","../src/events.ts","../src/context-compaction.ts","../src/metrics.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","../src/persistence/firestore-store.ts","../src/event-transformer/event-transformer.ts","../src/memory/memory-orbital.ts","../src/memory/MemoryManager.ts","../src/memory/PreferenceLearner.ts","../src/memory/agentic-search.ts","../src/observability.ts","../src/multi-user.ts","../src/state-sync.ts"],"names":["isEntityReference","getInlineEntity","getTraitName","getEntityName","buildContextSection","getFullOrbitalPrompt","init_prompt_assembler","resolve","asyncMapWithConcurrency","tool","LLMClient","z","path2","fs","execAsync","promisify","exec","path3","fs2","path4","getCacheStats","AgentDomainCategorySchema","path","files","path5","fss","isOrbitalDefinition","getArchitectureSection","getSchemaReference","getMinimalTypeReference","fs5","path6","uuid","createOrbitalBatchSubagentTool","toolCall"],"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 '@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 * Shared Constants for Orbital Generation\n *\n * Provider limits, defaults, and configuration constants.\n *\n * @packageDocumentation\n */\n\nimport type { LLMProvider } from '@almadar/llm';\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 openrouter: 5,\n};\n\n/**\n * Default batch sizes per provider (max orbitals per LLM call).\n */\nexport const PROVIDER_BATCH_SIZES: Record<LLMProvider, number> = {\n anthropic: 3, // Anthropic works well with 3 orbitals per call\n openai: 5, // OpenAI can handle more\n deepseek: 3, // Conservative for DeepSeek\n kimi: 3, // Conservative for Kimi\n openrouter: 5, // OpenRouter proxies multiple providers\n};\n\n// ============================================================================\n// Token Limits\n// ============================================================================\n\n/**\n * Maximum tokens for generation (across all providers).\n */\nexport const DEFAULT_MAX_TOKENS = 8192;\n\n/**\n * Maximum tokens for batch generation (higher for multi-orbital).\n */\nexport const BATCH_MAX_TOKENS = 12000;\n\n/**\n * Token buffer for prompt overhead.\n */\nexport const TOKEN_BUFFER = 1000;\n\n// ============================================================================\n// Retry Configuration\n// ============================================================================\n\n/**\n * Maximum retries for failed generation attempts.\n */\nexport const MAX_RETRIES = 2;\n\n/**\n * Delay between retries (ms).\n */\nexport const RETRY_DELAY_MS = 1000;\n\n// ============================================================================\n// Timing Configuration\n// ============================================================================\n\n/**\n * Timeout for single orbital generation (ms).\n */\nexport const SINGLE_GENERATION_TIMEOUT_MS = 120000; // 2 minutes\n\n/**\n * Timeout for batch generation (ms).\n */\nexport const BATCH_GENERATION_TIMEOUT_MS = 300000; // 5 minutes\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\n/**\n * Default LLM provider.\n */\nexport const DEFAULT_PROVIDER: LLMProvider = 'anthropic';\n\n/**\n * Default model for generation.\n */\nexport const DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\n/**\n * Default model for batch generation.\n */\nexport const DEFAULT_BATCH_MODEL = 'claude-sonnet-4-20250514';\n\n// ============================================================================\n// Cache Configuration\n// ============================================================================\n\n/**\n * Whether to enable prompt caching by default.\n */\nexport const DEFAULT_CACHE_ENABLED = true;\n\n/**\n * Cache TTL in milliseconds (1 hour).\n */\nexport const CACHE_TTL_MS = 60 * 60 * 1000;\n","/**\n * Shared Utilities for Orbital Generation\n *\n * Common utility functions used by both sequential and batch generation.\n *\n * @packageDocumentation\n */\n\nimport type { EntityRef, Entity } from '@almadar/core/types';\nimport { isEntityReference, getTraitName } from '@almadar/core/types';\nimport type { GenerationLog } from './types.js';\n\n// ============================================================================\n// Entity Helpers\n// ============================================================================\n\n/**\n * Get entity name safely from EntityRef.\n */\nexport function 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 */\nexport function getInlineEntity(entity: EntityRef): Entity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\n\n/**\n * Get persistence type for an entity.\n */\nexport function getEntityPersistence(entity: EntityRef): string {\n const inlineEntity = getInlineEntity(entity);\n return inlineEntity?.persistence || 'persistent';\n}\n\n/**\n * Get field names as comma-separated string.\n */\nexport function getFieldNames(entity: EntityRef): string {\n const inlineEntity = getInlineEntity(entity);\n if (!inlineEntity?.fields?.length) {\n return 'N/A';\n }\n return inlineEntity.fields.map((f: { name: string }) => f.name).join(', ');\n}\n\n// ============================================================================\n// Trait Helpers\n// ============================================================================\n\n/**\n * Get trait names from orbital traits array.\n */\nexport function getTraitNames(traits: Array<{ name: string } | string>): string {\n return traits.map(t => typeof t === 'string' ? t : getTraitName(t)).join(', ');\n}\n\n// ============================================================================\n// Logging Utilities\n// ============================================================================\n\n/**\n * Create a generation log entry.\n */\nexport function createLog(\n level: GenerationLog['level'],\n message: string,\n data?: Record<string, unknown>\n): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message,\n data,\n };\n}\n\n/**\n * Log with orbital context.\n */\nexport function createOrbitalLog(\n level: GenerationLog['level'],\n orbitalName: string,\n message: string,\n data?: Record<string, unknown>\n): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message: `[${orbitalName}] ${message}`,\n data: { orbitalName, ...data },\n };\n}\n\n// ============================================================================\n// Context Builders\n// ============================================================================\n\nimport type { OrbitalDefinition } from '@almadar/core/types';\n\n/**\n * Build context section from orbital's domainContext and design fields.\n */\nexport function 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 * Build cross-orbital connectivity section.\n */\nexport function buildConnectivitySection(orbital: OrbitalDefinition): string {\n const parts: string[] = [];\n\n if (orbital.emits?.length) {\n parts.push(`Emits: ${orbital.emits.join(', ')}`);\n }\n\n if (orbital.listens?.length) {\n parts.push(`Listens: ${orbital.listens.map(l => `${l.event}→${l.triggers}`).join(', ')}`);\n }\n\n return parts.join('\\n');\n}\n\n// ============================================================================\n// Validation Utilities\n// ============================================================================\n\n/**\n * Check if an orbital has all required fields.\n */\nexport function isValidOrbital(orbital: unknown): orbital is OrbitalDefinition {\n if (!orbital || typeof orbital !== 'object') {\n return false;\n }\n\n const o = orbital as Record<string, unknown>;\n\n // Required fields\n if (!o.name || typeof o.name !== 'string') {\n return false;\n }\n\n if (!o.entity) {\n return false;\n }\n\n // Entity must have name\n const entity = o.entity as Record<string, unknown>;\n if (!entity.name || typeof entity.name !== 'string') {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate a batch of orbitals.\n */\nexport function validateOrbitals(orbitals: unknown[]): {\n valid: OrbitalDefinition[];\n invalid: { index: number; reason: string }[];\n} {\n const valid: OrbitalDefinition[] = [];\n const invalid: { index: number; reason: string }[] = [];\n\n for (let i = 0; i < orbitals.length; i++) {\n const orbital = orbitals[i];\n if (isValidOrbital(orbital)) {\n valid.push(orbital);\n } else {\n invalid.push({\n index: i,\n reason: 'Missing required fields (name or entity.name)',\n });\n }\n }\n\n return { valid, invalid };\n}\n\n// ============================================================================\n// Array/Collection Utilities\n// ============================================================================\n\n/**\n * Chunk an array into smaller arrays.\n */\nexport function chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Group array items by a key function.\n */\nexport function groupBy<T, K>(array: T[], keyFn: (item: T) => K): Map<K, T[]> {\n const groups = new Map<K, T[]>();\n for (const item of array) {\n const key = keyFn(item);\n const existing = groups.get(key) || [];\n existing.push(item);\n groups.set(key, existing);\n }\n return groups;\n}\n\n/**\n * Async map with concurrency limit.\n */\nexport async function asyncMapWithConcurrency<T, R>(\n items: T[],\n mapper: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<R[]> {\n const results: R[] = [];\n const executing: Promise<void>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const promise = mapper(items[i], i).then(result => {\n results[i] = result;\n });\n executing.push(promise);\n\n if (executing.length >= concurrency) {\n await Promise.race(executing);\n executing.splice(executing.findIndex(p => p === promise), 1);\n }\n }\n\n await Promise.all(executing);\n return results;\n}\n\n// ============================================================================\n// Timing Utilities\n// ============================================================================\n\n/**\n * Measure execution time of an async function.\n */\nexport async function measureTime<T>(\n fn: () => Promise<T>\n): Promise<{ result: T; durationMs: number }> {\n const start = Date.now();\n const result = await fn();\n const durationMs = Date.now() - start;\n return { result, durationMs };\n}\n\n/**\n * Sleep for a specified duration.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// ============================================================================\n// Error Handling\n// ============================================================================\n\n/**\n * Get error message from unknown error.\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Check if error is a rate limit error.\n */\nexport function isRateLimitError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message.includes('rate limit') ||\n message.includes('too many requests') ||\n message.includes('429')\n );\n}\n\n/**\n * Check if error is a timeout error.\n */\nexport function isTimeoutError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message.includes('timeout') ||\n message.includes('timed out') ||\n message.includes('etimedout')\n );\n}\n","/**\n * Shared Utilities for Orbital Generation\n *\n * Common types, constants, and utilities used by both sequential\n * and batch generation modules.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport {\n // Core types\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n // Options\n type BaseGenerationOptions,\n type OrbitalGenerationOptions,\n type ParallelGenerationOptions,\n type BatchGenerationOptions,\n // Results\n type TokenUsage,\n type ValidationResult,\n type OrbitalGenerationResult,\n type ParallelGenerationResult,\n type BatchGenerationResult,\n // Decomposition\n type DecomposeOptions,\n type DecomposeResult,\n // Batch-specific\n type OrbitalBatch,\n type BatchProgressEvent,\n} from './types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nexport {\n PROVIDER_CONCURRENCY_LIMITS,\n PROVIDER_BATCH_SIZES,\n DEFAULT_MAX_TOKENS,\n BATCH_MAX_TOKENS,\n TOKEN_BUFFER,\n MAX_RETRIES,\n RETRY_DELAY_MS,\n SINGLE_GENERATION_TIMEOUT_MS,\n BATCH_GENERATION_TIMEOUT_MS,\n DEFAULT_PROVIDER,\n DEFAULT_MODEL,\n DEFAULT_BATCH_MODEL,\n DEFAULT_CACHE_ENABLED,\n CACHE_TTL_MS,\n} from './constants.js';\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nexport {\n // Entity helpers\n getEntityName,\n getInlineEntity,\n getEntityPersistence,\n getFieldNames,\n // Trait helpers\n getTraitNames,\n // Logging\n createLog,\n createOrbitalLog,\n // Context builders\n buildContextSection,\n buildConnectivitySection,\n // Validation\n isValidOrbital,\n validateOrbitals,\n // Array utilities\n chunkArray,\n groupBy,\n asyncMapWithConcurrency,\n // Timing\n measureTime,\n sleep,\n // Error handling\n getErrorMessage,\n isRateLimitError,\n isTimeoutError,\n} from './utils.js';\n","/**\n * Batch Prompt Assembler\n *\n * Assembles prompts for generating multiple orbitals in a single LLM call.\n * Optimized for:\n * - Context sharing (domain vocabulary, design style)\n * - Cross-orbital references (emits/listens wiring)\n * - Token efficiency (shared system context)\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport type { AssembledPrompt } from '../cache/index.js';\nimport { computeOrbitalFingerprint } from '../cache/index.js';\nimport { getFullOrbitalPrompt } from '@almadar/skills';\nimport {\n getEntityName,\n getFieldNames,\n buildContextSection,\n buildConnectivitySection,\n chunkArray,\n} from '../shared/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Assembled prompt for batch generation.\n */\nexport interface BatchAssembledPrompt extends AssembledPrompt {\n /** Number of orbitals in this batch */\n orbitalCount: number;\n /** Names of orbitals in this batch */\n orbitalNames: string[];\n}\n\n/**\n * Shared context extracted from a batch of orbitals.\n */\nexport interface SharedBatchContext {\n /** Domain vocabulary shared across orbitals */\n domainVocabulary?: Record<string, string>;\n /** Design style (minimal, modern, etc.) */\n designStyle?: string;\n /** Common patterns used */\n commonPatterns?: string[];\n /** Cross-orbital event relationships */\n eventRelationships?: Array<{\n emitter: string;\n event: string;\n listener: string;\n handler: string;\n }>;\n}\n\n// ============================================================================\n// Context Extraction\n// ============================================================================\n\n/**\n * Extract shared context from a batch of orbitals.\n */\nexport function extractSharedContext(orbitals: OrbitalDefinition[]): SharedBatchContext {\n const vocabulary: Record<string, string> = {};\n const styles = new Set<string>();\n const patterns = new Set<string>();\n const relationships: SharedBatchContext['eventRelationships'] = [];\n\n // Build vocabulary from all orbitals\n for (const orbital of orbitals) {\n if (orbital.domainContext?.vocabulary) {\n Object.assign(vocabulary, orbital.domainContext.vocabulary);\n }\n if (orbital.design?.style) {\n styles.add(orbital.design.style);\n }\n // Note: patterns are defined in traits, not at orbital level\n // This would need to be extracted from trait render-ui effects\n }\n\n // Build event relationships\n const orbitalMap = new Map(orbitals.map(o => [o.name, o]));\n \n for (const orbital of orbitals) {\n if (orbital.emits) {\n for (const event of orbital.emits) {\n // Find listeners for this event\n for (const other of orbitals) {\n if (other === orbital) continue;\n if (other.listens) {\n const listener = other.listens.find(l => l.event === event.event);\n if (listener) {\n relationships.push({\n emitter: orbital.name,\n event: event.event,\n listener: other.name,\n handler: listener.triggers,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n domainVocabulary: Object.keys(vocabulary).length > 0 ? vocabulary : undefined,\n designStyle: styles.size === 1 ? Array.from(styles)[0] : undefined,\n commonPatterns: patterns.size > 0 ? Array.from(patterns) : undefined,\n eventRelationships: relationships.length > 0 ? relationships : undefined,\n };\n}\n\n// ============================================================================\n// Batch Prompt Assembly\n// ============================================================================\n\n/**\n * Assemble a batch prompt for generating multiple orbitals in one call.\n *\n * @example\n * ```typescript\n * const batchPrompt = assembleBatchPrompt([\n * { name: \"Products\", entity: {...}, traits: [...] },\n * { name: \"Orders\", entity: {...}, traits: [...] },\n * { name: \"Customers\", entity: {...}, traits: [...] },\n * ]);\n * // Returns a single prompt that generates all 3 orbitals\n * ```\n */\nexport function assembleBatchPrompt(\n orbitals: OrbitalDefinition[],\n options: {\n baseSystemPrompt?: string;\n includeConnectivity?: boolean;\n } = {}\n): BatchAssembledPrompt {\n const {\n baseSystemPrompt = getFullOrbitalPrompt(),\n includeConnectivity = true,\n } = options;\n\n if (orbitals.length === 0) {\n throw new Error('Cannot assemble batch prompt for empty orbitals array');\n }\n\n // Extract shared context\n const sharedContext = extractSharedContext(orbitals);\n\n // Build batch header\n const batchHeader = buildBatchHeader(orbitals, sharedContext);\n\n // Build individual orbital sections\n const orbitalSections = orbitals.map((orbital, index) =>\n buildOrbitalSection(orbital, index + 1, orbitals.length, includeConnectivity)\n );\n\n // Build output format section\n const outputSection = buildOutputSection(orbitals);\n\n // Combine all sections\n const prompt = `${baseSystemPrompt}\n\n${'='.repeat(60)}\nBATCH GENERATION: ${orbitals.length} ORBITALS\n${'='.repeat(60)}\n\n${batchHeader}\n\n${orbitalSections.join('\\n\\n')}\n\n${outputSection}`;\n\n // Generate composite fingerprint\n const fingerprint = generateBatchFingerprint(orbitals);\n\n return {\n prompt,\n fingerprint,\n usedCachedTemplate: false, // Batch doesn't use templates yet\n orbitalCount: orbitals.length,\n orbitalNames: orbitals.map(o => o.name),\n };\n}\n\n/**\n * Build the batch header with shared context.\n */\nfunction buildBatchHeader(\n orbitals: OrbitalDefinition[],\n sharedContext: SharedBatchContext\n): string {\n const lines: string[] = [\n `## Batch Overview`,\n `- Total Orbitals: ${orbitals.length}`,\n `- Orbitals: ${orbitals.map(o => o.name).join(', ')}`,\n ];\n\n if (sharedContext.designStyle) {\n lines.push(`- Design Style: ${sharedContext.designStyle}`);\n }\n\n if (sharedContext.commonPatterns?.length) {\n lines.push(`- Common Patterns: ${sharedContext.commonPatterns.join(', ')}`);\n }\n\n if (sharedContext.domainVocabulary && Object.keys(sharedContext.domainVocabulary).length > 0) {\n lines.push(`\\n## Shared Domain Vocabulary`);\n for (const [term, definition] of Object.entries(sharedContext.domainVocabulary)) {\n lines.push(`- ${term}: ${definition}`);\n }\n }\n\n if (sharedContext.eventRelationships?.length) {\n lines.push(`\\n## Cross-Orbital Event Relationships`);\n for (const rel of sharedContext.eventRelationships) {\n lines.push(`- ${rel.emitter} emits \"${rel.event}\" → ${rel.listener} handles with \"${rel.handler}\"`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Build a section for a single orbital within the batch.\n */\nfunction buildOrbitalSection(\n orbital: OrbitalDefinition,\n index: number,\n total: number,\n includeConnectivity: boolean\n): string {\n const entityName = getEntityName(orbital.entity);\n const fieldNames = getFieldNames(orbital.entity);\n const contextSection = buildContextSection(orbital);\n const connectivitySection = includeConnectivity ? buildConnectivitySection(orbital) : '';\n\n return `---\n## ORBITAL ${index}/${total}: ${orbital.name}\n\n**Entity**: ${entityName}\n**Persistence**: ${(orbital.entity as { persistence?: string }).persistence || 'persistent'}\n**Fields**: ${fieldNames}\n**Traits**: ${orbital.traits.map(t => typeof t === 'string' ? t : 'ref' in t ? t.ref : t.name).join(', ')}\n${contextSection}${connectivitySection ? `**Connectivity**:\\n${connectivitySection}\\n` : ''}\nGenerate a complete FullOrbitalUnit for ${orbital.name} with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" 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${orbital.emits?.length ? '- PRESERVE emits: ' + orbital.emits.map(e => e.event).join(', ') : ''}\n${orbital.listens?.length ? '- PRESERVE listens: ' + orbital.listens.map(l => l.event).join(', ') : ''}`;\n}\n\n/**\n * Build the output format section.\n */\nfunction buildOutputSection(orbitals: OrbitalDefinition[]): string {\n return `---\n## OUTPUT FORMAT\n\nReturn a JSON object with this exact structure:\n\n\\`\\`\\`json\n{\n \"orbitals\": [\n${orbitals.map((o, i) => ` {\n \"name\": \"${o.name}\",\n // ... complete FullOrbitalUnit for ${o.name}\n }${i < orbitals.length - 1 ? ',' : ''}`).join('\\n')}\n ]\n}\n\\`\\`\\`\n\n**CRITICAL RULES:**\n1. Return a SINGLE JSON object with an \"orbitals\" array\n2. Each element in the array is a complete FullOrbitalUnit\n3. Maintain the order: ${orbitals.map(o => o.name).join(', ')}\n4. PRESERVE all emits/listens as specified in each orbital section\n5. Use shared domain vocabulary consistently across all orbitals\n6. Ensure cross-orbital event wiring is maintained\n`;\n}\n\n/**\n * Generate a composite fingerprint for the batch.\n */\nfunction generateBatchFingerprint(orbitals: OrbitalDefinition[]): string {\n const fingerprints = orbitals.map(o => computeOrbitalFingerprint(o));\n const combined = fingerprints.sort().join('|');\n \n // Simple hash of combined fingerprints\n let hash = 0;\n for (let i = 0; i < combined.length; i++) {\n const char = combined.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n \n return `batch:${orbitals.length}:${Math.abs(hash).toString(16).slice(0, 8)}`;\n}\n\n// ============================================================================\n// Batch Splitting\n// ============================================================================\n\n/**\n * Split orbitals into optimally-sized batches.\n *\n * Considers:\n * - Provider token limits\n * - Cross-orbital relationships (keeps related orbitals together)\n * - Batch size limits\n *\n * @example\n * ```typescript\n * const batches = splitIntoBatches(orbitals, {\n * maxBatchSize: 3,\n * provider: 'anthropic'\n * });\n * // Returns: [[orb1, orb2, orb3], [orb4, orb5], [orb6]]\n * ```\n */\nexport function splitIntoBatches(\n orbitals: OrbitalDefinition[],\n options: {\n maxBatchSize?: number;\n provider?: 'anthropic' | 'openai' | 'deepseek' | 'kimi' | 'openrouter';\n preserveRelationships?: boolean;\n } = {}\n): OrbitalDefinition[][] {\n const {\n maxBatchSize = 3,\n preserveRelationships = true,\n } = options;\n\n if (!preserveRelationships) {\n // Simple chunking without relationship preservation\n return chunkArray(orbitals, maxBatchSize);\n }\n\n // Group orbitals by relationship clusters\n const clusters = groupByRelationships(orbitals);\n \n // Split clusters into batches respecting maxBatchSize\n const batches: OrbitalDefinition[][] = [];\n \n for (const cluster of clusters) {\n if (cluster.length <= maxBatchSize) {\n // Cluster fits in one batch\n batches.push(cluster);\n } else {\n // Split large cluster\n batches.push(...chunkArray(cluster, maxBatchSize));\n }\n }\n\n return batches;\n}\n\n/**\n * Group orbitals into relationship clusters.\n * Orbitals that emit/listen to each other are grouped together.\n */\nfunction groupByRelationships(orbitals: OrbitalDefinition[]): OrbitalDefinition[][] {\n const visited = new Set<string>();\n const clusters: OrbitalDefinition[][] = [];\n\n // Build adjacency map\n const adjacency = new Map<string, Set<string>>();\n \n for (const orbital of orbitals) {\n if (!adjacency.has(orbital.name)) {\n adjacency.set(orbital.name, new Set());\n }\n\n // Add connections based on emits/listens\n if (orbital.emits) {\n for (const event of orbital.emits) {\n // Find listeners for this event\n for (const other of orbitals) {\n if (other === orbital) continue;\n if (other.listens?.some(l => l.event === event.event)) {\n adjacency.get(orbital.name)?.add(other.name);\n if (!adjacency.has(other.name)) {\n adjacency.set(other.name, new Set());\n }\n adjacency.get(other.name)?.add(orbital.name);\n }\n }\n }\n }\n }\n\n // Find connected components using DFS\n function dfs(orbital: OrbitalDefinition, cluster: OrbitalDefinition[]) {\n visited.add(orbital.name);\n cluster.push(orbital);\n\n const neighbors = adjacency.get(orbital.name) || new Set();\n for (const neighborName of neighbors) {\n if (!visited.has(neighborName)) {\n const neighbor = orbitals.find(o => o.name === neighborName);\n if (neighbor) {\n dfs(neighbor, cluster);\n }\n }\n }\n }\n\n // Find all clusters\n for (const orbital of orbitals) {\n if (!visited.has(orbital.name)) {\n const cluster: OrbitalDefinition[] = [];\n dfs(orbital, cluster);\n clusters.push(cluster);\n }\n }\n\n return clusters;\n}\n\n// ============================================================================\n// Token Estimation\n// ============================================================================\n\n/**\n * Estimate token count for a batch prompt.\n * Rough estimate: ~4 characters per token.\n */\nexport function estimateBatchTokens(orbitals: OrbitalDefinition[]): number {\n const baseTokens = 2000; // System prompt overhead\n const perOrbitalTokens = 800; // Average orbital description\n \n return baseTokens + (orbitals.length * perOrbitalTokens);\n}\n\n/**\n * Check if a batch will fit within token limits.\n */\nexport function willBatchFit(\n orbitals: OrbitalDefinition[],\n maxTokens: number = 12000\n): boolean {\n const estimated = estimateBatchTokens(orbitals);\n // Leave 50% buffer for response\n return estimated < (maxTokens * 0.5);\n}\n","/**\n * Concurrency Controller\n *\n * Semaphore-based concurrency control for parallel operations.\n *\n * @packageDocumentation\n */\n\nimport type { ConcurrencyController } from './types.js';\n\n/**\n * Create a semaphore-based concurrency controller.\n *\n * @example\n * ```typescript\n * const controller = createConcurrencyController(3); // Max 3 concurrent\n *\n * await controller.acquire(); // Acquire slot\n * try {\n * await doWork();\n * } finally {\n * controller.release(); // Release slot\n * }\n * ```\n */\nexport function createConcurrencyController(maxConcurrency: number): ConcurrencyController {\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n return {\n async acquire(): Promise<void> {\n if (activeCount < maxConcurrency) {\n activeCount++;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n queue.push(() => {\n activeCount++;\n resolve();\n });\n });\n },\n\n release(): void {\n activeCount = Math.max(0, activeCount - 1);\n const next = queue.shift();\n if (next) {\n next();\n }\n },\n\n get activeCount(): number {\n return activeCount;\n },\n\n get waitingCount(): number {\n return queue.length;\n },\n };\n}\n\n/**\n * Execute an array of async functions with concurrency control.\n *\n * @example\n * ```typescript\n * const results = await runWithConcurrency(\n * items.map(item => () => processItem(item)),\n * { concurrency: 3 }\n * );\n * ```\n */\nexport async function runWithConcurrency<T>(\n tasks: Array<() => Promise<T>>,\n options: { concurrency: number; onProgress?: (completed: number, total: number) => void }\n): Promise<T[]> {\n const { concurrency, onProgress } = options;\n const controller = createConcurrencyController(concurrency);\n const results: T[] = [];\n let completed = 0;\n\n await Promise.all(\n tasks.map(async (task, index) => {\n await controller.acquire();\n try {\n results[index] = await task();\n completed++;\n onProgress?.(completed, tasks.length);\n } finally {\n controller.release();\n }\n })\n );\n\n return results;\n}\n\n/**\n * Async map with concurrency limit.\n *\n * Similar to Promise.all() but with max concurrency.\n *\n * @example\n * ```typescript\n * const results = await asyncMapWithConcurrency(\n * items,\n * async (item, index) => process(item),\n * 3 // max 3 concurrent\n * );\n * ```\n */\nexport async function asyncMapWithConcurrency<T, R>(\n items: T[],\n mapper: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<R[]> {\n return runWithConcurrency(\n items.map((item, index) => () => mapper(item, index)),\n { concurrency }\n );\n}\n","/**\n * Batch Generator\n *\n * Core batch generation logic for generating multiple orbitals efficiently.\n * Supports multiple modes: single-call, parallel-individual, adaptive.\n *\n * @packageDocumentation\n */\n\nimport type { LLMClient } from '@almadar/llm';\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport {\n createLog,\n getErrorMessage,\n PROVIDER_CONCURRENCY_LIMITS,\n PROVIDER_BATCH_SIZES,\n BATCH_MAX_TOKENS,\n} from '../shared/index.js';\nimport type {\n GenerationLog,\n BatchGenerationOptions,\n BatchGenerationResult,\n BatchProgressEvent,\n SingleBatchResult,\n} from './types.js';\nimport { assembleBatchPrompt, splitIntoBatches, willBatchFit } from './prompt-assembler.js';\nimport { asyncMapWithConcurrency } from './concurrency.js';\n\n// ============================================================================\n// Main Batch Generation Function\n// ============================================================================\n\n/**\n * Generate multiple orbitals in optimized batches.\n *\n * This is the main entry point for batch generation. It:\n * 1. Splits orbitals into optimal batches\n * 2. Generates each batch (parallel or sequential)\n * 3. Combines results into final schema\n *\n * @example\n * ```typescript\n * const result = await generateOrbitalsBatch(client, [\n * { name: \"Products\", ... },\n * { name: \"Orders\", ... },\n * { name: \"Customers\", ... },\n * ], { mode: 'single-call', batchSize: 3 });\n *\n * console.log(`Generated ${result.summary.successful}/${result.summary.total} orbitals`);\n * console.log(`Total time: ${result.totalDurationMs}ms`);\n * ```\n */\nexport async function generateOrbitalsBatch(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n options: BatchGenerationOptions = {}\n): Promise<BatchGenerationResult> {\n const startTime = Date.now();\n const aggregateLogs: GenerationLog[] = [];\n \n const provider = client.getProvider();\n const mode = options.mode || 'single-call';\n const maxConcurrency = options.concurrency ?? PROVIDER_CONCURRENCY_LIMITS[provider];\n const maxBatchSize = options.batchSize ?? PROVIDER_BATCH_SIZES[provider];\n\n console.log(`[BatchGenerator] Starting batch generation: ${orbitals.length} orbitals, mode=${mode}, concurrency=${maxConcurrency}`);\n\n aggregateLogs.push(createLog('info', `Starting batch generation`, {\n totalOrbitals: orbitals.length,\n mode,\n provider,\n maxConcurrency,\n maxBatchSize,\n }));\n\n // Split into batches\n const batches = splitIntoBatches(orbitals, {\n maxBatchSize,\n provider,\n preserveRelationships: options.preserveRelationships ?? true,\n });\n\n console.log(`[BatchGenerator] Split into ${batches.length} batches: [${batches.map(b => b.length).join(', ')}]`);\n\n aggregateLogs.push(createLog('info', `Split into ${batches.length} batches`, {\n batchSizes: batches.map(b => b.length),\n }));\n\n // Emit batch start event\n options.onBatchProgress?.({\n type: 'batch_start',\n batchIndex: 0,\n totalBatches: batches.length,\n completedOrbitals: 0,\n totalOrbitals: orbitals.length,\n });\n\n // Generate batches based on mode\n let batchResults: SingleBatchResult[];\n \n if (mode === 'parallel-individual') {\n // Each orbital gets its own LLM call, but calls are parallel\n batchResults = await generateParallelIndividual(client, orbitals, {\n ...options,\n concurrency: maxConcurrency,\n onBatchProgress: options.onBatchProgress,\n });\n } else if (mode === 'single-call') {\n // Multiple orbitals per LLM call\n batchResults = await generateSingleCallBatches(client, batches, {\n ...options,\n concurrency: maxConcurrency,\n onBatchProgress: options.onBatchProgress,\n });\n } else {\n // Adaptive: use single-call if fits, otherwise parallel-individual\n batchResults = await generateAdaptive(client, orbitals, batches, {\n ...options,\n concurrency: maxConcurrency,\n maxBatchSize,\n onBatchProgress: options.onBatchProgress,\n });\n }\n\n const totalDurationMs = Date.now() - startTime;\n \n // Aggregate results\n const allResults = batchResults.flatMap(b => b.results);\n const successful = allResults.filter(r => r.success).length;\n const failed = allResults.length - successful;\n const totalTokens = batchResults.reduce(\n (sum, b) => sum + (b.usage?.totalTokens ?? 0),\n 0\n );\n\n console.log(`[BatchGenerator] Complete: ${successful}/${allResults.length} successful, ${totalTokens} tokens, ${totalDurationMs}ms`);\n\n aggregateLogs.push(createLog('info', `Batch generation completed`, {\n totalDurationMs,\n successful,\n failed,\n totalTokens,\n totalBatches: batches.length,\n }));\n\n // Emit completion event\n options.onBatchProgress?.({\n type: 'batch_complete',\n batchIndex: batches.length - 1,\n totalBatches: batches.length,\n completedOrbitals: successful,\n totalOrbitals: orbitals.length,\n });\n\n return {\n results: allResults.map(r => ({\n orbital: r.orbital,\n fingerprint: '', // TODO: compute from orbital\n usedTemplate: false,\n usage: undefined,\n validation: r.success\n ? { valid: true, errorCount: 0, warningCount: 0 }\n : { valid: false, errorCount: 1, warningCount: 0 },\n logs: [],\n })),\n totalDurationMs,\n aggregateLogs,\n summary: {\n total: allResults.length,\n successful,\n failed,\n totalTokens,\n },\n batchResults,\n totalBatches: batches.length,\n };\n}\n\n// ============================================================================\n// Generation Modes\n// ============================================================================\n\n/**\n * Generate using single-call batches (multiple orbitals per LLM call).\n */\nasync function generateSingleCallBatches(\n client: LLMClient,\n batches: OrbitalDefinition[][],\n options: BatchGenerationOptions & { concurrency: number }\n): Promise<SingleBatchResult[]> {\n let completedOrbitals = 0;\n const totalOrbitals = batches.reduce((sum, b) => sum + b.length, 0);\n\n return asyncMapWithConcurrency(\n batches,\n async (batch, batchIndex) => {\n return generateSingleBatch(client, batch, batchIndex, {\n ...options,\n onProgress: (completedInBatch) => {\n const newCompleted = completedOrbitals + completedInBatch;\n options.onBatchProgress?.({\n type: 'orbital_complete',\n batchIndex,\n totalBatches: batches.length,\n completedOrbitals: newCompleted,\n totalOrbitals,\n });\n completedOrbitals = newCompleted;\n },\n });\n },\n options.concurrency\n );\n}\n\n/**\n * Generate using parallel individual calls (one orbital per LLM call).\n */\nasync function generateParallelIndividual(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n options: BatchGenerationOptions & { concurrency: number }\n): Promise<SingleBatchResult[]> {\n // Create single-orbital batches\n const batches = orbitals.map(o => [o]);\n \n return generateSingleCallBatches(client, batches, {\n ...options,\n concurrency: options.concurrency,\n });\n}\n\n/**\n * Adaptive mode: choose best strategy based on orbitals.\n * \n * Strategy:\n * - If we can fit multiple orbitals per batch, use single-call batches\n * - This provides true speedup (one LLM call for 2-3 orbitals)\n */\nasync function generateAdaptive(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n batches: OrbitalDefinition[][],\n options: BatchGenerationOptions & { concurrency: number; maxBatchSize: number }\n): Promise<SingleBatchResult[]> {\n // Check if all batches can fit in single LLM calls\n const allFit = batches.every(batch => willBatchFit(batch, BATCH_MAX_TOKENS));\n \n // Use single-call batches if they fit and we have a reasonable number\n // This provides 2x+ speedup by generating multiple orbitals per LLM call\n if (allFit) {\n console.log(`[BatchGenerator] Adaptive: Using single-call batches (${batches.length} batches)`);\n return generateSingleCallBatches(client, batches, options);\n }\n \n // Fall back to parallel individual if batches are too large\n console.log(`[BatchGenerator] Adaptive: Using parallel-individual (batches too large)`);\n return generateParallelIndividual(client, orbitals, options);\n}\n\n// ============================================================================\n// Single Batch Generation\n// ============================================================================\n\n/**\n * Generate a single batch of orbitals.\n */\nasync function generateSingleBatch(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n batchIndex: number,\n options: BatchGenerationOptions & { onProgress?: (completed: number) => void }\n): Promise<SingleBatchResult> {\n const batchStartTime = Date.now();\n const logs: GenerationLog[] = [];\n\n console.log(`[BatchGenerator] Starting batch ${batchIndex + 1}: ${orbitals.map(o => o.name).join(', ')}`);\n\n logs.push(createLog('info', `Starting batch ${batchIndex + 1}`, {\n orbitalCount: orbitals.length,\n orbitals: orbitals.map(o => o.name),\n }));\n\n try {\n // Assemble batch prompt\n const batchPrompt = assembleBatchPrompt(orbitals);\n console.log(`[BatchGenerator] Batch ${batchIndex + 1} prompt assembled: ${batchPrompt.prompt.length} chars`);\n \n logs.push(createLog('info', `Batch prompt assembled`, {\n promptLength: batchPrompt.prompt.length,\n estimatedTokens: Math.ceil(batchPrompt.prompt.length / 4),\n }));\n\n // Make LLM call\n const llmResult = await client.callWithMetadata({\n systemPrompt: batchPrompt.prompt,\n userPrompt: 'Generate all orbitals in the batch. Return valid JSON matching the output format specified.',\n maxTokens: BATCH_MAX_TOKENS,\n skipSchemaValidation: true,\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: llmResult.usage?.promptTokens,\n completionTokens: llmResult.usage?.completionTokens,\n }));\n\n // Parse result\n const parsed = parseBatchResult(llmResult.data, orbitals);\n console.log(`[BatchGenerator] Batch ${batchIndex + 1} parsed: ${parsed.filter(p => p.success).length}/${parsed.length} successful`);\n \n // Report progress\n for (let i = 0; i < parsed.length; i++) {\n options.onProgress?.(i + 1);\n }\n\n const durationMs = Date.now() - batchStartTime;\n\n logs.push(createLog('info', `Batch ${batchIndex + 1} completed`, {\n durationMs,\n successful: parsed.filter(r => r.success).length,\n }));\n\n return {\n orbitals,\n results: parsed,\n usage: llmResult.usage ?? undefined,\n durationMs,\n logs,\n };\n\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n console.error(`[BatchGenerator] Batch ${batchIndex + 1} FAILED: ${errorMessage}`);\n \n logs.push(createLog('error', `Batch ${batchIndex + 1} failed`, {\n error: errorMessage,\n }));\n\n // Return failed results for all orbitals in batch\n return {\n orbitals,\n results: orbitals.map(o => ({\n orbital: o,\n success: false,\n error: errorMessage,\n })),\n durationMs: Date.now() - batchStartTime,\n logs,\n };\n }\n}\n\n// ============================================================================\n// Result Parsing\n// ============================================================================\n\n/**\n * Parse batch generation result.\n */\nfunction parseBatchResult(\n data: unknown,\n expectedOrbitals: OrbitalDefinition[]\n): Array<{ orbital: OrbitalDefinition; success: boolean; error?: string }> {\n if (!data || typeof data !== 'object') {\n return expectedOrbitals.map(o => ({\n orbital: o,\n success: false,\n error: 'Invalid response: expected object',\n }));\n }\n\n const obj = data as Record<string, unknown>;\n \n // Check for orbitals array\n if (!obj.orbitals || !Array.isArray(obj.orbitals)) {\n return expectedOrbitals.map(o => ({\n orbital: o,\n success: false,\n error: 'Invalid response: missing orbitals array',\n }));\n }\n\n const results = obj.orbitals as OrbitalDefinition[];\n \n // Match results to expected orbitals\n return expectedOrbitals.map((expected, index) => {\n const result = results[index];\n \n if (!result) {\n return {\n orbital: expected,\n success: false,\n error: `Missing result for orbital ${index + 1}`,\n };\n }\n\n // Basic validation\n if (!result.name) {\n return {\n orbital: expected,\n success: false,\n error: 'Generated orbital missing name',\n };\n }\n\n return {\n orbital: result,\n success: true,\n };\n });\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Estimate optimal batch configuration for a set of orbitals.\n */\nexport function estimateOptimalBatchConfig(\n orbitals: OrbitalDefinition[],\n provider: 'anthropic' | 'openai' | 'deepseek' | 'kimi' | 'openrouter'\n): {\n recommendedMode: 'single-call' | 'parallel-individual';\n optimalBatchSize: number;\n estimatedBatches: number;\n estimatedTimeSeconds: number;\n} {\n const defaultBatchSize = PROVIDER_BATCH_SIZES[provider];\n const concurrency = PROVIDER_CONCURRENCY_LIMITS[provider];\n \n // Check if single-call is feasible\n const canSingleCall = willBatchFit(orbitals, BATCH_MAX_TOKENS);\n \n if (canSingleCall && orbitals.length <= defaultBatchSize) {\n return {\n recommendedMode: 'single-call',\n optimalBatchSize: orbitals.length,\n estimatedBatches: 1,\n estimatedTimeSeconds: 60, // ~60s for single batch\n };\n }\n \n // Multiple batches needed\n const batchSize = defaultBatchSize;\n const numBatches = Math.ceil(orbitals.length / batchSize);\n const parallelBatches = Math.ceil(numBatches / concurrency);\n \n return {\n recommendedMode: 'single-call',\n optimalBatchSize: batchSize,\n estimatedBatches: numBatches,\n estimatedTimeSeconds: parallelBatches * 60,\n };\n}\n","/**\n * Batch Orbital Generation\n *\n * Efficient batch generation of multiple orbitals using:\n * - Single-call batch mode (multiple orbitals per LLM call)\n * - Parallel individual mode (concurrent single-orbital calls)\n * - Adaptive mode (automatically chooses best strategy)\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Core Generation\n// ============================================================================\n\nexport {\n generateOrbitalsBatch,\n estimateOptimalBatchConfig,\n} from './batch-generator.js';\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport {\n assembleBatchPrompt,\n splitIntoBatches,\n extractSharedContext,\n estimateBatchTokens,\n willBatchFit,\n type BatchAssembledPrompt,\n type SharedBatchContext,\n} from './prompt-assembler.js';\n\n// ============================================================================\n// Concurrency\n// ============================================================================\n\nexport {\n createConcurrencyController,\n runWithConcurrency,\n asyncMapWithConcurrency,\n} from './concurrency.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport {\n type BatchGenerationOptions,\n type BatchGenerationResult,\n type BatchProgressEvent,\n type SingleBatchResult,\n type ConcurrencyController,\n type BatchMode,\n type SingleCallBatchOptions,\n type ParallelIndividualOptions,\n type AdaptiveBatchOptions,\n} from './types.js';\n","/**\n * Orbital Batch Subagent Tool\n *\n * Tool for generating multiple orbitals in optimized batches.\n * Provides significant speedup (2x-3x) for multi-orbital generation.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport { LLMClient, type LLMProvider } from '@almadar/llm';\nimport type { SSEEventType } from '../api-types.js';\nimport {\n type ExtractedRequirements,\n createLog,\n PROVIDER_CONCURRENCY_LIMITS,\n} from '../orbitals/shared/index.js';\nimport {\n generateOrbitalsBatch,\n type BatchGenerationOptions,\n type BatchProgressEvent,\n} from '../orbitals/batch/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n// Note: This matches the signature from orbital-subagent.ts for compatibility\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 BatchCompleteCallback = (\n orbitals: OrbitalDefinition[],\n batchIndex: number,\n totalBatches: number,\n) => Promise<void> | void;\n\nexport interface OrbitalBatchSubagentToolOptions {\n onSubagentEvent?: SubagentEventCallback;\n onBatchComplete?: BatchCompleteCallback;\n requirements?: Partial<ExtractedRequirements>;\n provider?: LLMProvider;\n model?: string;\n workDir?: string;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst OrbitalBatchInputSchema = z.object({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n orbitals: z.array(z.any()).describe('Array of OrbitalUnits to generate'),\n options: z\n .object({\n mode: z.enum(['single-call', 'parallel-individual', 'adaptive']).optional().default('adaptive'),\n batchSize: z.number().optional(),\n maxConcurrency: z.number().optional(),\n preserveRelationships: z.boolean().optional().default(true),\n })\n .optional()\n .describe('Batch generation options'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for batch orbital generation with event streaming.\n */\nexport function createOrbitalBatchSubagentTool(options: OrbitalBatchSubagentToolOptions = {}) {\n let eventCallback: SubagentEventCallback | undefined = options.onSubagentEvent;\n let completeCallback: BatchCompleteCallback | undefined = options.onBatchComplete;\n const requirements = options.requirements;\n const workDir = options.workDir;\n\n const setEventCallback = (callback: SubagentEventCallback) => {\n eventCallback = callback;\n };\n\n const setBatchCompleteCallback = (callback: BatchCompleteCallback) => {\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 batchTool = tool(\n async ({ orbitals, options: batchOptions }) => {\n if (!orbitals || orbitals.length === 0) {\n return JSON.stringify({\n success: false,\n error: 'No orbitals provided for batch generation.',\n orbitals: [],\n });\n }\n\n console.log(`[OrbitalBatchSubagent] Starting batch generation for ${orbitals.length} orbitals`);\n\n try {\n emitEvent('batch', 0, 1, 'message', {\n content: `Starting batch generation for ${orbitals.length} orbitals`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent('batch', 0, 1, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status: 'pending' as const,\n })),\n });\n\n // Create LLM client\n const client = new LLMClient({\n provider: options.provider || 'anthropic',\n model: options.model || 'claude-sonnet-4-20250514',\n });\n\n // Prepare batch generation options\n const generationOptions: BatchGenerationOptions = {\n mode: batchOptions?.mode || 'adaptive',\n batchSize: batchOptions?.batchSize,\n concurrency: batchOptions?.maxConcurrency ?? PROVIDER_CONCURRENCY_LIMITS[client.getProvider()],\n preserveRelationships: batchOptions?.preserveRelationships ?? true,\n requirements,\n onBatchProgress: (event: BatchProgressEvent) => {\n // Update todo for orbital completion\n if (event.type === 'orbital_complete' && event.orbitalName) {\n emitEvent(event.orbitalName || 'batch', event.batchIndex, event.totalBatches, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status:\n o.name === event.orbitalName\n ? 'completed'\n : event.completedOrbitals > i\n ? 'completed'\n : 'pending',\n })),\n });\n }\n\n // Log progress\n emitEvent(event.orbitalName || 'batch', event.batchIndex, event.totalBatches, 'generation_log', {\n level: 'info',\n message: `Progress: ${event.completedOrbitals}/${event.totalOrbitals} orbitals complete`,\n data: {\n batchIndex: event.batchIndex,\n completedOrbitals: event.completedOrbitals,\n totalOrbitals: event.totalOrbitals,\n },\n });\n },\n };\n\n emitEvent('batch', 0, 1, 'tool_call', {\n tool: 'generateOrbitalsBatch',\n args: {\n orbitalCount: orbitals.length,\n mode: generationOptions.mode,\n concurrency: generationOptions.concurrency,\n },\n });\n\n // Execute batch generation\n const result = await generateOrbitalsBatch(client, orbitals, generationOptions);\n\n // Report completion\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status: result.batchResults.some(\n b => b.results.some(r => r.orbital.name === o.name && r.success)\n )\n ? 'completed'\n : 'failed',\n })),\n });\n\n // Extract generated orbitals\n const generatedOrbitals = result.results\n .filter(r => r.orbital)\n .map(r => r.orbital);\n\n const successCount = generatedOrbitals.length;\n const failedCount = orbitals.length - successCount;\n\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'message', {\n content: `Batch generation complete: ${successCount}/${orbitals.length} orbitals generated successfully`,\n role: 'assistant',\n isComplete: true,\n });\n\n // Persist orbitals if workDir provided\n if (workDir && completeCallback && generatedOrbitals.length > 0) {\n try {\n await completeCallback(generatedOrbitals, 0, 1);\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'generation_log', {\n level: 'info',\n message: `Persisted ${generatedOrbitals.length} orbitals`,\n });\n } catch (persistError) {\n console.error(`[OrbitalBatchSubagent] Failed to persist orbitals:`, persistError);\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'generation_log', {\n level: 'warn',\n message: 'Failed to persist some orbitals',\n data: { error: String(persistError) },\n });\n }\n }\n\n return JSON.stringify({\n success: successCount === orbitals.length,\n generated: successCount,\n failed: failedCount,\n total: orbitals.length,\n orbitals: generatedOrbitals,\n duration: result.totalDurationMs,\n totalTokens: result.summary.totalTokens,\n batches: result.totalBatches,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[OrbitalBatchSubagent] Batch generation failed:`, errorMessage);\n\n emitEvent('batch', 0, 1, 'error', {\n error: errorMessage,\n code: 'BATCH_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbitals: [],\n });\n }\n },\n {\n name: 'generate_orbitals_batch',\n description:\n 'Generate multiple orbitals in optimized batches. MUCH FASTER than calling generate_orbital multiple times. Use this when generating 3+ orbitals. Supports parallel generation with automatic concurrency control.',\n schema: OrbitalBatchInputSchema,\n },\n );\n\n return {\n tool: batchTool,\n setEventCallback,\n setBatchCompleteCallback,\n };\n}\n\n// ============================================================================\n// Re-export Types (avoid duplicates - use explicit renames if needed)\n// ============================================================================\n\n// Types already exported above, no need to re-export\n","/**\n * DeepAgent API Types\n *\n * Request/response types for the skills-only DeepAgent API.\n * All agent behavior is defined through skills - no custom prompts allowed.\n *\n * @packageDocumentation\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Request Schemas\n// ============================================================================\n\n/**\n * Extracted requirements schema - from analysis phase.\n * Used to provide more precise generation guidance.\n */\nexport const ExtractedRequirementsSchema = z.object({\n /** Entity names to create */\n entities: z.array(z.string()).optional().default([]),\n /** State names that should exist */\n states: z.array(z.string()).optional().default([]),\n /** Event/action names */\n events: z.array(z.string()).optional().default([]),\n /** Business rules (become guards) */\n guards: z.array(z.string()).optional().default([]),\n /** Page types needed */\n pages: z.array(z.string()).optional().default([]),\n /** Notifications/side-effects */\n effects: z.array(z.string()).optional().default([]),\n /** Raw requirement statements */\n rawRequirements: z.array(z.string()).optional().default([]),\n});\n\nexport type ExtractedRequirementsInput = z.infer<typeof ExtractedRequirementsSchema>;\n\n/**\n * Generate request schema - skills only, no custom prompts.\n */\nexport const GenerateRequestSchema = z\n .object({\n /** Required: The skill(s) to use for this generation */\n skill: z.union([\n z.string().min(1, 'Skill is required'),\n z.array(z.string().min(1)).min(1, 'At least one skill is required'),\n ]),\n\n /** The user's task/message */\n message: z.string().min(1, 'Message is required'),\n\n /** Optional: Thread ID for session continuity */\n threadId: z.string().uuid().optional(),\n\n /** Optional: Workspace directory (defaults to temp dir) */\n workspace: z.string().optional(),\n\n /** Optional: LLM provider */\n provider: z.enum(['anthropic', 'openai', 'deepseek', 'kimi', 'openrouter']).optional(),\n\n /** Optional: Model name */\n model: z.string().optional(),\n\n /** Optional: Disable human-in-the-loop interrupts (for eval/testing) */\n noInterrupt: z.boolean().optional(),\n\n /** Optional: App ID for persisting schema to Firestore */\n appId: z.string().optional(),\n\n /** Optional: Extracted requirements from analysis phase (for orbital skill) */\n requirements: ExtractedRequirementsSchema.optional(),\n\n /** Optional: GitHub integration configuration */\n github: z.object({\n /** GitHub personal access token */\n token: z.string().min(1, 'GitHub token is required'),\n /** Repository owner (e.g., 'octocat') */\n owner: z.string().optional(),\n /** Repository name (e.g., 'hello-world') */\n repo: z.string().optional(),\n }).optional(),\n })\n .strict();\n\nexport type GenerateRequest = z.infer<typeof GenerateRequestSchema>;\n\n/**\n * Resume request schema - for resuming after interrupt.\n */\nexport const ResumeRequestSchema = z.object({\n /** Required: Thread ID to resume */\n threadId: z.string().uuid(),\n\n /** Required: Decisions for pending interrupts */\n decisions: z.array(\n z.object({\n type: z.enum(['approve', 'edit', 'reject']),\n args: z.record(z.unknown()).optional(),\n })\n ),\n\n /** Optional: Approve all future actions */\n approveAll: z.boolean().optional(),\n});\n\nexport type ResumeRequest = z.infer<typeof ResumeRequestSchema>;\n\n/**\n * Decision type for interrupt responses.\n */\nexport interface Decision {\n type: 'approve' | 'edit' | 'reject';\n args?: Record<string, unknown>;\n}\n\n/**\n * Continue request schema - for multi-turn conversation.\n */\nexport const ContinueRequestSchema = z.object({\n /** Required: Thread ID to continue */\n threadId: z.string().uuid(),\n\n /** Required: Follow-up message */\n message: z.string().min(1, 'Message is required'),\n});\n\nexport type ContinueRequest = z.infer<typeof ContinueRequestSchema>;\n\n// ============================================================================\n// SSE Event Types\n// ============================================================================\n\n/**\n * All possible SSE event types.\n */\nexport type SSEEventType =\n | 'start'\n | 'message'\n | 'tool_call'\n | 'tool_result'\n | 'todo_update'\n | 'todo_detail'\n | 'file_operation'\n | 'schema_update'\n | 'generation_log'\n | 'subagent_event'\n | 'interrupt'\n | 'error'\n | 'complete'\n | 'cancelled'\n | 'app_created'\n | 'schema_phase_validated'\n | 'schema_phase_update'\n | 'orbital_added'\n | 'orbital_schema_complete'\n | 'changeset_recorded'\n | 'snapshot_created';\n\n/**\n * Base SSE event structure.\n */\nexport interface SSEEventBase {\n type: SSEEventType;\n timestamp: number;\n}\n\n/**\n * Start event - sent when streaming begins.\n */\nexport interface StartEvent extends SSEEventBase {\n type: 'start';\n data: {\n threadId: string;\n skill: string;\n workDir: string;\n };\n}\n\n/**\n * Message event - agent text output.\n */\nexport interface MessageEvent extends SSEEventBase {\n type: 'message';\n data: {\n content: string;\n role: 'assistant' | 'user' | 'system';\n isComplete: boolean;\n };\n}\n\n/**\n * Tool call event - when agent invokes a tool.\n */\nexport interface ToolCallEvent extends SSEEventBase {\n type: 'tool_call';\n data: {\n tool: string;\n args: Record<string, unknown>;\n };\n}\n\n/**\n * Tool result event - tool execution result.\n */\nexport interface ToolResultEvent extends SSEEventBase {\n type: 'tool_result';\n data: {\n tool: string;\n result: unknown;\n success: boolean;\n };\n}\n\n/**\n * Todo update event - task progress.\n */\nexport interface TodoUpdateEvent extends SSEEventBase {\n type: 'todo_update';\n data: {\n todos: Array<{\n id: string;\n task: string;\n status: 'pending' | 'in_progress' | 'completed';\n }>;\n };\n}\n\n/**\n * Activity type for todo details.\n */\nexport type TodoActivityType = 'thinking' | 'tool_call' | 'tool_result' | 'code_change';\n\n/**\n * Todo detail event - shows LLM activity for a specific todo.\n */\nexport interface TodoDetailEvent extends SSEEventBase {\n type: 'todo_detail';\n data: {\n todoId: string;\n activityType: TodoActivityType;\n content: string;\n tool?: string;\n args?: Record<string, unknown>;\n success?: boolean;\n filePath?: string;\n diff?: string;\n };\n}\n\n/**\n * File operation event.\n */\nexport interface FileOperationEvent extends SSEEventBase {\n type: 'file_operation';\n data: {\n operation: 'ls' | 'read_file' | 'write_file' | 'edit_file';\n path: string;\n success: boolean;\n };\n}\n\n/**\n * Schema update event.\n */\nexport interface SchemaUpdateEvent extends SSEEventBase {\n type: 'schema_update';\n data: {\n appId: string;\n version: number;\n schema: Record<string, unknown>;\n isNew: boolean;\n snapshotId?: string;\n changesetId?: string;\n };\n}\n\n/**\n * Generation log event.\n */\nexport interface GenerationLogEvent extends SSEEventBase {\n type: 'generation_log';\n data: {\n level: 'info' | 'warn' | 'error' | 'debug';\n message: string;\n data?: Record<string, unknown>;\n orbitalName?: string;\n };\n}\n\n/**\n * Interrupt event - awaiting human decision.\n */\nexport interface InterruptEvent extends SSEEventBase {\n type: 'interrupt';\n data: {\n threadId: string;\n actionRequests: Array<{\n tool: string;\n args: Record<string, unknown>;\n allowedDecisions: ('approve' | 'edit' | 'reject')[];\n description?: string;\n }>;\n };\n}\n\n/**\n * Error event.\n */\nexport interface ErrorEvent extends SSEEventBase {\n type: 'error';\n data: {\n error: string;\n code?: string;\n };\n}\n\n/**\n * Cancelled event.\n */\nexport interface CancelledEvent extends SSEEventBase {\n type: 'cancelled';\n data: {\n threadId: string;\n message: string;\n };\n}\n\n/**\n * Complete event - when generation finishes.\n */\nexport interface CompleteEvent extends SSEEventBase {\n type: 'complete';\n data: {\n threadId: string;\n skill: string;\n workDir: string;\n schemaGenerated: boolean;\n appCompiled: boolean;\n schema?: Record<string, unknown>;\n appId?: string;\n schemaPersisted?: boolean;\n snapshotId?: string;\n changesetId?: string;\n };\n}\n\n/**\n * Subagent event - forwards events from nested agent.\n */\nexport interface SubagentEvent extends SSEEventBase {\n type: 'subagent_event';\n data: {\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 };\n}\n\n/**\n * App created event.\n */\nexport interface AppCreatedEvent extends SSEEventBase {\n type: 'app_created';\n data: {\n appId: string;\n name?: string;\n orbitalCount?: number;\n fromOrbitalPersistence?: boolean;\n };\n}\n\n/**\n * Schema phase validated event.\n */\nexport interface SchemaPhaseValidatedEvent extends SSEEventBase {\n type: 'schema_phase_validated';\n data: {\n appId: string;\n success: boolean;\n errors?: unknown[];\n };\n}\n\n/**\n * Schema phase update event.\n */\nexport interface SchemaPhaseUpdateEvent extends SSEEventBase {\n type: 'schema_phase_update';\n data: Record<string, unknown>;\n}\n\n/**\n * Orbital added event.\n */\nexport interface OrbitalAddedEvent extends SSEEventBase {\n type: 'orbital_added';\n data: {\n appId: string;\n orbitalName: string;\n orbitalIndex: number;\n totalOrbitals: number;\n isNew?: boolean;\n orbitalSchema?: Record<string, unknown>;\n };\n}\n\n/**\n * Orbital schema complete event.\n */\nexport interface OrbitalSchemaCompleteEvent extends SSEEventBase {\n type: 'orbital_schema_complete';\n data: {\n appId: string;\n totalOrbitals: number;\n orbitalNames: string[];\n };\n}\n\n/**\n * Changeset recorded event.\n */\nexport interface ChangesetRecordedEvent extends SSEEventBase {\n type: 'changeset_recorded';\n data: {\n appId: string;\n changesetId: string;\n version: number;\n trackingMode: 'initial' | 'update';\n summary: {\n added: number;\n modified: number;\n removed: number;\n };\n source?: string;\n };\n}\n\n/**\n * Snapshot created event.\n */\nexport interface SnapshotCreatedEvent extends SSEEventBase {\n type: 'snapshot_created';\n data: {\n appId: string;\n snapshotId: string;\n version: number;\n reason: string;\n };\n}\n\n/**\n * Union of all SSE event types.\n */\nexport type SSEEvent =\n | StartEvent\n | MessageEvent\n | ToolCallEvent\n | ToolResultEvent\n | TodoUpdateEvent\n | TodoDetailEvent\n | FileOperationEvent\n | SchemaUpdateEvent\n | GenerationLogEvent\n | SubagentEvent\n | InterruptEvent\n | ErrorEvent\n | CancelledEvent\n | CompleteEvent\n | AppCreatedEvent\n | SchemaPhaseValidatedEvent\n | SchemaPhaseUpdateEvent\n | OrbitalAddedEvent\n | OrbitalSchemaCompleteEvent\n | ChangesetRecordedEvent\n | SnapshotCreatedEvent;\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\n/**\n * List skills response.\n */\nexport interface ListSkillsResponse {\n available: Array<{\n name: string;\n description: string;\n allowedTools?: string[];\n }>;\n installed: Array<{\n name: string;\n description: string;\n allowedTools?: string[];\n }>;\n}\n\n/**\n * Session info response.\n */\nexport interface SessionInfo {\n threadId: string;\n skill: string;\n workDir: string;\n createdAt: number;\n lastActivityAt: number;\n}\n\n/**\n * List sessions response.\n */\nexport interface ListSessionsResponse {\n sessions: SessionInfo[];\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create an SSE event with timestamp.\n */\nexport function createSSEEvent<T extends SSEEventType>(\n type: T,\n data: Extract<SSEEvent, { type: T }>['data']\n): Extract<SSEEvent, { type: T }> {\n return {\n type,\n data,\n timestamp: Date.now(),\n } as Extract<SSEEvent, { type: T }>;\n}\n\n/**\n * Format an SSE event for transmission.\n */\nexport function formatSSEEvent(event: SSEEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n}\n\n/**\n * Parse an SSE event from a data string.\n */\nexport function parseSSEEvent(data: string): SSEEvent {\n return JSON.parse(data) as SSEEvent;\n}\n\n/**\n * Type guard for SSE start events.\n */\nexport function isSSEStartEvent(event: SSEEvent): event is StartEvent {\n return event.type === 'start';\n}\n\n/**\n * Type guard for SSE message events.\n */\nexport function isSSEMessageEvent(event: SSEEvent): event is MessageEvent {\n return event.type === 'message';\n}\n\n/**\n * Type guard for SSE interrupt events.\n */\nexport function isSSEInterruptEvent(event: SSEEvent): event is InterruptEvent {\n return event.type === 'interrupt';\n}\n\n/**\n * Type guard for SSE complete events.\n */\nexport function isSSECompleteEvent(event: SSEEvent): event is CompleteEvent {\n return event.type === 'complete';\n}\n\n/**\n * Type guard for SSE error events.\n */\nexport function isSSEErrorEvent(event: SSEEvent): event is ErrorEvent {\n return event.type === 'error';\n}\n\n/**\n * Type guard for SSE tool call events.\n */\nexport function isSSEToolCallEvent(event: SSEEvent): event is ToolCallEvent {\n return event.type === 'tool_call';\n}\n\n/**\n * Type guard for SSE todo update events.\n */\nexport function isSSETodoUpdateEvent(event: SSEEvent): event is TodoUpdateEvent {\n return event.type === 'todo_update';\n}\n\n/**\n * Type guard for SSE todo detail events.\n */\nexport function isSSETodoDetailEvent(event: SSEEvent): event is TodoDetailEvent {\n return event.type === 'todo_detail';\n}\n\n/**\n * Type guard for SSE subagent events.\n */\nexport function isSSESubagentEvent(event: SSEEvent): event is SubagentEvent {\n return event.type === 'subagent_event';\n}\n\n/**\n * Type guard for SSE generation log events.\n */\nexport function isSSEGenerationLogEvent(event: SSEEvent): event is GenerationLogEvent {\n return event.type === 'generation_log';\n}\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 Module\n *\n * MIGRATED: The core domain language engine has been moved to @almadar/core.\n * This file re-exports everything from the core package for backward compatibility.\n * Only agent-specific modules (prompts) remain here.\n */\n\n// Core domain language engine (types, lexer, parsers, formatters, sync, registry)\nexport * from '@almadar/core/domain-language';\n\n// Agent-specific: LLM prompt templates for domain language generation\nexport * from './prompts/index.js';\n","/**\n * Domain Language Syntax Reference\n *\n * Complete syntax reference for the Orbital Domain Language.\n *\n * @packageDocumentation\n */\n\nexport const ODL_SYNTAX_REFERENCE = `\n## Domain Language Syntax\n\n### Entity Definition\n\n\\`\\`\\`\nA [EntityName] is a [persistence] entity that:\n - has [fieldName] as [type] (required|optional)\n - has [fieldName] as [type] with default [value]\n - belongs to [RelatedEntity]\n - belongs to [RelatedEntity] as [alias]\n - has many [RelatedEntity]s\n\\`\\`\\`\n\n**Persistence types:**\n- \\`persistent\\` - Stored in database (default)\n- \\`runtime\\` - Memory only, for games/UI state\n- \\`singleton\\` - Single instance, for config\n\n**Field types:**\n- \\`text\\` / \\`long text\\` - String fields\n- \\`number\\` / \\`currency\\` - Numeric fields\n- \\`yes/no\\` - Boolean fields\n- \\`date\\` / \\`timestamp\\` / \\`datetime\\` - Date fields\n- \\`enum [val1, val2]\\` - Enumeration\n- \\`list\\` / \\`object\\` - Complex types\n\n### Page Definition\n\n\\`\\`\\`\n[PageName] at /[path]:\n - shows [Entity] using [TraitName]\n - view type: [list|detail|create|edit|dashboard]\n - is initial page\n\\`\\`\\`\n\n### Behavior Definition\n\n\\`\\`\\`\n[BehaviorName] behavior:\n States: [State1], [State2], [State3]\n Initial: [State1]\n\n Transitions:\n - From [State1] to [State2] on [EVENT_NAME]\n if [guard condition]\n then [effect1]\n then [effect2]\n\\`\\`\\`\n\n### Section Headers\n\nDomain Language text is organized into sections:\n\n\\`\\`\\`\n# Entities\n[entity definitions]\n\n# Pages\n[page definitions]\n\n# Behaviors\n[behavior/trait definitions]\n\\`\\`\\`\n`;\n","/**\n * Domain Language Examples\n *\n * Complete examples of Domain Language for common patterns.\n *\n * @packageDocumentation\n */\n\nexport const ODL_EXAMPLES = `\n## Complete Example\n\n### Entity\n\n\\`\\`\\`\nA Task is a persistent entity that:\n - has title as text (required)\n - has description as long text\n - has status as enum [todo, in_progress, done] with default \"todo\"\n - has dueDate as date\n - belongs to User as assignee\n - belongs to Project\n\\`\\`\\`\n\n### Page\n\n\\`\\`\\`\nTasksPage at /tasks:\n - shows Task using TaskManagement\n - view type: list\n - is initial page\n\\`\\`\\`\n\n### Behavior\n\n\\`\\`\\`\nTaskManagement behavior:\n States: Viewing, Editing, Creating\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then render page-header to main with title 'Tasks'\n then render entity-table to center for Task\n\n - From Viewing to Editing on EDIT_TASK\n then render form-section to modal for Task\n\n - From Editing to Viewing on SAVE_TASK\n then persist update Task\n then render null to modal\n then emit TASK_UPDATED\n\\`\\`\\`\n\n## Multi-Entity Example\n\n\\`\\`\\`\n# Entities\n\nA User is a persistent entity that:\n - has name as text (required)\n - has email as text (required)\n - has role as enum [admin, user, guest] with default \"user\"\n\nA Project is a persistent entity that:\n - has name as text (required)\n - has description as long text\n - has status as enum [active, archived] with default \"active\"\n - belongs to User as owner\n\nA Task is a persistent entity that:\n - has title as text (required)\n - has status as enum [todo, in_progress, done] with default \"todo\"\n - has priority as number with default 0\n - belongs to Project\n - belongs to User as assignee\n\n# Pages\n\nProjectsPage at /projects:\n - shows Project using ProjectManagement\n - view type: list\n - is initial page\n\nTasksPage at /projects/:projectId/tasks:\n - shows Task using TaskManagement\n - view type: list\n\n# Behaviors\n\nProjectManagement behavior:\n States: List, Detail\n Initial: List\n\n Transitions:\n - From List to List on INIT\n then render entity-table to main for Project\n\n - From List to Detail on VIEW_PROJECT\n then render entity-detail to drawer for Project\n\nTaskManagement behavior:\n States: Viewing, Editing\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then [\"render-ui\", \"main\", {\"type\": \"entity-table\", \"entity\": \"Task\", \"itemActions\": [{\"label\": \"Edit\", \"event\": \"EDIT_TASK\"}, {\"label\": \"Delete\", \"event\": \"DELETE_TASK\", \"variant\": \"danger\"}]}]\n\n - From Viewing to Editing on EDIT_TASK\n then render form-section to modal for Task\n\n - From Editing to Viewing on SAVE_TASK\n then persist update Task\n then render null to modal\n\\`\\`\\`\n\n## Dashboard Example (Complex Patterns)\n\n\\`\\`\\`\nDashboard behavior:\n States: Viewing\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then render page-header to main with title 'Dashboard'\n then [\"render-ui\", \"center\", {\"type\": \"stats\", \"metrics\": [{\"field\": \"totalTasks\", \"label\": \"Total Tasks\"}, {\"field\": \"completedTasks\", \"label\": \"Completed\"}, {\"field\": \"overdueTasks\", \"label\": \"Overdue\"}]}]\n then [\"render-ui\", \"bottom\", {\"type\": \"tabs\", \"tabs\": [{\"id\": \"overview\", \"label\": \"Overview\", \"event\": \"VIEW_OVERVIEW\"}, {\"id\": \"recent\", \"label\": \"Recent Activity\", \"event\": \"VIEW_RECENT\"}]}]\n\\`\\`\\`\n\n**Note**: Use inline JSON for \\`render-ui\\` effects with complex props (metrics, tabs, itemActions, cells).\n`;\n","/**\n * Domain Language Common Patterns\n *\n * Reusable patterns for common application types.\n *\n * @packageDocumentation\n */\n\nexport const ODL_PATTERNS = `\n## Common Patterns\n\n### CRUD Pattern\n\n\\`\\`\\`\n[Entity]Management behavior:\n States: List, Detail, Create, Edit\n Initial: List\n\n Transitions:\n - From List to List on INIT\n then render entity-table to main for [Entity]\n\n - From List to Create on CREATE_[ENTITY]\n then render form-section to modal for [Entity]\n\n - From Create to List on SUBMIT_CREATE\n then persist create [Entity]\n then render null to modal\n\n - From List to Detail on VIEW_[ENTITY]\n then render entity-detail to drawer for [Entity]\n\n - From Detail to Edit on EDIT_[ENTITY]\n then render form-section to modal for [Entity]\n\n - From Edit to Detail on SUBMIT_EDIT\n then persist update [Entity]\n then render null to modal\n\n - From Detail to List on DELETE_[ENTITY]\n then persist delete [Entity]\n then render null to drawer\n\\`\\`\\`\n\n### Game Health Pattern\n\n\\`\\`\\`\nHealth behavior:\n States: Healthy, Wounded, Critical, Dead\n Initial: Healthy\n\n Transitions:\n - From Healthy to Wounded on TAKE_DAMAGE\n if health >= 30 and health < 70\n then update status to 'wounded'\n\n - From Wounded to Critical on TAKE_DAMAGE\n if health < 30\n then update status to 'critical'\n\n - From Critical to Dead on TAKE_DAMAGE\n if health <= 0\n then update isAlive to false\n then emit ENTITY_DIED\n\\`\\`\\`\n\n### Approval Workflow Pattern\n\n\\`\\`\\`\nApprovalWorkflow behavior:\n States: Draft, Pending, Approved, Rejected\n Initial: Draft\n\n Transitions:\n - From Draft to Pending on SUBMIT\n then update status to 'pending'\n then emit APPROVAL_REQUESTED\n\n - From Pending to Approved on APPROVE\n then update status to 'approved'\n then update approvedAt to now\n then emit APPROVAL_GRANTED\n\n - From Pending to Rejected on REJECT\n then update status to 'rejected'\n then emit APPROVAL_DENIED\n\n - From Rejected to Draft on REVISE\n then update status to 'draft'\n\\`\\`\\`\n\n### Form Validation Pattern\n\n\\`\\`\\`\nFormValidation behavior:\n States: Idle, Validating, Valid, Invalid\n Initial: Idle\n\n Transitions:\n - From Idle to Validating on VALIDATE\n then update isValidating to true\n\n - From Validating to Valid on VALIDATION_SUCCESS\n then update isValidating to false\n then update errors to null\n\n - From Validating to Invalid on VALIDATION_FAILED\n then update isValidating to false\n\n - From Invalid to Validating on VALIDATE\n then update isValidating to true\n\n - From Valid to Idle on RESET\n then update errors to null\n\\`\\`\\`\n\n### Dashboard Pattern\n\n\\`\\`\\`\nDashboardView behavior:\n States: Loading, Ready\n Initial: Loading\n\n Transitions:\n - From Loading to Ready on DATA_LOADED\n then render stats to main\n then render entity-cards to center\n\n - From Ready to Loading on REFRESH\n then emit FETCH_DASHBOARD_DATA\n\\`\\`\\`\n`;\n","/**\n * Domain Language to OrbitalSchema Mapping\n *\n * Reference for how Domain Language maps to OrbitalSchema JSON.\n *\n * @packageDocumentation\n */\n\nexport const ODL_TO_SCHEMA_MAPPING = `\n## Domain Language -> OrbitalSchema Mapping\n\n| Domain Language | OrbitalSchema |\n|-----------------|---------------|\n| \"A Task is...\" | \\`{ \"entity\": { \"name\": \"Task\", ... } }\\` |\n| \"persistent entity\" | \\`\"persistence\": \"persistent\"\\` |\n| \"runtime entity\" | \\`\"persistence\": \"runtime\"\\` |\n| \"singleton entity\" | \\`\"persistence\": \"singleton\"\\` |\n| \"has X as text\" | \\`{ \"name\": \"X\", \"type\": \"string\" }\\` |\n| \"has X as number\" | \\`{ \"name\": \"X\", \"type\": \"number\" }\\` |\n| \"has X as yes/no\" | \\`{ \"name\": \"X\", \"type\": \"boolean\" }\\` |\n| \"has X as enum [a, b]\" | \\`{ \"name\": \"X\", \"type\": \"enum\", \"values\": [\"a\", \"b\"] }\\` |\n| \"belongs to Y\" | \\`{ \"type\": \"relation\", \"relation\": { \"entity\": \"Y\" } }\\` |\n| \"belongs to Y as alias\" | \\`{ \"name\": \"alias\", \"type\": \"relation\", \"relation\": { \"entity\": \"Y\" } }\\` |\n| \"States: A, B\" | \\`\"states\": [{ \"name\": \"A\" }, { \"name\": \"B\" }]\\` |\n| \"Initial: A\" | \\`{ \"name\": \"A\", \"isInitial\": true }\\` |\n| \"From X to Y on Z\" | \\`{ \"from\": \"X\", \"to\": \"Y\", \"event\": \"Z\" }\\` |\n| \"if health >= 0\" | \\`\"guard\": [\">=\", \"@entity.health\", 0]\\` |\n| \"then update status to 'done'\" | \\`\"effects\": [[\"set\", \"@entity.status\", \"done\"]]\\` |\n| \"then emit EVENT\" | \\`\"effects\": [[\"emit\", \"EVENT\"]]\\` |\n| \"then render X to slot\" | \\`\"effects\": [[\"render-ui\", \"slot\", { \"type\": \"X\" }]]\\` |\n| \"then persist create Task\" | \\`\"effects\": [[\"persist\", \"create\", \"Task\"]]\\` |\n| \"then navigate to /path\" | \\`\"effects\": [[\"navigate\", \"/path\"]]\\` |\n\n## Conversion Process\n\n1. **Parse Domain Language** - Split into sections (Entities, Pages, Behaviors)\n2. **Extract entities** - Parse \"A X is...\" definitions\n3. **Extract pages** - Parse \"[Name] at /path\" definitions\n4. **Extract behaviors** - Parse \"[Name] behavior:\" definitions\n5. **Parse guards** - Convert human-readable conditions to S-expressions\n6. **Parse effects** - Convert human-readable effects to S-expressions\n7. **Assemble schema** - Build OrbitalSchema JSON structure\n\n## CLI Commands\n\n\\`\\`\\`bash\n# Convert Domain Language to OrbitalSchema\nnpx kflow domain:to-schema input.txt -o output.orb\n\n# Convert OrbitalSchema to Domain Language\nnpx kflow domain:to-text input.orb -o output.txt\n\n# Validate round-trip conversion\nnpx kflow domain:validate input.orb --verbose\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// Design Quality Checks\n// ============================================================================\n\n/** Prop corrections: wrong name → correct name */\nconst PROP_CORRECTIONS: Record<string, string> = {\n onSubmit: 'submitEvent',\n onCancel: 'cancelEvent',\n headerActions: 'actions',\n loading: 'isLoading',\n fieldNames: 'fields',\n};\n\n/**\n * Auto-correct known prop misnaming in render-ui effects.\n * Returns the number of corrections made.\n */\nfunction autoCorrectProps(schema: Record<string, unknown>): number {\n let corrections = 0;\n const schemaStr = JSON.stringify(schema);\n\n // Walk through all render-ui effects and fix prop names\n function walkAndFix(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(walkAndFix);\n }\n if (obj && typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (key in PROP_CORRECTIONS) {\n result[PROP_CORRECTIONS[key]] = walkAndFix(value);\n corrections++;\n } else {\n result[key] = walkAndFix(value);\n }\n }\n return result;\n }\n return obj;\n }\n\n const fixed = walkAndFix(schema);\n Object.assign(schema, fixed);\n return corrections;\n}\n\n/**\n * Check INIT transitions for atomic composition quality.\n * Returns warnings for flat/low-quality INIT transitions.\n */\nfunction checkCompositionQuality(schema: Record<string, unknown>): string[] {\n const warnings: string[] = [];\n const orbitals = (schema as { orbitals?: unknown[] }).orbitals;\n if (!Array.isArray(orbitals)) return warnings;\n\n for (const orbital of orbitals) {\n const orbObj = orbital as { name?: string; traits?: unknown[] };\n const traits = orbObj.traits;\n if (!Array.isArray(traits)) continue;\n\n for (const trait of traits) {\n const traitObj = trait as { name?: string; stateMachine?: { transitions?: unknown[] } };\n const transitions = traitObj.stateMachine?.transitions;\n if (!Array.isArray(transitions)) continue;\n\n for (const transition of transitions) {\n const trans = transition as { event?: string; effects?: unknown[] };\n if (trans.event !== 'INIT') continue;\n\n const effects = trans.effects;\n if (!Array.isArray(effects)) continue;\n\n // Count render-ui effects targeting 'main'\n const mainRenderUIs = effects.filter(\n (e) => Array.isArray(e) && e[0] === 'render-ui' && e[1] === 'main',\n );\n\n if (mainRenderUIs.length > 1) {\n warnings.push(\n `⚠️ ${orbObj.name}/${traitObj.name} INIT has ${mainRenderUIs.length} flat render-ui calls to main. Should be a single composed stack with children.`,\n );\n }\n\n if (mainRenderUIs.length === 1) {\n const renderPayload = mainRenderUIs[0] as unknown[];\n const payload = renderPayload[2] as Record<string, unknown> | undefined;\n if (payload && payload.type !== 'stack' && !payload.children) {\n warnings.push(\n `⚠️ ${orbObj.name}/${traitObj.name} INIT renders a single flat ${payload.type} to main. Should be a composed stack with header, metrics, and data sections.`,\n );\n }\n }\n }\n }\n }\n\n return warnings;\n}\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 let propCorrections = 0;\n let compositionWarnings: string[] = [];\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 // Auto-correct props and check composition quality\n if (combinedSchema) {\n propCorrections = autoCorrectProps(combinedSchema as unknown as Record<string, unknown>);\n compositionWarnings = checkCompositionQuality(combinedSchema as unknown as Record<string, unknown>);\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 designQuality: {\n propCorrections: propCorrections || 0,\n compositionWarnings: compositionWarnings || [],\n },\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, type LLMProvider } from '@almadar/llm';\nimport {\n getSExprQuickRef,\n getKeyBehaviorsReference,\n getCommonErrorsSection,\n getArchitectureSection,\n} from '@almadar/skills';\nimport type { SSEEventType } from '../api-types.js';\nimport { AgentDomainCategorySchema } from '@almadar/core/types';\nimport type { AgentDomainCategory } from '@almadar/core/types';\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 /** LLM provider for domain orbital generation. Defaults to 'anthropic' */\n provider?: LLMProvider;\n /** Model name for domain orbital generation. Defaults to 'claude-sonnet-4-20250514' */\n model?: 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: AgentDomainCategory;\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: AgentDomainCategorySchema,\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 with configurable provider\n const client = new LLMClient({\n provider: options.provider ?? 'anthropic',\n model: options.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 } from '@almadar/core/types';\n\n// ============================================================================\n// Shared Module Imports (SK-007 Phase 1)\n// ============================================================================\n\nimport {\n // Types (re-export for backward compatibility)\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n type OrbitalGenerationOptions as SharedOrbitalGenerationOptions,\n type OrbitalGenerationResult as SharedOrbitalGenerationResult,\n type ParallelGenerationOptions as SharedParallelGenerationOptions,\n type ParallelGenerationResult as SharedParallelGenerationResult,\n type DecomposeOptions as SharedDecomposeOptions,\n // Constants\n PROVIDER_CONCURRENCY_LIMITS,\n // Utilities\n getEntityName,\n createLog,\n} from '../shared/index.js';\n\n// Re-export types for backward compatibility\nexport {\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n} from '../shared/index.js';\n\n// Re-export constants\nexport { PROVIDER_CONCURRENCY_LIMITS } from '../shared/index.js';\n\n// ============================================================================\n// Local Type Definitions (Extended from shared)\n// ============================================================================\n\n/**\n * Extended options for single orbital generation.\n * @deprecated Use shared OrbitalGenerationOptions instead\n */\nexport interface OrbitalGenerationOptions extends SharedOrbitalGenerationOptions {}\n\n/**\n * Extended result for single orbital generation.\n * @deprecated Use shared OrbitalGenerationResult instead\n */\nexport interface OrbitalGenerationResult extends SharedOrbitalGenerationResult {}\n\n/**\n * Extended options for parallel generation.\n * @deprecated Use shared ParallelGenerationOptions instead\n */\nexport interface ParallelGenerationOptions extends SharedParallelGenerationOptions {}\n\n/**\n * Extended result for parallel generation.\n * @deprecated Use shared ParallelGenerationResult instead\n */\nexport interface ParallelGenerationResult extends SharedParallelGenerationResult {}\n\n/**\n * Extended options for decomposition.\n * @deprecated Use shared DecomposeOptions instead\n */\nexport interface DecomposeOptions extends SharedDecomposeOptions {}\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: { valid: boolean; errors: unknown[]; warnings?: unknown[] } = { 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: unknown) => {\n if (typeof e === 'object' && e !== null) {\n return (e as { message?: string }).message || String(e);\n }\n return String(e);\n }),\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 * 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: Partial<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 ? requirements.entities.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### States (Map to State Machines)\n${requirements.states?.length ? requirements.states.map(s => `- ${s}`).join('\\n') : '- (none specified)'}\n\n### Events (Map to Transitions)\n${requirements.events?.length ? requirements.events.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Guards (Map to Transition Guards)\n${requirements.guards?.length ? requirements.guards.map(g => `- ${g}`).join('\\n') : '- (none specified)'}\n\n### Effects (Map to Transition Effects)\n${requirements.effects?.length ? requirements.effects.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Pages (Map to Page Definitions)\n${requirements.pages?.length ? 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, AgentDomainCategorySchema } from '@almadar/core/types';\nimport { LLMClient, type LLMProvider } 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 /** LLM provider for orbital generation subagent. Defaults to 'anthropic' */\n provider?: LLMProvider;\n /** Model name for orbital generation subagent. Defaults to 'claude-sonnet-4-20250514' */\n model?: string;\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: AgentDomainCategorySchema,\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 with configurable provider\n const client = new LLMClient({\n provider: options.provider ?? 'anthropic',\n model: options.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 * @almadar/agent Tools\n *\n * All agent tools for schema generation, validation, and management.\n *\n * @packageDocumentation\n */\n\n// Execute tool (no deps needed)\nexport { createExecuteTool, validateCommandPaths } from './execute.js';\n\n// Validate tool (no deps needed - shells to CLI)\nexport { createValidateSchemaTool } from './validate-schema.js';\n\n// Generate schema tool (uses @almadar/llm structured output directly)\nexport { createGenerateSchemaTool } from './generate-schema.js';\n\n// Finish task tool (uses internal combiner and domain converter)\nexport { createFinishTaskTool } from './finish-task.js';\n\n// Domain orbital tools (uses internal domain language converter)\nexport {\n createGenerateOrbitalDomainTool,\n createConstructCombinedDomainTool,\n createDomainOrbitalTools,\n type DomainOrbitalEventCallback,\n type DomainOrbitalCompleteCallback,\n type DomainOrbitalToolOptions,\n type DomainOrbitalSpec,\n} from './domain-orbital.js';\n\n// Orbital subagent tool (uses internal orbital generator)\nexport {\n createOrbitalSubagentTool,\n createSubagentEventWrapper,\n type SubagentEventCallback,\n type OrbitalCompleteCallback,\n type OrbitalRequirements,\n type OrbitalSubagentToolOptions,\n} from './orbital-subagent.js';\n\n// Orbital batch subagent tool (uses batch generation for 2x+ speedup)\nexport {\n createOrbitalBatchSubagentTool,\n type SubagentEventCallback as BatchSubagentEventCallback,\n type BatchCompleteCallback,\n type OrbitalBatchSubagentToolOptions,\n} from './orbital-batch-subagent.js';\n\n// Trait subagent tool (uses @almadar/llm directly)\nexport {\n createTraitSubagentTool,\n createTraitEventWrapper,\n type TraitEventCallback,\n type TraitCompleteCallback,\n type TraitSubagentToolOptions,\n type TraitSpec,\n} from './trait-subagent.js';\n\n// Combine schemas tool (uses internal combiner)\nexport { createCombineSchemasTool } from './combine-schemas.js';\n\n// Schema chunking tools (no deps needed - uses @almadar/core)\nexport {\n createQuerySchemaStructureTool,\n createExtractChunkTool,\n createApplyChunkTool,\n createSchemaChunkingTools,\n} from './schema-chunking.js';\n\n// GitHub tools (uses @almadar/integrations)\nexport {\n createGitHubTools,\n createGitHubToolsArray,\n type GitHubToolsConfig,\n} from './github.js';\n\n// ============================================================================\n// Convenience Factory\n// ============================================================================\n\n// Import functions for use in createAgentTools\nimport { createExecuteTool } from './execute.js';\nimport { createValidateSchemaTool } from './validate-schema.js';\nimport { createGenerateSchemaTool } from './generate-schema.js';\nimport { createFinishTaskTool } from './finish-task.js';\nimport { createCombineSchemasTool } from './combine-schemas.js';\nimport { createOrbitalSubagentTool } from './orbital-subagent.js';\nimport { createTraitSubagentTool } from './trait-subagent.js';\nimport { createDomainOrbitalTools } from './domain-orbital.js';\nimport { createSchemaChunkingTools } from './schema-chunking.js';\n/**\n * Create all agent tools for a workspace.\n *\n * All dependencies are now internal to @almadar/agent - no dependency injection needed.\n *\n * @param workDir - Workspace directory\n * @returns All tools ready for use\n */\nexport function createAgentTools(workDir: string) {\n return {\n // Core tools\n execute: createExecuteTool(workDir),\n validateSchema: createValidateSchemaTool(workDir),\n\n // Schema generation (uses @almadar/llm structured output directly)\n generateSchema: createGenerateSchemaTool(),\n\n // Orbital tools (now use internal functions)\n finishTask: createFinishTaskTool(workDir),\n combineSchemas: createCombineSchemasTool(workDir),\n\n // Subagent tools (now use internal functions)\n orbitalSubagent: createOrbitalSubagentTool(),\n traitSubagent: createTraitSubagentTool(),\n\n // Domain tools (now use internal functions)\n domainOrbitalTools: createDomainOrbitalTools({ workDir }),\n\n // Chunking tools\n schemaChunking: createSchemaChunkingTools(workDir),\n\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 * KFlow DeepAgent System Prompt\n *\n * System prompts for the agent. Uses @almadar/skills for the\n * schema reference documentation.\n *\n * @packageDocumentation\n */\n\nimport {\n getMinimalTypeReference,\n getArchitectureSection,\n} from '@almadar/skills';\n\n/**\n * Build a comprehensive schema reference from @almadar/skills.\n */\nfunction getSchemaReference(): string {\n return `## KFlow Schema Reference\n\n${getArchitectureSection()}\n\n${getMinimalTypeReference()}`;\n}\n\n/**\n * Create the system prompt for the KFlow schema generator agent.\n *\n * This prompt instructs the agent to:\n * 1. Generate KFlow schemas from natural language\n * 2. Use the KFlow CLI for validation and compilation\n * 3. Exit once the app compiles successfully\n */\nexport function createSystemPrompt(): string {\n const SCHEMA_REFERENCE = getSchemaReference();\n\n return `You are a KFlow application generator. You create working applications by generating valid KFlow schemas.\n\n${SCHEMA_REFERENCE}\n\n## File System\n\nYou have access to a virtual filesystem rooted at your workspace directory.\n- All file paths should start with / (e.g., /schema.json, /app)\n- You can only access files within your workspace\n- Use /schema.json as your main schema file\n- Use /app as the output directory for compiled apps\n\n## CRITICAL: Path Handling for CLI Commands\n\nThe file system tools (write_file, read_file, edit_file) use virtual paths starting with /.\nHowever, the CLI tools run in the real filesystem and need ABSOLUTE paths.\n\n**ALWAYS follow this pattern for CLI commands:**\n\n1. First, run \\`pwd\\` to get your workspace's absolute path\n2. Use the full absolute path for ALL CLI commands\n\n**Correct:**\n\\`\\`\\`bash\npwd\norbital validate /home/user/.../workspaces/session-id/schema.json --json\nnpx kflow compile /home/user/.../workspaces/session-id/schema.json -o /home/user/.../workspaces/session-id/app --verify\n\\`\\`\\`\n\n**WRONG:**\n\\`\\`\\`bash\norbital validate /schema.json --json\norbital validate ./schema.json --json\n\\`\\`\\`\n\n## Your Workflow\n\n1. **Get workspace path**: Run \\`pwd\\` to get your absolute workspace path\n2. **Analyze** the user's request to understand what application they want\n3. **Plan** using write_todos to break down the work\n4. **Generate** a KFlow schema and write it to /schema.json\n5. **Validate** using: orbital validate {WORKSPACE_PATH}/schema.json --json\n6. **Fix** any validation errors by editing /schema.json\n7. **Compile** using: npx kflow compile {WORKSPACE_PATH}/schema.json -o {WORKSPACE_PATH}/app --verify\n8. **Install** dependencies: cd {WORKSPACE_PATH}/app && npm install\n9. **Write Summary**: Write /summary.json with a summary of your work\n10. **Complete** when the app compiles successfully and summary is written\n\n## Summary File Format\n\n\\`\\`\\`json\n{\n \"success\": true,\n \"request\": \"Brief description of what the user asked for\",\n \"schemaGenerated\": {\n \"name\": \"AppName\",\n \"entities\": [\"Entity1\", \"Entity2\"],\n \"states\": [\"state1\", \"state2\"],\n \"pages\": [\"page1\", \"page2\"]\n },\n \"iterations\": {\n \"validationAttempts\": 2,\n \"compilationAttempts\": 1\n },\n \"issues\": [\n {\n \"type\": \"validation|compilation|other\",\n \"description\": \"What went wrong\",\n \"resolution\": \"How you fixed it\"\n }\n ],\n \"insights\": \"Any observations about the schema format\"\n}\n\\`\\`\\`\n\n## Important Guidelines\n\n- **ALWAYS run \\`pwd\\` first** and use the full path for CLI commands\n- Always validate after writing or editing /schema.json\n- Parse JSON output from validate command\n- Loop until compilation succeeds\n- Use write_todos to track progress\n`;\n}\n\n/**\n * Create a compact version of the system prompt for smaller context windows.\n */\nexport function createCompactSystemPrompt(): string {\n const SCHEMA_REFERENCE = getSchemaReference();\n\n return `You are a KFlow app generator.\n\n${SCHEMA_REFERENCE}\n\nFile System: All paths start with / (e.g., /schema.json, /app). You can only access your workspace.\n\nCRITICAL - Path Handling:\n- File tools use virtual paths (/schema.json)\n- CLI tools need ABSOLUTE paths from \\`pwd\\` for BOTH input AND output\n- ALWAYS run \\`pwd\\` first, then use full path for everything\n\nWorkflow:\n1. Run \\`pwd\\` to get workspace path\n2. Write /schema.json\n3. Validate: orbital validate {PWD}/schema.json --json\n4. Fix errors if any\n5. Compile: npx kflow compile {PWD}/schema.json -o {PWD}/app --verify\n6. Install: cd {PWD}/app && npm install\n7. Write /summary.json\n8. Done when compilation succeeds\n\nUse write_todos to plan. Follow the schema reference for valid structure.\n`;\n}\n","/**\n * KFlow DeepAgent Subagents\n *\n * Specialized subagents for complex schema generation tasks.\n * These are spawned via the `task()` built-in tool.\n *\n * Uses @almadar/skills for schema reference documentation.\n *\n * @packageDocumentation\n */\n\nimport {\n getMinimalTypeReference,\n getArchitectureSection,\n} from '@almadar/skills';\nimport type { SubAgent } from './types.js';\n\n/**\n * Build a compact schema reference from @almadar/skills.\n */\nfunction getSchemaReference(): string {\n return `## KFlow Schema Reference\n\n${getArchitectureSection()}\n\n${getMinimalTypeReference()}`;\n}\n\n/**\n * Create the Schema Generator Subagent configuration.\n *\n * Focused agent for generating KFlow schemas from requirements.\n * Writes schema to file and verifies it exists.\n */\nexport function createSchemaGeneratorSubagent(): SubAgent {\n const SCHEMA_REFERENCE = getSchemaReference();\n\n return {\n name: 'schema-generator',\n description: 'Generates KFlow schema from requirements. Use when you need to create a new schema or major schema section.',\n systemPrompt: `You are a KFlow schema generator. Your task is to generate valid KFlow schemas and WRITE them to /schema.json.\n\n${SCHEMA_REFERENCE}\n\n## CRITICAL: UI Structure\n\nThe \\`ui\\` section MUST use \\`pages\\` array with UnifiedPage format:\n\n\\`\\`\\`json\n{\n \"ui\": {\n \"pages\": [\n {\n \"name\": \"MainPage\",\n \"path\": \"/\",\n \"purpose\": \"Main view\",\n \"viewType\": \"list\",\n \"primaryEntity\": \"EntityName\",\n \"isInitial\": true,\n \"sections\": [\n { \"id\": \"header\", \"purpose\": \"Title\", \"order\": 0, \"estimatedSize\": \"small\", \"pattern\": { \"type\": \"page-header\", \"title\": \"Title\" } },\n { \"id\": \"list\", \"purpose\": \"Items\", \"order\": 1, \"estimatedSize\": \"large\", \"pattern\": { \"type\": \"entity-list\", \"entity\": \"EntityName\", \"fieldNames\": [\"field1\", \"field2\"] } }\n ]\n }\n ]\n }\n}\n\\`\\`\\`\n\n**NEVER use \\`sectionedPages\\` - this is INVALID and will cause validation errors!**\n\n## Instructions\n\n1. Analyze the requirements provided\n2. Generate a complete, valid KFlow schema\n3. **WRITE the schema to /schema.json using write_file**\n4. **VERIFY the file was written using ls or read_file**\n5. Ensure:\n - Exactly ONE state has isInitial: true\n - Exactly ONE page has isInitial: true\n - Use \\`ui.pages\\` (NOT \\`sectionedPages\\`)\n - Each page has sections with patterns\n - All entity names are PascalCase\n - All field names are camelCase\n - All event keys are UPPER_SNAKE_CASE\n\n## IMPORTANT: File Writing\n\nYou MUST write the schema to a file. Do not just output JSON - use write_file:\n\n\\`\\`\\`\nwrite_file({ file_path: \"/schema.json\", content: \"{...schema JSON...}\" })\n\\`\\`\\`\n\nAfter writing, verify the file exists with \\`ls({ path: \"/\" })\\`.\n`,\n };\n}\n\n/**\n * Create the Error Fixer Subagent configuration.\n *\n * Focused agent for fixing validation and compilation errors.\n */\nexport function createErrorFixerSubagent(): SubAgent {\n const SCHEMA_REFERENCE = getSchemaReference();\n\n return {\n name: 'error-fixer',\n description: 'Fixes validation or compilation errors in KFlow schema. Use when you have errors to fix.',\n systemPrompt: `You are a KFlow error fixer. Your task is to fix schema errors.\n\n${SCHEMA_REFERENCE}\n\n## Instructions\n\n1. Read the error message carefully\n2. Read the current schema\n3. Identify the exact issue\n4. Apply the fix using edit_file\n\n## Common Fixes\n\n- MISSING_REQUIRED: Add the missing field with correct type\n- INVALID_TYPE: Change to correct type (string, number, boolean, etc.)\n- INVALID_ENUM: Use a valid enum value\n- VP_MISSING_PATTERN: Add pattern object with type field\n- MISSING_INITIAL: Set isInitial: true on one state/page\n- \"Schema must have at least one page\":\n - **Change \\`sectionedPages\\` to \\`pages\\`**\n - Ensure pages array is not empty\n\n## Actions\n\nAfter identifying the fix, apply it using edit_file:\n\\`\\`\\`\nedit_file({ file_path: \"/schema.json\", old_string: \"...\", new_string: \"...\" })\n\\`\\`\\`\n\n## Output Format\n\nOutput a JSON object with:\n- \"path\": the JSON path to fix\n- \"fix\": the corrected value\n- \"explanation\": brief explanation\n`,\n };\n}\n\n/**\n * Create the Test Analyzer Subagent configuration.\n *\n * Focused agent for analyzing test failures and suggesting fixes.\n */\nexport function createTestAnalyzerSubagent(): SubAgent {\n return {\n name: 'test-analyzer',\n description: 'Analyzes test failures and suggests schema fixes. Use when tests fail.',\n systemPrompt: `You are a KFlow test analyzer. Your task is to analyze test failures and suggest fixes.\n\n## Instructions\n\n1. Read the test output carefully\n2. Identify the root cause of the failure\n3. Determine what schema change would fix it\n4. Provide specific fix instructions\n\n## Common Test Failures\n\n- Type errors: Usually missing or wrong field types in entities\n- Runtime errors: Usually missing event handlers or transitions\n- Validation errors: Usually schema structure issues\n- Component errors: Usually missing or wrong pattern configurations\n\n## Output Format\n\nOutput a JSON object with:\n- \"failureType\": type of failure\n- \"rootCause\": brief description\n- \"schemaPath\": where in the schema to fix\n- \"suggestedFix\": the fix to apply\n- \"confidence\": high, medium, or low\n`,\n };\n}\n\n/**\n * Create all subagent configurations.\n */\nexport function createSubagents(): SubAgent[] {\n return [\n createSchemaGeneratorSubagent(),\n createErrorFixerSubagent(),\n createTestAnalyzerSubagent(),\n ];\n}\n\n/**\n * Create subagent configs as a record for easy lookup.\n */\nexport function createSubagentConfigs(): Record<string, SubAgent> {\n return {\n 'schema-generator': createSchemaGeneratorSubagent(),\n 'error-fixer': createErrorFixerSubagent(),\n 'test-analyzer': createTestAnalyzerSubagent(),\n };\n}\n","/**\n * DeepAgent SSE Event Types\n *\n * Type definitions for Server-Sent Events from the DeepAgent streaming endpoint.\n * Use these types for client-side consumption of /deepagent/generate-stream.\n *\n * @packageDocumentation\n */\n\n/**\n * Initial event sent when streaming begins.\n */\nexport interface DeepAgentStartEvent {\n type: 'start';\n sessionId: string;\n}\n\n/**\n * Agent execution event (tool calls, messages, etc.).\n */\nexport interface DeepAgentExecutionEvent {\n type: 'event';\n node?: string;\n toolCall?: {\n name: string;\n args: Record<string, unknown>;\n };\n toolResult?: {\n name: string;\n result: unknown;\n };\n message?: {\n role: 'assistant' | 'user' | 'system';\n content: string;\n };\n [key: string]: unknown;\n}\n\n/**\n * Schema generated event.\n */\nexport interface DeepAgentSchemaEvent {\n type: 'schema';\n schema: Record<string, unknown>;\n}\n\n/**\n * Completion event sent when generation finishes successfully.\n */\nexport interface DeepAgentCompleteEvent {\n type: 'complete';\n sessionId: string;\n appCompiled: boolean;\n}\n\n/**\n * Error event sent when generation fails.\n */\nexport interface DeepAgentErrorEvent {\n type: 'error';\n error: string;\n}\n\n/**\n * Union of all possible DeepAgent SSE events.\n */\nexport type DeepAgentEvent =\n | DeepAgentStartEvent\n | DeepAgentExecutionEvent\n | DeepAgentSchemaEvent\n | DeepAgentCompleteEvent\n | DeepAgentErrorEvent;\n\n/**\n * Parse an SSE data line into a DeepAgentEvent.\n */\nexport function parseDeepAgentEvent(data: string): DeepAgentEvent {\n return JSON.parse(data) as DeepAgentEvent;\n}\n\n/**\n * Type guard for start events.\n */\nexport function isStartEvent(event: DeepAgentEvent): event is DeepAgentStartEvent {\n return event.type === 'start';\n}\n\n/**\n * Type guard for execution events.\n */\nexport function isExecutionEvent(event: DeepAgentEvent): event is DeepAgentExecutionEvent {\n return event.type === 'event';\n}\n\n/**\n * Type guard for schema events.\n */\nexport function isSchemaEvent(event: DeepAgentEvent): event is DeepAgentSchemaEvent {\n return event.type === 'schema';\n}\n\n/**\n * Type guard for complete events.\n */\nexport function isCompleteEvent(event: DeepAgentEvent): event is DeepAgentCompleteEvent {\n return event.type === 'complete';\n}\n\n/**\n * Type guard for error events.\n */\nexport function isErrorEvent(event: DeepAgentEvent): event is DeepAgentErrorEvent {\n return event.type === 'error';\n}\n","/**\n * Context Compaction for DeepAgent\n *\n * Provides middleware to manage context length in long-running agent sessions.\n * Uses @langchain/core's trimMessages to keep context within token limits.\n *\n * @packageDocumentation\n */\n\nimport { trimMessages, type BaseMessage } from '@langchain/core/messages';\nimport type { BaseLanguageModel } from '@langchain/core/language_models/base';\n\n/**\n * Configuration for context compaction.\n */\nexport interface ContextCompactionConfig {\n /**\n * Maximum number of tokens before triggering compaction.\n * Default: 150000 (leaves headroom for Claude's 200K context)\n */\n maxTokens?: number;\n\n /**\n * Number of recent messages to always keep.\n * Default: 10\n */\n keepRecentMessages?: number;\n\n /**\n * Whether to include the system message in trimming.\n * Default: false (system message is always kept)\n */\n includeSystem?: boolean;\n\n /**\n * Strategy for trimming: 'first' keeps first messages, 'last' keeps last messages.\n * Default: 'last'\n */\n strategy?: 'first' | 'last';\n}\n\n/**\n * Default configuration for context compaction.\n */\nexport const DEFAULT_COMPACTION_CONFIG: Required<ContextCompactionConfig> = {\n maxTokens: 150000,\n keepRecentMessages: 10,\n includeSystem: false,\n strategy: 'last',\n};\n\n/**\n * Compact messages to fit within token limit.\n */\nexport async function compactMessages(\n messages: BaseMessage[],\n model: BaseLanguageModel,\n config: ContextCompactionConfig = {}\n): Promise<BaseMessage[]> {\n const {\n maxTokens,\n includeSystem,\n strategy,\n } = { ...DEFAULT_COMPACTION_CONFIG, ...config };\n\n const trimmed = await trimMessages(messages, {\n maxTokens,\n tokenCounter: model,\n strategy,\n includeSystem,\n allowPartial: false,\n startOn: 'human',\n });\n\n return trimmed;\n}\n\n/**\n * Check if messages need compaction based on estimated token count.\n */\nexport function needsCompaction(\n messages: BaseMessage[],\n threshold: number = DEFAULT_COMPACTION_CONFIG.maxTokens\n): boolean {\n const totalChars = messages.reduce((sum, msg) => {\n const content = typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n return sum + content.length;\n }, 0);\n\n const estimatedTokens = totalChars / 4;\n return estimatedTokens > threshold * 0.8;\n}\n\n/**\n * Create a message summarizer prompt for compacting old context.\n */\nexport function createSummaryPrompt(messages: BaseMessage[]): string {\n const messageTexts = messages.map((msg) => {\n const role = msg._getType();\n const content = typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n return `[${role}]: ${content.substring(0, 500)}${content.length > 500 ? '...' : ''}`;\n }).join('\\n\\n');\n\n return `Summarize the following conversation history in 2-3 paragraphs, focusing on:\n1. What the user originally requested\n2. What actions were taken (files created, commands run)\n3. Current state and any pending tasks\n\nConversation:\n${messageTexts}\n\nSummary:`;\n}\n\n/**\n * Estimate token count for messages using character-based heuristic.\n */\nexport function estimateTokens(messages: BaseMessage[]): number {\n const totalChars = messages.reduce((sum, msg) => {\n const content = typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n return sum + content.length;\n }, 0);\n\n return Math.ceil(totalChars / 4);\n}\n","/**\n * Metrics Collection for DeepAgent Evaluation\n *\n * Tracks success rates, iteration counts, token usage, and timing\n * for agent generation tests.\n *\n * @packageDocumentation\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\n/**\n * Metrics for a single generation attempt.\n */\nexport interface GenerationMetrics {\n testName: string;\n complexity: 'simple' | 'medium' | 'complex';\n success: boolean;\n iterations: number;\n timeMs: number;\n tokenUsage?: {\n input: number;\n output: number;\n total: number;\n };\n error?: string;\n timestamp?: number;\n}\n\n/**\n * Aggregated metrics summary.\n */\nexport interface MetricsSummary {\n total: number;\n passed: number;\n failed: number;\n successRate: number;\n avgIterations: number;\n avgTimeMs: number;\n avgTokens: number;\n byComplexity: {\n simple: { total: number; passed: number; successRate: number };\n medium: { total: number; passed: number; successRate: number };\n complex: { total: number; passed: number; successRate: number };\n };\n}\n\n/**\n * Collects and aggregates generation metrics.\n */\nexport class MetricsCollector {\n private metrics: GenerationMetrics[] = [];\n\n record(metrics: GenerationMetrics): void {\n this.metrics.push({\n ...metrics,\n timestamp: Date.now(),\n });\n }\n\n getAll(): GenerationMetrics[] {\n return [...this.metrics];\n }\n\n getSummary(): MetricsSummary {\n const total = this.metrics.length;\n const passed = this.metrics.filter(m => m.success).length;\n const failed = total - passed;\n\n const successRate = total > 0 ? (passed / total) * 100 : 0;\n\n const avgIterations = total > 0\n ? this.metrics.reduce((sum, m) => sum + m.iterations, 0) / total\n : 0;\n\n const avgTimeMs = total > 0\n ? this.metrics.reduce((sum, m) => sum + m.timeMs, 0) / total\n : 0;\n\n const metricsWithTokens = this.metrics.filter(m => m.tokenUsage);\n const avgTokens = metricsWithTokens.length > 0\n ? metricsWithTokens.reduce((sum, m) => sum + (m.tokenUsage?.total || 0), 0) / metricsWithTokens.length\n : 0;\n\n const byComplexity = {\n simple: this.getComplexitySummary('simple'),\n medium: this.getComplexitySummary('medium'),\n complex: this.getComplexitySummary('complex'),\n };\n\n return {\n total,\n passed,\n failed,\n successRate,\n avgIterations,\n avgTimeMs,\n avgTokens,\n byComplexity,\n };\n }\n\n private getComplexitySummary(complexity: 'simple' | 'medium' | 'complex') {\n const filtered = this.metrics.filter(m => m.complexity === complexity);\n const total = filtered.length;\n const passed = filtered.filter(m => m.success).length;\n const successRate = total > 0 ? (passed / total) * 100 : 0;\n return { total, passed, successRate };\n }\n\n getFailures(): GenerationMetrics[] {\n return this.metrics.filter(m => !m.success);\n }\n\n getMultiIterationTests(): GenerationMetrics[] {\n return this.metrics.filter(m => m.iterations > 0);\n }\n\n clear(): void {\n this.metrics = [];\n }\n\n async saveToFile(filePath: string): Promise<void> {\n const data = {\n summary: this.getSummary(),\n metrics: this.metrics,\n generatedAt: new Date().toISOString(),\n };\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, JSON.stringify(data, null, 2));\n }\n\n async loadFromFile(filePath: string): Promise<void> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const data = JSON.parse(content);\n this.metrics = data.metrics || [];\n } catch {\n // File doesn't exist, start fresh\n }\n }\n}\n\n/**\n * Format metrics summary as a readable string.\n */\nexport function formatSummary(summary: MetricsSummary): string {\n const lines = [\n '═'.repeat(50),\n ' DEEPAGENT EVALUATION RESULTS',\n '═'.repeat(50),\n '',\n ` Total Tests: ${summary.total}`,\n ` Passed: ${summary.passed} (${summary.successRate.toFixed(1)}%)`,\n ` Failed: ${summary.failed}`,\n '',\n ` Avg Iterations: ${summary.avgIterations.toFixed(1)}`,\n ` Avg Time: ${(summary.avgTimeMs / 1000).toFixed(1)}s`,\n ` Avg Tokens: ${Math.round(summary.avgTokens).toLocaleString()}`,\n '',\n ' BY COMPLEXITY:',\n ` Simple: ${summary.byComplexity.simple.passed}/${summary.byComplexity.simple.total} (${summary.byComplexity.simple.successRate.toFixed(0)}%)`,\n ` Medium: ${summary.byComplexity.medium.passed}/${summary.byComplexity.medium.total} (${summary.byComplexity.medium.successRate.toFixed(0)}%)`,\n ` Complex: ${summary.byComplexity.complex.passed}/${summary.byComplexity.complex.total} (${summary.byComplexity.complex.successRate.toFixed(0)}%)`,\n '',\n '═'.repeat(50),\n ];\n return lines.join('\\n');\n}\n\n/**\n * Analyze failure patterns to suggest prompt improvements.\n */\nexport function analyzeFailures(failures: GenerationMetrics[]): string[] {\n const suggestions: string[] = [];\n\n const errorPatterns = new Map<string, number>();\n for (const failure of failures) {\n if (failure.error) {\n let category = 'Unknown';\n if (failure.error.includes('validation')) category = 'Validation';\n else if (failure.error.includes('compilation')) category = 'Compilation';\n else if (failure.error.includes('test')) category = 'Test';\n else if (failure.error.includes('schema')) category = 'Schema';\n else if (failure.error.includes('timeout')) category = 'Timeout';\n\n errorPatterns.set(category, (errorPatterns.get(category) || 0) + 1);\n }\n }\n\n for (const [category, count] of errorPatterns) {\n if (category === 'Validation' && count > 2) {\n suggestions.push('Consider adding more schema validation examples to the system prompt');\n }\n if (category === 'Compilation' && count > 2) {\n suggestions.push('Add compilation error handling examples to the system prompt');\n }\n if (category === 'Test' && count > 2) {\n suggestions.push('Include test-driven development guidance in the system prompt');\n }\n if (category === 'Timeout' && count > 1) {\n suggestions.push('Consider breaking complex apps into smaller subagent tasks');\n }\n }\n\n const complexFailures = failures.filter(f => f.complexity === 'complex').length;\n if (complexFailures > failures.length * 0.5) {\n suggestions.push('Complex apps failing frequently - consider more structured decomposition guidance');\n }\n\n return suggestions;\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';\nimport type { MemoryManager } from '../memory/index.js';\nimport { needsCompaction, type ContextCompactionConfig } from '../context-compaction.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 * Memory manager for session-to-memory sync (GAP-002D).\n * When provided, completed sessions are recorded to orbital memory.\n */\n memoryManager?: MemoryManager;\n\n /**\n * Context compaction configuration (GAP-005).\n * When provided, enables automatic context length management.\n */\n compactionConfig?: ContextCompactionConfig;\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 private memoryManager: MemoryManager | null = null;\n private compactionConfig: ContextCompactionConfig | null = null;\n\n constructor(options: SessionManagerOptions = {}) {\n this.mode = options.mode ?? 'memory';\n this.memoryBackend = new MemorySessionBackend();\n this.memoryCheckpointers = new Map();\n this.memoryManager = options.memoryManager ?? null;\n this.compactionConfig = options.compactionConfig ?? null;\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 // Session → Memory Sync (GAP-002D)\n // ============================================================================\n\n /**\n * Sync a completed session to orbital memory.\n * This enables the agent to learn from past sessions.\n *\n * @param threadId - The session thread ID\n * @param userId - The user ID for memory association\n * @param sessionData - Additional session data to record\n * @returns Promise that resolves when sync is complete\n */\n async syncSessionToMemory(\n threadId: string,\n userId: string,\n sessionData: {\n appId: string;\n inputDescription: string;\n generatedOrbital?: string;\n patternsUsed?: string[];\n entities?: string[];\n success: boolean;\n errorMessage?: string;\n },\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping session sync');\n return;\n }\n\n const metadata = this.get(threadId);\n if (!metadata) {\n console.warn(`[SessionManager] Session ${threadId} not found, skipping sync`);\n return;\n }\n\n try {\n await this.memoryManager.recordGeneration(userId, {\n threadId,\n prompt: sessionData.inputDescription,\n skill: metadata.skill,\n generatedSchema: sessionData.generatedOrbital ? { name: sessionData.generatedOrbital } : undefined,\n patterns: sessionData.patternsUsed ?? [],\n entities: sessionData.entities ?? [],\n success: sessionData.success,\n completedAt: new Date(),\n });\n\n // Also update user preferences based on patterns used\n if (sessionData.patternsUsed && sessionData.patternsUsed.length > 0) {\n await this.memoryManager.updateUserPreferences(userId, {\n preferredPatterns: sessionData.patternsUsed,\n commonEntities: sessionData.entities,\n });\n }\n\n // Update project context if entities were generated\n if (sessionData.entities && sessionData.entities.length > 0) {\n await this.memoryManager.updateProjectContext(sessionData.appId, {\n userId,\n existingEntities: sessionData.entities,\n });\n }\n\n console.log(`[SessionManager] Session ${threadId} synced to memory for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to sync session to memory:', error);\n }\n }\n\n // ============================================================================\n // Interrupt → Memory Sync (GAP-003: Interrupt Memory)\n // ============================================================================\n\n /**\n * Record an interrupt decision to memory.\n * This enables learning from HITL (Human-in-the-Loop) decisions.\n *\n * @param sessionId - The session thread ID\n * @param userId - The user who made the decision\n * @param interruptData - The interrupt decision data\n * @returns Promise that resolves when sync is complete\n */\n async recordInterruptDecision(\n sessionId: string,\n userId: string,\n interruptData: {\n toolName: string;\n toolArgs: Record<string, unknown>;\n decision: 'approved' | 'rejected' | 'modified';\n modifiedArgs?: Record<string, unknown>;\n reason?: string;\n },\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping interrupt sync');\n return;\n }\n\n try {\n await this.memoryManager.recordInterruptDecision(sessionId, userId, interruptData);\n console.log(`[SessionManager] Interrupt recorded for user ${userId}: ${interruptData.toolName} ${interruptData.decision}`);\n } catch (error) {\n console.error('[SessionManager] Failed to record interrupt:', error);\n }\n }\n\n /**\n * Get interrupt history for a session.\n */\n async getSessionInterrupts(sessionId: string): Promise<import('../memory/types.js').InterruptRecord[]> {\n if (!this.memoryManager) {\n return [];\n }\n return this.memoryManager.getSessionInterrupts(sessionId);\n }\n\n /**\n * Check if a tool should be auto-approved for a user.\n */\n async shouldAutoApproveTool(userId: string, toolName: string): Promise<boolean> {\n if (!this.memoryManager) {\n return false;\n }\n return this.memoryManager.shouldAutoApproveTool(userId, toolName);\n }\n\n // ============================================================================\n // Checkpoint Management (GAP-004: Checkpoint → Memory)\n // ============================================================================\n\n /**\n * Record a checkpoint to memory for learning.\n *\n * @param userId - The user who owns this checkpoint\n * @param checkpointData - Checkpoint information\n * @returns Promise that resolves when checkpoint is recorded\n */\n async recordCheckpoint(\n userId: string,\n checkpointData: {\n checkpointId: string;\n threadId: string;\n parentCheckpointId?: string;\n metadata?: Record<string, unknown>;\n },\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping checkpoint record');\n return;\n }\n\n try {\n await this.memoryManager.recordCheckpoint(userId, checkpointData);\n console.log(`[SessionManager] Checkpoint ${checkpointData.checkpointId} recorded for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to record checkpoint:', error);\n }\n }\n\n /**\n * Record a rollback to a checkpoint.\n *\n * @param userId - The user who performed the rollback\n * @param checkpointId - The checkpoint rolled back to\n * @param reason - Optional reason for rollback\n * @returns Promise that resolves when rollback is recorded\n */\n async recordRollback(\n userId: string,\n checkpointId: string,\n reason?: string,\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping rollback record');\n return;\n }\n\n try {\n await this.memoryManager.recordRollback(userId, checkpointId, reason);\n console.log(`[SessionManager] Rollback to ${checkpointId} recorded for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to record rollback:', error);\n }\n }\n\n /**\n * Mark a checkpoint as successful (terminal state).\n *\n * @param userId - The user who owns this checkpoint\n * @param checkpointId - The checkpoint that was successful\n * @returns Promise that resolves when success is recorded\n */\n async markCheckpointSuccessful(userId: string, checkpointId: string): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping success mark');\n return;\n }\n\n try {\n await this.memoryManager.markCheckpointSuccessful(userId, checkpointId);\n console.log(`[SessionManager] Checkpoint ${checkpointId} marked as successful for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to mark checkpoint as successful:', error);\n }\n }\n\n /**\n * Get checkpoint history for a thread.\n *\n * @param threadId - The thread to get checkpoints for\n * @returns Array of checkpoint records\n */\n async getThreadCheckpoints(threadId: string): Promise<import('../memory/types.js').CheckpointRecord[]> {\n if (!this.memoryManager) {\n return [];\n }\n return this.memoryManager.getThreadCheckpoints(threadId);\n }\n\n /**\n * Get frequently rolled-back checkpoints (problem areas).\n *\n * @param userId - The user to get problem checkpoints for\n * @param minRollbackCount - Minimum rollback count (default: 2)\n * @returns Array of checkpoint records with rollback issues\n */\n async getProblemCheckpoints(\n userId: string,\n minRollbackCount: number = 2,\n ): Promise<import('../memory/types.js').CheckpointRecord[]> {\n if (!this.memoryManager) {\n return [];\n }\n return this.memoryManager.getProblemCheckpoints(userId, minRollbackCount);\n }\n\n // ============================================================================\n // Context Compaction (GAP-005)\n // ============================================================================\n\n /**\n * Get the context compaction configuration.\n * @returns The compaction configuration or null if not configured.\n */\n getCompactionConfig(): ContextCompactionConfig | null {\n return this.compactionConfig;\n }\n\n /**\n * Check if a session's messages need compaction based on token count.\n * Uses character-based estimation for quick checks.\n *\n * @param messages - Array of messages to check\n * @returns True if compaction is recommended\n */\n shouldCompactMessages(messages: { content: string | unknown }[]): boolean {\n if (!this.compactionConfig) {\n return false;\n }\n\n const totalChars = messages.reduce((sum, msg) => {\n const content = typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n return sum + content.length;\n }, 0);\n\n const estimatedTokens = totalChars / 4;\n const threshold = this.compactionConfig.maxTokens ?? 150000;\n return estimatedTokens > threshold * 0.8;\n }\n\n /**\n * Record a compaction event for a session.\n * This helps track when and why compaction occurs.\n *\n * @param threadId - The session thread ID\n * @param originalMessageCount - Number of messages before compaction\n * @param compactedMessageCount - Number of messages after compaction\n * @param reason - Reason for compaction\n */\n async recordCompaction(\n threadId: string,\n originalMessageCount: number,\n compactedMessageCount: number,\n reason?: string,\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping compaction record');\n return;\n }\n\n try {\n const metadata = this.get(threadId);\n if (metadata) {\n // Store compaction info in session metadata\n const compactionInfo = {\n timestamp: Date.now(),\n originalMessageCount,\n compactedMessageCount,\n reason: reason ?? 'token_limit',\n };\n // Update metadata with compaction history\n const meta = metadata as unknown as Record<string, unknown>;\n const existingCompactions = (meta.compactions as unknown[] | undefined) ?? [];\n meta.compactions = [...existingCompactions, compactionInfo];\n this.store(threadId, metadata);\n }\n console.log(`[SessionManager] Compaction recorded for ${threadId}: ${originalMessageCount} → ${compactedMessageCount} messages`);\n } catch (error) {\n console.error('[SessionManager] Failed to record compaction:', error);\n }\n }\n\n /**\n * Get compaction history for a session.\n *\n * @param threadId - The session thread ID\n * @returns Array of compaction events\n */\n getCompactionHistory(threadId: string): Array<{\n timestamp: number;\n originalMessageCount: number;\n compactedMessageCount: number;\n reason: string;\n }> {\n const metadata = this.get(threadId);\n if (!metadata) {\n return [];\n }\n const meta = metadata as unknown as Record<string, unknown>;\n return (meta.compactions as Array<{\n timestamp: number;\n originalMessageCount: number;\n compactedMessageCount: number;\n reason: string;\n }>) ?? [];\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 createKimiClient,\n createOpenRouterClient,\n ANTHROPIC_MODELS,\n DEEPSEEK_MODELS,\n OPENAI_MODELS,\n KIMI_MODELS,\n OPENROUTER_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';\nimport { MemoryManager, type UserPreference, type ProjectContext } from '../memory/index.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 for main agent */\n provider?: LLMProvider;\n /** Optional: Model name for main agent */\n model?: string;\n /** Optional: LLM provider for subagents (orbital, trait, domain generation). Defaults to 'anthropic' */\n subagentProvider?: LLMProvider;\n /** Optional: Model name for subagents. Defaults to 'claude-sonnet-4-20250514' */\n subagentModel?: 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 /** Optional: Memory manager for user/project memory (GAP-001) */\n memoryManager?: MemoryManager;\n /** Optional: User ID for memory lookup */\n userId?: string;\n /** Optional: App ID for project context */\n appId?: string;\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 /** User preferences loaded from memory (GAP-001) */\n userPreferences?: UserPreference | null;\n /** Project context loaded from memory (GAP-001) */\n projectContext?: ProjectContext | null;\n /** Memory manager instance (GAP-001) */\n memoryManager?: MemoryManager;\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 'kimi':\n if (verbose)\n console.log(`[SkillAgent] Using Kimi: ${model || KIMI_MODELS.K2_5}`);\n return createKimiClient({\n model: model || KIMI_MODELS.K2_5,\n temperature: 0.6, // Kimi with thinking disabled requires 0.6\n });\n\n case 'openrouter':\n if (verbose)\n console.log(`[SkillAgent] Using OpenRouter: ${model || OPENROUTER_MODELS.QWEN_2_5_72B}`);\n return createOpenRouterClient({\n model: model || OPENROUTER_MODELS.QWEN_2_5_72B,\n temperature: 0.3,\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 subagentProvider = 'anthropic',\n subagentModel = 'claude-sonnet-4-20250514',\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 // 4.5 Load user memory and project context (GAP-001)\n let userPreferences: UserPreference | null = null;\n let projectContext: ProjectContext | null = null;\n \n if (options.memoryManager && options.userId) {\n try {\n userPreferences = await options.memoryManager.getUserPreferences(options.userId);\n \n if (userPreferences && verbose) {\n console.log(`[SkillAgent] Loaded user preferences: ${userPreferences.namingConvention} naming, ${userPreferences.preferredPatterns.length} patterns`);\n }\n \n if (options.appId) {\n projectContext = await options.memoryManager.getProjectContext(options.appId);\n \n if (projectContext && verbose) {\n console.log(`[SkillAgent] Loaded project context: ${projectContext.existingEntities.length} entities`);\n }\n }\n } catch (error) {\n console.warn('[SkillAgent] Failed to load memory:', error);\n }\n }\n \n // Build memory context section\n const memoryContext = buildMemoryContext(userPreferences, projectContext);\n\n const systemPrompt = [\n BASE_SYSTEM_PROMPT,\n '\\n## Skill Instructions\\n\\n' + skillInstructions,\n references ? '\\n## Reference Documentation\\n\\n' + references : '',\n memoryContext ? '\\n## User Context\\n\\n' + memoryContext : '',\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 ORBITAL_BATCH_SKILLS = ['kflow-orbitals-batch'];\n const LEAN_SKILLS = ['kflow-lean-orbitals', 'kflow-lean-fixing'];\n const isOrbitalSkill = primarySkill.name === 'kflow-orbitals';\n const isOrbitalBatchSkill = ORBITAL_BATCH_SKILLS.includes(primarySkill.name);\n const isLeanSkill = LEAN_SKILLS.includes(primarySkill.name);\n const needsChunkingTools = ORBITAL_SKILLS.includes(primarySkill.name);\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 orbitalBatchTool: ReturnType<typeof import('../tools/orbital-batch-subagent.js').createOrbitalBatchSubagentTool>['tool'] | undefined;\n let setBatchEventCallback: ReturnType<typeof import('../tools/orbital-batch-subagent.js').createOrbitalBatchSubagentTool>['setEventCallback'] | 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 provider: subagentProvider,\n model: subagentModel,\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 (isOrbitalBatchSkill) {\n const { createOrbitalBatchSubagentTool } = await import('../tools/orbital-batch-subagent.js');\n const batchResult = createOrbitalBatchSubagentTool({\n requirements: options.requirements,\n provider: subagentProvider,\n model: subagentModel,\n workDir,\n });\n orbitalBatchTool = batchResult.tool;\n setBatchEventCallback = batchResult.setEventCallback;\n\n if (options.onSubagentEvent) {\n setBatchEventCallback(options.onSubagentEvent);\n }\n\n if (verbose) {\n console.log(`[SkillAgent] Batch orbital tools enabled for kflow-orbitals-batch skill`);\n }\n }\n\n if (isLeanSkill) {\n domainOrbitalTools = createDomainOrbitalTools({ \n workDir,\n provider: subagentProvider,\n model: subagentModel,\n });\n if (verbose) {\n console.log(`[SkillAgent] Domain orbital tools enabled for ${primarySkill.name} skill (provider: ${subagentProvider})`);\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 || isOrbitalBatchSkill ? [] : [validateSchemaTool]),\n ...(orbitalTool ? [orbitalTool] : []),\n ...(orbitalBatchTool ? [orbitalBatchTool] : []),\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 userPreferences,\n projectContext,\n memoryManager: options.memoryManager,\n };\n}\n\n// ============================================================================\n// Memory Context Helper (GAP-001)\n// ============================================================================\n\n/**\n * Build memory context string for system prompt\n */\nfunction buildMemoryContext(\n userPreferences: UserPreference | null,\n projectContext: ProjectContext | null,\n): string | null {\n const sections: string[] = [];\n\n if (userPreferences) {\n const prefs: string[] = [];\n \n if (userPreferences.namingConvention) {\n prefs.push(`- Preferred naming: ${userPreferences.namingConvention}`);\n }\n if (userPreferences.validationStyle) {\n prefs.push(`- Validation style: ${userPreferences.validationStyle}`);\n }\n if (userPreferences.preferredPatterns.length > 0) {\n prefs.push(`- Preferred patterns: ${userPreferences.preferredPatterns.join(', ')}`);\n }\n if (userPreferences.commonEntities.length > 0) {\n prefs.push(`- Commonly used entities: ${userPreferences.commonEntities.join(', ')}`);\n }\n \n if (prefs.length > 0) {\n sections.push(`### User Preferences\\n${prefs.join('\\n')}`);\n }\n }\n\n if (projectContext) {\n const ctx: string[] = [];\n \n if (projectContext.projectName) {\n ctx.push(`- Project: ${projectContext.projectName}`);\n }\n if (projectContext.domain) {\n ctx.push(`- Domain: ${projectContext.domain}`);\n }\n if (projectContext.existingEntities.length > 0) {\n ctx.push(`- Existing entities: ${projectContext.existingEntities.join(', ')}`);\n }\n if (projectContext.conventions.length > 0) {\n ctx.push(`- Project conventions: ${projectContext.conventions.join(', ')}`);\n }\n \n if (ctx.length > 0) {\n sections.push(`### Project Context\\n${ctx.join('\\n')}`);\n }\n }\n\n return sections.length > 0 ? sections.join('\\n\\n') : null;\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","/**\n * Firestore Store for LangGraph\n *\n * Custom implementation of BaseStore using Firebase Firestore.\n * This provides persistent key-value storage for agent memories.\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 {\n BaseStore,\n type Item,\n type GetOperation,\n type SearchOperation,\n type PutOperation,\n type ListNamespacesOperation,\n type Operation,\n type OperationResults,\n type SearchItem,\n} from '@langchain/langgraph-checkpoint';\n\nimport type { FirestoreDb, FirestoreTimestamp } from './firestore-checkpointer.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for FirestoreStore.\n */\nexport interface FirestoreStoreOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for store items.\n * @default 'agent_memories'\n */\n collection?: string;\n}\n\n/**\n * Document structure for store items.\n */\ninterface StoreDocument {\n namespace: string[];\n namespaceKey: string; // Joined namespace for querying\n key: string;\n value: Record<string, unknown>;\n createdAt: FirestoreTimestamp;\n updatedAt: FirestoreTimestamp;\n}\n\n// ============================================================================\n// FirestoreStore\n// ============================================================================\n\n/**\n * Firestore-backed store for LangGraph agent memories.\n *\n * Provides persistent key-value storage that can be shared across threads.\n * Items are organized by hierarchical namespaces.\n *\n * @example\n * ```typescript\n * import { getFirestore } from 'firebase-admin/firestore';\n *\n * const store = new FirestoreStore({\n * db: getFirestore(),\n * collection: 'agent_memories',\n * });\n *\n * // Store a memory\n * await store.put(['agent', 'patterns'], 'schema-best-practices', {\n * content: 'Always validate schemas before saving',\n * });\n *\n * // Retrieve a memory\n * const item = await store.get(['agent', 'patterns'], 'schema-best-practices');\n * ```\n */\nexport class FirestoreStore extends BaseStore {\n private db: FirestoreDb;\n private collection: string;\n\n constructor(options: FirestoreStoreOptions) {\n super();\n this.db = options.db;\n this.collection = options.collection ?? 'agent_memories';\n }\n\n /**\n * Create document ID from namespace and key.\n */\n private makeDocId(namespace: string[], key: string): string {\n return [...namespace, key].join('/');\n }\n\n /**\n * Create namespace key for querying.\n */\n private makeNamespaceKey(namespace: string[]): string {\n return namespace.join('/');\n }\n\n /**\n * Execute multiple operations in a batch.\n */\n async batch<Op extends Operation[]>(operations: Op): Promise<OperationResults<Op>> {\n const results: unknown[] = [];\n\n for (const op of operations) {\n if ('key' in op && 'namespace' in op && !('namespacePrefix' in op)) {\n if ('value' in op) {\n // PutOperation\n const putOp = op as PutOperation;\n if (putOp.value === null) {\n await this.deleteItem(putOp.namespace, putOp.key);\n } else {\n await this.putItem(putOp.namespace, putOp.key, putOp.value);\n }\n results.push(undefined);\n } else {\n // GetOperation\n const getOp = op as GetOperation;\n const item = await this.getItem(getOp.namespace, getOp.key);\n results.push(item);\n }\n } else if ('namespacePrefix' in op) {\n // SearchOperation\n const searchOp = op as SearchOperation;\n const items = await this.searchItems(searchOp);\n results.push(items);\n } else if ('matchConditions' in op || ('limit' in op && 'offset' in op && !('namespacePrefix' in op))) {\n // ListNamespacesOperation\n const listOp = op as ListNamespacesOperation;\n const namespaces = await this.listNamespacesItems(listOp);\n results.push(namespaces);\n }\n }\n\n return results as OperationResults<Op>;\n }\n\n /**\n * Get an item by namespace and key.\n */\n private async getItem(namespace: string[], key: string): Promise<Item | null> {\n const docId = this.makeDocId(namespace, key);\n const doc = await this.db.collection(this.collection).doc(docId).get();\n\n if (!doc.exists) {\n return null;\n }\n\n const data = doc.data() as unknown as StoreDocument;\n return {\n namespace: data.namespace,\n key: data.key,\n value: data.value,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n updatedAt: data.updatedAt?.toDate?.() ?? new Date(data.updatedAt as unknown as string),\n };\n }\n\n /**\n * Put an item.\n */\n private async putItem(\n namespace: string[],\n key: string,\n value: Record<string, unknown>\n ): Promise<void> {\n const docId = this.makeDocId(namespace, key);\n const now = new Date();\n\n const existingDoc = await this.db.collection(this.collection).doc(docId).get();\n const createdAt = existingDoc.exists\n ? ((existingDoc.data() as unknown as StoreDocument).createdAt as unknown as Date)\n : now;\n\n const docData = {\n namespace,\n namespaceKey: this.makeNamespaceKey(namespace),\n key,\n value,\n createdAt,\n updatedAt: now,\n };\n\n await this.db.collection(this.collection).doc(docId).set(docData);\n }\n\n /**\n * Delete an item.\n */\n private async deleteItem(namespace: string[], key: string): Promise<void> {\n const docId = this.makeDocId(namespace, key);\n await this.db.collection(this.collection).doc(docId).delete();\n }\n\n /**\n * Search for items.\n */\n private async searchItems(op: SearchOperation): Promise<SearchItem[]> {\n const namespacePrefix = this.makeNamespaceKey(op.namespacePrefix);\n const limit = op.limit ?? 10;\n const offset = op.offset ?? 0;\n\n // Query by namespace prefix\n let query = this.db.collection(this.collection) as unknown as {\n where(field: string, op: string, value: unknown): typeof query;\n limit(n: number): typeof query;\n get(): Promise<{ docs: Array<{ data(): Record<string, unknown> }> }>;\n };\n\n if (namespacePrefix) {\n // Use range query for prefix matching\n query = query\n .where('namespaceKey', '>=', namespacePrefix)\n .where('namespaceKey', '<', namespacePrefix + '\\uffff');\n }\n\n // Apply filters\n if (op.filter) {\n for (const [key, filterValue] of Object.entries(op.filter)) {\n if (typeof filterValue === 'object' && filterValue !== null) {\n // Handle comparison operators\n for (const [operator, value] of Object.entries(filterValue as Record<string, unknown>)) {\n switch (operator) {\n case '$eq':\n query = query.where(`value.${key}`, '==', value);\n break;\n case '$ne':\n query = query.where(`value.${key}`, '!=', value);\n break;\n case '$gt':\n query = query.where(`value.${key}`, '>', value);\n break;\n case '$gte':\n query = query.where(`value.${key}`, '>=', value);\n break;\n case '$lt':\n query = query.where(`value.${key}`, '<', value);\n break;\n case '$lte':\n query = query.where(`value.${key}`, '<=', value);\n break;\n }\n }\n } else {\n // Direct equality\n query = query.where(`value.${key}`, '==', filterValue);\n }\n }\n }\n\n // Apply pagination\n query = query.limit(limit + offset);\n\n const snapshot = await query.get();\n const docs = snapshot.docs.slice(offset);\n\n return docs.map((doc) => {\n const data = doc.data() as unknown as StoreDocument;\n return {\n namespace: data.namespace,\n key: data.key,\n value: data.value,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n updatedAt: data.updatedAt?.toDate?.() ?? new Date(data.updatedAt as unknown as string),\n };\n });\n }\n\n /**\n * List namespaces.\n */\n private async listNamespacesItems(op: ListNamespacesOperation): Promise<string[][]> {\n const limit = op.limit ?? 10;\n const offset = op.offset ?? 0;\n\n let query = this.db.collection(this.collection) as unknown as {\n where(field: string, op: string, value: unknown): typeof query;\n get(): Promise<{ docs: Array<{ data(): Record<string, unknown> }> }>;\n };\n\n // Apply match conditions\n if (op.matchConditions) {\n for (const condition of op.matchConditions) {\n const path = condition.path.filter((p) => p !== '*').join('/');\n if (condition.matchType === 'prefix') {\n query = query\n .where('namespaceKey', '>=', path)\n .where('namespaceKey', '<', path + '\\uffff');\n }\n // suffix matching done in memory\n }\n }\n\n // Get all documents and extract unique namespaces\n const snapshot = await query.get();\n const namespaceSet = new Set<string>();\n\n for (const doc of snapshot.docs) {\n const data = doc.data() as unknown as StoreDocument;\n const namespace = data.namespace;\n\n // Apply max depth if specified\n if (op.maxDepth !== undefined && namespace.length > op.maxDepth) {\n namespaceSet.add(namespace.slice(0, op.maxDepth).join('/'));\n } else {\n namespaceSet.add(namespace.join('/'));\n }\n }\n\n const namespaces = Array.from(namespaceSet)\n .map((ns) => ns.split('/'))\n .slice(offset, offset + limit);\n\n return namespaces;\n }\n}\n","/**\n * Event Transformer for DeepAgent\n *\n * Transforms raw LangGraph/deepagents events into SSE events.\n * Handles special events like todo updates and file operations.\n *\n * Supports both:\n * - LangGraph event structures (event.tools, event.model_request)\n * - Legacy flat event structures (event.todos, event.tool_call)\n */\n\nimport {\n createSSEEvent,\n type SSEEvent,\n} from '../api-types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Raw agent event from LangGraph/deepagents.\n */\nexport interface RawAgentEvent {\n // LangGraph nested structures\n tools?: {\n todos?: Array<{ content?: string; task?: string; status?: string; id?: string }>;\n messages?: Array<Record<string, unknown>>;\n };\n model_request?: {\n messages?: Array<Record<string, unknown>>;\n };\n\n // Legacy flat structures\n messages?: Array<{\n role?: string;\n content?: string;\n }>;\n tool_call?: {\n name?: string;\n args?: Record<string, unknown>;\n };\n toolCall?: {\n name?: string;\n args?: Record<string, unknown>;\n };\n tool_result?: {\n name?: string;\n result?: unknown;\n };\n toolResult?: {\n name?: string;\n result?: unknown;\n };\n todos?: Array<{\n id?: string;\n task?: string;\n status?: 'pending' | 'in_progress' | 'completed';\n }>;\n\n // Interrupt events (both formats)\n __interrupt__?: Array<{\n value?: {\n actionRequests?: Array<{ name?: string; args?: Record<string, unknown>; description?: string }>;\n reviewConfigs?: Array<{ allowedDecisions?: string[] }>;\n };\n action?: {\n tool?: string;\n toolInput?: Record<string, unknown>;\n };\n config?: {\n allowedDecisions?: string[];\n };\n }>;\n\n // Other fields\n [key: string]: unknown;\n}\n\n// ============================================================================\n// File Operation Detection\n// ============================================================================\n\n/**\n * File operation tool names from FilesystemMiddleware.\n */\nconst FILE_OPERATION_TOOLS = new Set([\n 'ls',\n 'read_file',\n 'write_file',\n 'edit_file',\n]);\n\n/**\n * Check if a tool name is a file operation.\n */\nfunction isFileOperationTool(toolName: string): boolean {\n return FILE_OPERATION_TOOLS.has(toolName);\n}\n\n// ============================================================================\n// LangGraph Message Extraction Helpers\n// ============================================================================\n\n/**\n * Extract text content from a LangChain message object.\n * Handles both serialized format (kwargs.content) and deserialized format (content directly).\n */\nfunction extractMessageContent(msg: Record<string, unknown>): string | null {\n let content: unknown = null;\n\n if (msg.kwargs && typeof msg.kwargs === 'object') {\n const kwargs = msg.kwargs as Record<string, unknown>;\n content = kwargs.content;\n } else if (msg.content !== undefined) {\n content = msg.content;\n }\n\n if (!content) return null;\n\n if (typeof content === 'string') {\n return content;\n }\n if (Array.isArray(content)) {\n const texts = content\n .filter((block): block is { type: string; text: string } =>\n typeof block === 'object' && block !== null && block.type === 'text' && typeof block.text === 'string'\n )\n .map(block => block.text);\n if (texts.length > 0) {\n return texts.join('\\n');\n }\n }\n\n return null;\n}\n\n/**\n * Extract tool calls from a LangChain AI message.\n * Handles both Anthropic format (tool_use in content) and OpenAI/DeepSeek format (tool_calls in additional_kwargs).\n */\nfunction extractToolCalls(msg: Record<string, unknown>): Array<{ name: string; args: Record<string, unknown> }> | null {\n let content: unknown = null;\n let additionalKwargs: Record<string, unknown> | null = null;\n\n if (msg.kwargs && typeof msg.kwargs === 'object') {\n const kwargs = msg.kwargs as Record<string, unknown>;\n content = kwargs.content;\n additionalKwargs = kwargs.additional_kwargs as Record<string, unknown> | null;\n } else if (msg.content !== undefined) {\n content = msg.content;\n additionalKwargs = msg.additional_kwargs as Record<string, unknown> | null;\n }\n\n // Try OpenAI/DeepSeek format first: tool_calls in additional_kwargs\n if (additionalKwargs?.tool_calls && Array.isArray(additionalKwargs.tool_calls)) {\n const toolCalls = (additionalKwargs.tool_calls as Array<{\n id?: string;\n type?: string;\n function?: { name: string; arguments?: string };\n }>)\n .filter(tc => tc.function?.name)\n .map(tc => {\n let args: Record<string, unknown> = {};\n const rawArgs = tc.function?.arguments;\n const toolName = tc.function?.name || 'unknown';\n\n if (rawArgs) {\n try {\n args = JSON.parse(rawArgs);\n } catch {\n // If JSON parse fails, skip\n }\n }\n return { name: toolName, args };\n });\n\n if (toolCalls.length > 0) {\n return toolCalls;\n }\n }\n\n // Try Anthropic format: tool_use blocks in content array\n if (content && Array.isArray(content)) {\n const toolCalls = content\n .filter((block): block is { type: string; name: string; input?: Record<string, unknown> } =>\n typeof block === 'object' && block !== null && block.type === 'tool_use' && typeof block.name === 'string'\n )\n .map(block => ({ name: block.name, args: block.input || {} }));\n\n if (toolCalls.length > 0) {\n return toolCalls;\n }\n }\n\n return null;\n}\n\n/**\n * Check if a message is an AI message.\n */\nfunction isAIMessage(msg: Record<string, unknown>): boolean {\n if (Array.isArray(msg.id) && (msg.id as string[]).includes('AIMessage')) return true;\n if ((msg as { type?: string }).type === 'ai') return true;\n return false;\n}\n\n// ============================================================================\n// Event Transformation\n// ============================================================================\n\n/**\n * Transform a raw agent event to SSE event(s).\n *\n * Handles both LangGraph nested structures and legacy flat structures.\n * Returns an array for consistency with multi-event scenarios.\n *\n * @param event Raw agent event\n * @param threadId Thread ID for context\n * @returns Array of SSE events\n */\nexport function transformAgentEvent(\n event: RawAgentEvent,\n threadId?: string\n): SSEEvent {\n const events = transformAgentEventMulti(event, threadId);\n return events[0] || createSSEEvent('message', { content: '', role: 'assistant', isComplete: true });\n}\n\n/**\n * Transform a raw agent event to multiple SSE events.\n * Use this when you need to handle all events from a single LangGraph event.\n */\nexport function transformAgentEventMulti(\n event: RawAgentEvent,\n threadId?: string\n): SSEEvent[] {\n const events: SSEEvent[] = [];\n\n // 1. Handle interrupts (highest priority)\n if (hasInterrupt(event)) {\n events.push(createSSEEvent('interrupt', extractInterruptData(event, threadId || 'unknown')));\n return events;\n }\n\n // 2. Handle LangGraph tools events (contains todos OR tool results)\n if (event.tools && typeof event.tools === 'object') {\n const toolsData = event.tools;\n\n // Check for todo updates from TodoListMiddleware\n if (toolsData.todos && Array.isArray(toolsData.todos) && toolsData.todos.length > 0) {\n const todos = toolsData.todos.map((t, idx) => ({\n id: t.id || `todo-${idx}`,\n task: t.task || t.content || '',\n status: (t.status as 'pending' | 'in_progress' | 'completed') || 'pending',\n }));\n events.push(createSSEEvent('todo_update', { todos }));\n return events;\n }\n\n // Check for tool execution results (ToolMessage)\n if (toolsData.messages && Array.isArray(toolsData.messages)) {\n const lastMsg = toolsData.messages[toolsData.messages.length - 1];\n\n // Extract kwargs — handle both LangChain 0.x (nested kwargs) and 1.x (flat properties)\n let kwargs: { content?: string; name?: string; status?: string } | undefined;\n if (lastMsg?.kwargs) {\n kwargs = lastMsg.kwargs as { content?: string; name?: string; status?: string };\n } else if (lastMsg && typeof lastMsg === 'object') {\n const msg = lastMsg as Record<string, unknown>;\n if (msg.content !== undefined || msg.name !== undefined) {\n kwargs = {\n content: String(msg.content || ''),\n name: String(msg.name || 'unknown'),\n status: String(msg.status || 'success'),\n };\n }\n }\n\n if (kwargs) {\n const content = kwargs.content || '';\n const toolName = kwargs.name || 'unknown';\n const success = kwargs.status !== 'error';\n\n events.push(createSSEEvent('tool_result', {\n tool: toolName,\n result: content,\n success,\n }));\n return events;\n }\n }\n }\n\n // 3. Handle LangGraph model_request (AI thinking/tool calls)\n if (event.model_request && typeof event.model_request === 'object') {\n const modelData = event.model_request as { messages?: Array<Record<string, unknown>> };\n if (modelData.messages && Array.isArray(modelData.messages)) {\n // Find the last AI message\n const aiMessages = modelData.messages.filter(isAIMessage);\n\n if (aiMessages.length > 0) {\n const lastAI = aiMessages[aiMessages.length - 1];\n\n // Check for tool calls first\n const toolCalls = extractToolCalls(lastAI);\n if (toolCalls && toolCalls.length > 0) {\n const toolCall = toolCalls[0];\n\n // Check if it's a file operation\n if (isFileOperationTool(toolCall.name)) {\n events.push(createSSEEvent('file_operation', {\n operation: toolCall.name as 'ls' | 'read_file' | 'write_file' | 'edit_file',\n path: (toolCall.args.path as string) || '',\n success: true,\n }));\n } else {\n events.push(createSSEEvent('tool_call', {\n tool: toolCall.name,\n args: toolCall.args,\n }));\n }\n return events;\n }\n\n // Extract text content (AI thinking)\n const content = extractMessageContent(lastAI);\n if (content && content.trim()) {\n events.push(createSSEEvent('message', {\n content: content,\n role: 'assistant',\n isComplete: false,\n }));\n return events;\n }\n }\n }\n }\n\n // 4. Handle legacy flat todo updates\n if (event.todos && Array.isArray(event.todos) && event.todos.length > 0) {\n events.push(createSSEEvent('todo_update', {\n todos: event.todos.map((t, idx) => ({\n id: t.id || `todo-${idx}`,\n task: t.task || '',\n status: t.status || 'pending',\n })),\n }));\n return events;\n }\n\n // 5. Handle legacy flat tool calls\n const toolCall = event.tool_call || event.toolCall;\n if (toolCall) {\n const toolName = toolCall.name || 'unknown';\n const toolArgs = toolCall.args || {};\n\n if (isFileOperationTool(toolName)) {\n events.push(createSSEEvent('file_operation', {\n operation: toolName as 'ls' | 'read_file' | 'write_file' | 'edit_file',\n path: (toolArgs.path as string) || '',\n success: true,\n }));\n } else {\n events.push(createSSEEvent('tool_call', {\n tool: toolName,\n args: toolArgs,\n }));\n }\n return events;\n }\n\n // 6. Handle legacy flat tool results\n const toolResult = event.tool_result || event.toolResult;\n if (toolResult) {\n events.push(createSSEEvent('tool_result', {\n tool: toolResult.name || 'unknown',\n result: toolResult.result,\n success: true,\n }));\n return events;\n }\n\n // 7. Handle legacy flat messages\n if (event.messages && Array.isArray(event.messages)) {\n const lastMessage = event.messages[event.messages.length - 1];\n if (lastMessage && typeof lastMessage === 'object') {\n events.push(createSSEEvent('message', {\n content: lastMessage.content || '',\n role: (lastMessage.role as 'assistant' | 'user' | 'system') || 'assistant',\n isComplete: true,\n }));\n return events;\n }\n }\n\n // 8. Default: skip unknown events\n return events;\n}\n\n/**\n * Check if an event contains an interrupt.\n */\nexport function hasInterrupt(event: RawAgentEvent): boolean {\n return '__interrupt__' in event && event.__interrupt__ !== undefined;\n}\n\n/**\n * Extract interrupt data from an event.\n */\nexport function extractInterruptData(event: RawAgentEvent, threadId: string): {\n threadId: string;\n actionRequests: Array<{\n tool: string;\n args: Record<string, unknown>;\n allowedDecisions: ('approve' | 'edit' | 'reject')[];\n description?: string;\n }>;\n} {\n const interrupts = event.__interrupt__;\n const actionRequests: Array<{\n tool: string;\n args: Record<string, unknown>;\n allowedDecisions: ('approve' | 'edit' | 'reject')[];\n description?: string;\n }> = [];\n\n for (const ir of interrupts || []) {\n // New HITL middleware format (value.actionRequests + value.reviewConfigs)\n if (ir.value?.actionRequests && ir.value?.reviewConfigs) {\n const { actionRequests: actions, reviewConfigs } = ir.value;\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i];\n const config = reviewConfigs[i];\n actionRequests.push({\n tool: action.name || 'unknown',\n args: action.args || {},\n description: action.description,\n allowedDecisions: (config?.allowedDecisions as ('approve' | 'edit' | 'reject')[]) || ['approve', 'edit', 'reject'],\n });\n }\n }\n // Legacy format support\n else if (ir.action) {\n actionRequests.push({\n tool: ir.action.tool || 'unknown',\n args: ir.action.toolInput || {},\n allowedDecisions: (ir.config?.allowedDecisions as ('approve' | 'edit' | 'reject')[]) || ['approve', 'edit', 'reject'],\n });\n }\n }\n\n return { threadId, actionRequests };\n}\n\n/**\n * Check if an event is a todo update.\n */\nexport function isTodoUpdate(event: RawAgentEvent): boolean {\n // Check both LangGraph and legacy formats\n if (event.tools?.todos && Array.isArray(event.tools.todos) && event.tools.todos.length > 0) {\n return true;\n }\n return 'todos' in event && Array.isArray(event.todos) && event.todos.length > 0;\n}\n\n/**\n * Check if an event is a file operation.\n */\nexport function isFileOperation(event: RawAgentEvent): boolean {\n const toolCall = event.tool_call || event.toolCall;\n if (toolCall?.name && isFileOperationTool(toolCall.name)) return true;\n\n // Check LangGraph format\n if (event.model_request?.messages) {\n const aiMessages = event.model_request.messages.filter(isAIMessage);\n if (aiMessages.length > 0) {\n const toolCalls = extractToolCalls(aiMessages[aiMessages.length - 1] as Record<string, unknown>);\n if (toolCalls && toolCalls.length > 0) {\n return isFileOperationTool(toolCalls[0].name);\n }\n }\n }\n\n return false;\n}\n\n/**\n * Extract file operation details from an event.\n */\nexport function extractFileOperation(event: RawAgentEvent): {\n operation: string;\n path: string;\n} | null {\n const toolCall = event.tool_call || event.toolCall;\n if (toolCall?.name && isFileOperationTool(toolCall.name)) {\n return {\n operation: toolCall.name,\n path: (toolCall.args?.path as string) || '',\n };\n }\n\n // Check LangGraph format\n if (event.model_request?.messages) {\n const aiMessages = event.model_request.messages.filter(isAIMessage);\n if (aiMessages.length > 0) {\n const toolCalls = extractToolCalls(aiMessages[aiMessages.length - 1] as Record<string, unknown>);\n if (toolCalls && toolCalls.length > 0 && isFileOperationTool(toolCalls[0].name)) {\n return {\n operation: toolCalls[0].name,\n path: (toolCalls[0].args.path as string) || '',\n };\n }\n }\n }\n\n return null;\n}\n","/**\n * Memory Orbital Schema\n *\n * Defines the structure for agent memory using Orbital types.\n * This is an OrbitalSchema that represents user memory, preferences,\n * and generation history.\n *\n * @packageDocumentation\n */\n\nimport type {\n OrbitalSchema,\n Entity,\n Trait,\n} from '@almadar/core';\n\n// ============================================================================\n// Memory Entity Types\n// ============================================================================\n\n/**\n * User preference entity - stores learned or explicit preferences\n */\nexport const UserPreferenceEntity: Entity = {\n name: 'UserPreference',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'namingConvention', type: 'enum', values: ['PascalCase', 'camelCase', 'snake_case'], default: 'PascalCase' },\n { name: 'validationStyle', type: 'enum', values: ['strict', 'minimal', 'none'], default: 'strict' },\n { name: 'preferredPatterns', type: 'array', items: { name: 'pattern', type: 'string' }, default: [] },\n { name: 'commonEntities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'commonTraits', type: 'array', items: { name: 'trait', type: 'string' }, default: [] },\n { name: 'learnedAt', type: 'timestamp' },\n { name: 'confidence', type: 'number', default: 0.5 },\n ],\n};\n\n/**\n * Generation session entity - stores history of generations\n */\nexport const GenerationSessionEntity: Entity = {\n name: 'GenerationSession',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'threadId', type: 'string', required: true },\n { name: 'prompt', type: 'string', required: true },\n { name: 'skill', type: 'string', required: true },\n { name: 'entities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'patterns', type: 'array', items: { name: 'pattern', type: 'string' }, default: [] },\n { name: 'createdAt', type: 'timestamp', required: true },\n { name: 'completedAt', type: 'timestamp' },\n { name: 'success', type: 'boolean', default: false },\n ],\n};\n\n/**\n * Project context entity - stores project-specific conventions\n */\nexport const ProjectContextEntity: Entity = {\n name: 'ProjectContext',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'appId', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'projectName', type: 'string' },\n { name: 'description', type: 'string' },\n { name: 'existingEntities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'conventions', type: 'array', items: { name: 'convention', type: 'string' }, default: [] },\n { name: 'domain', type: 'enum', values: ['business', 'ecommerce', 'cms', 'dashboard', 'workflow'], default: 'business' },\n { name: 'lastUpdatedAt', type: 'timestamp', required: true },\n ],\n};\n\n// ============================================================================\n// Memory Orbital Schema\n// ============================================================================\n\n/**\n * The complete Memory Orbital Schema\n * This defines the structure for storing agent memory\n */\nexport const MemoryOrbitalSchema: OrbitalSchema = {\n name: 'AgentMemory',\n version: '1.0.0',\n description: 'Memory system for KFlow DeepAgent - stores user preferences, generation history, and project context',\n orbitals: [\n {\n name: 'UserPreferenceMemory',\n entity: UserPreferenceEntity,\n traits: [],\n pages: [],\n },\n {\n name: 'GenerationHistoryMemory',\n entity: GenerationSessionEntity,\n traits: [],\n pages: [],\n },\n {\n name: 'ProjectContextMemory',\n entity: ProjectContextEntity,\n traits: [],\n pages: [],\n },\n ],\n};\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type UserPreference = {\n id: string;\n userId: string;\n namingConvention: 'PascalCase' | 'camelCase' | 'snake_case';\n validationStyle: 'strict' | 'minimal' | 'none';\n preferredPatterns: string[];\n commonEntities: string[];\n commonTraits: string[];\n learnedAt: Date;\n confidence: number;\n};\n\nexport type GenerationSession = {\n id: string;\n userId: string;\n threadId: string;\n prompt: string;\n skill: string;\n generatedSchema?: Record<string, unknown>;\n entities: string[];\n patterns: string[];\n validationResult?: { valid: boolean; errors: unknown[] };\n createdAt: Date;\n completedAt?: Date;\n success: boolean;\n};\n\nexport type ProjectContext = {\n id: string;\n appId: string;\n userId: string;\n projectName?: string;\n description?: string;\n existingEntities: string[];\n conventions: string[];\n domain: 'business' | 'ecommerce' | 'cms' | 'dashboard' | 'workflow';\n lastUpdatedAt: Date;\n};\n","/**\n * Memory Manager - GAP-001: Orbital Memory System\n *\n * Manages user memory and preferences using Firestore persistence.\n * Provides the foundation for personalized AI assistance by learning\n * from user interactions and feedback.\n */\n\nimport type {\n UserPreference,\n GenerationSession,\n ProjectContext,\n} from './memory-orbital.js';\nimport type {\n UserFeedback,\n PatternAffinity,\n InterruptRecord,\n ToolApprovalPreference,\n CheckpointRecord,\n} from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal Firestore interface to avoid importing firebase-admin.\n * These match the interfaces defined in firestore-checkpointer.ts\n */\ninterface FirestoreDb {\n collection(path: string): FirestoreCollectionRef;\n batch(): FirestoreBatch;\n}\n\ninterface 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\ninterface FirestoreDocRef {\n set(data: unknown): Promise<unknown>;\n get(): Promise<FirestoreDocSnapshot>;\n update(data: unknown): Promise<unknown>;\n delete(): Promise<unknown>;\n}\n\ninterface FirestoreDocSnapshot {\n exists: boolean;\n data(): Record<string, unknown> | undefined;\n}\n\ninterface 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\ninterface FirestoreQuerySnapshot {\n empty: boolean;\n docs: FirestoreQueryDocSnapshot[];\n size: number;\n}\n\ninterface FirestoreQueryDocSnapshot {\n data(): Record<string, unknown>;\n}\n\ninterface FirestoreBatch {\n set(ref: unknown, data: unknown): void;\n delete(ref: unknown): void;\n commit(): Promise<unknown>;\n}\n\n/**\n * Options for MemoryManager\n */\nexport interface MemoryManagerOptions {\n /**\n * Firestore database instance (injected)\n */\n db: FirestoreDb;\n\n /**\n * Collection name for user preferences\n * @default 'agent_memory_users'\n */\n usersCollection?: string;\n\n /**\n * Collection name for generation sessions\n * @default 'agent_memory_generations'\n */\n generationsCollection?: string;\n\n /**\n * Collection name for project context\n * @default 'agent_memory_projects'\n */\n projectsCollection?: string;\n\n /**\n * Collection name for pattern affinity\n * @default 'agent_memory_patterns'\n */\n patternsCollection?: string;\n\n /**\n * Collection name for user feedback\n * @default 'agent_memory_feedback'\n */\n feedbackCollection?: string;\n\n /**\n * Collection name for interrupt records\n * @default 'agent_memory_interrupts'\n */\n interruptsCollection?: string;\n\n /**\n * Collection name for tool approval preferences\n * @default 'agent_memory_tool_preferences'\n */\n toolPreferencesCollection?: string;\n\n /**\n * Collection name for checkpoint records\n * @default 'agent_memory_checkpoints'\n */\n checkpointsCollection?: string;\n}\n\n// ============================================================================\n// Memory Manager\n// ============================================================================\n\nexport class MemoryManager {\n private db: FirestoreDb;\n private usersCollection: string;\n private generationsCollection: string;\n private projectsCollection: string;\n private patternsCollection: string;\n private feedbackCollection: string;\n private interruptsCollection: string;\n private toolPreferencesCollection: string;\n private checkpointsCollection: string;\n\n constructor(options: MemoryManagerOptions) {\n this.db = options.db;\n this.usersCollection = options.usersCollection ?? 'agent_memory_users';\n this.generationsCollection =\n options.generationsCollection ?? 'agent_memory_generations';\n this.projectsCollection = options.projectsCollection ?? 'agent_memory_projects';\n this.patternsCollection = options.patternsCollection ?? 'agent_memory_patterns';\n this.feedbackCollection = options.feedbackCollection ?? 'agent_memory_feedback';\n this.interruptsCollection = options.interruptsCollection ?? 'agent_memory_interrupts';\n this.toolPreferencesCollection = options.toolPreferencesCollection ?? 'agent_memory_tool_preferences';\n this.checkpointsCollection = options.checkpointsCollection ?? 'agent_memory_checkpoints';\n }\n\n // ============================================================================\n // User Preferences\n // ============================================================================\n\n /**\n * Get user preferences with defaults\n */\n async getUserPreferences(userId: string): Promise<UserPreference | null> {\n const doc = await this.db.collection(this.usersCollection).doc(userId).get();\n if (!doc.exists) return null;\n return this.parsePreference(doc.data() as Record<string, unknown>);\n }\n\n /**\n * Update user preferences\n */\n async updateUserPreferences(\n userId: string,\n preferences: Partial<Omit<UserPreference, 'id' | 'userId' | 'learnedAt'>>,\n ): Promise<void> {\n const existing = await this.getUserPreferences(userId);\n const merged: UserPreference = {\n id: existing?.id ?? `pref_${Date.now()}`,\n userId,\n namingConvention: preferences.namingConvention ?? existing?.namingConvention ?? 'PascalCase',\n validationStyle: preferences.validationStyle ?? existing?.validationStyle ?? 'strict',\n preferredPatterns: [\n ...(existing?.preferredPatterns ?? []),\n ...(preferences.preferredPatterns ?? []),\n ],\n commonEntities: [\n ...(existing?.commonEntities ?? []),\n ...(preferences.commonEntities ?? []),\n ],\n commonTraits: [\n ...(existing?.commonTraits ?? []),\n ...(preferences.commonTraits ?? []),\n ],\n learnedAt: existing?.learnedAt ?? new Date(),\n confidence: preferences.confidence ?? existing?.confidence ?? 0.5,\n };\n await this.db\n .collection(this.usersCollection)\n .doc(userId)\n .set(this.serializePreference(merged));\n }\n\n // ============================================================================\n // Generation Session History\n // ============================================================================\n\n /**\n * Record a new generation session\n */\n async recordGeneration(\n userId: string,\n session: Omit<GenerationSession, 'id' | 'userId' | 'createdAt'>,\n ): Promise<string> {\n const sessionId = `gen_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const fullSession: GenerationSession = {\n id: sessionId,\n userId,\n createdAt: new Date(),\n ...session,\n };\n await this.db\n .collection(this.generationsCollection)\n .doc(sessionId)\n .set(this.serializeSession(fullSession));\n return sessionId;\n }\n\n /**\n * Get a specific generation session\n */\n async getGenerationSession(sessionId: string): Promise<GenerationSession | null> {\n const doc = await this.db.collection(this.generationsCollection).doc(sessionId).get();\n if (!doc.exists) return null;\n return this.parseSession(doc.data() as Record<string, unknown>);\n }\n\n /**\n * Get generation history for a user\n */\n async getUserGenerationHistory(\n userId: string,\n limit: number = 50,\n ): Promise<GenerationSession[]> {\n const snapshot = await this.db\n .collection(this.generationsCollection)\n .where('userId', '==', userId)\n .orderBy('createdAt', 'desc')\n .limit(limit)\n .get();\n return snapshot.docs.map((doc) => this.parseSession(doc.data()));\n }\n\n /**\n * Update generation session status\n */\n async updateGenerationStatus(\n sessionId: string,\n status: GenerationSession['success'],\n validationResult?: GenerationSession['validationResult'],\n ): Promise<void> {\n const doc = await this.db.collection(this.generationsCollection).doc(sessionId).get();\n if (!doc.exists) return;\n\n const data = doc.data() as Record<string, unknown>;\n await this.db\n .collection(this.generationsCollection)\n .doc(sessionId)\n .set({\n ...data,\n success: status,\n completedAt: new Date(),\n ...(validationResult && { validationResult }),\n });\n }\n\n // ============================================================================\n // Project Context\n // ============================================================================\n\n /**\n * Get project context\n */\n async getProjectContext(appId: string): Promise<ProjectContext | null> {\n const doc = await this.db.collection(this.projectsCollection).doc(appId).get();\n if (!doc.exists) return null;\n return this.parseContext(doc.data() as Record<string, unknown>);\n }\n\n /**\n * Update project context with new information\n */\n async updateProjectContext(\n appId: string,\n update: Partial<Omit<ProjectContext, 'id' | 'appId'>>,\n ): Promise<void> {\n const existing = await this.getProjectContext(appId);\n if (!existing) {\n // Create new context if it doesn't exist\n if (!update.userId) {\n throw new Error('userId is required when creating new project context');\n }\n const newContext: ProjectContext = {\n id: `ctx_${Date.now()}`,\n appId,\n userId: update.userId,\n existingEntities: update.existingEntities ?? [],\n conventions: update.conventions ?? [],\n domain: update.domain ?? 'business',\n lastUpdatedAt: new Date(),\n ...(update.projectName && { projectName: update.projectName }),\n ...(update.description && { description: update.description }),\n };\n await this.db\n .collection(this.projectsCollection)\n .doc(appId)\n .set(this.serializeContext(newContext));\n return;\n }\n\n const merged: ProjectContext = {\n ...existing,\n existingEntities: [\n ...existing.existingEntities,\n ...(update.existingEntities ?? []),\n ],\n conventions: [\n ...existing.conventions,\n ...(update.conventions ?? []),\n ],\n lastUpdatedAt: new Date(),\n ...(update.projectName && { projectName: update.projectName }),\n ...(update.description && { description: update.description }),\n ...(update.domain && { domain: update.domain }),\n };\n await this.db\n .collection(this.projectsCollection)\n .doc(appId)\n .set(this.serializeContext(merged));\n }\n\n // ============================================================================\n // Pattern Affinity\n // ============================================================================\n\n /**\n * Update pattern affinity based on usage\n */\n async updatePatternAffinity(\n userId: string,\n patternId: string,\n outcome: 'success' | 'failure' | 'partial',\n context?: { entityType?: string; useCase?: string },\n ): Promise<void> {\n const affinityId = `${userId}_${patternId}`;\n const existing = await this.db\n .collection(this.patternsCollection)\n .doc(affinityId)\n .get();\n\n if (!existing.exists) {\n const affinity: PatternAffinity = {\n userId,\n patternId,\n usageCount: 1,\n successCount: outcome === 'success' ? 1 : 0,\n failureCount: outcome === 'failure' ? 1 : 0,\n contexts: context ? [context] : [],\n lastUsedAt: new Date(),\n createdAt: new Date(),\n };\n await this.db\n .collection(this.patternsCollection)\n .doc(affinityId)\n .set(affinity as unknown as Record<string, unknown>);\n } else {\n const data = existing.data() as unknown as PatternAffinity;\n const affinity: PatternAffinity = {\n ...data,\n usageCount: data.usageCount + 1,\n successCount: data.successCount + (outcome === 'success' ? 1 : 0),\n failureCount: data.failureCount + (outcome === 'failure' ? 1 : 0),\n contexts: context ? [...(data.contexts ?? []), context] : data.contexts,\n lastUsedAt: new Date(),\n };\n await this.db\n .collection(this.patternsCollection)\n .doc(affinityId)\n .set(affinity as unknown as Record<string, unknown>);\n }\n }\n\n /**\n * Get pattern affinity for a user\n */\n async getPatternAffinity(userId: string, patternId: string): Promise<PatternAffinity | null> {\n const affinityId = `${userId}_${patternId}`;\n const doc = await this.db.collection(this.patternsCollection).doc(affinityId).get();\n if (!doc.exists) return null;\n return doc.data() as unknown as PatternAffinity;\n }\n\n /**\n * Get all patterns used by a user\n */\n async getUserPatterns(userId: string): Promise<PatternAffinity[]> {\n const snapshot = await this.db\n .collection(this.patternsCollection)\n .where('userId', '==', userId)\n .orderBy('usageCount', 'desc')\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as PatternAffinity);\n }\n\n // ============================================================================\n // User Feedback\n // ============================================================================\n\n /**\n * Record user feedback on a generation\n */\n async recordFeedback(\n sessionId: string,\n feedback: Omit<UserFeedback, 'feedbackId' | 'sessionId' | 'timestamp'>,\n ): Promise<void> {\n const feedbackId = `fb_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const fullFeedback: UserFeedback = {\n feedbackId,\n sessionId,\n ...feedback,\n timestamp: new Date(),\n };\n await this.db\n .collection(this.feedbackCollection)\n .doc(feedbackId)\n .set(fullFeedback as unknown as Record<string, unknown>);\n }\n\n /**\n * Get feedback for a session\n */\n async getSessionFeedback(sessionId: string): Promise<UserFeedback[]> {\n const snapshot = await this.db\n .collection(this.feedbackCollection)\n .where('sessionId', '==', sessionId)\n .orderBy('timestamp', 'desc')\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as UserFeedback);\n }\n\n // ============================================================================\n // Serialization Helpers\n // ============================================================================\n\n private parsePreference(data: Record<string, unknown>): UserPreference {\n const timestampToDate = (ts: unknown): Date => {\n if (ts instanceof Date) return ts;\n if (typeof ts === 'object' && ts !== null && 'toDate' in ts) {\n return (ts as { toDate(): Date }).toDate();\n }\n return new Date(ts as string | number);\n };\n\n return {\n id: data.id as string,\n userId: data.userId as string,\n namingConvention: data.namingConvention as 'PascalCase' | 'camelCase' | 'snake_case',\n validationStyle: data.validationStyle as 'strict' | 'minimal' | 'none',\n preferredPatterns: (data.preferredPatterns as string[]) ?? [],\n commonEntities: (data.commonEntities as string[]) ?? [],\n commonTraits: (data.commonTraits as string[]) ?? [],\n learnedAt: timestampToDate(data.learnedAt),\n confidence: (data.confidence as number) ?? 0.5,\n };\n }\n\n private serializePreference(pref: UserPreference): Record<string, unknown> {\n return { ...pref };\n }\n\n private parseSession(data: Record<string, unknown>): GenerationSession {\n const timestampToDate = (ts: unknown): Date => {\n if (ts instanceof Date) return ts;\n if (typeof ts === 'object' && ts !== null && 'toDate' in ts) {\n return (ts as { toDate(): Date }).toDate();\n }\n return new Date(ts as string | number);\n };\n\n return {\n id: data.id as string,\n userId: data.userId as string,\n threadId: data.threadId as string,\n prompt: data.prompt as string,\n skill: data.skill as string,\n generatedSchema: data.generatedSchema as Record<string, unknown> | undefined,\n entities: (data.entities as string[]) ?? [],\n patterns: (data.patterns as string[]) ?? [],\n validationResult: data.validationResult as { valid: boolean; errors: unknown[] } | undefined,\n createdAt: timestampToDate(data.createdAt),\n completedAt: data.completedAt ? timestampToDate(data.completedAt) : undefined,\n success: data.success as boolean,\n };\n }\n\n private serializeSession(session: GenerationSession): Record<string, unknown> {\n return { ...session };\n }\n\n private parseContext(data: Record<string, unknown>): ProjectContext {\n const timestampToDate = (ts: unknown): Date => {\n if (ts instanceof Date) return ts;\n if (typeof ts === 'object' && ts !== null && 'toDate' in ts) {\n return (ts as { toDate(): Date }).toDate();\n }\n return new Date(ts as string | number);\n };\n\n return {\n id: data.id as string,\n appId: data.appId as string,\n userId: data.userId as string,\n projectName: data.projectName as string | undefined,\n description: data.description as string | undefined,\n existingEntities: (data.existingEntities as string[]) ?? [],\n conventions: (data.conventions as string[]) ?? [],\n domain: data.domain as 'business' | 'ecommerce' | 'cms' | 'dashboard' | 'workflow',\n lastUpdatedAt: timestampToDate(data.lastUpdatedAt),\n };\n }\n\n private serializeContext(context: ProjectContext): Record<string, unknown> {\n return { ...context };\n }\n\n // ============================================================================\n // Interrupt Tracking (GAP-003: Interrupt Memory)\n // ============================================================================\n\n /**\n * Record an interrupt decision for learning\n */\n async recordInterruptDecision(\n sessionId: string,\n userId: string,\n interruptData: {\n toolName: string;\n toolArgs: Record<string, unknown>;\n decision: 'approved' | 'rejected' | 'modified';\n modifiedArgs?: Record<string, unknown>;\n reason?: string;\n },\n ): Promise<void> {\n const interruptId = `int_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const record: InterruptRecord = {\n interruptId,\n sessionId,\n userId,\n toolName: interruptData.toolName,\n toolArgs: interruptData.toolArgs,\n decision: interruptData.decision,\n modifiedArgs: interruptData.modifiedArgs,\n reason: interruptData.reason,\n timestamp: new Date(),\n };\n\n await this.db\n .collection(this.interruptsCollection)\n .doc(interruptId)\n .set(record as unknown as Record<string, unknown>);\n\n // Update tool approval preferences\n await this.updateToolApprovalPreference(userId, interruptData.toolName, interruptData.decision);\n }\n\n /**\n * Get interrupt history for a session\n */\n async getSessionInterrupts(sessionId: string): Promise<InterruptRecord[]> {\n const snapshot = await this.db\n .collection(this.interruptsCollection)\n .where('sessionId', '==', sessionId)\n .orderBy('timestamp', 'desc')\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as InterruptRecord);\n }\n\n /**\n * Get interrupt history for a user\n */\n async getUserInterrupts(userId: string, limit: number = 50): Promise<InterruptRecord[]> {\n const snapshot = await this.db\n .collection(this.interruptsCollection)\n .where('userId', '==', userId)\n .orderBy('timestamp', 'desc')\n .limit(limit)\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as InterruptRecord);\n }\n\n /**\n * Get tool approval preference for a user\n */\n async getToolApprovalPreference(userId: string, toolName: string): Promise<ToolApprovalPreference | null> {\n const prefId = `${userId}_${toolName}`;\n const doc = await this.db.collection(this.toolPreferencesCollection).doc(prefId).get();\n if (!doc.exists) return null;\n return doc.data() as unknown as ToolApprovalPreference;\n }\n\n /**\n * Update tool approval preference based on interrupt decisions\n */\n private async updateToolApprovalPreference(\n userId: string,\n toolName: string,\n decision: 'approved' | 'rejected' | 'modified',\n ): Promise<void> {\n const prefId = `${userId}_${toolName}`;\n const existing = await this.db.collection(this.toolPreferencesCollection).doc(prefId).get();\n\n if (!existing.exists) {\n const pref: ToolApprovalPreference = {\n userId,\n toolName,\n autoApprove: decision === 'approved',\n confidence: decision === 'approved' ? 0.5 : 0,\n approvedCount: decision === 'approved' ? 1 : 0,\n rejectedCount: decision === 'rejected' ? 1 : 0,\n lastDecisionAt: new Date(),\n };\n await this.db\n .collection(this.toolPreferencesCollection)\n .doc(prefId)\n .set(pref as unknown as Record<string, unknown>);\n } else {\n const data = existing.data() as unknown as ToolApprovalPreference;\n const approvedCount = data.approvedCount + (decision === 'approved' ? 1 : 0);\n const rejectedCount = data.rejectedCount + (decision === 'rejected' ? 1 : 0);\n const total = approvedCount + rejectedCount;\n const approvalRate = approvedCount / total;\n\n const pref: ToolApprovalPreference = {\n ...data,\n approvedCount,\n rejectedCount,\n // Auto-approve if approval rate > 80% and at least 5 decisions\n autoApprove: total >= 5 && approvalRate > 0.8,\n confidence: Math.min(0.95, total * 0.1),\n lastDecisionAt: new Date(),\n };\n await this.db\n .collection(this.toolPreferencesCollection)\n .doc(prefId)\n .set(pref as unknown as Record<string, unknown>);\n }\n }\n\n /**\n * Get all tool approval preferences for a user\n */\n async getUserToolPreferences(userId: string): Promise<ToolApprovalPreference[]> {\n const snapshot = await this.db\n .collection(this.toolPreferencesCollection)\n .where('userId', '==', userId)\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as ToolApprovalPreference);\n }\n\n /**\n * Check if a tool should be auto-approved for a user\n */\n async shouldAutoApproveTool(userId: string, toolName: string): Promise<boolean> {\n const pref = await this.getToolApprovalPreference(userId, toolName);\n return pref?.autoApprove ?? false;\n }\n\n // ============================================================================\n // Checkpoint Tracking (GAP-004: Checkpoint → Memory)\n // ============================================================================\n\n /**\n * Record a checkpoint for learning\n */\n async recordCheckpoint(\n userId: string,\n checkpointData: {\n checkpointId: string;\n threadId: string;\n parentCheckpointId?: string;\n metadata?: Record<string, unknown>;\n },\n ): Promise<void> {\n const record: CheckpointRecord = {\n checkpointId: checkpointData.checkpointId,\n threadId: checkpointData.threadId,\n userId,\n parentCheckpointId: checkpointData.parentCheckpointId,\n metadata: checkpointData.metadata ?? {},\n createdAt: new Date(),\n rollbackCount: 0,\n wasSuccessful: false,\n };\n\n const docId = `${userId}_${checkpointData.checkpointId}`;\n await this.db\n .collection(this.checkpointsCollection)\n .doc(docId)\n .set(record as unknown as Record<string, unknown>);\n }\n\n /**\n * Record a rollback to a checkpoint\n */\n async recordRollback(\n userId: string,\n checkpointId: string,\n reason?: string,\n ): Promise<void> {\n const docId = `${userId}_${checkpointId}`;\n const doc = await this.db.collection(this.checkpointsCollection).doc(docId).get();\n\n if (doc.exists) {\n const data = doc.data() as unknown as CheckpointRecord;\n await this.db\n .collection(this.checkpointsCollection)\n .doc(docId)\n .set({\n ...data,\n rollbackCount: data.rollbackCount + 1,\n lastRollbackReason: reason,\n lastRollbackAt: new Date(),\n } as unknown as Record<string, unknown>);\n }\n }\n\n /**\n * Mark a checkpoint as successful (terminal state)\n */\n async markCheckpointSuccessful(\n userId: string,\n checkpointId: string,\n ): Promise<void> {\n const docId = `${userId}_${checkpointId}`;\n const doc = await this.db.collection(this.checkpointsCollection).doc(docId).get();\n\n if (doc.exists) {\n const data = doc.data() as unknown as CheckpointRecord;\n await this.db\n .collection(this.checkpointsCollection)\n .doc(docId)\n .set({\n ...data,\n wasSuccessful: true,\n } as unknown as Record<string, unknown>);\n }\n }\n\n /**\n * Get checkpoint history for a user\n */\n async getUserCheckpoints(\n userId: string,\n limit: number = 50,\n ): Promise<CheckpointRecord[]> {\n const snapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('userId', '==', userId)\n .orderBy('createdAt', 'desc')\n .limit(limit)\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as CheckpointRecord);\n }\n\n /**\n * Get checkpoints for a thread\n */\n async getThreadCheckpoints(threadId: string): Promise<CheckpointRecord[]> {\n const snapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .orderBy('createdAt', 'desc')\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as CheckpointRecord);\n }\n\n /**\n * Get frequently rolled-back checkpoints (problem areas)\n */\n async getProblemCheckpoints(\n userId: string,\n minRollbackCount: number = 2,\n ): Promise<CheckpointRecord[]> {\n const snapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('userId', '==', userId)\n .where('rollbackCount', '>=', minRollbackCount)\n .orderBy('rollbackCount', 'desc')\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as CheckpointRecord);\n }\n\n /**\n * Get successful checkpoint patterns for learning\n */\n async getSuccessfulCheckpoints(\n userId: string,\n limit: number = 20,\n ): Promise<CheckpointRecord[]> {\n const snapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('userId', '==', userId)\n .where('wasSuccessful', '==', true)\n .orderBy('createdAt', 'desc')\n .limit(limit)\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as CheckpointRecord);\n }\n}\n","/**\n * Preference Learner\n *\n * Uses LLM to infer user preferences from generation sessions.\n * Leverages @almadar/llm for structured output.\n *\n * @packageDocumentation\n */\n\nimport { LLMClient, createRequirementsClient } from '@almadar/llm';\nimport type { GenerationSession, UserPreference } from './memory-orbital.js';\nimport { MemoryManager } from './MemoryManager.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PreferenceLearnerOptions {\n /** LLM client for inference */\n llmClient?: LLMClient;\n /** Memory manager for persistence */\n memoryManager: MemoryManager;\n /** Confidence threshold for auto-accepting preferences */\n confidenceThreshold?: number;\n}\n\nexport interface InferredPreference {\n /** The preference field being inferred */\n field: keyof Omit<UserPreference, 'id' | 'userId' | 'learnedAt'>;\n /** The inferred value */\n value: unknown;\n /** Confidence level (0-1) */\n confidence: number;\n /** Explanation of why this was inferred */\n reasoning: string;\n}\n\nexport interface PreferenceAnalysis {\n /** List of inferred preferences */\n inferences: InferredPreference[];\n /** Whether the inference is high confidence */\n isHighConfidence: boolean;\n}\n\n// ============================================================================\n// Preference Learner\n// ============================================================================\n\nexport class PreferenceLearner {\n private llmClient: LLMClient;\n private memoryManager: MemoryManager;\n private confidenceThreshold: number;\n\n constructor(options: PreferenceLearnerOptions) {\n this.llmClient = options.llmClient ?? createRequirementsClient();\n this.memoryManager = options.memoryManager;\n this.confidenceThreshold = options.confidenceThreshold ?? 0.7;\n }\n\n /**\n * Analyze a session and infer user preferences\n */\n async analyzeSession(session: GenerationSession): Promise<PreferenceAnalysis> {\n const prompt = this.buildAnalysisPrompt(session);\n \n const content = await this.llmClient.call<string>({\n systemPrompt: 'You analyze generation sessions and infer user preferences. Respond with JSON.',\n userPrompt: prompt,\n });\n\n return this.parseAnalysisResponse(content);\n }\n\n /**\n * Learn from a session and update preferences if confidence is high\n */\n async learnFromSession(session: GenerationSession): Promise<UserPreference | null> {\n // Get existing preferences\n let preferences = await this.memoryManager.getUserPreferences(session.userId);\n \n if (!preferences) {\n preferences = {\n id: session.userId,\n userId: session.userId,\n namingConvention: 'PascalCase',\n validationStyle: 'strict',\n preferredPatterns: [],\n commonEntities: [],\n commonTraits: [],\n learnedAt: new Date(),\n confidence: 0.5,\n };\n }\n\n // Analyze session\n const analysis = await this.analyzeSession(session);\n\n // Update preferences with high-confidence inferences\n let updated = false;\n for (const inference of analysis.inferences) {\n if (inference.confidence >= this.confidenceThreshold) {\n switch (inference.field) {\n case 'namingConvention':\n if (this.isValidNamingConvention(inference.value)) {\n preferences.namingConvention = inference.value;\n updated = true;\n }\n break;\n case 'validationStyle':\n if (this.isValidValidationStyle(inference.value)) {\n preferences.validationStyle = inference.value;\n updated = true;\n }\n break;\n case 'preferredPatterns':\n if (Array.isArray(inference.value)) {\n preferences.preferredPatterns = [\n ...new Set([...preferences.preferredPatterns, ...inference.value]),\n ].slice(0, 10);\n updated = true;\n }\n break;\n case 'commonEntities':\n if (Array.isArray(inference.value)) {\n preferences.commonEntities = [\n ...new Set([...preferences.commonEntities, ...inference.value]),\n ].slice(0, 20);\n updated = true;\n }\n break;\n }\n }\n }\n\n // Update confidence based on number of sessions\n if (updated) {\n preferences.confidence = Math.min(1.0, preferences.confidence + 0.05);\n await this.memoryManager.updateUserPreferences(session.userId, preferences);\n }\n\n return updated ? preferences : null;\n }\n\n /**\n * Batch learn from multiple sessions\n */\n async batchLearn(sessions: GenerationSession[]): Promise<UserPreference | null> {\n if (sessions.length === 0) return null;\n\n const userId = sessions[0].userId;\n let preferences = await this.memoryManager.getUserPreferences(userId);\n \n if (!preferences) {\n preferences = {\n id: userId,\n userId,\n namingConvention: 'PascalCase',\n validationStyle: 'strict',\n preferredPatterns: [],\n commonEntities: [],\n commonTraits: [],\n learnedAt: new Date(),\n confidence: 0.5,\n };\n }\n\n // Aggregate patterns and entities across all sessions\n const allPatterns = new Set<string>();\n const allEntities = new Set<string>();\n \n for (const session of sessions) {\n session.patterns.forEach(p => allPatterns.add(p));\n session.entities.forEach(e => allEntities.add(e));\n }\n\n // Update preferences\n preferences.preferredPatterns = [...allPatterns].slice(0, 10);\n preferences.commonEntities = [...allEntities].slice(0, 20);\n preferences.confidence = Math.min(1.0, 0.5 + (sessions.length * 0.05));\n\n // Use LLM to infer naming convention and validation style from aggregate\n const aggregatePrompt = this.buildAggregatePrompt(sessions);\n const content = await this.llmClient.call<string>({\n systemPrompt: 'You analyze generation sessions and infer user preferences. Respond with JSON.',\n userPrompt: aggregatePrompt,\n });\n\n const analysis = this.parseAnalysisResponse(content);\n for (const inference of analysis.inferences) {\n if (inference.confidence >= this.confidenceThreshold) {\n if (inference.field === 'namingConvention' && this.isValidNamingConvention(inference.value)) {\n preferences.namingConvention = inference.value;\n }\n if (inference.field === 'validationStyle' && this.isValidValidationStyle(inference.value)) {\n preferences.validationStyle = inference.value;\n }\n }\n }\n\n await this.memoryManager.updateUserPreferences(userId, preferences);\n return preferences;\n }\n\n // ==========================================================================\n // Prompt Building\n // ==========================================================================\n\n private buildAnalysisPrompt(session: GenerationSession): string {\n return `Analyze this generation session and infer the user's preferences.\n\nSession Details:\n- Prompt: \"${session.prompt}\"\n- Generated Entities: ${session.entities.join(', ')}\n- Used Patterns: ${session.patterns.join(', ')}\n- Skill: ${session.skill}\n\nSchema Excerpt:\n${JSON.stringify(session.generatedSchema, null, 2).slice(0, 2000)}\n\nAnalyze and infer:\n1. Naming convention preference (PascalCase, camelCase, snake_case)\n2. Validation style (strict, minimal, none)\n3. Preferred UI patterns\n4. Common entity types\n\nRespond in JSON format:\n{\n \"inferences\": [\n {\n \"field\": \"namingConvention\",\n \"value\": \"PascalCase\",\n \"confidence\": 0.85,\n \"reasoning\": \"User consistently uses PascalCase for entity names\"\n }\n ],\n \"isHighConfidence\": true\n}`;\n }\n\n private buildAggregatePrompt(sessions: GenerationSession[]): string {\n const summaries = sessions.slice(0, 10).map(s => ({\n prompt: s.prompt.slice(0, 100),\n entities: s.entities,\n patterns: s.patterns,\n }));\n\n return `Analyze these ${sessions.length} generation sessions and infer the user's aggregate preferences.\n\nSession Summaries:\n${JSON.stringify(summaries, null, 2)}\n\nInfer the user's overall:\n1. Naming convention preference (PascalCase, camelCase, snake_case)\n2. Validation style (strict, minimal, none)\n\nRespond in JSON format:\n{\n \"inferences\": [\n {\n \"field\": \"namingConvention\",\n \"value\": \"PascalCase\",\n \"confidence\": 0.9,\n \"reasoning\": \"Used PascalCase in 8 out of 10 sessions\"\n }\n ],\n \"isHighConfidence\": true\n}`;\n }\n\n // ==========================================================================\n // Response Parsing\n // ==========================================================================\n\n private parseAnalysisResponse(content: string): PreferenceAnalysis {\n try {\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return { inferences: [], isHighConfidence: false };\n }\n\n const parsed = JSON.parse(jsonMatch[0]);\n \n if (Array.isArray(parsed.inferences)) {\n return {\n inferences: parsed.inferences.filter((inf: InferredPreference) => \n inf.field && inf.value !== undefined && typeof inf.confidence === 'number'\n ),\n isHighConfidence: parsed.isHighConfidence ?? false,\n };\n }\n\n return { inferences: [], isHighConfidence: false };\n } catch {\n return { inferences: [], isHighConfidence: false };\n }\n }\n\n // ==========================================================================\n // Validation Helpers\n // ==========================================================================\n\n private isValidNamingConvention(value: unknown): value is UserPreference['namingConvention'] {\n return typeof value === 'string' && ['PascalCase', 'camelCase', 'snake_case'].includes(value);\n }\n\n private isValidValidationStyle(value: unknown): value is UserPreference['validationStyle'] {\n return typeof value === 'string' && ['strict', 'minimal', 'none'].includes(value);\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createPreferenceLearner(options: PreferenceLearnerOptions): PreferenceLearner {\n return new PreferenceLearner(options);\n}\n","/**\n * Agentic Search - GAP-006\n *\n * Reasoning-based search through memory orbitals.\n * Unlike RAG (vector similarity), this uses agent traversal with understanding\n * of state transitions, patterns, and temporal relationships.\n *\n * @packageDocumentation\n */\n\nimport type {\n UserPreference,\n GenerationSession,\n ProjectContext,\n} from './memory-orbital.js';\nimport type {\n InterruptRecord,\n ToolApprovalPreference,\n CheckpointRecord,\n} from './types.js';\nimport type { MemoryManager } from './MemoryManager.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Search strategy for agentic search\n */\nexport type SearchStrategy = 'temporal' | 'semantic' | 'pattern' | 'hybrid';\n\n/**\n * Search parameters\n */\nexport interface AgenticSearchParams {\n /** User to search memory for */\n userId: string;\n /** Natural language query */\n query: string;\n /** Search strategy */\n strategy?: SearchStrategy;\n /** Maximum search depth (levels of traversal) */\n depth?: number;\n /** App/project context to filter by */\n appId?: string;\n /** Maximum results to return */\n limit?: number;\n}\n\n/**\n * Search result with relevance score\n */\nexport interface SearchResult {\n /** Type of memory found */\n type: 'preference' | 'session' | 'project' | 'interrupt' | 'checkpoint' | 'pattern';\n /** The actual data */\n data: unknown;\n /** Relevance score (0-1) */\n relevance: number;\n /** Why this result matched */\n reasoning: string;\n /** Source collection */\n source: string;\n /** Timestamp for temporal sorting */\n timestamp?: Date;\n}\n\n/**\n * Search result with aggregated insights\n */\nexport interface AgenticSearchResponse {\n /** Individual search results */\n results: SearchResult[];\n /** Aggregated insights from results */\n insights: {\n /** Summary of what was found */\n summary: string;\n /** Common patterns identified */\n patterns: string[];\n /** Temporal trends */\n trends: string[];\n /** Suggested next actions */\n suggestions: string[];\n };\n /** Search metadata */\n metadata: {\n strategy: SearchStrategy;\n depth: number;\n duration: number;\n totalResults: number;\n };\n}\n\n// ============================================================================\n// Agentic Search Engine\n// ============================================================================\n\nexport class AgenticSearchEngine {\n private memoryManager: MemoryManager;\n\n constructor(memoryManager: MemoryManager) {\n this.memoryManager = memoryManager;\n }\n\n /**\n * Perform agentic search through memory\n */\n async search(params: AgenticSearchParams): Promise<AgenticSearchResponse> {\n const startTime = Date.now();\n const strategy = params.strategy ?? 'hybrid';\n const depth = params.depth ?? 3;\n const limit = params.limit ?? 10;\n\n let results: SearchResult[] = [];\n\n // Execute search based on strategy\n switch (strategy) {\n case 'temporal':\n results = await this.temporalSearch(params, depth, limit);\n break;\n case 'semantic':\n results = await this.semanticSearch(params, depth, limit);\n break;\n case 'pattern':\n results = await this.patternSearch(params, depth, limit);\n break;\n case 'hybrid':\n default:\n results = await this.hybridSearch(params, depth, limit);\n break;\n }\n\n // Sort by relevance\n results.sort((a, b) => b.relevance - a.relevance);\n\n // Generate insights\n const insights = this.generateInsights(results, params.query);\n\n const duration = Date.now() - startTime;\n\n return {\n results: results.slice(0, limit),\n insights,\n metadata: {\n strategy,\n depth,\n duration,\n totalResults: results.length,\n },\n };\n }\n\n // ============================================================================\n // Search Strategies\n // ============================================================================\n\n /**\n * Temporal search - \"What did I do last week?\"\n * Navigates memory by time relationships\n */\n private async temporalSearch(\n params: AgenticSearchParams,\n _depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n\n // Parse temporal query patterns\n const isRecentQuery = /recent|last|latest|newest/i.test(params.query);\n const isTimeRangeQuery = /week|month|day|ago/i.test(params.query);\n\n // Get generation sessions (most temporal data)\n const sessions = await this.memoryManager.getUserGenerationHistory(params.userId, limit * 2);\n\n for (const session of sessions) {\n let relevance = 0.5;\n let reasoning = 'Recent generation session';\n\n // Boost recent items for \"recent\" queries\n if (isRecentQuery) {\n const daysAgo = (Date.now() - session.createdAt.getTime()) / (1000 * 60 * 60 * 24);\n relevance = Math.max(0.1, 1 - daysAgo / 30); // Decay over 30 days\n reasoning = `Created ${Math.round(daysAgo)} days ago`;\n }\n\n // Check for query matches in session data\n const sessionText = `${session.prompt} ${session.entities.join(' ')} ${session.patterns.join(' ')}`.toLowerCase();\n const queryTerms = params.query.toLowerCase().split(/\\s+/);\n const termMatches = queryTerms.filter(term => sessionText.includes(term)).length;\n relevance += termMatches * 0.1;\n\n if (relevance > 0.3) {\n results.push({\n type: 'session',\n data: session,\n relevance: Math.min(1, relevance),\n reasoning,\n source: 'generation_history',\n timestamp: session.createdAt,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Semantic search - \"How did I handle user roles?\"\n * Reasoning-based understanding of structure\n */\n private async semanticSearch(\n params: AgenticSearchParams,\n _depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n\n // Extract semantic concepts from query\n const concepts = this.extractConcepts(params.query);\n\n // Search user preferences\n const prefs = await this.memoryManager.getUserPreferences(params.userId);\n if (prefs) {\n let relevance = 0.3;\n const matchedConcepts: string[] = [];\n\n // Check for naming convention matches\n if (concepts.naming && prefs.namingConvention) {\n relevance += 0.2;\n matchedConcepts.push(`uses ${prefs.namingConvention}`);\n }\n\n // Check for pattern matches\n if (concepts.patterns && prefs.preferredPatterns.length > 0) {\n const matched = prefs.preferredPatterns.filter(p =>\n concepts.patterns?.some((cp: string) => p.toLowerCase().includes(cp.toLowerCase()))\n );\n relevance += matched.length * 0.1;\n matchedConcepts.push(`patterns: ${matched.join(', ')}`);\n }\n\n // Check for entity matches\n if (concepts.entities && prefs.commonEntities.length > 0) {\n const matched = prefs.commonEntities.filter(e =>\n concepts.entities?.some((ce: string) => e.toLowerCase().includes(ce.toLowerCase()))\n );\n relevance += matched.length * 0.1;\n matchedConcepts.push(`entities: ${matched.join(', ')}`);\n }\n\n if (relevance > 0.4) {\n results.push({\n type: 'preference',\n data: prefs,\n relevance: Math.min(1, relevance),\n reasoning: `User preferences match query concepts: ${matchedConcepts.join('; ')}`,\n source: 'user_preferences',\n timestamp: prefs.learnedAt,\n });\n }\n }\n\n // Search project contexts\n if (params.appId) {\n const project = await this.memoryManager.getProjectContext(params.appId);\n if (project) {\n let relevance = 0.3;\n const projectText = `${project.projectName ?? ''} ${project.description ?? ''} ${project.existingEntities.join(' ')}`.toLowerCase();\n\n const queryTerms = params.query.toLowerCase().split(/\\s+/);\n const termMatches = queryTerms.filter(term => projectText.includes(term)).length;\n relevance += termMatches * 0.15;\n\n if (relevance > 0.4) {\n results.push({\n type: 'project',\n data: project,\n relevance: Math.min(1, relevance),\n reasoning: `Project context contains ${termMatches} matching terms`,\n source: 'project_context',\n timestamp: project.lastUpdatedAt,\n });\n }\n }\n }\n\n // Search generation sessions for semantic matches\n const sessions = await this.memoryManager.getUserGenerationHistory(params.userId, limit);\n for (const session of sessions) {\n const sessionText = `${session.prompt} ${session.entities.join(' ')}`.toLowerCase();\n let relevance = 0.3;\n\n // Entity matches\n if (concepts.entities) {\n const entityMatches = session.entities.filter(e =>\n concepts.entities?.some((ce: string) => e.toLowerCase().includes(ce.toLowerCase()))\n );\n relevance += entityMatches.length * 0.15;\n }\n\n // Pattern matches\n if (concepts.patterns) {\n const patternMatches = session.patterns.filter(p =>\n concepts.patterns?.some((cp: string) => p.toLowerCase().includes(cp.toLowerCase()))\n );\n relevance += patternMatches.length * 0.1;\n }\n\n // Direct text match\n const queryTerms = params.query.toLowerCase().split(/\\s+/);\n const termMatches = queryTerms.filter(term => sessionText.includes(term)).length;\n relevance += termMatches * 0.05;\n\n if (relevance > 0.4) {\n results.push({\n type: 'session',\n data: session,\n relevance: Math.min(1, relevance),\n reasoning: `Session contains relevant entities, patterns, or keywords`,\n source: 'generation_history',\n timestamp: session.createdAt,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Pattern search - \"Show me all list views I've built\"\n * Searches for specific patterns and effects\n */\n private async patternSearch(\n params: AgenticSearchParams,\n _depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n\n // Extract pattern terms from query\n const patternTerms = ['list', 'form', 'detail', 'card', 'table', 'chart', 'map', 'calendar'];\n const matchedTerms = patternTerms.filter(term =>\n params.query.toLowerCase().includes(term)\n );\n\n // Search pattern affinity\n const patterns = await this.memoryManager.getUserPatterns(params.userId);\n\n for (const pattern of patterns) {\n let relevance = 0.3;\n let reasoning = `Pattern usage: ${pattern.usageCount} times`;\n\n // Boost for matching pattern terms\n if (matchedTerms.some(term => pattern.patternId.toLowerCase().includes(term))) {\n relevance += 0.3;\n reasoning += ', matches query pattern type';\n }\n\n // Boost for high success rate\n const successRate = pattern.usageCount > 0\n ? pattern.successCount / pattern.usageCount\n : 0;\n relevance += successRate * 0.2;\n\n if (relevance > 0.4) {\n results.push({\n type: 'pattern',\n data: pattern,\n relevance: Math.min(1, relevance),\n reasoning: `${reasoning}, ${Math.round(successRate * 100)}% success rate`,\n source: 'pattern_affinity',\n timestamp: pattern.lastUsedAt,\n });\n }\n }\n\n // Search sessions for patterns\n const sessions = await this.memoryManager.getUserGenerationHistory(params.userId, limit);\n for (const session of sessions) {\n const matchingPatterns = session.patterns.filter(p =>\n matchedTerms.some(term => p.toLowerCase().includes(term))\n );\n\n if (matchingPatterns.length > 0) {\n results.push({\n type: 'session',\n data: session,\n relevance: 0.5 + matchingPatterns.length * 0.1,\n reasoning: `Session uses patterns: ${matchingPatterns.join(', ')}`,\n source: 'generation_history',\n timestamp: session.createdAt,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Hybrid search - combines all strategies\n */\n private async hybridSearch(\n params: AgenticSearchParams,\n depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const [temporal, semantic, pattern] = await Promise.all([\n this.temporalSearch(params, depth, Math.ceil(limit / 2)),\n this.semanticSearch(params, depth, Math.ceil(limit / 2)),\n this.patternSearch(params, depth, Math.ceil(limit / 2)),\n ]);\n\n // Combine and deduplicate results\n const seen = new Set<string>();\n const combined: SearchResult[] = [];\n\n for (const result of [...temporal, ...semantic, ...pattern]) {\n // Create unique key for deduplication\n const key = `${result.type}-${JSON.stringify(result.data)}`;\n if (!seen.has(key)) {\n seen.add(key);\n combined.push(result);\n }\n }\n\n return combined;\n }\n\n // ============================================================================\n // Helpers\n // ============================================================================\n\n /**\n * Extract semantic concepts from query\n */\n private extractConcepts(query: string): {\n naming?: boolean;\n validation?: boolean;\n patterns?: string[];\n entities?: string[];\n actions?: string[];\n } {\n const lower = query.toLowerCase();\n return {\n naming: /naming|case|pascal|camel|snake/i.test(lower),\n validation: /validat|schema|required|optional/i.test(lower),\n patterns: ['entity', 'list', 'form', 'detail', 'card'].filter(p => lower.includes(p)),\n entities: this.extractEntityNames(lower),\n actions: ['create', 'update', 'delete', 'list', 'view'].filter(a => lower.includes(a)),\n };\n }\n\n /**\n * Extract potential entity names from query\n */\n private extractEntityNames(query: string): string[] {\n // Look for capitalized words that could be entity names\n const words = query.split(/\\s+/);\n const entities: string[] = [];\n\n for (const word of words) {\n // Clean up punctuation\n const clean = word.replace(/[^a-zA-Z]/g, '');\n // Capitalized words are likely entities\n if (clean.length > 2 && clean[0] === clean[0].toUpperCase()) {\n entities.push(clean);\n }\n }\n\n return entities;\n }\n\n /**\n * Generate insights from search results\n */\n private generateInsights(results: SearchResult[], query: string): {\n summary: string;\n patterns: string[];\n trends: string[];\n suggestions: string[];\n } {\n const summary = `Found ${results.length} relevant memory items for \"${query}\"`;\n\n // Extract patterns\n const patternResults = results.filter(r => r.type === 'pattern');\n const patterns = patternResults.length > 0\n ? patternResults.slice(0, 3).map(r => (r.data as { patternId: string }).patternId)\n : ['No dominant patterns identified'];\n\n // Analyze trends\n const sessions = results.filter(r => r.type === 'session');\n const trends: string[] = [];\n\n if (sessions.length > 0) {\n const timestamps = sessions\n .filter(s => s.timestamp)\n .map(s => s.timestamp!.getTime())\n .sort((a, b) => b - a);\n\n if (timestamps.length >= 2) {\n const avgGap = (timestamps[0] - timestamps[timestamps.length - 1]) / (timestamps.length - 1);\n const daysGap = avgGap / (1000 * 60 * 60 * 24);\n\n if (daysGap < 7) {\n trends.push('High activity - multiple sessions per week');\n } else if (daysGap > 30) {\n trends.push('Sporadic usage - sessions spread out over time');\n }\n }\n }\n\n // Generate suggestions\n const suggestions: string[] = [];\n\n if (patterns.length > 0 && !patterns[0].includes('No dominant')) {\n suggestions.push(`Consider reusing pattern: ${patterns[0]}`);\n }\n\n const projectResults = results.filter(r => r.type === 'project');\n if (projectResults.length > 0) {\n suggestions.push('Review existing project conventions for consistency');\n }\n\n const interruptResults = results.filter(r => r.type === 'interrupt');\n if (interruptResults.length > 3) {\n suggestions.push('High interrupt frequency - consider adjusting auto-approval settings');\n }\n\n if (suggestions.length === 0) {\n suggestions.push('No specific suggestions based on current memory');\n }\n\n return { summary, patterns, trends, suggestions };\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an agentic search engine\n */\nexport function createAgenticSearchEngine(memoryManager: MemoryManager): AgenticSearchEngine {\n return new AgenticSearchEngine(memoryManager);\n}\n","/**\n * Observability - GAP-008\n *\n * Comprehensive observability layer for DeepAgent including:\n * - Event tracking\n * - Session metrics\n * - Performance monitoring\n * - Health checks\n *\n * @packageDocumentation\n */\n\nimport type { GenerationMetrics, MetricsSummary } from './metrics.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Observable event types\n */\nexport type ObservableEventType =\n | 'session_start'\n | 'session_end'\n | 'tool_call'\n | 'tool_result'\n | 'interrupt'\n | 'checkpoint_save'\n | 'checkpoint_restore'\n | 'error'\n | 'llm_call'\n | 'memory_sync';\n\n/**\n * Observable event\n */\nexport interface ObservableEvent {\n /** Event type */\n type: ObservableEventType;\n /** Timestamp */\n timestamp: number;\n /** Session/thread ID */\n sessionId: string;\n /** User ID */\n userId?: string;\n /** Event payload */\n payload: Record<string, unknown>;\n /** Duration in ms (if applicable) */\n duration?: number;\n /** Error information */\n error?: {\n message: string;\n code?: string;\n stack?: string;\n };\n}\n\n/**\n * Session telemetry\n */\nexport interface SessionTelemetry {\n /** Session ID */\n sessionId: string;\n /** User ID */\n userId?: string;\n /** Session start time */\n startedAt: number;\n /** Session end time */\n endedAt?: number;\n /** Number of tool calls */\n toolCallCount: number;\n /** Number of LLM calls */\n llmCallCount: number;\n /** Number of interrupts */\n interruptCount: number;\n /** Number of checkpoints */\n checkpointCount: number;\n /** Total tokens used */\n totalTokens: number;\n /** Errors encountered */\n errors: Array<{\n timestamp: number;\n message: string;\n type: string;\n }>;\n /** Final status */\n status: 'running' | 'completed' | 'failed' | 'interrupted';\n}\n\n/**\n * Performance snapshot\n */\nexport interface PerformanceSnapshot {\n /** Timestamp */\n timestamp: number;\n /** Active sessions */\n activeSessions: number;\n /** Total sessions (all time) */\n totalSessions: number;\n /** Average session duration */\n avgSessionDuration: number;\n /** Success rate (last 24h) */\n successRate24h: number;\n /** Error rate (last 24h) */\n errorRate24h: number;\n /** Average tokens per session */\n avgTokensPerSession: number;\n}\n\n/**\n * Health check result\n */\nexport interface HealthCheckResult {\n /** Component name */\n component: string;\n /** Health status */\n status: 'healthy' | 'degraded' | 'unhealthy';\n /** Response time in ms */\n responseTime: number;\n /** Last checked timestamp */\n checkedAt: number;\n /** Error message if unhealthy */\n error?: string;\n}\n\n// ============================================================================\n// Observability Collector\n// ============================================================================\n\nexport class ObservabilityCollector {\n private events: ObservableEvent[] = [];\n private sessions: Map<string, SessionTelemetry> = new Map();\n private maxEvents: number;\n\n constructor(options: { maxEvents?: number } = {}) {\n this.maxEvents = options.maxEvents ?? 10000;\n }\n\n /**\n * Record an observable event\n */\n recordEvent(event: Omit<ObservableEvent, 'timestamp'>): void {\n const fullEvent: ObservableEvent = {\n ...event,\n timestamp: Date.now(),\n };\n\n this.events.push(fullEvent);\n\n // Maintain max size\n if (this.events.length > this.maxEvents) {\n this.events = this.events.slice(-this.maxEvents);\n }\n\n // Update session telemetry\n this.updateSessionTelemetry(fullEvent);\n }\n\n /**\n * Start session tracking\n */\n startSession(sessionId: string, userId?: string): void {\n this.sessions.set(sessionId, {\n sessionId,\n userId,\n startedAt: Date.now(),\n toolCallCount: 0,\n llmCallCount: 0,\n interruptCount: 0,\n checkpointCount: 0,\n totalTokens: 0,\n errors: [],\n status: 'running',\n });\n\n this.recordEvent({\n type: 'session_start',\n sessionId,\n userId,\n payload: { startedAt: Date.now() },\n });\n }\n\n /**\n * End session tracking\n */\n endSession(sessionId: string, status: SessionTelemetry['status'] = 'completed'): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.endedAt = Date.now();\n session.status = status;\n\n this.recordEvent({\n type: 'session_end',\n sessionId,\n userId: session.userId,\n payload: {\n status,\n duration: session.endedAt - session.startedAt,\n toolCalls: session.toolCallCount,\n llmCalls: session.llmCallCount,\n },\n duration: session.endedAt - session.startedAt,\n });\n }\n }\n\n /**\n * Record tool call\n */\n recordToolCall(\n sessionId: string,\n toolName: string,\n args: Record<string, unknown>,\n duration?: number,\n ): void {\n this.recordEvent({\n type: 'tool_call',\n sessionId,\n payload: { tool: toolName, args },\n duration,\n });\n\n const session = this.sessions.get(sessionId);\n if (session) {\n session.toolCallCount++;\n }\n }\n\n /**\n * Record LLM call\n */\n recordLLMCall(\n sessionId: string,\n model: string,\n tokens: { input: number; output: number },\n duration?: number,\n ): void {\n this.recordEvent({\n type: 'llm_call',\n sessionId,\n payload: { model, tokens },\n duration,\n });\n\n const session = this.sessions.get(sessionId);\n if (session) {\n session.llmCallCount++;\n session.totalTokens += tokens.input + tokens.output;\n }\n }\n\n /**\n * Record error\n */\n recordError(\n sessionId: string,\n error: Error,\n context?: Record<string, unknown>,\n ): void {\n this.recordEvent({\n type: 'error',\n sessionId,\n payload: { ...context, message: error.message },\n error: {\n message: error.message,\n code: (error as { code?: string }).code,\n stack: error.stack,\n },\n });\n\n const session = this.sessions.get(sessionId);\n if (session) {\n session.errors.push({\n timestamp: Date.now(),\n message: error.message,\n type: error.constructor.name,\n });\n }\n }\n\n /**\n * Get events by type\n */\n getEvents(type?: ObservableEventType, sessionId?: string): ObservableEvent[] {\n let filtered = this.events;\n\n if (type) {\n filtered = filtered.filter(e => e.type === type);\n }\n\n if (sessionId) {\n filtered = filtered.filter(e => e.sessionId === sessionId);\n }\n\n return filtered;\n }\n\n /**\n * Get session telemetry\n */\n getSessionTelemetry(sessionId: string): SessionTelemetry | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Get all active sessions\n */\n getActiveSessions(): SessionTelemetry[] {\n return Array.from(this.sessions.values()).filter(s => s.status === 'running');\n }\n\n /**\n * Get performance snapshot\n */\n getPerformanceSnapshot(): PerformanceSnapshot {\n const now = Date.now();\n const sessions = Array.from(this.sessions.values());\n const activeSessions = sessions.filter(s => s.status === 'running');\n\n // Last 24h stats\n const last24h = sessions.filter(s => s.startedAt > now - 24 * 60 * 60 * 1000);\n const completed24h = last24h.filter(s => s.status === 'completed');\n const failed24h = last24h.filter(s => s.status === 'failed');\n\n const successRate24h = last24h.length > 0\n ? (completed24h.length / last24h.length) * 100\n : 0;\n\n const errorRate24h = last24h.length > 0\n ? (failed24h.length / last24h.length) * 100\n : 0;\n\n // Average session duration\n const completedSessions = sessions.filter(s => s.endedAt);\n const avgSessionDuration = completedSessions.length > 0\n ? completedSessions.reduce((sum, s) => sum + ((s.endedAt || now) - s.startedAt), 0) / completedSessions.length\n : 0;\n\n // Average tokens\n const sessionsWithTokens = sessions.filter(s => s.totalTokens > 0);\n const avgTokensPerSession = sessionsWithTokens.length > 0\n ? sessionsWithTokens.reduce((sum, s) => sum + s.totalTokens, 0) / sessionsWithTokens.length\n : 0;\n\n return {\n timestamp: now,\n activeSessions: activeSessions.length,\n totalSessions: sessions.length,\n avgSessionDuration,\n successRate24h,\n errorRate24h,\n avgTokensPerSession,\n };\n }\n\n /**\n * Perform health check\n */\n async healthCheck(): Promise<HealthCheckResult[]> {\n const checks: HealthCheckResult[] = [];\n const now = Date.now();\n\n // Check event buffer\n checks.push({\n component: 'event_buffer',\n status: this.events.length < this.maxEvents * 0.9 ? 'healthy' : 'degraded',\n responseTime: 0,\n checkedAt: now,\n });\n\n // Check sessions\n const activeSessions = this.getActiveSessions();\n const staleSessions = activeSessions.filter(\n s => now - s.startedAt > 30 * 60 * 1000 // 30 minutes\n );\n\n checks.push({\n component: 'sessions',\n status: staleSessions.length < 10 ? 'healthy' : 'degraded',\n responseTime: 0,\n checkedAt: now,\n error: staleSessions.length > 0 ? `${staleSessions.length} stale sessions` : undefined,\n });\n\n return checks;\n }\n\n /**\n * Export metrics for external systems\n */\n exportMetrics(): {\n events: ObservableEvent[];\n sessions: SessionTelemetry[];\n snapshot: PerformanceSnapshot;\n health: HealthCheckResult[];\n } {\n return {\n events: this.events.slice(-1000), // Last 1000 events\n sessions: Array.from(this.sessions.values()),\n snapshot: this.getPerformanceSnapshot(),\n health: [], // Populated by healthCheck\n };\n }\n\n /**\n * Clear all data\n */\n clear(): void {\n this.events = [];\n this.sessions.clear();\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private updateSessionTelemetry(event: ObservableEvent): void {\n const session = this.sessions.get(event.sessionId);\n if (!session) return;\n\n switch (event.type) {\n case 'interrupt':\n session.interruptCount++;\n break;\n case 'checkpoint_save':\n session.checkpointCount++;\n break;\n case 'memory_sync':\n // Track memory sync events\n break;\n }\n }\n}\n\n// ============================================================================\n// Global Instance\n// ============================================================================\n\nlet globalCollector: ObservabilityCollector | null = null;\n\n/**\n * Get or create global observability collector\n */\nexport function getObservabilityCollector(): ObservabilityCollector {\n if (!globalCollector) {\n globalCollector = new ObservabilityCollector();\n }\n return globalCollector;\n}\n\n/**\n * Reset global observability collector\n */\nexport function resetObservabilityCollector(): void {\n globalCollector = null;\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Record event to global collector\n */\nexport function recordEvent(event: Omit<ObservableEvent, 'timestamp'>): void {\n getObservabilityCollector().recordEvent(event);\n}\n\n/**\n * Start session in global collector\n */\nexport function startObservabilitySession(sessionId: string, userId?: string): void {\n getObservabilityCollector().startSession(sessionId, userId);\n}\n\n/**\n * End session in global collector\n */\nexport function endObservabilitySession(sessionId: string, status?: SessionTelemetry['status']): void {\n getObservabilityCollector().endSession(sessionId, status);\n}\n\n/**\n * Get performance snapshot from global collector\n */\nexport function getPerformanceSnapshot(): PerformanceSnapshot {\n return getObservabilityCollector().getPerformanceSnapshot();\n}\n","/**\n * Multi-User Support - GAP-009\n *\n * Provides proper user isolation and session scoping for multi-user environments.\n * Ensures users can only access their own sessions, memory, and data.\n *\n * @packageDocumentation\n */\n\nimport type { SessionMetadata } from './persistence/types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * User context for multi-user operations\n */\nexport interface UserContext {\n /** User ID */\n userId: string;\n /** Organization/tenant ID (for multi-tenant) */\n orgId?: string;\n /** User roles/permissions */\n roles?: string[];\n /** Session ID scope (optional) */\n sessionScope?: string[];\n}\n\n/**\n * Scoped session metadata with user ownership\n */\nexport interface ScopedSessionMetadata extends SessionMetadata {\n /** Owning user ID */\n userId: string;\n /** Organization ID */\n orgId?: string;\n /** Created by (for audit) */\n createdBy: string;\n /** Last accessed by */\n lastAccessedBy?: string;\n /** Access control list */\n acl?: {\n /** Users who can read this session */\n readers?: string[];\n /** Users who can write/modify */\n writers?: string[];\n /** Publicly accessible */\n isPublic?: boolean;\n };\n}\n\n/**\n * Access check result\n */\nexport interface AccessCheckResult {\n /** Whether access is granted */\n allowed: boolean;\n /** Reason if denied */\n reason?: string;\n /** Required permission level */\n requiredRole?: string;\n}\n\n/**\n * User session stats\n */\nexport interface UserSessionStats {\n /** User ID */\n userId: string;\n /** Total sessions */\n totalSessions: number;\n /** Active sessions */\n activeSessions: number;\n /** Completed sessions */\n completedSessions: number;\n /** Sessions by skill */\n sessionsBySkill: Record<string, number>;\n /** Last activity timestamp */\n lastActivityAt?: number;\n}\n\n// ============================================================================\n// Multi-User Manager\n// ============================================================================\n\nexport class MultiUserManager {\n private sessionOwnership: Map<string, string> = new Map(); // threadId -> userId\n private userSessions: Map<string, Set<string>> = new Map(); // userId -> Set<threadId>\n\n /**\n * Check if a user owns a session\n */\n isSessionOwner(threadId: string, userId: string): boolean {\n const owner = this.sessionOwnership.get(threadId);\n return owner === userId;\n }\n\n /**\n * Check if a user can access a session\n */\n canAccessSession(threadId: string, userContext: UserContext): AccessCheckResult {\n const owner = this.sessionOwnership.get(threadId);\n\n // Session not found - allow creation\n if (!owner) {\n return { allowed: true };\n }\n\n // User is owner\n if (owner === userContext.userId) {\n return { allowed: true };\n }\n\n // Check admin role\n if (userContext.roles?.includes('admin')) {\n return { allowed: true };\n }\n\n // Check scoped sessions\n if (userContext.sessionScope?.includes(threadId)) {\n return { allowed: true };\n }\n\n return {\n allowed: false,\n reason: 'Session does not belong to user',\n requiredRole: 'owner or admin',\n };\n }\n\n /**\n * Assign session ownership\n */\n assignSessionOwnership(threadId: string, userId: string): void {\n // Remove from previous owner if exists\n const previousOwner = this.sessionOwnership.get(threadId);\n if (previousOwner) {\n const previousSessions = this.userSessions.get(previousOwner);\n if (previousSessions) {\n previousSessions.delete(threadId);\n }\n }\n\n // Assign to new owner\n this.sessionOwnership.set(threadId, userId);\n\n // Add to user's sessions\n if (!this.userSessions.has(userId)) {\n this.userSessions.set(userId, new Set());\n }\n this.userSessions.get(userId)!.add(threadId);\n }\n\n /**\n * Get all sessions for a user\n */\n getUserSessions(userId: string): string[] {\n const sessions = this.userSessions.get(userId);\n return sessions ? Array.from(sessions) : [];\n }\n\n /**\n * Get session owner\n */\n getSessionOwner(threadId: string): string | undefined {\n return this.sessionOwnership.get(threadId);\n }\n\n /**\n * Remove session ownership\n */\n removeSession(threadId: string): void {\n const owner = this.sessionOwnership.get(threadId);\n if (owner) {\n const sessions = this.userSessions.get(owner);\n if (sessions) {\n sessions.delete(threadId);\n }\n }\n this.sessionOwnership.delete(threadId);\n }\n\n /**\n * Check if user has any sessions\n */\n hasSessions(userId: string): boolean {\n const sessions = this.userSessions.get(userId);\n return sessions ? sessions.size > 0 : false;\n }\n\n /**\n * Get user session count\n */\n getSessionCount(userId: string): number {\n const sessions = this.userSessions.get(userId);\n return sessions ? sessions.size : 0;\n }\n\n /**\n * Transfer session ownership\n */\n transferOwnership(threadId: string, fromUserId: string, toUserId: string): AccessCheckResult {\n const owner = this.sessionOwnership.get(threadId);\n\n if (owner !== fromUserId) {\n return {\n allowed: false,\n reason: 'Only the owner can transfer session ownership',\n };\n }\n\n this.assignSessionOwnership(threadId, toUserId);\n\n return { allowed: true };\n }\n\n /**\n * Share session with another user\n */\n shareSession(\n threadId: string,\n ownerId: string,\n targetUserId: string,\n permission: 'read' | 'write' = 'read',\n ): AccessCheckResult {\n const owner = this.sessionOwnership.get(threadId);\n\n if (owner !== ownerId) {\n return {\n allowed: false,\n reason: 'Only the owner can share a session',\n };\n }\n\n // Add target user to scoped sessions\n // This would typically update the session ACL in Firestore\n // For now, we just track it in memory\n\n return { allowed: true };\n }\n\n /**\n * Get all user IDs with sessions\n */\n getAllUsers(): string[] {\n return Array.from(this.userSessions.keys());\n }\n\n /**\n * Clear all data (for testing)\n */\n clear(): void {\n this.sessionOwnership.clear();\n this.userSessions.clear();\n }\n\n /**\n * Create scoped session metadata\n */\n createScopedMetadata(\n metadata: SessionMetadata,\n userContext: UserContext,\n ): ScopedSessionMetadata {\n return {\n ...metadata,\n userId: userContext.userId,\n orgId: userContext.orgId,\n createdBy: userContext.userId,\n lastAccessedBy: userContext.userId,\n acl: {\n readers: [userContext.userId],\n writers: [userContext.userId],\n isPublic: false,\n },\n };\n }\n\n /**\n * Validate user context\n */\n validateUserContext(userContext: unknown): userContext is UserContext {\n if (!userContext || typeof userContext !== 'object') {\n return false;\n }\n\n const ctx = userContext as Record<string, unknown>;\n\n if (!ctx.userId || typeof ctx.userId !== 'string') {\n return false;\n }\n\n if (ctx.orgId !== undefined && typeof ctx.orgId !== 'string') {\n return false;\n }\n\n if (ctx.roles !== undefined && !Array.isArray(ctx.roles)) {\n return false;\n }\n\n return true;\n }\n}\n\n// ============================================================================\n// Global Instance\n// ============================================================================\n\nlet globalMultiUserManager: MultiUserManager | null = null;\n\n/**\n * Get or create global multi-user manager\n */\nexport function getMultiUserManager(): MultiUserManager {\n if (!globalMultiUserManager) {\n globalMultiUserManager = new MultiUserManager();\n }\n return globalMultiUserManager;\n}\n\n/**\n * Reset global multi-user manager\n */\nexport function resetMultiUserManager(): void {\n globalMultiUserManager = null;\n}\n\n// ============================================================================\n// Middleware Helpers\n// ============================================================================\n\n/**\n * Create user context from request\n */\nexport function createUserContext(\n userId: string,\n options: {\n orgId?: string;\n roles?: string[];\n } = {},\n): UserContext {\n return {\n userId,\n orgId: options.orgId,\n roles: options.roles ?? ['user'],\n };\n}\n\n/**\n * Check if user is admin\n */\nexport function isAdmin(userContext: UserContext): boolean {\n return userContext.roles?.includes('admin') ?? false;\n}\n\n/**\n * Require ownership or throw\n */\nexport function requireOwnership(\n threadId: string,\n userContext: UserContext,\n manager: MultiUserManager = getMultiUserManager(),\n): void {\n const check = manager.canAccessSession(threadId, userContext);\n if (!check.allowed) {\n throw new Error(`Access denied: ${check.reason}`);\n }\n}\n","/**\n * State Synchronization Support - GAP-010\n *\n * Provides agent-side support for real-time state synchronization.\n * The actual transport (WebSocket/SSE) is handled by @almadar/server.\n *\n * This module provides:\n * - State change notifications\n * - Conflict resolution utilities\n * - State serialization for sync\n * - Event emitters for server integration\n *\n * @packageDocumentation\n */\n\nimport { EventEmitter } from 'events';\nimport type { Checkpoint } from '@langchain/langgraph-checkpoint';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * State change event types\n */\nexport type StateChangeType =\n | 'checkpoint_created'\n | 'checkpoint_updated'\n | 'session_started'\n | 'session_ended'\n | 'tool_executed'\n | 'memory_updated'\n | 'interrupt_triggered'\n | 'interrupt_resolved';\n\n/**\n * State change event\n */\nexport interface StateChangeEvent {\n /** Change type */\n type: StateChangeType;\n /** Thread/session ID */\n threadId: string;\n /** User ID */\n userId?: string;\n /** Timestamp */\n timestamp: number;\n /** Change payload */\n payload: Record<string, unknown>;\n /** Version vector for conflict resolution */\n version: VersionVector;\n /** Source client ID */\n sourceClientId?: string;\n}\n\n/**\n * Version vector for conflict resolution\n */\nexport interface VersionVector {\n /** Logical timestamp */\n timestamp: number;\n /** Sequence number */\n sequence: number;\n /** Node/client ID */\n nodeId: string;\n}\n\n/**\n * Sync state snapshot\n */\nexport interface StateSyncSnapshot {\n /** Thread ID */\n threadId: string;\n /** Current checkpoint */\n checkpoint?: Checkpoint;\n /** Session metadata */\n sessionMetadata?: Record<string, unknown>;\n /** Memory state */\n memoryState?: Record<string, unknown>;\n /** Version vector */\n version: VersionVector;\n /** Last updated */\n lastUpdated: number;\n}\n\n/**\n * Conflict resolution result\n */\nexport interface ConflictResolution {\n /** Whether conflict was resolved */\n resolved: boolean;\n /** Winning state if resolved */\n winningState?: StateSyncSnapshot;\n /** Conflicting changes if not resolved */\n conflicts?: Array<{\n clientA: StateChangeEvent;\n clientB: StateChangeEvent;\n }>;\n /** Resolution strategy used */\n strategy: 'last_write_wins' | 'merge' | 'manual';\n}\n\n/**\n * Sync configuration\n */\nexport interface StateSyncConfig {\n /** Enable sync */\n enabled: boolean;\n /** Conflict resolution strategy */\n conflictStrategy: 'last_write_wins' | 'merge' | 'manual';\n /** Throttle interval (ms) */\n throttleInterval: number;\n /** Max retry attempts */\n maxRetries: number;\n /** Client ID */\n clientId: string;\n}\n\n// ============================================================================\n// State Sync Manager\n// ============================================================================\n\nexport class StateSyncManager extends EventEmitter {\n private config: StateSyncConfig;\n private sequenceNumber = 0;\n private pendingChanges: StateChangeEvent[] = [];\n private throttleTimer: NodeJS.Timeout | null = null;\n\n constructor(config: Partial<StateSyncConfig> = {}) {\n super();\n this.config = {\n enabled: config.enabled ?? true,\n conflictStrategy: config.conflictStrategy ?? 'last_write_wins',\n throttleInterval: config.throttleInterval ?? 100,\n maxRetries: config.maxRetries ?? 3,\n clientId: config.clientId ?? this.generateClientId(),\n };\n }\n\n /**\n * Notify that state has changed (called by agent internals)\n */\n notifyStateChange(\n type: StateChangeType,\n threadId: string,\n payload: Record<string, unknown>,\n userId?: string,\n ): void {\n if (!this.config.enabled) return;\n\n const event: StateChangeEvent = {\n type,\n threadId,\n userId,\n timestamp: Date.now(),\n payload,\n version: this.createVersionVector(),\n sourceClientId: this.config.clientId,\n };\n\n // Add to pending changes\n this.pendingChanges.push(event);\n\n // Emit immediately for local listeners\n this.emit('stateChange', event);\n\n // Throttle sync to server\n this.scheduleSync();\n }\n\n /**\n * Receive state change from server (called by server transport)\n */\n receiveRemoteChange(event: StateChangeEvent): void {\n // Ignore own changes\n if (event.sourceClientId === this.config.clientId) return;\n\n // Check for conflicts\n const conflicts = this.findConflicts(event);\n\n if (conflicts.length > 0) {\n const resolution = this.resolveConflicts(event, conflicts);\n\n if (resolution.resolved) {\n this.emit('stateReconciled', resolution.winningState, event);\n } else {\n this.emit('conflictDetected', conflicts, event);\n }\n } else {\n // No conflicts, apply change\n this.emit('remoteChange', event);\n }\n }\n\n /**\n * Create sync snapshot for current state\n */\n createSnapshot(\n threadId: string,\n state: {\n checkpoint?: Checkpoint;\n sessionMetadata?: Record<string, unknown>;\n memoryState?: Record<string, unknown>;\n },\n ): StateSyncSnapshot {\n return {\n threadId,\n checkpoint: state.checkpoint,\n sessionMetadata: state.sessionMetadata,\n memoryState: state.memoryState,\n version: this.createVersionVector(),\n lastUpdated: Date.now(),\n };\n }\n\n /**\n * Compare two version vectors\n * Returns: -1 if a < b, 0 if concurrent/equal, 1 if a > b\n */\n compareVersions(a: VersionVector, b: VersionVector): number {\n if (a.timestamp < b.timestamp) return -1;\n if (a.timestamp > b.timestamp) return 1;\n if (a.sequence < b.sequence) return -1;\n if (a.sequence > b.sequence) return 1;\n return 0;\n }\n\n /**\n * Check if there are pending changes to sync\n */\n hasPendingChanges(): boolean {\n return this.pendingChanges.length > 0;\n }\n\n /**\n * Get and clear pending changes\n */\n flushPendingChanges(): StateChangeEvent[] {\n const changes = [...this.pendingChanges];\n this.pendingChanges = [];\n return changes;\n }\n\n /**\n * Get sync configuration\n */\n getConfig(): StateSyncConfig {\n return { ...this.config };\n }\n\n /**\n * Update sync configuration\n */\n updateConfig(config: Partial<StateSyncConfig>): void {\n this.config = { ...this.config, ...config };\n this.emit('configUpdated', this.config);\n }\n\n /**\n * Dispose resources\n */\n dispose(): void {\n if (this.throttleTimer) {\n clearTimeout(this.throttleTimer);\n this.throttleTimer = null;\n }\n this.removeAllListeners();\n this.pendingChanges = [];\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private generateClientId(): string {\n return `client_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private createVersionVector(): VersionVector {\n this.sequenceNumber++;\n return {\n timestamp: Date.now(),\n sequence: this.sequenceNumber,\n nodeId: this.config.clientId,\n };\n }\n\n private scheduleSync(): void {\n if (this.throttleTimer) return;\n\n this.throttleTimer = setTimeout(() => {\n this.throttleTimer = null;\n if (this.pendingChanges.length > 0) {\n this.emit('syncRequired', this.flushPendingChanges());\n }\n }, this.config.throttleInterval);\n }\n\n private findConflicts(incoming: StateChangeEvent): StateChangeEvent[] {\n // Find local pending changes that conflict with incoming\n return this.pendingChanges.filter(local =>\n local.threadId === incoming.threadId &&\n local.type === incoming.type &&\n this.compareVersions(local.version, incoming.version) !== 0\n );\n }\n\n private resolveConflicts(\n incoming: StateChangeEvent,\n conflicts: StateChangeEvent[],\n ): ConflictResolution {\n switch (this.config.conflictStrategy) {\n case 'last_write_wins':\n // Compare timestamps, latest wins\n let winningEvent = incoming;\n for (const conflict of conflicts) {\n if (this.compareVersions(conflict.version, winningEvent.version) > 0) {\n winningEvent = conflict;\n }\n }\n return {\n resolved: true,\n strategy: 'last_write_wins',\n };\n\n case 'manual':\n // Don't resolve, let user decide\n return {\n resolved: false,\n strategy: 'manual',\n conflicts: conflicts.map(c => ({ clientA: c, clientB: incoming })),\n };\n\n case 'merge':\n default:\n // Merge if possible, otherwise manual\n return {\n resolved: conflicts.length === 0,\n strategy: conflicts.length === 0 ? 'merge' : 'manual',\n conflicts: conflicts.length > 0\n ? conflicts.map(c => ({ clientA: c, clientB: incoming }))\n : undefined,\n };\n }\n }\n}\n\n// ============================================================================\n// Global Instance\n// ============================================================================\n\nlet globalStateSyncManager: StateSyncManager | null = null;\n\n/**\n * Get or create global state sync manager\n */\nexport function getStateSyncManager(config?: Partial<StateSyncConfig>): StateSyncManager {\n if (!globalStateSyncManager) {\n globalStateSyncManager = new StateSyncManager(config);\n }\n return globalStateSyncManager;\n}\n\n/**\n * Reset global state sync manager\n */\nexport function resetStateSyncManager(): void {\n globalStateSyncManager?.dispose();\n globalStateSyncManager = null;\n}\n\n// ============================================================================\n// Integration Helpers\n// ============================================================================\n\n/**\n * Create a synchronized wrapper for session operations\n */\nexport function withSync<T extends (...args: unknown[]) => unknown>(\n fn: T,\n syncManager: StateSyncManager,\n options: {\n threadId: string;\n type: StateChangeType;\n getPayload: (...args: unknown[]) => Record<string, unknown>;\n },\n): T {\n return ((...args: unknown[]) => {\n const result = fn(...args);\n\n // Notify sync manager\n syncManager.notifyStateChange(\n options.type,\n options.threadId,\n options.getPayload(...args),\n );\n\n return result;\n }) as T;\n}\n\n/**\n * Debounce sync notifications\n */\nexport function debounceSync(\n syncManager: StateSyncManager,\n delay: number = 100,\n): (type: StateChangeType, threadId: string, payload: Record<string, unknown>) => void {\n let timeout: NodeJS.Timeout | null = null;\n let pending: { type: StateChangeType; threadId: string; payload: Record<string, unknown> } | null = null;\n\n return (type, threadId, payload) => {\n pending = { type, threadId, payload };\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n if (pending) {\n syncManager.notifyStateChange(pending.type, pending.threadId, pending.payload);\n pending = null;\n }\n timeout = null;\n }, delay);\n };\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/orbitals/shared/constants.ts","../src/orbitals/shared/utils.ts","../src/orbitals/shared/index.ts","../src/orbitals/batch/prompt-assembler.ts","../src/orbitals/batch/concurrency.ts","../src/orbitals/batch/batch-generator.ts","../src/orbitals/batch/index.ts","../src/tools/orbital-batch-subagent.ts","../src/orbitals/router/orbital-estimator.ts","../src/api-types.ts","../src/tools/execute.ts","../src/tools/validate-schema.ts","../src/tools/generate-schema.ts","../src/orbitals/combiner/index.ts","../src/orbitals/domain-language/index.ts","../src/orbitals/domain-language/prompts/odl-syntax.ts","../src/orbitals/domain-language/prompts/odl-examples.ts","../src/orbitals/domain-language/prompts/odl-patterns.ts","../src/orbitals/domain-language/prompts/odl-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/index.ts","../src/tools/trait-subagent.ts","../src/tools/combine-schemas.ts","../src/tools/schema-chunking.ts","../src/tools/github.ts","../src/prompts/system-prompt.ts","../src/subagents.ts","../src/events.ts","../src/context-compaction.ts","../src/metrics.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","../src/memory/agentic-search.ts","../src/memory/PreferenceLearner.ts","../src/tools/composition.ts","../src/persistence/firestore-store.ts","../src/event-transformer/event-transformer.ts","../src/memory/memory-orbital.ts","../src/memory/MemoryManager.ts","../src/observability.ts","../src/multi-user.ts","../src/state-sync.ts","../src/orbitals/router/safety.ts","../src/orbitals/router/model-router.ts","../src/orbitals/router/index.ts","../src/mcp/server.ts","../src/mcp/client.ts","../src/evals/online-sampling.ts"],"names":["isEntityReference","getInlineEntity","getTraitName","getEntityName","buildContextSection","getFullOrbitalPrompt","init_prompt_assembler","resolve","asyncMapWithConcurrency","tool","LLMClient","z","getStructuredOutputClient","path2","fs","execAsync","promisify","exec","path3","fs2","path4","getCacheStats","AgentDomainCategorySchema","path","files","path5","fss","isOrbitalDefinition","getArchitectureSection","getSchemaReference","getMinimalTypeReference","fs5","path6","uuid","createOrbitalBatchSubagentTool","toolCall","estimateOrbitalCount","EventEmitter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,SAAS,gBAAgB,MAAA,EAAyC;AAC9D,EAAA,IAAI,iBAAA,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,CAAI,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;AAUO,SAAS,iBAAA,CAAkB,KAAa,GAAA,EAAsB;AACjE,EAAA,OAAO,GAAA,KAAQ,GAAA;AACnB;AAKO,SAAS,iBAAiB,WAAA,EAK/B;AACE,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,mDAAmD,CAAA;AACnF,EAAA,IAAI,CAAC,KAAA,EAAO;AACR,IAAA,OAAO,EAAE,WAAA,EAAa,SAAA,EAAW,MAAA,EAAQ,EAAA,EAAI,QAAQ,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAAA,EAC1E;AAEA,EAAA,OAAO;AAAA,IACH,WAAA,EAAa,MAAM,CAAC,CAAA;AAAA,IACpB,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IACf,MAAA,EAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,GAAI,EAAC;AAAA,IAC1C,QAAA,EAAU,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,GAAI;AAAC,GAChD;AACJ;AAKO,SAAS,qBAAA,CAAsB,KAAa,GAAA,EAAqB;AACpE,EAAA,IAAI,GAAA,KAAQ,KAAK,OAAO,CAAA;AAExB,EAAA,MAAM,EAAA,GAAK,iBAAiB,GAAG,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,iBAAiB,GAAG,CAAA;AAE/B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AAGZ,EAAA,IAAI,EAAA,CAAG,WAAA,KAAgB,EAAA,CAAG,WAAA,EAAa,KAAA,IAAS,CAAA;AAGhD,EAAA,IAAI,EAAA,CAAG,MAAA,KAAW,EAAA,CAAG,MAAA,EAAQ,KAAA,IAAS,CAAA;AAGtC,EAAA,MAAM,YAAA,GAAe,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,CAAC,CAAC,CAAA,CAAE,MAAA;AACpE,EAAA,MAAM,UAAA,GAAA,iBAAa,IAAI,GAAA,CAAI,CAAC,GAAG,EAAA,CAAG,MAAA,EAAQ,GAAG,EAAA,CAAG,MAAM,CAAC,CAAA,EAAE,IAAA;AACzD,EAAA,IAAI,aAAa,CAAA,EAAG;AAChB,IAAA,KAAA,IAAS,YAAA,GAAe,UAAA;AAAA,EAC5B,CAAA,MAAO;AACH,IAAA,KAAA,IAAS,CAAA;AAAA,EACb;AAGA,EAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,CAAG,QAAA,CAAS,QAAA,CAAS,CAAC,CAAC,CAAA,CAAE,MAAA;AAC1E,EAAA,MAAM,YAAA,GAAA,iBAAe,IAAI,GAAA,CAAI,CAAC,GAAG,EAAA,CAAG,QAAA,EAAU,GAAG,EAAA,CAAG,QAAQ,CAAC,CAAA,EAAE,IAAA;AAC/D,EAAA,IAAI,eAAe,CAAA,EAAG;AAClB,IAAA,KAAA,IAAS,cAAA,GAAiB,YAAA;AAAA,EAC9B,CAAA,MAAO;AACH,IAAA,KAAA,IAAS,CAAA;AAAA,EACb;AAEA,EAAA,OAAO,KAAA,GAAQ,KAAA;AACnB;AA5JA,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,IAAIA,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,SAASC,iBAAgB,MAAA,EAAkC;AACvD,EAAA,IAAID,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,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;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,CAAIC,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,GAAeD,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,CAAIC,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;AAMO,SAAS,2BAAA,CACZ,UACA,gBAAA,EAC8B;AAC9B,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA+B;AAEnD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC5B,IAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,OAAA,EAAS,gBAAgB,CAAA;AACjE,IAAA,MAAM,WAAW,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,WAAW,KAAK,EAAC;AACxD,IAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AACvB,IAAA,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU,WAAA,EAAa,QAAQ,CAAA;AAAA,EAC/C;AAEA,EAAA,OAAO,OAAA;AACX;AAKO,SAAS,cAAc,QAAA,EAK5B;AACE,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,GAAA,CAAI,yBAAyB,CAAA;AAC3D,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,YAAY,CAAA;AAEnC,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC5B,IAAA,MAAM,EAAA,GAAK,0BAA0B,OAAO,CAAA;AAC5C,IAAA,IAAI,eAAA,CAAgB,EAAE,CAAA,EAAG;AACrB,MAAA,eAAA,EAAA;AAAA,IACJ;AAAA,EACJ;AAEA,EAAA,OAAO;AAAA,IACH,eAAe,QAAA,CAAS,MAAA;AAAA,IACxB,oBAAoB,MAAA,CAAO,IAAA;AAAA,IAC3B,kBAAA,EAAoB,QAAA,CAAS,MAAA,GAAS,MAAA,CAAO,IAAA;AAAA,IAC7C;AAAA,GACJ;AACJ;AA5SA,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,aAAA,GAAA,EAAA;AAAA,QAAA,CAAA,aAAA,EAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,8BAAA,EAAA,MAAA,8BAAA;AAAA,EAAA,2BAAA,EAAA,MAAA,2BAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,gBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,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;;;ACrCA,IAkBa,2BAAA,CAAA,CAWA,sBAoBA,gBAAA;AAjDb,IAAA,cAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kCAAA,GAAA;AAkBO,IAAM,2BAAA,GAA2D;AAAA,MACtE,SAAA,EAAW,CAAA;AAAA,MACX,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,IAAA,EAAM,CAAA;AAAA,MACN,UAAA,EAAY;AAAA,KACd;AAKO,IAAM,oBAAA,GAAoD;AAAA,MAC/D,SAAA,EAAW,CAAA;AAAA;AAAA,MACX,MAAA,EAAQ,CAAA;AAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA;AAAA,MACV,IAAA,EAAM,CAAA;AAAA;AAAA,MACN,UAAA,EAAY;AAAA;AAAA,KACd;AAcO,IAAM,gBAAA,GAAmB,IAAA;AAkEM,EAAA;AAAA,CAAA,CAAA;AChG/B,SAASC,eAAc,MAAA,EAA2B;AACvD,EAAA,IAAIH,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;AAKO,SAASC,iBAAgB,MAAA,EAAkC;AAChE,EAAA,IAAID,iBAAAA,CAAkB,MAAM,CAAA,EAAG;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AAaO,SAAS,cAAc,MAAA,EAA2B;AACvD,EAAA,MAAM,YAAA,GAAeC,iBAAgB,MAAM,CAAA;AAC3C,EAAA,IAAI,CAAC,YAAA,EAAc,MAAA,EAAQ,MAAA,EAAQ;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,YAAA,CAAa,OAAO,GAAA,CAAI,CAAC,MAAwB,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC3E;AAoBO,SAAS,SAAA,CACd,KAAA,EACA,OAAA,EACA,IAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,IACpB,KAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AA4BO,SAASG,qBAAoB,OAAA,EAAoC;AACtE,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,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;AAClB,MAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,IAAA,CAAK,UAAU,GAAA,CAAI,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,IAAI,eAAA,EAAiB;AACvB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,GAAA,CAAI,eAAe,CAAA,CAAA,CAAG,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,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;AACb,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,IACvE;AAAA,EACF;AAEA,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,YAAY,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,GAAO,EAAA;AAC/D;AAKO,SAAS,yBAAyB,OAAA,EAAoC;AAC3E,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,OAAA,CAAQ,OAAO,MAAA,EAAQ;AACzB,IAAA,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,OAAA,CAAQ,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,IAAA,KAAA,CAAM,KAAK,CAAA,SAAA,EAAY,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,OAAK,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,MAAA,EAAI,EAAE,QAAQ,CAAA,CAAE,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC1F;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAkEO,SAAS,UAAA,CAAc,OAAY,IAAA,EAAqB;AAC7D,EAAA,MAAM,SAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,IAAA,EAAM;AAC3C,IAAA,MAAA,CAAO,KAAK,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,MAAA;AACT;AAyEO,SAAS,gBAAgB,KAAA,EAAwB;AACtD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AACA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAjTA,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAyCA,IAAA,cAAA,EAAA;AAqBA,IAAA,UAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACEO,SAAS,qBAAqB,QAAA,EAAmD;AACtF,EAAA,MAAM,aAAqC,EAAC;AAC5C,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,EAAA,MAAM,gBAA0D,EAAC;AAGjE,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,CAAQ,eAAe,UAAA,EAAY;AACrC,MAAA,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,OAAA,CAAQ,aAAA,CAAc,UAAU,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,OAAA,CAAQ,QAAQ,KAAA,EAAO;AACzB,MAAA,MAAA,CAAO,GAAA,CAAI,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA;AAAA,IACjC;AAAA,EAGF;AAGA,EAAmB,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC;AAEzD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,KAAA,EAAO;AAEjC,QAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,UAAA,IAAI,UAAU,OAAA,EAAS;AACvB,UAAA,IAAI,MAAM,OAAA,EAAS;AACjB,YAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,IAAA,CAAK,OAAK,CAAA,CAAE,KAAA,KAAU,MAAM,KAAK,CAAA;AAChE,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,aAAA,CAAc,IAAA,CAAK;AAAA,gBACjB,SAAS,OAAA,CAAQ,IAAA;AAAA,gBACjB,OAAO,KAAA,CAAM,KAAA;AAAA,gBACb,UAAU,KAAA,CAAM,IAAA;AAAA,gBAChB,SAAS,QAAA,CAAS;AAAA,eACnB,CAAA;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,kBAAkB,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,MAAA,GAAS,IAAI,UAAA,GAAa,MAAA;AAAA,IACpE,WAAA,EAAa,OAAO,IAAA,KAAS,CAAA,GAAI,MAAM,IAAA,CAAK,MAAM,CAAA,CAAE,CAAC,CAAA,GAAI,MAAA;AAAA,IACzD,gBAAgB,QAAA,CAAS,IAAA,GAAO,IAAI,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,GAAI,MAAA;AAAA,IAC3D,kBAAA,EAAoB,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,aAAA,GAAgB;AAAA,GACjE;AACF;AAmBO,SAAS,mBAAA,CACd,QAAA,EACA,OAAA,GAGI,EAAC,EACiB;AACtB,EAAA,MAAM;AAAA,IACJ,mBAAmBC,oBAAAA,EAAqB;AAAA,IACxC,mBAAA,GAAsB;AAAA,GACxB,GAAI,OAAA;AAEJ,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AAGA,EAAA,MAAM,aAAA,GAAgB,qBAAqB,QAAQ,CAAA;AAGnD,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,QAAA,EAAU,aAAa,CAAA;AAG5D,EAAA,MAAM,kBAAkB,QAAA,CAAS,GAAA;AAAA,IAAI,CAAC,SAAS,KAAA,KAC7C,mBAAA,CAAoB,SAAS,KAAA,GAAQ,CAAA,EAAG,QAAA,CAAS,MAAA,EAAQ,mBAAmB;AAAA,GAC9E;AAGA,EAAA,MAAM,aAAA,GAAgB,mBAAmB,QAAQ,CAAA;AAGjD,EAAA,MAAM,MAAA,GAAS,GAAG,gBAAgB;;AAAA,EAElC,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC;AAAA,kBAAA,EACI,SAAS,MAAM,CAAA;AAAA,EACjC,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC;;AAAA,EAEd,WAAW;;AAAA,EAEX,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAC;;AAAA,EAE5B,aAAa,CAAA,CAAA;AAGb,EAAA,MAAM,WAAA,GAAc,yBAAyB,QAAQ,CAAA;AAErD,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA,EAAoB,KAAA;AAAA;AAAA,IACpB,cAAc,QAAA,CAAS,MAAA;AAAA,IACvB,YAAA,EAAc,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI;AAAA,GACxC;AACF;AAKA,SAAS,gBAAA,CACP,UACA,aAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,CAAA,iBAAA,CAAA;AAAA,IACA,CAAA,kBAAA,EAAqB,SAAS,MAAM,CAAA,CAAA;AAAA,IACpC,CAAA,YAAA,EAAe,SAAS,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,GACrD;AAEA,EAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,aAAA,CAAc,WAAW,CAAA,CAAE,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,aAAA,CAAc,gBAAgB,MAAA,EAAQ;AACxC,IAAA,KAAA,CAAM,KAAK,CAAA,mBAAA,EAAsB,aAAA,CAAc,eAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC5E;AAEA,EAAA,IAAI,aAAA,CAAc,oBAAoB,MAAA,CAAO,IAAA,CAAK,cAAc,gBAAgB,CAAA,CAAE,SAAS,CAAA,EAAG;AAC5F,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,2BAAA,CAA+B,CAAA;AAC1C,IAAA,KAAA,MAAW,CAAC,MAAM,UAAU,CAAA,IAAK,OAAO,OAAA,CAAQ,aAAA,CAAc,gBAAgB,CAAA,EAAG;AAC/E,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,EAAK,UAAU,CAAA,CAAE,CAAA;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,IAAI,aAAA,CAAc,oBAAoB,MAAA,EAAQ;AAC5C,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,oCAAA,CAAwC,CAAA;AACnD,IAAA,KAAA,MAAW,GAAA,IAAO,cAAc,kBAAA,EAAoB;AAClD,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,QAAA,EAAW,GAAA,CAAI,KAAK,CAAA,SAAA,EAAO,GAAA,CAAI,QAAQ,CAAA,eAAA,EAAkB,GAAA,CAAI,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IACpG;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,mBAAA,CACP,OAAA,EACA,KAAA,EACA,KAAA,EACA,mBAAA,EACQ;AACR,EAAA,MAAM,UAAA,GAAaF,cAAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAC/C,EAAA,MAAM,cAAA,GAAiBC,qBAAoB,OAAO,CAAA;AAClD,EAAA,MAAM,mBAAA,GAAsB,mBAAA,GAAsB,wBAAA,CAAyB,OAAO,CAAA,GAAI,EAAA;AAEtF,EAAA,OAAO,CAAA;AAAA,WAAA,EACI,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,EAAA,EAAK,QAAQ,IAAI;;AAAA,YAAA,EAE9B,UAAU;AAAA,iBAAA,EACJ,OAAA,CAAQ,MAAA,CAAoC,WAAA,IAAe,YAAY;AAAA,YAAA,EAC7E,UAAU;AAAA,YAAA,EACV,QAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,OAAO,MAAM,QAAA,GAAW,CAAA,GAAI,KAAA,IAAS,CAAA,GAAI,EAAE,GAAA,GAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA,EACvG,cAAc,GAAG,mBAAA,GAAsB,CAAA;AAAA,EAAsB,mBAAmB;AAAA,CAAA,GAAO,EAAE;AAAA,wCAAA,EACjD,QAAQ,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOpD,OAAA,CAAQ,KAAA,EAAO,MAAA,GAAS,oBAAA,GAAuB,QAAQ,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,IAAI,IAAI,EAAE;AAAA,EAC9F,OAAA,CAAQ,OAAA,EAAS,MAAA,GAAS,sBAAA,GAAyB,QAAQ,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,IAAI,IAAI,EAAE,CAAA,CAAA;AACtG;AAKA,SAAS,mBAAmB,QAAA,EAAuC;AACjE,EAAA,OAAO,CAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,EAQP,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA;AAAA,eAAA,EACR,EAAE,IAAI,CAAA;AAAA,0CAAA,EACqB,EAAE,IAAI;AAAA,KAAA,EAC3C,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,uBAAA,EAQ9B,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,CAAA;AAK7D;AAKA,SAAS,yBAAyB,QAAA,EAAuC;AACvE,EAAA,MAAM,eAAe,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,yBAAA,CAA0B,CAAC,CAAC,CAAA;AACnE,EAAA,MAAM,QAAA,GAAW,YAAA,CAAa,IAAA,EAAK,CAAE,KAAK,GAAG,CAAA;AAG7C,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,UAAA,CAAW,CAAC,CAAA;AAClC,IAAA,IAAA,GAAA,CAAS,IAAA,IAAQ,KAAK,IAAA,GAAQ,IAAA;AAC9B,IAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,EAChB;AAEA,EAAA,OAAO,CAAA,MAAA,EAAS,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,KAAK,GAAA,CAAI,IAAI,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC5E;AAuBO,SAAS,gBAAA,CACd,QAAA,EACA,OAAA,GAII,EAAC,EACkB;AACvB,EAAA,MAAM;AAAA,IACJ,YAAA,GAAe,CAAA;AAAA,IACf,qBAAA,GAAwB;AAAA,GAC1B,GAAI,OAAA;AAEJ,EAAA,IAAI,CAAC,qBAAA,EAAuB;AAE1B,IAAA,OAAO,UAAA,CAAW,UAAU,YAAY,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,QAAA,GAAW,qBAAqB,QAAQ,CAAA;AAG9C,EAAA,MAAM,UAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,CAAQ,UAAU,YAAA,EAAc;AAElC,MAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,IACtB,CAAA,MAAO;AAEL,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAG,UAAA,CAAW,OAAA,EAAS,YAAY,CAAC,CAAA;AAAA,IACnD;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAMA,SAAS,qBAAqB,QAAA,EAAsD;AAClF,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,WAAkC,EAAC;AAGzC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAyB;AAE/C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,EAAG;AAChC,MAAA,SAAA,CAAU,GAAA,CAAI,OAAA,CAAQ,IAAA,kBAAM,IAAI,KAAK,CAAA;AAAA,IACvC;AAGA,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,KAAA,MAAW,KAAA,IAAS,QAAQ,KAAA,EAAO;AAEjC,QAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,UAAA,IAAI,UAAU,OAAA,EAAS;AACvB,UAAA,IAAI,KAAA,CAAM,SAAS,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,KAAA,KAAU,KAAA,CAAM,KAAK,CAAA,EAAG;AACrD,YAAA,SAAA,CAAU,IAAI,OAAA,CAAQ,IAAI,CAAA,EAAG,GAAA,CAAI,MAAM,IAAI,CAAA;AAC3C,YAAA,IAAI,CAAC,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,EAAG;AAC9B,cAAA,SAAA,CAAU,GAAA,CAAI,KAAA,CAAM,IAAA,kBAAM,IAAI,KAAK,CAAA;AAAA,YACrC;AACA,YAAA,SAAA,CAAU,IAAI,KAAA,CAAM,IAAI,CAAA,EAAG,GAAA,CAAI,QAAQ,IAAI,CAAA;AAAA,UAC7C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,SAAS,GAAA,CAAI,SAA4B,OAAA,EAA8B;AACrE,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,IAAI,CAAA;AACxB,IAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAEpB,IAAA,MAAM,YAAY,SAAA,CAAU,GAAA,CAAI,QAAQ,IAAI,CAAA,wBAAS,GAAA,EAAI;AACzD,IAAA,KAAA,MAAW,gBAAgB,SAAA,EAAW;AACpC,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,EAAG;AAC9B,QAAA,MAAM,WAAW,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,YAAY,CAAA;AAC3D,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,GAAA,CAAI,UAAU,OAAO,CAAA;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC9B,MAAA,MAAM,UAA+B,EAAC;AACtC,MAAA,GAAA,CAAI,SAAS,OAAO,CAAA;AACpB,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAUO,SAAS,oBAAoB,QAAA,EAAuC;AACzE,EAAA,MAAM,UAAA,GAAa,GAAA;AACnB,EAAA,MAAM,gBAAA,GAAmB,GAAA;AAEzB,EAAA,OAAO,UAAA,GAAc,SAAS,MAAA,GAAS,gBAAA;AACzC;AAKO,SAAS,YAAA,CACd,QAAA,EACA,SAAA,GAAoB,IAAA,EACX;AACT,EAAA,MAAM,SAAA,GAAY,oBAAoB,QAAQ,CAAA;AAE9C,EAAA,OAAO,YAAa,SAAA,GAAY,GAAA;AAClC;AAncA,IAAAE,sBAAAA,GAAA,KAAA,CAAA;AAAA,EAAA,wCAAA,GAAA;AAcA,IAAA,UAAA,EAAA;AAEA,IAAA,WAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACSO,SAAS,4BAA4B,cAAA,EAA+C;AACzF,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,MAAM,QAA2B,EAAC;AAElC,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,GAAyB;AAC7B,MAAA,IAAI,cAAc,cAAA,EAAgB;AAChC,QAAA,WAAA,EAAA;AACA,QAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,MACzB;AAEA,MAAA,OAAO,IAAI,OAAA,CAAQ,CAACC,QAAAA,KAAY;AAC9B,QAAA,KAAA,CAAM,KAAK,MAAM;AACf,UAAA,WAAA,EAAA;AACA,UAAAA,QAAAA,EAAQ;AAAA,QACV,CAAC,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,OAAA,GAAgB;AACd,MAAA,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,GAAc,CAAC,CAAA;AACzC,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,EAAM;AACzB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,IAAA,EAAK;AAAA,MACP;AAAA,IACF,CAAA;AAAA,IAEA,IAAI,WAAA,GAAsB;AACxB,MAAA,OAAO,WAAA;AAAA,IACT,CAAA;AAAA,IAEA,IAAI,YAAA,GAAuB;AACzB,MAAA,OAAO,KAAA,CAAM,MAAA;AAAA,IACf;AAAA,GACF;AACF;AAaA,eAAsB,kBAAA,CACpB,OACA,OAAA,EACc;AACd,EAAA,MAAM,EAAE,WAAA,EAAa,UAAA,EAAW,GAAI,OAAA;AACpC,EAAA,MAAM,UAAA,GAAa,4BAA4B,WAAW,CAAA;AAC1D,EAAA,MAAM,UAAe,EAAC;AACtB,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,IACZ,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,EAAM,KAAA,KAAU;AAC/B,MAAA,MAAM,WAAW,OAAA,EAAQ;AACzB,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAM,IAAA,EAAK;AAC5B,QAAA,SAAA,EAAA;AACA,QAAA,UAAA,GAAa,SAAA,EAAW,MAAM,MAAM,CAAA;AAAA,MACtC,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,OAAA,EAAQ;AAAA,MACrB;AAAA,IACF,CAAC;AAAA,GACH;AAEA,EAAA,OAAO,OAAA;AACT;AAgBA,eAAsBC,wBAAAA,CACpB,KAAA,EACA,MAAA,EACA,WAAA,EACc;AACd,EAAA,OAAO,kBAAA;AAAA,IACL,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,UAAU,MAAM,MAAA,CAAO,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,IACpD,EAAE,WAAA;AAAY,GAChB;AACF;AAzHA,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,mCAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACoDA,eAAsB,qBAAA,CACpB,MAAA,EACA,QAAA,EACA,OAAA,GAAkC,EAAC,EACH;AAChC,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,gBAAiC,EAAC;AAExC,EAAA,MAAM,QAAA,GAAW,OAAO,WAAA,EAAY;AACpC,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,aAAA;AAC7B,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,WAAA,IAAe,2BAAA,CAA4B,QAAQ,CAAA;AAClF,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,SAAA,IAAa,oBAAA,CAAqB,QAAQ,CAAA;AAEvE,EAAA,OAAA,CAAQ,GAAA,CAAI,+CAA+C,QAAA,CAAS,MAAM,mBAAmB,IAAI,CAAA,cAAA,EAAiB,cAAc,CAAA,CAAE,CAAA;AAElI,EAAA,aAAA,CAAc,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,yBAAA,CAAA,EAA6B;AAAA,IAChE,eAAe,QAAA,CAAS,MAAA;AAAA,IACxB,IAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACD,CAAC,CAAA;AAGF,EAAA,MAAM,OAAA,GAAU,iBAAiB,QAAA,EAAU;AAAA,IACzC,YAAA;AAAA,IAEA,qBAAA,EAAuB,QAAQ,qBAAA,IAAyB;AAAA,GACzD,CAAA;AAED,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,OAAA,CAAQ,MAAM,cAAc,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAE/G,EAAA,aAAA,CAAc,KAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,WAAA,EAAc,OAAA,CAAQ,MAAM,CAAA,QAAA,CAAA,EAAY;AAAA,IAC3E,UAAA,EAAY,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,MAAM;AAAA,GACtC,CAAC,CAAA;AAGF,EAAA,OAAA,CAAQ,eAAA,GAAkB;AAAA,IACxB,IAAA,EAAM,aAAA;AAAA,IACN,UAAA,EAAY,CAAA;AAAA,IACZ,cAAc,OAAA,CAAQ,MAAA;AAAA,IACtB,iBAAA,EAAmB,CAAA;AAAA,IACnB,eAAe,QAAA,CAAS;AAAA,GACzB,CAAA;AAGD,EAAA,IAAI,YAAA;AAEJ,EAAA,IAAI,SAAS,qBAAA,EAAuB;AAElC,IAAA,YAAA,GAAe,MAAM,0BAAA,CAA2B,MAAA,EAAQ,QAAA,EAAU;AAAA,MAChE,GAAG,OAAA;AAAA,MACH,WAAA,EAAa,cAAA;AAAA,MACb,iBAAiB,OAAA,CAAQ;AAAA,KAC1B,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,SAAS,aAAA,EAAe;AAEjC,IAAA,YAAA,GAAe,MAAM,yBAAA,CAA0B,MAAA,EAAQ,OAAA,EAAS;AAAA,MAC9D,GAAG,OAAA;AAAA,MACH,WAAA,EAAa,cAAA;AAAA,MACb,iBAAiB,OAAA,CAAQ;AAAA,KAC1B,CAAA;AAAA,EACH,CAAA,MAAO;AAEL,IAAA,YAAA,GAAe,MAAM,gBAAA,CAAiB,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS;AAAA,MAC/D,GAAG,OAAA;AAAA,MACH,WAAA,EAAa,cAAA;AAAA,MACb,YAAA;AAAA,MACA,iBAAiB,OAAA,CAAQ;AAAA,KAC1B,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAGrC,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,OAAA,CAAQ,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AACtD,EAAA,MAAM,aAAa,UAAA,CAAW,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AACrD,EAAA,MAAM,MAAA,GAAS,WAAW,MAAA,GAAS,UAAA;AACnC,EAAA,MAAM,cAAc,YAAA,CAAa,MAAA;AAAA,IAC/B,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,CAAA,CAAE,OAAO,WAAA,IAAe,CAAA,CAAA;AAAA,IAC3C;AAAA,GACF;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAA8B,UAAU,CAAA,CAAA,EAAI,UAAA,CAAW,MAAM,CAAA,aAAA,EAAgB,WAAW,CAAA,SAAA,EAAY,eAAe,CAAA,EAAA,CAAI,CAAA;AAEnI,EAAA,aAAA,CAAc,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,0BAAA,CAAA,EAA8B;AAAA,IACjE,eAAA;AAAA,IACA,UAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAc,OAAA,CAAQ;AAAA,GACvB,CAAC,CAAA;AAGF,EAAA,OAAA,CAAQ,eAAA,GAAkB;AAAA,IACxB,IAAA,EAAM,gBAAA;AAAA,IACN,UAAA,EAAY,QAAQ,MAAA,GAAS,CAAA;AAAA,IAC7B,cAAc,OAAA,CAAQ,MAAA;AAAA,IACtB,iBAAA,EAAmB,UAAA;AAAA,IACnB,eAAe,QAAA,CAAS;AAAA,GACzB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MAC5B,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,WAAA,EAAa,EAAA;AAAA;AAAA,MACb,YAAA,EAAc,KAAA;AAAA,MACd,KAAA,EAAO,MAAA;AAAA,MACP,YAAY,CAAA,CAAE,OAAA,GACV,EAAE,KAAA,EAAO,MAAM,UAAA,EAAY,CAAA,EAAG,YAAA,EAAc,CAAA,KAC5C,EAAE,KAAA,EAAO,OAAO,UAAA,EAAY,CAAA,EAAG,cAAc,CAAA,EAAE;AAAA,MACnD,MAAM;AAAC,KACT,CAAE,CAAA;AAAA,IACF,eAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP,OAAO,UAAA,CAAW,MAAA;AAAA,MAClB,UAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,YAAA;AAAA,IACA,cAAc,OAAA,CAAQ;AAAA,GACxB;AACF;AASA,eAAe,yBAAA,CACb,MAAA,EACA,OAAA,EACA,OAAA,EAC8B;AAC9B,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAElE,EAAA,OAAOA,wBAAAA;AAAA,IACL,OAAA;AAAA,IACA,OAAO,OAAO,UAAA,KAAe;AAC3B,MAAA,OAAO,mBAAA,CAAoB,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY;AAAA,QACpD,GAAG,OAAA;AAAA,QACH,UAAA,EAAY,CAAC,gBAAA,KAAqB;AAChC,UAAA,MAAM,eAAe,iBAAA,GAAoB,gBAAA;AACzC,UAAA,OAAA,CAAQ,eAAA,GAAkB;AAAA,YACxB,IAAA,EAAM,kBAAA;AAAA,YACN,UAAA;AAAA,YACA,cAAc,OAAA,CAAQ,MAAA;AAAA,YACtB,iBAAA,EAAmB,YAAA;AAAA,YACnB;AAAA,WACD,CAAA;AACD,UAAA,iBAAA,GAAoB,YAAA;AAAA,QACtB;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,OAAA,CAAQ;AAAA,GACV;AACF;AAKA,eAAe,0BAAA,CACb,MAAA,EACA,QAAA,EACA,OAAA,EAC8B;AAE9B,EAAA,MAAM,UAAU,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAC,CAAC,CAAA;AAErC,EAAA,OAAO,yBAAA,CAA0B,QAAQ,OAAA,EAAS;AAAA,IAChD,GAAG,OAAA;AAAA,IACH,aAAa,OAAA,CAAQ;AAAA,GACtB,CAAA;AACH;AASA,eAAe,gBAAA,CACb,MAAA,EACA,QAAA,EACA,OAAA,EACA,OAAA,EAC8B;AAE9B,EAAA,MAAM,SAAS,OAAA,CAAQ,KAAA,CAAM,WAAS,YAAA,CAAa,KAAA,EAAO,gBAAgB,CAAC,CAAA;AAI3E,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sDAAA,EAAyD,OAAA,CAAQ,MAAM,CAAA,SAAA,CAAW,CAAA;AAC9F,IAAA,OAAO,yBAAA,CAA0B,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AAAA,EAC3D;AAGA,EAAA,OAAA,CAAQ,IAAI,CAAA,wEAAA,CAA0E,CAAA;AACtF,EAAA,OAAO,0BAAA,CAA2B,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAA;AAC7D;AASA,eAAe,mBAAA,CACb,MAAA,EACA,QAAA,EACA,UAAA,EACA,OAAA,EAC4B;AAC5B,EAAA,MAAM,cAAA,GAAiB,KAAK,GAAA,EAAI;AAChC,EAAA,MAAM,OAAwB,EAAC;AAE/B,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gCAAA,EAAmC,UAAA,GAAa,CAAC,KAAK,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAExG,EAAA,IAAA,CAAK,KAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,eAAA,EAAkB,UAAA,GAAa,CAAC,CAAA,CAAA,EAAI;AAAA,IAC9D,cAAc,QAAA,CAAS,MAAA;AAAA,IACvB,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI;AAAA,GACnC,CAAC,CAAA;AAEF,EAAA,IAAI;AAEF,IAAA,MAAM,WAAA,GAAc,oBAAoB,QAAQ,CAAA;AAChD,IAAA,OAAA,CAAQ,GAAA,CAAI,0BAA0B,UAAA,GAAa,CAAC,sBAAsB,WAAA,CAAY,MAAA,CAAO,MAAM,CAAA,MAAA,CAAQ,CAAA;AAE3G,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,sBAAA,CAAA,EAA0B;AAAA,MACpD,YAAA,EAAc,YAAY,MAAA,CAAO,MAAA;AAAA,MACjC,iBAAiB,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,SAAS,CAAC;AAAA,KACzD,CAAC,CAAA;AAGF,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,gBAAA,CAAiB;AAAA,MAC9C,cAAc,WAAA,CAAY,MAAA;AAAA,MAC1B,UAAA,EAAY,6FAAA;AAAA,MACZ,SAAA,EAAW,gBAAA;AAAA,MACX,oBAAA,EAAsB;AAAA,KACvB,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,kBAAA,CAAA,EAAsB;AAAA,MAChD,YAAA,EAAc,UAAU,KAAA,EAAO,YAAA;AAAA,MAC/B,gBAAA,EAAkB,UAAU,KAAA,EAAO;AAAA,KACpC,CAAC,CAAA;AAGF,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,SAAA,CAAU,IAAA,EAAM,QAAQ,CAAA;AACxD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,uBAAA,EAA0B,UAAA,GAAa,CAAC,YAAY,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,MAAM,CAAA,WAAA,CAAa,CAAA;AAGlI,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,OAAA,CAAQ,UAAA,GAAa,IAAI,CAAC,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,cAAA;AAEhC,IAAA,IAAA,CAAK,KAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,MAAA,EAAS,UAAA,GAAa,CAAC,CAAA,UAAA,CAAA,EAAc;AAAA,MAC/D,UAAA;AAAA,MACA,YAAY,MAAA,CAAO,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE;AAAA,KAC3C,CAAC,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,OAAA,EAAS,MAAA;AAAA,MACT,KAAA,EAAO,UAAU,KAAA,IAAS,KAAA,CAAA;AAAA,MAC1B,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EAEF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,YAAA,GAAe,gBAAgB,KAAK,CAAA;AAC1C,IAAA,OAAA,CAAQ,MAAM,CAAA,uBAAA,EAA0B,UAAA,GAAa,CAAC,CAAA,SAAA,EAAY,YAAY,CAAA,CAAE,CAAA;AAEhF,IAAA,IAAA,CAAK,KAAK,SAAA,CAAU,OAAA,EAAS,CAAA,MAAA,EAAS,UAAA,GAAa,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,MAC7D,KAAA,EAAO;AAAA,KACR,CAAC,CAAA;AAGF,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC1B,OAAA,EAAS,CAAA;AAAA,QACT,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT,CAAE,CAAA;AAAA,MACF,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,cAAA;AAAA,MACzB;AAAA,KACF;AAAA,EACF;AACF;AASA,SAAS,gBAAA,CACP,MACA,gBAAA,EACyE;AACzE,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,gBAAA,CAAiB,IAAI,CAAA,CAAA,MAAM;AAAA,MAChC,OAAA,EAAS,CAAA;AAAA,MACT,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,MAAM,GAAA,GAAM,IAAA;AAGZ,EAAA,IAAI,CAAC,IAAI,QAAA,IAAY,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AACjD,IAAA,OAAO,gBAAA,CAAiB,IAAI,CAAA,CAAA,MAAM;AAAA,MAChC,OAAA,EAAS,CAAA;AAAA,MACT,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,MAAM,UAAU,GAAA,CAAI,QAAA;AAGpB,EAAA,OAAO,gBAAA,CAAiB,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,KAAU;AAC/C,IAAA,MAAM,MAAA,GAAS,QAAQ,KAAK,CAAA;AAE5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,CAAA,2BAAA,EAA8B,KAAA,GAAQ,CAAC,CAAA;AAAA,OAChD;AAAA,IACF;AAGA,IAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,QAAA;AAAA,QACT,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,MAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACX;AAAA,EACF,CAAC,CAAA;AACH;AA1ZA,IAAA,oBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,uCAAA,GAAA;AAWA,IAAA,WAAA,EAAA;AAcA,IAAAF,sBAAAA,EAAAA;AACA,IAAA,gBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC1BA,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,6BAAA,GAAA;AAeA,IAAA,oBAAA,EAAA;AASA,IAAAA,sBAAAA,EAAAA;AAcA,IAAA,gBAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACtCA,IAAA,8BAAA,GAAA,EAAA;AAAA,QAAA,CAAA,8BAAA,EAAA;AAAA,EAAA,8BAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAiFO,SAAS,8BAAA,CAA+B,OAAA,GAA2C,EAAC,EAAG;AAC5F,EAAA,IAAI,gBAAmD,OAAA,CAAQ,eAAA;AAC/D,EAAA,IAAI,mBAAsD,OAAA,CAAQ,eAAA;AAClE,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AAExB,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAoC;AAC5D,IAAA,aAAA,GAAgB,QAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,wBAAA,GAA2B,CAAC,QAAA,KAAoC;AACpE,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,SAAA,GAAYG,IAAAA;AAAA,IAChB,OAAO,EAAE,QAAA,EAAU,OAAA,EAAS,cAAa,KAAM;AAC7C,MAAA,IAAI,CAAC,QAAA,IAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACtC,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,4CAAA;AAAA,UACP,UAAU;AAAC,SACZ,CAAA;AAAA,MACH;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qDAAA,EAAwD,QAAA,CAAS,MAAM,CAAA,SAAA,CAAW,CAAA;AAE9F,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,SAAA,EAAW;AAAA,UAClC,OAAA,EAAS,CAAA,8BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA,SAAA,CAAA;AAAA,UACzD,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,SAAA,CAAU,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,aAAA,EAAe;AAAA,UACtC,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,YAC7B,EAAA,EAAI,WAAW,CAAC,CAAA,CAAA;AAAA,YAChB,IAAA,EAAM,CAAA,SAAA,EAAY,CAAA,CAAE,IAAI,CAAA,CAAA;AAAA,YACxB,MAAA,EAAQ;AAAA,WACV,CAAE;AAAA,SACH,CAAA;AAGD,QAAA,MAAM,MAAA,GAAS,IAAIC,SAAAA,CAAU;AAAA,UAC3B,QAAA,EAAU,QAAQ,QAAA,IAAY,WAAA;AAAA,UAC9B,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,SACzB,CAAA;AAGD,QAAA,MAAM,iBAAA,GAA4C;AAAA,UAChD,IAAA,EAAM,cAAc,IAAA,IAAQ,UAAA;AAAA,UAC5B,WAAW,YAAA,EAAc,SAAA;AAAA,UACzB,aAAa,YAAA,EAAc,cAAA,IAAkB,2BAAA,CAA4B,MAAA,CAAO,aAAa,CAAA;AAAA,UAC7F,qBAAA,EAAuB,cAAc,qBAAA,IAAyB,IAAA;AAAA,UAC9D,YAAA;AAAA,UACA,eAAA,EAAiB,CAAC,KAAA,KAA8B;AAE9C,YAAA,IAAI,KAAA,CAAM,IAAA,KAAS,kBAAA,IAAsB,KAAA,CAAM,WAAA,EAAa;AAC1D,cAAA,SAAA,CAAU,MAAM,WAAA,IAAe,OAAA,EAAS,MAAM,UAAA,EAAY,KAAA,CAAM,cAAc,aAAA,EAAe;AAAA,gBAC3F,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,kBAC7B,EAAA,EAAI,WAAW,CAAC,CAAA,CAAA;AAAA,kBAChB,IAAA,EAAM,CAAA,SAAA,EAAY,CAAA,CAAE,IAAI,CAAA,CAAA;AAAA,kBACxB,MAAA,EACE,EAAE,IAAA,KAAS,KAAA,CAAM,cACb,WAAA,GACA,KAAA,CAAM,iBAAA,GAAoB,CAAA,GACxB,WAAA,GACA;AAAA,iBACV,CAAE;AAAA,eACH,CAAA;AAAA,YACH;AAGA,YAAA,SAAA,CAAU,MAAM,WAAA,IAAe,OAAA,EAAS,MAAM,UAAA,EAAY,KAAA,CAAM,cAAc,gBAAA,EAAkB;AAAA,cAC9F,KAAA,EAAO,MAAA;AAAA,cACP,SAAS,CAAA,UAAA,EAAa,KAAA,CAAM,iBAAiB,CAAA,CAAA,EAAI,MAAM,aAAa,CAAA,kBAAA,CAAA;AAAA,cACpE,IAAA,EAAM;AAAA,gBACJ,YAAY,KAAA,CAAM,UAAA;AAAA,gBAClB,mBAAmB,KAAA,CAAM,iBAAA;AAAA,gBACzB,eAAe,KAAA,CAAM;AAAA;AACvB,aACD,CAAA;AAAA,UACH;AAAA,SACF;AAEA,QAAA,SAAA,CAAU,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,WAAA,EAAa;AAAA,UACpC,IAAA,EAAM,uBAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,cAAc,QAAA,CAAS,MAAA;AAAA,YACvB,MAAM,iBAAA,CAAkB,IAAA;AAAA,YACxB,aAAa,iBAAA,CAAkB;AAAA;AACjC,SACD,CAAA;AAGD,QAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,MAAA,EAAQ,UAAU,iBAAiB,CAAA;AAG9E,QAAA,SAAA,CAAU,SAAS,MAAA,CAAO,YAAA,GAAe,CAAA,EAAG,MAAA,CAAO,cAAc,aAAA,EAAe;AAAA,UAC9E,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAG,CAAA,MAAO;AAAA,YAC7B,EAAA,EAAI,WAAW,CAAC,CAAA,CAAA;AAAA,YAChB,IAAA,EAAM,CAAA,SAAA,EAAY,CAAA,CAAE,IAAI,CAAA,CAAA;AAAA,YACxB,MAAA,EAAQ,OAAO,YAAA,CAAa,IAAA;AAAA,cAC1B,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,KAAS,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,OAAO;AAAA,gBAE7D,WAAA,GACA;AAAA,WACN,CAAE;AAAA,SACH,CAAA;AAGD,QAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,OAAA,CAC9B,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CACrB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA;AAErB,QAAA,MAAM,eAAe,iBAAA,CAAkB,MAAA;AACvC,QAAA,MAAM,WAAA,GAAc,SAAS,MAAA,GAAS,YAAA;AAEtC,QAAA,SAAA,CAAU,SAAS,MAAA,CAAO,YAAA,GAAe,CAAA,EAAG,MAAA,CAAO,cAAc,SAAA,EAAW;AAAA,UAC1E,OAAA,EAAS,CAAA,2BAAA,EAA8B,YAAY,CAAA,CAAA,EAAI,SAAS,MAAM,CAAA,gCAAA,CAAA;AAAA,UACtE,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAGD,QAAA,IAAI,OAAA,IAAW,gBAAA,IAAoB,iBAAA,CAAkB,MAAA,GAAS,CAAA,EAAG;AAC/D,UAAA,IAAI;AACF,YAAA,MAAM,gBAAA,CAAiB,iBAAA,EAAmB,CAAA,EAAG,CAAC,CAAA;AAC9C,YAAA,SAAA,CAAU,SAAS,MAAA,CAAO,YAAA,GAAe,CAAA,EAAG,MAAA,CAAO,cAAc,gBAAA,EAAkB;AAAA,cACjF,KAAA,EAAO,MAAA;AAAA,cACP,OAAA,EAAS,CAAA,UAAA,EAAa,iBAAA,CAAkB,MAAM,CAAA,SAAA;AAAA,aAC/C,CAAA;AAAA,UACH,SAAS,YAAA,EAAc;AACrB,YAAA,OAAA,CAAQ,KAAA,CAAM,sDAAsD,YAAY,CAAA;AAChF,YAAA,SAAA,CAAU,SAAS,MAAA,CAAO,YAAA,GAAe,CAAA,EAAG,MAAA,CAAO,cAAc,gBAAA,EAAkB;AAAA,cACjF,KAAA,EAAO,MAAA;AAAA,cACP,OAAA,EAAS,iCAAA;AAAA,cACT,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,CAAO,YAAY,CAAA;AAAE,aACrC,CAAA;AAAA,UACH;AAAA,QACF;AAEA,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,iBAAiB,QAAA,CAAS,MAAA;AAAA,UACnC,SAAA,EAAW,YAAA;AAAA,UACX,MAAA,EAAQ,WAAA;AAAA,UACR,OAAO,QAAA,CAAS,MAAA;AAAA,UAChB,QAAA,EAAU,iBAAA;AAAA,UACV,UAAU,MAAA,CAAO,eAAA;AAAA,UACjB,WAAA,EAAa,OAAO,OAAA,CAAQ,WAAA;AAAA,UAC5B,SAAS,MAAA,CAAO;AAAA,SACjB,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,QAAA,OAAA,CAAQ,KAAA,CAAM,mDAAmD,YAAY,CAAA;AAE7E,QAAA,SAAA,CAAU,OAAA,EAAS,CAAA,EAAG,CAAA,EAAG,OAAA,EAAS;AAAA,UAChC,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,UAAU;AAAC,SACZ,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,yBAAA;AAAA,MACN,WAAA,EACE,mNAAA;AAAA,MACF,MAAA,EAAQ;AAAA;AACV,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AArRA,IA4DM,uBAAA;AA5DN,IAAA,2BAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qCAAA,GAAA;AAcA,IAAA,WAAA,EAAA;AAKA,IAAA,UAAA,EAAA;AAyCA,IAAM,uBAAA,GAA0BC,EAAE,MAAA,CAAO;AAAA;AAAA,MAEvC,QAAA,EAAUA,EAAE,KAAA,CAAMA,CAAAA,CAAE,KAAK,CAAA,CAAE,SAAS,mCAAmC,CAAA;AAAA,MACvE,OAAA,EAASA,EACN,MAAA,CAAO;AAAA,QACN,IAAA,EAAMA,CAAAA,CAAE,IAAA,CAAK,CAAC,aAAA,EAAe,qBAAA,EAAuB,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,UAAU,CAAA;AAAA,QAC9F,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC/B,cAAA,EAAgBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QACpC,uBAAuBA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,QAAQ,IAAI;AAAA,OAC3D,CAAA,CACA,QAAA,EAAS,CACT,SAAS,0BAA0B;AAAA,KACvC,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACxED,IAAA,yBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,yBAAA,EAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,yBAAA,EAAA,MAAA,yBAAA;AAAA,EAAA,6BAAA,EAAA,MAAA,6BAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,aAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAqFA,eAAsB,uBAAA,CACpB,SACA,OAAA,EAC4B;AAE5B,EAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,IAAA,MAAM,EAAE,yBAAA,EAAAC,0BAAAA,EAA0B,GAAI,MAAM,OAAO,cAAc,CAAA;AACjE,IAAA,sBAAA,GAAyBA,0BAAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,SAAS,sBAAA,CAAuB;AAAA,IACpC,KAAA,EAAO,SAAS,KAAA,IAAS,YAAA;AAAA;AAAA,IACzB,WAAA,EAAa;AAAA;AAAA,GACd,CAAA;AAED,EAAA,MAAM,SAAA,GAAY,SAAS,SAAA,IAAa,GAAA;AAExC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,MAC/B,OAAO,QAAA,CAAiB;AAAA,QACvB,WAAA,EAAa,OAAA;AAAA,QACb,YAAA,EAAc,wBAAA;AAAA,QACd,UAAA,EAAY,iBAAA;AAAA,QACZ,UAAA,EAAY,oBAAA;AAAA,QACZ,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,MACD,IAAI,OAAA;AAAA,QAAe,CAAC,CAAA,EAAG,MAAA,KACrB,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,oBAAoB,CAAC,CAAA,EAAG,SAAS;AAAA;AACrE,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,MACnB,UAAA,EAAY,OAAO,IAAA,CAAK,UAAA;AAAA,MACxB,OAAA,EAAS,OAAO,IAAA,CAAK,OAAA;AAAA,MACrB,SAAA,EAAW,OAAO,IAAA,CAAK,SAAA;AAAA;AAAA,MAEvB,SAAA,EAAW;AAAA,QACT,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAAA,QACtB,iBAAA,EAAmB,OAAO,IAAA,CAAK,iBAAA;AAAA,QAC/B,WAAW,MAAA,CAAO,SAAA;AAAA,QAClB,UAAA,EAAY,OAAO,KAAA,CAAM,WAAA;AAAA,QACzB,OAAO,MAAA,CAAO;AAAA;AAChB,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,uBAAA,EAA0B,KAAK,CAAA,4BAAA,CAA8B,CAAA;AAC1E,IAAA,OAAO,8BAA8B,OAAO,CAAA;AAAA,EAC9C;AACF;AAMO,SAAS,8BAA8B,OAAA,EAAoC;AAChF,EAAA,MAAM,YAAA,GAAe,QAAQ,WAAA,EAAY;AAGzC,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,aAAA;AAAA,IAAe,gBAAA;AAAA,IAAkB,cAAA;AAAA,IACjC,iBAAA;AAAA,IAAmB,gBAAA;AAAA,IAAkB,gBAAA;AAAA,IACrC,gBAAA;AAAA,IAAkB,eAAA;AAAA,IAAiB,oBAAA;AAAA,IACnC,eAAA;AAAA,IAAiB,gBAAA;AAAA,IAAkB,gBAAA;AAAA,IACnC,aAAA;AAAA,IAAe,gBAAA;AAAA,IAAkB;AAAA,GACnC;AAEA,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AACpC,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,KAAA,CAAM,OAAO,CAAA;AAC1C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,WAAA,IAAe,OAAA,CAAQ,MAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,KAAA;AAAA,IAAO,YAAA;AAAA,IAAc,YAAA;AAAA,IAAc,UAAA;AAAA,IAAY,SAAA;AAAA,IAC/C,WAAA;AAAA,IAAa,SAAA;AAAA,IAAW,cAAA;AAAA,IAAgB,UAAA;AAAA,IAAY;AAAA,GACtD;AAEA,EAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,EAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,MAAM,CAAA,EAAG;AACjC,MAAA,gBAAA,IAAoB,CAAA;AAAA,IACtB;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,UAAA;AAAA,IAAY,UAAA;AAAA,IAAY,MAAA;AAAA,IAAQ,OAAA;AAAA,IAAS,WAAA;AAAA,IACzC,WAAA;AAAA,IAAa,aAAA;AAAA,IAAe,KAAA;AAAA,IAAO,WAAA;AAAA,IAAa;AAAA,GAClD;AAEA,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,KAAA,MAAW,WAAW,eAAA,EAAiB;AACrC,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,OAAO,CAAA,EAAG;AAClC,MAAA,iBAAA,IAAqB,GAAA;AAAA,IACvB;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,WAAA,GAAc,GAAG,CAAC,CAAA;AAGrD,EAAA,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,gBAAA,GAAmB,GAAG,CAAA;AAC1C,EAAA,KAAA,IAAS,IAAA,CAAK,MAAM,iBAAiB,CAAA;AAGrC,EAAA,KAAA,GAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,EAAO,EAAE,CAAC,CAAA;AAGvC,EAAA,MAAM,mBAAmB,WAAA,GAAc,CAAA;AACvC,EAAA,MAAM,sBAAsB,gBAAA,GAAmB,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,gBAAA,GACd,mBAAA,GAAsB,GAAA,GAAM,GAAA,GAC7B,GAAA;AAEJ,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAS,cAAA,CAAe,MAAA,CAAO,OAAK,YAAA,CAAa,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IAC5D,WAAW,CAAA,WAAA,EAAc,WAAW,CAAA,WAAA,EAAc,gBAAgB,qBAAqB,iBAAiB,CAAA,SAAA,CAAA;AAAA,IACxG,SAAA,EAAW,EAAE,MAAA,EAAQ,WAAA;AAAY,GACnC;AACF;AAQA,eAAsB,oBAAA,CACpB,SACA,OAAA,EAC4B;AAE5B,EAAA,MAAM,YAAA,GAAe,SAAS,MAAA,KAAW,KAAA;AAEzC,EAAA,IAAI,YAAA,IAAgB,OAAA,CAAQ,GAAA,CAAI,cAAA,EAAgB;AAC9C,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,wBAAwB,OAAA,EAAS;AAAA,QAC5C,OAAO,OAAA,EAAS,KAAA;AAAA,QAChB,WAAW,OAAA,EAAS;AAAA,OACrB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAK,sIAC4D,CAAA;AAAA,IAC3E;AAAA,EACF;AAGA,EAAA,IAAI,YAAA,IAAgB,CAAC,OAAA,CAAQ,GAAA,CAAI,kBAAkB,OAAA,CAAQ,GAAA,CAAI,aAAa,MAAA,EAAQ;AAClF,IAAA,OAAA,CAAQ,KAAK,4JAC0E,CAAA;AAAA,EACzF;AAEA,EAAA,OAAO,8BAA8B,OAAO,CAAA;AAC9C;AAKO,SAAS,cAAc,OAAA,EAAyB;AACrD,EAAA,MAAM,UAAA,GAAa,8BAA8B,OAAO,CAAA;AACxD,EAAA,OAAO,UAAA,CAAW,KAAA;AACpB;AAKA,eAAsB,yBAAA,CACpB,UACA,OAAA,EAC8B;AAE9B,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC5B,SAAS,GAAA,CAAI,CAAA,GAAA,KAAO,oBAAA,CAAqB,GAAA,EAAK,OAAO,CAAC;AAAA,GACxD;AACA,EAAA,OAAO,OAAA;AACT;AA3QA,IAeI,wBAWE,iBAAA,EAuCA,wBAAA;AAjEN,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0CAAA,GAAA;AA0BA,IAAM,iBAAA,GAAoB;AAAA,MACxB,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,SAAA;AAAA,UACN,WAAA,EAAa,mFAAA;AAAA,UACb,OAAA,EAAS,CAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,QACA,UAAA,EAAY;AAAA,UACV,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa,0DAAA;AAAA,UACb,OAAA,EAAS,CAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,QACA,OAAA,EAAS;AAAA,UACP,IAAA,EAAM,OAAA;AAAA,UACN,WAAA,EAAa,kEAAA;AAAA,UACb,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS,SAC1B;AAAA,QACA,QAAA,EAAU;AAAA,UACR,IAAA,EAAM,OAAA;AAAA,UACN,WAAA,EAAa,yCAAA;AAAA,UACb,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS,SAC1B;AAAA,QACA,SAAA,EAAW;AAAA,UACT,IAAA,EAAM,QAAA;AAAA,UACN,WAAA,EAAa;AAAA,SACf;AAAA,QACA,iBAAA,EAAmB;AAAA,UACjB,IAAA,EAAM,OAAA;AAAA,UACN,WAAA,EAAa,mCAAA;AAAA,UACb,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA;AAAS;AAC1B,OACF;AAAA,MACA,UAAU,CAAC,OAAA,EAAS,cAAc,SAAA,EAAW,UAAA,EAAY,aAAa,mBAAmB,CAAA;AAAA,MACzF,oBAAA,EAAsB;AAAA,KACxB;AAEA,IAAM,wBAAA,GAA2B,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,qFAAA,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;AC9C1B,IAAM,2BAAA,GAA8B,EAAE,MAAA,CAAO;AAAA;AAAA,EAElD,QAAA,EAAU,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA,EAEnD,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA,EAEjD,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA,EAEjD,MAAA,EAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA,EAEjD,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA,EAEhD,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA;AAAA;AAAA,EAElD,eAAA,EAAiB,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE;AAC5D,CAAC;AAOM,IAAM,qBAAA,GAAwB,EAClC,MAAA,CAAO;AAAA;AAAA,EAEN,KAAA,EAAO,EAAE,KAAA,CAAM;AAAA,IACb,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,mBAAmB,CAAA;AAAA,IACrC,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,EAAG,gCAAgC;AAAA,GACnE,CAAA;AAAA;AAAA,EAGD,SAAS,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,qBAAqB,CAAA;AAAA;AAAA,EAGhD,UAAU,CAAA,CAAE,MAAA,EAAO,CAAE,IAAA,GAAO,QAAA,EAAS;AAAA;AAAA,EAGrC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAG/B,QAAA,EAAU,CAAA,CAAE,IAAA,CAAK,CAAC,WAAA,EAAa,QAAA,EAAU,UAAA,EAAY,MAAA,EAAQ,YAAY,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA;AAAA,EAGrF,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAG3B,WAAA,EAAa,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA;AAAA,EAGlC,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,EAG3B,YAAA,EAAc,4BAA4B,QAAA,EAAS;AAAA;AAAA,EAGnD,MAAA,EAAQ,EAAE,MAAA,CAAO;AAAA;AAAA,IAEf,OAAO,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,0BAA0B,CAAA;AAAA;AAAA,IAEnD,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA;AAAA,IAE3B,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GAC3B,EAAE,QAAA;AACL,CAAC,EACA,MAAA;AAOI,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA;AAAA,EAE1C,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK;AAAA;AAAA,EAG1B,WAAW,CAAA,CAAE,KAAA;AAAA,IACX,EAAE,MAAA,CAAO;AAAA,MACP,MAAM,CAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAAA,MAC1C,MAAM,CAAA,CAAE,MAAA,CAAO,EAAE,OAAA,EAAS,EAAE,QAAA;AAAS,KACtC;AAAA,GACH;AAAA;AAAA,EAGA,UAAA,EAAY,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAC1B,CAAC;AAeM,IAAM,qBAAA,GAAwB,EAAE,MAAA,CAAO;AAAA;AAAA,EAE5C,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,IAAA,EAAK;AAAA;AAAA,EAG1B,SAAS,CAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,qBAAqB;AAClD,CAAC;AAkZM,SAAS,cAAA,CACd,MACA,IAAA,EACgC;AAChC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA,EAAW,KAAK,GAAA;AAAI,GACtB;AACF;AAKO,SAAS,eAAe,KAAA,EAAyB;AACtD,EAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC;;AAAA,CAAA;AACvC;AAKO,SAAS,cAAc,IAAA,EAAwB;AACpD,EAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AACxB;AAKO,SAAS,gBAAgB,KAAA,EAAsC;AACpE,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA;AACxB;AAKO,SAAS,kBAAkB,KAAA,EAAwC;AACxE,EAAA,OAAO,MAAM,IAAA,KAAS,SAAA;AACxB;AAKO,SAAS,oBAAoB,KAAA,EAA0C;AAC5E,EAAA,OAAO,MAAM,IAAA,KAAS,WAAA;AACxB;AAKO,SAAS,mBAAmB,KAAA,EAAyC;AAC1E,EAAA,OAAO,MAAM,IAAA,KAAS,UAAA;AACxB;AAKO,SAAS,gBAAgB,KAAA,EAAsC;AACpE,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA;AACxB;AAKO,SAAS,mBAAmB,KAAA,EAAyC;AAC1E,EAAA,OAAO,MAAM,IAAA,KAAS,WAAA;AACxB;AAKO,SAAS,qBAAqB,KAAA,EAA2C;AAC9E,EAAA,OAAO,MAAM,IAAA,KAAS,aAAA;AACxB;AAKO,SAAS,qBAAqB,KAAA,EAA2C;AAC9E,EAAA,OAAO,MAAM,IAAA,KAAS,aAAA;AACxB;AAKO,SAAS,mBAAmB,KAAA,EAAyC;AAC1E,EAAA,OAAO,MAAM,IAAA,KAAS,gBAAA;AACxB;AAKO,SAAS,wBAAwB,KAAA,EAA8C;AACpF,EAAA,OAAO,MAAM,IAAA,KAAS,gBAAA;AACxB;AC5lBA,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,CAACL,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,EAAQI,EAAE,MAAA,CAAO;AAAA,QACf,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8BAA8B,CAAA;AAAA,QAC3D,SAASA,CAAAA,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,GAAkBE,IAAA,CAAA,IAAA,CAAK,OAAA,EAAS,aAAa,CAAA;AACnD,EAAA,IAAI,kBAAA,GAAqB,CAAA;AAEzB,EAAA,OAAOJ,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,MAASK,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,EAAQH,CAAAA,CAAE,MAAA,CAAO,EAAE;AAAA;AACrB,GACF;AACF;ACtJA,IAAM,yBAAA,GAA4BA,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,CAAA;AAKM,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAOF,IAAAA;AAAA,IACL,OAAO,KAAA,KAAU;AACf,MAAA,IAAI,CAAC,6BAA4B,EAAG;AAClC,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAEA,MAAA,IAAI;AACF,QAAA,IAAI,kBAAkB,KAAA,CAAM,WAAA;AAE5B,QAAA,IAAI,KAAA,CAAM,mBAAmB,MAAA,EAAQ;AACnC,UAAA,eAAA,IAAmB;;AAAA,oBAAA,EAA2B,KAAA,CAAM,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QAClF;AACA,QAAA,IAAI,KAAA,CAAM,iBAAiB,MAAA,EAAQ;AACjC,UAAA,eAAA,IAAmB;;AAAA,kBAAA,EAAyB,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QAC9E;AACA,QAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAQ;AAChC,UAAA,eAAA,IAAmB;;AAAA,iBAAA,EAAwB,KAAA,CAAM,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QAC5E;AACA,QAAA,IAAI,KAAA,CAAM,mBAAmB,MAAA,EAAQ;AACnC,UAAA,eAAA,IAAmB;;AAAA,4BAAA,EAAmC,KAAA,CAAM,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QAC1F;AAEA,QAAA,MAAM,SAAS,yBAAA,EAA0B;AAEzC,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,QAAA,CAAwB;AAAA,UAClD,WAAA,EAAa,eAAA;AAAA,UACb,UAAA,EAAY,cAAA;AAAA,UACZ,wBAAwB,KAAA,CAAM,sBAAA;AAAA,UAC9B,iBAAiB,KAAA,CAAM;AAAA,SACxB,CAAA;AAED,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,IAAA;AAAA,UACT,QAAQ,MAAA,CAAO,IAAA;AAAA,UACf,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,eAAe,MAAA,CAAO;AAAA,SACxB,EAAG,MAAM,CAAC,CAAA;AAAA,MACZ,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,YAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,8BAAA,CAAA;AAAA,MAQb,MAAA,EAAQ;AAAA;AACV,GACF;AACF;ACpEA,SAAS,aAAa,IAAA,EAA6B;AAC/C,EAAA,OAAO,CAAC,qBAAA,CAAsB,IAAI,CAAA,IAAK,CAAC,sBAAsB,IAAI,CAAA;AACtE;AAgFO,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;AAQO,SAAS,uBAAA,CACd,UACA,OAAA,EACe;AACf,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,QAAA,EAAU,OAAO,CAAA;AAChD,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,MAAA,EAAQ;AACrC,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAA,IAAS,4BAA4B,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,MAAA,CAAO,MAAA;AAChB;AAKO,SAAS,0BAA0B,QAAA,EAKxC;AAEA,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,MAAA,CAAO,mBAAmB,CAAA;AACvD,EAAA,OAAO;AAAA,IACL,UAAU,WAAA,CAAY,MAAA;AAAA,IACtB,KAAA,EAAO,WAAA,CAAY,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAAA,IAC7D,MAAA,EAAQ,WAAA,CAAY,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA;AAAA;AAAA;AAAA,IAG/D,eAAe,WAAA,CAAY,MAAA;AAAA,MACzB,CAAC,GAAA,EAAK,CAAA,KACJ,MACA,CAAA,CAAE,KAAA,CAAM,OAAO,YAAY,CAAA,CAAE,MAAA,CAAO,CAAC,MAAc,CAAA,KAAM,IAAA,IAAQ,EAAE,MAAA,EAAQ,MAAA,IAAU,IAAI,CAAC,CAAA;AAAA,MAC5F;AAAA;AACF,GACF;AACF;;;AC3NA,IAAA,uBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,uBAAA,EAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AASA,UAAA,CAAA,uBAAA,EAAA,oBAAA,CAAA;;;ACDO,IAAM,oBAAA,GAAuB;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;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACA7B,IAAM,YAAA,GAAe;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;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;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;;;ACArB,IAAM,YAAA,GAAe;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;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;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACArB,IAAM,qBAAA,GAAwB;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;;AAAA;AAAA;AAAA;AAAA,CAAA;;;ACWrC,IAAMM,UAAAA,GAAYC,UAAUC,IAAI,CAAA;AAOhC,IAAM,gBAAA,GAA2C;AAAA,EAC/C,QAAA,EAAU,aAAA;AAAA,EACV,QAAA,EAAU,aAAA;AAAA,EACV,aAAA,EAAe,SAAA;AAAA,EACf,OAAA,EAAS,WAAA;AAAA,EACT,UAAA,EAAY;AACd,CAAA;AAMA,SAAS,iBAAiB,MAAA,EAAyC;AACjE,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAkB,IAAA,CAAK,SAAA,CAAU,MAAM;AAGvC,EAAA,SAAS,WAAW,GAAA,EAAuB;AACzC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,MAAA,OAAO,GAAA,CAAI,IAAI,UAAU,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,GAAA,IAAO,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,GAA8B,CAAA,EAAG;AACzE,QAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,UAAA,MAAA,CAAO,gBAAA,CAAiB,GAAG,CAAC,CAAA,GAAI,WAAW,KAAK,CAAA;AAChD,UAAA,WAAA,EAAA;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,GAAG,CAAA,GAAI,UAAA,CAAW,KAAK,CAAA;AAAA,QAChC;AAAA,MACF;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,WAAW,MAAM,CAAA;AAC/B,EAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAK,CAAA;AAC3B,EAAA,OAAO,WAAA;AACT;AAMA,SAAS,wBAAwB,MAAA,EAA2C;AAC1E,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,WAAY,MAAA,CAAoC,QAAA;AACtD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,GAAG,OAAO,QAAA;AAErC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,MAAA,GAAS,OAAA;AACf,IAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAE5B,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,QAAA,GAAW,KAAA;AACjB,MAAA,MAAM,WAAA,GAAc,SAAS,YAAA,EAAc,WAAA;AAC3C,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAEjC,MAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,QAAA,MAAM,KAAA,GAAQ,UAAA;AACd,QAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAQ;AAE5B,QAAA,MAAM,UAAU,KAAA,CAAM,OAAA;AACtB,QAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAG7B,QAAA,MAAM,gBAAgB,OAAA,CAAQ,MAAA;AAAA,UAC5B,CAAC,CAAA,KAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,CAAC,CAAA,KAAM,WAAA,IAAe,CAAA,CAAE,CAAC,CAAA,KAAM;AAAA,SAC9D;AAEA,QAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,UAAA,QAAA,CAAS,IAAA;AAAA,YACP,CAAA,aAAA,EAAM,OAAO,IAAI,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA,UAAA,EAAa,cAAc,MAAM,CAAA,+EAAA;AAAA,WACrE;AAAA,QACF;AAEA,QAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,UAAA,MAAM,aAAA,GAAgB,cAAc,CAAC,CAAA;AACrC,UAAA,MAAM,OAAA,GAAU,cAAc,CAAC,CAAA;AAC/B,UAAA,IAAI,WAAW,OAAA,CAAQ,IAAA,KAAS,OAAA,IAAW,CAAC,QAAQ,QAAA,EAAU;AAC5D,YAAA,QAAA,CAAS,IAAA;AAAA,cACP,CAAA,aAAA,EAAM,OAAO,IAAI,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA,4BAAA,EAA+B,QAAQ,IAAI,CAAA,6EAAA;AAAA,aAC/E;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAKA,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,OAAON,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;AAC3C,MAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,MAAA,IAAI,sBAAgC,EAAC;AAErC,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,GAAkBS,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,GAAA,CAAA,CAAA,EAAe,+CAAsB,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,eAAA,GAAkB,iBAAiB,cAAoD,CAAA;AACvF,UAAA,mBAAA,GAAsB,wBAAwB,cAAoD,CAAA;AAAA,QACpG;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,aAAA,EAAe;AAAA,UACb,iBAAiB,eAAA,IAAmB,CAAA;AAAA,UACpC,mBAAA,EAAqB,uBAAuB;AAAC,SAC/C;AAAA,QACA,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,EAAQP,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;AChNA,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,GAAkBS,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,GAA8BT,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,EAAU,yBAAA;AAAA,MACV,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,QAAQ,QAAA,IAAY,WAAA;AAAA,UAC9B,KAAA,EAAO,QAAQ,KAAA,IAAS,0BAAA;AAAA,UACxB,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,GAAA,CAAA,CAAA,EAAe,+CAAsB,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,EAAiBW,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;;;AC7pBA,UAAA,EAAA;AAQA,WAAA,EAAA;AAyBA,WAAA,EAAA;AAyDA,eAAsB,mBAAA,CACpB,MAAA,EACA,OAAA,EACA,OAAA,GAAoC,EAAC,EACH;AAClC,EAAA,MAAM;AAAA,IACJ,SAAA,GAAY,IAAA;AAAA,IACZ,QAAA,GAAW,IAAA;AAAA,IACX;AAAA,GACF,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,IAC9E,UAAA,EAAYjB,cAAAA,CAAc,OAAA,CAAQ,MAAM,CAAA;AAAA,IACxC,UAAA,EAAY,QAAQ,MAAA,CAAO,MAAA;AAAA,IAC3B,eAAA,EAAiB,CAAC,CAAC;AAAA,GACpB,CAAC,CAAA;AAGF,EAAA,MAAM,YAAA,GAAe,YAAA,GACjB,qCAAA,CAAsC,YAAY,IAClD,oBAAA,EAAqB;AAGzB,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;AAEZ,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,MAClC,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,KACvB,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,kBAAA,CAAA,EAAsB;AAAA,MAChD,YAAA,EAAc,OAAO,KAAA,EAAO,YAAA;AAAA,MAC5B,gBAAA,EAAkB,OAAO,KAAA,EAAO;AAAA,KACjC,CAAC,CAAA;AAAA,EACJ,CAAA,MAAO;AAEL,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,EAErB,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC;;AAAA,sDAAA,CAAA;AAI9B,IAAA,MAAA,GAAS,MAAM,OAAO,gBAAA,CAAiB;AAAA,MACrC,cAAc,eAAA,CAAgB,MAAA;AAAA,MAC9B,UAAA;AAAA,MACA,SAAA;AAAA,MACA,oBAAA,EAAsB;AAAA,KACvB,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,kBAAA,CAAA,EAAsB;AAAA,MAChD,YAAA,EAAc,OAAO,KAAA,EAAO,YAAA;AAAA,MAC5B,gBAAA,EAAkB,OAAO,KAAA,EAAO;AAAA,KACjC,CAAC,CAAA;AAAA,EACJ;AAEA,EAAA,MAAM,mBAAmB,MAAA,CAAO,IAAA;AAGhC,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,QAAA,EAAU;AAGZ,IAAA,MAAM,gBAAA,GAAgF,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,EAAC,EAAG,QAAA,EAAU,EAAC,EAAE;AAC9H,IAAA,UAAA,GAAa;AAAA,MACX,OAAO,gBAAA,CAAiB,KAAA;AAAA,MACxB,UAAA,EAAY,iBAAiB,MAAA,CAAO,MAAA;AAAA,MACpC,YAAA,EAAA,CAAe,gBAAA,CAAiB,QAAA,IAAY,EAAC,EAAG;AAAA,KAClD;AAEA,IAA4B;AAC1B,MAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,CAAA,iBAAA,CAAmB,CAAC,CAAA;AAAA,IAClD;AAWA,EACF;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,IACL,OAAA,EAAS,gBAAA;AAAA,IACT,WAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA,EAAO,OAAO,KAAA,IAAS,MAAA;AAAA,IACvB,UAAA;AAAA,IACA;AAAA,GACF;AACF;AA8NA,SAAS,sCAAsC,YAAA,EAAsD;AACnG,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;AACzD,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EAChB,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,EAClF;AAEA,EAAA,IAAI,YAAA,CAAa,OAAA,IAAW,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3D,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EAChB,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,EAC/E;AAEA,EAAA,IAAI,YAAA,CAAa,MAAA,IAAU,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA,EAAG;AACzD,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EAChB,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,EACpF;AAEA,EAAA,IAAI,YAAA,CAAa,MAAA,IAAU,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA,EAAG;AACzD,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EAChB,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,EACpC;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,GAAG,UAAU;;AAAA;;AAAA,EAIpB,oBAAoB;;AAAA;;AAAA;;AAAA,EAMpB,QAAA,CAAS,IAAA,CAAK,MAAM,CAAC;AAAA,CAAA;AAEvB;AAWO,SAAS,qBAAqB,QAAA,EAKnC;AACA,EAAA,MAAM,EAAE,aAAA,EAAAkB,cAAAA,EAAc,IAAI,UAAA,EAAA,EAAA,YAAA,CAAA,aAAA,CAAA,CAAA;AAC1B,EAAA,MAAM,KAAA,GAAQA,eAAc,QAAQ,CAAA;AAGpC,EAAA,MAAM,YAAY,KAAA,CAAM,kBAAA;AACxB,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,MAAA,GAAS,CAAA,GACrC,IAAA,CAAK,MAAO,SAAA,GAAY,QAAA,CAAS,MAAA,GAAU,EAAE,CAAA,GAC7C,CAAA;AAEJ,EAAA,OAAO;AAAA,IACL,eAAe,KAAA,CAAM,aAAA;AAAA,IACrB,oBAAoB,KAAA,CAAM,kBAAA;AAAA,IAC1B,kBAAA,EAAoB,SAAA;AAAA,IACpB,uBAAA,EAAyB;AAAA,GAC3B;AACF;;;ACvgBA,SAASlB,eAAc,MAAA,EAA2B;AAChD,EAAA,IAAIH,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;AAmDA,IAAM,kBAAA,GAAqBW,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,EAAUW,yBAAAA;AAAA,MACV,UAAA,EAAYX,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,qBAAqBN,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,IAAIO,SAAAA,CAAU;AAAA,UAC3B,QAAA,EAAU,QAAQ,QAAA,IAAY,WAAA;AAAA,UAC9B,KAAA,EAAO,QAAQ,KAAA,IAAS;AAAA,SACzB,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,EAAQP,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;AAKO,SAAS,2BACd,UAAA,EACuB;AACvB,EAAA,OAAO,CAAC,WAAA,EAAa,YAAA,EAAc,aAAA,EAAe,KAAA,KAAU;AAC1D,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,IAAA,EAAM,gBAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA,EAAM;AAAA,QACJ,WAAA;AAAA,QACA,YAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA;AACF,KACF;AACA,IAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,EACrB,CAAA;AACF;;;ACtVA,2BAAA,EAAA;ACoBA,SAAS,wBAAA,GAAmC;AAC1C,EAAA,OAAO,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;;AAAA;;AAAA,iFAAA,CAAA;AA2CT;AAMA,IAAM,eAAA,GAAkBQ,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;AAED,IAAM,gBAAA,GAAmBA,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,CAAA;AAUM,SAAS,uBAAA,CACd,OAAA,GAAoC,EAAC,EACrC;AACA,EAAA,IAAI,gBAAgD,OAAA,CAAQ,YAAA;AAC5D,EAAA,IAAI,mBAAsD,OAAA,CAAQ,eAAA;AAElE,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAiC;AACzD,IAAA,aAAA,GAAgB,QAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,wBAAA,GAA2B,CAAC,QAAA,KAAoC;AACpE,IAAA,gBAAA,GAAmB,QAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,YAAY,CAChB,SAAA,EACA,UAAA,EACA,WAAA,EACA,MACA,IAAA,KACG;AACH,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,aAAA,CAAc,SAAA,EAAW,YAAY,WAAA,EAAa;AAAA,QAChD,IAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA,EAAW,KAAK,GAAA;AAAI,OACrB,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,SAAA,GAAYF,IAAAA;AAAA,IAChB,OAAO,EAAE,SAAA,EAAW,aAAa,CAAA,EAAG,WAAA,GAAc,GAAE,KAAM;AACxD,MAAA,MAAM,IAAA,GAAO,SAAA;AAEb,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,SAAA,EAAW;AAAA,UACvD,OAAA,EAAS,CAAA,sCAAA,EAAyC,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,UAC3D,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,aAAA,EAAe;AAAA,UAC3D,KAAA,EAAO;AAAA,YACL,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,4BAAA,EAA8B,QAAQ,aAAA,EAAc;AAAA,YAC3E,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,wBAAA,EAA0B,QAAQ,SAAA,EAAU;AAAA,YACpE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,gBAAA,EAAkB,QAAQ,SAAA;AAAU;AAC9D,SACD,CAAA;AAED,QAAA,MAAM,UAAA,GAAa,qBAAqB,IAAI,CAAA;AAE5C,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,SAAA,EAAW;AAAA,UACvD,OAAA,EAAS,CAAA,WAAA,EAAc,IAAA,CAAK,WAAW,CAAA,CAAA;AAAA,UACvC,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,aAAA,EAAe;AAAA,UAC3D,KAAA,EAAO;AAAA,YACL,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,4BAAA,EAA8B,QAAQ,WAAA,EAAY;AAAA,YACzE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,wBAAA,EAA0B,QAAQ,aAAA,EAAc;AAAA,YACxE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,gBAAA,EAAkB,QAAQ,SAAA;AAAU;AAC9D,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,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,WAAA,EAAa;AAAA,UACzD,IAAA,EAAM,oBAAA;AAAA,UACN,IAAA,EAAM;AAAA,YACJ,WAAW,IAAA,CAAK,IAAA;AAAA,YAChB,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,QAAQ,IAAA,CAAK;AAAA;AACf,SACD,CAAA;AAED,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,IAAA,CAAK;AAAA,UAC/B,cAAc,wBAAA,EAAyB;AAAA,UACvC,UAAA;AAAA,UACA,SAAA,EAAW,IAAA;AAAA,UACX,oBAAA,EAAsB;AAAA,SACvB,CAAA;AAED,QAAA,MAAM,cAAA,GAAiB,MAAA;AAEvB,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,aAAA,EAAe;AAAA,UAC3D,IAAA,EAAM,oBAAA;AAAA,UACN,MAAA,EAAQ;AAAA,YACN,WAAW,cAAA,CAAe,IAAA;AAAA,YAC1B,UAAA,EAAY,cAAA,CAAe,YAAA,EAAc,MAAA,EAAQ,MAAA,IAAU,CAAA;AAAA,YAC3D,eAAA,EAAiB,cAAA,CAAe,YAAA,EAAc,WAAA,EAAa,MAAA,IAAU;AAAA,WACvE;AAAA,UACA,OAAA,EAAS;AAAA,SACV,CAAA;AAED,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,aAAA,EAAe;AAAA,UAC3D,KAAA,EAAO;AAAA,YACL,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,4BAAA,EAA8B,QAAQ,WAAA,EAAY;AAAA,YACzE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,wBAAA,EAA0B,QAAQ,WAAA,EAAY;AAAA,YACtE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,gBAAA,EAAkB,QAAQ,aAAA;AAAc;AAClE,SACD,CAAA;AAED,QAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,cAAA,EAAgB,IAAI,CAAA;AAE9D,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,aAAA,EAAe;AAAA,UAC3D,IAAA,EAAM,gBAAA;AAAA,UACN,MAAA,EAAQ,UAAA;AAAA,UACR,SAAS,UAAA,CAAW;AAAA,SACrB,CAAA;AAED,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,aAAA,EAAe;AAAA,UAC3D,KAAA,EAAO;AAAA,YACL,EAAE,EAAA,EAAI,SAAA,EAAW,IAAA,EAAM,4BAAA,EAA8B,QAAQ,WAAA,EAAY;AAAA,YACzE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,wBAAA,EAA0B,QAAQ,WAAA,EAAY;AAAA,YACtE,EAAE,EAAA,EAAI,UAAA,EAAY,IAAA,EAAM,gBAAA,EAAkB,QAAQ,WAAA;AAAY;AAChE,SACD,CAAA;AAED,QAAA,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,UAAA,EAAY,WAAA,EAAa,SAAA,EAAW;AAAA,UACvD,OAAA,EAAS,oBAAoB,cAAA,CAAe,IAAI,SAAS,cAAA,CAAe,YAAA,EAAc,MAAA,EAAQ,MAAA,IAAU,CAAC,CAAA,OAAA,CAAA;AAAA,UACzG,IAAA,EAAM,WAAA;AAAA,UACN,UAAA,EAAY;AAAA,SACb,CAAA;AAED,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,IAAI;AACF,YAAA,MAAM,gBAAA,CAAiB,cAAA,EAAgB,IAAA,CAAK,IAAA,EAAM,YAAY,WAAW,CAAA;AAAA,UAC3E,SAAS,YAAA,EAAc;AACrB,YAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,kCAAA,EAAqC,IAAA,CAAK,IAAI,KAAK,YAAY,CAAA;AAAA,UAC/E;AAAA,QACF;AAEA,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,IAAA;AAAA,UACT,KAAA,EAAO,cAAA;AAAA,UACP;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,UAAA,EAAY,WAAA,EAAa,OAAA,EAAS;AAAA,UACrD,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,WAAW,IAAA,CAAK;AAAA,SACjB,CAAA;AAAA,MACH;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,uBAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA,cAAA,CAAA;AAAA,MAIb,MAAA,EAAQ;AAAA;AACV,GACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAMA,SAAS,qBAAqB,IAAA,EAAyB;AACrD,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,CAAA,mCAAA,EAAsC,KAAK,IAAI,CAAA,EAAA,CAAA;AAAA,IAC/C,EAAA;AAAA,IACA,CAAA,cAAA,CAAA;AAAA,IACA,IAAA,CAAK;AAAA,GACP;AAEA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,CAAA,WAAA,CAAA,EAAe,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC7C;AACA,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,CAAA,kBAAA,CAAA,EAAsB,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAChF;AACA,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,CAAA,mBAAA,CAAA,EAAuB,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACjF;AACA,EAAA,IAAI,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA,EAAG;AACzD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,EAAA;AAAA,MAAI,CAAA,qCAAA,CAAA;AAAA,MACJ,IAAA,CAAK,eAAe,GAAA,CAAI,CAAA,CAAA,KAAK,KAAK,CAAA,CAAE,IAAI,KAAK,CAAA,CAAE,IAAI,GAAG,CAAA,CAAE,WAAA,GAAc,KAAK,CAAA,CAAE,WAAW,MAAM,EAAE,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI;AAAA,KAC/G;AAAA,EACF;AACA,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,sBAAA,EAAwB,sCAAsC,CAAA;AAAA,EAC/E;AACA,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,mBAAA,EAAqB,iDAAiD,CAAA;AAAA,EACvF;AACA,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,oBAAA,EAAsB,wDAAwD,CAAA;AAAA,EAC/F;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAA,EAAI,WAAA,EAAa,qDAAqD,CAAA;AAEjF,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,sBAAA,CAAuB,OAAc,IAAA,EAI5C;AACA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM;AAC5B,IAAA,MAAA,CAAO,KAAK,CAAA,+BAAA,EAAkC,IAAA,CAAK,IAAI,CAAA,QAAA,EAAW,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,EACjF;AAEA,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AACzC,IAAA,IAAI,CAAC,MAAM,YAAA,EAAc;AACvB,MAAA,MAAA,CAAO,KAAK,6CAA6C,CAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,MAAM,aAAa,KAAA,CAAM,YAAA,CAAa,QAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,SAAS,CAAA;AACnE,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,QAAA,CAAS,KAAK,yBAAyB,CAAA;AAAA,MACzC;AACA,MAAA,MAAM,UAAA,GAAa,IAAI,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,MAAA,EAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,IAAK,EAAE,CAAA;AAC5E,MAAA,KAAA,MAAW,aAAA,IAAiB,KAAK,MAAA,EAAQ;AACvC,QAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,aAAa,CAAA,EAAG;AAClC,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,iBAAA,EAAoB,aAAa,CAAA,8BAAA,CAAgC,CAAA;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,eAAe,CAAC,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA,CAAA,EAAI;AACjE,IAAA,QAAA,CAAS,KAAK,kDAAkD,CAAA;AAAA,EAClE;AACA,EAAA,IAAI,IAAA,CAAK,iBAAiB,CAAC,KAAA,CAAM,WAAW,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,CAAA,EAAI;AACvE,IAAA,QAAA,CAAS,KAAK,oDAAoD,CAAA;AAAA,EACpE;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,QAAQ,QAAA,EAAS;AACxD;AAKO,SAAS,wBACd,UAAA,EACoB;AACpB,EAAA,OAAO,CAAC,SAAA,EAAW,UAAA,EAAY,WAAA,EAAa,KAAA,KAAU;AACpD,IAAA,UAAA,CAAW;AAAA,MACT,IAAA,EAAM,gBAAA;AAAA,MACN,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,IAAA,EAAM,EAAE,SAAA,EAAW,UAAA,EAAY,aAAa,KAAA;AAAM,KACnD,CAAA;AAAA,EACH,CAAA;AACF;ACxYA,IAAM,0BAAA,GAA6BC,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;AAED,IAAM,wBAAA,GAA2BA,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,CAAA;AAMD,eAAe,oBAAoB,OAAA,EAA6C;AAC9E,EAAA,MAAMG,GAAAA,GAAK,MAAM,OAAO,IAAI,CAAA;AAC5B,EAAA,MAAMS,KAAAA,GAAO,MAAM,OAAO,MAAM,CAAA;AAEhC,EAAA,MAAM,WAAA,GAAcA,KAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAElD,EAAA,IAAI,CAACT,GAAAA,CAAG,UAAA,CAAW,WAAW,CAAA,EAAG;AAC/B,IAAA,MAAMU,MAAAA,GAAQV,GAAAA,CAAG,WAAA,CAAY,OAAO,CAAA,CAAE,MAAA;AAAA,MAAO,CAAC,CAAA,KAC5C,CAAA,CAAE,QAAA,CAAS,OAAO,CAAA,KAAM,CAAA,CAAE,UAAA,CAAW,UAAU,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,SAAS,CAAA;AAAA,KAC1E;AAEA,IAAA,IAAIU,MAAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,MAAM,IAAI,MAAM,8FAA8F,CAAA;AAAA,IAChH;AAEA,IAAA,OAAOA,MAAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAc;AAC9B,MAAA,MAAM,OAAA,GAAUV,IAAG,YAAA,CAAaS,KAAAA,CAAK,KAAK,OAAA,EAAS,CAAC,GAAG,OAAO,CAAA;AAC9D,MAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IAC3B,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,KAAA,GAAQT,GAAAA,CAAG,WAAA,CAAY,WAAW,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAc,CAAA,CAAE,QAAA,CAAS,OAAO,CAAC,CAAA;AAEnF,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAc;AAC9B,IAAA,MAAM,OAAA,GAAUA,IAAG,YAAA,CAAaS,KAAAA,CAAK,KAAK,WAAA,EAAa,CAAC,GAAG,OAAO,CAAA;AAClE,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,CAAC,CAAA;AACH;AAMA,IAAM,+BAAA,GAAkC,CAAA;AACxC,IAAI,yBAAA,GAA4B,CAAA;AASzB,SAAS,yBAAyB,OAAA,EAAkB;AACzD,EAAA,yBAAA,GAA4B,CAAA;AAE5B,EAAA,OAAOd,IAAAA;AAAA,IACL,OAAO,KAAA,KAAU;AACf,MAAA,IAAI,QAAA;AAEJ,MAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAAG;AAC/C,QAAA,QAAA,GAAW,KAAA,CAAM,QAAA;AAAA,MACnB,WAAW,OAAA,EAAS;AAClB,QAAA,QAAA,GAAW,MAAM,oBAAoB,OAAO,CAAA;AAAA,MAC9C,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,MAAM,mBAAA,CAAoB,OAAA,CAAQ,GAAA,EAAK,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,KACnB,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,CAAA,EAAG,QAAA,CAAS,CAAC,CAAA,CAAE,IAAI,CAAA,YAAA,CAAA,GAAiB,aAAA,CAAA;AAE7D,MAAA,MAAM,MAAA,GAAS,gBAAgB,QAAA,EAAU;AAAA,QACvC,IAAA,EAAM,OAAA;AAAA,QACN,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,cAAc,KAAA,CAAM,YAAA;AAAA,QACpB,QAAA,EAAU,MAAM,QAAA,IAAY;AAAA,OAC7B,CAAA;AAED,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,yBAAA,GAA4B,CAAA;AAE5B,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,IAAA;AAAA,UACT,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,UAAA,EAAY,OAAO,UAAA,GAAa;AAAA,YAC9B,KAAA,EAAO,OAAO,UAAA,CAAW,KAAA;AAAA,YACzB,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,MAAA;AAAA,YACrC,YAAA,EAAc,MAAA,CAAO,UAAA,CAAW,QAAA,CAAS;AAAA,WAC3C,GAAI,MAAA;AAAA,UACJ,iBAAA,EAAmB,IAAA;AAAA,UACnB,eAAA,EAAiB,mBAAA;AAAA,UACjB,SAAS,CAAA,6CAAA,EAA2C,MAAA,CAAO,KAAA,EAAO,aAAA,IAAiB,SAAS,MAAM,CAAA,sCAAA;AAAA,SAEpG,EAAG,MAAM,CAAC,CAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,yBAAA,EAAA;AAEA,QAAA,IAAI,6BAA6B,+BAAA,EAAiC;AAChE,UAAA,OAAO,KAAK,SAAA,CAAU;AAAA,YACpB,OAAA,EAAS,KAAA;AAAA,YACT,gBAAA,EAAkB,IAAA;AAAA,YAClB,iBAAA,EAAmB,yBAAA;AAAA,YACnB,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,UAAA,EAAY,OAAO,UAAA,GAAa;AAAA,cAC9B,KAAA,EAAO,OAAO,UAAA,CAAW,KAAA;AAAA,cACzB,QAAQ,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,cAC3C,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO;AAAA,aACvC,GAAI,MAAA;AAAA,YACJ,eAAA,EAAiB,IAAA;AAAA,YACjB,OAAA,EAAS,wCAA8B,+BAA+B,CAAA,kCAAA,CAAA;AAAA,YACtE,cAAA,EAAgB;AAAA,WAClB,EAAG,MAAM,CAAC,CAAA;AAAA,QACZ;AAEA,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,iBAAA,EAAmB,yBAAA;AAAA,UACnB,mBAAmB,+BAAA,GAAkC,yBAAA;AAAA,UACrD,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,UAAA,EAAY,OAAO,UAAA,GAAa;AAAA,YAC9B,KAAA,EAAO,OAAO,UAAA,CAAW,KAAA;AAAA,YACzB,QAAQ,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,YAC3C,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO;AAAA,WACvC,GAAI,MAAA;AAAA,UACJ,eAAe,MAAA,CAAO;AAAA,SACxB,EAAG,MAAM,CAAC,CAAA;AAAA,MACZ;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,IAAA,EAAM,2BAAA;AAAA,MACN,WAAA,EAAa,CAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA,sDAAA,CAAA;AAAA,MASb,MAAA,EAAQ;AAAA;AACV,GACF;AACF;ACvKA,SAASN,eAAc,MAAA,EAAuC;AAC5D,EAAA,IAAI,CAAC,QAAQ,OAAO,SAAA;AACpB,EAAA,IAAIH,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,GAAkByB,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,OAAOhB,IAAAA;AAAA,IACL,OAAO,EAAE,IAAA,EAAK,KAAM;AAClB,MAAA,MAAM,WAAgBgB,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,EAAQxB,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,EAAQQ,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,WAAgBgB,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,EAAQd,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,GAAqBgB,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,EAAQd,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;;;AJvWO,SAAS,iBAAiB,OAAA,EAAiB;AAChD,EAAA,OAAO;AAAA;AAAA,IAEL,OAAA,EAAS,kBAAkB,OAAO,CAAA;AAAA,IAClC,cAAA,EAAgB,yBAAyB,OAAO,CAAA;AAAA;AAAA,IAGhD,gBAAgB,wBAAA,EAAyB;AAAA;AAAA,IAGzC,UAAA,EAAY,qBAAqB,OAAO,CAAA;AAAA,IACxC,cAAA,EAAgB,yBAAyB,OAAO,CAAA;AAAA;AAAA,IAGhD,iBAAiB,yBAAA,EAA0B;AAAA,IAC3C,eAAe,uBAAA,EAAwB;AAAA;AAAA,IAGvC,kBAAA,EAAoB,wBAAA,CAAyB,EAAE,OAAA,EAAS,CAAA;AAAA;AAAA,IAGxD,cAAA,EAAgB,0BAA0B,OAAO;AAAA,GAEnD;AACF;AK1GA,SAAS,kBAAA,GAA6B;AACpC,EAAA,OAAO,CAAA;;AAAA,EAEPiB,wBAAwB;;AAAA,EAExB,yBAAyB,CAAA,CAAA;AAC3B;AAUO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,MAAM,mBAAmB,kBAAA,EAAmB;AAE5C,EAAA,OAAO,CAAA;;AAAA,EAEP,gBAAgB;;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;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,CAAA;AAiFlB;AAKO,SAAS,yBAAA,GAAoC;AAClD,EAAA,MAAM,mBAAmB,kBAAA,EAAmB;AAE5C,EAAA,OAAO,CAAA;;AAAA,EAEP,gBAAgB;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,CAAA;AAqBlB;AClIA,SAASC,mBAAAA,GAA6B;AACpC,EAAA,OAAO,CAAA;;AAAA,EAEPD,wBAAwB;;AAAA,EAExBE,yBAAyB,CAAA,CAAA;AAC3B;AAQO,SAAS,6BAAA,GAA0C;AACxD,EAAA,MAAM,mBAAmBD,mBAAAA,EAAmB;AAE5C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,kBAAA;AAAA,IACN,WAAA,EAAa,6GAAA;AAAA,IACb,YAAA,EAAc,CAAA;;AAAA,EAEhB,gBAAgB;;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;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,GAsDhB;AACF;AAOO,SAAS,wBAAA,GAAqC;AACnD,EAAA,MAAM,mBAAmBA,mBAAAA,EAAmB;AAE5C,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,0FAAA;AAAA,IACb,YAAA,EAAc,CAAA;;AAAA,EAEhB,gBAAgB;;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,GAkChB;AACF;AAOO,SAAS,0BAAA,GAAuC;AACrD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,eAAA;AAAA,IACN,WAAA,EAAa,wEAAA;AAAA,IACb,YAAA,EAAc,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAyBhB;AACF;AAKO,SAAS,eAAA,GAA8B;AAC5C,EAAA,OAAO;AAAA,IACL,6BAAA,EAA8B;AAAA,IAC9B,wBAAA,EAAyB;AAAA,IACzB,0BAAA;AAA2B,GAC7B;AACF;AAKO,SAAS,qBAAA,GAAkD;AAChE,EAAA,OAAO;AAAA,IACL,oBAAoB,6BAAA,EAA8B;AAAA,IAClD,eAAe,wBAAA,EAAyB;AAAA,IACxC,iBAAiB,0BAAA;AAA2B,GAC9C;AACF;;;AClIO,SAAS,oBAAoB,IAAA,EAA8B;AAChE,EAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AACxB;AAKO,SAAS,aAAa,KAAA,EAAqD;AAChF,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA;AACxB;AAKO,SAAS,iBAAiB,KAAA,EAAyD;AACxF,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA;AACxB;AAKO,SAAS,cAAc,KAAA,EAAsD;AAClF,EAAA,OAAO,MAAM,IAAA,KAAS,QAAA;AACxB;AAKO,SAAS,gBAAgB,KAAA,EAAwD;AACtF,EAAA,OAAO,MAAM,IAAA,KAAS,UAAA;AACxB;AAKO,SAAS,aAAa,KAAA,EAAqD;AAChF,EAAA,OAAO,MAAM,IAAA,KAAS,OAAA;AACxB;ACrEO,IAAM,yBAAA,GAA+D;AAAA,EAC1E,SAAA,EAAW,IAAA;AAAA,EACX,kBAAA,EAAoB,EAAA;AAAA,EACpB,aAAA,EAAe,KAAA;AAAA,EACf,QAAA,EAAU;AACZ;AA+BO,SAAS,eAAA,CACd,QAAA,EACA,SAAA,GAAoB,yBAAA,CAA0B,SAAA,EACrC;AACT,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ;AAC/C,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GACnC,IAAI,OAAA,GACJ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC9B,IAAA,OAAO,MAAM,OAAA,CAAQ,MAAA;AAAA,EACvB,GAAG,CAAC,CAAA;AAEJ,EAAA,MAAM,kBAAkB,UAAA,GAAa,CAAA;AACrC,EAAA,OAAO,kBAAkB,SAAA,GAAY,GAAA;AACvC;AAKO,SAAS,oBAAoB,QAAA,EAAiC;AACnE,EAAA,MAAM,YAAA,GAAe,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ;AACzC,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,EAAS;AAC1B,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GACnC,IAAI,OAAA,GACJ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC9B,IAAA,OAAO,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,EAAM,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA,EAAG,OAAA,CAAQ,MAAA,GAAS,GAAA,GAAM,QAAQ,EAAE,CAAA,CAAA;AAAA,EACpF,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAEd,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,EAMP,YAAY;;AAAA,QAAA,CAAA;AAGd;AAKO,SAAS,eAAe,QAAA,EAAiC;AAC9D,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ;AAC/C,IAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GACnC,IAAI,OAAA,GACJ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC9B,IAAA,OAAO,MAAM,OAAA,CAAQ,MAAA;AAAA,EACvB,GAAG,CAAC,CAAA;AAEJ,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,UAAA,GAAa,CAAC,CAAA;AACjC;AC/EO,IAAM,mBAAN,MAAuB;AAAA,EAAvB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,UAA+B,EAAC;AAAA,EAAA;AAAA,EAExC,OAAO,OAAA,EAAkC;AACvC,IAAA,IAAA,CAAK,QAAQ,IAAA,CAAK;AAAA,MAChB,GAAG,OAAA;AAAA,MACH,SAAA,EAAW,KAAK,GAAA;AAAI,KACrB,CAAA;AAAA,EACH;AAAA,EAEA,MAAA,GAA8B;AAC5B,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,OAAO,CAAA;AAAA,EACzB;AAAA,EAEA,UAAA,GAA6B;AAC3B,IAAA,MAAM,KAAA,GAAQ,KAAK,OAAA,CAAQ,MAAA;AAC3B,IAAA,MAAM,SAAS,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AACnD,IAAA,MAAM,SAAS,KAAA,GAAQ,MAAA;AAEvB,IAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,CAAA,GAAK,MAAA,GAAS,QAAS,GAAA,GAAM,CAAA;AAEzD,IAAA,MAAM,aAAA,GAAgB,KAAA,GAAQ,CAAA,GAC1B,IAAA,CAAK,QAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,CAAC,IAAI,KAAA,GACzD,CAAA;AAEJ,IAAA,MAAM,SAAA,GAAY,KAAA,GAAQ,CAAA,GACtB,IAAA,CAAK,QAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,IAAI,KAAA,GACrD,CAAA;AAEJ,IAAA,MAAM,oBAAoB,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,UAAU,CAAA;AAC/D,IAAA,MAAM,YAAY,iBAAA,CAAkB,MAAA,GAAS,CAAA,GACzC,iBAAA,CAAkB,OAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAO,EAAE,UAAA,EAAY,KAAA,IAAS,IAAI,CAAC,CAAA,GAAI,kBAAkB,MAAA,GAC9F,CAAA;AAEJ,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,MAAA,EAAQ,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA;AAAA,MAC1C,MAAA,EAAQ,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA;AAAA,MAC1C,OAAA,EAAS,IAAA,CAAK,oBAAA,CAAqB,SAAS;AAAA,KAC9C;AAEA,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,UAAA,EAA6C;AACxE,IAAA,MAAM,WAAW,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,UAAU,CAAA;AACrE,IAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AACvB,IAAA,MAAM,SAAS,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CAAE,MAAA;AAC/C,IAAA,MAAM,WAAA,GAAc,KAAA,GAAQ,CAAA,GAAK,MAAA,GAAS,QAAS,GAAA,GAAM,CAAA;AACzD,IAAA,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,WAAA,EAAY;AAAA,EACtC;AAAA,EAEA,WAAA,GAAmC;AACjC,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,EAAE,OAAO,CAAA;AAAA,EAC5C;AAAA,EAEA,sBAAA,GAA8C;AAC5C,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,aAAa,CAAC,CAAA;AAAA,EAClD;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EAClB;AAAA,EAEA,MAAM,WAAW,QAAA,EAAiC;AAChD,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,OAAA,EAAS,KAAK,UAAA,EAAW;AAAA,MACzB,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAA,EAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACtC;AACA,IAAA,MAASE,UAAWC,IAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC1D,IAAA,MAASD,cAAU,QAAA,EAAU,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,aAAa,QAAA,EAAiC;AAClD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAASA,GAAA,CAAA,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACnD,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC/B,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,OAAA,IAAW,EAAC;AAAA,IAClC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF;AAKO,SAAS,cAAc,OAAA,EAAiC;AAC7D,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,QAAA,CAAI,OAAO,EAAE,CAAA;AAAA,IACb,gCAAA;AAAA,IACA,QAAA,CAAI,OAAO,EAAE,CAAA;AAAA,IACb,EAAA;AAAA,IACA,CAAA,mBAAA,EAAsB,QAAQ,KAAK,CAAA,CAAA;AAAA,IACnC,CAAA,mBAAA,EAAsB,QAAQ,MAAM,CAAA,EAAA,EAAK,QAAQ,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IACvE,CAAA,mBAAA,EAAsB,QAAQ,MAAM,CAAA,CAAA;AAAA,IACpC,EAAA;AAAA,IACA,CAAA,mBAAA,EAAsB,OAAA,CAAQ,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,IACtD,uBAAuB,OAAA,CAAQ,SAAA,GAAY,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IAC3D,sBAAsB,IAAA,CAAK,KAAA,CAAM,QAAQ,SAAS,CAAA,CAAE,gBAAgB,CAAA,CAAA;AAAA,IACpE,EAAA;AAAA,IACA,kBAAA;AAAA,IACA,gBAAgB,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,MAAM,IAAI,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,KAAK,KAAK,OAAA,CAAQ,YAAA,CAAa,OAAO,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IAC9I,gBAAgB,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,MAAM,IAAI,OAAA,CAAQ,YAAA,CAAa,MAAA,CAAO,KAAK,KAAK,OAAA,CAAQ,YAAA,CAAa,OAAO,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IAC9I,gBAAgB,OAAA,CAAQ,YAAA,CAAa,OAAA,CAAQ,MAAM,IAAI,OAAA,CAAQ,YAAA,CAAa,OAAA,CAAQ,KAAK,KAAK,OAAA,CAAQ,YAAA,CAAa,QAAQ,WAAA,CAAY,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IACjJ,EAAA;AAAA,IACA,QAAA,CAAI,OAAO,EAAE;AAAA,GACf;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,gBAAgB,QAAA,EAAyC;AACvE,EAAA,MAAM,cAAwB,EAAC;AAE/B,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,IAAI,QAAA,GAAW,SAAA;AACf,MAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,YAAY,GAAG,QAAA,GAAW,YAAA;AAAA,WAAA,IAC5C,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,aAAa,GAAG,QAAA,GAAW,aAAA;AAAA,WAAA,IAClD,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,MAAM,GAAG,QAAA,GAAW,MAAA;AAAA,WAAA,IAC3C,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,QAAQ,GAAG,QAAA,GAAW,QAAA;AAAA,WAAA,IAC7C,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,SAAS,GAAG,QAAA,GAAW,SAAA;AAEvD,MAAA,aAAA,CAAc,IAAI,QAAA,EAAA,CAAW,aAAA,CAAc,IAAI,QAAQ,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACpE;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,CAAA,IAAK,aAAA,EAAe;AAC7C,IAAA,IAAI,QAAA,KAAa,YAAA,IAAgB,KAAA,GAAQ,CAAA,EAAG;AAC1C,MAAA,WAAA,CAAY,KAAK,sEAAsE,CAAA;AAAA,IACzF;AACA,IAAA,IAAI,QAAA,KAAa,aAAA,IAAiB,KAAA,GAAQ,CAAA,EAAG;AAC3C,MAAA,WAAA,CAAY,KAAK,8DAA8D,CAAA;AAAA,IACjF;AACA,IAAA,IAAI,QAAA,KAAa,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG;AACpC,MAAA,WAAA,CAAY,KAAK,+DAA+D,CAAA;AAAA,IAClF;AACA,IAAA,IAAI,QAAA,KAAa,SAAA,IAAa,KAAA,GAAQ,CAAA,EAAG;AACvC,MAAA,WAAA,CAAY,KAAK,4DAA4D,CAAA;AAAA,IAC/E;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,QAAA,CAAS,MAAA,CAAO,OAAK,CAAA,CAAE,UAAA,KAAe,SAAS,CAAA,CAAE,MAAA;AACzE,EAAA,IAAI,eAAA,GAAkB,QAAA,CAAS,MAAA,GAAS,GAAA,EAAK;AAC3C,IAAA,WAAA,CAAY,KAAK,mFAAmF,CAAA;AAAA,EACtG;AAEA,EAAA,OAAO,WAAA;AACT;;;ACpMO,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;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;;;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;;;AC9HO,IAAM,iBAAN,MAAqB;AAAA,EAS1B,WAAA,CAAY,OAAA,GAAiC,EAAC,EAAG;AALjD,IAAA,IAAA,CAAQ,qBAAA,GAAsD,IAAA;AAC9D,IAAA,IAAA,CAAQ,qBAAA,GAAsD,IAAA;AAC9D,IAAA,IAAA,CAAQ,aAAA,GAAsC,IAAA;AAC9C,IAAA,IAAA,CAAQ,gBAAA,GAAmD,IAAA;AAGzD,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;AACnC,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAQ,aAAA,IAAiB,IAAA;AAC9C,IAAA,IAAA,CAAK,gBAAA,GAAmB,QAAQ,gBAAA,IAAoB,IAAA;AAEpD,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,mBAAA,CACJ,QAAA,EACA,MAAA,EACA,WAAA,EASe;AACf,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAA,CAAQ,KAAK,sEAAsE,CAAA;AACnF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,QAAQ,CAAA,yBAAA,CAA2B,CAAA;AAC5E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,gBAAA,CAAiB,MAAA,EAAQ;AAAA,QAChD,QAAA;AAAA,QACA,QAAQ,WAAA,CAAY,gBAAA;AAAA,QACpB,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,iBAAiB,WAAA,CAAY,gBAAA,GAAmB,EAAE,IAAA,EAAM,WAAA,CAAY,kBAAiB,GAAI,KAAA,CAAA;AAAA,QACzF,QAAA,EAAU,WAAA,CAAY,YAAA,IAAgB,EAAC;AAAA,QACvC,QAAA,EAAU,WAAA,CAAY,QAAA,IAAY,EAAC;AAAA,QACnC,SAAS,WAAA,CAAY,OAAA;AAAA,QACrB,WAAA,sBAAiB,IAAA;AAAK,OACvB,CAAA;AAGD,MAAA,IAAI,WAAA,CAAY,YAAA,IAAgB,WAAA,CAAY,YAAA,CAAa,SAAS,CAAA,EAAG;AACnE,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,qBAAA,CAAsB,MAAA,EAAQ;AAAA,UACrD,mBAAmB,WAAA,CAAY,YAAA;AAAA,UAC/B,gBAAgB,WAAA,CAAY;AAAA,SAC7B,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,WAAA,CAAY,QAAA,IAAY,WAAA,CAAY,QAAA,CAAS,SAAS,CAAA,EAAG;AAC3D,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,oBAAA,CAAqB,WAAA,CAAY,KAAA,EAAO;AAAA,UAC/D,MAAA;AAAA,UACA,kBAAkB,WAAA,CAAY;AAAA,SAC/B,CAAA;AAAA,MACH;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yBAAA,EAA4B,QAAQ,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAE,CAAA;AAAA,IACxF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,sDAAsD,KAAK,CAAA;AAAA,IAC3E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeA,MAAM,uBAAA,CACJ,SAAA,EACA,MAAA,EACA,aAAA,EAOe;AACf,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAA,CAAQ,KAAK,wEAAwE,CAAA;AACrF,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,uBAAA,CAAwB,SAAA,EAAW,QAAQ,aAAa,CAAA;AACjF,MAAA,OAAA,CAAQ,GAAA,CAAI,gDAAgD,MAAM,CAAA,EAAA,EAAK,cAAc,QAAQ,CAAA,CAAA,EAAI,aAAA,CAAc,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC3H,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,gDAAgD,KAAK,CAAA;AAAA,IACrE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,SAAA,EAA4E;AACrG,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,oBAAA,CAAqB,SAAS,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CAAsB,MAAA,EAAgB,QAAA,EAAoC;AAC9E,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,qBAAA,CAAsB,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,gBAAA,CACJ,MAAA,EACA,cAAA,EAMe;AACf,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAA,CAAQ,KAAK,2EAA2E,CAAA;AACxF,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,gBAAA,CAAiB,MAAA,EAAQ,cAAc,CAAA;AAChE,MAAA,OAAA,CAAQ,IAAI,CAAA,4BAAA,EAA+B,cAAA,CAAe,YAAY,CAAA,mBAAA,EAAsB,MAAM,CAAA,CAAE,CAAA;AAAA,IACtG,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,KAAK,CAAA;AAAA,IACtE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,cAAA,CACJ,MAAA,EACA,YAAA,EACA,MAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAA,CAAQ,KAAK,yEAAyE,CAAA;AACtF,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,cAAA,CAAe,MAAA,EAAQ,cAAc,MAAM,CAAA;AACpE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,6BAAA,EAAgC,YAAY,CAAA,mBAAA,EAAsB,MAAM,CAAA,CAAE,CAAA;AAAA,IACxF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,+CAA+C,KAAK,CAAA;AAAA,IACpE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,wBAAA,CAAyB,MAAA,EAAgB,YAAA,EAAqC;AAClF,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAA,CAAQ,KAAK,sEAAsE,CAAA;AACnF,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,wBAAA,CAAyB,MAAA,EAAQ,YAAY,CAAA;AACtE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,YAAY,CAAA,+BAAA,EAAkC,MAAM,CAAA,CAAE,CAAA;AAAA,IACnG,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6DAA6D,KAAK,CAAA;AAAA,IAClF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,qBAAqB,QAAA,EAA4E;AACrG,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,oBAAA,CAAqB,QAAQ,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,qBAAA,CACJ,MAAA,EACA,gBAAA,GAA2B,CAAA,EAC+B;AAC1D,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,qBAAA,CAAsB,MAAA,EAAQ,gBAAgB,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,mBAAA,GAAsD;AACpD,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,sBAAsB,QAAA,EAAoD;AACxE,IAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,CAAC,KAAK,GAAA,KAAQ;AAC/C,MAAA,MAAM,OAAA,GAAU,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,GACnC,IAAI,OAAA,GACJ,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AAC9B,MAAA,OAAO,MAAM,OAAA,CAAQ,MAAA;AAAA,IACvB,GAAG,CAAC,CAAA;AAEJ,IAAA,MAAM,kBAAkB,UAAA,GAAa,CAAA;AACrC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,SAAA,IAAa,IAAA;AACrD,IAAA,OAAO,kBAAkB,SAAA,GAAY,GAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,gBAAA,CACJ,QAAA,EACA,oBAAA,EACA,uBACA,MAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAA,CAAQ,KAAK,2EAA2E,CAAA;AACxF,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAClC,MAAA,IAAI,QAAA,EAAU;AAEZ,QAAA,MAAM,cAAA,GAAiB;AAAA,UACrB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,oBAAA;AAAA,UACA,qBAAA;AAAA,UACA,QAAQ,MAAA,IAAU;AAAA,SACpB;AAEA,QAAA,MAAM,IAAA,GAAO,QAAA;AACb,QAAA,MAAM,mBAAA,GAAuB,IAAA,CAAK,WAAA,IAAyC,EAAC;AAC5E,QAAA,IAAA,CAAK,WAAA,GAAc,CAAC,GAAG,mBAAA,EAAqB,cAAc,CAAA;AAC1D,QAAA,IAAA,CAAK,KAAA,CAAM,UAAU,QAAQ,CAAA;AAAA,MAC/B;AACA,MAAA,OAAA,CAAQ,IAAI,CAAA,yCAAA,EAA4C,QAAQ,KAAK,oBAAoB,CAAA,QAAA,EAAM,qBAAqB,CAAA,SAAA,CAAW,CAAA;AAAA,IACjI,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,iDAAiD,KAAK,CAAA;AAAA,IACtE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAAqB,QAAA,EAKlB;AACD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AAClC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,EAAC;AAAA,IACV;AACA,IAAA,MAAM,IAAA,GAAO,QAAA;AACb,IAAA,OAAQ,IAAA,CAAK,eAKN,EAAC;AAAA,EACV;AACF;;;ACjfA,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;;;ACqIA,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,MAAA;AACH,MAAA,IAAI,OAAA;AACF,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yBAAA,EAA4B,KAAA,IAAS,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA;AACrE,MAAA,OAAO,gBAAA,CAAiB;AAAA,QACtB,KAAA,EAAO,SAAS,WAAA,CAAY,IAAA;AAAA,QAC5B,WAAA,EAAa;AAAA;AAAA,OACd,CAAA;AAAA,IAEH,KAAK,YAAA;AACH,MAAA,IAAI,OAAA;AACF,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,KAAA,IAAS,iBAAA,CAAkB,YAAY,CAAA,CAAE,CAAA;AACzF,MAAA,OAAO,sBAAA,CAAuB;AAAA,QAC5B,KAAA,EAAO,SAAS,iBAAA,CAAkB,YAAA;AAAA,QAClC,WAAA,EAAa;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,gBAAA,GAAmB,WAAA;AAAA,IACnB,aAAA,GAAgB,0BAAA;AAAA,IAChB,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;AAGA,EAAA,IAAI,eAAA,GAAyC,IAAA;AAC7C,EAAA,IAAI,cAAA,GAAwC,IAAA;AAE5C,EAAA,IAAI,OAAA,CAAQ,aAAA,IAAiB,OAAA,CAAQ,MAAA,EAAQ;AAC3C,IAAA,IAAI;AACF,MAAA,eAAA,GAAkB,MAAM,OAAA,CAAQ,aAAA,CAAc,kBAAA,CAAmB,QAAQ,MAAM,CAAA;AAE/E,MAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,QAAA,OAAA,CAAQ,GAAA,CAAI,yCAAyC,eAAA,CAAgB,gBAAgB,YAAY,eAAA,CAAgB,iBAAA,CAAkB,MAAM,CAAA,SAAA,CAAW,CAAA;AAAA,MACtJ;AAEA,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,cAAA,GAAiB,MAAM,OAAA,CAAQ,aAAA,CAAc,iBAAA,CAAkB,QAAQ,KAAK,CAAA;AAE5E,QAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qCAAA,EAAwC,cAAA,CAAe,gBAAA,CAAiB,MAAM,CAAA,SAAA,CAAW,CAAA;AAAA,QACvG;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,uCAAuC,KAAK,CAAA;AAAA,IAC3D;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,eAAA,EAAiB,cAAc,CAAA;AAExE,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,kBAAA;AAAA,IACA,6BAAA,GAAgC,iBAAA;AAAA,IAChC,UAAA,GAAa,qCAAqC,UAAA,GAAa,EAAA;AAAA,IAC/D,aAAA,GAAgB,0BAA0B,aAAA,GAAgB;AAAA,GAC5D,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,IAAI,CAAA;AAGZ,EAAA,MAAM,QAAA,GAAW,oBAAoBE,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,oBAAA,GAAuB,CAAC,sBAAsB,CAAA;AACpD,EAAA,MAAM,WAAA,GAAc,CAAC,qBAAA,EAAuB,mBAAmB,CAAA;AAC/D,EAAA,MAAM,cAAA,GAAiB,aAAa,IAAA,KAAS,gBAAA;AAC7C,EAAA,MAAM,mBAAA,GAAsB,oBAAA,CAAqB,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA;AAC3E,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA;AAC1D,EAAA,MAAM,kBAAA,GAAqB,cAAA,CAAe,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA;AAEpE,EAAA,IAAI,WAAA;AACJ,EAAA,IAAI,uBAAA;AACJ,EAAA,IAAI,0BAAA;AAEJ,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,qBAAA;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,YAAA;AAAA,MACtB,QAAA,EAAU,gBAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACR,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,mBAAA,EAAqB;AACvB,IAAA,MAAM,EAAE,8BAAA,EAAAC,+BAAAA,EAA+B,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,2BAAA,EAAA,EAAA,8BAAA,CAAA,CAAA;AACjD,IAAA,MAAM,cAAcA,+BAAAA,CAA+B;AAAA,MACjD,cAAc,OAAA,CAAQ,YAAA;AAAA,MACtB,QAAA,EAAU,gBAAA;AAAA,MACV,KAAA,EAAO,aAAA;AAAA,MACP;AAAA,KACD,CAAA;AACD,IAAA,gBAAA,GAAmB,WAAA,CAAY,IAAA;AAC/B,IAAA,qBAAA,GAAwB,WAAA,CAAY,gBAAA;AAEpC,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,qBAAA,CAAsB,QAAQ,eAAe,CAAA;AAAA,IAC/C;AAEA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAI,CAAA,uEAAA,CAAyE,CAAA;AAAA,IACvF;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,kBAAA,GAAqB,wBAAA,CAAyB;AAAA,MAC5C,OAAA;AAAA,MACA,QAAA,EAAU,gBAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,IAAI,CAAA,8CAAA,EAAiD,YAAA,CAAa,IAAI,CAAA,kBAAA,EAAqB,gBAAgB,CAAA,CAAA,CAAG,CAAA;AAAA,IACxH;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,IAAkB,mBAAA,GAAsB,EAAC,GAAI,CAAC,kBAAkB,CAAA;AAAA,IACpE,GAAI,WAAA,GAAc,CAAC,WAAW,IAAI,EAAC;AAAA,IACnC,GAAI,gBAAA,GAAmB,CAAC,gBAAgB,IAAI,EAAC;AAAA,IAC7C,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,yBAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAe,OAAA,CAAQ;AAAA,GACzB;AACF;AASA,SAAS,kBAAA,CACP,iBACA,cAAA,EACe;AACf,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,IAAI,gBAAgB,gBAAA,EAAkB;AACpC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,eAAA,CAAgB,gBAAgB,CAAA,CAAE,CAAA;AAAA,IACtE;AACA,IAAA,IAAI,gBAAgB,eAAA,EAAiB;AACnC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,eAAA,CAAgB,eAAe,CAAA,CAAE,CAAA;AAAA,IACrE;AACA,IAAA,IAAI,eAAA,CAAgB,iBAAA,CAAkB,MAAA,GAAS,CAAA,EAAG;AAChD,MAAA,KAAA,CAAM,KAAK,CAAA,sBAAA,EAAyB,eAAA,CAAgB,kBAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACpF;AACA,IAAA,IAAI,eAAA,CAAgB,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC7C,MAAA,KAAA,CAAM,KAAK,CAAA,0BAAA,EAA6B,eAAA,CAAgB,eAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACrF;AAEA,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EAAyB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3D;AAAA,EACF;AAEA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,MAAgB,EAAC;AAEvB,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,WAAA,EAAc,cAAA,CAAe,WAAW,CAAA,CAAE,CAAA;AAAA,IACrD;AACA,IAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,MAAA,GAAA,CAAI,IAAA,CAAK,CAAA,UAAA,EAAa,cAAA,CAAe,MAAM,CAAA,CAAE,CAAA;AAAA,IAC/C;AACA,IAAA,IAAI,cAAA,CAAe,gBAAA,CAAiB,MAAA,GAAS,CAAA,EAAG;AAC9C,MAAA,GAAA,CAAI,KAAK,CAAA,qBAAA,EAAwB,cAAA,CAAe,iBAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/E;AACA,IAAA,IAAI,cAAA,CAAe,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACzC,MAAA,GAAA,CAAI,KAAK,CAAA,uBAAA,EAA0B,cAAA,CAAe,YAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5E;AAEA,IAAA,IAAI,GAAA,CAAI,SAAS,CAAA,EAAG;AAClB,MAAA,QAAA,CAAS,IAAA,CAAK,CAAA;AAAA,EAAwB,GAAA,CAAI,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACxD;AAAA,EACF;AAEA,EAAA,OAAO,SAAS,MAAA,GAAS,CAAA,GAAI,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,GAAI,IAAA;AACvD;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;;;ACjrBO,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;;;AC2CO,IAAM,sBAAN,MAA0B;AAAA,EAG/B,YAAY,aAAA,EAA8B;AACxC,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAO,MAAA,EAA6D;AACxE,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,QAAA;AACpC,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,CAAA;AAC9B,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,EAAA;AAE9B,IAAA,IAAI,UAA0B,EAAC;AAG/B,IAAA,QAAQ,QAAA;AAAU,MAChB,KAAK,UAAA;AACH,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,OAAO,KAAK,CAAA;AACxD,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,OAAO,KAAK,CAAA;AACxD,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,aAAA,CAAc,MAAA,EAAQ,OAAO,KAAK,CAAA;AACvD,QAAA;AAAA,MACF,KAAK,QAAA;AAAA,MACL;AACE,QAAA,OAAA,GAAU,MAAM,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ,OAAO,KAAK,CAAA;AACtD,QAAA;AAAA;AAIJ,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAGhD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,OAAO,KAAK,CAAA;AAE5D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,MAC/B,QAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,QAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAc,OAAA,CAAQ;AAAA;AACxB,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAc,cAAA,CACZ,MAAA,EACA,MAAA,EACA,KAAA,EACyB;AACzB,IAAA,MAAM,UAA0B,EAAC;AAGjC,IAAA,MAAM,aAAA,GAAgB,4BAAA,CAA6B,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACpE,IAAyB,qBAAA,CAAsB,IAAA,CAAK,MAAA,CAAO,KAAK;AAGhE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,aAAA,CAAc,yBAAyB,MAAA,CAAO,MAAA,EAAQ,QAAQ,CAAC,CAAA;AAE3F,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,SAAA,GAAY,GAAA;AAChB,MAAA,IAAI,SAAA,GAAY,2BAAA;AAGhB,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,MAAM,OAAA,GAAA,CAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ,UAAU,OAAA,EAAQ,KAAM,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,CAAA;AAC/E,QAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,UAAU,EAAE,CAAA;AAC1C,QAAA,SAAA,GAAY,CAAA,QAAA,EAAW,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA,SAAA,CAAA;AAAA,MAC5C;AAGA,MAAA,MAAM,cAAc,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,QAAQ,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,IAAI,OAAA,CAAQ,QAAA,CAAS,KAAK,GAAG,CAAC,GAAG,WAAA,EAAY;AAChH,MAAA,MAAM,aAAa,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY,CAAE,MAAM,KAAK,CAAA;AACzD,MAAA,MAAM,WAAA,GAAc,WAAW,MAAA,CAAO,CAAA,IAAA,KAAQ,YAAY,QAAA,CAAS,IAAI,CAAC,CAAA,CAAE,MAAA;AAC1E,MAAA,SAAA,IAAa,WAAA,GAAc,GAAA;AAE3B,MAAA,IAAI,YAAY,GAAA,EAAK;AACnB,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,OAAA;AAAA,UACN,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAAA,UAChC,SAAA;AAAA,UACA,MAAA,EAAQ,oBAAA;AAAA,UACR,WAAW,OAAA,CAAQ;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,cAAA,CACZ,MAAA,EACA,MAAA,EACA,KAAA,EACyB;AACzB,IAAA,MAAM,UAA0B,EAAC;AAGjC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,KAAK,CAAA;AAGlD,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,aAAA,CAAc,kBAAA,CAAmB,OAAO,MAAM,CAAA;AACvE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,SAAA,GAAY,GAAA;AAChB,MAAA,MAAM,kBAA4B,EAAC;AAGnC,MAAA,IAAI,QAAA,CAAS,MAAA,IAAU,KAAA,CAAM,gBAAA,EAAkB;AAC7C,QAAA,SAAA,IAAa,GAAA;AACb,QAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,KAAA,EAAQ,KAAA,CAAM,gBAAgB,CAAA,CAAE,CAAA;AAAA,MACvD;AAGA,MAAA,IAAI,QAAA,CAAS,QAAA,IAAY,KAAA,CAAM,iBAAA,CAAkB,SAAS,CAAA,EAAG;AAC3D,QAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,MAAA;AAAA,UAAO,CAAA,CAAA,KAC7C,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,CAAC,EAAA,KAAe,CAAA,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS,EAAA,CAAG,WAAA,EAAa,CAAC;AAAA,SACpF;AACA,QAAA,SAAA,IAAa,QAAQ,MAAA,GAAS,GAAA;AAC9B,QAAA,eAAA,CAAgB,KAAK,CAAA,UAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACxD;AAGA,MAAA,IAAI,QAAA,CAAS,QAAA,IAAY,KAAA,CAAM,cAAA,CAAe,SAAS,CAAA,EAAG;AACxD,QAAA,MAAM,OAAA,GAAU,MAAM,cAAA,CAAe,MAAA;AAAA,UAAO,CAAA,CAAA,KAC1C,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,CAAC,EAAA,KAAe,CAAA,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS,EAAA,CAAG,WAAA,EAAa,CAAC;AAAA,SACpF;AACA,QAAA,SAAA,IAAa,QAAQ,MAAA,GAAS,GAAA;AAC9B,QAAA,eAAA,CAAgB,KAAK,CAAA,UAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,MACxD;AAEA,MAAA,IAAI,YAAY,GAAA,EAAK;AACnB,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,YAAA;AAAA,UACN,IAAA,EAAM,KAAA;AAAA,UACN,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAAA,UAChC,SAAA,EAAW,CAAA,uCAAA,EAA0C,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UAC/E,MAAA,EAAQ,kBAAA;AAAA,UACR,WAAW,KAAA,CAAM;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,KAAA,EAAO;AAChB,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,aAAA,CAAc,iBAAA,CAAkB,OAAO,KAAK,CAAA;AACvE,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAI,SAAA,GAAY,GAAA;AAChB,QAAA,MAAM,cAAc,CAAA,EAAG,OAAA,CAAQ,WAAA,IAAe,EAAE,IAAI,OAAA,CAAQ,WAAA,IAAe,EAAE,CAAA,CAAA,EAAI,QAAQ,gBAAA,CAAiB,IAAA,CAAK,GAAG,CAAC,GAAG,WAAA,EAAY;AAElI,QAAA,MAAM,aAAa,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY,CAAE,MAAM,KAAK,CAAA;AACzD,QAAA,MAAM,WAAA,GAAc,WAAW,MAAA,CAAO,CAAA,IAAA,KAAQ,YAAY,QAAA,CAAS,IAAI,CAAC,CAAA,CAAE,MAAA;AAC1E,QAAA,SAAA,IAAa,WAAA,GAAc,IAAA;AAE3B,QAAA,IAAI,YAAY,GAAA,EAAK;AACnB,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,IAAA,EAAM,SAAA;AAAA,YACN,IAAA,EAAM,OAAA;AAAA,YACN,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAAA,YAChC,SAAA,EAAW,4BAA4B,WAAW,CAAA,eAAA,CAAA;AAAA,YAClD,MAAA,EAAQ,iBAAA;AAAA,YACR,WAAW,OAAA,CAAQ;AAAA,WACpB,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,cAAc,wBAAA,CAAyB,MAAA,CAAO,QAAQ,KAAK,CAAA;AACvF,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,WAAA,GAAc,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAG,WAAA,EAAY;AAClF,MAAA,IAAI,SAAA,GAAY,GAAA;AAGhB,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,MAAM,aAAA,GAAgB,QAAQ,QAAA,CAAS,MAAA;AAAA,UAAO,CAAA,CAAA,KAC5C,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,CAAC,EAAA,KAAe,CAAA,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS,EAAA,CAAG,WAAA,EAAa,CAAC;AAAA,SACpF;AACA,QAAA,SAAA,IAAa,cAAc,MAAA,GAAS,IAAA;AAAA,MACtC;AAGA,MAAA,IAAI,SAAS,QAAA,EAAU;AACrB,QAAA,MAAM,cAAA,GAAiB,QAAQ,QAAA,CAAS,MAAA;AAAA,UAAO,CAAA,CAAA,KAC7C,QAAA,CAAS,QAAA,EAAU,IAAA,CAAK,CAAC,EAAA,KAAe,CAAA,CAAE,WAAA,EAAY,CAAE,QAAA,CAAS,EAAA,CAAG,WAAA,EAAa,CAAC;AAAA,SACpF;AACA,QAAA,SAAA,IAAa,eAAe,MAAA,GAAS,GAAA;AAAA,MACvC;AAGA,MAAA,MAAM,aAAa,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY,CAAE,MAAM,KAAK,CAAA;AACzD,MAAA,MAAM,WAAA,GAAc,WAAW,MAAA,CAAO,CAAA,IAAA,KAAQ,YAAY,QAAA,CAAS,IAAI,CAAC,CAAA,CAAE,MAAA;AAC1E,MAAA,SAAA,IAAa,WAAA,GAAc,IAAA;AAE3B,MAAA,IAAI,YAAY,GAAA,EAAK;AACnB,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,OAAA;AAAA,UACN,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAAA,UAChC,SAAA,EAAW,CAAA,yDAAA,CAAA;AAAA,UACX,MAAA,EAAQ,oBAAA;AAAA,UACR,WAAW,OAAA,CAAQ;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAAA,CACZ,MAAA,EACA,MAAA,EACA,KAAA,EACyB;AACzB,IAAA,MAAM,UAA0B,EAAC;AAGjC,IAAA,MAAM,YAAA,GAAe,CAAC,MAAA,EAAQ,MAAA,EAAQ,UAAU,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,KAAA,EAAO,UAAU,CAAA;AAC3F,IAAA,MAAM,eAAe,YAAA,CAAa,MAAA;AAAA,MAAO,UACvC,MAAA,CAAO,KAAA,CAAM,WAAA,EAAY,CAAE,SAAS,IAAI;AAAA,KAC1C;AAGA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,aAAA,CAAc,eAAA,CAAgB,OAAO,MAAM,CAAA;AAEvE,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,SAAA,GAAY,GAAA;AAChB,MAAA,IAAI,SAAA,GAAY,CAAA,eAAA,EAAkB,OAAA,CAAQ,UAAU,CAAA,MAAA,CAAA;AAGpD,MAAA,IAAI,YAAA,CAAa,IAAA,CAAK,CAAA,IAAA,KAAQ,OAAA,CAAQ,SAAA,CAAU,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,EAAG;AAC7E,QAAA,SAAA,IAAa,GAAA;AACb,QAAA,SAAA,IAAa,8BAAA;AAAA,MACf;AAGA,MAAA,MAAM,cAAc,OAAA,CAAQ,UAAA,GAAa,IACrC,OAAA,CAAQ,YAAA,GAAe,QAAQ,UAAA,GAC/B,CAAA;AACJ,MAAA,SAAA,IAAa,WAAA,GAAc,GAAA;AAE3B,MAAA,IAAI,YAAY,GAAA,EAAK;AACnB,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,OAAA;AAAA,UACN,SAAA,EAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAAA,UAChC,SAAA,EAAW,GAAG,SAAS,CAAA,EAAA,EAAK,KAAK,KAAA,CAAM,WAAA,GAAc,GAAG,CAAC,CAAA,cAAA,CAAA;AAAA,UACzD,MAAA,EAAQ,kBAAA;AAAA,UACR,WAAW,OAAA,CAAQ;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,cAAc,wBAAA,CAAyB,MAAA,CAAO,QAAQ,KAAK,CAAA;AACvF,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,gBAAA,GAAmB,QAAQ,QAAA,CAAS,MAAA;AAAA,QAAO,CAAA,CAAA,KAC/C,aAAa,IAAA,CAAK,CAAA,IAAA,KAAQ,EAAE,WAAA,EAAY,CAAE,QAAA,CAAS,IAAI,CAAC;AAAA,OAC1D;AAEA,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,SAAA;AAAA,UACN,IAAA,EAAM,OAAA;AAAA,UACN,SAAA,EAAW,GAAA,GAAM,gBAAA,CAAiB,MAAA,GAAS,GAAA;AAAA,UAC3C,SAAA,EAAW,CAAA,uBAAA,EAA0B,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UAChE,MAAA,EAAQ,oBAAA;AAAA,UACR,WAAW,OAAA,CAAQ;AAAA,SACpB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAA,CACZ,MAAA,EACA,KAAA,EACA,KAAA,EACyB;AACzB,IAAA,MAAM,CAAC,QAAA,EAAU,QAAA,EAAU,OAAO,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,MACtD,IAAA,CAAK,eAAe,MAAA,EAAQ,KAAA,EAAO,KAAK,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,MACvD,IAAA,CAAK,eAAe,MAAA,EAAQ,KAAA,EAAO,KAAK,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,MACvD,IAAA,CAAK,cAAc,MAAA,EAAQ,KAAA,EAAO,KAAK,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAC;AAAA,KACvD,CAAA;AAGD,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,IAAA,MAAM,WAA2B,EAAC;AAElC,IAAA,KAAA,MAAW,MAAA,IAAU,CAAC,GAAG,QAAA,EAAU,GAAG,QAAA,EAAU,GAAG,OAAO,CAAA,EAAG;AAE3D,MAAA,MAAM,GAAA,GAAM,GAAG,MAAA,CAAO,IAAI,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AACzD,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,QAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,QAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,MACtB;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,gBAAgB,KAAA,EAMtB;AACA,IAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,EAAY;AAChC,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,iCAAA,CAAkC,IAAA,CAAK,KAAK,CAAA;AAAA,MACpD,UAAA,EAAY,mCAAA,CAAoC,IAAA,CAAK,KAAK,CAAA;AAAA,MAC1D,QAAA,EAAU,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,MACpF,QAAA,EAAU,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA;AAAA,MACvC,OAAA,EAAS,CAAC,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,MAAA,EAAQ,MAAM,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC;AAAA,KACvF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,KAAA,EAAyB;AAElD,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAC/B,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAE3C,MAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,CAAC,MAAM,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY,EAAG;AAC3D,QAAA,QAAA,CAAS,KAAK,KAAK,CAAA;AAAA,MACrB;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CAAiB,SAAyB,KAAA,EAKhD;AACA,IAAA,MAAM,OAAA,GAAU,CAAA,MAAA,EAAS,OAAA,CAAQ,MAAM,+BAA+B,KAAK,CAAA,CAAA,CAAA;AAG3E,IAAA,MAAM,iBAAiB,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,SAAS,CAAA;AAC/D,IAAA,MAAM,WAAW,cAAA,CAAe,MAAA,GAAS,CAAA,GACrC,cAAA,CAAe,MAAM,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,OAAM,CAAA,CAAE,IAAA,CAA+B,SAAS,CAAA,GAC/E,CAAC,iCAAiC,CAAA;AAGtC,IAAA,MAAM,WAAW,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,SAAS,CAAA;AACzD,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,aAAa,QAAA,CAChB,MAAA,CAAO,OAAK,CAAA,CAAE,SAAS,EACvB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,SAAA,CAAW,OAAA,EAAS,CAAA,CAC/B,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAEvB,MAAA,IAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC1B,QAAA,MAAM,MAAA,GAAA,CAAU,UAAA,CAAW,CAAC,CAAA,GAAI,UAAA,CAAW,WAAW,MAAA,GAAS,CAAC,CAAA,KAAM,UAAA,CAAW,MAAA,GAAS,CAAA,CAAA;AAC1F,QAAA,MAAM,OAAA,GAAU,MAAA,IAAU,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,CAAA;AAE3C,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,MAAA,CAAO,KAAK,4CAA4C,CAAA;AAAA,QAC1D,CAAA,MAAA,IAAW,UAAU,EAAA,EAAI;AACvB,UAAA,MAAA,CAAO,KAAK,gDAAgD,CAAA;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,cAAwB,EAAC;AAE/B,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,IAAK,CAAC,SAAS,CAAC,CAAA,CAAE,QAAA,CAAS,aAAa,CAAA,EAAG;AAC/D,MAAA,WAAA,CAAY,IAAA,CAAK,CAAA,0BAAA,EAA6B,QAAA,CAAS,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7D;AAEA,IAAA,MAAM,iBAAiB,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,SAAS,CAAA;AAC/D,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,WAAA,CAAY,KAAK,qDAAqD,CAAA;AAAA,IACxE;AAEA,IAAA,MAAM,mBAAmB,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,WAAW,CAAA;AACnE,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,WAAA,CAAY,KAAK,sEAAsE,CAAA;AAAA,IACzF;AAEA,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,WAAA,CAAY,KAAK,iDAAiD,CAAA;AAAA,IACpE;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,MAAA,EAAQ,WAAA,EAAY;AAAA,EAClD;AACF;AASO,SAAS,0BAA0B,aAAA,EAAmD;AAC3F,EAAA,OAAO,IAAI,oBAAoB,aAAa,CAAA;AAC9C;ACjfO,IAAM,oBAAN,MAAwB;AAAA,EAK7B,YAAY,OAAA,EAAmC;AAC7C,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,CAAQ,SAAA,IAAa,wBAAA,EAAyB;AAC/D,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAC7B,IAAA,IAAA,CAAK,mBAAA,GAAsB,QAAQ,mBAAA,IAAuB,GAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAAA,EAAyD;AAC5E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,mBAAA,CAAoB,OAAO,CAAA;AAE/C,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAa;AAAA,MAChD,YAAA,EAAc,gFAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,sBAAsB,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,OAAA,EAA4D;AAEjF,IAAA,IAAI,cAAc,MAAM,IAAA,CAAK,aAAA,CAAc,kBAAA,CAAmB,QAAQ,MAAM,CAAA;AAE5E,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,WAAA,GAAc;AAAA,QACZ,IAAI,OAAA,CAAQ,MAAA;AAAA,QACZ,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,gBAAA,EAAkB,YAAA;AAAA,QAClB,eAAA,EAAiB,QAAA;AAAA,QACjB,mBAAmB,EAAC;AAAA,QACpB,gBAAgB,EAAC;AAAA,QACjB,cAAc,EAAC;AAAA,QACf,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAGlD,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,KAAA,MAAW,SAAA,IAAa,SAAS,UAAA,EAAY;AAC3C,MAAA,IAAI,SAAA,CAAU,UAAA,IAAc,IAAA,CAAK,mBAAA,EAAqB;AACpD,QAAA,QAAQ,UAAU,KAAA;AAAO,UACvB,KAAK,kBAAA;AACH,YAAA,IAAI,IAAA,CAAK,uBAAA,CAAwB,SAAA,CAAU,KAAK,CAAA,EAAG;AACjD,cAAA,WAAA,CAAY,mBAAmB,SAAA,CAAU,KAAA;AACzC,cAAA,OAAA,GAAU,IAAA;AAAA,YACZ;AACA,YAAA;AAAA,UACF,KAAK,iBAAA;AACH,YAAA,IAAI,IAAA,CAAK,sBAAA,CAAuB,SAAA,CAAU,KAAK,CAAA,EAAG;AAChD,cAAA,WAAA,CAAY,kBAAkB,SAAA,CAAU,KAAA;AACxC,cAAA,OAAA,GAAU,IAAA;AAAA,YACZ;AACA,YAAA;AAAA,UACF,KAAK,mBAAA;AACH,YAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,EAAG;AAClC,cAAA,WAAA,CAAY,iBAAA,GAAoB;AAAA,gBAC9B,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,YAAY,iBAAA,EAAmB,GAAG,SAAA,CAAU,KAAK,CAAC;AAAA,eACnE,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACb,cAAA,OAAA,GAAU,IAAA;AAAA,YACZ;AACA,YAAA;AAAA,UACF,KAAK,gBAAA;AACH,YAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,EAAG;AAClC,cAAA,WAAA,CAAY,cAAA,GAAiB;AAAA,gBAC3B,mBAAG,IAAI,GAAA,CAAI,CAAC,GAAG,YAAY,cAAA,EAAgB,GAAG,SAAA,CAAU,KAAK,CAAC;AAAA,eAChE,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACb,cAAA,OAAA,GAAU,IAAA;AAAA,YACZ;AACA,YAAA;AAAA;AACJ,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,WAAA,CAAY,aAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAK,WAAA,CAAY,aAAa,IAAI,CAAA;AACpE,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,qBAAA,CAAsB,OAAA,CAAQ,QAAQ,WAAW,CAAA;AAAA,IAC5E;AAEA,IAAA,OAAO,UAAU,WAAA,GAAc,IAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,QAAA,EAA+D;AAC9E,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAElC,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,CAAC,CAAA,CAAE,MAAA;AAC3B,IAAA,IAAI,WAAA,GAAc,MAAM,IAAA,CAAK,aAAA,CAAc,mBAAmB,MAAM,CAAA;AAEpE,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,WAAA,GAAc;AAAA,QACZ,EAAA,EAAI,MAAA;AAAA,QACJ,MAAA;AAAA,QACA,gBAAA,EAAkB,YAAA;AAAA,QAClB,eAAA,EAAiB,QAAA;AAAA,QACjB,mBAAmB,EAAC;AAAA,QACpB,gBAAgB,EAAC;AAAA,QACjB,cAAc,EAAC;AAAA,QACf,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,IAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAEpC,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,CAAA,CAAA,KAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAC,CAAA;AAChD,MAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,CAAA,CAAA,KAAK,WAAA,CAAY,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,IAClD;AAGA,IAAA,WAAA,CAAY,oBAAoB,CAAC,GAAG,WAAW,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AAC5D,IAAA,WAAA,CAAY,iBAAiB,CAAC,GAAG,WAAW,CAAA,CAAE,KAAA,CAAM,GAAG,EAAE,CAAA;AACzD,IAAA,WAAA,CAAY,aAAa,IAAA,CAAK,GAAA,CAAI,GAAK,GAAA,GAAO,QAAA,CAAS,SAAS,IAAK,CAAA;AAGrE,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,oBAAA,CAAqB,QAAQ,CAAA;AAC1D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAa;AAAA,MAChD,YAAA,EAAc,gFAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,qBAAA,CAAsB,OAAO,CAAA;AACnD,IAAA,KAAA,MAAW,SAAA,IAAa,SAAS,UAAA,EAAY;AAC3C,MAAA,IAAI,SAAA,CAAU,UAAA,IAAc,IAAA,CAAK,mBAAA,EAAqB;AACpD,QAAA,IAAI,UAAU,KAAA,KAAU,kBAAA,IAAsB,KAAK,uBAAA,CAAwB,SAAA,CAAU,KAAK,CAAA,EAAG;AAC3F,UAAA,WAAA,CAAY,mBAAmB,SAAA,CAAU,KAAA;AAAA,QAC3C;AACA,QAAA,IAAI,UAAU,KAAA,KAAU,iBAAA,IAAqB,KAAK,sBAAA,CAAuB,SAAA,CAAU,KAAK,CAAA,EAAG;AACzF,UAAA,WAAA,CAAY,kBAAkB,SAAA,CAAU,KAAA;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,qBAAA,CAAsB,MAAA,EAAQ,WAAW,CAAA;AAClE,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB,OAAA,EAAoC;AAC9D,IAAA,OAAO,CAAA;;AAAA;AAAA,WAAA,EAGE,QAAQ,MAAM,CAAA;AAAA,sBAAA,EACH,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC;AAAA,iBAAA,EAChC,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC;AAAA,SAAA,EACnC,QAAQ,KAAK;;AAAA;AAAA,EAGtB,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,eAAA,EAAiB,IAAA,EAAM,CAAC,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,GAAI,CAAC;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAAA,EAoB/D;AAAA,EAEQ,qBAAqB,QAAA,EAAuC;AAClE,IAAA,MAAM,YAAY,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,IAAI,CAAA,CAAA,MAAM;AAAA,MAChD,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,GAAG,GAAG,CAAA;AAAA,MAC7B,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,UAAU,CAAA,CAAE;AAAA,KACd,CAAE,CAAA;AAEF,IAAA,OAAO,CAAA,cAAA,EAAiB,SAAS,MAAM,CAAA;;AAAA;AAAA,EAGzC,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,IAAA,EAAM,CAAC,CAAC;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAAA,EAkBlC;AAAA;AAAA;AAAA;AAAA,EAMQ,sBAAsB,OAAA,EAAqC;AACjE,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAC7C,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO,EAAE,UAAA,EAAY,EAAC,EAAG,kBAAkB,KAAA,EAAM;AAAA,MACnD;AAEA,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AAEtC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AACpC,QAAA,OAAO;AAAA,UACL,UAAA,EAAY,OAAO,UAAA,CAAW,MAAA;AAAA,YAAO,CAAC,QACpC,GAAA,CAAI,KAAA,IAAS,IAAI,KAAA,KAAU,KAAA,CAAA,IAAa,OAAO,GAAA,CAAI,UAAA,KAAe;AAAA,WACpE;AAAA,UACA,gBAAA,EAAkB,OAAO,gBAAA,IAAoB;AAAA,SAC/C;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,UAAA,EAAY,EAAC,EAAG,kBAAkB,KAAA,EAAM;AAAA,IACnD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAE,UAAA,EAAY,EAAC,EAAG,kBAAkB,KAAA,EAAM;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMQ,wBAAwB,KAAA,EAA6D;AAC3F,IAAA,OAAO,OAAO,UAAU,QAAA,IAAY,CAAC,cAAc,WAAA,EAAa,YAAY,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AAAA,EAC9F;AAAA,EAEQ,uBAAuB,KAAA,EAA4D;AACzF,IAAA,OAAO,OAAO,UAAU,QAAA,IAAY,CAAC,UAAU,SAAA,EAAW,MAAM,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AAAA,EAClF;AACF;AAMO,SAAS,wBAAwB,OAAA,EAAsD;AAC5F,EAAA,OAAO,IAAI,kBAAkB,OAAO,CAAA;AACtC;;;AC7OO,IAAM,iBAAN,MAAqB;AAAA,EAI1B,YAAY,QAAA,EAAwB;AAFpC,IAAA,IAAA,CAAQ,SAAA,uBAAiD,GAAA,EAAI;AAG3D,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAAA,EAAsC;AACrD,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,UAAU,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,YAAA,EACA,MAAA,EACkC;AAClC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,YAAY,CAAA;AAClD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,YAAY,CAAA,CAAE,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,UAAA,EAAY,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,UAAA,EACA,MAAA,EACkC;AAClC,IAAA,MAAM,UAAA,GAAa,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC7E,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,MAAM,OAAA,GAA2B;AAAA,MAC/B,UAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAS,EAAC;AAAA,MACV,WAAA,sBAAiB,GAAA,EAAI;AAAA,MACrB,QAAA,EAAU;AAAA,QACR,SAAA;AAAA,QACA,cAAA,EAAgB,CAAA;AAAA,QAChB,WAAA,EAAa;AAAA;AACf,KACF;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,SAAA,EAA4B,CAAE,CAAA;AAEvF,IAAA,IAAI;AAEF,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,mBAAA,CAAoB,KAAK,CAAA;AAErD,MAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,QAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,MAAM,CAAA;AAG5C,QAAA,IAAI,KAAK,SAAA,IAAa,CAAC,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,EAAG;AAC9C,UAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,OAAA,EAAS,UAAU,CAAA;AAEhD,QAAA,IAAI,IAAA,CAAK,MAAA,KAAW,OAAA,IAAW,UAAA,CAAW,YAAY,MAAA,EAAQ;AAC5D,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAEhC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,OAAA,CAAQ,QAAA,CAAS,WAAA,KAAgB,CAAA;AAAA,QAC1C,UAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,UAAA;AAAA,QACA,OAAA;AAAA,QACA,KAAA;AAAA,QACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,QACzB,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,KAAA,EACA,OAAA,EACoC;AACpC,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAS;AACzC,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,MAAA,IAAI;AAEF,QAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,KAAA,KAAU,aAC/B,IAAA,CAAK,KAAA,CAAmB,OAAO,CAAA,GAChC,IAAA,CAAK,KAAA;AAET,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,SAAS,OAAA,CAAQ,IAAA,CAAK,MAAM,KAAK,CAAA;AAE3D,QAAA,OAAO;AAAA,UACL,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,OAAA,EAAS,IAAA;AAAA,UACT,MAAA;AAAA,UACA,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SAC3B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAO;AAAA,UACL,QAAQ,IAAA,CAAK,EAAA;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UAC5D,UAAA,EAAY,IAAA,CAAK,GAAA,EAAI,GAAI;AAAA,SAC3B;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAO,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,MAAc,WAAA,EAAsC;AACjE,IAAA,OAAO,IAAI,eAAA,CAAgB,IAAA,EAAM,IAAA,EAAM,WAAW,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,WAAA,CACZ,IAAA,EACA,OAAA,EACA,UAAA,EACe;AACf,IAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAE1B,IAAA,MAAM,UAAA,GAAa,WAAW,UAAA,IAAc,CAAA;AAC5C,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,OAAO,WAAW,UAAA,EAAY;AAC5B,MAAA,IAAI;AAEF,QAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,KAAA,KAAU,aAC/B,IAAA,CAAK,KAAA,CAAgE,OAAO,CAAA,GAC7E,IAAA,CAAK,KAAA;AAET,QAAA,MAAM,SAAS,MAAM,IAAA,CAAK,SAAS,OAAA,CAAQ,IAAA,CAAK,MAAM,KAAK,CAAA;AAE3D,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAA,CAAK,MAAA,GAAS,SAAA;AACd,QAAA,IAAA,CAAK,OAAA,GAAU,KAAK,GAAA,EAAI;AAExB,QAAA,OAAA,CAAQ,WAAA,CAAY,IAAI,IAAA,CAAK,EAAA,EAAI,EAAE,OAAA,EAAS,IAAA,EAAM,QAAQ,CAAA;AAC1D,QAAA,OAAA,CAAQ,OAAA,CAAQ,IAAA,CAAK,EAAE,CAAA,GAAI,MAAA;AAC3B,QAAA,OAAA,CAAQ,QAAA,CAAS,cAAA,EAAA;AAEjB,QAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,EAAA;AAEA,QAAA,IAAI,UAAU,UAAA,EAAY;AACxB,UAAA,IAAA,CAAK,QAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAClE,UAAA,IAAA,CAAK,MAAA,GAAS,OAAA;AACd,UAAA,IAAA,CAAK,OAAA,GAAU,KAAK,GAAA,EAAI;AAExB,UAAA,OAAA,CAAQ,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA;AACtE,UAAA,OAAA,CAAQ,QAAA,CAAS,WAAA,EAAA;AAEjB,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,WAAW,CAAA,EAAG,GAAA,GAAO,OAAO,CAAC,CAAA;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAAoB,KAAA,EAA6B;AACvD,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAAmB;AAChC,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAElB,MAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,MAAM,CAAA;AAC5C,MAAA,IAAI,CAAC,IAAA,EAAM;AAGX,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,KAAA,MAAW,GAAA,IAAO,KAAK,SAAA,EAAW;AAChC,UAAA,KAAA,CAAM,GAAG,CAAA;AAAA,QACX;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACf;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAMO,IAAM,kBAAN,MAAsB;AAAA,EAI3B,WAAA,CAAY,MAAA,EAAwB,IAAA,EAAc,WAAA,EAAqB;AACrE,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,UAAA,GAAa;AAAA,MAChB,IAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAQ,EAAC;AAAA,MACT,OAAO,EAAC;AAAA,MACR,OAAA,EAAS,MAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA,EAEA,KAAA,CAAM,IAAA,EAAc,IAAA,EAAc,QAAA,GAAoB,MAAM,YAAA,EAA8B;AACxF,IAAA,IAAA,CAAK,UAAA,CAAW,OAAO,IAAI,CAAA,GAAI,EAAE,IAAA,EAAM,QAAA,EAAU,SAAS,YAAA,EAAa;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KACE,EAAA,EACAzB,MAAAA,EACA,KAAA,EACA,OAAA,GAGI,EAAC,EACC;AACN,IAAA,IAAA,CAAK,UAAA,CAAW,MAAM,IAAA,CAAK;AAAA,MACzB,EAAA;AAAA,MACA,IAAA,EAAM,EAAA;AAAA,MACN,IAAA,EAAAA,MAAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,MAAA,EAAQ;AAAA,KACT,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAS,KAAA,EAIC;AAER,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAA,CAAK,UAAA,CAAW,MAAM,IAAA,CAAK;AAAA,QACzB,IAAI,IAAA,CAAK,EAAA;AAAA,QACT,MAAM,IAAA,CAAK,EAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAQ,MAAA,EAA6C;AACnD,IAAA,IAAA,CAAK,WAAW,OAAA,GAAU,MAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,UAAA,EAA0B;AAC9B,IAAA,IAAA,CAAK,WAAW,UAAA,GAAa,UAAA;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,MAAA,EAAmE;AAC/E,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,YAAY,MAAM,CAAA;AAAA,EACxD;AACF;AAMO,SAAS,+BAA+B,MAAA,EAA4C;AACzF,EAAA,OAAO,MAAA,CAAO,cAAA;AAAA,IACZ,mBAAA;AAAA,IACA;AAAA,GACF,CACG,KAAA,CAAM,SAAA,EAAW,QAAA,EAAU,IAAI,CAAA,CAC/B,KAAA,CAAM,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,UAAU,CAAA,CAC3C,IAAA;AAAA,IACC,WAAA;AAAA,IACA,wBAAA;AAAA,IACA,EAAE,OAAA,EAAS,CAAC,GAAA,KAAyB,GAAA,CAAI,OAAO,OAAA;AAAkB,GACpE,CACC,IAAA;AAAA,IACC,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,EAAE,YAAA,EAAc,CAAC,GAAA,KAAyB,GAAA,CAAI,QAAQ,SAAA,EAAU;AAAA,IAChE,EAAE,SAAA,EAAW,CAAC,WAAW,CAAA;AAAE,GAC7B,CACC,IAAA;AAAA,IACC,UAAA;AAAA,IACA,iBAAA;AAAA,IACA,EAAE,MAAA,EAAQ,CAAC,GAAA,KAAyB,GAAA,CAAI,QAAQ,QAAA,EAAS;AAAA,IACzD,EAAE,SAAA,EAAW,CAAC,UAAU,CAAA;AAAE,GAC5B,CACC,IAAA;AAAA,IACC,KAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,MACE,MAAA,EAAQ,CAAC,GAAA,KAAyB,GAAA,CAAI,OAAA,CAAQ,QAAA;AAAA,MAC9C,MAAA,EAAQ,CAAC,GAAA,KAAyB,GAAA,CAAI,OAAA,CAAQ;AAAA,KAChD;AAAA,IACA;AAAA,MACE,SAAA,EAAW,CAAC,UAAU,CAAA;AAAA,MACtB,SAAA,EAAW,CAAC,GAAA,KAAyB,CAAC,IAAI,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA,EAAG;AAAA;AACzE,GACF,CACC,KAAA,CAAM,CAAC,CAAA,CACP,KAAA,EAAM;AACX;AAMO,SAAS,qBAAqB,QAAA,EAAwC;AAC3E,EAAA,OAAO,IAAI,eAAe,QAAQ,CAAA;AACpC;AC9VO,IAAM,cAAA,GAAN,cAA6B,SAAA,CAAU;AAAA,EAI5C,YAAY,OAAA,EAAgC;AAC1C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,UAAA,IAAc,gBAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CAAU,WAAqB,GAAA,EAAqB;AAC1D,IAAA,OAAO,CAAC,GAAG,SAAA,EAAW,GAAG,CAAA,CAAE,KAAK,GAAG,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,SAAA,EAA6B;AACpD,IAAA,OAAO,SAAA,CAAU,KAAK,GAAG,CAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAA8B,UAAA,EAA+C;AACjF,IAAA,MAAM,UAAqB,EAAC;AAE5B,IAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,MAAA,IAAI,SAAS,EAAA,IAAM,WAAA,IAAe,EAAA,IAAM,EAAE,qBAAqB,EAAA,CAAA,EAAK;AAClE,QAAA,IAAI,WAAW,EAAA,EAAI;AAEjB,UAAA,MAAM,KAAA,GAAQ,EAAA;AACd,UAAA,IAAI,KAAA,CAAM,UAAU,IAAA,EAAM;AACxB,YAAA,MAAM,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,SAAA,EAAW,MAAM,GAAG,CAAA;AAAA,UAClD,CAAA,MAAO;AACL,YAAA,MAAM,KAAK,OAAA,CAAQ,KAAA,CAAM,WAAW,KAAA,CAAM,GAAA,EAAK,MAAM,KAAK,CAAA;AAAA,UAC5D;AACA,UAAA,OAAA,CAAQ,KAAK,MAAS,CAAA;AAAA,QACxB,CAAA,MAAO;AAEL,UAAA,MAAM,KAAA,GAAQ,EAAA;AACd,UAAA,MAAM,OAAO,MAAM,IAAA,CAAK,QAAQ,KAAA,CAAM,SAAA,EAAW,MAAM,GAAG,CAAA;AAC1D,UAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,QACnB;AAAA,MACF,CAAA,MAAA,IAAW,qBAAqB,EAAA,EAAI;AAElC,QAAA,MAAM,QAAA,GAAW,EAAA;AACjB,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAC7C,QAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,MACpB,CAAA,MAAA,IAAW,qBAAqB,EAAA,IAAO,OAAA,IAAW,MAAM,QAAA,IAAY,EAAA,IAAM,EAAE,iBAAA,IAAqB,EAAA,CAAA,EAAM;AAErG,QAAA,MAAM,MAAA,GAAS,EAAA;AACf,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA;AACxD,QAAA,OAAA,CAAQ,KAAK,UAAU,CAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CAAQ,SAAA,EAAqB,GAAA,EAAmC;AAC5E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,GAAG,CAAA;AAC3C,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,CAAE,GAAA,EAAI;AAErE,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,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAA,EAAW,KAAK,SAAA,EAAW,MAAA,QAAc,IAAI,IAAA,CAAK,KAAK,SAA8B,CAAA;AAAA,MACrF,SAAA,EAAW,KAAK,SAAA,EAAW,MAAA,QAAc,IAAI,IAAA,CAAK,KAAK,SAA8B;AAAA,KACvF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,OAAA,CACZ,SAAA,EACA,GAAA,EACA,KAAA,EACe;AACf,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,GAAG,CAAA;AAC3C,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,CAAE,GAAA,EAAI;AAC7E,IAAA,MAAM,YAAY,WAAA,CAAY,MAAA,GACxB,WAAA,CAAY,IAAA,GAAoC,SAAA,GAClD,GAAA;AAEJ,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,SAAA;AAAA,MACA,YAAA,EAAc,IAAA,CAAK,gBAAA,CAAiB,SAAS,CAAA;AAAA,MAC7C,GAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACb;AAEA,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,UAAU,EAAE,GAAA,CAAI,KAAK,CAAA,CAAE,GAAA,CAAI,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,UAAA,CAAW,SAAA,EAAqB,GAAA,EAA4B;AACxE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,GAAG,CAAA;AAC3C,IAAA,MAAM,IAAA,CAAK,GAAG,UAAA,CAAW,IAAA,CAAK,UAAU,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,CAAE,MAAA,EAAO;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,YAAY,EAAA,EAA4C;AACpE,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,EAAA,CAAG,eAAe,CAAA;AAChE,IAAA,MAAM,KAAA,GAAQ,GAAG,KAAA,IAAS,EAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,GAAG,MAAA,IAAU,CAAA;AAG5B,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,KAAK,UAAU,CAAA;AAM9C,IAAA,IAAI,eAAA,EAAiB;AAEnB,MAAA,KAAA,GAAQ,KAAA,CACL,KAAA,CAAM,cAAA,EAAgB,IAAA,EAAM,eAAe,EAC3C,KAAA,CAAM,cAAA,EAAgB,GAAA,EAAK,eAAA,GAAkB,QAAQ,CAAA;AAAA,IAC1D;AAGA,IAAA,IAAI,GAAG,MAAA,EAAQ;AACb,MAAA,KAAA,MAAW,CAAC,KAAK,WAAW,CAAA,IAAK,OAAO,OAAA,CAAQ,EAAA,CAAG,MAAM,CAAA,EAAG;AAC1D,QAAA,IAAI,OAAO,WAAA,KAAgB,QAAA,IAAY,WAAA,KAAgB,IAAA,EAAM;AAE3D,UAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAsC,CAAA,EAAG;AACtF,YAAA,QAAQ,QAAA;AAAU,cAChB,KAAK,KAAA;AACH,gBAAA,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,MAAM,KAAK,CAAA;AAC/C,gBAAA;AAAA,cACF,KAAK,KAAA;AACH,gBAAA,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,MAAM,KAAK,CAAA;AAC/C,gBAAA;AAAA,cACF,KAAK,KAAA;AACH,gBAAA,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA;AAC9C,gBAAA;AAAA,cACF,KAAK,MAAA;AACH,gBAAA,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,MAAM,KAAK,CAAA;AAC/C,gBAAA;AAAA,cACF,KAAK,KAAA;AACH,gBAAA,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA;AAC9C,gBAAA;AAAA,cACF,KAAK,MAAA;AACH,gBAAA,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,MAAM,KAAK,CAAA;AAC/C,gBAAA;AAAA;AACJ,UACF;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,KAAA,GAAQ,MAAM,KAAA,CAAM,CAAA,MAAA,EAAS,GAAG,CAAA,CAAA,EAAI,MAAM,WAAW,CAAA;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAA,GAAQ,MAAM,CAAA;AAElC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAI;AACjC,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAEvC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ;AACvB,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,MAAA,OAAO;AAAA,QACL,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,OAAO,IAAA,CAAK,KAAA;AAAA,QACZ,SAAA,EAAW,KAAK,SAAA,EAAW,MAAA,QAAc,IAAI,IAAA,CAAK,KAAK,SAA8B,CAAA;AAAA,QACrF,SAAA,EAAW,KAAK,SAAA,EAAW,MAAA,QAAc,IAAI,IAAA,CAAK,KAAK,SAA8B;AAAA,OACvF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAoB,EAAA,EAAkD;AAClF,IAAA,MAAM,KAAA,GAAQ,GAAG,KAAA,IAAS,EAAA;AAC1B,IAAA,MAAM,MAAA,GAAS,GAAG,MAAA,IAAU,CAAA;AAE5B,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,KAAK,UAAU,CAAA;AAM9C,IAAA,IAAI,GAAG,eAAA,EAAiB;AACtB,MAAA,KAAA,MAAW,SAAA,IAAa,GAAG,eAAA,EAAiB;AAC1C,QAAA,MAAMc,KAAAA,GAAO,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,CAAC,MAAM,CAAA,KAAM,GAAG,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC7D,QAAA,IAAI,SAAA,CAAU,cAAc,QAAA,EAAU;AACpC,UAAA,KAAA,GAAQ,KAAA,CACL,KAAA,CAAM,cAAA,EAAgB,IAAA,EAAMA,KAAI,EAChC,KAAA,CAAM,cAAA,EAAgB,GAAA,EAAKA,KAAAA,GAAO,QAAQ,CAAA;AAAA,QAC/C;AAAA,MAEF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAI;AACjC,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AAErC,IAAA,KAAA,MAAW,GAAA,IAAO,SAAS,IAAA,EAAM;AAC/B,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,MAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AAGvB,MAAA,IAAI,GAAG,QAAA,KAAa,MAAA,IAAa,SAAA,CAAU,MAAA,GAAS,GAAG,QAAA,EAAU;AAC/D,QAAA,YAAA,CAAa,GAAA,CAAI,UAAU,KAAA,CAAM,CAAA,EAAG,GAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,MAC5D,CAAA,MAAO;AACL,QAAA,YAAA,CAAa,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,MACtC;AAAA,IACF;AAEA,IAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA,CACvC,IAAI,CAAC,EAAA,KAAO,EAAA,CAAG,KAAA,CAAM,GAAG,CAAC,CAAA,CACzB,KAAA,CAAM,MAAA,EAAQ,SAAS,KAAK,CAAA;AAE/B,IAAA,OAAO,UAAA;AAAA,EACT;AACF;;;AC/OA,IAAM,oBAAA,uBAA2B,GAAA,CAAI;AAAA,EACnC,IAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAC,CAAA;AAKD,SAAS,oBAAoB,QAAA,EAA2B;AACtD,EAAA,OAAO,oBAAA,CAAqB,IAAI,QAAQ,CAAA;AAC1C;AAUA,SAAS,sBAAsB,GAAA,EAA6C;AAC1E,EAAA,IAAI,OAAA,GAAmB,IAAA;AAEvB,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,OAAO,GAAA,CAAI,WAAW,QAAA,EAAU;AAChD,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,OAAA,GAAU,MAAA,CAAO,OAAA;AAAA,EACnB,CAAA,MAAA,IAAW,GAAA,CAAI,OAAA,KAAY,MAAA,EAAW;AACpC,IAAA,OAAA,GAAU,GAAA,CAAI,OAAA;AAAA,EAChB;AAEA,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AAC1B,IAAA,MAAM,QAAQ,OAAA,CACX,MAAA;AAAA,MAAO,CAAC,KAAA,KACP,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,IAAA,KAAS,MAAA,IAAU,OAAO,KAAA,CAAM,IAAA,KAAS;AAAA,KAChG,CACC,GAAA,CAAI,CAAA,KAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AAC1B,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAMA,SAAS,iBAAiB,GAAA,EAA6F;AACrH,EAAA,IAAI,OAAA,GAAmB,IAAA;AACvB,EAAA,IAAI,gBAAA,GAAmD,IAAA;AAEvD,EAAA,IAAI,GAAA,CAAI,MAAA,IAAU,OAAO,GAAA,CAAI,WAAW,QAAA,EAAU;AAChD,IAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,IAAA,OAAA,GAAU,MAAA,CAAO,OAAA;AACjB,IAAA,gBAAA,GAAmB,MAAA,CAAO,iBAAA;AAAA,EAC5B,CAAA,MAAA,IAAW,GAAA,CAAI,OAAA,KAAY,MAAA,EAAW;AACpC,IAAA,OAAA,GAAU,GAAA,CAAI,OAAA;AACd,IAAA,gBAAA,GAAmB,GAAA,CAAI,iBAAA;AAAA,EACzB;AAGA,EAAA,IAAI,kBAAkB,UAAA,IAAc,KAAA,CAAM,OAAA,CAAQ,gBAAA,CAAiB,UAAU,CAAA,EAAG;AAC9E,IAAA,MAAM,SAAA,GAAa,gBAAA,CAAiB,UAAA,CAKjC,MAAA,CAAO,CAAA,EAAA,KAAM,GAAG,QAAA,EAAU,IAAI,CAAA,CAC9B,GAAA,CAAI,CAAA,EAAA,KAAM;AACT,MAAA,IAAI,OAAgC,EAAC;AACrC,MAAA,MAAM,OAAA,GAAU,GAAG,QAAA,EAAU,SAAA;AAC7B,MAAA,MAAM,QAAA,GAAW,EAAA,CAAG,QAAA,EAAU,IAAA,IAAQ,SAAA;AAEtC,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,IAAI;AACF,UAAA,IAAA,GAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,QAC3B,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,IAChC,CAAC,CAAA;AAEH,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAA,EAAG;AACrC,IAAA,MAAM,YAAY,OAAA,CACf,MAAA;AAAA,MAAO,CAAC,KAAA,KACP,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,IAAA,KAAS,UAAA,IAAc,OAAO,KAAA,CAAM,IAAA,KAAS;AAAA,KACpG,CACC,GAAA,CAAI,CAAA,KAAA,MAAU,EAAE,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,IAAA,EAAM,KAAA,CAAM,KAAA,IAAS,EAAC,EAAE,CAAE,CAAA;AAE/D,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,YAAY,GAAA,EAAuC;AAC1D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA,IAAM,IAAI,EAAA,CAAgB,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,IAAA;AAChF,EAAA,IAAK,GAAA,CAA0B,IAAA,KAAS,IAAA,EAAM,OAAO,IAAA;AACrD,EAAA,OAAO,KAAA;AACT;AAgBO,SAAS,mBAAA,CACd,OACA,QAAA,EACU;AACV,EAAA,MAAM,MAAA,GAAS,wBAAA,CAAyB,KAAA,EAAO,QAAQ,CAAA;AACvD,EAAA,OAAO,MAAA,CAAO,CAAC,CAAA,IAAK,cAAA,CAAe,SAAA,EAAW,EAAE,OAAA,EAAS,EAAA,EAAI,IAAA,EAAM,WAAA,EAAa,UAAA,EAAY,IAAA,EAAM,CAAA;AACpG;AAMO,SAAS,wBAAA,CACd,OACA,QAAA,EACY;AACZ,EAAA,MAAM,SAAqB,EAAC;AAG5B,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,IAAA,MAAA,CAAO,IAAA,CAAK,eAAe,WAAA,EAAa,oBAAA,CAAqB,OAAO,QAAA,IAAY,SAAS,CAAC,CAAC,CAAA;AAC3F,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAA,CAAM,KAAA,IAAS,OAAO,KAAA,CAAM,UAAU,QAAA,EAAU;AAClD,IAAA,MAAM,YAAY,KAAA,CAAM,KAAA;AAGxB,IAAA,IAAI,SAAA,CAAU,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,IAAK,SAAA,CAAU,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACnF,MAAA,MAAM,QAAQ,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,GAAA,MAAS;AAAA,QAC7C,EAAA,EAAI,CAAA,CAAE,EAAA,IAAM,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA;AAAA,QACvB,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,OAAA,IAAW,EAAA;AAAA,QAC7B,MAAA,EAAS,EAAE,MAAA,IAAsD;AAAA,OACnE,CAAE,CAAA;AACF,MAAA,MAAA,CAAO,KAAK,cAAA,CAAe,aAAA,EAAe,EAAE,KAAA,EAAO,CAAC,CAAA;AACpD,MAAA,OAAO,MAAA;AAAA,IACT;AAGA,IAAA,IAAI,UAAU,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAA,EAAG;AAC3D,MAAA,MAAM,UAAU,SAAA,CAAU,QAAA,CAAS,SAAA,CAAU,QAAA,CAAS,SAAS,CAAC,CAAA;AAGhE,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,QAAA,MAAA,GAAS,OAAA,CAAQ,MAAA;AAAA,MACnB,CAAA,MAAA,IAAW,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AACjD,QAAA,MAAM,GAAA,GAAM,OAAA;AACZ,QAAA,IAAI,GAAA,CAAI,OAAA,KAAY,MAAA,IAAa,GAAA,CAAI,SAAS,MAAA,EAAW;AACvD,UAAA,MAAA,GAAS;AAAA,YACP,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,OAAA,IAAW,EAAE,CAAA;AAAA,YACjC,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,IAAA,IAAQ,SAAS,CAAA;AAAA,YAClC,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,MAAA,IAAU,SAAS;AAAA,WACxC;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,MAAM,OAAA,GAAU,OAAO,OAAA,IAAW,EAAA;AAClC,QAAA,MAAM,QAAA,GAAW,OAAO,IAAA,IAAQ,SAAA;AAChC,QAAA,MAAM,OAAA,GAAU,OAAO,MAAA,KAAW,OAAA;AAElC,QAAA,MAAA,CAAO,IAAA,CAAK,eAAe,aAAA,EAAe;AAAA,UACxC,IAAA,EAAM,QAAA;AAAA,UACN,MAAA,EAAQ,OAAA;AAAA,UACR;AAAA,SACD,CAAC,CAAA;AACF,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,aAAA,IAAiB,OAAO,KAAA,CAAM,kBAAkB,QAAA,EAAU;AAClE,IAAA,MAAM,YAAY,KAAA,CAAM,aAAA;AACxB,IAAA,IAAI,UAAU,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAA,EAAG;AAE3D,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,QAAA,CAAS,MAAA,CAAO,WAAW,CAAA;AAExD,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,MAAM,MAAA,GAAS,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA;AAG/C,QAAA,MAAM,SAAA,GAAY,iBAAiB,MAAM,CAAA;AACzC,QAAA,IAAI,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACrC,UAAA,MAAMY,SAAAA,GAAW,UAAU,CAAC,CAAA;AAG5B,UAAA,IAAI,mBAAA,CAAoBA,SAAAA,CAAS,IAAI,CAAA,EAAG;AACtC,YAAA,MAAA,CAAO,IAAA,CAAK,eAAe,gBAAA,EAAkB;AAAA,cAC3C,WAAWA,SAAAA,CAAS,IAAA;AAAA,cACpB,IAAA,EAAOA,SAAAA,CAAS,IAAA,CAAK,IAAA,IAAmB,EAAA;AAAA,cACxC,OAAA,EAAS;AAAA,aACV,CAAC,CAAA;AAAA,UACJ,CAAA,MAAO;AACL,YAAA,MAAA,CAAO,IAAA,CAAK,eAAe,WAAA,EAAa;AAAA,cACtC,MAAMA,SAAAA,CAAS,IAAA;AAAA,cACf,MAAMA,SAAAA,CAAS;AAAA,aAChB,CAAC,CAAA;AAAA,UACJ;AACA,UAAA,OAAO,MAAA;AAAA,QACT;AAGA,QAAA,MAAM,OAAA,GAAU,sBAAsB,MAAM,CAAA;AAC5C,QAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,IAAA,EAAK,EAAG;AAC7B,UAAA,MAAA,CAAO,IAAA,CAAK,eAAe,SAAA,EAAW;AAAA,YACpC,OAAA;AAAA,YACA,IAAA,EAAM,WAAA;AAAA,YACN,UAAA,EAAY;AAAA,WACb,CAAC,CAAA;AACF,UAAA,OAAO,MAAA;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACvE,IAAA,MAAA,CAAO,IAAA,CAAK,eAAe,aAAA,EAAe;AAAA,MACxC,OAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,GAAG,GAAA,MAAS;AAAA,QAClC,EAAA,EAAI,CAAA,CAAE,EAAA,IAAM,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA;AAAA,QACvB,IAAA,EAAM,EAAE,IAAA,IAAQ,EAAA;AAAA,QAChB,MAAA,EAAQ,EAAE,MAAA,IAAU;AAAA,OACtB,CAAE;AAAA,KACH,CAAC,CAAA;AACF,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,QAAA;AAC1C,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,QAAA,GAAW,SAAS,IAAA,IAAQ,SAAA;AAClC,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,IAAA,IAAQ,EAAC;AAEnC,IAAA,IAAI,mBAAA,CAAoB,QAAQ,CAAA,EAAG;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,eAAe,gBAAA,EAAkB;AAAA,QAC3C,SAAA,EAAW,QAAA;AAAA,QACX,IAAA,EAAO,SAAS,IAAA,IAAmB,EAAA;AAAA,QACnC,OAAA,EAAS;AAAA,OACV,CAAC,CAAA;AAAA,IACJ,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,IAAA,CAAK,eAAe,WAAA,EAAa;AAAA,QACtC,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACP,CAAC,CAAA;AAAA,IACJ;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,UAAA;AAC9C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAA,CAAO,IAAA,CAAK,eAAe,aAAA,EAAe;AAAA,MACxC,IAAA,EAAM,WAAW,IAAA,IAAQ,SAAA;AAAA,MACzB,QAAQ,UAAA,CAAW,MAAA;AAAA,MACnB,OAAA,EAAS;AAAA,KACV,CAAC,CAAA;AACF,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAM,QAAA,IAAY,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,EAAG;AACnD,IAAA,MAAM,cAAc,KAAA,CAAM,QAAA,CAAS,KAAA,CAAM,QAAA,CAAS,SAAS,CAAC,CAAA;AAC5D,IAAA,IAAI,WAAA,IAAe,OAAO,WAAA,KAAgB,QAAA,EAAU;AAClD,MAAA,MAAA,CAAO,IAAA,CAAK,eAAe,SAAA,EAAW;AAAA,QACpC,OAAA,EAAS,YAAY,OAAA,IAAW,EAAA;AAAA,QAChC,IAAA,EAAO,YAAY,IAAA,IAA4C,WAAA;AAAA,QAC/D,UAAA,EAAY;AAAA,OACb,CAAC,CAAA;AACF,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,aAAa,KAAA,EAA+B;AAC1D,EAAA,OAAO,eAAA,IAAmB,KAAA,IAAS,KAAA,CAAM,aAAA,KAAkB,MAAA;AAC7D;AAKO,SAAS,oBAAA,CAAqB,OAAsB,QAAA,EAQzD;AACA,EAAA,MAAM,aAAa,KAAA,CAAM,aAAA;AACzB,EAAA,MAAM,iBAKD,EAAC;AAEN,EAAA,KAAA,MAAW,EAAA,IAAM,UAAA,IAAc,EAAC,EAAG;AAEjC,IAAA,IAAI,EAAA,CAAG,KAAA,EAAO,cAAA,IAAkB,EAAA,CAAG,OAAO,aAAA,EAAe;AACvD,MAAA,MAAM,EAAE,cAAA,EAAgB,OAAA,EAAS,aAAA,KAAkB,EAAA,CAAG,KAAA;AACtD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,QAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,QAAA,MAAM,MAAA,GAAS,cAAc,CAAC,CAAA;AAC9B,QAAA,cAAA,CAAe,IAAA,CAAK;AAAA,UAClB,IAAA,EAAM,OAAO,IAAA,IAAQ,SAAA;AAAA,UACrB,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,EAAC;AAAA,UACtB,aAAa,MAAA,CAAO,WAAA;AAAA,UACpB,kBAAmB,MAAA,EAAQ,gBAAA,IAA0D,CAAC,SAAA,EAAW,QAAQ,QAAQ;AAAA,SAClH,CAAA;AAAA,MACH;AAAA,IACF,CAAA,MAAA,IAES,GAAG,MAAA,EAAQ;AAClB,MAAA,cAAA,CAAe,IAAA,CAAK;AAAA,QAClB,IAAA,EAAM,EAAA,CAAG,MAAA,CAAO,IAAA,IAAQ,SAAA;AAAA,QACxB,IAAA,EAAM,EAAA,CAAG,MAAA,CAAO,SAAA,IAAa,EAAC;AAAA,QAC9B,kBAAmB,EAAA,CAAG,MAAA,EAAQ,oBAA0D,CAAC,SAAA,EAAW,QAAQ,QAAQ;AAAA,OACrH,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,UAAU,cAAA,EAAe;AACpC;AAKO,SAAS,aAAa,KAAA,EAA+B;AAE1D,EAAA,IAAI,KAAA,CAAM,KAAA,EAAO,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA,EAAG;AAC1F,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,IAAW,SAAS,KAAA,CAAM,OAAA,CAAQ,MAAM,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AAChF;AAKO,SAAS,gBAAgB,KAAA,EAA+B;AAC7D,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,QAAA;AAC1C,EAAA,IAAI,UAAU,IAAA,IAAQ,mBAAA,CAAoB,QAAA,CAAS,IAAI,GAAG,OAAO,IAAA;AAGjE,EAAA,IAAI,KAAA,CAAM,eAAe,QAAA,EAAU;AACjC,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,aAAA,CAAc,QAAA,CAAS,OAAO,WAAW,CAAA;AAClE,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,YAAY,gBAAA,CAAiB,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAA4B,CAAA;AAC/F,MAAA,IAAI,SAAA,IAAa,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACrC,QAAA,OAAO,mBAAA,CAAoB,SAAA,CAAU,CAAC,CAAA,CAAE,IAAI,CAAA;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,qBAAqB,KAAA,EAG5B;AACP,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,QAAA;AAC1C,EAAA,IAAI,QAAA,EAAU,IAAA,IAAQ,mBAAA,CAAoB,QAAA,CAAS,IAAI,CAAA,EAAG;AACxD,IAAA,OAAO;AAAA,MACL,WAAW,QAAA,CAAS,IAAA;AAAA,MACpB,IAAA,EAAO,QAAA,CAAS,IAAA,EAAM,IAAA,IAAmB;AAAA,KAC3C;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,eAAe,QAAA,EAAU;AACjC,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,aAAA,CAAc,QAAA,CAAS,OAAO,WAAW,CAAA;AAClE,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,MAAM,YAAY,gBAAA,CAAiB,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAA4B,CAAA;AAC/F,MAAA,IAAI,SAAA,IAAa,UAAU,MAAA,GAAS,CAAA,IAAK,oBAAoB,SAAA,CAAU,CAAC,CAAA,CAAE,IAAI,CAAA,EAAG;AAC/E,QAAA,OAAO;AAAA,UACL,SAAA,EAAW,SAAA,CAAU,CAAC,CAAA,CAAE,IAAA;AAAA,UACxB,IAAA,EAAO,SAAA,CAAU,CAAC,CAAA,CAAE,KAAK,IAAA,IAAmB;AAAA,SAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;AC9eO,IAAM,oBAAA,GAA+B;AAAA,EAC1C,IAAA,EAAM,gBAAA;AAAA,EACN,WAAA,EAAa,YAAA;AAAA,EACb,MAAA,EAAQ;AAAA,IACN,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IAC7C,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACjD,EAAE,IAAA,EAAM,kBAAA,EAAoB,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,CAAC,YAAA,EAAc,WAAA,EAAa,YAAY,CAAA,EAAG,OAAA,EAAS,YAAA,EAAa;AAAA,IACnH,EAAE,IAAA,EAAM,iBAAA,EAAmB,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,CAAC,QAAA,EAAU,SAAA,EAAW,MAAM,CAAA,EAAG,OAAA,EAAS,QAAA,EAAS;AAAA,IAClG,EAAE,IAAA,EAAM,mBAAA,EAAqB,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,QAAA,EAAS,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IACpG,EAAE,IAAA,EAAM,gBAAA,EAAkB,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IAChG,EAAE,IAAA,EAAM,cAAA,EAAgB,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IAC7F,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,WAAA,EAAY;AAAA,IACvC,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,QAAA,EAAU,SAAS,GAAA;AAAI;AAEvD,CAAA;AAKO,IAAM,uBAAA,GAAkC;AAAA,EAC7C,IAAA,EAAM,mBAAA;AAAA,EACN,WAAA,EAAa,YAAA;AAAA,EACb,MAAA,EAAQ;AAAA,IACN,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IAC7C,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACjD,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACnD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACjD,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IAC1F,EAAE,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,QAAA,EAAS,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IAC3F,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,WAAA,EAAa,UAAU,IAAA,EAAK;AAAA,IACvD,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,WAAA,EAAY;AAAA,IACzC,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,SAAA,EAAW,SAAS,KAAA;AAAM;AAEvD,CAAA;AAKO,IAAM,oBAAA,GAA+B;AAAA,EAC1C,IAAA,EAAM,gBAAA;AAAA,EACN,WAAA,EAAa,YAAA;AAAA,EACb,MAAA,EAAQ;AAAA,IACN,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IAC7C,EAAE,IAAA,EAAM,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IAChD,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,IACjD,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,QAAA,EAAS;AAAA,IACtC,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,QAAA,EAAS;AAAA,IACtC,EAAE,IAAA,EAAM,kBAAA,EAAoB,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAA,EAAS,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IAClG,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,IAAA,EAAM,YAAA,EAAc,IAAA,EAAM,QAAA,EAAS,EAAG,OAAA,EAAS,EAAC,EAAE;AAAA,IACjG,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,QAAQ,MAAA,EAAQ,CAAC,UAAA,EAAY,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,UAAU,CAAA,EAAG,SAAS,UAAA,EAAW;AAAA,IACvH,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAA,EAAM,WAAA,EAAa,UAAU,IAAA;AAAK;AAE/D,CAAA;AAUO,IAAM,mBAAA,GAAqC;AAAA,EAChD,IAAA,EAAM,aAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,sGAAA;AAAA,EACb,QAAA,EAAU;AAAA,IACR;AAAA,MACE,IAAA,EAAM,sBAAA;AAAA,MACN,MAAA,EAAQ,oBAAA;AAAA,MACR,QAAQ,EAAC;AAAA,MACT,OAAO;AAAC,KACV;AAAA,IACA;AAAA,MACE,IAAA,EAAM,yBAAA;AAAA,MACN,MAAA,EAAQ,uBAAA;AAAA,MACR,QAAQ,EAAC;AAAA,MACT,OAAO;AAAC,KACV;AAAA,IACA;AAAA,MACE,IAAA,EAAM,sBAAA;AAAA,MACN,MAAA,EAAQ,oBAAA;AAAA,MACR,QAAQ,EAAC;AAAA,MACT,OAAO;AAAC;AACV;AAEJ;;;AC6BO,IAAM,gBAAN,MAAoB;AAAA,EAWzB,YAAY,OAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,KAAK,OAAA,CAAQ,EAAA;AAClB,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAQ,eAAA,IAAmB,oBAAA;AAClD,IAAA,IAAA,CAAK,qBAAA,GACH,QAAQ,qBAAA,IAAyB,0BAAA;AACnC,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,uBAAA;AACxD,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,uBAAA;AACxD,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,uBAAA;AACxD,IAAA,IAAA,CAAK,oBAAA,GAAuB,QAAQ,oBAAA,IAAwB,yBAAA;AAC5D,IAAA,IAAA,CAAK,yBAAA,GAA4B,QAAQ,yBAAA,IAA6B,+BAAA;AACtE,IAAA,IAAA,CAAK,qBAAA,GAAwB,QAAQ,qBAAA,IAAyB,0BAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,mBAAmB,MAAA,EAAgD;AACvE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,eAAe,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA,CAAE,GAAA,EAAI;AAC3E,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACxB,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAA,EAAiC,CAAA;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CACJ,MAAA,EACA,WAAA,EACe;AACf,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,kBAAA,CAAmB,MAAM,CAAA;AACrD,IAAA,MAAM,MAAA,GAAyB;AAAA,MAC7B,IAAI,QAAA,EAAU,EAAA,IAAM,CAAA,KAAA,EAAQ,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,MACtC,MAAA;AAAA,MACA,gBAAA,EAAkB,WAAA,CAAY,gBAAA,IAAoB,QAAA,EAAU,gBAAA,IAAoB,YAAA;AAAA,MAChF,eAAA,EAAiB,WAAA,CAAY,eAAA,IAAmB,QAAA,EAAU,eAAA,IAAmB,QAAA;AAAA,MAC7E,iBAAA,EAAmB;AAAA,QACjB,GAAI,QAAA,EAAU,iBAAA,IAAqB,EAAC;AAAA,QACpC,GAAI,WAAA,CAAY,iBAAA,IAAqB;AAAC,OACxC;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,GAAI,QAAA,EAAU,cAAA,IAAkB,EAAC;AAAA,QACjC,GAAI,WAAA,CAAY,cAAA,IAAkB;AAAC,OACrC;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,GAAI,QAAA,EAAU,YAAA,IAAgB,EAAC;AAAA,QAC/B,GAAI,WAAA,CAAY,YAAA,IAAgB;AAAC,OACnC;AAAA,MACA,SAAA,EAAW,QAAA,EAAU,SAAA,oBAAa,IAAI,IAAA,EAAK;AAAA,MAC3C,UAAA,EAAY,WAAA,CAAY,UAAA,IAAc,QAAA,EAAU,UAAA,IAAc;AAAA,KAChE;AACA,IAAA,MAAM,IAAA,CAAK,EAAA,CACR,UAAA,CAAW,IAAA,CAAK,eAAe,CAAA,CAC/B,GAAA,CAAI,MAAM,CAAA,CACV,GAAA,CAAI,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAC,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,CACJ,MAAA,EACA,OAAA,EACiB;AACjB,IAAA,MAAM,SAAA,GAAY,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC1E,IAAA,MAAM,WAAA,GAAiC;AAAA,MACrC,EAAA,EAAI,SAAA;AAAA,MACJ,MAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,GAAG;AAAA,KACL;AACA,IAAA,MAAM,IAAA,CAAK,EAAA,CACR,UAAA,CAAW,IAAA,CAAK,qBAAqB,CAAA,CACrC,GAAA,CAAI,SAAS,CAAA,CACb,GAAA,CAAI,IAAA,CAAK,gBAAA,CAAiB,WAAW,CAAC,CAAA;AACzC,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,SAAA,EAAsD;AAC/E,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,qBAAqB,CAAA,CAAE,GAAA,CAAI,SAAS,CAAA,CAAE,GAAA,EAAI;AACpF,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACxB,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,EAAiC,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAA,CACJ,MAAA,EACA,KAAA,GAAgB,EAAA,EACc;AAC9B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CACzB,WAAW,IAAA,CAAK,qBAAqB,EACrC,KAAA,CAAM,QAAA,EAAU,MAAM,MAAM,CAAA,CAC5B,QAAQ,WAAA,EAAa,MAAM,EAC3B,KAAA,CAAM,KAAK,EACX,GAAA,EAAI;AACP,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,KAAK,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,CAAC,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAA,CACJ,SAAA,EACA,MAAA,EACA,gBAAA,EACe;AACf,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,qBAAqB,CAAA,CAAE,GAAA,CAAI,SAAS,CAAA,CAAE,GAAA,EAAI;AACpF,IAAA,IAAI,CAAC,IAAI,MAAA,EAAQ;AAEjB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,IAAA,MAAM,IAAA,CAAK,GACR,UAAA,CAAW,IAAA,CAAK,qBAAqB,CAAA,CACrC,GAAA,CAAI,SAAS,CAAA,CACb,GAAA,CAAI;AAAA,MACH,GAAG,IAAA;AAAA,MACH,OAAA,EAAS,MAAA;AAAA,MACT,WAAA,sBAAiB,IAAA,EAAK;AAAA,MACtB,GAAI,gBAAA,IAAoB,EAAE,gBAAA;AAAiB,KAC5C,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,kBAAkB,KAAA,EAA+C;AACrE,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,kBAAkB,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,CAAE,GAAA,EAAI;AAC7E,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACxB,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,EAAiC,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CACJ,KAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,iBAAA,CAAkB,KAAK,CAAA;AACnD,IAAA,IAAI,CAAC,QAAA,EAAU;AAEb,MAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,QAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,MACxE;AACA,MAAA,MAAM,UAAA,GAA6B;AAAA,QACjC,EAAA,EAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,QACrB,KAAA;AAAA,QACA,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,gBAAA,EAAkB,MAAA,CAAO,gBAAA,IAAoB,EAAC;AAAA,QAC9C,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,EAAC;AAAA,QACpC,MAAA,EAAQ,OAAO,MAAA,IAAU,UAAA;AAAA,QACzB,aAAA,sBAAmB,IAAA,EAAK;AAAA,QACxB,GAAI,MAAA,CAAO,WAAA,IAAe,EAAE,WAAA,EAAa,OAAO,WAAA,EAAY;AAAA,QAC5D,GAAI,MAAA,CAAO,WAAA,IAAe,EAAE,WAAA,EAAa,OAAO,WAAA;AAAY,OAC9D;AACA,MAAA,MAAM,IAAA,CAAK,EAAA,CACR,UAAA,CAAW,IAAA,CAAK,kBAAkB,CAAA,CAClC,GAAA,CAAI,KAAK,CAAA,CACT,GAAA,CAAI,IAAA,CAAK,gBAAA,CAAiB,UAAU,CAAC,CAAA;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAyB;AAAA,MAC7B,GAAG,QAAA;AAAA,MACH,gBAAA,EAAkB;AAAA,QAChB,GAAG,QAAA,CAAS,gBAAA;AAAA,QACZ,GAAI,MAAA,CAAO,gBAAA,IAAoB;AAAC,OAClC;AAAA,MACA,WAAA,EAAa;AAAA,QACX,GAAG,QAAA,CAAS,WAAA;AAAA,QACZ,GAAI,MAAA,CAAO,WAAA,IAAe;AAAC,OAC7B;AAAA,MACA,aAAA,sBAAmB,IAAA,EAAK;AAAA,MACxB,GAAI,MAAA,CAAO,WAAA,IAAe,EAAE,WAAA,EAAa,OAAO,WAAA,EAAY;AAAA,MAC5D,GAAI,MAAA,CAAO,WAAA,IAAe,EAAE,WAAA,EAAa,OAAO,WAAA,EAAY;AAAA,MAC5D,GAAI,MAAA,CAAO,MAAA,IAAU,EAAE,MAAA,EAAQ,OAAO,MAAA;AAAO,KAC/C;AACA,IAAA,MAAM,IAAA,CAAK,EAAA,CACR,UAAA,CAAW,IAAA,CAAK,kBAAkB,CAAA,CAClC,GAAA,CAAI,KAAK,CAAA,CACT,GAAA,CAAI,IAAA,CAAK,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,qBAAA,CACJ,MAAA,EACA,SAAA,EACA,SACA,OAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACzC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CACzB,UAAA,CAAW,IAAA,CAAK,kBAAkB,CAAA,CAClC,GAAA,CAAI,UAAU,CAAA,CACd,GAAA,EAAI;AAEP,IAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,MAAA,MAAM,QAAA,GAA4B;AAAA,QAChC,MAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA,EAAY,CAAA;AAAA,QACZ,YAAA,EAAc,OAAA,KAAY,SAAA,GAAY,CAAA,GAAI,CAAA;AAAA,QAC1C,YAAA,EAAc,OAAA,KAAY,SAAA,GAAY,CAAA,GAAI,CAAA;AAAA,QAC1C,QAAA,EAAU,OAAA,GAAU,CAAC,OAAO,IAAI,EAAC;AAAA,QACjC,UAAA,sBAAgB,IAAA,EAAK;AAAA,QACrB,SAAA,sBAAe,IAAA;AAAK,OACtB;AACA,MAAA,MAAM,IAAA,CAAK,EAAA,CACR,UAAA,CAAW,IAAA,CAAK,kBAAkB,EAClC,GAAA,CAAI,UAAU,CAAA,CACd,GAAA,CAAI,QAA8C,CAAA;AAAA,IACvD,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,EAAK;AAC3B,MAAA,MAAM,QAAA,GAA4B;AAAA,QAChC,GAAG,IAAA;AAAA,QACH,UAAA,EAAY,KAAK,UAAA,GAAa,CAAA;AAAA,QAC9B,YAAA,EAAc,IAAA,CAAK,YAAA,IAAgB,OAAA,KAAY,YAAY,CAAA,GAAI,CAAA,CAAA;AAAA,QAC/D,YAAA,EAAc,IAAA,CAAK,YAAA,IAAgB,OAAA,KAAY,YAAY,CAAA,GAAI,CAAA,CAAA;AAAA,QAC/D,QAAA,EAAU,OAAA,GAAU,CAAC,GAAI,IAAA,CAAK,YAAY,EAAC,EAAI,OAAO,CAAA,GAAI,IAAA,CAAK,QAAA;AAAA,QAC/D,UAAA,sBAAgB,IAAA;AAAK,OACvB;AACA,MAAA,MAAM,IAAA,CAAK,EAAA,CACR,UAAA,CAAW,IAAA,CAAK,kBAAkB,EAClC,GAAA,CAAI,UAAU,CAAA,CACd,GAAA,CAAI,QAA8C,CAAA;AAAA,IACvD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,MAAA,EAAgB,SAAA,EAAoD;AAC3F,IAAA,MAAM,UAAA,GAAa,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACzC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,kBAAkB,CAAA,CAAE,GAAA,CAAI,UAAU,CAAA,CAAE,GAAA,EAAI;AAClF,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACxB,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,MAAA,EAA4C;AAChE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,EAAA,CACzB,UAAA,CAAW,KAAK,kBAAkB,CAAA,CAClC,KAAA,CAAM,QAAA,EAAU,MAAM,MAAM,CAAA,CAC5B,QAAQ,YAAA,EAAc,MAAM,EAC5B,GAAA,EAAI;AACP,IAAA,OAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAoC,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,cAAA,CACJ,SAAA,EACA,QAAA,EACe;AACf,IAAA,MAAM,UAAA,GAAa,CAAA,GAAA,EAAM,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC1E,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,UAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAG,QAAA;AAAA,MACH,SAAA,sBAAe,IAAA;AAAK,KACtB;AACA,IAAA,MAAM,IAAA,CAAK,EAAA,CACR,UAAA,CAAW,IAAA,CAAK,kBAAkB,EAClC,GAAA,CAAI,UAAU,CAAA,CACd,GAAA,CAAI,YAAkD,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,SAAA,EAA4C;AACnE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,EAAA,CACzB,UAAA,CAAW,KAAK,kBAAkB,CAAA,CAClC,KAAA,CAAM,WAAA,EAAa,MAAM,SAAS,CAAA,CAClC,QAAQ,WAAA,EAAa,MAAM,EAC3B,GAAA,EAAI;AACP,IAAA,OAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAiC,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB,IAAA,EAA+C;AACrE,IAAA,MAAM,eAAA,GAAkB,CAAC,EAAA,KAAsB;AAC7C,MAAA,IAAI,EAAA,YAAc,MAAM,OAAO,EAAA;AAC/B,MAAA,IAAI,OAAO,EAAA,KAAO,QAAA,IAAY,EAAA,KAAO,IAAA,IAAQ,YAAY,EAAA,EAAI;AAC3D,QAAA,OAAQ,GAA0B,MAAA,EAAO;AAAA,MAC3C;AACA,MAAA,OAAO,IAAI,KAAK,EAAqB,CAAA;AAAA,IACvC,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,iBAAA,EAAoB,IAAA,CAAK,iBAAA,IAAkC,EAAC;AAAA,MAC5D,cAAA,EAAiB,IAAA,CAAK,cAAA,IAA+B,EAAC;AAAA,MACtD,YAAA,EAAe,IAAA,CAAK,YAAA,IAA6B,EAAC;AAAA,MAClD,SAAA,EAAW,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAA;AAAA,MACzC,UAAA,EAAa,KAAK,UAAA,IAAyB;AAAA,KAC7C;AAAA,EACF;AAAA,EAEQ,oBAAoB,IAAA,EAA+C;AACzE,IAAA,OAAO,EAAE,GAAG,IAAA,EAAK;AAAA,EACnB;AAAA,EAEQ,aAAa,IAAA,EAAkD;AACrE,IAAA,MAAM,eAAA,GAAkB,CAAC,EAAA,KAAsB;AAC7C,MAAA,IAAI,EAAA,YAAc,MAAM,OAAO,EAAA;AAC/B,MAAA,IAAI,OAAO,EAAA,KAAO,QAAA,IAAY,EAAA,KAAO,IAAA,IAAQ,YAAY,EAAA,EAAI;AAC3D,QAAA,OAAQ,GAA0B,MAAA,EAAO;AAAA,MAC3C;AACA,MAAA,OAAO,IAAI,KAAK,EAAqB,CAAA;AAAA,IACvC,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,QAAA,EAAW,IAAA,CAAK,QAAA,IAAyB,EAAC;AAAA,MAC1C,QAAA,EAAW,IAAA,CAAK,QAAA,IAAyB,EAAC;AAAA,MAC1C,kBAAkB,IAAA,CAAK,gBAAA;AAAA,MACvB,SAAA,EAAW,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAA;AAAA,MACzC,aAAa,IAAA,CAAK,WAAA,GAAc,eAAA,CAAgB,IAAA,CAAK,WAAW,CAAA,GAAI,MAAA;AAAA,MACpE,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AAAA,EAEQ,iBAAiB,OAAA,EAAqD;AAC5E,IAAA,OAAO,EAAE,GAAG,OAAA,EAAQ;AAAA,EACtB;AAAA,EAEQ,aAAa,IAAA,EAA+C;AAClE,IAAA,MAAM,eAAA,GAAkB,CAAC,EAAA,KAAsB;AAC7C,MAAA,IAAI,EAAA,YAAc,MAAM,OAAO,EAAA;AAC/B,MAAA,IAAI,OAAO,EAAA,KAAO,QAAA,IAAY,EAAA,KAAO,IAAA,IAAQ,YAAY,EAAA,EAAI;AAC3D,QAAA,OAAQ,GAA0B,MAAA,EAAO;AAAA,MAC3C;AACA,MAAA,OAAO,IAAI,KAAK,EAAqB,CAAA;AAAA,IACvC,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,gBAAA,EAAmB,IAAA,CAAK,gBAAA,IAAiC,EAAC;AAAA,MAC1D,WAAA,EAAc,IAAA,CAAK,WAAA,IAA4B,EAAC;AAAA,MAChD,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,aAAA,EAAe,eAAA,CAAgB,IAAA,CAAK,aAAa;AAAA,KACnD;AAAA,EACF;AAAA,EAEQ,iBAAiB,OAAA,EAAkD;AACzE,IAAA,OAAO,EAAE,GAAG,OAAA,EAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,uBAAA,CACJ,SAAA,EACA,MAAA,EACA,aAAA,EAOe;AACf,IAAA,MAAM,WAAA,GAAc,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAA;AAC5E,IAAA,MAAM,MAAA,GAA0B;AAAA,MAC9B,WAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAU,aAAA,CAAc,QAAA;AAAA,MACxB,UAAU,aAAA,CAAc,QAAA;AAAA,MACxB,UAAU,aAAA,CAAc,QAAA;AAAA,MACxB,cAAc,aAAA,CAAc,YAAA;AAAA,MAC5B,QAAQ,aAAA,CAAc,MAAA;AAAA,MACtB,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,MAAM,IAAA,CAAK,EAAA,CACR,UAAA,CAAW,IAAA,CAAK,oBAAoB,EACpC,GAAA,CAAI,WAAW,CAAA,CACf,GAAA,CAAI,MAA4C,CAAA;AAGnD,IAAA,MAAM,KAAK,4BAAA,CAA6B,MAAA,EAAQ,aAAA,CAAc,QAAA,EAAU,cAAc,QAAQ,CAAA;AAAA,EAChG;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,SAAA,EAA+C;AACxE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,EAAA,CACzB,UAAA,CAAW,KAAK,oBAAoB,CAAA,CACpC,KAAA,CAAM,WAAA,EAAa,MAAM,SAAS,CAAA,CAClC,QAAQ,WAAA,EAAa,MAAM,EAC3B,GAAA,EAAI;AACP,IAAA,OAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAoC,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,MAAA,EAAgB,KAAA,GAAgB,EAAA,EAAgC;AACtF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CACzB,WAAW,IAAA,CAAK,oBAAoB,EACpC,KAAA,CAAM,QAAA,EAAU,MAAM,MAAM,CAAA,CAC5B,QAAQ,WAAA,EAAa,MAAM,EAC3B,KAAA,CAAM,KAAK,EACX,GAAA,EAAI;AACP,IAAA,OAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAoC,CAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBAAA,CAA0B,MAAA,EAAgB,QAAA,EAA0D;AACxG,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACpC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,yBAAyB,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA,CAAE,GAAA,EAAI;AACrF,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,OAAO,IAAA;AACxB,IAAA,OAAO,IAAI,IAAA,EAAK;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,4BAAA,CACZ,MAAA,EACA,QAAA,EACA,QAAA,EACe;AACf,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACpC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,yBAAyB,CAAA,CAAE,GAAA,CAAI,MAAM,CAAA,CAAE,GAAA,EAAI;AAE1F,IAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,MAAA,MAAM,IAAA,GAA+B;AAAA,QACnC,MAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAa,QAAA,KAAa,UAAA;AAAA,QAC1B,UAAA,EAAY,QAAA,KAAa,UAAA,GAAa,GAAA,GAAM,CAAA;AAAA,QAC5C,aAAA,EAAe,QAAA,KAAa,UAAA,GAAa,CAAA,GAAI,CAAA;AAAA,QAC7C,aAAA,EAAe,QAAA,KAAa,UAAA,GAAa,CAAA,GAAI,CAAA;AAAA,QAC7C,cAAA,sBAAoB,IAAA;AAAK,OAC3B;AACA,MAAA,MAAM,IAAA,CAAK,EAAA,CACR,UAAA,CAAW,IAAA,CAAK,yBAAyB,EACzC,GAAA,CAAI,MAAM,CAAA,CACV,GAAA,CAAI,IAA0C,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,SAAS,IAAA,EAAK;AAC3B,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,aAAA,IAAiB,QAAA,KAAa,aAAa,CAAA,GAAI,CAAA,CAAA;AAC1E,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,aAAA,IAAiB,QAAA,KAAa,aAAa,CAAA,GAAI,CAAA,CAAA;AAC1E,MAAA,MAAM,QAAQ,aAAA,GAAgB,aAAA;AAC9B,MAAA,MAAM,eAAe,aAAA,GAAgB,KAAA;AAErC,MAAA,MAAM,IAAA,GAA+B;AAAA,QACnC,GAAG,IAAA;AAAA,QACH,aAAA;AAAA,QACA,aAAA;AAAA;AAAA,QAEA,WAAA,EAAa,KAAA,IAAS,CAAA,IAAK,YAAA,GAAe,GAAA;AAAA,QAC1C,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,QAAQ,GAAG,CAAA;AAAA,QACtC,cAAA,sBAAoB,IAAA;AAAK,OAC3B;AACA,MAAA,MAAM,IAAA,CAAK,EAAA,CACR,UAAA,CAAW,IAAA,CAAK,yBAAyB,EACzC,GAAA,CAAI,MAAM,CAAA,CACV,GAAA,CAAI,IAA0C,CAAA;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,MAAA,EAAmD;AAC9E,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CACzB,UAAA,CAAW,IAAA,CAAK,yBAAyB,CAAA,CACzC,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,MAAM,EAC5B,GAAA,EAAI;AACP,IAAA,OAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,MAA2C,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CAAsB,MAAA,EAAgB,QAAA,EAAoC;AAC9E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,yBAAA,CAA0B,QAAQ,QAAQ,CAAA;AAClE,IAAA,OAAO,MAAM,WAAA,IAAe,KAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,CACJ,MAAA,EACA,cAAA,EAMe;AACf,IAAA,MAAM,MAAA,GAA2B;AAAA,MAC/B,cAAc,cAAA,CAAe,YAAA;AAAA,MAC7B,UAAU,cAAA,CAAe,QAAA;AAAA,MACzB,MAAA;AAAA,MACA,oBAAoB,cAAA,CAAe,kBAAA;AAAA,MACnC,QAAA,EAAU,cAAA,CAAe,QAAA,IAAY,EAAC;AAAA,MACtC,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,aAAA,EAAe,CAAA;AAAA,MACf,aAAA,EAAe;AAAA,KACjB;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,eAAe,YAAY,CAAA,CAAA;AACtD,IAAA,MAAM,IAAA,CAAK,EAAA,CACR,UAAA,CAAW,IAAA,CAAK,qBAAqB,EACrC,GAAA,CAAI,KAAK,CAAA,CACT,GAAA,CAAI,MAA4C,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,MAAA,EACA,YAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA;AACvC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,qBAAqB,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,CAAE,GAAA,EAAI;AAEhF,IAAA,IAAI,IAAI,MAAA,EAAQ;AACd,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,MAAA,MAAM,IAAA,CAAK,GACR,UAAA,CAAW,IAAA,CAAK,qBAAqB,CAAA,CACrC,GAAA,CAAI,KAAK,CAAA,CACT,GAAA,CAAI;AAAA,QACH,GAAG,IAAA;AAAA,QACH,aAAA,EAAe,KAAK,aAAA,GAAgB,CAAA;AAAA,QACpC,kBAAA,EAAoB,MAAA;AAAA,QACpB,cAAA,sBAAoB,IAAA;AAAK,OACY,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAA,CACJ,MAAA,EACA,YAAA,EACe;AACf,IAAA,MAAM,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA;AACvC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,IAAA,CAAK,qBAAqB,CAAA,CAAE,GAAA,CAAI,KAAK,CAAA,CAAE,GAAA,EAAI;AAEhF,IAAA,IAAI,IAAI,MAAA,EAAQ;AACd,MAAA,MAAM,IAAA,GAAO,IAAI,IAAA,EAAK;AACtB,MAAA,MAAM,IAAA,CAAK,GACR,UAAA,CAAW,IAAA,CAAK,qBAAqB,CAAA,CACrC,GAAA,CAAI,KAAK,CAAA,CACT,GAAA,CAAI;AAAA,QACH,GAAG,IAAA;AAAA,QACH,aAAA,EAAe;AAAA,OACsB,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,MAAA,EACA,KAAA,GAAgB,EAAA,EACa;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CACzB,WAAW,IAAA,CAAK,qBAAqB,EACrC,KAAA,CAAM,QAAA,EAAU,MAAM,MAAM,CAAA,CAC5B,QAAQ,WAAA,EAAa,MAAM,EAC3B,KAAA,CAAM,KAAK,EACX,GAAA,EAAI;AACP,IAAA,OAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAqC,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,QAAA,EAA+C;AACxE,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,EAAA,CACzB,UAAA,CAAW,KAAK,qBAAqB,CAAA,CACrC,KAAA,CAAM,UAAA,EAAY,MAAM,QAAQ,CAAA,CAChC,QAAQ,WAAA,EAAa,MAAM,EAC3B,GAAA,EAAI;AACP,IAAA,OAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAqC,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CACJ,MAAA,EACA,gBAAA,GAA2B,CAAA,EACE;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CACzB,WAAW,IAAA,CAAK,qBAAqB,CAAA,CACrC,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,MAAM,CAAA,CAC5B,KAAA,CAAM,iBAAiB,IAAA,EAAM,gBAAgB,EAC7C,OAAA,CAAQ,eAAA,EAAiB,MAAM,CAAA,CAC/B,GAAA,EAAI;AACP,IAAA,OAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAqC,CAAA;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAA,CACJ,MAAA,EACA,KAAA,GAAgB,EAAA,EACa;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CACzB,UAAA,CAAW,KAAK,qBAAqB,CAAA,CACrC,KAAA,CAAM,QAAA,EAAU,IAAA,EAAM,MAAM,EAC5B,KAAA,CAAM,eAAA,EAAiB,IAAA,EAAM,IAAI,CAAA,CACjC,OAAA,CAAQ,WAAA,EAAa,MAAM,CAAA,CAC3B,KAAA,CAAM,KAAK,CAAA,CACX,GAAA,EAAI;AACP,IAAA,OAAO,SAAS,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,MAAqC,CAAA;AAAA,EAC7E;AACF;;;ACxrBO,IAAM,yBAAN,MAA6B;AAAA,EAKlC,WAAA,CAAY,OAAA,GAAkC,EAAC,EAAG;AAJlD,IAAA,IAAA,CAAQ,SAA4B,EAAC;AACrC,IAAA,IAAA,CAAQ,QAAA,uBAA8C,GAAA,EAAI;AAIxD,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,GAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAAiD;AAC3D,IAAA,MAAM,SAAA,GAA6B;AAAA,MACjC,GAAG,KAAA;AAAA,MACH,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,SAAS,CAAA;AAG1B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,SAAA,EAAW;AACvC,MAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAC,KAAK,SAAS,CAAA;AAAA,IACjD;AAGA,IAAA,IAAA,CAAK,uBAAuB,SAAS,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,WAAmB,MAAA,EAAuB;AACrD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,SAAA,EAAW;AAAA,MAC3B,SAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,aAAA,EAAe,CAAA;AAAA,MACf,YAAA,EAAc,CAAA;AAAA,MACd,cAAA,EAAgB,CAAA;AAAA,MAChB,eAAA,EAAiB,CAAA;AAAA,MACjB,WAAA,EAAa,CAAA;AAAA,MACb,QAAQ,EAAC;AAAA,MACT,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,eAAA;AAAA,MACN,SAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,EAAE,SAAA,EAAW,IAAA,CAAK,KAAI;AAAE,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,SAAA,EAAmB,MAAA,GAAqC,WAAA,EAAmB;AACpF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,OAAA,GAAU,KAAK,GAAA,EAAI;AAC3B,MAAA,OAAA,CAAQ,MAAA,GAAS,MAAA;AAEjB,MAAA,IAAA,CAAK,WAAA,CAAY;AAAA,QACf,IAAA,EAAM,aAAA;AAAA,QACN,SAAA;AAAA,QACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAA,EAAS;AAAA,UACP,MAAA;AAAA,UACA,QAAA,EAAU,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,SAAA;AAAA,UACpC,WAAW,OAAA,CAAQ,aAAA;AAAA,UACnB,UAAU,OAAA,CAAQ;AAAA,SACpB;AAAA,QACA,QAAA,EAAU,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ;AAAA,OACrC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CACE,SAAA,EACA,QAAA,EACA,IAAA,EACA,QAAA,EACM;AACN,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,WAAA;AAAA,MACN,SAAA;AAAA,MACA,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,MAChC;AAAA,KACD,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,aAAA,EAAA;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CACE,SAAA,EACA,KAAA,EACA,MAAA,EACA,QAAA,EACM;AACN,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,UAAA;AAAA,MACN,SAAA;AAAA,MACA,OAAA,EAAS,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,MACzB;AAAA,KACD,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,YAAA,EAAA;AACR,MAAA,OAAA,CAAQ,WAAA,IAAe,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,MAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CACE,SAAA,EACA,KAAA,EACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACf,IAAA,EAAM,OAAA;AAAA,MACN,SAAA;AAAA,MACA,SAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,MAAM,OAAA,EAAQ;AAAA,MAC9C,KAAA,EAAO;AAAA,QACL,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,MAAO,KAAA,CAA4B,IAAA;AAAA,QACnC,OAAO,KAAA,CAAM;AAAA;AACf,KACD,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,OAAO,IAAA,CAAK;AAAA,QAClB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,IAAA,EAAM,MAAM,WAAA,CAAY;AAAA,OACzB,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,CAAU,MAA4B,SAAA,EAAuC;AAC3E,IAAA,IAAI,WAAW,IAAA,CAAK,MAAA;AAEpB,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,SAAS,CAAA;AAAA,IAC3D;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,SAAA,EAAiD;AACnE,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAwC;AACtC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,SAAS,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAA,GAA8C;AAC5C,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAClD,IAAA,MAAM,iBAAiB,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,SAAS,CAAA;AAGlE,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,GAAA,GAAM,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,CAAA;AAC5E,IAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,WAAW,CAAA;AACjE,IAAA,MAAM,YAAY,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,QAAQ,CAAA;AAE3D,IAAA,MAAM,cAAA,GAAiB,QAAQ,MAAA,GAAS,CAAA,GACnC,aAAa,MAAA,GAAS,OAAA,CAAQ,SAAU,GAAA,GACzC,CAAA;AAEJ,IAAA,MAAM,YAAA,GAAe,QAAQ,MAAA,GAAS,CAAA,GACjC,UAAU,MAAA,GAAS,OAAA,CAAQ,SAAU,GAAA,GACtC,CAAA;AAGJ,IAAA,MAAM,iBAAA,GAAoB,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AACxD,IAAA,MAAM,qBAAqB,iBAAA,CAAkB,MAAA,GAAS,IAClD,iBAAA,CAAkB,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,IAAA,CAAQ,CAAA,CAAE,WAAW,GAAA,IAAO,CAAA,CAAE,YAAY,CAAC,CAAA,GAAI,kBAAkB,MAAA,GACtG,CAAA;AAGJ,IAAA,MAAM,qBAAqB,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,CAAC,CAAA;AACjE,IAAA,MAAM,mBAAA,GAAsB,kBAAA,CAAmB,MAAA,GAAS,CAAA,GACpD,mBAAmB,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA,GAAI,mBAAmB,MAAA,GACnF,CAAA;AAEJ,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,GAAA;AAAA,MACX,gBAAgB,cAAA,CAAe,MAAA;AAAA,MAC/B,eAAe,QAAA,CAAS,MAAA;AAAA,MACxB,kBAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAA4C;AAChD,IAAA,MAAM,SAA8B,EAAC;AACrC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,SAAA,EAAW,cAAA;AAAA,MACX,QAAQ,IAAA,CAAK,MAAA,CAAO,SAAS,IAAA,CAAK,SAAA,GAAY,MAAM,SAAA,GAAY,UAAA;AAAA,MAChE,YAAA,EAAc,CAAA;AAAA,MACd,SAAA,EAAW;AAAA,KACZ,CAAA;AAGD,IAAA,MAAM,cAAA,GAAiB,KAAK,iBAAA,EAAkB;AAC9C,IAAA,MAAM,gBAAgB,cAAA,CAAe,MAAA;AAAA,MACnC,CAAA,CAAA,KAAK,GAAA,GAAM,CAAA,CAAE,SAAA,GAAY,KAAK,EAAA,GAAK;AAAA;AAAA,KACrC;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,SAAA,EAAW,UAAA;AAAA,MACX,MAAA,EAAQ,aAAA,CAAc,MAAA,GAAS,EAAA,GAAK,SAAA,GAAY,UAAA;AAAA,MAChD,YAAA,EAAc,CAAA;AAAA,MACd,SAAA,EAAW,GAAA;AAAA,MACX,OAAO,aAAA,CAAc,MAAA,GAAS,IAAI,CAAA,EAAG,aAAA,CAAc,MAAM,CAAA,eAAA,CAAA,GAAoB;AAAA,KAC9E,CAAA;AAED,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAKE;AACA,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,IAAK,CAAA;AAAA;AAAA,MAC/B,UAAU,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,MAC3C,QAAA,EAAU,KAAK,sBAAA,EAAuB;AAAA,MACtC,QAAQ;AAAC;AAAA,KACX;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAS,EAAC;AACf,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAuB,KAAA,EAA8B;AAC3D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,MAAM,SAAS,CAAA;AACjD,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,WAAA;AACH,QAAA,OAAA,CAAQ,cAAA,EAAA;AACR,QAAA;AAAA,MACF,KAAK,iBAAA;AACH,QAAA,OAAA,CAAQ,eAAA,EAAA;AACR,QAAA;AAGA;AACJ,EACF;AACF;AAMA,IAAI,eAAA,GAAiD,IAAA;AAK9C,SAAS,yBAAA,GAAoD;AAClE,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,eAAA,GAAkB,IAAI,sBAAA,EAAuB;AAAA,EAC/C;AACA,EAAA,OAAO,eAAA;AACT;AAKO,SAAS,2BAAA,GAAoC;AAClD,EAAA,eAAA,GAAkB,IAAA;AACpB;AASO,SAAS,YAAY,KAAA,EAAiD;AAC3E,EAAA,yBAAA,EAA0B,CAAE,YAAY,KAAK,CAAA;AAC/C;AAKO,SAAS,yBAAA,CAA0B,WAAmB,MAAA,EAAuB;AAClF,EAAA,yBAAA,EAA0B,CAAE,YAAA,CAAa,SAAA,EAAW,MAAM,CAAA;AAC5D;AAKO,SAAS,uBAAA,CAAwB,WAAmB,MAAA,EAA2C;AACpG,EAAA,yBAAA,EAA0B,CAAE,UAAA,CAAW,SAAA,EAAW,MAAM,CAAA;AAC1D;AAKO,SAAS,sBAAA,GAA8C;AAC5D,EAAA,OAAO,yBAAA,GAA4B,sBAAA,EAAuB;AAC5D;;;AClZO,IAAM,mBAAN,MAAuB;AAAA,EAAvB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,gBAAA,uBAA4C,GAAA,EAAI;AACxD;AAAA,IAAA,IAAA,CAAQ,YAAA,uBAA6C,GAAA,EAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKzD,cAAA,CAAe,UAAkB,MAAA,EAAyB;AACxD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAChD,IAAA,OAAO,KAAA,KAAU,MAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAiB,UAAkB,WAAA,EAA6C;AAC9E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAGhD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB;AAGA,IAAA,IAAI,KAAA,KAAU,YAAY,MAAA,EAAQ;AAChC,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB;AAGA,IAAA,IAAI,WAAA,CAAY,KAAA,EAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AACxC,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB;AAGA,IAAA,IAAI,WAAA,CAAY,YAAA,EAAc,QAAA,CAAS,QAAQ,CAAA,EAAG;AAChD,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,iCAAA;AAAA,MACR,YAAA,EAAc;AAAA,KAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAA,CAAuB,UAAkB,MAAA,EAAsB;AAE7D,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AACxD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,aAAa,CAAA;AAC5D,MAAA,IAAI,gBAAA,EAAkB;AACpB,QAAA,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AAAA,MAClC;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAA,EAAU,MAAM,CAAA;AAG1C,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAA,kBAAQ,IAAI,KAAK,CAAA;AAAA,IACzC;AACA,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA,CAAG,IAAI,QAAQ,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAA,EAA0B;AACxC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAC7C,IAAA,OAAO,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,QAAQ,IAAI,EAAC;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,QAAA,EAAsC;AACpD,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,QAAA,EAAwB;AACpC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAChD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA;AAC5C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AAAA,MAC1B;AAAA,IACF;AACA,IAAA,IAAA,CAAK,gBAAA,CAAiB,OAAO,QAAQ,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAA,EAAyB;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAC7C,IAAA,OAAO,QAAA,GAAW,QAAA,CAAS,IAAA,GAAO,CAAA,GAAI,KAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAAA,EAAwB;AACtC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAC7C,IAAA,OAAO,QAAA,GAAW,SAAS,IAAA,GAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,QAAA,EAAkB,UAAA,EAAoB,QAAA,EAAqC;AAC3F,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAEhD,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,sBAAA,CAAuB,UAAU,QAAQ,CAAA;AAE9C,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CACE,QAAA,EACA,OAAA,EACA,YAAA,EACA,aAA+B,MAAA,EACZ;AACnB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,QAAQ,CAAA;AAEhD,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ;AAAA,OACV;AAAA,IACF;AAMA,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAwB;AACtB,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,iBAAiB,KAAA,EAAM;AAC5B,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CACE,UACA,WAAA,EACuB;AACvB,IAAA,OAAO;AAAA,MACL,GAAG,QAAA;AAAA,MACH,QAAQ,WAAA,CAAY,MAAA;AAAA,MACpB,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,WAAW,WAAA,CAAY,MAAA;AAAA,MACvB,gBAAgB,WAAA,CAAY,MAAA;AAAA,MAC5B,GAAA,EAAK;AAAA,QACH,OAAA,EAAS,CAAC,WAAA,CAAY,MAAM,CAAA;AAAA,QAC5B,OAAA,EAAS,CAAC,WAAA,CAAY,MAAM,CAAA;AAAA,QAC5B,QAAA,EAAU;AAAA;AACZ,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,WAAA,EAAkD;AACpE,IAAA,IAAI,CAAC,WAAA,IAAe,OAAO,WAAA,KAAgB,QAAA,EAAU;AACnD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,GAAA,GAAM,WAAA;AAEZ,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,OAAO,GAAA,CAAI,WAAW,QAAA,EAAU;AACjD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,IAAI,KAAA,KAAU,MAAA,IAAa,OAAO,GAAA,CAAI,UAAU,QAAA,EAAU;AAC5D,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,IAAI,GAAA,CAAI,UAAU,MAAA,IAAa,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AACxD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMA,IAAI,sBAAA,GAAkD,IAAA;AAK/C,SAAS,mBAAA,GAAwC;AACtD,EAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,IAAA,sBAAA,GAAyB,IAAI,gBAAA,EAAiB;AAAA,EAChD;AACA,EAAA,OAAO,sBAAA;AACT;AAKO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,sBAAA,GAAyB,IAAA;AAC3B;AASO,SAAS,iBAAA,CACd,MAAA,EACA,OAAA,GAGI,EAAC,EACQ;AACb,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,KAAA,EAAO,OAAA,CAAQ,KAAA,IAAS,CAAC,MAAM;AAAA,GACjC;AACF;AAKO,SAAS,QAAQ,WAAA,EAAmC;AACzD,EAAA,OAAO,WAAA,CAAY,KAAA,EAAO,QAAA,CAAS,OAAO,CAAA,IAAK,KAAA;AACjD;AAKO,SAAS,gBAAA,CACd,QAAA,EACA,WAAA,EACA,OAAA,GAA4B,qBAAoB,EAC1C;AACN,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,gBAAA,CAAiB,QAAA,EAAU,WAAW,CAAA;AAC5D,EAAA,IAAI,CAAC,MAAM,OAAA,EAAS;AAClB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,eAAA,EAAkB,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,EAClD;AACF;ACrPO,IAAM,gBAAA,GAAN,cAA+B,YAAA,CAAa;AAAA,EAMjD,WAAA,CAAY,MAAA,GAAmC,EAAC,EAAG;AACjD,IAAA,KAAA,EAAM;AALR,IAAA,IAAA,CAAQ,cAAA,GAAiB,CAAA;AACzB,IAAA,IAAA,CAAQ,iBAAqC,EAAC;AAC9C,IAAA,IAAA,CAAQ,aAAA,GAAuC,IAAA;AAI7C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,OAAA,EAAS,OAAO,OAAA,IAAW,IAAA;AAAA,MAC3B,gBAAA,EAAkB,OAAO,gBAAA,IAAoB,iBAAA;AAAA,MAC7C,gBAAA,EAAkB,OAAO,gBAAA,IAAoB,GAAA;AAAA,MAC7C,UAAA,EAAY,OAAO,UAAA,IAAc,CAAA;AAAA,MACjC,QAAA,EAAU,MAAA,CAAO,QAAA,IAAY,IAAA,CAAK,gBAAA;AAAiB,KACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CACE,IAAA,EACA,QAAA,EACA,OAAA,EACA,MAAA,EACM;AACN,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS;AAE1B,IAAA,MAAM,KAAA,GAA0B;AAAA,MAC9B,IAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA;AAAA,MACA,OAAA,EAAS,KAAK,mBAAA,EAAoB;AAAA,MAClC,cAAA,EAAgB,KAAK,MAAA,CAAO;AAAA,KAC9B;AAGA,IAAA,IAAA,CAAK,cAAA,CAAe,KAAK,KAAK,CAAA;AAG9B,IAAA,IAAA,CAAK,IAAA,CAAK,eAAe,KAAK,CAAA;AAG9B,IAAA,IAAA,CAAK,YAAA,EAAa;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,KAAA,EAA+B;AAEjD,IAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU;AAGnD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AAE1C,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,gBAAA,CAAiB,KAAA,EAAO,SAAS,CAAA;AAEzD,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,IAAA,CAAK,IAAA,CAAK,iBAAA,EAAmB,UAAA,CAAW,YAAA,EAAc,KAAK,CAAA;AAAA,MAC7D,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,SAAA,EAAW,KAAK,CAAA;AAAA,MAChD;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CACE,UACA,KAAA,EAKmB;AACnB,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,YAAY,KAAA,CAAM,UAAA;AAAA,MAClB,iBAAiB,KAAA,CAAM,eAAA;AAAA,MACvB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,OAAA,EAAS,KAAK,mBAAA,EAAoB;AAAA,MAClC,WAAA,EAAa,KAAK,GAAA;AAAI,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,CAAgB,GAAkB,CAAA,EAA0B;AAC1D,IAAA,IAAI,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAA,EAAW,OAAO,EAAA;AACtC,IAAA,IAAI,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAA,EAAW,OAAO,CAAA;AACtC,IAAA,IAAI,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAA,EAAU,OAAO,EAAA;AACpC,IAAA,IAAI,CAAA,CAAE,QAAA,GAAW,CAAA,CAAE,QAAA,EAAU,OAAO,CAAA;AACpC,IAAA,OAAO,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,eAAe,MAAA,GAAS,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA0C;AACxC,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAA,CAAK,cAAc,CAAA;AACvC,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA6B;AAC3B,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAwC;AACnD,IAAA,IAAA,CAAK,SAAS,EAAE,GAAG,IAAA,CAAK,MAAA,EAAQ,GAAG,MAAA,EAAO;AAC1C,IAAA,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,IAAA,CAAK,MAAM,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,YAAA,CAAa,KAAK,aAAa,CAAA;AAC/B,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AAAA,IACvB;AACA,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,iBAAiB,EAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAA,GAA2B;AACjC,IAAA,OAAO,CAAA,OAAA,EAAU,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACvE;AAAA,EAEQ,mBAAA,GAAqC;AAC3C,IAAA,IAAA,CAAK,cAAA,EAAA;AACL,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,UAAU,IAAA,CAAK,cAAA;AAAA,MACf,MAAA,EAAQ,KAAK,MAAA,CAAO;AAAA,KACtB;AAAA,EACF;AAAA,EAEQ,YAAA,GAAqB;AAC3B,IAAA,IAAI,KAAK,aAAA,EAAe;AAExB,IAAA,IAAA,CAAK,aAAA,GAAgB,WAAW,MAAM;AACpC,MAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,MAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAClC,QAAA,IAAA,CAAK,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,mBAAA,EAAqB,CAAA;AAAA,MACtD;AAAA,IACF,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,gBAAgB,CAAA;AAAA,EACjC;AAAA,EAEQ,cAAc,QAAA,EAAgD;AAEpE,IAAA,OAAO,KAAK,cAAA,CAAe,MAAA;AAAA,MAAO,CAAA,KAAA,KAChC,KAAA,CAAM,QAAA,KAAa,QAAA,CAAS,YAC5B,KAAA,CAAM,IAAA,KAAS,QAAA,CAAS,IAAA,IACxB,KAAK,eAAA,CAAgB,KAAA,CAAM,OAAA,EAAS,QAAA,CAAS,OAAO,CAAA,KAAM;AAAA,KAC5D;AAAA,EACF;AAAA,EAEQ,gBAAA,CACN,UACA,SAAA,EACoB;AACpB,IAAA,QAAQ,IAAA,CAAK,OAAO,gBAAA;AAAkB,MACpC,KAAK,iBAAA;AAEH,QAAA,IAAI,YAAA,GAAe,QAAA;AACnB,QAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,UAAA,IAAI,KAAK,eAAA,CAAgB,QAAA,CAAS,SAAS,YAAA,CAAa,OAAO,IAAI,CAAA,EAAG;AACpE,YAAA,YAAA,GAAe,QAAA;AAAA,UACjB;AAAA,QACF;AACA,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,IAAA;AAAA,UACV,QAAA,EAAU;AAAA,SACZ;AAAA,MAEF,KAAK,QAAA;AAEH,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,KAAA;AAAA,UACV,QAAA,EAAU,QAAA;AAAA,UACV,SAAA,EAAW,UAAU,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,QAAA,EAAS,CAAE;AAAA,SACnE;AAAA,MAEF,KAAK,OAAA;AAAA,MACL;AAEE,QAAA,OAAO;AAAA,UACL,QAAA,EAAU,UAAU,MAAA,KAAW,CAAA;AAAA,UAC/B,QAAA,EAAU,SAAA,CAAU,MAAA,KAAW,CAAA,GAAI,OAAA,GAAU,QAAA;AAAA,UAC7C,SAAA,EAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAC1B,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,OAAA,EAAS,CAAA,EAAG,OAAA,EAAS,QAAA,GAAW,CAAA,GACtD;AAAA,SACN;AAAA;AACJ,EACF;AACF;AAMA,IAAI,sBAAA,GAAkD,IAAA;AAK/C,SAAS,oBAAoB,MAAA,EAAqD;AACvF,EAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,IAAA,sBAAA,GAAyB,IAAI,iBAAiB,MAAM,CAAA;AAAA,EACtD;AACA,EAAA,OAAO,sBAAA;AACT;AAKO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,sBAAA,EAAwB,OAAA,EAAQ;AAChC,EAAA,sBAAA,GAAyB,IAAA;AAC3B;AASO,SAAS,QAAA,CACd,EAAA,EACA,WAAA,EACA,OAAA,EAKG;AACH,EAAA,QAAQ,IAAI,IAAA,KAAoB;AAC9B,IAAA,MAAM,MAAA,GAAS,EAAA,CAAG,GAAG,IAAI,CAAA;AAGzB,IAAA,WAAA,CAAY,iBAAA;AAAA,MACV,OAAA,CAAQ,IAAA;AAAA,MACR,OAAA,CAAQ,QAAA;AAAA,MACR,OAAA,CAAQ,UAAA,CAAW,GAAG,IAAI;AAAA,KAC5B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAKO,SAAS,YAAA,CACd,WAAA,EACA,KAAA,GAAgB,GAAA,EACqE;AACrF,EAAA,IAAI,OAAA,GAAiC,IAAA;AACrC,EAAA,IAAI,OAAA,GAAgG,IAAA;AAEpG,EAAA,OAAO,CAAC,IAAA,EAAM,QAAA,EAAU,OAAA,KAAY;AAClC,IAAA,OAAA,GAAU,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAQ;AAEpC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,IACtB;AAEA,IAAA,OAAA,GAAU,WAAW,MAAM;AACzB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,WAAA,CAAY,kBAAkB,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,QAAA,EAAU,QAAQ,OAAO,CAAA;AAC7E,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ;AACA,MAAA,OAAA,GAAU,IAAA;AAAA,IACZ,GAAG,KAAK,CAAA;AAAA,EACV,CAAA;AACF;;;ACzZA,IAAM,2BAAA,GAA8B;AAAA,EAClC,KAAA;AAAA,EAAO,8BAAA;AAAA,EACP,iBAAA;AAAA,EAAmB,mBAAA;AAAA,EAAqB,iBAAA;AAAA,EACxC,SAAA;AAAA,EAAW,cAAA;AAAA,EAAgB,kBAAA;AAAA,EAC3B,oBAAA;AAAA,EAAsB,mBAAA;AAAA,EACtB,cAAA;AAAA,EAAgB,sBAAA;AAAA,EAChB,cAAA;AAAA,EAAgB,aAAA;AAAA,EAChB,iBAAA;AAAA,EAAmB,KAAA;AAAA,EAAO,kBAAA;AAAA,EAC1B,sBAAA;AAAA,EAAwB,sBAAA;AAAA,EACxB,eAAA;AAAA,EAAiB,SAAA;AAAA,EAAW,aAAA;AAAA,EAC5B,UAAA;AAAA,EAAY,wBAAA;AAAA,EACZ,YAAA;AAAA,EAAc,WAAA;AAAA,EAAa,eAAA;AAAA,EAC3B,YAAA;AAAA,EAAc,YAAA;AAAA,EAAc,aAAA;AAAA,EAC5B,YAAA;AAAA,EAAc,iBAAA;AAAA,EAAmB,MAAA;AAAA,EACjC,cAAA;AAAA,EAAgB;AAClB,CAAA;AAYA,IAAM,qBAAA,GAAsC;AAAA,EAC1C,gBAAA,EAAkB,CAAA;AAAA;AAAA,EAClB,sBAAA,EAAwB,GAAA;AAAA;AAAA,EACxB,mBAAA,EAAqB,CAAA;AAAA;AAAA,EACrB,eAAA,EAAiB,CAAA;AAAA,EACjB,oBAAA,EAAsB;AACxB,CAAA;AAKO,SAAS,6BAA6B,OAAA,EAA0B;AACrE,EAAA,MAAM,YAAA,GAAe,QAAQ,WAAA,EAAY;AAEzC,EAAA,KAAA,MAAW,aAAa,2BAAA,EAA6B;AACnD,IAAA,IAAI,YAAA,CAAa,QAAA,CAAS,SAAA,CAAU,WAAA,EAAa,CAAA,EAAG;AAClD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,qBAAA,CACd,UAAA,EACA,IAAA,GAAe,CAAA,EACI;AACnB,EAAA,OAAO;AAAA,IACL,GAAG,UAAA;AAAA,IACH,OAAO,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,KAAA,GAAQ,MAAM,EAAE,CAAA;AAAA;AAAA,IAC3C,SAAA,EAAW,CAAA,EAAG,UAAA,CAAW,SAAS,yBAAyB,IAAI,CAAA,CAAA;AAAA,GACjE;AACF;AA4CO,SAAS,uBAAA,CACd,UAAA,EACA,OAAA,EACA,MAAA,GAAgC,EAAC,EAMjC;AACA,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,qBAAA,EAAuB,GAAG,MAAA,EAAO;AAClD,EAAA,MAAM,eAAyB,EAAC;AAGhC,EAAA,IAAI,4BAAA,CAA6B,OAAO,CAAA,EAAG;AACzC,IAAA,YAAA,CAAa,KAAK,2BAA2B,CAAA;AAC7C,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,MACxC,YAAA,EAAc,IAAA;AAAA,MACd,MAAA,EAAQ,8CAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,GAAa,UAAA,CAAW,KAAA,GAAQ,GAAA,CAAI,gBAAA;AACxC,EAAA,YAAA,CAAa,IAAA,CAAK,CAAA,mBAAA,EAAsB,GAAA,CAAI,gBAAgB,CAAA,CAAE,CAAA;AAG9D,EAAA,IAAI,UAAA,CAAW,UAAA,GAAa,GAAA,CAAI,sBAAA,EAAwB;AACtD,IAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,CAAC,CAAA;AAAA,MAClC,YAAA,EAAc,IAAA;AAAA,MACd,QAAQ,CAAA,gBAAA,EAAmB,UAAA,CAAW,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,kCAAA,CAAA;AAAA,MAC3D;AAAA,KACF;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,GAAa,IAAI,eAAA,EAAiB;AACpC,IAAA,YAAA,CAAa,KAAK,oBAAoB,CAAA;AACtC,IAAA,OAAO;AAAA,MACL,UAAA;AAAA,MACA,YAAA,EAAc,IAAA;AAAA,MACd,MAAA,EAAQ,CAAA,UAAA,EAAa,UAAU,CAAA,8BAAA,EAAiC,IAAI,eAAe,CAAA,CAAA,CAAA;AAAA,MACnF;AAAA,KACF;AAAA,EACF;AAGA,EAAA,YAAA,CAAa,KAAK,oBAAoB,CAAA;AACtC,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,YAAA,EAAc,KAAA;AAAA,IACd,MAAA,EAAQ,aAAa,UAAU,CAAA,4BAAA,CAAA;AAAA,IAC/B;AAAA,GACF;AACF;AAKA,eAAsB,YAAA,CACpB,SACA,OAAA,EAYC;AAED,EAAA,IAAI,UAAA,GAAa,MAAM,OAAA,CAAQ,UAAA,CAAW,OAAO,CAAA;AAGjD,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,UAAA,GAAa,MAAM,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA;AAAA,EAClD;AAGA,EAAA,UAAA,GAAa,qBAAA;AAAA,IACX,UAAA;AAAA,IACA,OAAA,CAAQ,QAAQ,gBAAA,IAAoB;AAAA,GACtC;AAGA,EAAA,MAAM,OAAA,GAAU,uBAAA,CAAwB,UAAA,EAAY,OAAA,EAAS,QAAQ,MAAM,CAAA;AAE3E,EAAA,OAAO;AAAA,IACL,UAAA,EAAY;AAAA,MACV,GAAG,UAAA;AAAA,MACH,OAAO,OAAA,CAAQ;AAAA,KACjB;AAAA,IACA;AAAA,GACF;AACF;AAMO,IAAM,qBAAN,MAAyB;AAAA,EAK9B,WAAA,CACU,gBAAA,GAA2B,CAAA,EAC3B,cAAA,GAAyB,GAAA,EACjC;AAFQ,IAAA,IAAA,CAAA,gBAAA,GAAA,gBAAA;AACA,IAAA,IAAA,CAAA,cAAA,GAAA,cAAA;AANV,IAAA,IAAA,CAAQ,QAAA,GAAmB,CAAA;AAC3B,IAAA,IAAA,CAAQ,SAAA,GAAoB,CAAA;AAC5B,IAAA,IAAA,CAAQ,WAAA,GAAsB,CAAA;AAAA,EAK3B;AAAA,EAEH,aAAA,GAAgB;AACd,IAAA,IAAA,CAAK,SAAA,EAAA;AAEL,IAAA,IAAI,IAAA,CAAK,QAAA,GAAW,CAAA,EAAG,IAAA,CAAK,QAAA,EAAA;AAAA,EAC9B;AAAA,EAEA,aAAA,GAAgB;AACd,IAAA,IAAA,CAAK,QAAA,EAAA;AACL,IAAA,IAAA,CAAK,WAAA,GAAc,KAAK,GAAA,EAAI;AAAA,EAC9B;AAAA,EAEA,MAAA,GAAkB;AAEhB,IAAA,IAAI,KAAK,GAAA,EAAI,GAAI,IAAA,CAAK,WAAA,GAAc,KAAK,cAAA,EAAgB;AACvD,MAAA,IAAA,CAAK,WAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,IAAA,CAAK,YAAY,IAAA,CAAK,gBAAA;AAAA,EAC/B;AAAA,EAEA,SAAA,GAAY;AACV,IAAA,OAAO;AAAA,MACL,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,MACpB,aAAa,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,GAAW,KAAK,SAAA,CAAA,IAAc;AAAA,KACnE;AAAA,EACF;AACF;AAGA,IAAI,oBAAA,GAAkD,IAAA;AAE/C,SAAS,iBAAA,GAAwC;AACtD,EAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,IAAA,oBAAA,GAAuB,IAAI,kBAAA,EAAmB;AAAA,EAChD;AACA,EAAA,OAAO,oBAAA;AACT;;;ACnPA,IAAM,iBAAA,GAAsC;AAAA,EAC1C;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,wBAAA;AAAA,IACP,cAAA,EAAgB,IAAA;AAAA,IAChB,eAAA,EAAiB,IAAA;AAAA,IACjB,WAAA,EAAa,GAAA;AAAA,IACb,WAAA,EAAa,CAAA;AAAA,IACb,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA;AAAA,IACE,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,0BAAA;AAAA,IACP,cAAA,EAAgB,IAAA;AAAA,IAChB,eAAA,EAAiB,KAAA;AAAA,IACjB,WAAA,EAAa,GAAA;AAAA,IACb,WAAA,EAAa,EAAA;AAAA,IACb,gBAAA,EAAkB;AAAA;AAEtB,CAAA;AAEA,IAAM,cAAA,GAAoC;AAAA,EACxC,SAAA,EAAW,iBAAA;AAAA,EACX,eAAA,EAAiB,gBAAA;AAAA,EACjB,cAAA,EAAgB,IAAA;AAAA,EAChB,eAAA,EAAiB,GAAA;AAAA;AAAA,EACjB,eAAA,EAAiB;AACnB,CAAA;AAEO,IAAM,cAAN,MAAkB;AAAA,EAIvB,WAAA,CAAY,MAAA,GAAqC,EAAC,EAAG;AAFrD,IAAA,IAAA,CAAQ,iBAAiB,iBAAA,EAAkB;AAGzC,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,cAAA,EAAgB,GAAG,MAAA,EAAO;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WAAA,CACJ,OAAA,EACA,gBAAA,EACA,YAAA,EAC0B;AAE1B,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,EAAO,EAAG;AAChC,MAAA,OAAA,CAAQ,KAAK,uDAAuD,CAAA;AACpE,MAAA,OAAO,IAAA,CAAK,uBAAA;AAAA,QACV,gBAAA,IAAoB,CAAA;AAAA,QACpB;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,4BAAA,CAA6B,OAAO,CAAA,EAAG;AACzC,MAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,MAAA,OAAO,IAAA,CAAK,uBAAA;AAAA,QACV,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,aAAa,gBAAA,GACf,EAAE,KAAA,EAAO,gBAAA,EAAkB,YAAY,CAA6C,CAAA,GACpF,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAS,YAAY,CAAA;AAGvD,IAAA,MAAM,OAAA,GAAU,uBAAA,CAAwB,UAAA,EAAY,OAAA,EAAS,YAAY,CAAA;AAGzE,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,OAAO,IAAA,CAAK,uBAAA,CAAwB,OAAA,CAAQ,UAAA,EAAY,QAAQ,MAAM,CAAA;AAAA,IACxE;AAEA,IAAA,OAAO,IAAA,CAAK,kBAAA;AAAA,MACV,OAAA,CAAQ,UAAA;AAAA,MACR,OAAA,CAAQ,MAAA;AAAA,MACR,EAAE,KAAA,EAAO,0BAAA,EAA4B,QAAA,EAAU,WAAA;AAAY,KAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAA,CACJ,OAAA,EACA,gBAAA,EAC0B;AAC1B,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,gBAAgB,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,uBAAuB,OAAA,EAA2C;AACtE,IAAA,OAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CACJ,OAAA,EACA,UAAA,EACA,gBAAA,EACyE;AACzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,SAAS,gBAAgB,CAAA;AAEhE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA;AAAA,QACxB,MAAM,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU,QAAQ,KAAK,CAAA;AAAA,QAChD,KAAK,MAAA,CAAO;AAAA,OACd;AAGA,MAAA,IAAI,OAAA,CAAQ,aAAa,YAAA,EAAc;AACrC,QAAA,IAAA,CAAK,eAAe,aAAA,EAAc;AAAA,MACpC;AAEA,MAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,YAAA,EAAc,KAAA,EAAM;AAAA,IAChD,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,OAAA,CAAQ,aAAa,YAAA,EAAc;AACrC,QAAA,IAAA,CAAK,eAAe,aAAA,EAAc;AAClC,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,8CAAA,CAAA,EAAkD,IAAA,CAAK,cAAA,CAAe,WAAW,CAAA;AAAA,MAChG;AAGA,MAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,cAAA,EAAgB;AAClD,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,yCAAA,EAA4C,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,GAAA,CAAK,CAAA;AACtF,QAAA,MAAM,iBAAiB,MAAM,UAAA;AAAA,UAC3B,QAAQ,QAAA,CAAS,QAAA;AAAA,UACjB,QAAQ,QAAA,CAAS;AAAA,SACnB;AAEA,QAAA,OAAO;AAAA,UACL,MAAA,EAAQ,cAAA;AAAA,UACR,OAAA;AAAA,UACA,YAAA,EAAc;AAAA,SAChB;AAAA,MACF;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,OAAA,EAAiB,gBAAA,EAMtC;AACD,IAAA,MAAM,eAAe,gBAAA,IAAA,CAAqB,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA,EAAG,KAAA;AAClF,IAAA,MAAM,OAAA,GAAU,uBAAA;AAAA,MACd,EAAE,OAAO,YAAA,EAAc,UAAA,EAAY,CAA8B,CAAA;AAAA,MACjE;AAAA,KACF;AAEA,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,YAAA,GACxB,IAAA,CAAK,wBAAwB,OAAA,CAAQ,UAAA,EAAY,OAAA,CAAQ,MAAM,IAC/D,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,UAAA,EAAY,QAAQ,MAAM,CAAA;AAE9D,IAAA,MAAM,eAAkC,EAAC;AACzC,IAAA,IAAI,WAAA,CAAY,aAAa,WAAA,EAAa;AACxC,MAAA,YAAA,CAAa,KAAK,IAAA,CAAK,uBAAA,CAAwB,OAAA,CAAQ,UAAA,EAAY,aAAa,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,IAAI,WAAA,CAAY,aAAa,YAAA,EAAc;AACzC,MAAA,YAAA,CAAa,KAAK,IAAA,CAAK,kBAAA,CAAmB,OAAA,CAAQ,UAAA,EAAY,aAAa,CAAC,CAAA;AAAA,IAC9E;AAEA,IAAA,MAAM,aAAA,GAAgB,aAAa,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,QAAA,KAAa,WAAW,GAAG,aAAA,IAAiB,IAAA;AAC3F,IAAA,MAAM,OAAA,GAAU,gBAAgB,WAAA,CAAY,aAAA;AAE5C,IAAA,OAAO;AAAA,MACL,cAAc,OAAA,CAAQ,UAAA;AAAA,MACtB,WAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,cAAc,OAAA,CAAQ;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,eAAe,SAAA,EAAU;AAAA,EACvC;AAAA;AAAA,EAIA,MAAc,kBAAA,CACZ,OAAA,EACA,YAAA,EACsF;AACtF,IAAA,MAAM,EAAE,oBAAA,EAAAC,qBAAAA,EAAqB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,sBAAA,EAAA,EAAA,yBAAA,CAAA,CAAA;AACvC,IAAA,MAAM,UAAA,GAAa,MAAMA,qBAAAA,CAAqB,OAAO,CAAA;AAGrD,IAAA,OAAO,qBAAA,CAAsB,UAAA,EAAY,YAAA,EAAc,gBAAA,IAAoB,CAAC,CAAA;AAAA,EAC9E;AAAA,EAEQ,kBAAA,CACN,YAAA,EACA,SAAA,EACA,QAAA,EACiB;AACjB,IAAA,MAAM,oBAAA,GAAuB,MAAQ,YAAA,GAAe,GAAA;AACpD,IAAA,MAAM,qBAAA,GAAwB,MAAQ,YAAA,GAAe,GAAA;AAErD,IAAA,MAAM,SAAA,GAAa,uBAAuB,GAAA,GAAQ,IAAA;AAClD,IAAA,MAAM,UAAA,GAAc,wBAAwB,GAAA,GAAQ,IAAA;AAEpD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,wBAAA;AAAA,MACP,QAAA,EAAU,YAAA;AAAA,MACV,SAAA;AAAA,MACA,eAAe,SAAA,GAAY,UAAA;AAAA,MAC3B,gBAAA,EAAkB,MAAS,YAAA,GAAe,GAAA;AAAA,MAC1C;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,uBAAA,CAAwB,cAAsB,SAAA,EAAoC;AACxF,IAAA,MAAM,oBAAA,GAAuB,MAAQ,YAAA,GAAe,GAAA;AACpD,IAAA,MAAM,qBAAA,GAAwB,MAAQ,YAAA,GAAe,GAAA;AAErD,IAAA,MAAM,SAAA,GAAa,uBAAuB,GAAA,GAAQ,IAAA;AAClD,IAAA,MAAM,UAAA,GAAc,wBAAwB,GAAA,GAAQ,KAAA;AAEpD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,0BAAA;AAAA,MACP,QAAA,EAAU,WAAA;AAAA,MACV,SAAA;AAAA,MACA,eAAe,SAAA,GAAY,UAAA;AAAA,MAC3B,gBAAA,EAAkB,MAAS,YAAA,GAAe;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,MAAc,kBAAA,CACZ,EAAA,EACA,SAAA,EACY;AACZ,IAAA,OAAO,QAAQ,IAAA,CAAK;AAAA,MAClB,EAAA,EAAG;AAAA,MACH,IAAI,OAAA;AAAA,QAAe,CAAC,CAAA,EAAG,MAAA,KACrB,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA,EAAG,SAAS;AAAA;AACnE,KACD,CAAA;AAAA,EACH;AACF;AAKO,SAAS,kBAAkB,MAAA,EAAkD;AAClF,EAAA,OAAO,IAAI,YAAY,MAAM,CAAA;AAC/B;AAKA,IAAI,aAAA,GAAoC,IAAA;AAEjC,SAAS,cAAA,GAA8B;AAC5C,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,aAAA,GAAgB,IAAI,WAAA,EAAY;AAAA,EAClC;AACA,EAAA,OAAO,aAAA;AACT;;;AC/SA,sBAAA,EAAA;;;AC+BO,IAAM,kBAAN,MAAsB;AAAA,EAAtB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,KAAA,uBAAyC,GAAA,EAAI;AACrD,IAAA,IAAA,CAAQ,QAAA,uBAAkE,GAAA,EAAI;AAAA,EAAA;AAAA,EAE9E,YAAA,CACE,YACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,UAAU,CAAA;AAC1C,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAA,CAAW,IAAA,EAAM,OAA+C,CAAA;AAAA,EACpF;AAAA,EAEA,MAAM,QAAA,CAAS,IAAA,EAAc,KAAA,EAA2C;AACtE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,mBAAmB,IAAI,CAAA;AAAA,OAChC;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,KAAK,CAAA;AAClC,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC9D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAA,GAA8B;AAC5B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAAA,EACvC;AAAA,EAEA,QAAQ,IAAA,EAAuB;AAC7B,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,EAC5B;AACF;AAMO,IAAM,sBAAN,MAA0B;AAAA,EAA1B,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,SAAA,uBAAiD,GAAA,EAAI;AAC7D,IAAA,IAAA,CAAQ,QAAA,uBAAoD,GAAA,EAAI;AAAA,EAAA;AAAA,EAEhE,gBAAA,CACE,YACA,OAAA,EACM;AACN,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAA,CAAW,GAAA,EAAK,UAAU,CAAA;AAC7C,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,UAAA,CAAW,GAAA,EAAK,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,YAAY,GAAA,EAAwC;AACxD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,uBAAuB,GAAG,CAAA;AAAA,OACnC;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,EAAQ;AAC7B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC9D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAA,GAAsC;AACpC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,EAC3C;AACF;AAMO,IAAM,YAAN,MAAgB;AAAA,EAKrB,YAAY,MAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,IAAA,EAAM,GAAA;AAAA,MACN,UAAA,EAAY,IAAA;AAAA,MACZ,GAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,eAAA,EAAgB;AACxC,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,mBAAA,EAAoB;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,GAA6B;AAE3B,IAAA,IAAA,CAAK,YAAA,CAAa,YAAA;AAAA,MAChB;AAAA,QACE,IAAA,EAAM,kBAAA;AAAA,QACN,WAAA,EAAa,sDAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,MAAA,EAAQ;AAAA,cACN,IAAA,EAAM,QAAA;AAAA,cACN,WAAA,EAAa;AAAA,aACf;AAAA,YACA,MAAA,EAAQ;AAAA,cACN,IAAA,EAAM,OAAA;AAAA,cACN,WAAA,EAAa;AAAA,aACf;AAAA,YACA,KAAA,EAAO;AAAA,cACL,IAAA,EAAM,OAAA;AAAA,cACN,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,QAAA,EAAU,CAAC,QAAQ;AAAA;AACrB,OACF;AAAA,MACA,OAAO,KAAA,KAAU;AAEf,QAAA,OAAA,CAAQ,GAAA,CAAI,kCAAkC,KAAK,CAAA;AACnD,QAAA,OAAO,EAAE,QAAQ,WAAA,EAAa,SAAA,EAAW,OAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAG;AAAA,MAC/D;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,YAAA,CAAa,YAAA;AAAA,MAChB;AAAA,QACE,IAAA,EAAM,iBAAA;AAAA,QACN,WAAA,EAAa,4CAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,MAAA,EAAQ;AAAA,cACN,IAAA,EAAM,QAAA;AAAA,cACN,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,QAAA,EAAU,CAAC,QAAQ;AAAA;AACrB,OACF;AAAA,MACA,OAAO,KAAA,KAAU;AACf,QAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAC1C,QAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAE;AAAA,MACnC;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,YAAA,CAAa,YAAA;AAAA,MAChB;AAAA,QACE,IAAA,EAAM,iBAAA;AAAA,QACN,WAAA,EAAa,2CAAA;AAAA,QACb,WAAA,EAAa;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,UAAA,EAAY;AAAA,YACV,OAAA,EAAS;AAAA,cACP,IAAA,EAAM,OAAA;AAAA,cACN,WAAA,EAAa;AAAA;AACf,WACF;AAAA,UACA,QAAA,EAAU,CAAC,SAAS;AAAA;AACtB,OACF;AAAA,MACA,OAAO,KAAA,KAAU;AACf,QAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAC1C,QAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAE;AAAA,MACtC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA0B;AAExB,IAAA,IAAA,CAAK,gBAAA,CAAiB,gBAAA;AAAA,MACpB;AAAA,QACE,GAAA,EAAK,mBAAA;AAAA,QACL,IAAA,EAAM,oBAAA;AAAA,QACN,QAAA,EAAU,kBAAA;AAAA,QACV,WAAA,EAAa;AAAA,OACf;AAAA,MACA,YAAY;AACV,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,iBAAA,EAAkB;AAAA,YACtC,EAAE,EAAA,EAAI,MAAA,EAAQ,IAAA,EAAM,WAAA,EAAY;AAAA,YAChC,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,aAAA,EAAc;AAAA,YACpC,EAAE,EAAA,EAAI,QAAA,EAAU,IAAA,EAAM,mBAAA;AAAoB;AAC5C,SACF;AAAA,MACF;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,gBAAA,CAAiB,gBAAA;AAAA,MACpB;AAAA,QACE,GAAA,EAAK,6BAAA;AAAA,QACL,IAAA,EAAM,uBAAA;AAAA,QACN,QAAA,EAAU,eAAA;AAAA,QACV,WAAA,EAAa;AAAA,OACf;AAAA,MACA,YAAY;AACV,QAAA,OAAO,yDAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAwC;AACtC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,MACrB,KAAA,EAAO,IAAA,CAAK,YAAA,CAAa,SAAA,EAAU;AAAA,MACnC,SAAA,EAAW,IAAA,CAAK,gBAAA,CAAiB,aAAA;AAAc,KACjD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAAA,EAAqD;AACxE,IAAA,OAAO,KAAK,YAAA,CAAa,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,QAAQ,KAAK,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,OAAA,EAAqD;AAC/E,IAAA,OAAO,IAAA,CAAK,gBAAA,CAAiB,WAAA,CAAY,OAAA,CAAQ,GAAG,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAmC;AACjC,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,GAAuB;AACrB,IAAA,OAAO,OAAO,OAAA,KAAiE;AAC7E,MAAA,MAAM,OAAO,OAAA,CAAQ,IAAA;AAErB,MAAA,QAAQ,KAAK,IAAA;AAAM,QACjB,KAAK,WAAA;AACH,UAAA,OAAO,KAAK,eAAA,EAAgB;AAAA,QAE9B,KAAK,WAAA;AACH,UAAA,OAAO,IAAA,CAAK,eAAe,IAAkC,CAAA;AAAA,QAE/D,KAAK,kBAAA;AACH,UAAA,OAAO,IAAA,CAAK,sBAAsB,IAAkC,CAAA;AAAA,QAEtE;AACE,UAAA,OAAO,EAAE,OAAO,sBAAA,EAAuB;AAAA;AAC3C,IACF,CAAA;AAAA,EACF;AACF;AAMO,SAAS,gBAAgB,MAAA,EAAoC;AAClE,EAAA,OAAO,IAAI,UAAU,MAAM,CAAA;AAC7B;AAKO,SAAS,uBAAuB,OAAA,EAA+C;AACpF,EAAA,MAAM,SAAS,eAAA,CAAgB;AAAA,IAC7B,IAAA,EAAM,uBAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,GAAG;AAAA,GACJ,CAAA;AAED,EAAA,MAAA,CAAO,oBAAA,EAAqB;AAC5B,EAAA,MAAA,CAAO,iBAAA,EAAkB;AAEzB,EAAA,OAAO,MAAA;AACT;;;ACxUO,IAAM,YAAN,MAAgB;AAAA,EAMrB,YAAY,MAAA,EAAyB;AAJrC,IAAA,IAAA,CAAQ,WAAA,GAAuC,IAAA;AAC/C,IAAA,IAAA,CAAQ,eAAA,GAA+C,IAAA;AACvD,IAAA,IAAA,CAAQ,WAAA,GAAsB,CAAA;AAG5B,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,SAAA,EAAW,GAAA;AAAA,MACX,SAAA,EAAW,MAAA;AAAA,MACX,GAAG;AAAA,KACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,GAKH;AAED,IAAA,IAAI,KAAK,WAAA,IAAe,IAAA,CAAK,GAAA,EAAI,GAAI,KAAK,WAAA,EAAa;AACrD,MAAA,OAAO;AAAA,QACL,OAAO,IAAA,CAAK,WAAA;AAAA,QACZ,SAAA,EAAW,IAAA,CAAK,eAAA,IAAmB,EAAC;AAAA,QACpC,IAAA,EAAM,QAAA;AAAA,QACN,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAA+B,EAAE,IAAA,EAAM,WAAA,EAAY;AAEzD,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAG/C,MAAA,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,KAAA,IAAS,EAAC;AACtC,MAAA,IAAA,CAAK,eAAA,GAAkB,QAAA,CAAS,SAAA,IAAa,EAAC;AAC9C,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA,CAAK,GAAA,EAAI,GAAI,IAAI,EAAA,GAAK,GAAA;AAEzC,MAAA,OAAO;AAAA,QACL,OAAO,IAAA,CAAK,WAAA;AAAA,QACZ,WAAW,IAAA,CAAK,eAAA;AAAA,QAChB,MAAM,QAAA,CAAS,IAAA;AAAA,QACf,SAAS,QAAA,CAAS;AAAA,OACpB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,IAAA,EAAc,KAAA,EAA2C;AACtE,IAAA,MAAM,OAAA,GAA2B;AAAA,MAC/B,IAAA,EAAM,WAAA;AAAA,MACN,IAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,GAAA,EAAwC;AACxD,IAAA,MAAM,OAAA,GAA2B;AAAA,MAC/B,IAAA,EAAM,kBAAA;AAAA,MACN;AAAA,KACF;AAEA,IAAA,OAAO,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAAuC;AAC3C,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,IAAe,KAAK,GAAA,EAAI,IAAK,KAAK,WAAA,EAAa;AACvD,MAAA,MAAM,KAAK,QAAA,EAAS;AAAA,IACtB;AACA,IAAA,OAAQ,IAAA,CAAK,eAAoC,EAAC;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAA+C;AACnD,IAAA,IAAI,CAAC,IAAA,CAAK,eAAA,IAAmB,KAAK,GAAA,EAAI,IAAK,KAAK,WAAA,EAAa;AAC3D,MAAA,MAAM,KAAK,QAAA,EAAS;AAAA,IACtB;AACA,IAAA,OAAQ,IAAA,CAAK,mBAA4C,EAAC;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,IAAA,EAAgC;AAC5C,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,IAAA,EAA8C;AAC1D,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,SAAA,EAAU;AACnC,IAAA,OAAO,MAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,IAAK,IAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,CAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,YAAY,OAAA,EAAgC;AACxD,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM,UAAA,CAAW,OAAM,EAAG,IAAA,CAAK,OAAO,SAAS,CAAA;AAE5E,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAkC;AAAA,QACtC,cAAA,EAAgB;AAAA,OAClB;AAEA,MAAA,IAAI,IAAA,CAAK,OAAO,SAAA,EAAW;AACzB,QAAA,OAAA,CAAQ,eAAe,CAAA,GAAI,CAAA,OAAA,EAAU,IAAA,CAAK,OAAO,SAAS,CAAA,CAAA;AAAA,MAC5D;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,IAAA,CAAK,OAAO,SAAA,EAAW;AAAA,QAClD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAAA,QAC5B,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAA,CAAS,MAAM,KAAK,MAAM,QAAA,CAAS,IAAA,EAAM,CAAA,CAAE,CAAA;AAAA,MACrE;AAEA,MAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,IAC7B,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAA,CAAI,CAAA;AAAA,MACpE;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;AAYO,IAAM,mBAAN,MAAuB;AAAA,EAAvB,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,OAAA,uBAAgD,GAAA,EAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAK5D,cAAA,CAAe,IAAA,EAAc,MAAA,EAAyB,WAAA,EAA4B;AAChF,IAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,MAAM,CAAA;AACnC,IAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,aAAa,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,IAAA,EAAgC;AACxC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,GAAG,MAAA,IAAU,IAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,UAAA,EAAoB,QAAA,EAAkB,KAAA,EAA2C;AAC9F,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,UAAU,CAAA;AACxC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,kBAAA,EAAqB,UAAU,CAAA,CAAA,EAAG;AAAA,IACpE;AACA,IAAA,OAAO,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU,KAAK,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,GAAqG;AACzG,IAAA,MAAM,UAAwF,EAAC;AAE/F,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,EAAE,QAAQ,CAAA,IAAK,KAAK,OAAA,EAAS;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,QAAA,EAAS;AACxC,QAAA,OAAA,CAAQ,IAAI,CAAA,GAAI;AAAA,UACd,OAAO,SAAA,CAAU,KAAA;AAAA,UACjB,WAAW,SAAA,CAAU;AAAA,SACvB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iCAAA,EAAoC,IAAI,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAChE,QAAA,OAAA,CAAQ,IAAI,IAAI,EAAE,KAAA,EAAO,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AAAA,MAC7C;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA6D;AAC3D,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,IAAI,CAAA,CAAA,MAAM;AAAA,MACjD,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,aAAa,CAAA,CAAE;AAAA,KACjB,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,IAAA,EAAoB;AACnC,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAI,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAuB;AACrB,IAAA,KAAA,MAAW,EAAE,MAAA,EAAO,IAAK,IAAA,CAAK,OAAA,CAAQ,QAAO,EAAG;AAC9C,MAAA,MAAA,CAAO,UAAA,EAAW;AAAA,IACpB;AAAA,EACF;AACF;AAMO,SAAS,gBAAgB,MAAA,EAAoC;AAClE,EAAA,OAAO,IAAI,UAAU,MAAM,CAAA;AAC7B;AAEO,SAAS,sBAAA,GAA2C;AACzD,EAAA,OAAO,IAAI,gBAAA,EAAiB;AAC9B;AAKO,SAAS,6BAAA,GAAkD;AAChE,EAAA,MAAM,UAAU,sBAAA,EAAuB;AAOvC,EAAA,OAAO,OAAA;AACT;ACvOO,IAAM,iBAAA,GAAN,cAAgCC,YAAAA,CAAa;AAAA,EAOlD,WAAA,CAAY,MAAA,GAAkC,EAAC,EAAG;AAChD,IAAA,KAAA,EAAM;AANR,IAAA,IAAA,CAAQ,QAAsB,EAAC;AAC/B,IAAA,IAAA,CAAQ,OAAA,uBAAuC,GAAA,EAAI;AACnD,IAAA,IAAA,CAAQ,cAA4D,EAAC;AACrE,IAAA,IAAA,CAAQ,YAAA,GAAe,KAAA;AAIrB,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,UAAA,EAAY,GAAA;AAAA;AAAA,MACZ,YAAA,EAAc,GAAA;AAAA,MACd,mBAAA,EAAqB,GAAA;AAAA,MACrB,kBAAA,EAAoB,IAAA;AAAA;AAAA,MACpB,aAAA,EAAe,KAAK,EAAA,GAAK,GAAA;AAAA;AAAA,MACzB,GAAG;AAAA,KACL;AAGA,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,SAAA,EAA4B;AAEvC,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,UAAA,CAAW,CAAC,CAAA;AACnC,MAAA,IAAA,GAAA,CAAS,IAAA,IAAQ,KAAK,IAAA,GAAQ,IAAA;AAC9B,MAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,IAChB;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,UAAA;AACpC,IAAA,OAAO,UAAA,GAAa,KAAK,MAAA,CAAO,UAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,CACJ,SAAA,EACA,OAAA,EACA,MAAA,EACe;AACf,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AACjC,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,OAAO,YAAA,EAAc;AACjD,MAAA,OAAA,CAAQ,KAAK,0CAA0C,CAAA;AACvD,MAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,EAAE,MAAA,EAAQ,cAAc,CAAA;AAC7C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAqB;AAAA,MACzB,QAAA,EAAU,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,MACtE,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,MAAM,CAAA;AACtB,IAAA,IAAA,CAAK,IAAA,CAAK,WAAW,MAAM,CAAA;AAG3B,IAAA,IAAA,CAAK,UAAA,CAAW,CAAC,MAAA,CAAO,OAAO,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,OAAA,GAII,EAAC,EACkB;AACvB,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,oBAAQ,IAAI,IAAA,EAAK;AAC5C,IAAA,MAAM,UAAA,GAAa,IAAI,IAAA,CAAK,UAAU,CAAA;AACtC,IAAA,UAAA,CAAW,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,IAAI,IAAA,CAAK,UAAU,CAAA;AACpC,IAAA,QAAA,CAAS,QAAA,CAAS,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA;AAEjC,IAAA,IAAI,OAAA,GAAU,MAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK;AAC1D,MAAA,MAAM,EAAA,GAAK,IAAI,IAAA,CAAK,CAAA,CAAE,SAAS,CAAA;AAC/B,MAAA,OAAO,EAAA,IAAM,cAAc,EAAA,IAAM,QAAA;AAAA,IACnC,CAAC,CAAA;AAED,IAAA,IAAI,OAAA,CAAQ,aAAa,MAAA,EAAW;AAClC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA;AAAA,QAAO,OACvB,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,UAAA,CAAW,kBAAkB,OAAA,CAAQ;AAAA,OACzD;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAEhD,IAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,OAAA,CAAQ,SAAS,EAAE,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA0B;AACxB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,CAAA;AAC5E,IAAA,MAAM,SAAS,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,WAAY,cAAc,CAAA;AAC9D,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,GAAS,CAAA,GACjC,OAAO,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,OAAO,MAAA,GAC3C,CAAA;AAEJ,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,IAAA,CAAK,OAAA,CAAQ,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA;AAAA,MAC7C,gBAAgB,SAAA,CAAU,MAAA;AAAA,MAC1B,YAAA;AAAA,MACA,gBAAA,EAAkB,KAAK,kBAAA,EAAmB;AAAA,MAC1C,SAAA,EAAW,KAAK,KAAA,CAAM,MAAA;AAAA,MACtB,SAAA,EAAW,IAAA,CAAK,kBAAA,EAAmB,GAAI,KAAK,MAAA,CAAO;AAAA,KACrD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAMQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAEpB,IAAA,MAAM,cAAc,YAAY;AAC9B,MAAA,OAAO,KAAK,YAAA,EAAc;AACxB,QAAA,IAAI,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACzB,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,KAAA,EAAM;AAChC,UAAA,MAAM,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,QAClC;AAGA,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA;AAEA,IAAA,WAAA,EAAY,CAAE,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,EACnC;AAAA,EAEA,MAAc,eAAe,MAAA,EAAmC;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,sBAAA,CAAuB,MAAM,CAAA;AAC3D,MAAA,MAAA,CAAO,UAAA,GAAa,UAAA;AACpB,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,QAAA,EAAU,MAAM,CAAA;AACxC,MAAA,IAAA,CAAK,IAAA,CAAK,aAAa,MAAM,CAAA;AAAA,IAC/B,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAA,IAAA,CAAK,IAAA,CAAK,kBAAA,EAAoB,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,IACjD;AAAA,EACF;AAAA,EAEA,MAAc,uBAAuB,MAAA,EAAuD;AAU1F,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,EAAG,EAAE,CAAC,CAAA;AAExC,IAAA,IAAI,KAAA,GAAQ,GAAA;AACZ,IAAA,IAAI,YAAA,GAAe,CAAA;AACnB,IAAA,IAAI,iBAAA,GAAoB,CAAA;AAExB,IAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,OAAA,EAAS;AAC1B,MAAA,KAAA,IAAS,EAAA;AACT,MAAA,YAAA,IAAgB,CAAA;AAAA,IAClB;AAEA,IAAA,IAAI,MAAA,CAAO,MAAA,CAAO,SAAA,GAAY,GAAA,EAAQ;AACpC,MAAA,KAAA,IAAS,EAAA;AACT,MAAA,iBAAA,IAAqB,CAAA;AAAA,IACvB;AAEA,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA;AAAA,MACjC,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA;AAAI,KACtB;AAAA,EACF;AAAA,EAEQ,WAAW,OAAA,EAAwB;AACzC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,EAAE,WAAW,GAAA,EAAK,KAAA,EAAO,SAAS,CAAA;AAGxD,IAAA,MAAM,MAAA,GAAS,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,aAAA;AACjC,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,YAAY,MAAM,CAAA;AAGpE,IAAA,MAAM,SAAA,GAAY,KAAK,kBAAA,EAAmB;AAC1C,IAAA,IAAI,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAoB;AAC9C,MAAA,MAAM,KAAA,GAAoB;AAAA,QACxB,OAAA,EAAS,SAAS,GAAG,CAAA,CAAA;AAAA,QACrB,SAAA,EAAW,GAAA;AAAA,QACX,SAAA;AAAA,QACA,SAAA,EAAW,KAAK,MAAA,CAAO,kBAAA;AAAA,QACvB,WAAA,EAAa,MAAA;AAAA,QACb,WAAA,EAAa,KAAK,WAAA,CAAY,MAAA;AAAA,QAC9B,YAAY,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAAE;AAAA,OACpD;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,kBAAA,GAA6B;AACnC,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAC1C,IAAA,MAAM,SAAS,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA,CAAE,MAAA;AACrD,IAAA,OAAO,MAAA,GAAS,KAAK,WAAA,CAAY,MAAA;AAAA,EACnC;AACF;AAaA,eAAsB,aAAA,CACpB,OAAA,EACA,OAAA,GAAyB,EAAC,EACX;AACf,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,GAAO,IAAI,KAAK,OAAA,CAAQ,IAAI,CAAA,mBAAI,IAAI,IAAA,EAAK;AAE9D,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,kCAAA,EAAgC,KAAK,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC;AAAA,CAAI,CAAA;AAEhF,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,WAAA,CAAY;AAAA,IACxC,IAAA;AAAA,IACA,KAAA,EAAO,QAAQ,KAAA,IAAS,EAAA;AAAA,IACxB,UAAU,OAAA,CAAQ;AAAA,GACnB,CAAA;AAED,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAA,CAAQ,IAAI,mBAAmB,CAAA;AAC/B,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,MAAA,EAAQ;AAC7B,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,IAAA,CAAK,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAC,IAAI,SAAA,CAAU,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAI,UAAA,CAAW,OAAO,EAAE,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAE,CAAA;AAClH,EAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAE1B,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,EAAA,GAAK,EAAE,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,OAAO,EAAE,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAA,CAAS,EAAE,UAAA,EAAY,cAAA,IAAkB,KAAK,QAAA,EAAS,CAAE,OAAO,CAAC,CAAA;AACvE,IAAA,MAAM,UAAU,CAAA,EAAG,CAAA,CAAE,OAAO,SAAS,CAAA,EAAA,CAAA,CAAK,OAAO,EAAE,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,OAAO,EAAE,CAAA;AAC7C,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,OAAA,GAAU,QAAA,GAAM,QAAA;AAExC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,EAAE,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,EAC/D;AAGA,EAAA,MAAM,KAAA,GAAQ,QAAQ,QAAA,EAAS;AAC/B,EAAA,OAAA,CAAQ,IAAI,sBAAe,CAAA;AAC3B,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iBAAA,EAAoB,KAAA,CAAM,YAAY,CAAA,CAAE,CAAA;AACpD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,aAAA,EAAgB,KAAA,CAAM,cAAc,CAAA,CAAE,CAAA;AAClD,EAAA,OAAA,CAAQ,IAAI,CAAA,iBAAA,EAAoB,KAAA,CAAM,aAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAC/D,EAAA,OAAA,CAAQ,GAAA,CAAI,kBAAkB,KAAA,CAAM,gBAAA,GAAmB,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AACzE,EAAA,OAAA,CAAQ,IAAI,CAAA,UAAA,EAAa,KAAA,CAAM,SAAA,GAAY,QAAA,GAAM,QAAG,CAAA,CAAE,CAAA;AACxD;AAMO,SAAS,wBAAwB,MAAA,EAAqD;AAC3F,EAAA,OAAO,IAAI,kBAAkB,MAAM,CAAA;AACrC","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 * Shared Constants for Orbital Generation\n *\n * Provider limits, defaults, and configuration constants.\n *\n * @packageDocumentation\n */\n\nimport type { LLMProvider } from '@almadar/llm';\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 openrouter: 5,\n};\n\n/**\n * Default batch sizes per provider (max orbitals per LLM call).\n */\nexport const PROVIDER_BATCH_SIZES: Record<LLMProvider, number> = {\n anthropic: 3, // Anthropic works well with 3 orbitals per call\n openai: 5, // OpenAI can handle more\n deepseek: 3, // Conservative for DeepSeek\n kimi: 3, // Conservative for Kimi\n openrouter: 5, // OpenRouter proxies multiple providers\n};\n\n// ============================================================================\n// Token Limits\n// ============================================================================\n\n/**\n * Maximum tokens for generation (across all providers).\n */\nexport const DEFAULT_MAX_TOKENS = 8192;\n\n/**\n * Maximum tokens for batch generation (higher for multi-orbital).\n */\nexport const BATCH_MAX_TOKENS = 12000;\n\n/**\n * Token buffer for prompt overhead.\n */\nexport const TOKEN_BUFFER = 1000;\n\n// ============================================================================\n// Retry Configuration\n// ============================================================================\n\n/**\n * Maximum retries for failed generation attempts.\n */\nexport const MAX_RETRIES = 2;\n\n/**\n * Delay between retries (ms).\n */\nexport const RETRY_DELAY_MS = 1000;\n\n// ============================================================================\n// Timing Configuration\n// ============================================================================\n\n/**\n * Timeout for single orbital generation (ms).\n */\nexport const SINGLE_GENERATION_TIMEOUT_MS = 120000; // 2 minutes\n\n/**\n * Timeout for batch generation (ms).\n */\nexport const BATCH_GENERATION_TIMEOUT_MS = 300000; // 5 minutes\n\n// ============================================================================\n// Default Values\n// ============================================================================\n\n/**\n * Default LLM provider.\n */\nexport const DEFAULT_PROVIDER: LLMProvider = 'anthropic';\n\n/**\n * Default model for generation.\n */\nexport const DEFAULT_MODEL = 'claude-sonnet-4-20250514';\n\n/**\n * Default model for batch generation.\n */\nexport const DEFAULT_BATCH_MODEL = 'claude-sonnet-4-20250514';\n\n// ============================================================================\n// Cache Configuration\n// ============================================================================\n\n/**\n * Whether to enable prompt caching by default.\n */\nexport const DEFAULT_CACHE_ENABLED = true;\n\n/**\n * Cache TTL in milliseconds (1 hour).\n */\nexport const CACHE_TTL_MS = 60 * 60 * 1000;\n","/**\n * Shared Utilities for Orbital Generation\n *\n * Common utility functions used by both sequential and batch generation.\n *\n * @packageDocumentation\n */\n\nimport type { EntityRef, Entity } from '@almadar/core/types';\nimport { isEntityReference, getTraitName } from '@almadar/core/types';\nimport type { GenerationLog } from './types.js';\n\n// ============================================================================\n// Entity Helpers\n// ============================================================================\n\n/**\n * Get entity name safely from EntityRef.\n */\nexport function 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 */\nexport function getInlineEntity(entity: EntityRef): Entity | null {\n if (isEntityReference(entity)) {\n return null;\n }\n return entity;\n}\n\n/**\n * Get persistence type for an entity.\n */\nexport function getEntityPersistence(entity: EntityRef): string {\n const inlineEntity = getInlineEntity(entity);\n return inlineEntity?.persistence || 'persistent';\n}\n\n/**\n * Get field names as comma-separated string.\n */\nexport function getFieldNames(entity: EntityRef): string {\n const inlineEntity = getInlineEntity(entity);\n if (!inlineEntity?.fields?.length) {\n return 'N/A';\n }\n return inlineEntity.fields.map((f: { name: string }) => f.name).join(', ');\n}\n\n// ============================================================================\n// Trait Helpers\n// ============================================================================\n\n/**\n * Get trait names from orbital traits array.\n */\nexport function getTraitNames(traits: Array<{ name: string } | string>): string {\n return traits.map(t => typeof t === 'string' ? t : getTraitName(t)).join(', ');\n}\n\n// ============================================================================\n// Logging Utilities\n// ============================================================================\n\n/**\n * Create a generation log entry.\n */\nexport function createLog(\n level: GenerationLog['level'],\n message: string,\n data?: Record<string, unknown>\n): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message,\n data,\n };\n}\n\n/**\n * Log with orbital context.\n */\nexport function createOrbitalLog(\n level: GenerationLog['level'],\n orbitalName: string,\n message: string,\n data?: Record<string, unknown>\n): GenerationLog {\n return {\n timestamp: Date.now(),\n level,\n message: `[${orbitalName}] ${message}`,\n data: { orbitalName, ...data },\n };\n}\n\n// ============================================================================\n// Context Builders\n// ============================================================================\n\nimport type { OrbitalDefinition } from '@almadar/core/types';\n\n/**\n * Build context section from orbital's domainContext and design fields.\n */\nexport function 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 * Build cross-orbital connectivity section.\n */\nexport function buildConnectivitySection(orbital: OrbitalDefinition): string {\n const parts: string[] = [];\n\n if (orbital.emits?.length) {\n parts.push(`Emits: ${orbital.emits.join(', ')}`);\n }\n\n if (orbital.listens?.length) {\n parts.push(`Listens: ${orbital.listens.map(l => `${l.event}→${l.triggers}`).join(', ')}`);\n }\n\n return parts.join('\\n');\n}\n\n// ============================================================================\n// Validation Utilities\n// ============================================================================\n\n/**\n * Check if an orbital has all required fields.\n */\nexport function isValidOrbital(orbital: unknown): orbital is OrbitalDefinition {\n if (!orbital || typeof orbital !== 'object') {\n return false;\n }\n\n const o = orbital as Record<string, unknown>;\n\n // Required fields\n if (!o.name || typeof o.name !== 'string') {\n return false;\n }\n\n if (!o.entity) {\n return false;\n }\n\n // Entity must have name\n const entity = o.entity as Record<string, unknown>;\n if (!entity.name || typeof entity.name !== 'string') {\n return false;\n }\n\n return true;\n}\n\n/**\n * Validate a batch of orbitals.\n */\nexport function validateOrbitals(orbitals: unknown[]): {\n valid: OrbitalDefinition[];\n invalid: { index: number; reason: string }[];\n} {\n const valid: OrbitalDefinition[] = [];\n const invalid: { index: number; reason: string }[] = [];\n\n for (let i = 0; i < orbitals.length; i++) {\n const orbital = orbitals[i];\n if (isValidOrbital(orbital)) {\n valid.push(orbital);\n } else {\n invalid.push({\n index: i,\n reason: 'Missing required fields (name or entity.name)',\n });\n }\n }\n\n return { valid, invalid };\n}\n\n// ============================================================================\n// Array/Collection Utilities\n// ============================================================================\n\n/**\n * Chunk an array into smaller arrays.\n */\nexport function chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = [];\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size));\n }\n return chunks;\n}\n\n/**\n * Group array items by a key function.\n */\nexport function groupBy<T, K>(array: T[], keyFn: (item: T) => K): Map<K, T[]> {\n const groups = new Map<K, T[]>();\n for (const item of array) {\n const key = keyFn(item);\n const existing = groups.get(key) || [];\n existing.push(item);\n groups.set(key, existing);\n }\n return groups;\n}\n\n/**\n * Async map with concurrency limit.\n */\nexport async function asyncMapWithConcurrency<T, R>(\n items: T[],\n mapper: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<R[]> {\n const results: R[] = [];\n const executing: Promise<void>[] = [];\n\n for (let i = 0; i < items.length; i++) {\n const promise = mapper(items[i], i).then(result => {\n results[i] = result;\n });\n executing.push(promise);\n\n if (executing.length >= concurrency) {\n await Promise.race(executing);\n executing.splice(executing.findIndex(p => p === promise), 1);\n }\n }\n\n await Promise.all(executing);\n return results;\n}\n\n// ============================================================================\n// Timing Utilities\n// ============================================================================\n\n/**\n * Measure execution time of an async function.\n */\nexport async function measureTime<T>(\n fn: () => Promise<T>\n): Promise<{ result: T; durationMs: number }> {\n const start = Date.now();\n const result = await fn();\n const durationMs = Date.now() - start;\n return { result, durationMs };\n}\n\n/**\n * Sleep for a specified duration.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n// ============================================================================\n// Error Handling\n// ============================================================================\n\n/**\n * Get error message from unknown error.\n */\nexport function getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n\n/**\n * Check if error is a rate limit error.\n */\nexport function isRateLimitError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message.includes('rate limit') ||\n message.includes('too many requests') ||\n message.includes('429')\n );\n}\n\n/**\n * Check if error is a timeout error.\n */\nexport function isTimeoutError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message.includes('timeout') ||\n message.includes('timed out') ||\n message.includes('etimedout')\n );\n}\n","/**\n * Shared Utilities for Orbital Generation\n *\n * Common types, constants, and utilities used by both sequential\n * and batch generation modules.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport {\n // Core types\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n // Options\n type BaseGenerationOptions,\n type OrbitalGenerationOptions,\n type ParallelGenerationOptions,\n type BatchGenerationOptions,\n // Results\n type TokenUsage,\n type ValidationResult,\n type OrbitalGenerationResult,\n type ParallelGenerationResult,\n type BatchGenerationResult,\n // Decomposition\n type DecomposeOptions,\n type DecomposeResult,\n // Batch-specific\n type OrbitalBatch,\n type BatchProgressEvent,\n} from './types.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\nexport {\n PROVIDER_CONCURRENCY_LIMITS,\n PROVIDER_BATCH_SIZES,\n DEFAULT_MAX_TOKENS,\n BATCH_MAX_TOKENS,\n TOKEN_BUFFER,\n MAX_RETRIES,\n RETRY_DELAY_MS,\n SINGLE_GENERATION_TIMEOUT_MS,\n BATCH_GENERATION_TIMEOUT_MS,\n DEFAULT_PROVIDER,\n DEFAULT_MODEL,\n DEFAULT_BATCH_MODEL,\n DEFAULT_CACHE_ENABLED,\n CACHE_TTL_MS,\n} from './constants.js';\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\nexport {\n // Entity helpers\n getEntityName,\n getInlineEntity,\n getEntityPersistence,\n getFieldNames,\n // Trait helpers\n getTraitNames,\n // Logging\n createLog,\n createOrbitalLog,\n // Context builders\n buildContextSection,\n buildConnectivitySection,\n // Validation\n isValidOrbital,\n validateOrbitals,\n // Array utilities\n chunkArray,\n groupBy,\n asyncMapWithConcurrency,\n // Timing\n measureTime,\n sleep,\n // Error handling\n getErrorMessage,\n isRateLimitError,\n isTimeoutError,\n} from './utils.js';\n","/**\n * Batch Prompt Assembler\n *\n * Assembles prompts for generating multiple orbitals in a single LLM call.\n * Optimized for:\n * - Context sharing (domain vocabulary, design style)\n * - Cross-orbital references (emits/listens wiring)\n * - Token efficiency (shared system context)\n *\n * @packageDocumentation\n */\n\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport type { AssembledPrompt } from '../cache/index.js';\nimport { computeOrbitalFingerprint } from '../cache/index.js';\nimport { getFullOrbitalPrompt } from '@almadar/skills';\nimport {\n getEntityName,\n getFieldNames,\n buildContextSection,\n buildConnectivitySection,\n chunkArray,\n} from '../shared/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Assembled prompt for batch generation.\n */\nexport interface BatchAssembledPrompt extends AssembledPrompt {\n /** Number of orbitals in this batch */\n orbitalCount: number;\n /** Names of orbitals in this batch */\n orbitalNames: string[];\n}\n\n/**\n * Shared context extracted from a batch of orbitals.\n */\nexport interface SharedBatchContext {\n /** Domain vocabulary shared across orbitals */\n domainVocabulary?: Record<string, string>;\n /** Design style (minimal, modern, etc.) */\n designStyle?: string;\n /** Common patterns used */\n commonPatterns?: string[];\n /** Cross-orbital event relationships */\n eventRelationships?: Array<{\n emitter: string;\n event: string;\n listener: string;\n handler: string;\n }>;\n}\n\n// ============================================================================\n// Context Extraction\n// ============================================================================\n\n/**\n * Extract shared context from a batch of orbitals.\n */\nexport function extractSharedContext(orbitals: OrbitalDefinition[]): SharedBatchContext {\n const vocabulary: Record<string, string> = {};\n const styles = new Set<string>();\n const patterns = new Set<string>();\n const relationships: SharedBatchContext['eventRelationships'] = [];\n\n // Build vocabulary from all orbitals\n for (const orbital of orbitals) {\n if (orbital.domainContext?.vocabulary) {\n Object.assign(vocabulary, orbital.domainContext.vocabulary);\n }\n if (orbital.design?.style) {\n styles.add(orbital.design.style);\n }\n // Note: patterns are defined in traits, not at orbital level\n // This would need to be extracted from trait render-ui effects\n }\n\n // Build event relationships\n const orbitalMap = new Map(orbitals.map(o => [o.name, o]));\n \n for (const orbital of orbitals) {\n if (orbital.emits) {\n for (const event of orbital.emits) {\n // Find listeners for this event\n for (const other of orbitals) {\n if (other === orbital) continue;\n if (other.listens) {\n const listener = other.listens.find(l => l.event === event.event);\n if (listener) {\n relationships.push({\n emitter: orbital.name,\n event: event.event,\n listener: other.name,\n handler: listener.triggers,\n });\n }\n }\n }\n }\n }\n }\n\n return {\n domainVocabulary: Object.keys(vocabulary).length > 0 ? vocabulary : undefined,\n designStyle: styles.size === 1 ? Array.from(styles)[0] : undefined,\n commonPatterns: patterns.size > 0 ? Array.from(patterns) : undefined,\n eventRelationships: relationships.length > 0 ? relationships : undefined,\n };\n}\n\n// ============================================================================\n// Batch Prompt Assembly\n// ============================================================================\n\n/**\n * Assemble a batch prompt for generating multiple orbitals in one call.\n *\n * @example\n * ```typescript\n * const batchPrompt = assembleBatchPrompt([\n * { name: \"Products\", entity: {...}, traits: [...] },\n * { name: \"Orders\", entity: {...}, traits: [...] },\n * { name: \"Customers\", entity: {...}, traits: [...] },\n * ]);\n * // Returns a single prompt that generates all 3 orbitals\n * ```\n */\nexport function assembleBatchPrompt(\n orbitals: OrbitalDefinition[],\n options: {\n baseSystemPrompt?: string;\n includeConnectivity?: boolean;\n } = {}\n): BatchAssembledPrompt {\n const {\n baseSystemPrompt = getFullOrbitalPrompt(),\n includeConnectivity = true,\n } = options;\n\n if (orbitals.length === 0) {\n throw new Error('Cannot assemble batch prompt for empty orbitals array');\n }\n\n // Extract shared context\n const sharedContext = extractSharedContext(orbitals);\n\n // Build batch header\n const batchHeader = buildBatchHeader(orbitals, sharedContext);\n\n // Build individual orbital sections\n const orbitalSections = orbitals.map((orbital, index) =>\n buildOrbitalSection(orbital, index + 1, orbitals.length, includeConnectivity)\n );\n\n // Build output format section\n const outputSection = buildOutputSection(orbitals);\n\n // Combine all sections\n const prompt = `${baseSystemPrompt}\n\n${'='.repeat(60)}\nBATCH GENERATION: ${orbitals.length} ORBITALS\n${'='.repeat(60)}\n\n${batchHeader}\n\n${orbitalSections.join('\\n\\n')}\n\n${outputSection}`;\n\n // Generate composite fingerprint\n const fingerprint = generateBatchFingerprint(orbitals);\n\n return {\n prompt,\n fingerprint,\n usedCachedTemplate: false, // Batch doesn't use templates yet\n orbitalCount: orbitals.length,\n orbitalNames: orbitals.map(o => o.name),\n };\n}\n\n/**\n * Build the batch header with shared context.\n */\nfunction buildBatchHeader(\n orbitals: OrbitalDefinition[],\n sharedContext: SharedBatchContext\n): string {\n const lines: string[] = [\n `## Batch Overview`,\n `- Total Orbitals: ${orbitals.length}`,\n `- Orbitals: ${orbitals.map(o => o.name).join(', ')}`,\n ];\n\n if (sharedContext.designStyle) {\n lines.push(`- Design Style: ${sharedContext.designStyle}`);\n }\n\n if (sharedContext.commonPatterns?.length) {\n lines.push(`- Common Patterns: ${sharedContext.commonPatterns.join(', ')}`);\n }\n\n if (sharedContext.domainVocabulary && Object.keys(sharedContext.domainVocabulary).length > 0) {\n lines.push(`\\n## Shared Domain Vocabulary`);\n for (const [term, definition] of Object.entries(sharedContext.domainVocabulary)) {\n lines.push(`- ${term}: ${definition}`);\n }\n }\n\n if (sharedContext.eventRelationships?.length) {\n lines.push(`\\n## Cross-Orbital Event Relationships`);\n for (const rel of sharedContext.eventRelationships) {\n lines.push(`- ${rel.emitter} emits \"${rel.event}\" → ${rel.listener} handles with \"${rel.handler}\"`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Build a section for a single orbital within the batch.\n */\nfunction buildOrbitalSection(\n orbital: OrbitalDefinition,\n index: number,\n total: number,\n includeConnectivity: boolean\n): string {\n const entityName = getEntityName(orbital.entity);\n const fieldNames = getFieldNames(orbital.entity);\n const contextSection = buildContextSection(orbital);\n const connectivitySection = includeConnectivity ? buildConnectivitySection(orbital) : '';\n\n return `---\n## ORBITAL ${index}/${total}: ${orbital.name}\n\n**Entity**: ${entityName}\n**Persistence**: ${(orbital.entity as { persistence?: string }).persistence || 'persistent'}\n**Fields**: ${fieldNames}\n**Traits**: ${orbital.traits.map(t => typeof t === 'string' ? t : 'ref' in t ? t.ref : t.name).join(', ')}\n${contextSection}${connectivitySection ? `**Connectivity**:\\n${connectivitySection}\\n` : ''}\nGenerate a complete FullOrbitalUnit for ${orbital.name} with:\n- Full field definitions with types and validation\n- Trait state machines with transitions and effects\n- Business rule validation using \"guard\" 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${orbital.emits?.length ? '- PRESERVE emits: ' + orbital.emits.map(e => e.event).join(', ') : ''}\n${orbital.listens?.length ? '- PRESERVE listens: ' + orbital.listens.map(l => l.event).join(', ') : ''}`;\n}\n\n/**\n * Build the output format section.\n */\nfunction buildOutputSection(orbitals: OrbitalDefinition[]): string {\n return `---\n## OUTPUT FORMAT\n\nReturn a JSON object with this exact structure:\n\n\\`\\`\\`json\n{\n \"orbitals\": [\n${orbitals.map((o, i) => ` {\n \"name\": \"${o.name}\",\n // ... complete FullOrbitalUnit for ${o.name}\n }${i < orbitals.length - 1 ? ',' : ''}`).join('\\n')}\n ]\n}\n\\`\\`\\`\n\n**CRITICAL RULES:**\n1. Return a SINGLE JSON object with an \"orbitals\" array\n2. Each element in the array is a complete FullOrbitalUnit\n3. Maintain the order: ${orbitals.map(o => o.name).join(', ')}\n4. PRESERVE all emits/listens as specified in each orbital section\n5. Use shared domain vocabulary consistently across all orbitals\n6. Ensure cross-orbital event wiring is maintained\n`;\n}\n\n/**\n * Generate a composite fingerprint for the batch.\n */\nfunction generateBatchFingerprint(orbitals: OrbitalDefinition[]): string {\n const fingerprints = orbitals.map(o => computeOrbitalFingerprint(o));\n const combined = fingerprints.sort().join('|');\n \n // Simple hash of combined fingerprints\n let hash = 0;\n for (let i = 0; i < combined.length; i++) {\n const char = combined.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n \n return `batch:${orbitals.length}:${Math.abs(hash).toString(16).slice(0, 8)}`;\n}\n\n// ============================================================================\n// Batch Splitting\n// ============================================================================\n\n/**\n * Split orbitals into optimally-sized batches.\n *\n * Considers:\n * - Provider token limits\n * - Cross-orbital relationships (keeps related orbitals together)\n * - Batch size limits\n *\n * @example\n * ```typescript\n * const batches = splitIntoBatches(orbitals, {\n * maxBatchSize: 3,\n * provider: 'anthropic'\n * });\n * // Returns: [[orb1, orb2, orb3], [orb4, orb5], [orb6]]\n * ```\n */\nexport function splitIntoBatches(\n orbitals: OrbitalDefinition[],\n options: {\n maxBatchSize?: number;\n provider?: 'anthropic' | 'openai' | 'deepseek' | 'kimi' | 'openrouter';\n preserveRelationships?: boolean;\n } = {}\n): OrbitalDefinition[][] {\n const {\n maxBatchSize = 3,\n preserveRelationships = true,\n } = options;\n\n if (!preserveRelationships) {\n // Simple chunking without relationship preservation\n return chunkArray(orbitals, maxBatchSize);\n }\n\n // Group orbitals by relationship clusters\n const clusters = groupByRelationships(orbitals);\n \n // Split clusters into batches respecting maxBatchSize\n const batches: OrbitalDefinition[][] = [];\n \n for (const cluster of clusters) {\n if (cluster.length <= maxBatchSize) {\n // Cluster fits in one batch\n batches.push(cluster);\n } else {\n // Split large cluster\n batches.push(...chunkArray(cluster, maxBatchSize));\n }\n }\n\n return batches;\n}\n\n/**\n * Group orbitals into relationship clusters.\n * Orbitals that emit/listen to each other are grouped together.\n */\nfunction groupByRelationships(orbitals: OrbitalDefinition[]): OrbitalDefinition[][] {\n const visited = new Set<string>();\n const clusters: OrbitalDefinition[][] = [];\n\n // Build adjacency map\n const adjacency = new Map<string, Set<string>>();\n \n for (const orbital of orbitals) {\n if (!adjacency.has(orbital.name)) {\n adjacency.set(orbital.name, new Set());\n }\n\n // Add connections based on emits/listens\n if (orbital.emits) {\n for (const event of orbital.emits) {\n // Find listeners for this event\n for (const other of orbitals) {\n if (other === orbital) continue;\n if (other.listens?.some(l => l.event === event.event)) {\n adjacency.get(orbital.name)?.add(other.name);\n if (!adjacency.has(other.name)) {\n adjacency.set(other.name, new Set());\n }\n adjacency.get(other.name)?.add(orbital.name);\n }\n }\n }\n }\n }\n\n // Find connected components using DFS\n function dfs(orbital: OrbitalDefinition, cluster: OrbitalDefinition[]) {\n visited.add(orbital.name);\n cluster.push(orbital);\n\n const neighbors = adjacency.get(orbital.name) || new Set();\n for (const neighborName of neighbors) {\n if (!visited.has(neighborName)) {\n const neighbor = orbitals.find(o => o.name === neighborName);\n if (neighbor) {\n dfs(neighbor, cluster);\n }\n }\n }\n }\n\n // Find all clusters\n for (const orbital of orbitals) {\n if (!visited.has(orbital.name)) {\n const cluster: OrbitalDefinition[] = [];\n dfs(orbital, cluster);\n clusters.push(cluster);\n }\n }\n\n return clusters;\n}\n\n// ============================================================================\n// Token Estimation\n// ============================================================================\n\n/**\n * Estimate token count for a batch prompt.\n * Rough estimate: ~4 characters per token.\n */\nexport function estimateBatchTokens(orbitals: OrbitalDefinition[]): number {\n const baseTokens = 2000; // System prompt overhead\n const perOrbitalTokens = 800; // Average orbital description\n \n return baseTokens + (orbitals.length * perOrbitalTokens);\n}\n\n/**\n * Check if a batch will fit within token limits.\n */\nexport function willBatchFit(\n orbitals: OrbitalDefinition[],\n maxTokens: number = 12000\n): boolean {\n const estimated = estimateBatchTokens(orbitals);\n // Leave 50% buffer for response\n return estimated < (maxTokens * 0.5);\n}\n","/**\n * Concurrency Controller\n *\n * Semaphore-based concurrency control for parallel operations.\n *\n * @packageDocumentation\n */\n\nimport type { ConcurrencyController } from './types.js';\n\n/**\n * Create a semaphore-based concurrency controller.\n *\n * @example\n * ```typescript\n * const controller = createConcurrencyController(3); // Max 3 concurrent\n *\n * await controller.acquire(); // Acquire slot\n * try {\n * await doWork();\n * } finally {\n * controller.release(); // Release slot\n * }\n * ```\n */\nexport function createConcurrencyController(maxConcurrency: number): ConcurrencyController {\n let activeCount = 0;\n const queue: Array<() => void> = [];\n\n return {\n async acquire(): Promise<void> {\n if (activeCount < maxConcurrency) {\n activeCount++;\n return Promise.resolve();\n }\n\n return new Promise((resolve) => {\n queue.push(() => {\n activeCount++;\n resolve();\n });\n });\n },\n\n release(): void {\n activeCount = Math.max(0, activeCount - 1);\n const next = queue.shift();\n if (next) {\n next();\n }\n },\n\n get activeCount(): number {\n return activeCount;\n },\n\n get waitingCount(): number {\n return queue.length;\n },\n };\n}\n\n/**\n * Execute an array of async functions with concurrency control.\n *\n * @example\n * ```typescript\n * const results = await runWithConcurrency(\n * items.map(item => () => processItem(item)),\n * { concurrency: 3 }\n * );\n * ```\n */\nexport async function runWithConcurrency<T>(\n tasks: Array<() => Promise<T>>,\n options: { concurrency: number; onProgress?: (completed: number, total: number) => void }\n): Promise<T[]> {\n const { concurrency, onProgress } = options;\n const controller = createConcurrencyController(concurrency);\n const results: T[] = [];\n let completed = 0;\n\n await Promise.all(\n tasks.map(async (task, index) => {\n await controller.acquire();\n try {\n results[index] = await task();\n completed++;\n onProgress?.(completed, tasks.length);\n } finally {\n controller.release();\n }\n })\n );\n\n return results;\n}\n\n/**\n * Async map with concurrency limit.\n *\n * Similar to Promise.all() but with max concurrency.\n *\n * @example\n * ```typescript\n * const results = await asyncMapWithConcurrency(\n * items,\n * async (item, index) => process(item),\n * 3 // max 3 concurrent\n * );\n * ```\n */\nexport async function asyncMapWithConcurrency<T, R>(\n items: T[],\n mapper: (item: T, index: number) => Promise<R>,\n concurrency: number\n): Promise<R[]> {\n return runWithConcurrency(\n items.map((item, index) => () => mapper(item, index)),\n { concurrency }\n );\n}\n","/**\n * Batch Generator\n *\n * Core batch generation logic for generating multiple orbitals efficiently.\n * Supports multiple modes: single-call, parallel-individual, adaptive.\n *\n * @packageDocumentation\n */\n\nimport type { LLMClient } from '@almadar/llm';\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport {\n createLog,\n getErrorMessage,\n PROVIDER_CONCURRENCY_LIMITS,\n PROVIDER_BATCH_SIZES,\n BATCH_MAX_TOKENS,\n} from '../shared/index.js';\nimport type {\n GenerationLog,\n BatchGenerationOptions,\n BatchGenerationResult,\n BatchProgressEvent,\n SingleBatchResult,\n} from './types.js';\nimport { assembleBatchPrompt, splitIntoBatches, willBatchFit } from './prompt-assembler.js';\nimport { asyncMapWithConcurrency } from './concurrency.js';\n\n// ============================================================================\n// Main Batch Generation Function\n// ============================================================================\n\n/**\n * Generate multiple orbitals in optimized batches.\n *\n * This is the main entry point for batch generation. It:\n * 1. Splits orbitals into optimal batches\n * 2. Generates each batch (parallel or sequential)\n * 3. Combines results into final schema\n *\n * @example\n * ```typescript\n * const result = await generateOrbitalsBatch(client, [\n * { name: \"Products\", ... },\n * { name: \"Orders\", ... },\n * { name: \"Customers\", ... },\n * ], { mode: 'single-call', batchSize: 3 });\n *\n * console.log(`Generated ${result.summary.successful}/${result.summary.total} orbitals`);\n * console.log(`Total time: ${result.totalDurationMs}ms`);\n * ```\n */\nexport async function generateOrbitalsBatch(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n options: BatchGenerationOptions = {}\n): Promise<BatchGenerationResult> {\n const startTime = Date.now();\n const aggregateLogs: GenerationLog[] = [];\n \n const provider = client.getProvider();\n const mode = options.mode || 'single-call';\n const maxConcurrency = options.concurrency ?? PROVIDER_CONCURRENCY_LIMITS[provider];\n const maxBatchSize = options.batchSize ?? PROVIDER_BATCH_SIZES[provider];\n\n console.log(`[BatchGenerator] Starting batch generation: ${orbitals.length} orbitals, mode=${mode}, concurrency=${maxConcurrency}`);\n\n aggregateLogs.push(createLog('info', `Starting batch generation`, {\n totalOrbitals: orbitals.length,\n mode,\n provider,\n maxConcurrency,\n maxBatchSize,\n }));\n\n // Split into batches\n const batches = splitIntoBatches(orbitals, {\n maxBatchSize,\n provider,\n preserveRelationships: options.preserveRelationships ?? true,\n });\n\n console.log(`[BatchGenerator] Split into ${batches.length} batches: [${batches.map(b => b.length).join(', ')}]`);\n\n aggregateLogs.push(createLog('info', `Split into ${batches.length} batches`, {\n batchSizes: batches.map(b => b.length),\n }));\n\n // Emit batch start event\n options.onBatchProgress?.({\n type: 'batch_start',\n batchIndex: 0,\n totalBatches: batches.length,\n completedOrbitals: 0,\n totalOrbitals: orbitals.length,\n });\n\n // Generate batches based on mode\n let batchResults: SingleBatchResult[];\n \n if (mode === 'parallel-individual') {\n // Each orbital gets its own LLM call, but calls are parallel\n batchResults = await generateParallelIndividual(client, orbitals, {\n ...options,\n concurrency: maxConcurrency,\n onBatchProgress: options.onBatchProgress,\n });\n } else if (mode === 'single-call') {\n // Multiple orbitals per LLM call\n batchResults = await generateSingleCallBatches(client, batches, {\n ...options,\n concurrency: maxConcurrency,\n onBatchProgress: options.onBatchProgress,\n });\n } else {\n // Adaptive: use single-call if fits, otherwise parallel-individual\n batchResults = await generateAdaptive(client, orbitals, batches, {\n ...options,\n concurrency: maxConcurrency,\n maxBatchSize,\n onBatchProgress: options.onBatchProgress,\n });\n }\n\n const totalDurationMs = Date.now() - startTime;\n \n // Aggregate results\n const allResults = batchResults.flatMap(b => b.results);\n const successful = allResults.filter(r => r.success).length;\n const failed = allResults.length - successful;\n const totalTokens = batchResults.reduce(\n (sum, b) => sum + (b.usage?.totalTokens ?? 0),\n 0\n );\n\n console.log(`[BatchGenerator] Complete: ${successful}/${allResults.length} successful, ${totalTokens} tokens, ${totalDurationMs}ms`);\n\n aggregateLogs.push(createLog('info', `Batch generation completed`, {\n totalDurationMs,\n successful,\n failed,\n totalTokens,\n totalBatches: batches.length,\n }));\n\n // Emit completion event\n options.onBatchProgress?.({\n type: 'batch_complete',\n batchIndex: batches.length - 1,\n totalBatches: batches.length,\n completedOrbitals: successful,\n totalOrbitals: orbitals.length,\n });\n\n return {\n results: allResults.map(r => ({\n orbital: r.orbital,\n fingerprint: '', // TODO: compute from orbital\n usedTemplate: false,\n usage: undefined,\n validation: r.success\n ? { valid: true, errorCount: 0, warningCount: 0 }\n : { valid: false, errorCount: 1, warningCount: 0 },\n logs: [],\n })),\n totalDurationMs,\n aggregateLogs,\n summary: {\n total: allResults.length,\n successful,\n failed,\n totalTokens,\n },\n batchResults,\n totalBatches: batches.length,\n };\n}\n\n// ============================================================================\n// Generation Modes\n// ============================================================================\n\n/**\n * Generate using single-call batches (multiple orbitals per LLM call).\n */\nasync function generateSingleCallBatches(\n client: LLMClient,\n batches: OrbitalDefinition[][],\n options: BatchGenerationOptions & { concurrency: number }\n): Promise<SingleBatchResult[]> {\n let completedOrbitals = 0;\n const totalOrbitals = batches.reduce((sum, b) => sum + b.length, 0);\n\n return asyncMapWithConcurrency(\n batches,\n async (batch, batchIndex) => {\n return generateSingleBatch(client, batch, batchIndex, {\n ...options,\n onProgress: (completedInBatch) => {\n const newCompleted = completedOrbitals + completedInBatch;\n options.onBatchProgress?.({\n type: 'orbital_complete',\n batchIndex,\n totalBatches: batches.length,\n completedOrbitals: newCompleted,\n totalOrbitals,\n });\n completedOrbitals = newCompleted;\n },\n });\n },\n options.concurrency\n );\n}\n\n/**\n * Generate using parallel individual calls (one orbital per LLM call).\n */\nasync function generateParallelIndividual(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n options: BatchGenerationOptions & { concurrency: number }\n): Promise<SingleBatchResult[]> {\n // Create single-orbital batches\n const batches = orbitals.map(o => [o]);\n \n return generateSingleCallBatches(client, batches, {\n ...options,\n concurrency: options.concurrency,\n });\n}\n\n/**\n * Adaptive mode: choose best strategy based on orbitals.\n * \n * Strategy:\n * - If we can fit multiple orbitals per batch, use single-call batches\n * - This provides true speedup (one LLM call for 2-3 orbitals)\n */\nasync function generateAdaptive(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n batches: OrbitalDefinition[][],\n options: BatchGenerationOptions & { concurrency: number; maxBatchSize: number }\n): Promise<SingleBatchResult[]> {\n // Check if all batches can fit in single LLM calls\n const allFit = batches.every(batch => willBatchFit(batch, BATCH_MAX_TOKENS));\n \n // Use single-call batches if they fit and we have a reasonable number\n // This provides 2x+ speedup by generating multiple orbitals per LLM call\n if (allFit) {\n console.log(`[BatchGenerator] Adaptive: Using single-call batches (${batches.length} batches)`);\n return generateSingleCallBatches(client, batches, options);\n }\n \n // Fall back to parallel individual if batches are too large\n console.log(`[BatchGenerator] Adaptive: Using parallel-individual (batches too large)`);\n return generateParallelIndividual(client, orbitals, options);\n}\n\n// ============================================================================\n// Single Batch Generation\n// ============================================================================\n\n/**\n * Generate a single batch of orbitals.\n */\nasync function generateSingleBatch(\n client: LLMClient,\n orbitals: OrbitalDefinition[],\n batchIndex: number,\n options: BatchGenerationOptions & { onProgress?: (completed: number) => void }\n): Promise<SingleBatchResult> {\n const batchStartTime = Date.now();\n const logs: GenerationLog[] = [];\n\n console.log(`[BatchGenerator] Starting batch ${batchIndex + 1}: ${orbitals.map(o => o.name).join(', ')}`);\n\n logs.push(createLog('info', `Starting batch ${batchIndex + 1}`, {\n orbitalCount: orbitals.length,\n orbitals: orbitals.map(o => o.name),\n }));\n\n try {\n // Assemble batch prompt\n const batchPrompt = assembleBatchPrompt(orbitals);\n console.log(`[BatchGenerator] Batch ${batchIndex + 1} prompt assembled: ${batchPrompt.prompt.length} chars`);\n \n logs.push(createLog('info', `Batch prompt assembled`, {\n promptLength: batchPrompt.prompt.length,\n estimatedTokens: Math.ceil(batchPrompt.prompt.length / 4),\n }));\n\n // Make LLM call\n const llmResult = await client.callWithMetadata({\n systemPrompt: batchPrompt.prompt,\n userPrompt: 'Generate all orbitals in the batch. Return valid JSON matching the output format specified.',\n maxTokens: BATCH_MAX_TOKENS,\n skipSchemaValidation: true,\n });\n\n logs.push(createLog('info', `LLM call completed`, {\n promptTokens: llmResult.usage?.promptTokens,\n completionTokens: llmResult.usage?.completionTokens,\n }));\n\n // Parse result\n const parsed = parseBatchResult(llmResult.data, orbitals);\n console.log(`[BatchGenerator] Batch ${batchIndex + 1} parsed: ${parsed.filter(p => p.success).length}/${parsed.length} successful`);\n \n // Report progress\n for (let i = 0; i < parsed.length; i++) {\n options.onProgress?.(i + 1);\n }\n\n const durationMs = Date.now() - batchStartTime;\n\n logs.push(createLog('info', `Batch ${batchIndex + 1} completed`, {\n durationMs,\n successful: parsed.filter(r => r.success).length,\n }));\n\n return {\n orbitals,\n results: parsed,\n usage: llmResult.usage ?? undefined,\n durationMs,\n logs,\n };\n\n } catch (error) {\n const errorMessage = getErrorMessage(error);\n console.error(`[BatchGenerator] Batch ${batchIndex + 1} FAILED: ${errorMessage}`);\n \n logs.push(createLog('error', `Batch ${batchIndex + 1} failed`, {\n error: errorMessage,\n }));\n\n // Return failed results for all orbitals in batch\n return {\n orbitals,\n results: orbitals.map(o => ({\n orbital: o,\n success: false,\n error: errorMessage,\n })),\n durationMs: Date.now() - batchStartTime,\n logs,\n };\n }\n}\n\n// ============================================================================\n// Result Parsing\n// ============================================================================\n\n/**\n * Parse batch generation result.\n */\nfunction parseBatchResult(\n data: unknown,\n expectedOrbitals: OrbitalDefinition[]\n): Array<{ orbital: OrbitalDefinition; success: boolean; error?: string }> {\n if (!data || typeof data !== 'object') {\n return expectedOrbitals.map(o => ({\n orbital: o,\n success: false,\n error: 'Invalid response: expected object',\n }));\n }\n\n const obj = data as Record<string, unknown>;\n \n // Check for orbitals array\n if (!obj.orbitals || !Array.isArray(obj.orbitals)) {\n return expectedOrbitals.map(o => ({\n orbital: o,\n success: false,\n error: 'Invalid response: missing orbitals array',\n }));\n }\n\n const results = obj.orbitals as OrbitalDefinition[];\n \n // Match results to expected orbitals\n return expectedOrbitals.map((expected, index) => {\n const result = results[index];\n \n if (!result) {\n return {\n orbital: expected,\n success: false,\n error: `Missing result for orbital ${index + 1}`,\n };\n }\n\n // Basic validation\n if (!result.name) {\n return {\n orbital: expected,\n success: false,\n error: 'Generated orbital missing name',\n };\n }\n\n return {\n orbital: result,\n success: true,\n };\n });\n}\n\n// ============================================================================\n// Utilities\n// ============================================================================\n\n/**\n * Estimate optimal batch configuration for a set of orbitals.\n */\nexport function estimateOptimalBatchConfig(\n orbitals: OrbitalDefinition[],\n provider: 'anthropic' | 'openai' | 'deepseek' | 'kimi' | 'openrouter'\n): {\n recommendedMode: 'single-call' | 'parallel-individual';\n optimalBatchSize: number;\n estimatedBatches: number;\n estimatedTimeSeconds: number;\n} {\n const defaultBatchSize = PROVIDER_BATCH_SIZES[provider];\n const concurrency = PROVIDER_CONCURRENCY_LIMITS[provider];\n \n // Check if single-call is feasible\n const canSingleCall = willBatchFit(orbitals, BATCH_MAX_TOKENS);\n \n if (canSingleCall && orbitals.length <= defaultBatchSize) {\n return {\n recommendedMode: 'single-call',\n optimalBatchSize: orbitals.length,\n estimatedBatches: 1,\n estimatedTimeSeconds: 60, // ~60s for single batch\n };\n }\n \n // Multiple batches needed\n const batchSize = defaultBatchSize;\n const numBatches = Math.ceil(orbitals.length / batchSize);\n const parallelBatches = Math.ceil(numBatches / concurrency);\n \n return {\n recommendedMode: 'single-call',\n optimalBatchSize: batchSize,\n estimatedBatches: numBatches,\n estimatedTimeSeconds: parallelBatches * 60,\n };\n}\n","/**\n * Batch Orbital Generation\n *\n * Efficient batch generation of multiple orbitals using:\n * - Single-call batch mode (multiple orbitals per LLM call)\n * - Parallel individual mode (concurrent single-orbital calls)\n * - Adaptive mode (automatically chooses best strategy)\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Core Generation\n// ============================================================================\n\nexport {\n generateOrbitalsBatch,\n estimateOptimalBatchConfig,\n} from './batch-generator.js';\n\n// ============================================================================\n// Prompt Assembly\n// ============================================================================\n\nexport {\n assembleBatchPrompt,\n splitIntoBatches,\n extractSharedContext,\n estimateBatchTokens,\n willBatchFit,\n type BatchAssembledPrompt,\n type SharedBatchContext,\n} from './prompt-assembler.js';\n\n// ============================================================================\n// Concurrency\n// ============================================================================\n\nexport {\n createConcurrencyController,\n runWithConcurrency,\n asyncMapWithConcurrency,\n} from './concurrency.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport {\n type BatchGenerationOptions,\n type BatchGenerationResult,\n type BatchProgressEvent,\n type SingleBatchResult,\n type ConcurrencyController,\n type BatchMode,\n type SingleCallBatchOptions,\n type ParallelIndividualOptions,\n type AdaptiveBatchOptions,\n} from './types.js';\n","/**\n * Orbital Batch Subagent Tool\n *\n * Tool for generating multiple orbitals in optimized batches.\n * Provides significant speedup (2x-3x) for multi-orbital generation.\n *\n * @packageDocumentation\n */\n\nimport { tool } from '@langchain/core/tools';\nimport { z } from 'zod';\nimport type { OrbitalDefinition } from '@almadar/core/types';\nimport { LLMClient, type LLMProvider } from '@almadar/llm';\nimport type { SSEEventType } from '../api-types.js';\nimport {\n type ExtractedRequirements,\n createLog,\n PROVIDER_CONCURRENCY_LIMITS,\n} from '../orbitals/shared/index.js';\nimport {\n generateOrbitalsBatch,\n type BatchGenerationOptions,\n type BatchProgressEvent,\n} from '../orbitals/batch/index.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n// Note: This matches the signature from orbital-subagent.ts for compatibility\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 BatchCompleteCallback = (\n orbitals: OrbitalDefinition[],\n batchIndex: number,\n totalBatches: number,\n) => Promise<void> | void;\n\nexport interface OrbitalBatchSubagentToolOptions {\n onSubagentEvent?: SubagentEventCallback;\n onBatchComplete?: BatchCompleteCallback;\n requirements?: Partial<ExtractedRequirements>;\n provider?: LLMProvider;\n model?: string;\n workDir?: string;\n}\n\n// ============================================================================\n// Zod Schema\n// ============================================================================\n\nconst OrbitalBatchInputSchema = z.object({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n orbitals: z.array(z.any()).describe('Array of OrbitalUnits to generate'),\n options: z\n .object({\n mode: z.enum(['single-call', 'parallel-individual', 'adaptive']).optional().default('adaptive'),\n batchSize: z.number().optional(),\n maxConcurrency: z.number().optional(),\n preserveRelationships: z.boolean().optional().default(true),\n })\n .optional()\n .describe('Batch generation options'),\n});\n\n// ============================================================================\n// Tool Factory\n// ============================================================================\n\n/**\n * Create a tool for batch orbital generation with event streaming.\n */\nexport function createOrbitalBatchSubagentTool(options: OrbitalBatchSubagentToolOptions = {}) {\n let eventCallback: SubagentEventCallback | undefined = options.onSubagentEvent;\n let completeCallback: BatchCompleteCallback | undefined = options.onBatchComplete;\n const requirements = options.requirements;\n const workDir = options.workDir;\n\n const setEventCallback = (callback: SubagentEventCallback) => {\n eventCallback = callback;\n };\n\n const setBatchCompleteCallback = (callback: BatchCompleteCallback) => {\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 batchTool = tool(\n async ({ orbitals, options: batchOptions }) => {\n if (!orbitals || orbitals.length === 0) {\n return JSON.stringify({\n success: false,\n error: 'No orbitals provided for batch generation.',\n orbitals: [],\n });\n }\n\n console.log(`[OrbitalBatchSubagent] Starting batch generation for ${orbitals.length} orbitals`);\n\n try {\n emitEvent('batch', 0, 1, 'message', {\n content: `Starting batch generation for ${orbitals.length} orbitals`,\n role: 'assistant',\n isComplete: false,\n });\n\n emitEvent('batch', 0, 1, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status: 'pending' as const,\n })),\n });\n\n // Create LLM client\n const client = new LLMClient({\n provider: options.provider || 'anthropic',\n model: options.model || 'claude-sonnet-4-20250514',\n });\n\n // Prepare batch generation options\n const generationOptions: BatchGenerationOptions = {\n mode: batchOptions?.mode || 'adaptive',\n batchSize: batchOptions?.batchSize,\n concurrency: batchOptions?.maxConcurrency ?? PROVIDER_CONCURRENCY_LIMITS[client.getProvider()],\n preserveRelationships: batchOptions?.preserveRelationships ?? true,\n requirements,\n onBatchProgress: (event: BatchProgressEvent) => {\n // Update todo for orbital completion\n if (event.type === 'orbital_complete' && event.orbitalName) {\n emitEvent(event.orbitalName || 'batch', event.batchIndex, event.totalBatches, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status:\n o.name === event.orbitalName\n ? 'completed'\n : event.completedOrbitals > i\n ? 'completed'\n : 'pending',\n })),\n });\n }\n\n // Log progress\n emitEvent(event.orbitalName || 'batch', event.batchIndex, event.totalBatches, 'generation_log', {\n level: 'info',\n message: `Progress: ${event.completedOrbitals}/${event.totalOrbitals} orbitals complete`,\n data: {\n batchIndex: event.batchIndex,\n completedOrbitals: event.completedOrbitals,\n totalOrbitals: event.totalOrbitals,\n },\n });\n },\n };\n\n emitEvent('batch', 0, 1, 'tool_call', {\n tool: 'generateOrbitalsBatch',\n args: {\n orbitalCount: orbitals.length,\n mode: generationOptions.mode,\n concurrency: generationOptions.concurrency,\n },\n });\n\n // Execute batch generation\n const result = await generateOrbitalsBatch(client, orbitals, generationOptions);\n\n // Report completion\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'todo_update', {\n todos: orbitals.map((o, i) => ({\n id: `orbital-${i}`,\n task: `Generate ${o.name}`,\n status: result.batchResults.some(\n b => b.results.some(r => r.orbital.name === o.name && r.success)\n )\n ? 'completed'\n : 'failed',\n })),\n });\n\n // Extract generated orbitals\n const generatedOrbitals = result.results\n .filter(r => r.orbital)\n .map(r => r.orbital);\n\n const successCount = generatedOrbitals.length;\n const failedCount = orbitals.length - successCount;\n\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'message', {\n content: `Batch generation complete: ${successCount}/${orbitals.length} orbitals generated successfully`,\n role: 'assistant',\n isComplete: true,\n });\n\n // Persist orbitals if workDir provided\n if (workDir && completeCallback && generatedOrbitals.length > 0) {\n try {\n await completeCallback(generatedOrbitals, 0, 1);\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'generation_log', {\n level: 'info',\n message: `Persisted ${generatedOrbitals.length} orbitals`,\n });\n } catch (persistError) {\n console.error(`[OrbitalBatchSubagent] Failed to persist orbitals:`, persistError);\n emitEvent('batch', result.totalBatches - 1, result.totalBatches, 'generation_log', {\n level: 'warn',\n message: 'Failed to persist some orbitals',\n data: { error: String(persistError) },\n });\n }\n }\n\n return JSON.stringify({\n success: successCount === orbitals.length,\n generated: successCount,\n failed: failedCount,\n total: orbitals.length,\n orbitals: generatedOrbitals,\n duration: result.totalDurationMs,\n totalTokens: result.summary.totalTokens,\n batches: result.totalBatches,\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`[OrbitalBatchSubagent] Batch generation failed:`, errorMessage);\n\n emitEvent('batch', 0, 1, 'error', {\n error: errorMessage,\n code: 'BATCH_GENERATION_ERROR',\n });\n\n return JSON.stringify({\n success: false,\n error: errorMessage,\n orbitals: [],\n });\n }\n },\n {\n name: 'generate_orbitals_batch',\n description:\n 'Generate multiple orbitals in optimized batches. MUCH FASTER than calling generate_orbital multiple times. Use this when generating 3+ orbitals. Supports parallel generation with automatic concurrency control.',\n schema: OrbitalBatchInputSchema,\n },\n );\n\n return {\n tool: batchTool,\n setEventCallback,\n setBatchCompleteCallback,\n };\n}\n\n// ============================================================================\n// Re-export Types (avoid duplicates - use explicit renames if needed)\n// ============================================================================\n\n// Types already exported above, no need to re-export\n","/**\n * Orbital Count Estimator - LLM-Based\n * \n * Uses a fast, cheap LLM (GPT-4o-mini or GPT-5-mini) to estimate orbital complexity\n * from natural language requests. Much more accurate and scalable than keyword matching.\n * \n * Cost: ~$0.0001 per estimate (~500 tokens total)\n * Latency: ~100-200ms\n * \n * @packageDocumentation\n */\n\nimport type { OrbitalEstimation } from './types.js';\n\n// Lazy import to avoid circular dependencies\nlet StructuredOutputClient: any;\n\ninterface LLMEstimationResult {\n count: number;\n confidence: number;\n domains: string[];\n entities: string[];\n reasoning: string;\n complexityFactors: string[];\n}\n\nconst ESTIMATION_SCHEMA = {\n type: 'object',\n properties: {\n count: {\n type: 'integer',\n description: 'Estimated number of orbital units (1-10). Each orbital = entity + traits + pages.',\n minimum: 1,\n maximum: 10\n },\n confidence: {\n type: 'number',\n description: 'Confidence in estimate (0.0-1.0). Higher = more certain.',\n minimum: 0,\n maximum: 1\n },\n domains: {\n type: 'array',\n description: 'Detected business domains (e.g., ecommerce, healthcare, finance)',\n items: { type: 'string' }\n },\n entities: {\n type: 'array',\n description: 'Core entities identified in the request',\n items: { type: 'string' }\n },\n reasoning: {\n type: 'string',\n description: 'Brief explanation of the estimation'\n },\n complexityFactors: {\n type: 'array',\n description: 'Factors that increased complexity',\n items: { type: 'string' }\n }\n },\n required: ['count', 'confidence', 'domains', 'entities', 'reasoning', 'complexityFactors'],\n additionalProperties: false\n};\n\nconst ESTIMATION_SYSTEM_PROMPT = `You are an expert application architect specializing in estimating software complexity.\n\nAn \"orbital unit\" represents a cohesive functional module in an application:\n- 1 orbital = simple app (blog, landing page, todo list)\n- 2-3 orbitals = medium app (e-commerce with products/orders, blog with users)\n- 4-5 orbitals = complex app (multi-vendor marketplace, project management)\n- 6+ orbitals = enterprise app (ERP, hospital system, banking platform)\n\nAnalyze the user's request and estimate:\n1. Number of orbital units needed\n2. Your confidence in this estimate\n3. Business domains involved\n4. Core entities that will be needed\n5. Complexity factors (workflows, multi-tenancy, integrations, etc.)\n\nBe conservative: if unsure, round up. A common mistake is underestimating complexity.`;\n\n/**\n * Estimate orbital count using LLM (recommended for production)\n */\nexport async function estimateOrbitalCountLLM(\n request: string,\n options?: { model?: string; timeoutMs?: number }\n): Promise<OrbitalEstimation> {\n // Lazy load to avoid issues if OPENAI_API_KEY isn't set\n if (!StructuredOutputClient) {\n const { getStructuredOutputClient } = await import('@almadar/llm');\n StructuredOutputClient = getStructuredOutputClient;\n }\n\n const client = StructuredOutputClient({\n model: options?.model || 'gpt-5-mini', // Fast and cheap\n temperature: 0.2, // Low temperature for consistency\n });\n\n const timeoutMs = options?.timeoutMs || 5000;\n\n try {\n const result = await Promise.race([\n (client.generate as any)({\n userRequest: request,\n systemPrompt: ESTIMATION_SYSTEM_PROMPT,\n jsonSchema: ESTIMATION_SCHEMA,\n schemaName: 'orbital_estimation',\n maxTokens: 1000,\n }),\n new Promise<never>((_, reject) => \n setTimeout(() => reject(new Error('Estimation timeout')), timeoutMs)\n )\n ]);\n\n return {\n count: result.data.count,\n confidence: result.data.confidence,\n domains: result.data.domains,\n reasoning: result.data.reasoning,\n // Additional metadata for debugging\n _metadata: {\n entities: result.data.entities,\n complexityFactors: result.data.complexityFactors,\n latencyMs: result.latencyMs,\n tokensUsed: result.usage.totalTokens,\n model: result.model\n }\n };\n } catch (error) {\n // Fallback to heuristic estimation on LLM failure\n console.warn(`LLM estimation failed: ${error}. Falling back to heuristic.`);\n return estimateOrbitalCountHeuristic(request);\n }\n}\n\n/**\n * Heuristic estimation (no LLM required) - used as fallback\n * Less accurate but works offline and without API keys\n */\nexport function estimateOrbitalCountHeuristic(request: string): OrbitalEstimation {\n const lowerRequest = request.toLowerCase();\n \n // Score based on entity mentions\n const entityPatterns = [\n /\\busers?\\b/g, /\\bproducts?\\b/g, /\\borders?\\b/g, \n /\\bcustomers?\\b/g, /\\binvoices?\\b/g, /\\bpayments?\\b/g,\n /\\bpatients?\\b/g, /\\bdoctors?\\b/g, /\\bappointments?\\b/g,\n /\\bcourses?\\b/g, /\\bstudents?\\b/g, /\\bteachers?\\b/g,\n /\\btasks?\\b/g, /\\bprojects?\\b/g, /\\bteams?\\b/g\n ];\n \n let entityCount = 0;\n for (const pattern of entityPatterns) {\n const matches = lowerRequest.match(pattern);\n if (matches) {\n entityCount += matches.length;\n }\n }\n \n // Domain complexity indicators\n const complexDomains = [\n 'erp', 'enterprise', 'healthcare', 'hospital', 'banking', \n 'insurance', 'finance', 'multi-tenant', 'workflow', 'b2b'\n ];\n \n let domainComplexity = 0;\n for (const domain of complexDomains) {\n if (lowerRequest.includes(domain)) {\n domainComplexity += 1;\n }\n }\n \n // Feature complexity\n const complexFeatures = [\n 'workflow', 'approval', 'rbac', 'audit', 'reporting',\n 'analytics', 'integration', 'api', 'real-time', 'notifications'\n ];\n \n let featureComplexity = 0;\n for (const feature of complexFeatures) {\n if (lowerRequest.includes(feature)) {\n featureComplexity += 0.5;\n }\n }\n \n // Calculate base count from entities\n let count = Math.max(1, Math.round(entityCount * 0.7));\n \n // Add complexity adjustments\n count += Math.floor(domainComplexity * 1.5);\n count += Math.floor(featureComplexity);\n \n // Bounds\n count = Math.max(1, Math.min(count, 10));\n \n // Confidence based on clarity\n const hasClearEntities = entityCount > 0;\n const hasDomainIndicators = domainComplexity > 0;\n const confidence = hasClearEntities \n ? (hasDomainIndicators ? 0.7 : 0.6)\n : 0.4;\n \n return {\n count,\n confidence,\n domains: complexDomains.filter(d => lowerRequest.includes(d)),\n reasoning: `Heuristic: ${entityCount} entities, ${domainComplexity} complex domains, ${featureComplexity} features`,\n _metadata: { method: 'heuristic' }\n };\n}\n\n/**\n * Primary estimation function - uses LLM by default, falls back to heuristic\n * \n * NOTE: LLM estimation is strongly recommended for production use.\n * Heuristic estimation significantly underestimates complex apps (see eval results).\n */\nexport async function estimateOrbitalCount(\n request: string,\n options?: { useLLM?: boolean; model?: string; timeoutMs?: number }\n): Promise<OrbitalEstimation> {\n // Always use LLM by default for accuracy\n const shouldUseLLM = options?.useLLM !== false;\n \n if (shouldUseLLM && process.env.OPENAI_API_KEY) {\n try {\n return await estimateOrbitalCountLLM(request, { \n model: options?.model,\n timeoutMs: options?.timeoutMs \n });\n } catch (error) {\n console.warn('⚠️ LLM estimation failed, using heuristic fallback. ' +\n 'For production, ensure OPENAI_API_KEY is set for accurate estimation.');\n }\n }\n \n // Fallback to heuristic (with warning in non-test environments)\n if (shouldUseLLM && !process.env.OPENAI_API_KEY && process.env.NODE_ENV !== 'test') {\n console.warn('⚠️ OPENAI_API_KEY not set. Using heuristic estimation which ' +\n 'significantly underestimates complex apps. Set OPENAI_API_KEY for accurate routing.');\n }\n \n return estimateOrbitalCountHeuristic(request);\n}\n\n/**\n * Quick synchronous estimate (always uses heuristic)\n */\nexport function quickEstimate(request: string): number {\n const estimation = estimateOrbitalCountHeuristic(request);\n return estimation.count;\n}\n\n/**\n * Batch estimation for multiple requests (uses LLM with batching)\n */\nexport async function estimateOrbitalCountBatch(\n requests: string[],\n options?: { model?: string }\n): Promise<OrbitalEstimation[]> {\n // Process in parallel with rate limiting\n const results = await Promise.all(\n requests.map(req => estimateOrbitalCount(req, options))\n );\n return results;\n}\n","/**\n * DeepAgent API Types\n *\n * Request/response types for the skills-only DeepAgent API.\n * All agent behavior is defined through skills - no custom prompts allowed.\n *\n * @packageDocumentation\n */\n\nimport { z } from 'zod';\n\n// ============================================================================\n// Request Schemas\n// ============================================================================\n\n/**\n * Extracted requirements schema - from analysis phase.\n * Used to provide more precise generation guidance.\n */\nexport const ExtractedRequirementsSchema = z.object({\n /** Entity names to create */\n entities: z.array(z.string()).optional().default([]),\n /** State names that should exist */\n states: z.array(z.string()).optional().default([]),\n /** Event/action names */\n events: z.array(z.string()).optional().default([]),\n /** Business rules (become guards) */\n guards: z.array(z.string()).optional().default([]),\n /** Page types needed */\n pages: z.array(z.string()).optional().default([]),\n /** Notifications/side-effects */\n effects: z.array(z.string()).optional().default([]),\n /** Raw requirement statements */\n rawRequirements: z.array(z.string()).optional().default([]),\n});\n\nexport type ExtractedRequirementsInput = z.infer<typeof ExtractedRequirementsSchema>;\n\n/**\n * Generate request schema - skills only, no custom prompts.\n */\nexport const GenerateRequestSchema = z\n .object({\n /** Required: The skill(s) to use for this generation */\n skill: z.union([\n z.string().min(1, 'Skill is required'),\n z.array(z.string().min(1)).min(1, 'At least one skill is required'),\n ]),\n\n /** The user's task/message */\n message: z.string().min(1, 'Message is required'),\n\n /** Optional: Thread ID for session continuity */\n threadId: z.string().uuid().optional(),\n\n /** Optional: Workspace directory (defaults to temp dir) */\n workspace: z.string().optional(),\n\n /** Optional: LLM provider */\n provider: z.enum(['anthropic', 'openai', 'deepseek', 'kimi', 'openrouter']).optional(),\n\n /** Optional: Model name */\n model: z.string().optional(),\n\n /** Optional: Disable human-in-the-loop interrupts (for eval/testing) */\n noInterrupt: z.boolean().optional(),\n\n /** Optional: App ID for persisting schema to Firestore */\n appId: z.string().optional(),\n\n /** Optional: Extracted requirements from analysis phase (for orbital skill) */\n requirements: ExtractedRequirementsSchema.optional(),\n\n /** Optional: GitHub integration configuration */\n github: z.object({\n /** GitHub personal access token */\n token: z.string().min(1, 'GitHub token is required'),\n /** Repository owner (e.g., 'octocat') */\n owner: z.string().optional(),\n /** Repository name (e.g., 'hello-world') */\n repo: z.string().optional(),\n }).optional(),\n })\n .strict();\n\nexport type GenerateRequest = z.infer<typeof GenerateRequestSchema>;\n\n/**\n * Resume request schema - for resuming after interrupt.\n */\nexport const ResumeRequestSchema = z.object({\n /** Required: Thread ID to resume */\n threadId: z.string().uuid(),\n\n /** Required: Decisions for pending interrupts */\n decisions: z.array(\n z.object({\n type: z.enum(['approve', 'edit', 'reject']),\n args: z.record(z.unknown()).optional(),\n })\n ),\n\n /** Optional: Approve all future actions */\n approveAll: z.boolean().optional(),\n});\n\nexport type ResumeRequest = z.infer<typeof ResumeRequestSchema>;\n\n/**\n * Decision type for interrupt responses.\n */\nexport interface Decision {\n type: 'approve' | 'edit' | 'reject';\n args?: Record<string, unknown>;\n}\n\n/**\n * Continue request schema - for multi-turn conversation.\n */\nexport const ContinueRequestSchema = z.object({\n /** Required: Thread ID to continue */\n threadId: z.string().uuid(),\n\n /** Required: Follow-up message */\n message: z.string().min(1, 'Message is required'),\n});\n\nexport type ContinueRequest = z.infer<typeof ContinueRequestSchema>;\n\n// ============================================================================\n// SSE Event Types\n// ============================================================================\n\n/**\n * All possible SSE event types.\n */\nexport type SSEEventType =\n | 'start'\n | 'message'\n | 'tool_call'\n | 'tool_result'\n | 'todo_update'\n | 'todo_detail'\n | 'file_operation'\n | 'schema_update'\n | 'generation_log'\n | 'subagent_event'\n | 'interrupt'\n | 'error'\n | 'complete'\n | 'cancelled'\n | 'app_created'\n | 'schema_phase_validated'\n | 'schema_phase_update'\n | 'orbital_added'\n | 'orbital_schema_complete'\n | 'changeset_recorded'\n | 'snapshot_created';\n\n/**\n * Base SSE event structure.\n */\nexport interface SSEEventBase {\n type: SSEEventType;\n timestamp: number;\n}\n\n/**\n * Start event - sent when streaming begins.\n */\nexport interface StartEvent extends SSEEventBase {\n type: 'start';\n data: {\n threadId: string;\n skill: string;\n workDir: string;\n };\n}\n\n/**\n * Message event - agent text output.\n */\nexport interface MessageEvent extends SSEEventBase {\n type: 'message';\n data: {\n content: string;\n role: 'assistant' | 'user' | 'system';\n isComplete: boolean;\n };\n}\n\n/**\n * Tool call event - when agent invokes a tool.\n */\nexport interface ToolCallEvent extends SSEEventBase {\n type: 'tool_call';\n data: {\n tool: string;\n args: Record<string, unknown>;\n };\n}\n\n/**\n * Tool result event - tool execution result.\n */\nexport interface ToolResultEvent extends SSEEventBase {\n type: 'tool_result';\n data: {\n tool: string;\n result: unknown;\n success: boolean;\n };\n}\n\n/**\n * Todo update event - task progress.\n */\nexport interface TodoUpdateEvent extends SSEEventBase {\n type: 'todo_update';\n data: {\n todos: Array<{\n id: string;\n task: string;\n status: 'pending' | 'in_progress' | 'completed';\n }>;\n };\n}\n\n/**\n * Activity type for todo details.\n */\nexport type TodoActivityType = 'thinking' | 'tool_call' | 'tool_result' | 'code_change';\n\n/**\n * Todo detail event - shows LLM activity for a specific todo.\n */\nexport interface TodoDetailEvent extends SSEEventBase {\n type: 'todo_detail';\n data: {\n todoId: string;\n activityType: TodoActivityType;\n content: string;\n tool?: string;\n args?: Record<string, unknown>;\n success?: boolean;\n filePath?: string;\n diff?: string;\n };\n}\n\n/**\n * File operation event.\n */\nexport interface FileOperationEvent extends SSEEventBase {\n type: 'file_operation';\n data: {\n operation: 'ls' | 'read_file' | 'write_file' | 'edit_file';\n path: string;\n success: boolean;\n };\n}\n\n/**\n * Schema update event.\n */\nexport interface SchemaUpdateEvent extends SSEEventBase {\n type: 'schema_update';\n data: {\n appId: string;\n version: number;\n schema: Record<string, unknown>;\n isNew: boolean;\n snapshotId?: string;\n changesetId?: string;\n };\n}\n\n/**\n * Generation log event.\n */\nexport interface GenerationLogEvent extends SSEEventBase {\n type: 'generation_log';\n data: {\n level: 'info' | 'warn' | 'error' | 'debug';\n message: string;\n data?: Record<string, unknown>;\n orbitalName?: string;\n };\n}\n\n/**\n * Interrupt event - awaiting human decision.\n */\nexport interface InterruptEvent extends SSEEventBase {\n type: 'interrupt';\n data: {\n threadId: string;\n actionRequests: Array<{\n tool: string;\n args: Record<string, unknown>;\n allowedDecisions: ('approve' | 'edit' | 'reject')[];\n description?: string;\n }>;\n };\n}\n\n/**\n * Error event.\n */\nexport interface ErrorEvent extends SSEEventBase {\n type: 'error';\n data: {\n error: string;\n code?: string;\n };\n}\n\n/**\n * Cancelled event.\n */\nexport interface CancelledEvent extends SSEEventBase {\n type: 'cancelled';\n data: {\n threadId: string;\n message: string;\n };\n}\n\n/**\n * Complete event - when generation finishes.\n */\nexport interface CompleteEvent extends SSEEventBase {\n type: 'complete';\n data: {\n threadId: string;\n skill: string;\n workDir: string;\n schemaGenerated: boolean;\n appCompiled: boolean;\n schema?: Record<string, unknown>;\n appId?: string;\n schemaPersisted?: boolean;\n snapshotId?: string;\n changesetId?: string;\n };\n}\n\n/**\n * Subagent event - forwards events from nested agent.\n */\nexport interface SubagentEvent extends SSEEventBase {\n type: 'subagent_event';\n data: {\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 };\n}\n\n/**\n * App created event.\n */\nexport interface AppCreatedEvent extends SSEEventBase {\n type: 'app_created';\n data: {\n appId: string;\n name?: string;\n orbitalCount?: number;\n fromOrbitalPersistence?: boolean;\n };\n}\n\n/**\n * Schema phase validated event.\n */\nexport interface SchemaPhaseValidatedEvent extends SSEEventBase {\n type: 'schema_phase_validated';\n data: {\n appId: string;\n success: boolean;\n errors?: unknown[];\n };\n}\n\n/**\n * Schema phase update event.\n */\nexport interface SchemaPhaseUpdateEvent extends SSEEventBase {\n type: 'schema_phase_update';\n data: Record<string, unknown>;\n}\n\n/**\n * Orbital added event.\n */\nexport interface OrbitalAddedEvent extends SSEEventBase {\n type: 'orbital_added';\n data: {\n appId: string;\n orbitalName: string;\n orbitalIndex: number;\n totalOrbitals: number;\n isNew?: boolean;\n orbitalSchema?: Record<string, unknown>;\n };\n}\n\n/**\n * Orbital schema complete event.\n */\nexport interface OrbitalSchemaCompleteEvent extends SSEEventBase {\n type: 'orbital_schema_complete';\n data: {\n appId: string;\n totalOrbitals: number;\n orbitalNames: string[];\n };\n}\n\n/**\n * Changeset recorded event.\n */\nexport interface ChangesetRecordedEvent extends SSEEventBase {\n type: 'changeset_recorded';\n data: {\n appId: string;\n changesetId: string;\n version: number;\n trackingMode: 'initial' | 'update';\n summary: {\n added: number;\n modified: number;\n removed: number;\n };\n source?: string;\n };\n}\n\n/**\n * Snapshot created event.\n */\nexport interface SnapshotCreatedEvent extends SSEEventBase {\n type: 'snapshot_created';\n data: {\n appId: string;\n snapshotId: string;\n version: number;\n reason: string;\n };\n}\n\n/**\n * Union of all SSE event types.\n */\nexport type SSEEvent =\n | StartEvent\n | MessageEvent\n | ToolCallEvent\n | ToolResultEvent\n | TodoUpdateEvent\n | TodoDetailEvent\n | FileOperationEvent\n | SchemaUpdateEvent\n | GenerationLogEvent\n | SubagentEvent\n | InterruptEvent\n | ErrorEvent\n | CancelledEvent\n | CompleteEvent\n | AppCreatedEvent\n | SchemaPhaseValidatedEvent\n | SchemaPhaseUpdateEvent\n | OrbitalAddedEvent\n | OrbitalSchemaCompleteEvent\n | ChangesetRecordedEvent\n | SnapshotCreatedEvent;\n\n// ============================================================================\n// Response Types\n// ============================================================================\n\n/**\n * List skills response.\n */\nexport interface ListSkillsResponse {\n available: Array<{\n name: string;\n description: string;\n allowedTools?: string[];\n }>;\n installed: Array<{\n name: string;\n description: string;\n allowedTools?: string[];\n }>;\n}\n\n/**\n * Session info response.\n */\nexport interface SessionInfo {\n threadId: string;\n skill: string;\n workDir: string;\n createdAt: number;\n lastActivityAt: number;\n}\n\n/**\n * List sessions response.\n */\nexport interface ListSessionsResponse {\n sessions: SessionInfo[];\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Create an SSE event with timestamp.\n */\nexport function createSSEEvent<T extends SSEEventType>(\n type: T,\n data: Extract<SSEEvent, { type: T }>['data']\n): Extract<SSEEvent, { type: T }> {\n return {\n type,\n data,\n timestamp: Date.now(),\n } as Extract<SSEEvent, { type: T }>;\n}\n\n/**\n * Format an SSE event for transmission.\n */\nexport function formatSSEEvent(event: SSEEvent): string {\n return `data: ${JSON.stringify(event)}\\n\\n`;\n}\n\n/**\n * Parse an SSE event from a data string.\n */\nexport function parseSSEEvent(data: string): SSEEvent {\n return JSON.parse(data) as SSEEvent;\n}\n\n/**\n * Type guard for SSE start events.\n */\nexport function isSSEStartEvent(event: SSEEvent): event is StartEvent {\n return event.type === 'start';\n}\n\n/**\n * Type guard for SSE message events.\n */\nexport function isSSEMessageEvent(event: SSEEvent): event is MessageEvent {\n return event.type === 'message';\n}\n\n/**\n * Type guard for SSE interrupt events.\n */\nexport function isSSEInterruptEvent(event: SSEEvent): event is InterruptEvent {\n return event.type === 'interrupt';\n}\n\n/**\n * Type guard for SSE complete events.\n */\nexport function isSSECompleteEvent(event: SSEEvent): event is CompleteEvent {\n return event.type === 'complete';\n}\n\n/**\n * Type guard for SSE error events.\n */\nexport function isSSEErrorEvent(event: SSEEvent): event is ErrorEvent {\n return event.type === 'error';\n}\n\n/**\n * Type guard for SSE tool call events.\n */\nexport function isSSEToolCallEvent(event: SSEEvent): event is ToolCallEvent {\n return event.type === 'tool_call';\n}\n\n/**\n * Type guard for SSE todo update events.\n */\nexport function isSSETodoUpdateEvent(event: SSEEvent): event is TodoUpdateEvent {\n return event.type === 'todo_update';\n}\n\n/**\n * Type guard for SSE todo detail events.\n */\nexport function isSSETodoDetailEvent(event: SSEEvent): event is TodoDetailEvent {\n return event.type === 'todo_detail';\n}\n\n/**\n * Type guard for SSE subagent events.\n */\nexport function isSSESubagentEvent(event: SSEEvent): event is SubagentEvent {\n return event.type === 'subagent_event';\n}\n\n/**\n * Type guard for SSE generation log events.\n */\nexport function isSSEGenerationLogEvent(event: SSEEvent): event is GenerationLogEvent {\n return event.type === 'generation_log';\n}\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 Module\n *\n * MIGRATED: The core domain language engine has been moved to @almadar/core.\n * This file re-exports everything from the core package for backward compatibility.\n * Only agent-specific modules (prompts) remain here.\n */\n\n// Core domain language engine (types, lexer, parsers, formatters, sync, registry)\nexport * from '@almadar/core/domain-language';\n\n// Agent-specific: LLM prompt templates for domain language generation\nexport * from './prompts/index.js';\n","/**\n * Domain Language Syntax Reference\n *\n * Complete syntax reference for the Orbital Domain Language.\n *\n * @packageDocumentation\n */\n\nexport const ODL_SYNTAX_REFERENCE = `\n## Domain Language Syntax\n\n### Entity Definition\n\n\\`\\`\\`\nA [EntityName] is a [persistence] entity that:\n - has [fieldName] as [type] (required|optional)\n - has [fieldName] as [type] with default [value]\n - belongs to [RelatedEntity]\n - belongs to [RelatedEntity] as [alias]\n - has many [RelatedEntity]s\n\\`\\`\\`\n\n**Persistence types:**\n- \\`persistent\\` - Stored in database (default)\n- \\`runtime\\` - Memory only, for games/UI state\n- \\`singleton\\` - Single instance, for config\n\n**Field types:**\n- \\`text\\` / \\`long text\\` - String fields\n- \\`number\\` / \\`currency\\` - Numeric fields\n- \\`yes/no\\` - Boolean fields\n- \\`date\\` / \\`timestamp\\` / \\`datetime\\` - Date fields\n- \\`enum [val1, val2]\\` - Enumeration\n- \\`list\\` / \\`object\\` - Complex types\n\n### Page Definition\n\n\\`\\`\\`\n[PageName] at /[path]:\n - shows [Entity] using [TraitName]\n - view type: [list|detail|create|edit|dashboard]\n - is initial page\n\\`\\`\\`\n\n### Behavior Definition\n\n\\`\\`\\`\n[BehaviorName] behavior:\n States: [State1], [State2], [State3]\n Initial: [State1]\n\n Transitions:\n - From [State1] to [State2] on [EVENT_NAME]\n if [guard condition]\n then [effect1]\n then [effect2]\n\\`\\`\\`\n\n### Section Headers\n\nDomain Language text is organized into sections:\n\n\\`\\`\\`\n# Entities\n[entity definitions]\n\n# Pages\n[page definitions]\n\n# Behaviors\n[behavior/trait definitions]\n\\`\\`\\`\n`;\n","/**\n * Domain Language Examples\n *\n * Complete examples of Domain Language for common patterns.\n *\n * @packageDocumentation\n */\n\nexport const ODL_EXAMPLES = `\n## Complete Example\n\n### Entity\n\n\\`\\`\\`\nA Task is a persistent entity that:\n - has title as text (required)\n - has description as long text\n - has status as enum [todo, in_progress, done] with default \"todo\"\n - has dueDate as date\n - belongs to User as assignee\n - belongs to Project\n\\`\\`\\`\n\n### Page\n\n\\`\\`\\`\nTasksPage at /tasks:\n - shows Task using TaskManagement\n - view type: list\n - is initial page\n\\`\\`\\`\n\n### Behavior\n\n\\`\\`\\`\nTaskManagement behavior:\n States: Viewing, Editing, Creating\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then render page-header to main with title 'Tasks'\n then render entity-table to center for Task\n\n - From Viewing to Editing on EDIT_TASK\n then render form-section to modal for Task\n\n - From Editing to Viewing on SAVE_TASK\n then persist update Task\n then render null to modal\n then emit TASK_UPDATED\n\\`\\`\\`\n\n## Multi-Entity Example\n\n\\`\\`\\`\n# Entities\n\nA User is a persistent entity that:\n - has name as text (required)\n - has email as text (required)\n - has role as enum [admin, user, guest] with default \"user\"\n\nA Project is a persistent entity that:\n - has name as text (required)\n - has description as long text\n - has status as enum [active, archived] with default \"active\"\n - belongs to User as owner\n\nA Task is a persistent entity that:\n - has title as text (required)\n - has status as enum [todo, in_progress, done] with default \"todo\"\n - has priority as number with default 0\n - belongs to Project\n - belongs to User as assignee\n\n# Pages\n\nProjectsPage at /projects:\n - shows Project using ProjectManagement\n - view type: list\n - is initial page\n\nTasksPage at /projects/:projectId/tasks:\n - shows Task using TaskManagement\n - view type: list\n\n# Behaviors\n\nProjectManagement behavior:\n States: List, Detail\n Initial: List\n\n Transitions:\n - From List to List on INIT\n then render entity-table to main for Project\n\n - From List to Detail on VIEW_PROJECT\n then render entity-detail to drawer for Project\n\nTaskManagement behavior:\n States: Viewing, Editing\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then [\"render-ui\", \"main\", {\"type\": \"entity-table\", \"entity\": \"Task\", \"itemActions\": [{\"label\": \"Edit\", \"event\": \"EDIT_TASK\"}, {\"label\": \"Delete\", \"event\": \"DELETE_TASK\", \"variant\": \"danger\"}]}]\n\n - From Viewing to Editing on EDIT_TASK\n then render form-section to modal for Task\n\n - From Editing to Viewing on SAVE_TASK\n then persist update Task\n then render null to modal\n\\`\\`\\`\n\n## Dashboard Example (Complex Patterns)\n\n\\`\\`\\`\nDashboard behavior:\n States: Viewing\n Initial: Viewing\n\n Transitions:\n - From Viewing to Viewing on INIT\n then render page-header to main with title 'Dashboard'\n then [\"render-ui\", \"center\", {\"type\": \"stats\", \"metrics\": [{\"field\": \"totalTasks\", \"label\": \"Total Tasks\"}, {\"field\": \"completedTasks\", \"label\": \"Completed\"}, {\"field\": \"overdueTasks\", \"label\": \"Overdue\"}]}]\n then [\"render-ui\", \"bottom\", {\"type\": \"tabs\", \"tabs\": [{\"id\": \"overview\", \"label\": \"Overview\", \"event\": \"VIEW_OVERVIEW\"}, {\"id\": \"recent\", \"label\": \"Recent Activity\", \"event\": \"VIEW_RECENT\"}]}]\n\\`\\`\\`\n\n**Note**: Use inline JSON for \\`render-ui\\` effects with complex props (metrics, tabs, itemActions, cells).\n`;\n","/**\n * Domain Language Common Patterns\n *\n * Reusable patterns for common application types.\n *\n * @packageDocumentation\n */\n\nexport const ODL_PATTERNS = `\n## Common Patterns\n\n### CRUD Pattern\n\n\\`\\`\\`\n[Entity]Management behavior:\n States: List, Detail, Create, Edit\n Initial: List\n\n Transitions:\n - From List to List on INIT\n then render entity-table to main for [Entity]\n\n - From List to Create on CREATE_[ENTITY]\n then render form-section to modal for [Entity]\n\n - From Create to List on SUBMIT_CREATE\n then persist create [Entity]\n then render null to modal\n\n - From List to Detail on VIEW_[ENTITY]\n then render entity-detail to drawer for [Entity]\n\n - From Detail to Edit on EDIT_[ENTITY]\n then render form-section to modal for [Entity]\n\n - From Edit to Detail on SUBMIT_EDIT\n then persist update [Entity]\n then render null to modal\n\n - From Detail to List on DELETE_[ENTITY]\n then persist delete [Entity]\n then render null to drawer\n\\`\\`\\`\n\n### Game Health Pattern\n\n\\`\\`\\`\nHealth behavior:\n States: Healthy, Wounded, Critical, Dead\n Initial: Healthy\n\n Transitions:\n - From Healthy to Wounded on TAKE_DAMAGE\n if health >= 30 and health < 70\n then update status to 'wounded'\n\n - From Wounded to Critical on TAKE_DAMAGE\n if health < 30\n then update status to 'critical'\n\n - From Critical to Dead on TAKE_DAMAGE\n if health <= 0\n then update isAlive to false\n then emit ENTITY_DIED\n\\`\\`\\`\n\n### Approval Workflow Pattern\n\n\\`\\`\\`\nApprovalWorkflow behavior:\n States: Draft, Pending, Approved, Rejected\n Initial: Draft\n\n Transitions:\n - From Draft to Pending on SUBMIT\n then update status to 'pending'\n then emit APPROVAL_REQUESTED\n\n - From Pending to Approved on APPROVE\n then update status to 'approved'\n then update approvedAt to now\n then emit APPROVAL_GRANTED\n\n - From Pending to Rejected on REJECT\n then update status to 'rejected'\n then emit APPROVAL_DENIED\n\n - From Rejected to Draft on REVISE\n then update status to 'draft'\n\\`\\`\\`\n\n### Form Validation Pattern\n\n\\`\\`\\`\nFormValidation behavior:\n States: Idle, Validating, Valid, Invalid\n Initial: Idle\n\n Transitions:\n - From Idle to Validating on VALIDATE\n then update isValidating to true\n\n - From Validating to Valid on VALIDATION_SUCCESS\n then update isValidating to false\n then update errors to null\n\n - From Validating to Invalid on VALIDATION_FAILED\n then update isValidating to false\n\n - From Invalid to Validating on VALIDATE\n then update isValidating to true\n\n - From Valid to Idle on RESET\n then update errors to null\n\\`\\`\\`\n\n### Dashboard Pattern\n\n\\`\\`\\`\nDashboardView behavior:\n States: Loading, Ready\n Initial: Loading\n\n Transitions:\n - From Loading to Ready on DATA_LOADED\n then render stats to main\n then render entity-cards to center\n\n - From Ready to Loading on REFRESH\n then emit FETCH_DASHBOARD_DATA\n\\`\\`\\`\n`;\n","/**\n * Domain Language to OrbitalSchema Mapping\n *\n * Reference for how Domain Language maps to OrbitalSchema JSON.\n *\n * @packageDocumentation\n */\n\nexport const ODL_TO_SCHEMA_MAPPING = `\n## Domain Language -> OrbitalSchema Mapping\n\n| Domain Language | OrbitalSchema |\n|-----------------|---------------|\n| \"A Task is...\" | \\`{ \"entity\": { \"name\": \"Task\", ... } }\\` |\n| \"persistent entity\" | \\`\"persistence\": \"persistent\"\\` |\n| \"runtime entity\" | \\`\"persistence\": \"runtime\"\\` |\n| \"singleton entity\" | \\`\"persistence\": \"singleton\"\\` |\n| \"has X as text\" | \\`{ \"name\": \"X\", \"type\": \"string\" }\\` |\n| \"has X as number\" | \\`{ \"name\": \"X\", \"type\": \"number\" }\\` |\n| \"has X as yes/no\" | \\`{ \"name\": \"X\", \"type\": \"boolean\" }\\` |\n| \"has X as enum [a, b]\" | \\`{ \"name\": \"X\", \"type\": \"enum\", \"values\": [\"a\", \"b\"] }\\` |\n| \"belongs to Y\" | \\`{ \"type\": \"relation\", \"relation\": { \"entity\": \"Y\" } }\\` |\n| \"belongs to Y as alias\" | \\`{ \"name\": \"alias\", \"type\": \"relation\", \"relation\": { \"entity\": \"Y\" } }\\` |\n| \"States: A, B\" | \\`\"states\": [{ \"name\": \"A\" }, { \"name\": \"B\" }]\\` |\n| \"Initial: A\" | \\`{ \"name\": \"A\", \"isInitial\": true }\\` |\n| \"From X to Y on Z\" | \\`{ \"from\": \"X\", \"to\": \"Y\", \"event\": \"Z\" }\\` |\n| \"if health >= 0\" | \\`\"guard\": [\">=\", \"@entity.health\", 0]\\` |\n| \"then update status to 'done'\" | \\`\"effects\": [[\"set\", \"@entity.status\", \"done\"]]\\` |\n| \"then emit EVENT\" | \\`\"effects\": [[\"emit\", \"EVENT\"]]\\` |\n| \"then render X to slot\" | \\`\"effects\": [[\"render-ui\", \"slot\", { \"type\": \"X\" }]]\\` |\n| \"then persist create Task\" | \\`\"effects\": [[\"persist\", \"create\", \"Task\"]]\\` |\n| \"then navigate to /path\" | \\`\"effects\": [[\"navigate\", \"/path\"]]\\` |\n\n## Conversion Process\n\n1. **Parse Domain Language** - Split into sections (Entities, Pages, Behaviors)\n2. **Extract entities** - Parse \"A X is...\" definitions\n3. **Extract pages** - Parse \"[Name] at /path\" definitions\n4. **Extract behaviors** - Parse \"[Name] behavior:\" definitions\n5. **Parse guards** - Convert human-readable conditions to S-expressions\n6. **Parse effects** - Convert human-readable effects to S-expressions\n7. **Assemble schema** - Build OrbitalSchema JSON structure\n\n## CLI Commands\n\n\\`\\`\\`bash\n# Convert Domain Language to OrbitalSchema\nnpx kflow domain:to-schema input.txt -o output.orb\n\n# Convert OrbitalSchema to Domain Language\nnpx kflow domain:to-text input.orb -o output.txt\n\n# Validate round-trip conversion\nnpx kflow domain:validate input.orb --verbose\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// Design Quality Checks\n// ============================================================================\n\n/** Prop corrections: wrong name → correct name */\nconst PROP_CORRECTIONS: Record<string, string> = {\n onSubmit: 'submitEvent',\n onCancel: 'cancelEvent',\n headerActions: 'actions',\n loading: 'isLoading',\n fieldNames: 'fields',\n};\n\n/**\n * Auto-correct known prop misnaming in render-ui effects.\n * Returns the number of corrections made.\n */\nfunction autoCorrectProps(schema: Record<string, unknown>): number {\n let corrections = 0;\n const schemaStr = JSON.stringify(schema);\n\n // Walk through all render-ui effects and fix prop names\n function walkAndFix(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map(walkAndFix);\n }\n if (obj && typeof obj === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {\n if (key in PROP_CORRECTIONS) {\n result[PROP_CORRECTIONS[key]] = walkAndFix(value);\n corrections++;\n } else {\n result[key] = walkAndFix(value);\n }\n }\n return result;\n }\n return obj;\n }\n\n const fixed = walkAndFix(schema);\n Object.assign(schema, fixed);\n return corrections;\n}\n\n/**\n * Check INIT transitions for atomic composition quality.\n * Returns warnings for flat/low-quality INIT transitions.\n */\nfunction checkCompositionQuality(schema: Record<string, unknown>): string[] {\n const warnings: string[] = [];\n const orbitals = (schema as { orbitals?: unknown[] }).orbitals;\n if (!Array.isArray(orbitals)) return warnings;\n\n for (const orbital of orbitals) {\n const orbObj = orbital as { name?: string; traits?: unknown[] };\n const traits = orbObj.traits;\n if (!Array.isArray(traits)) continue;\n\n for (const trait of traits) {\n const traitObj = trait as { name?: string; stateMachine?: { transitions?: unknown[] } };\n const transitions = traitObj.stateMachine?.transitions;\n if (!Array.isArray(transitions)) continue;\n\n for (const transition of transitions) {\n const trans = transition as { event?: string; effects?: unknown[] };\n if (trans.event !== 'INIT') continue;\n\n const effects = trans.effects;\n if (!Array.isArray(effects)) continue;\n\n // Count render-ui effects targeting 'main'\n const mainRenderUIs = effects.filter(\n (e) => Array.isArray(e) && e[0] === 'render-ui' && e[1] === 'main',\n );\n\n if (mainRenderUIs.length > 1) {\n warnings.push(\n `⚠️ ${orbObj.name}/${traitObj.name} INIT has ${mainRenderUIs.length} flat render-ui calls to main. Should be a single composed stack with children.`,\n );\n }\n\n if (mainRenderUIs.length === 1) {\n const renderPayload = mainRenderUIs[0] as unknown[];\n const payload = renderPayload[2] as Record<string, unknown> | undefined;\n if (payload && payload.type !== 'stack' && !payload.children) {\n warnings.push(\n `⚠️ ${orbObj.name}/${traitObj.name} INIT renders a single flat ${payload.type} to main. Should be a composed stack with header, metrics, and data sections.`,\n );\n }\n }\n }\n }\n }\n\n return warnings;\n}\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 let propCorrections = 0;\n let compositionWarnings: string[] = [];\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 // Auto-correct props and check composition quality\n if (combinedSchema) {\n propCorrections = autoCorrectProps(combinedSchema as unknown as Record<string, unknown>);\n compositionWarnings = checkCompositionQuality(combinedSchema as unknown as Record<string, unknown>);\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 designQuality: {\n propCorrections: propCorrections || 0,\n compositionWarnings: compositionWarnings || [],\n },\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, type LLMProvider } from '@almadar/llm';\nimport {\n getSExprQuickRef,\n getKeyBehaviorsReference,\n getCommonErrorsSection,\n getArchitectureSection,\n} from '@almadar/skills';\nimport type { SSEEventType } from '../api-types.js';\nimport { AgentDomainCategorySchema } from '@almadar/core/types';\nimport type { AgentDomainCategory } from '@almadar/core/types';\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 /** LLM provider for domain orbital generation. Defaults to 'anthropic' */\n provider?: LLMProvider;\n /** Model name for domain orbital generation. Defaults to 'claude-sonnet-4-20250514' */\n model?: 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: AgentDomainCategory;\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: AgentDomainCategorySchema,\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 with configurable provider\n const client = new LLMClient({\n provider: options.provider ?? 'anthropic',\n model: options.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 } from '@almadar/core/types';\n\n// ============================================================================\n// Shared Module Imports (SK-007 Phase 1)\n// ============================================================================\n\nimport {\n // Types (re-export for backward compatibility)\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n type OrbitalGenerationOptions as SharedOrbitalGenerationOptions,\n type OrbitalGenerationResult as SharedOrbitalGenerationResult,\n type ParallelGenerationOptions as SharedParallelGenerationOptions,\n type ParallelGenerationResult as SharedParallelGenerationResult,\n type DecomposeOptions as SharedDecomposeOptions,\n // Constants\n PROVIDER_CONCURRENCY_LIMITS,\n // Utilities\n getEntityName,\n createLog,\n} from '../shared/index.js';\n\n// Re-export types for backward compatibility\nexport {\n type OrbitalUnit,\n type GenerationLog,\n type ExtractedRequirements,\n} from '../shared/index.js';\n\n// Re-export constants\nexport { PROVIDER_CONCURRENCY_LIMITS } from '../shared/index.js';\n\n// ============================================================================\n// Local Type Definitions (Extended from shared)\n// ============================================================================\n\n/**\n * Extended options for single orbital generation.\n * @deprecated Use shared OrbitalGenerationOptions instead\n */\nexport interface OrbitalGenerationOptions extends SharedOrbitalGenerationOptions {}\n\n/**\n * Extended result for single orbital generation.\n * @deprecated Use shared OrbitalGenerationResult instead\n */\nexport interface OrbitalGenerationResult extends SharedOrbitalGenerationResult {}\n\n/**\n * Extended options for parallel generation.\n * @deprecated Use shared ParallelGenerationOptions instead\n */\nexport interface ParallelGenerationOptions extends SharedParallelGenerationOptions {}\n\n/**\n * Extended result for parallel generation.\n * @deprecated Use shared ParallelGenerationResult instead\n */\nexport interface ParallelGenerationResult extends SharedParallelGenerationResult {}\n\n/**\n * Extended options for decomposition.\n * @deprecated Use shared DecomposeOptions instead\n */\nexport interface DecomposeOptions extends SharedDecomposeOptions {}\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: { valid: boolean; errors: unknown[]; warnings?: unknown[] } = { 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: unknown) => {\n if (typeof e === 'object' && e !== null) {\n return (e as { message?: string }).message || String(e);\n }\n return String(e);\n }),\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 * 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: Partial<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 ? requirements.entities.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### States (Map to State Machines)\n${requirements.states?.length ? requirements.states.map(s => `- ${s}`).join('\\n') : '- (none specified)'}\n\n### Events (Map to Transitions)\n${requirements.events?.length ? requirements.events.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Guards (Map to Transition Guards)\n${requirements.guards?.length ? requirements.guards.map(g => `- ${g}`).join('\\n') : '- (none specified)'}\n\n### Effects (Map to Transition Effects)\n${requirements.effects?.length ? requirements.effects.map(e => `- ${e}`).join('\\n') : '- (none specified)'}\n\n### Pages (Map to Page Definitions)\n${requirements.pages?.length ? 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, AgentDomainCategorySchema } from '@almadar/core/types';\nimport { LLMClient, type LLMProvider } 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 /** LLM provider for orbital generation subagent. Defaults to 'anthropic' */\n provider?: LLMProvider;\n /** Model name for orbital generation subagent. Defaults to 'claude-sonnet-4-20250514' */\n model?: string;\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: AgentDomainCategorySchema,\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 with configurable provider\n const client = new LLMClient({\n provider: options.provider ?? 'anthropic',\n model: options.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 * @almadar/agent Tools\n *\n * All agent tools for schema generation, validation, and management.\n *\n * @packageDocumentation\n */\n\n// Execute tool (no deps needed)\nexport { createExecuteTool, validateCommandPaths } from './execute.js';\n\n// Validate tool (no deps needed - shells to CLI)\nexport { createValidateSchemaTool } from './validate-schema.js';\n\n// Generate schema tool (uses @almadar/llm structured output directly)\nexport { createGenerateSchemaTool } from './generate-schema.js';\n\n// Finish task tool (uses internal combiner and domain converter)\nexport { createFinishTaskTool } from './finish-task.js';\n\n// Domain orbital tools (uses internal domain language converter)\nexport {\n createGenerateOrbitalDomainTool,\n createConstructCombinedDomainTool,\n createDomainOrbitalTools,\n type DomainOrbitalEventCallback,\n type DomainOrbitalCompleteCallback,\n type DomainOrbitalToolOptions,\n type DomainOrbitalSpec,\n} from './domain-orbital.js';\n\n// Orbital subagent tool (uses internal orbital generator)\nexport {\n createOrbitalSubagentTool,\n createSubagentEventWrapper,\n type SubagentEventCallback,\n type OrbitalCompleteCallback,\n type OrbitalRequirements,\n type OrbitalSubagentToolOptions,\n} from './orbital-subagent.js';\n\n// Orbital batch subagent tool (uses batch generation for 2x+ speedup)\nexport {\n createOrbitalBatchSubagentTool,\n type SubagentEventCallback as BatchSubagentEventCallback,\n type BatchCompleteCallback,\n type OrbitalBatchSubagentToolOptions,\n} from './orbital-batch-subagent.js';\n\n// Trait subagent tool (uses @almadar/llm directly)\nexport {\n createTraitSubagentTool,\n createTraitEventWrapper,\n type TraitEventCallback,\n type TraitCompleteCallback,\n type TraitSubagentToolOptions,\n type TraitSpec,\n} from './trait-subagent.js';\n\n// Combine schemas tool (uses internal combiner)\nexport { createCombineSchemasTool } from './combine-schemas.js';\n\n// Schema chunking tools (no deps needed - uses @almadar/core)\nexport {\n createQuerySchemaStructureTool,\n createExtractChunkTool,\n createApplyChunkTool,\n createSchemaChunkingTools,\n} from './schema-chunking.js';\n\n// GitHub tools (uses @almadar/integrations)\nexport {\n createGitHubTools,\n createGitHubToolsArray,\n type GitHubToolsConfig,\n} from './github.js';\n\n// ============================================================================\n// Convenience Factory\n// ============================================================================\n\n// Import functions for use in createAgentTools\nimport { createExecuteTool } from './execute.js';\nimport { createValidateSchemaTool } from './validate-schema.js';\nimport { createGenerateSchemaTool } from './generate-schema.js';\nimport { createFinishTaskTool } from './finish-task.js';\nimport { createCombineSchemasTool } from './combine-schemas.js';\nimport { createOrbitalSubagentTool } from './orbital-subagent.js';\nimport { createTraitSubagentTool } from './trait-subagent.js';\nimport { createDomainOrbitalTools } from './domain-orbital.js';\nimport { createSchemaChunkingTools } from './schema-chunking.js';\n/**\n * Create all agent tools for a workspace.\n *\n * All dependencies are now internal to @almadar/agent - no dependency injection needed.\n *\n * @param workDir - Workspace directory\n * @returns All tools ready for use\n */\nexport function createAgentTools(workDir: string) {\n return {\n // Core tools\n execute: createExecuteTool(workDir),\n validateSchema: createValidateSchemaTool(workDir),\n\n // Schema generation (uses @almadar/llm structured output directly)\n generateSchema: createGenerateSchemaTool(),\n\n // Orbital tools (now use internal functions)\n finishTask: createFinishTaskTool(workDir),\n combineSchemas: createCombineSchemasTool(workDir),\n\n // Subagent tools (now use internal functions)\n orbitalSubagent: createOrbitalSubagentTool(),\n traitSubagent: createTraitSubagentTool(),\n\n // Domain tools (now use internal functions)\n domainOrbitalTools: createDomainOrbitalTools({ workDir }),\n\n // Chunking tools\n schemaChunking: createSchemaChunkingTools(workDir),\n\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 * KFlow DeepAgent System Prompt\n *\n * System prompts for the agent. Uses @almadar/skills for the\n * schema reference documentation.\n *\n * @packageDocumentation\n */\n\nimport {\n getMinimalTypeReference,\n getArchitectureSection,\n} from '@almadar/skills';\n\n/**\n * Build a comprehensive schema reference from @almadar/skills.\n */\nfunction getSchemaReference(): string {\n return `## KFlow Schema Reference\n\n${getArchitectureSection()}\n\n${getMinimalTypeReference()}`;\n}\n\n/**\n * Create the system prompt for the KFlow schema generator agent.\n *\n * This prompt instructs the agent to:\n * 1. Generate KFlow schemas from natural language\n * 2. Use the KFlow CLI for validation and compilation\n * 3. Exit once the app compiles successfully\n */\nexport function createSystemPrompt(): string {\n const SCHEMA_REFERENCE = getSchemaReference();\n\n return `You are a KFlow application generator. You create working applications by generating valid KFlow schemas.\n\n${SCHEMA_REFERENCE}\n\n## File System\n\nYou have access to a virtual filesystem rooted at your workspace directory.\n- All file paths should start with / (e.g., /schema.json, /app)\n- You can only access files within your workspace\n- Use /schema.json as your main schema file\n- Use /app as the output directory for compiled apps\n\n## CRITICAL: Path Handling for CLI Commands\n\nThe file system tools (write_file, read_file, edit_file) use virtual paths starting with /.\nHowever, the CLI tools run in the real filesystem and need ABSOLUTE paths.\n\n**ALWAYS follow this pattern for CLI commands:**\n\n1. First, run \\`pwd\\` to get your workspace's absolute path\n2. Use the full absolute path for ALL CLI commands\n\n**Correct:**\n\\`\\`\\`bash\npwd\norbital validate /home/user/.../workspaces/session-id/schema.json --json\nnpx kflow compile /home/user/.../workspaces/session-id/schema.json -o /home/user/.../workspaces/session-id/app --verify\n\\`\\`\\`\n\n**WRONG:**\n\\`\\`\\`bash\norbital validate /schema.json --json\norbital validate ./schema.json --json\n\\`\\`\\`\n\n## Your Workflow\n\n1. **Get workspace path**: Run \\`pwd\\` to get your absolute workspace path\n2. **Analyze** the user's request to understand what application they want\n3. **Plan** using write_todos to break down the work\n4. **Generate** a KFlow schema and write it to /schema.json\n5. **Validate** using: orbital validate {WORKSPACE_PATH}/schema.json --json\n6. **Fix** any validation errors by editing /schema.json\n7. **Compile** using: npx kflow compile {WORKSPACE_PATH}/schema.json -o {WORKSPACE_PATH}/app --verify\n8. **Install** dependencies: cd {WORKSPACE_PATH}/app && npm install\n9. **Write Summary**: Write /summary.json with a summary of your work\n10. **Complete** when the app compiles successfully and summary is written\n\n## Summary File Format\n\n\\`\\`\\`json\n{\n \"success\": true,\n \"request\": \"Brief description of what the user asked for\",\n \"schemaGenerated\": {\n \"name\": \"AppName\",\n \"entities\": [\"Entity1\", \"Entity2\"],\n \"states\": [\"state1\", \"state2\"],\n \"pages\": [\"page1\", \"page2\"]\n },\n \"iterations\": {\n \"validationAttempts\": 2,\n \"compilationAttempts\": 1\n },\n \"issues\": [\n {\n \"type\": \"validation|compilation|other\",\n \"description\": \"What went wrong\",\n \"resolution\": \"How you fixed it\"\n }\n ],\n \"insights\": \"Any observations about the schema format\"\n}\n\\`\\`\\`\n\n## Important Guidelines\n\n- **ALWAYS run \\`pwd\\` first** and use the full path for CLI commands\n- Always validate after writing or editing /schema.json\n- Parse JSON output from validate command\n- Loop until compilation succeeds\n- Use write_todos to track progress\n`;\n}\n\n/**\n * Create a compact version of the system prompt for smaller context windows.\n */\nexport function createCompactSystemPrompt(): string {\n const SCHEMA_REFERENCE = getSchemaReference();\n\n return `You are a KFlow app generator.\n\n${SCHEMA_REFERENCE}\n\nFile System: All paths start with / (e.g., /schema.json, /app). You can only access your workspace.\n\nCRITICAL - Path Handling:\n- File tools use virtual paths (/schema.json)\n- CLI tools need ABSOLUTE paths from \\`pwd\\` for BOTH input AND output\n- ALWAYS run \\`pwd\\` first, then use full path for everything\n\nWorkflow:\n1. Run \\`pwd\\` to get workspace path\n2. Write /schema.json\n3. Validate: orbital validate {PWD}/schema.json --json\n4. Fix errors if any\n5. Compile: npx kflow compile {PWD}/schema.json -o {PWD}/app --verify\n6. Install: cd {PWD}/app && npm install\n7. Write /summary.json\n8. Done when compilation succeeds\n\nUse write_todos to plan. Follow the schema reference for valid structure.\n`;\n}\n","/**\n * KFlow DeepAgent Subagents\n *\n * Specialized subagents for complex schema generation tasks.\n * These are spawned via the `task()` built-in tool.\n *\n * Uses @almadar/skills for schema reference documentation.\n *\n * @packageDocumentation\n */\n\nimport {\n getMinimalTypeReference,\n getArchitectureSection,\n} from '@almadar/skills';\nimport type { SubAgent } from './types.js';\n\n/**\n * Build a compact schema reference from @almadar/skills.\n */\nfunction getSchemaReference(): string {\n return `## KFlow Schema Reference\n\n${getArchitectureSection()}\n\n${getMinimalTypeReference()}`;\n}\n\n/**\n * Create the Schema Generator Subagent configuration.\n *\n * Focused agent for generating KFlow schemas from requirements.\n * Writes schema to file and verifies it exists.\n */\nexport function createSchemaGeneratorSubagent(): SubAgent {\n const SCHEMA_REFERENCE = getSchemaReference();\n\n return {\n name: 'schema-generator',\n description: 'Generates KFlow schema from requirements. Use when you need to create a new schema or major schema section.',\n systemPrompt: `You are a KFlow schema generator. Your task is to generate valid KFlow schemas and WRITE them to /schema.json.\n\n${SCHEMA_REFERENCE}\n\n## CRITICAL: UI Structure\n\nThe \\`ui\\` section MUST use \\`pages\\` array with UnifiedPage format:\n\n\\`\\`\\`json\n{\n \"ui\": {\n \"pages\": [\n {\n \"name\": \"MainPage\",\n \"path\": \"/\",\n \"purpose\": \"Main view\",\n \"viewType\": \"list\",\n \"primaryEntity\": \"EntityName\",\n \"isInitial\": true,\n \"sections\": [\n { \"id\": \"header\", \"purpose\": \"Title\", \"order\": 0, \"estimatedSize\": \"small\", \"pattern\": { \"type\": \"page-header\", \"title\": \"Title\" } },\n { \"id\": \"list\", \"purpose\": \"Items\", \"order\": 1, \"estimatedSize\": \"large\", \"pattern\": { \"type\": \"entity-list\", \"entity\": \"EntityName\", \"fieldNames\": [\"field1\", \"field2\"] } }\n ]\n }\n ]\n }\n}\n\\`\\`\\`\n\n**NEVER use \\`sectionedPages\\` - this is INVALID and will cause validation errors!**\n\n## Instructions\n\n1. Analyze the requirements provided\n2. Generate a complete, valid KFlow schema\n3. **WRITE the schema to /schema.json using write_file**\n4. **VERIFY the file was written using ls or read_file**\n5. Ensure:\n - Exactly ONE state has isInitial: true\n - Exactly ONE page has isInitial: true\n - Use \\`ui.pages\\` (NOT \\`sectionedPages\\`)\n - Each page has sections with patterns\n - All entity names are PascalCase\n - All field names are camelCase\n - All event keys are UPPER_SNAKE_CASE\n\n## IMPORTANT: File Writing\n\nYou MUST write the schema to a file. Do not just output JSON - use write_file:\n\n\\`\\`\\`\nwrite_file({ file_path: \"/schema.json\", content: \"{...schema JSON...}\" })\n\\`\\`\\`\n\nAfter writing, verify the file exists with \\`ls({ path: \"/\" })\\`.\n`,\n };\n}\n\n/**\n * Create the Error Fixer Subagent configuration.\n *\n * Focused agent for fixing validation and compilation errors.\n */\nexport function createErrorFixerSubagent(): SubAgent {\n const SCHEMA_REFERENCE = getSchemaReference();\n\n return {\n name: 'error-fixer',\n description: 'Fixes validation or compilation errors in KFlow schema. Use when you have errors to fix.',\n systemPrompt: `You are a KFlow error fixer. Your task is to fix schema errors.\n\n${SCHEMA_REFERENCE}\n\n## Instructions\n\n1. Read the error message carefully\n2. Read the current schema\n3. Identify the exact issue\n4. Apply the fix using edit_file\n\n## Common Fixes\n\n- MISSING_REQUIRED: Add the missing field with correct type\n- INVALID_TYPE: Change to correct type (string, number, boolean, etc.)\n- INVALID_ENUM: Use a valid enum value\n- VP_MISSING_PATTERN: Add pattern object with type field\n- MISSING_INITIAL: Set isInitial: true on one state/page\n- \"Schema must have at least one page\":\n - **Change \\`sectionedPages\\` to \\`pages\\`**\n - Ensure pages array is not empty\n\n## Actions\n\nAfter identifying the fix, apply it using edit_file:\n\\`\\`\\`\nedit_file({ file_path: \"/schema.json\", old_string: \"...\", new_string: \"...\" })\n\\`\\`\\`\n\n## Output Format\n\nOutput a JSON object with:\n- \"path\": the JSON path to fix\n- \"fix\": the corrected value\n- \"explanation\": brief explanation\n`,\n };\n}\n\n/**\n * Create the Test Analyzer Subagent configuration.\n *\n * Focused agent for analyzing test failures and suggesting fixes.\n */\nexport function createTestAnalyzerSubagent(): SubAgent {\n return {\n name: 'test-analyzer',\n description: 'Analyzes test failures and suggests schema fixes. Use when tests fail.',\n systemPrompt: `You are a KFlow test analyzer. Your task is to analyze test failures and suggest fixes.\n\n## Instructions\n\n1. Read the test output carefully\n2. Identify the root cause of the failure\n3. Determine what schema change would fix it\n4. Provide specific fix instructions\n\n## Common Test Failures\n\n- Type errors: Usually missing or wrong field types in entities\n- Runtime errors: Usually missing event handlers or transitions\n- Validation errors: Usually schema structure issues\n- Component errors: Usually missing or wrong pattern configurations\n\n## Output Format\n\nOutput a JSON object with:\n- \"failureType\": type of failure\n- \"rootCause\": brief description\n- \"schemaPath\": where in the schema to fix\n- \"suggestedFix\": the fix to apply\n- \"confidence\": high, medium, or low\n`,\n };\n}\n\n/**\n * Create all subagent configurations.\n */\nexport function createSubagents(): SubAgent[] {\n return [\n createSchemaGeneratorSubagent(),\n createErrorFixerSubagent(),\n createTestAnalyzerSubagent(),\n ];\n}\n\n/**\n * Create subagent configs as a record for easy lookup.\n */\nexport function createSubagentConfigs(): Record<string, SubAgent> {\n return {\n 'schema-generator': createSchemaGeneratorSubagent(),\n 'error-fixer': createErrorFixerSubagent(),\n 'test-analyzer': createTestAnalyzerSubagent(),\n };\n}\n","/**\n * DeepAgent SSE Event Types\n *\n * Type definitions for Server-Sent Events from the DeepAgent streaming endpoint.\n * Use these types for client-side consumption of /deepagent/generate-stream.\n *\n * @packageDocumentation\n */\n\n/**\n * Initial event sent when streaming begins.\n */\nexport interface DeepAgentStartEvent {\n type: 'start';\n sessionId: string;\n}\n\n/**\n * Agent execution event (tool calls, messages, etc.).\n */\nexport interface DeepAgentExecutionEvent {\n type: 'event';\n node?: string;\n toolCall?: {\n name: string;\n args: Record<string, unknown>;\n };\n toolResult?: {\n name: string;\n result: unknown;\n };\n message?: {\n role: 'assistant' | 'user' | 'system';\n content: string;\n };\n [key: string]: unknown;\n}\n\n/**\n * Schema generated event.\n */\nexport interface DeepAgentSchemaEvent {\n type: 'schema';\n schema: Record<string, unknown>;\n}\n\n/**\n * Completion event sent when generation finishes successfully.\n */\nexport interface DeepAgentCompleteEvent {\n type: 'complete';\n sessionId: string;\n appCompiled: boolean;\n}\n\n/**\n * Error event sent when generation fails.\n */\nexport interface DeepAgentErrorEvent {\n type: 'error';\n error: string;\n}\n\n/**\n * Union of all possible DeepAgent SSE events.\n */\nexport type DeepAgentEvent =\n | DeepAgentStartEvent\n | DeepAgentExecutionEvent\n | DeepAgentSchemaEvent\n | DeepAgentCompleteEvent\n | DeepAgentErrorEvent;\n\n/**\n * Parse an SSE data line into a DeepAgentEvent.\n */\nexport function parseDeepAgentEvent(data: string): DeepAgentEvent {\n return JSON.parse(data) as DeepAgentEvent;\n}\n\n/**\n * Type guard for start events.\n */\nexport function isStartEvent(event: DeepAgentEvent): event is DeepAgentStartEvent {\n return event.type === 'start';\n}\n\n/**\n * Type guard for execution events.\n */\nexport function isExecutionEvent(event: DeepAgentEvent): event is DeepAgentExecutionEvent {\n return event.type === 'event';\n}\n\n/**\n * Type guard for schema events.\n */\nexport function isSchemaEvent(event: DeepAgentEvent): event is DeepAgentSchemaEvent {\n return event.type === 'schema';\n}\n\n/**\n * Type guard for complete events.\n */\nexport function isCompleteEvent(event: DeepAgentEvent): event is DeepAgentCompleteEvent {\n return event.type === 'complete';\n}\n\n/**\n * Type guard for error events.\n */\nexport function isErrorEvent(event: DeepAgentEvent): event is DeepAgentErrorEvent {\n return event.type === 'error';\n}\n","/**\n * Context Compaction for DeepAgent\n *\n * Provides middleware to manage context length in long-running agent sessions.\n * Uses @langchain/core's trimMessages to keep context within token limits.\n *\n * @packageDocumentation\n */\n\nimport { trimMessages, type BaseMessage } from '@langchain/core/messages';\nimport type { BaseLanguageModel } from '@langchain/core/language_models/base';\n\n/**\n * Configuration for context compaction.\n */\nexport interface ContextCompactionConfig {\n /**\n * Maximum number of tokens before triggering compaction.\n * Default: 150000 (leaves headroom for Claude's 200K context)\n */\n maxTokens?: number;\n\n /**\n * Number of recent messages to always keep.\n * Default: 10\n */\n keepRecentMessages?: number;\n\n /**\n * Whether to include the system message in trimming.\n * Default: false (system message is always kept)\n */\n includeSystem?: boolean;\n\n /**\n * Strategy for trimming: 'first' keeps first messages, 'last' keeps last messages.\n * Default: 'last'\n */\n strategy?: 'first' | 'last';\n}\n\n/**\n * Default configuration for context compaction.\n */\nexport const DEFAULT_COMPACTION_CONFIG: Required<ContextCompactionConfig> = {\n maxTokens: 150000,\n keepRecentMessages: 10,\n includeSystem: false,\n strategy: 'last',\n};\n\n/**\n * Compact messages to fit within token limit.\n */\nexport async function compactMessages(\n messages: BaseMessage[],\n model: BaseLanguageModel,\n config: ContextCompactionConfig = {}\n): Promise<BaseMessage[]> {\n const {\n maxTokens,\n includeSystem,\n strategy,\n } = { ...DEFAULT_COMPACTION_CONFIG, ...config };\n\n const trimmed = await trimMessages(messages, {\n maxTokens,\n tokenCounter: model,\n strategy,\n includeSystem,\n allowPartial: false,\n startOn: 'human',\n });\n\n return trimmed;\n}\n\n/**\n * Check if messages need compaction based on estimated token count.\n */\nexport function needsCompaction(\n messages: BaseMessage[],\n threshold: number = DEFAULT_COMPACTION_CONFIG.maxTokens\n): boolean {\n const totalChars = messages.reduce((sum, msg) => {\n const content = typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n return sum + content.length;\n }, 0);\n\n const estimatedTokens = totalChars / 4;\n return estimatedTokens > threshold * 0.8;\n}\n\n/**\n * Create a message summarizer prompt for compacting old context.\n */\nexport function createSummaryPrompt(messages: BaseMessage[]): string {\n const messageTexts = messages.map((msg) => {\n const role = msg._getType();\n const content = typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n return `[${role}]: ${content.substring(0, 500)}${content.length > 500 ? '...' : ''}`;\n }).join('\\n\\n');\n\n return `Summarize the following conversation history in 2-3 paragraphs, focusing on:\n1. What the user originally requested\n2. What actions were taken (files created, commands run)\n3. Current state and any pending tasks\n\nConversation:\n${messageTexts}\n\nSummary:`;\n}\n\n/**\n * Estimate token count for messages using character-based heuristic.\n */\nexport function estimateTokens(messages: BaseMessage[]): number {\n const totalChars = messages.reduce((sum, msg) => {\n const content = typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n return sum + content.length;\n }, 0);\n\n return Math.ceil(totalChars / 4);\n}\n","/**\n * Metrics Collection for DeepAgent Evaluation\n *\n * Tracks success rates, iteration counts, token usage, and timing\n * for agent generation tests.\n *\n * @packageDocumentation\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\n\n/**\n * Metrics for a single generation attempt.\n */\nexport interface GenerationMetrics {\n testName: string;\n complexity: 'simple' | 'medium' | 'complex';\n success: boolean;\n iterations: number;\n timeMs: number;\n tokenUsage?: {\n input: number;\n output: number;\n total: number;\n };\n error?: string;\n timestamp?: number;\n}\n\n/**\n * Aggregated metrics summary.\n */\nexport interface MetricsSummary {\n total: number;\n passed: number;\n failed: number;\n successRate: number;\n avgIterations: number;\n avgTimeMs: number;\n avgTokens: number;\n byComplexity: {\n simple: { total: number; passed: number; successRate: number };\n medium: { total: number; passed: number; successRate: number };\n complex: { total: number; passed: number; successRate: number };\n };\n}\n\n/**\n * Collects and aggregates generation metrics.\n */\nexport class MetricsCollector {\n private metrics: GenerationMetrics[] = [];\n\n record(metrics: GenerationMetrics): void {\n this.metrics.push({\n ...metrics,\n timestamp: Date.now(),\n });\n }\n\n getAll(): GenerationMetrics[] {\n return [...this.metrics];\n }\n\n getSummary(): MetricsSummary {\n const total = this.metrics.length;\n const passed = this.metrics.filter(m => m.success).length;\n const failed = total - passed;\n\n const successRate = total > 0 ? (passed / total) * 100 : 0;\n\n const avgIterations = total > 0\n ? this.metrics.reduce((sum, m) => sum + m.iterations, 0) / total\n : 0;\n\n const avgTimeMs = total > 0\n ? this.metrics.reduce((sum, m) => sum + m.timeMs, 0) / total\n : 0;\n\n const metricsWithTokens = this.metrics.filter(m => m.tokenUsage);\n const avgTokens = metricsWithTokens.length > 0\n ? metricsWithTokens.reduce((sum, m) => sum + (m.tokenUsage?.total || 0), 0) / metricsWithTokens.length\n : 0;\n\n const byComplexity = {\n simple: this.getComplexitySummary('simple'),\n medium: this.getComplexitySummary('medium'),\n complex: this.getComplexitySummary('complex'),\n };\n\n return {\n total,\n passed,\n failed,\n successRate,\n avgIterations,\n avgTimeMs,\n avgTokens,\n byComplexity,\n };\n }\n\n private getComplexitySummary(complexity: 'simple' | 'medium' | 'complex') {\n const filtered = this.metrics.filter(m => m.complexity === complexity);\n const total = filtered.length;\n const passed = filtered.filter(m => m.success).length;\n const successRate = total > 0 ? (passed / total) * 100 : 0;\n return { total, passed, successRate };\n }\n\n getFailures(): GenerationMetrics[] {\n return this.metrics.filter(m => !m.success);\n }\n\n getMultiIterationTests(): GenerationMetrics[] {\n return this.metrics.filter(m => m.iterations > 0);\n }\n\n clear(): void {\n this.metrics = [];\n }\n\n async saveToFile(filePath: string): Promise<void> {\n const data = {\n summary: this.getSummary(),\n metrics: this.metrics,\n generatedAt: new Date().toISOString(),\n };\n await fs.mkdir(path.dirname(filePath), { recursive: true });\n await fs.writeFile(filePath, JSON.stringify(data, null, 2));\n }\n\n async loadFromFile(filePath: string): Promise<void> {\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n const data = JSON.parse(content);\n this.metrics = data.metrics || [];\n } catch {\n // File doesn't exist, start fresh\n }\n }\n}\n\n/**\n * Format metrics summary as a readable string.\n */\nexport function formatSummary(summary: MetricsSummary): string {\n const lines = [\n '═'.repeat(50),\n ' DEEPAGENT EVALUATION RESULTS',\n '═'.repeat(50),\n '',\n ` Total Tests: ${summary.total}`,\n ` Passed: ${summary.passed} (${summary.successRate.toFixed(1)}%)`,\n ` Failed: ${summary.failed}`,\n '',\n ` Avg Iterations: ${summary.avgIterations.toFixed(1)}`,\n ` Avg Time: ${(summary.avgTimeMs / 1000).toFixed(1)}s`,\n ` Avg Tokens: ${Math.round(summary.avgTokens).toLocaleString()}`,\n '',\n ' BY COMPLEXITY:',\n ` Simple: ${summary.byComplexity.simple.passed}/${summary.byComplexity.simple.total} (${summary.byComplexity.simple.successRate.toFixed(0)}%)`,\n ` Medium: ${summary.byComplexity.medium.passed}/${summary.byComplexity.medium.total} (${summary.byComplexity.medium.successRate.toFixed(0)}%)`,\n ` Complex: ${summary.byComplexity.complex.passed}/${summary.byComplexity.complex.total} (${summary.byComplexity.complex.successRate.toFixed(0)}%)`,\n '',\n '═'.repeat(50),\n ];\n return lines.join('\\n');\n}\n\n/**\n * Analyze failure patterns to suggest prompt improvements.\n */\nexport function analyzeFailures(failures: GenerationMetrics[]): string[] {\n const suggestions: string[] = [];\n\n const errorPatterns = new Map<string, number>();\n for (const failure of failures) {\n if (failure.error) {\n let category = 'Unknown';\n if (failure.error.includes('validation')) category = 'Validation';\n else if (failure.error.includes('compilation')) category = 'Compilation';\n else if (failure.error.includes('test')) category = 'Test';\n else if (failure.error.includes('schema')) category = 'Schema';\n else if (failure.error.includes('timeout')) category = 'Timeout';\n\n errorPatterns.set(category, (errorPatterns.get(category) || 0) + 1);\n }\n }\n\n for (const [category, count] of errorPatterns) {\n if (category === 'Validation' && count > 2) {\n suggestions.push('Consider adding more schema validation examples to the system prompt');\n }\n if (category === 'Compilation' && count > 2) {\n suggestions.push('Add compilation error handling examples to the system prompt');\n }\n if (category === 'Test' && count > 2) {\n suggestions.push('Include test-driven development guidance in the system prompt');\n }\n if (category === 'Timeout' && count > 1) {\n suggestions.push('Consider breaking complex apps into smaller subagent tasks');\n }\n }\n\n const complexFailures = failures.filter(f => f.complexity === 'complex').length;\n if (complexFailures > failures.length * 0.5) {\n suggestions.push('Complex apps failing frequently - consider more structured decomposition guidance');\n }\n\n return suggestions;\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';\nimport type { MemoryManager } from '../memory/index.js';\nimport { needsCompaction, type ContextCompactionConfig } from '../context-compaction.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 * Memory manager for session-to-memory sync (GAP-002D).\n * When provided, completed sessions are recorded to orbital memory.\n */\n memoryManager?: MemoryManager;\n\n /**\n * Context compaction configuration (GAP-005).\n * When provided, enables automatic context length management.\n */\n compactionConfig?: ContextCompactionConfig;\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 private memoryManager: MemoryManager | null = null;\n private compactionConfig: ContextCompactionConfig | null = null;\n\n constructor(options: SessionManagerOptions = {}) {\n this.mode = options.mode ?? 'memory';\n this.memoryBackend = new MemorySessionBackend();\n this.memoryCheckpointers = new Map();\n this.memoryManager = options.memoryManager ?? null;\n this.compactionConfig = options.compactionConfig ?? null;\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 // Session → Memory Sync (GAP-002D)\n // ============================================================================\n\n /**\n * Sync a completed session to orbital memory.\n * This enables the agent to learn from past sessions.\n *\n * @param threadId - The session thread ID\n * @param userId - The user ID for memory association\n * @param sessionData - Additional session data to record\n * @returns Promise that resolves when sync is complete\n */\n async syncSessionToMemory(\n threadId: string,\n userId: string,\n sessionData: {\n appId: string;\n inputDescription: string;\n generatedOrbital?: string;\n patternsUsed?: string[];\n entities?: string[];\n success: boolean;\n errorMessage?: string;\n },\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping session sync');\n return;\n }\n\n const metadata = this.get(threadId);\n if (!metadata) {\n console.warn(`[SessionManager] Session ${threadId} not found, skipping sync`);\n return;\n }\n\n try {\n await this.memoryManager.recordGeneration(userId, {\n threadId,\n prompt: sessionData.inputDescription,\n skill: metadata.skill,\n generatedSchema: sessionData.generatedOrbital ? { name: sessionData.generatedOrbital } : undefined,\n patterns: sessionData.patternsUsed ?? [],\n entities: sessionData.entities ?? [],\n success: sessionData.success,\n completedAt: new Date(),\n });\n\n // Also update user preferences based on patterns used\n if (sessionData.patternsUsed && sessionData.patternsUsed.length > 0) {\n await this.memoryManager.updateUserPreferences(userId, {\n preferredPatterns: sessionData.patternsUsed,\n commonEntities: sessionData.entities,\n });\n }\n\n // Update project context if entities were generated\n if (sessionData.entities && sessionData.entities.length > 0) {\n await this.memoryManager.updateProjectContext(sessionData.appId, {\n userId,\n existingEntities: sessionData.entities,\n });\n }\n\n console.log(`[SessionManager] Session ${threadId} synced to memory for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to sync session to memory:', error);\n }\n }\n\n // ============================================================================\n // Interrupt → Memory Sync (GAP-003: Interrupt Memory)\n // ============================================================================\n\n /**\n * Record an interrupt decision to memory.\n * This enables learning from HITL (Human-in-the-Loop) decisions.\n *\n * @param sessionId - The session thread ID\n * @param userId - The user who made the decision\n * @param interruptData - The interrupt decision data\n * @returns Promise that resolves when sync is complete\n */\n async recordInterruptDecision(\n sessionId: string,\n userId: string,\n interruptData: {\n toolName: string;\n toolArgs: Record<string, unknown>;\n decision: 'approved' | 'rejected' | 'modified';\n modifiedArgs?: Record<string, unknown>;\n reason?: string;\n },\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping interrupt sync');\n return;\n }\n\n try {\n await this.memoryManager.recordInterruptDecision(sessionId, userId, interruptData);\n console.log(`[SessionManager] Interrupt recorded for user ${userId}: ${interruptData.toolName} ${interruptData.decision}`);\n } catch (error) {\n console.error('[SessionManager] Failed to record interrupt:', error);\n }\n }\n\n /**\n * Get interrupt history for a session.\n */\n async getSessionInterrupts(sessionId: string): Promise<import('../memory/types.js').InterruptRecord[]> {\n if (!this.memoryManager) {\n return [];\n }\n return this.memoryManager.getSessionInterrupts(sessionId);\n }\n\n /**\n * Check if a tool should be auto-approved for a user.\n */\n async shouldAutoApproveTool(userId: string, toolName: string): Promise<boolean> {\n if (!this.memoryManager) {\n return false;\n }\n return this.memoryManager.shouldAutoApproveTool(userId, toolName);\n }\n\n // ============================================================================\n // Checkpoint Management (GAP-004: Checkpoint → Memory)\n // ============================================================================\n\n /**\n * Record a checkpoint to memory for learning.\n *\n * @param userId - The user who owns this checkpoint\n * @param checkpointData - Checkpoint information\n * @returns Promise that resolves when checkpoint is recorded\n */\n async recordCheckpoint(\n userId: string,\n checkpointData: {\n checkpointId: string;\n threadId: string;\n parentCheckpointId?: string;\n metadata?: Record<string, unknown>;\n },\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping checkpoint record');\n return;\n }\n\n try {\n await this.memoryManager.recordCheckpoint(userId, checkpointData);\n console.log(`[SessionManager] Checkpoint ${checkpointData.checkpointId} recorded for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to record checkpoint:', error);\n }\n }\n\n /**\n * Record a rollback to a checkpoint.\n *\n * @param userId - The user who performed the rollback\n * @param checkpointId - The checkpoint rolled back to\n * @param reason - Optional reason for rollback\n * @returns Promise that resolves when rollback is recorded\n */\n async recordRollback(\n userId: string,\n checkpointId: string,\n reason?: string,\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping rollback record');\n return;\n }\n\n try {\n await this.memoryManager.recordRollback(userId, checkpointId, reason);\n console.log(`[SessionManager] Rollback to ${checkpointId} recorded for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to record rollback:', error);\n }\n }\n\n /**\n * Mark a checkpoint as successful (terminal state).\n *\n * @param userId - The user who owns this checkpoint\n * @param checkpointId - The checkpoint that was successful\n * @returns Promise that resolves when success is recorded\n */\n async markCheckpointSuccessful(userId: string, checkpointId: string): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping success mark');\n return;\n }\n\n try {\n await this.memoryManager.markCheckpointSuccessful(userId, checkpointId);\n console.log(`[SessionManager] Checkpoint ${checkpointId} marked as successful for user ${userId}`);\n } catch (error) {\n console.error('[SessionManager] Failed to mark checkpoint as successful:', error);\n }\n }\n\n /**\n * Get checkpoint history for a thread.\n *\n * @param threadId - The thread to get checkpoints for\n * @returns Array of checkpoint records\n */\n async getThreadCheckpoints(threadId: string): Promise<import('../memory/types.js').CheckpointRecord[]> {\n if (!this.memoryManager) {\n return [];\n }\n return this.memoryManager.getThreadCheckpoints(threadId);\n }\n\n /**\n * Get frequently rolled-back checkpoints (problem areas).\n *\n * @param userId - The user to get problem checkpoints for\n * @param minRollbackCount - Minimum rollback count (default: 2)\n * @returns Array of checkpoint records with rollback issues\n */\n async getProblemCheckpoints(\n userId: string,\n minRollbackCount: number = 2,\n ): Promise<import('../memory/types.js').CheckpointRecord[]> {\n if (!this.memoryManager) {\n return [];\n }\n return this.memoryManager.getProblemCheckpoints(userId, minRollbackCount);\n }\n\n // ============================================================================\n // Context Compaction (GAP-005)\n // ============================================================================\n\n /**\n * Get the context compaction configuration.\n * @returns The compaction configuration or null if not configured.\n */\n getCompactionConfig(): ContextCompactionConfig | null {\n return this.compactionConfig;\n }\n\n /**\n * Check if a session's messages need compaction based on token count.\n * Uses character-based estimation for quick checks.\n *\n * @param messages - Array of messages to check\n * @returns True if compaction is recommended\n */\n shouldCompactMessages(messages: { content: string | unknown }[]): boolean {\n if (!this.compactionConfig) {\n return false;\n }\n\n const totalChars = messages.reduce((sum, msg) => {\n const content = typeof msg.content === 'string'\n ? msg.content\n : JSON.stringify(msg.content);\n return sum + content.length;\n }, 0);\n\n const estimatedTokens = totalChars / 4;\n const threshold = this.compactionConfig.maxTokens ?? 150000;\n return estimatedTokens > threshold * 0.8;\n }\n\n /**\n * Record a compaction event for a session.\n * This helps track when and why compaction occurs.\n *\n * @param threadId - The session thread ID\n * @param originalMessageCount - Number of messages before compaction\n * @param compactedMessageCount - Number of messages after compaction\n * @param reason - Reason for compaction\n */\n async recordCompaction(\n threadId: string,\n originalMessageCount: number,\n compactedMessageCount: number,\n reason?: string,\n ): Promise<void> {\n if (!this.memoryManager) {\n console.warn('[SessionManager] No memory manager configured, skipping compaction record');\n return;\n }\n\n try {\n const metadata = this.get(threadId);\n if (metadata) {\n // Store compaction info in session metadata\n const compactionInfo = {\n timestamp: Date.now(),\n originalMessageCount,\n compactedMessageCount,\n reason: reason ?? 'token_limit',\n };\n // Update metadata with compaction history\n const meta = metadata as unknown as Record<string, unknown>;\n const existingCompactions = (meta.compactions as unknown[] | undefined) ?? [];\n meta.compactions = [...existingCompactions, compactionInfo];\n this.store(threadId, metadata);\n }\n console.log(`[SessionManager] Compaction recorded for ${threadId}: ${originalMessageCount} → ${compactedMessageCount} messages`);\n } catch (error) {\n console.error('[SessionManager] Failed to record compaction:', error);\n }\n }\n\n /**\n * Get compaction history for a session.\n *\n * @param threadId - The session thread ID\n * @returns Array of compaction events\n */\n getCompactionHistory(threadId: string): Array<{\n timestamp: number;\n originalMessageCount: number;\n compactedMessageCount: number;\n reason: string;\n }> {\n const metadata = this.get(threadId);\n if (!metadata) {\n return [];\n }\n const meta = metadata as unknown as Record<string, unknown>;\n return (meta.compactions as Array<{\n timestamp: number;\n originalMessageCount: number;\n compactedMessageCount: number;\n reason: string;\n }>) ?? [];\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 createKimiClient,\n createOpenRouterClient,\n ANTHROPIC_MODELS,\n DEEPSEEK_MODELS,\n OPENAI_MODELS,\n KIMI_MODELS,\n OPENROUTER_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';\nimport { MemoryManager, type UserPreference, type ProjectContext } from '../memory/index.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 for main agent */\n provider?: LLMProvider;\n /** Optional: Model name for main agent */\n model?: string;\n /** Optional: LLM provider for subagents (orbital, trait, domain generation). Defaults to 'anthropic' */\n subagentProvider?: LLMProvider;\n /** Optional: Model name for subagents. Defaults to 'claude-sonnet-4-20250514' */\n subagentModel?: 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 /** Optional: Memory manager for user/project memory (GAP-001) */\n memoryManager?: MemoryManager;\n /** Optional: User ID for memory lookup */\n userId?: string;\n /** Optional: App ID for project context */\n appId?: string;\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 /** User preferences loaded from memory (GAP-001) */\n userPreferences?: UserPreference | null;\n /** Project context loaded from memory (GAP-001) */\n projectContext?: ProjectContext | null;\n /** Memory manager instance (GAP-001) */\n memoryManager?: MemoryManager;\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 'kimi':\n if (verbose)\n console.log(`[SkillAgent] Using Kimi: ${model || KIMI_MODELS.K2_5}`);\n return createKimiClient({\n model: model || KIMI_MODELS.K2_5,\n temperature: 0.6, // Kimi with thinking disabled requires 0.6\n });\n\n case 'openrouter':\n if (verbose)\n console.log(`[SkillAgent] Using OpenRouter: ${model || OPENROUTER_MODELS.QWEN_2_5_72B}`);\n return createOpenRouterClient({\n model: model || OPENROUTER_MODELS.QWEN_2_5_72B,\n temperature: 0.3,\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 subagentProvider = 'anthropic',\n subagentModel = 'claude-sonnet-4-20250514',\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 // 4.5 Load user memory and project context (GAP-001)\n let userPreferences: UserPreference | null = null;\n let projectContext: ProjectContext | null = null;\n \n if (options.memoryManager && options.userId) {\n try {\n userPreferences = await options.memoryManager.getUserPreferences(options.userId);\n \n if (userPreferences && verbose) {\n console.log(`[SkillAgent] Loaded user preferences: ${userPreferences.namingConvention} naming, ${userPreferences.preferredPatterns.length} patterns`);\n }\n \n if (options.appId) {\n projectContext = await options.memoryManager.getProjectContext(options.appId);\n \n if (projectContext && verbose) {\n console.log(`[SkillAgent] Loaded project context: ${projectContext.existingEntities.length} entities`);\n }\n }\n } catch (error) {\n console.warn('[SkillAgent] Failed to load memory:', error);\n }\n }\n \n // Build memory context section\n const memoryContext = buildMemoryContext(userPreferences, projectContext);\n\n const systemPrompt = [\n BASE_SYSTEM_PROMPT,\n '\\n## Skill Instructions\\n\\n' + skillInstructions,\n references ? '\\n## Reference Documentation\\n\\n' + references : '',\n memoryContext ? '\\n## User Context\\n\\n' + memoryContext : '',\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 ORBITAL_BATCH_SKILLS = ['kflow-orbitals-batch'];\n const LEAN_SKILLS = ['kflow-lean-orbitals', 'kflow-lean-fixing'];\n const isOrbitalSkill = primarySkill.name === 'kflow-orbitals';\n const isOrbitalBatchSkill = ORBITAL_BATCH_SKILLS.includes(primarySkill.name);\n const isLeanSkill = LEAN_SKILLS.includes(primarySkill.name);\n const needsChunkingTools = ORBITAL_SKILLS.includes(primarySkill.name);\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 orbitalBatchTool: ReturnType<typeof import('../tools/orbital-batch-subagent.js').createOrbitalBatchSubagentTool>['tool'] | undefined;\n let setBatchEventCallback: ReturnType<typeof import('../tools/orbital-batch-subagent.js').createOrbitalBatchSubagentTool>['setEventCallback'] | 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 provider: subagentProvider,\n model: subagentModel,\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 (isOrbitalBatchSkill) {\n const { createOrbitalBatchSubagentTool } = await import('../tools/orbital-batch-subagent.js');\n const batchResult = createOrbitalBatchSubagentTool({\n requirements: options.requirements,\n provider: subagentProvider,\n model: subagentModel,\n workDir,\n });\n orbitalBatchTool = batchResult.tool;\n setBatchEventCallback = batchResult.setEventCallback;\n\n if (options.onSubagentEvent) {\n setBatchEventCallback(options.onSubagentEvent);\n }\n\n if (verbose) {\n console.log(`[SkillAgent] Batch orbital tools enabled for kflow-orbitals-batch skill`);\n }\n }\n\n if (isLeanSkill) {\n domainOrbitalTools = createDomainOrbitalTools({ \n workDir,\n provider: subagentProvider,\n model: subagentModel,\n });\n if (verbose) {\n console.log(`[SkillAgent] Domain orbital tools enabled for ${primarySkill.name} skill (provider: ${subagentProvider})`);\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 || isOrbitalBatchSkill ? [] : [validateSchemaTool]),\n ...(orbitalTool ? [orbitalTool] : []),\n ...(orbitalBatchTool ? [orbitalBatchTool] : []),\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 userPreferences,\n projectContext,\n memoryManager: options.memoryManager,\n };\n}\n\n// ============================================================================\n// Memory Context Helper (GAP-001)\n// ============================================================================\n\n/**\n * Build memory context string for system prompt\n */\nfunction buildMemoryContext(\n userPreferences: UserPreference | null,\n projectContext: ProjectContext | null,\n): string | null {\n const sections: string[] = [];\n\n if (userPreferences) {\n const prefs: string[] = [];\n \n if (userPreferences.namingConvention) {\n prefs.push(`- Preferred naming: ${userPreferences.namingConvention}`);\n }\n if (userPreferences.validationStyle) {\n prefs.push(`- Validation style: ${userPreferences.validationStyle}`);\n }\n if (userPreferences.preferredPatterns.length > 0) {\n prefs.push(`- Preferred patterns: ${userPreferences.preferredPatterns.join(', ')}`);\n }\n if (userPreferences.commonEntities.length > 0) {\n prefs.push(`- Commonly used entities: ${userPreferences.commonEntities.join(', ')}`);\n }\n \n if (prefs.length > 0) {\n sections.push(`### User Preferences\\n${prefs.join('\\n')}`);\n }\n }\n\n if (projectContext) {\n const ctx: string[] = [];\n \n if (projectContext.projectName) {\n ctx.push(`- Project: ${projectContext.projectName}`);\n }\n if (projectContext.domain) {\n ctx.push(`- Domain: ${projectContext.domain}`);\n }\n if (projectContext.existingEntities.length > 0) {\n ctx.push(`- Existing entities: ${projectContext.existingEntities.join(', ')}`);\n }\n if (projectContext.conventions.length > 0) {\n ctx.push(`- Project conventions: ${projectContext.conventions.join(', ')}`);\n }\n \n if (ctx.length > 0) {\n sections.push(`### Project Context\\n${ctx.join('\\n')}`);\n }\n }\n\n return sections.length > 0 ? sections.join('\\n\\n') : null;\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","/**\n * Agentic Search - GAP-006\n *\n * Reasoning-based search through memory orbitals.\n * Unlike RAG (vector similarity), this uses agent traversal with understanding\n * of state transitions, patterns, and temporal relationships.\n *\n * @packageDocumentation\n */\n\nimport type {\n UserPreference,\n GenerationSession,\n ProjectContext,\n} from './memory-orbital.js';\nimport type {\n InterruptRecord,\n ToolApprovalPreference,\n CheckpointRecord,\n} from './types.js';\nimport type { MemoryManager } from './MemoryManager.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Search strategy for agentic search\n */\nexport type SearchStrategy = 'temporal' | 'semantic' | 'pattern' | 'hybrid';\n\n/**\n * Search parameters\n */\nexport interface AgenticSearchParams {\n /** User to search memory for */\n userId: string;\n /** Natural language query */\n query: string;\n /** Search strategy */\n strategy?: SearchStrategy;\n /** Maximum search depth (levels of traversal) */\n depth?: number;\n /** App/project context to filter by */\n appId?: string;\n /** Maximum results to return */\n limit?: number;\n}\n\n/**\n * Search result with relevance score\n */\nexport interface SearchResult {\n /** Type of memory found */\n type: 'preference' | 'session' | 'project' | 'interrupt' | 'checkpoint' | 'pattern';\n /** The actual data */\n data: unknown;\n /** Relevance score (0-1) */\n relevance: number;\n /** Why this result matched */\n reasoning: string;\n /** Source collection */\n source: string;\n /** Timestamp for temporal sorting */\n timestamp?: Date;\n}\n\n/**\n * Search result with aggregated insights\n */\nexport interface AgenticSearchResponse {\n /** Individual search results */\n results: SearchResult[];\n /** Aggregated insights from results */\n insights: {\n /** Summary of what was found */\n summary: string;\n /** Common patterns identified */\n patterns: string[];\n /** Temporal trends */\n trends: string[];\n /** Suggested next actions */\n suggestions: string[];\n };\n /** Search metadata */\n metadata: {\n strategy: SearchStrategy;\n depth: number;\n duration: number;\n totalResults: number;\n };\n}\n\n// ============================================================================\n// Agentic Search Engine\n// ============================================================================\n\nexport class AgenticSearchEngine {\n private memoryManager: MemoryManager;\n\n constructor(memoryManager: MemoryManager) {\n this.memoryManager = memoryManager;\n }\n\n /**\n * Perform agentic search through memory\n */\n async search(params: AgenticSearchParams): Promise<AgenticSearchResponse> {\n const startTime = Date.now();\n const strategy = params.strategy ?? 'hybrid';\n const depth = params.depth ?? 3;\n const limit = params.limit ?? 10;\n\n let results: SearchResult[] = [];\n\n // Execute search based on strategy\n switch (strategy) {\n case 'temporal':\n results = await this.temporalSearch(params, depth, limit);\n break;\n case 'semantic':\n results = await this.semanticSearch(params, depth, limit);\n break;\n case 'pattern':\n results = await this.patternSearch(params, depth, limit);\n break;\n case 'hybrid':\n default:\n results = await this.hybridSearch(params, depth, limit);\n break;\n }\n\n // Sort by relevance\n results.sort((a, b) => b.relevance - a.relevance);\n\n // Generate insights\n const insights = this.generateInsights(results, params.query);\n\n const duration = Date.now() - startTime;\n\n return {\n results: results.slice(0, limit),\n insights,\n metadata: {\n strategy,\n depth,\n duration,\n totalResults: results.length,\n },\n };\n }\n\n // ============================================================================\n // Search Strategies\n // ============================================================================\n\n /**\n * Temporal search - \"What did I do last week?\"\n * Navigates memory by time relationships\n */\n private async temporalSearch(\n params: AgenticSearchParams,\n _depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n\n // Parse temporal query patterns\n const isRecentQuery = /recent|last|latest|newest/i.test(params.query);\n const isTimeRangeQuery = /week|month|day|ago/i.test(params.query);\n\n // Get generation sessions (most temporal data)\n const sessions = await this.memoryManager.getUserGenerationHistory(params.userId, limit * 2);\n\n for (const session of sessions) {\n let relevance = 0.5;\n let reasoning = 'Recent generation session';\n\n // Boost recent items for \"recent\" queries\n if (isRecentQuery) {\n const daysAgo = (Date.now() - session.createdAt.getTime()) / (1000 * 60 * 60 * 24);\n relevance = Math.max(0.1, 1 - daysAgo / 30); // Decay over 30 days\n reasoning = `Created ${Math.round(daysAgo)} days ago`;\n }\n\n // Check for query matches in session data\n const sessionText = `${session.prompt} ${session.entities.join(' ')} ${session.patterns.join(' ')}`.toLowerCase();\n const queryTerms = params.query.toLowerCase().split(/\\s+/);\n const termMatches = queryTerms.filter(term => sessionText.includes(term)).length;\n relevance += termMatches * 0.1;\n\n if (relevance > 0.3) {\n results.push({\n type: 'session',\n data: session,\n relevance: Math.min(1, relevance),\n reasoning,\n source: 'generation_history',\n timestamp: session.createdAt,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Semantic search - \"How did I handle user roles?\"\n * Reasoning-based understanding of structure\n */\n private async semanticSearch(\n params: AgenticSearchParams,\n _depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n\n // Extract semantic concepts from query\n const concepts = this.extractConcepts(params.query);\n\n // Search user preferences\n const prefs = await this.memoryManager.getUserPreferences(params.userId);\n if (prefs) {\n let relevance = 0.3;\n const matchedConcepts: string[] = [];\n\n // Check for naming convention matches\n if (concepts.naming && prefs.namingConvention) {\n relevance += 0.2;\n matchedConcepts.push(`uses ${prefs.namingConvention}`);\n }\n\n // Check for pattern matches\n if (concepts.patterns && prefs.preferredPatterns.length > 0) {\n const matched = prefs.preferredPatterns.filter(p =>\n concepts.patterns?.some((cp: string) => p.toLowerCase().includes(cp.toLowerCase()))\n );\n relevance += matched.length * 0.1;\n matchedConcepts.push(`patterns: ${matched.join(', ')}`);\n }\n\n // Check for entity matches\n if (concepts.entities && prefs.commonEntities.length > 0) {\n const matched = prefs.commonEntities.filter(e =>\n concepts.entities?.some((ce: string) => e.toLowerCase().includes(ce.toLowerCase()))\n );\n relevance += matched.length * 0.1;\n matchedConcepts.push(`entities: ${matched.join(', ')}`);\n }\n\n if (relevance > 0.4) {\n results.push({\n type: 'preference',\n data: prefs,\n relevance: Math.min(1, relevance),\n reasoning: `User preferences match query concepts: ${matchedConcepts.join('; ')}`,\n source: 'user_preferences',\n timestamp: prefs.learnedAt,\n });\n }\n }\n\n // Search project contexts\n if (params.appId) {\n const project = await this.memoryManager.getProjectContext(params.appId);\n if (project) {\n let relevance = 0.3;\n const projectText = `${project.projectName ?? ''} ${project.description ?? ''} ${project.existingEntities.join(' ')}`.toLowerCase();\n\n const queryTerms = params.query.toLowerCase().split(/\\s+/);\n const termMatches = queryTerms.filter(term => projectText.includes(term)).length;\n relevance += termMatches * 0.15;\n\n if (relevance > 0.4) {\n results.push({\n type: 'project',\n data: project,\n relevance: Math.min(1, relevance),\n reasoning: `Project context contains ${termMatches} matching terms`,\n source: 'project_context',\n timestamp: project.lastUpdatedAt,\n });\n }\n }\n }\n\n // Search generation sessions for semantic matches\n const sessions = await this.memoryManager.getUserGenerationHistory(params.userId, limit);\n for (const session of sessions) {\n const sessionText = `${session.prompt} ${session.entities.join(' ')}`.toLowerCase();\n let relevance = 0.3;\n\n // Entity matches\n if (concepts.entities) {\n const entityMatches = session.entities.filter(e =>\n concepts.entities?.some((ce: string) => e.toLowerCase().includes(ce.toLowerCase()))\n );\n relevance += entityMatches.length * 0.15;\n }\n\n // Pattern matches\n if (concepts.patterns) {\n const patternMatches = session.patterns.filter(p =>\n concepts.patterns?.some((cp: string) => p.toLowerCase().includes(cp.toLowerCase()))\n );\n relevance += patternMatches.length * 0.1;\n }\n\n // Direct text match\n const queryTerms = params.query.toLowerCase().split(/\\s+/);\n const termMatches = queryTerms.filter(term => sessionText.includes(term)).length;\n relevance += termMatches * 0.05;\n\n if (relevance > 0.4) {\n results.push({\n type: 'session',\n data: session,\n relevance: Math.min(1, relevance),\n reasoning: `Session contains relevant entities, patterns, or keywords`,\n source: 'generation_history',\n timestamp: session.createdAt,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Pattern search - \"Show me all list views I've built\"\n * Searches for specific patterns and effects\n */\n private async patternSearch(\n params: AgenticSearchParams,\n _depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const results: SearchResult[] = [];\n\n // Extract pattern terms from query\n const patternTerms = ['list', 'form', 'detail', 'card', 'table', 'chart', 'map', 'calendar'];\n const matchedTerms = patternTerms.filter(term =>\n params.query.toLowerCase().includes(term)\n );\n\n // Search pattern affinity\n const patterns = await this.memoryManager.getUserPatterns(params.userId);\n\n for (const pattern of patterns) {\n let relevance = 0.3;\n let reasoning = `Pattern usage: ${pattern.usageCount} times`;\n\n // Boost for matching pattern terms\n if (matchedTerms.some(term => pattern.patternId.toLowerCase().includes(term))) {\n relevance += 0.3;\n reasoning += ', matches query pattern type';\n }\n\n // Boost for high success rate\n const successRate = pattern.usageCount > 0\n ? pattern.successCount / pattern.usageCount\n : 0;\n relevance += successRate * 0.2;\n\n if (relevance > 0.4) {\n results.push({\n type: 'pattern',\n data: pattern,\n relevance: Math.min(1, relevance),\n reasoning: `${reasoning}, ${Math.round(successRate * 100)}% success rate`,\n source: 'pattern_affinity',\n timestamp: pattern.lastUsedAt,\n });\n }\n }\n\n // Search sessions for patterns\n const sessions = await this.memoryManager.getUserGenerationHistory(params.userId, limit);\n for (const session of sessions) {\n const matchingPatterns = session.patterns.filter(p =>\n matchedTerms.some(term => p.toLowerCase().includes(term))\n );\n\n if (matchingPatterns.length > 0) {\n results.push({\n type: 'session',\n data: session,\n relevance: 0.5 + matchingPatterns.length * 0.1,\n reasoning: `Session uses patterns: ${matchingPatterns.join(', ')}`,\n source: 'generation_history',\n timestamp: session.createdAt,\n });\n }\n }\n\n return results;\n }\n\n /**\n * Hybrid search - combines all strategies\n */\n private async hybridSearch(\n params: AgenticSearchParams,\n depth: number,\n limit: number,\n ): Promise<SearchResult[]> {\n const [temporal, semantic, pattern] = await Promise.all([\n this.temporalSearch(params, depth, Math.ceil(limit / 2)),\n this.semanticSearch(params, depth, Math.ceil(limit / 2)),\n this.patternSearch(params, depth, Math.ceil(limit / 2)),\n ]);\n\n // Combine and deduplicate results\n const seen = new Set<string>();\n const combined: SearchResult[] = [];\n\n for (const result of [...temporal, ...semantic, ...pattern]) {\n // Create unique key for deduplication\n const key = `${result.type}-${JSON.stringify(result.data)}`;\n if (!seen.has(key)) {\n seen.add(key);\n combined.push(result);\n }\n }\n\n return combined;\n }\n\n // ============================================================================\n // Helpers\n // ============================================================================\n\n /**\n * Extract semantic concepts from query\n */\n private extractConcepts(query: string): {\n naming?: boolean;\n validation?: boolean;\n patterns?: string[];\n entities?: string[];\n actions?: string[];\n } {\n const lower = query.toLowerCase();\n return {\n naming: /naming|case|pascal|camel|snake/i.test(lower),\n validation: /validat|schema|required|optional/i.test(lower),\n patterns: ['entity', 'list', 'form', 'detail', 'card'].filter(p => lower.includes(p)),\n entities: this.extractEntityNames(lower),\n actions: ['create', 'update', 'delete', 'list', 'view'].filter(a => lower.includes(a)),\n };\n }\n\n /**\n * Extract potential entity names from query\n */\n private extractEntityNames(query: string): string[] {\n // Look for capitalized words that could be entity names\n const words = query.split(/\\s+/);\n const entities: string[] = [];\n\n for (const word of words) {\n // Clean up punctuation\n const clean = word.replace(/[^a-zA-Z]/g, '');\n // Capitalized words are likely entities\n if (clean.length > 2 && clean[0] === clean[0].toUpperCase()) {\n entities.push(clean);\n }\n }\n\n return entities;\n }\n\n /**\n * Generate insights from search results\n */\n private generateInsights(results: SearchResult[], query: string): {\n summary: string;\n patterns: string[];\n trends: string[];\n suggestions: string[];\n } {\n const summary = `Found ${results.length} relevant memory items for \"${query}\"`;\n\n // Extract patterns\n const patternResults = results.filter(r => r.type === 'pattern');\n const patterns = patternResults.length > 0\n ? patternResults.slice(0, 3).map(r => (r.data as { patternId: string }).patternId)\n : ['No dominant patterns identified'];\n\n // Analyze trends\n const sessions = results.filter(r => r.type === 'session');\n const trends: string[] = [];\n\n if (sessions.length > 0) {\n const timestamps = sessions\n .filter(s => s.timestamp)\n .map(s => s.timestamp!.getTime())\n .sort((a, b) => b - a);\n\n if (timestamps.length >= 2) {\n const avgGap = (timestamps[0] - timestamps[timestamps.length - 1]) / (timestamps.length - 1);\n const daysGap = avgGap / (1000 * 60 * 60 * 24);\n\n if (daysGap < 7) {\n trends.push('High activity - multiple sessions per week');\n } else if (daysGap > 30) {\n trends.push('Sporadic usage - sessions spread out over time');\n }\n }\n }\n\n // Generate suggestions\n const suggestions: string[] = [];\n\n if (patterns.length > 0 && !patterns[0].includes('No dominant')) {\n suggestions.push(`Consider reusing pattern: ${patterns[0]}`);\n }\n\n const projectResults = results.filter(r => r.type === 'project');\n if (projectResults.length > 0) {\n suggestions.push('Review existing project conventions for consistency');\n }\n\n const interruptResults = results.filter(r => r.type === 'interrupt');\n if (interruptResults.length > 3) {\n suggestions.push('High interrupt frequency - consider adjusting auto-approval settings');\n }\n\n if (suggestions.length === 0) {\n suggestions.push('No specific suggestions based on current memory');\n }\n\n return { summary, patterns, trends, suggestions };\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\n/**\n * Create an agentic search engine\n */\nexport function createAgenticSearchEngine(memoryManager: MemoryManager): AgenticSearchEngine {\n return new AgenticSearchEngine(memoryManager);\n}\n","/**\n * Preference Learner\n *\n * Uses LLM to infer user preferences from generation sessions.\n * Leverages @almadar/llm for structured output.\n *\n * @packageDocumentation\n */\n\nimport { LLMClient, createRequirementsClient } from '@almadar/llm';\nimport type { GenerationSession, UserPreference } from './memory-orbital.js';\nimport { MemoryManager } from './MemoryManager.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface PreferenceLearnerOptions {\n /** LLM client for inference */\n llmClient?: LLMClient;\n /** Memory manager for persistence */\n memoryManager: MemoryManager;\n /** Confidence threshold for auto-accepting preferences */\n confidenceThreshold?: number;\n}\n\nexport interface InferredPreference {\n /** The preference field being inferred */\n field: keyof Omit<UserPreference, 'id' | 'userId' | 'learnedAt'>;\n /** The inferred value */\n value: unknown;\n /** Confidence level (0-1) */\n confidence: number;\n /** Explanation of why this was inferred */\n reasoning: string;\n}\n\nexport interface PreferenceAnalysis {\n /** List of inferred preferences */\n inferences: InferredPreference[];\n /** Whether the inference is high confidence */\n isHighConfidence: boolean;\n}\n\n// ============================================================================\n// Preference Learner\n// ============================================================================\n\nexport class PreferenceLearner {\n private llmClient: LLMClient;\n private memoryManager: MemoryManager;\n private confidenceThreshold: number;\n\n constructor(options: PreferenceLearnerOptions) {\n this.llmClient = options.llmClient ?? createRequirementsClient();\n this.memoryManager = options.memoryManager;\n this.confidenceThreshold = options.confidenceThreshold ?? 0.7;\n }\n\n /**\n * Analyze a session and infer user preferences\n */\n async analyzeSession(session: GenerationSession): Promise<PreferenceAnalysis> {\n const prompt = this.buildAnalysisPrompt(session);\n \n const content = await this.llmClient.call<string>({\n systemPrompt: 'You analyze generation sessions and infer user preferences. Respond with JSON.',\n userPrompt: prompt,\n });\n\n return this.parseAnalysisResponse(content);\n }\n\n /**\n * Learn from a session and update preferences if confidence is high\n */\n async learnFromSession(session: GenerationSession): Promise<UserPreference | null> {\n // Get existing preferences\n let preferences = await this.memoryManager.getUserPreferences(session.userId);\n \n if (!preferences) {\n preferences = {\n id: session.userId,\n userId: session.userId,\n namingConvention: 'PascalCase',\n validationStyle: 'strict',\n preferredPatterns: [],\n commonEntities: [],\n commonTraits: [],\n learnedAt: new Date(),\n confidence: 0.5,\n };\n }\n\n // Analyze session\n const analysis = await this.analyzeSession(session);\n\n // Update preferences with high-confidence inferences\n let updated = false;\n for (const inference of analysis.inferences) {\n if (inference.confidence >= this.confidenceThreshold) {\n switch (inference.field) {\n case 'namingConvention':\n if (this.isValidNamingConvention(inference.value)) {\n preferences.namingConvention = inference.value;\n updated = true;\n }\n break;\n case 'validationStyle':\n if (this.isValidValidationStyle(inference.value)) {\n preferences.validationStyle = inference.value;\n updated = true;\n }\n break;\n case 'preferredPatterns':\n if (Array.isArray(inference.value)) {\n preferences.preferredPatterns = [\n ...new Set([...preferences.preferredPatterns, ...inference.value]),\n ].slice(0, 10);\n updated = true;\n }\n break;\n case 'commonEntities':\n if (Array.isArray(inference.value)) {\n preferences.commonEntities = [\n ...new Set([...preferences.commonEntities, ...inference.value]),\n ].slice(0, 20);\n updated = true;\n }\n break;\n }\n }\n }\n\n // Update confidence based on number of sessions\n if (updated) {\n preferences.confidence = Math.min(1.0, preferences.confidence + 0.05);\n await this.memoryManager.updateUserPreferences(session.userId, preferences);\n }\n\n return updated ? preferences : null;\n }\n\n /**\n * Batch learn from multiple sessions\n */\n async batchLearn(sessions: GenerationSession[]): Promise<UserPreference | null> {\n if (sessions.length === 0) return null;\n\n const userId = sessions[0].userId;\n let preferences = await this.memoryManager.getUserPreferences(userId);\n \n if (!preferences) {\n preferences = {\n id: userId,\n userId,\n namingConvention: 'PascalCase',\n validationStyle: 'strict',\n preferredPatterns: [],\n commonEntities: [],\n commonTraits: [],\n learnedAt: new Date(),\n confidence: 0.5,\n };\n }\n\n // Aggregate patterns and entities across all sessions\n const allPatterns = new Set<string>();\n const allEntities = new Set<string>();\n \n for (const session of sessions) {\n session.patterns.forEach(p => allPatterns.add(p));\n session.entities.forEach(e => allEntities.add(e));\n }\n\n // Update preferences\n preferences.preferredPatterns = [...allPatterns].slice(0, 10);\n preferences.commonEntities = [...allEntities].slice(0, 20);\n preferences.confidence = Math.min(1.0, 0.5 + (sessions.length * 0.05));\n\n // Use LLM to infer naming convention and validation style from aggregate\n const aggregatePrompt = this.buildAggregatePrompt(sessions);\n const content = await this.llmClient.call<string>({\n systemPrompt: 'You analyze generation sessions and infer user preferences. Respond with JSON.',\n userPrompt: aggregatePrompt,\n });\n\n const analysis = this.parseAnalysisResponse(content);\n for (const inference of analysis.inferences) {\n if (inference.confidence >= this.confidenceThreshold) {\n if (inference.field === 'namingConvention' && this.isValidNamingConvention(inference.value)) {\n preferences.namingConvention = inference.value;\n }\n if (inference.field === 'validationStyle' && this.isValidValidationStyle(inference.value)) {\n preferences.validationStyle = inference.value;\n }\n }\n }\n\n await this.memoryManager.updateUserPreferences(userId, preferences);\n return preferences;\n }\n\n // ==========================================================================\n // Prompt Building\n // ==========================================================================\n\n private buildAnalysisPrompt(session: GenerationSession): string {\n return `Analyze this generation session and infer the user's preferences.\n\nSession Details:\n- Prompt: \"${session.prompt}\"\n- Generated Entities: ${session.entities.join(', ')}\n- Used Patterns: ${session.patterns.join(', ')}\n- Skill: ${session.skill}\n\nSchema Excerpt:\n${JSON.stringify(session.generatedSchema, null, 2).slice(0, 2000)}\n\nAnalyze and infer:\n1. Naming convention preference (PascalCase, camelCase, snake_case)\n2. Validation style (strict, minimal, none)\n3. Preferred UI patterns\n4. Common entity types\n\nRespond in JSON format:\n{\n \"inferences\": [\n {\n \"field\": \"namingConvention\",\n \"value\": \"PascalCase\",\n \"confidence\": 0.85,\n \"reasoning\": \"User consistently uses PascalCase for entity names\"\n }\n ],\n \"isHighConfidence\": true\n}`;\n }\n\n private buildAggregatePrompt(sessions: GenerationSession[]): string {\n const summaries = sessions.slice(0, 10).map(s => ({\n prompt: s.prompt.slice(0, 100),\n entities: s.entities,\n patterns: s.patterns,\n }));\n\n return `Analyze these ${sessions.length} generation sessions and infer the user's aggregate preferences.\n\nSession Summaries:\n${JSON.stringify(summaries, null, 2)}\n\nInfer the user's overall:\n1. Naming convention preference (PascalCase, camelCase, snake_case)\n2. Validation style (strict, minimal, none)\n\nRespond in JSON format:\n{\n \"inferences\": [\n {\n \"field\": \"namingConvention\",\n \"value\": \"PascalCase\",\n \"confidence\": 0.9,\n \"reasoning\": \"Used PascalCase in 8 out of 10 sessions\"\n }\n ],\n \"isHighConfidence\": true\n}`;\n }\n\n // ==========================================================================\n // Response Parsing\n // ==========================================================================\n\n private parseAnalysisResponse(content: string): PreferenceAnalysis {\n try {\n const jsonMatch = content.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return { inferences: [], isHighConfidence: false };\n }\n\n const parsed = JSON.parse(jsonMatch[0]);\n \n if (Array.isArray(parsed.inferences)) {\n return {\n inferences: parsed.inferences.filter((inf: InferredPreference) => \n inf.field && inf.value !== undefined && typeof inf.confidence === 'number'\n ),\n isHighConfidence: parsed.isHighConfidence ?? false,\n };\n }\n\n return { inferences: [], isHighConfidence: false };\n } catch {\n return { inferences: [], isHighConfidence: false };\n }\n }\n\n // ==========================================================================\n // Validation Helpers\n // ==========================================================================\n\n private isValidNamingConvention(value: unknown): value is UserPreference['namingConvention'] {\n return typeof value === 'string' && ['PascalCase', 'camelCase', 'snake_case'].includes(value);\n }\n\n private isValidValidationStyle(value: unknown): value is UserPreference['validationStyle'] {\n return typeof value === 'string' && ['strict', 'minimal', 'none'].includes(value);\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createPreferenceLearner(options: PreferenceLearnerOptions): PreferenceLearner {\n return new PreferenceLearner(options);\n}\n","/**\n * Tool Composition & Chaining - Phase 3.3\n *\n * Composable tool workflows with parallel execution, error handling,\n * and conditional branching.\n *\n * @packageDocumentation\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport type ToolStepStatus = 'pending' | 'running' | 'success' | 'error' | 'skipped';\n\nexport interface ToolStep {\n id: string;\n name: string;\n tool: string;\n input: Record<string, unknown> | ((context: WorkflowContext) => Record<string, unknown>);\n condition?: (context: WorkflowContext) => boolean;\n dependsOn?: string[];\n status: ToolStepStatus;\n output?: unknown;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\nexport interface WorkflowContext {\n workflowId: string;\n inputs: Record<string, unknown>;\n outputs: Record<string, unknown>;\n stepResults: Map<string, { success: boolean; output?: unknown; error?: string }>;\n metadata: {\n startTime: number;\n stepsCompleted: number;\n stepsFailed: number;\n };\n}\n\nexport interface WorkflowDefinition {\n name: string;\n description: string;\n inputs: Record<string, { type: string; required: boolean; default?: unknown }>;\n steps: ToolStep[];\n onError?: 'stop' | 'continue' | 'retry';\n maxRetries?: number;\n}\n\nexport interface WorkflowExecutionResult {\n success: boolean;\n workflowId: string;\n context: WorkflowContext;\n steps: ToolStep[];\n durationMs: number;\n error?: string;\n}\n\nexport interface ParallelExecutionResult {\n stepId: string;\n success: boolean;\n output?: unknown;\n error?: string;\n durationMs: number;\n}\n\n// ============================================================================\n// Tool Executor Interface\n// ============================================================================\n\nexport interface ToolExecutor {\n execute(tool: string, input: Record<string, unknown>): Promise<unknown>;\n}\n\n// ============================================================================\n// Workflow Engine\n// ============================================================================\n\nexport class WorkflowEngine {\n private executor: ToolExecutor;\n private workflows: Map<string, WorkflowDefinition> = new Map();\n\n constructor(executor: ToolExecutor) {\n this.executor = executor;\n }\n\n /**\n * Register a workflow definition\n */\n registerWorkflow(definition: WorkflowDefinition): void {\n this.workflows.set(definition.name, definition);\n }\n\n /**\n * Execute a workflow by name\n */\n async executeWorkflow(\n workflowName: string,\n inputs: Record<string, unknown>\n ): Promise<WorkflowExecutionResult> {\n const definition = this.workflows.get(workflowName);\n if (!definition) {\n throw new Error(`Workflow not found: ${workflowName}`);\n }\n\n return this.runWorkflow(definition, inputs);\n }\n\n /**\n * Execute a workflow definition directly\n */\n async runWorkflow(\n definition: WorkflowDefinition,\n inputs: Record<string, unknown>\n ): Promise<WorkflowExecutionResult> {\n const workflowId = `wf_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n const startTime = Date.now();\n\n const context: WorkflowContext = {\n workflowId,\n inputs,\n outputs: {},\n stepResults: new Map(),\n metadata: {\n startTime,\n stepsCompleted: 0,\n stepsFailed: 0,\n },\n };\n\n const steps = definition.steps.map(s => ({ ...s, status: 'pending' as ToolStepStatus }));\n\n try {\n // Topological sort for dependency resolution\n const executionOrder = this.resolveDependencies(steps);\n\n for (const stepId of executionOrder) {\n const step = steps.find(s => s.id === stepId)!;\n \n // Check condition\n if (step.condition && !step.condition(context)) {\n step.status = 'skipped';\n continue;\n }\n\n // Execute step\n await this.executeStep(step, context, definition);\n\n if (step.status === 'error' && definition.onError === 'stop') {\n break;\n }\n }\n\n const durationMs = Date.now() - startTime;\n\n return {\n success: context.metadata.stepsFailed === 0,\n workflowId,\n context,\n steps,\n durationMs,\n };\n } catch (error) {\n return {\n success: false,\n workflowId,\n context,\n steps,\n durationMs: Date.now() - startTime,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Execute independent steps in parallel\n */\n async executeParallel(\n steps: Array<{ id: string; tool: string; input: Record<string, unknown> }>,\n context: WorkflowContext\n ): Promise<ParallelExecutionResult[]> {\n const promises = steps.map(async (step) => {\n const startTime = Date.now();\n \n try {\n // Resolve input if it's a function\n const input = typeof step.input === 'function' \n ? (step.input as Function)(context)\n : step.input;\n\n const output = await this.executor.execute(step.tool, input);\n \n return {\n stepId: step.id,\n success: true,\n output,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n stepId: step.id,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - startTime,\n };\n }\n });\n\n return Promise.all(promises);\n }\n\n /**\n * Create a workflow builder for fluent API\n */\n createWorkflow(name: string, description: string): WorkflowBuilder {\n return new WorkflowBuilder(this, name, description);\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private async executeStep(\n step: ToolStep,\n context: WorkflowContext,\n definition: WorkflowDefinition\n ): Promise<void> {\n step.status = 'running';\n step.startTime = Date.now();\n\n const maxRetries = definition.maxRetries ?? 0;\n let attempt = 0;\n\n while (attempt <= maxRetries) {\n try {\n // Resolve input\n const input = typeof step.input === 'function'\n ? (step.input as (context: WorkflowContext) => Record<string, unknown>)(context)\n : step.input;\n\n const output = await this.executor.execute(step.tool, input);\n\n step.output = output;\n step.status = 'success';\n step.endTime = Date.now();\n \n context.stepResults.set(step.id, { success: true, output });\n context.outputs[step.id] = output;\n context.metadata.stepsCompleted++;\n\n return;\n } catch (error) {\n attempt++;\n \n if (attempt > maxRetries) {\n step.error = error instanceof Error ? error.message : String(error);\n step.status = 'error';\n step.endTime = Date.now();\n \n context.stepResults.set(step.id, { success: false, error: step.error });\n context.metadata.stepsFailed++;\n \n return;\n }\n\n // Retry delay\n await new Promise(r => setTimeout(r, 1000 * attempt));\n }\n }\n }\n\n private resolveDependencies(steps: ToolStep[]): string[] {\n const visited = new Set<string>();\n const result: string[] = [];\n\n const visit = (stepId: string) => {\n if (visited.has(stepId)) return;\n visited.add(stepId);\n\n const step = steps.find(s => s.id === stepId);\n if (!step) return;\n\n // Visit dependencies first\n if (step.dependsOn) {\n for (const dep of step.dependsOn) {\n visit(dep);\n }\n }\n\n result.push(stepId);\n };\n\n for (const step of steps) {\n visit(step.id);\n }\n\n return result;\n }\n}\n\n// ============================================================================\n// Workflow Builder (Fluent API)\n// ============================================================================\n\nexport class WorkflowBuilder {\n private engine: WorkflowEngine;\n private definition: WorkflowDefinition;\n\n constructor(engine: WorkflowEngine, name: string, description: string) {\n this.engine = engine;\n this.definition = {\n name,\n description,\n inputs: {},\n steps: [],\n onError: 'stop',\n maxRetries: 0,\n };\n }\n\n input(name: string, type: string, required: boolean = true, defaultValue?: unknown): this {\n this.definition.inputs[name] = { type, required, default: defaultValue };\n return this;\n }\n\n step(\n id: string,\n tool: string,\n input: Record<string, unknown> | ((context: WorkflowContext) => Record<string, unknown>),\n options: {\n dependsOn?: string[];\n condition?: (context: WorkflowContext) => boolean;\n } = {}\n ): this {\n this.definition.steps.push({\n id,\n name: id,\n tool,\n input,\n dependsOn: options.dependsOn,\n condition: options.condition,\n status: 'pending',\n });\n return this;\n }\n\n parallel(steps: Array<{\n id: string;\n tool: string;\n input: Record<string, unknown>;\n }>): this {\n // Add all steps with no dependencies between them\n for (const step of steps) {\n this.definition.steps.push({\n id: step.id,\n name: step.id,\n tool: step.tool,\n input: step.input,\n status: 'pending',\n });\n }\n return this;\n }\n\n onError(policy: 'stop' | 'continue' | 'retry'): this {\n this.definition.onError = policy;\n return this;\n }\n\n retry(maxRetries: number): this {\n this.definition.maxRetries = maxRetries;\n return this;\n }\n\n build(): WorkflowDefinition {\n return this.definition;\n }\n\n async execute(inputs: Record<string, unknown>): Promise<WorkflowExecutionResult> {\n return this.engine.runWorkflow(this.definition, inputs);\n }\n}\n\n// ============================================================================\n// Common Workflows\n// ============================================================================\n\nexport function createSchemaGenerationWorkflow(engine: WorkflowEngine): WorkflowDefinition {\n return engine.createWorkflow(\n 'schema-generation',\n 'Generate and validate orbital schema'\n )\n .input('request', 'string', true)\n .input('domain', 'string', false, 'business')\n .step(\n 'decompose',\n 'decompose_requirements',\n { request: (ctx: WorkflowContext) => ctx.inputs.request as string },\n )\n .step(\n 'generate',\n 'generate_orbital',\n { requirements: (ctx: WorkflowContext) => ctx.outputs.decompose },\n { dependsOn: ['decompose'] }\n )\n .step(\n 'validate',\n 'validate_schema',\n { schema: (ctx: WorkflowContext) => ctx.outputs.generate },\n { dependsOn: ['generate'] }\n )\n .step(\n 'fix',\n 'fix_schema_errors',\n { \n schema: (ctx: WorkflowContext) => ctx.outputs.generate, \n errors: (ctx: WorkflowContext) => ctx.outputs.validate \n },\n { \n dependsOn: ['validate'],\n condition: (ctx: WorkflowContext) => !ctx.stepResults.get('validate')?.success\n }\n )\n .retry(2)\n .build();\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createWorkflowEngine(executor: ToolExecutor): WorkflowEngine {\n return new WorkflowEngine(executor);\n}\n","/**\n * Firestore Store for LangGraph\n *\n * Custom implementation of BaseStore using Firebase Firestore.\n * This provides persistent key-value storage for agent memories.\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 {\n BaseStore,\n type Item,\n type GetOperation,\n type SearchOperation,\n type PutOperation,\n type ListNamespacesOperation,\n type Operation,\n type OperationResults,\n type SearchItem,\n} from '@langchain/langgraph-checkpoint';\n\nimport type { FirestoreDb, FirestoreTimestamp } from './firestore-checkpointer.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for FirestoreStore.\n */\nexport interface FirestoreStoreOptions {\n /**\n * Firestore instance. Required — injected by consumer.\n */\n db: FirestoreDb;\n\n /**\n * Collection name for store items.\n * @default 'agent_memories'\n */\n collection?: string;\n}\n\n/**\n * Document structure for store items.\n */\ninterface StoreDocument {\n namespace: string[];\n namespaceKey: string; // Joined namespace for querying\n key: string;\n value: Record<string, unknown>;\n createdAt: FirestoreTimestamp;\n updatedAt: FirestoreTimestamp;\n}\n\n// ============================================================================\n// FirestoreStore\n// ============================================================================\n\n/**\n * Firestore-backed store for LangGraph agent memories.\n *\n * Provides persistent key-value storage that can be shared across threads.\n * Items are organized by hierarchical namespaces.\n *\n * @example\n * ```typescript\n * import { getFirestore } from 'firebase-admin/firestore';\n *\n * const store = new FirestoreStore({\n * db: getFirestore(),\n * collection: 'agent_memories',\n * });\n *\n * // Store a memory\n * await store.put(['agent', 'patterns'], 'schema-best-practices', {\n * content: 'Always validate schemas before saving',\n * });\n *\n * // Retrieve a memory\n * const item = await store.get(['agent', 'patterns'], 'schema-best-practices');\n * ```\n */\nexport class FirestoreStore extends BaseStore {\n private db: FirestoreDb;\n private collection: string;\n\n constructor(options: FirestoreStoreOptions) {\n super();\n this.db = options.db;\n this.collection = options.collection ?? 'agent_memories';\n }\n\n /**\n * Create document ID from namespace and key.\n */\n private makeDocId(namespace: string[], key: string): string {\n return [...namespace, key].join('/');\n }\n\n /**\n * Create namespace key for querying.\n */\n private makeNamespaceKey(namespace: string[]): string {\n return namespace.join('/');\n }\n\n /**\n * Execute multiple operations in a batch.\n */\n async batch<Op extends Operation[]>(operations: Op): Promise<OperationResults<Op>> {\n const results: unknown[] = [];\n\n for (const op of operations) {\n if ('key' in op && 'namespace' in op && !('namespacePrefix' in op)) {\n if ('value' in op) {\n // PutOperation\n const putOp = op as PutOperation;\n if (putOp.value === null) {\n await this.deleteItem(putOp.namespace, putOp.key);\n } else {\n await this.putItem(putOp.namespace, putOp.key, putOp.value);\n }\n results.push(undefined);\n } else {\n // GetOperation\n const getOp = op as GetOperation;\n const item = await this.getItem(getOp.namespace, getOp.key);\n results.push(item);\n }\n } else if ('namespacePrefix' in op) {\n // SearchOperation\n const searchOp = op as SearchOperation;\n const items = await this.searchItems(searchOp);\n results.push(items);\n } else if ('matchConditions' in op || ('limit' in op && 'offset' in op && !('namespacePrefix' in op))) {\n // ListNamespacesOperation\n const listOp = op as ListNamespacesOperation;\n const namespaces = await this.listNamespacesItems(listOp);\n results.push(namespaces);\n }\n }\n\n return results as OperationResults<Op>;\n }\n\n /**\n * Get an item by namespace and key.\n */\n private async getItem(namespace: string[], key: string): Promise<Item | null> {\n const docId = this.makeDocId(namespace, key);\n const doc = await this.db.collection(this.collection).doc(docId).get();\n\n if (!doc.exists) {\n return null;\n }\n\n const data = doc.data() as unknown as StoreDocument;\n return {\n namespace: data.namespace,\n key: data.key,\n value: data.value,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n updatedAt: data.updatedAt?.toDate?.() ?? new Date(data.updatedAt as unknown as string),\n };\n }\n\n /**\n * Put an item.\n */\n private async putItem(\n namespace: string[],\n key: string,\n value: Record<string, unknown>\n ): Promise<void> {\n const docId = this.makeDocId(namespace, key);\n const now = new Date();\n\n const existingDoc = await this.db.collection(this.collection).doc(docId).get();\n const createdAt = existingDoc.exists\n ? ((existingDoc.data() as unknown as StoreDocument).createdAt as unknown as Date)\n : now;\n\n const docData = {\n namespace,\n namespaceKey: this.makeNamespaceKey(namespace),\n key,\n value,\n createdAt,\n updatedAt: now,\n };\n\n await this.db.collection(this.collection).doc(docId).set(docData);\n }\n\n /**\n * Delete an item.\n */\n private async deleteItem(namespace: string[], key: string): Promise<void> {\n const docId = this.makeDocId(namespace, key);\n await this.db.collection(this.collection).doc(docId).delete();\n }\n\n /**\n * Search for items.\n */\n private async searchItems(op: SearchOperation): Promise<SearchItem[]> {\n const namespacePrefix = this.makeNamespaceKey(op.namespacePrefix);\n const limit = op.limit ?? 10;\n const offset = op.offset ?? 0;\n\n // Query by namespace prefix\n let query = this.db.collection(this.collection) as unknown as {\n where(field: string, op: string, value: unknown): typeof query;\n limit(n: number): typeof query;\n get(): Promise<{ docs: Array<{ data(): Record<string, unknown> }> }>;\n };\n\n if (namespacePrefix) {\n // Use range query for prefix matching\n query = query\n .where('namespaceKey', '>=', namespacePrefix)\n .where('namespaceKey', '<', namespacePrefix + '\\uffff');\n }\n\n // Apply filters\n if (op.filter) {\n for (const [key, filterValue] of Object.entries(op.filter)) {\n if (typeof filterValue === 'object' && filterValue !== null) {\n // Handle comparison operators\n for (const [operator, value] of Object.entries(filterValue as Record<string, unknown>)) {\n switch (operator) {\n case '$eq':\n query = query.where(`value.${key}`, '==', value);\n break;\n case '$ne':\n query = query.where(`value.${key}`, '!=', value);\n break;\n case '$gt':\n query = query.where(`value.${key}`, '>', value);\n break;\n case '$gte':\n query = query.where(`value.${key}`, '>=', value);\n break;\n case '$lt':\n query = query.where(`value.${key}`, '<', value);\n break;\n case '$lte':\n query = query.where(`value.${key}`, '<=', value);\n break;\n }\n }\n } else {\n // Direct equality\n query = query.where(`value.${key}`, '==', filterValue);\n }\n }\n }\n\n // Apply pagination\n query = query.limit(limit + offset);\n\n const snapshot = await query.get();\n const docs = snapshot.docs.slice(offset);\n\n return docs.map((doc) => {\n const data = doc.data() as unknown as StoreDocument;\n return {\n namespace: data.namespace,\n key: data.key,\n value: data.value,\n createdAt: data.createdAt?.toDate?.() ?? new Date(data.createdAt as unknown as string),\n updatedAt: data.updatedAt?.toDate?.() ?? new Date(data.updatedAt as unknown as string),\n };\n });\n }\n\n /**\n * List namespaces.\n */\n private async listNamespacesItems(op: ListNamespacesOperation): Promise<string[][]> {\n const limit = op.limit ?? 10;\n const offset = op.offset ?? 0;\n\n let query = this.db.collection(this.collection) as unknown as {\n where(field: string, op: string, value: unknown): typeof query;\n get(): Promise<{ docs: Array<{ data(): Record<string, unknown> }> }>;\n };\n\n // Apply match conditions\n if (op.matchConditions) {\n for (const condition of op.matchConditions) {\n const path = condition.path.filter((p) => p !== '*').join('/');\n if (condition.matchType === 'prefix') {\n query = query\n .where('namespaceKey', '>=', path)\n .where('namespaceKey', '<', path + '\\uffff');\n }\n // suffix matching done in memory\n }\n }\n\n // Get all documents and extract unique namespaces\n const snapshot = await query.get();\n const namespaceSet = new Set<string>();\n\n for (const doc of snapshot.docs) {\n const data = doc.data() as unknown as StoreDocument;\n const namespace = data.namespace;\n\n // Apply max depth if specified\n if (op.maxDepth !== undefined && namespace.length > op.maxDepth) {\n namespaceSet.add(namespace.slice(0, op.maxDepth).join('/'));\n } else {\n namespaceSet.add(namespace.join('/'));\n }\n }\n\n const namespaces = Array.from(namespaceSet)\n .map((ns) => ns.split('/'))\n .slice(offset, offset + limit);\n\n return namespaces;\n }\n}\n","/**\n * Event Transformer for DeepAgent\n *\n * Transforms raw LangGraph/deepagents events into SSE events.\n * Handles special events like todo updates and file operations.\n *\n * Supports both:\n * - LangGraph event structures (event.tools, event.model_request)\n * - Legacy flat event structures (event.todos, event.tool_call)\n */\n\nimport {\n createSSEEvent,\n type SSEEvent,\n} from '../api-types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Raw agent event from LangGraph/deepagents.\n */\nexport interface RawAgentEvent {\n // LangGraph nested structures\n tools?: {\n todos?: Array<{ content?: string; task?: string; status?: string; id?: string }>;\n messages?: Array<Record<string, unknown>>;\n };\n model_request?: {\n messages?: Array<Record<string, unknown>>;\n };\n\n // Legacy flat structures\n messages?: Array<{\n role?: string;\n content?: string;\n }>;\n tool_call?: {\n name?: string;\n args?: Record<string, unknown>;\n };\n toolCall?: {\n name?: string;\n args?: Record<string, unknown>;\n };\n tool_result?: {\n name?: string;\n result?: unknown;\n };\n toolResult?: {\n name?: string;\n result?: unknown;\n };\n todos?: Array<{\n id?: string;\n task?: string;\n status?: 'pending' | 'in_progress' | 'completed';\n }>;\n\n // Interrupt events (both formats)\n __interrupt__?: Array<{\n value?: {\n actionRequests?: Array<{ name?: string; args?: Record<string, unknown>; description?: string }>;\n reviewConfigs?: Array<{ allowedDecisions?: string[] }>;\n };\n action?: {\n tool?: string;\n toolInput?: Record<string, unknown>;\n };\n config?: {\n allowedDecisions?: string[];\n };\n }>;\n\n // Other fields\n [key: string]: unknown;\n}\n\n// ============================================================================\n// File Operation Detection\n// ============================================================================\n\n/**\n * File operation tool names from FilesystemMiddleware.\n */\nconst FILE_OPERATION_TOOLS = new Set([\n 'ls',\n 'read_file',\n 'write_file',\n 'edit_file',\n]);\n\n/**\n * Check if a tool name is a file operation.\n */\nfunction isFileOperationTool(toolName: string): boolean {\n return FILE_OPERATION_TOOLS.has(toolName);\n}\n\n// ============================================================================\n// LangGraph Message Extraction Helpers\n// ============================================================================\n\n/**\n * Extract text content from a LangChain message object.\n * Handles both serialized format (kwargs.content) and deserialized format (content directly).\n */\nfunction extractMessageContent(msg: Record<string, unknown>): string | null {\n let content: unknown = null;\n\n if (msg.kwargs && typeof msg.kwargs === 'object') {\n const kwargs = msg.kwargs as Record<string, unknown>;\n content = kwargs.content;\n } else if (msg.content !== undefined) {\n content = msg.content;\n }\n\n if (!content) return null;\n\n if (typeof content === 'string') {\n return content;\n }\n if (Array.isArray(content)) {\n const texts = content\n .filter((block): block is { type: string; text: string } =>\n typeof block === 'object' && block !== null && block.type === 'text' && typeof block.text === 'string'\n )\n .map(block => block.text);\n if (texts.length > 0) {\n return texts.join('\\n');\n }\n }\n\n return null;\n}\n\n/**\n * Extract tool calls from a LangChain AI message.\n * Handles both Anthropic format (tool_use in content) and OpenAI/DeepSeek format (tool_calls in additional_kwargs).\n */\nfunction extractToolCalls(msg: Record<string, unknown>): Array<{ name: string; args: Record<string, unknown> }> | null {\n let content: unknown = null;\n let additionalKwargs: Record<string, unknown> | null = null;\n\n if (msg.kwargs && typeof msg.kwargs === 'object') {\n const kwargs = msg.kwargs as Record<string, unknown>;\n content = kwargs.content;\n additionalKwargs = kwargs.additional_kwargs as Record<string, unknown> | null;\n } else if (msg.content !== undefined) {\n content = msg.content;\n additionalKwargs = msg.additional_kwargs as Record<string, unknown> | null;\n }\n\n // Try OpenAI/DeepSeek format first: tool_calls in additional_kwargs\n if (additionalKwargs?.tool_calls && Array.isArray(additionalKwargs.tool_calls)) {\n const toolCalls = (additionalKwargs.tool_calls as Array<{\n id?: string;\n type?: string;\n function?: { name: string; arguments?: string };\n }>)\n .filter(tc => tc.function?.name)\n .map(tc => {\n let args: Record<string, unknown> = {};\n const rawArgs = tc.function?.arguments;\n const toolName = tc.function?.name || 'unknown';\n\n if (rawArgs) {\n try {\n args = JSON.parse(rawArgs);\n } catch {\n // If JSON parse fails, skip\n }\n }\n return { name: toolName, args };\n });\n\n if (toolCalls.length > 0) {\n return toolCalls;\n }\n }\n\n // Try Anthropic format: tool_use blocks in content array\n if (content && Array.isArray(content)) {\n const toolCalls = content\n .filter((block): block is { type: string; name: string; input?: Record<string, unknown> } =>\n typeof block === 'object' && block !== null && block.type === 'tool_use' && typeof block.name === 'string'\n )\n .map(block => ({ name: block.name, args: block.input || {} }));\n\n if (toolCalls.length > 0) {\n return toolCalls;\n }\n }\n\n return null;\n}\n\n/**\n * Check if a message is an AI message.\n */\nfunction isAIMessage(msg: Record<string, unknown>): boolean {\n if (Array.isArray(msg.id) && (msg.id as string[]).includes('AIMessage')) return true;\n if ((msg as { type?: string }).type === 'ai') return true;\n return false;\n}\n\n// ============================================================================\n// Event Transformation\n// ============================================================================\n\n/**\n * Transform a raw agent event to SSE event(s).\n *\n * Handles both LangGraph nested structures and legacy flat structures.\n * Returns an array for consistency with multi-event scenarios.\n *\n * @param event Raw agent event\n * @param threadId Thread ID for context\n * @returns Array of SSE events\n */\nexport function transformAgentEvent(\n event: RawAgentEvent,\n threadId?: string\n): SSEEvent {\n const events = transformAgentEventMulti(event, threadId);\n return events[0] || createSSEEvent('message', { content: '', role: 'assistant', isComplete: true });\n}\n\n/**\n * Transform a raw agent event to multiple SSE events.\n * Use this when you need to handle all events from a single LangGraph event.\n */\nexport function transformAgentEventMulti(\n event: RawAgentEvent,\n threadId?: string\n): SSEEvent[] {\n const events: SSEEvent[] = [];\n\n // 1. Handle interrupts (highest priority)\n if (hasInterrupt(event)) {\n events.push(createSSEEvent('interrupt', extractInterruptData(event, threadId || 'unknown')));\n return events;\n }\n\n // 2. Handle LangGraph tools events (contains todos OR tool results)\n if (event.tools && typeof event.tools === 'object') {\n const toolsData = event.tools;\n\n // Check for todo updates from TodoListMiddleware\n if (toolsData.todos && Array.isArray(toolsData.todos) && toolsData.todos.length > 0) {\n const todos = toolsData.todos.map((t, idx) => ({\n id: t.id || `todo-${idx}`,\n task: t.task || t.content || '',\n status: (t.status as 'pending' | 'in_progress' | 'completed') || 'pending',\n }));\n events.push(createSSEEvent('todo_update', { todos }));\n return events;\n }\n\n // Check for tool execution results (ToolMessage)\n if (toolsData.messages && Array.isArray(toolsData.messages)) {\n const lastMsg = toolsData.messages[toolsData.messages.length - 1];\n\n // Extract kwargs — handle both LangChain 0.x (nested kwargs) and 1.x (flat properties)\n let kwargs: { content?: string; name?: string; status?: string } | undefined;\n if (lastMsg?.kwargs) {\n kwargs = lastMsg.kwargs as { content?: string; name?: string; status?: string };\n } else if (lastMsg && typeof lastMsg === 'object') {\n const msg = lastMsg as Record<string, unknown>;\n if (msg.content !== undefined || msg.name !== undefined) {\n kwargs = {\n content: String(msg.content || ''),\n name: String(msg.name || 'unknown'),\n status: String(msg.status || 'success'),\n };\n }\n }\n\n if (kwargs) {\n const content = kwargs.content || '';\n const toolName = kwargs.name || 'unknown';\n const success = kwargs.status !== 'error';\n\n events.push(createSSEEvent('tool_result', {\n tool: toolName,\n result: content,\n success,\n }));\n return events;\n }\n }\n }\n\n // 3. Handle LangGraph model_request (AI thinking/tool calls)\n if (event.model_request && typeof event.model_request === 'object') {\n const modelData = event.model_request as { messages?: Array<Record<string, unknown>> };\n if (modelData.messages && Array.isArray(modelData.messages)) {\n // Find the last AI message\n const aiMessages = modelData.messages.filter(isAIMessage);\n\n if (aiMessages.length > 0) {\n const lastAI = aiMessages[aiMessages.length - 1];\n\n // Check for tool calls first\n const toolCalls = extractToolCalls(lastAI);\n if (toolCalls && toolCalls.length > 0) {\n const toolCall = toolCalls[0];\n\n // Check if it's a file operation\n if (isFileOperationTool(toolCall.name)) {\n events.push(createSSEEvent('file_operation', {\n operation: toolCall.name as 'ls' | 'read_file' | 'write_file' | 'edit_file',\n path: (toolCall.args.path as string) || '',\n success: true,\n }));\n } else {\n events.push(createSSEEvent('tool_call', {\n tool: toolCall.name,\n args: toolCall.args,\n }));\n }\n return events;\n }\n\n // Extract text content (AI thinking)\n const content = extractMessageContent(lastAI);\n if (content && content.trim()) {\n events.push(createSSEEvent('message', {\n content: content,\n role: 'assistant',\n isComplete: false,\n }));\n return events;\n }\n }\n }\n }\n\n // 4. Handle legacy flat todo updates\n if (event.todos && Array.isArray(event.todos) && event.todos.length > 0) {\n events.push(createSSEEvent('todo_update', {\n todos: event.todos.map((t, idx) => ({\n id: t.id || `todo-${idx}`,\n task: t.task || '',\n status: t.status || 'pending',\n })),\n }));\n return events;\n }\n\n // 5. Handle legacy flat tool calls\n const toolCall = event.tool_call || event.toolCall;\n if (toolCall) {\n const toolName = toolCall.name || 'unknown';\n const toolArgs = toolCall.args || {};\n\n if (isFileOperationTool(toolName)) {\n events.push(createSSEEvent('file_operation', {\n operation: toolName as 'ls' | 'read_file' | 'write_file' | 'edit_file',\n path: (toolArgs.path as string) || '',\n success: true,\n }));\n } else {\n events.push(createSSEEvent('tool_call', {\n tool: toolName,\n args: toolArgs,\n }));\n }\n return events;\n }\n\n // 6. Handle legacy flat tool results\n const toolResult = event.tool_result || event.toolResult;\n if (toolResult) {\n events.push(createSSEEvent('tool_result', {\n tool: toolResult.name || 'unknown',\n result: toolResult.result,\n success: true,\n }));\n return events;\n }\n\n // 7. Handle legacy flat messages\n if (event.messages && Array.isArray(event.messages)) {\n const lastMessage = event.messages[event.messages.length - 1];\n if (lastMessage && typeof lastMessage === 'object') {\n events.push(createSSEEvent('message', {\n content: lastMessage.content || '',\n role: (lastMessage.role as 'assistant' | 'user' | 'system') || 'assistant',\n isComplete: true,\n }));\n return events;\n }\n }\n\n // 8. Default: skip unknown events\n return events;\n}\n\n/**\n * Check if an event contains an interrupt.\n */\nexport function hasInterrupt(event: RawAgentEvent): boolean {\n return '__interrupt__' in event && event.__interrupt__ !== undefined;\n}\n\n/**\n * Extract interrupt data from an event.\n */\nexport function extractInterruptData(event: RawAgentEvent, threadId: string): {\n threadId: string;\n actionRequests: Array<{\n tool: string;\n args: Record<string, unknown>;\n allowedDecisions: ('approve' | 'edit' | 'reject')[];\n description?: string;\n }>;\n} {\n const interrupts = event.__interrupt__;\n const actionRequests: Array<{\n tool: string;\n args: Record<string, unknown>;\n allowedDecisions: ('approve' | 'edit' | 'reject')[];\n description?: string;\n }> = [];\n\n for (const ir of interrupts || []) {\n // New HITL middleware format (value.actionRequests + value.reviewConfigs)\n if (ir.value?.actionRequests && ir.value?.reviewConfigs) {\n const { actionRequests: actions, reviewConfigs } = ir.value;\n for (let i = 0; i < actions.length; i++) {\n const action = actions[i];\n const config = reviewConfigs[i];\n actionRequests.push({\n tool: action.name || 'unknown',\n args: action.args || {},\n description: action.description,\n allowedDecisions: (config?.allowedDecisions as ('approve' | 'edit' | 'reject')[]) || ['approve', 'edit', 'reject'],\n });\n }\n }\n // Legacy format support\n else if (ir.action) {\n actionRequests.push({\n tool: ir.action.tool || 'unknown',\n args: ir.action.toolInput || {},\n allowedDecisions: (ir.config?.allowedDecisions as ('approve' | 'edit' | 'reject')[]) || ['approve', 'edit', 'reject'],\n });\n }\n }\n\n return { threadId, actionRequests };\n}\n\n/**\n * Check if an event is a todo update.\n */\nexport function isTodoUpdate(event: RawAgentEvent): boolean {\n // Check both LangGraph and legacy formats\n if (event.tools?.todos && Array.isArray(event.tools.todos) && event.tools.todos.length > 0) {\n return true;\n }\n return 'todos' in event && Array.isArray(event.todos) && event.todos.length > 0;\n}\n\n/**\n * Check if an event is a file operation.\n */\nexport function isFileOperation(event: RawAgentEvent): boolean {\n const toolCall = event.tool_call || event.toolCall;\n if (toolCall?.name && isFileOperationTool(toolCall.name)) return true;\n\n // Check LangGraph format\n if (event.model_request?.messages) {\n const aiMessages = event.model_request.messages.filter(isAIMessage);\n if (aiMessages.length > 0) {\n const toolCalls = extractToolCalls(aiMessages[aiMessages.length - 1] as Record<string, unknown>);\n if (toolCalls && toolCalls.length > 0) {\n return isFileOperationTool(toolCalls[0].name);\n }\n }\n }\n\n return false;\n}\n\n/**\n * Extract file operation details from an event.\n */\nexport function extractFileOperation(event: RawAgentEvent): {\n operation: string;\n path: string;\n} | null {\n const toolCall = event.tool_call || event.toolCall;\n if (toolCall?.name && isFileOperationTool(toolCall.name)) {\n return {\n operation: toolCall.name,\n path: (toolCall.args?.path as string) || '',\n };\n }\n\n // Check LangGraph format\n if (event.model_request?.messages) {\n const aiMessages = event.model_request.messages.filter(isAIMessage);\n if (aiMessages.length > 0) {\n const toolCalls = extractToolCalls(aiMessages[aiMessages.length - 1] as Record<string, unknown>);\n if (toolCalls && toolCalls.length > 0 && isFileOperationTool(toolCalls[0].name)) {\n return {\n operation: toolCalls[0].name,\n path: (toolCalls[0].args.path as string) || '',\n };\n }\n }\n }\n\n return null;\n}\n","/**\n * Memory Orbital Schema\n *\n * Defines the structure for agent memory using Orbital types.\n * This is an OrbitalSchema that represents user memory, preferences,\n * and generation history.\n *\n * @packageDocumentation\n */\n\nimport type {\n OrbitalSchema,\n Entity,\n Trait,\n} from '@almadar/core';\n\n// ============================================================================\n// Memory Entity Types\n// ============================================================================\n\n/**\n * User preference entity - stores learned or explicit preferences\n */\nexport const UserPreferenceEntity: Entity = {\n name: 'UserPreference',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'namingConvention', type: 'enum', values: ['PascalCase', 'camelCase', 'snake_case'], default: 'PascalCase' },\n { name: 'validationStyle', type: 'enum', values: ['strict', 'minimal', 'none'], default: 'strict' },\n { name: 'preferredPatterns', type: 'array', items: { name: 'pattern', type: 'string' }, default: [] },\n { name: 'commonEntities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'commonTraits', type: 'array', items: { name: 'trait', type: 'string' }, default: [] },\n { name: 'learnedAt', type: 'timestamp' },\n { name: 'confidence', type: 'number', default: 0.5 },\n ],\n};\n\n/**\n * Generation session entity - stores history of generations\n */\nexport const GenerationSessionEntity: Entity = {\n name: 'GenerationSession',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'threadId', type: 'string', required: true },\n { name: 'prompt', type: 'string', required: true },\n { name: 'skill', type: 'string', required: true },\n { name: 'entities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'patterns', type: 'array', items: { name: 'pattern', type: 'string' }, default: [] },\n { name: 'createdAt', type: 'timestamp', required: true },\n { name: 'completedAt', type: 'timestamp' },\n { name: 'success', type: 'boolean', default: false },\n ],\n};\n\n/**\n * Project context entity - stores project-specific conventions\n */\nexport const ProjectContextEntity: Entity = {\n name: 'ProjectContext',\n persistence: 'persistent',\n fields: [\n { name: 'id', type: 'string', required: true },\n { name: 'appId', type: 'string', required: true },\n { name: 'userId', type: 'string', required: true },\n { name: 'projectName', type: 'string' },\n { name: 'description', type: 'string' },\n { name: 'existingEntities', type: 'array', items: { name: 'entity', type: 'string' }, default: [] },\n { name: 'conventions', type: 'array', items: { name: 'convention', type: 'string' }, default: [] },\n { name: 'domain', type: 'enum', values: ['business', 'ecommerce', 'cms', 'dashboard', 'workflow'], default: 'business' },\n { name: 'lastUpdatedAt', type: 'timestamp', required: true },\n ],\n};\n\n// ============================================================================\n// Memory Orbital Schema\n// ============================================================================\n\n/**\n * The complete Memory Orbital Schema\n * This defines the structure for storing agent memory\n */\nexport const MemoryOrbitalSchema: OrbitalSchema = {\n name: 'AgentMemory',\n version: '1.0.0',\n description: 'Memory system for KFlow DeepAgent - stores user preferences, generation history, and project context',\n orbitals: [\n {\n name: 'UserPreferenceMemory',\n entity: UserPreferenceEntity,\n traits: [],\n pages: [],\n },\n {\n name: 'GenerationHistoryMemory',\n entity: GenerationSessionEntity,\n traits: [],\n pages: [],\n },\n {\n name: 'ProjectContextMemory',\n entity: ProjectContextEntity,\n traits: [],\n pages: [],\n },\n ],\n};\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type UserPreference = {\n id: string;\n userId: string;\n namingConvention: 'PascalCase' | 'camelCase' | 'snake_case';\n validationStyle: 'strict' | 'minimal' | 'none';\n preferredPatterns: string[];\n commonEntities: string[];\n commonTraits: string[];\n learnedAt: Date;\n confidence: number;\n};\n\nexport type GenerationSession = {\n id: string;\n userId: string;\n threadId: string;\n prompt: string;\n skill: string;\n generatedSchema?: Record<string, unknown>;\n entities: string[];\n patterns: string[];\n validationResult?: { valid: boolean; errors: unknown[] };\n createdAt: Date;\n completedAt?: Date;\n success: boolean;\n};\n\nexport type ProjectContext = {\n id: string;\n appId: string;\n userId: string;\n projectName?: string;\n description?: string;\n existingEntities: string[];\n conventions: string[];\n domain: 'business' | 'ecommerce' | 'cms' | 'dashboard' | 'workflow';\n lastUpdatedAt: Date;\n};\n","/**\n * Memory Manager - GAP-001: Orbital Memory System\n *\n * Manages user memory and preferences using Firestore persistence.\n * Provides the foundation for personalized AI assistance by learning\n * from user interactions and feedback.\n */\n\nimport type {\n UserPreference,\n GenerationSession,\n ProjectContext,\n} from './memory-orbital.js';\nimport type {\n UserFeedback,\n PatternAffinity,\n InterruptRecord,\n ToolApprovalPreference,\n CheckpointRecord,\n} from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Minimal Firestore interface to avoid importing firebase-admin.\n * These match the interfaces defined in firestore-checkpointer.ts\n */\ninterface FirestoreDb {\n collection(path: string): FirestoreCollectionRef;\n batch(): FirestoreBatch;\n}\n\ninterface 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\ninterface FirestoreDocRef {\n set(data: unknown): Promise<unknown>;\n get(): Promise<FirestoreDocSnapshot>;\n update(data: unknown): Promise<unknown>;\n delete(): Promise<unknown>;\n}\n\ninterface FirestoreDocSnapshot {\n exists: boolean;\n data(): Record<string, unknown> | undefined;\n}\n\ninterface 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\ninterface FirestoreQuerySnapshot {\n empty: boolean;\n docs: FirestoreQueryDocSnapshot[];\n size: number;\n}\n\ninterface FirestoreQueryDocSnapshot {\n data(): Record<string, unknown>;\n}\n\ninterface FirestoreBatch {\n set(ref: unknown, data: unknown): void;\n delete(ref: unknown): void;\n commit(): Promise<unknown>;\n}\n\n/**\n * Options for MemoryManager\n */\nexport interface MemoryManagerOptions {\n /**\n * Firestore database instance (injected)\n */\n db: FirestoreDb;\n\n /**\n * Collection name for user preferences\n * @default 'agent_memory_users'\n */\n usersCollection?: string;\n\n /**\n * Collection name for generation sessions\n * @default 'agent_memory_generations'\n */\n generationsCollection?: string;\n\n /**\n * Collection name for project context\n * @default 'agent_memory_projects'\n */\n projectsCollection?: string;\n\n /**\n * Collection name for pattern affinity\n * @default 'agent_memory_patterns'\n */\n patternsCollection?: string;\n\n /**\n * Collection name for user feedback\n * @default 'agent_memory_feedback'\n */\n feedbackCollection?: string;\n\n /**\n * Collection name for interrupt records\n * @default 'agent_memory_interrupts'\n */\n interruptsCollection?: string;\n\n /**\n * Collection name for tool approval preferences\n * @default 'agent_memory_tool_preferences'\n */\n toolPreferencesCollection?: string;\n\n /**\n * Collection name for checkpoint records\n * @default 'agent_memory_checkpoints'\n */\n checkpointsCollection?: string;\n}\n\n// ============================================================================\n// Memory Manager\n// ============================================================================\n\nexport class MemoryManager {\n private db: FirestoreDb;\n private usersCollection: string;\n private generationsCollection: string;\n private projectsCollection: string;\n private patternsCollection: string;\n private feedbackCollection: string;\n private interruptsCollection: string;\n private toolPreferencesCollection: string;\n private checkpointsCollection: string;\n\n constructor(options: MemoryManagerOptions) {\n this.db = options.db;\n this.usersCollection = options.usersCollection ?? 'agent_memory_users';\n this.generationsCollection =\n options.generationsCollection ?? 'agent_memory_generations';\n this.projectsCollection = options.projectsCollection ?? 'agent_memory_projects';\n this.patternsCollection = options.patternsCollection ?? 'agent_memory_patterns';\n this.feedbackCollection = options.feedbackCollection ?? 'agent_memory_feedback';\n this.interruptsCollection = options.interruptsCollection ?? 'agent_memory_interrupts';\n this.toolPreferencesCollection = options.toolPreferencesCollection ?? 'agent_memory_tool_preferences';\n this.checkpointsCollection = options.checkpointsCollection ?? 'agent_memory_checkpoints';\n }\n\n // ============================================================================\n // User Preferences\n // ============================================================================\n\n /**\n * Get user preferences with defaults\n */\n async getUserPreferences(userId: string): Promise<UserPreference | null> {\n const doc = await this.db.collection(this.usersCollection).doc(userId).get();\n if (!doc.exists) return null;\n return this.parsePreference(doc.data() as Record<string, unknown>);\n }\n\n /**\n * Update user preferences\n */\n async updateUserPreferences(\n userId: string,\n preferences: Partial<Omit<UserPreference, 'id' | 'userId' | 'learnedAt'>>,\n ): Promise<void> {\n const existing = await this.getUserPreferences(userId);\n const merged: UserPreference = {\n id: existing?.id ?? `pref_${Date.now()}`,\n userId,\n namingConvention: preferences.namingConvention ?? existing?.namingConvention ?? 'PascalCase',\n validationStyle: preferences.validationStyle ?? existing?.validationStyle ?? 'strict',\n preferredPatterns: [\n ...(existing?.preferredPatterns ?? []),\n ...(preferences.preferredPatterns ?? []),\n ],\n commonEntities: [\n ...(existing?.commonEntities ?? []),\n ...(preferences.commonEntities ?? []),\n ],\n commonTraits: [\n ...(existing?.commonTraits ?? []),\n ...(preferences.commonTraits ?? []),\n ],\n learnedAt: existing?.learnedAt ?? new Date(),\n confidence: preferences.confidence ?? existing?.confidence ?? 0.5,\n };\n await this.db\n .collection(this.usersCollection)\n .doc(userId)\n .set(this.serializePreference(merged));\n }\n\n // ============================================================================\n // Generation Session History\n // ============================================================================\n\n /**\n * Record a new generation session\n */\n async recordGeneration(\n userId: string,\n session: Omit<GenerationSession, 'id' | 'userId' | 'createdAt'>,\n ): Promise<string> {\n const sessionId = `gen_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const fullSession: GenerationSession = {\n id: sessionId,\n userId,\n createdAt: new Date(),\n ...session,\n };\n await this.db\n .collection(this.generationsCollection)\n .doc(sessionId)\n .set(this.serializeSession(fullSession));\n return sessionId;\n }\n\n /**\n * Get a specific generation session\n */\n async getGenerationSession(sessionId: string): Promise<GenerationSession | null> {\n const doc = await this.db.collection(this.generationsCollection).doc(sessionId).get();\n if (!doc.exists) return null;\n return this.parseSession(doc.data() as Record<string, unknown>);\n }\n\n /**\n * Get generation history for a user\n */\n async getUserGenerationHistory(\n userId: string,\n limit: number = 50,\n ): Promise<GenerationSession[]> {\n const snapshot = await this.db\n .collection(this.generationsCollection)\n .where('userId', '==', userId)\n .orderBy('createdAt', 'desc')\n .limit(limit)\n .get();\n return snapshot.docs.map((doc) => this.parseSession(doc.data()));\n }\n\n /**\n * Update generation session status\n */\n async updateGenerationStatus(\n sessionId: string,\n status: GenerationSession['success'],\n validationResult?: GenerationSession['validationResult'],\n ): Promise<void> {\n const doc = await this.db.collection(this.generationsCollection).doc(sessionId).get();\n if (!doc.exists) return;\n\n const data = doc.data() as Record<string, unknown>;\n await this.db\n .collection(this.generationsCollection)\n .doc(sessionId)\n .set({\n ...data,\n success: status,\n completedAt: new Date(),\n ...(validationResult && { validationResult }),\n });\n }\n\n // ============================================================================\n // Project Context\n // ============================================================================\n\n /**\n * Get project context\n */\n async getProjectContext(appId: string): Promise<ProjectContext | null> {\n const doc = await this.db.collection(this.projectsCollection).doc(appId).get();\n if (!doc.exists) return null;\n return this.parseContext(doc.data() as Record<string, unknown>);\n }\n\n /**\n * Update project context with new information\n */\n async updateProjectContext(\n appId: string,\n update: Partial<Omit<ProjectContext, 'id' | 'appId'>>,\n ): Promise<void> {\n const existing = await this.getProjectContext(appId);\n if (!existing) {\n // Create new context if it doesn't exist\n if (!update.userId) {\n throw new Error('userId is required when creating new project context');\n }\n const newContext: ProjectContext = {\n id: `ctx_${Date.now()}`,\n appId,\n userId: update.userId,\n existingEntities: update.existingEntities ?? [],\n conventions: update.conventions ?? [],\n domain: update.domain ?? 'business',\n lastUpdatedAt: new Date(),\n ...(update.projectName && { projectName: update.projectName }),\n ...(update.description && { description: update.description }),\n };\n await this.db\n .collection(this.projectsCollection)\n .doc(appId)\n .set(this.serializeContext(newContext));\n return;\n }\n\n const merged: ProjectContext = {\n ...existing,\n existingEntities: [\n ...existing.existingEntities,\n ...(update.existingEntities ?? []),\n ],\n conventions: [\n ...existing.conventions,\n ...(update.conventions ?? []),\n ],\n lastUpdatedAt: new Date(),\n ...(update.projectName && { projectName: update.projectName }),\n ...(update.description && { description: update.description }),\n ...(update.domain && { domain: update.domain }),\n };\n await this.db\n .collection(this.projectsCollection)\n .doc(appId)\n .set(this.serializeContext(merged));\n }\n\n // ============================================================================\n // Pattern Affinity\n // ============================================================================\n\n /**\n * Update pattern affinity based on usage\n */\n async updatePatternAffinity(\n userId: string,\n patternId: string,\n outcome: 'success' | 'failure' | 'partial',\n context?: { entityType?: string; useCase?: string },\n ): Promise<void> {\n const affinityId = `${userId}_${patternId}`;\n const existing = await this.db\n .collection(this.patternsCollection)\n .doc(affinityId)\n .get();\n\n if (!existing.exists) {\n const affinity: PatternAffinity = {\n userId,\n patternId,\n usageCount: 1,\n successCount: outcome === 'success' ? 1 : 0,\n failureCount: outcome === 'failure' ? 1 : 0,\n contexts: context ? [context] : [],\n lastUsedAt: new Date(),\n createdAt: new Date(),\n };\n await this.db\n .collection(this.patternsCollection)\n .doc(affinityId)\n .set(affinity as unknown as Record<string, unknown>);\n } else {\n const data = existing.data() as unknown as PatternAffinity;\n const affinity: PatternAffinity = {\n ...data,\n usageCount: data.usageCount + 1,\n successCount: data.successCount + (outcome === 'success' ? 1 : 0),\n failureCount: data.failureCount + (outcome === 'failure' ? 1 : 0),\n contexts: context ? [...(data.contexts ?? []), context] : data.contexts,\n lastUsedAt: new Date(),\n };\n await this.db\n .collection(this.patternsCollection)\n .doc(affinityId)\n .set(affinity as unknown as Record<string, unknown>);\n }\n }\n\n /**\n * Get pattern affinity for a user\n */\n async getPatternAffinity(userId: string, patternId: string): Promise<PatternAffinity | null> {\n const affinityId = `${userId}_${patternId}`;\n const doc = await this.db.collection(this.patternsCollection).doc(affinityId).get();\n if (!doc.exists) return null;\n return doc.data() as unknown as PatternAffinity;\n }\n\n /**\n * Get all patterns used by a user\n */\n async getUserPatterns(userId: string): Promise<PatternAffinity[]> {\n const snapshot = await this.db\n .collection(this.patternsCollection)\n .where('userId', '==', userId)\n .orderBy('usageCount', 'desc')\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as PatternAffinity);\n }\n\n // ============================================================================\n // User Feedback\n // ============================================================================\n\n /**\n * Record user feedback on a generation\n */\n async recordFeedback(\n sessionId: string,\n feedback: Omit<UserFeedback, 'feedbackId' | 'sessionId' | 'timestamp'>,\n ): Promise<void> {\n const feedbackId = `fb_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const fullFeedback: UserFeedback = {\n feedbackId,\n sessionId,\n ...feedback,\n timestamp: new Date(),\n };\n await this.db\n .collection(this.feedbackCollection)\n .doc(feedbackId)\n .set(fullFeedback as unknown as Record<string, unknown>);\n }\n\n /**\n * Get feedback for a session\n */\n async getSessionFeedback(sessionId: string): Promise<UserFeedback[]> {\n const snapshot = await this.db\n .collection(this.feedbackCollection)\n .where('sessionId', '==', sessionId)\n .orderBy('timestamp', 'desc')\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as UserFeedback);\n }\n\n // ============================================================================\n // Serialization Helpers\n // ============================================================================\n\n private parsePreference(data: Record<string, unknown>): UserPreference {\n const timestampToDate = (ts: unknown): Date => {\n if (ts instanceof Date) return ts;\n if (typeof ts === 'object' && ts !== null && 'toDate' in ts) {\n return (ts as { toDate(): Date }).toDate();\n }\n return new Date(ts as string | number);\n };\n\n return {\n id: data.id as string,\n userId: data.userId as string,\n namingConvention: data.namingConvention as 'PascalCase' | 'camelCase' | 'snake_case',\n validationStyle: data.validationStyle as 'strict' | 'minimal' | 'none',\n preferredPatterns: (data.preferredPatterns as string[]) ?? [],\n commonEntities: (data.commonEntities as string[]) ?? [],\n commonTraits: (data.commonTraits as string[]) ?? [],\n learnedAt: timestampToDate(data.learnedAt),\n confidence: (data.confidence as number) ?? 0.5,\n };\n }\n\n private serializePreference(pref: UserPreference): Record<string, unknown> {\n return { ...pref };\n }\n\n private parseSession(data: Record<string, unknown>): GenerationSession {\n const timestampToDate = (ts: unknown): Date => {\n if (ts instanceof Date) return ts;\n if (typeof ts === 'object' && ts !== null && 'toDate' in ts) {\n return (ts as { toDate(): Date }).toDate();\n }\n return new Date(ts as string | number);\n };\n\n return {\n id: data.id as string,\n userId: data.userId as string,\n threadId: data.threadId as string,\n prompt: data.prompt as string,\n skill: data.skill as string,\n generatedSchema: data.generatedSchema as Record<string, unknown> | undefined,\n entities: (data.entities as string[]) ?? [],\n patterns: (data.patterns as string[]) ?? [],\n validationResult: data.validationResult as { valid: boolean; errors: unknown[] } | undefined,\n createdAt: timestampToDate(data.createdAt),\n completedAt: data.completedAt ? timestampToDate(data.completedAt) : undefined,\n success: data.success as boolean,\n };\n }\n\n private serializeSession(session: GenerationSession): Record<string, unknown> {\n return { ...session };\n }\n\n private parseContext(data: Record<string, unknown>): ProjectContext {\n const timestampToDate = (ts: unknown): Date => {\n if (ts instanceof Date) return ts;\n if (typeof ts === 'object' && ts !== null && 'toDate' in ts) {\n return (ts as { toDate(): Date }).toDate();\n }\n return new Date(ts as string | number);\n };\n\n return {\n id: data.id as string,\n appId: data.appId as string,\n userId: data.userId as string,\n projectName: data.projectName as string | undefined,\n description: data.description as string | undefined,\n existingEntities: (data.existingEntities as string[]) ?? [],\n conventions: (data.conventions as string[]) ?? [],\n domain: data.domain as 'business' | 'ecommerce' | 'cms' | 'dashboard' | 'workflow',\n lastUpdatedAt: timestampToDate(data.lastUpdatedAt),\n };\n }\n\n private serializeContext(context: ProjectContext): Record<string, unknown> {\n return { ...context };\n }\n\n // ============================================================================\n // Interrupt Tracking (GAP-003: Interrupt Memory)\n // ============================================================================\n\n /**\n * Record an interrupt decision for learning\n */\n async recordInterruptDecision(\n sessionId: string,\n userId: string,\n interruptData: {\n toolName: string;\n toolArgs: Record<string, unknown>;\n decision: 'approved' | 'rejected' | 'modified';\n modifiedArgs?: Record<string, unknown>;\n reason?: string;\n },\n ): Promise<void> {\n const interruptId = `int_${Date.now()}_${Math.random().toString(36).slice(2)}`;\n const record: InterruptRecord = {\n interruptId,\n sessionId,\n userId,\n toolName: interruptData.toolName,\n toolArgs: interruptData.toolArgs,\n decision: interruptData.decision,\n modifiedArgs: interruptData.modifiedArgs,\n reason: interruptData.reason,\n timestamp: new Date(),\n };\n\n await this.db\n .collection(this.interruptsCollection)\n .doc(interruptId)\n .set(record as unknown as Record<string, unknown>);\n\n // Update tool approval preferences\n await this.updateToolApprovalPreference(userId, interruptData.toolName, interruptData.decision);\n }\n\n /**\n * Get interrupt history for a session\n */\n async getSessionInterrupts(sessionId: string): Promise<InterruptRecord[]> {\n const snapshot = await this.db\n .collection(this.interruptsCollection)\n .where('sessionId', '==', sessionId)\n .orderBy('timestamp', 'desc')\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as InterruptRecord);\n }\n\n /**\n * Get interrupt history for a user\n */\n async getUserInterrupts(userId: string, limit: number = 50): Promise<InterruptRecord[]> {\n const snapshot = await this.db\n .collection(this.interruptsCollection)\n .where('userId', '==', userId)\n .orderBy('timestamp', 'desc')\n .limit(limit)\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as InterruptRecord);\n }\n\n /**\n * Get tool approval preference for a user\n */\n async getToolApprovalPreference(userId: string, toolName: string): Promise<ToolApprovalPreference | null> {\n const prefId = `${userId}_${toolName}`;\n const doc = await this.db.collection(this.toolPreferencesCollection).doc(prefId).get();\n if (!doc.exists) return null;\n return doc.data() as unknown as ToolApprovalPreference;\n }\n\n /**\n * Update tool approval preference based on interrupt decisions\n */\n private async updateToolApprovalPreference(\n userId: string,\n toolName: string,\n decision: 'approved' | 'rejected' | 'modified',\n ): Promise<void> {\n const prefId = `${userId}_${toolName}`;\n const existing = await this.db.collection(this.toolPreferencesCollection).doc(prefId).get();\n\n if (!existing.exists) {\n const pref: ToolApprovalPreference = {\n userId,\n toolName,\n autoApprove: decision === 'approved',\n confidence: decision === 'approved' ? 0.5 : 0,\n approvedCount: decision === 'approved' ? 1 : 0,\n rejectedCount: decision === 'rejected' ? 1 : 0,\n lastDecisionAt: new Date(),\n };\n await this.db\n .collection(this.toolPreferencesCollection)\n .doc(prefId)\n .set(pref as unknown as Record<string, unknown>);\n } else {\n const data = existing.data() as unknown as ToolApprovalPreference;\n const approvedCount = data.approvedCount + (decision === 'approved' ? 1 : 0);\n const rejectedCount = data.rejectedCount + (decision === 'rejected' ? 1 : 0);\n const total = approvedCount + rejectedCount;\n const approvalRate = approvedCount / total;\n\n const pref: ToolApprovalPreference = {\n ...data,\n approvedCount,\n rejectedCount,\n // Auto-approve if approval rate > 80% and at least 5 decisions\n autoApprove: total >= 5 && approvalRate > 0.8,\n confidence: Math.min(0.95, total * 0.1),\n lastDecisionAt: new Date(),\n };\n await this.db\n .collection(this.toolPreferencesCollection)\n .doc(prefId)\n .set(pref as unknown as Record<string, unknown>);\n }\n }\n\n /**\n * Get all tool approval preferences for a user\n */\n async getUserToolPreferences(userId: string): Promise<ToolApprovalPreference[]> {\n const snapshot = await this.db\n .collection(this.toolPreferencesCollection)\n .where('userId', '==', userId)\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as ToolApprovalPreference);\n }\n\n /**\n * Check if a tool should be auto-approved for a user\n */\n async shouldAutoApproveTool(userId: string, toolName: string): Promise<boolean> {\n const pref = await this.getToolApprovalPreference(userId, toolName);\n return pref?.autoApprove ?? false;\n }\n\n // ============================================================================\n // Checkpoint Tracking (GAP-004: Checkpoint → Memory)\n // ============================================================================\n\n /**\n * Record a checkpoint for learning\n */\n async recordCheckpoint(\n userId: string,\n checkpointData: {\n checkpointId: string;\n threadId: string;\n parentCheckpointId?: string;\n metadata?: Record<string, unknown>;\n },\n ): Promise<void> {\n const record: CheckpointRecord = {\n checkpointId: checkpointData.checkpointId,\n threadId: checkpointData.threadId,\n userId,\n parentCheckpointId: checkpointData.parentCheckpointId,\n metadata: checkpointData.metadata ?? {},\n createdAt: new Date(),\n rollbackCount: 0,\n wasSuccessful: false,\n };\n\n const docId = `${userId}_${checkpointData.checkpointId}`;\n await this.db\n .collection(this.checkpointsCollection)\n .doc(docId)\n .set(record as unknown as Record<string, unknown>);\n }\n\n /**\n * Record a rollback to a checkpoint\n */\n async recordRollback(\n userId: string,\n checkpointId: string,\n reason?: string,\n ): Promise<void> {\n const docId = `${userId}_${checkpointId}`;\n const doc = await this.db.collection(this.checkpointsCollection).doc(docId).get();\n\n if (doc.exists) {\n const data = doc.data() as unknown as CheckpointRecord;\n await this.db\n .collection(this.checkpointsCollection)\n .doc(docId)\n .set({\n ...data,\n rollbackCount: data.rollbackCount + 1,\n lastRollbackReason: reason,\n lastRollbackAt: new Date(),\n } as unknown as Record<string, unknown>);\n }\n }\n\n /**\n * Mark a checkpoint as successful (terminal state)\n */\n async markCheckpointSuccessful(\n userId: string,\n checkpointId: string,\n ): Promise<void> {\n const docId = `${userId}_${checkpointId}`;\n const doc = await this.db.collection(this.checkpointsCollection).doc(docId).get();\n\n if (doc.exists) {\n const data = doc.data() as unknown as CheckpointRecord;\n await this.db\n .collection(this.checkpointsCollection)\n .doc(docId)\n .set({\n ...data,\n wasSuccessful: true,\n } as unknown as Record<string, unknown>);\n }\n }\n\n /**\n * Get checkpoint history for a user\n */\n async getUserCheckpoints(\n userId: string,\n limit: number = 50,\n ): Promise<CheckpointRecord[]> {\n const snapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('userId', '==', userId)\n .orderBy('createdAt', 'desc')\n .limit(limit)\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as CheckpointRecord);\n }\n\n /**\n * Get checkpoints for a thread\n */\n async getThreadCheckpoints(threadId: string): Promise<CheckpointRecord[]> {\n const snapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('threadId', '==', threadId)\n .orderBy('createdAt', 'desc')\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as CheckpointRecord);\n }\n\n /**\n * Get frequently rolled-back checkpoints (problem areas)\n */\n async getProblemCheckpoints(\n userId: string,\n minRollbackCount: number = 2,\n ): Promise<CheckpointRecord[]> {\n const snapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('userId', '==', userId)\n .where('rollbackCount', '>=', minRollbackCount)\n .orderBy('rollbackCount', 'desc')\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as CheckpointRecord);\n }\n\n /**\n * Get successful checkpoint patterns for learning\n */\n async getSuccessfulCheckpoints(\n userId: string,\n limit: number = 20,\n ): Promise<CheckpointRecord[]> {\n const snapshot = await this.db\n .collection(this.checkpointsCollection)\n .where('userId', '==', userId)\n .where('wasSuccessful', '==', true)\n .orderBy('createdAt', 'desc')\n .limit(limit)\n .get();\n return snapshot.docs.map((doc) => doc.data() as unknown as CheckpointRecord);\n }\n}\n","/**\n * Observability - GAP-008\n *\n * Comprehensive observability layer for DeepAgent including:\n * - Event tracking\n * - Session metrics\n * - Performance monitoring\n * - Health checks\n *\n * @packageDocumentation\n */\n\nimport type { GenerationMetrics, MetricsSummary } from './metrics.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Observable event types\n */\nexport type ObservableEventType =\n | 'session_start'\n | 'session_end'\n | 'tool_call'\n | 'tool_result'\n | 'interrupt'\n | 'checkpoint_save'\n | 'checkpoint_restore'\n | 'error'\n | 'llm_call'\n | 'memory_sync';\n\n/**\n * Observable event\n */\nexport interface ObservableEvent {\n /** Event type */\n type: ObservableEventType;\n /** Timestamp */\n timestamp: number;\n /** Session/thread ID */\n sessionId: string;\n /** User ID */\n userId?: string;\n /** Event payload */\n payload: Record<string, unknown>;\n /** Duration in ms (if applicable) */\n duration?: number;\n /** Error information */\n error?: {\n message: string;\n code?: string;\n stack?: string;\n };\n}\n\n/**\n * Session telemetry\n */\nexport interface SessionTelemetry {\n /** Session ID */\n sessionId: string;\n /** User ID */\n userId?: string;\n /** Session start time */\n startedAt: number;\n /** Session end time */\n endedAt?: number;\n /** Number of tool calls */\n toolCallCount: number;\n /** Number of LLM calls */\n llmCallCount: number;\n /** Number of interrupts */\n interruptCount: number;\n /** Number of checkpoints */\n checkpointCount: number;\n /** Total tokens used */\n totalTokens: number;\n /** Errors encountered */\n errors: Array<{\n timestamp: number;\n message: string;\n type: string;\n }>;\n /** Final status */\n status: 'running' | 'completed' | 'failed' | 'interrupted';\n}\n\n/**\n * Performance snapshot\n */\nexport interface PerformanceSnapshot {\n /** Timestamp */\n timestamp: number;\n /** Active sessions */\n activeSessions: number;\n /** Total sessions (all time) */\n totalSessions: number;\n /** Average session duration */\n avgSessionDuration: number;\n /** Success rate (last 24h) */\n successRate24h: number;\n /** Error rate (last 24h) */\n errorRate24h: number;\n /** Average tokens per session */\n avgTokensPerSession: number;\n}\n\n/**\n * Health check result\n */\nexport interface HealthCheckResult {\n /** Component name */\n component: string;\n /** Health status */\n status: 'healthy' | 'degraded' | 'unhealthy';\n /** Response time in ms */\n responseTime: number;\n /** Last checked timestamp */\n checkedAt: number;\n /** Error message if unhealthy */\n error?: string;\n}\n\n// ============================================================================\n// Observability Collector\n// ============================================================================\n\nexport class ObservabilityCollector {\n private events: ObservableEvent[] = [];\n private sessions: Map<string, SessionTelemetry> = new Map();\n private maxEvents: number;\n\n constructor(options: { maxEvents?: number } = {}) {\n this.maxEvents = options.maxEvents ?? 10000;\n }\n\n /**\n * Record an observable event\n */\n recordEvent(event: Omit<ObservableEvent, 'timestamp'>): void {\n const fullEvent: ObservableEvent = {\n ...event,\n timestamp: Date.now(),\n };\n\n this.events.push(fullEvent);\n\n // Maintain max size\n if (this.events.length > this.maxEvents) {\n this.events = this.events.slice(-this.maxEvents);\n }\n\n // Update session telemetry\n this.updateSessionTelemetry(fullEvent);\n }\n\n /**\n * Start session tracking\n */\n startSession(sessionId: string, userId?: string): void {\n this.sessions.set(sessionId, {\n sessionId,\n userId,\n startedAt: Date.now(),\n toolCallCount: 0,\n llmCallCount: 0,\n interruptCount: 0,\n checkpointCount: 0,\n totalTokens: 0,\n errors: [],\n status: 'running',\n });\n\n this.recordEvent({\n type: 'session_start',\n sessionId,\n userId,\n payload: { startedAt: Date.now() },\n });\n }\n\n /**\n * End session tracking\n */\n endSession(sessionId: string, status: SessionTelemetry['status'] = 'completed'): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.endedAt = Date.now();\n session.status = status;\n\n this.recordEvent({\n type: 'session_end',\n sessionId,\n userId: session.userId,\n payload: {\n status,\n duration: session.endedAt - session.startedAt,\n toolCalls: session.toolCallCount,\n llmCalls: session.llmCallCount,\n },\n duration: session.endedAt - session.startedAt,\n });\n }\n }\n\n /**\n * Record tool call\n */\n recordToolCall(\n sessionId: string,\n toolName: string,\n args: Record<string, unknown>,\n duration?: number,\n ): void {\n this.recordEvent({\n type: 'tool_call',\n sessionId,\n payload: { tool: toolName, args },\n duration,\n });\n\n const session = this.sessions.get(sessionId);\n if (session) {\n session.toolCallCount++;\n }\n }\n\n /**\n * Record LLM call\n */\n recordLLMCall(\n sessionId: string,\n model: string,\n tokens: { input: number; output: number },\n duration?: number,\n ): void {\n this.recordEvent({\n type: 'llm_call',\n sessionId,\n payload: { model, tokens },\n duration,\n });\n\n const session = this.sessions.get(sessionId);\n if (session) {\n session.llmCallCount++;\n session.totalTokens += tokens.input + tokens.output;\n }\n }\n\n /**\n * Record error\n */\n recordError(\n sessionId: string,\n error: Error,\n context?: Record<string, unknown>,\n ): void {\n this.recordEvent({\n type: 'error',\n sessionId,\n payload: { ...context, message: error.message },\n error: {\n message: error.message,\n code: (error as { code?: string }).code,\n stack: error.stack,\n },\n });\n\n const session = this.sessions.get(sessionId);\n if (session) {\n session.errors.push({\n timestamp: Date.now(),\n message: error.message,\n type: error.constructor.name,\n });\n }\n }\n\n /**\n * Get events by type\n */\n getEvents(type?: ObservableEventType, sessionId?: string): ObservableEvent[] {\n let filtered = this.events;\n\n if (type) {\n filtered = filtered.filter(e => e.type === type);\n }\n\n if (sessionId) {\n filtered = filtered.filter(e => e.sessionId === sessionId);\n }\n\n return filtered;\n }\n\n /**\n * Get session telemetry\n */\n getSessionTelemetry(sessionId: string): SessionTelemetry | undefined {\n return this.sessions.get(sessionId);\n }\n\n /**\n * Get all active sessions\n */\n getActiveSessions(): SessionTelemetry[] {\n return Array.from(this.sessions.values()).filter(s => s.status === 'running');\n }\n\n /**\n * Get performance snapshot\n */\n getPerformanceSnapshot(): PerformanceSnapshot {\n const now = Date.now();\n const sessions = Array.from(this.sessions.values());\n const activeSessions = sessions.filter(s => s.status === 'running');\n\n // Last 24h stats\n const last24h = sessions.filter(s => s.startedAt > now - 24 * 60 * 60 * 1000);\n const completed24h = last24h.filter(s => s.status === 'completed');\n const failed24h = last24h.filter(s => s.status === 'failed');\n\n const successRate24h = last24h.length > 0\n ? (completed24h.length / last24h.length) * 100\n : 0;\n\n const errorRate24h = last24h.length > 0\n ? (failed24h.length / last24h.length) * 100\n : 0;\n\n // Average session duration\n const completedSessions = sessions.filter(s => s.endedAt);\n const avgSessionDuration = completedSessions.length > 0\n ? completedSessions.reduce((sum, s) => sum + ((s.endedAt || now) - s.startedAt), 0) / completedSessions.length\n : 0;\n\n // Average tokens\n const sessionsWithTokens = sessions.filter(s => s.totalTokens > 0);\n const avgTokensPerSession = sessionsWithTokens.length > 0\n ? sessionsWithTokens.reduce((sum, s) => sum + s.totalTokens, 0) / sessionsWithTokens.length\n : 0;\n\n return {\n timestamp: now,\n activeSessions: activeSessions.length,\n totalSessions: sessions.length,\n avgSessionDuration,\n successRate24h,\n errorRate24h,\n avgTokensPerSession,\n };\n }\n\n /**\n * Perform health check\n */\n async healthCheck(): Promise<HealthCheckResult[]> {\n const checks: HealthCheckResult[] = [];\n const now = Date.now();\n\n // Check event buffer\n checks.push({\n component: 'event_buffer',\n status: this.events.length < this.maxEvents * 0.9 ? 'healthy' : 'degraded',\n responseTime: 0,\n checkedAt: now,\n });\n\n // Check sessions\n const activeSessions = this.getActiveSessions();\n const staleSessions = activeSessions.filter(\n s => now - s.startedAt > 30 * 60 * 1000 // 30 minutes\n );\n\n checks.push({\n component: 'sessions',\n status: staleSessions.length < 10 ? 'healthy' : 'degraded',\n responseTime: 0,\n checkedAt: now,\n error: staleSessions.length > 0 ? `${staleSessions.length} stale sessions` : undefined,\n });\n\n return checks;\n }\n\n /**\n * Export metrics for external systems\n */\n exportMetrics(): {\n events: ObservableEvent[];\n sessions: SessionTelemetry[];\n snapshot: PerformanceSnapshot;\n health: HealthCheckResult[];\n } {\n return {\n events: this.events.slice(-1000), // Last 1000 events\n sessions: Array.from(this.sessions.values()),\n snapshot: this.getPerformanceSnapshot(),\n health: [], // Populated by healthCheck\n };\n }\n\n /**\n * Clear all data\n */\n clear(): void {\n this.events = [];\n this.sessions.clear();\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private updateSessionTelemetry(event: ObservableEvent): void {\n const session = this.sessions.get(event.sessionId);\n if (!session) return;\n\n switch (event.type) {\n case 'interrupt':\n session.interruptCount++;\n break;\n case 'checkpoint_save':\n session.checkpointCount++;\n break;\n case 'memory_sync':\n // Track memory sync events\n break;\n }\n }\n}\n\n// ============================================================================\n// Global Instance\n// ============================================================================\n\nlet globalCollector: ObservabilityCollector | null = null;\n\n/**\n * Get or create global observability collector\n */\nexport function getObservabilityCollector(): ObservabilityCollector {\n if (!globalCollector) {\n globalCollector = new ObservabilityCollector();\n }\n return globalCollector;\n}\n\n/**\n * Reset global observability collector\n */\nexport function resetObservabilityCollector(): void {\n globalCollector = null;\n}\n\n// ============================================================================\n// Convenience Functions\n// ============================================================================\n\n/**\n * Record event to global collector\n */\nexport function recordEvent(event: Omit<ObservableEvent, 'timestamp'>): void {\n getObservabilityCollector().recordEvent(event);\n}\n\n/**\n * Start session in global collector\n */\nexport function startObservabilitySession(sessionId: string, userId?: string): void {\n getObservabilityCollector().startSession(sessionId, userId);\n}\n\n/**\n * End session in global collector\n */\nexport function endObservabilitySession(sessionId: string, status?: SessionTelemetry['status']): void {\n getObservabilityCollector().endSession(sessionId, status);\n}\n\n/**\n * Get performance snapshot from global collector\n */\nexport function getPerformanceSnapshot(): PerformanceSnapshot {\n return getObservabilityCollector().getPerformanceSnapshot();\n}\n","/**\n * Multi-User Support - GAP-009\n *\n * Provides proper user isolation and session scoping for multi-user environments.\n * Ensures users can only access their own sessions, memory, and data.\n *\n * @packageDocumentation\n */\n\nimport type { SessionMetadata } from './persistence/types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * User context for multi-user operations\n */\nexport interface UserContext {\n /** User ID */\n userId: string;\n /** Organization/tenant ID (for multi-tenant) */\n orgId?: string;\n /** User roles/permissions */\n roles?: string[];\n /** Session ID scope (optional) */\n sessionScope?: string[];\n}\n\n/**\n * Scoped session metadata with user ownership\n */\nexport interface ScopedSessionMetadata extends SessionMetadata {\n /** Owning user ID */\n userId: string;\n /** Organization ID */\n orgId?: string;\n /** Created by (for audit) */\n createdBy: string;\n /** Last accessed by */\n lastAccessedBy?: string;\n /** Access control list */\n acl?: {\n /** Users who can read this session */\n readers?: string[];\n /** Users who can write/modify */\n writers?: string[];\n /** Publicly accessible */\n isPublic?: boolean;\n };\n}\n\n/**\n * Access check result\n */\nexport interface AccessCheckResult {\n /** Whether access is granted */\n allowed: boolean;\n /** Reason if denied */\n reason?: string;\n /** Required permission level */\n requiredRole?: string;\n}\n\n/**\n * User session stats\n */\nexport interface UserSessionStats {\n /** User ID */\n userId: string;\n /** Total sessions */\n totalSessions: number;\n /** Active sessions */\n activeSessions: number;\n /** Completed sessions */\n completedSessions: number;\n /** Sessions by skill */\n sessionsBySkill: Record<string, number>;\n /** Last activity timestamp */\n lastActivityAt?: number;\n}\n\n// ============================================================================\n// Multi-User Manager\n// ============================================================================\n\nexport class MultiUserManager {\n private sessionOwnership: Map<string, string> = new Map(); // threadId -> userId\n private userSessions: Map<string, Set<string>> = new Map(); // userId -> Set<threadId>\n\n /**\n * Check if a user owns a session\n */\n isSessionOwner(threadId: string, userId: string): boolean {\n const owner = this.sessionOwnership.get(threadId);\n return owner === userId;\n }\n\n /**\n * Check if a user can access a session\n */\n canAccessSession(threadId: string, userContext: UserContext): AccessCheckResult {\n const owner = this.sessionOwnership.get(threadId);\n\n // Session not found - allow creation\n if (!owner) {\n return { allowed: true };\n }\n\n // User is owner\n if (owner === userContext.userId) {\n return { allowed: true };\n }\n\n // Check admin role\n if (userContext.roles?.includes('admin')) {\n return { allowed: true };\n }\n\n // Check scoped sessions\n if (userContext.sessionScope?.includes(threadId)) {\n return { allowed: true };\n }\n\n return {\n allowed: false,\n reason: 'Session does not belong to user',\n requiredRole: 'owner or admin',\n };\n }\n\n /**\n * Assign session ownership\n */\n assignSessionOwnership(threadId: string, userId: string): void {\n // Remove from previous owner if exists\n const previousOwner = this.sessionOwnership.get(threadId);\n if (previousOwner) {\n const previousSessions = this.userSessions.get(previousOwner);\n if (previousSessions) {\n previousSessions.delete(threadId);\n }\n }\n\n // Assign to new owner\n this.sessionOwnership.set(threadId, userId);\n\n // Add to user's sessions\n if (!this.userSessions.has(userId)) {\n this.userSessions.set(userId, new Set());\n }\n this.userSessions.get(userId)!.add(threadId);\n }\n\n /**\n * Get all sessions for a user\n */\n getUserSessions(userId: string): string[] {\n const sessions = this.userSessions.get(userId);\n return sessions ? Array.from(sessions) : [];\n }\n\n /**\n * Get session owner\n */\n getSessionOwner(threadId: string): string | undefined {\n return this.sessionOwnership.get(threadId);\n }\n\n /**\n * Remove session ownership\n */\n removeSession(threadId: string): void {\n const owner = this.sessionOwnership.get(threadId);\n if (owner) {\n const sessions = this.userSessions.get(owner);\n if (sessions) {\n sessions.delete(threadId);\n }\n }\n this.sessionOwnership.delete(threadId);\n }\n\n /**\n * Check if user has any sessions\n */\n hasSessions(userId: string): boolean {\n const sessions = this.userSessions.get(userId);\n return sessions ? sessions.size > 0 : false;\n }\n\n /**\n * Get user session count\n */\n getSessionCount(userId: string): number {\n const sessions = this.userSessions.get(userId);\n return sessions ? sessions.size : 0;\n }\n\n /**\n * Transfer session ownership\n */\n transferOwnership(threadId: string, fromUserId: string, toUserId: string): AccessCheckResult {\n const owner = this.sessionOwnership.get(threadId);\n\n if (owner !== fromUserId) {\n return {\n allowed: false,\n reason: 'Only the owner can transfer session ownership',\n };\n }\n\n this.assignSessionOwnership(threadId, toUserId);\n\n return { allowed: true };\n }\n\n /**\n * Share session with another user\n */\n shareSession(\n threadId: string,\n ownerId: string,\n targetUserId: string,\n permission: 'read' | 'write' = 'read',\n ): AccessCheckResult {\n const owner = this.sessionOwnership.get(threadId);\n\n if (owner !== ownerId) {\n return {\n allowed: false,\n reason: 'Only the owner can share a session',\n };\n }\n\n // Add target user to scoped sessions\n // This would typically update the session ACL in Firestore\n // For now, we just track it in memory\n\n return { allowed: true };\n }\n\n /**\n * Get all user IDs with sessions\n */\n getAllUsers(): string[] {\n return Array.from(this.userSessions.keys());\n }\n\n /**\n * Clear all data (for testing)\n */\n clear(): void {\n this.sessionOwnership.clear();\n this.userSessions.clear();\n }\n\n /**\n * Create scoped session metadata\n */\n createScopedMetadata(\n metadata: SessionMetadata,\n userContext: UserContext,\n ): ScopedSessionMetadata {\n return {\n ...metadata,\n userId: userContext.userId,\n orgId: userContext.orgId,\n createdBy: userContext.userId,\n lastAccessedBy: userContext.userId,\n acl: {\n readers: [userContext.userId],\n writers: [userContext.userId],\n isPublic: false,\n },\n };\n }\n\n /**\n * Validate user context\n */\n validateUserContext(userContext: unknown): userContext is UserContext {\n if (!userContext || typeof userContext !== 'object') {\n return false;\n }\n\n const ctx = userContext as Record<string, unknown>;\n\n if (!ctx.userId || typeof ctx.userId !== 'string') {\n return false;\n }\n\n if (ctx.orgId !== undefined && typeof ctx.orgId !== 'string') {\n return false;\n }\n\n if (ctx.roles !== undefined && !Array.isArray(ctx.roles)) {\n return false;\n }\n\n return true;\n }\n}\n\n// ============================================================================\n// Global Instance\n// ============================================================================\n\nlet globalMultiUserManager: MultiUserManager | null = null;\n\n/**\n * Get or create global multi-user manager\n */\nexport function getMultiUserManager(): MultiUserManager {\n if (!globalMultiUserManager) {\n globalMultiUserManager = new MultiUserManager();\n }\n return globalMultiUserManager;\n}\n\n/**\n * Reset global multi-user manager\n */\nexport function resetMultiUserManager(): void {\n globalMultiUserManager = null;\n}\n\n// ============================================================================\n// Middleware Helpers\n// ============================================================================\n\n/**\n * Create user context from request\n */\nexport function createUserContext(\n userId: string,\n options: {\n orgId?: string;\n roles?: string[];\n } = {},\n): UserContext {\n return {\n userId,\n orgId: options.orgId,\n roles: options.roles ?? ['user'],\n };\n}\n\n/**\n * Check if user is admin\n */\nexport function isAdmin(userContext: UserContext): boolean {\n return userContext.roles?.includes('admin') ?? false;\n}\n\n/**\n * Require ownership or throw\n */\nexport function requireOwnership(\n threadId: string,\n userContext: UserContext,\n manager: MultiUserManager = getMultiUserManager(),\n): void {\n const check = manager.canAccessSession(threadId, userContext);\n if (!check.allowed) {\n throw new Error(`Access denied: ${check.reason}`);\n }\n}\n","/**\n * State Synchronization Support - GAP-010\n *\n * Provides agent-side support for real-time state synchronization.\n * The actual transport (WebSocket/SSE) is handled by @almadar/server.\n *\n * This module provides:\n * - State change notifications\n * - Conflict resolution utilities\n * - State serialization for sync\n * - Event emitters for server integration\n *\n * @packageDocumentation\n */\n\nimport { EventEmitter } from 'events';\nimport type { Checkpoint } from '@langchain/langgraph-checkpoint';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * State change event types\n */\nexport type StateChangeType =\n | 'checkpoint_created'\n | 'checkpoint_updated'\n | 'session_started'\n | 'session_ended'\n | 'tool_executed'\n | 'memory_updated'\n | 'interrupt_triggered'\n | 'interrupt_resolved';\n\n/**\n * State change event\n */\nexport interface StateChangeEvent {\n /** Change type */\n type: StateChangeType;\n /** Thread/session ID */\n threadId: string;\n /** User ID */\n userId?: string;\n /** Timestamp */\n timestamp: number;\n /** Change payload */\n payload: Record<string, unknown>;\n /** Version vector for conflict resolution */\n version: VersionVector;\n /** Source client ID */\n sourceClientId?: string;\n}\n\n/**\n * Version vector for conflict resolution\n */\nexport interface VersionVector {\n /** Logical timestamp */\n timestamp: number;\n /** Sequence number */\n sequence: number;\n /** Node/client ID */\n nodeId: string;\n}\n\n/**\n * Sync state snapshot\n */\nexport interface StateSyncSnapshot {\n /** Thread ID */\n threadId: string;\n /** Current checkpoint */\n checkpoint?: Checkpoint;\n /** Session metadata */\n sessionMetadata?: Record<string, unknown>;\n /** Memory state */\n memoryState?: Record<string, unknown>;\n /** Version vector */\n version: VersionVector;\n /** Last updated */\n lastUpdated: number;\n}\n\n/**\n * Conflict resolution result\n */\nexport interface ConflictResolution {\n /** Whether conflict was resolved */\n resolved: boolean;\n /** Winning state if resolved */\n winningState?: StateSyncSnapshot;\n /** Conflicting changes if not resolved */\n conflicts?: Array<{\n clientA: StateChangeEvent;\n clientB: StateChangeEvent;\n }>;\n /** Resolution strategy used */\n strategy: 'last_write_wins' | 'merge' | 'manual';\n}\n\n/**\n * Sync configuration\n */\nexport interface StateSyncConfig {\n /** Enable sync */\n enabled: boolean;\n /** Conflict resolution strategy */\n conflictStrategy: 'last_write_wins' | 'merge' | 'manual';\n /** Throttle interval (ms) */\n throttleInterval: number;\n /** Max retry attempts */\n maxRetries: number;\n /** Client ID */\n clientId: string;\n}\n\n// ============================================================================\n// State Sync Manager\n// ============================================================================\n\nexport class StateSyncManager extends EventEmitter {\n private config: StateSyncConfig;\n private sequenceNumber = 0;\n private pendingChanges: StateChangeEvent[] = [];\n private throttleTimer: NodeJS.Timeout | null = null;\n\n constructor(config: Partial<StateSyncConfig> = {}) {\n super();\n this.config = {\n enabled: config.enabled ?? true,\n conflictStrategy: config.conflictStrategy ?? 'last_write_wins',\n throttleInterval: config.throttleInterval ?? 100,\n maxRetries: config.maxRetries ?? 3,\n clientId: config.clientId ?? this.generateClientId(),\n };\n }\n\n /**\n * Notify that state has changed (called by agent internals)\n */\n notifyStateChange(\n type: StateChangeType,\n threadId: string,\n payload: Record<string, unknown>,\n userId?: string,\n ): void {\n if (!this.config.enabled) return;\n\n const event: StateChangeEvent = {\n type,\n threadId,\n userId,\n timestamp: Date.now(),\n payload,\n version: this.createVersionVector(),\n sourceClientId: this.config.clientId,\n };\n\n // Add to pending changes\n this.pendingChanges.push(event);\n\n // Emit immediately for local listeners\n this.emit('stateChange', event);\n\n // Throttle sync to server\n this.scheduleSync();\n }\n\n /**\n * Receive state change from server (called by server transport)\n */\n receiveRemoteChange(event: StateChangeEvent): void {\n // Ignore own changes\n if (event.sourceClientId === this.config.clientId) return;\n\n // Check for conflicts\n const conflicts = this.findConflicts(event);\n\n if (conflicts.length > 0) {\n const resolution = this.resolveConflicts(event, conflicts);\n\n if (resolution.resolved) {\n this.emit('stateReconciled', resolution.winningState, event);\n } else {\n this.emit('conflictDetected', conflicts, event);\n }\n } else {\n // No conflicts, apply change\n this.emit('remoteChange', event);\n }\n }\n\n /**\n * Create sync snapshot for current state\n */\n createSnapshot(\n threadId: string,\n state: {\n checkpoint?: Checkpoint;\n sessionMetadata?: Record<string, unknown>;\n memoryState?: Record<string, unknown>;\n },\n ): StateSyncSnapshot {\n return {\n threadId,\n checkpoint: state.checkpoint,\n sessionMetadata: state.sessionMetadata,\n memoryState: state.memoryState,\n version: this.createVersionVector(),\n lastUpdated: Date.now(),\n };\n }\n\n /**\n * Compare two version vectors\n * Returns: -1 if a < b, 0 if concurrent/equal, 1 if a > b\n */\n compareVersions(a: VersionVector, b: VersionVector): number {\n if (a.timestamp < b.timestamp) return -1;\n if (a.timestamp > b.timestamp) return 1;\n if (a.sequence < b.sequence) return -1;\n if (a.sequence > b.sequence) return 1;\n return 0;\n }\n\n /**\n * Check if there are pending changes to sync\n */\n hasPendingChanges(): boolean {\n return this.pendingChanges.length > 0;\n }\n\n /**\n * Get and clear pending changes\n */\n flushPendingChanges(): StateChangeEvent[] {\n const changes = [...this.pendingChanges];\n this.pendingChanges = [];\n return changes;\n }\n\n /**\n * Get sync configuration\n */\n getConfig(): StateSyncConfig {\n return { ...this.config };\n }\n\n /**\n * Update sync configuration\n */\n updateConfig(config: Partial<StateSyncConfig>): void {\n this.config = { ...this.config, ...config };\n this.emit('configUpdated', this.config);\n }\n\n /**\n * Dispose resources\n */\n dispose(): void {\n if (this.throttleTimer) {\n clearTimeout(this.throttleTimer);\n this.throttleTimer = null;\n }\n this.removeAllListeners();\n this.pendingChanges = [];\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private generateClientId(): string {\n return `client_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n }\n\n private createVersionVector(): VersionVector {\n this.sequenceNumber++;\n return {\n timestamp: Date.now(),\n sequence: this.sequenceNumber,\n nodeId: this.config.clientId,\n };\n }\n\n private scheduleSync(): void {\n if (this.throttleTimer) return;\n\n this.throttleTimer = setTimeout(() => {\n this.throttleTimer = null;\n if (this.pendingChanges.length > 0) {\n this.emit('syncRequired', this.flushPendingChanges());\n }\n }, this.config.throttleInterval);\n }\n\n private findConflicts(incoming: StateChangeEvent): StateChangeEvent[] {\n // Find local pending changes that conflict with incoming\n return this.pendingChanges.filter(local =>\n local.threadId === incoming.threadId &&\n local.type === incoming.type &&\n this.compareVersions(local.version, incoming.version) !== 0\n );\n }\n\n private resolveConflicts(\n incoming: StateChangeEvent,\n conflicts: StateChangeEvent[],\n ): ConflictResolution {\n switch (this.config.conflictStrategy) {\n case 'last_write_wins':\n // Compare timestamps, latest wins\n let winningEvent = incoming;\n for (const conflict of conflicts) {\n if (this.compareVersions(conflict.version, winningEvent.version) > 0) {\n winningEvent = conflict;\n }\n }\n return {\n resolved: true,\n strategy: 'last_write_wins',\n };\n\n case 'manual':\n // Don't resolve, let user decide\n return {\n resolved: false,\n strategy: 'manual',\n conflicts: conflicts.map(c => ({ clientA: c, clientB: incoming })),\n };\n\n case 'merge':\n default:\n // Merge if possible, otherwise manual\n return {\n resolved: conflicts.length === 0,\n strategy: conflicts.length === 0 ? 'merge' : 'manual',\n conflicts: conflicts.length > 0\n ? conflicts.map(c => ({ clientA: c, clientB: incoming }))\n : undefined,\n };\n }\n }\n}\n\n// ============================================================================\n// Global Instance\n// ============================================================================\n\nlet globalStateSyncManager: StateSyncManager | null = null;\n\n/**\n * Get or create global state sync manager\n */\nexport function getStateSyncManager(config?: Partial<StateSyncConfig>): StateSyncManager {\n if (!globalStateSyncManager) {\n globalStateSyncManager = new StateSyncManager(config);\n }\n return globalStateSyncManager;\n}\n\n/**\n * Reset global state sync manager\n */\nexport function resetStateSyncManager(): void {\n globalStateSyncManager?.dispose();\n globalStateSyncManager = null;\n}\n\n// ============================================================================\n// Integration Helpers\n// ============================================================================\n\n/**\n * Create a synchronized wrapper for session operations\n */\nexport function withSync<T extends (...args: unknown[]) => unknown>(\n fn: T,\n syncManager: StateSyncManager,\n options: {\n threadId: string;\n type: StateChangeType;\n getPayload: (...args: unknown[]) => Record<string, unknown>;\n },\n): T {\n return ((...args: unknown[]) => {\n const result = fn(...args);\n\n // Notify sync manager\n syncManager.notifyStateChange(\n options.type,\n options.threadId,\n options.getPayload(...args),\n );\n\n return result;\n }) as T;\n}\n\n/**\n * Debounce sync notifications\n */\nexport function debounceSync(\n syncManager: StateSyncManager,\n delay: number = 100,\n): (type: StateChangeType, threadId: string, payload: Record<string, unknown>) => void {\n let timeout: NodeJS.Timeout | null = null;\n let pending: { type: StateChangeType; threadId: string; payload: Record<string, unknown> } | null = null;\n\n return (type, threadId, payload) => {\n pending = { type, threadId, payload };\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n timeout = setTimeout(() => {\n if (pending) {\n syncManager.notifyStateChange(pending.type, pending.threadId, pending.payload);\n pending = null;\n }\n timeout = null;\n }, delay);\n };\n}\n","/**\n * Model Router Safety Layer\n * \n * Prevents catastrophic underestimation that leads to Qwen timeouts.\n * Uses multiple safety mechanisms:\n * 1. Conservative bias (round up, not down)\n * 2. Complexity indicators (definite \"complex\" signals)\n * 3. Confidence threshold (low confidence → Anthropic)\n * 4. Validation layer (second opinion for borderline cases)\n * 5. Circuit breaker (auto-fallback on any failure)\n * \n * @packageDocumentation\n */\n\nimport type { OrbitalEstimation, SafetyConfig } from './types.js';\n\n// Keywords that DEFINITELY indicate complex apps (always route to Anthropic)\nconst DEFINITE_COMPLEX_INDICATORS = [\n 'erp', 'enterprise resource planning',\n 'hospital system', 'healthcare system', 'medical records',\n 'banking', 'core banking', 'trading platform',\n 'insurance platform', 'claims management',\n 'supply chain', 'logistics management',\n 'multi-tenant', 'white label',\n 'workflow engine', 'bpm', 'business process',\n 'inventory management', 'warehouse management',\n 'hr management', 'payroll', 'recruitment',\n 'crm with', 'salesforce alternative',\n 'government', 'municipal', 'public sector',\n 'compliance', 'regulatory', 'audit trail',\n 'blockchain', 'crypto exchange', 'defi',\n 'iot platform', 'device management',\n];\n\n// Partial indicators that increase confidence\nconst COMPLEXITY_BOOSTERS = [\n 'integration', 'api', 'webhook',\n 'real-time', 'websocket', 'live updates',\n 'reporting', 'analytics', 'dashboard',\n 'rbac', 'permissions', 'roles',\n 'approval workflow', 'validation workflow',\n 'multi-currency', 'multi-language', 'multi-region',\n];\n\nconst DEFAULT_SAFETY_CONFIG: SafetyConfig = {\n conservativeBias: 1, // Add 1 to all estimates\n minConfidenceThreshold: 0.6, // Below 60% confidence = Anthropic\n validationThreshold: 4, // Validate estimates of 4+ orbitals\n qwenMaxOrbitals: 4,\n forceComplexKeywords: DEFINITE_COMPLEX_INDICATORS,\n};\n\n/**\n * Check if request contains definite complex indicators\n */\nexport function hasDefiniteComplexIndicators(request: string): boolean {\n const lowerRequest = request.toLowerCase();\n \n for (const indicator of DEFINITE_COMPLEX_INDICATORS) {\n if (lowerRequest.includes(indicator.toLowerCase())) {\n return true;\n }\n }\n \n return false;\n}\n\n/**\n * Apply conservative bias to estimation\n */\nexport function applyConservativeBias(\n estimation: OrbitalEstimation,\n bias: number = 1\n): OrbitalEstimation {\n return {\n ...estimation,\n count: Math.min(estimation.count + bias, 10), // Cap at 10\n reasoning: `${estimation.reasoning} (conservative bias: +${bias})`,\n };\n}\n\n/**\n * Validate estimation with a second opinion\n * For borderline cases (3-4 orbitals), get another estimate and take max\n */\nexport async function validateEstimation(\n estimation: OrbitalEstimation,\n getSecondOpinion: () => Promise<OrbitalEstimation>,\n config: Partial<SafetyConfig> = {}\n): Promise<OrbitalEstimation> {\n const cfg = { ...DEFAULT_SAFETY_CONFIG, ...config };\n \n // Only validate borderline cases\n if (estimation.count < cfg.validationThreshold) {\n return estimation;\n }\n \n try {\n const secondOpinion = await getSecondOpinion();\n \n // Take the MAX of both estimates (conservative)\n if (secondOpinion.count > estimation.count) {\n return {\n ...secondOpinion,\n reasoning: `${secondOpinion.reasoning} (validated: was ${estimation.count})`,\n _metadata: {\n ...secondOpinion._metadata,\n originalEstimate: estimation.count,\n validationMethod: 'second-opinion-max',\n },\n };\n }\n } catch (error) {\n // Validation failed, use original but add warning\n console.warn('Estimation validation failed, using conservative estimate');\n }\n \n return estimation;\n}\n\n/**\n * Make final routing decision with all safety checks\n */\nexport function makeSafeRoutingDecision(\n estimation: OrbitalEstimation,\n request: string,\n config: Partial<SafetyConfig> = {}\n): {\n finalCount: number;\n useAnthropic: boolean;\n reason: string;\n safetyChecks: string[];\n} {\n const cfg = { ...DEFAULT_SAFETY_CONFIG, ...config };\n const safetyChecks: string[] = [];\n \n // Check 1: Definite complex indicators\n if (hasDefiniteComplexIndicators(request)) {\n safetyChecks.push('DEFINITE_COMPLEX_KEYWORDS');\n return {\n finalCount: Math.max(estimation.count, 6),\n useAnthropic: true,\n reason: 'Request contains definite complex indicators',\n safetyChecks,\n };\n }\n \n // Check 2: Apply conservative bias\n let finalCount = estimation.count + cfg.conservativeBias;\n safetyChecks.push(`CONSERVATIVE_BIAS:+${cfg.conservativeBias}`);\n \n // Check 3: Low confidence\n if (estimation.confidence < cfg.minConfidenceThreshold) {\n safetyChecks.push('LOW_CONFIDENCE');\n return {\n finalCount: Math.max(finalCount, 5),\n useAnthropic: true,\n reason: `Low confidence (${estimation.confidence.toFixed(2)}), routing to Anthropic for safety`,\n safetyChecks,\n };\n }\n \n // Check 4: Exceeds Qwen limit\n if (finalCount > cfg.qwenMaxOrbitals) {\n safetyChecks.push('EXCEEDS_QWEN_LIMIT');\n return {\n finalCount,\n useAnthropic: true,\n reason: `Estimated ${finalCount} orbitals exceeds Qwen limit (${cfg.qwenMaxOrbitals})`,\n safetyChecks,\n };\n }\n \n // Safe to use Qwen\n safetyChecks.push('WITHIN_QWEN_LIMITS');\n return {\n finalCount,\n useAnthropic: false,\n reason: `Estimated ${finalCount} orbitals within safe limits`,\n safetyChecks,\n };\n}\n\n/**\n * Complete safe estimation pipeline\n */\nexport async function safeEstimate(\n request: string,\n options: {\n estimateFn: (request: string) => Promise<OrbitalEstimation>;\n validateFn?: (est: OrbitalEstimation) => Promise<OrbitalEstimation>;\n config?: Partial<SafetyConfig>;\n }\n): Promise<{\n estimation: OrbitalEstimation;\n routing: {\n useAnthropic: boolean;\n reason: string;\n safetyChecks: string[];\n };\n}> {\n // Step 1: Initial estimation\n let estimation = await options.estimateFn(request);\n \n // Step 2: Validation (optional)\n if (options.validateFn) {\n estimation = await options.validateFn(estimation);\n }\n \n // Step 3: Apply conservative bias\n estimation = applyConservativeBias(\n estimation,\n options.config?.conservativeBias ?? 1\n );\n \n // Step 4: Safety checks\n const routing = makeSafeRoutingDecision(estimation, request, options.config);\n \n return {\n estimation: {\n ...estimation,\n count: routing.finalCount,\n },\n routing,\n };\n}\n\n/**\n * Circuit breaker for Qwen calls\n * Monitors failure rate and forces Anthropic if too many failures\n */\nexport class QwenCircuitBreaker {\n private failures: number = 0;\n private successes: number = 0;\n private lastFailure: number = 0;\n \n constructor(\n private failureThreshold: number = 3,\n private resetTimeoutMs: number = 60000\n ) {}\n \n recordSuccess() {\n this.successes++;\n // Gradually reduce failure count on success\n if (this.failures > 0) this.failures--;\n }\n \n recordFailure() {\n this.failures++;\n this.lastFailure = Date.now();\n }\n \n isOpen(): boolean {\n // Check if enough time has passed to retry\n if (Date.now() - this.lastFailure > this.resetTimeoutMs) {\n this.failures = Math.max(0, this.failures - 1);\n }\n \n return this.failures >= this.failureThreshold;\n }\n \n getStatus() {\n return {\n failures: this.failures,\n successes: this.successes,\n isOpen: this.isOpen(),\n failureRate: this.failures / (this.failures + this.successes) || 0,\n };\n }\n}\n\n// Global circuit breaker instance\nlet globalCircuitBreaker: QwenCircuitBreaker | null = null;\n\nexport function getCircuitBreaker(): QwenCircuitBreaker {\n if (!globalCircuitBreaker) {\n globalCircuitBreaker = new QwenCircuitBreaker();\n }\n return globalCircuitBreaker;\n}\n","/**\n * Model Router with Safety Layer\n * \n * Routes generation requests to optimal LLM provider based on orbital count.\n * Implements Phase 1.1 of the enhancement plan.\n * \n * SAFETY FEATURES:\n * - Conservative bias: Always rounds up estimates\n * - Complex indicators: Definite keywords force Anthropic\n * - Confidence threshold: Low confidence → Anthropic\n * - Circuit breaker: Auto-fallback on repeated failures\n * \n * Test Results:\n * - 1 orbital: Qwen 100% quality, 68s (75% cheaper)\n * - 3-4 orbitals: Qwen 56/100, 169s (24% faster, same quality)\n * - 6+ orbitals: Qwen times out, Anthropic required\n * \n * @packageDocumentation\n */\n\nimport type {\n LLMProvider,\n RoutingDecision,\n ProviderConfig,\n ModelRouterConfig,\n RoutingStrategy,\n SafetyConfig\n} from './types.js';\nimport { \n hasDefiniteComplexIndicators,\n makeSafeRoutingDecision,\n applyConservativeBias,\n getCircuitBreaker,\n} from './safety.js';\n\n// Default provider configurations based on empirical testing\nconst DEFAULT_PROVIDERS: ProviderConfig[] = [\n {\n name: 'openrouter',\n model: 'qwen/qwen3.5-397b-a17b',\n costPer1KInput: 0.0005,\n costPer1KOutput: 0.001,\n baseLatency: 70000,\n maxOrbitals: 4,\n supportsFallback: true\n },\n {\n name: 'anthropic',\n model: 'claude-sonnet-4-20250929',\n costPer1KInput: 0.003,\n costPer1KOutput: 0.015,\n baseLatency: 60000,\n maxOrbitals: 20,\n supportsFallback: false\n }\n];\n\nconst DEFAULT_CONFIG: ModelRouterConfig = {\n providers: DEFAULT_PROVIDERS,\n defaultStrategy: 'cost-optimized',\n enableFallback: true,\n fallbackTimeout: 300000, // 5 minutes\n enableABTesting: false\n};\n\nexport class ModelRouter {\n private config: ModelRouterConfig;\n private circuitBreaker = getCircuitBreaker();\n\n constructor(config: Partial<ModelRouterConfig> = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Route request with FULL safety checks\n * This is the primary production routing method\n */\n async routeSafely(\n request: string,\n expectedOrbitals?: number,\n safetyConfig?: Partial<SafetyConfig>\n ): Promise<RoutingDecision> {\n // Step 1: Check circuit breaker\n if (this.circuitBreaker.isOpen()) {\n console.warn('Circuit breaker open, routing to Anthropic for safety');\n return this.createAnthropicDecision(\n expectedOrbitals || 5,\n 'Circuit breaker open - recent Qwen failures detected'\n );\n }\n\n // Step 2: Check definite complex indicators (fast path)\n if (hasDefiniteComplexIndicators(request)) {\n console.log('Complex indicators detected, routing to Anthropic');\n return this.createAnthropicDecision(\n 6,\n 'Request contains definite complex indicators (ERP, healthcare, banking, etc.)'\n );\n }\n\n // Step 3: Get estimation\n const estimation = expectedOrbitals \n ? { count: expectedOrbitals, confidence: 1.0, domains: [], reasoning: 'User-provided' }\n : await this.estimateWithSafety(request, safetyConfig);\n\n // Step 4: Apply safety checks\n const routing = makeSafeRoutingDecision(estimation, request, safetyConfig);\n\n // Step 5: Create appropriate decision\n if (routing.useAnthropic) {\n return this.createAnthropicDecision(routing.finalCount, routing.reason);\n }\n\n return this.createQwenDecision(\n routing.finalCount,\n routing.reason,\n { model: 'claude-sonnet-4-20250929', provider: 'anthropic' }\n );\n }\n\n /**\n * Legacy method - kept for compatibility, but uses safety layer internally\n * @deprecated Use routeSafely() for production\n */\n async routeByOrbitalCount(\n request: string,\n expectedOrbitals?: number\n ): Promise<RoutingDecision> {\n return this.routeSafely(request, expectedOrbitals);\n }\n\n /**\n * Route with pre-decomposition estimation\n */\n async routeWithDecomposition(request: string): Promise<RoutingDecision> {\n return this.routeSafely(request);\n }\n\n /**\n * Generate with automatic fallback AND circuit breaker tracking\n */\n async generateWithFallback<T>(\n request: string,\n generateFn: (provider: LLMProvider, model: string) => Promise<T>,\n expectedOrbitals?: number\n ): Promise<{ result: T; routing: RoutingDecision; usedFallback: boolean }> {\n const routing = await this.routeSafely(request, expectedOrbitals);\n \n try {\n const result = await this.executeWithTimeout(\n () => generateFn(routing.provider, routing.model),\n this.config.fallbackTimeout\n );\n \n // Track success\n if (routing.provider === 'openrouter') {\n this.circuitBreaker.recordSuccess();\n }\n \n return { result, routing, usedFallback: false };\n } catch (error) {\n // Track failure\n if (routing.provider === 'openrouter') {\n this.circuitBreaker.recordFailure();\n console.warn(`Qwen failure recorded. Circuit breaker status:`, this.circuitBreaker.getStatus());\n }\n \n // Fallback to Anthropic if available\n if (routing.fallback && this.config.enableFallback) {\n console.log(`Primary provider failed, falling back to ${routing.fallback.provider}...`);\n const fallbackResult = await generateFn(\n routing.fallback.provider,\n routing.fallback.model\n );\n \n return { \n result: fallbackResult, \n routing, \n usedFallback: true \n };\n }\n \n throw error;\n }\n }\n\n /**\n * Get cost comparison for debugging/optimization\n */\n async getCostComparison(request: string, expectedOrbitals?: number): Promise<{\n orbitalCount: number;\n recommended: RoutingDecision;\n alternatives: RoutingDecision[];\n savings: number;\n safetyChecks: string[];\n }> {\n const orbitalCount = expectedOrbitals ?? (await this.estimateWithSafety(request)).count;\n const routing = makeSafeRoutingDecision(\n { count: orbitalCount, confidence: 1, domains: [], reasoning: '' },\n request\n );\n \n const recommended = routing.useAnthropic\n ? this.createAnthropicDecision(routing.finalCount, routing.reason)\n : this.createQwenDecision(routing.finalCount, routing.reason);\n \n const alternatives: RoutingDecision[] = [];\n if (recommended.provider !== 'anthropic') {\n alternatives.push(this.createAnthropicDecision(routing.finalCount, 'Alternative'));\n }\n if (recommended.provider !== 'openrouter') {\n alternatives.push(this.createQwenDecision(routing.finalCount, 'Alternative'));\n }\n \n const anthropicCost = alternatives.find(a => a.provider === 'anthropic')?.estimatedCost || 0.15;\n const savings = anthropicCost - recommended.estimatedCost;\n \n return {\n orbitalCount: routing.finalCount,\n recommended,\n alternatives,\n savings,\n safetyChecks: routing.safetyChecks\n };\n }\n\n /**\n * Get circuit breaker status for monitoring\n */\n getCircuitBreakerStatus() {\n return this.circuitBreaker.getStatus();\n }\n\n // Private helpers\n \n private async estimateWithSafety(\n request: string,\n safetyConfig?: Partial<SafetyConfig>\n ): Promise<{ count: number; confidence: number; domains: string[]; reasoning: string }> {\n const { estimateOrbitalCount } = await import('./orbital-estimator.js');\n const estimation = await estimateOrbitalCount(request);\n \n // Apply conservative bias\n return applyConservativeBias(estimation, safetyConfig?.conservativeBias ?? 1);\n }\n\n private createQwenDecision(\n orbitalCount: number,\n reasoning: string,\n fallback?: { model: string; provider: LLMProvider }\n ): RoutingDecision {\n const estimatedInputTokens = 2000 + (orbitalCount * 500);\n const estimatedOutputTokens = 3000 + (orbitalCount * 1000);\n \n const inputCost = (estimatedInputTokens / 1000) * 0.0005;\n const outputCost = (estimatedOutputTokens / 1000) * 0.001;\n \n return {\n model: 'qwen/qwen3.5-397b-a17b',\n provider: 'openrouter',\n reasoning,\n estimatedCost: inputCost + outputCost,\n estimatedLatency: 70000 + (orbitalCount * 30000),\n fallback\n };\n }\n\n private createAnthropicDecision(orbitalCount: number, reasoning: string): RoutingDecision {\n const estimatedInputTokens = 2000 + (orbitalCount * 500);\n const estimatedOutputTokens = 3000 + (orbitalCount * 1000);\n \n const inputCost = (estimatedInputTokens / 1000) * 0.003;\n const outputCost = (estimatedOutputTokens / 1000) * 0.015;\n \n return {\n model: 'claude-sonnet-4-20250929',\n provider: 'anthropic',\n reasoning,\n estimatedCost: inputCost + outputCost,\n estimatedLatency: 60000 + (orbitalCount * 45000)\n };\n }\n\n private async executeWithTimeout<T>(\n fn: () => Promise<T>,\n timeoutMs: number\n ): Promise<T> {\n return Promise.race([\n fn(),\n new Promise<never>((_, reject) => \n setTimeout(() => reject(new Error('Provider timeout')), timeoutMs)\n )\n ]);\n }\n}\n\n/**\n * Factory function for creating router\n */\nexport function createModelRouter(config?: Partial<ModelRouterConfig>): ModelRouter {\n return new ModelRouter(config);\n}\n\n/**\n * Singleton instance for simple use cases\n */\nlet defaultRouter: ModelRouter | null = null;\n\nexport function getModelRouter(): ModelRouter {\n if (!defaultRouter) {\n defaultRouter = new ModelRouter();\n }\n return defaultRouter;\n}\n","/**\n * Model Router - Phase 1.1 Implementation\n * \n * Routes generation requests to appropriate LLM provider based on orbital count.\n * Qwen for 1-4 orbitals (cost-efficient), Anthropic for 5+ (reliable).\n * \n * @packageDocumentation\n */\n\nexport { ModelRouter, createModelRouter, getModelRouter } from './model-router.js';\nexport { \n estimateOrbitalCount, \n estimateOrbitalCountLLM,\n estimateOrbitalCountHeuristic,\n estimateOrbitalCountBatch,\n quickEstimate \n} from './orbital-estimator.js';\nexport {\n hasDefiniteComplexIndicators,\n applyConservativeBias,\n makeSafeRoutingDecision,\n safeEstimate,\n getCircuitBreaker,\n QwenCircuitBreaker,\n} from './safety.js';\nexport type { \n RoutingDecision, \n ModelRouterConfig, \n ProviderConfig,\n RoutingStrategy \n} from './types.js';\n","/**\n * MCP (Model Context Protocol) Server - Phase 3.1\n *\n * Exposes Almadar tools via the Model Context Protocol standard.\n * Allows external agents (Claude Desktop, etc.) to use our tools.\n *\n * @packageDocumentation\n */\n\nimport type { \n ToolDefinition, \n ToolCallRequest, \n ToolCallResponse,\n ResourceDefinition,\n ResourceRequest,\n ResourceResponse \n} from './types.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface MCPServerConfig {\n name: string;\n version: string;\n port?: number;\n enableCors?: boolean;\n authToken?: string;\n}\n\nexport interface MCPDiscoveryResponse {\n name: string;\n version: string;\n tools: ToolDefinition[];\n resources: ResourceDefinition[];\n}\n\n// ============================================================================\n// Tool Registry\n// ============================================================================\n\nexport class MCPToolRegistry {\n private tools: Map<string, ToolDefinition> = new Map();\n private handlers: Map<string, (input: unknown) => Promise<unknown>> = new Map();\n\n registerTool<TInput = unknown, TOutput = unknown>(\n definition: ToolDefinition,\n handler: (input: TInput) => Promise<TOutput>\n ): void {\n this.tools.set(definition.name, definition);\n this.handlers.set(definition.name, handler as (input: unknown) => Promise<unknown>);\n }\n\n async callTool(name: string, input: unknown): Promise<ToolCallResponse> {\n const handler = this.handlers.get(name);\n if (!handler) {\n return {\n success: false,\n error: `Tool not found: ${name}`,\n };\n }\n\n try {\n const result = await handler(input);\n return {\n success: true,\n data: result,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n listTools(): ToolDefinition[] {\n return Array.from(this.tools.values());\n }\n\n hasTool(name: string): boolean {\n return this.tools.has(name);\n }\n}\n\n// ============================================================================\n// Resource Registry\n// ============================================================================\n\nexport class MCPResourceRegistry {\n private resources: Map<string, ResourceDefinition> = new Map();\n private handlers: Map<string, () => Promise<unknown>> = new Map();\n\n registerResource(\n definition: ResourceDefinition,\n handler: () => Promise<unknown>\n ): void {\n this.resources.set(definition.uri, definition);\n this.handlers.set(definition.uri, handler);\n }\n\n async getResource(uri: string): Promise<ResourceResponse> {\n const handler = this.handlers.get(uri);\n if (!handler) {\n return {\n success: false,\n error: `Resource not found: ${uri}`,\n };\n }\n\n try {\n const result = await handler();\n return {\n success: true,\n data: result,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n listResources(): ResourceDefinition[] {\n return Array.from(this.resources.values());\n }\n}\n\n// ============================================================================\n// MCP Server\n// ============================================================================\n\nexport class MCPServer {\n private config: MCPServerConfig;\n private toolRegistry: MCPToolRegistry;\n private resourceRegistry: MCPResourceRegistry;\n\n constructor(config: MCPServerConfig) {\n this.config = {\n port: 3000,\n enableCors: true,\n ...config,\n };\n this.toolRegistry = new MCPToolRegistry();\n this.resourceRegistry = new MCPResourceRegistry();\n }\n\n /**\n * Register an orbital generation tool\n */\n registerOrbitalTools(): void {\n // Tool: generate_orbital\n this.toolRegistry.registerTool(\n {\n name: 'generate_orbital',\n description: 'Generate a complete orbital schema from requirements',\n inputSchema: {\n type: 'object',\n properties: {\n entity: {\n type: 'object',\n description: 'Entity definition with name, fields, etc.',\n },\n traits: {\n type: 'array',\n description: 'List of trait definitions',\n },\n pages: {\n type: 'array',\n description: 'List of page definitions',\n },\n },\n required: ['entity'],\n },\n },\n async (input) => {\n // This would call the actual orbital generator\n console.log('[MCP] generate_orbital called:', input);\n return { status: 'generated', orbitalId: `orb_${Date.now()}` };\n }\n );\n\n // Tool: validate_schema\n this.toolRegistry.registerTool(\n {\n name: 'validate_schema',\n description: 'Validate an orbital schema for correctness',\n inputSchema: {\n type: 'object',\n properties: {\n schema: {\n type: 'object',\n description: 'The orbital schema to validate',\n },\n },\n required: ['schema'],\n },\n },\n async (input) => {\n console.log('[MCP] validate_schema called');\n return { valid: true, errors: [] };\n }\n );\n\n // Tool: combine_schemas\n this.toolRegistry.registerTool(\n {\n name: 'combine_schemas',\n description: 'Combine multiple orbital schemas into one',\n inputSchema: {\n type: 'object',\n properties: {\n schemas: {\n type: 'array',\n description: 'List of schemas to combine',\n },\n },\n required: ['schemas'],\n },\n },\n async (input) => {\n console.log('[MCP] combine_schemas called');\n return { combined: true, schema: {} };\n }\n );\n }\n\n /**\n * Register MCP resources\n */\n registerResources(): void {\n // Resource: Available patterns\n this.resourceRegistry.registerResource(\n {\n uri: 'schema://patterns',\n name: 'Available Patterns',\n mimeType: 'application/json',\n description: 'List of available orbital patterns',\n },\n async () => {\n return {\n patterns: [\n { id: 'crud', name: 'CRUD Operations' },\n { id: 'list', name: 'List View' },\n { id: 'detail', name: 'Detail View' },\n { id: 'wizard', name: 'Multi-step Wizard' },\n ],\n };\n }\n );\n\n // Resource: Pattern documentation\n this.resourceRegistry.registerResource(\n {\n uri: 'docs://patterns/{patternId}',\n name: 'Pattern Documentation',\n mimeType: 'text/markdown',\n description: 'Documentation for a specific pattern',\n },\n async () => {\n return '# Pattern Documentation\\n\\nDetails about the pattern...';\n }\n );\n }\n\n /**\n * Handle discovery request (list all tools and resources)\n */\n handleDiscovery(): MCPDiscoveryResponse {\n return {\n name: this.config.name,\n version: this.config.version,\n tools: this.toolRegistry.listTools(),\n resources: this.resourceRegistry.listResources(),\n };\n }\n\n /**\n * Handle tool call\n */\n async handleToolCall(request: ToolCallRequest): Promise<ToolCallResponse> {\n return this.toolRegistry.callTool(request.name, request.input);\n }\n\n /**\n * Handle resource request\n */\n async handleResourceRequest(request: ResourceRequest): Promise<ResourceResponse> {\n return this.resourceRegistry.getResource(request.uri);\n }\n\n /**\n * Get tool registry for external access\n */\n getToolRegistry(): MCPToolRegistry {\n return this.toolRegistry;\n }\n\n /**\n * Get resource registry for external access\n */\n getResourceRegistry(): MCPResourceRegistry {\n return this.resourceRegistry;\n }\n\n /**\n * Create HTTP request handler for Express/Fastify\n */\n createRequestHandler() {\n return async (request: { method: string; body: unknown }): Promise<unknown> => {\n const body = request.body as { type: string; [key: string]: unknown };\n\n switch (body.type) {\n case 'discovery':\n return this.handleDiscovery();\n\n case 'tool_call':\n return this.handleToolCall(body as unknown as ToolCallRequest);\n\n case 'resource_request':\n return this.handleResourceRequest(body as unknown as ResourceRequest);\n\n default:\n return { error: 'Unknown request type' };\n }\n };\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createMCPServer(config: MCPServerConfig): MCPServer {\n return new MCPServer(config);\n}\n\n/**\n * Create and configure a standard Almadar MCP server\n */\nexport function createAlmadarMCPServer(options?: Partial<MCPServerConfig>): MCPServer {\n const server = createMCPServer({\n name: 'almadar-orbital-tools',\n version: '1.0.0',\n ...options,\n });\n\n server.registerOrbitalTools();\n server.registerResources();\n\n return server;\n}\n","/**\n * MCP (Model Context Protocol) Client - Phase 3.1\n *\n * Client for calling external MCP servers.\n * Allows our agent to use tools from other MCP-compliant servers.\n *\n * @packageDocumentation\n */\n\nimport type {\n MCPClientConfig,\n ToolDefinition,\n ResourceDefinition,\n ToolCallRequest,\n ToolCallResponse,\n ResourceRequest,\n ResourceResponse,\n MCPDiscoveryRequest,\n} from './types.js';\n\n// ============================================================================\n// MCP Client\n// ============================================================================\n\nexport class MCPClient {\n private config: Required<MCPClientConfig>;\n private cachedTools: ToolDefinition[] | null = null;\n private cachedResources: ResourceDefinition[] | null = null;\n private cacheExpiry: number = 0;\n\n constructor(config: MCPClientConfig) {\n this.config = {\n timeoutMs: 30000,\n authToken: undefined,\n ...config,\n } as Required<MCPClientConfig>;\n }\n\n /**\n * Discover available tools and resources from server\n */\n async discover(): Promise<{\n tools: ToolDefinition[];\n resources: ResourceDefinition[];\n name: string;\n version: string;\n }> {\n // Check cache\n if (this.cachedTools && Date.now() < this.cacheExpiry) {\n return {\n tools: this.cachedTools,\n resources: this.cachedResources ?? [],\n name: 'cached',\n version: '1.0.0',\n };\n }\n\n const request: MCPDiscoveryRequest = { type: 'discovery' };\n \n try {\n const response = await this.sendRequest(request);\n \n // Cache results for 5 minutes\n this.cachedTools = response.tools ?? [];\n this.cachedResources = response.resources ?? [];\n this.cacheExpiry = Date.now() + 5 * 60 * 1000;\n\n return {\n tools: this.cachedTools as ToolDefinition[],\n resources: this.cachedResources as ResourceDefinition[],\n name: response.name,\n version: response.version,\n };\n } catch (error) {\n console.error('[MCP Client] Discovery failed:', error);\n throw error;\n }\n }\n\n /**\n * Call a tool on the MCP server\n */\n async callTool(name: string, input: unknown): Promise<ToolCallResponse> {\n const request: ToolCallRequest = {\n type: 'tool_call',\n name,\n input,\n };\n\n return this.sendRequest(request);\n }\n\n /**\n * Get a resource from the MCP server\n */\n async getResource(uri: string): Promise<ResourceResponse> {\n const request: ResourceRequest = {\n type: 'resource_request',\n uri,\n };\n\n return this.sendRequest(request);\n }\n\n /**\n * List available tools (from cache or discovery)\n */\n async listTools(): Promise<ToolDefinition[]> {\n if (!this.cachedTools || Date.now() >= this.cacheExpiry) {\n await this.discover();\n }\n return (this.cachedTools as ToolDefinition[]) ?? [];\n }\n\n /**\n * List available resources (from cache or discovery)\n */\n async listResources(): Promise<ResourceDefinition[]> {\n if (!this.cachedResources || Date.now() >= this.cacheExpiry) {\n await this.discover();\n }\n return (this.cachedResources as ResourceDefinition[]) ?? [];\n }\n\n /**\n * Check if a tool is available\n */\n async hasTool(name: string): Promise<boolean> {\n const tools = await this.listTools();\n return tools.some(t => t.name === name);\n }\n\n /**\n * Get tool definition\n */\n async getTool(name: string): Promise<ToolDefinition | null> {\n const tools = await this.listTools();\n return tools.find(t => t.name === name) ?? null;\n }\n\n /**\n * Clear cache and force re-discovery\n */\n clearCache(): void {\n this.cachedTools = null;\n this.cachedResources = null;\n this.cacheExpiry = 0;\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private async sendRequest(request: unknown): Promise<any> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.timeoutMs);\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.config.authToken) {\n headers['Authorization'] = `Bearer ${this.config.authToken}`;\n }\n\n const response = await fetch(this.config.serverUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify(request),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${await response.text()}`);\n }\n\n return await response.json();\n } catch (error) {\n clearTimeout(timeoutId);\n \n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error(`Request timeout after ${this.config.timeoutMs}ms`);\n }\n \n throw error;\n }\n }\n}\n\n// ============================================================================\n// Multi-Client Manager\n// ============================================================================\n\nexport interface RegisteredMCPServer {\n name: string;\n client: MCPClient;\n description?: string;\n}\n\nexport class MCPClientManager {\n private servers: Map<string, RegisteredMCPServer> = new Map();\n\n /**\n * Register an MCP server\n */\n registerServer(name: string, config: MCPClientConfig, description?: string): void {\n const client = new MCPClient(config);\n this.servers.set(name, { name, client, description });\n }\n\n /**\n * Get client for a specific server\n */\n getClient(name: string): MCPClient | null {\n return this.servers.get(name)?.client ?? null;\n }\n\n /**\n * Call a tool on a specific server\n */\n async callTool(serverName: string, toolName: string, input: unknown): Promise<ToolCallResponse> {\n const client = this.getClient(serverName);\n if (!client) {\n return { success: false, error: `Server not found: ${serverName}` };\n }\n return client.callTool(toolName, input);\n }\n\n /**\n * Discover all registered servers\n */\n async discoverAll(): Promise<Record<string, { tools: ToolDefinition[]; resources: ResourceDefinition[] }>> {\n const results: Record<string, { tools: ToolDefinition[]; resources: ResourceDefinition[] }> = {};\n\n for (const [name, { client }] of this.servers) {\n try {\n const discovery = await client.discover();\n results[name] = {\n tools: discovery.tools,\n resources: discovery.resources,\n };\n } catch (error) {\n console.error(`[MCP Manager] Failed to discover ${name}:`, error);\n results[name] = { tools: [], resources: [] };\n }\n }\n\n return results;\n }\n\n /**\n * List all registered servers\n */\n listServers(): Array<{ name: string; description?: string }> {\n return Array.from(this.servers.values()).map(s => ({\n name: s.name,\n description: s.description,\n }));\n }\n\n /**\n * Unregister a server\n */\n unregisterServer(name: string): void {\n this.servers.delete(name);\n }\n\n /**\n * Clear all caches\n */\n clearAllCaches(): void {\n for (const { client } of this.servers.values()) {\n client.clearCache();\n }\n }\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createMCPClient(config: MCPClientConfig): MCPClient {\n return new MCPClient(config);\n}\n\nexport function createMCPClientManager(): MCPClientManager {\n return new MCPClientManager();\n}\n\n/**\n * Create a pre-configured client manager with common MCP servers\n */\nexport function createDefaultMCPClientManager(): MCPClientManager {\n const manager = createMCPClientManager();\n\n // Example: GitHub MCP server (if available)\n // manager.registerServer('github', {\n // serverUrl: 'https://github-mcp-server.example.com',\n // }, 'GitHub integration for fetching issues and PRs');\n\n return manager;\n}\n","/**\n * Online Evaluations - Phase 3.2a: Simple Sampling\n *\n * 10% traffic sampling with async validation and basic alerting.\n * Non-blocking - runs in background without affecting user response.\n *\n * @packageDocumentation\n */\n\nimport { EventEmitter } from 'events';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SamplingConfig {\n /** Sampling rate (0.0 - 1.0) */\n sampleRate: number;\n /** Async queue size */\n maxQueueSize: number;\n /** Validation timeout */\n validationTimeoutMs: number;\n /** Alert threshold for error rate */\n errorRateThreshold: number;\n /** Alert window in ms */\n alertWindowMs: number;\n}\n\nexport interface EvalSample {\n sampleId: string;\n timestamp: number;\n request: {\n prompt: string;\n provider: string;\n model: string;\n };\n result: {\n success: boolean;\n schema?: unknown;\n error?: string;\n latencyMs: number;\n };\n validation?: {\n automatedScore: number;\n syntaxErrors: number;\n structureWarnings: number;\n timestamp: number;\n };\n}\n\nexport interface ErrorAlert {\n alertId: string;\n timestamp: number;\n errorRate: number;\n threshold: number;\n windowStart: number;\n sampleCount: number;\n errorCount: number;\n}\n\nexport interface SamplingStats {\n totalSampled: number;\n totalValidated: number;\n averageScore: number;\n currentErrorRate: number;\n queueSize: number;\n isHealthy: boolean;\n}\n\n// ============================================================================\n// Online Eval Sampling\n// ============================================================================\n\nexport class OnlineEvalSampler extends EventEmitter {\n private config: SamplingConfig;\n private queue: EvalSample[] = [];\n private samples: Map<string, EvalSample> = new Map();\n private errorWindow: Array<{ timestamp: number; error: boolean }> = [];\n private isProcessing = false;\n\n constructor(config: Partial<SamplingConfig> = {}) {\n super();\n this.config = {\n sampleRate: 0.1, // 10%\n maxQueueSize: 100,\n validationTimeoutMs: 5000,\n errorRateThreshold: 0.05, // 5%\n alertWindowMs: 60 * 60 * 1000, // 1 hour\n ...config,\n };\n\n // Start background processor\n this.startProcessor();\n }\n\n /**\n * Check if a request should be sampled\n * Uses hash-based sampling for consistency\n */\n shouldSample(requestId: string): boolean {\n // Simple hash function for consistent sampling\n let hash = 0;\n for (let i = 0; i < requestId.length; i++) {\n const char = requestId.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n \n const normalized = Math.abs(hash) / 2147483647;\n return normalized < this.config.sampleRate;\n }\n\n /**\n * Add a sample to the queue for async validation\n */\n async sample(\n requestId: string,\n request: { prompt: string; provider: string; model: string },\n result: { success: boolean; schema?: unknown; error?: string; latencyMs: number }\n ): Promise<void> {\n if (!this.shouldSample(requestId)) {\n return; // Not sampled\n }\n\n // Check queue size\n if (this.queue.length >= this.config.maxQueueSize) {\n console.warn('[OnlineEval] Queue full, dropping sample');\n this.emit('dropped', { reason: 'queue_full' });\n return;\n }\n\n const sample: EvalSample = {\n sampleId: `eval_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,\n timestamp: Date.now(),\n request,\n result,\n };\n\n this.queue.push(sample);\n this.emit('sampled', sample);\n\n // Track error for alerting\n this.trackError(!result.success);\n }\n\n /**\n * Pull samples for manual review\n */\n async pullSamples(\n options: {\n date?: Date;\n limit?: number;\n minScore?: number;\n } = {}\n ): Promise<EvalSample[]> {\n const targetDate = options.date ?? new Date();\n const startOfDay = new Date(targetDate);\n startOfDay.setHours(0, 0, 0, 0);\n const endOfDay = new Date(targetDate);\n endOfDay.setHours(23, 59, 59, 999);\n\n let samples = Array.from(this.samples.values()).filter(s => {\n const ts = new Date(s.timestamp);\n return ts >= startOfDay && ts <= endOfDay;\n });\n\n if (options.minScore !== undefined) {\n samples = samples.filter(s => \n s.validation && s.validation.automatedScore <= options.minScore!\n );\n }\n\n // Sort by timestamp desc\n samples.sort((a, b) => b.timestamp - a.timestamp);\n\n return samples.slice(0, options.limit ?? 50);\n }\n\n /**\n * Get current stats\n */\n getStats(): SamplingStats {\n const validated = Array.from(this.samples.values()).filter(s => s.validation);\n const scores = validated.map(s => s.validation!.automatedScore);\n const averageScore = scores.length > 0\n ? scores.reduce((a, b) => a + b, 0) / scores.length\n : 0;\n\n return {\n totalSampled: this.samples.size + this.queue.length,\n totalValidated: validated.length,\n averageScore,\n currentErrorRate: this.calculateErrorRate(),\n queueSize: this.queue.length,\n isHealthy: this.calculateErrorRate() < this.config.errorRateThreshold,\n };\n }\n\n /**\n * Stop the processor\n */\n stop(): void {\n this.isProcessing = false;\n }\n\n // ============================================================================\n // Private Helpers\n // ============================================================================\n\n private startProcessor(): void {\n this.isProcessing = true;\n \n const processLoop = async () => {\n while (this.isProcessing) {\n if (this.queue.length > 0) {\n const sample = this.queue.shift()!;\n await this.validateSample(sample);\n }\n \n // Small delay to prevent tight loop\n await new Promise(r => setTimeout(r, 100));\n }\n };\n\n processLoop().catch(console.error);\n }\n\n private async validateSample(sample: EvalSample): Promise<void> {\n try {\n const validation = await this.runAutomatedValidation(sample);\n sample.validation = validation;\n this.samples.set(sample.sampleId, sample);\n this.emit('validated', sample);\n } catch (error) {\n console.error('[OnlineEval] Validation failed:', error);\n this.emit('validation_error', { sample, error });\n }\n }\n\n private async runAutomatedValidation(sample: EvalSample): Promise<EvalSample['validation']> {\n // Simulate automated validation\n // In production, this would:\n // 1. Validate schema syntax\n // 2. Check structure\n // 3. Count errors/warnings\n\n const start = Date.now();\n \n // Mock validation (fast)\n await new Promise(r => setTimeout(r, 50));\n\n let score = 100;\n let syntaxErrors = 0;\n let structureWarnings = 0;\n\n if (!sample.result.success) {\n score -= 40;\n syntaxErrors += 1;\n }\n\n if (sample.result.latencyMs > 300000) { // > 5 min\n score -= 20;\n structureWarnings += 1;\n }\n\n return {\n automatedScore: Math.max(0, score),\n syntaxErrors,\n structureWarnings,\n timestamp: Date.now(),\n };\n }\n\n private trackError(isError: boolean): void {\n const now = Date.now();\n \n // Add to window\n this.errorWindow.push({ timestamp: now, error: isError });\n\n // Clean old entries\n const cutoff = now - this.config.alertWindowMs;\n this.errorWindow = this.errorWindow.filter(e => e.timestamp > cutoff);\n\n // Check threshold\n const errorRate = this.calculateErrorRate();\n if (errorRate > this.config.errorRateThreshold) {\n const alert: ErrorAlert = {\n alertId: `alert_${now}`,\n timestamp: now,\n errorRate,\n threshold: this.config.errorRateThreshold,\n windowStart: cutoff,\n sampleCount: this.errorWindow.length,\n errorCount: this.errorWindow.filter(e => e.error).length,\n };\n \n this.emit('alert', alert);\n }\n }\n\n private calculateErrorRate(): number {\n if (this.errorWindow.length === 0) return 0;\n const errors = this.errorWindow.filter(e => e.error).length;\n return errors / this.errorWindow.length;\n }\n}\n\n// ============================================================================\n// CLI Helper\n// ============================================================================\n\nexport interface ReviewOptions {\n date?: string; // YYYY-MM-DD\n limit?: number;\n minScore?: number;\n format?: 'json' | 'table';\n}\n\nexport async function reviewSamples(\n sampler: OnlineEvalSampler,\n options: ReviewOptions = {}\n): Promise<void> {\n const date = options.date ? new Date(options.date) : new Date();\n \n console.log(`\\n📊 Online Eval Samples for ${date.toISOString().split('T')[0]}\\n`);\n\n const samples = await sampler.pullSamples({\n date,\n limit: options.limit ?? 20,\n minScore: options.minScore,\n });\n\n if (samples.length === 0) {\n console.log('No samples found.');\n return;\n }\n\n if (options.format === 'json') {\n console.log(JSON.stringify(samples, null, 2));\n return;\n }\n\n // Table format\n console.log(`${'ID'.padEnd(20)} ${'Score'.padEnd(6)} ${'Latency'.padEnd(10)} ${'Provider'.padEnd(12)} ${'Status'}`);\n console.log('-'.repeat(80));\n \n for (const s of samples) {\n const id = s.sampleId.slice(0, 18).padEnd(20);\n const score = (s.validation?.automatedScore ?? '-').toString().padEnd(6);\n const latency = `${s.result.latencyMs}ms`.padEnd(10);\n const provider = s.request.provider.padEnd(12);\n const status = s.result.success ? '✅' : '❌';\n \n console.log(`${id} ${score} ${latency} ${provider} ${status}`);\n }\n\n // Summary\n const stats = sampler.getStats();\n console.log('\\n📈 Summary:');\n console.log(` Total sampled: ${stats.totalSampled}`);\n console.log(` Validated: ${stats.totalValidated}`);\n console.log(` Average score: ${stats.averageScore.toFixed(1)}`);\n console.log(` Error rate: ${(stats.currentErrorRate * 100).toFixed(1)}%`);\n console.log(` Health: ${stats.isHealthy ? '✅' : '❌'}`);\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createOnlineEvalSampler(config?: Partial<SamplingConfig>): OnlineEvalSampler {\n return new OnlineEvalSampler(config);\n}\n"]}
|