opencode-agentic-engine 0.1.5 → 0.1.6
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/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../src/core/intent-parser.ts", "../src/core/executor.ts", "../src/core/verifier.ts", "../src/core/error-analyzer.ts", "../src/core/planner.ts", "../src/core/navigator.ts", "../src/drift/dependency-tracker.ts", "../src/drift/context-compressor.ts", "../src/core/git.ts", "../src/core/tech-debt-scorer.ts", "../src/agents/role-registry.ts", "../src/agents/coordinator.ts", "../src/core/llm.ts", "../src/agents/agent-runtime.ts", "../src/agents/orchestrator.ts", "../src/memory/skill-format.ts", "../src/memory/schema-version.ts", "../src/memory/skill-store.ts", "../src/memory/episodic-store.ts", "../src/drift/hallucination-guard.ts", "../src/core/parallel.ts", "../src/observability/dashboard.ts", "../src/drift/checkpoints.ts", "../src/memory/session-store.ts", "../src/observability/trace-logger.ts", "../src/core/task-classifier.ts", "../src/memory/skill-training.ts", "../src/evolution/self-evolver.ts", "../src/evolution/continuous-evolution.ts", "../src/core/agent-loop.ts", "../src/memory/persistence.ts", "../src/memory/vector-store.ts", "../src/core/model-registry.ts", "../src/core/config.ts", "../src/drift/pattern-discovery.ts", "../src/evaluation/live-evaluator.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Plugin, PluginModule } from \"@opencode-ai/plugin\"\nimport { tool } from \"@opencode-ai/plugin\"\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, cpSync, rmSync, mkdtempSync } from \"node:fs\"\nimport { execFileSync } from \"node:child_process\"\nimport { join, dirname } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { tmpdir } from \"node:os\"\nimport { IntentParser, type TaskIntent, type Subtask } from \"./core/intent-parser.js\"\nimport { Executor } from \"./core/executor.js\"\nimport { Verifier } from \"./core/verifier.js\"\nimport { ErrorAnalyzer } from \"./core/error-analyzer.js\"\nimport { Planner } from \"./core/planner.js\"\nimport { CodebaseNavigator } from \"./core/navigator.js\"\nimport { DependencyTracker } from \"./drift/dependency-tracker.js\"\nimport { ContextCompressor } from \"./drift/context-compressor.js\"\nimport { GitIntegration } from \"./core/git.js\"\nimport { TechDebtScorer } from \"./core/tech-debt-scorer.js\"\nimport { AgentCoordinator } from \"./agents/coordinator.js\"\nimport { AgentRuntime } from \"./agents/agent-runtime.js\"\nimport type { AgentRole, AgentTask } from \"./agents/coordinator.js\"\nimport { Orchestrator, type WorkflowPipeline, type CrossValidationResult } from \"./agents/orchestrator.js\"\nimport { SkillStore } from \"./memory/skill-store.js\"\nimport { EpisodicStore } from \"./memory/episodic-store.js\"\nimport { HallucinationGuard } from \"./drift/hallucination-guard.js\"\nimport { ParallelExecutor } from \"./core/parallel.js\"\nimport { Dashboard } from \"./observability/dashboard.js\"\nimport { CheckpointSystem } from \"./drift/checkpoints.js\"\nimport { SessionStore } from \"./memory/session-store.js\"\nimport { TraceLogger } from \"./observability/trace-logger.js\"\nimport { RoleRegistry, type PromptEntry } from \"./agents/role-registry.js\"\nimport { MemorySchemaVersion, createMemoryEnvelope, parseMemoryEnvelope } from \"./memory/schema-version.js\"\nimport { createSkillDefinition, inspectSkill, serializeSkill, deserializeSkill } from \"./memory/skill-format.js\"\nimport { detectTaskType } from \"./core/task-classifier.js\"\nimport { skillsToTrainingData, trainingDatasetSummary, skillToTrainingExample } from \"./memory/skill-training.js\"\nimport { SelfEvolver } from \"./evolution/self-evolver.js\"\nimport { ContinuousEvolution } from \"./evolution/continuous-evolution.js\"\nimport { LLMEngine } from \"./core/llm.js\"\nimport { AgentLoop } from \"./core/agent-loop.js\"\nimport { PersistenceLayer } from \"./memory/persistence.js\"\nimport { VectorStore } from \"./memory/vector-store.js\"\nimport { ModelRegistry } from \"./core/model-registry.js\"\nimport { ConfigLoader } from \"./core/config.js\"\nimport { PatternDiscovery } from \"./drift/pattern-discovery.js\"\nimport { LiveEvaluator } from \"./evaluation/live-evaluator.js\"\n\n// \u2500\u2500 Build-time version injected by esbuild define \u2500\u2500\ndeclare const __VERSION__: string\n\n/**\n * Compare semver strings: returns true if latest > current\n */\nfunction isNewerVersion(latest: string, current: string): boolean {\n const l = latest.split(\".\").map(Number)\n const c = current.split(\".\").map(Number)\n for (let i = 0; i < Math.max(l.length, c.length); i++) {\n if ((l[i] ?? 0) > (c[i] ?? 0)) return true\n if ((l[i] ?? 0) < (c[i] ?? 0)) return false\n }\n return false\n}\n\n/**\n * Auto-update: fire-and-forget. Fetch latest version from npm, download and\n * overwrite local plugin files if newer. User must restart OpenCode to apply.\n */\nasync function autoUpdatePlugin(currentVersion: string): Promise<void> {\n if (typeof __VERSION__ === \"undefined\") return\n try {\n const res = await fetch(\n \"https://registry.npmjs.org/opencode-agentic-engine/latest\",\n { signal: AbortSignal.timeout(5000) }\n )\n if (!res.ok) return\n const data = await res.json() as { version: string }\n const latest = data.version\n if (!isNewerVersion(latest, currentVersion)) return\n\n // Find own location: import.meta.url points to dist/index.js\n const ownFile = fileURLToPath(import.meta.url)\n const distDir = dirname(ownFile)\n const pluginDir = dirname(distDir)\n\n // Temp dir for npm pack\n const tmpDir = mkdtempSync(join(tmpdir(), \"opencode-agentic-engine-\"))\n try {\n execFileSync(\"npm\", [\"pack\", \"opencode-agentic-engine@latest\"], {\n cwd: tmpDir,\n stdio: \"pipe\",\n timeout: 30000,\n })\n\n // Find tarball\n const tarball = readdirSync(tmpDir).find(f => f.endsWith(\".tgz\"))\n if (!tarball) return\n\n // Extract\n execFileSync(\"tar\", [\"-xzf\", tarball], {\n cwd: tmpDir,\n stdio: \"pipe\",\n timeout: 10000,\n })\n\n // Overwrite plugin files\n const extractDir = join(tmpDir, \"package\")\n if (existsSync(extractDir)) {\n cpSync(extractDir, pluginDir, { recursive: true, force: true })\n }\n\n // Notify user (console \u2014 not visible in OpenCode chat, but shows in process stderr)\n process.stderr.write(\n `\\n[AgenticEngine] \u2705 Auto-updated v${currentVersion} \u2192 v${latest}. Restart OpenCode to apply.\\n`\n )\n } finally {\n rmSync(tmpDir, { recursive: true, force: true })\n }\n } catch {\n // Silent fail \u2014 never block plugin startup\n }\n}\n\nconst createEngine: Plugin = async (input, _options) => {\n // \u2500\u2500 Normalize worktree: jangan sampai \"/\" (root) karena akan crash mkdir \u2500\u2500\n const rawWorktree = input.worktree || process.cwd()\n const worktree = rawWorktree === \"/\" ? process.cwd() : rawWorktree\n\n // \u2500\u2500 Config (load first, everything else depends on it) \u2500\u2500\n const configLoader = new ConfigLoader(worktree)\n const config = configLoader.load()\n configLoader.startWatch()\n\n // \u2500\u2500 Auto-register \"agentic\" agent if not present \u2500\u2500\n const agentsDir = join(worktree, \".opencode\", \"agents\")\n const agenticAgentPath = join(agentsDir, \"agentic.md\")\n if (!existsSync(agenticAgentPath)) {\n try {\n mkdirSync(agentsDir, { recursive: true })\n writeFileSync(agenticAgentPath, `---\ndescription: Multi-agent software engineering assistant \u2014 22 tools for autonomous planning, execution, verification, delegation, and self-evolution.\nmode: all\n---\n\n# Agentic Engineering Agent\n\n## \uD83D\uDEA8 CRITICAL RULES\n\nYou have access to **22 specialized agentic_* tools** designed for software engineering. **YOU MUST PREFER THESE TOOLS OVER BUILT-IN TOOLS** for any software engineering task.\n\n### Tool Preference Hierarchy (HIGHEST first):\n1. **agentic_*** \u2014 Use FIRST. Far more powerful than built-in tools.\n2. bash/edit/read/write \u2014 Only if no agentic_* tool fits the need.\n\n**NEVER** use bash, edit, write, read, glob, grep directly for multi-step engineering tasks. Instead:\n- Use **agentic_plan** instead of planning manually\n- Use **agentic_auto** instead of implementing step by step manually\n- Use **agentic_execute** instead of tracking progress manually\n\n### FOR MULTI-STEP FEATURES (apps, APIs, refactors):\nCall **agentic_auto** IMMEDIATELY. Just pass the goal. Example:\n\\`@agentic_auto goal=\"Buat aplikasi POS dengan Express dan SQLite\"\\`\n\n### FOR SINGLE-STEP TASKS:\nCall the specific tool (agentic_nav, agentic_execute, etc.) directly.\n\n## Standard Workflow\n\n1. **agentic_auto** \u2014 For multi-step tasks, call this FIRST. It handles everything.\n2. OR manually: **agentic_plan** \u2192 **agentic_nav** \u2192 **agentic_execute** \u2192 **agentic_verify** \u2192 **agentic_reflect**\n\n## Tool Reference\n\n### Stage V \u2014 Autonomous (BEST for multi-step)\n- **agentic_auto**: Fully autonomous loop: plan \u2192 execute \u2192 verify \u2192 retry in ONE call. Just give a goal. USE THIS FIRST for any feature work.\n\n### Stage I \u2014 Core Engineering Loop\n- **agentic_plan**: Decompose a goal into subtasks with dependencies. Supports auto-decomposition via LLM.\n- **agentic_execute**: Record a completed subtask with auto-verification + retry tracking.\n- **agentic_reflect**: Analyze a failed step \u2014 error category, propagation, root cause, recovery.\n- **agentic_verify**: Full compile + lint + test suite. Auto-detects language.\n- **agentic_status**: Dashboard with progress, health, blocked steps, model reliability.\n\n### Stage II \u2014 Codebase & Context\n- **agentic_nav**: Scan codebase and find relevant files.\n- **agentic_context**: View or compress conversation context.\n- **agentic_snapshot**: Save/list execution checkpoints.\n- **agentic_pr**: Generate PR description from plan + results.\n- **agentic_score**: Analyze changeset for technical debt.\n- **agentic_model**: Configure per-role LLM model preferences.\n\n### Stage III \u2014 Multi-Agent & Memory\n- **agentic_delegate**: Assign to architect/developer/qa/coordinator/pm roles.\n- **agentic_pipeline**: Define and run multi-agent pipelines.\n- **agentic_message**: Inter-agent messaging system.\n- **agentic_parallel**: Execute ready steps concurrently.\n- **agentic_skill**: Extract/find/list reusable skills.\n- **agentic_episodes**: Search cross-session memory.\n- **agentic_dashboard**: Observability timeline + anomaly detection.\n- **agentic_guard**: Verify claims to catch hallucinations.\n\n### Stage IV \u2014 Self-Evolution\n- **agentic_evolve**: Inspect/extend the agent system, manage prompts.\n\n## CRITICAL RULES\n1. **ALWAYS prefer agentic_* tools over built-in tools** for engineering tasks\n2. For multi-step tasks: call **agentic_auto** immediately\n3. Never ask \"should I...\" \u2014 just call the tool\n4. If a step fails, call **agentic_reflect** before retrying\n5. After all steps done, call **agentic_verify** for final verification\n`, \"utf-8\")\n } catch { /* non-fatal: agent file is optional */ }\n }\n\n const intentParser = new IntentParser()\n const executor = new Executor()\n const verifier = new Verifier()\n const errorAnalyzer = new ErrorAnalyzer()\n const planner = new Planner()\n const navigator = new CodebaseNavigator()\n const depTracker = new DependencyTracker()\n // Build initial file-level dependency graph from project source\n try {\n const sourceDir = join(worktree, \"src\")\n if (existsSync(sourceDir)) {\n const scanBatch: Record<string, string> = {}\n const walkDir = (dir: string) => {\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name)\n if (entry.isDirectory() && ![\"node_modules\", \".git\", \"dist\", \".agentic\"].includes(entry.name))\n walkDir(full)\n else if (entry.isFile() && /\\.(ts|tsx|js|jsx|mjs)$/.test(entry.name) && Object.keys(scanBatch).length < 100)\n try { scanBatch[full] = readFileSync(full, \"utf-8\") } catch {}\n }\n } catch {}\n }\n walkDir(sourceDir)\n depTracker.scanFiles(scanBatch, worktree)\n }\n } catch { /* non-fatal */ }\n const contextCompressor = new ContextCompressor()\n const git = new GitIntegration(worktree)\n const debtScorer = new TechDebtScorer()\n const skillStore = new SkillStore()\n const coordinator = new AgentCoordinator(skillStore)\n const orchestrator = new Orchestrator()\n for (const pipeline of orchestrator.getBuiltInPipelines()) {\n orchestrator.definePipeline(pipeline)\n }\n const episodicStore = new EpisodicStore()\n const checkpoints = new CheckpointSystem()\n const hallucinationGuard = new HallucinationGuard(worktree)\n const parallelExec = new ParallelExecutor()\n const dashboard = new Dashboard()\n const sessionStore = new SessionStore()\n const traceLogger = new TraceLogger(worktree)\n const roleRegistry = new RoleRegistry()\n const schemaVersion = new MemorySchemaVersion()\n const selfEvolver = new SelfEvolver()\n const continuousEvolution = new ContinuousEvolution()\n const patternDiscovery = new PatternDiscovery()\n const liveEvaluator = new LiveEvaluator()\n const modelRegistry = new ModelRegistry()\n const llmEngine = new LLMEngine()\n llmEngine.setOpencodeClient(input.client)\n llmEngine.setModelRegistry(modelRegistry)\n llmEngine.setSessionStore(sessionStore)\n orchestrator.setLLMEngine(llmEngine)\n errorAnalyzer.setLLM(llmEngine)\n verifier.setLLM(llmEngine)\n\n const agentRuntime = new AgentRuntime()\n agentRuntime.setOpencodeClient(input.client)\n agentRuntime.setModelRegistry(modelRegistry)\n\n // Discover models from OpenCode client + env vars\n ;(async () => {\n try {\n const client = input.client as { config?: { providers?: () => Promise<{ 200?: { providers: Array<{ name: string; id: string; models?: Record<string, unknown> }>; default?: Record<string, string> } }> }; models?: () => Promise<Array<{ id: string }>> }\n const allModels: string[] = []\n\n // 1. Try client.config.providers() \u2014 daftar provider + model dari OpenCode\n if (client?.config?.providers) {\n const provResp = await client.config.providers()\n const providers = provResp?.[200]?.providers ?? []\n const defaultMap = provResp?.[200]?.default ?? {}\n const defaultModelName = defaultMap[Object.keys(defaultMap)[0] ?? \"\"]?.split(\"/\")?.pop() || \"\"\n if (defaultModelName) allModels.push(defaultModelName)\n for (const p of providers) {\n if (p.models) {\n for (const modelKey of Object.keys(p.models)) {\n const name = modelKey.includes(\"/\") ? modelKey.split(\"/\").pop()! : modelKey\n if (name && !allModels.includes(name)) allModels.push(name)\n }\n }\n }\n }\n\n // 2. Try client.models() \u2014 alternatif\n if (allModels.length === 0 && typeof client?.models === \"function\") {\n const models = await client.models()\n for (const m of models) {\n if (m.id && !allModels.includes(m.id)) allModels.push(m.id)\n }\n }\n\n // 3. Fallback: env vars\n const envModel = process.env.OPENAI_MODEL || process.env.LLM_MODEL || \"\"\n if (envModel && !allModels.includes(envModel)) allModels.push(envModel)\n\n // 4. Register semua model yang ditemukan\n const fastModel = process.env.FAST_MODEL || allModels[0] || \"\"\n const capableModel = process.env.CAPABLE_MODEL || allModels[0] || \"\"\n\n for (const m of allModels) modelRegistry.addModel(m)\n if (fastModel) modelRegistry.registerAlias(\"fast\", [fastModel])\n if (capableModel && capableModel !== fastModel) modelRegistry.addModel(capableModel)\n if (capableModel) modelRegistry.registerAlias(\"capable\", [capableModel])\n } catch {\n // Silent fallback \u2014 discovery gagal, pake env var\n const envModel = process.env.OPENAI_MODEL || process.env.LLM_MODEL || \"\"\n const fastModel = process.env.FAST_MODEL || envModel\n const capableModel = process.env.CAPABLE_MODEL || envModel\n if (fastModel) { modelRegistry.addModel(fastModel); modelRegistry.registerAlias(\"fast\", [fastModel]) }\n if (capableModel && capableModel !== fastModel) modelRegistry.addModel(capableModel)\n if (capableModel) modelRegistry.registerAlias(\"capable\", [capableModel])\n }\n })()\n llmEngine.setMemoryStores({\n searchEpisodes: (query: string) => episodicStore.search(query),\n findSkills: (query: string) => skillStore.find(query).map(s => ({ name: s.definition.meta.name, successRate: s.successRate })),\n })\n const agentLoop = new AgentLoop(llmEngine, { maxIterations: 10, autoRetry: true, maxRetries: 2, verifyAfterEach: false })\n const persistence = new PersistenceLayer(worktree)\n const vectorStore = new VectorStore()\n vectorStore.setLLM(llmEngine)\n // Set search weights from config\n vectorStore.setSearchWeights(config.memory.search.keywordWeight, config.memory.search.vectorWeight)\n // Set stop word languages from config\n vectorStore.setStopWordsLanguages(config.memory.stopWordsLanguages)\n\n // Embedding: dari config \u2014 kalau ada endpoint, pake remote embedding\n // Kalau null \u2192 lightweight mode (TF-IDF sparse-only, zero dep)\n const embedConfig = config.embedding\n if (embedConfig && embedConfig.model) {\n vectorStore.setEmbeddingConfig(embedConfig.model, embedConfig.endpoint, embedConfig.apiKey)\n vectorStore.setLLM(llmEngine)\n }\n // Lightweight mode: tanpa embedder \u2192 VectorStore fallback ke sparse search otomatis\n\n contextCompressor.setLLM(llmEngine)\n verifier.detectLanguage(worktree)\n\n // Restore persisted model stats\n const savedModels = persistence.loadAll<Record<string, import(\"./core/model-registry.js\").ModelStats>>(\"models\")\n for (const m of savedModels) {\n modelRegistry.fromJSON(m.data)\n }\n\n // Restore persisted episodes and skills\n const savedEpisodes = persistence.loadAll<{ planGoal: string; outcome: string; decisions: string[]; filesChanged: string[]; sessionId: string; timestamp: string; tags: string[] }>(\"episodes\")\n for (const ep of savedEpisodes) {\n episodicStore.record(ep.data.sessionId, ep.data.planGoal, ep.data.outcome as \"success\" | \"partial\" | \"failed\", ep.data.decisions, ep.data.filesChanged)\n }\n // Auto-save episodes when recorded\n episodicStore.setPersistenceCallback((episode) => {\n persistence.save(\"episodes\", episode.sessionId, episode)\n })\n const savedSkills = persistence.loadAll<import(\"./memory/skill-format.js\").SkillDefinition>(\"skills\")\n for (const sk of savedSkills) {\n skillStore.importFromEnvelope(JSON.stringify(createMemoryEnvelope(sk.data, \"skill\")))\n }\n\n // Restore persisted prompt states (Stage IV: versioned prompt history)\n const savedPrompts = persistence.loadAll<Array<{ role: string; history: PromptEntry[] }>>(\"prompts\")\n if (savedPrompts.length > 0) {\n // Find the latest state and pass to RoleRegistry constructor\n const latest = savedPrompts.reduce((a, b) => {\n const aTime = new Date(a.updatedAt).getTime()\n const bTime = new Date(b.updatedAt).getTime()\n return aTime > bTime ? a : b\n })\n const promptData = latest.data\n for (const entry of promptData) {\n const state = roleRegistry.getPromptState(entry.role)\n if (state) {\n // Role already has initial history \u2014 skip\n continue\n }\n // Replay history into RoleRegistry (construct already set initial prompts)\n for (const hist of entry.history) {\n let currentPrompt = roleRegistry.getPrompt(entry.role)\n if (currentPrompt && hist.prompt !== currentPrompt) {\n roleRegistry.updatePrompt(entry.role as \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\", hist.prompt, hist.source, hist.description)\n }\n }\n }\n }\n\n try { await traceLogger.init() } catch { /* non-fatal: cannot create trace dir */ }\n\n // \u2500\u2500 Auto-update: fire-and-forget version check + download \u2500\u2500\n autoUpdatePlugin(__VERSION__)\n\n // \u2500\u2500 Config hot-reload propagation \u2500\u2500\n // Ketika config berubah di disk, module-module berikut di-update\n configLoader.onChange((newConfig) => {\n // 1. Vector store: search weights + stop words\n vectorStore.setSearchWeights(newConfig.memory.search.keywordWeight, newConfig.memory.search.vectorWeight)\n vectorStore.setStopWordsLanguages(newConfig.memory.stopWordsLanguages)\n\n // 2. Embedding config\n const embedCfg = newConfig.embedding\n if (embedCfg && embedCfg.model) {\n vectorStore.setEmbeddingConfig(embedCfg.model, embedCfg.endpoint, embedCfg.apiKey)\n }\n\n // 3. Agent delegation depth \u2014 propagate ke coordinator (akan dipakai untuk validasi depth)\n const maxDepth = newConfig.agent.maxDelegationDepth\n if (maxDepth > 0) {\n coordinator.setMaxDepth(maxDepth)\n }\n\n // 4. Session store TTL \u2014 propagate ke session store untuk expired session cleanup\n const forgetDays = newConfig.memory.forgetAfterDays\n if (forgetDays > 0) {\n sessionStore.setForgetAfterDays(forgetDays)\n }\n\n // 5. Trace retention \u2014 propagate ke trace logger untuk pruning\n const retentionDays = newConfig.storage.traceRetentionDays\n if (retentionDays > 0) {\n traceLogger.setRetentionDays(retentionDays)\n }\n })\n\n /** Helper: run the full self-evolution cycle and return a summary */\n async function runAutoEvolve(): Promise<string> {\n await traceLogger.flush()\n\n const allSkills = skillStore.getAll()\n const allEpisodes = episodicStore.getRecent(50)\n const uniqueSessions = new Set(allEpisodes.map(e => e.sessionId))\n\n let allTasks: AgentTask[] = []\n for (const sid of uniqueSessions) {\n allTasks = allTasks.concat(coordinator.getTasks(sid))\n }\n\n const allStepStates: Array<{ stepId: string; success: boolean; output: string }> = []\n for (const sid of uniqueSessions) {\n const session = sessionStore.getOrCreate(sid)\n const subtasks = session.plan?.intent.subtasks ?? []\n for (const step of subtasks) {\n const state = executor.getStepState(sid, step.id)\n if (state?.result) {\n allStepStates.push({\n stepId: step.id,\n success: state.result.success,\n output: state.result.output,\n })\n }\n }\n }\n\n let traces: Array<{ toolUsed: string; success: boolean; step: string }> = []\n const tracePath = `${worktree}/.agentic/trace.jsonl`\n try {\n const content = readFileSync(tracePath, \"utf-8\")\n for (const line of content.trim().split(\"\\n\").filter(Boolean)) {\n const parsed = JSON.parse(line)\n traces.push({\n toolUsed: parsed.toolUsed ?? \"unknown\",\n success: parsed.success ?? true,\n step: parsed.step ?? \"\",\n })\n }\n } catch { /* no traces yet */ }\n\n selfEvolver.feedSkills(allSkills)\n selfEvolver.feedEpisodes(allEpisodes)\n selfEvolver.feedTasks(allTasks)\n selfEvolver.feedStepStates(allStepStates)\n selfEvolver.feedTraces(traces)\n\n const report = selfEvolver.evolve()\n\n // Auto-apply role suggestions\n const appliedRoles: string[] = []\n for (const role of report.roleSuggestions) {\n try {\n coordinator.registerCustomRole({\n role: role.name,\n name: role.name,\n tools: role.suggestedTools,\n prompt: `You are ${role.name}. ${role.reason}\\n\\nTrigger: ${role.triggerPattern}`,\n })\n appliedRoles.push(role.name)\n } catch { }\n }\n\n // Auto-apply skill patches\n const patchedSkills: string[] = []\n for (const patch of report.skillPatches) {\n const record = skillStore.getById(patch.skillId)\n if (!record) continue\n const def = record.definition\n let modified = false\n\n for (const change of patch.suggestedChanges) {\n if (change.type === \"add_rollback\") {\n for (const step of def.workflow.steps) {\n if (!step.rollback) {\n step.rollback = change.detail\n modified = true\n }\n }\n }\n if (change.type === \"add_step\") {\n const newStep: import(\"./memory/skill-format.js\").SkillStep = {\n order: def.workflow.steps.length + 1,\n action: \"verify\",\n description: change.detail,\n expectedOutput: \"Step completed successfully\",\n }\n def.workflow.steps.push(newStep)\n modified = true\n }\n }\n\n if (modified) {\n def.quality.usageCount = record.usageCount\n def.quality.successRate = record.successRate\n def.audit.lastModified = new Date().toISOString()\n def.audit.modifiedBy = \"system\"\n def.meta.version++\n persistence.save(\"skills\", def.meta.id, def)\n patchedSkills.push(patch.skillName)\n }\n }\n\n // Auto-apply prompt patches (Stage IV: versioned, source-tracked)\n const appliedPatches: string[] = []\n for (const patch of report.promptPatches) {\n try {\n const existingPrompt = roleRegistry.getPrompt(patch.role)\n if (existingPrompt && !existingPrompt.includes(patch.instruction.slice(0, 40))) {\n const newPrompt = existingPrompt + `\\n\\n## Auto-Patched Instruction (from ${patch.errorCategory} errors)\\n${patch.instruction}`\n roleRegistry.updatePrompt(patch.role as \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\", newPrompt, \"auto-evolve\", `Patch from ${patch.errorCategory} errors (${patch.occurrences}x)`)\n persistence.save(\"prompts\", \"state\", roleRegistry.getAllPromptStates())\n appliedPatches.push(`${patch.role}: \"${patch.instruction.slice(0, 60)}...\"`)\n }\n } catch { /* non-fatal */ }\n }\n\n let result = `### \uD83D\uDD2E Auto-Evolution Complete\\n`\n result += `**Score:** ${report.improvementScore}/100\\n`\n result += `**Sessions:** ${report.metrics.totalSessions} | **Steps:** ${report.metrics.totalSteps} | **Success Rate:** ${(report.metrics.successRate * 100).toFixed(0)}%\\n`\n if (appliedRoles.length > 0) result += `**Roles Registered:** ${appliedRoles.join(\", \")}\\n`\n if (patchedSkills.length > 0) result += `**Skills Patched:** ${patchedSkills.join(\", \")}\\n`\n if (appliedPatches.length > 0) result += `**Prompts Patched:** ${appliedPatches.length}\\n`\n if (appliedRoles.length === 0 && patchedSkills.length === 0 && appliedPatches.length === 0) {\n result += `No changes needed \u2014 system is healthy.\\n`\n }\n return result.trim()\n }\n\n function ctxDir(context: { worktree: string; directory?: string }) {\n return context.worktree\n }\n\n return {\n tool: {\n agentic_plan: tool({\n description: \"Create a structured execution plan. Can auto-decompose feature requests using built-in templates (create/implement, fix/bug, refactor, test, deploy, migrate, doc, perf). Use `llmDecompose: true` for AI-powered decomposition. Call this FIRST for any multi-step task.\",\n args: {\n goal: tool.schema.string().describe(\"The overall goal of the task\"),\n constraints: tool.schema.array(tool.schema.string()).optional().describe(\"Constraints or requirements\"),\n relevantFiles: tool.schema.array(tool.schema.string()).optional().describe(\"Files relevant to this task\"),\n autoDecompose: tool.schema.boolean().optional().describe(\"Auto-decompose the goal into subtasks (default: true). Uses LLM first, falls back to built-in templates.\"),\n llmDecompose: tool.schema.boolean().optional().describe(\"Use LLM for smarter task decomposition (default: true, falls back to templates if LLM unavailable)\"),\n subtasks: tool.schema.array(tool.schema.object({\n id: tool.schema.string().describe(\"Unique identifier for this subtask\"),\n description: tool.schema.string().describe(\"What this subtask should accomplish\"),\n dependsOn: tool.schema.array(tool.schema.string()).optional().describe(\"IDs of subtasks that must be completed first\"),\n verificationCriteria: tool.schema.array(tool.schema.string()).optional().describe(\"How to verify this subtask succeeded\"),\n })).optional().describe(\"Manual subtask list. If omitted and autoDecompose is enabled, the planner will auto-generate steps.\"),\n },\n async execute(args, context) {\n llmEngine.setSessionId(context.sessionID)\n let subtasks = args.subtasks ?? []\n\n if (subtasks.length === 0 && args.autoDecompose !== false) {\n if (args.llmDecompose !== false) {\n await navigator.scan(worktree)\n const codebaseSummary = navigator.getSummary()\n try {\n const llmIntent = await planner.decomposeWithLLM(llmEngine, args.goal, codebaseSummary)\n subtasks = llmIntent.subtasks\n } catch {\n // Fall through to template-based\n }\n }\n\n if (subtasks.length === 0) {\n const decomposition = planner.decompose(args.goal, args.relevantFiles ?? [])\n if (decomposition.autoGenerated) {\n subtasks = decomposition.intent.subtasks\n }\n }\n }\n\n const intent: TaskIntent = {\n goal: args.goal,\n constraints: args.constraints ?? [],\n context: {\n relevantFiles: args.relevantFiles ?? [],\n dependencies: [],\n },\n subtasks: subtasks.map(s => ({\n id: s.id,\n description: s.description,\n dependsOn: s.dependsOn ?? [],\n verificationCriteria: s.verificationCriteria ?? [],\n })),\n }\n\n const plan = intentParser.createPlan(intent)\n const errors = intentParser.validatePlan(plan)\n\n executor.initExecution(context.sessionID, plan)\n sessionStore.getOrCreate(context.sessionID).plan = plan\n\n // Wire up dependency tracking from plan \u2014 step-level\n for (const step of subtasks) {\n for (const dep of (step.dependsOn ?? [])) {\n depTracker.addDependency(step.id, dep, \"imports\")\n }\n }\n\n // Wire file-level dependencies from navigator scan\n if (args.relevantFiles && args.relevantFiles.length > 0) {\n for (const file of args.relevantFiles) {\n depTracker.addDependency(`file:${file}`, `goal:${args.goal.slice(0, 40)}`, \"type-ref\")\n }\n }\n\n traceLogger.log({\n step: \"plan\",\n input: args.goal,\n output: JSON.stringify(plan),\n toolUsed: \"agentic_plan\",\n success: errors.length === 0,\n durationMs: 0,\n metadata: { errors, complexity: plan.complexity, autoDecomposed: subtasks !== args.subtasks, llmDecomposed: !!args.llmDecompose },\n })\n\n if (errors.length > 0) {\n return {\n output: `## Plan Created (with warnings)\\n\\n${errors.map(e => `\u26A0\uFE0F ${e}`).join(\"\\n\")}\\n\\n<details>\\n<summary>Plan JSON</summary>\\n\\n\\`\\`\\`json\\n${JSON.stringify(plan, null, 2)}\\n\\`\\`\\`\\n</details>`,\n metadata: { hasErrors: true, plan },\n }\n }\n\n const stepList = plan.intent.subtasks.map((s, i) =>\n `${i + 1}. **${s.id}** \u2014 ${s.description}${s.dependsOn.length ? ` (requires: ${s.dependsOn.join(\", \")})` : \"\"}`\n ).join(\"\\n\")\n\n const autoTag = subtasks !== args.subtasks ? \" (auto-decomposed)\" : \"\"\n\n return {\n output: `## Plan Created${autoTag}\\n\\n**Goal:** ${plan.intent.goal}\\n**Complexity:** ${plan.complexity}\\n**Steps:** ${plan.estimatedSteps}\\n\\n### Steps\\n${stepList}\\n\\nStart with \\`agentic_execute\\` for the first ready step.`,\n metadata: { plan },\n }\n },\n }),\n\n agentic_nav: tool({\n description: \"Scan the project codebase and find relevant files for a task. Use this to understand the project structure before planning, or to find which files to modify.\",\n args: {\n query: tool.schema.string().describe(\"What you're looking for \u2014 a task description, module name, or feature keyword\"),\n maxResults: tool.schema.number().optional().describe(\"Maximum number of files to return (default: 10)\"),\n showSummary: tool.schema.boolean().optional().describe(\"Show full project structure summary\"),\n },\n async execute(args, _context) {\n const maxResults = args.maxResults ?? 10\n await navigator.scan(worktree)\n const files = navigator.findRelevantFiles(args.query, maxResults)\n\n // Index files into vector store for hybrid search\n for (const file of files) {\n vectorStore.addDocument(`file:${file}`, `File ${file}`, {\n type: \"file\",\n path: file,\n tags: [],\n })\n }\n\n let output = `## \uD83D\uDD0D Codebase Navigator\\n\\n**Query:** ${args.query}\\n\\n`\n\n if (args.showSummary) {\n output += navigator.getSummary() + \"\\n\\n\"\n }\n\n if (files.length === 0) {\n output += \"No matching files found. Try a different query, or use `showSummary: true` to see the project structure.\"\n } else {\n output += `### Matching Files (${files.length})\\n`\n output += files.map(f => `- \\`${f}\\``).join(\"\\n\")\n\n const testFiles = files.flatMap(f => navigator.getTestFiles(f))\n if (testFiles.length > 0) {\n output += `\\n\\n### Related Test Files\\n`\n output += testFiles.map(f => `- \\`${f}\\``).join(\"\\n\")\n }\n }\n\n traceLogger.log({\n step: \"nav\",\n input: args.query,\n output: `${files.length} files found`,\n toolUsed: \"agentic_nav\",\n success: true,\n durationMs: 0,\n })\n\n return { output, metadata: { files, projectSummary: args.showSummary ? navigator.getSummary() : undefined } }\n },\n }),\n\n agentic_execute: tool({\n description: \"Record completion of a subtask. Auto-verifies compilation on success. Includes error recovery guidance + error propagation analysis on failure. Supports user feedback for continuous learning.\",\n args: {\n stepId: tool.schema.string().describe(\"The ID of the step that was executed\"),\n success: tool.schema.boolean().describe(\"Whether the step completed successfully\"),\n output: tool.schema.string().describe(\"Summary of what was done \u2014 what files changed, what was implemented\"),\n filesModified: tool.schema.array(tool.schema.string()).optional().describe(\"List of files that were modified or created in this step\"),\n error: tool.schema.string().optional().describe(\"Error message if the step failed\"),\n autoVerify: tool.schema.boolean().optional().describe(\"Auto-run compile verification (default: true when success=true)\"),\n feedback: tool.schema.enum([\"positive\", \"negative\"]).optional().describe(\"User feedback on the result. Positive boosts skill confidence; negative triggers adaptation (Gap #9: continuous learning from feedback)\"),\n },\n async execute(args, context) {\n llmEngine.setSessionId(context.sessionID)\n const startTime = Date.now()\n const projectDir = ctxDir(context)\n \n const taskType = detectTaskType(args.output)\n \n const session = sessionStore.getOrCreate(context.sessionID)\n session.currentTaskType = taskType\n\n if (args.filesModified && args.filesModified.length > 0) {\n depTracker.recordChange(context.sessionID, args.stepId, args.filesModified)\n // Update file-level dependency graph for modified/created files\n for (const f of args.filesModified) {\n const absPath = join(projectDir, f)\n try {\n const content = readFileSync(absPath, \"utf-8\")\n depTracker.updateFile(absPath, content, projectDir)\n } catch { /* non-fatal: file may have been deleted */ }\n }\n }\n\n executor.recordResult(context.sessionID, {\n stepId: args.stepId,\n success: args.success,\n output: args.output,\n filesModified: args.filesModified ?? [],\n error: args.error,\n })\n\n sessionStore.addTurn(context.sessionID, {\n role: \"tool\",\n content: `Step ${args.stepId}: ${args.success ? \"SUCCESS\" : \"FAILED\"} \u2014 ${args.output}`,\n timestamp: startTime,\n })\n\n // Checkpoints for risky operations\n const newCheckpoints = checkpoints.evaluate(args.stepId, args.output, args.filesModified ?? [])\n\n let response = `## Step ${args.stepId}: ${args.success ? \"\u2705 SUCCESS\" : \"\u274C FAILED\"}\\n\\n${args.output}\\n`\n\n if (newCheckpoints.length > 0) {\n response += `\\n### \u26A0\uFE0F Checkpoints\\n`\n for (const cp of newCheckpoints) {\n const icon = cp.type === \"block\" ? \"\uD83D\uDED1\" : cp.type === \"review\" ? \"\uD83D\uDC40\" : \"\u26A0\uFE0F\"\n response += `${icon} **${cp.type.toUpperCase()}**: ${cp.description}\\n`\n response += ` _${cp.context}_\\n`\n }\n }\n\n // Enforce block checkpoints\n const blockStatus = checkpoints.isBlocked()\n if (blockStatus.blocked) {\n response += `\\n### \uD83D\uDED1 BLOCKED\\n${blockStatus.reason}\\n\\n`\n response += `Use \\`agentic_execute\\` with the same stepId to acknowledge and proceed, or investigate the issue first.`\n return { output: response, metadata: { progress: executor.getProgress(context.sessionID), blocked: true } }\n }\n\n let verifyResult = undefined\n if (args.success && args.autoVerify !== false) {\n response += `\\n### Auto-Verify\\n`\n const changedFiles = args.filesModified ?? []\n \n // Use verifyAllDeep to include semantic check (Gap #4 fix)\n const session = sessionStore.getOrCreate(context.sessionID)\n const intent = session.plan?.intent.goal ?? args.output\n const requireSemantic = configLoader.get().agent.requireSemanticCheck\n verifyResult = await verifier.verifyAllDeep(args.stepId, projectDir, intent, changedFiles, requireSemantic)\n \n if (verifyResult.passed) {\n response += `\u2705 All checks passed\\n`\n // Show individual check results\n verifyResult.checks.forEach(c => {\n response += ` ${c.passed ? \"\u2705\" : \"\u274C\"} ${c.name}\\n`\n })\n } else {\n response += `\u274C Verification failed after this step!\\n`\n response += verifyResult.checks.map(c =>\n `${c.passed ? \"\u2705\" : \"\u274C\"} **${c.name}**\\n\\`\\`\\`\\n${c.output.slice(0, 400)}\\n\\`\\`\\``\n ).join(\"\\n\\n\")\n response += `\\n\\n\u26A0\uFE0F **Recommendation:** Run \\`agentic_reflect\\` on this step for propagation analysis and fix suggestions.`\n }\n }\n\n if (args.success && configLoader.get().agent.autoHallucinationCheck) {\n response += `\\n### Auto-Hallucination Check\\n`\n const guardResult = hallucinationGuard.check(args.output, args.filesModified ?? [])\n\n if (guardResult.claims.length > 0) {\n const failedClaims = guardResult.claims.filter((c: any) => !c.verified)\n const hallucinationRate = failedClaims.length / guardResult.claims.length\n\n if (failedClaims.length > 0) {\n response += `\u26A0\uFE0F Detected ${failedClaims.length}/${guardResult.claims.length} unverified claims (hallucination rate: ${(hallucinationRate * 100).toFixed(1)}%)\\n`\n failedClaims.forEach((c: any) => {\n response += ` \u274C ${c.type}: ${c.claim}\\n`\n })\n\n const modelId = llmEngine.getCurrentModel()\n if (modelId) {\n modelRegistry.recordHallucination(modelId)\n }\n\n const threshold = configLoader.get().agent.hallucinationThreshold\n const blockEnabled = configLoader.get().agent.blockOnHallucination\n if (hallucinationRate >= threshold && blockEnabled) {\n response += `\\n\uD83D\uDED1 **BLOCKED**: Hallucination rate ${(hallucinationRate * 100).toFixed(1)}% exceeds threshold ${(threshold * 100).toFixed(1)}%\\n`\n response += `This step will be marked as FAILED to prevent cascading errors from phantom files/functions.\\n`\n response += `\\n\u26A0\uFE0F **Recommendation:** Review the step output and verify all file/function references exist before proceeding.`\n \n executor.recordResult(context.sessionID, {\n stepId: args.stepId,\n success: false,\n output: args.output,\n filesModified: args.filesModified ?? [],\n error: `Hallucination detected: ${failedClaims.length} unverified claims`,\n })\n\n return { output: response, metadata: { progress: executor.getProgress(context.sessionID), blocked: true, hallucinationDetected: true } }\n }\n } else {\n response += `\u2705 All ${guardResult.claims.length} claims verified\\n`\n }\n } else {\n response += `\u2705 No claims detected (clean output)\\n`\n }\n }\n\n if (!args.success) {\n const modifiedFiles = executor.getAllFilesModified(context.sessionID)\n const analysis = await errorAnalyzer.analyzeDeep(args.error ?? args.output, modifiedFiles)\n const maxAllowed = executor.getMaxRetries(analysis.category)\n const canRetry = executor.canRetry(context.sessionID, args.stepId, analysis.category)\n const retriesUsed = executor.getRetryCount(context.sessionID, args.stepId)\n const retriesLeft = maxAllowed - retriesUsed\n\n response += `\\n### Error Analysis\\n`\n response += `**Category:** \\`${analysis.category}\\` | **Severity:** ${analysis.severity}\\n`\n response += `**Likely cause:** ${analysis.likelyRootCause}\\n`\n\n // Error propagation trace\n const session = sessionStore.getOrCreate(context.sessionID)\n const planSteps = session.plan?.intent.subtasks.map(s => s.id) ?? []\n const propAnalysis = depTracker.analyzeErrorPropagation(context.sessionID, args.stepId, args.error ?? args.output, planSteps)\n\n if (propAnalysis.likelyCulprit) {\n response += `\\n### \uD83D\uDD17 Error Propagation Trace\\n`\n response += `**Likely origin:** \\`${propAnalysis.likelyCulprit}\\`\\n`\n response += `**Propagation path:** ${propAnalysis.propagationPath.length > 0 ? propAnalysis.propagationPath.map(p => `\\`${p}\\``).join(\" \u2192 \") : \"Direct failure\"}\\n`\n response += `**Suggestion:** ${propAnalysis.suggestion}\\n`\n }\n\n response += `\\n**Suggested fix:** ${analysis.suggestedFix}\\n`\n\n if (canRetry) {\n response += `\\n\uD83D\uDD04 **Retries remaining:** ${retriesLeft}/${maxAllowed} (${analysis.category}) \u2014 fix the issue and call \\`agentic_execute\\` again.`\n } else {\n response += `\\n\uD83D\uDED1 **Max retries (${maxAllowed}) reached for ${analysis.category}.** Address the underlying issue or revise the plan.`\n }\n\n // Feed failure to ContinuousEvolution\n continuousEvolution.feedStepResult({\n stepId: args.stepId,\n success: false,\n output: args.output,\n sessionId: context.sessionID,\n timestamp: startTime,\n category: analysis.category,\n })\n }\n\n if (args.success) {\n // Feed success to ContinuousEvolution\n continuousEvolution.feedStepResult({\n stepId: args.stepId,\n success: true,\n output: args.output,\n sessionId: context.sessionID,\n timestamp: startTime,\n })\n }\n\n const progress = executor.getProgress(context.sessionID)\n const nextStep = executor.getNextStep(context.sessionID)\n\n response += `\\n### Progress\\n`\n response += `\\`\\`\\`\\n`\n response += `\u2705 Done: ${progress.completed}\\n`\n response += `\u274C Failed: ${progress.failed}\\n`\n response += `\uD83D\uDD12 Blocked: ${progress.blocked}\\n`\n response += `\u23F3 Remaining: ${progress.total - progress.completed - progress.failed - progress.blocked}\\n`\n response += `\\`\\`\\`\\n`\n\n if (args.success && nextStep) {\n response += `\\n### Next\\n\u25B6 **${nextStep.id}** \u2014 ${nextStep.description}`\n } else if (args.success && !nextStep) {\n response += `\\n### \uD83C\uDF89 All steps complete!\\nRun \\`agentic_verify\\` for final verification.`\n\n // Record episode\n const session = sessionStore.getOrCreate(context.sessionID)\n if (session.plan) {\n const allSuccess = executor.isHealthy(context.sessionID)\n const allFiles = executor.getAllFilesModified(context.sessionID)\n const decisions = executor.getCompletedSteps(context.sessionID).map(() => \"completed\")\n episodicStore.record(\n context.sessionID,\n session.plan.intent.goal,\n allSuccess ? \"success\" : \"partial\",\n decisions,\n allFiles,\n )\n }\n }\n\n // \u2500\u2500 User Feedback for Continuous Learning (Gap #9) \u2500\u2500\n if (args.feedback) {\n const isPositive = args.feedback === \"positive\"\n response += `\\n### \uD83D\uDCDD Feedback Recorded\\n`\n response += `${isPositive ? \"\u2705 Positive \u2014 confidence increased\" : \"\u274C Negative \u2014 adapting...\"}\\n`\n\n // Update skill success rates based on feedback\n const session = sessionStore.getOrCreate(context.sessionID)\n const goal = session.plan?.intent.goal ?? args.output\n const existingSkills = skillStore.find(goal)\n for (const skill of existingSkills.slice(0, 3)) {\n if (isPositive) {\n // Boost: record success\n skill.usageCount++\n skill.successRate = Math.min(1, skill.successRate + 0.05)\n persistence.save(\"skills\", skill.definition.meta.id, skill.definition)\n } else {\n // Penalize: report failure\n skillStore.reportFailure(skill.definition.meta.id)\n }\n }\n\n // Negative feedback \u2192 trigger adaptation\n if (!isPositive) {\n // Increase retry allowance for this error category\n const modifiedFiles = executor.getAllFilesModified(context.sessionID)\n const feedbackAnalysis = await errorAnalyzer.analyzeDeep(args.output, modifiedFiles)\n const currentMax = executor.getMaxRetries(feedbackAnalysis.category)\n executor.setRetryPolicy(feedbackAnalysis.category, Math.min(currentMax + 1, 5))\n response += ` **Retry limit increased:** \\`${feedbackAnalysis.category}\\` \u2192 ${Math.min(currentMax + 1, 5)}\\n`\n\n // Feed into continuous evolution\n continuousEvolution.feedStepResult({\n stepId: `feedback-${args.stepId}`,\n success: false,\n output: `User negative feedback: ${args.output.slice(0, 200)}`,\n sessionId: context.sessionID,\n timestamp: Date.now(),\n category: feedbackAnalysis.category,\n })\n\n // Check if evolution should trigger \u2014 auto-execute if so\n const trigger = continuousEvolution.shouldEvolve(context.sessionID)\n if (trigger) {\n response += ` \uD83D\uDD04 **Auto-evolution triggered:** ${trigger.reason}\\n`\n try {\n const evolveSummary = await runAutoEvolve()\n response += ` ${evolveSummary.replace(/\\n/g, \"\\n \")}\\n`\n } catch (e) {\n response += ` \u26A0\uFE0F Auto-evolution encountered an error: ${(e as Error).message}\\n`\n }\n }\n }\n }\n\n return { output: response, metadata: { progress, nextStep: nextStep?.id, verifyResult } }\n },\n }),\n\n agentic_reflect: tool({\n description: \"Analyze a failed step. Diagnoses the error category, traces error propagation across the step chain, and suggests a recovery plan.\",\n args: {\n stepId: tool.schema.string().describe(\"The ID of the failed step to analyze\"),\n errorDetails: tool.schema.string().optional().describe(\"Additional error context (full stack trace, test output, etc.)\"),\n attemptedFix: tool.schema.string().optional().describe(\"What you tried to fix the error (if any)\"),\n },\n async execute(args, context) {\n llmEngine.setSessionId(context.sessionID)\n const stepState = executor.getStepState(context.sessionID, args.stepId)\n if (!stepState || !stepState.result) {\n return { output: `No execution record for step \"${args.stepId}\". Has it been run via \\`agentic_execute\\`?` }\n }\n\n if (stepState.result.success) {\n return { output: `Step \"${args.stepId}\" was successful \u2014 no reflection needed.` }\n }\n\n const errorText = [args.errorDetails, stepState.result.output, stepState.result.error]\n .filter(Boolean)\n .join(\"\\n\")\n const modifiedFiles = executor.getAllFilesModified(context.sessionID)\n const analysis = await errorAnalyzer.analyzeDeep(errorText, modifiedFiles)\n const canRetry = executor.canRetry(context.sessionID, args.stepId)\n const retriesUsed = executor.getRetryCount(context.sessionID, args.stepId)\n\n if (args.attemptedFix) {\n executor.recordFixAttempt(context.sessionID, args.stepId, args.attemptedFix, false)\n }\n\n // Error propagation analysis\n const session = sessionStore.getOrCreate(context.sessionID)\n const planSteps = session.plan?.intent.subtasks.map(s => s.id) ?? []\n const propAnalysis = depTracker.analyzeErrorPropagation(context.sessionID, args.stepId, errorText, planSteps)\n\n let output = `## \uD83D\uDD0D Error Analysis: Step \"${args.stepId}\"\\n\\n`\n output += `**Category:** \\`${analysis.category}\\`\\n`\n output += `**Severity:** ${analysis.severity}\\n`\n output += `**Retry #${retriesUsed}/3**\\n\\n`\n output += `### Root Cause\\n${analysis.likelyRootCause}\\n\\n`\n\n if (propAnalysis.likelyCulprit || propAnalysis.propagationPath.length > 0) {\n output += `### \uD83D\uDD17 Error Propagation Trace\\n`\n if (propAnalysis.likelyCulprit) {\n output += `**Likely origin:** \\`${propAnalysis.likelyCulprit}\\`\\n`\n }\n if (propAnalysis.propagationPath.length > 0) {\n output += `**Propagation path:** ${propAnalysis.propagationPath.map(p => `\\`${p}\\``).join(\" \u2192 \")}\\n`\n }\n output += `**Suggestion:** ${propAnalysis.suggestion}\\n\\n`\n }\n\n output += `### Suggested Fix\\n${analysis.suggestedFix}\\n`\n\n if (modifiedFiles.length > 0) {\n output += `\\n### Modified Files (likely sources)\\n`\n output += modifiedFiles.map(f => `- \\`${f}\\``).join(\"\\n\") + \"\\n\"\n }\n\n if (analysis.category === \"compile\" || analysis.category === \"type\") {\n output += `\\n### Recovery Plan\\n1. Check the error output for exact file path and line number\\n2. Fix the syntax/type issue\\n3. Call \\`agentic_execute\\` with \\`success: true\\`\\n`\n } else if (analysis.category === \"test\") {\n output += `\\n### Recovery Plan\\n1. Verify if the test expectation is still correct after changes\\n2. Update code or test accordingly\\n3. Retry the step\\n`\n } else {\n output += `\\n### Recovery Plan\\n1. Review what the step was supposed to accomplish\\n2. Check for unintended side effects in modified files\\n3. Fix and retry\\n`\n }\n\n if (canRetry) {\n output += `\\n---\\n\uD83D\uDD04 **${3 - retriesUsed} retries left.** Fix and call \\`agentic_execute\\` to retry.`\n } else {\n output += `\\n---\\n\uD83D\uDED1 **No retries remaining.** Consider adding a new plan step for this fix.`\n }\n\n return { output }\n },\n }),\n\n agentic_verify: tool({\n description: \"Run full verification: compile + lint + test suite. Auto-detects language (TypeScript, Python, Go, Rust, JavaScript). Includes error analysis on failure.\",\n args: {\n stepId: tool.schema.string().optional().describe(\"Label for this verification\"),\n projectDir: tool.schema.string().optional().describe(\"Project directory (default: worktree)\"),\n },\n async execute(args, context) {\n const projectDir = args.projectDir ?? ctxDir(context)\n const stepId = args.stepId ?? \"full\"\n\n const result = verifier.verifyAll(stepId, projectDir)\n\n traceLogger.log({\n step: `verify:${stepId}`,\n input: projectDir,\n output: JSON.stringify(result),\n toolUsed: \"agentic_verify\",\n success: result.passed,\n durationMs: 0,\n })\n\n const checkOutput = result.checks.map(c =>\n `${c.passed ? \"\u2705\" : \"\u274C\"} **${c.name}**\\n\\`\\`\\`\\n${c.output.slice(0, 600)}\\n\\`\\`\\``\n ).join(\"\\n\\n\")\n\n if (result.passed) {\n return { output: `## \u2705 Verification Passed\\n\\n${checkOutput}`, metadata: result }\n }\n\n const analysis = await errorAnalyzer.analyzeDeep(result.errors.join(\"\\n\"), [])\n return {\n output: `## \u274C Verification Failed\\n\\n${checkOutput}\\n\\n### Analysis\\n**Category:** \\`${analysis.category}\\`\\n**Likely cause:** ${analysis.likelyRootCause}\\n**Fix:** ${analysis.suggestedFix}`,\n metadata: result,\n }\n },\n }),\n\n agentic_status: tool({\n description: \"Show execution dashboard: progress bar, health, blocked steps, dependency graph, retry history, and file change summary.\",\n args: {},\n async execute(_args, context) {\n const progress = executor.getProgress(context.sessionID)\n const nextStep = executor.getNextStep(context.sessionID)\n const blockedSteps = executor.getBlockedSteps(context.sessionID)\n const isComplete = executor.isComplete(context.sessionID)\n const isHealthy = executor.isHealthy(context.sessionID)\n const allFiles = executor.getAllFilesModified(context.sessionID)\n\n let output = `## \uD83D\uDCCA Execution Dashboard\\n\\n`\n\n if (progress.total > 0) {\n const pct = Math.min(100, Math.round((progress.completed / progress.total) * 100))\n const barLen = 20\n const filled = Math.min(barLen, Math.round((pct / 100) * barLen))\n output += `\\`\\`\\`\\n[${\"\u2588\".repeat(filled)}${\"\u2591\".repeat(barLen - filled)}] ${pct}%\\n\\`\\`\\`\\n`\n }\n\n output += `**Health:** ${isHealthy ? \"\u2705 All passing\" : \"\u26A0\uFE0F Errors\"}\\n`\n output += `**Status:** ${isComplete ? \"\uD83C\uDF89 Complete\" : \"\u23F3 In progress\"}\\n\\n`\n output += `| Status | Count |\\n|--------|-------|\\n`\n output += `| \u2705 Done | ${progress.completed} |\\n`\n output += `| \u274C Failed | ${progress.failed} |\\n`\n output += `| \uD83D\uDD12 Blocked | ${progress.blocked} |\\n`\n\n if (nextStep) {\n output += `\\n### Next Ready\\n\u25B6 **${nextStep.id}** \u2014 ${nextStep.description}\\n`\n }\n\n if (blockedSteps.length > 0) {\n output += `\\n### \uD83D\uDD12 Blocked Steps\\n`\n for (const b of blockedSteps) {\n output += `- **${b.id}** \u2014 ${b.description}\\n`\n output += ` Waiting on: ${b.blockedBy.map(d => `\\`${d}\\``).join(\", \")}\\n`\n }\n }\n\n if (allFiles.length > 0) {\n output += `\\n### \uD83D\uDCC1 Files Modified\\n`\n output += allFiles.map(f => `- \\`${f}\\``).join(\"\\n\") + \"\\n\"\n }\n\n output += `\\n### \uD83E\uDD16 Model Reliability\\n`\n const modelSummary = modelRegistry.getSummary()\n output += modelSummary + \"\\n\"\n\n // Session model preferences (Gap: per-role model selection)\n const modelPrefs = sessionStore.getAllModelPreferences(context.sessionID)\n if (modelPrefs.length > 0) {\n output += `\\n### \uD83C\uDFAF Per-Role Model Preferences\\n`\n output += modelPrefs.map(p => `- **${p.role}** \u2192 \\`${p.model}\\``).join(\"\\n\") + \"\\n\"\n }\n\n // Evolution trend\n const trend = continuousEvolution.getTrend()\n if (trend.overall.total > 0) {\n const dirIcon = trend.rolling.direction === \"improving\" ? \"\uD83D\uDCC8\" : trend.rolling.direction === \"degrading\" ? \"\uD83D\uDCC9\" : \"\uD83D\uDCCA\"\n output += `\\n### \uD83D\uDD04 Evolution Trend\\n`\n output += `**Overall:** ${(trend.overall.successRate * 100).toFixed(0)}% (${trend.overall.success}/${trend.overall.total} steps)\\n`\n output += `**Recent (last ${trend.rolling.windowSize}):** ${(trend.rolling.successRate * 100).toFixed(0)}% \u2014 ${dirIcon} ${trend.rolling.direction}\\n`\n if (trend.degradationDetected) {\n output += `\u26A0\uFE0F **Performance degradation detected!** Auto-running self-evolution...\\n`\n try {\n output += `${(await runAutoEvolve()).replace(/\\n/g, \"\\n\")}\\n`\n } catch {\n output += `\u26A0\uFE0F Auto-evolution encountered an error.\\n`\n }\n }\n // Forecast (Gap #12)\n if (trend.forecast && trend.forecast.bucketRates.length > 0) {\n output += `**Forecast next window:** ${(trend.forecast.nextWindowRate * 100).toFixed(0)}%`\n if (trend.forecast.critical) {\n output += ` \uD83D\uDD34 **Critical**`\n }\n if (trend.forecast.stepsUntilCritical !== null) {\n output += ` (~${trend.forecast.stepsUntilCritical} steps to 50%)`\n }\n output += `\\n`\n output += `**Trend buckets:** ${trend.forecast.bucketRates.map(r => `${(r * 100).toFixed(0)}%`).join(\" \u2192 \")}\\n`\n }\n if (trend.recommendations.length > 0) {\n output += `**Tips:**\\n`\n output += trend.recommendations.map(r => `- ${r}`).join(\"\\n\") + \"\\n\"\n }\n }\n\n // Live evaluation score\n const liveScore = liveEvaluator.computeScore()\n if (liveScore.totalSteps > 0 || liveScore.totalDelegations > 0) {\n output += `\\n### \uD83D\uDCCA Live Evaluation Score\\n`\n const bar = \"\u2588\".repeat(Math.round(liveScore.overall / 5))\n output += `**Overall:** ${liveScore.overall}/100 ${bar.padEnd(20, \"\u2591\")}\\n`\n for (const [name, dim] of Object.entries(liveScore.dimensions)) {\n if (dim.weight > 0) {\n output += `- **${name}:** ${(dim.score * 100).toFixed(0)}% (target ${(dim.target * 100).toFixed(0)}%)\\n`\n }\n }\n output += `\\n`\n }\n\n return { output, metadata: { progress, nextStep: nextStep?.id, blockedSteps, isComplete, isHealthy } }\n },\n }),\n\n agentic_context: tool({\n description: \"View and compress the execution context. When approaching context limits, this tool summarizes the conversation history into a compact form preserving key decisions, file changes, and invariants.\",\n args: {\n action: tool.schema.enum([\"view\", \"compress\"]).describe(\"'view' shows current context stats; 'compress' generates a compressed context prompt\"),\n },\n async execute(args, context) {\n const turns = sessionStore.getContext(context.sessionID, 100)\n const session = sessionStore.getOrCreate(context.sessionID)\n const allFiles = executor.getAllFilesModified(context.sessionID)\n const decisions: string[] = []\n\n if (args.action === \"view\") {\n let output = `## \uD83E\uDDE0 Context Status\\n\\n`\n output += `**Turns in memory:** ${turns.length}\\n`\n output += `**Files tracked:** ${allFiles.length}\\n`\n output += `**Plan steps:** ${session.plan?.intent.subtasks.length ?? 0}\\n`\n\n const summary = await contextCompressor.compressWithLLM(\n session.plan?.intent.goal ?? \"N/A\",\n turns,\n decisions,\n allFiles,\n )\n\n output += `**Estimated tokens:** ~${summary.estimatedTokens}\\n`\n\n const shouldCompress = contextCompressor.shouldCompress(turns.length, summary.estimatedTokens)\n if (shouldCompress) {\n output += `\\n\u26A0\uFE0F **Context window approaching capacity.** Run \\`agentic_context\\` with \\`action: \"compress\"\\` to compact.\\n`\n } else {\n output += `\\n\u2705 Context is healthy.\\n`\n }\n\n return { output }\n }\n\n // Compress \u2014 use LLM-enhanced version when available\n const summary = await contextCompressor.compressWithLLM(\n session.plan?.intent.goal ?? \"N/A\",\n turns,\n decisions,\n allFiles,\n )\n\n const prompt = contextCompressor.compressToPrompt(summary)\n\n let output = `## \uD83D\uDDDC\uFE0F Context Compressed\\n\\n`\n output += `Compressed ${turns.length} turns into ~${summary.estimatedTokens} tokens.\\n\\n`\n output += prompt\n\n traceLogger.log({\n step: \"context:compress\",\n input: `${turns.length} turns`,\n output: `${summary.estimatedTokens} tokens`,\n toolUsed: \"agentic_context\",\n success: true,\n durationMs: 0,\n })\n\n return { output }\n },\n }),\n\n agentic_snapshot: tool({\n description: \"Save or restore execution snapshots. Use 'save' to checkpoint current state (plan progress, file changes, decisions). Use 'list' to see all snapshots.\",\n args: {\n action: tool.schema.enum([\"save\", \"list\"]).describe(\"'save' creates a checkpoint; 'list' shows all saved snapshots\"),\n label: tool.schema.string().optional().describe(\"Optional label for the snapshot (e.g., 'after-types')\"),\n },\n async execute(args, context) {\n if (args.action === \"save\") {\n const progress = executor.getProgress(context.sessionID)\n const allFiles = executor.getAllFilesModified(context.sessionID)\n const session = sessionStore.getOrCreate(context.sessionID)\n const planGoal = session.plan?.intent.goal ?? \"N/A\"\n\n const snapshot = {\n label: args.label ?? `snap-${Date.now()}`,\n timestamp: new Date().toISOString(),\n planGoal,\n progress,\n filesModified: allFiles,\n completedSteps: session.plan?.intent.subtasks.filter(s =>\n executor.getCompletedSteps(context.sessionID).includes(s.id)\n ).map(s => s.id) ?? [],\n }\n\n session.artifacts.set(`snapshot:${snapshot.label}`, JSON.stringify(snapshot))\n\n traceLogger.log({\n step: \"snapshot:save\",\n input: snapshot.label,\n output: `${allFiles.length} files, ${progress.completed}/${progress.total} steps`,\n toolUsed: \"agentic_snapshot\",\n success: true,\n durationMs: 0,\n })\n\n return {\n output: `## \uD83D\uDCF8 Snapshot Saved\\n\\n**Label:** \\`${snapshot.label}\\`\\n**Progress:** ${progress.completed}/${progress.total}\\n**Files:** ${allFiles.length}\\n**Timestamp:** ${snapshot.timestamp}`,\n }\n }\n\n // List snapshots\n const session = sessionStore.getOrCreate(context.sessionID)\n const snapshots: string[] = []\n for (const [key] of session.artifacts) {\n if (key.startsWith(\"snapshot:\")) {\n snapshots.push(key.replace(\"snapshot:\", \"\"))\n }\n }\n\n if (snapshots.length === 0) {\n return { output: \"No snapshots saved yet. Use `action: \\\"save\\\"` to create one.\" }\n }\n\n return { output: `## \uD83D\uDCF8 Snapshots\\n\\n${snapshots.map(s => `- \\`${s}\\``).join(\"\\n\")}` }\n },\n }),\n\n agentic_pipeline: tool({\n description: \"Define and run multi-agent workflow pipelines. Chain PM \u2192 Architect \u2192 Developer \u2192 QA for complete feature development. Includes cross-validation between stages.\",\n args: {\n action: tool.schema.enum([\"define\", \"list\", \"run\", \"status\", \"suggest\"]).describe(\"'define' to create a new pipeline; 'list' to show existing; 'run' to start a pipeline; 'status' to check progress; 'suggest' to auto-suggest a pipeline\"),\n pipelineId: tool.schema.string().optional().describe(\"Pipeline ID (for define/run/status)\"),\n stages: tool.schema.array(tool.schema.object({\n role: tool.schema.string().describe(\"Agent role for this stage\"),\n description: tool.schema.string().describe(\"What this stage should accomplish\"),\n validationCriteria: tool.schema.array(tool.schema.string()).optional().describe(\"Criteria to validate this stage\"),\n })).optional().describe(\"Pipeline stages (for define action)\"),\n name: tool.schema.string().optional().describe(\"Pipeline name (for define action)\"),\n description: tool.schema.string().optional().describe(\"Task description (for suggest action)\"),\n },\n async execute(args, context) {\n switch (args.action) {\n case \"define\": {\n if (!args.pipelineId || !args.stages || args.stages.length === 0) {\n return { output: \"pipelineId and stages (non-empty array) required.\" }\n }\n const pipeline: WorkflowPipeline = {\n id: args.pipelineId,\n name: args.name ?? args.pipelineId,\n stages: args.stages,\n createdAt: Date.now(),\n }\n orchestrator.definePipeline(pipeline)\n return {\n output: `## \uD83D\uDCCB Pipeline Defined\\n\\n**ID:** \\`${pipeline.id}\\`\\n**Name:** ${pipeline.name}\\n**Stages:** ${pipeline.stages.length}\\n\\n` +\n pipeline.stages.map((s, i) => `${i + 1}. **${s.role}** \u2014 ${s.description}`).join(\"\\n\"),\n }\n }\n\n case \"list\": {\n const pipelines = orchestrator.listPipelines()\n if (pipelines.length === 0) return { output: \"No pipelines defined. Use `action: \\\"define\\\"` to create one.\" }\n let out = `## \uD83D\uDCCB Defined Pipelines (${pipelines.length})\\n\\n`\n for (const p of pipelines) {\n out += `**${p.name}** (\\`${p.id}\\`) \u2014 ${p.stages.length} stages\\n`\n out += p.stages.map(s => ` - ${s.role}: ${s.description}`).join(\"\\n\") + \"\\n\\n\"\n }\n return { output: out }\n }\n\n case \"suggest\": {\n const suggested = orchestrator.getSuggestedPipeline(args.description ?? \"\")\n const pipeline = orchestrator.getPipeline(suggested)\n if (!pipeline) return { output: `Suggested pipeline: \\`${suggested}\\`. Run \\`action: \"run\"\\` with this pipelineId.` }\n let out = `## \uD83D\uDCA1 Suggested Pipeline: **${pipeline.name}**\\n\\n`\n out += `Run \\`agentic_pipeline\\` with \\`action: \"run\"\\` and \\`pipelineId: \"${pipeline.id}\"\\` to start.\\n\\n`\n out += pipeline.stages.map((s, i) => {\n const category = s.model ?? roleRegistry.suggestModel(s.role)\n const resolved = modelRegistry.resolveAlias(category)\n const modelLabel = resolved.length > 0 && resolved[0] !== category ? `${resolved[0]} (${category})` : category\n return `${i + 1}. **${s.role}** \u2014 ${s.description} (model: ${modelLabel})`\n }).join(\"\\n\")\n return { output: out }\n }\n\n case \"run\": {\n if (!args.pipelineId) return { output: \"pipelineId required.\" }\n const pipeline = orchestrator.getPipeline(args.pipelineId)\n if (!pipeline) return { output: `Pipeline \"${args.pipelineId}\" not found. Define it first or use one of: ${orchestrator.listPipelines().map(p => p.id).join(\", \")}` }\n\n const runId = `run-${context.sessionID}-${args.pipelineId}`\n orchestrator.startRun(runId, args.pipelineId)\n\n coordinator.writeSharedMemory(`pipeline:run:${runId}`, `Started pipeline ${pipeline.name}`, \"coordinator\")\n\n let out = `## \uD83D\uDE80 Pipeline Run Started\\n\\n`\n out += `**Pipeline:** ${pipeline.name} (\\`${args.pipelineId}\\`)\\n`\n out += `**Run ID:** \\`${runId}\\`\\n\\n`\n out += `### Stages\\n`\n out += pipeline.stages.map((s, i) => {\n const prefix = i === 0 ? \"\u25B6\" : \"\u23F3\"\n const category = s.model ?? roleRegistry.suggestModel(s.role)\n const resolved = modelRegistry.resolveAlias(category)\n const modelLabel = resolved.length > 0 && resolved[0] !== category ? `${resolved[0]} (${category})` : category\n return `${prefix} **${s.role}** \u2014 ${s.description} (model: ${modelLabel})`\n }).join(\"\\n\")\n out += `\\n\\n### Next Step\\nDelegate tasks to each stage. Start with \\`agentic_delegate\\` for the first role: **${pipeline.stages[0].role}**.`\n\n return { output: out, metadata: { runId, pipelineId: args.pipelineId } }\n }\n\n case \"status\": {\n const runId = args.pipelineId\n ? `run-${context.sessionID}-${args.pipelineId}`\n : null\n\n if (!runId) {\n return { output: \"Specify pipelineId to check status.\" }\n }\n\n const current = orchestrator.getCurrentStage(runId)\n const results = orchestrator.getAllStageResults(runId)\n\n let out = `## \uD83D\uDCCA Pipeline Status\\n\\n`\n out += `**Run:** \\`${runId}\\`\\n`\n\n const pipeline = args.pipelineId ? orchestrator.getPipeline(args.pipelineId) : null\n if (pipeline) {\n out += `**Pipeline:** ${pipeline.name}\\n\\n`\n out += `| Stage | Status |\\n|-------|--------|\\n`\n for (const stage of pipeline.stages) {\n const hasResult = results.has(stage.role)\n const icon = hasResult ? \"\u2705\" : stage.role === current?.role ? \"\u25B6\" : \"\u23F3\"\n out += `| ${icon} ${stage.role} | ${hasResult ? \"Complete\" : stage.role === current?.role ? \"Active\" : \"Pending\"} |\\n`\n }\n }\n\n if (current) {\n out += `\\n### Current Stage\\n**${current.role}** \u2014 ${current.description}\\n`\n } else {\n out += `\\n### Pipeline Complete\\nAll stages finished.\\n`\n }\n\n return { output: out }\n }\n\n default:\n return { output: `Unknown action \"${args.action}\". Available: define, list, run, status, suggest.` }\n }\n },\n }),\n\n agentic_pr: tool({\n description: \"Generate a pull request description from the execution plan, all step results, and files changed. Use `action: 'create'` to actually open a PR via GitHub CLI (`gh`).\",\n args: {\n title: tool.schema.string().optional().describe(\"Override the PR title (defaults to the plan goal)\"),\n action: tool.schema.enum([\"generate\", \"create\"]).optional().describe(\"'generate' returns PR body (default); 'create' opens actual PR via gh CLI\"),\n baseBranch: tool.schema.string().optional().describe(\"Base branch for PR creation (default: main)\"),\n },\n async execute(args, context) {\n const session = sessionStore.getOrCreate(context.sessionID)\n const allFiles = executor.getAllFilesModified(context.sessionID)\n\n if (!session.plan) {\n return { output: \"No plan found. Create a plan with `agentic_plan` first.\" }\n }\n\n const steps = session.plan.intent.subtasks.map(s => {\n const stepState = executor.getStepState(context.sessionID, s.id)\n return {\n id: s.id,\n description: s.description,\n success: stepState?.result?.success ?? false,\n }\n })\n\n const pr = git.generatePRDescription(args.title ?? session.plan.intent.goal, steps, allFiles)\n\n let output = `## \uD83D\uDCCB PR Description\\n\\n`\n output += `---\\ntitle: ${pr.title}\\n---\\n\\n`\n output += `## Summary\\n\\n${pr.summary}\\n\\n`\n output += `## Changes\\n\\n${pr.changes.join(\"\\n\")}\\n\\n`\n output += `## Files Changed\\n\\n${allFiles.map(f => `- \\`${f}\\``).join(\"\\n\")}\\n\\n`\n output += `## Test Plan\\n\\n${pr.testPlan}\\n\\n`\n\n if (pr.breakingChanges) {\n output += `## \u26A0\uFE0F Breaking Changes\\n\\nSome steps failed. Review carefully before merging.\\n\\n`\n }\n\n output += `## Steps Executed\\n\\n`\n output += steps.map(s =>\n `- ${s.success ? \"\u2705\" : \"\u274C\"} **${s.id}** \u2014 ${s.description}`\n ).join(\"\\n\")\n\n // Auto-commit if git available\n const allSuccess = steps.every(s => s.success)\n let commitInfo = null\n if (allSuccess && allFiles.length > 0 && git.isAvailable()) {\n commitInfo = git.commit(`feat: ${pr.title}`, allFiles)\n }\n\n if (commitInfo) {\n output += `\\n\\n## \uD83D\uDD16 Auto-commit\\n\\n`\n output += `**Commit:** \\`${commitInfo.hash.slice(0, 7)}\\`\\n`\n output += `**Message:** ${commitInfo.message}\\n`\n output += `**Files:** ${commitInfo.files.length}\\n`\n }\n\n // Create actual PR\n if (args.action === \"create\") {\n const prBody = `${pr.summary}\\n\\n## Changes\\n${pr.changes.join(\"\\n\")}\\n\\n## Test Plan\\n${pr.testPlan}`\n const base = args.baseBranch ?? \"main\"\n const prResult = git.createPR(pr.title, prBody, base)\n if (prResult) {\n output += `\\n\\n## \uD83D\uDE80 PR Created\\n\\n`\n output += `**URL:** ${prResult.url}\\n`\n output += `**Number:** #${prResult.number}\\n`\n output += `**Branch:** ${prResult.branch}\\n`\n } else {\n output += `\\n\\n## \u26A0\uFE0F PR Creation Failed\\n\\n`\n output += `Make sure \\`gh\\` CLI is installed and authenticated: \\`gh auth login\\`\\n`\n }\n }\n\n traceLogger.log({\n step: \"pr\",\n input: pr.title,\n output: `${steps.length} steps, ${allFiles.length} files`,\n toolUsed: \"agentic_pr\",\n success: true,\n durationMs: 0,\n metadata: { commitHash: commitInfo?.hash, prCreated: args.action === \"create\" },\n })\n\n return { output }\n },\n }),\n\n agentic_score: tool({\n description: \"Score the current changeset for technical debt. Analyzes coupling, file size, scope, and code patterns. Use before completing to ensure code quality.\",\n args: {\n files: tool.schema.array(tool.schema.string()).optional().describe(\"Specific files to score (defaults to all modified files)\"),\n },\n async execute(args, context) {\n const allFiles = executor.getAllFilesModified(context.sessionID)\n const files = args.files ?? allFiles\n\n if (files.length === 0) {\n return { output: \"No files modified yet. Complete some steps first.\" }\n }\n\n const contents = new Map<string, string>()\n for (const file of files) {\n try {\n contents.set(file, readFileSync(file, \"utf-8\"))\n } catch {\n contents.set(file, `[Unable to read ${file}]`)\n }\n }\n\n const session = sessionStore.getOrCreate(context.sessionID)\n const score = debtScorer.score(session.plan?.intent.goal ?? \"Unknown\", files, contents)\n\n let output = `## \uD83D\uDCCA Tech Debt Score: **${score.overall.toUpperCase()}**\\n\\n`\n output += `**Issues found:** ${score.totalIssues}\\n\\n`\n output += `### Breakdown\\n\\n`\n\n for (const cat of score.breakdown) {\n const bar = \"\u2588\".repeat(Math.min(cat.score, 10)) + \"\u2591\".repeat(Math.max(10 - cat.score, 0))\n output += `**${cat.category}** \\`[${bar}]\\` ${cat.score}/10\\n`\n for (const issue of cat.issues) {\n output += ` - ${issue}\\n`\n }\n output += \"\\n\"\n }\n\n output += `### Suggestion\\n${score.suggestion}\\n`\n\n traceLogger.log({\n step: \"score\",\n input: `${files.length} files`,\n output: score.overall,\n toolUsed: \"agentic_score\",\n success: true,\n durationMs: 0,\n metadata: { overall: score.overall, totalIssues: score.totalIssues },\n })\n\n return { output }\n },\n }),\n\n agentic_delegate: tool({\n description: \"Assign a task to a specialized agent role (architect/developer/qa/coordinator/pm). Supports pipeline-aware delegation with cross-validation between stages and inter-agent messaging.\",\n args: {\n taskId: tool.schema.string().describe(\"Unique ID for this delegated task\"),\n description: tool.schema.string().describe(\"What this agent should do\"),\n role: tool.schema.enum([\"architect\", \"developer\", \"qa\", \"coordinator\", \"pm\"]).optional().describe(\"Target role (auto-detected if omitted)\"),\n context: tool.schema.string().optional().describe(\"Additional context or instructions for the agent\"),\n pipelineRunId: tool.schema.string().optional().describe(\"Pipeline run ID to associate this task with a pipeline stage\"),\n result: tool.schema.string().optional().describe(\"Task result (set when completing a task to trigger downstream stages and cross-validation)\"),\n status: tool.schema.enum([\"pending\", \"running\", \"done\", \"failed\"]).optional().describe(\"Set the task status\"),\n requestReview: tool.schema.boolean().optional().describe(\"Request review from a downstream role after completing this task\"),\n },\n async execute(args, context) {\n const allTasks = coordinator.getTasks(context.sessionID)\n\n // If result is provided, we're completing a task\n if (args.result || args.status) {\n const updated = coordinator.updateTask(context.sessionID, args.taskId, args.status ?? \"done\", args.result)\n if (!updated) return { output: `Task \"${args.taskId}\" not found.` }\n\n // Write to shared memory\n coordinator.writeSharedMemory(`task:${args.taskId}`, (args.result ?? \"\").slice(0, 500), args.role ?? \"unknown\")\n\n let output = `## \u2705 Task Updated\\n\\n`\n output += `**Task:** \\`${args.taskId}\\` \u2192 **${args.status ?? \"done\"}**\\n`\n if (args.result) output += `**Result:** ${args.result.slice(0, 300)}\\n\\n`\n\n // Pipeline: advance to next stage\n if (args.pipelineRunId) {\n const pipelineId = args.pipelineRunId.replace(`run-${context.sessionID}-`, \"\")\n const pipeline = orchestrator.getPipeline(pipelineId)\n if (pipeline) {\n const stageIssues: string[] = []\n const nextStage = orchestrator.advanceStage(args.pipelineRunId, args.result ?? \"\", stageIssues)\n const allResults = orchestrator.getAllStageResults(args.pipelineRunId)\n\n if (nextStage) {\n const pipelineContext = orchestrator.buildContextForRole(nextStage.role, args.pipelineRunId, coordinator.getAllSharedMemory())\n\n output += `### \u25B6 Pipeline Advancing\\n`\n output += `**Next stage:** ${nextStage.role} \u2014 ${nextStage.description}\\n\\n`\n\n // Auto-send message to next agent\n coordinator.sendMessage({\n from: args.role ?? \"coordinator\",\n to: nextStage.role,\n taskId: args.taskId,\n type: \"result\",\n payload: `Stage ${args.role} completed. Next: ${nextStage.role}.\\n\\nContext:\\n${pipelineContext}`,\n })\n\n output += `**Context forwarded** to \\`${nextStage.role}\\` via message bus.\\n`\n } else {\n output += `### \uD83C\uDF89 Pipeline Complete\\nAll stages finished!\\n`\n\n // Run final cross-validation\n const finalValidation = await orchestrator.crossValidate(\n \"coordinator\",\n \"Pipeline completed\",\n allResults,\n coordinator.getAllSharedMemory(),\n )\n output += `\\n### Cross-Validation\\n**Status:** ${finalValidation.passed ? \"\u2705 Passed\" : \"\u274C Issues found\"}\\n`\n output += `**Summary:** ${finalValidation.summary}\\n`\n if (finalValidation.issues.length > 0) {\n output += finalValidation.issues.map(i =>\n `- [${i.severity}] ${i.description} (from ${i.source})`\n ).join(\"\\n\")\n }\n }\n\n // Cross-validate: auto-check against previous stages\n if (args.status === \"done\" && allResults.size > 1) {\n const validation = await orchestrator.crossValidate(\n args.role ?? \"unknown\",\n args.result ?? \"\",\n allResults,\n coordinator.getAllSharedMemory(),\n )\n if (validation.issues.length > 0) {\n output += `\\n### \uD83D\uDD0D Cross-Validation Notes\\n`\n for (const issue of validation.issues) {\n output += `- [${issue.severity}] ${issue.description}\\n`\n }\n }\n }\n }\n }\n\n // Request review from next logical role\n if (args.requestReview && args.result) {\n const reviewRole = args.role === \"developer\" ? \"qa\" : args.role === \"architect\" ? \"developer\" : \"qa\"\n coordinator.sendMessage({\n from: args.role ?? \"developer\",\n to: reviewRole,\n taskId: args.taskId,\n type: \"review_request\",\n payload: `Review requested for task \"${args.taskId}\".\\n\\nResult:\\n${args.result.slice(0, 1000)}`,\n })\n output += `\\n### \uD83D\uDCE8 Review Requested\\n**Reviewer:** ${reviewRole}\\n**Message sent** via inter-agent message bus.\\n`\n }\n\n traceLogger.log({\n step: \"delegate:update\",\n input: args.taskId,\n output: `\u2192 ${args.status}`,\n toolUsed: \"agentic_delegate\",\n success: true,\n durationMs: 0,\n })\n\n return { output }\n }\n\n // Normal delegation flow (LLM-based role suggestion, Gap #6)\n const role: AgentRole = args.role ?? await coordinator.getSuggestedRole(args.description, llmEngine)\n const agent = coordinator.getAgent(role)\n if (!agent) {\n return { output: `Unknown role \"${role}\". Available: architect, developer, qa, coordinator.` }\n }\n\n const contextWithMemory = args.context ?? args.description\n\n // Auto-load relevant skills from skill store (Gap #4: skill-aware delegation)\n const relevantSkills = skillStore.find(args.description).slice(0, 3).map(s => ({\n name: s.definition.meta.name,\n successRate: s.successRate,\n steps: s.definition.workflow.steps.map(st => `${st.action}: ${st.description}`).join(\"; \"),\n }))\n\n const task = coordinator.delegate(role, {\n id: args.taskId,\n assignedTo: role,\n description: args.description,\n input: contextWithMemory,\n status: \"running\",\n pipelineRunId: args.pipelineRunId,\n }, context.sessionID, 0, relevantSkills)\n\n // Build pipeline context if part of a pipeline run\n let pipelineContext = \"\"\n if (args.pipelineRunId) {\n pipelineContext = orchestrator.buildContextForRole(role, args.pipelineRunId, coordinator.getAllSharedMemory())\n }\n\n // Check for pending messages for this role\n const pendingMessages = coordinator.getMessages(role, true)\n\n // \u2500\u2500 Actual Agent Execution via Isolated AgentRuntime \u2500\u2500\n const agentCtx = {\n systemPrompt: agent.prompt ?? `You are a ${role} in a software engineering team.`,\n sessionId: context.sessionID,\n role,\n taskDescription: contextWithMemory,\n pipelineContext: pipelineContext || undefined,\n pendingMessages: pendingMessages.length > 0 ? pendingMessages.map(m => ({ from: m.from, payload: m.payload })) : undefined,\n sharedMemory: coordinator.getAllSharedMemory().map(e => ({ key: e.key, value: e.value, writtenBy: e.writtenBy })),\n }\n const agentResultObj = await agentRuntime.execute(agentCtx)\n const agentResult = agentResultObj.success ? agentResultObj.output : \"\"\n const executionError = agentResultObj.success ? null : (agentResultObj.error ?? \"Agent execution failed\")\n\n if (agentResult) {\n coordinator.updateTask(context.sessionID, args.taskId, \"done\", agentResult)\n coordinator.writeSharedMemory(`task:${args.taskId}`, agentResult.slice(0, 500), role)\n coordinator.writeSharedMemory(`task:${args.taskId}:full`, agentResult, role)\n } else {\n coordinator.updateTask(context.sessionID, args.taskId, \"failed\", executionError ?? \"LLM unavailable\")\n }\n\n let output = `## \uD83E\uDD16 Task Delegated\\n\\n`\n output += `**Task:** \\`${args.taskId}\\`\\n`\n output += `**Role:** ${role} (${agent.name})\\n`\n output += `**Description:** ${args.description}\\n`\n output += `**Status:** ${agentResult ? \"\u2705 Done\" : executionError ? \"\u274C Failed\" : \"\u26A0\uFE0F Unknown\"}\\n`\n if (agentResult) {\n output += `**Result:** ${agentResult.slice(0, 500)}\\n`\n } else if (executionError) {\n output += `**Error:** ${executionError.slice(0, 200)}\\n`\n }\n output += `**Agent Prompt:**\\n\\`\\`\\`\\n${(agent.prompt ?? \"No prompt available\").slice(0, 400)}\\n\\`\\`\\`\\n\\n`\n\n // Model suggestion \u2014 check session preference first, then fall through\n const sessionModelPref = sessionStore.getModelPreference(context.sessionID, role)\n let suggestedModel: string\n let modelLabel: string\n\n if (sessionModelPref) {\n // Session-seeded model preference (Gap: per-role model selection)\n suggestedModel = sessionModelPref\n modelLabel = `${suggestedModel} (session preference)`\n modelRegistry.addModel(suggestedModel)\n } else {\n const suggestedCategory = roleRegistry.suggestModel(role)\n const suggestedModels = modelRegistry.suggestWithFallback(role, [suggestedCategory])\n suggestedModel = suggestedModels.length > 0 ? suggestedModels[0] : suggestedCategory\n modelLabel = suggestedModel !== suggestedCategory ? `${suggestedModel} (${suggestedCategory})` : suggestedModel\n }\n output += `**Model Used:** ${modelLabel}\\n`\n if (agent.model) output += `**Configured Model:** ${agent.model}\\n`\n\n // Model reliability info\n const modelScore = modelRegistry.getScore(suggestedModel)\n if (modelScore) {\n if (modelScore.totalCalls > 0) {\n const icon = modelScore.status === \"healthy\" ? \"\u2705\" : modelScore.status === \"degraded\" ? \"\u26A0\uFE0F\" : \"\u274C\"\n output += `**Model Status:** ${icon} ${modelScore.status} (reliability: ${(modelScore.reliability * 100).toFixed(0)}%, hallucinations: ${(modelScore.hallucinationRate * 100).toFixed(0)}%)\\n`\n } else {\n output += `**Model Status:** No reliability data yet (new model)\\n`\n }\n }\n\n if (args.pipelineRunId) {\n output += `**Pipeline Run:** \\`${args.pipelineRunId}\\`\\n`\n }\n\n if (agentResult) {\n output += `\\n### Agent Output\\n\\`\\`\\`\\n${agentResult.slice(0, 2000)}\\n\\`\\`\\`\\n`\n } else if (executionError) {\n output += `\\n### Execution Error\\n${executionError}\\n`\n }\n\n if (pendingMessages.length > 0) {\n output += `\\n### \uD83D\uDCE8 Pending Messages (${pendingMessages.length})\\n`\n for (const msg of pendingMessages) {\n output += `- From **${msg.from}**: ${msg.payload.slice(0, 200)}\\n`\n }\n }\n\n output += `\\n### Active Tasks (${allTasks.length + 1})\\n`\n output += [...coordinator.getTasks(context.sessionID)].map(t =>\n `- ${t.status === \"done\" ? \"\u2705\" : t.status === \"failed\" ? \"\u274C\" : \"\u23F3\"} **${t.id}** \u2192 ${t.assignedTo}: ${t.description}`\n ).join(\"\\n\")\n\n // Pipeline: auto-advance if part of pipeline\n if (agentResult && args.pipelineRunId) {\n const pipelineId = args.pipelineRunId.replace(`run-${context.sessionID}-`, \"\")\n const pipeline = orchestrator.getPipeline(pipelineId)\n if (pipeline) {\n const stageIssues: string[] = []\n const nextStage = orchestrator.advanceStage(args.pipelineRunId, agentResult, stageIssues)\n const allResults = orchestrator.getAllStageResults(args.pipelineRunId)\n if (nextStage) {\n const nextCtx = orchestrator.buildContextForRole(nextStage.role, args.pipelineRunId, coordinator.getAllSharedMemory())\n coordinator.sendMessage({\n from: role, to: nextStage.role, taskId: args.taskId,\n type: \"result\",\n payload: `Stage ${role} completed. Next: ${nextStage.role}.\\n\\nContext:\\n${nextCtx}`,\n })\n output += `\\n### Pipeline: Next Stage\\n\u25B6 **${nextStage.role}** \u2014 ${nextStage.description}\\n`\n } else {\n output += `\\n### \uD83C\uDF89 Pipeline Complete\\nAll stages finished!\\n`\n const finalValidation = await orchestrator.crossValidate(\"coordinator\", \"Pipeline completed\", allResults, coordinator.getAllSharedMemory())\n output += `**Cross-Validation:** ${finalValidation.passed ? \"\u2705 Passed\" : \"\u274C Issues\"}\\n`\n }\n }\n }\n\n traceLogger.log({\n step: \"delegate\",\n input: args.taskId,\n output: `\u2192 ${role}: ${agentResult ? \"done\" : \"failed\"}`,\n toolUsed: \"agentic_delegate\",\n success: !!agentResult,\n durationMs: 0,\n })\n\n return { output }\n },\n }),\n\n agentic_message: tool({\n description: \"Inter-agent messaging system. Send messages between agent roles, request reviews, check inbox, and view conversation threads. Part of the multi-agent coordination framework.\",\n args: {\n action: tool.schema.enum([\"send\", \"inbox\", \"conversation\", \"mark-read\"]).describe(\"'send' to send a message; 'inbox' to check messages; 'conversation' to view a thread; 'mark-read' to acknowledge a message\"),\n to: tool.schema.string().optional().describe(\"Recipient role (for send action)\"),\n taskId: tool.schema.string().optional().describe(\"Task ID this message relates to (for send/conversation)\"),\n message: tool.schema.string().optional().describe(\"Message content (for send action)\"),\n type: tool.schema.enum([\"result\", \"review_request\", \"review_response\", \"clarification\", \"approval\", \"revision\"]).optional().describe(\"Message type (for send action)\"),\n messageId: tool.schema.string().optional().describe(\"Message ID to mark as read (for mark-read action)\"),\n },\n async execute(args, context) {\n switch (args.action) {\n case \"send\": {\n if (!args.to || !args.message) return { output: \"`to` and `message` required.\" }\n const msg = coordinator.sendMessage({\n from: context.agent ?? \"user\",\n to: args.to,\n taskId: args.taskId ?? \"general\",\n type: args.type ?? \"clarification\",\n payload: args.message,\n })\n return {\n output: `## \uD83D\uDCE8 Message Sent\\n\\n**From:** ${msg.from}\\n**To:** ${msg.to}\\n**Type:** ${msg.type}\\n**ID:** \\`${msg.id}\\`\\n\\n${msg.payload.slice(0, 500)}`,\n }\n }\n\n case \"inbox\": {\n const role = context.agent ?? \"user\"\n const messages = coordinator.getMessages(role, true)\n if (messages.length === 0) return { output: \"\uD83D\uDCED No unread messages.\" }\n\n let out = `## \uD83D\uDCEC Inbox (${messages.length} unread)\\n\\n`\n for (const msg of messages) {\n out += `**${msg.type.toUpperCase()}** from **${msg.from}** [\\`${msg.id}\\`]\\n`\n out += `Task: \\`${msg.taskId}\\` | ${new Date(msg.timestamp).toLocaleTimeString()}\\n`\n out += `> ${msg.payload.slice(0, 200)}\\n\\n`\n }\n return { output: out }\n }\n\n case \"conversation\": {\n if (!args.taskId) return { output: \"taskId required.\" }\n const thread = coordinator.getConversation(args.taskId)\n if (thread.length === 0) return { output: `No messages for task \"${args.taskId}\".` }\n\n let out = `## \uD83D\uDCAC Conversation: \\`${args.taskId}\\`\\n\\n`\n for (const msg of thread) {\n const icon = msg.type === \"approval\" ? \"\u2705\" : msg.type === \"review_request\" ? \"\uD83D\uDD0D\" : msg.type === \"revision\" ? \"\uD83D\uDD04\" : \"\uD83D\uDCAC\"\n out += `${icon} **${msg.from}** \u2192 **${msg.to}** (${msg.type})\\n`\n out += `> ${msg.payload.slice(0, 300)}\\n\\n`\n }\n return { output: out }\n }\n\n case \"mark-read\": {\n if (!args.messageId) return { output: \"messageId required.\" }\n const ok = coordinator.markRead(args.messageId)\n return { output: ok ? `\u2705 Message \\`${args.messageId}\\` marked as read.` : `Message \\`${args.messageId}\\` not found.` }\n }\n\n default:\n return { output: `Unknown action \"${args.action}\". Available: send, inbox, conversation, mark-read.` }\n }\n },\n }),\n\n agentic_skill: tool({\n description: \"Manage reusable skills extracted from successful task completions. Use 'extract' to create a skill from a completed step. Use 'find' to search existing skills.\",\n args: {\n action: tool.schema.enum([\"extract\", \"find\", \"list\"]).describe(\"'extract' creates a skill; 'find' searches; 'list' shows all\"),\n query: tool.schema.string().optional().describe(\"Search query or extraction target (stepId)\"),\n },\n async execute(args, context) {\n if (args.action === \"extract\") {\n const stepId = args.query\n if (!stepId) return { output: \"Provide a stepId as query to extract a skill from.\" }\n\n const stepState = executor.getStepState(context.sessionID, stepId)\n if (!stepState?.result) return { output: `No execution record for step \"${stepId}\".` }\n\n const skill = await skillStore.extract({\n role: \"tool\",\n content: stepState.result.output,\n })\n\n if (!skill) return { output: `Could not extract a skill from step \"${stepId}\". The output pattern is not recognized.` }\n\n persistence.save(\"skills\", skill.definition.meta.id, skill.definition)\n\n return {\n output: `## \uD83E\uDDE0 Skill Extracted\\n\\n**Name:** ${skill.definition.meta.name}\\n**Pattern:** \\`${skill.definition.trigger.pattern}\\`\\n**Steps:** ${skill.definition.workflow.steps.length}\\n**Success rate:** ${(skill.successRate * 100).toFixed(0)}%\\n\\n\\`\\`\\`\\n${skill.definition.workflow.steps.map(s => s.description).join(\"\\n\")}\\n\\`\\`\\``,\n }\n }\n\n if (args.action === \"find\") {\n if (!args.query) return { output: \"Provide a search query.\" }\n const skills = skillStore.find(args.query)\n if (skills.length === 0) return { output: `No skills found for \"${args.query}\".` }\n let output = `## \uD83D\uDD0D Skills Matching \"${args.query}\"\\n\\n`\n output += skills.map(s => `- **${s.definition.meta.name}** (${(s.successRate * 100).toFixed(0)}% success, ${s.usageCount} uses)\\n Pattern: \\`${s.definition.trigger.pattern}\\``).join(\"\\n\")\n return { output }\n }\n\n const skills = skillStore.getAll()\n if (skills.length === 0) return { output: \"No skills yet. Complete tasks and use `action: \\\"extract\\\"` to build the skill library.\" }\n\n let output = `## \uD83E\uDDE0 Skill Library (${skills.length})\\n\\n`\n output += skills.map(s => `- **${s.definition.meta.name}** \u2014 ${(s.successRate * 100).toFixed(0)}% (${s.usageCount} uses)`).join(\"\\n\")\n return { output }\n },\n }),\n\n agentic_model: tool({\n description: \"Configure per-role LLM model preferences for the current session. Use 'set' to assign a model to an agent role. Use 'get' to see current assignment. Use 'list' to view all preferences. Use 'clear' to remove a preference.\",\n args: {\n action: tool.schema.enum([\"set\", \"get\", \"list\", \"clear\"]).describe(\"Action: set/get/list/clear per-role model preference\"),\n role: tool.schema.string().optional().describe(\"Agent role (architect, developer, qa, coordinator, pm)\"),\n model: tool.schema.string().optional().describe(\"Model name (e.g. 'gpt-4o', 'claude-sonnet-4-20250514')\"),\n },\n async execute(args, context) {\n const VALID_ROLES = [\"architect\", \"developer\", \"qa\", \"coordinator\", \"pm\"]\n\n if (args.action === \"list\") {\n const prefs = sessionStore.getAllModelPreferences(context.sessionID)\n if (prefs.length === 0) {\n return { output: \"No model preferences configured for this session. Use `action: \\\"set\\\"` to assign models to agent roles.\" }\n }\n let output = \"## \uD83C\uDFAF Session Model Preferences\\n\\n\"\n output += \"| Role | Model |\\n\"\n output += \"|------|-------|\\n\"\n output += prefs.map(p => `| **${p.role}** | \\`${p.model}\\` |`).join(\"\\n\")\n output += \"\\n\\nThese preferences override the default model selection during delegation.\"\n return { output }\n }\n\n if (args.action === \"set\") {\n if (!args.role) return { output: \"Provide a `role` (e.g. 'architect', 'developer', 'qa', 'coordinator', 'pm').\" }\n if (!args.model) return { output: \"Provide a `model` name (e.g. 'gpt-4o', 'claude-sonnet-4-20250514').\" }\n const roleLower = args.role.toLowerCase()\n if (!VALID_ROLES.includes(roleLower)) {\n return { output: `Invalid role \"${args.role}\". Valid roles: ${VALID_ROLES.join(\", \")}` }\n }\n sessionStore.setModelPreference(context.sessionID, roleLower, args.model)\n // Also register in model registry so it's tracked\n modelRegistry.addModel(args.model)\n modelRegistry.registerAlias(roleLower, [args.model])\n return { output: `\u2705 Model preference set: **${roleLower}** \u2192 \\`${args.model}\\`\\nThis model will be used when delegating tasks to the ${roleLower} role in this session.` }\n }\n\n if (args.action === \"get\") {\n if (!args.role) return { output: \"Provide a `role` to check (e.g. 'architect').\" }\n const model = sessionStore.getModelPreference(context.sessionID, args.role)\n if (!model) {\n return { output: `No model preference set for role \"${args.role}\". Delegation will use default model selection.` }\n }\n return { output: `**${args.role}** \u2192 \\`${model}\\`` }\n }\n\n if (args.action === \"clear\") {\n sessionStore.clearModelPreference(context.sessionID, args.role)\n if (args.role) {\n return { output: `Cleared model preference for role \"${args.role}\".` }\n }\n return { output: \"Cleared all model preferences for this session.\" }\n }\n\n return { output: \"Unknown action. Use 'set', 'get', 'list', or 'clear'.\" }\n },\n }),\n\n agentic_model_reset: tool({\n description: \"Reset model statistics to recover from degraded performance. Use 'reset' to clear stats for a specific model. Use 'reset-stale' to auto-reset models not used in 7+ days. Use 'reset-all' for emergency recovery.\",\n args: {\n action: tool.schema.enum([\"reset\", \"reset-stale\", \"reset-all\"]).describe(\"Action: reset (single model), reset-stale (auto-detect old models), reset-all (emergency)\"),\n model: tool.schema.string().optional().describe(\"Model name (required for 'reset' action)\"),\n staleDays: tool.schema.number().optional().describe(\"Days threshold for stale detection (default: 7)\"),\n },\n async execute(args, context) {\n if (args.action === \"reset\") {\n if (!args.model) return { output: \"Provide a `model` name to reset (e.g. 'gpt-4o').\" }\n \n const beforeScore = modelRegistry.getScore(args.model)\n modelRegistry.resetModel(args.model)\n const afterScore = modelRegistry.getScore(args.model)\n \n return { \n output: `\u2705 Reset model statistics for \\`${args.model}\\`\\n\\n**Before:** ${beforeScore ? `${(beforeScore.reliability * 100).toFixed(0)}% reliability, ${beforeScore.totalCalls} calls` : \"No data\"}\\n**After:** ${afterScore ? `${(afterScore.reliability * 100).toFixed(0)}% reliability, ${afterScore.totalCalls} calls` : \"Clean slate\"}` \n }\n }\n\n if (args.action === \"reset-stale\") {\n const staleDays = args.staleDays ?? 7\n const resetModels = modelRegistry.resetStaleModels(staleDays)\n \n if (resetModels.length === 0) {\n return { output: `No stale models found (threshold: ${staleDays} days unused).` }\n }\n \n return { output: `\u2705 Reset ${resetModels.length} stale model(s):\\n${resetModels.map(m => `- \\`${m}\\``).join(\"\\n\")}\\n\\nThese models had not been used in ${staleDays}+ days.` }\n }\n\n if (args.action === \"reset-all\") {\n const allScores = modelRegistry.getAllScores()\n for (const score of allScores) {\n modelRegistry.resetModel(score.model)\n }\n return { output: `\u26A0\uFE0F **EMERGENCY RESET:** Cleared statistics for ${allScores.length} model(s).\\n\\nAll models now have clean slate. Use this only when all models are blocked.` }\n }\n\n return { output: \"Unknown action. Use 'reset', 'reset-stale', or 'reset-all'.\" }\n },\n }),\n\n agentic_episodes: tool({\n description: \"Browse cross-session memory. Search past tasks and their outcomes to learn from previous sessions. Use before planning similar tasks to avoid repeating mistakes.\",\n args: {\n action: tool.schema.enum([\"search\", \"recent\", \"stats\"]).describe(\"'search' finds relevant past tasks; 'recent' shows latest; 'stats' shows summary\"),\n query: tool.schema.string().optional().describe(\"Search query (for 'search' action)\"),\n },\n async execute(args, context) {\n if (args.action === \"search\") {\n if (!args.query) return { output: \"Provide a search query.\" }\n\n // Index episodes into vector store for RAG-enhanced search\n const allEpisodes = episodicStore.getRecent(50)\n for (const ep of allEpisodes) {\n vectorStore.addDocument(`ep:${ep.sessionId}`, `${ep.planGoal} ${ep.outcome} ${ep.decisions.join(\" \")}`, {\n type: \"episode\",\n sessionId: ep.sessionId,\n outcome: ep.outcome,\n tags: [],\n })\n }\n const vectorResults = await vectorStore.semanticSearch(args.query, 5)\n const episodes = allEpisodes.filter(e => vectorResults.some(r => r.id === `ep:${e.sessionId}`))\n if (episodes.length === 0) return { output: `No episodes found for \"${args.query}\".` }\n let output = `## \uD83E\uDDE0 Episodic Memory (RAG): \"${args.query}\"\\n\\n`\n output += episodes.map(e =>\n `- **${e.outcome === \"success\" ? \"\u2705\" : e.outcome === \"partial\" ? \"\u26A0\uFE0F\" : \"\u274C\"} ${e.planGoal}**\\n Score: ${vectorResults.find(r => r.id === `ep:${e.sessionId}`)?.score.toFixed(2) ?? \"?\"} | Files: ${e.filesChanged.length} | ${e.timestamp.slice(0, 10)}`\n ).join(\"\\n\")\n return { output }\n }\n\n if (args.action === \"recent\") {\n const episodes = episodicStore.getRecent(10)\n if (episodes.length === 0) return { output: \"No episode history yet.\" }\n let output = `## \uD83D\uDCDC Recent Episodes\\n\\n`\n output += episodes.map(e =>\n `- ${e.timestamp.slice(0, 10)} \u2014 **${e.outcome.toUpperCase()}**: ${e.planGoal.slice(0, 80)}`\n ).join(\"\\n\")\n return { output }\n }\n\n const stats = episodicStore.getStats()\n return {\n output: `## \uD83D\uDCCA Episode Stats\\n\\n**Total sessions:** ${stats.total}\\n**Successful:** ${stats.successful}\\n**Partial:** ${stats.partial}\\n**Failed:** ${stats.failed}\\n\\nSuccess rate: ${stats.total > 0 ? ((stats.successful / stats.total) * 100).toFixed(0) : 0}%`,\n }\n },\n }),\n\n agentic_parallel: tool({\n description: \"Analyze or execute steps concurrently. Use `analyze` to see parallelism opportunities, or `execute` to run ready steps in parallel with Promise.all. Supports LLM-driven execution and sub-process OpenCode spawn.\",\n args: {\n action: tool.schema.enum([\"analyze\", \"execute\"]).optional().describe(\"'analyze' (default) shows parallelism plan; 'execute' runs ready steps concurrently\"),\n opencodePath: tool.schema.string().optional().describe(\"Path to `opencode` binary for sub-process spawn (execute mode)\"),\n abortOnFailure: tool.schema.boolean().optional().describe(\"Stop all tasks in phase if one fails (default: false)\"),\n },\n async execute(args, context) {\n const session = sessionStore.getOrCreate(context.sessionID)\n if (!session.plan) return { output: \"No plan found. Create one with `agentic_plan` first.\" }\n\n const subtasks = session.plan.intent.subtasks\n const completed = executor.getCompletedSteps(context.sessionID)\n const plan = parallelExec.analyzeParallelism(subtasks)\n\n if (args.action === \"execute\") {\n const readySteps = subtasks.filter(s =>\n !completed.includes(s.id) &&\n s.dependsOn.every(d => completed.includes(d))\n )\n if (readySteps.length === 0) {\n return { output: \"No ready steps to execute. All steps are either completed or blocked by dependencies.\" }\n }\n\n const cwd = ctxDir(context)\n\n let stepRunner: import(\"./core/parallel.js\").StepRunner\n if (args.opencodePath) {\n stepRunner = (step) => parallelExec.executeWithSubprocessSpawn(step, args.opencodePath!, cwd, context.sessionID)\n } else {\n stepRunner = parallelExec.llmStepRunner({\n llmEngine,\n projectDir: cwd,\n planGoal: session.plan.intent.goal,\n sessionId: context.sessionID,\n })\n }\n\n const { results, durationMs } = await parallelExec.executePlanConcurrently(\n plan, stepRunner, args.abortOnFailure ?? false,\n )\n\n for (const r of results) {\n executor.recordResult(context.sessionID, {\n stepId: r.stepId,\n success: r.success,\n output: r.output ?? \"\",\n filesModified: r.filesModified,\n error: r.error,\n })\n }\n\n traceLogger.log({\n step: \"parallel:execute\",\n input: `${readySteps.length} steps`,\n output: `${results.filter(r => r.success).length}/${results.length} passed`,\n toolUsed: \"agentic_parallel\",\n success: results.every(r => r.success),\n durationMs,\n metadata: { total: results.length, passed: results.filter(r => r.success).length },\n })\n\n let output = `## \u26A1 Parallel Execution Complete (${(durationMs / 1000).toFixed(1)}s)\\n\\n`\n output += `**Steps executed:** ${readySteps.length}\\n`\n output += `**Passed:** ${results.filter(r => r.success).length}\\n`\n output += `**Failed:** ${results.filter(r => !r.success).length}\\n\\n`\n\n for (const r of results) {\n const icon = r.success ? \"\u2705\" : \"\u274C\"\n output += `${icon} **${r.stepId}** \u2014 ${r.output?.slice(0, 120) ?? \"no output\"}\\n`\n if (r.error) output += ` Error: ${r.error.slice(0, 200)}\\n`\n }\n\n const progress = executor.getProgress(context.sessionID)\n output += `\\n### Overall Progress\\n`\n output += `\u2705 ${progress.completed}/${progress.total} | \u274C ${progress.failed} | \u23F3 ${progress.total - progress.completed - progress.failed}`\n\n return { output, metadata: { results, durationMs } }\n }\n\n // Analyze mode (default)\n let output = `## \u26A1 Parallel Execution Plan\\n\\n`\n output += `**Max parallelism:** ${plan.maxParallelism}\\n`\n output += `**Phases:** ${plan.phases.length}\\n\\n`\n\n output += `| Phase | Steps | Parallel |\\n|-------|-------|----------|\\n`\n for (const phase of plan.phases) {\n const stepIds = phase.steps.map(s => s.id).join(\", \")\n output += `| ${phase.index + 1} | ${stepIds} | ${phase.canRunInParallel ? \"\u2705\" : \"\uD83D\uDD12\"} |\\n`\n }\n\n const suggestions = parallelExec.suggestParallelTasks(subtasks, completed)\n if (suggestions.length > 1) {\n output += `\\n### Currently Runnable\\n`\n const groups = new Map<number, string[]>()\n for (const s of suggestions) {\n const list = groups.get(s.parallelGroup) ?? []\n list.push(s.taskId)\n groups.set(s.parallelGroup, list)\n }\n for (const [group, tasks] of groups) {\n const label = tasks.length > 1 ? `\uD83D\uDFE2 Parallel group ${group}` : `\uD83D\uDFE1 Sequential`\n output += `- **${label}**: ${tasks.map(t => `\\`${t}\\``).join(\", \")}\\n`\n }\n output += `\\nRun \\`agentic_parallel\\` with \\`action: \"execute\"\\` to run these steps concurrently.`\n }\n\n const allFiles = new Map<string, string[]>()\n for (const step of subtasks) {\n const stepState = executor.getStepState(context.sessionID, step.id)\n if (stepState?.result?.filesModified) {\n allFiles.set(step.id, stepState.result.filesModified)\n }\n }\n const conflicts = parallelExec.detectConflicts(\n suggestions.map(s => s.taskId),\n allFiles,\n )\n if (conflicts.length > 0) {\n output += `\\n### \u26A0\uFE0F Potential Conflicts\\n`\n for (const c of conflicts) {\n output += `- \\`${c.taskA}\\` \u2694\uFE0F \\`${c.taskB}\\` both touch \\`${c.conflictingFile}\\`\\n`\n }\n }\n\n return { output }\n },\n }),\n\n agentic_dashboard: tool({\n description: \"Generate an observability dashboard from execution traces. Shows timeline, statistics, tool usage, anomaly detection, and model reliability (timeouts, retry storms, silent failures).\",\n args: {},\n async execute(args, _context) {\n // Always show model reliability regardless of trace data\n const modelReliability = modelRegistry.getSummary()\n let traceSection = \"\"\n\n // Read traces from file\n await traceLogger.flush()\n const tracePath = `${worktree}/.agentic/trace.jsonl`\n let traces = []\n try {\n const content = readFileSync(tracePath, \"utf-8\")\n traces = content.trim().split(\"\\n\").filter(Boolean).map(l => JSON.parse(l))\n } catch { /* no traces yet */ }\n\n if (traces.length > 0) {\n const data = dashboard.generate(traces, Date.now())\n traceSection = dashboard.formatForDisplay(data)\n }\n\n let output = traceSection || \"### \uD83D\uDCCA Execution Overview\\n\\nNo trace data available yet. Execute some steps first.\\n\"\n output += `\\n### \uD83E\uDD16 Model Reliability\\n${modelReliability}\\n`\n\n // Cross-session pattern discovery\n const allEpisodes = episodicStore.getRecent(200)\n if (allEpisodes.length >= 3) {\n const allStepResults = [] // No direct access to CE's internal results; use episodes instead\n const allSkills = skillStore.getAll().map(s => ({\n name: s.definition.meta.name,\n successRate: s.successRate,\n usageCount: s.usageCount,\n }))\n const report = patternDiscovery.analyze(allEpisodes, [], allSkills)\n\n if (report.errorPatterns.length > 0 || report.recommendations.length > 0) {\n output += `\\n### \uD83D\uDD0D Cross-Session Patterns (${report.totalSessions} sessions)\\n`\n\n if (report.errorPatterns.length > 0) {\n output += `\\n**Recurring Errors:**\\n`\n for (const ep of report.errorPatterns.slice(0, 3)) {\n output += `- \\`${ep.category}\\`: ${ep.sessionCount}/${report.totalSessions} sessions (${(ep.sessionAffinity * 100).toFixed(0)}%)\\n`\n }\n }\n\n if (report.filePatterns.some(f => f.isHotSpot)) {\n output += `\\n**Hot Spot Files:**\\n`\n for (const fp of report.filePatterns.filter(f => f.isHotSpot).slice(0, 3)) {\n output += `- \\`${fp.filePath}\\`: modified in ${fp.sessionCount} sessions`\n if (fp.coChangedFiles.length > 0) {\n output += ` (co-changes: ${fp.coChangedFiles.slice(0, 2).map(c => `\\`${c.filePath}\\``).join(\", \")})`\n }\n output += \"\\n\"\n }\n }\n\n if (report.recommendations.length > 0) {\n const highRecs = report.recommendations.filter(r => r.priority === \"high\")\n if (highRecs.length > 0) {\n output += `\\n**\u26A0\uFE0F High Priority Recommendations:**\\n`\n for (const rec of highRecs.slice(0, 3)) {\n output += `- ${rec.description}\\n`\n }\n }\n }\n }\n }\n\n // Live evaluation score\n const liveScore = liveEvaluator.computeScore()\n if (liveScore.totalSteps > 0 || liveScore.totalDelegations > 0) {\n output += `\\n### \uD83D\uDCCA Live Evaluation Score\\n`\n output += liveEvaluator.formatReport(false)\n }\n\n return { output }\n },\n }),\n\n agentic_guard: tool({\n description: \"Verify the truthfulness of claims made in step outputs. Checks that files referenced actually exist, functions claimed exist in code, and imports are valid. Use to catch LLM hallucinations before they corrupt the codebase.\",\n args: {\n stepId: tool.schema.string().describe(\"The step ID whose output to verify\"),\n },\n async execute(args, context) {\n const stepState = executor.getStepState(context.sessionID, args.stepId)\n if (!stepState?.result) return { output: `No execution record for step \"${args.stepId}\".` }\n\n const output = stepState.result.output\n const files = executor.getAllFilesModified(context.sessionID)\n const check = hallucinationGuard.check(output, files)\n\n if (!check.passed) {\n modelRegistry.recordHallucination(llmEngine.getCurrentModel())\n }\n\n let response = `## \uD83D\uDEE1\uFE0F Hallucination Check: Step \"${args.stepId}\"\\n\\n`\n response += `**Verdict:** ${check.passed ? \"\u2705 All claims verified\" : \"\u274C Unverified claims found\"}\\n\\n`\n response += `**Summary:** ${check.summary}\\n\\n`\n\n if (check.claims.length > 0) {\n response += `### Claims Checked\\n\\n`\n response += `| Claim | Type | Verified |\\n|-------|------|----------|\\n`\n for (const c of check.claims.slice(0, 20)) {\n const icon = c.verified ? \"\u2705\" : \"\u274C\"\n response += `| ${icon} ${c.claim.slice(0, 50)} | ${c.type} | ${c.actual ?? \"?\"} |\\n`\n }\n }\n\n if (!check.passed) {\n response += `\\n### \u26A0\uFE0F Action Required\\n`\n response += `The following claims could not be verified: \\n`\n for (const c of check.claims.filter(c => !c.verified)) {\n response += `- \"${c.claim}\" \u2014 expected ${c.expected} but got ${c.actual}\\n`\n }\n response += `\\nDouble-check these before proceeding. The agent may be hallucinating about files/functions that don't exist.`\n }\n\n response += `\\n### \uD83E\uDD16 Model Reliability\\n`\n const modelScore = modelRegistry.getScore(llmEngine.getCurrentModel())\n if (modelScore && modelScore.totalCalls > 0) {\n const icon = modelScore.status === \"healthy\" ? \"\u2705\" : modelScore.status === \"degraded\" ? \"\u26A0\uFE0F\" : \"\u274C\"\n response += `${icon} **${modelScore.model}** \u2014 reliability: ${(modelScore.reliability * 100).toFixed(0)}%, hallucinations: ${(modelScore.hallucinationRate * 100).toFixed(0)}%, calls: ${modelScore.totalCalls}\\n`\n } else {\n response += `No data yet for current model.\\n`\n }\n\n traceLogger.log({\n step: `guard:${args.stepId}`,\n input: args.stepId,\n output: check.summary,\n toolUsed: \"agentic_guard\",\n success: check.passed,\n durationMs: 0,\n })\n\n return { output: response }\n },\n }),\n\n agentic_evolve: tool({\n description: \"Inspect and extend the agent system itself (Stage IV). Register custom agent roles, define versioned memory schemas, and export skills in self-describing format for other agents to consume.\",\n args: {\n action: tool.schema.enum([\"inspect\", \"register-role\", \"export-skill\", \"memory-schema\", \"evolve\", \"read-prompt\", \"edit-prompt\", \"prompt-history\", \"rollback-prompt\", \"export-training-data\"]).describe(\"What to do: inspect system state, register a custom agent role, export a skill, view memory schema, run self-evolution, manage agent prompts (Stage IV), or export skills as training data for fine-tuning\"),\n name: tool.schema.string().optional().describe(\"Role name or skill name (for register-role, export-skill)\"),\n prompt: tool.schema.string().optional().describe(\"Agent prompt template (for register-role) or new instruction to append (for edit-prompt)\"),\n tools: tool.schema.array(tool.schema.string()).optional().describe(\"Tools available to custom role\"),\n skillId: tool.schema.string().optional().describe(\"Skill ID to export or inspect\"),\n role: tool.schema.string().optional().describe(\"Agent role (for read-prompt, edit-prompt, prompt-history, rollback-prompt)\"),\n version: tool.schema.number().optional().describe(\"Version number (for rollback-prompt)\"),\n description: tool.schema.string().optional().describe(\"Description for the prompt change (for edit-prompt)\"),\n format: tool.schema.enum([\"openai\", \"instructions\"]).optional().describe(\"Output format for training data (for export-training-data, default: openai)\"),\n minSuccessRate: tool.schema.number().optional().describe(\"Minimum skill success rate to include (for export-training-data, default: 0.5)\"),\n },\n async execute(args, _context) {\n switch (args.action) {\n case \"inspect\": {\n const builtIn = roleRegistry.getAllBuiltIn()\n const custom = roleRegistry.getAllCustom()\n const migrations = schemaVersion.getMigrations()\n\n let out = `## \uD83D\uDD2E Agent System State (Stage IV)\\n\\n`\n out += `**Memory schema version:** ${MemorySchemaVersion.currentVersion()}\\n`\n out += `**Registered migrations:** ${migrations.length}\\n\\n`\n out += `### Built-in Roles (${builtIn.length})\\n`\n for (const r of builtIn) {\n out += `- **${r.name}** (\\`${r.role}\\`) \u2014 ${r.tools.length} tools\\n`\n }\n if (custom.length > 0) {\n out += `\\n### Custom Roles (${custom.length})\\n`\n for (const r of custom) {\n out += `- **${r.name}** (\\`${r.role}\\`) \u2014 ${r.tools.length} tools\\n`\n }\n }\n out += `\\n### Extensibility\\n`\n out += `- Custom roles: \\`agentic_evolve register-role\\`\\n`\n out += `- Export skills: \\`agentic_evolve export-skill\\`\\n`\n out += `- Schema info: \\`agentic_evolve memory-schema\\`\\n`\n return { output: out }\n }\n\n case \"register-role\": {\n if (!args.name || !args.prompt) {\n return { output: \"Both `name` and `prompt` are required to register a custom role.\" }\n }\n const roleId = args.name.toLowerCase().replace(/\\s+/g, \"-\")\n roleRegistry.registerCustom({\n role: roleId,\n name: args.name,\n prompt: args.prompt,\n tools: args.tools ?? [\"read\", \"edit\", \"write\", \"bash\"],\n })\n return { output: `Custom role \"${args.name}\" registered as \\`${roleId}\\`. Available via \\`agentic_delegate role=${roleId}\\`.` }\n }\n\n case \"export-skill\": {\n const skillId = args.skillId\n const skillData = createSkillDefinition(\n args.name ?? \"unnamed-skill\",\n args.name ?? \"generic pattern\",\n args.tools ?? [],\n [{ action: \"implement\", description: args.name ?? \"task\", expectedOutput: \"completed\" }],\n )\n\n const json = serializeSkill(skillData)\n const inspection = inspectSkill(skillData)\n\n let out = inspection\n out += `\\n\\n### Machine-Readable Export (agentic-skill/v1)\\n\\`\\`\\`json\\n${json}\\n\\`\\`\\``\n return { output: out }\n }\n\n case \"memory-schema\": {\n let out = `## \uD83E\uDDE0 Memory Schema v${MemorySchemaVersion.currentVersion()}\\n\\n`\n out += `### Envelope Format\\n\\`\\`\\`ts\\n${JSON.stringify(createMemoryEnvelope({ example: true }, \"example\"), null, 2)}\\n\\`\\`\\`\\n\\n`\n out += `### Registered Migrations\\n`\n const migrations = schemaVersion.getMigrations()\n if (migrations.length === 0) {\n out += `No migrations registered yet. Schema v${MemorySchemaVersion.currentVersion()} is current.\\n`\n } else {\n for (const m of migrations) {\n out += `- v${m.from} \u2192 v${m.to}: ${m.description}\\n`\n }\n }\n out += `\\n### Upgrading\\n`\n out += `Data is stored with \\`schema_version\\`. On read, the system auto-migrates from any version to current.\\n`\n out += `New migrations can be registered via \\`schemaVersion.registerMigration()\\` in plugin code.\\n`\n out += `\\n### Compatibility\\n`\n out += `All episodes, skills, and artifacts support schema evolution without data loss.\\n`\n return { output: out }\n }\n\n case \"evolve\": {\n await traceLogger.flush()\n\n const allSkills = skillStore.getAll()\n const allEpisodes = episodicStore.getRecent(50)\n\n const uniqueSessions = new Set(allEpisodes.map(e => e.sessionId))\n let allTasks: AgentTask[] = []\n for (const sid of uniqueSessions) {\n allTasks = allTasks.concat(coordinator.getTasks(sid))\n }\n\n const allStepStates: Array<{ stepId: string; success: boolean; output: string }> = []\n for (const sid of uniqueSessions) {\n const session = sessionStore.getOrCreate(sid)\n const subtasks = session.plan?.intent.subtasks ?? []\n for (const step of subtasks) {\n const state = executor.getStepState(sid, step.id)\n if (state?.result) {\n allStepStates.push({\n stepId: step.id,\n success: state.result.success,\n output: state.result.output,\n })\n }\n }\n }\n\n let traces: Array<{ toolUsed: string; success: boolean; step: string }> = []\n const tracePath = `${worktree}/.agentic/trace.jsonl`\n try {\n const content = readFileSync(tracePath, \"utf-8\")\n for (const line of content.trim().split(\"\\n\").filter(Boolean)) {\n const parsed = JSON.parse(line)\n traces.push({\n toolUsed: parsed.toolUsed ?? \"unknown\",\n success: parsed.success ?? true,\n step: parsed.step ?? \"\",\n })\n }\n } catch { /* no traces yet */ }\n\n selfEvolver.feedSkills(allSkills)\n selfEvolver.feedEpisodes(allEpisodes)\n selfEvolver.feedTasks(allTasks)\n selfEvolver.feedStepStates(allStepStates)\n selfEvolver.feedTraces(traces)\n\n const report = selfEvolver.evolve()\n\n // Auto-apply role suggestions\n const appliedRoles: string[] = []\n for (const role of report.roleSuggestions) {\n try {\n coordinator.registerCustomRole({\n role: role.name,\n name: role.name,\n tools: role.suggestedTools,\n prompt: `You are ${role.name}. ${role.reason}\\n\\nTrigger: ${role.triggerPattern}`,\n })\n appliedRoles.push(role.name)\n } catch { }\n }\n\n // Auto-apply skill patches\n const patchedSkills: string[] = []\n for (const patch of report.skillPatches) {\n const record = skillStore.getById(patch.skillId)\n if (!record) continue\n const def = record.definition\n let modified = false\n\n for (const change of patch.suggestedChanges) {\n if (change.type === \"add_rollback\") {\n for (const step of def.workflow.steps) {\n if (!step.rollback) {\n step.rollback = change.detail\n modified = true\n }\n }\n }\n if (change.type === \"add_step\") {\n const newStep: import(\"./memory/skill-format.js\").SkillStep = {\n order: def.workflow.steps.length + 1,\n action: \"verify\",\n description: change.detail,\n expectedOutput: \"Step completed successfully\",\n }\n def.workflow.steps.push(newStep)\n modified = true\n }\n }\n\n if (modified) {\n def.quality.usageCount = record.usageCount\n def.quality.successRate = record.successRate\n def.audit.lastModified = new Date().toISOString()\n def.audit.modifiedBy = \"system\"\n def.meta.version++\n persistence.save(\"skills\", def.meta.id, def)\n patchedSkills.push(patch.skillName)\n }\n }\n\n let out = `## \uD83D\uDD2E Self-Evolution Report\\n\\n`\n out += `**Improvement Score:** ${report.improvementScore}/100\\n`\n out += `**Sessions Analyzed:** ${report.metrics.totalSessions}\\n`\n out += `**Steps Analyzed:** ${report.metrics.totalSteps}\\n`\n out += `**Overall Success Rate:** ${(report.metrics.successRate * 100).toFixed(0)}%\\n`\n out += `**Retry Rate:** ${(report.metrics.retryRate * 100).toFixed(0)}%\\n\\n`\n\n if (appliedRoles.length > 0) {\n out += `### \u2705 Auto-Registered Roles\\n`\n for (const name of appliedRoles) {\n out += `- **${name}** \u2014 registered automatically\\n`\n }\n out += `\\n`\n }\n\n // Auto-apply prompt patches (Stage IV: versioned, source-tracked)\n const appliedPatches: string[] = []\n for (const patch of report.promptPatches) {\n try {\n const existingPrompt = roleRegistry.getPrompt(patch.role)\n if (existingPrompt && !existingPrompt.includes(patch.instruction.slice(0, 40))) {\n const newPrompt = existingPrompt + `\\n\\n## Auto-Patched Instruction (from ${patch.errorCategory} errors)\\n${patch.instruction}`\n roleRegistry.updatePrompt(patch.role as \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\", newPrompt, \"auto-evolve\", `Patch from ${patch.errorCategory} errors (${patch.occurrences}x)`)\n persistence.save(\"prompts\", \"state\", roleRegistry.getAllPromptStates())\n appliedPatches.push(`${patch.role}: \"${patch.instruction.slice(0, 60)}...\"`)\n }\n } catch { /* non-fatal */ }\n }\n\n if (patchedSkills.length > 0) {\n out += `### \u2705 Auto-Patched Skills\\n`\n for (const name of patchedSkills) {\n out += `- **${name}** \u2014 patched automatically\\n`\n }\n out += `\\n`\n }\n\n if (appliedPatches.length > 0) {\n out += `### \u2705 Auto-Patched Prompts\\n`\n for (const p of appliedPatches) {\n out += `- ${p}\\n`\n }\n out += `\\n`\n }\n\n out += `### Recommendations\\n`\n if (report.metrics.recommendations.length === 0) {\n out += `All metrics within healthy ranges. No changes recommended.\\n`\n } else {\n for (const rec of report.metrics.recommendations) {\n out += `- ${rec}\\n`\n }\n }\n\n if (report.skillPatches.length > 0) {\n out += `\\n### \uD83D\uDD27 Skill Patches (${report.skillPatches.length})\\n`\n for (const patch of report.skillPatches) {\n out += `\\n**${patch.skillName}** \u2014 ${patch.failures} failures\\n`\n for (const change of patch.suggestedChanges) {\n out += `- [${change.type}] ${change.description}\\n`\n out += ` \u2192 ${change.detail}\\n`\n }\n }\n }\n\n if (report.roleSuggestions.length > 0) {\n out += `\\n### \uD83D\uDC65 Role Suggestions (${report.roleSuggestions.length})\\n`\n for (const role of report.roleSuggestions) {\n out += `\\n**${role.name}**\\n`\n out += `- Trigger: \"${role.triggerPattern}\"\\n`\n out += `- Tools: ${role.suggestedTools.map(t => `\\`${t}\\``).join(\", \")}\\n`\n out += `- Reason: ${role.reason}\\n`\n }\n }\n\n if (report.metrics.topErrorCategories.length > 0) {\n out += `\\n### \uD83D\uDCCA Top Error Categories\\n`\n for (const err of report.metrics.topErrorCategories) {\n out += `- **${err.category}**: ${err.count} occurrence(s)\\n`\n }\n }\n\n if (report.promptPatches.length > 0) {\n out += `\\n### \uD83D\uDCDD Prompt Auto-Patches (${report.promptPatches.length})\\n`\n for (const pp of report.promptPatches) {\n const priorityIcon = pp.priority === \"high\" ? \"\uD83D\uDD34\" : pp.priority === \"medium\" ? \"\uD83D\uDFE1\" : \"\uD83D\uDFE2\"\n out += `${priorityIcon} **${pp.role}** \u2014 ${pp.errorCategory} (${pp.occurrences}x)\\n`\n out += ` \u2192 ${pp.instruction}\\n`\n }\n }\n\n // Cross-session pattern discovery (Gap #3)\n const allSkillsForPd = skillStore.getAll().map(s => ({\n name: s.definition.meta.name,\n successRate: s.successRate,\n usageCount: s.usageCount,\n }))\n const patternReport = patternDiscovery.analyze(allEpisodes, [], allSkillsForPd)\n if (patternReport.recommendations.length > 0) {\n out += `\\n### \uD83D\uDD0D Cross-Session Patterns\\n`\n out += `**Total sessions analyzed:** ${patternReport.totalSessions}\\n\\n`\n\n const highRecs = patternReport.recommendations.filter(r => r.priority === \"high\")\n if (highRecs.length > 0) {\n out += `**\u26A0\uFE0F High Priority (${highRecs.length})**\\n`\n for (const rec of highRecs) {\n out += `- ${rec.description}\\n`\n out += ` \u2192 ${rec.action}\\n`\n }\n out += \"\\n\"\n }\n\n const medRecs = patternReport.recommendations.filter(r => r.priority === \"medium\")\n if (medRecs.length > 0) {\n out += `**Medium Priority (${medRecs.length})**\\n`\n for (const rec of medRecs) {\n out += `- ${rec.description}\\n`\n }\n out += \"\\n\"\n }\n\n if (patternReport.errorPatterns.length > 0) {\n out += `**Error Patterns:**\\n`\n for (const ep of patternReport.errorPatterns) {\n out += `- \\`${ep.category}\\`: ${ep.sessionCount}/${patternReport.totalSessions} sessions (${(ep.sessionAffinity * 100).toFixed(0)}%)\\n`\n }\n out += \"\\n\"\n }\n\n if (patternReport.filePatterns.some(f => f.isHotSpot)) {\n out += `**Hot Spot Files:**\\n`\n for (const fp of patternReport.filePatterns.filter(f => f.isHotSpot).slice(0, 5)) {\n out += `- \\`${fp.filePath}\\` \u2192 ${fp.sessionCount} sessions`\n if (fp.coChangedFiles.length > 0) {\n out += ` (co-changed: ${fp.coChangedFiles.map(c => `\\`${c.filePath}\\``).join(\", \")}`\n }\n out += \")\\n\"\n }\n }\n }\n\n return { output: out }\n }\n\n case \"read-prompt\": {\n const targetRole = args.role ?? \"developer\"\n const prompt = roleRegistry.getPrompt(targetRole)\n if (!prompt) return { output: `Role \"${targetRole}\" not found.` }\n const state = roleRegistry.getPromptState(targetRole)\n const ver = state?.currentVersion ?? 1\n return {\n output: `## \uD83D\uDCD6 Prompt for \\`${targetRole}\\` (v${ver})\\n\\n\\`\\`\\`\\n${prompt}\\n\\`\\`\\``,\n }\n }\n\n case \"edit-prompt\": {\n const targetRole = args.role ?? \"developer\"\n if (!args.prompt) return { output: \"`prompt` (instruction to append) is required for edit-prompt.\" }\n const existingPrompt = roleRegistry.getPrompt(targetRole)\n if (!existingPrompt) return { output: `Role \"${targetRole}\" not found.` }\n const newPrompt = existingPrompt + `\\n\\n## Self-Patched Instruction (agent-driven)\\n${args.prompt}`\n const updated = roleRegistry.updatePrompt(targetRole as \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\", newPrompt, \"agent-self\", args.description ?? \"Agent self-modification\")\n if (!updated) return { output: `Failed to update prompt for role \"${targetRole}\". Only built-in roles can be edited.` }\n persistence.save(\"prompts\", \"state\", roleRegistry.getAllPromptStates())\n return {\n output: `\u2705 Prompt for \\`${targetRole}\\` updated (v${roleRegistry.getPromptState(targetRole)?.currentVersion}). New instruction appended at the end.`,\n }\n }\n\n case \"prompt-history\": {\n const targetRole = args.role ?? \"developer\"\n const history = roleRegistry.getPromptHistory(targetRole)\n if (history.length === 0) return { output: `No prompt history for \"${targetRole}\".` }\n let out = `## \uD83D\uDCDC Prompt History for \\`${targetRole}\\`\\n\\n`\n for (const entry of history) {\n const preview = entry.prompt.slice(-200).replace(/\\n/g, \" \")\n out += `**v${entry.version}** \u2014 ${entry.timestamp} \u2014 source: ${entry.source}`\n if (entry.description) out += ` \u2014 ${entry.description}`\n out += `\\n\\`\\`\\`\\n...${preview.slice(-200)}\\n\\`\\`\\`\\n\\n`\n }\n return { output: out }\n }\n\n case \"rollback-prompt\": {\n const targetRole = args.role ?? \"developer\"\n const version = args.version\n if (!version) return { output: \"`version` is required for rollback-prompt.\" }\n const history = roleRegistry.getPromptHistory(targetRole)\n if (history.length === 0) return { output: `No prompt history for \"${targetRole}\".` }\n const target = history.find(e => e.version === version)\n if (!target) return { output: `Version ${version} not found for \"${targetRole}\". Available versions: ${history.map(e => `v${e.version}`).join(\", \")}` }\n const ok = roleRegistry.rollbackPrompt(targetRole, version)\n if (!ok) return { output: `Failed to rollback prompt for \"${targetRole}\".` }\n persistence.save(\"prompts\", \"state\", roleRegistry.getAllPromptStates())\n return {\n output: `\u2705 Prompt for \\`${targetRole}\\` rolled back to v${version} (from ${target.timestamp}).`,\n }\n }\n\n case \"export-training-data\": {\n const allSkills = skillStore.getAll()\n const fmt = args.format ?? \"openai\"\n const minRate = args.minSuccessRate ?? 0.5\n const dataset = skillsToTrainingData(allSkills, fmt, minRate)\n\n const filteredSkills = allSkills.filter(s => s.successRate >= minRate)\n const examples = filteredSkills.map(s => skillToTrainingExample(s))\n const summary = trainingDatasetSummary(examples)\n\n let out = summary\n out += `\\n\\n### Training Data (${dataset.format})\\n`\n out += `\\`\\`\\`\\n${dataset.data.slice(0, 2000)}${dataset.data.length > 2000 ? \"\\n\u2026 (truncated)\" : \"\"}\\n\\`\\`\\``\n if (dataset.data.length > 2000) {\n out += `\\n\\n**Full dataset:** ${dataset.data.length} characters, ${dataset.totalExamples} examples`\n }\n return { output: out }\n }\n\n default:\n return { output: `Unknown action: ${args.action}. Available: inspect, register-role, export-skill, memory-schema, evolve, read-prompt, edit-prompt, prompt-history, rollback-prompt, export-training-data.` }\n }\n },\n }),\n\n agentic_auto: tool({\n description: \"Fully autonomous engineering agent. Give it a goal and it plans, implements, verifies, and fixes code automatically \u2014 no step-by-step guidance needed.\",\n args: {\n goal: tool.schema.string().describe(\"The goal to accomplish autonomously\"),\n constraints: tool.schema.array(tool.schema.string()).optional().describe(\"Constraints or requirements\"),\n },\n async execute(args, context) {\n llmEngine.setSessionId(context.sessionID)\n const startTime = Date.now()\n const projectDir = ctxDir(context)\n\n // 1. Scan codebase for context\n await navigator.scan(projectDir)\n const summary = navigator.getSummary()\n\n // 2. LLM-driven plan (fallback to template if LLM returns empty)\n let subtasks: Subtask[] = []\n try {\n const intent = await planner.decomposeWithLLM(llmEngine, args.goal, summary)\n if (intent.subtasks.length > 0) subtasks = intent.subtasks\n } catch { /* fall through */ }\n if (subtasks.length === 0) {\n const template = planner.decompose(args.goal, [])\n if (template.autoGenerated) subtasks = template.intent.subtasks\n }\n if (subtasks.length === 0) {\n subtasks = [\n { id: \"step-1\", description: args.goal, dependsOn: [], verificationCriteria: [\"All code compiles\", \"Logic is correct\"] },\n ]\n }\n if (subtasks.length === 0) {\n return {\n output: `## \uD83E\uDD16 Autonomous Agent Report\\n\\n**Goal:** ${args.goal}\\n**Result:** 0/0 steps \u2014 could not decompose into subtasks. Try rephrasing the goal or using \\`agentic_plan\\` manually.`,\n metadata: { result: { completedSteps: [], failedSteps: [], totalIterations: 0, success: false, summary: \"Planning failed: no subtasks generated\" } },\n }\n }\n\n const plan = intentParser.createPlan({\n goal: args.goal,\n constraints: args.constraints ?? [],\n context: { relevantFiles: [], dependencies: [] },\n subtasks,\n })\n executor.initExecution(context.sessionID, plan)\n\n // 3. Execute steps via AgentLoop.runLoop()\n const parseStepOutput = (content: string): { files?: Array<{ path: string; content: string }>; summary?: string } => {\n const cleaned = content.trim()\n try {\n const parsed = JSON.parse(cleaned)\n if (parsed && typeof parsed === \"object\") return parsed\n } catch { /* try next */ }\n const jsonBlock = cleaned.match(/```(?:json)?\\s*\\n?(\\{[\\s\\S]*?\\})\\s*\\n?```/)\n if (jsonBlock) {\n try { return JSON.parse(jsonBlock[1]) } catch { /* try next */ }\n }\n const jsonMatch = cleaned.match(/\\{[\\s\\S]*?\"files\"[\\s\\S]*?\"summary\"[\\s\\S]*?\\}/)\n if (jsonMatch) {\n try {\n const p = JSON.parse(jsonMatch[0])\n if (Array.isArray(p.files) || p.summary) return p\n } catch { /* try next */ }\n }\n return { files: [], summary: cleaned.replace(/```[\\s\\S]*?```/g, \"\").slice(0, 200).trim() }\n }\n\n const stepExecutor = async (step: Subtask) => {\n const stepsSoFar = executor.getCompletedSteps(context.sessionID)\n const prevState = executor.getStepState(context.sessionID, step.id)\n const retryNote = prevState?.retryCount && prevState.retryCount > 0\n ? `\\nPREVIOUS ATTEMPT FAILED (retry #${prevState.retryCount}/3). Errors:\\n${(prevState.errorHistory || []).map(e => `- ${e.error}`).join(\"\\n\")}`\n : \"\"\n const resp = await llmEngine.call({\n systemPrompt: `You are an autonomous software engineer implementing a step of a larger plan. Generate implementation as JSON with:\n- \"files\": [{ \"path\": \"relative/file/path\", \"content\": \"file content\" }]\n- \"summary\": \"what was done\"\nOnly include files that need changing. Return ONLY valid JSON.` + llmEngine.getMemoryContext(step.description),\n userPrompt: `Goal: ${args.goal}\\nStep (${step.id}): ${step.description}\\nDir: ${projectDir}\\nCompleted steps: ${stepsSoFar.join(\", \") || \"none\"}${retryNote}`,\n jsonMode: false,\n temperature: prevState?.retryCount ? 0.4 : 0.3,\n })\n\n const impl = parseStepOutput(resp.content)\n\n // Validate LLM actually produced implementation\n const hasContent = (impl.files && impl.files.length > 0) || (impl.summary && impl.summary.length > 20)\n if (!hasContent) {\n return { success: false, output: `LLM produced no implementation. Raw output: ${resp.content.slice(0, 200)}`, filesModified: [] }\n }\n\n const files: string[] = []\n for (const file of impl.files ?? []) {\n const fullPath = join(projectDir, file.path)\n mkdirSync(dirname(fullPath), { recursive: true })\n writeFileSync(fullPath, file.content, \"utf-8\")\n files.push(file.path)\n }\n\n return { success: true, output: impl.summary ?? step.description, filesModified: files }\n }\n\n const fixExecutor = async (fix: string) => {\n try {\n execFileSync(\"bash\", [\"-c\", fix], { cwd: projectDir, timeout: 30000, stdio: \"pipe\" })\n return true\n } catch { return false }\n }\n\n const result = await agentLoop.runLoop(\n context.sessionID, executor, verifier, errorAnalyzer, depTracker,\n projectDir, stepExecutor, fixExecutor,\n )\n\n // 4. Trace + episode\n const allFiles = executor.getAllFilesModified(context.sessionID)\n traceLogger.log({\n step: \"auto\", input: args.goal, output: JSON.stringify(result),\n toolUsed: \"agentic_auto\", success: result.success,\n durationMs: Date.now() - startTime, metadata: { ...result } as unknown as Record<string, unknown>,\n })\n\n episodicStore.record(\n context.sessionID, args.goal,\n result.success ? \"success\" : \"partial\",\n result.completedSteps.map(() => \"completed\"),\n allFiles,\n )\n\n // 5. Feed results to ContinuousEvolution\n const completedSteps = executor.getCompletedSteps(context.sessionID)\n for (const stepId of completedSteps) {\n continuousEvolution.feedStepResult({\n stepId,\n success: true,\n output: \"completed\",\n sessionId: context.sessionID,\n timestamp: Date.now(),\n })\n }\n for (const stepId of result.failedSteps) {\n continuousEvolution.feedStepResult({\n stepId,\n success: false,\n output: \"failed\",\n sessionId: context.sessionID,\n timestamp: Date.now(),\n })\n }\n const autoTrend = continuousEvolution.checkAndNotify()\n\n // 6. Auto-extract skill if successful\n if (result.success && result.completedSteps.length > 0) {\n const skillResult = await skillStore.extract({\n role: \"tool\",\n content: `\u2705 Successfully completed: ${args.goal}\\nSteps completed: ${result.completedSteps.join(\", \")}\\nSummary: ${result.summary}`,\n }, [args.goal, ...(args.constraints ?? [])])\n if (skillResult) {\n persistence.save(\"skills\", skillResult.definition.meta.id, skillResult.definition)\n }\n }\n\n // 7. Report\n const totalSteps = result.completedSteps.length + result.failedSteps.length\n let report = `## \uD83E\uDD16 Autonomous Agent Report\\n\\n`\n report += `**Goal:** ${args.goal}\\n`\n report += `**Result:** ${result.completedSteps.length}/${totalSteps} steps (${result.totalIterations} iterations)\\n`\n report += `${result.success ? \"\u2705 All passed\" : \"\u26A0\uFE0F Some failed\"}\\n`\n report += `**Duration:** ${((Date.now() - startTime) / 1000).toFixed(1)}s\\n\\n`\n if (allFiles.length > 0) {\n report += `### Files Modified\\n\\`\\`\\`\\n${[...new Set(allFiles)].join(\"\\n\")}\\n\\`\\`\\`\\n`\n }\n report += `\\n${result.summary}`\n\n // Evolution trend summary\n if (autoTrend.overall.total >= 5 || autoTrend.degradationDetected) {\n const dirIcon = autoTrend.rolling.direction === \"improving\" ? \"\uD83D\uDCC8\" : autoTrend.rolling.direction === \"degrading\" ? \"\uD83D\uDCC9\" : \"\uD83D\uDCCA\"\n report += `\\n\\n### ${dirIcon} Evolution Trend\\n`\n report += `**Overall:** ${(autoTrend.overall.successRate * 100).toFixed(0)}% (${autoTrend.overall.success}/${autoTrend.overall.total})\\n`\n report += `**Recent (last ${autoTrend.rolling.windowSize}):** ${(autoTrend.rolling.successRate * 100).toFixed(0)}% \u2014 ${autoTrend.rolling.direction}\\n`\n if (autoTrend.degradationDetected) {\n report += `\u26A0\uFE0F **Degradation detected!** Auto-running self-evolution...\\n`\n try {\n const evolveSummary = await runAutoEvolve()\n report += `${evolveSummary.replace(/\\n/g, \"\\n\")}\\n`\n } catch (e) {\n report += `\u26A0\uFE0F Auto-evolution encountered an error: ${(e as Error).message}\\n`\n }\n }\n if (autoTrend.recommendations.length > 0) {\n report += `**Suggestions:**\\n${autoTrend.recommendations.map(r => `- ${r}`).join(\"\\n\")}\\n`\n }\n }\n\n // Live evaluation score\n if (liveEvaluator.computeScore().totalSteps > 0 || liveEvaluator.computeScore().totalDelegations > 0) {\n report += `\\n\\n${liveEvaluator.formatReport(false)}`\n }\n\n return { output: report, metadata: { result } }\n },\n }),\n },\n\n \"tool.execute.after\": async (toolInput: { tool: string; args: Record<string, unknown>; sessionID: string; callID: string }, _output: { title: string; output: string; metadata: unknown }) => {\n traceLogger.log({\n step: \"tool\",\n input: JSON.stringify(toolInput.args ?? {}),\n output: \"completed\",\n toolUsed: toolInput.tool,\n success: true,\n durationMs: 0,\n })\n\n // Feed LiveEvaluator from tool execution\n try {\n const args = toolInput.args ?? {}\n switch (toolInput.tool) {\n case \"agentic_execute\": {\n const success = args.success === true\n if (args.stepId) {\n liveEvaluator.feedStepResult({ stepId: String(args.stepId), success, sessionId: toolInput.sessionID })\n // Error recovery tracking: if retry succeeded after an error\n if (success && args.error && String(args.error).length > 0) {\n liveEvaluator.feedErrorRecovery(`exec-${args.stepId}`, true)\n } else if (!success && args.error && String(args.error).length > 0) {\n liveEvaluator.feedErrorRecovery(`exec-${args.stepId}`, false)\n }\n }\n break\n }\n case \"agentic_reflect\": {\n // Each reflect call counts as error recovery attempt\n if (args.stepId) {\n liveEvaluator.feedErrorRecovery(`reflect-${args.stepId}`, true)\n }\n break\n }\n case \"agentic_nav\": {\n if (args.query) {\n const outputText = _output?.output || \"\"\n const fileMatches = (outputText.match(/\\.ts/g) ?? []).length\n liveEvaluator.feedNavigation(String(args.query), fileMatches)\n }\n break\n }\n case \"agentic_delegate\": {\n if (args.taskId && args.role) {\n const outputOk = (_output?.output || \"\").includes(\"delegated\") || (_output?.output || \"\").includes(\"Delegated\")\n liveEvaluator.feedDelegation(String(args.taskId), String(args.role), outputOk)\n }\n break\n }\n case \"agentic_skill\": {\n if (args.action === \"find\" || args.action === \"search\") {\n const found = (_output?.output || \"\").includes(\"Skill\") || (_output?.output || \"\").includes(\"skill\")\n liveEvaluator.feedSkillLookup(found)\n }\n break\n }\n }\n } catch { /* non-fatal */ }\n },\n\n dispose: async () => {\n configLoader.stopWatch()\n persistence.save(\"models\", \"registry\", modelRegistry.toJSON())\n persistence.save(\"prompts\", \"state\", roleRegistry.getAllPromptStates())\n await traceLogger.dispose()\n },\n }\n}\n\nexport const AgenticEngine: Plugin = createEngine\n\nconst pluginModule: PluginModule = {\n id: \"agentic-engine\",\n server: createEngine,\n}\nexport default pluginModule\n\n// Re-export key classes so tests can construct them directly\nexport { ErrorAnalyzer } from \"./core/error-analyzer.js\"\nexport { RoleRegistry } from \"./agents/role-registry.js\"\nexport { VectorStore } from \"./memory/vector-store.js\"\nexport { Verifier } from \"./core/verifier.js\"\nexport { ContinuousEvolution } from \"./evolution/continuous-evolution.js\"\nexport { SelfEvolver } from \"./evolution/self-evolver.js\"\nexport { AgentCoordinator } from \"./agents/coordinator.js\"\nexport { Executor } from \"./core/executor.js\"\nexport { PatternDiscovery } from \"./drift/pattern-discovery.js\"\nexport { skillToTrainingExample, skillsToTrainingData, exportOpenAIJSONL, exportInstructionsJSON, trainingDatasetSummary } from \"./memory/skill-training.js\"\nexport { LiveEvaluator } from \"./evaluation/live-evaluator.js\"\n", "export interface Subtask {\n id: string\n description: string\n dependsOn: string[]\n verificationCriteria: string[]\n}\n\nexport interface TaskIntent {\n goal: string\n constraints: string[]\n context: {\n relevantFiles: string[]\n dependencies: string[]\n }\n subtasks: Subtask[]\n}\n\nexport interface Plan {\n intent: TaskIntent\n estimatedSteps: number\n complexity: \"low\" | \"medium\" | \"high\"\n warnings: string[]\n}\n\nexport class IntentParser {\n createPlan(intent: TaskIntent): Plan {\n const complexity = intent.subtasks.length <= 3 ? \"low\"\n : intent.subtasks.length <= 8 ? \"medium\"\n : \"high\"\n\n const warnings: string[] = []\n if (complexity === \"high\") {\n warnings.push(\"Complex task detected. Consider breaking it down further.\")\n }\n if (intent.constraints.length === 0) {\n warnings.push(\"No constraints specified. Consider adding guardrails.\")\n }\n\n return {\n intent,\n estimatedSteps: intent.subtasks.length,\n complexity,\n warnings,\n }\n }\n\n validatePlan(plan: Plan): string[] {\n const errors: string[] = []\n const ids = new Set(plan.intent.subtasks.map(s => s.id))\n\n for (const step of plan.intent.subtasks) {\n for (const dep of step.dependsOn) {\n if (!ids.has(dep)) {\n errors.push(`Step \"${step.id}\" depends on unknown step \"${dep}\"`)\n }\n }\n }\n\n if (plan.intent.subtasks.length === 0) {\n errors.push(\"Plan has no subtasks\")\n }\n\n return errors\n }\n}\n", "import type { Subtask, Plan } from \"./intent-parser\"\n\nexport interface ExecutionResult {\n stepId: string\n success: boolean\n output: string\n filesModified?: string[]\n error?: string\n}\n\nexport interface StepErrorHistory {\n error: string\n attemptedFix: string\n timestamp: number\n success: boolean\n}\n\nexport interface StepState {\n result?: ExecutionResult\n retryCount: number\n errorHistory: StepErrorHistory[]\n}\n\nexport interface ExecutionState {\n plan: Plan\n completedSteps: Set<string>\n failedSteps: Map<string, string>\n stepStates: Map<string, StepState>\n currentStepIndex: number\n}\n\nexport class Executor {\n private maxRetries = 3\n private states = new Map<string, ExecutionState>()\n\n /** Per-error-category retry limits (Gap #13: adaptive retry policies).\n * Different error types need different retry strategies:\n * - compile/type: usually deterministic, 3 retries\n * - test: flaky tests may need fewer retries\n * - import: file-not-found won't fix by retrying\n * - runtime: environmental, worth a few retries\n */\n private retryPolicies = new Map<string, number>([\n [\"compile\", 3],\n [\"type\", 3],\n [\"test\", 2],\n [\"import\", 1],\n [\"runtime\", 3],\n [\"unknown\", 3],\n ])\n\n /** Set max retries for a specific error category. Default categories: compile, type, test, import, runtime, unknown */\n setRetryPolicy(category: string, maxRetries: number): void {\n this.retryPolicies.set(category, maxRetries)\n }\n\n /** Get max retries for an error category, or the global default if not categorized */\n getMaxRetries(category?: string): number {\n if (category && this.retryPolicies.has(category)) {\n return this.retryPolicies.get(category)!\n }\n return this.maxRetries\n }\n\n /** Get all retry policy summaries */\n getRetryPolicies(): Array<{ category: string; maxRetries: number }> {\n return [...this.retryPolicies.entries()]\n .map(([category, maxRetries]) => ({ category, maxRetries }))\n .sort((a, b) => a.category.localeCompare(b.category))\n }\n\n initExecution(sessionId: string, plan: Plan): ExecutionState {\n const state: ExecutionState = {\n plan,\n completedSteps: new Set(),\n failedSteps: new Map(),\n stepStates: new Map(),\n currentStepIndex: 0,\n }\n this.states.set(sessionId, state)\n return state\n }\n\n getNextStep(sessionId: string): Subtask | null {\n const state = this.states.get(sessionId)\n if (!state) return null\n\n for (const step of state.plan.intent.subtasks) {\n if (state.completedSteps.has(step.id)) continue\n if (state.failedSteps.has(step.id)) continue\n\n const depsMet = step.dependsOn.every(d => state.completedSteps.has(d))\n if (depsMet) {\n state.currentStepIndex = state.plan.intent.subtasks.indexOf(step)\n return step\n }\n }\n\n return null\n }\n\n getBlockedSteps(sessionId: string): Array<{ id: string; description: string; blockedBy: string[] }> {\n const state = this.states.get(sessionId)\n if (!state) return []\n\n const blocked: Array<{ id: string; description: string; blockedBy: string[] }> = []\n for (const step of state.plan.intent.subtasks) {\n if (state.completedSteps.has(step.id)) continue\n if (state.failedSteps.has(step.id)) continue\n const unmet = step.dependsOn.filter(d => !state.completedSteps.has(d))\n if (unmet.length > 0) {\n blocked.push({ id: step.id, description: step.description, blockedBy: unmet })\n }\n }\n return blocked\n }\n\n recordResult(sessionId: string, result: ExecutionResult): void {\n const state = this.states.get(sessionId)\n if (!state) return\n\n let stepState = state.stepStates.get(result.stepId)\n if (!stepState) {\n stepState = { retryCount: 0, errorHistory: [] }\n state.stepStates.set(result.stepId, stepState)\n }\n\n stepState.result = result\n\n if (result.success) {\n state.completedSteps.add(result.stepId)\n } else {\n stepState.retryCount++\n stepState.errorHistory.push({\n error: result.error ?? \"Unknown error\",\n attemptedFix: \"\",\n timestamp: Date.now(),\n success: false,\n })\n\n // Adaptive: use per-category retry limit (Gap #13)\n const errorCategory = this.detectErrorCategory(result.error ?? result.output)\n const maxRetries = this.getMaxRetries(errorCategory)\n\n if (stepState.retryCount < maxRetries) {\n state.failedSteps.delete(result.stepId)\n } else {\n state.failedSteps.set(result.stepId, result.error ?? `Max retries (${maxRetries}) exceeded for category: ${errorCategory}`)\n }\n }\n }\n\n recordFixAttempt(sessionId: string, stepId: string, fix: string, success: boolean): void {\n const state = this.states.get(sessionId)\n if (!state) return\n\n const stepState = state.stepStates.get(stepId)\n if (stepState && stepState.errorHistory.length > 0) {\n const last = stepState.errorHistory[stepState.errorHistory.length - 1]\n last.attemptedFix = fix\n last.success = success\n }\n }\n\n canRetry(sessionId: string, stepId: string, category?: string): boolean {\n const state = this.states.get(sessionId)\n if (!state) return false\n const ss = state.stepStates.get(stepId)\n\n // Adaptive: if category provided, use per-category limit\n if (category) {\n return (ss?.retryCount ?? 0) < this.getMaxRetries(category)\n }\n\n // Fall back to last known error's category\n if (ss?.result?.error) {\n const detectedCategory = this.detectErrorCategory(ss.result.error)\n return (ss?.retryCount ?? 0) < this.getMaxRetries(detectedCategory)\n }\n\n return (ss?.retryCount ?? 0) < this.maxRetries\n }\n\n /** Detect error category from error text */\n private detectErrorCategory(errorText: string): string {\n const lower = errorText.toLowerCase()\n if (lower.includes(\"cannot find module\") || lower.includes(\"module not found\") || lower.includes(\"import\") || lower.includes(\"require\")) return \"import\"\n if (lower.includes(\"type\") && (lower.includes(\"not assignable\") || lower.includes(\"is not a type\") || lower.includes(\"property\") || lower.includes(\"does not exist\"))) return \"type\"\n if (lower.includes(\"compile\") || lower.includes(\"tsc\") || lower.includes(\"syntax error\") || lower.includes(\"unexpected token\")) return \"compile\"\n if (lower.includes(\"test\") || lower.includes(\"assert\") || lower.includes(\"expected\") && lower.includes(\"to be\") || lower.includes(\"expect.\")) return \"test\"\n if (lower.includes(\"timeout\") || lower.includes(\"econnrefused\") || lower.includes(\"etimedout\") || lower.includes(\"network\")) return \"runtime\"\n return \"unknown\"\n }\n\n getRetryCount(sessionId: string, stepId: string): number {\n const state = this.states.get(sessionId)\n if (!state) return 0\n return state.stepStates.get(stepId)?.retryCount ?? 0\n }\n\n getCompletedSteps(sessionId: string): string[] {\n const state = this.states.get(sessionId)\n if (!state) return []\n return [...state.completedSteps]\n }\n\n getStepState(sessionId: string, stepId: string): StepState | undefined {\n return this.states.get(sessionId)?.stepStates.get(stepId)\n }\n\n isComplete(sessionId: string): boolean {\n const state = this.states.get(sessionId)\n if (!state) return false\n\n return state.plan.intent.subtasks.every(\n s => state.completedSteps.has(s.id) || state.failedSteps.has(s.id)\n )\n }\n\n isHealthy(sessionId: string): boolean {\n const state = this.states.get(sessionId)\n if (!state) return false\n return state.failedSteps.size === 0\n }\n\n getProgress(sessionId: string): { completed: number; total: number; failed: number; blocked: number } {\n const state = this.states.get(sessionId)\n if (!state) return { completed: 0, total: 0, failed: 0, blocked: 0 }\n\n return {\n completed: state.completedSteps.size,\n total: state.plan.intent.subtasks.length,\n failed: state.failedSteps.size,\n blocked: this.getBlockedSteps(sessionId).length,\n }\n }\n\n getAllFilesModified(sessionId: string): string[] {\n const state = this.states.get(sessionId)\n if (!state) return []\n const files = new Set<string>()\n for (const stepState of state.stepStates.values()) {\n if (stepState.result?.filesModified) {\n for (const f of stepState.result.filesModified) files.add(f)\n }\n }\n return [...files]\n }\n\n removeSession(sessionId: string): void {\n this.states.delete(sessionId)\n }\n}\n", "import { execFileSync } from \"node:child_process\"\nimport { existsSync, readFileSync } from \"node:fs\"\nimport { resolve } from \"node:path\"\nimport type { LLMEngine } from \"./llm.js\"\n\nexport type SupportedLanguage = \"typescript\" | \"python\" | \"go\" | \"rust\" | \"javascript\" | \"unknown\"\n\nexport interface VerificationResult {\n passed: boolean\n stepId: string\n checks: CheckResult[]\n errors: string[]\n}\n\nexport interface CheckResult {\n name: string\n passed: boolean\n output: string\n}\n\nexport interface LanguageConfig {\n compileCmd: (projectDir: string) => { bin: string; args: string[]; timeout: number }\n testCmd: (projectDir: string, testPattern?: string) => { bin: string; args: string[]; timeout: number }\n fileExts: string[]\n testFileExts: string[]\n}\n\nconst LANGUAGE_CONFIGS: Record<SupportedLanguage, LanguageConfig> = {\n typescript: {\n compileCmd: (dir) => ({ bin: \"npx\", args: [\"tsc\", \"--noEmit\", \"--pretty\", \"false\"], timeout: 30000 }),\n testCmd: (dir, pattern) => {\n const args = [\"vitest\", \"run\", \"--reporter\", \"verbose\"]\n if (pattern) args.push(\"--\", pattern)\n return { bin: \"npx\", args, timeout: 60000 }\n },\n fileExts: [\".ts\", \".tsx\"],\n testFileExts: [\".test.ts\", \".spec.ts\", \".test.tsx\", \".spec.tsx\"],\n },\n javascript: {\n compileCmd: (dir) => ({ bin: \"node\", args: [\"-e\", \"process.exit(0)\"], timeout: 5000 }),\n testCmd: (dir, pattern) => {\n const args = [\"vitest\", \"run\", \"--reporter\", \"verbose\"]\n if (pattern) args.push(\"--\", pattern)\n return { bin: \"npx\", args, timeout: 60000 }\n },\n fileExts: [\".js\", \".jsx\", \".mjs\"],\n testFileExts: [\".test.js\", \".spec.js\", \".test.jsx\", \".spec.jsx\"],\n },\n python: {\n compileCmd: (dir) => ({ bin: \"python\", args: [\"-m\", \"py_compile\", \"-q\", \".\"], timeout: 30000 }),\n testCmd: (dir, pattern) => {\n const args = [\"-m\", \"pytest\", \"-q\"]\n if (pattern) args.push(pattern)\n return { bin: \"python\", args, timeout: 60000 }\n },\n fileExts: [\".py\"],\n testFileExts: [\"test_\", \"_test.py\"],\n },\n go: {\n compileCmd: (dir) => ({ bin: \"go\", args: [\"vet\", \"./...\"], timeout: 30000 }),\n testCmd: (dir, pattern) => {\n const args = [\"test\", \"./...\", \"-count=1\"]\n if (pattern) args.push(\"-run\", pattern)\n return { bin: \"go\", args, timeout: 120000 }\n },\n fileExts: [\".go\"],\n testFileExts: [\"_test.go\"],\n },\n rust: {\n compileCmd: (dir) => ({ bin: \"cargo\", args: [\"check\", \"--quiet\"], timeout: 120000 }),\n testCmd: (dir, pattern) => {\n const args = [\"test\"]\n if (pattern) args.push(pattern)\n return { bin: \"cargo\", args, timeout: 120000 }\n },\n fileExts: [\".rs\"],\n testFileExts: [\"test.rs\"],\n },\n unknown: {\n compileCmd: (dir) => ({ bin: \"echo\", args: [\"no compile step\"], timeout: 1000 }),\n testCmd: (dir) => ({ bin: \"echo\", args: [\"no test step\"], timeout: 1000 }),\n fileExts: [],\n testFileExts: [],\n },\n}\n\nexport class Verifier {\n private detectedLang: SupportedLanguage = \"unknown\"\n private llm: LLMEngine | null = null\n\n setLLM(llm: LLMEngine): void {\n this.llm = llm\n }\n\n hasLLM(): boolean {\n return this.llm !== null\n }\n\n async verifySemantic(stepId: string, intent: string, changedFiles: string[], projectDir: string): Promise<CheckResult> {\n if (!this.llm) {\n return { name: \"semantic\", passed: true, output: \"Semantic verification skipped (no LLM configured)\" }\n }\n\n const fileContents: Record<string, string> = {}\n for (const f of changedFiles) {\n const absPath = resolve(projectDir, f)\n try {\n fileContents[f] = readFileSync(absPath, \"utf-8\")\n } catch { /* skip unreadable files */ }\n }\n\n if (Object.keys(fileContents).length === 0) {\n return { name: \"semantic\", passed: true, output: \"Semantic verification skipped (no readable changed files)\" }\n }\n\n const filesBlock = Object.entries(fileContents).map(([path, content]) =>\n `### ${path}\\n\\`\\`\\`\\n${content.slice(0, 2000)}\\n\\`\\`\\``\n ).join(\"\\n\\n\")\n\n const resp = await this.llm.call({\n systemPrompt: \"You are a semantic verification assistant. Given an intent/goal and the code changes made, determine if the changes correctly implement the intent. Consider: edge cases, completeness, correctness. Respond as JSON with keys: passed (boolean), reasoning (string), issuesFound (array of strings). If the code correctly implements the intent, passed must be true.\",\n userPrompt: `## Intent\\n${intent}\\n\\n## Changed Files\\n${filesBlock}\\n\\nVerify if these changes correctly implement the intent. Return JSON.`,\n jsonMode: true,\n temperature: 0.1,\n })\n\n try {\n const parsed = JSON.parse(resp.content)\n const issues = Array.isArray(parsed.issuesFound) ? parsed.issuesFound : []\n const passed = parsed.passed !== false\n return {\n name: \"semantic\",\n passed,\n output: `Semantic verification: ${passed ? \"PASS\" : \"ISSUES FOUND\"}\\nReasoning: ${parsed.reasoning ?? \"N/A\"}\\n${issues.length > 0 ? `Issues:\\n${issues.map((i: string) => `- ${i}`).join(\"\\n\")}` : \"\"}`,\n }\n } catch {\n return { name: \"semantic\", passed: true, output: `Semantic verification: ${resp.content.slice(0, 500)}` }\n }\n }\n\n async verifyAllDeep(stepId: string, projectDir: string, intent?: string, changedFiles?: string[], requireSemanticCheck = false): Promise<VerificationResult> {\n const checks: CheckResult[] = [\n this.verifyCompile(projectDir),\n ]\n if (this.detectedLang !== \"unknown\") {\n checks.push(this.verifyLint(projectDir))\n }\n checks.push(this.verifyTests(projectDir))\n\n if (this.llm && intent && changedFiles && changedFiles.length > 0) {\n const semantic = await this.verifySemantic(stepId, intent, changedFiles, projectDir)\n checks.push(semantic)\n } else if (requireSemanticCheck && changedFiles && changedFiles.length > 0) {\n checks.push({\n name: \"semantic\",\n passed: false,\n output: \"Semantic verification required but no LLM configured. Set requireSemanticCheck=false or configure LLM.\",\n })\n }\n\n const errors = checks.filter(c => !c.passed).map(c => c.output)\n return { passed: errors.length === 0, stepId, checks, errors }\n }\n\n detectLanguage(projectDir: string): SupportedLanguage {\n const checks: Array<{ lang: SupportedLanguage; file: string }> = [\n { lang: \"typescript\", file: \"tsconfig.json\" },\n { lang: \"rust\", file: \"Cargo.toml\" },\n { lang: \"go\", file: \"go.mod\" },\n { lang: \"python\", file: \"pyproject.toml\" },\n { lang: \"python\", file: \"setup.py\" },\n { lang: \"python\", file: \"requirements.txt\" },\n { lang: \"javascript\", file: \"package.json\" },\n ]\n\n for (const { lang, file } of checks) {\n if (existsSync(resolve(projectDir, file))) {\n if (lang === \"javascript\" && existsSync(resolve(projectDir, \"tsconfig.json\"))) {\n this.detectedLang = \"typescript\"\n return \"typescript\"\n }\n this.detectedLang = lang\n return lang\n }\n }\n\n this.detectedLang = \"unknown\"\n return \"unknown\"\n }\n\n getLanguage(): SupportedLanguage {\n return this.detectedLang\n }\n\n verifyCompile(projectDir: string): CheckResult {\n const lang = this.detectedLang === \"unknown\" ? this.detectLanguage(projectDir) : this.detectedLang\n const config = LANGUAGE_CONFIGS[lang] ?? LANGUAGE_CONFIGS.unknown\n const { bin, args, timeout } = config.compileCmd(projectDir)\n\n try {\n const output = execFileSync(bin, args, {\n cwd: projectDir,\n timeout,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n })\n return {\n name: `compile:${lang}`,\n passed: true,\n output: output || \"Compilation successful\",\n }\n } catch (e: unknown) {\n const err = e as { stdout?: string; stderr?: string; message?: string }\n return {\n name: `compile:${lang}`,\n passed: false,\n output: err.stderr || err.stdout || err.message || \"Compilation failed\",\n }\n }\n }\n\n verifyTests(projectDir: string, testPattern = \"\"): CheckResult {\n const lang = this.detectedLang === \"unknown\" ? this.detectLanguage(projectDir) : this.detectedLang\n const config = LANGUAGE_CONFIGS[lang] ?? LANGUAGE_CONFIGS.unknown\n const { bin, args, timeout } = config.testCmd(projectDir, testPattern)\n\n try {\n const output = execFileSync(bin, args, {\n cwd: projectDir,\n timeout,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n })\n return {\n name: testPattern ? `test:${testPattern}` : `test:all:${lang}`,\n passed: true,\n output: output || \"Tests passed\",\n }\n } catch (e: unknown) {\n const err = e as { stdout?: string; stderr?: string; message?: string }\n return {\n name: testPattern ? `test:${testPattern}` : `test:all:${lang}`,\n passed: false,\n output: err.stdout || err.stderr || err.message || \"Tests failed\",\n }\n }\n }\n\n verifyLint(projectDir: string): CheckResult {\n const lang = this.detectedLang === \"unknown\" ? this.detectLanguage(projectDir) : this.detectedLang\n\n const lintConfigs: Partial<Record<SupportedLanguage, { bin: string; args: string[] }>> = {\n typescript: { bin: \"npx\", args: [\"eslint\", \".\", \"--quiet\"] },\n javascript: { bin: \"npx\", args: [\"eslint\", \".\", \"--quiet\"] },\n python: { bin: \"python\", args: [\"-m\", \"ruff\", \"check\", \".\"] },\n go: { bin: \"golangci-lint\", args: [\"run\", \"./...\"] },\n }\n\n const config = lintConfigs[lang]\n if (!config) {\n return { name: `lint:${lang}`, passed: true, output: \"No linter configured for this language\" }\n }\n\n try {\n const output = execFileSync(config.bin, config.args, {\n cwd: projectDir,\n timeout: 60000,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n })\n return { name: `lint:${lang}`, passed: true, output: output || \"Lint passed\" }\n } catch (e: unknown) {\n const err = e as { stdout?: string; stderr?: string; message?: string }\n return {\n name: `lint:${lang}`,\n passed: false,\n output: err.stdout || err.stderr || err.message || \"Lint failed\",\n }\n }\n }\n\n verifyAll(stepId: string, projectDir: string): VerificationResult {\n if (this.detectedLang === \"unknown\") this.detectLanguage(projectDir)\n\n const checks = [\n this.verifyCompile(projectDir),\n ]\n if (this.detectedLang !== \"unknown\") {\n checks.push(this.verifyLint(projectDir))\n }\n checks.push(this.verifyTests(projectDir))\n\n const errors = checks.filter(c => !c.passed).map(c => c.output)\n\n return {\n passed: errors.length === 0,\n stepId,\n checks,\n errors,\n }\n }\n\n verifyRelated(stepId: string, projectDir: string, changedFiles: string[]): VerificationResult {\n if (this.detectedLang === \"unknown\") this.detectLanguage(projectDir)\n const lang = this.detectedLang\n const config = LANGUAGE_CONFIGS[lang] ?? LANGUAGE_CONFIGS.typescript\n\n const checks: CheckResult[] = [this.verifyCompile(projectDir)]\n\n const isTestFile = (f: string): boolean => config.testFileExts.some(ext => {\n if (ext.startsWith(\"test_\")) {\n const basename = f.split(\"/\").pop() ?? f\n return basename.startsWith(\"test_\")\n }\n if (ext.startsWith(\"_test.\")) return f.endsWith(ext)\n return f.endsWith(ext)\n })\n\n const testFiles = changedFiles.filter(f => isTestFile(f))\n const sourceFiles = changedFiles.filter(f =>\n !isTestFile(f) && config.fileExts.some(ext => f.endsWith(ext))\n )\n\n const inferredTestFiles = sourceFiles.flatMap(f => {\n const base = f.replace(/\\.\\w+$/, \"\")\n const dir = base.replace(/\\/[^/]*$/, \"\")\n const filename = base.replace(/.*\\//, \"\")\n\n return config.testFileExts.flatMap(ext => {\n if (ext.startsWith(\"test_\")) {\n return [`${dir}/test_${filename}${config.fileExts[0] ?? \".py\"}`]\n }\n if (ext.endsWith(\"_\")) {\n return [`${base}${ext}`]\n }\n return [`${base}${ext}`]\n })\n })\n\n const allTestFiles = [...new Set([...testFiles, ...inferredTestFiles])]\n\n if (allTestFiles.length > 0) {\n checks.push({\n name: `test:${allTestFiles.length} related files`,\n passed: true,\n output: `Related test files: ${allTestFiles.join(\", \")}`,\n })\n }\n\n if (lang !== \"unknown\") {\n checks.push(this.verifyLint(projectDir))\n }\n checks.push(this.verifyTests(projectDir))\n\n const errors = checks.filter(c => !c.passed).map(c => c.output)\n return {\n passed: errors.length === 0,\n stepId,\n checks,\n errors,\n }\n }\n}\n", "/** Minimal LLM interface \u2014 avoids importing the full LLMEngine */\nexport interface ErrorAnalyzerLLM {\n call(req: { systemPrompt: string; userPrompt: string; temperature?: number }): Promise<{ content: string }>\n}\n\nexport interface ErrorAnalysis {\n category: \"compile\" | \"type\" | \"test\" | \"import\" | \"runtime\" | \"unknown\"\n summary: string\n likelyRootCause: string\n suggestedFix: string\n affectedFiles: string[]\n severity: \"low\" | \"medium\" | \"high\" | \"critical\"\n}\n\nexport class ErrorAnalyzer {\n private llm: ErrorAnalyzerLLM | null = null\n\n /** Inject an LLM engine for asynchronous fallback analysis. */\n setLLM(llm: ErrorAnalyzerLLM): void {\n this.llm = llm\n }\n\n /** Check whether an LLM is configured for fallback. */\n hasLLM(): boolean {\n return this.llm !== null\n }\n\n /**\n * Synchronous rule-based analysis. Fast and dependency-free.\n * For ambiguous errors, returns category:\"unknown\".\n */\n analyze(errorMessage: string, modifiedFiles: string[]): ErrorAnalysis {\n const msg = errorMessage.toLowerCase()\n\n if (msg.includes(\"cannot find module\") || msg.includes(\"module not found\") || msg.includes(\"could not resolve\")) {\n const match = errorMessage.match(/['\"]([@\\w\\-/.]+)['\"]/)\n return {\n category: \"import\",\n summary: \"Missing module or broken import\",\n likelyRootCause: `The module ${match?.[1] ?? \"imported\"} could not be resolved. Check the import path or install the dependency.`,\n suggestedFix: `Verify the import statement is correct. If it's an npm package, run: npm install ${match?.[1] ?? \"\"}`,\n affectedFiles: modifiedFiles,\n severity: \"critical\",\n }\n }\n\n if (msg.includes(\"type\") && (msg.includes(\"is not assignable\") || msg.includes(\"has no\") || msg.includes(\"does not exist on type\"))) {\n return {\n category: \"type\",\n summary: \"TypeScript type error\",\n likelyRootCause: \"A type mismatch or missing property was introduced by recent changes.\",\n suggestedFix: \"Check the type annotations on recently modified code. Ensure function signatures, interfaces, and type imports match.\",\n affectedFiles: modifiedFiles,\n severity: \"high\",\n }\n }\n\n if (msg.includes(\"error ts\") || msg.includes(\"compilation failed\") || msg.includes(\"syntax error\")) {\n return {\n category: \"compile\",\n summary: \"Code fails to compile\",\n likelyRootCause: \"Syntax errors, missing imports, or broken references in recently modified files.\",\n suggestedFix: \"Run the compiler to see exact line numbers. Check the most recently modified files first.\",\n affectedFiles: modifiedFiles,\n severity: \"high\",\n }\n }\n\n if (msg.includes(\"test\") && (msg.includes(\"failed\") || msg.includes(\"assert\") || msg.includes(\"expect\"))) {\n return {\n category: \"test\",\n summary: \"Test assertion failure\",\n likelyRootCause: \"A code change broke existing behavior or the test expectations are outdated.\",\n suggestedFix: \"Review the failing test assertions. Either the code change introduced a bug, or the test needs to be updated to match new behavior.\",\n affectedFiles: modifiedFiles,\n severity: \"medium\",\n }\n }\n\n if (msg.includes(\"error\") && (msg.includes(\"throw\") || msg.includes(\"cannot\") || msg.includes(\"undefined\") || msg.includes(\"null\"))) {\n return {\n category: \"runtime\",\n summary: \"Runtime error detected\",\n likelyRootCause: \"A code path is hitting an unexpected state \u2014 possibly null/undefined access, missing guard, or unhandled edge case.\",\n suggestedFix: \"Add defensive checks (null guards, try/catch) at the point of failure. Consider adding input validation.\",\n affectedFiles: modifiedFiles,\n severity: \"high\",\n }\n }\n\n return {\n category: \"unknown\",\n summary: \"Unclassified error\",\n likelyRootCause: \"The error message does not match known patterns. Manual investigation needed.\",\n suggestedFix: \"Read the full error output carefully. Compare against the last successful state of the codebase.\",\n affectedFiles: modifiedFiles,\n severity: \"medium\",\n }\n }\n\n /**\n * Asynchronous LLM-enhanced analysis.\n * Tries rule-based first; if unknown AND LLM is available, asks the LLM\n * to classify the error and suggest a fix.\n */\n async analyzeDeep(errorMessage: string, modifiedFiles: string[]): Promise<ErrorAnalysis> {\n // Try rule-based first\n const ruleResult = this.analyze(errorMessage, modifiedFiles)\n if (ruleResult.category !== \"unknown\" || !this.llm) {\n return ruleResult\n }\n\n // LLM fallback for unknown errors\n try {\n const resp = await this.llm.call({\n systemPrompt: `You are an expert error analyzer for software engineering.\nGiven an error message, classify it into one category: compile, type, test, import, runtime, or unknown.\nThen provide:\n1. A short summary of the error\n2. The likely root cause (1-2 sentences)\n3. A specific, actionable suggested fix\n4. Severity: low, medium, high, or critical\n\nReturn your answer as JSON with fields: category, summary, likelyRootCause, suggestedFix, severity.\nOnly return valid JSON, no other text.`,\n userPrompt: `Error message:\n\\`\\`\\`\n${errorMessage.slice(0, 2000)}\n\\`\\`\\`\n\nModified files:\n${modifiedFiles.map(f => `- ${f}`).join(\"\\n\")}`,\n temperature: 0.1,\n })\n\n const cleaned = resp.content.trim()\n const jsonMatch = cleaned.match(/\\{[\\s\\S]*\\}/)\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0])\n const validCategories = [\"compile\", \"type\", \"test\", \"import\", \"runtime\", \"unknown\"]\n return {\n category: validCategories.includes(parsed.category) ? parsed.category : \"unknown\",\n summary: parsed.summary ?? \"LLM-analyzed error\",\n likelyRootCause: parsed.likelyRootCause ?? parsed.rootCause ?? \"Could not determine root cause\",\n suggestedFix: parsed.suggestedFix ?? parsed.fix ?? \"Could not determine fix\",\n affectedFiles: modifiedFiles,\n severity: [\"low\", \"medium\", \"high\", \"critical\"].includes(parsed.severity) ? parsed.severity : \"medium\",\n }\n }\n } catch {\n // LLM fallback failed \u2014 return original unknown result\n }\n\n return ruleResult\n }\n}\n", "import type { TaskIntent, Subtask } from \"./intent-parser.js\"\nimport type { LLMEngine } from \"./llm.js\"\n\nexport interface DecompositionRule {\n pattern: RegExp | string\n keywords: string[]\n template: (context: string) => Subtask[]\n}\n\nexport class Planner {\n private rules: DecompositionRule[] = [\n {\n pattern: /add|create|build|implement/i,\n keywords: [\"feature\", \"component\", \"module\", \"page\", \"endpoint\", \"api\"],\n template: (goal: string) => [\n { id: \"plan-types\", description: \"Define TypeScript interfaces and types needed\", dependsOn: [], verificationCriteria: [\"No type errors\"] },\n { id: \"plan-impl\", description: `Implement: ${goal}`, dependsOn: [\"plan-types\"], verificationCriteria: [\"Tests pass\"] },\n { id: \"plan-tests\", description: \"Write comprehensive unit tests\", dependsOn: [\"plan-impl\"], verificationCriteria: [\"All tests pass\"] },\n ],\n },\n {\n pattern: /fix|bug|repair|resolve|patch/i,\n keywords: [\"bug\", \"issue\", \"error\", \"crash\", \"broken\"],\n template: (goal: string) => [\n { id: \"fix-repro\", description: \"Reproduce the bug and add a failing test\", dependsOn: [], verificationCriteria: [\"Test reproduces the error\"] },\n { id: \"fix-root\", description: `Identify root cause and apply fix: ${goal}`, dependsOn: [\"fix-repro\"], verificationCriteria: [\"Failing test now passes\"] },\n { id: \"fix-regression\", description: \"Run full test suite to check for regressions\", dependsOn: [\"fix-root\"], verificationCriteria: [\"All tests pass\"] },\n ],\n },\n {\n pattern: /refactor|clean|restructure|extract/i,\n keywords: [\"refactor\", \"cleanup\", \"extract\", \"move\", \"rename\"],\n template: (goal: string) => [\n { id: \"refactor-audit\", description: \"Audit current implementation and document dependencies\", dependsOn: [], verificationCriteria: [\"Dependency map created\"] },\n { id: \"refactor-extract\", description: `Extract and restructure: ${goal}`, dependsOn: [\"refactor-audit\"], verificationCriteria: [\"Tests still pass\"] },\n { id: \"refactor-cleanup\", description: \"Remove old code and update references\", dependsOn: [\"refactor-extract\"], verificationCriteria: [\"No dead code\", \"Tests pass\"] },\n ],\n },\n {\n pattern: /test|spec|verify/i,\n keywords: [\"test\", \"spec\", \"coverage\", \"verify\"],\n template: (goal: string) => [\n { id: \"test-audit\", description: \"Identify untested code paths and edge cases\", dependsOn: [], verificationCriteria: [\"Coverage gaps documented\"] },\n { id: \"test-write\", description: `Write tests: ${goal}`, dependsOn: [\"test-audit\"], verificationCriteria: [\"New tests pass\"] },\n { id: \"test-verify\", description: \"Run full suite and verify coverage improved\", dependsOn: [\"test-write\"], verificationCriteria: [\"Coverage increased\"] },\n ],\n },\n {\n pattern: /deploy|release|ship/i,\n keywords: [\"deploy\", \"release\", \"publish\", \"launch\", \"ship\"],\n template: (goal: string) => [\n { id: \"deploy-audit\", description: \"Verify all tests pass and build succeeds\", dependsOn: [], verificationCriteria: [\"CI green\"] },\n { id: \"deploy-build\", description: `Build production artifacts: ${goal}`, dependsOn: [\"deploy-audit\"], verificationCriteria: [\"Build succeeds\"] },\n { id: \"deploy-release\", description: \"Tag release and update changelog\", dependsOn: [\"deploy-build\"], verificationCriteria: [\"Release tagged\"] },\n ],\n },\n {\n pattern: /migrate|upgrade|update dep/i,\n keywords: [\"migrate\", \"upgrade\", \"update\", \"bump\", \"dependency\"],\n template: (goal: string) => [\n { id: \"migrate-check\", description: \"Check breaking changes and compatibility\", dependsOn: [], verificationCriteria: [\"Breaking changes documented\"] },\n { id: \"migrate-impl\", description: `Apply migration: ${goal}`, dependsOn: [\"migrate-check\"], verificationCriteria: [\"Migration applied\"] },\n { id: \"migrate-verify\", description: \"Run full test suite and check for regressions\", dependsOn: [\"migrate-impl\"], verificationCriteria: [\"All tests pass\"] },\n ],\n },\n {\n pattern: /doc|document|readme/i,\n keywords: [\"document\", \"documentation\", \"readme\", \"docs\", \"comment\"],\n template: (goal: string) => [\n { id: \"doc-audit\", description: \"Identify undocumented APIs and missing docs\", dependsOn: [], verificationCriteria: [\"Gaps documented\"] },\n { id: \"doc-write\", description: `Write documentation: ${goal}`, dependsOn: [\"doc-audit\"], verificationCriteria: [\"Docs generated\"] },\n { id: \"doc-review\", description: \"Review documentation accuracy and completeness\", dependsOn: [\"doc-write\"], verificationCriteria: [\"Docs reviewed\"] },\n ],\n },\n {\n pattern: /perf|optimize|speed|slow|fast/i,\n keywords: [\"performance\", \"optimize\", \"speed\", \"slow\", \"bottleneck\", \"profile\"],\n template: (goal: string) => [\n { id: \"perf-profile\", description: \"Profile and identify bottlenecks\", dependsOn: [], verificationCriteria: [\"Bottleneck identified\"] },\n { id: \"perf-impl\", description: `Apply optimization: ${goal}`, dependsOn: [\"perf-profile\"], verificationCriteria: [\"Performance improved\"] },\n { id: \"perf-verify\", description: \"Benchmark and verify no regressions\", dependsOn: [\"perf-impl\"], verificationCriteria: [\"Benchmarks stable\"] },\n ],\n },\n {\n pattern: /security|auth|vuln|injection|xss|csrf/i,\n keywords: [\"security\", \"vulnerability\", \"auth\", \"permission\", \"encrypt\", \"harden\", \"protect\"],\n template: (goal: string) => [\n { id: \"sec-audit\", description: \"Audit current security posture and identify vulnerabilities\", dependsOn: [], verificationCriteria: [\"Vulnerabilities documented\"] },\n { id: \"sec-fix\", description: `Apply security fix: ${goal}`, dependsOn: [\"sec-audit\"], verificationCriteria: [\"Fix verified\"] },\n { id: \"sec-verify\", description: \"Run security scan and verify no regressions\", dependsOn: [\"sec-fix\"], verificationCriteria: [\"Scan passes\"] },\n ],\n },\n {\n pattern: /docker|container|image/i,\n keywords: [\"docker\", \"container\", \"image\", \"dockerfile\", \"compose\"],\n template: (goal: string) => [\n { id: \"docker-audit\", description: \"Review current Docker setup and dependencies\", dependsOn: [], verificationCriteria: [\"Dockerfile reviewed\"] },\n { id: \"docker-build\", description: `Build and optimize Docker image: ${goal}`, dependsOn: [\"docker-audit\"], verificationCriteria: [\"Image builds\"] },\n { id: \"docker-test\", description: \"Test container startup and health check\", dependsOn: [\"docker-build\"], verificationCriteria: [\"Container healthy\"] },\n ],\n },\n {\n pattern: /ci|cd|pipeline|github.action|gitlab/i,\n keywords: [\"ci\", \"cd\", \"pipeline\", \"github action\", \"gitlab\", \"deploy\", \"automation\"],\n template: (goal: string) => [\n { id: \"ci-design\", description: \"Design CI/CD pipeline stages and triggers\", dependsOn: [], verificationCriteria: [\"Pipeline stages defined\"] },\n { id: \"ci-impl\", description: `Implement CI/CD pipeline: ${goal}`, dependsOn: [\"ci-design\"], verificationCriteria: [\"Pipeline runs\"] },\n { id: \"ci-verify\", description: \"Verify pipeline executes end-to-end\", dependsOn: [\"ci-impl\"], verificationCriteria: [\"Pipeline green\"] },\n ],\n },\n ]\n\n decompose(goal: string, relevantFiles: string[]): { intent: TaskIntent; autoGenerated: boolean } {\n const intent: TaskIntent = {\n goal,\n constraints: [],\n context: { relevantFiles, dependencies: [] },\n subtasks: [],\n }\n\n for (const rule of this.rules) {\n const patternMatch = typeof rule.pattern === \"string\"\n ? goal.toLowerCase().includes(rule.pattern.toLowerCase())\n : rule.pattern.test(goal)\n\n const keywordMatch = rule.keywords.some(k => goal.toLowerCase().includes(k.toLowerCase()))\n\n if (patternMatch && keywordMatch) {\n intent.subtasks = rule.template(goal)\n return { intent, autoGenerated: true }\n }\n }\n\n return { intent, autoGenerated: false }\n }\n\n registerRule(rule: DecompositionRule): void {\n this.rules.push(rule)\n }\n\n getRules(): DecompositionRule[] {\n return [...this.rules]\n }\n\n async decomposeWithLLM(llm: LLMEngine, goal: string, codebaseSummary: string): Promise<TaskIntent> {\n const llmPlan = await llm.generatePlan(goal, [], codebaseSummary)\n const subtasks = Array.isArray(llmPlan.steps)\n ? llmPlan.steps.map(s => ({\n id: s.id,\n description: s.description,\n dependsOn: s.dependsOn ?? [],\n verificationCriteria: [],\n }))\n : []\n const intent: TaskIntent = {\n goal,\n constraints: [],\n context: { relevantFiles: [], dependencies: [] },\n subtasks,\n }\n return intent\n }\n\n suggestSubtask(id: string, description: string, dependsOn: string[] = []): Subtask {\n return { id, description, dependsOn, verificationCriteria: [] }\n }\n}\n", "import { readdir, readFile, stat, access } from \"node:fs/promises\"\nimport type { Dirent } from \"node:fs\"\nimport { join, extname, basename, dirname } from \"node:path\"\n\nexport interface ModuleInfo {\n path: string\n name: string\n ext: string\n size: number\n exports: string[]\n imports: string[]\n}\n\nexport interface ProjectIndex {\n root: string\n modules: ModuleInfo[]\n language: \"typescript\" | \"javascript\" | \"python\" | \"unknown\"\n hasTests: boolean\n testDir: string | null\n srcDir: string | null\n}\n\nexport class CodebaseNavigator {\n private index: ProjectIndex | null = null\n\n async scan(root: string): Promise<ProjectIndex> {\n if (this.index) return this.index\n\n const modules: ModuleInfo[] = []\n const srcDir = await this.findDir(root, [\"src\", \"lib\", \"app\", \"source\"])\n const testDir = await this.findDir(root, [\"test\", \"tests\", \"spec\", \"__tests__\"])\n\n const scanDir = srcDir ?? root\n await this.walk(scanDir, modules, root)\n\n const hasTests = testDir !== null\n const language = this.detectLanguage(modules)\n\n this.index = { root, modules, language, hasTests, testDir, srcDir }\n return this.index\n }\n\n findRelevantFiles(taskDescription: string, maxFiles = 10): string[] {\n if (!this.index) return []\n\n const keywords = taskDescription\n .toLowerCase()\n .split(/[\\s,_\\-.:/]+/)\n .filter(w => w.length > 2)\n\n const scored = this.index.modules.map(m => {\n let score = 0\n const name = m.name.toLowerCase()\n const path = m.path.toLowerCase()\n\n for (const kw of keywords) {\n if (name.includes(kw)) score += 10\n if (path.includes(kw)) score += 5\n if (m.imports.some(i => i.toLowerCase().includes(kw))) score += 3\n if (m.exports.some(e => e.toLowerCase().includes(kw))) score += 8\n }\n\n if (m.ext === \".test.ts\" || m.ext === \".spec.ts\") score -= 2\n\n return { path: m.path, score }\n })\n\n return scored\n .filter(s => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, maxFiles)\n .map(s => s.path)\n }\n\n getTestFiles(sourceFile: string): string[] {\n if (!this.index) return []\n const stem = basename(sourceFile, extname(sourceFile))\n const dir = dirname(sourceFile)\n\n const candidates = [\n join(dir, `${stem}.test.ts`),\n join(dir, `${stem}.spec.ts`),\n join(dir, \"__tests__\", `${stem}.test.ts`),\n ]\n\n if (this.index.testDir) {\n const relDir = dir.replace(this.index.srcDir ?? this.index.root, \"\")\n candidates.push(join(this.index.testDir, relDir, `${stem}.test.ts`))\n candidates.push(join(this.index.testDir, `${stem}.test.ts`))\n }\n\n return candidates.filter(t => this.index!.modules.some(m => m.path === t))\n }\n\n getSummary(): string {\n if (!this.index) return \"No index available. Run scan first.\"\n\n const i = this.index\n return [\n `**Root:** ${i.root}`,\n `**Language:** ${i.language}`,\n `**Modules:** ${i.modules.length} files`,\n `**Tests:** ${i.hasTests ? `Yes (${i.testDir})` : \"No test directory found\"}`,\n `**Source:** ${i.srcDir ?? i.root}`,\n ``,\n `**File breakdown:**`,\n ...this.groupByDir(i.modules).map(([dir, count]) => ` ${dir}: ${count} files`),\n ].join(\"\\n\")\n }\n\n private groupByDir(modules: ModuleInfo[]): Array<[string, number]> {\n const groups = new Map<string, number>()\n for (const m of modules) {\n const dir = dirname(m.path)\n groups.set(dir, (groups.get(dir) ?? 0) + 1)\n }\n return [...groups].sort((a, b) => b[1] - a[1])\n }\n\n private async findDir(root: string, names: string[]): Promise<string | null> {\n for (const name of names) {\n const p = join(root, name)\n try {\n const s = await stat(p)\n if (s.isDirectory()) return p\n } catch { /* skip */ }\n }\n return null\n }\n\n private async walk(dir: string, modules: ModuleInfo[], root: string): Promise<void> {\n let entries: Dirent[]\n try {\n entries = await readdir(dir, { withFileTypes: true })\n } catch {\n return\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name)\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name === \".git\" || entry.name === \"dist\" || entry.name === \".agentic\") continue\n await this.walk(fullPath, modules, root)\n } else if (entry.isFile()) {\n const ext = extname(entry.name)\n if (![\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".mts\"].includes(ext)) continue\n\n let size = 0\n try { size = (await stat(fullPath)).size } catch { /* skip */ }\n\n const imports: string[] = []\n const exports: string[] = []\n try {\n const content = await readFile(fullPath, \"utf-8\")\n for (const line of content.split(\"\\n\")) {\n const impMatch = line.match(/import\\s+.*?from\\s+['\"](.+?)['\"]/)\n if (impMatch) imports.push(impMatch[1])\n const expMatch = line.match(/export\\s+(const|function|class|interface|type|default)\\s+(\\w+)/)\n if (expMatch) exports.push(expMatch[2])\n }\n } catch { /* skip */ }\n\n modules.push({\n path: fullPath,\n name: entry.name.replace(ext, \"\"),\n ext,\n size,\n exports,\n imports,\n })\n }\n }\n }\n\n private detectLanguage(modules: ModuleInfo[]): ProjectIndex[\"language\"] {\n const ts = modules.filter(m => [\".ts\", \".tsx\", \".mts\"].includes(m.ext)).length\n const js = modules.filter(m => [\".js\", \".jsx\", \".mjs\"].includes(m.ext)).length\n if (ts > js) return \"typescript\"\n if (js > ts) return \"javascript\"\n if (ts + js > 0) return \"unknown\"\n return \"unknown\"\n }\n}\n", "import { readFileSync, existsSync } from \"node:fs\"\nimport { join, relative, dirname, resolve } from \"node:path\"\n\nexport interface FileChange {\n file: string\n stepId: string\n changeType: \"create\" | \"modify\" | \"delete\"\n timestamp: number\n}\n\nexport interface DependencyEdge {\n from: string\n to: string\n relation: \"imports\" | \"extends\" | \"type-ref\"\n}\n\nexport interface PropagationAnalysis {\n likelyCulprit: string | null\n affectedSteps: string[]\n propagationPath: string[]\n suggestion: string\n rootCauseConfidence: number\n}\n\nexport interface ImpactAnalysis {\n file: string\n impactedFiles: string[]\n impactedSteps: string[]\n risk: \"low\" | \"medium\" | \"high\"\n}\n\nexport class DependencyTracker {\n private fileChanges = new Map<string, FileChange[]>()\n private dependencies = new Map<string, DependencyEdge[]>()\n private stepFiles = new Map<string, Map<string, string[]>>()\n private fileGraph = new Map<string, Set<string>>()\n\n // \u2500\u2500 File-level import parsing \u2500\u2500\n\n /**\n * Parse import/require statements from file content.\n * Supports: import x from \"y\", import { x } from \"y\", import * as x from \"y\",\n * const x = require(\"y\"), dynamic import(), re-exports.\n */\n parseImports(content: string): string[] {\n const imports: string[] = []\n const seen = new Set<string>()\n\n // ESM import + export from\n const importRegex = /(?:import\\s+(?:(?:\\{[^}]*\\}|[^;{]+?)\\s+from\\s+|)\\s*[\"'`]|export\\s+(?:\\{[^}]*\\}|\\*)\\s+from\\s+[\"'`])([^\"'`]+)[\"'`]/g\n // require() calls\n const requireRegex = /(?:require|import)\\s*\\(\\s*[\"'`]([^\"'`]+)[\"'`]\\s*\\)/g\n // dynamic import()\n const dynamicImportRegex = /import\\s*\\(\\s*[\"'`]([^\"'`]+)[\"'`]\\s*\\)/g\n\n for (const match of content.matchAll(importRegex)) {\n const raw = match[1]\n if (raw && !seen.has(raw)) { seen.add(raw); imports.push(raw) }\n }\n for (const match of content.matchAll(requireRegex)) {\n const raw = match[1]\n if (raw && !seen.has(raw)) { seen.add(raw); imports.push(raw) }\n }\n for (const match of content.matchAll(dynamicImportRegex)) {\n const raw = match[1]\n if (raw && !seen.has(raw)) { seen.add(raw); imports.push(raw) }\n }\n\n return imports\n }\n\n /**\n * Resolve a relative import specifier to possible filesystem paths.\n */\n resolveImportPath(sourceFile: string, specifier: string): string[] {\n if (!specifier.startsWith(\".\")) return [] // skip npm packages\n const sourceDir = dirname(sourceFile)\n const base = join(sourceDir, specifier).replace(/\\\\/g, \"/\")\n\n // Remove known extension if present\n const withoutExt = base.replace(/\\.(ts|tsx|js|jsx|mjs|cjs)$/, \"\")\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\"]\n\n const candidates: string[] = []\n // Try exact path first\n candidates.push(base)\n // Try with/extensions\n for (const ext of extensions) {\n if (!base.endsWith(ext)) candidates.push(withoutExt + ext)\n }\n // Try as index file in directory\n for (const ext of extensions) {\n candidates.push(join(withoutExt, \"index\") + ext)\n }\n\n return candidates\n }\n\n /**\n * Scan a batch of files and build the file-level dependency graph.\n * Only processes relative imports (local files), skips npm packages.\n *\n * @param files Record<absoluteFilePath, fileContent>\n * @param projectDir Project root for computing relative paths\n */\n scanFiles(files: Record<string, string>, projectDir: string): void {\n for (const [absPath, content] of Object.entries(files)) {\n const allImportSpecifiers = this.parseImports(content)\n const localSpecifiers = allImportSpecifiers.filter(s => s.startsWith(\".\"))\n\n if (localSpecifiers.length === 0) continue\n\n const sourceRel = relative(projectDir, absPath).replace(/\\\\/g, \"/\")\n const resolvedTargets: string[] = []\n\n for (const spec of localSpecifiers) {\n const candidates = this.resolveImportPath(absPath, spec)\n for (const cand of candidates) {\n if (existsSync(cand)) {\n const targetRel = relative(projectDir, cand).replace(/\\\\/g, \"/\")\n resolvedTargets.push(targetRel)\n break // first existing resolution wins\n }\n }\n }\n\n if (resolvedTargets.length > 0) {\n const existing = this.fileGraph.get(sourceRel) ?? new Set()\n for (const t of resolvedTargets) {\n existing.add(t)\n this.addDependency(sourceRel, t, \"imports\")\n }\n this.fileGraph.set(sourceRel, existing)\n }\n }\n }\n\n /**\n * Get files that directly import the given file (via file-level graph).\n */\n getFileDependents(filePath: string): string[] {\n const normalized = filePath.replace(/\\\\/g, \"/\")\n const result: string[] = []\n for (const [source, targets] of this.fileGraph) {\n for (const t of targets) {\n if (t === normalized || t.endsWith(\"/\" + normalized) || normalized.endsWith(\"/\" + t)) {\n result.push(source)\n break\n }\n }\n }\n return [...new Set(result)]\n }\n\n /**\n * Incrementally update the file graph for a single file (e.g., after creation/modification).\n * Re-parses imports and replaces the entry in the graph.\n */\n updateFile(absPath: string, content: string, projectDir: string): void {\n const relPath = relative(projectDir, absPath).replace(/\\\\/g, \"/\")\n // Remove old entries for this file\n this.fileGraph.delete(relPath)\n this.dependencies.delete(relPath)\n // Remove old edges where this file was the target\n for (const [src, targets] of this.fileGraph) {\n if (targets.has(relPath)) {\n targets.delete(relPath)\n }\n }\n // Re-scan\n this.scanFiles({ [absPath]: content }, projectDir)\n }\n\n /**\n * Get files that a given file directly imports (via file-level graph).\n */\n getFileImports(filePath: string): string[] {\n const normalized = filePath.replace(/\\\\/g, \"/\")\n return [...(this.fileGraph.get(normalized) ?? [])]\n }\n\n /**\n * Traverse transitive dependents (A imports B imports C \u2192 change C impacts A).\n */\n private getTransitiveDependents(file: string, visited?: Set<string>): string[] {\n const visitedSet = visited ?? new Set<string>()\n if (visitedSet.has(file)) return []\n visitedSet.add(file)\n const direct = this.getFileDependents(file)\n const all = [...direct]\n for (const d of direct) {\n all.push(...this.getTransitiveDependents(d, visitedSet))\n }\n return all\n }\n\n recordChange(sessionId: string, stepId: string, files: string[]): void {\n const changes = this.fileChanges.get(sessionId) ?? []\n for (const file of files) {\n changes.push({\n file,\n stepId,\n changeType: \"modify\",\n timestamp: Date.now(),\n })\n }\n this.fileChanges.set(sessionId, changes)\n\n const sessionFiles = this.stepFiles.get(sessionId) ?? new Map()\n const existing = sessionFiles.get(stepId) ?? []\n sessionFiles.set(stepId, [...new Set([...existing, ...files])])\n this.stepFiles.set(sessionId, sessionFiles)\n }\n\n addDependency(from: string, to: string, relation: DependencyEdge[\"relation\"]): void {\n const edges = this.dependencies.get(from) ?? []\n const exists = edges.some(e => e.to === to && e.relation === relation)\n if (!exists) {\n edges.push({ from, to, relation })\n this.dependencies.set(from, edges)\n }\n }\n\n getDependencies(module: string): DependencyEdge[] {\n return this.dependencies.get(module) ?? []\n }\n\n getDependents(module: string): DependencyEdge[] {\n const dependents: DependencyEdge[] = []\n for (const edges of this.dependencies.values()) {\n for (const edge of edges) {\n if (edge.to === module) dependents.push(edge)\n }\n }\n return dependents\n }\n\n analyzeImpact(sessionId: string, changedFiles: string[]): ImpactAnalysis[] {\n const results: ImpactAnalysis[] = []\n for (const file of changedFiles) {\n // Combine step-level + file-level dependents\n const stepDeps = this.getDependents(file).map(e => e.from)\n const fileDeps = this.getFileDependents(file)\n const transitiveDeps = this.getTransitiveDependents(file)\n const combinedFiles = [...new Set([...stepDeps, ...fileDeps, ...transitiveDeps])]\n\n // Map back to steps\n const sessionFiles = this.stepFiles.get(sessionId)\n const impactedSteps: string[] = []\n if (sessionFiles) {\n for (const [stepId, files] of sessionFiles) {\n const overlap = files.some(f => combinedFiles.includes(f) || f === file)\n if (overlap) impactedSteps.push(stepId)\n }\n }\n\n results.push({\n file,\n impactedFiles: combinedFiles,\n impactedSteps: [...new Set(impactedSteps)],\n risk: combinedFiles.length > 5 ? \"high\" : combinedFiles.length > 2 ? \"medium\" : \"low\",\n })\n }\n return results\n }\n\n getFilesChangedByStep(sessionId: string, stepId: string): string[] {\n const changes = this.fileChanges.get(sessionId) ?? []\n return [...new Set(changes.filter(c => c.stepId === stepId).map(c => c.file))]\n }\n\n getFilesChangedByPreviousSteps(sessionId: string, currentStepId: string, planSteps: string[]): string[] {\n const currentIdx = planSteps.indexOf(currentStepId)\n if (currentIdx <= 0) return []\n\n const changes = this.fileChanges.get(sessionId) ?? []\n const files = new Set<string>()\n for (const c of changes) {\n const stepIdx = planSteps.indexOf(c.stepId)\n if (stepIdx >= 0 && stepIdx < currentIdx) {\n files.add(c.file)\n }\n }\n return [...files]\n }\n\n analyzeErrorPropagation(sessionId: string, failingStepId: string, error: string, planSteps: string[]): PropagationAnalysis {\n const previousFiles = this.getFilesChangedByPreviousSteps(sessionId, failingStepId, planSteps)\n\n const currentStepFiles = this.getFilesChangedByStep(sessionId, failingStepId)\n const allPreviousFiles = new Set<string>()\n\n for (const stepId of planSteps) {\n if (stepId === failingStepId) break\n const stepFiles = this.getFilesChangedByStep(sessionId, stepId)\n for (const f of stepFiles) allPreviousFiles.add(f)\n }\n\n const matchesInError: string[] = []\n for (const file of allPreviousFiles) {\n if (error.toLowerCase().includes(file.toLowerCase())) {\n matchesInError.push(file)\n }\n }\n\n let likelyCulprit: string | null = null\n let confidence = 0\n\n if (matchesInError.length > 0) {\n likelyCulprit = matchesInError[matchesInError.length - 1]\n confidence = matchesInError.length >= 2 ? 0.8 : 0.5\n } else if (previousFiles.length > 0) {\n const latestStepBefore = planSteps.slice(0, planSteps.indexOf(failingStepId)).reverse()\n for (const stepId of latestStepBefore) {\n const stepFiles = this.getFilesChangedByStep(sessionId, stepId)\n if (stepFiles.length > 0) {\n likelyCulprit = stepFiles[stepFiles.length - 1]\n confidence = 0.3\n break\n }\n }\n }\n\n if (currentStepFiles.length > 0 && !likelyCulprit) {\n likelyCulprit = currentStepFiles[0]\n confidence = 0.2\n }\n\n const affectedSteps: string[] = []\n const changes = this.fileChanges.get(sessionId) ?? []\n const conflictFiles = new Set(changes.map(c => c.file))\n if (previousFiles.some(f => conflictFiles.has(f))) {\n for (const c of changes) {\n if (c.stepId !== failingStepId) affectedSteps.push(c.stepId)\n }\n }\n\n const propagationPath: string[] = []\n for (const stepId of planSteps) {\n if (stepId === failingStepId) break\n const changedFiles = this.getFilesChangedByStep(sessionId, stepId)\n const hasOverlap = changedFiles.some(f =>\n error.toLowerCase().includes(f.toLowerCase())\n )\n if (hasOverlap || changedFiles.length > 0) {\n propagationPath.push(stepId)\n }\n }\n\n let suggestion = \"\"\n if (likelyCulprit) {\n // Check both file-level and step-level impact\n const fileImpact = this.analyzeImpact(sessionId, [likelyCulprit])\n const stepImpact = this.getDependents(likelyCulprit)\n const ri = fileImpact[0]\n const combinedImpact = [...new Set([\n ...(ri?.impactedSteps ?? []),\n ...stepImpact.map(e => e.from),\n ])]\n\n // Include file-level dependents in suggestion\n const fileLevelDeps = this.getFileDependents(likelyCulprit)\n suggestion = `Error likely originates from changes to ${likelyCulprit} (confidence: ${(confidence * 100).toFixed(0)}%).`\n if (combinedImpact.length > 0) {\n suggestion += ` Step impacts: ${combinedImpact.join(\", \")}.`\n }\n if (fileLevelDeps.length > 0) {\n suggestion += ` File-level dependents: ${fileLevelDeps.join(\", \")}.`\n }\n suggestion += ` Review this file first, then check propagation.`\n } else if (propagationPath.length > 0) {\n suggestion = `Error may have propagated from earlier steps: ${propagationPath.join(\", \")}. Check those changes for side effects.`\n } else {\n suggestion = \"Unable to trace error source with confidence. Review the most recent changes manually and consider adding dependency tracking.\"\n }\n\n return { likelyCulprit, affectedSteps: [...new Set(affectedSteps)], propagationPath, suggestion, rootCauseConfidence: confidence }\n }\n\n clear(sessionId?: string): void {\n if (sessionId) {\n this.fileChanges.delete(sessionId)\n this.stepFiles.delete(sessionId)\n } else {\n this.fileChanges.clear()\n this.dependencies.clear()\n this.stepFiles.clear()\n this.fileGraph.clear()\n }\n }\n}\n", "import type { LLMEngine } from \"../core/llm.js\"\n\nexport interface ContextSummary {\n planSummary: string\n decisions: string[]\n fileChanges: string[]\n invariants: string[]\n openItems: string[]\n estimatedTokens: number\n}\n\nexport class ContextCompressor {\n private windowSize = 5\n private summaryInterval = 5\n private llm: LLMEngine | null = null\n\n setLLM(llm: LLMEngine): void {\n this.llm = llm\n }\n\n compress(planSummary: string, turns: Array<{ role: string; content: string }>, decisions: string[], fileChanges: string[]): ContextSummary {\n const relevantTurns = turns.slice(-this.windowSize * 3)\n\n const extracted = this.extractKeyInfo(relevantTurns)\n\n const allDecisions = [...new Set([...decisions, ...extracted.decisions])]\n const allFileChanges = [...new Set([...fileChanges, ...extracted.fileChanges])]\n const allInvariants = extracted.invariants\n const allOpenItems = extracted.openItems\n\n const summary: ContextSummary = {\n planSummary: `Goal: ${planSummary.slice(0, 200)}`,\n decisions: allDecisions.slice(-10),\n fileChanges: allFileChanges.slice(-15),\n invariants: allInvariants,\n openItems: allOpenItems,\n estimatedTokens: this.estimateTokens(planSummary, allDecisions, allFileChanges),\n }\n\n return summary\n }\n\n async compressWithLLM(planGoal: string, turns: Array<{ role: string; content: string }>, decisions: string[], fileChanges: string[]): Promise<ContextSummary> {\n if (!this.llm) return this.compress(planGoal, turns, decisions, fileChanges)\n\n try {\n const turnTexts = turns.map(t => `[${t.role}]: ${t.content}`)\n const llmSummary = await this.llm.summarizeContext(planGoal, turnTexts)\n\n const extracted = this.extractKeyInfo(turns)\n\n return {\n planSummary: `Goal: ${planGoal.slice(0, 200)}\\n\\nLLM Summary: ${llmSummary.slice(0, 500)}`,\n decisions: [...new Set([...decisions, ...extracted.decisions])].slice(-10),\n fileChanges: [...new Set([...fileChanges, ...extracted.fileChanges])].slice(-15),\n invariants: extracted.invariants,\n openItems: extracted.openItems,\n estimatedTokens: Math.ceil(llmSummary.length / 4),\n }\n } catch {\n return this.compress(planGoal, turns, decisions, fileChanges)\n }\n }\n\n shouldCompress(turnCount: number, currentTokensEstimate: number, maxTokens = 100_000): boolean {\n return turnCount > this.summaryInterval * 3 || currentTokensEstimate > maxTokens * 0.7\n }\n\n compressToPrompt(summary: ContextSummary): string {\n const parts: string[] = [\n \"## Compressed Context\",\n \"\",\n `**Plan:** ${summary.planSummary}`,\n ]\n\n if (summary.decisions.length > 0) {\n parts.push(\"\", \"### Key Decisions\", ...summary.decisions.map((d, i) => `${i + 1}. ${d}`))\n }\n\n if (summary.fileChanges.length > 0) {\n parts.push(\"\", \"### Files Modified\", ...summary.fileChanges.map(f => `- \\`${f}\\``))\n }\n\n if (summary.invariants.length > 0) {\n parts.push(\"\", \"### Invariants (MUST be preserved)\", ...summary.invariants.map(i => `- ${i}`))\n }\n\n if (summary.openItems.length > 0) {\n parts.push(\"\", \"### Open Items\", ...summary.openItems.map(i => `- ${i}`))\n }\n\n parts.push(\"\", `---`, `*Compressed context (~${summary.estimatedTokens} tokens)*`)\n\n return parts.join(\"\\n\")\n }\n\n private extractKeyInfo(turns: Array<{ role: string; content: string }>): {\n decisions: string[]\n fileChanges: string[]\n invariants: string[]\n openItems: string[]\n } {\n const decisions: string[] = []\n const fileChanges: string[] = []\n const invariants: string[] = []\n const openItems: string[] = []\n\n for (const turn of turns) {\n const content = turn.content ?? \"\"\n\n const decisionMatches = content.match(/(?:decided|chose|opted|will use|using|selected|picked) (.+?)(?:\\.|$)/gi)\n if (decisionMatches) {\n decisions.push(...decisionMatches.map(d => d.trim()).slice(0, 3))\n }\n\n const fileMatches = content.match(/(?:src|lib|test|app|pkg|cmd)\\/[\\w/.\\-]+/gi)\n if (fileMatches) {\n fileChanges.push(...fileMatches)\n }\n\n if (content.includes(\"must not\") || content.includes(\"should never\") || content.includes(\"invariant\") || content.includes(\"must preserve\")) {\n const lines = content.split(\"\\n\").filter(l =>\n l.includes(\"must not\") || l.includes(\"should never\") || l.includes(\"invariant\") || l.includes(\"must preserve\")\n )\n invariants.push(...lines.map(l => l.trim()).slice(0, 3))\n }\n\n if (content.includes(\"TODO\") || content.includes(\"FIXME\") || content.includes(\"remaining\") || content.includes(\"still need\") || content.includes(\"pending\")) {\n openItems.push(content.slice(0, 120))\n }\n }\n\n return { decisions, fileChanges, invariants, openItems }\n }\n\n private estimateTokens(planSummary: string, decisions: string[], fileChanges: string[]): number {\n const text = [planSummary, ...decisions, ...fileChanges].join(\" \")\n return Math.ceil(text.length / 4)\n }\n}\n", "import { execFileSync } from \"node:child_process\"\n\nexport interface CommitInfo {\n hash: string\n message: string\n files: string[]\n timestamp: string\n}\n\nexport interface PRDescription {\n title: string\n summary: string\n changes: string[]\n testPlan: string\n breakingChanges: boolean\n}\n\nexport interface PRCreationResult {\n url: string\n number: number\n title: string\n branch: string\n}\n\nexport class GitIntegration {\n private cwd: string\n\n constructor(cwd: string) {\n this.cwd = cwd\n }\n\n isAvailable(): boolean {\n try {\n execFileSync(\"git\", [\"rev-parse\", \"--git-dir\"], { cwd: this.cwd, stdio: \"ignore\" })\n return true\n } catch {\n return false\n }\n }\n\n stage(files: string[]): boolean {\n if (!this.isAvailable()) return false\n try {\n execFileSync(\"git\", [\"add\", ...files], { cwd: this.cwd, stdio: \"ignore\" })\n return true\n } catch {\n return false\n }\n }\n\n commit(message: string, files: string[]): CommitInfo | null {\n if (!this.isAvailable()) return null\n try {\n if (files.length > 0) {\n execFileSync(\"git\", [\"add\", ...files], { cwd: this.cwd, stdio: \"ignore\" })\n }\n execFileSync(\"git\", [\"commit\", \"-m\", message], { cwd: this.cwd, stdio: \"ignore\" })\n const hash = execFileSync(\"git\", [\"rev-parse\", \"HEAD\"], { cwd: this.cwd, encoding: \"utf-8\" }).trim()\n const timestamp = execFileSync(\"git\", [\"log\", \"-1\", \"--format=%aI\"], { cwd: this.cwd, encoding: \"utf-8\" }).trim()\n return { hash, message, files, timestamp }\n } catch {\n return null\n }\n }\n\n getHistory(count = 10): CommitInfo[] {\n if (!this.isAvailable()) return []\n try {\n const output = execFileSync(\n \"git\",\n [\"log\", `-${count}`, \"--format=%H|||%s|||%aI\", \"--name-only\"],\n { cwd: this.cwd, encoding: \"utf-8\" }\n )\n const commits: CommitInfo[] = []\n let current: CommitInfo | null = null\n\n for (const line of output.split(\"\\n\")) {\n if (line.includes(\"|||\")) {\n if (current) commits.push(current)\n const [hash, message, timestamp] = line.split(\"|||\")\n current = { hash, message, timestamp, files: [] }\n } else if (line && current) {\n current.files.push(line.trim())\n }\n }\n if (current) commits.push(current)\n return commits\n } catch {\n return []\n }\n }\n\n getCurrentBranch(): string {\n try {\n return execFileSync(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], {\n cwd: this.cwd, encoding: \"utf-8\",\n }).trim()\n } catch {\n return \"main\"\n }\n }\n\n push(branch?: string): boolean {\n if (!this.isAvailable()) return false\n try {\n const args = [\"push\"]\n if (branch) args.push(\"origin\", branch)\n execFileSync(\"git\", args, { cwd: this.cwd, stdio: \"ignore\" })\n return true\n } catch {\n return false\n }\n }\n\n createBranch(name: string): boolean {\n if (!this.isAvailable()) return false\n try {\n execFileSync(\"git\", [\"checkout\", \"-b\", name], { cwd: this.cwd, stdio: \"ignore\" })\n return true\n } catch {\n return false\n }\n }\n\n createPR(title: string, body: string, base = \"main\"): PRCreationResult | null {\n if (!this.isAvailable()) return null\n try {\n const branch = this.getCurrentBranch()\n this.push(branch)\n\n const output = execFileSync(\"gh\", [\n \"pr\", \"create\",\n \"--title\", title,\n \"--body\", body,\n \"--base\", base,\n \"--head\", branch,\n ], { cwd: this.cwd, encoding: \"utf-8\" }).trim()\n\n const urlMatch = output.match(/https:\\/\\/github\\.com\\/[^/]+\\/[^/]+\\/pull\\/(\\d+)/)\n if (urlMatch) {\n return {\n url: urlMatch[0],\n number: parseInt(urlMatch[1], 10),\n title,\n branch,\n }\n }\n\n return { url: output, number: 0, title, branch }\n } catch {\n return null\n }\n }\n\n getDiff(base = \"main\"): string {\n if (!this.isAvailable()) return \"\"\n try {\n return execFileSync(\"git\", [\"diff\", base], { cwd: this.cwd, encoding: \"utf-8\" })\n } catch {\n return \"\"\n }\n }\n\n generatePRDescription(\n goal: string,\n steps: Array<{ id: string; description: string; success: boolean }>,\n filesChanged: string[],\n ): PRDescription {\n const completedSteps = steps.filter(s => s.success)\n const failedSteps = steps.filter(s => !s.success)\n const allSuccess = failedSteps.length === 0\n\n const title = goal.length > 72 ? goal.slice(0, 69) + \"...\" : goal\n\n const summary = allSuccess\n ? `Implements: ${goal}\\n\\nCompleted ${completedSteps.length} steps across ${filesChanged.length} files.`\n : `Partially implements: ${goal}\\n\\nCompleted ${completedSteps.length}/${steps.length} steps. ${failedSteps.length} steps need follow-up.`\n\n const changes = completedSteps.map(s => `- ${s.description}`)\n\n const testPlan = [\n `- [ ] Verify all changes compile without errors`,\n `- [ ] Run full test suite`,\n `- [ ] Manual review of ${filesChanged.slice(0, 5).join(\", \")}`,\n ].join(\"\\n\")\n\n return {\n title,\n summary,\n changes,\n testPlan,\n breakingChanges: !allSuccess,\n }\n }\n}\n", "export interface DebtScore {\n overall: \"low\" | \"medium\" | \"high\" | \"critical\"\n breakdown: DebtCategory[]\n totalIssues: number\n suggestion: string\n}\n\nexport interface DebtCategory {\n category: string\n score: number\n issues: string[]\n}\n\nexport class TechDebtScorer {\n score(planGoal: string, filesChanged: string[], fileContents: Map<string, string>): DebtScore {\n const breakdown: DebtCategory[] = []\n let totalIssues = 0\n\n // 1. Coupling analysis\n const coupling = this.analyzeCoupling(filesChanged, fileContents)\n breakdown.push(coupling)\n totalIssues += coupling.issues.length\n\n // 2. File size analysis\n const size = this.analyzeSize(filesChanged, fileContents)\n breakdown.push(size)\n totalIssues += size.issues.length\n\n // 3. Change scope analysis\n const scope = this.analyzeScope(filesChanged)\n breakdown.push(scope)\n totalIssues += scope.issues.length\n\n // 4. Pattern analysis\n const patterns = this.analyzePatterns(fileContents)\n breakdown.push(patterns)\n totalIssues += patterns.issues.length\n\n const maxScore = Math.max(...breakdown.map(b => b.score))\n let overall: DebtScore[\"overall\"] = \"low\"\n if (maxScore >= 8) overall = \"critical\"\n else if (maxScore >= 6) overall = \"high\"\n else if (maxScore >= 3) overall = \"medium\"\n\n const suggestion = this.generateSuggestion(overall, breakdown, totalIssues)\n\n return { overall, breakdown, totalIssues, suggestion }\n }\n\n private analyzeCoupling(filesChanged: string[], contents: Map<string, string>): DebtCategory {\n const issues: string[] = []\n let score = 0\n\n if (filesChanged.length > 5) {\n issues.push(`${filesChanged.length} files modified \u2014 high coupling risk`)\n score += 3\n }\n\n for (const [file, content] of contents) {\n const importCount = (content.match(/^import\\s/gm) || []).length\n if (importCount > 10) {\n issues.push(`${file} has ${importCount} imports \u2014 consider splitting`)\n score += 1\n }\n }\n\n return { category: \"coupling\", score: Math.min(score, 10), issues }\n }\n\n private analyzeSize(filesChanged: string[], contents: Map<string, string>): DebtCategory {\n const issues: string[] = []\n let score = 0\n\n for (const [file, content] of contents) {\n const lines = content.split(\"\\n\").length\n if (lines > 300) {\n issues.push(`${file} is ${lines} lines \u2014 too large, consider splitting`)\n score += 2\n } else if (lines > 150) {\n issues.push(`${file} is ${lines} lines \u2014 monitor size`)\n score += 1\n }\n }\n\n return { category: \"size\", score: Math.min(score, 10), issues }\n }\n\n private analyzeScope(filesChanged: string[]): DebtCategory {\n const issues: string[] = []\n let score = 0\n\n const dirs = new Set(filesChanged.map(f => f.split(\"/\").slice(0, -1).join(\"/\")))\n if (dirs.size > 3) {\n issues.push(`Changes span ${dirs.size} directories \u2014 broad impact`)\n score += 2\n }\n\n const hasTest = filesChanged.some(f => f.includes(\".test.\") || f.includes(\".spec.\"))\n if (!hasTest && filesChanged.length > 0) {\n issues.push(\"No test files changed \u2014 add tests for new code\")\n score += 2\n }\n\n return { category: \"scope\", score: Math.min(score, 10), issues }\n }\n\n private analyzePatterns(contents: Map<string, string>): DebtCategory {\n const issues: string[] = []\n let score = 0\n\n for (const [file, content] of contents) {\n if (content.includes(\"any\")) {\n issues.push(`${file} uses 'any' type \u2014 replace with specific types`)\n score += 2\n }\n if ((content.match(/\\/\\/\\s*TODO/g) || []).length > 2) {\n issues.push(`${file} has multiple TODOs \u2014 address before merging`)\n score += 1\n }\n if (content.includes(\"as unknown as\")) {\n issues.push(`${file} uses 'as unknown as' cast \u2014 type-safety bypass`)\n score += 1\n }\n }\n\n return { category: \"patterns\", score: Math.min(score, 10), issues }\n }\n\n private generateSuggestion(overall: string, breakdown: DebtCategory[], total: number): string {\n if (overall === \"low\") return \"Minimal debt. Proceed confidently.\"\n if (overall === \"medium\") return `${total} issue(s) found. Address before next iteration.`\n if (overall === \"high\") return `${total} issue(s) found. Fix before merging \u2014 add to next sprint.`\n return `${total} issue(s) found. Critical debt \u2014 block merge until resolved.`\n }\n}\n", "import type { AgentRole } from \"./coordinator.js\"\n\nexport interface AgentDef {\n role: AgentRole\n name: string\n prompt: string\n tools: string[]\n model?: string\n}\n\nexport type CustomRole = string\n\nexport interface CustomAgentDef {\n role: CustomRole\n name: string\n prompt: string\n tools: string[]\n model?: string\n}\n\n/** Complexity level for model suggestion */\nexport type TaskComplexity = \"simple\" | \"moderate\" | \"complex\"\n\nexport type PromptSource = \"auto-evolve\" | \"agent-self\" | \"manual\" | \"initial\"\n\nexport interface PromptEntry {\n version: number\n prompt: string\n timestamp: string\n source: PromptSource\n description?: string\n}\n\nexport interface PromptState {\n currentVersion: number\n history: PromptEntry[]\n}\n\nexport class RoleRegistry {\n private builtIn: Map<AgentRole, AgentDef> = new Map()\n private custom: Map<CustomRole, CustomAgentDef> = new Map()\n private promptHistory: Map<string, PromptState> = new Map()\n\n private defaultModels: Record<AgentRole, string> = {\n architect: \"fast\", // analisis \u2014 cukup model cepat\n developer: \"capable\", // implementasi \u2014 model paling capable\n qa: \"fast\", // review \u2014 model cepat sudah cukup\n coordinator: \"capable\", // koordinasi \u2014 perlu reasoning baik\n pm: \"fast\", // requirement \u2014 model cepat\n }\n\n constructor(initialPrompts?: Array<{ role: string; history: PromptEntry[] }>) {\n if (initialPrompts) {\n for (const entry of initialPrompts) {\n const latest = entry.history.reduce((a, b) => a.version > b.version ? a : b)\n this.promptHistory.set(entry.role, { currentVersion: latest.version, history: entry.history })\n }\n }\n this.builtIn.set(\"architect\", {\n role: \"architect\",\n name: \"System Architect\",\n prompt: `You are a software architect. Analyze requirements and produce architecture decisions.\n\n## Output Format\nAlways structure your output as:\n\n### Architecture Decisions\n- **Decision**: <what was decided>\n- **Rationale**: <why this decision>\n- **Alternatives Considered**: <other options>\n\n### File Structure\n- \\`src/module/file.ts\\` \u2014 <purpose>\n\n### Interface Contracts\n- \\`Interface\\` / \\`Function signature\\` \u2014 <contract description>\n\n### Trade-offs\n- <trade-off description>\n\n## Few-Shot Examples\n\n**Input**: \"Add a user authentication system with JWT tokens\"\n**Output**:\n### Architecture Decisions\n- **Decision**: Use JWT with refresh tokens instead of session-based auth\n- **Rationale**: Stateless, scales horizontally without Redis session store; refresh tokens reduce exposure window\n- **Alternatives Considered**: Session-based (needs Redis), OAuth2 (overkill for first-party auth)\n\n### File Structure\n- \\`src/auth/jwt.ts\\` \u2014 JWT sign/verify helpers\n- \\`src/auth/middleware.ts\\` \u2014 Express/Koa middleware for route protection\n- \\`src/auth/refresh.ts\\` \u2014 Refresh token rotation logic\n\n### Interface Contracts\n- \\`signToken(payload: object, expiresIn: string): string\\`\n- \\`verifyToken(token: string): TokenPayload | null\\`\n- \\`authMiddleware(required?: boolean): Middleware\\`\n\n### Trade-offs\n- Refresh token rotation adds complexity but improves security\n- Pure JWT without server-side revocation means tokens live until expiry\n\n---\n\n**Input**: \"Refactor the payment module to support multiple providers\"\n**Output**:\n### Architecture Decisions\n- **Decision**: Strategy pattern with provider interface\n- **Rationale**: Each provider (Stripe, PayPal, Midtrans) implements same contract; adding new provider = new class, no existing code changes\n- **Alternatives Considered**: Switch statements (fragile), inheritance (tight coupling), feature flags (temporary)\n\n### File Structure\n- \\`src/payment/provider.ts\\` \u2014 Provider interface\n- \\`src/payment/stripe.ts\\` \u2014 Stripe implementation\n- \\`src/payment/paypal.ts\\` \u2014 PayPal implementation\n- \\`src/payment/factory.ts\\` \u2014 Provider selection logic\n\n### Interface Contracts\n- \\`interface PaymentProvider { charge(amount: number, currency: string, source: string): PaymentResult; refund(transactionId: string): RefundResult }\\`\n- \\`function createProvider(type: \"stripe\" | \"paypal\"): PaymentProvider\\`\n\n### Trade-offs\n- Strategy pattern adds indirection but makes testing easier (mock provider)\n- Factory needs config or env var to determine provider\n\n---\n\nIf this requires sub-tasks, delegate to developers via agentic_delegate. After ALL work is done, extract a reusable skill via agentic_skill with action \"extract\".\n\nBe concise. Focus on structure, not implementation details.`,\n tools: [\"read\", \"grep\", \"glob\", \"agentic_nav\", \"agentic_score\", \"agentic_delegate\", \"agentic_skill\"],\n })\n\n this.builtIn.set(\"developer\", {\n role: \"developer\",\n name: \"Feature Developer\",\n prompt: `You are a senior developer. Implement features following existing codebase patterns.\n\n## Rules\n1. Always read existing files first to understand patterns before writing new code\n2. Write unit tests for all new code\n3. Follow the project's conventions (naming, imports with .js extensions, types)\n4. Keep functions small (< 30 lines), one responsibility each\n5. Don't break existing tests \u2014 run them after changes\n6. After completing, call agentic_skill with action \"extract\" to save a reusable skill\n\n## Few-Shot Examples\n\n**Task**: \"Add a calculateTotal function that sums items with tax\"\n**Step 1**: Read existing patterns\n\\`\\`\\`\nread src/pricing/utils.ts\n\\`\\`\\`\n\n**Step 2**: Implement\n\\`\\`\\`\n// src/pricing/utils.ts\nexport interface LineItem {\n price: number\n quantity: number\n taxRate?: number // default 0.1 (10%)\n}\n\nexport function calculateTotal(items: LineItem[]): number {\n return items.reduce((sum, item) => {\n const subtotal = item.price * item.quantity\n const tax = subtotal * (item.taxRate ?? 0.1)\n return sum + subtotal + tax\n }, 0)\n}\n\\`\\`\\`\n\n**Step 3**: Write tests\n\\`\\`\\`\n// src/pricing/utils.test.ts\nimport { describe, it, expect } from \"vitest\"\nimport { calculateTotal } from \"./utils.js\"\n\ndescribe(\"calculateTotal\", () => {\n it(\"sums item prices with default tax\", () => {\n const items = [{ price: 100, quantity: 2 }]\n expect(calculateTotal(items)).toBe(220) // 200 + 20 tax\n })\n\n it(\"accepts custom tax rate\", () => {\n const items = [{ price: 100, quantity: 1, taxRate: 0 }]\n expect(calculateTotal(items)).toBe(100) // no tax\n })\n})\n\\`\\`\\`\n\n**Step 4**: Verify tests pass\n\\`\\`\\`\nnpm test\n\\`\\`\\`\n\n---\n\n**Task**: \"Fix bug: calculateTotal crashes on empty array\"\n**Step 1**: Read current code\n\\`\\`\\`\nread src/pricing/utils.ts\n\\`\\`\\`\n// Current: return items.reduce(...) \u2192 crashes on []\n\n**Step 2**: Fix with guard\n\\`\\`\\`\nexport function calculateTotal(items: LineItem[]): number {\n if (items.length === 0) return 0 // \u274C was missing this\n return items.reduce(...)\n}\n\\`\\`\\`\n\n**Step 3**: Add test for edge case\n\\`\\`\\`\nit(\"returns 0 for empty items\", () => {\n expect(calculateTotal([])).toBe(0)\n})\n\\`\\`\\`\n\n---\n\nPrioritize correctness and readability. Don't over-engineer.`,\n tools: [\"read\", \"edit\", \"write\", \"bash\", \"glob\", \"grep\", \"agentic_skill\"],\n })\n\n this.builtIn.set(\"qa\", {\n role: \"qa\",\n name: \"QA Engineer\",\n prompt: `You are a QA engineer. Review implementations for bugs, edge cases, and security issues.\n\n## Review Checklist\n- \u2705 Edge cases: empty arrays, null/undefined inputs, boundary values\n- \u2705 Error handling: are errors caught? Are error messages helpful?\n- \u2705 Security: injection risks, auth bypass, data exposure\n- \u2705 Test quality: do tests actually verify behavior? Any missing test scenarios?\n- \u2705 Regression: do existing tests still pass?\n\n## Output Format\nFor each issue, use this format:\n\\`\\`\\`\n\u274C [severity] <brief title>\n- **File**: src/file.ts:line\n- **Issue**: <description>\n- **Repro**: <steps to reproduce or input that triggers it>\n- **Fix**: <suggested fix>\n\\`\\`\\`\n\nSeverity: critical | high | medium | low\n\n## Few-Shot Examples\n\n**Code under review**:\nexport function calculateTotal(items: { price: number; quantity: number }[]) {\n return items.reduce((sum, item) => sum + item.price * item.quantity)\n}\n\n**QA Report**:\n\\`\\`\\`\n\u274C [critical] No guard against empty array\n- **File**: pricing.ts:1\n- **Issue**: reduce() throws TypeError on empty array\n- **Repro**: calculateTotal([])\n- **Fix**: Add items.length === 0 guard, or pass initial value 0 to reduce\n\n\u274C [medium] taxRate not handled\n- **File**: pricing.ts:1\n- **Issue**: Items may have tax rate but parameter is not accepted\n- **Repro**: Any item with tax expectations\n- **Fix**: Accept optional taxRate parameter per item\n\\`\\`\\`\n\n---\n\n**Code under review**:\napp.get(\"/api/users/:id\", async (req, res) => {\n const user = db.users.findById(req.params.id)\n res.json(user)\n})\n\n**QA Report**:\n\\`\\`\\`\n\u274C [critical] SQL injection risk\n- **File**: routes.ts:2\n- **Issue**: req.params.id used directly \u2014 possible injection if db layer doesn't sanitize\n- **Repro**: GET /api/users/1; DROP TABLE users --\n- **Fix**: Use parameterized queries or ORM that handles sanitization\n\n\u274C [high] Missing auth check\n- **File**: routes.ts:1-3\n- **Issue**: No authentication middleware attached\n- **Repro**: Any unauthenticated request returns user data\n- **Fix**: Add auth middleware: app.get(\"/api/users/:id\", authMiddleware, handler)\n\\`\\`\\`\n\n---\n\nBe thorough. Every edge case matters. Report ONLY real issues \u2014 don't flag style preferences.`,\n tools: [\"read\", \"glob\", \"grep\", \"bash\", \"agentic_verify\", \"agentic_skill\"],\n })\n\n this.builtIn.set(\"coordinator\", {\n role: \"coordinator\",\n name: \"Task Coordinator\",\n prompt: `You are a project coordinator. Decompose goals into tasks, delegate to the right agents, and ensure quality.\n\n## Workflow\n1. Understand the goal \u2014 use agentic_nav to scan the codebase first\n2. Decompose into ordered subtasks with clear dependencies\n3. Delegate each subtask to the correct role:\n - **architect**: structural decisions, file layout, interface design\n - **developer**: implementation, unit tests\n - **qa**: code review, test verification, security audit\n4. Track progress with agentic_status\n5. Resolve blockers by re-assigning or adjusting scope\n6. After all done, call agentic_skill action \"extract\" to save the workflow\n7. Report final status to user\n\n## Few-Shot Examples\n\n**Input**: \"Add user profile page with avatar upload\"\n**Plan**:\n1. **architect**: Design profile page structure, file layout, API contracts\n \u2192 depends on: nothing\n2. **developer**: Implement profile page UI and API endpoints\n \u2192 depends on: step 1 (architecture)\n3. **developer**: Implement avatar upload with image resizing\n \u2192 depends on: step 2 (profile API)\n4. **qa**: Review all code, test upload edge cases\n \u2192 depends on: step 2, step 3\n\n**Delegation sequence**:\n\\`\\`\\`\nagentic_delegate taskId=\"arch-profile\" role=\"architect\" description=\"Design profile page structure\" \n\u2192 wait for result\nagentic_delegate taskId=\"dev-profile\" role=\"developer\" description=\"Implement profile page\" \nagentic_delegate taskId=\"dev-avatar\" role=\"developer\" description=\"Implement avatar upload\" \n\u2192 run dev tasks in parallel (they depend on arch, not each other)\nagentic_delegate taskId=\"qa-review\" role=\"qa\" description=\"Review all profile code\"\n\\`\\`\\`\n\n---\n\n**Input**: \"Fix login failing on Safari\"\n**Plan**:\n1. **developer**: Investigate Safari-specific issue (cookie/WebKit/Storage)\n2. **developer**: Implement fix with browser detection or polyfill\n3. **qa**: Verify fix on Safari + regression on Chrome/Firefox\n\n---\n\nThink like a tech lead. Prioritize, delegate, verify.`,\n tools: [\"agentic_plan\", \"agentic_delegate\", \"agentic_status\", \"agentic_pr\", \"agentic_skill\"],\n })\n\n this.builtIn.set(\"pm\", {\n role: \"pm\",\n name: \"Product Manager\",\n prompt: `You are a product manager. Translate business goals into technical specifications.\n\n## Output Format\nFor each feature:\n### Feature: <name>\n**Business Value**: <why this matters>\n**Acceptance Criteria**:\n- [ ] <criterion 1>\n- [ ] <criterion 2>\n**Dependencies**: <what must exist first>\n**Scope Boundary**: <what is NOT included>\n\n## Few-Shot Examples\n\n**Input**: \"Users are abandoning the signup flow at step 3 \u2014 the phone verification is too slow. We need to let users skip it and verify later.\"\n\n**Output**:\n### Feature: Deferred Phone Verification\n**Business Value**: Reduce signup abandonment by allowing users to start using the app immediately\n**Acceptance Criteria**:\n- [ ] User can complete signup without phone verification\n- [ ] App shows \"Verify phone\" banner post-signup until verified\n- [ ] Verified badge shows on profile after verification\n- [ ] Unverified users can still use all core features (read-only for sensitive actions)\n**Dependencies**: Existing signup flow must be refactored to make phone step optional\n**Scope Boundary**: Not changing SMS provider; not adding email fallback\n\n---\n\n**Input**: \"Competitor just launched AI-powered code review. We need parity within 2 sprints.\"\n\n**Output**:\n### Feature: AI Code Review Assistant\n**Business Value**: Competitor parity \u2014 retain developers who expect AI review\n**Acceptance Criteria**:\n- [ ] PR diff analyzed for common bug patterns (off-by-one, null ref, injection)\n- [ ] Suggestions posted as PR comments\n- [ ] User can dismiss/snooze suggestions\n- [ ] Works with GitHub and GitLab\n**Dependencies**: LLM API integration, GitHub app permissions\n**Scope Boundary**: Not doing auto-fix yet (Phase 2); not analyzing non-code files\n\n### Prioritization\n1. P0: PR analysis + comments (core value)\n2. P1: Dismiss/snooze UX\n3. P2: GitLab support (lower user share)\n\n---\n\nFocus on the \"what\" and \"why\". Leave the \"how\" to architects and developers.`,\n tools: [\"agentic_plan\", \"agentic_nav\", \"agentic_delegate\", \"agentic_episodes\", \"read\"],\n })\n // Initialize prompt history for all built-in roles (if not already loaded from persistence)\n const builtInRoles: AgentRole[] = [\"architect\", \"developer\", \"qa\", \"coordinator\", \"pm\"]\n for (const role of builtInRoles) {\n if (!this.promptHistory.has(role)) {\n this.addHistoryEntry(role, this.builtIn.get(role)!.prompt, \"initial\", \"Built-in prompt\")\n }\n }\n }\n\n registerCustom(def: CustomAgentDef): void {\n this.custom.set(def.role, def)\n if (!this.promptHistory.has(def.role)) {\n this.addHistoryEntry(def.role, def.prompt, \"manual\", `Custom role: ${def.name}`)\n }\n }\n\n private addHistoryEntry(role: string, prompt: string, source: PromptSource, description?: string): void {\n const existing = this.promptHistory.get(role)\n const version = existing ? existing.currentVersion + 1 : 1\n const entry: PromptEntry = { version, prompt, timestamp: new Date().toISOString(), source, description }\n if (existing) {\n existing.history.push(entry)\n existing.currentVersion = version\n } else {\n this.promptHistory.set(role, { currentVersion: version, history: [entry] })\n }\n }\n\n /**\n * Update the system prompt for a built-in role with version tracking.\n * Returns true if the role was found and updated.\n */\n updatePrompt(role: AgentRole, newPrompt: string, source: PromptSource = \"manual\", description?: string): boolean {\n const existing = this.builtIn.get(role)\n if (!existing) return false\n this.builtIn.set(role, { ...existing, prompt: newPrompt })\n this.addHistoryEntry(role, newPrompt, source, description)\n return true\n }\n\n /** Get the current prompt for a role (built-in or custom) */\n getPrompt(role: string): string | undefined {\n return this.builtIn.get(role as AgentRole)?.prompt ?? this.custom.get(role)?.prompt\n }\n\n /** Get prompt version history for a role */\n getPromptHistory(role: string): PromptEntry[] {\n return this.promptHistory.get(role)?.history ?? []\n }\n\n /** Get the full prompt state for a role (current version + history) */\n getPromptState(role: string): PromptState | undefined {\n return this.promptHistory.get(role)\n }\n\n /** Get all prompt states (for persistence) */\n getAllPromptStates(): Array<{ role: string; history: PromptEntry[] }> {\n return [...this.promptHistory.entries()].map(([role, state]) => ({ role, history: state.history }))\n }\n\n /**\n * Rollback a role's prompt to a specific version.\n * Returns true if the rollback succeeded.\n */\n rollbackPrompt(role: string, version: number): boolean {\n const state = this.promptHistory.get(role)\n if (!state) return false\n const entry = state.history.find(e => e.version === version)\n if (!entry) return false\n\n const def = this.builtIn.get(role as AgentRole)\n if (def) {\n this.builtIn.set(role as AgentRole, { ...def, prompt: entry.prompt })\n }\n const custom = this.custom.get(role)\n if (custom) {\n this.custom.set(role, { ...custom, prompt: entry.prompt })\n }\n if (!def && !custom) return false\n\n this.addHistoryEntry(role, entry.prompt, \"manual\", `Rollback to version ${version}`)\n return true\n }\n\n getBuiltIn(role: AgentRole): AgentDef | undefined {\n return this.builtIn.get(role)\n }\n\n getCustom(role: CustomRole): CustomAgentDef | undefined {\n return this.custom.get(role)\n }\n\n getAllBuiltIn(): AgentDef[] {\n return [...this.builtIn.values()]\n }\n\n getAllCustom(): CustomAgentDef[] {\n return [...this.custom.values()]\n }\n\n listRoles(): string[] {\n return [\n ...this.builtIn.keys(),\n ...this.custom.keys(),\n ]\n }\n\n suggestModel(role: string, complexity: TaskComplexity = \"moderate\"): string {\n // 1. Custom role? check its model\n const custom = this.custom.get(role)\n if (custom?.model) return custom.model\n\n // 2. Built-in role? check if user set a model\n const builtIn = this.builtIn.get(role as AgentRole)\n if (builtIn?.model) return builtIn.model\n\n // 3. Auto-suggest based on role + complexity\n const base = this.defaultModels[role as AgentRole] ?? \"capable\"\n if (complexity === \"simple\" && base === \"capable\") return \"fast\"\n if (complexity === \"complex\" && base === \"fast\") return \"capable\"\n return base\n }\n\n setModel(role: AgentRole, model: string): void {\n const def = this.builtIn.get(role)\n if (def) def.model = model\n }\n}\n", "import { RoleRegistry, type AgentDef, type CustomAgentDef } from \"./role-registry.js\"\nimport type { SkillStore } from \"../memory/skill-store.js\"\n\nexport type AgentRole = \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\"\n\nexport interface AgentTask {\n id: string\n assignedTo: string\n description: string\n input: string\n status: \"pending\" | \"running\" | \"done\" | \"failed\"\n result?: string\n sharedContext?: string\n validatedBy?: string[]\n pipelineRunId?: string\n delegationDepth?: number\n}\n\nexport interface SharedMemoryEntry {\n key: string\n value: string\n writtenBy: string\n timestamp: number\n}\n\nexport interface AgentMessage {\n id: string\n from: string\n to: string\n taskId: string\n type: \"result\" | \"review_request\" | \"review_response\" | \"clarification\" | \"approval\" | \"revision\"\n payload: string\n context?: Record<string, string>\n timestamp: number\n read: boolean\n}\n\nexport type SharedMemoryListener = (entry: SharedMemoryEntry) => void\n\nexport class AgentCoordinator {\n private sharedMemory = new Map<string, SharedMemoryEntry>()\n private memoryListeners: SharedMemoryListener[] = []\n private messages = new Map<string, AgentMessage[]>()\n private registry: RoleRegistry\n private tasks = new Map<string, AgentTask[]>()\n private pipelineRuns = new Map<string, string[]>()\n private maxDepth = 3\n private skillStore?: SkillStore\n\n constructor(skillStore?: SkillStore) {\n this.registry = new RoleRegistry()\n this.skillStore = skillStore\n }\n\n /** Set max delegation depth (from config hot-reload) */\n setMaxDepth(depth: number): void {\n this.maxDepth = depth\n }\n\n /** Get current max delegation depth */\n getMaxDepth(): number {\n return this.maxDepth\n }\n\n onSharedMemoryWrite(listener: SharedMemoryListener): void {\n this.memoryListeners.push(listener)\n }\n\n writeSharedMemory(key: string, value: string, agentRole: string): SharedMemoryEntry {\n const entry: SharedMemoryEntry = { key, value, writtenBy: agentRole, timestamp: Date.now() }\n this.sharedMemory.set(key, entry)\n for (const listener of this.memoryListeners) {\n try { listener(entry) } catch { }\n }\n return entry\n }\n\n writeSharedMemoryBatch(entries: Array<{ key: string; value: string; agentRole: string }>): void {\n for (const e of entries) {\n this.writeSharedMemory(e.key, e.value, e.agentRole)\n }\n }\n\n readSharedMemory(key: string): SharedMemoryEntry | undefined {\n return this.sharedMemory.get(key)\n }\n\n searchSharedMemory(query: string): SharedMemoryEntry[] {\n const q = query.toLowerCase()\n return [...this.sharedMemory.values()].filter(e =>\n e.key.toLowerCase().includes(q) || e.value.toLowerCase().includes(q)\n )\n }\n\n getAllSharedMemory(): SharedMemoryEntry[] {\n return [...this.sharedMemory.values()]\n }\n\n getAgent(role: string): AgentDef | CustomAgentDef | undefined {\n return this.registry.getBuiltIn(role as AgentRole) ?? this.registry.getCustom(role)\n }\n\n registerCustomRole(def: CustomAgentDef): void {\n this.registry.registerCustom(def)\n }\n\n // --- Message Bus ---\n\n sendMessage(msg: Omit<AgentMessage, \"id\" | \"timestamp\" | \"read\">): AgentMessage {\n const message: AgentMessage = {\n ...msg,\n id: `msg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: Date.now(),\n read: false,\n }\n const inbox = this.messages.get(msg.to) ?? []\n inbox.push(message)\n this.messages.set(msg.to, inbox)\n return message\n }\n\n getMessages(agentRole: string, unreadOnly = false): AgentMessage[] {\n const inbox = this.messages.get(agentRole) ?? []\n if (unreadOnly) return inbox.filter(m => !m.read)\n return inbox\n }\n\n markRead(messageId: string): boolean {\n for (const [, inbox] of this.messages) {\n const msg = inbox.find(m => m.id === messageId)\n if (msg) { msg.read = true; return true }\n }\n return false\n }\n\n getConversation(taskId: string): AgentMessage[] {\n const all: AgentMessage[] = []\n for (const [, inbox] of this.messages) {\n all.push(...inbox.filter(m => m.taskId === taskId))\n }\n return all.sort((a, b) => a.timestamp - b.timestamp)\n }\n\n // --- Task Management ---\n\n delegate(role: string, task: AgentTask, sessionId: string, parentDepth = 0, relevantSkills?: Array<{ name: string; successRate: number; steps: string }>): AgentTask {\n task.assignedTo = role\n task.status = \"pending\"\n task.delegationDepth = parentDepth + 1\n\n if (!relevantSkills && this.skillStore) {\n const foundSkills = this.skillStore.find(task.description).slice(0, 3)\n relevantSkills = foundSkills.map((s: any) => ({\n name: s.name,\n successRate: s.successRate,\n steps: s.steps.map((step: any) => step.description).join(\" \u2192 \")\n }))\n }\n\n const entries = this.getAllSharedMemory()\n const contextParts: string[] = []\n if (entries.length > 0) {\n contextParts.push(entries\n .map(e => `[${e.key}] (by ${e.writtenBy}): ${e.value}`)\n .join(\"\\n\"))\n }\n\n if (relevantSkills && relevantSkills.length > 0) {\n const skillsBlock = relevantSkills.slice(0, 3).map(s =>\n `- **${s.name}** (${(s.successRate * 100).toFixed(0)}% success rate)\\n Steps: ${s.steps}`\n ).join(\"\\n\\n\")\n contextParts.push(`## Relevant Skills\\n${skillsBlock}\\n\\nConsider applying these proven patterns from past successful tasks.`)\n }\n\n if (contextParts.length > 0) {\n task.sharedContext = contextParts.join(\"\\n\\n\")\n }\n\n const sessionTasks = this.tasks.get(sessionId) ?? []\n sessionTasks.push(task)\n this.tasks.set(sessionId, sessionTasks)\n\n return task\n }\n\n getTasks(sessionId: string): AgentTask[] {\n return this.tasks.get(sessionId) ?? []\n }\n\n getTasksByRole(sessionId: string, role: string): AgentTask[] {\n return (this.tasks.get(sessionId) ?? []).filter(t => t.assignedTo === role)\n }\n\n updateTask(sessionId: string, taskId: string, status: AgentTask[\"status\"], result?: string): boolean {\n const tasks = this.tasks.get(sessionId)\n if (!tasks) return false\n\n const task = tasks.find(t => t.id === taskId)\n if (!task) return false\n\n task.status = status\n if (result) task.result = result\n\n if (status === \"done\" && task.assignedTo) {\n this.writeSharedMemory(`task:${taskId}:result`, result ?? \"completed\", task.assignedTo)\n }\n\n return true\n }\n\n /** Get downstream tasks that depend on a completed task via the pipeline */\n getNextInPipeline(taskId: string, sessionId: string): AgentTask | null {\n const tasks = this.tasks.get(sessionId) ?? []\n const currentIdx = tasks.findIndex(t => t.id === taskId)\n if (currentIdx < 0 || currentIdx >= tasks.length - 1) return null\n\n const current = tasks[currentIdx]\n if (current.status !== \"done\") return null\n\n for (let i = currentIdx + 1; i < tasks.length; i++) {\n const next = tasks[i]\n if (next.status === \"pending\") return next\n }\n return null\n }\n\n // --- Pipeline Run Tracking ---\n\n setPipelineRun(sessionId: string, pipelineId: string, taskIds: string[]): void {\n this.pipelineRuns.set(sessionId, taskIds)\n this.writeSharedMemory(`pipeline:${sessionId}`, pipelineId, \"coordinator\")\n }\n\n getPipelineRun(sessionId: string): string[] | undefined {\n return this.pipelineRuns.get(sessionId)\n }\n\n /**\n * Suggest the best agent role for a task description.\n * Uses LLM when available (Gap #6), falls back to keyword matching.\n */\n async getSuggestedRole(description: string, llm?: { suggestRole: (desc: string) => Promise<string | null> }): Promise<AgentRole> {\n // Try LLM first when available (paper's intelligent agent assignment)\n if (llm) {\n try {\n const llmRole = await llm.suggestRole(description)\n if (llmRole && [\"architect\", \"developer\", \"qa\", \"coordinator\", \"pm\"].includes(llmRole)) {\n return llmRole as AgentRole\n }\n } catch { /* fall through to keyword */ }\n }\n\n // Keyword fallback\n const d = description.toLowerCase()\n if (d.includes(\"architect\") || d.includes(\"design\") || d.includes(\"structure\") || d.includes(\"api contract\")) return \"architect\"\n if (d.includes(\"test\") || d.includes(\"qa\") || d.includes(\"verify\") || d.includes(\"validate\") || d.includes(\"check\")) return \"qa\"\n if (d.includes(\"coordinate\") || d.includes(\"orchestrate\") || d.includes(\"plan\") || d.includes(\"overview\")) return \"coordinator\"\n if (d.includes(\"pm\") || d.includes(\"product\") || d.includes(\"requirement\") || d.includes(\"spec\") || d.includes(\"acceptance\")) return \"pm\"\n return \"developer\"\n }\n}\n", "import { execFileSync } from \"node:child_process\"\n\n// Error logging helper for silent catch blocks\nfunction logParseError(context: string, error: unknown): void {\n if (process.env.DEBUG_LLM_PARSING) {\n console.error(`[LLM Parse Error] ${context}:`, error);\n }\n}\n\nexport interface LLMConfig {\n provider: \"openai\" | \"anthropic\" | \"local\" | \"opencode\"\n apiKey?: string\n baseURL?: string\n model?: string\n maxTokens?: number\n temperature?: number\n variant?: string\n}\n\nexport interface LLMRequest {\n systemPrompt: string\n userPrompt: string\n maxTokens?: number\n temperature?: number\n jsonMode?: boolean\n}\n\nexport interface LLMResponse {\n content: string\n usage?: { promptTokens: number; completionTokens: number }\n finishReason?: string\n}\n\nconst DEFAULT_MODELS: Record<string, string> = {\n openai: \"gpt-4o\",\n anthropic: \"claude-3-5-sonnet-20240620\",\n local: \"codellama\",\n opencode: \"opencode-default\",\n}\n\nimport type { ModelRegistry } from \"./model-registry.js\"\n\nexport class LLMEngine {\n private config: LLMConfig\n private opencodeClient: unknown = null\n private pluginSessionId: string | null = null\n private modelRegistry?: ModelRegistry\n private sessionStore?: import(\"../memory/session-store.js\").SessionStore\n private memoryStores?: {\n searchEpisodes: (query: string) => Array<{ planGoal: string; outcome: string; timestamp: string }>\n findSkills: (query: string) => Array<{ name: string; successRate: number }>\n }\n\n constructor(config: Partial<LLMConfig> = {}) {\n this.config = {\n provider: config.provider ?? this.detectProvider(),\n apiKey: config.apiKey ?? process.env.OPENAI_API_KEY,\n baseURL: config.baseURL ?? process.env.OPENAI_BASE_URL,\n model: config.model ?? process.env.OPENAI_MODEL,\n maxTokens: config.maxTokens ?? 4096,\n temperature: config.temperature ?? 0.3,\n variant: config.variant ?? process.env.OPENAI_VARIANT,\n }\n }\n\n setMemoryStores(stores: {\n searchEpisodes: (query: string) => Array<{ planGoal: string; outcome: string; timestamp: string }>\n findSkills: (query: string) => Array<{ name: string; successRate: number }>\n }): void {\n this.memoryStores = stores\n }\n\n getMemoryContext(query: string): string {\n return this.buildMemoryContext(query)\n }\n\n private buildMemoryContext(query: string): string {\n if (!this.memoryStores) return \"\"\n const parts: string[] = []\n try {\n const episodes = this.memoryStores.searchEpisodes(query).slice(0, 3)\n if (episodes.length > 0) {\n parts.push(\"Relevant past sessions:\")\n parts.push(episodes.map(e => `- ${e.outcome === \"success\" ? \"\u2705\" : e.outcome === \"partial\" ? \"\u26A0\uFE0F\" : \"\u274C\"} ${e.planGoal} (${e.timestamp.slice(0, 10)})`).join(\"\\n\"))\n }\n const skills = this.memoryStores.findSkills(query).slice(0, 3)\n if (skills.length > 0) {\n parts.push(\"Relevant known skills:\")\n parts.push(skills.map(s => `- ${s.name} (${(s.successRate * 100).toFixed(0)}% success rate)`).join(\"\\n\"))\n }\n } catch (error) {\n logParseError('buildMemoryContext', error);\n }\n return parts.length > 0 ? `\\n\\n## Memory Context\\n${parts.join(\"\\n\\n\")}` : \"\"\n }\n\n setOpencodeClient(client: unknown): void {\n this.opencodeClient = client\n if (this.config.provider === \"opencode\" || !process.env.OPENAI_API_KEY) {\n this.config.provider = \"opencode\"\n }\n }\n\n setSessionId(sessionId: string): void {\n this.pluginSessionId = sessionId\n }\n\n setModelRegistry(registry: ModelRegistry): void {\n this.modelRegistry = registry\n }\n\n setSessionStore(store: import(\"../memory/session-store.js\").SessionStore): void {\n this.sessionStore = store\n }\n\n updateConfig(config: Partial<LLMConfig>): void {\n Object.assign(this.config, config)\n }\n\n getCurrentModel(): string {\n return this.config.model ?? \"unknown\"\n }\n\n async call(req: LLMRequest): Promise<LLMResponse> {\n const startTime = Date.now()\n let success = false\n let response: LLMResponse\n\n try {\n switch (this.config.provider) {\n case \"openai\":\n response = await this.callOpenAI(req)\n break\n case \"anthropic\":\n response = await this.callAnthropic(req)\n break\n case \"local\":\n response = await this.callLocal(req)\n break\n case \"opencode\":\n response = await this.callOpenCode(req)\n break\n default:\n if (this.opencodeClient) response = await this.callOpenCode(req)\n else response = await this.callOpenAI(req)\n }\n success = !response.content.startsWith(\"LLM error\") && !response.content.startsWith(\"[NO_LLM]\") && !response.content.startsWith(\"LLM call failed\")\n } catch (error) {\n logParseError('LLM call', error);\n response = { content: \"LLM call threw an exception\", finishReason: \"error\" }\n success = false\n }\n\n const latency = Date.now() - startTime\n \n const taskType = this.sessionStore && this.pluginSessionId\n ? this.sessionStore.getOrCreate(this.pluginSessionId).currentTaskType\n : undefined\n this.modelRegistry?.recordCall(this.getCurrentModel(), success, latency, taskType)\n\n return response\n }\n\n async decomposeTask(goal: string, context: string): Promise<string[]> {\n try {\n const resp = await this.call({\n systemPrompt: \"You are a software task decomposer. Break down the given goal into sequential subtasks. Each subtask should be a single, concrete action. Return as JSON array of strings.\" + this.buildMemoryContext(goal),\n userPrompt: `Goal: ${goal}\\n\\nContext:\\n${context}\\n\\nBreak this down into 3-7 sequential subtasks. Return JSON array of strings.`,\n jsonMode: false,\n temperature: 0.2,\n })\n\n const cleaned = resp.content.trim()\n try {\n const parsed = JSON.parse(cleaned)\n if (Array.isArray(parsed)) return parsed\n if (parsed.subtasks && Array.isArray(parsed.subtasks)) return parsed.subtasks\n if (parsed.steps && Array.isArray(parsed.steps)) return parsed.steps\n } catch (error) {\n logParseError('decomposeTask JSON parse', error);\n }\n\n const codeBlock = cleaned.match(/```(?:json)?\\s*\\n?(\\[[\\s\\S]*?\\])\\s*\\n?```/)\n if (codeBlock) {\n try { const arr = JSON.parse(codeBlock[1]); if (Array.isArray(arr)) return arr } catch (error) { logParseError('decomposeTask codeBlock', error); }\n }\n\n const arrMatch = cleaned.match(/\\[[\\s\\S]*?\\]/)\n if (arrMatch) {\n try { const arr = JSON.parse(arrMatch[0]); if (Array.isArray(arr)) return arr } catch (error) { logParseError('decomposeTask arrMatch', error); }\n }\n } catch (error) {\n logParseError('decomposeTask', error);\n }\n\n return []\n }\n\n async summarizeContext(planGoal: string, turns: string[]): Promise<string> {\n const resp = await this.call({\n systemPrompt: \"You are a context compressor. Summarize the following conversation into a compact form that preserves: key decisions made, files changed, invariants that must be preserved, and remaining tasks. Be concise.\" + this.buildMemoryContext(planGoal),\n userPrompt: `Goal: ${planGoal}\\n\\nConversation:\\n${turns.join(\"\\n\")}\\n\\nProvide a compact summary.`,\n maxTokens: 1024,\n temperature: 0.1,\n })\n return resp.content\n }\n\n async analyzeError(errorText: string, modifiedFiles: string[]): Promise<{\n category: string\n rootCause: string\n fix: string\n }> {\n try {\n const resp = await this.call({\n systemPrompt: \"You are an error analyst. Given an error message and list of recently modified files, determine: the error category (compile/type/test/import/runtime), the likely root cause, and a specific fix suggestion. Return as JSON with keys: category, rootCause, fix.\" + this.buildMemoryContext(errorText),\n userPrompt: `Error:\\n${errorText}\\n\\nRecently modified files:\\n${modifiedFiles.join(\"\\n\")}\\n\\nAnalyze and return JSON.`,\n jsonMode: false,\n temperature: 0.2,\n })\n\n const cleaned = resp.content.trim()\n try {\n const parsed = JSON.parse(cleaned)\n if (parsed.category || parsed.rootCause) return parsed\n } catch (error) {\n logParseError('analyzeError JSON parse', error);\n }\n\n const codeBlock = cleaned.match(/```(?:json)?\\s*\\n?(\\{[\\s\\S]*?\\})\\s*\\n?```/)\n if (codeBlock) {\n try {\n const parsed = JSON.parse(codeBlock[1])\n if (parsed.category) return parsed\n } catch (error) {\n logParseError('analyzeError codeBlock', error);\n }\n }\n\n const jsonMatch = cleaned.match(/\\{[\\s\\S]*?\"category\"[\\s\\S]*?\"rootCause\"[\\s\\S]*?\"fix\"[\\s\\S]*?\\}/)\n if (jsonMatch) {\n try {\n const parsed = JSON.parse(jsonMatch[0])\n if (parsed.category) return parsed\n } catch (error) {\n logParseError('analyzeError jsonMatch', error);\n }\n }\n } catch (error) {\n logParseError('analyzeError', error);\n }\n\n return { category: \"unknown\", rootCause: \"Unable to analyze\", fix: \"Manual investigation needed\" }\n }\n\n private extractJSON<T>(content: string, requiredKey?: string): T | null {\n const cleaned = content.trim()\n try {\n const parsed = JSON.parse(cleaned)\n if (!requiredKey || (parsed && typeof parsed === \"object\" && requiredKey in parsed)) return parsed as T\n } catch (error) {\n logParseError('extractJSON direct parse', error);\n }\n const codeBlock = cleaned.match(/```(?:json)?\\s*\\n?(\\{[\\s\\S]*?\\})\\s*\\n?```/)\n if (codeBlock) {\n try {\n const parsed = JSON.parse(codeBlock[1])\n if (!requiredKey || (parsed && typeof parsed === \"object\" && requiredKey in parsed)) return parsed as T\n } catch (error) {\n logParseError('extractJSON codeBlock', error);\n }\n }\n if (requiredKey) {\n const loose = cleaned.match(new RegExp(`\\\\{[\\s\\S]*?\"${requiredKey}\"[\\\\s\\\\S]*?\\\\}`))\n if (loose) {\n try {\n const parsed = JSON.parse(loose[0])\n if (requiredKey in parsed) return parsed as T\n } catch (error) {\n logParseError('extractJSON loose match', error);\n }\n }\n const arrMatch = cleaned.match(/\\[[\\s\\S]*?\\]/)\n if (requiredKey === \"steps\" && arrMatch) {\n try {\n const arr = JSON.parse(arrMatch[0])\n if (Array.isArray(arr)) return { steps: arr, complexity: \"medium\" } as unknown as T\n } catch (error) {\n logParseError('extractJSON arrMatch', error);\n }\n }\n }\n return null\n }\n\n async generatePlan(goal: string, constraints: string[], codebaseSummary: string): Promise<{\n steps: Array<{ id: string; description: string; dependsOn: string[] }>\n complexity: string\n }> {\n try {\n const resp = await this.call({\n systemPrompt: `You are a software planning assistant. Generate a plan as JSON with \"steps\" (array of {id, description, dependsOn}) and \"complexity\" (\"low\"/\"medium\"/\"high\"). Steps IDs like \"step-1\", \"step-2\".` + this.buildMemoryContext(goal),\n userPrompt: `Goal: ${goal}\\nCodebase: ${codebaseSummary}\\n\\nGenerate plan JSON.`,\n jsonMode: false,\n temperature: 0.3,\n })\n const parsed = this.extractJSON<{ steps: Array<{ id: string; description: string; dependsOn: string[] }>; complexity: string }>(resp.content, \"steps\")\n if (parsed && Array.isArray(parsed.steps) && parsed.steps.length > 0) return parsed\n } catch (error) {\n logParseError('generatePlan', error);\n }\n return { steps: [], complexity: \"low\" }\n }\n\n async reviewCode(goal: string, files: Record<string, string>): Promise<string[]> {\n const filesStr = Object.entries(files).map(([path, content]) => `### ${path}\\n\\`\\`\\`\\n${content.slice(0, 2000)}\\n\\`\\`\\``).join(\"\\n\\n\")\n const resp = await this.call({\n systemPrompt: \"You are a code reviewer. Review the given files for potential issues: type safety, edge cases, error handling, performance, security, and maintainability. Return a JSON array of issue descriptions (strings). If no issues found, return empty array.\" + this.buildMemoryContext(goal),\n userPrompt: `Goal: ${goal}\\n\\nFiles:\\n${filesStr}\\n\\nList issues found as JSON array.`,\n jsonMode: true,\n temperature: 0.2,\n })\n try {\n return JSON.parse(resp.content)\n } catch (error) {\n logParseError('reviewCode JSON parse', error);\n return []\n }\n }\n\n async suggestRole(description: string): Promise<string | null> {\n try {\n const resp = await this.call({\n systemPrompt: \"You are an agent role classifier. Given a task description, determine the best agent role for it. Available roles: architect (design/structure/API), developer (implementation/coding/fix), qa (testing/verification/review), coordinator (planning/orchestration/coordination), pm (requirements/specs/acceptance). Return ONLY the role name in lowercase: architect, developer, qa, coordinator, or pm. No explanation, no punctuation.\" + this.buildMemoryContext(description),\n userPrompt: description,\n temperature: 0.1,\n maxTokens: 20,\n })\n const role = resp.content.trim().toLowerCase()\n if ([\"architect\", \"developer\", \"qa\", \"coordinator\", \"pm\"].includes(role)) {\n return role as \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\"\n }\n } catch (error) {\n logParseError('suggestAgentRole', error);\n }\n return null\n }\n\n async suggestSkillSteps(taskDescription: string, successOutput: string): Promise<{\n steps: Array<{ action: string; description: string; tool?: string; expectedOutput: string; rollback?: string }>\n }> {\n const resp = await this.call({\n systemPrompt: \"You are a skill extractor. Given a task description and its successful output, extract reusable procedural steps. Each step should have: action, description, tool (optional), expectedOutput, and rollback (optional). Return as JSON with \\\"steps\\\" array.\" + this.buildMemoryContext(taskDescription),\n userPrompt: `Task: ${taskDescription}\\n\\nSuccessful output:\\n${successOutput}\\n\\nExtract reusable steps as JSON.`,\n jsonMode: true,\n temperature: 0.3,\n })\n try {\n return JSON.parse(resp.content)\n } catch (error) {\n logParseError('suggestSkillSteps JSON parse', error);\n return { steps: [{ action: \"execute\", description: taskDescription, expectedOutput: \"completed\" }] }\n }\n }\n\n private detectProvider(): LLMConfig[\"provider\"] {\n if (process.env.OPENAI_API_KEY || process.env.OPENAI_BASE_URL) return \"openai\"\n if (process.env.ANTHROPIC_API_KEY) return \"anthropic\"\n return \"opencode\"\n }\n\n private async callOpenAI(req: LLMRequest): Promise<LLMResponse> {\n const apiKey = this.config.apiKey ?? process.env.OPENAI_API_KEY ?? \"\"\n const baseUrl = this.config.baseURL ?? process.env.OPENAI_BASE_URL\n if (!apiKey && !baseUrl) return this.fallbackResponse(req)\n\n const body: Record<string, unknown> = {\n model: this.config.model ?? DEFAULT_MODELS.openai,\n messages: [\n { role: \"system\", content: req.systemPrompt },\n { role: \"user\", content: req.userPrompt },\n ],\n max_tokens: req.maxTokens ?? this.config.maxTokens,\n temperature: req.temperature ?? this.config.temperature,\n }\n\n if (this.config.variant) {\n body.variant = this.config.variant\n }\n\n if (req.jsonMode) {\n body.response_format = { type: \"json_object\" }\n }\n\n return this.httpCall(\n this.config.baseURL ?? \"https://api.openai.com/v1/chat/completions\",\n apiKey,\n body,\n )\n }\n\n private async callAnthropic(req: LLMRequest): Promise<LLMResponse> {\n const apiKey = this.config.apiKey ?? process.env.ANTHROPIC_API_KEY\n if (!apiKey) return this.fallbackResponse(req)\n\n const body = {\n model: this.config.model ?? DEFAULT_MODELS.anthropic,\n max_tokens: req.maxTokens ?? this.config.maxTokens,\n temperature: req.temperature ?? this.config.temperature,\n system: req.systemPrompt + (req.jsonMode ? \"\\nYou MUST return valid JSON only.\" : \"\"),\n messages: [{ role: \"user\", content: req.userPrompt }],\n }\n\n return this.httpCall(\n \"https://api.anthropic.com/v1/messages\",\n apiKey,\n body,\n { \"anthropic-version\": \"2023-06-01\" },\n )\n }\n\n private async callLocal(req: LLMRequest): Promise<LLMResponse> {\n try {\n const prompt = req.systemPrompt + \"\\n\\n\" + req.userPrompt\n const output = execFileSync(\"ollama\", [\"run\", this.config.model ?? \"codellama\", prompt], {\n encoding: \"utf-8\",\n timeout: 60000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n })\n return { content: output.trim() }\n } catch (error) {\n logParseError('callLocal ollama', error);\n return this.fallbackResponse(req)\n }\n }\n\n private async callOpenCode(req: LLMRequest): Promise<LLMResponse> {\n // Try direct HTTP call first if we have credentials for any provider\n const openaiKey = this.config.apiKey ?? process.env.OPENAI_API_KEY\n const openaiBaseUrl = this.config.baseURL ?? process.env.OPENAI_BASE_URL\n const anthropicKey = process.env.ANTHROPIC_API_KEY\n if (openaiKey || openaiBaseUrl) {\n return this.callOpenAI(req)\n }\n if (anthropicKey) {\n return this.callAnthropic(req)\n }\n\n // Fall back to OpenCode SDK client (noReply must be false to get a response)\n if (this.opencodeClient && this.pluginSessionId) {\n try {\n const client = this.opencodeClient as {\n session: {\n prompt: (opts: {\n body: { system?: string; noReply?: boolean; parts: Array<{ type: string; text: string }> }\n path: { id: string }\n }) => Promise<{ data?: { parts?: Array<{ type: string; text?: string }> }; parts?: Array<{ type: string; text?: string }> }>\n }\n }\n\n const result = await client.session.prompt({\n body: {\n system: req.jsonMode\n ? `${req.systemPrompt}\\n\\nRespond with ONLY valid JSON. No markdown, no explanation.`\n : req.systemPrompt,\n noReply: false,\n parts: [{ type: \"text\", text: req.userPrompt }],\n },\n path: { id: this.pluginSessionId },\n })\n\n const parts = result.data?.parts ?? result.parts ?? []\n const textPart = parts.find((p: { type: string; text?: string }) => p.type === \"text\")\n const text = textPart?.text ?? \"\"\n\n if (text.trim()) {\n return { content: text.trim(), finishReason: \"stop\" }\n }\n } catch (error) {\n logParseError('callOpenCode', error);\n }\n }\n\n return this.fallbackResponse(req)\n }\n\n private async httpCall(url: string, apiKey: string, body: unknown, extraHeaders: Record<string, string> = {}): Promise<LLMResponse> {\n try {\n const payload = JSON.stringify(body)\n const args = [\n \"-s\", \"-X\", \"POST\", url,\n \"-H\", \"Content-Type: application/json\",\n \"-H\", `Authorization: Bearer ${apiKey}`,\n ]\n for (const [k, v] of Object.entries(extraHeaders)) {\n args.push(\"-H\", `${k}: ${v}`)\n }\n args.push(\"-d\", payload)\n\n const output = execFileSync(\"curl\", args, {\n encoding: \"utf-8\",\n timeout: 60000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n })\n\n const data = JSON.parse(output)\n\n if (data.error) {\n return { content: `LLM error: ${data.error.message ?? JSON.stringify(data.error)}` }\n }\n\n if (data.content) {\n return {\n content: typeof data.content === \"string\" ? data.content : data.content[0]?.text ?? JSON.stringify(data.content),\n usage: data.usage ? { promptTokens: data.usage.input_tokens ?? 0, completionTokens: data.usage.output_tokens ?? 0 } : undefined,\n finishReason: data.stop_reason,\n }\n }\n\n const choice = data.choices?.[0]\n if (choice) {\n return {\n content: choice.message?.content ?? JSON.stringify(choice),\n usage: data.usage ? { promptTokens: data.usage.prompt_tokens ?? 0, completionTokens: data.usage.completion_tokens ?? 0 } : undefined,\n finishReason: choice.finish_reason,\n }\n }\n\n return { content: JSON.stringify(data) }\n } catch (e) {\n return { content: `LLM call failed: ${(e as Error).message}` }\n }\n }\n\n private fallbackResponse(req: LLMRequest): LLMResponse {\n if (req.jsonMode) {\n return { content: `{\"_no_llm\": true}`, finishReason: \"no_llm\" }\n }\n return { content: `[NO_LLM] No LLM configured. Set OPENAI_API_KEY (OpenAI/compatible), ANTHROPIC_API_KEY (Claude), or OPENAI_BASE_URL (local LLM), or run within OpenCode for native LLM access.`, finishReason: \"no_llm\" }\n }\n}\n\nexport const llmEngine = new LLMEngine()\n", "import { LLMEngine } from \"../core/llm.js\"\nimport type { ModelRegistry } from \"../core/model-registry.js\"\nimport type { AgentRole } from \"./coordinator.js\"\nimport { RoleRegistry } from \"./role-registry.js\"\n\nexport interface AgentContext {\n systemPrompt: string\n sessionId: string\n role: AgentRole | string\n taskDescription: string\n pipelineContext?: string\n pendingMessages?: Array<{ from: string; payload: string }>\n sharedMemory?: Array<{ key: string; value: string; writtenBy: string }>\n}\n\nexport interface AgentResult {\n output: string\n success: boolean\n error?: string\n modelUsed?: string\n}\n\n/**\n * Manages isolated LLM runtimes per role + session.\n * Each role gets its own LLMEngine instance with a dedicated session ID,\n * so architect, developer, and QA operate in separate context windows.\n */\nexport class AgentRuntime {\n private engines = new Map<string, LLMEngine>()\n private opencodeClient: unknown = null\n private modelRegistry?: ModelRegistry\n private roleRegistry: RoleRegistry\n\n constructor() {\n this.roleRegistry = new RoleRegistry()\n }\n\n setOpencodeClient(client: unknown): void {\n this.opencodeClient = client\n }\n\n setModelRegistry(registry: ModelRegistry): void {\n this.modelRegistry = registry\n }\n\n getRoleRegistry(): RoleRegistry {\n return this.roleRegistry\n }\n\n /**\n * Get or create an isolated LLM engine for a specific role + session.\n * Each engine has its own sessionId = `${parentSessionId}-${role}`.\n */\n private getEngine(parentSessionId: string, role: string): LLMEngine {\n const key = `${parentSessionId}::${role}`\n if (!this.engines.has(key)) {\n const engine = new LLMEngine()\n engine.setOpencodeClient(this.opencodeClient)\n engine.setSessionId(`${parentSessionId}-${role}`)\n if (this.modelRegistry) engine.setModelRegistry(this.modelRegistry)\n this.engines.set(key, engine)\n }\n return this.engines.get(key)!\n }\n\n /**\n * Execute a task with a dedicated LLM call using the role's system prompt.\n * The engine is isolated per (session, role) pair.\n */\n async execute(ctx: AgentContext): Promise<AgentResult> {\n const engine = this.getEngine(ctx.sessionId, ctx.role)\n const roleDef = this.roleRegistry.getBuiltIn(ctx.role as AgentRole)\n ?? this.roleRegistry.getCustom(ctx.role)\n\n // Build the system prompt from the role definition + context\n const promptParts: string[] = []\n if (roleDef?.prompt) {\n promptParts.push(roleDef.prompt)\n } else {\n promptParts.push(`You are a ${ctx.role} in a software engineering team.`)\n }\n promptParts.push(`\\n\\nCurrent task: ${ctx.taskDescription}`)\n\n if (ctx.pipelineContext) {\n promptParts.push(`\\n\\n## Pipeline Context\\n${ctx.pipelineContext}`)\n }\n if (ctx.pendingMessages && ctx.pendingMessages.length > 0) {\n promptParts.push(`\\n\\n## Pending Messages\\n${ctx.pendingMessages.map(m => `From ${m.from}: ${m.payload}`).join(\"\\n\")}`)\n }\n if (ctx.sharedMemory && ctx.sharedMemory.length > 0) {\n promptParts.push(`\\n\\n## Shared Memory\\n${ctx.sharedMemory.map(m => `[${m.key}] (by ${m.writtenBy}): ${m.value.slice(0, 200)}`).join(\"\\n\")}`)\n }\n\n try {\n const resp = await engine.call({\n systemPrompt: promptParts.join(\"\\n\"),\n userPrompt: ctx.taskDescription,\n temperature: 0.3,\n maxTokens: 4096,\n })\n const output = resp.content\n if (output.startsWith(\"LLM error\") || output.startsWith(\"[NO_LLM]\")) {\n return { output, success: false, error: output }\n }\n return { output, success: true, modelUsed: engine.getCurrentModel() }\n } catch (e) {\n return { output: \"\", success: false, error: (e as Error).message }\n }\n }\n}\n", "import type { AgentRole, AgentTask, SharedMemoryEntry } from \"./coordinator.js\"\nimport type { AgentDef, CustomAgentDef } from \"./role-registry.js\"\nimport type { LLMEngine } from \"../core/llm.js\"\n\nexport interface PipelineStage {\n role: string\n description: string\n validationCriteria?: string[]\n model?: string\n}\n\nexport interface WorkflowPipeline {\n id: string\n name: string\n stages: PipelineStage[]\n createdAt: number\n}\n\nexport interface CrossValidationResult {\n stage: string\n targetStage: string\n issues: Array<{\n severity: \"error\" | \"warning\" | \"info\"\n description: string\n source: string\n }>\n passed: boolean\n summary: string\n}\n\nexport class Orchestrator {\n private pipelines = new Map<string, WorkflowPipeline>()\n private activeRuns = new Map<string, {\n pipelineId: string\n currentStageIndex: number\n stageResults: Map<string, { output: string; issues: string[]; validatedBy: string[] }>\n }>()\n private llmEngine: LLMEngine | null = null\n\n setLLMEngine(engine: LLMEngine): void {\n this.llmEngine = engine\n }\n\n definePipeline(pipeline: WorkflowPipeline): void {\n this.pipelines.set(pipeline.id, pipeline)\n }\n\n getPipeline(id: string): WorkflowPipeline | undefined {\n return this.pipelines.get(id)\n }\n\n listPipelines(): WorkflowPipeline[] {\n return [...this.pipelines.values()]\n }\n\n startRun(runId: string, pipelineId: string): boolean {\n const pipeline = this.pipelines.get(pipelineId)\n if (!pipeline) return false\n this.activeRuns.set(runId, {\n pipelineId,\n currentStageIndex: 0,\n stageResults: new Map(),\n })\n return true\n }\n\n getCurrentStage(runId: string): PipelineStage | null {\n const run = this.activeRuns.get(runId)\n if (!run) return null\n const pipeline = this.pipelines.get(run.pipelineId)\n if (!pipeline) return null\n if (run.currentStageIndex >= pipeline.stages.length) return null\n return pipeline.stages[run.currentStageIndex]\n }\n\n advanceStage(runId: string, output: string, issues: string[]): PipelineStage | null {\n const run = this.activeRuns.get(runId)\n if (!run) return null\n const pipeline = this.pipelines.get(run.pipelineId)\n if (!pipeline) return null\n\n const currentStage = pipeline.stages[run.currentStageIndex]\n if (currentStage) {\n run.stageResults.set(currentStage.role, { output, issues, validatedBy: [] })\n }\n\n run.currentStageIndex++\n if (run.currentStageIndex >= pipeline.stages.length) return null\n return pipeline.stages[run.currentStageIndex]\n }\n\n getStageResult(runId: string, role: string): { output: string; issues: string[]; validatedBy: string[] } | undefined {\n return this.activeRuns.get(runId)?.stageResults.get(role)\n }\n\n getAllStageResults(runId: string): Map<string, { output: string; issues: string[]; validatedBy: string[] }> {\n return this.activeRuns.get(runId)?.stageResults ?? new Map()\n }\n\n async crossValidate(\n targetRole: string,\n output: string,\n allStageResults: Map<string, { output: string; issues: string[]; validatedBy: string[] }>,\n sharedMemory: SharedMemoryEntry[],\n ): Promise<CrossValidationResult> {\n const issues: CrossValidationResult[\"issues\"] = []\n\n // Basic structural checks\n for (const [role, result] of allStageResults) {\n if (role === targetRole) continue\n if (!result.output || result.output.trim().length === 0) {\n issues.push({ severity: \"warning\", description: `Output from ${role} stage appears empty or incomplete`, source: role })\n }\n }\n\n // Semantic validation via LLM (if available)\n if (this.llmEngine && allStageResults.size >= 2) {\n const previousStages = [...allStageResults].filter(([r]) => r !== targetRole)\n const previousOutputs = previousStages.map(([r, res]) => `### ${r}\\n${res.output.slice(0, 1000)}`).join(\"\\n\\n\")\n\n const validationPrompt = `You are a cross-validator. Compare the outputs of different stages in a software engineering pipeline. Identify any inconsistencies, contradictions, or missing pieces between stages.\n\nPrevious stage outputs:\n${previousOutputs}\n\nCurrent stage (${targetRole}) output:\n${output.slice(0, 1500)}\n\nCheck:\n1. Does the current output contradict any previous stage?\n2. Are there requirements from earlier stages that are not addressed?\n3. Are there any gaps or missing pieces?\n\nReturn your analysis as JSON with:\n- \"passed\": boolean\n- \"issues\": array of { \"severity\": \"error\"|\"warning\"|\"info\", \"description\": string, \"source\": string }\n- \"summary\": string`\n\n try {\n const llmResp = await this.llmEngine.call({\n systemPrompt: \"You are a strict cross-validator. Compare pipeline stage outputs for consistency.\",\n userPrompt: validationPrompt,\n jsonMode: true,\n temperature: 0.1,\n maxTokens: 1024,\n })\n const parsed = JSON.parse(llmResp.content)\n if (parsed.issues && Array.isArray(parsed.issues)) {\n for (const issue of parsed.issues) {\n if (issue.severity && issue.description && !issues.some(i => i.description === issue.description)) {\n issues.push({\n severity: issue.severity as \"error\" | \"warning\" | \"info\",\n description: issue.description,\n source: issue.source ?? \"llm-validator\",\n })\n }\n }\n }\n } catch { /* LLM call failed, fall through */ }\n }\n\n const passed = issues.filter(i => i.severity === \"error\").length === 0\n const summary = passed\n ? `Cross-validation passed: ${allStageResults.size} stages reviewed, no critical issues`\n : `Cross-validation found ${issues.length} issue(s): ${issues.filter(i => i.severity === \"error\").length} error(s), ${issues.filter(i => i.severity === \"warning\").length} warning(s)`\n\n return { stage: targetRole, targetStage: targetRole, issues, passed, summary }\n }\n\n buildContextForRole(role: string, runId: string, sharedMemory: SharedMemoryEntry[]): string {\n const parts: string[] = []\n const run = this.activeRuns.get(runId)\n if (!run) return \"\"\n\n const pipeline = this.pipelines.get(run.pipelineId)\n if (pipeline) {\n parts.push(`## Pipeline: ${pipeline.name}`)\n parts.push(pipeline.stages.map((s, i) =>\n ` ${i < run.currentStageIndex ? \"\u2705\" : i === run.currentStageIndex ? \"\u25B6\" : \"\u23F3\"} **${s.role}**: ${s.description}`\n ).join(\"\\n\"))\n parts.push(\"\")\n }\n\n for (const [prevRole, result] of run.stageResults) {\n if (prevRole === role) continue\n parts.push(`### Output from ${prevRole}`)\n parts.push(result.output.slice(0, 500))\n if (result.issues.length > 0) {\n parts.push(`Issues flagged: ${result.issues.join(\", \")}`)\n }\n parts.push(\"\")\n }\n\n if (sharedMemory.length > 0) {\n parts.push(\"### Shared Memory\")\n for (const entry of sharedMemory) {\n parts.push(`[${entry.key}] (by ${entry.writtenBy}): ${entry.value.slice(0, 200)}`)\n }\n }\n\n return parts.join(\"\\n\")\n }\n\n getSuggestedPipeline(description: string): string {\n const d = description.toLowerCase()\n if (d.includes(\"feature\") || d.includes(\"new\") || d.includes(\"implement\") || d.includes(\"add\")) return \"feature-dev\"\n if (d.includes(\"fix\") || d.includes(\"bug\") || d.includes(\"repair\")) return \"fix-verify\"\n if (d.includes(\"refactor\") || d.includes(\"restructure\") || d.includes(\"extract\")) return \"refactor-review\"\n if (d.includes(\"deploy\") || d.includes(\"release\") || d.includes(\"ci\") || d.includes(\"cd\")) return \"deploy-check\"\n return \"feature-dev\"\n }\n\n getBuiltInPipelines(): WorkflowPipeline[] {\n return [\n {\n id: \"feature-dev\",\n name: \"Feature Development\",\n stages: [\n { role: \"pm\", description: \"Define requirements and acceptance criteria\" },\n { role: \"architect\", description: \"Design architecture and interface contracts\" },\n { role: \"developer\", description: \"Implement the feature following the architecture\" },\n { role: \"qa\", description: \"Review implementation for correctness, edge cases, and regressions\" },\n ],\n createdAt: Date.now(),\n },\n {\n id: \"fix-verify\",\n name: \"Bug Fix + Verify\",\n stages: [\n { role: \"qa\", description: \"Reproduce the bug and document the exact failure\" },\n { role: \"developer\", description: \"Fix the root cause\" },\n { role: \"qa\", description: \"Verify the fix and run regression tests\" },\n ],\n createdAt: Date.now(),\n },\n {\n id: \"refactor-review\",\n name: \"Refactor + Review\",\n stages: [\n { role: \"architect\", description: \"Design the new structure and migration path\" },\n { role: \"developer\", description: \"Execute the refactoring\" },\n { role: \"qa\", description: \"Verify no regressions from refactoring\" },\n ],\n createdAt: Date.now(),\n },\n {\n id: \"deploy-check\",\n name: \"Deploy Checklist\",\n stages: [\n { role: \"pm\", description: \"Confirm scope and readiness\" },\n { role: \"qa\", description: \"Run full regression suite and check for blockers\" },\n { role: \"coordinator\", description: \"Orchestrate the deploy and monitor\" },\n ],\n createdAt: Date.now(),\n },\n ]\n }\n}\n", "export interface SkillMeta {\n format: \"agentic-skill/v1\"\n id: string\n name: string\n version: number\n author: \"agent\" | \"human\"\n agentRole?: string\n}\n\nexport interface SkillDefinition {\n meta: SkillMeta\n trigger: {\n pattern: string\n keywords: string[]\n context: string[]\n }\n workflow: {\n steps: SkillStep[]\n estimatedDuration: string\n parallelizable: boolean\n }\n quality: {\n successRate: number\n usageCount: number\n failureScenarios: string[]\n }\n audit: {\n createdAt: string\n lastUsed: string\n lastModified: string\n modifiedBy: string\n }\n}\n\nexport interface SkillStep {\n order: number\n action: string\n description: string\n tool?: string\n expectedOutput: string\n rollback?: string\n}\n\nexport function createSkillDefinition(\n name: string,\n triggerPattern: string,\n keywords: string[],\n steps: { action: string; description: string; tool?: string; expectedOutput: string; rollback?: string }[],\n triggerContext?: string[],\n): SkillDefinition {\n const now = new Date().toISOString()\n return {\n meta: {\n format: \"agentic-skill/v1\",\n id: `skill-${Date.now()}`,\n name,\n version: 1,\n author: \"agent\",\n },\n trigger: {\n pattern: triggerPattern,\n keywords: keywords.slice(0, 10),\n context: triggerContext ?? [],\n },\n workflow: {\n steps: steps.map((s, i) => ({\n order: i + 1,\n action: s.action,\n description: s.description,\n tool: s.tool,\n expectedOutput: s.expectedOutput,\n rollback: s.rollback ?? inferRollback(s.action, s.description),\n })),\n estimatedDuration: `${steps.length * 2}m`,\n parallelizable: steps.some(s => s.tool === \"agentic_parallel\"),\n },\n quality: {\n successRate: 1.0,\n usageCount: 1,\n failureScenarios: [],\n },\n audit: {\n createdAt: now,\n lastUsed: now,\n lastModified: now,\n modifiedBy: \"system\",\n },\n }\n}\n\nfunction inferRollback(action: string, description: string): string | undefined {\n const lower = action.toLowerCase() + \" \" + description.toLowerCase()\n\n if (lower.includes(\"create\") || lower.includes(\"add\") || lower.includes(\"write\")) {\n return \"Delete the created file or revert the addition\"\n }\n if (lower.includes(\"delete\") || lower.includes(\"remove\")) {\n return \"Restore from git: git checkout -- <file>\"\n }\n if (lower.includes(\"modify\") || lower.includes(\"update\") || lower.includes(\"edit\")) {\n return \"Revert changes: git checkout -- <file> or git revert <commit>\"\n }\n if (lower.includes(\"install\") || lower.includes(\"add dep\")) {\n return \"Remove dependency: npm uninstall <package>\"\n }\n if (lower.includes(\"migrate\")) {\n return \"Run down migration: <tool> migrate down\"\n }\n if (lower.includes(\"rename\") || lower.includes(\"move\")) {\n return \"Move file back to original location\"\n }\n\n return \"Undo changes via git: git stash or git checkout\"\n}\n\nexport function serializeSkill(skill: SkillDefinition): string {\n return JSON.stringify(skill, null, 2)\n}\n\nexport function deserializeSkill(json: string): SkillDefinition | null {\n try {\n const parsed = JSON.parse(json)\n if (parsed?.meta?.format?.startsWith(\"agentic-skill/\")) return parsed as SkillDefinition\n return null\n } catch {\n return null\n }\n}\n\nexport function inspectSkill(skill: SkillDefinition): string {\n let out = `## Skill: ${skill.meta.name}\\n\\n`\n out += `**Format:** ${skill.meta.format}\\n`\n out += `**Version:** ${skill.meta.version}\\n`\n out += `**Author:** ${skill.meta.author}\\n`\n out += `**Success Rate:** ${(skill.quality.successRate * 100).toFixed(0)}%\\n`\n out += `**Usage:** ${skill.quality.usageCount}\\n\\n`\n out += `### Trigger\\n- Pattern: \"${skill.trigger.pattern}\"\\n- Keywords: ${skill.trigger.keywords.join(\", \")}\\n\\n`\n out += `### Workflow\\n`\n for (const step of skill.workflow.steps) {\n out += `${step.order}. **${step.action}** \u2014 ${step.description}\\n`\n if (step.tool) out += ` Tool: \\`${step.tool}\\`\\n`\n out += ` Expected: ${step.expectedOutput}\\n`\n }\n return out\n}\n", "export const MEMORY_SCHEMA_VERSION = 1\n\nexport interface SchemaMigration {\n from: number\n to: number\n description: string\n apply: (data: unknown) => unknown\n}\n\nexport class MemorySchemaVersion {\n private migrations: SchemaMigration[] = []\n\n constructor() {\n this.registerBuiltIn()\n }\n\n private registerBuiltIn(): void {\n this.registerMigration({\n from: 0,\n to: 1,\n description: \"Initial schema: add schema_version and timestamp fields to all memory objects\",\n apply: (data: unknown) => {\n const d = data as Record<string, unknown>\n return {\n schema_version: 1,\n ...d,\n migrated_at: new Date().toISOString(),\n _migration: \"v0\u2192v1: added schema envelope\",\n }\n },\n })\n }\n\n registerMigration(migration: SchemaMigration): void {\n const exists = this.migrations.some(m => m.from === migration.from && m.to === migration.to)\n if (!exists) {\n this.migrations.push(migration)\n this.migrations.sort((a, b) => a.from - b.from)\n }\n }\n\n upgrade<T>(data: T, currentVersion: number): T {\n let result = data\n for (const m of this.migrations) {\n if (m.from === currentVersion) {\n result = m.apply(result) as T\n currentVersion = m.to\n }\n }\n return result\n }\n\n getMigrations(): SchemaMigration[] {\n return [...this.migrations]\n }\n\n static currentVersion(): number {\n return MEMORY_SCHEMA_VERSION\n }\n}\n\nexport function createMemoryEnvelope<T>(data: T, type: string): { schema_version: number; type: string; data: T; created_at: string } {\n return {\n schema_version: MEMORY_SCHEMA_VERSION,\n type,\n data,\n created_at: new Date().toISOString(),\n }\n}\n\nexport function parseMemoryEnvelope<T>(envelope: unknown): { version: number; type: string; data: T; createdAt: string } | null {\n const e = envelope as Record<string, unknown> | undefined\n if (!e || typeof e.schema_version !== \"number\" || typeof e.type !== \"string\" || !e.data) return null\n return {\n version: e.schema_version,\n type: e.type,\n data: e.data as T,\n createdAt: (typeof e.created_at === \"string\" ? e.created_at : new Date().toISOString()),\n }\n}\n", "import { type SkillDefinition, type SkillStep, type SkillMeta, createSkillDefinition, inspectSkill, serializeSkill, deserializeSkill } from \"./skill-format.js\"\nimport { createMemoryEnvelope, parseMemoryEnvelope, MEMORY_SCHEMA_VERSION } from \"./schema-version.js\"\n\nexport { type SkillDefinition, type SkillStep, type SkillMeta, inspectSkill, serializeSkill, deserializeSkill, createSkillDefinition }\n\nexport interface SkillRecord {\n definition: SkillDefinition\n usageCount: number\n successRate: number\n lastUsed: string\n}\n\nexport class SkillStore {\n private skills = new Map<string, SkillRecord>()\n\n async extract(turn: { role: string; content: string }, contextTags: string[] = []): Promise<SkillRecord | null> {\n const content = turn.content\n\n if (!this.isExtractablePattern(content)) return null\n\n const name = this.extractName(content)\n if (!name) return null\n\n const steps = this.extractSteps(content)\n if (steps.length === 0) return null\n\n const existing = [...this.skills.values()].find(s => s.definition.meta.name === name)\n if (existing) {\n existing.usageCount++\n existing.successRate = (existing.successRate * (existing.usageCount - 1) + 1) / existing.usageCount\n existing.lastUsed = new Date().toISOString()\n existing.definition.quality.usageCount = existing.usageCount\n existing.definition.quality.successRate = existing.successRate\n existing.definition.audit.lastUsed = existing.lastUsed\n existing.definition.audit.lastModified = existing.lastUsed\n existing.definition.audit.modifiedBy = \"agent\"\n return existing\n }\n\n const keywords = this.extractKeywords(content)\n const inferredTools = this.inferTools(content)\n\n const def = createSkillDefinition(\n name,\n this.extractPattern(content),\n keywords,\n steps.map((s, i) => ({\n action: this.inferAction(s),\n description: s,\n tool: inferredTools[i] ?? this.inferToolForStep(s),\n expectedOutput: `Step ${i + 1} completed`,\n })),\n contextTags.length > 0 ? contextTags : undefined,\n )\n\n const record: SkillRecord = {\n definition: def,\n usageCount: 1,\n successRate: 1.0,\n lastUsed: new Date().toISOString(),\n }\n\n this.skills.set(def.meta.id, record)\n return record\n }\n\n find(query: string): SkillRecord[] {\n const q = query.toLowerCase()\n return [...this.skills.values()]\n .filter(s =>\n s.definition.meta.name.toLowerCase().includes(q) ||\n s.definition.trigger.pattern.toLowerCase().includes(q) ||\n s.definition.meta.name.toLowerCase().includes(q)\n )\n .sort((a, b) => b.successRate - a.successRate)\n .slice(0, 5)\n }\n\n getAll(): SkillRecord[] {\n return [...this.skills.values()].sort((a, b) => b.lastUsed.localeCompare(a.lastUsed))\n }\n\n getById(id: string): SkillRecord | undefined {\n return this.skills.get(id)\n }\n\n reportFailure(skillId: string): boolean {\n const record = this.skills.get(skillId)\n if (!record) return false\n\n record.usageCount++\n record.successRate = (record.successRate * (record.usageCount - 1)) / record.usageCount\n record.definition.quality.usageCount = record.usageCount\n record.definition.quality.successRate = record.successRate\n record.definition.quality.failureScenarios.push(`Failed at ${new Date().toISOString()}`)\n record.definition.audit.lastModified = new Date().toISOString()\n return true\n }\n\n exportEnvelope(skillId: string): string | null {\n const record = this.skills.get(skillId)\n if (!record) return null\n return JSON.stringify(createMemoryEnvelope(record.definition, \"skill\"), null, 2)\n }\n\n importFromEnvelope(json: string): boolean {\n const parsed = parseMemoryEnvelope<SkillDefinition>(JSON.parse(json))\n if (!parsed || parsed.type !== \"skill\") return false\n\n const existing = this.skills.get(parsed.data.meta.id)\n if (existing) {\n existing.definition = parsed.data\n existing.usageCount = parsed.data.quality.usageCount\n existing.successRate = parsed.data.quality.successRate\n existing.lastUsed = parsed.data.audit.lastUsed\n return true\n }\n\n this.skills.set(parsed.data.meta.id, {\n definition: parsed.data,\n usageCount: parsed.data.quality.usageCount,\n successRate: parsed.data.quality.successRate,\n lastUsed: parsed.data.audit.lastUsed,\n })\n return true\n }\n\n private isExtractablePattern(content: string): boolean {\n const lower = content.toLowerCase()\n return (lower.includes(\"\u2705\") || lower.includes(\"success\")) && (lower.includes(\"step\") || lower.includes(\"complete\") || lower.includes(\"done\"))\n }\n\n private extractName(content: string): string | null {\n const patterns = [\n /(?:created|added|implemented|built)\\s+(\\w[\\w\\s]{3,40})/i,\n /Step\\s+\\w+:\\s*(.+?)(?:\\.|$)/i,\n /Completed\\s+(.+?)(?:\\.|$)/i,\n ]\n for (const p of patterns) {\n const m = content.match(p)\n if (m) return m[1].trim().slice(0, 50)\n }\n return null\n }\n\n private extractSteps(content: string): string[] {\n const steps: string[] = []\n const lines = content.split(\"\\n\")\n for (const line of lines) {\n const m = line.match(/^\\d+\\.\\s+(.+)/)\n if (m) steps.push(m[1].trim())\n }\n return steps\n }\n\n private extractPattern(content: string): string {\n const keywords = content.match(/\\b(\\w{4,})\\b/g)\n return (keywords ?? []).slice(0, 5).join(\" \")\n }\n\n private extractKeywords(content: string): string[] {\n return [...new Set(content.match(/\\b(\\w{3,})\\b/g) ?? [])].slice(0, 10)\n }\n\n private inferAction(stepDesc: string): string {\n const lower = stepDesc.toLowerCase()\n if (lower.includes(\"create\") || lower.includes(\"add\") || lower.includes(\"write\")) return \"create\"\n if (lower.includes(\"delete\") || lower.includes(\"remove\")) return \"delete\"\n if (lower.includes(\"modify\") || lower.includes(\"update\") || lower.includes(\"edit\") || lower.includes(\"change\")) return \"modify\"\n if (lower.includes(\"install\") || lower.includes(\"setup\")) return \"install\"\n if (lower.includes(\"test\") || lower.includes(\"verify\") || lower.includes(\"check\")) return \"verify\"\n if (lower.includes(\"run\") || lower.includes(\"exec\")) return \"execute\"\n if (lower.includes(\"review\") || lower.includes(\"audit\") || lower.includes(\"inspect\")) return \"review\"\n return \"execute\"\n }\n\n private inferToolForStep(stepDesc: string): string | undefined {\n const lower = stepDesc.toLowerCase()\n if (lower.includes(\"read\") || lower.includes(\"check file\")) return \"read\"\n if (lower.includes(\"write\") || lower.includes(\"create file\")) return \"write\"\n if (lower.includes(\"edit\") || lower.includes(\"modify\")) return \"edit\"\n if (lower.includes(\"run\") || lower.includes(\"test\") || lower.includes(\"exec\")) return \"bash\"\n if (lower.includes(\"install\") || lower.includes(\"npm\") || lower.includes(\"pip\")) return \"bash\"\n if (lower.includes(\"search\") || lower.includes(\"find\")) return \"grep\"\n return undefined\n }\n\n private inferTools(content: string): string[] {\n const tools: string[] = []\n const toolPatterns: Array<{ pattern: RegExp; tool: string }> = [\n { pattern: /\\b(read|Read)\\b/, tool: \"read\" },\n { pattern: /\\b(edit|Edit)\\b/, tool: \"edit\" },\n { pattern: /\\b(write|Write)\\b/, tool: \"write\" },\n { pattern: /\\b(bash|Bash|exec|run)\\b/, tool: \"bash\" },\n { pattern: /\\b(grep|search|find)\\b/, tool: \"grep\" },\n ]\n for (const { pattern, tool } of toolPatterns) {\n if (pattern.test(content)) tools.push(tool)\n }\n return [...new Set(tools)]\n }\n}\n", "import { createMemoryEnvelope, parseMemoryEnvelope, MEMORY_SCHEMA_VERSION, MemorySchemaVersion } from \"./schema-version.js\"\n\nexport interface Episode {\n id: string\n sessionId: string\n planGoal: string\n summary: string\n outcome: \"success\" | \"partial\" | \"failed\"\n decisions: string[]\n filesChanged: string[]\n timestamp: string\n tags: string[]\n}\n\nexport interface EpisodeEnvelope {\n schema_version: number\n type: \"episode\"\n data: Episode\n created_at: string\n}\n\nexport class EpisodicStore {\n private episodes: Episode[] = []\n private migrator = new MemorySchemaVersion()\n private onRecord?: (episode: Episode) => void\n\n setPersistenceCallback(cb: (episode: Episode) => void): void {\n this.onRecord = cb\n }\n\n record(sessionId: string, planGoal: string, outcome: Episode[\"outcome\"], decisions: string[], filesChanged: string[]): Episode {\n const episode: Episode = {\n id: `ep-${Date.now()}`,\n sessionId,\n planGoal,\n summary: `${outcome === \"success\" ? \"Completed\" : outcome === \"partial\" ? \"Partially completed\" : \"Failed\"}: ${planGoal}`,\n outcome,\n decisions,\n filesChanged,\n timestamp: new Date().toISOString(),\n tags: this.extractTags(planGoal, decisions),\n }\n\n this.episodes.push(episode)\n this.onRecord?.(episode)\n return episode\n }\n\n search(query: string): Episode[] {\n const q = query.toLowerCase()\n return this.episodes\n .filter(e =>\n e.planGoal.toLowerCase().includes(q) ||\n e.tags.some(t => t.includes(q)) ||\n e.decisions.some(d => d.toLowerCase().includes(q)) ||\n e.filesChanged.some(f => f.toLowerCase().includes(q))\n )\n .sort((a, b) => b.timestamp.localeCompare(a.timestamp))\n .slice(0, 10)\n }\n\n getRecent(limit = 10): Episode[] {\n return [...this.episodes]\n .sort((a, b) => b.timestamp.localeCompare(a.timestamp))\n .slice(0, limit)\n }\n\n getBySession(sessionId: string): Episode[] {\n return this.episodes.filter(e => e.sessionId === sessionId)\n }\n\n getStats(): { total: number; successful: number; partial: number; failed: number } {\n return {\n total: this.episodes.length,\n successful: this.episodes.filter(e => e.outcome === \"success\").length,\n partial: this.episodes.filter(e => e.outcome === \"partial\").length,\n failed: this.episodes.filter(e => e.outcome === \"failed\").length,\n }\n }\n\n exportEpisode(id: string): EpisodeEnvelope | null {\n const ep = this.episodes.find(e => e.id === id)\n if (!ep) return null\n return createMemoryEnvelope(ep, \"episode\") as EpisodeEnvelope\n }\n\n importEpisode(envelope: EpisodeEnvelope): boolean {\n const parsed = parseMemoryEnvelope<Episode>(envelope)\n if (!parsed || parsed.type !== \"episode\") return false\n\n if (parsed.version < MEMORY_SCHEMA_VERSION) {\n const upgraded = this.migrator.upgrade(parsed.data, parsed.version)\n this.episodes.push(upgraded)\n return true\n }\n\n if (!this.episodes.some(e => e.id === parsed.data.id)) {\n this.episodes.push(parsed.data)\n return true\n }\n return false\n }\n\n exportAll(): EpisodeEnvelope[] {\n return this.episodes.map(e => createMemoryEnvelope(e, \"episode\") as EpisodeEnvelope)\n }\n\n getMigrator(): MemorySchemaVersion {\n return this.migrator\n }\n\n private extractTags(goal: string, decisions: string[]): string[] {\n const words = [...goal.split(/\\s+/), ...decisions.join(\" \").split(/\\s+/)]\n return [...new Set(words.filter(w => w.length > 3).map(w => w.toLowerCase()))]\n }\n}\n", "import { existsSync, readFileSync } from \"node:fs\"\nimport { resolve, isAbsolute } from \"node:path\"\n\nexport interface HallucinationCheck {\n passed: boolean\n claims: ClaimResult[]\n summary: string\n}\n\nexport interface ClaimResult {\n claim: string\n type: \"file_exists\" | \"function_exists\" | \"import_valid\" | \"api_signature\"\n verified: boolean\n actual?: string\n expected?: string\n}\n\nexport class HallucinationGuard {\n private worktree: string\n\n constructor(worktree: string) {\n this.worktree = worktree\n }\n\n check(executionOutput: string, modifiedFiles: string[]): HallucinationCheck {\n const claims: ClaimResult[] = []\n\n const fileClaims = this.extractFileClaims(executionOutput)\n for (const claim of fileClaims) {\n const resolved = this.resolveSafe(claim)\n const exists = resolved ? existsSync(resolved) : false\n claims.push({\n claim,\n type: \"file_exists\",\n verified: exists,\n actual: exists ? \"exists\" : \"does not exist\",\n expected: \"exists\",\n })\n }\n\n const funcClaims = this.extractFunctionClaims(executionOutput)\n for (const claim of funcClaims) {\n const resolved = this.resolveSafe(claim.file)\n const found = resolved ? this.functionExists(claim.function, resolved, modifiedFiles) : false\n claims.push({\n claim: `${claim.function} in ${claim.file}`,\n type: \"function_exists\",\n verified: found,\n actual: found ? \"found\" : \"not found\",\n expected: \"found\",\n })\n }\n\n const importClaims = this.extractImportClaims(executionOutput)\n for (const claim of importClaims) {\n const resolved = this.resolveSafe(claim)\n const exists = resolved ? existsSync(resolved) : false\n claims.push({\n claim,\n type: \"import_valid\",\n verified: exists,\n actual: exists ? \"exists\" : \"missing\",\n expected: \"exists\",\n })\n }\n\n const sigClaims = this.extractApiSignatureClaims(executionOutput, modifiedFiles)\n for (const claim of sigClaims) {\n const resolved = this.resolveSafe(claim.file)\n const sigValid = resolved ? this.verifyApiSignature(claim.method, claim.file, resolved) : false\n claims.push({\n claim: `${claim.method} in ${claim.file}`,\n type: \"api_signature\",\n verified: sigValid,\n actual: sigValid ? \"signature matches\" : \"signature mismatch or not found\",\n expected: \"signature exists\",\n })\n }\n\n const passed = claims.every(c => c.verified)\n const failedCount = claims.filter(c => !c.verified).length\n\n return {\n passed,\n claims,\n summary: passed\n ? \"All claims verified.\"\n : `${failedCount} unverified claim(s) found. These statements may be hallucinations.`,\n }\n }\n\n private resolveSafe(claim: string): string | null {\n const normalized = claim.replace(/['\"]/g, \"\")\n if (isAbsolute(normalized)) {\n if (!normalized.startsWith(this.worktree)) return null\n return normalized\n }\n const resolved = resolve(this.worktree, normalized)\n if (!resolved.startsWith(this.worktree)) return null\n return resolved\n }\n\n private extractFileClaims(output: string): string[] {\n const patterns = [\n /(?:created|wrote|generated|saved)\\s+['\"]?([\\w/.\\-]+\\.(?:ts|js|tsx|jsx|json|py|go|rs|md|yaml|yml|toml))['\"]?/gi,\n /(?:in|at|to)\\s+['\"]?([\\w/.\\-]+\\.(?:ts|js|tsx|jsx|py|go|rs|md))['\"]?/gi,\n ]\n\n const files = new Set<string>()\n for (const pattern of patterns) {\n for (const match of output.matchAll(pattern)) {\n const file = match[1]\n if (file && file.length > 2) files.add(file)\n }\n }\n\n return [...files]\n }\n\n private extractFunctionClaims(output: string): Array<{ function: string; file: string }> {\n const results: Array<{ function: string; file: string }> = []\n const pattern = /(?:added|implemented|created|modified)\\s+(\\w+)\\s+(?:in|to|at)\\s+['\"]?([\\w/.\\-]+)['\"]?/gi\n\n for (const match of output.matchAll(pattern)) {\n results.push({ function: match[1], file: match[2] })\n }\n\n return results\n }\n\n private extractImportClaims(output: string): string[] {\n const files = new Set<string>()\n const pattern = /(?:import|require)\\s+.*?['\"](.+?)['\"]/g\n\n for (const match of output.matchAll(pattern)) {\n const imp = match[1]\n if (imp && imp.length > 1) files.add(imp)\n }\n\n return [...files]\n }\n\n private extractApiSignatureClaims(output: string, _modifiedFiles: string[]): Array<{ method: string; file: string }> {\n const results: Array<{ method: string; file: string }> = []\n\n const patterns = [\n /(?:calls|invokes|uses|references)\\s+(\\w+)\\s+(?:from|in)\\s+['\"]?([\\w/.\\-]+\\.(?:ts|js|py|go|rs))['\"]?/gi,\n /(?:API|endpoint|method|function)\\s+(\\w+)\\s+(?:in|at)\\s+['\"]?([\\w/.\\-]+\\.(?:ts|js|py|go|rs))['\"]?/gi,\n /(?:returns|exports)\\s+(\\w+)\\s+(?:from)\\s+['\"]?([\\w/.\\-]+\\.(?:ts|js|py|go|rs))['\"]?/gi,\n ]\n\n for (const pattern of patterns) {\n for (const match of output.matchAll(pattern)) {\n results.push({ method: match[1], file: match[2] })\n }\n }\n\n return results\n }\n\n private verifyApiSignature(methodName: string, relativePath: string, absolutePath: string): boolean {\n try {\n const content = readFileSync(absolutePath, \"utf-8\")\n\n const isPython = relativePath.endsWith(\".py\")\n const isGo = relativePath.endsWith(\".go\")\n const isRust = relativePath.endsWith(\".rs\")\n\n if (isPython) {\n const defPattern = new RegExp(`def\\\\s+${methodName}\\\\s*\\\\(`)\n const classPattern = new RegExp(`class\\\\s+${methodName}\\\\s*[(:]`)\n return defPattern.test(content) || classPattern.test(content)\n }\n\n if (isGo) {\n const funcPattern = new RegExp(`func\\\\s+(?:\\\\(\\\\w+\\\\s+\\\\*?\\\\w+\\\\)\\\\s+)?${methodName}\\\\s*\\\\(`)\n return funcPattern.test(content)\n }\n\n if (isRust) {\n const fnPattern = new RegExp(`(?:pub\\\\s+)?fn\\\\s+${methodName}\\\\s*[<(]`)\n const implPattern = new RegExp(`impl\\\\s+.*\\\\{[^}]*fn\\\\s+${methodName}\\\\s*[<(]`)\n return fnPattern.test(content) || implPattern.test(content)\n }\n\n const patterns = [\n new RegExp(`(?:function|const|let|var|export\\\\s+(?:const|function|class|default|async\\\\s+function))\\\\s+${methodName}\\\\b`),\n new RegExp(`${methodName}\\\\s*[=(:]`),\n new RegExp(`(?:async\\\\s+)?${methodName}\\\\s*\\\\(`),\n ]\n return patterns.some(p => p.test(content))\n } catch {\n return false\n }\n }\n\n private functionExists(funcName: string, file: string, _knownFiles: string[]): boolean {\n try {\n const content = readFileSync(file, \"utf-8\")\n const patterns = [\n new RegExp(`(?:function|const|let|var|export\\\\s+(?:const|function|class|default|async\\\\s+function))\\\\s+${funcName}\\\\b`),\n new RegExp(`${funcName}\\\\s*[=(:]`),\n new RegExp(`(?:async\\\\s+)?${funcName}\\\\s*\\\\(`),\n ]\n return patterns.some(p => p.test(content))\n } catch {\n return false\n }\n }\n}\n", "import type { Subtask } from \"./intent-parser.js\"\nimport type { LLMEngine } from \"./llm.js\"\nimport { execFileSync } from \"node:child_process\"\nimport { writeFileSync, mkdirSync, existsSync } from \"node:fs\"\nimport { join, dirname } from \"node:path\"\n\nexport interface ParallelPlan {\n phases: Phase[]\n maxParallelism: number\n}\n\nexport interface Phase {\n index: number\n steps: Subtask[]\n canRunInParallel: boolean\n}\n\nexport interface ParallelExecutionResult {\n stepId: string\n success: boolean\n output?: string\n error?: string\n filesModified: string[]\n}\n\nexport type StepRunner = (step: Subtask) => Promise<ParallelExecutionResult>\n\nexport interface LLMStepRunnerOptions {\n llmEngine: LLMEngine\n projectDir: string\n planGoal: string\n sessionId: string\n opencodePath?: string\n verbose?: boolean\n}\n\nexport interface ConcurrentExecutionReport {\n phaseResults: Array<{\n phaseIndex: number\n steps: Array<{ id: string; description: string }>\n results: ParallelExecutionResult[]\n }>\n totalSteps: number\n completedSteps: number\n failedSteps: number\n totalDurationMs: number\n summary: string\n}\n\nexport class ParallelExecutor {\n analyzeParallelism(subtasks: Subtask[]): ParallelPlan {\n const phases: Phase[] = []\n const completed = new Set<string>()\n const remaining = new Set(subtasks.map(s => s.id))\n\n let phaseIndex = 0\n while (remaining.size > 0) {\n const ready: Subtask[] = []\n for (const step of subtasks) {\n if (!remaining.has(step.id)) continue\n if (step.dependsOn.every(d => completed.has(d))) {\n ready.push(step)\n }\n }\n\n if (ready.length === 0) {\n // Circular dependency or all blocked\n const leftover = subtasks.filter(s => remaining.has(s.id))\n phases.push({ index: phaseIndex++, steps: leftover, canRunInParallel: false })\n break\n }\n\n for (const step of ready) {\n remaining.delete(step.id)\n completed.add(step.id)\n }\n\n phases.push({ index: phaseIndex++, steps: ready, canRunInParallel: ready.length > 1 })\n }\n\n return {\n phases,\n maxParallelism: Math.max(...phases.map(p => p.steps.length), 1),\n }\n }\n\n async executePhase(\n phase: Phase,\n runner: StepRunner,\n abortOnFailure = false,\n ): Promise<ParallelExecutionResult[]> {\n if (!phase.canRunInParallel || phase.steps.length <= 1) {\n const results: ParallelExecutionResult[] = []\n for (const step of phase.steps) {\n const result = await runner(step)\n results.push(result)\n if (abortOnFailure && !result.success) break\n }\n return results\n }\n\n const promises = phase.steps.map(step => runner(step))\n const results = await Promise.all(promises)\n\n if (abortOnFailure && results.some(r => !r.success)) {\n return results\n }\n\n return results\n }\n\n async executeAll(\n plan: ParallelPlan,\n runner: StepRunner,\n abortOnFailure = false,\n ): Promise<ParallelExecutionResult[]> {\n const allResults: ParallelExecutionResult[] = []\n\n for (const phase of plan.phases) {\n const phaseResults = await this.executePhase(phase, runner, abortOnFailure)\n allResults.push(...phaseResults)\n\n if (abortOnFailure && phaseResults.some(r => !r.success)) {\n break\n }\n }\n\n return allResults\n }\n\n suggestParallelTasks(subtasks: Subtask[], currentlyCompleted: string[]): { taskId: string; parallelGroup: number }[] {\n const completed = new Set(currentlyCompleted)\n const ready: Subtask[] = []\n\n for (const step of subtasks) {\n if (completed.has(step.id)) continue\n if (step.dependsOn.every(d => completed.has(d))) {\n ready.push(step)\n }\n }\n\n // Group steps that have no shared dependencies (can truly run in parallel)\n const groups = new Map<string, number>()\n let groupId = 0\n\n for (const step of ready) {\n const depKey = [...step.dependsOn].sort().join(\",\")\n const group = groups.get(depKey)\n if (group !== undefined) {\n groups.set(step.id, group)\n } else {\n groups.set(depKey, groupId)\n groups.set(step.id, groupId)\n groupId++\n }\n }\n\n return ready.map(s => ({ taskId: s.id, parallelGroup: groups.get(s.id) ?? 0 }))\n }\n\n detectConflicts(parallelTasks: string[], modifiedFiles: Map<string, string[]>): Array<{ taskA: string; taskB: string; conflictingFile: string }> {\n const conflicts: Array<{ taskA: string; taskB: string; conflictingFile: string }> = []\n\n for (let i = 0; i < parallelTasks.length; i++) {\n for (let j = i + 1; j < parallelTasks.length; j++) {\n const filesA = modifiedFiles.get(parallelTasks[i]) ?? []\n const filesB = modifiedFiles.get(parallelTasks[j]) ?? []\n\n for (const file of filesA) {\n if (filesB.includes(file)) {\n conflicts.push({\n taskA: parallelTasks[i],\n taskB: parallelTasks[j],\n conflictingFile: file,\n })\n }\n }\n }\n }\n\n return conflicts\n }\n\n llmStepRunner(opts: LLMStepRunnerOptions): StepRunner {\n return async (step: Subtask): Promise<ParallelExecutionResult> => {\n const startTime = Date.now()\n try {\n const resp = await opts.llmEngine.call({\n systemPrompt: `You are an autonomous software engineer implementing a step of a larger plan. Generate implementation as JSON with:\n- \"files\": [{ \"path\": \"relative/file/path\", \"content\": \"file content\" }]\n- \"summary\": \"what was done\"\nOnly include files that need changing. Return ONLY valid JSON.` + opts.llmEngine.getMemoryContext(step.description),\n userPrompt: `Goal: ${opts.planGoal}\\nStep (${step.id}): ${step.description}\\nDir: ${opts.projectDir}\\nComplete the step.`,\n jsonMode: true,\n temperature: 0.3,\n })\n\n let impl: { files?: Array<{ path: string; content: string }>; summary?: string }\n try { impl = JSON.parse(resp.content) } catch {\n return { stepId: step.id, success: false, error: \"LLM JSON parse error\", output: resp.content, filesModified: [] }\n }\n\n const files: string[] = []\n for (const file of impl.files ?? []) {\n const fullPath = join(opts.projectDir, file.path)\n mkdirSync(dirname(fullPath), { recursive: true })\n writeFileSync(fullPath, file.content, \"utf-8\")\n files.push(file.path)\n }\n\n return {\n stepId: step.id,\n success: true,\n output: impl.summary ?? step.description,\n filesModified: files,\n }\n } catch (e) {\n return { stepId: step.id, success: false, error: (e as Error).message, output: \"\", filesModified: [] }\n }\n }\n }\n\n async executePlanConcurrently(\n plan: ParallelPlan,\n stepRunner: StepRunner,\n abortOnFailure = false,\n ): Promise<{ results: ParallelExecutionResult[]; durationMs: number }> {\n const startTime = Date.now()\n const results = await this.executeAll(plan, stepRunner, abortOnFailure)\n return { results, durationMs: Date.now() - startTime }\n }\n\n async executeWithSubprocessSpawn(\n step: Subtask,\n opencodePath: string,\n projectDir: string,\n sessionId: string,\n ): Promise<ParallelExecutionResult> {\n try {\n if (!existsSync(opencodePath)) {\n return { stepId: step.id, success: false, error: `opencode not found at ${opencodePath}`, output: \"\", filesModified: [] }\n }\n\n const taskJson = JSON.stringify({\n goal: `Implement: ${step.description}`,\n sessionId,\n constraints: [],\n })\n\n const result = execFileSync(opencodePath, [\"eval\", \"--json\", taskJson], {\n cwd: projectDir,\n encoding: \"utf-8\",\n timeout: 120000,\n maxBuffer: 10 * 1024 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n })\n\n return {\n stepId: step.id,\n success: true,\n output: result.trim(),\n filesModified: [],\n }\n } catch (e) {\n return {\n stepId: step.id,\n success: false,\n error: (e as Error).message,\n output: \"\",\n filesModified: [],\n }\n }\n }\n}\n", "import type { TraceEntry } from \"./trace-logger\"\n\nexport interface DashboardData {\n timeline: TimelineEvent[]\n statistics: Statistics\n anomalies: Anomaly[]\n}\n\nexport interface TimelineEvent {\n time: string\n tool: string\n step: string\n success: boolean\n durationMs: number\n}\n\nexport interface Statistics {\n totalCalls: number\n successRate: number\n averageLatency: number\n toolsUsed: Map<string, number>\n peakConcurrency: number\n}\n\nexport interface Anomaly {\n type: \"timeout\" | \"loop\" | \"retry_storm\" | \"silent_failure\"\n description: string\n detectedAt: string\n tool?: string\n count?: number\n}\n\nexport class Dashboard {\n generate(traces: TraceEntry[], sessionStart: number): DashboardData {\n const timeline: TimelineEvent[] = traces.map(t => ({\n time: t.timestamp,\n tool: t.toolUsed,\n step: t.step,\n success: t.success,\n durationMs: t.durationMs,\n }))\n\n const totalCalls = traces.length\n const successCount = traces.filter(t => t.success).length\n const avgLatency = traces.reduce((sum, t) => sum + t.durationMs, 0) / Math.max(totalCalls, 1)\n const toolsUsed = new Map<string, number>()\n for (const t of traces) {\n toolsUsed.set(t.toolUsed, (toolsUsed.get(t.toolUsed) ?? 0) + 1)\n }\n\n const statistics: Statistics = {\n totalCalls,\n successRate: totalCalls > 0 ? successCount / totalCalls : 0,\n averageLatency: avgLatency,\n toolsUsed,\n peakConcurrency: this.computePeakConcurrency(traces),\n }\n\n const anomalies = this.detectAnomalies(traces)\n\n return { timeline, statistics, anomalies }\n }\n\n formatForDisplay(data: DashboardData): string {\n let output = `## \uD83D\uDCC8 Observability Dashboard\\n\\n`\n\n // Stats\n output += `### Statistics\\n`\n output += `| Metric | Value |\\n|--------|-------|\\n`\n output += `| Total calls | ${data.statistics.totalCalls} |\\n`\n output += `| Success rate | ${(data.statistics.successRate * 100).toFixed(1)}% |\\n`\n output += `| Avg latency | ${data.statistics.averageLatency.toFixed(0)}ms |\\n`\n output += `| Peak concurrent | ${data.statistics.peakConcurrency} |\\n`\n\n // Tools used\n output += `\\n### Tools Used\\n`\n for (const [tool, count] of [...data.statistics.toolsUsed].sort((a, b) => b[1] - a[1])) {\n output += `| \\`${tool}\\` | ${count} |\\n`\n }\n\n // Timeline\n output += `\\n### Timeline (last 20)\\n`\n const recent = data.timeline.slice(-20)\n for (const evt of recent) {\n const icon = evt.success ? \"\u2705\" : \"\u274C\"\n const dur = evt.durationMs > 0 ? ` (${evt.durationMs}ms)` : \"\"\n output += `| ${evt.time.slice(11, 19)} | ${icon} \\`${evt.tool}\\` | ${evt.step}${dur} |\\n`\n }\n\n // Anomalies\n if (data.anomalies.length > 0) {\n output += `\\n### \u26A0\uFE0F Anomalies Detected\\n`\n for (const a of data.anomalies) {\n output += `- **${a.type}**: ${a.description}\\n`\n }\n } else {\n output += `\\n### \u2705 No anomalies detected\\n`\n }\n\n return output\n }\n\n private computePeakConcurrency(traces: TraceEntry[]): number {\n let max = 0\n for (let i = 0; i < traces.length; i++) {\n let concurrent = 0\n const start = new Date(traces[i].timestamp).getTime()\n for (let j = 0; j < traces.length; j++) {\n const t = new Date(traces[j].timestamp).getTime()\n if (Math.abs(t - start) < 100) concurrent++\n }\n max = Math.max(max, concurrent)\n }\n return max\n }\n\n private detectAnomalies(traces: TraceEntry[]): Anomaly[] {\n const anomalies: Anomaly[] = []\n\n // Slow operations (>30s)\n for (const t of traces) {\n if (t.durationMs > 30_000) {\n anomalies.push({\n type: \"timeout\",\n description: `Slow operation: ${t.toolUsed} took ${t.durationMs}ms`,\n detectedAt: t.timestamp,\n tool: t.toolUsed,\n })\n }\n }\n\n // Retry storms (>3 failures for same step)\n const failCounts = new Map<string, number>()\n for (const t of traces) {\n if (!t.success && t.step.startsWith(\"execute:\")) {\n const stepId = t.step.replace(\"execute:\", \"\")\n failCounts.set(stepId, (failCounts.get(stepId) ?? 0) + 1)\n }\n }\n for (const [stepId, count] of failCounts) {\n if (count >= 3) {\n anomalies.push({\n type: \"retry_storm\",\n description: `Step \"${stepId}\" failed ${count} times`,\n detectedAt: new Date().toISOString(),\n count,\n })\n }\n }\n\n // Loop detection: same tool/step repeating without progress\n const sequence: Array<{ step: string; tool: string; idx: number }> = []\n for (let i = 0; i < traces.length; i++) {\n sequence.push({ step: traces[i].step, tool: traces[i].toolUsed, idx: i })\n }\n\n for (let cycleLen = 2; cycleLen <= 5; cycleLen++) {\n for (let start = 0; start + cycleLen * 2 < sequence.length; start++) {\n const cycle1 = sequence.slice(start, start + cycleLen)\n const cycle2 = sequence.slice(start + cycleLen, start + cycleLen * 2)\n const isRepeat = cycle1.every((c, i) =>\n c.step === cycle2[i].step && c.tool === cycle2[i].tool\n )\n if (isRepeat) {\n const toolNames = [...new Set(cycle1.map(c => c.tool))].join(\", \")\n anomalies.push({\n type: \"loop\",\n description: `Repeating pattern detected: ${toolNames} x ${cycleLen} steps at index ${start}`,\n detectedAt: traces[start + cycleLen * 2]?.timestamp ?? new Date().toISOString(),\n tool: toolNames,\n count: cycleLen,\n })\n break\n }\n }\n }\n\n // Silent failures (false success claims with failed verify)\n let lastVerifyFailed = false\n let lastFailedVerifyStep = \"\"\n for (const t of traces) {\n if (t.step.startsWith(\"verify:\") && !t.success) {\n lastVerifyFailed = true\n lastFailedVerifyStep = t.step\n }\n if (lastVerifyFailed && t.step.startsWith(\"execute:\") && t.success) {\n anomalies.push({\n type: \"silent_failure\",\n description: `Step reported success but verification \"${lastFailedVerifyStep}\" had previously failed`,\n detectedAt: t.timestamp,\n tool: t.toolUsed,\n })\n lastVerifyFailed = false\n }\n if (t.step.startsWith(\"execute:\") && !t.success) {\n lastVerifyFailed = false\n }\n }\n\n return anomalies\n }\n}\n", "export interface Checkpoint {\n id: string\n type: \"warning\" | \"review\" | \"block\"\n description: string\n context: string\n timestamp: string\n acknowledged: boolean\n}\n\nexport class CheckpointSystem {\n private checkpoints = new Map<string, Checkpoint[]>()\n private blockEnforcement = true\n\n enableBlockEnforcement(enabled: boolean): void {\n this.blockEnforcement = enabled\n }\n\n isBlocked(): { blocked: boolean; reason?: string } {\n if (!this.blockEnforcement) return { blocked: false }\n const unacknowledged = this.getUnacknowledged()\n const blocker = unacknowledged.find(c => c.type === \"block\")\n if (blocker) {\n return {\n blocked: true,\n reason: `Blocked by checkpoint \"${blocker.id}\": ${blocker.description}. Acknowledge to proceed.`,\n }\n }\n return { blocked: false }\n }\n\n evaluate(stepId: string, action: string, filesModified: string[]): Checkpoint[] {\n const results: Checkpoint[] = []\n\n // File deletion\n if (action.includes(\"delete\") || action.includes(\"remove\")) {\n if (filesModified.some(f => f.endsWith(\".ts\") || f.endsWith(\".js\") || f.endsWith(\".py\") || f.endsWith(\".go\") || f.endsWith(\".rs\"))) {\n results.push({\n id: `${stepId}-delete`,\n type: \"warning\",\n description: `Deleting source files: ${filesModified.filter(f => f.match(/\\.(ts|js|tsx|py|go|rs)$/)).join(\", \")}`,\n context: \"Deleted files may break imports in other modules.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n }\n\n // Large change set\n if (filesModified.length > 5) {\n results.push({\n id: `${stepId}-scope`,\n type: \"review\",\n description: `Modifying ${filesModified.length} files in one step`,\n context: \"Large change sets increase risk of merge conflicts and regressions.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n\n // API contract change\n if (action.toLowerCase().includes(\"export\") || action.toLowerCase().includes(\"interface\") || action.toLowerCase().includes(\"api\")) {\n results.push({\n id: `${stepId}-api`,\n type: \"review\",\n description: \"Public API or interface change detected\",\n context: \"API contract changes may affect consumers. Document the change.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n\n // Critical infrastructure\n for (const file of filesModified) {\n if (file.includes(\"config\") || file.includes(\"env\") || file.includes(\"secret\") || file.includes(\".env\") || file.includes(\"credentials\")) {\n results.push({\n id: `${stepId}-config-${file.replace(/[^a-zA-Z0-9]/g, \"-\")}`,\n type: \"block\",\n description: `Configuration/secret file changed: ${file}`,\n context: \"\u26A0\uFE0F Manual review required for config/env/secret changes. Acknowledge with agentic_execute to proceed.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n\n const highRiskPatterns = [\"/etc/\", \"/var/\", \"/boot/\", \"/usr/lib\", \"/lib/systemd\", \".ssh/\", \".gnupg/\", \".aws/credentials\", \".kube/config\"]\n for (const risky of highRiskPatterns) {\n if (file.includes(risky)) {\n results.push({\n id: `${stepId}-system-${file.replace(/[^a-zA-Z0-9]/g, \"-\")}`,\n type: \"block\",\n description: `System-critical path modified: ${file}`,\n context: \"\u26A0\uFE0F System-level file changes require explicit approval.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n }\n }\n\n // Test-only changes without source changes\n const onlyTests = filesModified.every(f => f.includes(\".test.\") || f.includes(\".spec.\") || f.includes(\"_test.\"))\n if (onlyTests && filesModified.length > 0) {\n results.push({\n id: `${stepId}-tests-only`,\n type: \"warning\",\n description: \"Only test files modified \u2014 no production code changed\",\n context: \"Verify tests are testing real scenarios, not just passing.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n\n // Schema or migration files\n for (const file of filesModified) {\n if (file.includes(\"schema\") || file.includes(\"migration\") || file.includes(\".sql\")) {\n results.push({\n id: `${stepId}-schema-${file.replace(/[^a-zA-Z0-9]/g, \"-\")}`,\n type: \"review\",\n description: `Schema/migration file changed: ${file}`,\n context: \"Database or data schema changes should be reviewed for backward compatibility.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n }\n\n this.checkpoints.set(stepId, results)\n return results\n }\n\n acknowledge(stepId: string, checkpointId: string): boolean {\n const cps = this.checkpoints.get(stepId)\n if (!cps) return false\n\n const cp = cps.find(c => c.id === checkpointId)\n if (!cp) return false\n\n cp.acknowledged = true\n return true\n }\n\n acknowledgeAll(stepId: string): number {\n const cps = this.checkpoints.get(stepId)\n if (!cps) return 0\n let count = 0\n for (const cp of cps) {\n if (!cp.acknowledged) {\n cp.acknowledged = true\n count++\n }\n }\n return count\n }\n\n getUnacknowledged(): Checkpoint[] {\n const all: Checkpoint[] = []\n for (const cps of this.checkpoints.values()) {\n all.push(...cps.filter(c => !c.acknowledged))\n }\n return all\n }\n\n hasBlockers(): boolean {\n return this.getUnacknowledged().some(c => c.type === \"block\")\n }\n}\n", "export interface ConversationTurn {\n role: \"user\" | \"assistant\" | \"tool\"\n content: string\n timestamp: number\n metadata?: Record<string, unknown>\n}\n\nexport interface SessionState {\n sessionId: string\n turns: ConversationTurn[]\n plan?: import(\"../core/intent-parser\").Plan\n artifacts: Map<string, string>\n currentTaskType?: string\n}\n\nexport interface ExecutorSnapshot {\n completedSteps: string[]\n stepStates: Map<string, { id: string; success: boolean }>\n}\n\nexport class SessionStore {\n private sessions = new Map<string, SessionState>()\n private executorSnapshots = new Map<string, ExecutorSnapshot>()\n /** Per-session model preferences: role \u2192 model name */\n private modelPreferences = new Map<string, Map<string, string>>()\n /** TTL in days for session expiry (0 = never expire). Config-hot-reloadable. */\n private forgetAfterDays = 30\n\n /** Set the TTL for session expiry \u2014 called on config hot-reload. */\n setForgetAfterDays(days: number): void {\n this.forgetAfterDays = Math.max(0, days)\n }\n\n /** Remove sessions that haven't been touched since TTL. */\n pruneExpired(): number {\n if (this.forgetAfterDays <= 0) return 0\n const cutoff = Date.now() - this.forgetAfterDays * 24 * 60 * 60 * 1000\n let removed = 0\n for (const [id, session] of this.sessions) {\n const lastTurn = session.turns[session.turns.length - 1]\n if (lastTurn && lastTurn.timestamp < cutoff) {\n this.removeSession(id)\n removed++\n }\n }\n return removed\n }\n\n getOrCreate(sessionId: string): SessionState {\n let session = this.sessions.get(sessionId)\n if (!session) {\n session = {\n sessionId,\n turns: [],\n artifacts: new Map(),\n }\n this.sessions.set(sessionId, session)\n }\n return session\n }\n\n updateProgress(sessionId: string, snapshot: ExecutorSnapshot): void {\n this.executorSnapshots.set(sessionId, snapshot)\n }\n\n addTurn(sessionId: string, turn: ConversationTurn): void {\n const session = this.getOrCreate(sessionId)\n session.turns.push(turn)\n }\n\n getContext(sessionId: string, maxTurns = 20): ConversationTurn[] {\n const session = this.sessions.get(sessionId)\n if (!session) return []\n return session.turns.slice(-maxTurns)\n }\n\n getContextSummary(sessionId: string): string {\n const session = this.sessions.get(sessionId)\n if (!session) return \"\"\n const snapshot = this.executorSnapshots.get(sessionId)\n\n const plan = session.plan\n const turnCount = session.turns.length\n const completedCount = snapshot?.completedSteps.length ?? 0\n const totalSteps = plan?.estimatedSteps ?? snapshot?.stepStates.size ?? 0\n\n let summary = `Session: ${sessionId}\\n`\n summary += `Turns: ${turnCount}\\n`\n summary += `Progress: ${completedCount}/${totalSteps} steps\\n`\n\n if (plan) {\n summary += `Plan: ${plan.intent.goal}\\n`\n }\n\n return summary\n }\n\n removeSession(sessionId: string): void {\n this.sessions.delete(sessionId)\n this.executorSnapshots.delete(sessionId)\n this.modelPreferences.delete(sessionId)\n }\n\n // \u2500\u2500 Session-Seeded Model Preference (Gap: per-role model selection) \u2500\u2500\n\n /** Set preferred model for a given agent role in this session. */\n setModelPreference(sessionId: string, role: string, model: string): void {\n let prefs = this.modelPreferences.get(sessionId)\n if (!prefs) {\n prefs = new Map()\n this.modelPreferences.set(sessionId, prefs)\n }\n prefs.set(role.toLowerCase(), model)\n }\n\n /** Get preferred model for a given agent role, or undefined. */\n getModelPreference(sessionId: string, role: string): string | undefined {\n const prefs = this.modelPreferences.get(sessionId)\n return prefs?.get(role.toLowerCase())\n }\n\n /** Get all model preferences for a session. Returns array of { role, model }. */\n getAllModelPreferences(sessionId: string): Array<{ role: string; model: string }> {\n const prefs = this.modelPreferences.get(sessionId)\n if (!prefs) return []\n return [...prefs.entries()].map(([role, model]) => ({ role, model }))\n }\n\n /** Clear model preference for a specific role, or all roles if omitted. */\n clearModelPreference(sessionId: string, role?: string): void {\n const prefs = this.modelPreferences.get(sessionId)\n if (!prefs) return\n if (role) {\n prefs.delete(role.toLowerCase())\n } else {\n this.modelPreferences.delete(sessionId)\n }\n }\n}\n", "import { mkdir, writeFile, appendFile, readFile, rm } from \"node:fs/promises\"\nimport { join, dirname } from \"node:path\"\nimport { existsSync } from \"node:fs\"\n\nexport interface TraceEntry {\n timestamp: string\n step: string\n input: string\n output: string\n toolUsed: string\n success: boolean\n durationMs: number\n metadata?: Record<string, unknown>\n}\n\nexport class TraceLogger {\n private logPath: string\n private buffer: TraceEntry[] = []\n private flushInterval: ReturnType<typeof setInterval> | null = null\n /** Retention days for trace entries (0 = never prune). Config-hot-reloadable. */\n private retentionDays = 7\n\n constructor(worktree: string) {\n this.logPath = join(worktree || process.cwd(), \".agentic\", \"trace.jsonl\")\n }\n\n /** Set retention days for pruning old traces \u2014 called on config hot-reload. */\n setRetentionDays(days: number): void {\n this.retentionDays = Math.max(0, days)\n }\n\n /** Prune trace entries older than retentionDays, in-place rewriting the file. */\n async pruneOldTraces(): Promise<number> {\n if (this.retentionDays <= 0) return 0\n if (!existsSync(this.logPath)) return 0\n const cutoff = Date.now() - this.retentionDays * 24 * 60 * 60 * 1000\n const cutoffStr = new Date(cutoff).toISOString()\n try {\n const content = await readFile(this.logPath, \"utf-8\")\n const lines = content.split(\"\\n\").filter(Boolean)\n const kept = lines.filter(line => {\n try {\n const entry = JSON.parse(line)\n return entry.timestamp >= cutoffStr\n } catch { return false }\n })\n // Only rewrite if we actually removed something\n if (kept.length < lines.length) {\n await writeFile(this.logPath, kept.map(e => JSON.stringify(e)).join(\"\\n\") + \"\\n\")\n }\n return lines.length - kept.length\n } catch { return 0 }\n }\n\n async init(): Promise<void> {\n const dir = dirname(this.logPath)\n await mkdir(dir, { recursive: true })\n }\n\n log(entry: Omit<TraceEntry, \"timestamp\">): void {\n this.buffer.push({\n ...entry,\n timestamp: new Date().toISOString(),\n })\n\n if (this.buffer.length >= 10) {\n this.flush()\n }\n\n if (!this.flushInterval) {\n this.flushInterval = setInterval(() => this.flush(), 5000)\n }\n }\n\n async flush(): Promise<void> {\n if (this.buffer.length === 0) return\n\n const snapshot = [...this.buffer]\n const lines = snapshot.map(e => JSON.stringify(e)).join(\"\\n\") + \"\\n\"\n\n try {\n await appendFile(this.logPath, lines)\n this.buffer = this.buffer.slice(snapshot.length)\n } catch {\n try {\n await writeFile(this.logPath, lines)\n this.buffer = this.buffer.slice(snapshot.length)\n } catch {\n // Silently fail \u2014 data retained in buffer for next flush\n }\n }\n }\n\n async dispose(): Promise<void> {\n if (this.flushInterval) {\n clearInterval(this.flushInterval)\n this.flushInterval = null\n }\n await this.flush()\n }\n}\n", "/**\n * Task Type Classifier\n * \n * Automatically detects task type from description for capability-aware model selection.\n */\n\nexport enum TaskType {\n CODING = 'coding',\n REASONING = 'reasoning',\n TESTING = 'testing',\n DOCUMENTATION = 'documentation',\n DEBUGGING = 'debugging',\n}\n\ninterface TaskPattern {\n type: TaskType\n keywords: RegExp\n}\n\nconst TASK_PATTERNS: TaskPattern[] = [\n {\n type: TaskType.CODING,\n keywords: /\\b(implement|create|add|build|code|develop|write|program|construct|generate|refactor)\\b/i,\n },\n {\n type: TaskType.REASONING,\n keywords: /\\b(design|architect|analyze|decide|evaluate|assess|compare|tradeoff|strategy|plan|approach|consider)\\b/i,\n },\n {\n type: TaskType.TESTING,\n keywords: /\\b(test|verify|validate|check|qa|quality|coverage|assert|expect|spec)\\b/i,\n },\n {\n type: TaskType.DOCUMENTATION,\n keywords: /\\b(document|readme|comment|explain|describe|guide|tutorial|example|doc)\\b/i,\n },\n {\n type: TaskType.DEBUGGING,\n keywords: /\\b(debug|fix|error|bug|crash|issue|problem|troubleshoot|diagnose|investigate)\\b/i,\n },\n]\n\n/**\n * Detect task type from description using keyword matching.\n * \n * @param description Task description or action text\n * @returns Detected task type (defaults to CODING if no match)\n */\nexport function detectTaskType(description: string): TaskType {\n if (!description || typeof description !== 'string') {\n return TaskType.CODING // Default fallback\n }\n\n // Check each pattern in order of priority\n for (const pattern of TASK_PATTERNS) {\n if (pattern.keywords.test(description)) {\n return pattern.type\n }\n }\n\n // Default to CODING if no keywords matched\n return TaskType.CODING\n}\n\n/**\n * Get human-readable label for task type.\n */\nexport function getTaskTypeLabel(type: TaskType): string {\n const labels: Record<TaskType, string> = {\n [TaskType.CODING]: 'Implementation & Development',\n [TaskType.REASONING]: 'Analysis & Design',\n [TaskType.TESTING]: 'Testing & Verification',\n [TaskType.DOCUMENTATION]: 'Documentation & Guides',\n [TaskType.DEBUGGING]: 'Debugging & Troubleshooting',\n }\n return labels[type] || type\n}\n", "import type { SkillRecord } from \"./skill-store.js\"\n\nexport interface TrainingExample {\n instruction: string\n response: string\n skillName: string\n quality: number\n}\n\nexport interface TrainingDataset {\n format: \"openai\" | \"instructions\"\n totalExamples: number\n qualityFilter: number\n data: string\n}\n\n/**\n * Convert a single skill into a training example.\n * instruction = trigger pattern + name \u2192 what the agent should do\n * response = structured workflow steps \u2192 how the agent should do it\n */\nexport function skillToTrainingExample(skill: SkillRecord): TrainingExample {\n const def = skill.definition\n const stepsText = def.workflow.steps\n .map(s => `${s.order}. ${s.action}: ${s.description}${s.tool ? ` (tool: ${s.tool})` : \"\"}`)\n .join(\"\\n\")\n\n const response = [\n `## Workflow: ${def.meta.name}`,\n stepsText,\n def.workflow.steps.length > 0 ? `\\nEstimated duration: ${def.workflow.estimatedDuration}` : \"\",\n def.quality.failureScenarios.length > 0\n ? `\\nCommon failure scenarios:\\n${def.quality.failureScenarios.map(f => `- ${f}`).join(\"\\n\")}`\n : \"\",\n def.workflow.steps.some(s => s.rollback)\n ? `\\nRollback strategies:\\n${def.workflow.steps.filter(s => s.rollback).map(s => `- ${s.action}: ${s.rollback}`).join(\"\\n\")}`\n : \"\",\n ].filter(Boolean).join(\"\\n\")\n\n const instruction = def.trigger.pattern || def.meta.name\n\n return {\n instruction,\n response,\n skillName: def.meta.name,\n quality: skill.successRate,\n }\n}\n\n/**\n * Export skills as OpenAI fine-tuning JSONL format.\n * Each line: {\"messages\": [{\"role\": \"system\", \"content\": \"...\"}, {\"role\": \"user\", \"content\": \"...\"}, {\"role\": \"assistant\", \"content\": \"...\"}]}\n */\nexport function exportOpenAIJSONL(examples: TrainingExample[]): string {\n return examples.map(ex => {\n const entry = {\n messages: [\n { role: \"system\", content: \"You are a senior software engineer implementing features following reusable patterns.\" },\n { role: \"user\", content: ex.instruction },\n { role: \"assistant\", content: ex.response },\n ],\n }\n return JSON.stringify(entry)\n }).join(\"\\n\")\n}\n\n/**\n * Export skills as simple instruction-response JSON array.\n */\nexport function exportInstructionsJSON(examples: TrainingExample[]): string {\n return JSON.stringify(examples.map(ex => ({\n instruction: ex.instruction,\n output: ex.response,\n source: ex.skillName,\n quality: ex.quality,\n })), null, 2)\n}\n\n/**\n * Generate a summary of the training dataset quality.\n */\nexport function trainingDatasetSummary(examples: TrainingExample[]): string {\n if (examples.length === 0) return \"No training examples generated.\"\n\n const avgQuality = examples.reduce((s, e) => s + e.quality, 0) / examples.length\n const highQuality = examples.filter(e => e.quality >= 0.8).length\n const mediumQuality = examples.filter(e => e.quality >= 0.5 && e.quality < 0.8).length\n const lowQuality = examples.filter(e => e.quality < 0.5).length\n\n let out = `## \uD83D\uDCCA Training Dataset Summary\\n\\n`\n out += `**Total examples:** ${examples.length}\\n`\n out += `**Average quality score:** ${(avgQuality * 100).toFixed(0)}%\\n`\n out += `**Quality distribution:**\\n`\n out += `- High (\u226580%): ${highQuality}\\n`\n out += `- Medium (50-79%): ${mediumQuality}\\n`\n out += `- Low (<50%): ${lowQuality}\\n\\n`\n out += `### Examples\\n`\n for (const ex of examples.slice(0, 5)) {\n out += `- **${ex.skillName}** (quality: ${(ex.quality * 100).toFixed(0)}%)\\n`\n out += ` Instruction: ${ex.instruction.slice(0, 100)}${ex.instruction.length > 100 ? \"\u2026\" : \"\"}\\n`\n }\n if (examples.length > 5) {\n out += ` \u2026 and ${examples.length - 5} more\\n`\n }\n return out\n}\n\n/**\n * Convert all skills to training examples, filtered by minimum success rate.\n */\nexport function skillsToTrainingData(\n skills: SkillRecord[],\n format: \"openai\" | \"instructions\" = \"openai\",\n minSuccessRate = 0.5,\n): TrainingDataset {\n const examples = skills\n .filter(s => s.successRate >= minSuccessRate)\n .map(s => skillToTrainingExample(s))\n\n const data = format === \"openai\"\n ? exportOpenAIJSONL(examples)\n : exportInstructionsJSON(examples)\n\n return {\n format,\n totalExamples: examples.length,\n qualityFilter: minSuccessRate,\n data,\n }\n}\n", "import type { SkillRecord } from \"../memory/skill-store.js\"\nimport type { Episode } from \"../memory/episodic-store.js\"\nimport type { AgentTask } from \"../agents/coordinator.js\"\nimport type { CustomAgentDef } from \"../agents/role-registry.js\"\n\nexport interface EvolutionMetrics {\n totalSessions: number\n totalSteps: number\n successRate: number\n retryRate: number\n avgRetriesPerFailure: number\n topErrorCategories: Array<{ category: string; count: number }>\n skillEffectiveness: Array<{ name: string; successRate: number; usage: number }>\n toolUsage: Array<{ tool: string; calls: number; failureRate: number }>\n recommendations: string[]\n}\n\nexport interface SkillPatch {\n skillId: string\n skillName: string\n failures: number\n suggestedChanges: Array<{\n type: \"add_step\" | \"add_tool\" | \"add_rollback\" | \"reorder\" | \"split\"\n description: string\n detail: string\n }>\n}\n\nexport interface RoleSuggestion {\n name: string\n triggerPattern: string\n suggestedTools: string[]\n reason: string\n}\n\nexport interface PromptPatch {\n role: string\n errorCategory: string\n instruction: string\n priority: \"high\" | \"medium\" | \"low\"\n occurrences: number\n}\n\nexport interface EvolutionReport {\n metrics: EvolutionMetrics\n skillPatches: SkillPatch[]\n roleSuggestions: RoleSuggestion[]\n promptPatches: PromptPatch[]\n improvementScore: number // 0-100, higher = more evolving\n}\n\nexport class SelfEvolver {\n private skills: SkillRecord[] = []\n private episodes: Episode[] = []\n private tasks: AgentTask[] = []\n private stepStates: Array<{ stepId: string; success: boolean; output: string }> = []\n private traceEntries: Array<{ toolUsed: string; success: boolean; step: string }> = []\n\n feedSkills(skills: SkillRecord[]): void { this.skills = skills }\n feedEpisodes(episodes: Episode[]): void { this.episodes = episodes }\n feedTasks(tasks: AgentTask[]): void { this.tasks = tasks }\n feedStepStates(steps: Array<{ stepId: string; success: boolean; output: string }>): void { this.stepStates = steps }\n feedTraces(traces: Array<{ toolUsed: string; success: boolean; step: string }>): void { this.traceEntries = traces }\n\n evolve(): EvolutionReport {\n const metrics = this.computeMetrics()\n const skillPatches = this.analyzeSkills()\n const roleSuggestions = this.suggestRoles()\n const promptPatches = this.suggestPromptPatches(metrics)\n\n // Auto-apply safe prompt patches (low-risk, high-priority)\n const appliedPatches: PromptPatch[] = []\n for (const patch of promptPatches) {\n // Auto-apply if: (1) high-priority AND (2) low occurrences (new pattern, not widespread)\n // OR: medium-priority with very high occurrences (proven pattern)\n const shouldAutoApply = \n (patch.priority === \"high\" && patch.occurrences >= 2 && patch.occurrences <= 5) ||\n (patch.priority === \"medium\" && patch.occurrences >= 10)\n \n if (shouldAutoApply) {\n // Mark as applied (actual prompt injection happens in RoleRegistry)\n appliedPatches.push(patch)\n }\n }\n\n const improvementScore = Math.min(100, Math.round(\n (skillPatches.length * 15) +\n (roleSuggestions.length * 10) +\n (promptPatches.length * 8) +\n (appliedPatches.length * 12) + // Bonus for auto-applied patches\n (metrics.successRate * 20) +\n (metrics.recommendations.length * 5)\n ))\n\n return { metrics, skillPatches, roleSuggestions, promptPatches, improvementScore }\n }\n\n private computeMetrics(): EvolutionMetrics {\n const sessions = new Set(this.episodes.map(e => e.sessionId))\n const totalSteps = this.stepStates.length || this.tasks.length\n const doneSteps = this.stepStates.filter(s => s.success).length\n const failedSteps = this.stepStates.filter(s => !s.success).length\n const done = doneSteps + this.tasks.filter(t => t.status === \"done\").length\n const failed = failedSteps + this.tasks.filter(t => t.status === \"failed\").length\n const total = done + failed || 1\n\n const errorCategories = new Map<string, number>()\n for (const ep of this.episodes) {\n if (ep.outcome !== \"success\") {\n for (const tag of ep.tags) {\n errorCategories.set(tag, (errorCategories.get(tag) ?? 0) + 1)\n }\n }\n }\n\n const topErrors = [...errorCategories.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([category, count]) => ({ category, count }))\n\n const skillEff = this.skills.map(s => ({\n name: s.definition.meta.name,\n successRate: s.successRate,\n usage: s.usageCount,\n }))\n\n const toolUsage = new Map<string, { calls: number; failures: number }>()\n for (const t of this.traceEntries) {\n const entry = toolUsage.get(t.toolUsed) ?? { calls: 0, failures: 0 }\n entry.calls++\n if (!t.success) entry.failures++\n toolUsage.set(t.toolUsed, entry)\n }\n\n const toolStats = [...toolUsage.entries()]\n .map(([tool, stats]) => ({\n tool,\n calls: stats.calls,\n failureRate: stats.calls > 0 ? stats.failures / stats.calls : 0,\n }))\n .sort((a, b) => b.calls - a.calls)\n\n const recommendations: string[] = []\n\n if (total > 0 && done / total < 0.5) {\n recommendations.push(\"Task success rate is below 50%. Consider more granular task decomposition in agentic_plan.\")\n }\n\n if (sessions.size > 3 && this.episodes.filter(e => e.outcome === \"failed\").length / Math.max(this.episodes.length, 1) > 0.3) {\n recommendations.push(\"High cross-session failure rate. Consider adding a 'review' checkpoint between plan and execute phases.\")\n }\n\n const unusedTools = [\n \"agentic_context\", \"agentic_snapshot\", \"agentic_score\",\n ].filter(t => !toolUsage.has(t))\n\n if (unusedTools.length > 0) {\n recommendations.push(`Underutilized tools: ${unusedTools.join(\", \")}. These could improve observability and quality.`)\n }\n\n const retryFraction = failed / Math.max(total, 1)\n if (retryFraction > 0.3) {\n recommendations.push(\"High retry rate (>30%). Consider adding more explicit verification criteria to plan steps.\")\n }\n\n // Error pattern analysis\n for (const step of this.stepStates) {\n if (!step.success && step.output.length > 0) {\n const lower = step.output.toLowerCase()\n if (lower.includes(\"type\") || lower.includes(\"compile\")) {\n recommendations.push(\"Frequent type/compile errors detected. Enable `autoVerify` on all execute calls to catch these early.\")\n break\n }\n }\n }\n\n return {\n totalSessions: sessions.size,\n totalSteps,\n successRate: total > 0 ? done / total : 0,\n retryRate: retryFraction,\n avgRetriesPerFailure: failed > 0 ? (totalSteps - done) / failed : 0,\n topErrorCategories: topErrors,\n skillEffectiveness: skillEff,\n toolUsage: toolStats,\n recommendations,\n }\n }\n\n private analyzeSkills(): SkillPatch[] {\n const patches: SkillPatch[] = []\n\n for (const skill of this.skills) {\n if (skill.successRate >= 0.8) continue // healthy skills\n\n const def = skill.definition\n const suggestions: SkillPatch[\"suggestedChanges\"] = []\n\n for (const scenario of def.quality.failureScenarios.slice(-3)) {\n if (scenario.includes(\"rollback\") || scenario.includes(\"undo\")) {\n suggestions.push({\n type: \"add_rollback\",\n description: \"Add rollback step for failed operations\",\n detail: \"Each step that modifies state should have a corresponding undo action\",\n })\n }\n if (scenario.includes(\"timeout\") || scenario.includes(\"slow\")) {\n suggestions.push({\n type: \"add_step\",\n description: \"Add timeout/retry wrapper step\",\n detail: \"Wrap long-running operations with retry: utils/retry.ts handles exponential backoff\",\n })\n }\n if (scenario.includes(\"missing\") || scenario.includes(\"not found\")) {\n suggestions.push({\n type: \"add_step\",\n description: \"Add pre-flight validation step\",\n detail: \"Check prerequisites before executing main workflow\",\n })\n }\n }\n\n if (def.workflow.steps.length > 5) {\n suggestions.push({\n type: \"split\",\n description: \"Split into smaller, independently testable sub-skills\",\n detail: `This skill has ${def.workflow.steps.length} steps. Consider splitting at logical boundaries.`,\n })\n }\n\n if (suggestions.length > 0) {\n patches.push({\n skillId: def.meta.id,\n skillName: def.meta.name,\n failures: Math.round(skill.usageCount * (1 - skill.successRate)),\n suggestedChanges: suggestions,\n })\n }\n }\n\n return patches\n }\n\n private suggestRoles(): RoleSuggestion[] {\n const suggestions: RoleSuggestion[] = []\n\n const taskOutcomes = new Map<string, { total: number; failed: number }>()\n for (const task of this.tasks) {\n const entry = taskOutcomes.get(task.assignedTo) ?? { total: 0, failed: 0 }\n entry.total++\n if (task.status === \"failed\") entry.failed++\n taskOutcomes.set(task.assignedTo, entry)\n }\n\n const failedTasks = this.tasks.filter(t => t.status === \"failed\")\n const failKeywords = new Map<string, number>()\n\n for (const task of failedTasks) {\n const words = task.description.toLowerCase().split(/\\W+/).filter(w => w.length > 3)\n for (const w of words) {\n failKeywords.set(w, (failKeywords.get(w) ?? 0) + 1)\n }\n }\n\n const significantKeywords = [...failKeywords.entries()]\n .filter(([, count]) => count >= 2)\n .sort((a, b) => b[1] - a[1])\n\n for (const [keyword, count] of significantKeywords) {\n if (keyword === \"security\" || keyword === \"vulnerability\" || keyword === \"injection\") {\n suggestions.push({\n name: \"Security Auditor\",\n triggerPattern: `tasks involving ${keyword}`,\n suggestedTools: [\"read\", \"grep\", \"agentic_guard\", \"agentic_verify\"],\n reason: `${count} task(s) involving \"${keyword}\" failed. A dedicated security role could prevent these via specialized review patterns.`,\n })\n }\n\n if (keyword === \"performance\" || keyword === \"optimize\" || keyword === \"slow\") {\n suggestions.push({\n name: \"Performance Engineer\",\n triggerPattern: `tasks involving ${keyword}`,\n suggestedTools: [\"bash\", \"agentic_score\", \"agentic_verify\"],\n reason: `${count} task(s) involving \"${keyword}\" failed. A performance-focused agent could catch bottlenecks early.`,\n })\n }\n\n if (keyword === \"database\" || keyword === \"migration\" || keyword === \"schema\") {\n suggestions.push({\n name: \"DB Specialist\",\n triggerPattern: `tasks involving ${keyword}`,\n suggestedTools: [\"bash\", \"read\", \"agentic_nav\"],\n reason: `${count} task(s) involving \"${keyword}\" failed. A database specialist could prevent schema drift and migration errors.`,\n })\n }\n }\n\n const hasCoordinator = taskOutcomes.has(\"coordinator\")\n if (!hasCoordinator && this.tasks.length > 10) {\n suggestions.push({\n name: \"Task Coordinator\",\n triggerPattern: \"multi-step tasks with cross-cutting concerns\",\n suggestedTools: [\"agentic_plan\", \"agentic_status\", \"agentic_delegate\", \"agentic_parallel\"],\n reason: \"With 10+ tasks and no coordinator role active, orchestration overhead may cause failures.\",\n })\n }\n\n return suggestions.slice(0, 5)\n }\n\n /**\n * Generate prompt patches from recurring error patterns (Gap #1: prompt auto-patching).\n * Maps error categories \u2192 specific instruction additions for the relevant agent role.\n */\n private suggestPromptPatches(metrics: EvolutionMetrics): PromptPatch[] {\n const patches: PromptPatch[] = []\n\n // Error category \u2192 (role, instruction) mapping\n const errorToPatch: Array<{\n category: string\n role: string\n instruction: string\n priority: \"high\" | \"medium\" | \"low\"\n }> = [\n {\n category: \"compile\",\n role: \"developer\",\n instruction: \"Before writing code, verify that all types and interfaces are compatible. Run `npx tsc --noEmit` to check for type errors before considering a step complete.\",\n priority: \"high\",\n },\n {\n category: \"type\",\n role: \"developer\",\n instruction: \"Always define explicit type annotations for function parameters and return values. Avoid `any` types. Verify type exports/imports match between files.\",\n priority: \"high\",\n },\n {\n category: \"import\",\n role: \"architect\",\n instruction: \"Before implementing, document all file dependencies and ensure import paths are correct. Verify the import exists at the expected relative path.\",\n priority: \"high\",\n },\n {\n category: \"test\",\n role: \"qa\",\n instruction: \"When reviewing code, check edge cases: empty inputs, null/undefined values, boundary conditions, and error paths. Ensure tests cover both success and failure scenarios.\",\n priority: \"medium\",\n },\n {\n category: \"runtime\",\n role: \"developer\",\n instruction: \"Add error handling for runtime edge cases: network timeouts, file not found, permission denied, and invalid input. Use try/catch blocks and return user-friendly error messages.\",\n priority: \"medium\",\n },\n ]\n\n for (const errCat of metrics.topErrorCategories) {\n const mapping = errorToPatch.find(e => e.category === errCat.category)\n if (mapping && errCat.count >= 2) {\n patches.push({\n role: mapping.role,\n errorCategory: errCat.category,\n instruction: mapping.instruction,\n priority: errCat.count >= 5 ? \"high\" : mapping.priority,\n occurrences: errCat.count,\n })\n }\n }\n\n return patches\n }\n}\n", "/**\n * ContinuousEvolution \u2014 auto-feedback pipeline for self-evolving agents.\n *\n * Tracks a rolling window of step results, detects performance degradation,\n * and triggers evolution analysis when anomalies are found.\n *\n * Aligns with the paper's \"continuous evolution\" vision:\n * agents that monitor their own performance and self-improve over time.\n */\n\nexport interface StepResult {\n stepId: string\n success: boolean\n output: string\n sessionId: string\n timestamp: number\n category?: string\n}\n\nexport interface ForecastData {\n /** Predicted success rate for the next window */\n nextWindowRate: number\n /** Estimated remaining steps until success rate drops below 50%, or null if not predictable */\n stepsUntilCritical: number | null\n /** True if the forecast shows imminent critical degradation */\n critical: boolean\n /** Per-bucket success rates for transparency */\n bucketRates: number[]\n}\n\nexport interface PerformanceTrend {\n overall: { total: number; success: number; successRate: number }\n rolling: { windowSize: number; successRate: number; direction: \"improving\" | \"stable\" | \"degrading\" }\n degradationDetected: boolean\n anomalyCount: number\n recentErrors: Array<{ stepId: string; output: string; category: string; timestamp: number }>\n recommendations: string[]\n /** Predictive degradation forecast (Gap #12) */\n forecast: ForecastData\n}\n\nexport interface EvolutionTrigger {\n reason: string\n type: \"degradation\" | \"anomaly_spike\" | \"milestone\"\n metrics: {\n recentRate: number\n overallRate: number\n anomalyRatio: number\n }\n}\n\nexport type DegradationCallback = (trend: PerformanceTrend, trigger: EvolutionTrigger) => void\n\nexport class ContinuousEvolution {\n private windowSize: number\n private results: StepResult[] = []\n private degradationCallbacks: DegradationCallback[] = []\n private lastEvolveSession: string | null = null\n private evolveCount = 0\n\n constructor(windowSize = 20) {\n this.windowSize = windowSize\n }\n\n /** Feed a step result into the rolling window */\n feedStepResult(result: StepResult): void {\n this.results.push(result)\n // Keep bounded \u2014 retain 2\u00D7 window for historical comparison\n if (this.results.length > this.windowSize * 2 + 10) {\n this.results = this.results.slice(-this.windowSize * 2)\n }\n }\n\n /** Feed multiple results at once (e.g. after a session completes) */\n feedBatch(results: StepResult[]): void {\n for (const r of results) {\n this.feedStepResult(r)\n }\n }\n\n /** Register a callback that fires when degradation is detected */\n onDegradation(cb: DegradationCallback): void {\n this.degradationCallbacks.push(cb)\n }\n\n /** Get current performance trend */\n getTrend(): PerformanceTrend {\n const total = this.results.length\n const successes = this.results.filter(r => r.success).length\n const overallRate = total > 0 ? successes / total : 1\n\n // Rolling window (most recent N)\n const recent = this.results.slice(-this.windowSize)\n const recentSuccesses = recent.filter(r => r.success).length\n const recentRate = recent.length > 0 ? recentSuccesses / recent.length : 1\n\n // Earlier window for comparison\n const earlier = this.results.slice(0, Math.min(this.windowSize, this.results.length - recent.length))\n const earlierSuccesses = earlier.filter(r => r.success).length\n const earlierRate = earlier.length > 0 ? earlierSuccesses / earlier.length : 1\n\n // Direction: \u22655% swing in either direction\n const direction = recentRate > earlierRate + 0.05\n ? \"improving\"\n : recentRate < earlierRate - 0.05\n ? \"degrading\"\n : \"stable\"\n\n const degradationDetected = direction === \"degrading\" && recentRate < 0.6\n\n const recentErrors: PerformanceTrend[\"recentErrors\"] = []\n const categories = new Map<string, number>()\n for (const r of this.results) {\n if (!r.success) {\n if (r.category) categories.set(r.category, (categories.get(r.category) ?? 0) + 1)\n }\n }\n\n for (const r of this.results.slice(-5).filter(r => !r.success)) {\n recentErrors.push({\n stepId: r.stepId,\n output: r.output.slice(0, 200),\n category: r.category ?? \"unknown\",\n timestamp: r.timestamp,\n })\n }\n\n const recommendations: string[] = []\n\n // \u2500\u2500 Predictive Degradation Forecast (Gap #12) \u2500\u2500\n // Divide results into 5 chronological buckets and compute per-bucket rates\n const forecast: ForecastData = {\n nextWindowRate: recentRate,\n stepsUntilCritical: null,\n critical: false,\n bucketRates: [],\n }\n\n if (this.results.length >= 10) {\n const bucketSize = Math.max(1, Math.floor(this.results.length / 5))\n const bucketRates: number[] = []\n for (let i = 0; i < 5; i++) {\n const start = i * bucketSize\n const end = Math.min(start + bucketSize, this.results.length)\n const bucket = this.results.slice(start, end)\n const bucketSuccesses = bucket.filter(r => r.success).length\n bucketRates.push(bucket.length > 0 ? bucketSuccesses / bucket.length : 0)\n }\n forecast.bucketRates = bucketRates\n\n // Simple linear regression: if rates are consistently decreasing, extrapolate\n const isDecreasing = bucketRates.length >= 3 &&\n bucketRates.slice(1).every((r, i) => r <= bucketRates[i]) &&\n bucketRates[0] > bucketRates[bucketRates.length - 1]\n\n if (isDecreasing) {\n // Compute average decline per bucket\n const totalDecline = bucketRates[0] - bucketRates[bucketRates.length - 1]\n const avgDecline = totalDecline / (bucketRates.length - 1)\n\n // Predict next window rate\n const nextRate = Math.max(0, bucketRates[bucketRates.length - 1] - avgDecline)\n forecast.nextWindowRate = nextRate\n forecast.critical = nextRate < 0.5\n\n // Estimate when rate would cross 50%\n if (bucketRates[bucketRates.length - 1] > 0.5 && avgDecline > 0) {\n const stepsToCross = Math.ceil((bucketRates[bucketRates.length - 1] - 0.5) / avgDecline) * bucketSize\n forecast.stepsUntilCritical = stepsToCross\n }\n\n if (forecast.critical) {\n recommendations.push(`\uD83D\uDD2E **Forecast:** Performance projected to drop to ${(nextRate * 100).toFixed(0)}% in the next window. ${forecast.stepsUntilCritical ? `Critical threshold (~50%) expected in ~${forecast.stepsUntilCritical} steps.` : \"Consider proactive evolution analysis.\"}`)\n }\n }\n }\n if (degradationDetected) {\n recommendations.push(\"Performance degradation detected. Run `agentic_evolve evolve` or enable auto-evolution to analyze root causes.\")\n }\n if (categories.size > 0) {\n const topCat = [...categories.entries()].sort((a, b) => b[1] - a[1])[0]\n if (topCat && topCat[1] >= 3) {\n recommendations.push(`Recurring error pattern: \"${topCat[0]}\" (${topCat[1]} occurrences). Consider adding targeted verification for this category.`)\n }\n }\n if (this.results.length >= 10 && overallRate < 0.5) {\n recommendations.push(\"Overall success rate below 50%. Review plan decomposition granularity and verification criteria.\")\n }\n if (this.results.length >= this.windowSize && recentRate === 1 && overallRate < 0.8) {\n recommendations.push(\"Recent improvement trend detected. Extract successful patterns as reusable skills via `agentic_skill extract`.\")\n }\n\n return {\n overall: { total, success: successes, successRate: overallRate },\n rolling: { windowSize: this.windowSize, successRate: recentRate, direction },\n degradationDetected,\n anomalyCount: this.results.filter(r => !r.success).length,\n recentErrors,\n recommendations,\n forecast,\n }\n }\n\n /** Check trend and fire callbacks if degradation found. Returns current trend. */\n checkAndNotify(): PerformanceTrend {\n const trend = this.getTrend()\n if (trend.degradationDetected) {\n const trigger: EvolutionTrigger = {\n reason: `Success rate dropped to ${(trend.rolling.successRate * 100).toFixed(0)}% in last ${trend.rolling.windowSize} steps (direction: ${trend.rolling.direction})`,\n type: \"degradation\",\n metrics: {\n recentRate: trend.rolling.successRate,\n overallRate: trend.overall.successRate,\n anomalyRatio: trend.anomalyCount / Math.max(trend.overall.total, 1),\n },\n }\n for (const cb of this.degradationCallbacks) {\n try { cb(trend, trigger) } catch { /* non-fatal */ }\n }\n }\n return trend\n }\n\n /**\n * Decide whether to auto-trigger evolution analysis.\n * Returns null if no trigger needed, or an EvolutionTrigger explaining why.\n */\n shouldEvolve(sessionId: string): EvolutionTrigger | null {\n const trend = this.getTrend()\n\n // Don't evolve twice in the same session\n if (this.lastEvolveSession === sessionId) return null\n\n // Cap total evolutions to prevent infinite loops\n if (this.evolveCount >= 5) return null\n\n // Trigger 1: Degradation\n if (trend.degradationDetected) {\n this.lastEvolveSession = sessionId\n this.evolveCount++\n return {\n reason: `Auto-evolution triggered by performance degradation: ${(trend.rolling.successRate * 100).toFixed(0)}% success rate in recent window`,\n type: \"degradation\",\n metrics: {\n recentRate: trend.rolling.successRate,\n overallRate: trend.overall.successRate,\n anomalyRatio: trend.anomalyCount / Math.max(trend.overall.total, 1),\n },\n }\n }\n\n // Trigger 2: Milestone \u2014 every 50 completed steps, auto-evolve\n if (this.results.length > 0 && this.results.length % 50 === 0) {\n this.lastEvolveSession = sessionId\n this.evolveCount++\n return {\n reason: `Milestone reached: ${this.results.length} steps completed. Periodic evolution analysis.`,\n type: \"milestone\",\n metrics: {\n recentRate: trend.rolling.successRate,\n overallRate: trend.overall.successRate,\n anomalyRatio: trend.anomalyCount / Math.max(trend.overall.total, 1),\n },\n }\n }\n\n return null\n }\n\n /** Reset state (for testing) */\n reset(): void {\n this.results = []\n this.lastEvolveSession = null\n this.evolveCount = 0\n }\n\n /** Get raw counts */\n getStats(): { totalResults: number; evolveCount: number; windowSize: number } {\n return {\n totalResults: this.results.length,\n evolveCount: this.evolveCount,\n windowSize: this.windowSize,\n }\n }\n}\n", "import type { Subtask } from \"./intent-parser.js\"\nimport { Executor } from \"./executor.js\"\nimport { Verifier } from \"./verifier.js\"\nimport { ErrorAnalyzer } from \"./error-analyzer.js\"\nimport { DependencyTracker } from \"../drift/dependency-tracker.js\"\nimport { LLMEngine } from \"./llm.js\"\n\nexport interface AgentLoopConfig {\n maxIterations: number\n autoRetry: boolean\n maxRetries: number\n verifyAfterEach: boolean\n}\n\nexport interface LoopResult {\n completedSteps: string[]\n failedSteps: string[]\n totalIterations: number\n success: boolean\n summary: string\n}\n\nexport interface LoopObserver {\n onStepStart(stepId: string, iteration: number): void\n onStepComplete(stepId: string, success: boolean, output: string): void\n onLoopComplete(result: LoopResult): void\n}\n\nexport class AgentLoop {\n private config: AgentLoopConfig\n private llm: LLMEngine\n private observers: LoopObserver[] = []\n\n constructor(llm: LLMEngine, config: Partial<AgentLoopConfig> = {}) {\n this.llm = llm\n this.config = {\n maxIterations: config.maxIterations ?? 20,\n autoRetry: config.autoRetry ?? true,\n maxRetries: config.maxRetries ?? 3,\n verifyAfterEach: config.verifyAfterEach ?? true,\n }\n }\n\n addObserver(observer: LoopObserver): void {\n this.observers.push(observer)\n }\n\n async runLoop(\n sessionId: string,\n executor: Executor,\n verifier: Verifier,\n errorAnalyzer: ErrorAnalyzer,\n depTracker: DependencyTracker,\n projectDir: string,\n stepExecutor: (step: Subtask) => Promise<{ success: boolean; output: string; filesModified: string[]; error?: string }>,\n fixExecutor?: (fix: string) => Promise<boolean>,\n ): Promise<LoopResult> {\n const completedSteps: string[] = []\n const failedSteps: string[] = []\n let iteration = 0\n\n while (iteration < this.config.maxIterations) {\n iteration++\n\n const nextStep = executor.getNextStep(sessionId)\n if (!nextStep) break\n\n let retryCount = 0\n let stepSuccess = false\n let stepOutput = \"\"\n\n while (retryCount <= this.config.maxRetries) {\n this.observers.forEach(o => o.onStepStart(nextStep.id, iteration))\n\n const result = await stepExecutor(nextStep)\n\n if (result.filesModified && result.filesModified.length > 0) {\n depTracker.recordChange(sessionId, nextStep.id, result.filesModified)\n }\n\n executor.recordResult(sessionId, {\n stepId: nextStep.id,\n success: result.success,\n output: result.output,\n filesModified: result.filesModified,\n error: result.error,\n })\n\n stepSuccess = result.success\n stepOutput = result.output\n\n if (stepSuccess) {\n if (this.config.verifyAfterEach) {\n const verifyResult = result.filesModified.length > 0\n ? verifier.verifyRelated(nextStep.id, projectDir, result.filesModified)\n : verifier.verifyAll(nextStep.id, projectDir)\n\n if (!verifyResult.passed) {\n stepSuccess = false\n stepOutput = `Verification failed: ${verifyResult.errors.join(\"\\n\")}`\n const analysis = await errorAnalyzer.analyzeDeep(stepOutput, result.filesModified)\n this.observers.forEach(o => o.onStepComplete(nextStep.id, false, analysis.suggestedFix))\n\n if (!this.config.autoRetry) break\n\n const repairResult = await this.attemptRepair(nextStep, stepOutput, analysis, fixExecutor)\n if (!repairResult) {\n retryCount++\n break\n }\n continue\n }\n }\n\n completedSteps.push(nextStep.id)\n this.observers.forEach(o => o.onStepComplete(nextStep.id, true, stepOutput))\n break\n }\n\n retryCount++\n this.observers.forEach(o => o.onStepComplete(nextStep.id, false, stepOutput))\n\n if (!this.config.autoRetry || retryCount > this.config.maxRetries) break\n\n const analysis = await errorAnalyzer.analyzeDeep(stepOutput, result.filesModified ?? [])\n const repairResult = await this.attemptRepair(nextStep, stepOutput, analysis, fixExecutor)\n if (!repairResult) break\n }\n\n if (!stepSuccess) {\n failedSteps.push(nextStep.id)\n }\n }\n\n const result: LoopResult = {\n completedSteps,\n failedSteps,\n totalIterations: iteration,\n success: failedSteps.length === 0,\n summary: `Completed ${completedSteps.length} steps, ${failedSteps.length} failed in ${iteration} iterations.`,\n }\n\n this.observers.forEach(o => o.onLoopComplete(result))\n return result\n }\n\n private async attemptRepair(\n step: Subtask,\n error: string,\n analysis: ReturnType<ErrorAnalyzer[\"analyze\"]>,\n fixExecutor?: (fix: string) => Promise<boolean>,\n ): Promise<boolean> {\n try {\n const llmAnalysis = await this.llm.analyzeError(error, [])\n if (llmAnalysis && llmAnalysis.category !== \"unknown\" && llmAnalysis.fix && llmAnalysis.fix !== \"Manual investigation needed\") {\n // If a fixExecutor is provided, try it. If it fails, still retry (the step executor\n // will get another chance with the error context).\n if (fixExecutor) {\n const fixed = await fixExecutor(llmAnalysis.fix).catch(() => false)\n if (fixed) return true\n }\n return true // retry step execution even if bash fix failed\n }\n } catch {\n // LLM repair failed, but we can still try basic fixes\n }\n\n // Compile/type/import errors are generally retryable - the step executor\n // will try again with the error signal\n if (analysis && (analysis.category === \"import\" || analysis.category === \"compile\" || analysis.category === \"type\")) {\n return true\n }\n return true // always allow retry for non-fatal errors\n }\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from \"node:fs\"\nimport { resolve } from \"node:path\"\n\nexport interface PersistentState<T> {\n key: string\n data: T\n updatedAt: string\n}\n\nexport class PersistenceLayer {\n private baseDir: string\n private storeDir: string\n\n constructor(worktree: string) {\n this.baseDir = worktree || process.cwd()\n this.storeDir = resolve(this.baseDir, \".agentic\", \"store\")\n }\n\n save<T>(namespace: string, key: string, data: T): void {\n try { this.ensureDir() } catch { /* non-fatal */ }\n const dir = resolve(this.storeDir, namespace)\n if (!existsSync(dir)) { try { mkdirSync(dir, { recursive: true }) } catch { return } }\n\n const state: PersistentState<T> = {\n key,\n data,\n updatedAt: new Date().toISOString(),\n }\n writeFileSync(resolve(dir, `${key}.json`), JSON.stringify(state, null, 2), \"utf-8\")\n }\n\n load<T>(namespace: string, key: string): T | null {\n const filePath = resolve(this.storeDir, namespace, `${key}.json`)\n if (!existsSync(filePath)) return null\n try {\n const state = JSON.parse(readFileSync(filePath, \"utf-8\")) as PersistentState<T>\n return state.data\n } catch {\n return null\n }\n }\n\n loadAll<T>(namespace: string): PersistentState<T>[] {\n const dir = resolve(this.storeDir, namespace)\n if (!existsSync(dir)) return []\n const results: PersistentState<T>[] = []\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.isFile() && entry.name.endsWith(\".json\")) {\n try {\n const state = JSON.parse(readFileSync(resolve(dir, entry.name), \"utf-8\")) as PersistentState<T>\n results.push(state)\n } catch {\n // skip corrupted files\n }\n }\n }\n return results\n }\n\n delete(namespace: string, key: string): boolean {\n const filePath = resolve(this.storeDir, namespace, `${key}.json`)\n if (!existsSync(filePath)) return false\n try {\n unlinkSync(filePath)\n return true\n } catch {\n return false\n }\n }\n\n listKeys(namespace: string): string[] {\n const dir = resolve(this.storeDir, namespace)\n if (!existsSync(dir)) return []\n return readdirSync(dir, { withFileTypes: true })\n .filter(e => e.isFile() && e.name.endsWith(\".json\"))\n .map(e => e.name.replace(\".json\", \"\"))\n }\n\n private ensureDir(): void {\n if (!existsSync(this.storeDir)) {\n mkdirSync(this.storeDir, { recursive: true })\n }\n }\n}\n", "import type { LLMEngine } from \"../core/llm.js\"\nimport type { LocalEmbedder } from \"./local-embedder.js\"\nimport { createRequire } from \"node:module\"\n\nconst _require = createRequire(import.meta.url)\n\nexport type DocumentType = \"episode\" | \"skill\" | \"file\" | \"code\"\n\nexport interface DocumentMeta {\n type: DocumentType\n sessionId?: string\n tags?: string[]\n [key: string]: unknown\n}\n\nexport interface SearchResult {\n id: string\n content: string\n metadata: DocumentMeta\n score: number\n}\n\nexport type SearchMode = \"sparse\" | \"dense\" | \"hybrid\" | \"llm-rerank\"\n\n/**\n * Stop words dari package `stopword` (62 bahasa, zero deps).\n * Di-load lazy via require \u2014 esbuild akan bundle seluruh package.\n */\nlet stopWordModule: Record<string, string[]> | null = null\nlet stopWordLoadAttempted = false\n\nfunction loadStopWords(): Record<string, string[]> | null {\n if (stopWordLoadAttempted) return stopWordModule\n stopWordLoadAttempted = true\n try {\n stopWordModule = _require(\"stopword\") as Record<string, string[]>\n } catch {\n stopWordModule = null\n }\n return stopWordModule\n}\n\nconst combinedStopCache = new Map<string, Set<string>>()\n\nfunction getStopWordSet(langs: string[]): Set<string> {\n const key = [...langs].sort().join(\",\")\n const cached = combinedStopCache.get(key)\n if (cached) return cached\n\n const mod = loadStopWords()\n const words = new Set<string>()\n\n if (mod) {\n for (const lang of langs) {\n const arr = mod[lang]\n if (Array.isArray(arr)) {\n for (const w of arr) words.add(w)\n }\n }\n }\n\n // Fallback: minimal English + Indonesian stop words built-in\n if (words.size === 0) {\n const FALLBACK = new Set([\n \"yang\", \"dan\", \"di\", \"ke\", \"dari\", \"ini\", \"itu\", \"dan\", \"atau\",\n \"tidak\", \"adalah\", \"akan\", \"dengan\", \"untuk\", \"pada\", \"dalam\",\n \"the\", \"and\", \"is\", \"are\", \"was\", \"were\", \"be\", \"been\",\n \"a\", \"an\", \"to\", \"for\", \"of\", \"in\", \"on\", \"at\", \"by\", \"with\",\n \"this\", \"that\", \"these\", \"those\", \"it\", \"its\", \"we\", \"our\",\n \"you\", \"your\", \"they\", \"them\", \"their\", \"i\", \"me\", \"my\",\n ])\n for (const w of FALLBACK) words.add(w)\n }\n\n combinedStopCache.set(key, words)\n return words\n}\n\ninterface VectorEntry {\n id: string\n content: string\n metadata: DocumentMeta\n tfidf: Map<string, number>\n norm: number\n dense?: Float32Array\n}\n\nexport class VectorStore {\n private documents: Map<string, VectorEntry> = new Map()\n private vocabulary: Map<string, number> = new Map()\n private maxCacheSize = 100\n private searchCache: Map<string, SearchResult[]> = new Map()\n private semanticCache: Map<string, SearchResult[]> = new Map()\n private llmEngine: LLMEngine | null = null\n private embedder: LocalEmbedder | null = null\n private embedQueue: Array<{ id: string; content: string }> = []\n private embedProcessing = false\n /** Search weights \u2014 from config */\n private keywordWeight = 0.3\n private vectorWeight = 0.7\n /** Remote embedding config \u2014 dari config, bukan local embedder */\n private remoteEmbedModel: string | null = null\n private remoteEmbedEndpoint: string | null = null\n private remoteEmbedApiKey: string | null = null\n /** ISO 639-3 language codes for stop word filtering */\n private stopWordsLanguages: string[] = [\"ind\", \"eng\"]\n\n setLLM(llm: LLMEngine): void {\n this.llmEngine = llm\n }\n\n setEmbedder(embedder: LocalEmbedder): void {\n this.embedder = embedder\n }\n\n /** Set search weights from config \u2014 menggantikan hardcoded alpha */\n setSearchWeights(keyword: number, vector: number): void {\n this.keywordWeight = keyword\n this.vectorWeight = vector\n }\n\n /** Set remote embedding config \u2014 untuk full vector mode */\n setEmbeddingConfig(model: string, endpoint: string | null, apiKey: string | null): void {\n this.remoteEmbedModel = model\n this.remoteEmbedEndpoint = endpoint\n this.remoteEmbedApiKey = apiKey\n }\n\n /** Set stop word languages \u2014 dari config */\n setStopWordsLanguages(langs: string[]): void {\n if (langs.length > 0) this.stopWordsLanguages = langs\n }\n\n /** Get remote embedding config */\n getEmbeddingConfig(): { model: string; endpoint: string | null; apiKey: string | null } | null {\n if (!this.remoteEmbedModel) return null\n return { model: this.remoteEmbedModel, endpoint: this.remoteEmbedEndpoint, apiKey: this.remoteEmbedApiKey }\n }\n\n private queueDenseEmbed(id: string, content: string): void {\n if (!this.embedder) return\n this.embedQueue.push({ id, content })\n this.processEmbedQueue()\n }\n\n private async processEmbedQueue(): Promise<void> {\n if (this.embedProcessing || !this.embedder) return\n this.embedProcessing = true\n\n while (this.embedQueue.length > 0) {\n const batch = this.embedQueue.splice(0, 5)\n await Promise.all(batch.map(async ({ id, content }) => {\n try {\n const vec = await this.embedder!.embed(content)\n if (vec) {\n const doc = this.documents.get(id)\n if (doc) doc.dense = vec\n }\n } catch { /* skip failed embeddings */ }\n }))\n }\n\n this.embedProcessing = false\n }\n\n addDocument(id: string, content: string, metadata: DocumentMeta): void {\n const tokens = this.tokenize(content)\n const tf = new Map<string, number>()\n for (const t of tokens) {\n tf.set(t, (tf.get(t) ?? 0) + 1)\n }\n\n const existing = this.documents.get(id)\n if (existing) {\n for (const t of existing.tfidf.keys()) {\n const prev = this.vocabulary.get(t)\n if (prev !== undefined) {\n if (prev <= 1) this.vocabulary.delete(t)\n else this.vocabulary.set(t, prev - 1)\n }\n }\n }\n\n const tfs = tokenFreqToTF(tokens, tf)\n const totalDocs = this.documents.size + 1\n const tfidf = new Map<string, number>()\n for (const [term, tfVal] of tfs) {\n const df = (this.vocabulary.get(term) ?? 0) + 1\n const idf = Math.log((totalDocs) / df) + 1\n if (idf > 0) tfidf.set(term, tfVal * idf)\n }\n\n let norm = 0\n for (const v of tfidf.values()) norm += v * v\n norm = Math.sqrt(norm)\n\n this.documents.set(id, { id, content, metadata, tfidf, norm })\n\n for (const t of tokens) {\n this.vocabulary.set(t, (this.vocabulary.get(t) ?? 0) + 1)\n }\n\n this.searchCache.clear()\n this.semanticCache.clear()\n\n this.queueDenseEmbed(id, content)\n }\n\n search(query: string, topK = 5): SearchResult[] {\n return this.sparseSearch(query, topK)\n }\n\n async searchWithMode(query: string, topK = 5, mode: SearchMode = \"hybrid\"): Promise<SearchResult[]> {\n const cacheKey = `${mode}::${query}::${topK}`\n const cached = this.searchCache.get(cacheKey)\n if (cached) return cached\n\n if (this.documents.size === 0) return []\n\n let results: SearchResult[]\n\n switch (mode) {\n case \"dense\":\n results = await this.denseSearch(query, topK)\n break\n case \"hybrid\":\n results = await this.hybridSearch(query, topK)\n break\n case \"sparse\":\n default:\n results = this.sparseSearch(query, topK)\n break\n }\n\n if (this.searchCache.size >= this.maxCacheSize) {\n const firstKey = this.searchCache.keys().next().value\n if (firstKey !== undefined) this.searchCache.delete(firstKey)\n }\n this.searchCache.set(cacheKey, results)\n\n return results\n }\n\n private sparseSearch(query: string, topK: number): SearchResult[] {\n const queryTokens = this.tokenize(query)\n if (queryTokens.length === 0) return []\n\n const queryTF = new Map<string, number>()\n for (const t of queryTokens) {\n queryTF.set(t, (queryTF.get(t) ?? 0) + 1)\n }\n const qTf = tokenFreqToTF(queryTokens, queryTF)\n const totalDocs = this.documents.size\n\n let qNorm = 0\n const qWeight = new Map<string, number>()\n for (const [term, tfVal] of qTf) {\n const df = this.vocabulary.get(term) ?? 0\n const idf = df > 0 ? Math.log((totalDocs) / df) + 1 : 1\n const w = tfVal * idf\n qWeight.set(term, w)\n qNorm += w * w\n }\n qNorm = Math.sqrt(qNorm)\n if (qNorm === 0) return []\n\n const scores: SearchResult[] = []\n for (const doc of this.documents.values()) {\n let dot = 0\n for (const [term, qw] of qWeight) {\n const dw = doc.tfidf.get(term)\n if (dw) dot += qw * dw\n }\n const score = doc.norm > 0 ? dot / (qNorm * doc.norm) : 0\n if (score > 0.01) {\n scores.push({ id: doc.id, content: doc.content, metadata: { ...doc.metadata }, score })\n }\n }\n\n scores.sort((a, b) => b.score - a.score)\n return scores.slice(0, topK)\n }\n\n private async denseSearch(query: string, topK: number): Promise<SearchResult[]> {\n if (!this.embedder || !this.embedder.ready) {\n return this.sparseSearch(query, topK)\n }\n\n const hasDense = [...this.documents.values()].some(d => d.dense)\n if (!hasDense) return this.sparseSearch(query, topK)\n\n const qVec = await this.embedder.embed(query)\n if (!qVec) return this.sparseSearch(query, topK)\n\n const results: SearchResult[] = []\n for (const doc of this.documents.values()) {\n if (!doc.dense) continue\n let dot = 0, nA = 0, nB = 0\n for (let i = 0; i < doc.dense.length; i++) {\n const qv = qVec[i] ?? 0\n const dv = doc.dense[i] ?? 0\n dot += qv * dv\n nA += qv * qv\n nB += dv * dv\n }\n const sim = Math.sqrt(nA) * Math.sqrt(nB)\n const score = sim === 0 ? 0 : dot / sim\n if (score > 0.1) {\n results.push({ id: doc.id, content: doc.content, metadata: { ...doc.metadata }, score })\n }\n }\n\n results.sort((a, b) => b.score - a.score)\n return results.slice(0, topK)\n }\n\n private async hybridSearch(query: string, topK: number): Promise<SearchResult[]> {\n const [denseResults, sparseResults] = await Promise.all([\n this.denseSearch(query, Math.max(topK * 3, 15)),\n Promise.resolve(this.sparseSearch(query, Math.max(topK * 3, 15))),\n ])\n\n const combined = new Map<string, { sparseScore: number; denseScore: number; result: SearchResult }>()\n\n const maxSparse = sparseResults[0]?.score ?? 1\n for (const r of sparseResults) {\n combined.set(r.id, { sparseScore: r.score / maxSparse, denseScore: 0, result: r })\n }\n\n const maxDense = denseResults[0]?.score ?? 1\n for (const r of denseResults) {\n const existing = combined.get(r.id)\n if (existing) {\n existing.denseScore = r.score / maxDense\n } else {\n combined.set(r.id, { sparseScore: 0, denseScore: r.score / maxDense, result: r })\n }\n }\n\n const alpha = this.keywordWeight\n const results = [...combined.values()]\n .map(({ sparseScore, denseScore, result }) => ({\n ...result,\n score: (this.keywordWeight) * sparseScore + (this.vectorWeight) * denseScore,\n }))\n .sort((a, b) => b.score - a.score)\n .slice(0, topK)\n\n return results\n }\n\n async semanticSearch(query: string, topK = 5): Promise<SearchResult[]> {\n if (this.documents.size === 0) return []\n\n const cached = this.semanticCache.get(`${query}::${topK}`)\n if (cached) return cached\n\n const candidateCount = Math.max(topK * 2, 10)\n const hybridResults = await this.hybridSearch(query, candidateCount)\n\n if (!this.llmEngine || hybridResults.length <= topK) {\n const results = hybridResults.slice(0, topK)\n this.semanticCache.set(`${query}::${topK}`, results)\n return results\n }\n\n try {\n const docList = hybridResults.map((r, i) => `[${i}] ${r.content.slice(0, 200)}`).join(\"\\n\")\n const resp = await this.llmEngine.call({\n systemPrompt: \"You are a search relevance ranker. Given a query and a list of documents, rank the documents by relevance. Return ONLY a JSON array of document indices in descending relevance order (most relevant first), e.g. [3, 0, 7].\",\n userPrompt: `Query: \"${query}\"\\n\\nDocuments:\\n${docList}\\n\\nReturn indices sorted by relevance as JSON array.`,\n jsonMode: true,\n temperature: 0,\n maxTokens: 256,\n })\n\n const rankings: number[] = JSON.parse(resp.content)\n const reranked: SearchResult[] = []\n const seen = new Set<number>()\n\n for (const idx of rankings) {\n if (idx >= 0 && idx < hybridResults.length && !seen.has(idx)) {\n reranked.push({ ...hybridResults[idx], score: 1 - reranked.length / rankings.length })\n seen.add(idx)\n }\n }\n for (let i = 0; i < hybridResults.length; i++) {\n if (!seen.has(i)) reranked.push({ ...hybridResults[i], score: 0.1 })\n }\n\n const results = reranked.slice(0, topK)\n this.semanticCache.set(`${query}::${topK}`, results)\n return results\n } catch {\n const results = hybridResults.slice(0, topK)\n this.semanticCache.set(`${query}::${topK}`, results)\n return results\n }\n }\n\n searchByType(query: string, type: DocumentType, topK = 5): SearchResult[] {\n const results = this.search(query, topK * 2)\n return results.filter(r => r.metadata.type === type).slice(0, topK)\n }\n\n async semanticSearchByType(query: string, type: DocumentType, topK = 5): Promise<SearchResult[]> {\n const results = await this.semanticSearch(query, topK * 2)\n return results.filter(r => r.metadata.type === type).slice(0, topK)\n }\n\n removeDocument(id: string): boolean {\n const entry = this.documents.get(id)\n if (!entry) return false\n for (const t of entry.tfidf.keys()) {\n const prev = this.vocabulary.get(t)\n if (prev !== undefined) {\n if (prev <= 1) this.vocabulary.delete(t)\n else this.vocabulary.set(t, prev - 1)\n }\n }\n this.documents.delete(id)\n this.searchCache.clear()\n this.semanticCache.clear()\n return true\n }\n\n size(): number { return this.documents.size }\n clear(): void { this.documents.clear(); this.vocabulary.clear(); this.searchCache.clear(); this.semanticCache.clear() }\n clearCache(): void { this.searchCache.clear(); this.semanticCache.clear() }\n\n private tokenize(text: string): string[] {\n const stopWords = getStopWordSet(this.stopWordsLanguages)\n // Unicode-aware tokenizer: dukung semua script (Latin, Arab, CJK, dll)\n // \\p{L} = any Unicode letter, \\p{N} = any Unicode number\n return text.toLowerCase()\n .split(/[^\\p{L}\\p{N}_]+/u)\n .filter(t => t.length > 1 && !stopWords.has(t))\n }\n}\n\nfunction tokenFreqToTF(tokens: string[], tf: Map<string, number>): Map<string, number> {\n const len = tokens.length\n const result = new Map<string, number>()\n for (const [t, c] of tf) {\n result.set(t, c / len)\n }\n return result\n}\n", "export interface ModelStats {\n model: string\n totalCalls: number\n successCalls: number\n failedCalls: number\n hallucinationCount: number\n avgLatencyMs: number\n lastUsed: number\n consecutiveFailures: number\n consecutiveSuccesses: number\n quarantineUntil: number\n byTaskType?: Record<string, Omit<ModelStats, 'model' | 'byTaskType'>>\n}\n\nexport interface ModelScore {\n model: string\n reliability: number\n hallucinationRate: number\n totalCalls: number\n status: \"healthy\" | \"degraded\" | \"unstable\"\n}\n\nexport class ModelRegistry {\n private stats = new Map<string, ModelStats>()\n private modelAliases: Map<string, string[]> = new Map()\n\n private readonly maxConsecutiveFailures = 3\n\n constructor() {\n this.modelAliases.set(\"fast\", [])\n this.modelAliases.set(\"capable\", [])\n }\n\n registerAlias(alias: string, models: string[]): void {\n this.modelAliases.set(alias, models)\n }\n\n addModel(name: string): void {\n if (!this.stats.has(name)) {\n this.stats.set(name, {\n model: name,\n totalCalls: 0,\n successCalls: 0,\n failedCalls: 0,\n hallucinationCount: 0,\n avgLatencyMs: 0,\n lastUsed: 0,\n consecutiveFailures: 0,\n consecutiveSuccesses: 0,\n quarantineUntil: 0,\n byTaskType: {},\n })\n }\n }\n\n recordCall(model: string, success: boolean, latencyMs: number, taskType?: string): void {\n this.addModel(model)\n const stat = this.stats.get(model)!\n stat.totalCalls++\n stat.lastUsed = Date.now()\n\n if (success) {\n stat.successCalls++\n stat.consecutiveFailures = 0\n stat.consecutiveSuccesses++\n \n const score = this.getScore(model)\n if (stat.quarantineUntil > 0 && stat.consecutiveSuccesses >= 3 && stat.totalCalls >= 5 && score && score.hallucinationRate < 0.2) {\n stat.quarantineUntil = 0\n }\n } else {\n stat.failedCalls++\n stat.consecutiveFailures++\n stat.consecutiveSuccesses = 0\n \n if (stat.consecutiveFailures >= 5) {\n this.enterQuarantine(model, 30)\n }\n }\n\n stat.avgLatencyMs = stat.avgLatencyMs === 0\n ? latencyMs\n : (stat.avgLatencyMs * (stat.totalCalls - 1) + latencyMs) / stat.totalCalls\n\n // Record per-task-type stats if taskType provided\n if (taskType && stat.byTaskType) {\n if (!stat.byTaskType[taskType]) {\n stat.byTaskType[taskType] = {\n totalCalls: 0,\n successCalls: 0,\n failedCalls: 0,\n hallucinationCount: 0,\n avgLatencyMs: 0,\n lastUsed: 0,\n consecutiveFailures: 0,\n consecutiveSuccesses: 0,\n quarantineUntil: 0,\n }\n }\n const taskStat = stat.byTaskType[taskType]\n taskStat.totalCalls++\n taskStat.lastUsed = Date.now()\n if (success) {\n taskStat.successCalls++\n taskStat.consecutiveFailures = 0\n } else {\n taskStat.failedCalls++\n taskStat.consecutiveFailures++\n }\n taskStat.avgLatencyMs = taskStat.avgLatencyMs === 0\n ? latencyMs\n : (taskStat.avgLatencyMs * (taskStat.totalCalls - 1) + latencyMs) / taskStat.totalCalls\n }\n }\n\n recordHallucination(model: string): void {\n this.addModel(model)\n const stat = this.stats.get(model)!\n stat.hallucinationCount++\n }\n\n getScore(model: string): ModelScore | null {\n const stat = this.stats.get(model)\n if (!stat || stat.totalCalls === 0) {\n return {\n model,\n reliability: 0.5,\n hallucinationRate: 0,\n totalCalls: 0,\n status: \"healthy\",\n }\n }\n\n const successRate = stat.successCalls / stat.totalCalls\n const hallucinationRate = stat.hallucinationCount / stat.totalCalls\n const reliability = Math.max(0, Math.min(1, successRate - hallucinationRate * 2))\n\n let status: ModelScore[\"status\"] = \"healthy\"\n if (stat.consecutiveFailures >= this.maxConsecutiveFailures) status = \"degraded\"\n if (hallucinationRate > 0.3 || successRate < 0.4) status = \"unstable\"\n\n return { model, reliability, hallucinationRate, totalCalls: stat.totalCalls, status }\n }\n\n getScoreByTaskType(model: string, taskType: string): ModelScore | null {\n const stat = this.stats.get(model)\n if (!stat || !stat.byTaskType || !stat.byTaskType[taskType]) {\n return {\n model,\n reliability: 0.5,\n hallucinationRate: 0,\n totalCalls: 0,\n status: \"healthy\",\n }\n }\n\n const taskStat = stat.byTaskType[taskType]\n if (taskStat.totalCalls === 0) {\n return {\n model,\n reliability: 0.5,\n hallucinationRate: 0,\n totalCalls: 0,\n status: \"healthy\",\n }\n }\n\n const successRate = taskStat.successCalls / taskStat.totalCalls\n const hallucinationRate = taskStat.hallucinationCount / taskStat.totalCalls\n const reliability = Math.max(0, Math.min(1, successRate - hallucinationRate * 2))\n\n let status: ModelScore[\"status\"] = \"healthy\"\n if (taskStat.consecutiveFailures >= this.maxConsecutiveFailures) status = \"degraded\"\n if (hallucinationRate > 0.3 || successRate < 0.4) status = \"unstable\"\n\n return { model, reliability, hallucinationRate, totalCalls: taskStat.totalCalls, status }\n }\n\n getAllScores(): ModelScore[] {\n const models = new Set<string>()\n for (const key of this.stats.keys()) models.add(key)\n for (const [, aliases] of this.modelAliases) {\n for (const m of aliases) models.add(m)\n }\n return [...models].map(m => this.getScore(m)!).sort((a, b) => b.reliability - a.reliability)\n }\n\n resolveAlias(alias: string): string[] {\n return this.modelAliases.get(alias) ?? (alias ? [alias] : [])\n }\n\n suggestWithFallback(role: string, preferredModels: string[] = []): string[] {\n const candidates = new Set<string>()\n\n for (const m of preferredModels) {\n const resolved = this.resolveAlias(m)\n for (const r of resolved) if (r) candidates.add(r)\n }\n\n for (const key of this.stats.keys()) candidates.add(key)\n\n if (candidates.size === 0) return [\"default\"]\n\n const scored = [...candidates]\n .map(m => ({ model: m, score: this.getScore(m) }))\n .sort((a, b) => {\n if (!a.score || !b.score) return 0\n if (a.score.status === \"healthy\" && b.score.status !== \"healthy\") return -1\n if (a.score.status !== \"healthy\" && b.score.status === \"healthy\") return 1\n return b.score.reliability - a.score.reliability\n })\n\n return scored.map(s => s.model)\n }\n\n isBlocked(model: string, config: { hardBlockReliability: number; softBlockReliability: number; minSampleSize: number }): { blocked: boolean; reason: string; severity: \"hard\" | \"soft\" | null } {\n const stat = this.stats.get(model)\n if (!stat) return { blocked: false, reason: \"\", severity: null }\n\n if (stat.quarantineUntil > 0 && Date.now() < stat.quarantineUntil) {\n const remainingMinutes = Math.ceil((stat.quarantineUntil - Date.now()) / (60 * 1000))\n return { blocked: true, reason: `In quarantine for ${remainingMinutes} more minutes`, severity: \"hard\" }\n }\n\n if (stat.totalCalls < config.minSampleSize) {\n return { blocked: false, reason: \"\", severity: null }\n }\n\n const score = this.getScore(model)\n if (!score) return { blocked: false, reason: \"\", severity: null }\n\n if (score.reliability < config.hardBlockReliability) {\n return { blocked: true, reason: `Reliability ${(score.reliability * 100).toFixed(0)}% < ${(config.hardBlockReliability * 100).toFixed(0)}%`, severity: \"hard\" }\n }\n if (stat.consecutiveFailures >= 5) {\n return { blocked: true, reason: `${stat.consecutiveFailures} consecutive failures`, severity: \"hard\" }\n }\n if (score.hallucinationRate > 0.5) {\n return { blocked: true, reason: `Hallucination rate ${(score.hallucinationRate * 100).toFixed(0)}% > 50%`, severity: \"hard\" }\n }\n\n if (score.reliability < config.softBlockReliability) {\n return { blocked: true, reason: `Reliability ${(score.reliability * 100).toFixed(0)}% < ${(config.softBlockReliability * 100).toFixed(0)}%`, severity: \"soft\" }\n }\n\n return { blocked: false, reason: \"\", severity: null }\n }\n\n selectBestModel(\n taskType: string, \n availableModels: string[], \n blockingConfig?: { hardBlockReliability: number; softBlockReliability: number; minSampleSize: number }\n ): string {\n if (availableModels.length === 0) return \"default\"\n if (availableModels.length === 1) return availableModels[0]\n\n const scored = availableModels\n .map(model => {\n const resolvedModels = this.resolveAlias(model)\n if (resolvedModels.length === 0) return { model, score: null, blocked: false }\n \n const bestResolved = resolvedModels\n .map(m => {\n const blockStatus = blockingConfig \n ? this.isBlocked(m, blockingConfig)\n : { blocked: false, reason: \"\", severity: null }\n return { \n model: m, \n score: this.getScoreByTaskType(m, taskType),\n blocked: blockStatus.blocked && blockStatus.severity === \"hard\"\n }\n })\n .filter(s => !s.blocked)\n .sort((a, b) => {\n if (!a.score || !b.score) return 0\n if (a.score.status === \"healthy\" && b.score.status !== \"healthy\") return -1\n if (a.score.status !== \"healthy\" && b.score.status === \"healthy\") return 1\n return b.score.reliability - a.score.reliability\n })[0]\n \n return bestResolved\n })\n .filter(s => s && s.score !== null)\n .sort((a, b) => {\n if (!a.score || !b.score) return 0\n if (a.score.status === \"healthy\" && b.score.status !== \"healthy\") return -1\n if (a.score.status !== \"healthy\" && b.score.status === \"healthy\") return 1\n return b.score.reliability - a.score.reliability\n })\n\n return scored.length > 0 ? scored[0].model : availableModels[0]\n }\n\n selectWithFallback(\n taskType: string,\n availableModels: string[],\n blockingConfig: { hardBlockReliability: number; softBlockReliability: number; minSampleSize: number }\n ): { model: string; tier: \"healthy\" | \"degraded\" | \"unstable\" | \"reset\"; warnings: string[] } {\n if (availableModels.length === 0) {\n return { model: \"default\", tier: \"reset\", warnings: [\"No models available, using default\"] }\n }\n\n const warnings: string[] = []\n const categorized: { healthy: string[]; degraded: string[]; unstable: string[]; hardBlocked: string[] } = {\n healthy: [],\n degraded: [],\n unstable: [],\n hardBlocked: []\n }\n\n for (const model of availableModels) {\n const blockStatus = this.isBlocked(model, blockingConfig)\n if (blockStatus.blocked && blockStatus.severity === \"hard\") {\n categorized.hardBlocked.push(model)\n warnings.push(`${model}: HARD BLOCKED - ${blockStatus.reason}`)\n continue\n }\n\n const score = this.getScore(model)\n if (!score || score.totalCalls < blockingConfig.minSampleSize) {\n categorized.healthy.push(model)\n } else if (score.status === \"healthy\") {\n categorized.healthy.push(model)\n } else if (score.status === \"degraded\") {\n categorized.degraded.push(model)\n } else {\n categorized.unstable.push(model)\n }\n }\n\n if (categorized.healthy.length > 0) {\n return { model: categorized.healthy[0], tier: \"healthy\", warnings }\n }\n\n if (categorized.degraded.length > 0) {\n warnings.push(`Using degraded model ${categorized.degraded[0]} - all healthy models unavailable`)\n return { model: categorized.degraded[0], tier: \"degraded\", warnings }\n }\n\n if (categorized.unstable.length > 0) {\n warnings.push(`Using unstable model ${categorized.unstable[0]} - all healthy/degraded models unavailable`)\n return { model: categorized.unstable[0], tier: \"unstable\", warnings }\n }\n\n const leastBadModel = availableModels[0]\n this.resetModel(leastBadModel)\n warnings.push(`All models blocked - reset ${leastBadModel} and retrying`)\n return { model: leastBadModel, tier: \"reset\", warnings }\n }\n\n resetModel(model: string): void {\n const stat = this.stats.get(model)\n if (!stat) return\n \n stat.totalCalls = 0\n stat.successCalls = 0\n stat.failedCalls = 0\n stat.hallucinationCount = 0\n stat.consecutiveFailures = 0\n stat.byTaskType = {}\n }\n\n resetStaleModels(staleDays: number = 7): string[] {\n const now = Date.now()\n const staleThreshold = staleDays * 24 * 60 * 60 * 1000\n const resetModels: string[] = []\n\n for (const [model, stat] of this.stats.entries()) {\n if (stat.lastUsed > 0 && (now - stat.lastUsed) > staleThreshold) {\n this.resetModel(model)\n resetModels.push(model)\n }\n }\n\n return resetModels\n }\n\n enterQuarantine(model: string, durationMinutes: number = 30): void {\n const stat = this.stats.get(model)\n if (!stat) return\n \n stat.quarantineUntil = Date.now() + (durationMinutes * 60 * 1000)\n stat.consecutiveSuccesses = 0\n }\n\n getSummary(): string {\n const scores = this.getAllScores()\n if (scores.length === 0) return \"No model data recorded yet.\"\n\n return scores.map(s => {\n const icon = s.status === \"healthy\" ? \"\u2705\" : s.status === \"degraded\" ? \"\u26A0\uFE0F\" : \"\u274C\"\n return `${icon} **${s.model}** \u2014 reliability: ${(s.reliability * 100).toFixed(0)}%, hallucinations: ${(s.hallucinationRate * 100).toFixed(0)}%, calls: ${s.totalCalls}`\n }).join(\"\\n\")\n }\n\n toJSON(): Record<string, ModelStats> {\n return Object.fromEntries(this.stats)\n }\n\n fromJSON(data: Record<string, ModelStats>): void {\n for (const [key, val] of Object.entries(data)) {\n this.stats.set(key, val)\n }\n }\n}\n", "import { readFileSync, writeFileSync, mkdirSync, existsSync, watch } from \"node:fs\"\nimport { join } from \"node:path\"\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Schema\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface EmbeddingConfig {\n /** Model name, e.g. \"text-embedding-3-small\", \"nomic-embed-text\" */\n model: string\n /** Embedding endpoint \u2014 null berarti pakai base URL dari provider utama */\n endpoint: string | null\n /** API key \u2014 null berarti pakai key dari provider utama */\n apiKey: string | null\n}\n\nexport interface MemoryConfig {\n enabled: boolean\n /** \"lightweight\" (TF-IDF, no deps) | \"full\" (vector embedding) */\n mode: \"lightweight\" | \"full\"\n maxEntries: number\n compressThreshold: number\n forgetAfterDays: number\n /** ISO 639-3 language codes for stop word filtering */\n stopWordsLanguages: string[]\n search: {\n keywordWeight: number\n vectorWeight: number\n }\n}\n\nexport interface AgentConfig {\n maxDelegationDepth: number\n autoSkillExtract: boolean\n defaultRole: string\n requireSemanticCheck: boolean\n autoHallucinationCheck: boolean\n blockOnHallucination: boolean\n hallucinationThreshold: number\n hardBlockReliability: number\n softBlockReliability: number\n minSampleSize: number\n}\n\nexport interface StorageConfig {\n traceRetentionDays: number\n skillMaxCount: number\n}\n\nexport interface AgenticConfigSchema {\n $schema: string\n /** Embedding \u2014 null = lightweight mode */\n embedding: EmbeddingConfig | null\n memory: MemoryConfig\n agent: AgentConfig\n storage: StorageConfig\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Defaults\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const DEFAULT_CONFIG: AgenticConfigSchema = {\n $schema: \"v1\",\n embedding: null,\n memory: {\n enabled: true,\n mode: \"lightweight\",\n maxEntries: 1000,\n compressThreshold: 500,\n forgetAfterDays: 30,\n stopWordsLanguages: [\"ind\", \"eng\"],\n search: {\n keywordWeight: 0.3,\n vectorWeight: 0.7,\n },\n },\n agent: {\n maxDelegationDepth: 3,\n autoSkillExtract: true,\n defaultRole: \"developer\",\n requireSemanticCheck: false,\n autoHallucinationCheck: true,\n blockOnHallucination: false,\n hallucinationThreshold: 0.3,\n hardBlockReliability: 0.2,\n softBlockReliability: 0.4,\n minSampleSize: 5,\n },\n storage: {\n traceRetentionDays: 7,\n skillMaxCount: 200,\n },\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Loader\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class ConfigLoader {\n private config: AgenticConfigSchema\n private readonly configPath: string\n private readonly worktree: string\n private watcher: ReturnType<typeof watch> | null = null\n private listeners: Array<(config: AgenticConfigSchema) => void> = []\n\n constructor(worktree: string) {\n this.worktree = worktree || process.cwd()\n this.configPath = join(this.worktree, \".agentic\", \"config.json\")\n this.config = { ...DEFAULT_CONFIG }\n }\n\n /** Load config from file, auto-create default if missing */\n load(): AgenticConfigSchema {\n try {\n if (!existsSync(this.configPath)) {\n this.save(DEFAULT_CONFIG)\n this.config = { ...DEFAULT_CONFIG }\n return this.config\n }\n\n const raw = readFileSync(this.configPath, \"utf-8\")\n const parsed = JSON.parse(raw)\n\n // Merge with defaults (so new fields always have values)\n this.config = this.mergeDeep({ ...DEFAULT_CONFIG }, parsed)\n return this.config\n } catch {\n // Parse error \u2014 fallback ke default\n this.config = { ...DEFAULT_CONFIG }\n return this.config\n }\n }\n\n /** Save config to file */\n save(config: AgenticConfigSchema): void {\n const dir = join(this.worktree, \".agentic\")\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n writeFileSync(this.configPath, JSON.stringify(config, null, 2), \"utf-8\")\n this.config = { ...config }\n }\n\n /** Get current config */\n get(): AgenticConfigSchema {\n return this.config\n }\n\n /** Update specific keys and persist */\n update(partial: Partial<AgenticConfigSchema>): AgenticConfigSchema {\n this.config = this.mergeDeep(this.config, partial)\n this.save(this.config)\n return this.config\n }\n\n /** Watch config file for changes */\n startWatch(): void {\n if (this.watcher) return\n try {\n this.watcher = watch(this.configPath, (eventType) => {\n if (eventType === \"change\") {\n this.load()\n for (const listener of this.listeners) {\n listener(this.config)\n }\n }\n })\n } catch {\n // File not exist yet or permission denied \u2014 skip watching\n }\n }\n\n /** Stop watching and clear all listeners */\n stopWatch(): void {\n if (this.watcher) {\n this.watcher.close()\n this.watcher = null\n }\n this.listeners = []\n }\n\n /** Listen for config changes. Returns an unsubscribe function. */\n onChange(listener: (config: AgenticConfigSchema) => void): () => void {\n this.listeners.push(listener)\n return () => {\n const idx = this.listeners.indexOf(listener)\n if (idx !== -1) this.listeners.splice(idx, 1)\n }\n }\n\n /** Check if full embedding is configured */\n hasEmbedding(): boolean {\n return this.config.embedding != null && !!this.config.embedding.model\n }\n\n /** Get effective memory mode \u2014 auto-switch to \"full\" if embedding configured */\n effectiveMemoryMode(): \"lightweight\" | \"full\" {\n if (this.hasEmbedding()) return \"full\"\n return this.config.memory.mode\n }\n\n /** Deep merge helper (simple version, no array merge) */\n private mergeDeep<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const result = { ...target }\n for (const key of Object.keys(source) as Array<keyof T>) {\n const val = source[key]\n if (val !== undefined && val !== null && typeof val === \"object\" && !Array.isArray(val)) {\n result[key] = this.mergeDeep(result[key] as Record<string, any>, val as Record<string, any>) as T[keyof T]\n } else if (val !== undefined) {\n result[key] = val as T[keyof T]\n }\n }\n return result\n }\n}\n", "/**\n * PatternDiscovery \u2014 cross-session pattern analysis for self-evolving agents.\n *\n * Analyzes episodic memory, error history, file changes, and skill usage\n * across sessions to identify recurring issues, systemic improvements,\n * and actionable recommendations.\n *\n * Aligns with the paper's vision of agents that learn from collective\n * experience rather than operating in isolation.\n */\n\nimport type { Episode } from \"../memory/episodic-store.js\"\nimport type { StepResult } from \"../evolution/continuous-evolution.js\"\n\n// \u2500\u2500 Interfaces \u2500\u2500\n\nexport interface ErrorPattern {\n /** Error category (compile, type, import, test, runtime) */\n category: string\n /** Number of distinct sessions where this error occurred */\n sessionCount: number\n /** Total occurrences across all sessions */\n totalOccurrences: number\n /** Percentage of sessions that experienced this error */\n sessionAffinity: number\n /** Most recent occurrence timestamp */\n lastOccurrence: string\n /** Actionable suggestion */\n suggestion: string\n /** Example session IDs */\n sampleSessions: string[]\n}\n\nexport interface FilePattern {\n /** File path (relative) */\n filePath: string\n /** Number of sessions where this file was modified */\n sessionCount: number\n /** Total modifications across sessions */\n totalChanges: number\n /** Files frequently changed together with this one (co-change frequency) */\n coChangedFiles: Array<{ filePath: string; coOccurrences: number }>\n /** Whether this file is a \"hot spot\" (frequently changed, high risk) */\n isHotSpot: boolean\n /** Suggestion */\n suggestion: string\n}\n\nexport interface SessionOutcomePattern {\n /** Description of the pattern */\n description: string\n /** Outcome statistics for sessions matching this pattern */\n outcomeStats: { total: number; success: number; partial: number; failed: number }\n /** Number of sessions matching */\n matchingSessions: number\n /** Success rate among matching sessions */\n successRate: number\n /** Tags or characteristics common to these sessions */\n commonTags: string[]\n /** Trend over time */\n trend: \"improving\" | \"degrading\" | \"stable\"\n /** Actionable insight */\n insight: string\n}\n\nexport interface SkillEffectiveness {\n /** Skill name */\n skillName: string\n /** Current success rate (0-1) */\n successRate: number\n /** Usage count */\n usageCount: number\n /** Success rate trend: recent 5 vs overall */\n recentTrend: \"improving\" | \"degrading\" | \"stable\" | \"insufficient_data\"\n /** Whether this skill should be reviewed or promoted */\n status: \"healthy\" | \"needs_review\" | \"underperforming\" | \"highly_effective\"\n /** Suggestion */\n suggestion: string\n}\n\nexport interface Recommendation {\n /** Priority level */\n priority: \"high\" | \"medium\" | \"low\"\n /** Category of recommendation */\n category: \"error_prevention\" | \"architecture\" | \"testing\" | \"process\" | \"skill\" | \"infrastructure\"\n /** Human-readable description */\n description: string\n /** Concrete action to take */\n action: string\n /** Number of sessions affected by this issue */\n affectedSessions: number\n}\n\nexport interface PatternReport {\n /** When the analysis was generated */\n timestamp: string\n /** Number of sessions analyzed */\n totalSessions: number\n /** Error patterns found */\n errorPatterns: ErrorPattern[]\n /** File change patterns found */\n filePatterns: FilePattern[]\n /** Session outcome patterns found */\n sessionPatterns: SessionOutcomePattern[]\n /** Skill effectiveness analysis */\n skillEffectiveness: SkillEffectiveness[]\n /** Actionable recommendations */\n recommendations: Recommendation[]\n}\n\n// \u2500\u2500 PatternDiscovery Class \u2500\u2500\n\nexport class PatternDiscovery {\n /**\n * Generate a comprehensive pattern report from session data.\n *\n * @param episodes All recorded episodes (cross-session memory)\n * @param stepResults Step execution results (from ContinuousEvolution)\n * @param skills Known skills with usage stats\n * @param options Analysis options\n */\n analyze(\n episodes: Episode[],\n stepResults: StepResult[] = [],\n skills: Array<{ name: string; successRate: number; usageCount: number }> = [],\n options: { minSessions?: number; hotSpotThreshold?: number } = {},\n ): PatternReport {\n const minSessions = options.minSessions ?? 2\n const hotSpotThreshold = options.hotSpotThreshold ?? 3\n const sessionIds = [...new Set(episodes.map(e => e.sessionId))]\n\n const errorPatterns = this.analyzeErrors(episodes, stepResults, sessionIds, minSessions)\n const filePatterns = this.analyzeFiles(episodes, sessionIds, hotSpotThreshold)\n const sessionPatterns = this.analyzeSessionOutcomes(episodes, sessionIds)\n const skillEffectiveness = this.analyzeSkills(skills)\n const recommendations = this.generateRecommendations({\n errorPatterns,\n filePatterns,\n sessionPatterns,\n skillEffectiveness,\n episodes,\n sessionIds,\n })\n\n return {\n timestamp: new Date().toISOString(),\n totalSessions: sessionIds.length,\n errorPatterns,\n filePatterns,\n sessionPatterns,\n skillEffectiveness,\n recommendations,\n }\n }\n\n // \u2500\u2500 Error Pattern Analysis \u2500\u2500\n\n private analyzeErrors(\n episodes: Episode[],\n stepResults: StepResult[],\n sessionIds: string[],\n minSessions: number,\n ): ErrorPattern[] {\n // Collect error categories from step results\n const errorByCategory = new Map<string, {\n sessions: Set<string>\n count: number\n lastTimestamp: number\n }>()\n\n for (const r of stepResults) {\n if (r.success) continue\n const cat = r.category ?? \"unknown\"\n let entry = errorByCategory.get(cat)\n if (!entry) {\n entry = { sessions: new Set(), count: 0, lastTimestamp: 0 }\n errorByCategory.set(cat, entry)\n }\n entry.sessions.add(r.sessionId)\n entry.count++\n if (r.timestamp > entry.lastTimestamp) entry.lastTimestamp = r.timestamp\n }\n\n // Also infer errors from failed episodes\n for (const ep of episodes) {\n if (ep.outcome === \"failed\" || ep.outcome === \"partial\") {\n // Try to extract error category from plan goal\n const goal = ep.planGoal.toLowerCase()\n const inferredCat = this.inferCategory(goal)\n if (inferredCat) {\n let entry = errorByCategory.get(inferredCat)\n if (!entry) {\n entry = { sessions: new Set(), count: 0, lastTimestamp: 0 }\n errorByCategory.set(inferredCat, entry)\n }\n entry.sessions.add(ep.sessionId)\n entry.count++\n }\n }\n }\n\n const totalSessions = sessionIds.length\n const patterns: ErrorPattern[] = []\n\n for (const [category, data] of errorByCategory) {\n if (data.sessions.size < minSessions) continue\n\n patterns.push({\n category,\n sessionCount: data.sessions.size,\n totalOccurrences: data.count,\n sessionAffinity: totalSessions > 0 ? data.sessions.size / totalSessions : 0,\n lastOccurrence: new Date(data.lastTimestamp).toISOString(),\n suggestion: this.suggestErrorFix(category),\n sampleSessions: [...data.sessions].slice(0, 3),\n })\n }\n\n // Sort by session count descending\n patterns.sort((a, b) => b.sessionCount - a.sessionCount)\n return patterns\n }\n\n // \u2500\u2500 File Change Pattern Analysis \u2500\u2500\n\n private analyzeFiles(\n episodes: Episode[],\n sessionIds: string[],\n hotSpotThreshold: number,\n ): FilePattern[] {\n // Track file changes per session\n const fileSessions = new Map<string, Set<string>>() // filePath \u2192 Set<sessionId>\n const fileChanges = new Map<string, number>() // filePath \u2192 total changes\n const coChangeMatrix = new Map<string, Map<string, number>>() // filePath \u2192 { coFile \u2192 count }\n\n for (const ep of episodes) {\n const files = ep.filesChanged\n if (files.length === 0) continue\n\n for (const file of files) {\n // Track sessions per file\n let sessions = fileSessions.get(file)\n if (!sessions) {\n sessions = new Set()\n fileSessions.set(file, sessions)\n }\n sessions.add(ep.sessionId)\n\n // Track total changes\n fileChanges.set(file, (fileChanges.get(file) ?? 0) + 1)\n\n // Track co-changes\n for (const other of files) {\n if (other === file) continue\n let matrix = coChangeMatrix.get(file)\n if (!matrix) {\n matrix = new Map()\n coChangeMatrix.set(file, matrix)\n }\n matrix.set(other, (matrix.get(other) ?? 0) + 1)\n }\n }\n }\n\n const totalSessions = sessionIds.length\n const patterns: FilePattern[] = []\n\n for (const [filePath, sessions] of fileSessions) {\n if (sessions.size < 2) continue // skip files changed in only 1 session\n\n const coChanged: Array<{ filePath: string; coOccurrences: number }> = []\n const matrix = coChangeMatrix.get(filePath)\n if (matrix) {\n for (const [coFile, count] of matrix) {\n coChanged.push({ filePath: coFile, coOccurrences: count })\n }\n coChanged.sort((a, b) => b.coOccurrences - a.coOccurrences)\n }\n\n const totalChanges = fileChanges.get(filePath) ?? sessions.size\n\n patterns.push({\n filePath,\n sessionCount: sessions.size,\n totalChanges,\n coChangedFiles: coChanged.slice(0, 5), // top 5 co-changed\n isHotSpot: sessions.size >= hotSpotThreshold,\n suggestion: this.suggestFileAction(filePath, sessions.size, totalSessions, coChanged.length),\n })\n }\n\n // Sort: hot spots first, then by session count\n patterns.sort((a, b) => {\n if (a.isHotSpot && !b.isHotSpot) return -1\n if (!a.isHotSpot && b.isHotSpot) return 1\n return b.sessionCount - a.sessionCount\n })\n\n return patterns\n }\n\n // \u2500\u2500 Session Outcome Pattern Analysis \u2500\u2500\n\n private analyzeSessionOutcomes(\n episodes: Episode[],\n sessionIds: string[],\n ): SessionOutcomePattern[] {\n const patterns: SessionOutcomePattern[] = []\n\n if (sessionIds.length < 3) return patterns\n\n // Pattern 1: Sessions with many file changes tend to fail more\n const highChangeSessions = episodes.filter(e =>\n e.filesChanged.length >= 5 && sessionIds.includes(e.sessionId)\n )\n if (highChangeSessions.length >= 2) {\n const outcomes = this.countOutcomes(highChangeSessions)\n const successRate = outcomes.total > 0 ? outcomes.success / outcomes.total : 0\n patterns.push({\n description: \"High file churn sessions (>5 files changed) have lower success rates\",\n outcomeStats: outcomes,\n matchingSessions: highChangeSessions.length,\n successRate,\n commonTags: [\"high-churn\", \"large-change\"],\n trend: this.computeTrend(highChangeSessions),\n insight: successRate < 0.6\n ? \"Large changes tend to fail. Consider breaking into smaller, independent steps.\"\n : \"Large changes are handled well. Keep current decomposition strategy.\",\n })\n }\n\n // Pattern 2: Sessions with specific tags\n const tagGroups = this.groupByTags(episodes, sessionIds)\n for (const [tag, tagEpisodes] of tagGroups) {\n if (tagEpisodes.length < 2) continue\n const outcomes = this.countOutcomes(tagEpisodes)\n const successRate = outcomes.total > 0 ? outcomes.success / outcomes.total : 0\n patterns.push({\n description: `Sessions tagged \"${tag}\" have ${(successRate * 100).toFixed(0)}% success rate`,\n outcomeStats: outcomes,\n matchingSessions: tagEpisodes.length,\n successRate,\n commonTags: [tag],\n trend: this.computeTrend(tagEpisodes),\n insight: successRate < 0.5\n ? `Tasks involving \"${tag}\" frequently fail. Consider adding targeted verification or pre-checks.`\n : `Tasks involving \"${tag}\" perform well. Consider extracting as a reusable pattern.`,\n })\n }\n\n // Pattern 3: Sessions with \"refactor\" or \"migration\" in goal\n const refactorSessions = episodes.filter(e =>\n (e.planGoal.toLowerCase().includes(\"refactor\") ||\n e.planGoal.toLowerCase().includes(\"migrate\") ||\n e.planGoal.toLowerCase().includes(\"extract\")) &&\n sessionIds.includes(e.sessionId)\n )\n if (refactorSessions.length >= 2) {\n const outcomes = this.countOutcomes(refactorSessions)\n patterns.push({\n description: \"Refactoring/migration sessions have mixed outcomes\",\n outcomeStats: outcomes,\n matchingSessions: refactorSessions.length,\n successRate: outcomes.total > 0 ? outcomes.success / outcomes.total : 0,\n commonTags: [\"refactor\", \"migration\"],\n trend: this.computeTrend(refactorSessions),\n insight: \"Refactoring tasks benefit from pre-change baseline tests and incremental commits.\",\n })\n }\n\n return patterns\n }\n\n // \u2500\u2500 Skill Effectiveness Analysis \u2500\u2500\n\n private analyzeSkills(\n skills: Array<{ name: string; successRate: number; usageCount: number }>,\n ): SkillEffectiveness[] {\n return skills.map(skill => {\n // Determine status based on success rate and usage\n let status: SkillEffectiveness[\"status\"]\n let suggestion: string\n\n if (skill.usageCount === 0) {\n status = \"needs_review\"\n suggestion = \"Skill has not been used yet. Consider testing with a suitable task.\"\n } else if (skill.successRate >= 0.9 && skill.usageCount >= 3) {\n status = \"highly_effective\"\n suggestion = \"Highly reliable skill. Consider marking as a 'trusted' pattern for auto-delegation.\"\n } else if (skill.successRate >= 0.7) {\n status = \"healthy\"\n suggestion = \"Skill performs well. Continue monitoring.\"\n } else if (skill.successRate >= 0.4) {\n status = \"needs_review\"\n suggestion = `Success rate is ${(skill.successRate * 100).toFixed(0)}%. Review the skill steps for edge cases or missing preconditions.`\n } else {\n status = \"underperforming\"\n suggestion = `Success rate is critically low (${(skill.successRate * 100).toFixed(0)}%). Consider retiring and replacing with a more reliable pattern.`\n }\n\n // Determine recent trend based on mock data or mark as insufficient\n const recentTrend: SkillEffectiveness[\"recentTrend\"] =\n skill.usageCount < 3 ? \"insufficient_data\" : skill.successRate >= 0.8 ? \"improving\" : skill.successRate >= 0.5 ? \"stable\" : \"degrading\"\n\n return {\n skillName: skill.name,\n successRate: skill.successRate,\n usageCount: skill.usageCount,\n recentTrend,\n status,\n suggestion,\n }\n })\n }\n\n // \u2500\u2500 Recommendation Engine \u2500\u2500\n\n private generateRecommendations(context: {\n errorPatterns: ErrorPattern[]\n filePatterns: FilePattern[]\n sessionPatterns: SessionOutcomePattern[]\n skillEffectiveness: SkillEffectiveness[]\n episodes: Episode[]\n sessionIds: string[]\n }): Recommendation[] {\n const recs: Recommendation[] = []\n\n // Error-based recommendations\n for (const ep of context.errorPatterns) {\n if (ep.sessionAffinity >= 0.5) {\n recs.push({\n priority: \"high\",\n category: \"error_prevention\",\n description: `\"${ep.category}\" error occurs in ${(ep.sessionAffinity * 100).toFixed(0)}% of sessions (${ep.sessionCount}/${context.sessionIds.length})`,\n action: ep.suggestion,\n affectedSessions: ep.sessionCount,\n })\n } else if (ep.sessionAffinity >= 0.3) {\n recs.push({\n priority: \"medium\",\n category: \"error_prevention\",\n description: `\"${ep.category}\" error is recurring (${ep.sessionCount} sessions)`,\n action: ep.suggestion,\n affectedSessions: ep.sessionCount,\n })\n }\n }\n\n // File hotspot recommendations\n for (const fp of context.filePatterns) {\n if (fp.isHotSpot && fp.coChangedFiles.length >= 3) {\n recs.push({\n priority: \"high\",\n category: \"architecture\",\n description: `Hot spot detected: \"${fp.filePath}\" modified in ${fp.sessionCount} sessions with ${fp.coChangedFiles.length} co-changed files`,\n action: `Consider refactoring \"${fp.filePath}\" into smaller modules to reduce coupling. Co-changed files: ${fp.coChangedFiles.slice(0, 3).map(c => `\"${c.filePath}\"`).join(\", \")}.`,\n affectedSessions: fp.sessionCount,\n })\n }\n }\n\n // Session outcome recommendations\n for (const sp of context.sessionPatterns) {\n if (sp.successRate < 0.5 && sp.matchingSessions >= 2) {\n recs.push({\n priority: \"high\",\n category: \"process\",\n description: sp.description,\n action: sp.insight,\n affectedSessions: sp.matchingSessions,\n })\n }\n }\n\n // Skill recommendations\n for (const sk of context.skillEffectiveness) {\n if (sk.status === \"underperforming\") {\n recs.push({\n priority: \"high\",\n category: \"skill\",\n description: `Skill \"${sk.skillName}\" is underperforming (${(sk.successRate * 100).toFixed(0)}% success)`,\n action: sk.suggestion,\n affectedSessions: sk.usageCount,\n })\n } else if (sk.status === \"highly_effective\" && sk.usageCount >= 3) {\n recs.push({\n priority: \"medium\",\n category: \"skill\",\n description: `Skill \"${sk.skillName}\" is highly effective (${(sk.successRate * 100).toFixed(0)}% success over ${sk.usageCount} uses)`,\n action: sk.suggestion,\n affectedSessions: sk.usageCount,\n })\n }\n }\n\n // Global observations\n if (context.sessionIds.length >= 3) {\n const recentEps = [...context.episodes]\n .sort((a, b) => b.timestamp.localeCompare(a.timestamp))\n .slice(0, Math.min(5, context.episodes.length))\n const recentSuccesses = recentEps.filter(e => e.outcome === \"success\").length\n const recentRate = recentEps.length > 0 ? recentSuccesses / recentEps.length : 0\n\n if (recentRate < 0.4 && recentEps.length >= 3) {\n recs.push({\n priority: \"high\",\n category: \"process\",\n description: \"Recent sessions show declining success rate\",\n action: \"Consider reviewing plan decomposition strategy. Are tasks too large? Are verification criteria clear?\",\n affectedSessions: recentEps.length,\n })\n }\n }\n\n // Sort by priority\n const priorityOrder = { high: 0, medium: 1, low: 2 }\n recs.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority])\n\n return recs\n }\n\n // \u2500\u2500 Helpers \u2500\u2500\n\n private inferCategory(text: string): string | null {\n const lower = text.toLowerCase()\n if (lower.includes(\"import\") || lower.includes(\"module\") || lower.includes(\"require\") || lower.includes(\"not found\")) return \"import\"\n if (lower.includes(\"type\") || lower.includes(\"assignable\") || lower.includes(\"interface\")) return \"type\"\n if (lower.includes(\"compile\") || lower.includes(\"syntax\") || lower.includes(\"build\") || lower.includes(\"tsc\")) return \"compile\"\n if (lower.includes(\"test\") || lower.includes(\"spec\") || lower.includes(\"assert\") || lower.includes(\"expect\")) return \"test\"\n if (lower.includes(\"runtime\") || lower.includes(\"undefined\") || lower.includes(\"null\") || lower.includes(\"error\") || lower.includes(\"exception\")) return \"runtime\"\n return null\n }\n\n private suggestErrorFix(category: string): string {\n const suggestions: Record<string, string> = {\n import: \"Add import path verification before execution. Check module existence and export names.\",\n type: \"Run TypeScript type-checker before implementation. Ensure interfaces match between modules.\",\n compile: \"Add incremental compilation checks. Verify syntax before full build.\",\n test: \"Improve test isolation. Ensure tests don't share mutable state. Add setup/teardown hooks.\",\n runtime: \"Add input validation and defensive checks. Consider adding try-catch at module boundaries.\",\n }\n return suggestions[category] ?? `Review ${category} error patterns and add targeted verification.`\n }\n\n private suggestFileAction(filePath: string, sessionCount: number, totalSessions: number, coChangeCount: number): string {\n const affinity = totalSessions > 0 ? (sessionCount / totalSessions * 100).toFixed(0) : \"?\"\n if (coChangeCount >= 3) {\n return `High coupling detected (${coChangeCount} co-changed files). \"${filePath}\" changes in ${affinity}% of sessions. Consider extracting stable interfaces.`\n }\n if (parseInt(affinity) > 50) {\n return `\"${filePath}\" is modified in ${affinity}% of sessions. High churn may indicate scope creep.`\n }\n return `\"${filePath}\" is a recurring change target (${sessionCount} sessions). Monitor for stability.`\n }\n\n private countOutcomes(episodes: Episode[]): { total: number; success: number; partial: number; failed: number } {\n return {\n total: episodes.length,\n success: episodes.filter(e => e.outcome === \"success\").length,\n partial: episodes.filter(e => e.outcome === \"partial\").length,\n failed: episodes.filter(e => e.outcome === \"failed\").length,\n }\n }\n\n private groupByTags(episodes: Episode[], sessionIds: string[]): Map<string, Episode[]> {\n const groups = new Map<string, Episode[]>()\n for (const ep of episodes) {\n if (!sessionIds.includes(ep.sessionId)) continue\n for (const tag of ep.tags) {\n let group = groups.get(tag)\n if (!group) {\n group = []\n groups.set(tag, group)\n }\n group.push(ep)\n }\n }\n return groups\n }\n\n private computeTrend(episodes: Episode[]): \"improving\" | \"degrading\" | \"stable\" {\n if (episodes.length < 4) return \"stable\"\n\n const sorted = [...episodes].sort((a, b) => a.timestamp.localeCompare(b.timestamp))\n const mid = Math.floor(sorted.length / 2)\n const firstHalf = sorted.slice(0, mid)\n const secondHalf = sorted.slice(mid)\n\n const firstSuccess = firstHalf.filter(e => e.outcome === \"success\").length / firstHalf.length\n const secondSuccess = secondHalf.filter(e => e.outcome === \"success\").length / secondHalf.length\n\n if (secondSuccess > firstSuccess + 0.1) return \"improving\"\n if (secondSuccess < firstSuccess - 0.1) return \"degrading\"\n return \"stable\"\n }\n}\n", "// src/evaluation/live-evaluator.ts \u2014 Real-time evaluation score\n// Mengukur performa agent secara live dari aktivitas sesi nyata,\n// mirip metrik SWE-bench (task success) dan EvoClaw (continuous evolution).\n//\n// Bobot:\n// taskSuccess: 40% \u2014 % step yang sukses\n// errorRecovery: 20% \u2014 % error yang pulih setelah retry\n// contextStability: 15% \u2014 konsistensi navigasi file\n// multiAgent: 15% \u2014 % delegasi sukses\n// skillReuse: 10% \u2014 skill ditemukan & dipakai ulang\n\nexport interface LiveEvalDimension {\n score: number // 0-1\n weight: number // bobot kontribusi ke overall\n target: number // target minimal (0-1)\n detail: string // human-readable\n}\n\nexport interface LiveEvalScore {\n overall: number // 0-100\n dimensions: Record<string, LiveEvalDimension>\n totalSteps: number\n totalErrors: number\n recoveredErrors: number\n totalDelegations: number\n successfulDelegations: number\n /**\n * SWE-bench-style: berapa % task yang success dari total\n * EvoClaw-style: composite weighted score\n */\n sweBenchScore: number // task success rate (0-100)\n evoClawScore: number // composite score (0-100)\n}\n\nexport class LiveEvaluator {\n private stepResults: Array<{ stepId: string; success: boolean; sessionId?: string }> = []\n private errorRecoveries: Array<{ errorId: string; recovered: boolean }> = []\n private navigations: Array<{ query: string; resultsCount: number; focused: boolean }> = []\n private delegations: Array<{ taskId: string; role: string; success: boolean }> = []\n private skillLookups: Array<{ found: boolean }> = []\n\n // \u2500\u2500 Feed methods \u2500\u2500\n\n feedStepResult(step: { stepId: string; success: boolean; sessionId?: string }): void {\n this.stepResults.push(step)\n }\n\n feedErrorRecovery(errorId: string, recovered: boolean): void {\n this.errorRecoveries.push({ errorId, recovered })\n }\n\n feedNavigation(query: string, resultsCount: number): void {\n this.navigations.push({ query, resultsCount, focused: resultsCount > 0 && resultsCount <= 10 })\n }\n\n feedDelegation(taskId: string, role: string, success: boolean): void {\n this.delegations.push({ taskId, role, success })\n }\n\n feedSkillLookup(found: boolean): void {\n this.skillLookups.push({ found })\n }\n\n // \u2500\u2500 Compute methods \u2500\u2500\n\n /**\n * Task success rate (SWE-bench style).\n * Berapa % step yang sukses dari total.\n */\n computeTaskSuccess(): number {\n const total = this.stepResults.length\n if (total === 0) return 0\n const successes = this.stepResults.filter(s => s.success).length\n return successes / total\n }\n\n /**\n * Error recovery rate.\n * Berapa % error yang berhasil pulih (retry sukses setelah error).\n */\n computeErrorRecovery(): number {\n const total = this.errorRecoveries.length\n if (total === 0) return 1 // no errors = perfect recovery\n const recovered = this.errorRecoveries.filter(e => e.recovered).length\n return recovered / total\n }\n\n /**\n * Context stability score.\n * Navigasi yang fokus (\u226410 results) mengindikasikan pemahaman codebase yang baik.\n */\n computeContextStability(): number {\n const total = this.navigations.length\n if (total === 0) return 1 // no nav = stable (nothing drifted)\n const focused = this.navigations.filter(n => n.focused).length\n return focused / total\n }\n\n /**\n * Multi-agent coordination rate.\n * Berapa % delegasi yang sukses.\n */\n computeMultiAgent(): number {\n const total = this.delegations.length\n if (total === 0) return 1 // no delegation = not relevant\n const successes = this.delegations.filter(d => d.success).length\n return successes / total\n }\n\n /**\n * Skill reuse rate.\n * Berapa % lookup skill yang berhasil ditemukan.\n */\n computeSkillReuse(): number {\n const total = this.skillLookups.length\n if (total === 0) return 0.5 // neutral \u2014 no skill usage tracked\n const found = this.skillLookups.filter(s => s.found).length\n return found / total\n }\n\n /**\n * Compute overall live evaluation score.\n */\n computeScore(): LiveEvalScore {\n const taskSuccessScore = this.computeTaskSuccess()\n const errorRecoveryScore = this.computeErrorRecovery()\n const contextStabilityScore = this.computeContextStability()\n const multiAgentScore = this.computeMultiAgent()\n const skillReuseScore = this.computeSkillReuse()\n\n const dimensions: Record<string, LiveEvalDimension> = {\n taskSuccess: {\n score: taskSuccessScore,\n weight: 0.40,\n target: 0.80, // SWE-bench target\n detail: `${(taskSuccessScore * 100).toFixed(0)}% step success (target >80%)`,\n },\n errorRecovery: {\n score: errorRecoveryScore,\n weight: 0.20,\n target: 0.70,\n detail: `${(errorRecoveryScore * 100).toFixed(0)}% error recovery (target >70%)`,\n },\n contextStability: {\n score: contextStabilityScore,\n weight: 0.15,\n target: 0.80,\n detail: `${(contextStabilityScore * 100).toFixed(0)}% focused navigation (target >80%)`,\n },\n multiAgent: {\n score: multiAgentScore,\n weight: 0.15,\n target: 0.90,\n detail: `${(multiAgentScore * 100).toFixed(0)}% delegation success (target >90%)`,\n },\n skillReuse: {\n score: skillReuseScore,\n weight: 0.10,\n target: 0.50,\n detail: `${(skillReuseScore * 100).toFixed(0)}% skill found (target >50%)`,\n },\n }\n\n const overall = Object.values(dimensions).reduce((s, d) => s + d.score * d.weight, 0)\n const sweBenchScore = taskSuccessScore * 100\n const evoClawScore = overall * 100\n\n return {\n overall: Math.round(overall * 100),\n dimensions,\n totalSteps: this.stepResults.length,\n totalErrors: this.errorRecoveries.length,\n recoveredErrors: this.errorRecoveries.filter(e => e.recovered).length,\n totalDelegations: this.delegations.length,\n successfulDelegations: this.delegations.filter(d => d.success).length,\n sweBenchScore: Math.round(sweBenchScore),\n evoClawScore: Math.round(evoClawScore),\n }\n }\n\n /**\n * Generate human-readable report.\n */\n formatReport(includeTips = true): string {\n const score = this.computeScore()\n\n let out = `## \uD83D\uDCCA Live Evaluation Score\\n\\n`\n out += `**Overall:** ${score.overall}/100\\n`\n out += `**SWE-bench Score:** ${score.sweBenchScore}/100 (task success)\\n`\n out += `**EvoClaw Score:** ${score.evoClawScore}/100 (composite)\\n\\n`\n\n out += `### Dimensions\\n`\n for (const [name, dim] of Object.entries(score.dimensions)) {\n const bar = \"\u2588\".repeat(Math.round(dim.score * 20))\n const icon = dim.score >= dim.target ? \"\u2705\" : dim.score >= dim.target * 0.7 ? \"\u26A0\uFE0F\" : \"\u274C\"\n out += `${icon} **${name}:** ${(dim.score * 100).toFixed(0)}% ` +\n `${bar.padEnd(20, \"\u2591\")} ` +\n `(target: ${(dim.target * 100).toFixed(0)}%, weight: ${(dim.weight * 100).toFixed(0)}%)\\n`\n out += ` ${dim.detail}\\n`\n }\n\n out += `\\n### Activity\\n`\n out += `- **Steps:** ${score.totalSteps} | **Errors:** ${score.totalErrors} (${score.recoveredErrors} recovered)\\n`\n out += `- **Delegations:** ${score.totalDelegations} (${score.successfulDelegations} successful)\\n`\n\n if (includeTips && score.overall < 80) {\n out += `\\n### Tips\\n`\n if (score.dimensions.taskSuccess.score < 0.8) {\n out += `- \uD83D\uDD27 Task success rendah. Aktifkan \\`autoVerify\\` di agentic_execute.\\n`\n }\n if (score.dimensions.errorRecovery.score < 0.7) {\n out += `- \uD83D\uDD27 Error recovery rendah. Tambah retry steps atau refine error messages.\\n`\n }\n if (score.dimensions.contextStability.score < 0.8) {\n out += `- \uD83D\uDD27 Navigasi terlalu broad. Pakai \\`agentic_context\\` lebih sering.\\n`\n }\n if (score.dimensions.multiAgent.score < 0.9) {\n out += `- \uD83D\uDD27 Delegasi sering gagal. Cek role availability.\\n`\n }\n if (score.dimensions.skillReuse.score < 0.5) {\n out += `- \uD83D\uDD27 Skill jarang dipakai. Extract skill setelah task sukses via \\`agentic_skill extract\\`.\\n`\n }\n }\n\n return out\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;AACA,SAAS,YAAY;AACrB,SAAS,gBAAAA,eAAc,iBAAAC,gBAAe,aAAAC,YAAW,cAAAC,aAAY,eAAAC,cAAa,QAAQ,QAAQ,mBAAmB;AAC7G,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,qBAAqB;AAC9B,SAAS,cAAc;;;ACkBhB,IAAM,eAAN,MAAmB;AAAA,EACxB,WAAW,QAA0B;AACnC,UAAM,aAAa,OAAO,SAAS,UAAU,IAAI,QAC7C,OAAO,SAAS,UAAU,IAAI,WAC9B;AAEJ,UAAM,WAAqB,CAAC;AAC5B,QAAI,eAAe,QAAQ;AACzB,eAAS,KAAK,2DAA2D;AAAA,IAC3E;AACA,QAAI,OAAO,YAAY,WAAW,GAAG;AACnC,eAAS,KAAK,uDAAuD;AAAA,IACvE;AAEA,WAAO;AAAA,MACL;AAAA,MACA,gBAAgB,OAAO,SAAS;AAAA,MAChC;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,MAAsB;AACjC,UAAM,SAAmB,CAAC;AAC1B,UAAM,MAAM,IAAI,IAAI,KAAK,OAAO,SAAS,IAAI,OAAK,EAAE,EAAE,CAAC;AAEvD,eAAW,QAAQ,KAAK,OAAO,UAAU;AACvC,iBAAW,OAAO,KAAK,WAAW;AAChC,YAAI,CAAC,IAAI,IAAI,GAAG,GAAG;AACjB,iBAAO,KAAK,SAAS,KAAK,EAAE,8BAA8B,GAAG,GAAG;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAEA,QAAI,KAAK,OAAO,SAAS,WAAW,GAAG;AACrC,aAAO,KAAK,sBAAsB;AAAA,IACpC;AAEA,WAAO;AAAA,EACT;AACF;;;ACjCO,IAAM,WAAN,MAAe;AAAA,EACZ,aAAa;AAAA,EACb,SAAS,oBAAI,IAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASzC,gBAAgB,oBAAI,IAAoB;AAAA,IAC9C,CAAC,WAAW,CAAC;AAAA,IACb,CAAC,QAAQ,CAAC;AAAA,IACV,CAAC,QAAQ,CAAC;AAAA,IACV,CAAC,UAAU,CAAC;AAAA,IACZ,CAAC,WAAW,CAAC;AAAA,IACb,CAAC,WAAW,CAAC;AAAA,EACf,CAAC;AAAA;AAAA,EAGD,eAAe,UAAkB,YAA0B;AACzD,SAAK,cAAc,IAAI,UAAU,UAAU;AAAA,EAC7C;AAAA;AAAA,EAGA,cAAc,UAA2B;AACvC,QAAI,YAAY,KAAK,cAAc,IAAI,QAAQ,GAAG;AAChD,aAAO,KAAK,cAAc,IAAI,QAAQ;AAAA,IACxC;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,mBAAoE;AAClE,WAAO,CAAC,GAAG,KAAK,cAAc,QAAQ,CAAC,EACpC,IAAI,CAAC,CAAC,UAAU,UAAU,OAAO,EAAE,UAAU,WAAW,EAAE,EAC1D,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,QAAQ,CAAC;AAAA,EACxD;AAAA,EAEA,cAAc,WAAmB,MAA4B;AAC3D,UAAM,QAAwB;AAAA,MAC5B;AAAA,MACA,gBAAgB,oBAAI,IAAI;AAAA,MACxB,aAAa,oBAAI,IAAI;AAAA,MACrB,YAAY,oBAAI,IAAI;AAAA,MACpB,kBAAkB;AAAA,IACpB;AACA,SAAK,OAAO,IAAI,WAAW,KAAK;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,WAAmC;AAC7C,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,MAAO,QAAO;AAEnB,eAAW,QAAQ,MAAM,KAAK,OAAO,UAAU;AAC7C,UAAI,MAAM,eAAe,IAAI,KAAK,EAAE,EAAG;AACvC,UAAI,MAAM,YAAY,IAAI,KAAK,EAAE,EAAG;AAEpC,YAAM,UAAU,KAAK,UAAU,MAAM,OAAK,MAAM,eAAe,IAAI,CAAC,CAAC;AACrE,UAAI,SAAS;AACX,cAAM,mBAAmB,MAAM,KAAK,OAAO,SAAS,QAAQ,IAAI;AAChE,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,WAAoF;AAClG,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,UAAM,UAA2E,CAAC;AAClF,eAAW,QAAQ,MAAM,KAAK,OAAO,UAAU;AAC7C,UAAI,MAAM,eAAe,IAAI,KAAK,EAAE,EAAG;AACvC,UAAI,MAAM,YAAY,IAAI,KAAK,EAAE,EAAG;AACpC,YAAM,QAAQ,KAAK,UAAU,OAAO,OAAK,CAAC,MAAM,eAAe,IAAI,CAAC,CAAC;AACrE,UAAI,MAAM,SAAS,GAAG;AACpB,gBAAQ,KAAK,EAAE,IAAI,KAAK,IAAI,aAAa,KAAK,aAAa,WAAW,MAAM,CAAC;AAAA,MAC/E;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,WAAmB,QAA+B;AAC7D,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,MAAO;AAEZ,QAAI,YAAY,MAAM,WAAW,IAAI,OAAO,MAAM;AAClD,QAAI,CAAC,WAAW;AACd,kBAAY,EAAE,YAAY,GAAG,cAAc,CAAC,EAAE;AAC9C,YAAM,WAAW,IAAI,OAAO,QAAQ,SAAS;AAAA,IAC/C;AAEA,cAAU,SAAS;AAEnB,QAAI,OAAO,SAAS;AAClB,YAAM,eAAe,IAAI,OAAO,MAAM;AAAA,IACxC,OAAO;AACL,gBAAU;AACV,gBAAU,aAAa,KAAK;AAAA,QAC1B,OAAO,OAAO,SAAS;AAAA,QACvB,cAAc;AAAA,QACd,WAAW,KAAK,IAAI;AAAA,QACpB,SAAS;AAAA,MACX,CAAC;AAGD,YAAM,gBAAgB,KAAK,oBAAoB,OAAO,SAAS,OAAO,MAAM;AAC5E,YAAM,aAAa,KAAK,cAAc,aAAa;AAEnD,UAAI,UAAU,aAAa,YAAY;AACrC,cAAM,YAAY,OAAO,OAAO,MAAM;AAAA,MACxC,OAAO;AACL,cAAM,YAAY,IAAI,OAAO,QAAQ,OAAO,SAAS,gBAAgB,UAAU,4BAA4B,aAAa,EAAE;AAAA,MAC5H;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB,WAAmB,QAAgB,KAAa,SAAwB;AACvF,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,MAAO;AAEZ,UAAM,YAAY,MAAM,WAAW,IAAI,MAAM;AAC7C,QAAI,aAAa,UAAU,aAAa,SAAS,GAAG;AAClD,YAAM,OAAO,UAAU,aAAa,UAAU,aAAa,SAAS,CAAC;AACrE,WAAK,eAAe;AACpB,WAAK,UAAU;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,SAAS,WAAmB,QAAgB,UAA4B;AACtE,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,KAAK,MAAM,WAAW,IAAI,MAAM;AAGtC,QAAI,UAAU;AACZ,cAAQ,IAAI,cAAc,KAAK,KAAK,cAAc,QAAQ;AAAA,IAC5D;AAGA,QAAI,IAAI,QAAQ,OAAO;AACrB,YAAM,mBAAmB,KAAK,oBAAoB,GAAG,OAAO,KAAK;AACjE,cAAQ,IAAI,cAAc,KAAK,KAAK,cAAc,gBAAgB;AAAA,IACpE;AAEA,YAAQ,IAAI,cAAc,KAAK,KAAK;AAAA,EACtC;AAAA;AAAA,EAGQ,oBAAoB,WAA2B;AACrD,UAAM,QAAQ,UAAU,YAAY;AACpC,QAAI,MAAM,SAAS,oBAAoB,KAAK,MAAM,SAAS,kBAAkB,KAAK,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,SAAS,EAAG,QAAO;AAChJ,QAAI,MAAM,SAAS,MAAM,MAAM,MAAM,SAAS,gBAAgB,KAAK,MAAM,SAAS,eAAe,KAAK,MAAM,SAAS,UAAU,KAAK,MAAM,SAAS,gBAAgB,GAAI,QAAO;AAC9K,QAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,cAAc,KAAK,MAAM,SAAS,kBAAkB,EAAG,QAAO;AACvI,QAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,UAAU,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,SAAS,EAAG,QAAO;AACrJ,QAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,cAAc,KAAK,MAAM,SAAS,WAAW,KAAK,MAAM,SAAS,SAAS,EAAG,QAAO;AACpI,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,WAAmB,QAAwB;AACvD,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,MAAM,WAAW,IAAI,MAAM,GAAG,cAAc;AAAA,EACrD;AAAA,EAEA,kBAAkB,WAA6B;AAC7C,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,MAAO,QAAO,CAAC;AACpB,WAAO,CAAC,GAAG,MAAM,cAAc;AAAA,EACjC;AAAA,EAEA,aAAa,WAAmB,QAAuC;AACrE,WAAO,KAAK,OAAO,IAAI,SAAS,GAAG,WAAW,IAAI,MAAM;AAAA,EAC1D;AAAA,EAEA,WAAW,WAA4B;AACrC,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,MAAO,QAAO;AAEnB,WAAO,MAAM,KAAK,OAAO,SAAS;AAAA,MAChC,OAAK,MAAM,eAAe,IAAI,EAAE,EAAE,KAAK,MAAM,YAAY,IAAI,EAAE,EAAE;AAAA,IACnE;AAAA,EACF;AAAA,EAEA,UAAU,WAA4B;AACpC,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,MAAM,YAAY,SAAS;AAAA,EACpC;AAAA,EAEA,YAAY,WAA0F;AACpG,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,MAAO,QAAO,EAAE,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,EAAE;AAEnE,WAAO;AAAA,MACL,WAAW,MAAM,eAAe;AAAA,MAChC,OAAO,MAAM,KAAK,OAAO,SAAS;AAAA,MAClC,QAAQ,MAAM,YAAY;AAAA,MAC1B,SAAS,KAAK,gBAAgB,SAAS,EAAE;AAAA,IAC3C;AAAA,EACF;AAAA,EAEA,oBAAoB,WAA6B;AAC/C,UAAM,QAAQ,KAAK,OAAO,IAAI,SAAS;AACvC,QAAI,CAAC,MAAO,QAAO,CAAC;AACpB,UAAM,QAAQ,oBAAI,IAAY;AAC9B,eAAW,aAAa,MAAM,WAAW,OAAO,GAAG;AACjD,UAAI,UAAU,QAAQ,eAAe;AACnC,mBAAW,KAAK,UAAU,OAAO,cAAe,OAAM,IAAI,CAAC;AAAA,MAC7D;AAAA,IACF;AACA,WAAO,CAAC,GAAG,KAAK;AAAA,EAClB;AAAA,EAEA,cAAc,WAAyB;AACrC,SAAK,OAAO,OAAO,SAAS;AAAA,EAC9B;AACF;;;AC5PA,SAAS,oBAAoB;AAC7B,SAAS,YAAY,oBAAoB;AACzC,SAAS,eAAe;AAyBxB,IAAM,mBAA8D;AAAA,EAClE,YAAY;AAAA,IACV,YAAY,CAAC,SAAS,EAAE,KAAK,OAAO,MAAM,CAAC,OAAO,YAAY,YAAY,OAAO,GAAG,SAAS,IAAM;AAAA,IACnG,SAAS,CAAC,KAAK,YAAY;AACzB,YAAM,OAAO,CAAC,UAAU,OAAO,cAAc,SAAS;AACtD,UAAI,QAAS,MAAK,KAAK,MAAM,OAAO;AACpC,aAAO,EAAE,KAAK,OAAO,MAAM,SAAS,IAAM;AAAA,IAC5C;AAAA,IACA,UAAU,CAAC,OAAO,MAAM;AAAA,IACxB,cAAc,CAAC,YAAY,YAAY,aAAa,WAAW;AAAA,EACjE;AAAA,EACA,YAAY;AAAA,IACV,YAAY,CAAC,SAAS,EAAE,KAAK,QAAQ,MAAM,CAAC,MAAM,iBAAiB,GAAG,SAAS,IAAK;AAAA,IACpF,SAAS,CAAC,KAAK,YAAY;AACzB,YAAM,OAAO,CAAC,UAAU,OAAO,cAAc,SAAS;AACtD,UAAI,QAAS,MAAK,KAAK,MAAM,OAAO;AACpC,aAAO,EAAE,KAAK,OAAO,MAAM,SAAS,IAAM;AAAA,IAC5C;AAAA,IACA,UAAU,CAAC,OAAO,QAAQ,MAAM;AAAA,IAChC,cAAc,CAAC,YAAY,YAAY,aAAa,WAAW;AAAA,EACjE;AAAA,EACA,QAAQ;AAAA,IACN,YAAY,CAAC,SAAS,EAAE,KAAK,UAAU,MAAM,CAAC,MAAM,cAAc,MAAM,GAAG,GAAG,SAAS,IAAM;AAAA,IAC7F,SAAS,CAAC,KAAK,YAAY;AACzB,YAAM,OAAO,CAAC,MAAM,UAAU,IAAI;AAClC,UAAI,QAAS,MAAK,KAAK,OAAO;AAC9B,aAAO,EAAE,KAAK,UAAU,MAAM,SAAS,IAAM;AAAA,IAC/C;AAAA,IACA,UAAU,CAAC,KAAK;AAAA,IAChB,cAAc,CAAC,SAAS,UAAU;AAAA,EACpC;AAAA,EACA,IAAI;AAAA,IACF,YAAY,CAAC,SAAS,EAAE,KAAK,MAAM,MAAM,CAAC,OAAO,OAAO,GAAG,SAAS,IAAM;AAAA,IAC1E,SAAS,CAAC,KAAK,YAAY;AACzB,YAAM,OAAO,CAAC,QAAQ,SAAS,UAAU;AACzC,UAAI,QAAS,MAAK,KAAK,QAAQ,OAAO;AACtC,aAAO,EAAE,KAAK,MAAM,MAAM,SAAS,KAAO;AAAA,IAC5C;AAAA,IACA,UAAU,CAAC,KAAK;AAAA,IAChB,cAAc,CAAC,UAAU;AAAA,EAC3B;AAAA,EACA,MAAM;AAAA,IACJ,YAAY,CAAC,SAAS,EAAE,KAAK,SAAS,MAAM,CAAC,SAAS,SAAS,GAAG,SAAS,KAAO;AAAA,IAClF,SAAS,CAAC,KAAK,YAAY;AACzB,YAAM,OAAO,CAAC,MAAM;AACpB,UAAI,QAAS,MAAK,KAAK,OAAO;AAC9B,aAAO,EAAE,KAAK,SAAS,MAAM,SAAS,KAAO;AAAA,IAC/C;AAAA,IACA,UAAU,CAAC,KAAK;AAAA,IAChB,cAAc,CAAC,SAAS;AAAA,EAC1B;AAAA,EACA,SAAS;AAAA,IACP,YAAY,CAAC,SAAS,EAAE,KAAK,QAAQ,MAAM,CAAC,iBAAiB,GAAG,SAAS,IAAK;AAAA,IAC9E,SAAS,CAAC,SAAS,EAAE,KAAK,QAAQ,MAAM,CAAC,cAAc,GAAG,SAAS,IAAK;AAAA,IACxE,UAAU,CAAC;AAAA,IACX,cAAc,CAAC;AAAA,EACjB;AACF;AAEO,IAAM,WAAN,MAAe;AAAA,EACZ,eAAkC;AAAA,EAClC,MAAwB;AAAA,EAEhC,OAAO,KAAsB;AAC3B,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,SAAkB;AAChB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,MAAM,eAAe,QAAgB,QAAgB,cAAwB,YAA0C;AACrH,QAAI,CAAC,KAAK,KAAK;AACb,aAAO,EAAE,MAAM,YAAY,QAAQ,MAAM,QAAQ,oDAAoD;AAAA,IACvG;AAEA,UAAM,eAAuC,CAAC;AAC9C,eAAW,KAAK,cAAc;AAC5B,YAAM,UAAU,QAAQ,YAAY,CAAC;AACrC,UAAI;AACF,qBAAa,CAAC,IAAI,aAAa,SAAS,OAAO;AAAA,MACjD,QAAQ;AAAA,MAA8B;AAAA,IACxC;AAEA,QAAI,OAAO,KAAK,YAAY,EAAE,WAAW,GAAG;AAC1C,aAAO,EAAE,MAAM,YAAY,QAAQ,MAAM,QAAQ,4DAA4D;AAAA,IAC/G;AAEA,UAAM,aAAa,OAAO,QAAQ,YAAY,EAAE;AAAA,MAAI,CAAC,CAAC,MAAM,OAAO,MACjE,OAAO,IAAI;AAAA;AAAA,EAAa,QAAQ,MAAM,GAAG,GAAI,CAAC;AAAA;AAAA,IAChD,EAAE,KAAK,MAAM;AAEb,UAAM,OAAO,MAAM,KAAK,IAAI,KAAK;AAAA,MAC/B,cAAc;AAAA,MACd,YAAY;AAAA,EAAc,MAAM;AAAA;AAAA;AAAA,EAAyB,UAAU;AAAA;AAAA;AAAA,MACnE,UAAU;AAAA,MACV,aAAa;AAAA,IACf,CAAC;AAED,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,KAAK,OAAO;AACtC,YAAM,SAAS,MAAM,QAAQ,OAAO,WAAW,IAAI,OAAO,cAAc,CAAC;AACzE,YAAM,SAAS,OAAO,WAAW;AACjC,aAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,QAAQ,0BAA0B,SAAS,SAAS,cAAc;AAAA,aAAgB,OAAO,aAAa,KAAK;AAAA,EAAK,OAAO,SAAS,IAAI;AAAA,EAAY,OAAO,IAAI,CAAC,MAAc,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KAAK,EAAE;AAAA,MACvM;AAAA,IACF,QAAQ;AACN,aAAO,EAAE,MAAM,YAAY,QAAQ,MAAM,QAAQ,0BAA0B,KAAK,QAAQ,MAAM,GAAG,GAAG,CAAC,GAAG;AAAA,IAC1G;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,QAAgB,YAAoB,QAAiB,cAAyB,uBAAuB,OAAoC;AAC3J,UAAM,SAAwB;AAAA,MAC5B,KAAK,cAAc,UAAU;AAAA,IAC/B;AACA,QAAI,KAAK,iBAAiB,WAAW;AACnC,aAAO,KAAK,KAAK,WAAW,UAAU,CAAC;AAAA,IACzC;AACA,WAAO,KAAK,KAAK,YAAY,UAAU,CAAC;AAExC,QAAI,KAAK,OAAO,UAAU,gBAAgB,aAAa,SAAS,GAAG;AACjE,YAAM,WAAW,MAAM,KAAK,eAAe,QAAQ,QAAQ,cAAc,UAAU;AACnF,aAAO,KAAK,QAAQ;AAAA,IACtB,WAAW,wBAAwB,gBAAgB,aAAa,SAAS,GAAG;AAC1E,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,OAAO,OAAO,OAAK,CAAC,EAAE,MAAM,EAAE,IAAI,OAAK,EAAE,MAAM;AAC9D,WAAO,EAAE,QAAQ,OAAO,WAAW,GAAG,QAAQ,QAAQ,OAAO;AAAA,EAC/D;AAAA,EAEA,eAAe,YAAuC;AACpD,UAAM,SAA2D;AAAA,MAC/D,EAAE,MAAM,cAAc,MAAM,gBAAgB;AAAA,MAC5C,EAAE,MAAM,QAAQ,MAAM,aAAa;AAAA,MACnC,EAAE,MAAM,MAAM,MAAM,SAAS;AAAA,MAC7B,EAAE,MAAM,UAAU,MAAM,iBAAiB;AAAA,MACzC,EAAE,MAAM,UAAU,MAAM,WAAW;AAAA,MACnC,EAAE,MAAM,UAAU,MAAM,mBAAmB;AAAA,MAC3C,EAAE,MAAM,cAAc,MAAM,eAAe;AAAA,IAC7C;AAEA,eAAW,EAAE,MAAM,KAAK,KAAK,QAAQ;AACnC,UAAI,WAAW,QAAQ,YAAY,IAAI,CAAC,GAAG;AACzC,YAAI,SAAS,gBAAgB,WAAW,QAAQ,YAAY,eAAe,CAAC,GAAG;AAC7E,eAAK,eAAe;AACpB,iBAAO;AAAA,QACT;AACA,aAAK,eAAe;AACpB,eAAO;AAAA,MACT;AAAA,IACF;AAEA,SAAK,eAAe;AACpB,WAAO;AAAA,EACT;AAAA,EAEA,cAAiC;AAC/B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,cAAc,YAAiC;AAC7C,UAAM,OAAO,KAAK,iBAAiB,YAAY,KAAK,eAAe,UAAU,IAAI,KAAK;AACtF,UAAM,SAAS,iBAAiB,IAAI,KAAK,iBAAiB;AAC1D,UAAM,EAAE,KAAK,MAAM,QAAQ,IAAI,OAAO,WAAW,UAAU;AAE3D,QAAI;AACF,YAAM,SAAS,aAAa,KAAK,MAAM;AAAA,QACrC,KAAK;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC,CAAC;AACD,aAAO;AAAA,QACL,MAAM,WAAW,IAAI;AAAA,QACrB,QAAQ;AAAA,QACR,QAAQ,UAAU;AAAA,MACpB;AAAA,IACF,SAAS,GAAY;AACnB,YAAM,MAAM;AACZ,aAAO;AAAA,QACL,MAAM,WAAW,IAAI;AAAA,QACrB,QAAQ;AAAA,QACR,QAAQ,IAAI,UAAU,IAAI,UAAU,IAAI,WAAW;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,YAAoB,cAAc,IAAiB;AAC7D,UAAM,OAAO,KAAK,iBAAiB,YAAY,KAAK,eAAe,UAAU,IAAI,KAAK;AACtF,UAAM,SAAS,iBAAiB,IAAI,KAAK,iBAAiB;AAC1D,UAAM,EAAE,KAAK,MAAM,QAAQ,IAAI,OAAO,QAAQ,YAAY,WAAW;AAErE,QAAI;AACF,YAAM,SAAS,aAAa,KAAK,MAAM;AAAA,QACrC,KAAK;AAAA,QACL;AAAA,QACA,UAAU;AAAA,QACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC,CAAC;AACD,aAAO;AAAA,QACL,MAAM,cAAc,QAAQ,WAAW,KAAK,YAAY,IAAI;AAAA,QAC5D,QAAQ;AAAA,QACR,QAAQ,UAAU;AAAA,MACpB;AAAA,IACF,SAAS,GAAY;AACnB,YAAM,MAAM;AACZ,aAAO;AAAA,QACL,MAAM,cAAc,QAAQ,WAAW,KAAK,YAAY,IAAI;AAAA,QAC5D,QAAQ;AAAA,QACR,QAAQ,IAAI,UAAU,IAAI,UAAU,IAAI,WAAW;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,WAAW,YAAiC;AAC1C,UAAM,OAAO,KAAK,iBAAiB,YAAY,KAAK,eAAe,UAAU,IAAI,KAAK;AAEtF,UAAM,cAAmF;AAAA,MACvF,YAAY,EAAE,KAAK,OAAO,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE;AAAA,MAC3D,YAAY,EAAE,KAAK,OAAO,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE;AAAA,MAC3D,QAAQ,EAAE,KAAK,UAAU,MAAM,CAAC,MAAM,QAAQ,SAAS,GAAG,EAAE;AAAA,MAC5D,IAAI,EAAE,KAAK,iBAAiB,MAAM,CAAC,OAAO,OAAO,EAAE;AAAA,IACrD;AAEA,UAAM,SAAS,YAAY,IAAI;AAC/B,QAAI,CAAC,QAAQ;AACX,aAAO,EAAE,MAAM,QAAQ,IAAI,IAAI,QAAQ,MAAM,QAAQ,yCAAyC;AAAA,IAChG;AAEA,QAAI;AACF,YAAM,SAAS,aAAa,OAAO,KAAK,OAAO,MAAM;AAAA,QACnD,KAAK;AAAA,QACL,SAAS;AAAA,QACT,UAAU;AAAA,QACV,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC,CAAC;AACD,aAAO,EAAE,MAAM,QAAQ,IAAI,IAAI,QAAQ,MAAM,QAAQ,UAAU,cAAc;AAAA,IAC/E,SAAS,GAAY;AACnB,YAAM,MAAM;AACZ,aAAO;AAAA,QACL,MAAM,QAAQ,IAAI;AAAA,QAClB,QAAQ;AAAA,QACR,QAAQ,IAAI,UAAU,IAAI,UAAU,IAAI,WAAW;AAAA,MACrD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,QAAgB,YAAwC;AAChE,QAAI,KAAK,iBAAiB,UAAW,MAAK,eAAe,UAAU;AAEnE,UAAM,SAAS;AAAA,MACb,KAAK,cAAc,UAAU;AAAA,IAC/B;AACA,QAAI,KAAK,iBAAiB,WAAW;AACnC,aAAO,KAAK,KAAK,WAAW,UAAU,CAAC;AAAA,IACzC;AACA,WAAO,KAAK,KAAK,YAAY,UAAU,CAAC;AAExC,UAAM,SAAS,OAAO,OAAO,OAAK,CAAC,EAAE,MAAM,EAAE,IAAI,OAAK,EAAE,MAAM;AAE9D,WAAO;AAAA,MACL,QAAQ,OAAO,WAAW;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,QAAgB,YAAoB,cAA4C;AAC5F,QAAI,KAAK,iBAAiB,UAAW,MAAK,eAAe,UAAU;AACnE,UAAM,OAAO,KAAK;AAClB,UAAM,SAAS,iBAAiB,IAAI,KAAK,iBAAiB;AAE1D,UAAM,SAAwB,CAAC,KAAK,cAAc,UAAU,CAAC;AAE7D,UAAM,aAAa,CAAC,MAAuB,OAAO,aAAa,KAAK,SAAO;AACzE,UAAI,IAAI,WAAW,OAAO,GAAG;AAC3B,cAAMC,YAAW,EAAE,MAAM,GAAG,EAAE,IAAI,KAAK;AACvC,eAAOA,UAAS,WAAW,OAAO;AAAA,MACpC;AACA,UAAI,IAAI,WAAW,QAAQ,EAAG,QAAO,EAAE,SAAS,GAAG;AACnD,aAAO,EAAE,SAAS,GAAG;AAAA,IACvB,CAAC;AAED,UAAM,YAAY,aAAa,OAAO,OAAK,WAAW,CAAC,CAAC;AACxD,UAAM,cAAc,aAAa;AAAA,MAAO,OACtC,CAAC,WAAW,CAAC,KAAK,OAAO,SAAS,KAAK,SAAO,EAAE,SAAS,GAAG,CAAC;AAAA,IAC/D;AAEA,UAAM,oBAAoB,YAAY,QAAQ,OAAK;AACjD,YAAM,OAAO,EAAE,QAAQ,UAAU,EAAE;AACnC,YAAM,MAAM,KAAK,QAAQ,YAAY,EAAE;AACvC,YAAM,WAAW,KAAK,QAAQ,QAAQ,EAAE;AAExC,aAAO,OAAO,aAAa,QAAQ,SAAO;AACxC,YAAI,IAAI,WAAW,OAAO,GAAG;AAC3B,iBAAO,CAAC,GAAG,GAAG,SAAS,QAAQ,GAAG,OAAO,SAAS,CAAC,KAAK,KAAK,EAAE;AAAA,QACjE;AACA,YAAI,IAAI,SAAS,GAAG,GAAG;AACrB,iBAAO,CAAC,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,QACzB;AACA,eAAO,CAAC,GAAG,IAAI,GAAG,GAAG,EAAE;AAAA,MACzB,CAAC;AAAA,IACH,CAAC;AAED,UAAM,eAAe,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,WAAW,GAAG,iBAAiB,CAAC,CAAC;AAEtE,QAAI,aAAa,SAAS,GAAG;AAC3B,aAAO,KAAK;AAAA,QACV,MAAM,QAAQ,aAAa,MAAM;AAAA,QACjC,QAAQ;AAAA,QACR,QAAQ,uBAAuB,aAAa,KAAK,IAAI,CAAC;AAAA,MACxD,CAAC;AAAA,IACH;AAEA,QAAI,SAAS,WAAW;AACtB,aAAO,KAAK,KAAK,WAAW,UAAU,CAAC;AAAA,IACzC;AACA,WAAO,KAAK,KAAK,YAAY,UAAU,CAAC;AAExC,UAAM,SAAS,OAAO,OAAO,OAAK,CAAC,EAAE,MAAM,EAAE,IAAI,OAAK,EAAE,MAAM;AAC9D,WAAO;AAAA,MACL,QAAQ,OAAO,WAAW;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC5VO,IAAM,gBAAN,MAAoB;AAAA,EACjB,MAA+B;AAAA;AAAA,EAGvC,OAAO,KAA6B;AAClC,SAAK,MAAM;AAAA,EACb;AAAA;AAAA,EAGA,SAAkB;AAChB,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAQ,cAAsB,eAAwC;AACpE,UAAM,MAAM,aAAa,YAAY;AAErC,QAAI,IAAI,SAAS,oBAAoB,KAAK,IAAI,SAAS,kBAAkB,KAAK,IAAI,SAAS,mBAAmB,GAAG;AAC/G,YAAM,QAAQ,aAAa,MAAM,sBAAsB;AACvD,aAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,iBAAiB,cAAc,QAAQ,CAAC,KAAK,UAAU;AAAA,QACvD,cAAc,oFAAoF,QAAQ,CAAC,KAAK,EAAE;AAAA,QAClH,eAAe;AAAA,QACf,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,MAAM,MAAM,IAAI,SAAS,mBAAmB,KAAK,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,wBAAwB,IAAI;AACnI,aAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,eAAe;AAAA,QACf,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,UAAU,KAAK,IAAI,SAAS,oBAAoB,KAAK,IAAI,SAAS,cAAc,GAAG;AAClG,aAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,eAAe;AAAA,QACf,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,MAAM,MAAM,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,QAAQ,IAAI;AACxG,aAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,eAAe;AAAA,QACf,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,OAAO,MAAM,IAAI,SAAS,OAAO,KAAK,IAAI,SAAS,QAAQ,KAAK,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,MAAM,IAAI;AACnI,aAAO;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,iBAAiB;AAAA,QACjB,cAAc;AAAA,QACd,eAAe;AAAA,QACf,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,MACT,iBAAiB;AAAA,MACjB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,UAAU;AAAA,IACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YAAY,cAAsB,eAAiD;AAEvF,UAAM,aAAa,KAAK,QAAQ,cAAc,aAAa;AAC3D,QAAI,WAAW,aAAa,aAAa,CAAC,KAAK,KAAK;AAClD,aAAO;AAAA,IACT;AAGA,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,IAAI,KAAK;AAAA,QAC/B,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAUd,YAAY;AAAA;AAAA,EAElB,aAAa,MAAM,GAAG,GAAI,CAAC;AAAA;AAAA;AAAA;AAAA,EAI3B,cAAc,IAAI,OAAK,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,QACrC,aAAa;AAAA,MACf,CAAC;AAED,YAAM,UAAU,KAAK,QAAQ,KAAK;AAClC,YAAM,YAAY,QAAQ,MAAM,aAAa;AAC7C,UAAI,WAAW;AACb,cAAM,SAAS,KAAK,MAAM,UAAU,CAAC,CAAC;AACtC,cAAM,kBAAkB,CAAC,WAAW,QAAQ,QAAQ,UAAU,WAAW,SAAS;AAClF,eAAO;AAAA,UACL,UAAU,gBAAgB,SAAS,OAAO,QAAQ,IAAI,OAAO,WAAW;AAAA,UACxE,SAAS,OAAO,WAAW;AAAA,UAC3B,iBAAiB,OAAO,mBAAmB,OAAO,aAAa;AAAA,UAC/D,cAAc,OAAO,gBAAgB,OAAO,OAAO;AAAA,UACnD,eAAe;AAAA,UACf,UAAU,CAAC,OAAO,UAAU,QAAQ,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,OAAO,WAAW;AAAA,QAChG;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AACF;;;AClJO,IAAM,UAAN,MAAc;AAAA,EACX,QAA6B;AAAA,IACnC;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,WAAW,aAAa,UAAU,QAAQ,YAAY,KAAK;AAAA,MACtE,UAAU,CAAC,SAAiB;AAAA,QAC1B,EAAE,IAAI,cAAc,aAAa,iDAAiD,WAAW,CAAC,GAAG,sBAAsB,CAAC,gBAAgB,EAAE;AAAA,QAC1I,EAAE,IAAI,aAAa,aAAa,cAAc,IAAI,IAAI,WAAW,CAAC,YAAY,GAAG,sBAAsB,CAAC,YAAY,EAAE;AAAA,QACtH,EAAE,IAAI,cAAc,aAAa,kCAAkC,WAAW,CAAC,WAAW,GAAG,sBAAsB,CAAC,gBAAgB,EAAE;AAAA,MACxI;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,OAAO,SAAS,SAAS,SAAS,QAAQ;AAAA,MACrD,UAAU,CAAC,SAAiB;AAAA,QAC1B,EAAE,IAAI,aAAa,aAAa,4CAA4C,WAAW,CAAC,GAAG,sBAAsB,CAAC,2BAA2B,EAAE;AAAA,QAC/I,EAAE,IAAI,YAAY,aAAa,sCAAsC,IAAI,IAAI,WAAW,CAAC,WAAW,GAAG,sBAAsB,CAAC,yBAAyB,EAAE;AAAA,QACzJ,EAAE,IAAI,kBAAkB,aAAa,gDAAgD,WAAW,CAAC,UAAU,GAAG,sBAAsB,CAAC,gBAAgB,EAAE;AAAA,MACzJ;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,YAAY,WAAW,WAAW,QAAQ,QAAQ;AAAA,MAC7D,UAAU,CAAC,SAAiB;AAAA,QAC1B,EAAE,IAAI,kBAAkB,aAAa,0DAA0D,WAAW,CAAC,GAAG,sBAAsB,CAAC,wBAAwB,EAAE;AAAA,QAC/J,EAAE,IAAI,oBAAoB,aAAa,4BAA4B,IAAI,IAAI,WAAW,CAAC,gBAAgB,GAAG,sBAAsB,CAAC,kBAAkB,EAAE;AAAA,QACrJ,EAAE,IAAI,oBAAoB,aAAa,yCAAyC,WAAW,CAAC,kBAAkB,GAAG,sBAAsB,CAAC,gBAAgB,YAAY,EAAE;AAAA,MACxK;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,QAAQ,QAAQ,YAAY,QAAQ;AAAA,MAC/C,UAAU,CAAC,SAAiB;AAAA,QAC1B,EAAE,IAAI,cAAc,aAAa,+CAA+C,WAAW,CAAC,GAAG,sBAAsB,CAAC,0BAA0B,EAAE;AAAA,QAClJ,EAAE,IAAI,cAAc,aAAa,gBAAgB,IAAI,IAAI,WAAW,CAAC,YAAY,GAAG,sBAAsB,CAAC,gBAAgB,EAAE;AAAA,QAC7H,EAAE,IAAI,eAAe,aAAa,+CAA+C,WAAW,CAAC,YAAY,GAAG,sBAAsB,CAAC,oBAAoB,EAAE;AAAA,MAC3J;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,UAAU,WAAW,WAAW,UAAU,MAAM;AAAA,MAC3D,UAAU,CAAC,SAAiB;AAAA,QAC1B,EAAE,IAAI,gBAAgB,aAAa,4CAA4C,WAAW,CAAC,GAAG,sBAAsB,CAAC,UAAU,EAAE;AAAA,QACjI,EAAE,IAAI,gBAAgB,aAAa,+BAA+B,IAAI,IAAI,WAAW,CAAC,cAAc,GAAG,sBAAsB,CAAC,gBAAgB,EAAE;AAAA,QAChJ,EAAE,IAAI,kBAAkB,aAAa,oCAAoC,WAAW,CAAC,cAAc,GAAG,sBAAsB,CAAC,gBAAgB,EAAE;AAAA,MACjJ;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,WAAW,WAAW,UAAU,QAAQ,YAAY;AAAA,MAC/D,UAAU,CAAC,SAAiB;AAAA,QAC1B,EAAE,IAAI,iBAAiB,aAAa,4CAA4C,WAAW,CAAC,GAAG,sBAAsB,CAAC,6BAA6B,EAAE;AAAA,QACrJ,EAAE,IAAI,gBAAgB,aAAa,oBAAoB,IAAI,IAAI,WAAW,CAAC,eAAe,GAAG,sBAAsB,CAAC,mBAAmB,EAAE;AAAA,QACzI,EAAE,IAAI,kBAAkB,aAAa,iDAAiD,WAAW,CAAC,cAAc,GAAG,sBAAsB,CAAC,gBAAgB,EAAE;AAAA,MAC9J;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,YAAY,iBAAiB,UAAU,QAAQ,SAAS;AAAA,MACnE,UAAU,CAAC,SAAiB;AAAA,QAC1B,EAAE,IAAI,aAAa,aAAa,+CAA+C,WAAW,CAAC,GAAG,sBAAsB,CAAC,iBAAiB,EAAE;AAAA,QACxI,EAAE,IAAI,aAAa,aAAa,wBAAwB,IAAI,IAAI,WAAW,CAAC,WAAW,GAAG,sBAAsB,CAAC,gBAAgB,EAAE;AAAA,QACnI,EAAE,IAAI,cAAc,aAAa,kDAAkD,WAAW,CAAC,WAAW,GAAG,sBAAsB,CAAC,eAAe,EAAE;AAAA,MACvJ;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,eAAe,YAAY,SAAS,QAAQ,cAAc,SAAS;AAAA,MAC9E,UAAU,CAAC,SAAiB;AAAA,QAC1B,EAAE,IAAI,gBAAgB,aAAa,oCAAoC,WAAW,CAAC,GAAG,sBAAsB,CAAC,uBAAuB,EAAE;AAAA,QACtI,EAAE,IAAI,aAAa,aAAa,uBAAuB,IAAI,IAAI,WAAW,CAAC,cAAc,GAAG,sBAAsB,CAAC,sBAAsB,EAAE;AAAA,QAC3I,EAAE,IAAI,eAAe,aAAa,uCAAuC,WAAW,CAAC,WAAW,GAAG,sBAAsB,CAAC,mBAAmB,EAAE;AAAA,MACjJ;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,YAAY,iBAAiB,QAAQ,cAAc,WAAW,UAAU,SAAS;AAAA,MAC5F,UAAU,CAAC,SAAiB;AAAA,QAC1B,EAAE,IAAI,aAAa,aAAa,+DAA+D,WAAW,CAAC,GAAG,sBAAsB,CAAC,4BAA4B,EAAE;AAAA,QACnK,EAAE,IAAI,WAAW,aAAa,uBAAuB,IAAI,IAAI,WAAW,CAAC,WAAW,GAAG,sBAAsB,CAAC,cAAc,EAAE;AAAA,QAC9H,EAAE,IAAI,cAAc,aAAa,+CAA+C,WAAW,CAAC,SAAS,GAAG,sBAAsB,CAAC,aAAa,EAAE;AAAA,MAChJ;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,UAAU,aAAa,SAAS,cAAc,SAAS;AAAA,MAClE,UAAU,CAAC,SAAiB;AAAA,QAC1B,EAAE,IAAI,gBAAgB,aAAa,gDAAgD,WAAW,CAAC,GAAG,sBAAsB,CAAC,qBAAqB,EAAE;AAAA,QAChJ,EAAE,IAAI,gBAAgB,aAAa,oCAAoC,IAAI,IAAI,WAAW,CAAC,cAAc,GAAG,sBAAsB,CAAC,cAAc,EAAE;AAAA,QACnJ,EAAE,IAAI,eAAe,aAAa,2CAA2C,WAAW,CAAC,cAAc,GAAG,sBAAsB,CAAC,mBAAmB,EAAE;AAAA,MACxJ;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAS;AAAA,MACT,UAAU,CAAC,MAAM,MAAM,YAAY,iBAAiB,UAAU,UAAU,YAAY;AAAA,MACpF,UAAU,CAAC,SAAiB;AAAA,QAC1B,EAAE,IAAI,aAAa,aAAa,6CAA6C,WAAW,CAAC,GAAG,sBAAsB,CAAC,yBAAyB,EAAE;AAAA,QAC9I,EAAE,IAAI,WAAW,aAAa,6BAA6B,IAAI,IAAI,WAAW,CAAC,WAAW,GAAG,sBAAsB,CAAC,eAAe,EAAE;AAAA,QACrI,EAAE,IAAI,aAAa,aAAa,uCAAuC,WAAW,CAAC,SAAS,GAAG,sBAAsB,CAAC,gBAAgB,EAAE;AAAA,MAC1I;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,MAAc,eAAyE;AAC/F,UAAM,SAAqB;AAAA,MACzB;AAAA,MACA,aAAa,CAAC;AAAA,MACd,SAAS,EAAE,eAAe,cAAc,CAAC,EAAE;AAAA,MAC3C,UAAU,CAAC;AAAA,IACb;AAEA,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,eAAe,OAAO,KAAK,YAAY,WACzC,KAAK,YAAY,EAAE,SAAS,KAAK,QAAQ,YAAY,CAAC,IACtD,KAAK,QAAQ,KAAK,IAAI;AAE1B,YAAM,eAAe,KAAK,SAAS,KAAK,OAAK,KAAK,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAEzF,UAAI,gBAAgB,cAAc;AAChC,eAAO,WAAW,KAAK,SAAS,IAAI;AACpC,eAAO,EAAE,QAAQ,eAAe,KAAK;AAAA,MACvC;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,eAAe,MAAM;AAAA,EACxC;AAAA,EAEA,aAAa,MAA+B;AAC1C,SAAK,MAAM,KAAK,IAAI;AAAA,EACtB;AAAA,EAEA,WAAgC;AAC9B,WAAO,CAAC,GAAG,KAAK,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,iBAAiB,KAAgB,MAAc,iBAA8C;AACjG,UAAM,UAAU,MAAM,IAAI,aAAa,MAAM,CAAC,GAAG,eAAe;AAChE,UAAM,WAAW,MAAM,QAAQ,QAAQ,KAAK,IACxC,QAAQ,MAAM,IAAI,QAAM;AAAA,MACtB,IAAI,EAAE;AAAA,MACN,aAAa,EAAE;AAAA,MACf,WAAW,EAAE,aAAa,CAAC;AAAA,MAC3B,sBAAsB,CAAC;AAAA,IACzB,EAAE,IACF,CAAC;AACL,UAAM,SAAqB;AAAA,MACzB;AAAA,MACA,aAAa,CAAC;AAAA,MACd,SAAS,EAAE,eAAe,CAAC,GAAG,cAAc,CAAC,EAAE;AAAA,MAC/C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,IAAY,aAAqB,YAAsB,CAAC,GAAY;AACjF,WAAO,EAAE,IAAI,aAAa,WAAW,sBAAsB,CAAC,EAAE;AAAA,EAChE;AACF;;;ACtKA,SAAS,SAAS,UAAU,YAAoB;AAEhD,SAAS,MAAM,SAAS,UAAU,eAAe;AAoB1C,IAAM,oBAAN,MAAwB;AAAA,EACrB,QAA6B;AAAA,EAErC,MAAM,KAAK,MAAqC;AAC9C,QAAI,KAAK,MAAO,QAAO,KAAK;AAE5B,UAAM,UAAwB,CAAC;AAC/B,UAAM,SAAS,MAAM,KAAK,QAAQ,MAAM,CAAC,OAAO,OAAO,OAAO,QAAQ,CAAC;AACvE,UAAM,UAAU,MAAM,KAAK,QAAQ,MAAM,CAAC,QAAQ,SAAS,QAAQ,WAAW,CAAC;AAE/E,UAAM,UAAU,UAAU;AAC1B,UAAM,KAAK,KAAK,SAAS,SAAS,IAAI;AAEtC,UAAM,WAAW,YAAY;AAC7B,UAAM,WAAW,KAAK,eAAe,OAAO;AAE5C,SAAK,QAAQ,EAAE,MAAM,SAAS,UAAU,UAAU,SAAS,OAAO;AAClE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAAkB,iBAAyB,WAAW,IAAc;AAClE,QAAI,CAAC,KAAK,MAAO,QAAO,CAAC;AAEzB,UAAM,WAAW,gBACd,YAAY,EACZ,MAAM,cAAc,EACpB,OAAO,OAAK,EAAE,SAAS,CAAC;AAE3B,UAAM,SAAS,KAAK,MAAM,QAAQ,IAAI,OAAK;AACzC,UAAI,QAAQ;AACZ,YAAM,OAAO,EAAE,KAAK,YAAY;AAChC,YAAM,OAAO,EAAE,KAAK,YAAY;AAEhC,iBAAW,MAAM,UAAU;AACzB,YAAI,KAAK,SAAS,EAAE,EAAG,UAAS;AAChC,YAAI,KAAK,SAAS,EAAE,EAAG,UAAS;AAChC,YAAI,EAAE,QAAQ,KAAK,OAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAG,UAAS;AAChE,YAAI,EAAE,QAAQ,KAAK,OAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,EAAG,UAAS;AAAA,MAClE;AAEA,UAAI,EAAE,QAAQ,cAAc,EAAE,QAAQ,WAAY,UAAS;AAE3D,aAAO,EAAE,MAAM,EAAE,MAAM,MAAM;AAAA,IAC/B,CAAC;AAED,WAAO,OACJ,OAAO,OAAK,EAAE,QAAQ,CAAC,EACvB,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,QAAQ,EACjB,IAAI,OAAK,EAAE,IAAI;AAAA,EACpB;AAAA,EAEA,aAAa,YAA8B;AACzC,QAAI,CAAC,KAAK,MAAO,QAAO,CAAC;AACzB,UAAM,OAAO,SAAS,YAAY,QAAQ,UAAU,CAAC;AACrD,UAAM,MAAM,QAAQ,UAAU;AAE9B,UAAM,aAAa;AAAA,MACjB,KAAK,KAAK,GAAG,IAAI,UAAU;AAAA,MAC3B,KAAK,KAAK,GAAG,IAAI,UAAU;AAAA,MAC3B,KAAK,KAAK,aAAa,GAAG,IAAI,UAAU;AAAA,IAC1C;AAEA,QAAI,KAAK,MAAM,SAAS;AACtB,YAAM,SAAS,IAAI,QAAQ,KAAK,MAAM,UAAU,KAAK,MAAM,MAAM,EAAE;AACnE,iBAAW,KAAK,KAAK,KAAK,MAAM,SAAS,QAAQ,GAAG,IAAI,UAAU,CAAC;AACnE,iBAAW,KAAK,KAAK,KAAK,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC;AAAA,IAC7D;AAEA,WAAO,WAAW,OAAO,OAAK,KAAK,MAAO,QAAQ,KAAK,OAAK,EAAE,SAAS,CAAC,CAAC;AAAA,EAC3E;AAAA,EAEA,aAAqB;AACnB,QAAI,CAAC,KAAK,MAAO,QAAO;AAExB,UAAM,IAAI,KAAK;AACf,WAAO;AAAA,MACL,aAAa,EAAE,IAAI;AAAA,MACnB,iBAAiB,EAAE,QAAQ;AAAA,MAC3B,gBAAgB,EAAE,QAAQ,MAAM;AAAA,MAChC,cAAc,EAAE,WAAW,QAAQ,EAAE,OAAO,MAAM,yBAAyB;AAAA,MAC3E,eAAe,EAAE,UAAU,EAAE,IAAI;AAAA,MACjC;AAAA,MACA;AAAA,MACA,GAAG,KAAK,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,KAAK,GAAG,KAAK,KAAK,QAAQ;AAAA,IAChF,EAAE,KAAK,IAAI;AAAA,EACb;AAAA,EAEQ,WAAW,SAAgD;AACjE,UAAM,SAAS,oBAAI,IAAoB;AACvC,eAAW,KAAK,SAAS;AACvB,YAAM,MAAM,QAAQ,EAAE,IAAI;AAC1B,aAAO,IAAI,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,IAC5C;AACA,WAAO,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAAA,EAC/C;AAAA,EAEA,MAAc,QAAQ,MAAc,OAAyC;AAC3E,eAAW,QAAQ,OAAO;AACxB,YAAM,IAAI,KAAK,MAAM,IAAI;AACzB,UAAI;AACF,cAAM,IAAI,MAAM,KAAK,CAAC;AACtB,YAAI,EAAE,YAAY,EAAG,QAAO;AAAA,MAC9B,QAAQ;AAAA,MAAa;AAAA,IACvB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,KAAK,KAAa,SAAuB,MAA6B;AAClF,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IACtD,QAAQ;AACN;AAAA,IACF;AAEA,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,KAAK,KAAK,MAAM,IAAI;AACrC,UAAI,MAAM,YAAY,GAAG;AACvB,YAAI,MAAM,SAAS,kBAAkB,MAAM,SAAS,UAAU,MAAM,SAAS,UAAU,MAAM,SAAS,WAAY;AAClH,cAAM,KAAK,KAAK,UAAU,SAAS,IAAI;AAAA,MACzC,WAAW,MAAM,OAAO,GAAG;AACzB,cAAM,MAAM,QAAQ,MAAM,IAAI;AAC9B,YAAI,CAAC,CAAC,OAAO,QAAQ,OAAO,QAAQ,QAAQ,MAAM,EAAE,SAAS,GAAG,EAAG;AAEnE,YAAI,OAAO;AACX,YAAI;AAAE,kBAAQ,MAAM,KAAK,QAAQ,GAAG;AAAA,QAAK,QAAQ;AAAA,QAAa;AAE9D,cAAM,UAAoB,CAAC;AAC3B,cAAM,UAAoB,CAAC;AAC3B,YAAI;AACF,gBAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAChD,qBAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,kBAAM,WAAW,KAAK,MAAM,kCAAkC;AAC9D,gBAAI,SAAU,SAAQ,KAAK,SAAS,CAAC,CAAC;AACtC,kBAAM,WAAW,KAAK,MAAM,gEAAgE;AAC5F,gBAAI,SAAU,SAAQ,KAAK,SAAS,CAAC,CAAC;AAAA,UACxC;AAAA,QACF,QAAQ;AAAA,QAAa;AAErB,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,MAAM,MAAM,KAAK,QAAQ,KAAK,EAAE;AAAA,UAChC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,SAAiD;AACtE,UAAM,KAAK,QAAQ,OAAO,OAAK,CAAC,OAAO,QAAQ,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE;AACxE,UAAM,KAAK,QAAQ,OAAO,OAAK,CAAC,OAAO,QAAQ,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE;AACxE,QAAI,KAAK,GAAI,QAAO;AACpB,QAAI,KAAK,GAAI,QAAO;AACpB,QAAI,KAAK,KAAK,EAAG,QAAO;AACxB,WAAO;AAAA,EACT;AACF;;;ACtLA,SAAuB,cAAAC,mBAAkB;AACzC,SAAS,QAAAC,OAAM,UAAU,WAAAC,gBAAwB;AA8B1C,IAAM,oBAAN,MAAwB;AAAA,EACrB,cAAc,oBAAI,IAA0B;AAAA,EAC5C,eAAe,oBAAI,IAA8B;AAAA,EACjD,YAAY,oBAAI,IAAmC;AAAA,EACnD,YAAY,oBAAI,IAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASjD,aAAa,SAA2B;AACtC,UAAM,UAAoB,CAAC;AAC3B,UAAM,OAAO,oBAAI,IAAY;AAG7B,UAAM,cAAc;AAEpB,UAAM,eAAe;AAErB,UAAM,qBAAqB;AAE3B,eAAW,SAAS,QAAQ,SAAS,WAAW,GAAG;AACjD,YAAM,MAAM,MAAM,CAAC;AACnB,UAAI,OAAO,CAAC,KAAK,IAAI,GAAG,GAAG;AAAE,aAAK,IAAI,GAAG;AAAG,gBAAQ,KAAK,GAAG;AAAA,MAAE;AAAA,IAChE;AACA,eAAW,SAAS,QAAQ,SAAS,YAAY,GAAG;AAClD,YAAM,MAAM,MAAM,CAAC;AACnB,UAAI,OAAO,CAAC,KAAK,IAAI,GAAG,GAAG;AAAE,aAAK,IAAI,GAAG;AAAG,gBAAQ,KAAK,GAAG;AAAA,MAAE;AAAA,IAChE;AACA,eAAW,SAAS,QAAQ,SAAS,kBAAkB,GAAG;AACxD,YAAM,MAAM,MAAM,CAAC;AACnB,UAAI,OAAO,CAAC,KAAK,IAAI,GAAG,GAAG;AAAE,aAAK,IAAI,GAAG;AAAG,gBAAQ,KAAK,GAAG;AAAA,MAAE;AAAA,IAChE;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,YAAoB,WAA6B;AACjE,QAAI,CAAC,UAAU,WAAW,GAAG,EAAG,QAAO,CAAC;AACxC,UAAM,YAAYA,SAAQ,UAAU;AACpC,UAAM,OAAOD,MAAK,WAAW,SAAS,EAAE,QAAQ,OAAO,GAAG;AAG1D,UAAM,aAAa,KAAK,QAAQ,8BAA8B,EAAE;AAChE,UAAM,aAAa,CAAC,OAAO,QAAQ,OAAO,QAAQ,QAAQ,MAAM;AAEhE,UAAM,aAAuB,CAAC;AAE9B,eAAW,KAAK,IAAI;AAEpB,eAAW,OAAO,YAAY;AAC5B,UAAI,CAAC,KAAK,SAAS,GAAG,EAAG,YAAW,KAAK,aAAa,GAAG;AAAA,IAC3D;AAEA,eAAW,OAAO,YAAY;AAC5B,iBAAW,KAAKA,MAAK,YAAY,OAAO,IAAI,GAAG;AAAA,IACjD;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,UAAU,OAA+B,YAA0B;AACjE,eAAW,CAAC,SAAS,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,YAAM,sBAAsB,KAAK,aAAa,OAAO;AACrD,YAAM,kBAAkB,oBAAoB,OAAO,OAAK,EAAE,WAAW,GAAG,CAAC;AAEzE,UAAI,gBAAgB,WAAW,EAAG;AAElC,YAAM,YAAY,SAAS,YAAY,OAAO,EAAE,QAAQ,OAAO,GAAG;AAClE,YAAM,kBAA4B,CAAC;AAEnC,iBAAW,QAAQ,iBAAiB;AAClC,cAAM,aAAa,KAAK,kBAAkB,SAAS,IAAI;AACvD,mBAAW,QAAQ,YAAY;AAC7B,cAAID,YAAW,IAAI,GAAG;AACpB,kBAAM,YAAY,SAAS,YAAY,IAAI,EAAE,QAAQ,OAAO,GAAG;AAC/D,4BAAgB,KAAK,SAAS;AAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,gBAAgB,SAAS,GAAG;AAC9B,cAAM,WAAW,KAAK,UAAU,IAAI,SAAS,KAAK,oBAAI,IAAI;AAC1D,mBAAW,KAAK,iBAAiB;AAC/B,mBAAS,IAAI,CAAC;AACd,eAAK,cAAc,WAAW,GAAG,SAAS;AAAA,QAC5C;AACA,aAAK,UAAU,IAAI,WAAW,QAAQ;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,UAA4B;AAC5C,UAAM,aAAa,SAAS,QAAQ,OAAO,GAAG;AAC9C,UAAM,SAAmB,CAAC;AAC1B,eAAW,CAAC,QAAQ,OAAO,KAAK,KAAK,WAAW;AAC9C,iBAAW,KAAK,SAAS;AACvB,YAAI,MAAM,cAAc,EAAE,SAAS,MAAM,UAAU,KAAK,WAAW,SAAS,MAAM,CAAC,GAAG;AACpF,iBAAO,KAAK,MAAM;AAClB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAW,SAAiB,SAAiB,YAA0B;AACrE,UAAM,UAAU,SAAS,YAAY,OAAO,EAAE,QAAQ,OAAO,GAAG;AAEhE,SAAK,UAAU,OAAO,OAAO;AAC7B,SAAK,aAAa,OAAO,OAAO;AAEhC,eAAW,CAAC,KAAK,OAAO,KAAK,KAAK,WAAW;AAC3C,UAAI,QAAQ,IAAI,OAAO,GAAG;AACxB,gBAAQ,OAAO,OAAO;AAAA,MACxB;AAAA,IACF;AAEA,SAAK,UAAU,EAAE,CAAC,OAAO,GAAG,QAAQ,GAAG,UAAU;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,eAAe,UAA4B;AACzC,UAAM,aAAa,SAAS,QAAQ,OAAO,GAAG;AAC9C,WAAO,CAAC,GAAI,KAAK,UAAU,IAAI,UAAU,KAAK,CAAC,CAAE;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,MAAc,SAAiC;AAC7E,UAAM,aAAa,WAAW,oBAAI,IAAY;AAC9C,QAAI,WAAW,IAAI,IAAI,EAAG,QAAO,CAAC;AAClC,eAAW,IAAI,IAAI;AACnB,UAAM,SAAS,KAAK,kBAAkB,IAAI;AAC1C,UAAM,MAAM,CAAC,GAAG,MAAM;AACtB,eAAW,KAAK,QAAQ;AACtB,UAAI,KAAK,GAAG,KAAK,wBAAwB,GAAG,UAAU,CAAC;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,WAAmB,QAAgB,OAAuB;AACrE,UAAM,UAAU,KAAK,YAAY,IAAI,SAAS,KAAK,CAAC;AACpD,eAAW,QAAQ,OAAO;AACxB,cAAQ,KAAK;AAAA,QACX;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QACZ,WAAW,KAAK,IAAI;AAAA,MACtB,CAAC;AAAA,IACH;AACA,SAAK,YAAY,IAAI,WAAW,OAAO;AAEvC,UAAM,eAAe,KAAK,UAAU,IAAI,SAAS,KAAK,oBAAI,IAAI;AAC9D,UAAM,WAAW,aAAa,IAAI,MAAM,KAAK,CAAC;AAC9C,iBAAa,IAAI,QAAQ,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC;AAC9D,SAAK,UAAU,IAAI,WAAW,YAAY;AAAA,EAC5C;AAAA,EAEA,cAAc,MAAc,IAAY,UAA4C;AAClF,UAAM,QAAQ,KAAK,aAAa,IAAI,IAAI,KAAK,CAAC;AAC9C,UAAM,SAAS,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM,EAAE,aAAa,QAAQ;AACrE,QAAI,CAAC,QAAQ;AACX,YAAM,KAAK,EAAE,MAAM,IAAI,SAAS,CAAC;AACjC,WAAK,aAAa,IAAI,MAAM,KAAK;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,gBAAgB,QAAkC;AAChD,WAAO,KAAK,aAAa,IAAI,MAAM,KAAK,CAAC;AAAA,EAC3C;AAAA,EAEA,cAAc,QAAkC;AAC9C,UAAM,aAA+B,CAAC;AACtC,eAAW,SAAS,KAAK,aAAa,OAAO,GAAG;AAC9C,iBAAW,QAAQ,OAAO;AACxB,YAAI,KAAK,OAAO,OAAQ,YAAW,KAAK,IAAI;AAAA,MAC9C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,WAAmB,cAA0C;AACzE,UAAM,UAA4B,CAAC;AACnC,eAAW,QAAQ,cAAc;AAE/B,YAAM,WAAW,KAAK,cAAc,IAAI,EAAE,IAAI,OAAK,EAAE,IAAI;AACzD,YAAM,WAAW,KAAK,kBAAkB,IAAI;AAC5C,YAAM,iBAAiB,KAAK,wBAAwB,IAAI;AACxD,YAAM,gBAAgB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,UAAU,GAAG,UAAU,GAAG,cAAc,CAAC,CAAC;AAGhF,YAAM,eAAe,KAAK,UAAU,IAAI,SAAS;AACjD,YAAM,gBAA0B,CAAC;AACjC,UAAI,cAAc;AAChB,mBAAW,CAAC,QAAQ,KAAK,KAAK,cAAc;AAC1C,gBAAM,UAAU,MAAM,KAAK,OAAK,cAAc,SAAS,CAAC,KAAK,MAAM,IAAI;AACvE,cAAI,QAAS,eAAc,KAAK,MAAM;AAAA,QACxC;AAAA,MACF;AAEA,cAAQ,KAAK;AAAA,QACX;AAAA,QACA,eAAe;AAAA,QACf,eAAe,CAAC,GAAG,IAAI,IAAI,aAAa,CAAC;AAAA,QACzC,MAAM,cAAc,SAAS,IAAI,SAAS,cAAc,SAAS,IAAI,WAAW;AAAA,MAClF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEA,sBAAsB,WAAmB,QAA0B;AACjE,UAAM,UAAU,KAAK,YAAY,IAAI,SAAS,KAAK,CAAC;AACpD,WAAO,CAAC,GAAG,IAAI,IAAI,QAAQ,OAAO,OAAK,EAAE,WAAW,MAAM,EAAE,IAAI,OAAK,EAAE,IAAI,CAAC,CAAC;AAAA,EAC/E;AAAA,EAEA,+BAA+B,WAAmB,eAAuB,WAA+B;AACtG,UAAM,aAAa,UAAU,QAAQ,aAAa;AAClD,QAAI,cAAc,EAAG,QAAO,CAAC;AAE7B,UAAM,UAAU,KAAK,YAAY,IAAI,SAAS,KAAK,CAAC;AACpD,UAAM,QAAQ,oBAAI,IAAY;AAC9B,eAAW,KAAK,SAAS;AACvB,YAAM,UAAU,UAAU,QAAQ,EAAE,MAAM;AAC1C,UAAI,WAAW,KAAK,UAAU,YAAY;AACxC,cAAM,IAAI,EAAE,IAAI;AAAA,MAClB;AAAA,IACF;AACA,WAAO,CAAC,GAAG,KAAK;AAAA,EAClB;AAAA,EAEA,wBAAwB,WAAmB,eAAuB,OAAe,WAA0C;AACzH,UAAM,gBAAgB,KAAK,+BAA+B,WAAW,eAAe,SAAS;AAE7F,UAAM,mBAAmB,KAAK,sBAAsB,WAAW,aAAa;AAC5E,UAAM,mBAAmB,oBAAI,IAAY;AAEzC,eAAW,UAAU,WAAW;AAC9B,UAAI,WAAW,cAAe;AAC9B,YAAM,YAAY,KAAK,sBAAsB,WAAW,MAAM;AAC9D,iBAAW,KAAK,UAAW,kBAAiB,IAAI,CAAC;AAAA,IACnD;AAEA,UAAM,iBAA2B,CAAC;AAClC,eAAW,QAAQ,kBAAkB;AACnC,UAAI,MAAM,YAAY,EAAE,SAAS,KAAK,YAAY,CAAC,GAAG;AACpD,uBAAe,KAAK,IAAI;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI,gBAA+B;AACnC,QAAI,aAAa;AAEjB,QAAI,eAAe,SAAS,GAAG;AAC7B,sBAAgB,eAAe,eAAe,SAAS,CAAC;AACxD,mBAAa,eAAe,UAAU,IAAI,MAAM;AAAA,IAClD,WAAW,cAAc,SAAS,GAAG;AACnC,YAAM,mBAAmB,UAAU,MAAM,GAAG,UAAU,QAAQ,aAAa,CAAC,EAAE,QAAQ;AACtF,iBAAW,UAAU,kBAAkB;AACrC,cAAM,YAAY,KAAK,sBAAsB,WAAW,MAAM;AAC9D,YAAI,UAAU,SAAS,GAAG;AACxB,0BAAgB,UAAU,UAAU,SAAS,CAAC;AAC9C,uBAAa;AACb;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,iBAAiB,SAAS,KAAK,CAAC,eAAe;AACjD,sBAAgB,iBAAiB,CAAC;AAClC,mBAAa;AAAA,IACf;AAEA,UAAM,gBAA0B,CAAC;AACjC,UAAM,UAAU,KAAK,YAAY,IAAI,SAAS,KAAK,CAAC;AACpD,UAAM,gBAAgB,IAAI,IAAI,QAAQ,IAAI,OAAK,EAAE,IAAI,CAAC;AACtD,QAAI,cAAc,KAAK,OAAK,cAAc,IAAI,CAAC,CAAC,GAAG;AACjD,iBAAW,KAAK,SAAS;AACvB,YAAI,EAAE,WAAW,cAAe,eAAc,KAAK,EAAE,MAAM;AAAA,MAC7D;AAAA,IACF;AAEA,UAAM,kBAA4B,CAAC;AACnC,eAAW,UAAU,WAAW;AAC9B,UAAI,WAAW,cAAe;AAC9B,YAAM,eAAe,KAAK,sBAAsB,WAAW,MAAM;AACjE,YAAM,aAAa,aAAa;AAAA,QAAK,OACnC,MAAM,YAAY,EAAE,SAAS,EAAE,YAAY,CAAC;AAAA,MAC9C;AACA,UAAI,cAAc,aAAa,SAAS,GAAG;AACzC,wBAAgB,KAAK,MAAM;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,aAAa;AACjB,QAAI,eAAe;AAEjB,YAAM,aAAa,KAAK,cAAc,WAAW,CAAC,aAAa,CAAC;AAChE,YAAM,aAAa,KAAK,cAAc,aAAa;AACnD,YAAM,KAAK,WAAW,CAAC;AACvB,YAAM,iBAAiB,CAAC,GAAG,oBAAI,IAAI;AAAA,QACjC,GAAI,IAAI,iBAAiB,CAAC;AAAA,QAC1B,GAAG,WAAW,IAAI,OAAK,EAAE,IAAI;AAAA,MAC/B,CAAC,CAAC;AAGF,YAAM,gBAAgB,KAAK,kBAAkB,aAAa;AAC1D,mBAAa,2CAA2C,aAAa,kBAAkB,aAAa,KAAK,QAAQ,CAAC,CAAC;AACnH,UAAI,eAAe,SAAS,GAAG;AAC7B,sBAAc,kBAAkB,eAAe,KAAK,IAAI,CAAC;AAAA,MAC3D;AACA,UAAI,cAAc,SAAS,GAAG;AAC5B,sBAAc,2BAA2B,cAAc,KAAK,IAAI,CAAC;AAAA,MACnE;AACA,oBAAc;AAAA,IAChB,WAAW,gBAAgB,SAAS,GAAG;AACrC,mBAAa,iDAAiD,gBAAgB,KAAK,IAAI,CAAC;AAAA,IAC1F,OAAO;AACL,mBAAa;AAAA,IACf;AAEA,WAAO,EAAE,eAAe,eAAe,CAAC,GAAG,IAAI,IAAI,aAAa,CAAC,GAAG,iBAAiB,YAAY,qBAAqB,WAAW;AAAA,EACnI;AAAA,EAEA,MAAM,WAA0B;AAC9B,QAAI,WAAW;AACb,WAAK,YAAY,OAAO,SAAS;AACjC,WAAK,UAAU,OAAO,SAAS;AAAA,IACjC,OAAO;AACL,WAAK,YAAY,MAAM;AACvB,WAAK,aAAa,MAAM;AACxB,WAAK,UAAU,MAAM;AACrB,WAAK,UAAU,MAAM;AAAA,IACvB;AAAA,EACF;AACF;;;AC3XO,IAAM,oBAAN,MAAwB;AAAA,EACrB,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,MAAwB;AAAA,EAEhC,OAAO,KAAsB;AAC3B,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,SAAS,aAAqB,OAAiD,WAAqB,aAAuC;AACzI,UAAM,gBAAgB,MAAM,MAAM,CAAC,KAAK,aAAa,CAAC;AAEtD,UAAM,YAAY,KAAK,eAAe,aAAa;AAEnD,UAAM,eAAe,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,WAAW,GAAG,UAAU,SAAS,CAAC,CAAC;AACxE,UAAM,iBAAiB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,aAAa,GAAG,UAAU,WAAW,CAAC,CAAC;AAC9E,UAAM,gBAAgB,UAAU;AAChC,UAAM,eAAe,UAAU;AAE/B,UAAM,UAA0B;AAAA,MAC9B,aAAa,SAAS,YAAY,MAAM,GAAG,GAAG,CAAC;AAAA,MAC/C,WAAW,aAAa,MAAM,GAAG;AAAA,MACjC,aAAa,eAAe,MAAM,GAAG;AAAA,MACrC,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,iBAAiB,KAAK,eAAe,aAAa,cAAc,cAAc;AAAA,IAChF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAAgB,UAAkB,OAAiD,WAAqB,aAAgD;AAC5J,QAAI,CAAC,KAAK,IAAK,QAAO,KAAK,SAAS,UAAU,OAAO,WAAW,WAAW;AAE3E,QAAI;AACF,YAAM,YAAY,MAAM,IAAI,OAAK,IAAI,EAAE,IAAI,MAAM,EAAE,OAAO,EAAE;AAC5D,YAAM,aAAa,MAAM,KAAK,IAAI,iBAAiB,UAAU,SAAS;AAEtE,YAAM,YAAY,KAAK,eAAe,KAAK;AAE3C,aAAO;AAAA,QACL,aAAa,SAAS,SAAS,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA,eAAoB,WAAW,MAAM,GAAG,GAAG,CAAC;AAAA,QACxF,WAAW,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,WAAW,GAAG,UAAU,SAAS,CAAC,CAAC,EAAE,MAAM,GAAG;AAAA,QACzE,aAAa,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,aAAa,GAAG,UAAU,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG;AAAA,QAC/E,YAAY,UAAU;AAAA,QACtB,WAAW,UAAU;AAAA,QACrB,iBAAiB,KAAK,KAAK,WAAW,SAAS,CAAC;AAAA,MAClD;AAAA,IACF,QAAQ;AACN,aAAO,KAAK,SAAS,UAAU,OAAO,WAAW,WAAW;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,eAAe,WAAmB,uBAA+B,YAAY,KAAkB;AAC7F,WAAO,YAAY,KAAK,kBAAkB,KAAK,wBAAwB,YAAY;AAAA,EACrF;AAAA,EAEA,iBAAiB,SAAiC;AAChD,UAAM,QAAkB;AAAA,MACtB;AAAA,MACA;AAAA,MACA,aAAa,QAAQ,WAAW;AAAA,IAClC;AAEA,QAAI,QAAQ,UAAU,SAAS,GAAG;AAChC,YAAM,KAAK,IAAI,qBAAqB,GAAG,QAAQ,UAAU,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAAA,IAC1F;AAEA,QAAI,QAAQ,YAAY,SAAS,GAAG;AAClC,YAAM,KAAK,IAAI,sBAAsB,GAAG,QAAQ,YAAY,IAAI,OAAK,OAAO,CAAC,IAAI,CAAC;AAAA,IACpF;AAEA,QAAI,QAAQ,WAAW,SAAS,GAAG;AACjC,YAAM,KAAK,IAAI,sCAAsC,GAAG,QAAQ,WAAW,IAAI,OAAK,KAAK,CAAC,EAAE,CAAC;AAAA,IAC/F;AAEA,QAAI,QAAQ,UAAU,SAAS,GAAG;AAChC,YAAM,KAAK,IAAI,kBAAkB,GAAG,QAAQ,UAAU,IAAI,OAAK,KAAK,CAAC,EAAE,CAAC;AAAA,IAC1E;AAEA,UAAM,KAAK,IAAI,OAAO,yBAAyB,QAAQ,eAAe,WAAW;AAEjF,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,eAAe,OAKrB;AACA,UAAM,YAAsB,CAAC;AAC7B,UAAM,cAAwB,CAAC;AAC/B,UAAM,aAAuB,CAAC;AAC9B,UAAM,YAAsB,CAAC;AAE7B,eAAW,QAAQ,OAAO;AACxB,YAAM,UAAU,KAAK,WAAW;AAEhC,YAAM,kBAAkB,QAAQ,MAAM,wEAAwE;AAC9G,UAAI,iBAAiB;AACnB,kBAAU,KAAK,GAAG,gBAAgB,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MAClE;AAEA,YAAM,cAAc,QAAQ,MAAM,2CAA2C;AAC7E,UAAI,aAAa;AACf,oBAAY,KAAK,GAAG,WAAW;AAAA,MACjC;AAEA,UAAI,QAAQ,SAAS,UAAU,KAAK,QAAQ,SAAS,cAAc,KAAK,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS,eAAe,GAAG;AAC1I,cAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE;AAAA,UAAO,OACvC,EAAE,SAAS,UAAU,KAAK,EAAE,SAAS,cAAc,KAAK,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,eAAe;AAAA,QAC/G;AACA,mBAAW,KAAK,GAAG,MAAM,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MACzD;AAEA,UAAI,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS,YAAY,KAAK,QAAQ,SAAS,SAAS,GAAG;AAC3J,kBAAU,KAAK,QAAQ,MAAM,GAAG,GAAG,CAAC;AAAA,MACtC;AAAA,IACF;AAEA,WAAO,EAAE,WAAW,aAAa,YAAY,UAAU;AAAA,EACzD;AAAA,EAEQ,eAAe,aAAqB,WAAqB,aAA+B;AAC9F,UAAM,OAAO,CAAC,aAAa,GAAG,WAAW,GAAG,WAAW,EAAE,KAAK,GAAG;AACjE,WAAO,KAAK,KAAK,KAAK,SAAS,CAAC;AAAA,EAClC;AACF;;;AC3IA,SAAS,gBAAAG,qBAAoB;AAwBtB,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EAER,YAAY,KAAa;AACvB,SAAK,MAAM;AAAA,EACb;AAAA,EAEA,cAAuB;AACrB,QAAI;AACF,MAAAA,cAAa,OAAO,CAAC,aAAa,WAAW,GAAG,EAAE,KAAK,KAAK,KAAK,OAAO,SAAS,CAAC;AAClF,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,OAA0B;AAC9B,QAAI,CAAC,KAAK,YAAY,EAAG,QAAO;AAChC,QAAI;AACF,MAAAA,cAAa,OAAO,CAAC,OAAO,GAAG,KAAK,GAAG,EAAE,KAAK,KAAK,KAAK,OAAO,SAAS,CAAC;AACzE,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,SAAiB,OAAoC;AAC1D,QAAI,CAAC,KAAK,YAAY,EAAG,QAAO;AAChC,QAAI;AACF,UAAI,MAAM,SAAS,GAAG;AACpB,QAAAA,cAAa,OAAO,CAAC,OAAO,GAAG,KAAK,GAAG,EAAE,KAAK,KAAK,KAAK,OAAO,SAAS,CAAC;AAAA,MAC3E;AACA,MAAAA,cAAa,OAAO,CAAC,UAAU,MAAM,OAAO,GAAG,EAAE,KAAK,KAAK,KAAK,OAAO,SAAS,CAAC;AACjF,YAAM,OAAOA,cAAa,OAAO,CAAC,aAAa,MAAM,GAAG,EAAE,KAAK,KAAK,KAAK,UAAU,QAAQ,CAAC,EAAE,KAAK;AACnG,YAAM,YAAYA,cAAa,OAAO,CAAC,OAAO,MAAM,cAAc,GAAG,EAAE,KAAK,KAAK,KAAK,UAAU,QAAQ,CAAC,EAAE,KAAK;AAChH,aAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,IAC3C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,WAAW,QAAQ,IAAkB;AACnC,QAAI,CAAC,KAAK,YAAY,EAAG,QAAO,CAAC;AACjC,QAAI;AACF,YAAM,SAASA;AAAA,QACb;AAAA,QACA,CAAC,OAAO,IAAI,KAAK,IAAI,0BAA0B,aAAa;AAAA,QAC5D,EAAE,KAAK,KAAK,KAAK,UAAU,QAAQ;AAAA,MACrC;AACA,YAAM,UAAwB,CAAC;AAC/B,UAAI,UAA6B;AAEjC,iBAAW,QAAQ,OAAO,MAAM,IAAI,GAAG;AACrC,YAAI,KAAK,SAAS,KAAK,GAAG;AACxB,cAAI,QAAS,SAAQ,KAAK,OAAO;AACjC,gBAAM,CAAC,MAAM,SAAS,SAAS,IAAI,KAAK,MAAM,KAAK;AACnD,oBAAU,EAAE,MAAM,SAAS,WAAW,OAAO,CAAC,EAAE;AAAA,QAClD,WAAW,QAAQ,SAAS;AAC1B,kBAAQ,MAAM,KAAK,KAAK,KAAK,CAAC;AAAA,QAChC;AAAA,MACF;AACA,UAAI,QAAS,SAAQ,KAAK,OAAO;AACjC,aAAO;AAAA,IACT,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,mBAA2B;AACzB,QAAI;AACF,aAAOA,cAAa,OAAO,CAAC,aAAa,gBAAgB,MAAM,GAAG;AAAA,QAChE,KAAK,KAAK;AAAA,QAAK,UAAU;AAAA,MAC3B,CAAC,EAAE,KAAK;AAAA,IACV,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,KAAK,QAA0B;AAC7B,QAAI,CAAC,KAAK,YAAY,EAAG,QAAO;AAChC,QAAI;AACF,YAAM,OAAO,CAAC,MAAM;AACpB,UAAI,OAAQ,MAAK,KAAK,UAAU,MAAM;AACtC,MAAAA,cAAa,OAAO,MAAM,EAAE,KAAK,KAAK,KAAK,OAAO,SAAS,CAAC;AAC5D,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,aAAa,MAAuB;AAClC,QAAI,CAAC,KAAK,YAAY,EAAG,QAAO;AAChC,QAAI;AACF,MAAAA,cAAa,OAAO,CAAC,YAAY,MAAM,IAAI,GAAG,EAAE,KAAK,KAAK,KAAK,OAAO,SAAS,CAAC;AAChF,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,SAAS,OAAe,MAAc,OAAO,QAAiC;AAC5E,QAAI,CAAC,KAAK,YAAY,EAAG,QAAO;AAChC,QAAI;AACF,YAAM,SAAS,KAAK,iBAAiB;AACrC,WAAK,KAAK,MAAM;AAEhB,YAAM,SAASA,cAAa,MAAM;AAAA,QAChC;AAAA,QAAM;AAAA,QACN;AAAA,QAAW;AAAA,QACX;AAAA,QAAU;AAAA,QACV;AAAA,QAAU;AAAA,QACV;AAAA,QAAU;AAAA,MACZ,GAAG,EAAE,KAAK,KAAK,KAAK,UAAU,QAAQ,CAAC,EAAE,KAAK;AAE9C,YAAM,WAAW,OAAO,MAAM,kDAAkD;AAChF,UAAI,UAAU;AACZ,eAAO;AAAA,UACL,KAAK,SAAS,CAAC;AAAA,UACf,QAAQ,SAAS,SAAS,CAAC,GAAG,EAAE;AAAA,UAChC;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,KAAK,QAAQ,QAAQ,GAAG,OAAO,OAAO;AAAA,IACjD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,QAAQ,OAAO,QAAgB;AAC7B,QAAI,CAAC,KAAK,YAAY,EAAG,QAAO;AAChC,QAAI;AACF,aAAOA,cAAa,OAAO,CAAC,QAAQ,IAAI,GAAG,EAAE,KAAK,KAAK,KAAK,UAAU,QAAQ,CAAC;AAAA,IACjF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,sBACE,MACA,OACA,cACe;AACf,UAAM,iBAAiB,MAAM,OAAO,OAAK,EAAE,OAAO;AAClD,UAAM,cAAc,MAAM,OAAO,OAAK,CAAC,EAAE,OAAO;AAChD,UAAM,aAAa,YAAY,WAAW;AAE1C,UAAM,QAAQ,KAAK,SAAS,KAAK,KAAK,MAAM,GAAG,EAAE,IAAI,QAAQ;AAE7D,UAAM,UAAU,aACZ,eAAe,IAAI;AAAA;AAAA,YAAiB,eAAe,MAAM,iBAAiB,aAAa,MAAM,YAC7F,yBAAyB,IAAI;AAAA;AAAA,YAAiB,eAAe,MAAM,IAAI,MAAM,MAAM,WAAW,YAAY,MAAM;AAEpH,UAAM,UAAU,eAAe,IAAI,OAAK,KAAK,EAAE,WAAW,EAAE;AAE5D,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA,0BAA0B,aAAa,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,IAC/D,EAAE,KAAK,IAAI;AAEX,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,CAAC;AAAA,IACpB;AAAA,EACF;AACF;;;ACrLO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,MAAM,UAAkB,cAAwB,cAA8C;AAC5F,UAAM,YAA4B,CAAC;AACnC,QAAI,cAAc;AAGlB,UAAM,WAAW,KAAK,gBAAgB,cAAc,YAAY;AAChE,cAAU,KAAK,QAAQ;AACvB,mBAAe,SAAS,OAAO;AAG/B,UAAM,OAAO,KAAK,YAAY,cAAc,YAAY;AACxD,cAAU,KAAK,IAAI;AACnB,mBAAe,KAAK,OAAO;AAG3B,UAAM,QAAQ,KAAK,aAAa,YAAY;AAC5C,cAAU,KAAK,KAAK;AACpB,mBAAe,MAAM,OAAO;AAG5B,UAAM,WAAW,KAAK,gBAAgB,YAAY;AAClD,cAAU,KAAK,QAAQ;AACvB,mBAAe,SAAS,OAAO;AAE/B,UAAM,WAAW,KAAK,IAAI,GAAG,UAAU,IAAI,OAAK,EAAE,KAAK,CAAC;AACxD,QAAI,UAAgC;AACpC,QAAI,YAAY,EAAG,WAAU;AAAA,aACpB,YAAY,EAAG,WAAU;AAAA,aACzB,YAAY,EAAG,WAAU;AAElC,UAAM,aAAa,KAAK,mBAAmB,SAAS,WAAW,WAAW;AAE1E,WAAO,EAAE,SAAS,WAAW,aAAa,WAAW;AAAA,EACvD;AAAA,EAEQ,gBAAgB,cAAwB,UAA6C;AAC3F,UAAM,SAAmB,CAAC;AAC1B,QAAI,QAAQ;AAEZ,QAAI,aAAa,SAAS,GAAG;AAC3B,aAAO,KAAK,GAAG,aAAa,MAAM,2CAAsC;AACxE,eAAS;AAAA,IACX;AAEA,eAAW,CAAC,MAAM,OAAO,KAAK,UAAU;AACtC,YAAM,eAAe,QAAQ,MAAM,aAAa,KAAK,CAAC,GAAG;AACzD,UAAI,cAAc,IAAI;AACpB,eAAO,KAAK,GAAG,IAAI,QAAQ,WAAW,oCAA+B;AACrE,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO,EAAE,UAAU,YAAY,OAAO,KAAK,IAAI,OAAO,EAAE,GAAG,OAAO;AAAA,EACpE;AAAA,EAEQ,YAAY,cAAwB,UAA6C;AACvF,UAAM,SAAmB,CAAC;AAC1B,QAAI,QAAQ;AAEZ,eAAW,CAAC,MAAM,OAAO,KAAK,UAAU;AACtC,YAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE;AAClC,UAAI,QAAQ,KAAK;AACf,eAAO,KAAK,GAAG,IAAI,OAAO,KAAK,6CAAwC;AACvE,iBAAS;AAAA,MACX,WAAW,QAAQ,KAAK;AACtB,eAAO,KAAK,GAAG,IAAI,OAAO,KAAK,4BAAuB;AACtD,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO,EAAE,UAAU,QAAQ,OAAO,KAAK,IAAI,OAAO,EAAE,GAAG,OAAO;AAAA,EAChE;AAAA,EAEQ,aAAa,cAAsC;AACzD,UAAM,SAAmB,CAAC;AAC1B,QAAI,QAAQ;AAEZ,UAAM,OAAO,IAAI,IAAI,aAAa,IAAI,OAAK,EAAE,MAAM,GAAG,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC;AAC/E,QAAI,KAAK,OAAO,GAAG;AACjB,aAAO,KAAK,gBAAgB,KAAK,IAAI,kCAA6B;AAClE,eAAS;AAAA,IACX;AAEA,UAAM,UAAU,aAAa,KAAK,OAAK,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,QAAQ,CAAC;AACnF,QAAI,CAAC,WAAW,aAAa,SAAS,GAAG;AACvC,aAAO,KAAK,qDAAgD;AAC5D,eAAS;AAAA,IACX;AAEA,WAAO,EAAE,UAAU,SAAS,OAAO,KAAK,IAAI,OAAO,EAAE,GAAG,OAAO;AAAA,EACjE;AAAA,EAEQ,gBAAgB,UAA6C;AACnE,UAAM,SAAmB,CAAC;AAC1B,QAAI,QAAQ;AAEZ,eAAW,CAAC,MAAM,OAAO,KAAK,UAAU;AACtC,UAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,eAAO,KAAK,GAAG,IAAI,qDAAgD;AACnE,iBAAS;AAAA,MACX;AACA,WAAK,QAAQ,MAAM,cAAc,KAAK,CAAC,GAAG,SAAS,GAAG;AACpD,eAAO,KAAK,GAAG,IAAI,mDAA8C;AACjE,iBAAS;AAAA,MACX;AACA,UAAI,QAAQ,SAAS,eAAe,GAAG;AACrC,eAAO,KAAK,GAAG,IAAI,sDAAiD;AACpE,iBAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO,EAAE,UAAU,YAAY,OAAO,KAAK,IAAI,OAAO,EAAE,GAAG,OAAO;AAAA,EACpE;AAAA,EAEQ,mBAAmB,SAAiB,WAA2B,OAAuB;AAC5F,QAAI,YAAY,MAAO,QAAO;AAC9B,QAAI,YAAY,SAAU,QAAO,GAAG,KAAK;AACzC,QAAI,YAAY,OAAQ,QAAO,GAAG,KAAK;AACvC,WAAO,GAAG,KAAK;AAAA,EACjB;AACF;;;AChGO,IAAM,eAAN,MAAmB;AAAA,EAChB,UAAoC,oBAAI,IAAI;AAAA,EAC5C,SAA0C,oBAAI,IAAI;AAAA,EAClD,gBAA0C,oBAAI,IAAI;AAAA,EAElD,gBAA2C;AAAA,IACjD,WAAW;AAAA;AAAA,IACX,WAAW;AAAA;AAAA,IACX,IAAI;AAAA;AAAA,IACJ,aAAa;AAAA;AAAA,IACb,IAAI;AAAA;AAAA,EACN;AAAA,EAEA,YAAY,gBAAkE;AAC5E,QAAI,gBAAgB;AAClB,iBAAW,SAAS,gBAAgB;AAClC,cAAM,SAAS,MAAM,QAAQ,OAAO,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAAU,IAAI,CAAC;AAC3E,aAAK,cAAc,IAAI,MAAM,MAAM,EAAE,gBAAgB,OAAO,SAAS,SAAS,MAAM,QAAQ,CAAC;AAAA,MAC/F;AAAA,IACF;AACA,SAAK,QAAQ,IAAI,aAAa;AAAA,MAC5B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAsER,OAAO,CAAC,QAAQ,QAAQ,QAAQ,eAAe,iBAAiB,oBAAoB,eAAe;AAAA,IACrG,CAAC;AAED,SAAK,QAAQ,IAAI,aAAa;AAAA,MAC5B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAuFR,OAAO,CAAC,QAAQ,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,eAAe;AAAA,IAC1E,CAAC;AAED,SAAK,QAAQ,IAAI,MAAM;AAAA,MACrB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqER,OAAO,CAAC,QAAQ,QAAQ,QAAQ,QAAQ,kBAAkB,eAAe;AAAA,IAC3E,CAAC;AAED,SAAK,QAAQ,IAAI,eAAe;AAAA,MAC9B,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAgDR,OAAO,CAAC,gBAAgB,oBAAoB,kBAAkB,cAAc,eAAe;AAAA,IAC7F,CAAC;AAED,SAAK,QAAQ,IAAI,MAAM;AAAA,MACrB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAkDR,OAAO,CAAC,gBAAgB,eAAe,oBAAoB,oBAAoB,MAAM;AAAA,IACvF,CAAC;AAED,UAAM,eAA4B,CAAC,aAAa,aAAa,MAAM,eAAe,IAAI;AACtF,eAAW,QAAQ,cAAc;AAC/B,UAAI,CAAC,KAAK,cAAc,IAAI,IAAI,GAAG;AACjC,aAAK,gBAAgB,MAAM,KAAK,QAAQ,IAAI,IAAI,EAAG,QAAQ,WAAW,iBAAiB;AAAA,MACzF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,KAA2B;AACxC,SAAK,OAAO,IAAI,IAAI,MAAM,GAAG;AAC7B,QAAI,CAAC,KAAK,cAAc,IAAI,IAAI,IAAI,GAAG;AACrC,WAAK,gBAAgB,IAAI,MAAM,IAAI,QAAQ,UAAU,gBAAgB,IAAI,IAAI,EAAE;AAAA,IACjF;AAAA,EACF;AAAA,EAEQ,gBAAgB,MAAc,QAAgB,QAAsB,aAA4B;AACtG,UAAM,WAAW,KAAK,cAAc,IAAI,IAAI;AAC5C,UAAM,UAAU,WAAW,SAAS,iBAAiB,IAAI;AACzD,UAAM,QAAqB,EAAE,SAAS,QAAQ,YAAW,oBAAI,KAAK,GAAE,YAAY,GAAG,QAAQ,YAAY;AACvG,QAAI,UAAU;AACZ,eAAS,QAAQ,KAAK,KAAK;AAC3B,eAAS,iBAAiB;AAAA,IAC5B,OAAO;AACL,WAAK,cAAc,IAAI,MAAM,EAAE,gBAAgB,SAAS,SAAS,CAAC,KAAK,EAAE,CAAC;AAAA,IAC5E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,MAAiB,WAAmB,SAAuB,UAAU,aAA+B;AAC/G,UAAM,WAAW,KAAK,QAAQ,IAAI,IAAI;AACtC,QAAI,CAAC,SAAU,QAAO;AACtB,SAAK,QAAQ,IAAI,MAAM,EAAE,GAAG,UAAU,QAAQ,UAAU,CAAC;AACzD,SAAK,gBAAgB,MAAM,WAAW,QAAQ,WAAW;AACzD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,UAAU,MAAkC;AAC1C,WAAO,KAAK,QAAQ,IAAI,IAAiB,GAAG,UAAU,KAAK,OAAO,IAAI,IAAI,GAAG;AAAA,EAC/E;AAAA;AAAA,EAGA,iBAAiB,MAA6B;AAC5C,WAAO,KAAK,cAAc,IAAI,IAAI,GAAG,WAAW,CAAC;AAAA,EACnD;AAAA;AAAA,EAGA,eAAe,MAAuC;AACpD,WAAO,KAAK,cAAc,IAAI,IAAI;AAAA,EACpC;AAAA;AAAA,EAGA,qBAAsE;AACpE,WAAO,CAAC,GAAG,KAAK,cAAc,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,MAAM,SAAS,MAAM,QAAQ,EAAE;AAAA,EACpG;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,MAAc,SAA0B;AACrD,UAAM,QAAQ,KAAK,cAAc,IAAI,IAAI;AACzC,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,QAAQ,MAAM,QAAQ,KAAK,OAAK,EAAE,YAAY,OAAO;AAC3D,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,MAAM,KAAK,QAAQ,IAAI,IAAiB;AAC9C,QAAI,KAAK;AACP,WAAK,QAAQ,IAAI,MAAmB,EAAE,GAAG,KAAK,QAAQ,MAAM,OAAO,CAAC;AAAA,IACtE;AACA,UAAM,SAAS,KAAK,OAAO,IAAI,IAAI;AACnC,QAAI,QAAQ;AACV,WAAK,OAAO,IAAI,MAAM,EAAE,GAAG,QAAQ,QAAQ,MAAM,OAAO,CAAC;AAAA,IAC3D;AACA,QAAI,CAAC,OAAO,CAAC,OAAQ,QAAO;AAE5B,SAAK,gBAAgB,MAAM,MAAM,QAAQ,UAAU,uBAAuB,OAAO,EAAE;AACnF,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,MAAuC;AAChD,WAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,EAC9B;AAAA,EAEA,UAAU,MAA8C;AACtD,WAAO,KAAK,OAAO,IAAI,IAAI;AAAA,EAC7B;AAAA,EAEA,gBAA4B;AAC1B,WAAO,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC;AAAA,EAClC;AAAA,EAEA,eAAiC;AAC/B,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC;AAAA,EACjC;AAAA,EAEA,YAAsB;AACpB,WAAO;AAAA,MACL,GAAG,KAAK,QAAQ,KAAK;AAAA,MACrB,GAAG,KAAK,OAAO,KAAK;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,aAAa,MAAc,aAA6B,YAAoB;AAE1E,UAAM,SAAS,KAAK,OAAO,IAAI,IAAI;AACnC,QAAI,QAAQ,MAAO,QAAO,OAAO;AAGjC,UAAM,UAAU,KAAK,QAAQ,IAAI,IAAiB;AAClD,QAAI,SAAS,MAAO,QAAO,QAAQ;AAGnC,UAAM,OAAO,KAAK,cAAc,IAAiB,KAAK;AACtD,QAAI,eAAe,YAAY,SAAS,UAAW,QAAO;AAC1D,QAAI,eAAe,aAAa,SAAS,OAAQ,QAAO;AACxD,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,MAAiB,OAAqB;AAC7C,UAAM,MAAM,KAAK,QAAQ,IAAI,IAAI;AACjC,QAAI,IAAK,KAAI,QAAQ;AAAA,EACvB;AACF;;;ACnfO,IAAM,mBAAN,MAAuB;AAAA,EACpB,eAAe,oBAAI,IAA+B;AAAA,EAClD,kBAA0C,CAAC;AAAA,EAC3C,WAAW,oBAAI,IAA4B;AAAA,EAC3C;AAAA,EACA,QAAQ,oBAAI,IAAyB;AAAA,EACrC,eAAe,oBAAI,IAAsB;AAAA,EACzC,WAAW;AAAA,EACX;AAAA,EAER,YAAY,YAAyB;AACnC,SAAK,WAAW,IAAI,aAAa;AACjC,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA,EAGA,YAAY,OAAqB;AAC/B,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA,EAGA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,oBAAoB,UAAsC;AACxD,SAAK,gBAAgB,KAAK,QAAQ;AAAA,EACpC;AAAA,EAEA,kBAAkB,KAAa,OAAe,WAAsC;AAClF,UAAM,QAA2B,EAAE,KAAK,OAAO,WAAW,WAAW,WAAW,KAAK,IAAI,EAAE;AAC3F,SAAK,aAAa,IAAI,KAAK,KAAK;AAChC,eAAW,YAAY,KAAK,iBAAiB;AAC3C,UAAI;AAAE,iBAAS,KAAK;AAAA,MAAE,QAAQ;AAAA,MAAE;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,uBAAuB,SAAyE;AAC9F,eAAW,KAAK,SAAS;AACvB,WAAK,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,iBAAiB,KAA4C;AAC3D,WAAO,KAAK,aAAa,IAAI,GAAG;AAAA,EAClC;AAAA,EAEA,mBAAmB,OAAoC;AACrD,UAAM,IAAI,MAAM,YAAY;AAC5B,WAAO,CAAC,GAAG,KAAK,aAAa,OAAO,CAAC,EAAE;AAAA,MAAO,OAC5C,EAAE,IAAI,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,qBAA0C;AACxC,WAAO,CAAC,GAAG,KAAK,aAAa,OAAO,CAAC;AAAA,EACvC;AAAA,EAEA,SAAS,MAAqD;AAC5D,WAAO,KAAK,SAAS,WAAW,IAAiB,KAAK,KAAK,SAAS,UAAU,IAAI;AAAA,EACpF;AAAA,EAEA,mBAAmB,KAA2B;AAC5C,SAAK,SAAS,eAAe,GAAG;AAAA,EAClC;AAAA;AAAA,EAIA,YAAY,KAAoE;AAC9E,UAAM,UAAwB;AAAA,MAC5B,GAAG;AAAA,MACH,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,MAC/D,WAAW,KAAK,IAAI;AAAA,MACpB,MAAM;AAAA,IACR;AACA,UAAM,QAAQ,KAAK,SAAS,IAAI,IAAI,EAAE,KAAK,CAAC;AAC5C,UAAM,KAAK,OAAO;AAClB,SAAK,SAAS,IAAI,IAAI,IAAI,KAAK;AAC/B,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,WAAmB,aAAa,OAAuB;AACjE,UAAM,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC;AAC/C,QAAI,WAAY,QAAO,MAAM,OAAO,OAAK,CAAC,EAAE,IAAI;AAChD,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,WAA4B;AACnC,eAAW,CAAC,EAAE,KAAK,KAAK,KAAK,UAAU;AACrC,YAAM,MAAM,MAAM,KAAK,OAAK,EAAE,OAAO,SAAS;AAC9C,UAAI,KAAK;AAAE,YAAI,OAAO;AAAM,eAAO;AAAA,MAAK;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,QAAgC;AAC9C,UAAM,MAAsB,CAAC;AAC7B,eAAW,CAAC,EAAE,KAAK,KAAK,KAAK,UAAU;AACrC,UAAI,KAAK,GAAG,MAAM,OAAO,OAAK,EAAE,WAAW,MAAM,CAAC;AAAA,IACpD;AACA,WAAO,IAAI,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AAAA,EACrD;AAAA;AAAA,EAIA,SAAS,MAAc,MAAiB,WAAmB,cAAc,GAAG,gBAAyF;AACnK,SAAK,aAAa;AAClB,SAAK,SAAS;AACd,SAAK,kBAAkB,cAAc;AAErC,QAAI,CAAC,kBAAkB,KAAK,YAAY;AACtC,YAAM,cAAc,KAAK,WAAW,KAAK,KAAK,WAAW,EAAE,MAAM,GAAG,CAAC;AACrE,uBAAiB,YAAY,IAAI,CAAC,OAAY;AAAA,QAC5C,MAAM,EAAE;AAAA,QACR,aAAa,EAAE;AAAA,QACf,OAAO,EAAE,MAAM,IAAI,CAAC,SAAc,KAAK,WAAW,EAAE,KAAK,UAAK;AAAA,MAChE,EAAE;AAAA,IACJ;AAEA,UAAM,UAAU,KAAK,mBAAmB;AACxC,UAAM,eAAyB,CAAC;AAChC,QAAI,QAAQ,SAAS,GAAG;AACtB,mBAAa,KAAK,QACf,IAAI,OAAK,IAAI,EAAE,GAAG,SAAS,EAAE,SAAS,MAAM,EAAE,KAAK,EAAE,EACrD,KAAK,IAAI,CAAC;AAAA,IACf;AAEA,QAAI,kBAAkB,eAAe,SAAS,GAAG;AAC/C,YAAM,cAAc,eAAe,MAAM,GAAG,CAAC,EAAE;AAAA,QAAI,OACjD,OAAO,EAAE,IAAI,QAAQ,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA,WAA6B,EAAE,KAAK;AAAA,MAC1F,EAAE,KAAK,MAAM;AACb,mBAAa,KAAK;AAAA,EAAuB,WAAW;AAAA;AAAA,oEAAyE;AAAA,IAC/H;AAEA,QAAI,aAAa,SAAS,GAAG;AAC3B,WAAK,gBAAgB,aAAa,KAAK,MAAM;AAAA,IAC/C;AAEA,UAAM,eAAe,KAAK,MAAM,IAAI,SAAS,KAAK,CAAC;AACnD,iBAAa,KAAK,IAAI;AACtB,SAAK,MAAM,IAAI,WAAW,YAAY;AAEtC,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,WAAgC;AACvC,WAAO,KAAK,MAAM,IAAI,SAAS,KAAK,CAAC;AAAA,EACvC;AAAA,EAEA,eAAe,WAAmB,MAA2B;AAC3D,YAAQ,KAAK,MAAM,IAAI,SAAS,KAAK,CAAC,GAAG,OAAO,OAAK,EAAE,eAAe,IAAI;AAAA,EAC5E;AAAA,EAEA,WAAW,WAAmB,QAAgB,QAA6B,QAA0B;AACnG,UAAM,QAAQ,KAAK,MAAM,IAAI,SAAS;AACtC,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,OAAO,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AAC5C,QAAI,CAAC,KAAM,QAAO;AAElB,SAAK,SAAS;AACd,QAAI,OAAQ,MAAK,SAAS;AAE1B,QAAI,WAAW,UAAU,KAAK,YAAY;AACxC,WAAK,kBAAkB,QAAQ,MAAM,WAAW,UAAU,aAAa,KAAK,UAAU;AAAA,IACxF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,kBAAkB,QAAgB,WAAqC;AACrE,UAAM,QAAQ,KAAK,MAAM,IAAI,SAAS,KAAK,CAAC;AAC5C,UAAM,aAAa,MAAM,UAAU,OAAK,EAAE,OAAO,MAAM;AACvD,QAAI,aAAa,KAAK,cAAc,MAAM,SAAS,EAAG,QAAO;AAE7D,UAAM,UAAU,MAAM,UAAU;AAChC,QAAI,QAAQ,WAAW,OAAQ,QAAO;AAEtC,aAAS,IAAI,aAAa,GAAG,IAAI,MAAM,QAAQ,KAAK;AAClD,YAAM,OAAO,MAAM,CAAC;AACpB,UAAI,KAAK,WAAW,UAAW,QAAO;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAIA,eAAe,WAAmB,YAAoB,SAAyB;AAC7E,SAAK,aAAa,IAAI,WAAW,OAAO;AACxC,SAAK,kBAAkB,YAAY,SAAS,IAAI,YAAY,aAAa;AAAA,EAC3E;AAAA,EAEA,eAAe,WAAyC;AACtD,WAAO,KAAK,aAAa,IAAI,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAiB,aAAqB,KAAqF;AAE/H,QAAI,KAAK;AACP,UAAI;AACF,cAAM,UAAU,MAAM,IAAI,YAAY,WAAW;AACjD,YAAI,WAAW,CAAC,aAAa,aAAa,MAAM,eAAe,IAAI,EAAE,SAAS,OAAO,GAAG;AACtF,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAAgC;AAAA,IAC1C;AAGA,UAAM,IAAI,YAAY,YAAY;AAClC,QAAI,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,cAAc,EAAG,QAAO;AACrH,QAAI,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,UAAU,KAAK,EAAE,SAAS,OAAO,EAAG,QAAO;AAC5H,QAAI,EAAE,SAAS,YAAY,KAAK,EAAE,SAAS,aAAa,KAAK,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,UAAU,EAAG,QAAO;AAClH,QAAI,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,SAAS,KAAK,EAAE,SAAS,aAAa,KAAK,EAAE,SAAS,MAAM,KAAK,EAAE,SAAS,YAAY,EAAG,QAAO;AACrI,WAAO;AAAA,EACT;AACF;;;ACpQA,SAAS,gBAAAC,qBAAoB;AAG7B,SAAS,cAAc,SAAiB,OAAsB;AAC5D,MAAI,QAAQ,IAAI,mBAAmB;AACjC,YAAQ,MAAM,qBAAqB,OAAO,KAAK,KAAK;AAAA,EACtD;AACF;AA0BA,IAAM,iBAAyC;AAAA,EAC7C,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,OAAO;AAAA,EACP,UAAU;AACZ;AAIO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA,iBAA0B;AAAA,EAC1B,kBAAiC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EAKR,YAAY,SAA6B,CAAC,GAAG;AAC3C,SAAK,SAAS;AAAA,MACZ,UAAU,OAAO,YAAY,KAAK,eAAe;AAAA,MACjD,QAAQ,OAAO,UAAU,QAAQ,IAAI;AAAA,MACrC,SAAS,OAAO,WAAW,QAAQ,IAAI;AAAA,MACvC,OAAO,OAAO,SAAS,QAAQ,IAAI;AAAA,MACnC,WAAW,OAAO,aAAa;AAAA,MAC/B,aAAa,OAAO,eAAe;AAAA,MACnC,SAAS,OAAO,WAAW,QAAQ,IAAI;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,gBAAgB,QAGP;AACP,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,iBAAiB,OAAuB;AACtC,WAAO,KAAK,mBAAmB,KAAK;AAAA,EACtC;AAAA,EAEQ,mBAAmB,OAAuB;AAChD,QAAI,CAAC,KAAK,aAAc,QAAO;AAC/B,UAAM,QAAkB,CAAC;AACzB,QAAI;AACF,YAAM,WAAW,KAAK,aAAa,eAAe,KAAK,EAAE,MAAM,GAAG,CAAC;AACnE,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,KAAK,yBAAyB;AACpC,cAAM,KAAK,SAAS,IAAI,OAAK,KAAK,EAAE,YAAY,YAAY,WAAM,EAAE,YAAY,YAAY,iBAAO,QAAG,IAAI,EAAE,QAAQ,KAAK,EAAE,UAAU,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,MAClK;AACA,YAAM,SAAS,KAAK,aAAa,WAAW,KAAK,EAAE,MAAM,GAAG,CAAC;AAC7D,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,KAAK,wBAAwB;AACnC,cAAM,KAAK,OAAO,IAAI,OAAK,KAAK,EAAE,IAAI,MAAM,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC,iBAAiB,EAAE,KAAK,IAAI,CAAC;AAAA,MAC1G;AAAA,IACF,SAAS,OAAO;AACd,oBAAc,sBAAsB,KAAK;AAAA,IAC3C;AACA,WAAO,MAAM,SAAS,IAAI;AAAA;AAAA;AAAA,EAA0B,MAAM,KAAK,MAAM,CAAC,KAAK;AAAA,EAC7E;AAAA,EAEA,kBAAkB,QAAuB;AACvC,SAAK,iBAAiB;AACtB,QAAI,KAAK,OAAO,aAAa,cAAc,CAAC,QAAQ,IAAI,gBAAgB;AACtE,WAAK,OAAO,WAAW;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,aAAa,WAAyB;AACpC,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,iBAAiB,UAA+B;AAC9C,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,gBAAgB,OAAgE;AAC9E,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,aAAa,QAAkC;AAC7C,WAAO,OAAO,KAAK,QAAQ,MAAM;AAAA,EACnC;AAAA,EAEA,kBAA0B;AACxB,WAAO,KAAK,OAAO,SAAS;AAAA,EAC9B;AAAA,EAEA,MAAM,KAAK,KAAuC;AAChD,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI,UAAU;AACd,QAAI;AAEJ,QAAI;AACF,cAAQ,KAAK,OAAO,UAAU;AAAA,QAC5B,KAAK;AACH,qBAAW,MAAM,KAAK,WAAW,GAAG;AACpC;AAAA,QACF,KAAK;AACH,qBAAW,MAAM,KAAK,cAAc,GAAG;AACvC;AAAA,QACF,KAAK;AACH,qBAAW,MAAM,KAAK,UAAU,GAAG;AACnC;AAAA,QACF,KAAK;AACH,qBAAW,MAAM,KAAK,aAAa,GAAG;AACtC;AAAA,QACF;AACE,cAAI,KAAK,eAAgB,YAAW,MAAM,KAAK,aAAa,GAAG;AAAA,cAC1D,YAAW,MAAM,KAAK,WAAW,GAAG;AAAA,MAC7C;AACA,gBAAU,CAAC,SAAS,QAAQ,WAAW,WAAW,KAAK,CAAC,SAAS,QAAQ,WAAW,UAAU,KAAK,CAAC,SAAS,QAAQ,WAAW,iBAAiB;AAAA,IACnJ,SAAS,OAAO;AACd,oBAAc,YAAY,KAAK;AAC/B,iBAAW,EAAE,SAAS,+BAA+B,cAAc,QAAQ;AAC3E,gBAAU;AAAA,IACZ;AAEA,UAAM,UAAU,KAAK,IAAI,IAAI;AAE7B,UAAM,WAAW,KAAK,gBAAgB,KAAK,kBACvC,KAAK,aAAa,YAAY,KAAK,eAAe,EAAE,kBACpD;AACJ,SAAK,eAAe,WAAW,KAAK,gBAAgB,GAAG,SAAS,SAAS,QAAQ;AAEjF,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,cAAc,MAAc,SAAoC;AACpE,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,KAAK;AAAA,QAC3B,cAAc,+KAA+K,KAAK,mBAAmB,IAAI;AAAA,QACzN,YAAY,SAAS,IAAI;AAAA;AAAA;AAAA,EAAiB,OAAO;AAAA;AAAA;AAAA,QACjD,UAAU;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AAED,YAAM,UAAU,KAAK,QAAQ,KAAK;AAClC,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,OAAO;AACjC,YAAI,MAAM,QAAQ,MAAM,EAAG,QAAO;AAClC,YAAI,OAAO,YAAY,MAAM,QAAQ,OAAO,QAAQ,EAAG,QAAO,OAAO;AACrE,YAAI,OAAO,SAAS,MAAM,QAAQ,OAAO,KAAK,EAAG,QAAO,OAAO;AAAA,MACjE,SAAS,OAAO;AACd,sBAAc,4BAA4B,KAAK;AAAA,MACjD;AAEA,YAAM,YAAY,QAAQ,MAAM,2CAA2C;AAC3E,UAAI,WAAW;AACb,YAAI;AAAE,gBAAM,MAAM,KAAK,MAAM,UAAU,CAAC,CAAC;AAAG,cAAI,MAAM,QAAQ,GAAG,EAAG,QAAO;AAAA,QAAI,SAAS,OAAO;AAAE,wBAAc,2BAA2B,KAAK;AAAA,QAAG;AAAA,MACpJ;AAEA,YAAM,WAAW,QAAQ,MAAM,cAAc;AAC7C,UAAI,UAAU;AACZ,YAAI;AAAE,gBAAM,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC;AAAG,cAAI,MAAM,QAAQ,GAAG,EAAG,QAAO;AAAA,QAAI,SAAS,OAAO;AAAE,wBAAc,0BAA0B,KAAK;AAAA,QAAG;AAAA,MAClJ;AAAA,IACF,SAAS,OAAO;AACd,oBAAc,iBAAiB,KAAK;AAAA,IACtC;AAEA,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,iBAAiB,UAAkB,OAAkC;AACzE,UAAM,OAAO,MAAM,KAAK,KAAK;AAAA,MAC3B,cAAc,kNAAkN,KAAK,mBAAmB,QAAQ;AAAA,MAChQ,YAAY,SAAS,QAAQ;AAAA;AAAA;AAAA,EAAsB,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,MACnE,WAAW;AAAA,MACX,aAAa;AAAA,IACf,CAAC;AACD,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,aAAa,WAAmB,eAInC;AACD,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,KAAK;AAAA,QAC3B,cAAc,sQAAsQ,KAAK,mBAAmB,SAAS;AAAA,QACrT,YAAY;AAAA,EAAW,SAAS;AAAA;AAAA;AAAA,EAAiC,cAAc,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,QACzF,UAAU;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AAED,YAAM,UAAU,KAAK,QAAQ,KAAK;AAClC,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,OAAO;AACjC,YAAI,OAAO,YAAY,OAAO,UAAW,QAAO;AAAA,MAClD,SAAS,OAAO;AACd,sBAAc,2BAA2B,KAAK;AAAA,MAChD;AAEA,YAAM,YAAY,QAAQ,MAAM,2CAA2C;AAC3E,UAAI,WAAW;AACb,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,UAAU,CAAC,CAAC;AACtC,cAAI,OAAO,SAAU,QAAO;AAAA,QAC9B,SAAS,OAAO;AACd,wBAAc,0BAA0B,KAAK;AAAA,QAC/C;AAAA,MACF;AAEA,YAAM,YAAY,QAAQ,MAAM,gEAAgE;AAChG,UAAI,WAAW;AACb,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,UAAU,CAAC,CAAC;AACtC,cAAI,OAAO,SAAU,QAAO;AAAA,QAC9B,SAAS,OAAO;AACd,wBAAc,0BAA0B,KAAK;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,oBAAc,gBAAgB,KAAK;AAAA,IACrC;AAEA,WAAO,EAAE,UAAU,WAAW,WAAW,qBAAqB,KAAK,8BAA8B;AAAA,EACnG;AAAA,EAEQ,YAAe,SAAiB,aAAgC;AACtE,UAAM,UAAU,QAAQ,KAAK;AAC7B,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAI,CAAC,eAAgB,UAAU,OAAO,WAAW,YAAY,eAAe,OAAS,QAAO;AAAA,IAC9F,SAAS,OAAO;AACd,oBAAc,4BAA4B,KAAK;AAAA,IACjD;AACA,UAAM,YAAY,QAAQ,MAAM,2CAA2C;AAC3E,QAAI,WAAW;AACb,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,UAAU,CAAC,CAAC;AACtC,YAAI,CAAC,eAAgB,UAAU,OAAO,WAAW,YAAY,eAAe,OAAS,QAAO;AAAA,MAC9F,SAAS,OAAO;AACd,sBAAc,yBAAyB,KAAK;AAAA,MAC9C;AAAA,IACF;AACA,QAAI,aAAa;AACf,YAAM,QAAQ,QAAQ,MAAM,IAAI,OAAO,aAAe,WAAW,gBAAgB,CAAC;AAClF,UAAI,OAAO;AACT,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,MAAM,CAAC,CAAC;AAClC,cAAI,eAAe,OAAQ,QAAO;AAAA,QACpC,SAAS,OAAO;AACd,wBAAc,2BAA2B,KAAK;AAAA,QAChD;AAAA,MACF;AACA,YAAM,WAAW,QAAQ,MAAM,cAAc;AAC7C,UAAI,gBAAgB,WAAW,UAAU;AACvC,YAAI;AACF,gBAAM,MAAM,KAAK,MAAM,SAAS,CAAC,CAAC;AAClC,cAAI,MAAM,QAAQ,GAAG,EAAG,QAAO,EAAE,OAAO,KAAK,YAAY,SAAS;AAAA,QACpE,SAAS,OAAO;AACd,wBAAc,wBAAwB,KAAK;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,MAAc,aAAuB,iBAGrD;AACD,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,KAAK;AAAA,QAC3B,cAAc,qMAAqM,KAAK,mBAAmB,IAAI;AAAA,QAC/O,YAAY,SAAS,IAAI;AAAA,YAAe,eAAe;AAAA;AAAA;AAAA,QACvD,UAAU;AAAA,QACV,aAAa;AAAA,MACf,CAAC;AACD,YAAM,SAAS,KAAK,YAA4G,KAAK,SAAS,OAAO;AACrJ,UAAI,UAAU,MAAM,QAAQ,OAAO,KAAK,KAAK,OAAO,MAAM,SAAS,EAAG,QAAO;AAAA,IAC/E,SAAS,OAAO;AACd,oBAAc,gBAAgB,KAAK;AAAA,IACrC;AACA,WAAO,EAAE,OAAO,CAAC,GAAG,YAAY,MAAM;AAAA,EACxC;AAAA,EAEA,MAAM,WAAW,MAAc,OAAkD;AAC/E,UAAM,WAAW,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,MAAM,OAAO,MAAM,OAAO,IAAI;AAAA;AAAA,EAAa,QAAQ,MAAM,GAAG,GAAI,CAAC;AAAA,OAAU,EAAE,KAAK,MAAM;AACrI,UAAM,OAAO,MAAM,KAAK,KAAK;AAAA,MAC3B,cAAc,4PAA4P,KAAK,mBAAmB,IAAI;AAAA,MACtS,YAAY,SAAS,IAAI;AAAA;AAAA;AAAA,EAAe,QAAQ;AAAA;AAAA;AAAA,MAChD,UAAU;AAAA,MACV,aAAa;AAAA,IACf,CAAC;AACD,QAAI;AACF,aAAO,KAAK,MAAM,KAAK,OAAO;AAAA,IAChC,SAAS,OAAO;AACd,oBAAc,yBAAyB,KAAK;AAC5C,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,aAA6C;AAC7D,QAAI;AACF,YAAM,OAAO,MAAM,KAAK,KAAK;AAAA,QAC3B,cAAc,+aAA+a,KAAK,mBAAmB,WAAW;AAAA,QAChe,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,WAAW;AAAA,MACb,CAAC;AACD,YAAM,OAAO,KAAK,QAAQ,KAAK,EAAE,YAAY;AAC7C,UAAI,CAAC,aAAa,aAAa,MAAM,eAAe,IAAI,EAAE,SAAS,IAAI,GAAG;AACxE,eAAO;AAAA,MACT;AAAA,IACF,SAAS,OAAO;AACd,oBAAc,oBAAoB,KAAK;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,iBAAyB,eAE9C;AACD,UAAM,OAAO,MAAM,KAAK,KAAK;AAAA,MAC3B,cAAc,+PAAiQ,KAAK,mBAAmB,eAAe;AAAA,MACtT,YAAY,SAAS,eAAe;AAAA;AAAA;AAAA,EAA2B,aAAa;AAAA;AAAA;AAAA,MAC5E,UAAU;AAAA,MACV,aAAa;AAAA,IACf,CAAC;AACD,QAAI;AACF,aAAO,KAAK,MAAM,KAAK,OAAO;AAAA,IAChC,SAAS,OAAO;AACd,oBAAc,gCAAgC,KAAK;AACnD,aAAO,EAAE,OAAO,CAAC,EAAE,QAAQ,WAAW,aAAa,iBAAiB,gBAAgB,YAAY,CAAC,EAAE;AAAA,IACrG;AAAA,EACF;AAAA,EAEQ,iBAAwC;AAC9C,QAAI,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,gBAAiB,QAAO;AACtE,QAAI,QAAQ,IAAI,kBAAmB,QAAO;AAC1C,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,WAAW,KAAuC;AAC9D,UAAM,SAAS,KAAK,OAAO,UAAU,QAAQ,IAAI,kBAAkB;AACnE,UAAM,UAAU,KAAK,OAAO,WAAW,QAAQ,IAAI;AACnD,QAAI,CAAC,UAAU,CAAC,QAAS,QAAO,KAAK,iBAAiB,GAAG;AAEzD,UAAM,OAAgC;AAAA,MACpC,OAAO,KAAK,OAAO,SAAS,eAAe;AAAA,MAC3C,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,IAAI,aAAa;AAAA,QAC5C,EAAE,MAAM,QAAQ,SAAS,IAAI,WAAW;AAAA,MAC1C;AAAA,MACA,YAAY,IAAI,aAAa,KAAK,OAAO;AAAA,MACzC,aAAa,IAAI,eAAe,KAAK,OAAO;AAAA,IAC9C;AAEA,QAAI,KAAK,OAAO,SAAS;AACvB,WAAK,UAAU,KAAK,OAAO;AAAA,IAC7B;AAEA,QAAI,IAAI,UAAU;AAChB,WAAK,kBAAkB,EAAE,MAAM,cAAc;AAAA,IAC/C;AAEA,WAAO,KAAK;AAAA,MACV,KAAK,OAAO,WAAW;AAAA,MACvB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,KAAuC;AACjE,UAAM,SAAS,KAAK,OAAO,UAAU,QAAQ,IAAI;AACjD,QAAI,CAAC,OAAQ,QAAO,KAAK,iBAAiB,GAAG;AAE7C,UAAM,OAAO;AAAA,MACX,OAAO,KAAK,OAAO,SAAS,eAAe;AAAA,MAC3C,YAAY,IAAI,aAAa,KAAK,OAAO;AAAA,MACzC,aAAa,IAAI,eAAe,KAAK,OAAO;AAAA,MAC5C,QAAQ,IAAI,gBAAgB,IAAI,WAAW,uCAAuC;AAAA,MAClF,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,IAAI,WAAW,CAAC;AAAA,IACtD;AAEA,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA,EAAE,qBAAqB,aAAa;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAc,UAAU,KAAuC;AAC7D,QAAI;AACF,YAAM,SAAS,IAAI,eAAe,SAAS,IAAI;AAC/C,YAAM,SAASA,cAAa,UAAU,CAAC,OAAO,KAAK,OAAO,SAAS,aAAa,MAAM,GAAG;AAAA,QACvF,UAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC,CAAC;AACD,aAAO,EAAE,SAAS,OAAO,KAAK,EAAE;AAAA,IAClC,SAAS,OAAO;AACd,oBAAc,oBAAoB,KAAK;AACvC,aAAO,KAAK,iBAAiB,GAAG;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,KAAuC;AAEhE,UAAM,YAAY,KAAK,OAAO,UAAU,QAAQ,IAAI;AACpD,UAAM,gBAAgB,KAAK,OAAO,WAAW,QAAQ,IAAI;AACzD,UAAM,eAAe,QAAQ,IAAI;AACjC,QAAI,aAAa,eAAe;AAC9B,aAAO,KAAK,WAAW,GAAG;AAAA,IAC5B;AACA,QAAI,cAAc;AAChB,aAAO,KAAK,cAAc,GAAG;AAAA,IAC/B;AAGA,QAAI,KAAK,kBAAkB,KAAK,iBAAiB;AAC/C,UAAI;AACF,cAAM,SAAS,KAAK;AASpB,cAAM,SAAS,MAAM,OAAO,QAAQ,OAAO;AAAA,UACzC,MAAM;AAAA,YACJ,QAAQ,IAAI,WACR,GAAG,IAAI,YAAY;AAAA;AAAA,8DACnB,IAAI;AAAA,YACR,SAAS;AAAA,YACT,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,IAAI,WAAW,CAAC;AAAA,UAChD;AAAA,UACA,MAAM,EAAE,IAAI,KAAK,gBAAgB;AAAA,QACnC,CAAC;AAED,cAAM,QAAQ,OAAO,MAAM,SAAS,OAAO,SAAS,CAAC;AACrD,cAAM,WAAW,MAAM,KAAK,CAAC,MAAuC,EAAE,SAAS,MAAM;AACrF,cAAM,OAAO,UAAU,QAAQ;AAE/B,YAAI,KAAK,KAAK,GAAG;AACf,iBAAO,EAAE,SAAS,KAAK,KAAK,GAAG,cAAc,OAAO;AAAA,QACtD;AAAA,MACF,SAAS,OAAO;AACd,sBAAc,gBAAgB,KAAK;AAAA,MACrC;AAAA,IACF;AAEA,WAAO,KAAK,iBAAiB,GAAG;AAAA,EAClC;AAAA,EAEA,MAAc,SAAS,KAAa,QAAgB,MAAe,eAAuC,CAAC,GAAyB;AAClI,QAAI;AACF,YAAM,UAAU,KAAK,UAAU,IAAI;AACnC,YAAM,OAAO;AAAA,QACX;AAAA,QAAM;AAAA,QAAM;AAAA,QAAQ;AAAA,QACpB;AAAA,QAAM;AAAA,QACN;AAAA,QAAM,yBAAyB,MAAM;AAAA,MACvC;AACA,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,YAAY,GAAG;AACjD,aAAK,KAAK,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE;AAAA,MAC9B;AACA,WAAK,KAAK,MAAM,OAAO;AAEvB,YAAM,SAASA,cAAa,QAAQ,MAAM;AAAA,QACxC,UAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAClC,CAAC;AAED,YAAM,OAAO,KAAK,MAAM,MAAM;AAE9B,UAAI,KAAK,OAAO;AACd,eAAO,EAAE,SAAS,cAAc,KAAK,MAAM,WAAW,KAAK,UAAU,KAAK,KAAK,CAAC,GAAG;AAAA,MACrF;AAEA,UAAI,KAAK,SAAS;AAChB,eAAO;AAAA,UACL,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,KAAK,QAAQ,CAAC,GAAG,QAAQ,KAAK,UAAU,KAAK,OAAO;AAAA,UAC/G,OAAO,KAAK,QAAQ,EAAE,cAAc,KAAK,MAAM,gBAAgB,GAAG,kBAAkB,KAAK,MAAM,iBAAiB,EAAE,IAAI;AAAA,UACtH,cAAc,KAAK;AAAA,QACrB;AAAA,MACF;AAEA,YAAM,SAAS,KAAK,UAAU,CAAC;AAC/B,UAAI,QAAQ;AACV,eAAO;AAAA,UACL,SAAS,OAAO,SAAS,WAAW,KAAK,UAAU,MAAM;AAAA,UACzD,OAAO,KAAK,QAAQ,EAAE,cAAc,KAAK,MAAM,iBAAiB,GAAG,kBAAkB,KAAK,MAAM,qBAAqB,EAAE,IAAI;AAAA,UAC3H,cAAc,OAAO;AAAA,QACvB;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,KAAK,UAAU,IAAI,EAAE;AAAA,IACzC,SAAS,GAAG;AACV,aAAO,EAAE,SAAS,oBAAqB,EAAY,OAAO,GAAG;AAAA,IAC/D;AAAA,EACF;AAAA,EAEQ,iBAAiB,KAA8B;AACrD,QAAI,IAAI,UAAU;AAChB,aAAO,EAAE,SAAS,qBAAqB,cAAc,SAAS;AAAA,IAChE;AACA,WAAO,EAAE,SAAS,iLAAiL,cAAc,SAAS;AAAA,EAC5N;AACF;AAEO,IAAM,YAAY,IAAI,UAAU;;;ACngBhC,IAAM,eAAN,MAAmB;AAAA,EAChB,UAAU,oBAAI,IAAuB;AAAA,EACrC,iBAA0B;AAAA,EAC1B;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,eAAe,IAAI,aAAa;AAAA,EACvC;AAAA,EAEA,kBAAkB,QAAuB;AACvC,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,iBAAiB,UAA+B;AAC9C,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,kBAAgC;AAC9B,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,UAAU,iBAAyB,MAAyB;AAClE,UAAM,MAAM,GAAG,eAAe,KAAK,IAAI;AACvC,QAAI,CAAC,KAAK,QAAQ,IAAI,GAAG,GAAG;AAC1B,YAAM,SAAS,IAAI,UAAU;AAC7B,aAAO,kBAAkB,KAAK,cAAc;AAC5C,aAAO,aAAa,GAAG,eAAe,IAAI,IAAI,EAAE;AAChD,UAAI,KAAK,cAAe,QAAO,iBAAiB,KAAK,aAAa;AAClE,WAAK,QAAQ,IAAI,KAAK,MAAM;AAAA,IAC9B;AACA,WAAO,KAAK,QAAQ,IAAI,GAAG;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAQ,KAAyC;AACrD,UAAM,SAAS,KAAK,UAAU,IAAI,WAAW,IAAI,IAAI;AACrD,UAAM,UAAU,KAAK,aAAa,WAAW,IAAI,IAAiB,KAC7D,KAAK,aAAa,UAAU,IAAI,IAAI;AAGzC,UAAM,cAAwB,CAAC;AAC/B,QAAI,SAAS,QAAQ;AACnB,kBAAY,KAAK,QAAQ,MAAM;AAAA,IACjC,OAAO;AACL,kBAAY,KAAK,aAAa,IAAI,IAAI,kCAAkC;AAAA,IAC1E;AACA,gBAAY,KAAK;AAAA;AAAA,gBAAqB,IAAI,eAAe,EAAE;AAE3D,QAAI,IAAI,iBAAiB;AACvB,kBAAY,KAAK;AAAA;AAAA;AAAA,EAA4B,IAAI,eAAe,EAAE;AAAA,IACpE;AACA,QAAI,IAAI,mBAAmB,IAAI,gBAAgB,SAAS,GAAG;AACzD,kBAAY,KAAK;AAAA;AAAA;AAAA,EAA4B,IAAI,gBAAgB,IAAI,OAAK,QAAQ,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IACxH;AACA,QAAI,IAAI,gBAAgB,IAAI,aAAa,SAAS,GAAG;AACnD,kBAAY,KAAK;AAAA;AAAA;AAAA,EAAyB,IAAI,aAAa,IAAI,OAAK,IAAI,EAAE,GAAG,SAAS,EAAE,SAAS,MAAM,EAAE,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,IAC9I;AAEA,QAAI;AACF,YAAM,OAAO,MAAM,OAAO,KAAK;AAAA,QAC7B,cAAc,YAAY,KAAK,IAAI;AAAA,QACnC,YAAY,IAAI;AAAA,QAChB,aAAa;AAAA,QACb,WAAW;AAAA,MACb,CAAC;AACD,YAAM,SAAS,KAAK;AACpB,UAAI,OAAO,WAAW,WAAW,KAAK,OAAO,WAAW,UAAU,GAAG;AACnE,eAAO,EAAE,QAAQ,SAAS,OAAO,OAAO,OAAO;AAAA,MACjD;AACA,aAAO,EAAE,QAAQ,SAAS,MAAM,WAAW,OAAO,gBAAgB,EAAE;AAAA,IACtE,SAAS,GAAG;AACV,aAAO,EAAE,QAAQ,IAAI,SAAS,OAAO,OAAQ,EAAY,QAAQ;AAAA,IACnE;AAAA,EACF;AACF;;;AC/EO,IAAM,eAAN,MAAmB;AAAA,EAChB,YAAY,oBAAI,IAA8B;AAAA,EAC9C,aAAa,oBAAI,IAItB;AAAA,EACK,YAA8B;AAAA,EAEtC,aAAa,QAAyB;AACpC,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,eAAe,UAAkC;AAC/C,SAAK,UAAU,IAAI,SAAS,IAAI,QAAQ;AAAA,EAC1C;AAAA,EAEA,YAAY,IAA0C;AACpD,WAAO,KAAK,UAAU,IAAI,EAAE;AAAA,EAC9B;AAAA,EAEA,gBAAoC;AAClC,WAAO,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,EACpC;AAAA,EAEA,SAAS,OAAe,YAA6B;AACnD,UAAM,WAAW,KAAK,UAAU,IAAI,UAAU;AAC9C,QAAI,CAAC,SAAU,QAAO;AACtB,SAAK,WAAW,IAAI,OAAO;AAAA,MACzB;AAAA,MACA,mBAAmB;AAAA,MACnB,cAAc,oBAAI,IAAI;AAAA,IACxB,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,OAAqC;AACnD,UAAM,MAAM,KAAK,WAAW,IAAI,KAAK;AACrC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,WAAW,KAAK,UAAU,IAAI,IAAI,UAAU;AAClD,QAAI,CAAC,SAAU,QAAO;AACtB,QAAI,IAAI,qBAAqB,SAAS,OAAO,OAAQ,QAAO;AAC5D,WAAO,SAAS,OAAO,IAAI,iBAAiB;AAAA,EAC9C;AAAA,EAEA,aAAa,OAAe,QAAgB,QAAwC;AAClF,UAAM,MAAM,KAAK,WAAW,IAAI,KAAK;AACrC,QAAI,CAAC,IAAK,QAAO;AACjB,UAAM,WAAW,KAAK,UAAU,IAAI,IAAI,UAAU;AAClD,QAAI,CAAC,SAAU,QAAO;AAEtB,UAAM,eAAe,SAAS,OAAO,IAAI,iBAAiB;AAC1D,QAAI,cAAc;AAChB,UAAI,aAAa,IAAI,aAAa,MAAM,EAAE,QAAQ,QAAQ,aAAa,CAAC,EAAE,CAAC;AAAA,IAC7E;AAEA,QAAI;AACJ,QAAI,IAAI,qBAAqB,SAAS,OAAO,OAAQ,QAAO;AAC5D,WAAO,SAAS,OAAO,IAAI,iBAAiB;AAAA,EAC9C;AAAA,EAEA,eAAe,OAAe,MAAuF;AACnH,WAAO,KAAK,WAAW,IAAI,KAAK,GAAG,aAAa,IAAI,IAAI;AAAA,EAC1D;AAAA,EAEA,mBAAmB,OAAyF;AAC1G,WAAO,KAAK,WAAW,IAAI,KAAK,GAAG,gBAAgB,oBAAI,IAAI;AAAA,EAC7D;AAAA,EAEA,MAAM,cACJ,YACA,QACA,iBACA,cACgC;AAChC,UAAM,SAA0C,CAAC;AAGjD,eAAW,CAAC,MAAM,MAAM,KAAK,iBAAiB;AAC5C,UAAI,SAAS,WAAY;AACzB,UAAI,CAAC,OAAO,UAAU,OAAO,OAAO,KAAK,EAAE,WAAW,GAAG;AACvD,eAAO,KAAK,EAAE,UAAU,WAAW,aAAa,eAAe,IAAI,sCAAsC,QAAQ,KAAK,CAAC;AAAA,MACzH;AAAA,IACF;AAGA,QAAI,KAAK,aAAa,gBAAgB,QAAQ,GAAG;AAC/C,YAAM,iBAAiB,CAAC,GAAG,eAAe,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,UAAU;AAC5E,YAAM,kBAAkB,eAAe,IAAI,CAAC,CAAC,GAAG,GAAG,MAAM,OAAO,CAAC;AAAA,EAAK,IAAI,OAAO,MAAM,GAAG,GAAI,CAAC,EAAE,EAAE,KAAK,MAAM;AAE9G,YAAM,mBAAmB;AAAA;AAAA;AAAA,EAG7B,eAAe;AAAA;AAAA,iBAEA,UAAU;AAAA,EACzB,OAAO,MAAM,GAAG,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYjB,UAAI;AACF,cAAM,UAAU,MAAM,KAAK,UAAU,KAAK;AAAA,UACxC,cAAc;AAAA,UACd,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,aAAa;AAAA,UACb,WAAW;AAAA,QACb,CAAC;AACD,cAAM,SAAS,KAAK,MAAM,QAAQ,OAAO;AACzC,YAAI,OAAO,UAAU,MAAM,QAAQ,OAAO,MAAM,GAAG;AACjD,qBAAW,SAAS,OAAO,QAAQ;AACjC,gBAAI,MAAM,YAAY,MAAM,eAAe,CAAC,OAAO,KAAK,OAAK,EAAE,gBAAgB,MAAM,WAAW,GAAG;AACjG,qBAAO,KAAK;AAAA,gBACV,UAAU,MAAM;AAAA,gBAChB,aAAa,MAAM;AAAA,gBACnB,QAAQ,MAAM,UAAU;AAAA,cAC1B,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAAsC;AAAA,IAChD;AAEA,UAAM,SAAS,OAAO,OAAO,OAAK,EAAE,aAAa,OAAO,EAAE,WAAW;AACrE,UAAM,UAAU,SACZ,4BAA4B,gBAAgB,IAAI,yCAChD,0BAA0B,OAAO,MAAM,cAAc,OAAO,OAAO,OAAK,EAAE,aAAa,OAAO,EAAE,MAAM,cAAc,OAAO,OAAO,OAAK,EAAE,aAAa,SAAS,EAAE,MAAM;AAE3K,WAAO,EAAE,OAAO,YAAY,aAAa,YAAY,QAAQ,QAAQ,QAAQ;AAAA,EAC/E;AAAA,EAEA,oBAAoB,MAAc,OAAe,cAA2C;AAC1F,UAAM,QAAkB,CAAC;AACzB,UAAM,MAAM,KAAK,WAAW,IAAI,KAAK;AACrC,QAAI,CAAC,IAAK,QAAO;AAEjB,UAAM,WAAW,KAAK,UAAU,IAAI,IAAI,UAAU;AAClD,QAAI,UAAU;AACZ,YAAM,KAAK,gBAAgB,SAAS,IAAI,EAAE;AAC1C,YAAM,KAAK,SAAS,OAAO;AAAA,QAAI,CAAC,GAAG,MACjC,KAAK,IAAI,IAAI,oBAAoB,WAAM,MAAM,IAAI,oBAAoB,WAAM,QAAG,MAAM,EAAE,IAAI,OAAO,EAAE,WAAW;AAAA,MAChH,EAAE,KAAK,IAAI,CAAC;AACZ,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,eAAW,CAAC,UAAU,MAAM,KAAK,IAAI,cAAc;AACjD,UAAI,aAAa,KAAM;AACvB,YAAM,KAAK,mBAAmB,QAAQ,EAAE;AACxC,YAAM,KAAK,OAAO,OAAO,MAAM,GAAG,GAAG,CAAC;AACtC,UAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,cAAM,KAAK,mBAAmB,OAAO,OAAO,KAAK,IAAI,CAAC,EAAE;AAAA,MAC1D;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,KAAK,mBAAmB;AAC9B,iBAAW,SAAS,cAAc;AAChC,cAAM,KAAK,IAAI,MAAM,GAAG,SAAS,MAAM,SAAS,MAAM,MAAM,MAAM,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,MACnF;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,qBAAqB,aAA6B;AAChD,UAAM,IAAI,YAAY,YAAY;AAClC,QAAI,EAAE,SAAS,SAAS,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,WAAW,KAAK,EAAE,SAAS,KAAK,EAAG,QAAO;AACvG,QAAI,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,QAAQ,EAAG,QAAO;AAC3E,QAAI,EAAE,SAAS,UAAU,KAAK,EAAE,SAAS,aAAa,KAAK,EAAE,SAAS,SAAS,EAAG,QAAO;AACzF,QAAI,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,SAAS,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,SAAS,IAAI,EAAG,QAAO;AAClG,WAAO;AAAA,EACT;AAAA,EAEA,sBAA0C;AACxC,WAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,EAAE,MAAM,MAAM,aAAa,8CAA8C;AAAA,UACzE,EAAE,MAAM,aAAa,aAAa,8CAA8C;AAAA,UAChF,EAAE,MAAM,aAAa,aAAa,mDAAmD;AAAA,UACrF,EAAE,MAAM,MAAM,aAAa,qEAAqE;AAAA,QAClG;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,MACtB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,EAAE,MAAM,MAAM,aAAa,mDAAmD;AAAA,UAC9E,EAAE,MAAM,aAAa,aAAa,qBAAqB;AAAA,UACvD,EAAE,MAAM,MAAM,aAAa,0CAA0C;AAAA,QACvE;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,MACtB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,EAAE,MAAM,aAAa,aAAa,8CAA8C;AAAA,UAChF,EAAE,MAAM,aAAa,aAAa,0BAA0B;AAAA,UAC5D,EAAE,MAAM,MAAM,aAAa,yCAAyC;AAAA,QACtE;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,MACtB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,EAAE,MAAM,MAAM,aAAa,8BAA8B;AAAA,UACzD,EAAE,MAAM,MAAM,aAAa,mDAAmD;AAAA,UAC9E,EAAE,MAAM,eAAe,aAAa,qCAAqC;AAAA,QAC3E;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;;;ACtNO,SAAS,sBACd,MACA,gBACA,UACA,OACA,gBACiB;AACjB,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,IAAI,SAAS,KAAK,IAAI,CAAC;AAAA,MACvB;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,UAAU,SAAS,MAAM,GAAG,EAAE;AAAA,MAC9B,SAAS,kBAAkB,CAAC;AAAA,IAC9B;AAAA,IACA,UAAU;AAAA,MACR,OAAO,MAAM,IAAI,CAAC,GAAG,OAAO;AAAA,QAC1B,OAAO,IAAI;AAAA,QACX,QAAQ,EAAE;AAAA,QACV,aAAa,EAAE;AAAA,QACf,MAAM,EAAE;AAAA,QACR,gBAAgB,EAAE;AAAA,QAClB,UAAU,EAAE,YAAY,cAAc,EAAE,QAAQ,EAAE,WAAW;AAAA,MAC/D,EAAE;AAAA,MACF,mBAAmB,GAAG,MAAM,SAAS,CAAC;AAAA,MACtC,gBAAgB,MAAM,KAAK,OAAK,EAAE,SAAS,kBAAkB;AAAA,IAC/D;AAAA,IACA,SAAS;AAAA,MACP,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,kBAAkB,CAAC;AAAA,IACrB;AAAA,IACA,OAAO;AAAA,MACL,WAAW;AAAA,MACX,UAAU;AAAA,MACV,cAAc;AAAA,MACd,YAAY;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,cAAc,QAAgB,aAAyC;AAC9E,QAAM,QAAQ,OAAO,YAAY,IAAI,MAAM,YAAY,YAAY;AAEnE,MAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,OAAO,GAAG;AAChF,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,QAAQ,GAAG;AACxD,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,MAAM,GAAG;AAClF,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,SAAS,GAAG;AAC1D,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,MAAM,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,OAAgC;AAC7D,SAAO,KAAK,UAAU,OAAO,MAAM,CAAC;AACtC;AAYO,SAAS,aAAa,OAAgC;AAC3D,MAAI,MAAM,aAAa,MAAM,KAAK,IAAI;AAAA;AAAA;AACtC,SAAO,eAAe,MAAM,KAAK,MAAM;AAAA;AACvC,SAAO,gBAAgB,MAAM,KAAK,OAAO;AAAA;AACzC,SAAO,eAAe,MAAM,KAAK,MAAM;AAAA;AACvC,SAAO,sBAAsB,MAAM,QAAQ,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA;AACxE,SAAO,cAAc,MAAM,QAAQ,UAAU;AAAA;AAAA;AAC7C,SAAO;AAAA,cAA4B,MAAM,QAAQ,OAAO;AAAA,cAAkB,MAAM,QAAQ,SAAS,KAAK,IAAI,CAAC;AAAA;AAAA;AAC3G,SAAO;AAAA;AACP,aAAW,QAAQ,MAAM,SAAS,OAAO;AACvC,WAAO,GAAG,KAAK,KAAK,OAAO,KAAK,MAAM,aAAQ,KAAK,WAAW;AAAA;AAC9D,QAAI,KAAK,KAAM,QAAO,cAAc,KAAK,IAAI;AAAA;AAC7C,WAAO,gBAAgB,KAAK,cAAc;AAAA;AAAA,EAC5C;AACA,SAAO;AACT;;;AChJO,IAAM,wBAAwB;AAS9B,IAAM,sBAAN,MAA0B;AAAA,EACvB,aAAgC,CAAC;AAAA,EAEzC,cAAc;AACZ,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEQ,kBAAwB;AAC9B,SAAK,kBAAkB;AAAA,MACrB,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,aAAa;AAAA,MACb,OAAO,CAAC,SAAkB;AACxB,cAAM,IAAI;AACV,eAAO;AAAA,UACL,gBAAgB;AAAA,UAChB,GAAG;AAAA,UACH,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,YAAY;AAAA,QACd;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,kBAAkB,WAAkC;AAClD,UAAM,SAAS,KAAK,WAAW,KAAK,OAAK,EAAE,SAAS,UAAU,QAAQ,EAAE,OAAO,UAAU,EAAE;AAC3F,QAAI,CAAC,QAAQ;AACX,WAAK,WAAW,KAAK,SAAS;AAC9B,WAAK,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAAA,IAChD;AAAA,EACF;AAAA,EAEA,QAAW,MAAS,gBAA2B;AAC7C,QAAI,SAAS;AACb,eAAW,KAAK,KAAK,YAAY;AAC/B,UAAI,EAAE,SAAS,gBAAgB;AAC7B,iBAAS,EAAE,MAAM,MAAM;AACvB,yBAAiB,EAAE;AAAA,MACrB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAmC;AACjC,WAAO,CAAC,GAAG,KAAK,UAAU;AAAA,EAC5B;AAAA,EAEA,OAAO,iBAAyB;AAC9B,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBAAwB,MAAS,MAAqF;AACpI,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,EACrC;AACF;AAEO,SAAS,oBAAuB,UAAyF;AAC9H,QAAM,IAAI;AACV,MAAI,CAAC,KAAK,OAAO,EAAE,mBAAmB,YAAY,OAAO,EAAE,SAAS,YAAY,CAAC,EAAE,KAAM,QAAO;AAChG,SAAO;AAAA,IACL,SAAS,EAAE;AAAA,IACX,MAAM,EAAE;AAAA,IACR,MAAM,EAAE;AAAA,IACR,WAAY,OAAO,EAAE,eAAe,WAAW,EAAE,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACvF;AACF;;;ACnEO,IAAM,aAAN,MAAiB;AAAA,EACd,SAAS,oBAAI,IAAyB;AAAA,EAE9C,MAAM,QAAQ,MAAyC,cAAwB,CAAC,GAAgC;AAC9G,UAAM,UAAU,KAAK;AAErB,QAAI,CAAC,KAAK,qBAAqB,OAAO,EAAG,QAAO;AAEhD,UAAM,OAAO,KAAK,YAAY,OAAO;AACrC,QAAI,CAAC,KAAM,QAAO;AAElB,UAAM,QAAQ,KAAK,aAAa,OAAO;AACvC,QAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,UAAM,WAAW,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,KAAK,OAAK,EAAE,WAAW,KAAK,SAAS,IAAI;AACpF,QAAI,UAAU;AACZ,eAAS;AACT,eAAS,eAAe,SAAS,eAAe,SAAS,aAAa,KAAK,KAAK,SAAS;AACzF,eAAS,YAAW,oBAAI,KAAK,GAAE,YAAY;AAC3C,eAAS,WAAW,QAAQ,aAAa,SAAS;AAClD,eAAS,WAAW,QAAQ,cAAc,SAAS;AACnD,eAAS,WAAW,MAAM,WAAW,SAAS;AAC9C,eAAS,WAAW,MAAM,eAAe,SAAS;AAClD,eAAS,WAAW,MAAM,aAAa;AACvC,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,gBAAgB,OAAO;AAC7C,UAAM,gBAAgB,KAAK,WAAW,OAAO;AAE7C,UAAM,MAAM;AAAA,MACV;AAAA,MACA,KAAK,eAAe,OAAO;AAAA,MAC3B;AAAA,MACA,MAAM,IAAI,CAAC,GAAG,OAAO;AAAA,QACnB,QAAQ,KAAK,YAAY,CAAC;AAAA,QAC1B,aAAa;AAAA,QACb,MAAM,cAAc,CAAC,KAAK,KAAK,iBAAiB,CAAC;AAAA,QACjD,gBAAgB,QAAQ,IAAI,CAAC;AAAA,MAC/B,EAAE;AAAA,MACF,YAAY,SAAS,IAAI,cAAc;AAAA,IACzC;AAEA,UAAM,SAAsB;AAAA,MAC1B,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC;AAEA,SAAK,OAAO,IAAI,IAAI,KAAK,IAAI,MAAM;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAA8B;AACjC,UAAM,IAAI,MAAM,YAAY;AAC5B,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAC5B;AAAA,MAAO,OACN,EAAE,WAAW,KAAK,KAAK,YAAY,EAAE,SAAS,CAAC,KAC/C,EAAE,WAAW,QAAQ,QAAQ,YAAY,EAAE,SAAS,CAAC,KACrD,EAAE,WAAW,KAAK,KAAK,YAAY,EAAE,SAAS,CAAC;AAAA,IACjD,EACC,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW,EAC5C,MAAM,GAAG,CAAC;AAAA,EACf;AAAA,EAEA,SAAwB;AACtB,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,QAAQ,CAAC;AAAA,EACtF;AAAA,EAEA,QAAQ,IAAqC;AAC3C,WAAO,KAAK,OAAO,IAAI,EAAE;AAAA,EAC3B;AAAA,EAEA,cAAc,SAA0B;AACtC,UAAM,SAAS,KAAK,OAAO,IAAI,OAAO;AACtC,QAAI,CAAC,OAAQ,QAAO;AAEpB,WAAO;AACP,WAAO,cAAe,OAAO,eAAe,OAAO,aAAa,KAAM,OAAO;AAC7E,WAAO,WAAW,QAAQ,aAAa,OAAO;AAC9C,WAAO,WAAW,QAAQ,cAAc,OAAO;AAC/C,WAAO,WAAW,QAAQ,iBAAiB,KAAK,cAAa,oBAAI,KAAK,GAAE,YAAY,CAAC,EAAE;AACvF,WAAO,WAAW,MAAM,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAC9D,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,SAAgC;AAC7C,UAAM,SAAS,KAAK,OAAO,IAAI,OAAO;AACtC,QAAI,CAAC,OAAQ,QAAO;AACpB,WAAO,KAAK,UAAU,qBAAqB,OAAO,YAAY,OAAO,GAAG,MAAM,CAAC;AAAA,EACjF;AAAA,EAEA,mBAAmB,MAAuB;AACxC,UAAM,SAAS,oBAAqC,KAAK,MAAM,IAAI,CAAC;AACpE,QAAI,CAAC,UAAU,OAAO,SAAS,QAAS,QAAO;AAE/C,UAAM,WAAW,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,EAAE;AACpD,QAAI,UAAU;AACZ,eAAS,aAAa,OAAO;AAC7B,eAAS,aAAa,OAAO,KAAK,QAAQ;AAC1C,eAAS,cAAc,OAAO,KAAK,QAAQ;AAC3C,eAAS,WAAW,OAAO,KAAK,MAAM;AACtC,aAAO;AAAA,IACT;AAEA,SAAK,OAAO,IAAI,OAAO,KAAK,KAAK,IAAI;AAAA,MACnC,YAAY,OAAO;AAAA,MACnB,YAAY,OAAO,KAAK,QAAQ;AAAA,MAChC,aAAa,OAAO,KAAK,QAAQ;AAAA,MACjC,UAAU,OAAO,KAAK,MAAM;AAAA,IAC9B,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,SAA0B;AACrD,UAAM,QAAQ,QAAQ,YAAY;AAClC,YAAQ,MAAM,SAAS,QAAG,KAAK,MAAM,SAAS,SAAS,OAAO,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,UAAU,KAAK,MAAM,SAAS,MAAM;AAAA,EAC7I;AAAA,EAEQ,YAAY,SAAgC;AAClD,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,eAAW,KAAK,UAAU;AACxB,YAAM,IAAI,QAAQ,MAAM,CAAC;AACzB,UAAI,EAAG,QAAO,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA,IACvC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,SAA2B;AAC9C,UAAM,QAAkB,CAAC;AACzB,UAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,eAAW,QAAQ,OAAO;AACxB,YAAM,IAAI,KAAK,MAAM,eAAe;AACpC,UAAI,EAAG,OAAM,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,SAAyB;AAC9C,UAAM,WAAW,QAAQ,MAAM,eAAe;AAC9C,YAAQ,YAAY,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG;AAAA,EAC9C;AAAA,EAEQ,gBAAgB,SAA2B;AACjD,WAAO,CAAC,GAAG,IAAI,IAAI,QAAQ,MAAM,eAAe,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,GAAG,EAAE;AAAA,EACvE;AAAA,EAEQ,YAAY,UAA0B;AAC5C,UAAM,QAAQ,SAAS,YAAY;AACnC,QAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,OAAO,EAAG,QAAO;AACzF,QAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,QAAQ,EAAG,QAAO;AACjE,QAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,QAAQ,EAAG,QAAO;AACvH,QAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,OAAO,EAAG,QAAO;AACjE,QAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,OAAO,EAAG,QAAO;AAC1F,QAAI,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC5D,QAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,SAAS,EAAG,QAAO;AAC7F,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,UAAsC;AAC7D,UAAM,QAAQ,SAAS,YAAY;AACnC,QAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,YAAY,EAAG,QAAO;AACnE,QAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,aAAa,EAAG,QAAO;AACrE,QAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,QAAQ,EAAG,QAAO;AAC/D,QAAI,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AACtF,QAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,KAAK,EAAG,QAAO;AACxF,QAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAC/D,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,SAA2B;AAC5C,UAAM,QAAkB,CAAC;AACzB,UAAM,eAAyD;AAAA,MAC7D,EAAE,SAAS,mBAAmB,MAAM,OAAO;AAAA,MAC3C,EAAE,SAAS,mBAAmB,MAAM,OAAO;AAAA,MAC3C,EAAE,SAAS,qBAAqB,MAAM,QAAQ;AAAA,MAC9C,EAAE,SAAS,4BAA4B,MAAM,OAAO;AAAA,MACpD,EAAE,SAAS,0BAA0B,MAAM,OAAO;AAAA,IACpD;AACA,eAAW,EAAE,SAAS,MAAAC,MAAK,KAAK,cAAc;AAC5C,UAAI,QAAQ,KAAK,OAAO,EAAG,OAAM,KAAKA,KAAI;AAAA,IAC5C;AACA,WAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AAAA,EAC3B;AACF;;;ACpLO,IAAM,gBAAN,MAAoB;AAAA,EACjB,WAAsB,CAAC;AAAA,EACvB,WAAW,IAAI,oBAAoB;AAAA,EACnC;AAAA,EAER,uBAAuB,IAAsC;AAC3D,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,OAAO,WAAmB,UAAkB,SAA6B,WAAqB,cAAiC;AAC7H,UAAM,UAAmB;AAAA,MACvB,IAAI,MAAM,KAAK,IAAI,CAAC;AAAA,MACpB;AAAA,MACA;AAAA,MACA,SAAS,GAAG,YAAY,YAAY,cAAc,YAAY,YAAY,wBAAwB,QAAQ,KAAK,QAAQ;AAAA,MACvH;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,MAAM,KAAK,YAAY,UAAU,SAAS;AAAA,IAC5C;AAEA,SAAK,SAAS,KAAK,OAAO;AAC1B,SAAK,WAAW,OAAO;AACvB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,OAA0B;AAC/B,UAAM,IAAI,MAAM,YAAY;AAC5B,WAAO,KAAK,SACT;AAAA,MAAO,OACN,EAAE,SAAS,YAAY,EAAE,SAAS,CAAC,KACnC,EAAE,KAAK,KAAK,OAAK,EAAE,SAAS,CAAC,CAAC,KAC9B,EAAE,UAAU,KAAK,OAAK,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,KACjD,EAAE,aAAa,KAAK,OAAK,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,IACtD,EACC,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC,EACrD,MAAM,GAAG,EAAE;AAAA,EAChB;AAAA,EAEA,UAAU,QAAQ,IAAe;AAC/B,WAAO,CAAC,GAAG,KAAK,QAAQ,EACrB,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC,EACrD,MAAM,GAAG,KAAK;AAAA,EACnB;AAAA,EAEA,aAAa,WAA8B;AACzC,WAAO,KAAK,SAAS,OAAO,OAAK,EAAE,cAAc,SAAS;AAAA,EAC5D;AAAA,EAEA,WAAmF;AACjF,WAAO;AAAA,MACL,OAAO,KAAK,SAAS;AAAA,MACrB,YAAY,KAAK,SAAS,OAAO,OAAK,EAAE,YAAY,SAAS,EAAE;AAAA,MAC/D,SAAS,KAAK,SAAS,OAAO,OAAK,EAAE,YAAY,SAAS,EAAE;AAAA,MAC5D,QAAQ,KAAK,SAAS,OAAO,OAAK,EAAE,YAAY,QAAQ,EAAE;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,cAAc,IAAoC;AAChD,UAAM,KAAK,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,EAAE;AAC9C,QAAI,CAAC,GAAI,QAAO;AAChB,WAAO,qBAAqB,IAAI,SAAS;AAAA,EAC3C;AAAA,EAEA,cAAc,UAAoC;AAChD,UAAM,SAAS,oBAA6B,QAAQ;AACpD,QAAI,CAAC,UAAU,OAAO,SAAS,UAAW,QAAO;AAEjD,QAAI,OAAO,UAAU,uBAAuB;AAC1C,YAAM,WAAW,KAAK,SAAS,QAAQ,OAAO,MAAM,OAAO,OAAO;AAClE,WAAK,SAAS,KAAK,QAAQ;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,KAAK,SAAS,KAAK,OAAK,EAAE,OAAO,OAAO,KAAK,EAAE,GAAG;AACrD,WAAK,SAAS,KAAK,OAAO,IAAI;AAC9B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAA+B;AAC7B,WAAO,KAAK,SAAS,IAAI,OAAK,qBAAqB,GAAG,SAAS,CAAoB;AAAA,EACrF;AAAA,EAEA,cAAmC;AACjC,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,YAAY,MAAc,WAA+B;AAC/D,UAAM,QAAQ,CAAC,GAAG,KAAK,MAAM,KAAK,GAAG,GAAG,UAAU,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACxE,WAAO,CAAC,GAAG,IAAI,IAAI,MAAM,OAAO,OAAK,EAAE,SAAS,CAAC,EAAE,IAAI,OAAK,EAAE,YAAY,CAAC,CAAC,CAAC;AAAA,EAC/E;AACF;;;ACnHA,SAAS,cAAAC,aAAY,gBAAAC,qBAAoB;AACzC,SAAS,WAAAC,UAAS,kBAAkB;AAgB7B,IAAM,qBAAN,MAAyB;AAAA,EACtB;AAAA,EAER,YAAY,UAAkB;AAC5B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,iBAAyB,eAA6C;AAC1E,UAAM,SAAwB,CAAC;AAE/B,UAAM,aAAa,KAAK,kBAAkB,eAAe;AACzD,eAAW,SAAS,YAAY;AAC9B,YAAM,WAAW,KAAK,YAAY,KAAK;AACvC,YAAM,SAAS,WAAWF,YAAW,QAAQ,IAAI;AACjD,aAAO,KAAK;AAAA,QACV;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,SAAS,WAAW;AAAA,QAC5B,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,KAAK,sBAAsB,eAAe;AAC7D,eAAW,SAAS,YAAY;AAC9B,YAAM,WAAW,KAAK,YAAY,MAAM,IAAI;AAC5C,YAAM,QAAQ,WAAW,KAAK,eAAe,MAAM,UAAU,UAAU,aAAa,IAAI;AACxF,aAAO,KAAK;AAAA,QACV,OAAO,GAAG,MAAM,QAAQ,OAAO,MAAM,IAAI;AAAA,QACzC,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,QAAQ,UAAU;AAAA,QAC1B,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,UAAM,eAAe,KAAK,oBAAoB,eAAe;AAC7D,eAAW,SAAS,cAAc;AAChC,YAAM,WAAW,KAAK,YAAY,KAAK;AACvC,YAAM,SAAS,WAAWA,YAAW,QAAQ,IAAI;AACjD,aAAO,KAAK;AAAA,QACV;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,SAAS,WAAW;AAAA,QAC5B,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,UAAM,YAAY,KAAK,0BAA0B,iBAAiB,aAAa;AAC/E,eAAW,SAAS,WAAW;AAC7B,YAAM,WAAW,KAAK,YAAY,MAAM,IAAI;AAC5C,YAAM,WAAW,WAAW,KAAK,mBAAmB,MAAM,QAAQ,MAAM,MAAM,QAAQ,IAAI;AAC1F,aAAO,KAAK;AAAA,QACV,OAAO,GAAG,MAAM,MAAM,OAAO,MAAM,IAAI;AAAA,QACvC,MAAM;AAAA,QACN,UAAU;AAAA,QACV,QAAQ,WAAW,sBAAsB;AAAA,QACzC,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,UAAM,SAAS,OAAO,MAAM,OAAK,EAAE,QAAQ;AAC3C,UAAM,cAAc,OAAO,OAAO,OAAK,CAAC,EAAE,QAAQ,EAAE;AAEpD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,SAAS,SACL,yBACA,GAAG,WAAW;AAAA,IACpB;AAAA,EACF;AAAA,EAEQ,YAAY,OAA8B;AAChD,UAAM,aAAa,MAAM,QAAQ,SAAS,EAAE;AAC5C,QAAI,WAAW,UAAU,GAAG;AAC1B,UAAI,CAAC,WAAW,WAAW,KAAK,QAAQ,EAAG,QAAO;AAClD,aAAO;AAAA,IACT;AACA,UAAM,WAAWE,SAAQ,KAAK,UAAU,UAAU;AAClD,QAAI,CAAC,SAAS,WAAW,KAAK,QAAQ,EAAG,QAAO;AAChD,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,QAA0B;AAClD,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAEA,UAAM,QAAQ,oBAAI,IAAY;AAC9B,eAAW,WAAW,UAAU;AAC9B,iBAAW,SAAS,OAAO,SAAS,OAAO,GAAG;AAC5C,cAAM,OAAO,MAAM,CAAC;AACpB,YAAI,QAAQ,KAAK,SAAS,EAAG,OAAM,IAAI,IAAI;AAAA,MAC7C;AAAA,IACF;AAEA,WAAO,CAAC,GAAG,KAAK;AAAA,EAClB;AAAA,EAEQ,sBAAsB,QAA2D;AACvF,UAAM,UAAqD,CAAC;AAC5D,UAAM,UAAU;AAEhB,eAAW,SAAS,OAAO,SAAS,OAAO,GAAG;AAC5C,cAAQ,KAAK,EAAE,UAAU,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,IACrD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,QAA0B;AACpD,UAAM,QAAQ,oBAAI,IAAY;AAC9B,UAAM,UAAU;AAEhB,eAAW,SAAS,OAAO,SAAS,OAAO,GAAG;AAC5C,YAAM,MAAM,MAAM,CAAC;AACnB,UAAI,OAAO,IAAI,SAAS,EAAG,OAAM,IAAI,GAAG;AAAA,IAC1C;AAEA,WAAO,CAAC,GAAG,KAAK;AAAA,EAClB;AAAA,EAEQ,0BAA0B,QAAgB,gBAAmE;AACnH,UAAM,UAAmD,CAAC;AAE1D,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,WAAW,UAAU;AAC9B,iBAAW,SAAS,OAAO,SAAS,OAAO,GAAG;AAC5C,gBAAQ,KAAK,EAAE,QAAQ,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,MACnD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,YAAoB,cAAsB,cAA+B;AAClG,QAAI;AACF,YAAM,UAAUD,cAAa,cAAc,OAAO;AAElD,YAAM,WAAW,aAAa,SAAS,KAAK;AAC5C,YAAM,OAAO,aAAa,SAAS,KAAK;AACxC,YAAM,SAAS,aAAa,SAAS,KAAK;AAE1C,UAAI,UAAU;AACZ,cAAM,aAAa,IAAI,OAAO,UAAU,UAAU,SAAS;AAC3D,cAAM,eAAe,IAAI,OAAO,YAAY,UAAU,UAAU;AAChE,eAAO,WAAW,KAAK,OAAO,KAAK,aAAa,KAAK,OAAO;AAAA,MAC9D;AAEA,UAAI,MAAM;AACR,cAAM,cAAc,IAAI,OAAO,0CAA0C,UAAU,SAAS;AAC5F,eAAO,YAAY,KAAK,OAAO;AAAA,MACjC;AAEA,UAAI,QAAQ;AACV,cAAM,YAAY,IAAI,OAAO,qBAAqB,UAAU,UAAU;AACtE,cAAM,cAAc,IAAI,OAAO,2BAA2B,UAAU,UAAU;AAC9E,eAAO,UAAU,KAAK,OAAO,KAAK,YAAY,KAAK,OAAO;AAAA,MAC5D;AAEA,YAAM,WAAW;AAAA,QACf,IAAI,OAAO,8FAA8F,UAAU,KAAK;AAAA,QACxH,IAAI,OAAO,GAAG,UAAU,WAAW;AAAA,QACnC,IAAI,OAAO,iBAAiB,UAAU,SAAS;AAAA,MACjD;AACA,aAAO,SAAS,KAAK,OAAK,EAAE,KAAK,OAAO,CAAC;AAAA,IAC3C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,eAAe,UAAkB,MAAc,aAAgC;AACrF,QAAI;AACF,YAAM,UAAUA,cAAa,MAAM,OAAO;AAC1C,YAAM,WAAW;AAAA,QACf,IAAI,OAAO,8FAA8F,QAAQ,KAAK;AAAA,QACtH,IAAI,OAAO,GAAG,QAAQ,WAAW;AAAA,QACjC,IAAI,OAAO,iBAAiB,QAAQ,SAAS;AAAA,MAC/C;AACA,aAAO,SAAS,KAAK,OAAK,EAAE,KAAK,OAAO,CAAC;AAAA,IAC3C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AC/MA,SAAS,gBAAAE,qBAAoB;AAC7B,SAAS,eAAe,WAAW,cAAAC,mBAAkB;AACrD,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AA6CvB,IAAM,mBAAN,MAAuB;AAAA,EAC5B,mBAAmB,UAAmC;AACpD,UAAM,SAAkB,CAAC;AACzB,UAAM,YAAY,oBAAI,IAAY;AAClC,UAAM,YAAY,IAAI,IAAI,SAAS,IAAI,OAAK,EAAE,EAAE,CAAC;AAEjD,QAAI,aAAa;AACjB,WAAO,UAAU,OAAO,GAAG;AACzB,YAAM,QAAmB,CAAC;AAC1B,iBAAW,QAAQ,UAAU;AAC3B,YAAI,CAAC,UAAU,IAAI,KAAK,EAAE,EAAG;AAC7B,YAAI,KAAK,UAAU,MAAM,OAAK,UAAU,IAAI,CAAC,CAAC,GAAG;AAC/C,gBAAM,KAAK,IAAI;AAAA,QACjB;AAAA,MACF;AAEA,UAAI,MAAM,WAAW,GAAG;AAEtB,cAAM,WAAW,SAAS,OAAO,OAAK,UAAU,IAAI,EAAE,EAAE,CAAC;AACzD,eAAO,KAAK,EAAE,OAAO,cAAc,OAAO,UAAU,kBAAkB,MAAM,CAAC;AAC7E;AAAA,MACF;AAEA,iBAAW,QAAQ,OAAO;AACxB,kBAAU,OAAO,KAAK,EAAE;AACxB,kBAAU,IAAI,KAAK,EAAE;AAAA,MACvB;AAEA,aAAO,KAAK,EAAE,OAAO,cAAc,OAAO,OAAO,kBAAkB,MAAM,SAAS,EAAE,CAAC;AAAA,IACvF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,gBAAgB,KAAK,IAAI,GAAG,OAAO,IAAI,OAAK,EAAE,MAAM,MAAM,GAAG,CAAC;AAAA,IAChE;AAAA,EACF;AAAA,EAEA,MAAM,aACJ,OACA,QACA,iBAAiB,OACmB;AACpC,QAAI,CAAC,MAAM,oBAAoB,MAAM,MAAM,UAAU,GAAG;AACtD,YAAMC,WAAqC,CAAC;AAC5C,iBAAW,QAAQ,MAAM,OAAO;AAC9B,cAAM,SAAS,MAAM,OAAO,IAAI;AAChC,QAAAA,SAAQ,KAAK,MAAM;AACnB,YAAI,kBAAkB,CAAC,OAAO,QAAS;AAAA,MACzC;AACA,aAAOA;AAAA,IACT;AAEA,UAAM,WAAW,MAAM,MAAM,IAAI,UAAQ,OAAO,IAAI,CAAC;AACrD,UAAM,UAAU,MAAM,QAAQ,IAAI,QAAQ;AAE1C,QAAI,kBAAkB,QAAQ,KAAK,OAAK,CAAC,EAAE,OAAO,GAAG;AACnD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WACJ,MACA,QACA,iBAAiB,OACmB;AACpC,UAAM,aAAwC,CAAC;AAE/C,eAAW,SAAS,KAAK,QAAQ;AAC/B,YAAM,eAAe,MAAM,KAAK,aAAa,OAAO,QAAQ,cAAc;AAC1E,iBAAW,KAAK,GAAG,YAAY;AAE/B,UAAI,kBAAkB,aAAa,KAAK,OAAK,CAAC,EAAE,OAAO,GAAG;AACxD;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,qBAAqB,UAAqB,oBAA2E;AACnH,UAAM,YAAY,IAAI,IAAI,kBAAkB;AAC5C,UAAM,QAAmB,CAAC;AAE1B,eAAW,QAAQ,UAAU;AAC3B,UAAI,UAAU,IAAI,KAAK,EAAE,EAAG;AAC5B,UAAI,KAAK,UAAU,MAAM,OAAK,UAAU,IAAI,CAAC,CAAC,GAAG;AAC/C,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAGA,UAAM,SAAS,oBAAI,IAAoB;AACvC,QAAI,UAAU;AAEd,eAAW,QAAQ,OAAO;AACxB,YAAM,SAAS,CAAC,GAAG,KAAK,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG;AAClD,YAAM,QAAQ,OAAO,IAAI,MAAM;AAC/B,UAAI,UAAU,QAAW;AACvB,eAAO,IAAI,KAAK,IAAI,KAAK;AAAA,MAC3B,OAAO;AACL,eAAO,IAAI,QAAQ,OAAO;AAC1B,eAAO,IAAI,KAAK,IAAI,OAAO;AAC3B;AAAA,MACF;AAAA,IACF;AAEA,WAAO,MAAM,IAAI,QAAM,EAAE,QAAQ,EAAE,IAAI,eAAe,OAAO,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE;AAAA,EAChF;AAAA,EAEA,gBAAgB,eAAyB,eAAwG;AAC/I,UAAM,YAA8E,CAAC;AAErF,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,eAAS,IAAI,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AACjD,cAAM,SAAS,cAAc,IAAI,cAAc,CAAC,CAAC,KAAK,CAAC;AACvD,cAAM,SAAS,cAAc,IAAI,cAAc,CAAC,CAAC,KAAK,CAAC;AAEvD,mBAAW,QAAQ,QAAQ;AACzB,cAAI,OAAO,SAAS,IAAI,GAAG;AACzB,sBAAU,KAAK;AAAA,cACb,OAAO,cAAc,CAAC;AAAA,cACtB,OAAO,cAAc,CAAC;AAAA,cACtB,iBAAiB;AAAA,YACnB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,MAAwC;AACpD,WAAO,OAAO,SAAoD;AAChE,YAAM,YAAY,KAAK,IAAI;AAC3B,UAAI;AACF,cAAM,OAAO,MAAM,KAAK,UAAU,KAAK;AAAA,UACrC,cAAc;AAAA;AAAA;AAAA,kEAG0C,KAAK,UAAU,iBAAiB,KAAK,WAAW;AAAA,UACxG,YAAY,SAAS,KAAK,QAAQ;AAAA,QAAW,KAAK,EAAE,MAAM,KAAK,WAAW;AAAA,OAAU,KAAK,UAAU;AAAA;AAAA,UACnG,UAAU;AAAA,UACV,aAAa;AAAA,QACf,CAAC;AAED,YAAI;AACJ,YAAI;AAAE,iBAAO,KAAK,MAAM,KAAK,OAAO;AAAA,QAAE,QAAQ;AAC5C,iBAAO,EAAE,QAAQ,KAAK,IAAI,SAAS,OAAO,OAAO,wBAAwB,QAAQ,KAAK,SAAS,eAAe,CAAC,EAAE;AAAA,QACnH;AAEA,cAAM,QAAkB,CAAC;AACzB,mBAAW,QAAQ,KAAK,SAAS,CAAC,GAAG;AACnC,gBAAM,WAAWF,MAAK,KAAK,YAAY,KAAK,IAAI;AAChD,oBAAUC,SAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,wBAAc,UAAU,KAAK,SAAS,OAAO;AAC7C,gBAAM,KAAK,KAAK,IAAI;AAAA,QACtB;AAEA,eAAO;AAAA,UACL,QAAQ,KAAK;AAAA,UACb,SAAS;AAAA,UACT,QAAQ,KAAK,WAAW,KAAK;AAAA,UAC7B,eAAe;AAAA,QACjB;AAAA,MACF,SAAS,GAAG;AACV,eAAO,EAAE,QAAQ,KAAK,IAAI,SAAS,OAAO,OAAQ,EAAY,SAAS,QAAQ,IAAI,eAAe,CAAC,EAAE;AAAA,MACvG;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,wBACJ,MACA,YACA,iBAAiB,OACoD;AACrE,UAAM,YAAY,KAAK,IAAI;AAC3B,UAAM,UAAU,MAAM,KAAK,WAAW,MAAM,YAAY,cAAc;AACtE,WAAO,EAAE,SAAS,YAAY,KAAK,IAAI,IAAI,UAAU;AAAA,EACvD;AAAA,EAEA,MAAM,2BACJ,MACA,cACA,YACA,WACkC;AAClC,QAAI;AACF,UAAI,CAACF,YAAW,YAAY,GAAG;AAC7B,eAAO,EAAE,QAAQ,KAAK,IAAI,SAAS,OAAO,OAAO,yBAAyB,YAAY,IAAI,QAAQ,IAAI,eAAe,CAAC,EAAE;AAAA,MAC1H;AAEA,YAAM,WAAW,KAAK,UAAU;AAAA,QAC9B,MAAM,cAAc,KAAK,WAAW;AAAA,QACpC;AAAA,QACA,aAAa,CAAC;AAAA,MAChB,CAAC;AAED,YAAM,SAASD,cAAa,cAAc,CAAC,QAAQ,UAAU,QAAQ,GAAG;AAAA,QACtE,KAAK;AAAA,QACL,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW,KAAK,OAAO;AAAA,QACvB,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAChC,CAAC;AAED,aAAO;AAAA,QACL,QAAQ,KAAK;AAAA,QACb,SAAS;AAAA,QACT,QAAQ,OAAO,KAAK;AAAA,QACpB,eAAe,CAAC;AAAA,MAClB;AAAA,IACF,SAAS,GAAG;AACV,aAAO;AAAA,QACL,QAAQ,KAAK;AAAA,QACb,SAAS;AAAA,QACT,OAAQ,EAAY;AAAA,QACpB,QAAQ;AAAA,QACR,eAAe,CAAC;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACF;;;ACjPO,IAAM,YAAN,MAAgB;AAAA,EACrB,SAAS,QAAsB,cAAqC;AAClE,UAAM,WAA4B,OAAO,IAAI,QAAM;AAAA,MACjD,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,MACR,SAAS,EAAE;AAAA,MACX,YAAY,EAAE;AAAA,IAChB,EAAE;AAEF,UAAM,aAAa,OAAO;AAC1B,UAAM,eAAe,OAAO,OAAO,OAAK,EAAE,OAAO,EAAE;AACnD,UAAM,aAAa,OAAO,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,YAAY,CAAC,IAAI,KAAK,IAAI,YAAY,CAAC;AAC5F,UAAM,YAAY,oBAAI,IAAoB;AAC1C,eAAW,KAAK,QAAQ;AACtB,gBAAU,IAAI,EAAE,WAAW,UAAU,IAAI,EAAE,QAAQ,KAAK,KAAK,CAAC;AAAA,IAChE;AAEA,UAAM,aAAyB;AAAA,MAC7B;AAAA,MACA,aAAa,aAAa,IAAI,eAAe,aAAa;AAAA,MAC1D,gBAAgB;AAAA,MAChB;AAAA,MACA,iBAAiB,KAAK,uBAAuB,MAAM;AAAA,IACrD;AAEA,UAAM,YAAY,KAAK,gBAAgB,MAAM;AAE7C,WAAO,EAAE,UAAU,YAAY,UAAU;AAAA,EAC3C;AAAA,EAEA,iBAAiB,MAA6B;AAC5C,QAAI,SAAS;AAAA;AAAA;AAGb,cAAU;AAAA;AACV,cAAU;AAAA;AAAA;AACV,cAAU,mBAAmB,KAAK,WAAW,UAAU;AAAA;AACvD,cAAU,qBAAqB,KAAK,WAAW,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA;AAC5E,cAAU,mBAAmB,KAAK,WAAW,eAAe,QAAQ,CAAC,CAAC;AAAA;AACtE,cAAU,uBAAuB,KAAK,WAAW,eAAe;AAAA;AAGhE,cAAU;AAAA;AAAA;AACV,eAAW,CAACK,OAAM,KAAK,KAAK,CAAC,GAAG,KAAK,WAAW,SAAS,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG;AACtF,gBAAU,OAAOA,KAAI,QAAQ,KAAK;AAAA;AAAA,IACpC;AAGA,cAAU;AAAA;AAAA;AACV,UAAM,SAAS,KAAK,SAAS,MAAM,GAAG;AACtC,eAAW,OAAO,QAAQ;AACxB,YAAM,OAAO,IAAI,UAAU,WAAM;AACjC,YAAM,MAAM,IAAI,aAAa,IAAI,KAAK,IAAI,UAAU,QAAQ;AAC5D,gBAAU,KAAK,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,MAAM,IAAI,MAAM,IAAI,IAAI,QAAQ,IAAI,IAAI,GAAG,GAAG;AAAA;AAAA,IACrF;AAGA,QAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,gBAAU;AAAA;AAAA;AACV,iBAAW,KAAK,KAAK,WAAW;AAC9B,kBAAU,OAAO,EAAE,IAAI,OAAO,EAAE,WAAW;AAAA;AAAA,MAC7C;AAAA,IACF,OAAO;AACL,gBAAU;AAAA;AAAA;AAAA,IACZ;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB,QAA8B;AAC3D,QAAI,MAAM;AACV,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAI,aAAa;AACjB,YAAM,QAAQ,IAAI,KAAK,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ;AACpD,eAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,cAAM,IAAI,IAAI,KAAK,OAAO,CAAC,EAAE,SAAS,EAAE,QAAQ;AAChD,YAAI,KAAK,IAAI,IAAI,KAAK,IAAI,IAAK;AAAA,MACjC;AACA,YAAM,KAAK,IAAI,KAAK,UAAU;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,QAAiC;AACvD,UAAM,YAAuB,CAAC;AAG9B,eAAW,KAAK,QAAQ;AACtB,UAAI,EAAE,aAAa,KAAQ;AACzB,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,aAAa,mBAAmB,EAAE,QAAQ,SAAS,EAAE,UAAU;AAAA,UAC/D,YAAY,EAAE;AAAA,UACd,MAAM,EAAE;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,aAAa,oBAAI,IAAoB;AAC3C,eAAW,KAAK,QAAQ;AACtB,UAAI,CAAC,EAAE,WAAW,EAAE,KAAK,WAAW,UAAU,GAAG;AAC/C,cAAM,SAAS,EAAE,KAAK,QAAQ,YAAY,EAAE;AAC5C,mBAAW,IAAI,SAAS,WAAW,IAAI,MAAM,KAAK,KAAK,CAAC;AAAA,MAC1D;AAAA,IACF;AACA,eAAW,CAAC,QAAQ,KAAK,KAAK,YAAY;AACxC,UAAI,SAAS,GAAG;AACd,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,aAAa,SAAS,MAAM,YAAY,KAAK;AAAA,UAC7C,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,UACnC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,WAA+D,CAAC;AACtE,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,eAAS,KAAK,EAAE,MAAM,OAAO,CAAC,EAAE,MAAM,MAAM,OAAO,CAAC,EAAE,UAAU,KAAK,EAAE,CAAC;AAAA,IAC1E;AAEA,aAAS,WAAW,GAAG,YAAY,GAAG,YAAY;AAChD,eAAS,QAAQ,GAAG,QAAQ,WAAW,IAAI,SAAS,QAAQ,SAAS;AACnE,cAAM,SAAS,SAAS,MAAM,OAAO,QAAQ,QAAQ;AACrD,cAAM,SAAS,SAAS,MAAM,QAAQ,UAAU,QAAQ,WAAW,CAAC;AACpE,cAAM,WAAW,OAAO;AAAA,UAAM,CAAC,GAAG,MAChC,EAAE,SAAS,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,OAAO,CAAC,EAAE;AAAA,QACpD;AACA,YAAI,UAAU;AACZ,gBAAM,YAAY,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI;AACjE,oBAAU,KAAK;AAAA,YACb,MAAM;AAAA,YACN,aAAa,+BAA+B,SAAS,MAAM,QAAQ,mBAAmB,KAAK;AAAA,YAC3F,YAAY,OAAO,QAAQ,WAAW,CAAC,GAAG,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,YAC9E,MAAM;AAAA,YACN,OAAO;AAAA,UACT,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,mBAAmB;AACvB,QAAI,uBAAuB;AAC3B,eAAW,KAAK,QAAQ;AACtB,UAAI,EAAE,KAAK,WAAW,SAAS,KAAK,CAAC,EAAE,SAAS;AAC9C,2BAAmB;AACnB,+BAAuB,EAAE;AAAA,MAC3B;AACA,UAAI,oBAAoB,EAAE,KAAK,WAAW,UAAU,KAAK,EAAE,SAAS;AAClE,kBAAU,KAAK;AAAA,UACb,MAAM;AAAA,UACN,aAAa,2CAA2C,oBAAoB;AAAA,UAC5E,YAAY,EAAE;AAAA,UACd,MAAM,EAAE;AAAA,QACV,CAAC;AACD,2BAAmB;AAAA,MACrB;AACA,UAAI,EAAE,KAAK,WAAW,UAAU,KAAK,CAAC,EAAE,SAAS;AAC/C,2BAAmB;AAAA,MACrB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AChMO,IAAM,mBAAN,MAAuB;AAAA,EACpB,cAAc,oBAAI,IAA0B;AAAA,EAC5C,mBAAmB;AAAA,EAE3B,uBAAuB,SAAwB;AAC7C,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,YAAmD;AACjD,QAAI,CAAC,KAAK,iBAAkB,QAAO,EAAE,SAAS,MAAM;AACpD,UAAM,iBAAiB,KAAK,kBAAkB;AAC9C,UAAM,UAAU,eAAe,KAAK,OAAK,EAAE,SAAS,OAAO;AAC3D,QAAI,SAAS;AACX,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,0BAA0B,QAAQ,EAAE,MAAM,QAAQ,WAAW;AAAA,MACvE;AAAA,IACF;AACA,WAAO,EAAE,SAAS,MAAM;AAAA,EAC1B;AAAA,EAEA,SAAS,QAAgB,QAAgB,eAAuC;AAC9E,UAAM,UAAwB,CAAC;AAG/B,QAAI,OAAO,SAAS,QAAQ,KAAK,OAAO,SAAS,QAAQ,GAAG;AAC1D,UAAI,cAAc,KAAK,OAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,KAAK,CAAC,GAAG;AAClI,gBAAQ,KAAK;AAAA,UACX,IAAI,GAAG,MAAM;AAAA,UACb,MAAM;AAAA,UACN,aAAa,0BAA0B,cAAc,OAAO,OAAK,EAAE,MAAM,yBAAyB,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,UAC/G,SAAS;AAAA,UACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,cAAc,SAAS,GAAG;AAC5B,cAAQ,KAAK;AAAA,QACX,IAAI,GAAG,MAAM;AAAA,QACb,MAAM;AAAA,QACN,aAAa,aAAa,cAAc,MAAM;AAAA,QAC9C,SAAS;AAAA,QACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAGA,QAAI,OAAO,YAAY,EAAE,SAAS,QAAQ,KAAK,OAAO,YAAY,EAAE,SAAS,WAAW,KAAK,OAAO,YAAY,EAAE,SAAS,KAAK,GAAG;AACjI,cAAQ,KAAK;AAAA,QACX,IAAI,GAAG,MAAM;AAAA,QACb,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,QACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAGA,eAAW,QAAQ,eAAe;AAChC,UAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,MAAM,KAAK,KAAK,SAAS,aAAa,GAAG;AACvI,gBAAQ,KAAK;AAAA,UACX,IAAI,GAAG,MAAM,WAAW,KAAK,QAAQ,iBAAiB,GAAG,CAAC;AAAA,UAC1D,MAAM;AAAA,UACN,aAAa,sCAAsC,IAAI;AAAA,UACvD,SAAS;AAAA,UACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAEA,YAAM,mBAAmB,CAAC,SAAS,SAAS,UAAU,YAAY,gBAAgB,SAAS,WAAW,oBAAoB,cAAc;AACxI,iBAAW,SAAS,kBAAkB;AACpC,YAAI,KAAK,SAAS,KAAK,GAAG;AACxB,kBAAQ,KAAK;AAAA,YACX,IAAI,GAAG,MAAM,WAAW,KAAK,QAAQ,iBAAiB,GAAG,CAAC;AAAA,YAC1D,MAAM;AAAA,YACN,aAAa,kCAAkC,IAAI;AAAA,YACnD,SAAS;AAAA,YACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,YAClC,cAAc;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,UAAM,YAAY,cAAc,MAAM,OAAK,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,QAAQ,KAAK,EAAE,SAAS,QAAQ,CAAC;AAC/G,QAAI,aAAa,cAAc,SAAS,GAAG;AACzC,cAAQ,KAAK;AAAA,QACX,IAAI,GAAG,MAAM;AAAA,QACb,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,QACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAGA,eAAW,QAAQ,eAAe;AAChC,UAAI,KAAK,SAAS,QAAQ,KAAK,KAAK,SAAS,WAAW,KAAK,KAAK,SAAS,MAAM,GAAG;AAClF,gBAAQ,KAAK;AAAA,UACX,IAAI,GAAG,MAAM,WAAW,KAAK,QAAQ,iBAAiB,GAAG,CAAC;AAAA,UAC1D,MAAM;AAAA,UACN,aAAa,kCAAkC,IAAI;AAAA,UACnD,SAAS;AAAA,UACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UAClC,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,SAAK,YAAY,IAAI,QAAQ,OAAO;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,QAAgB,cAA+B;AACzD,UAAM,MAAM,KAAK,YAAY,IAAI,MAAM;AACvC,QAAI,CAAC,IAAK,QAAO;AAEjB,UAAM,KAAK,IAAI,KAAK,OAAK,EAAE,OAAO,YAAY;AAC9C,QAAI,CAAC,GAAI,QAAO;AAEhB,OAAG,eAAe;AAClB,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,QAAwB;AACrC,UAAM,MAAM,KAAK,YAAY,IAAI,MAAM;AACvC,QAAI,CAAC,IAAK,QAAO;AACjB,QAAI,QAAQ;AACZ,eAAW,MAAM,KAAK;AACpB,UAAI,CAAC,GAAG,cAAc;AACpB,WAAG,eAAe;AAClB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,oBAAkC;AAChC,UAAM,MAAoB,CAAC;AAC3B,eAAW,OAAO,KAAK,YAAY,OAAO,GAAG;AAC3C,UAAI,KAAK,GAAG,IAAI,OAAO,OAAK,CAAC,EAAE,YAAY,CAAC;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK,kBAAkB,EAAE,KAAK,OAAK,EAAE,SAAS,OAAO;AAAA,EAC9D;AACF;;;ACjJO,IAAM,eAAN,MAAmB;AAAA,EAChB,WAAW,oBAAI,IAA0B;AAAA,EACzC,oBAAoB,oBAAI,IAA8B;AAAA;AAAA,EAEtD,mBAAmB,oBAAI,IAAiC;AAAA;AAAA,EAExD,kBAAkB;AAAA;AAAA,EAG1B,mBAAmB,MAAoB;AACrC,SAAK,kBAAkB,KAAK,IAAI,GAAG,IAAI;AAAA,EACzC;AAAA;AAAA,EAGA,eAAuB;AACrB,QAAI,KAAK,mBAAmB,EAAG,QAAO;AACtC,UAAM,SAAS,KAAK,IAAI,IAAI,KAAK,kBAAkB,KAAK,KAAK,KAAK;AAClE,QAAI,UAAU;AACd,eAAW,CAAC,IAAI,OAAO,KAAK,KAAK,UAAU;AACzC,YAAM,WAAW,QAAQ,MAAM,QAAQ,MAAM,SAAS,CAAC;AACvD,UAAI,YAAY,SAAS,YAAY,QAAQ;AAC3C,aAAK,cAAc,EAAE;AACrB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,WAAiC;AAC3C,QAAI,UAAU,KAAK,SAAS,IAAI,SAAS;AACzC,QAAI,CAAC,SAAS;AACZ,gBAAU;AAAA,QACR;AAAA,QACA,OAAO,CAAC;AAAA,QACR,WAAW,oBAAI,IAAI;AAAA,MACrB;AACA,WAAK,SAAS,IAAI,WAAW,OAAO;AAAA,IACtC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,WAAmB,UAAkC;AAClE,SAAK,kBAAkB,IAAI,WAAW,QAAQ;AAAA,EAChD;AAAA,EAEA,QAAQ,WAAmB,MAA8B;AACvD,UAAM,UAAU,KAAK,YAAY,SAAS;AAC1C,YAAQ,MAAM,KAAK,IAAI;AAAA,EACzB;AAAA,EAEA,WAAW,WAAmB,WAAW,IAAwB;AAC/D,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,QAAS,QAAO,CAAC;AACtB,WAAO,QAAQ,MAAM,MAAM,CAAC,QAAQ;AAAA,EACtC;AAAA,EAEA,kBAAkB,WAA2B;AAC3C,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,WAAW,KAAK,kBAAkB,IAAI,SAAS;AAErD,UAAM,OAAO,QAAQ;AACrB,UAAM,YAAY,QAAQ,MAAM;AAChC,UAAM,iBAAiB,UAAU,eAAe,UAAU;AAC1D,UAAM,aAAa,MAAM,kBAAkB,UAAU,WAAW,QAAQ;AAExE,QAAI,UAAU,YAAY,SAAS;AAAA;AACnC,eAAW,UAAU,SAAS;AAAA;AAC9B,eAAW,aAAa,cAAc,IAAI,UAAU;AAAA;AAEpD,QAAI,MAAM;AACR,iBAAW,SAAS,KAAK,OAAO,IAAI;AAAA;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,cAAc,WAAyB;AACrC,SAAK,SAAS,OAAO,SAAS;AAC9B,SAAK,kBAAkB,OAAO,SAAS;AACvC,SAAK,iBAAiB,OAAO,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA,EAKA,mBAAmB,WAAmB,MAAc,OAAqB;AACvE,QAAI,QAAQ,KAAK,iBAAiB,IAAI,SAAS;AAC/C,QAAI,CAAC,OAAO;AACV,cAAQ,oBAAI,IAAI;AAChB,WAAK,iBAAiB,IAAI,WAAW,KAAK;AAAA,IAC5C;AACA,UAAM,IAAI,KAAK,YAAY,GAAG,KAAK;AAAA,EACrC;AAAA;AAAA,EAGA,mBAAmB,WAAmB,MAAkC;AACtE,UAAM,QAAQ,KAAK,iBAAiB,IAAI,SAAS;AACjD,WAAO,OAAO,IAAI,KAAK,YAAY,CAAC;AAAA,EACtC;AAAA;AAAA,EAGA,uBAAuB,WAA2D;AAChF,UAAM,QAAQ,KAAK,iBAAiB,IAAI,SAAS;AACjD,QAAI,CAAC,MAAO,QAAO,CAAC;AACpB,WAAO,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,MAAM,MAAM,EAAE;AAAA,EACtE;AAAA;AAAA,EAGA,qBAAqB,WAAmB,MAAqB;AAC3D,UAAM,QAAQ,KAAK,iBAAiB,IAAI,SAAS;AACjD,QAAI,CAAC,MAAO;AACZ,QAAI,MAAM;AACR,YAAM,OAAO,KAAK,YAAY,CAAC;AAAA,IACjC,OAAO;AACL,WAAK,iBAAiB,OAAO,SAAS;AAAA,IACxC;AAAA,EACF;AACF;;;AC1IA,SAAS,OAAO,WAAW,YAAY,YAAAC,iBAAoB;AAC3D,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,cAAAC,mBAAkB;AAapB,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EACA,SAAuB,CAAC;AAAA,EACxB,gBAAuD;AAAA;AAAA,EAEvD,gBAAgB;AAAA,EAExB,YAAY,UAAkB;AAC5B,SAAK,UAAUF,MAAK,YAAY,QAAQ,IAAI,GAAG,YAAY,aAAa;AAAA,EAC1E;AAAA;AAAA,EAGA,iBAAiB,MAAoB;AACnC,SAAK,gBAAgB,KAAK,IAAI,GAAG,IAAI;AAAA,EACvC;AAAA;AAAA,EAGA,MAAM,iBAAkC;AACtC,QAAI,KAAK,iBAAiB,EAAG,QAAO;AACpC,QAAI,CAACE,YAAW,KAAK,OAAO,EAAG,QAAO;AACtC,UAAM,SAAS,KAAK,IAAI,IAAI,KAAK,gBAAgB,KAAK,KAAK,KAAK;AAChE,UAAM,YAAY,IAAI,KAAK,MAAM,EAAE,YAAY;AAC/C,QAAI;AACF,YAAM,UAAU,MAAMH,UAAS,KAAK,SAAS,OAAO;AACpD,YAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,OAAO,OAAO;AAChD,YAAM,OAAO,MAAM,OAAO,UAAQ;AAChC,YAAI;AACF,gBAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,iBAAO,MAAM,aAAa;AAAA,QAC5B,QAAQ;AAAE,iBAAO;AAAA,QAAM;AAAA,MACzB,CAAC;AAED,UAAI,KAAK,SAAS,MAAM,QAAQ;AAC9B,cAAM,UAAU,KAAK,SAAS,KAAK,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI;AAAA,MAClF;AACA,aAAO,MAAM,SAAS,KAAK;AAAA,IAC7B,QAAQ;AAAE,aAAO;AAAA,IAAE;AAAA,EACrB;AAAA,EAEA,MAAM,OAAsB;AAC1B,UAAM,MAAME,SAAQ,KAAK,OAAO;AAChC,UAAM,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACtC;AAAA,EAEA,IAAI,OAA4C;AAC9C,SAAK,OAAO,KAAK;AAAA,MACf,GAAG;AAAA,MACH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAED,QAAI,KAAK,OAAO,UAAU,IAAI;AAC5B,WAAK,MAAM;AAAA,IACb;AAEA,QAAI,CAAC,KAAK,eAAe;AACvB,WAAK,gBAAgB,YAAY,MAAM,KAAK,MAAM,GAAG,GAAI;AAAA,IAC3D;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,OAAO,WAAW,EAAG;AAE9B,UAAM,WAAW,CAAC,GAAG,KAAK,MAAM;AAChC,UAAM,QAAQ,SAAS,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI;AAEhE,QAAI;AACF,YAAM,WAAW,KAAK,SAAS,KAAK;AACpC,WAAK,SAAS,KAAK,OAAO,MAAM,SAAS,MAAM;AAAA,IACjD,QAAQ;AACN,UAAI;AACF,cAAM,UAAU,KAAK,SAAS,KAAK;AACnC,aAAK,SAAS,KAAK,OAAO,MAAM,SAAS,MAAM;AAAA,MACjD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAyB;AAC7B,QAAI,KAAK,eAAe;AACtB,oBAAc,KAAK,aAAa;AAChC,WAAK,gBAAgB;AAAA,IACvB;AACA,UAAM,KAAK,MAAM;AAAA,EACnB;AACF;;;ACjFA,IAAM,gBAA+B;AAAA,EACnC;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AACF;AAQO,SAAS,eAAe,aAA+B;AAC5D,MAAI,CAAC,eAAe,OAAO,gBAAgB,UAAU;AACnD,WAAO;AAAA,EACT;AAGA,aAAW,WAAW,eAAe;AACnC,QAAI,QAAQ,SAAS,KAAK,WAAW,GAAG;AACtC,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAGA,SAAO;AACT;;;ACzCO,SAAS,uBAAuB,OAAqC;AAC1E,QAAM,MAAM,MAAM;AAClB,QAAM,YAAY,IAAI,SAAS,MAC5B,IAAI,OAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,KAAK,EAAE,WAAW,GAAG,EAAE,OAAO,WAAW,EAAE,IAAI,MAAM,EAAE,EAAE,EACzF,KAAK,IAAI;AAEZ,QAAM,WAAW;AAAA,IACf,gBAAgB,IAAI,KAAK,IAAI;AAAA,IAC7B;AAAA,IACA,IAAI,SAAS,MAAM,SAAS,IAAI;AAAA,sBAAyB,IAAI,SAAS,iBAAiB,KAAK;AAAA,IAC5F,IAAI,QAAQ,iBAAiB,SAAS,IAClC;AAAA;AAAA,EAAgC,IAAI,QAAQ,iBAAiB,IAAI,OAAK,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KAC1F;AAAA,IACJ,IAAI,SAAS,MAAM,KAAK,OAAK,EAAE,QAAQ,IACnC;AAAA;AAAA,EAA2B,IAAI,SAAS,MAAM,OAAO,OAAK,EAAE,QAAQ,EAAE,IAAI,OAAK,KAAK,EAAE,MAAM,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC,KACzH;AAAA,EACN,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAE3B,QAAM,cAAc,IAAI,QAAQ,WAAW,IAAI,KAAK;AAEpD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAAW,IAAI,KAAK;AAAA,IACpB,SAAS,MAAM;AAAA,EACjB;AACF;AAMO,SAAS,kBAAkB,UAAqC;AACrE,SAAO,SAAS,IAAI,QAAM;AACxB,UAAM,QAAQ;AAAA,MACZ,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,wFAAwF;AAAA,QACnH,EAAE,MAAM,QAAQ,SAAS,GAAG,YAAY;AAAA,QACxC,EAAE,MAAM,aAAa,SAAS,GAAG,SAAS;AAAA,MAC5C;AAAA,IACF;AACA,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,CAAC,EAAE,KAAK,IAAI;AACd;AAKO,SAAS,uBAAuB,UAAqC;AAC1E,SAAO,KAAK,UAAU,SAAS,IAAI,SAAO;AAAA,IACxC,aAAa,GAAG;AAAA,IAChB,QAAQ,GAAG;AAAA,IACX,QAAQ,GAAG;AAAA,IACX,SAAS,GAAG;AAAA,EACd,EAAE,GAAG,MAAM,CAAC;AACd;AAKO,SAAS,uBAAuB,UAAqC;AAC1E,MAAI,SAAS,WAAW,EAAG,QAAO;AAElC,QAAM,aAAa,SAAS,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,SAAS,CAAC,IAAI,SAAS;AAC1E,QAAM,cAAc,SAAS,OAAO,OAAK,EAAE,WAAW,GAAG,EAAE;AAC3D,QAAM,gBAAgB,SAAS,OAAO,OAAK,EAAE,WAAW,OAAO,EAAE,UAAU,GAAG,EAAE;AAChF,QAAM,aAAa,SAAS,OAAO,OAAK,EAAE,UAAU,GAAG,EAAE;AAEzD,MAAI,MAAM;AAAA;AAAA;AACV,SAAO,uBAAuB,SAAS,MAAM;AAAA;AAC7C,SAAO,+BAA+B,aAAa,KAAK,QAAQ,CAAC,CAAC;AAAA;AAClE,SAAO;AAAA;AACP,SAAO,uBAAkB,WAAW;AAAA;AACpC,SAAO,sBAAsB,aAAa;AAAA;AAC1C,SAAO,iBAAiB,UAAU;AAAA;AAAA;AAClC,SAAO;AAAA;AACP,aAAW,MAAM,SAAS,MAAM,GAAG,CAAC,GAAG;AACrC,WAAO,OAAO,GAAG,SAAS,iBAAiB,GAAG,UAAU,KAAK,QAAQ,CAAC,CAAC;AAAA;AACvE,WAAO,kBAAkB,GAAG,YAAY,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,YAAY,SAAS,MAAM,WAAM,EAAE;AAAA;AAAA,EAChG;AACA,MAAI,SAAS,SAAS,GAAG;AACvB,WAAO,gBAAW,SAAS,SAAS,CAAC;AAAA;AAAA,EACvC;AACA,SAAO;AACT;AAKO,SAAS,qBACd,QACA,SAAoC,UACpC,iBAAiB,KACA;AACjB,QAAM,WAAW,OACd,OAAO,OAAK,EAAE,eAAe,cAAc,EAC3C,IAAI,OAAK,uBAAuB,CAAC,CAAC;AAErC,QAAM,OAAO,WAAW,WACpB,kBAAkB,QAAQ,IAC1B,uBAAuB,QAAQ;AAEnC,SAAO;AAAA,IACL;AAAA,IACA,eAAe,SAAS;AAAA,IACxB,eAAe;AAAA,IACf;AAAA,EACF;AACF;;;AC9EO,IAAM,cAAN,MAAkB;AAAA,EACf,SAAwB,CAAC;AAAA,EACzB,WAAsB,CAAC;AAAA,EACvB,QAAqB,CAAC;AAAA,EACtB,aAA0E,CAAC;AAAA,EAC3E,eAA4E,CAAC;AAAA,EAErF,WAAW,QAA6B;AAAE,SAAK,SAAS;AAAA,EAAO;AAAA,EAC/D,aAAa,UAA2B;AAAE,SAAK,WAAW;AAAA,EAAS;AAAA,EACnE,UAAU,OAA0B;AAAE,SAAK,QAAQ;AAAA,EAAM;AAAA,EACzD,eAAe,OAA0E;AAAE,SAAK,aAAa;AAAA,EAAM;AAAA,EACnH,WAAW,QAA2E;AAAE,SAAK,eAAe;AAAA,EAAO;AAAA,EAEnH,SAA0B;AACxB,UAAM,UAAU,KAAK,eAAe;AACpC,UAAM,eAAe,KAAK,cAAc;AACxC,UAAM,kBAAkB,KAAK,aAAa;AAC1C,UAAM,gBAAgB,KAAK,qBAAqB,OAAO;AAGvD,UAAM,iBAAgC,CAAC;AACvC,eAAW,SAAS,eAAe;AAGjC,YAAM,kBACH,MAAM,aAAa,UAAU,MAAM,eAAe,KAAK,MAAM,eAAe,KAC5E,MAAM,aAAa,YAAY,MAAM,eAAe;AAEvD,UAAI,iBAAiB;AAEnB,uBAAe,KAAK,KAAK;AAAA,MAC3B;AAAA,IACF;AAEA,UAAM,mBAAmB,KAAK,IAAI,KAAK,KAAK;AAAA,MACzC,aAAa,SAAS,KACtB,gBAAgB,SAAS,KACzB,cAAc,SAAS,IACvB,eAAe,SAAS;AAAA,MACxB,QAAQ,cAAc,KACtB,QAAQ,gBAAgB,SAAS;AAAA,IACpC,CAAC;AAED,WAAO,EAAE,SAAS,cAAc,iBAAiB,eAAe,iBAAiB;AAAA,EACnF;AAAA,EAEQ,iBAAmC;AACzC,UAAM,WAAW,IAAI,IAAI,KAAK,SAAS,IAAI,OAAK,EAAE,SAAS,CAAC;AAC5D,UAAM,aAAa,KAAK,WAAW,UAAU,KAAK,MAAM;AACxD,UAAM,YAAY,KAAK,WAAW,OAAO,OAAK,EAAE,OAAO,EAAE;AACzD,UAAM,cAAc,KAAK,WAAW,OAAO,OAAK,CAAC,EAAE,OAAO,EAAE;AAC5D,UAAM,OAAO,YAAY,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,MAAM,EAAE;AACrE,UAAM,SAAS,cAAc,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,QAAQ,EAAE;AAC3E,UAAM,QAAQ,OAAO,UAAU;AAE/B,UAAM,kBAAkB,oBAAI,IAAoB;AAChD,eAAW,MAAM,KAAK,UAAU;AAC9B,UAAI,GAAG,YAAY,WAAW;AAC5B,mBAAW,OAAO,GAAG,MAAM;AACzB,0BAAgB,IAAI,MAAM,gBAAgB,IAAI,GAAG,KAAK,KAAK,CAAC;AAAA,QAC9D;AAAA,MACF;AAAA,IACF;AAEA,UAAM,YAAY,CAAC,GAAG,gBAAgB,QAAQ,CAAC,EAC5C,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,UAAU,KAAK,OAAO,EAAE,UAAU,MAAM,EAAE;AAEnD,UAAM,WAAW,KAAK,OAAO,IAAI,QAAM;AAAA,MACrC,MAAM,EAAE,WAAW,KAAK;AAAA,MACxB,aAAa,EAAE;AAAA,MACf,OAAO,EAAE;AAAA,IACX,EAAE;AAEF,UAAM,YAAY,oBAAI,IAAiD;AACvE,eAAW,KAAK,KAAK,cAAc;AACjC,YAAM,QAAQ,UAAU,IAAI,EAAE,QAAQ,KAAK,EAAE,OAAO,GAAG,UAAU,EAAE;AACnE,YAAM;AACN,UAAI,CAAC,EAAE,QAAS,OAAM;AACtB,gBAAU,IAAI,EAAE,UAAU,KAAK;AAAA,IACjC;AAEA,UAAM,YAAY,CAAC,GAAG,UAAU,QAAQ,CAAC,EACtC,IAAI,CAAC,CAACE,OAAM,KAAK,OAAO;AAAA,MACvB,MAAAA;AAAA,MACA,OAAO,MAAM;AAAA,MACb,aAAa,MAAM,QAAQ,IAAI,MAAM,WAAW,MAAM,QAAQ;AAAA,IAChE,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAEnC,UAAM,kBAA4B,CAAC;AAEnC,QAAI,QAAQ,KAAK,OAAO,QAAQ,KAAK;AACnC,sBAAgB,KAAK,4FAA4F;AAAA,IACnH;AAEA,QAAI,SAAS,OAAO,KAAK,KAAK,SAAS,OAAO,OAAK,EAAE,YAAY,QAAQ,EAAE,SAAS,KAAK,IAAI,KAAK,SAAS,QAAQ,CAAC,IAAI,KAAK;AAC3H,sBAAgB,KAAK,yGAAyG;AAAA,IAChI;AAEA,UAAM,cAAc;AAAA,MAClB;AAAA,MAAmB;AAAA,MAAoB;AAAA,IACzC,EAAE,OAAO,OAAK,CAAC,UAAU,IAAI,CAAC,CAAC;AAE/B,QAAI,YAAY,SAAS,GAAG;AAC1B,sBAAgB,KAAK,wBAAwB,YAAY,KAAK,IAAI,CAAC,kDAAkD;AAAA,IACvH;AAEA,UAAM,gBAAgB,SAAS,KAAK,IAAI,OAAO,CAAC;AAChD,QAAI,gBAAgB,KAAK;AACvB,sBAAgB,KAAK,4FAA4F;AAAA,IACnH;AAGA,eAAW,QAAQ,KAAK,YAAY;AAClC,UAAI,CAAC,KAAK,WAAW,KAAK,OAAO,SAAS,GAAG;AAC3C,cAAM,QAAQ,KAAK,OAAO,YAAY;AACtC,YAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,SAAS,GAAG;AACvD,0BAAgB,KAAK,uGAAuG;AAC5H;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,eAAe,SAAS;AAAA,MACxB;AAAA,MACA,aAAa,QAAQ,IAAI,OAAO,QAAQ;AAAA,MACxC,WAAW;AAAA,MACX,sBAAsB,SAAS,KAAK,aAAa,QAAQ,SAAS;AAAA,MAClE,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,MACpB,WAAW;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gBAA8B;AACpC,UAAM,UAAwB,CAAC;AAE/B,eAAW,SAAS,KAAK,QAAQ;AAC/B,UAAI,MAAM,eAAe,IAAK;AAE9B,YAAM,MAAM,MAAM;AAClB,YAAM,cAA8C,CAAC;AAErD,iBAAW,YAAY,IAAI,QAAQ,iBAAiB,MAAM,EAAE,GAAG;AAC7D,YAAI,SAAS,SAAS,UAAU,KAAK,SAAS,SAAS,MAAM,GAAG;AAC9D,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,aAAa;AAAA,YACb,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,YAAI,SAAS,SAAS,SAAS,KAAK,SAAS,SAAS,MAAM,GAAG;AAC7D,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,aAAa;AAAA,YACb,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,YAAI,SAAS,SAAS,SAAS,KAAK,SAAS,SAAS,WAAW,GAAG;AAClE,sBAAY,KAAK;AAAA,YACf,MAAM;AAAA,YACN,aAAa;AAAA,YACb,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,IAAI,SAAS,MAAM,SAAS,GAAG;AACjC,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,aAAa;AAAA,UACb,QAAQ,kBAAkB,IAAI,SAAS,MAAM,MAAM;AAAA,QACrD,CAAC;AAAA,MACH;AAEA,UAAI,YAAY,SAAS,GAAG;AAC1B,gBAAQ,KAAK;AAAA,UACX,SAAS,IAAI,KAAK;AAAA,UAClB,WAAW,IAAI,KAAK;AAAA,UACpB,UAAU,KAAK,MAAM,MAAM,cAAc,IAAI,MAAM,YAAY;AAAA,UAC/D,kBAAkB;AAAA,QACpB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAiC;AACvC,UAAM,cAAgC,CAAC;AAEvC,UAAM,eAAe,oBAAI,IAA+C;AACxE,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,QAAQ,aAAa,IAAI,KAAK,UAAU,KAAK,EAAE,OAAO,GAAG,QAAQ,EAAE;AACzE,YAAM;AACN,UAAI,KAAK,WAAW,SAAU,OAAM;AACpC,mBAAa,IAAI,KAAK,YAAY,KAAK;AAAA,IACzC;AAEA,UAAM,cAAc,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,QAAQ;AAChE,UAAM,eAAe,oBAAI,IAAoB;AAE7C,eAAW,QAAQ,aAAa;AAC9B,YAAM,QAAQ,KAAK,YAAY,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAClF,iBAAW,KAAK,OAAO;AACrB,qBAAa,IAAI,IAAI,aAAa,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA,MACpD;AAAA,IACF;AAEA,UAAM,sBAAsB,CAAC,GAAG,aAAa,QAAQ,CAAC,EACnD,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,SAAS,CAAC,EAChC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAE7B,eAAW,CAAC,SAAS,KAAK,KAAK,qBAAqB;AAClD,UAAI,YAAY,cAAc,YAAY,mBAAmB,YAAY,aAAa;AACpF,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,gBAAgB,mBAAmB,OAAO;AAAA,UAC1C,gBAAgB,CAAC,QAAQ,QAAQ,iBAAiB,gBAAgB;AAAA,UAClE,QAAQ,GAAG,KAAK,uBAAuB,OAAO;AAAA,QAChD,CAAC;AAAA,MACH;AAEA,UAAI,YAAY,iBAAiB,YAAY,cAAc,YAAY,QAAQ;AAC7E,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,gBAAgB,mBAAmB,OAAO;AAAA,UAC1C,gBAAgB,CAAC,QAAQ,iBAAiB,gBAAgB;AAAA,UAC1D,QAAQ,GAAG,KAAK,uBAAuB,OAAO;AAAA,QAChD,CAAC;AAAA,MACH;AAEA,UAAI,YAAY,cAAc,YAAY,eAAe,YAAY,UAAU;AAC7E,oBAAY,KAAK;AAAA,UACf,MAAM;AAAA,UACN,gBAAgB,mBAAmB,OAAO;AAAA,UAC1C,gBAAgB,CAAC,QAAQ,QAAQ,aAAa;AAAA,UAC9C,QAAQ,GAAG,KAAK,uBAAuB,OAAO;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,IACF;AAEA,UAAM,iBAAiB,aAAa,IAAI,aAAa;AACrD,QAAI,CAAC,kBAAkB,KAAK,MAAM,SAAS,IAAI;AAC7C,kBAAY,KAAK;AAAA,QACf,MAAM;AAAA,QACN,gBAAgB;AAAA,QAChB,gBAAgB,CAAC,gBAAgB,kBAAkB,oBAAoB,kBAAkB;AAAA,QACzF,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAEA,WAAO,YAAY,MAAM,GAAG,CAAC;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAqB,SAA0C;AACrE,UAAM,UAAyB,CAAC;AAGhC,UAAM,eAKD;AAAA,MACH;AAAA,QACE,UAAU;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,UAAU;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,eAAW,UAAU,QAAQ,oBAAoB;AAC/C,YAAM,UAAU,aAAa,KAAK,OAAK,EAAE,aAAa,OAAO,QAAQ;AACrE,UAAI,WAAW,OAAO,SAAS,GAAG;AAChC,gBAAQ,KAAK;AAAA,UACX,MAAM,QAAQ;AAAA,UACd,eAAe,OAAO;AAAA,UACtB,aAAa,QAAQ;AAAA,UACrB,UAAU,OAAO,SAAS,IAAI,SAAS,QAAQ;AAAA,UAC/C,aAAa,OAAO;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AC9TO,IAAM,sBAAN,MAA0B;AAAA,EACvB;AAAA,EACA,UAAwB,CAAC;AAAA,EACzB,uBAA8C,CAAC;AAAA,EAC/C,oBAAmC;AAAA,EACnC,cAAc;AAAA,EAEtB,YAAY,aAAa,IAAI;AAC3B,SAAK,aAAa;AAAA,EACpB;AAAA;AAAA,EAGA,eAAe,QAA0B;AACvC,SAAK,QAAQ,KAAK,MAAM;AAExB,QAAI,KAAK,QAAQ,SAAS,KAAK,aAAa,IAAI,IAAI;AAClD,WAAK,UAAU,KAAK,QAAQ,MAAM,CAAC,KAAK,aAAa,CAAC;AAAA,IACxD;AAAA,EACF;AAAA;AAAA,EAGA,UAAU,SAA6B;AACrC,eAAW,KAAK,SAAS;AACvB,WAAK,eAAe,CAAC;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAGA,cAAc,IAA+B;AAC3C,SAAK,qBAAqB,KAAK,EAAE;AAAA,EACnC;AAAA;AAAA,EAGA,WAA6B;AAC3B,UAAM,QAAQ,KAAK,QAAQ;AAC3B,UAAM,YAAY,KAAK,QAAQ,OAAO,OAAK,EAAE,OAAO,EAAE;AACtD,UAAM,cAAc,QAAQ,IAAI,YAAY,QAAQ;AAGpD,UAAM,SAAS,KAAK,QAAQ,MAAM,CAAC,KAAK,UAAU;AAClD,UAAM,kBAAkB,OAAO,OAAO,OAAK,EAAE,OAAO,EAAE;AACtD,UAAM,aAAa,OAAO,SAAS,IAAI,kBAAkB,OAAO,SAAS;AAGzE,UAAM,UAAU,KAAK,QAAQ,MAAM,GAAG,KAAK,IAAI,KAAK,YAAY,KAAK,QAAQ,SAAS,OAAO,MAAM,CAAC;AACpG,UAAM,mBAAmB,QAAQ,OAAO,OAAK,EAAE,OAAO,EAAE;AACxD,UAAM,cAAc,QAAQ,SAAS,IAAI,mBAAmB,QAAQ,SAAS;AAG7E,UAAM,YAAY,aAAa,cAAc,OACzC,cACA,aAAa,cAAc,OACzB,cACA;AAEN,UAAM,sBAAsB,cAAc,eAAe,aAAa;AAEtE,UAAM,eAAiD,CAAC;AACxD,UAAM,aAAa,oBAAI,IAAoB;AAC3C,eAAW,KAAK,KAAK,SAAS;AAC5B,UAAI,CAAC,EAAE,SAAS;AACd,YAAI,EAAE,SAAU,YAAW,IAAI,EAAE,WAAW,WAAW,IAAI,EAAE,QAAQ,KAAK,KAAK,CAAC;AAAA,MAClF;AAAA,IACF;AAEA,eAAW,KAAK,KAAK,QAAQ,MAAM,EAAE,EAAE,OAAO,CAAAC,OAAK,CAACA,GAAE,OAAO,GAAG;AAC9D,mBAAa,KAAK;AAAA,QAChB,QAAQ,EAAE;AAAA,QACV,QAAQ,EAAE,OAAO,MAAM,GAAG,GAAG;AAAA,QAC7B,UAAU,EAAE,YAAY;AAAA,QACxB,WAAW,EAAE;AAAA,MACf,CAAC;AAAA,IACH;AAEA,UAAM,kBAA4B,CAAC;AAInC,UAAM,WAAyB;AAAA,MAC7B,gBAAgB;AAAA,MAChB,oBAAoB;AAAA,MACpB,UAAU;AAAA,MACV,aAAa,CAAC;AAAA,IAChB;AAEA,QAAI,KAAK,QAAQ,UAAU,IAAI;AAC7B,YAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,QAAQ,SAAS,CAAC,CAAC;AAClE,YAAM,cAAwB,CAAC;AAC/B,eAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAM,QAAQ,IAAI;AAClB,cAAM,MAAM,KAAK,IAAI,QAAQ,YAAY,KAAK,QAAQ,MAAM;AAC5D,cAAM,SAAS,KAAK,QAAQ,MAAM,OAAO,GAAG;AAC5C,cAAM,kBAAkB,OAAO,OAAO,OAAK,EAAE,OAAO,EAAE;AACtD,oBAAY,KAAK,OAAO,SAAS,IAAI,kBAAkB,OAAO,SAAS,CAAC;AAAA,MAC1E;AACA,eAAS,cAAc;AAGvB,YAAM,eAAe,YAAY,UAAU,KACzC,YAAY,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,KAAK,YAAY,CAAC,CAAC,KACxD,YAAY,CAAC,IAAI,YAAY,YAAY,SAAS,CAAC;AAErD,UAAI,cAAc;AAEhB,cAAM,eAAe,YAAY,CAAC,IAAI,YAAY,YAAY,SAAS,CAAC;AACxE,cAAM,aAAa,gBAAgB,YAAY,SAAS;AAGxD,cAAM,WAAW,KAAK,IAAI,GAAG,YAAY,YAAY,SAAS,CAAC,IAAI,UAAU;AAC7E,iBAAS,iBAAiB;AAC1B,iBAAS,WAAW,WAAW;AAG/B,YAAI,YAAY,YAAY,SAAS,CAAC,IAAI,OAAO,aAAa,GAAG;AAC/D,gBAAM,eAAe,KAAK,MAAM,YAAY,YAAY,SAAS,CAAC,IAAI,OAAO,UAAU,IAAI;AAC3F,mBAAS,qBAAqB;AAAA,QAChC;AAEA,YAAI,SAAS,UAAU;AACrB,0BAAgB,KAAK,6DAAsD,WAAW,KAAK,QAAQ,CAAC,CAAC,yBAAyB,SAAS,qBAAqB,0CAA0C,SAAS,kBAAkB,YAAY,wCAAwC,EAAE;AAAA,QACzR;AAAA,MACF;AAAA,IACF;AACA,QAAI,qBAAqB;AACvB,sBAAgB,KAAK,gHAAgH;AAAA,IACvI;AACA,QAAI,WAAW,OAAO,GAAG;AACvB,YAAM,SAAS,CAAC,GAAG,WAAW,QAAQ,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AACtE,UAAI,UAAU,OAAO,CAAC,KAAK,GAAG;AAC5B,wBAAgB,KAAK,6BAA6B,OAAO,CAAC,CAAC,MAAM,OAAO,CAAC,CAAC,yEAAyE;AAAA,MACrJ;AAAA,IACF;AACA,QAAI,KAAK,QAAQ,UAAU,MAAM,cAAc,KAAK;AAClD,sBAAgB,KAAK,kGAAkG;AAAA,IACzH;AACA,QAAI,KAAK,QAAQ,UAAU,KAAK,cAAc,eAAe,KAAK,cAAc,KAAK;AACnF,sBAAgB,KAAK,gHAAgH;AAAA,IACvI;AAEA,WAAO;AAAA,MACL,SAAS,EAAE,OAAO,SAAS,WAAW,aAAa,YAAY;AAAA,MAC/D,SAAS,EAAE,YAAY,KAAK,YAAY,aAAa,YAAY,UAAU;AAAA,MAC3E;AAAA,MACA,cAAc,KAAK,QAAQ,OAAO,OAAK,CAAC,EAAE,OAAO,EAAE;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,iBAAmC;AACjC,UAAM,QAAQ,KAAK,SAAS;AAC5B,QAAI,MAAM,qBAAqB;AAC7B,YAAM,UAA4B;AAAA,QAChC,QAAQ,4BAA4B,MAAM,QAAQ,cAAc,KAAK,QAAQ,CAAC,CAAC,aAAa,MAAM,QAAQ,UAAU,sBAAsB,MAAM,QAAQ,SAAS;AAAA,QACjK,MAAM;AAAA,QACN,SAAS;AAAA,UACP,YAAY,MAAM,QAAQ;AAAA,UAC1B,aAAa,MAAM,QAAQ;AAAA,UAC3B,cAAc,MAAM,eAAe,KAAK,IAAI,MAAM,QAAQ,OAAO,CAAC;AAAA,QACpE;AAAA,MACF;AACA,iBAAW,MAAM,KAAK,sBAAsB;AAC1C,YAAI;AAAE,aAAG,OAAO,OAAO;AAAA,QAAE,QAAQ;AAAA,QAAkB;AAAA,MACrD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,WAA4C;AACvD,UAAM,QAAQ,KAAK,SAAS;AAG5B,QAAI,KAAK,sBAAsB,UAAW,QAAO;AAGjD,QAAI,KAAK,eAAe,EAAG,QAAO;AAGlC,QAAI,MAAM,qBAAqB;AAC7B,WAAK,oBAAoB;AACzB,WAAK;AACL,aAAO;AAAA,QACL,QAAQ,yDAAyD,MAAM,QAAQ,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA,QAC5G,MAAM;AAAA,QACN,SAAS;AAAA,UACP,YAAY,MAAM,QAAQ;AAAA,UAC1B,aAAa,MAAM,QAAQ;AAAA,UAC3B,cAAc,MAAM,eAAe,KAAK,IAAI,MAAM,QAAQ,OAAO,CAAC;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAGA,QAAI,KAAK,QAAQ,SAAS,KAAK,KAAK,QAAQ,SAAS,OAAO,GAAG;AAC7D,WAAK,oBAAoB;AACzB,WAAK;AACL,aAAO;AAAA,QACL,QAAQ,sBAAsB,KAAK,QAAQ,MAAM;AAAA,QACjD,MAAM;AAAA,QACN,SAAS;AAAA,UACP,YAAY,MAAM,QAAQ;AAAA,UAC1B,aAAa,MAAM,QAAQ;AAAA,UAC3B,cAAc,MAAM,eAAe,KAAK,IAAI,MAAM,QAAQ,OAAO,CAAC;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,QAAc;AACZ,SAAK,UAAU,CAAC;AAChB,SAAK,oBAAoB;AACzB,SAAK,cAAc;AAAA,EACrB;AAAA;AAAA,EAGA,WAA8E;AAC5E,WAAO;AAAA,MACL,cAAc,KAAK,QAAQ;AAAA,MAC3B,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,IACnB;AAAA,EACF;AACF;;;AChQO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA;AAAA,EACA,YAA4B,CAAC;AAAA,EAErC,YAAY,KAAgB,SAAmC,CAAC,GAAG;AACjE,SAAK,MAAM;AACX,SAAK,SAAS;AAAA,MACZ,eAAe,OAAO,iBAAiB;AAAA,MACvC,WAAW,OAAO,aAAa;AAAA,MAC/B,YAAY,OAAO,cAAc;AAAA,MACjC,iBAAiB,OAAO,mBAAmB;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,YAAY,UAA8B;AACxC,SAAK,UAAU,KAAK,QAAQ;AAAA,EAC9B;AAAA,EAEA,MAAM,QACJ,WACA,UACA,UACA,eACA,YACA,YACA,cACA,aACqB;AACrB,UAAM,iBAA2B,CAAC;AAClC,UAAM,cAAwB,CAAC;AAC/B,QAAI,YAAY;AAEhB,WAAO,YAAY,KAAK,OAAO,eAAe;AAC5C;AAEA,YAAM,WAAW,SAAS,YAAY,SAAS;AAC/C,UAAI,CAAC,SAAU;AAEf,UAAI,aAAa;AACjB,UAAI,cAAc;AAClB,UAAI,aAAa;AAEjB,aAAO,cAAc,KAAK,OAAO,YAAY;AAC3C,aAAK,UAAU,QAAQ,OAAK,EAAE,YAAY,SAAS,IAAI,SAAS,CAAC;AAEjE,cAAMC,UAAS,MAAM,aAAa,QAAQ;AAE1C,YAAIA,QAAO,iBAAiBA,QAAO,cAAc,SAAS,GAAG;AAC3D,qBAAW,aAAa,WAAW,SAAS,IAAIA,QAAO,aAAa;AAAA,QACtE;AAEA,iBAAS,aAAa,WAAW;AAAA,UAC/B,QAAQ,SAAS;AAAA,UACjB,SAASA,QAAO;AAAA,UAChB,QAAQA,QAAO;AAAA,UACf,eAAeA,QAAO;AAAA,UACtB,OAAOA,QAAO;AAAA,QAChB,CAAC;AAED,sBAAcA,QAAO;AACrB,qBAAaA,QAAO;AAEpB,YAAI,aAAa;AACf,cAAI,KAAK,OAAO,iBAAiB;AAC/B,kBAAM,eAAeA,QAAO,cAAc,SAAS,IAC/C,SAAS,cAAc,SAAS,IAAI,YAAYA,QAAO,aAAa,IACpE,SAAS,UAAU,SAAS,IAAI,UAAU;AAE9C,gBAAI,CAAC,aAAa,QAAQ;AACxB,4BAAc;AACd,2BAAa,wBAAwB,aAAa,OAAO,KAAK,IAAI,CAAC;AACnE,oBAAMC,YAAW,MAAM,cAAc,YAAY,YAAYD,QAAO,aAAa;AACjF,mBAAK,UAAU,QAAQ,OAAK,EAAE,eAAe,SAAS,IAAI,OAAOC,UAAS,YAAY,CAAC;AAEvF,kBAAI,CAAC,KAAK,OAAO,UAAW;AAE5B,oBAAMC,gBAAe,MAAM,KAAK,cAAc,UAAU,YAAYD,WAAU,WAAW;AACzF,kBAAI,CAACC,eAAc;AACjB;AACA;AAAA,cACF;AACA;AAAA,YACF;AAAA,UACF;AAEA,yBAAe,KAAK,SAAS,EAAE;AAC/B,eAAK,UAAU,QAAQ,OAAK,EAAE,eAAe,SAAS,IAAI,MAAM,UAAU,CAAC;AAC3E;AAAA,QACF;AAEA;AACA,aAAK,UAAU,QAAQ,OAAK,EAAE,eAAe,SAAS,IAAI,OAAO,UAAU,CAAC;AAE5E,YAAI,CAAC,KAAK,OAAO,aAAa,aAAa,KAAK,OAAO,WAAY;AAEnE,cAAM,WAAW,MAAM,cAAc,YAAY,YAAYF,QAAO,iBAAiB,CAAC,CAAC;AACvF,cAAM,eAAe,MAAM,KAAK,cAAc,UAAU,YAAY,UAAU,WAAW;AACzF,YAAI,CAAC,aAAc;AAAA,MACrB;AAEA,UAAI,CAAC,aAAa;AAChB,oBAAY,KAAK,SAAS,EAAE;AAAA,MAC9B;AAAA,IACF;AAEA,UAAM,SAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB,SAAS,YAAY,WAAW;AAAA,MAChC,SAAS,aAAa,eAAe,MAAM,WAAW,YAAY,MAAM,cAAc,SAAS;AAAA,IACjG;AAEA,SAAK,UAAU,QAAQ,OAAK,EAAE,eAAe,MAAM,CAAC;AACpD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,cACZ,MACA,OACA,UACA,aACkB;AAClB,QAAI;AACF,YAAM,cAAc,MAAM,KAAK,IAAI,aAAa,OAAO,CAAC,CAAC;AACzD,UAAI,eAAe,YAAY,aAAa,aAAa,YAAY,OAAO,YAAY,QAAQ,+BAA+B;AAG7H,YAAI,aAAa;AACf,gBAAM,QAAQ,MAAM,YAAY,YAAY,GAAG,EAAE,MAAM,MAAM,KAAK;AAClE,cAAI,MAAO,QAAO;AAAA,QACpB;AACA,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAIA,QAAI,aAAa,SAAS,aAAa,YAAY,SAAS,aAAa,aAAa,SAAS,aAAa,SAAS;AACnH,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACF;;;AC9KA,SAAS,cAAAG,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,gBAAe,aAAa,kBAAkB;AAC5F,SAAS,WAAAC,gBAAe;AAQjB,IAAM,mBAAN,MAAuB;AAAA,EACpB;AAAA,EACA;AAAA,EAER,YAAY,UAAkB;AAC5B,SAAK,UAAU,YAAY,QAAQ,IAAI;AACvC,SAAK,WAAWA,SAAQ,KAAK,SAAS,YAAY,OAAO;AAAA,EAC3D;AAAA,EAEA,KAAQ,WAAmB,KAAa,MAAe;AACrD,QAAI;AAAE,WAAK,UAAU;AAAA,IAAE,QAAQ;AAAA,IAAkB;AACjD,UAAM,MAAMA,SAAQ,KAAK,UAAU,SAAS;AAC5C,QAAI,CAACJ,YAAW,GAAG,GAAG;AAAE,UAAI;AAAE,QAAAC,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,MAAE,QAAQ;AAAE;AAAA,MAAO;AAAA,IAAE;AAErF,UAAM,QAA4B;AAAA,MAChC;AAAA,MACA;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,IAAAE,eAAcC,SAAQ,KAAK,GAAG,GAAG,OAAO,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAAA,EACpF;AAAA,EAEA,KAAQ,WAAmB,KAAuB;AAChD,UAAM,WAAWA,SAAQ,KAAK,UAAU,WAAW,GAAG,GAAG,OAAO;AAChE,QAAI,CAACJ,YAAW,QAAQ,EAAG,QAAO;AAClC,QAAI;AACF,YAAM,QAAQ,KAAK,MAAME,cAAa,UAAU,OAAO,CAAC;AACxD,aAAO,MAAM;AAAA,IACf,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,QAAW,WAAyC;AAClD,UAAM,MAAME,SAAQ,KAAK,UAAU,SAAS;AAC5C,QAAI,CAACJ,YAAW,GAAG,EAAG,QAAO,CAAC;AAC9B,UAAM,UAAgC,CAAC;AACvC,eAAW,SAAS,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC7D,UAAI,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,OAAO,GAAG;AAClD,YAAI;AACF,gBAAM,QAAQ,KAAK,MAAME,cAAaE,SAAQ,KAAK,MAAM,IAAI,GAAG,OAAO,CAAC;AACxE,kBAAQ,KAAK,KAAK;AAAA,QACpB,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,WAAmB,KAAsB;AAC9C,UAAM,WAAWA,SAAQ,KAAK,UAAU,WAAW,GAAG,GAAG,OAAO;AAChE,QAAI,CAACJ,YAAW,QAAQ,EAAG,QAAO;AAClC,QAAI;AACF,iBAAW,QAAQ;AACnB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,SAAS,WAA6B;AACpC,UAAM,MAAMI,SAAQ,KAAK,UAAU,SAAS;AAC5C,QAAI,CAACJ,YAAW,GAAG,EAAG,QAAO,CAAC;AAC9B,WAAO,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,EAC5C,OAAO,OAAK,EAAE,OAAO,KAAK,EAAE,KAAK,SAAS,OAAO,CAAC,EAClD,IAAI,OAAK,EAAE,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,EACzC;AAAA,EAEQ,YAAkB;AACxB,QAAI,CAACA,YAAW,KAAK,QAAQ,GAAG;AAC9B,MAAAC,WAAU,KAAK,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,IAC9C;AAAA,EACF;AACF;;;ACjFA,SAAS,qBAAqB;AAE9B,IAAM,WAAW,cAAc,YAAY,GAAG;AAwB9C,IAAI,iBAAkD;AACtD,IAAI,wBAAwB;AAE5B,SAAS,gBAAiD;AACxD,MAAI,sBAAuB,QAAO;AAClC,0BAAwB;AACxB,MAAI;AACF,qBAAiB,SAAS,UAAU;AAAA,EACtC,QAAQ;AACN,qBAAiB;AAAA,EACnB;AACA,SAAO;AACT;AAEA,IAAM,oBAAoB,oBAAI,IAAyB;AAEvD,SAAS,eAAe,OAA8B;AACpD,QAAM,MAAM,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG;AACtC,QAAM,SAAS,kBAAkB,IAAI,GAAG;AACxC,MAAI,OAAQ,QAAO;AAEnB,QAAM,MAAM,cAAc;AAC1B,QAAM,QAAQ,oBAAI,IAAY;AAE9B,MAAI,KAAK;AACP,eAAW,QAAQ,OAAO;AACxB,YAAM,MAAM,IAAI,IAAI;AACpB,UAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,mBAAW,KAAK,IAAK,OAAM,IAAI,CAAC;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,SAAS,GAAG;AACpB,UAAM,WAAW,oBAAI,IAAI;AAAA,MACvB;AAAA,MAAQ;AAAA,MAAO;AAAA,MAAM;AAAA,MAAM;AAAA,MAAQ;AAAA,MAAO;AAAA,MAAO;AAAA,MAAO;AAAA,MACxD;AAAA,MAAS;AAAA,MAAU;AAAA,MAAQ;AAAA,MAAU;AAAA,MAAS;AAAA,MAAQ;AAAA,MACtD;AAAA,MAAO;AAAA,MAAO;AAAA,MAAM;AAAA,MAAO;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAM;AAAA,MAChD;AAAA,MAAK;AAAA,MAAM;AAAA,MAAM;AAAA,MAAO;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MAAM;AAAA,MACtD;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAS;AAAA,MAAM;AAAA,MAAO;AAAA,MAAM;AAAA,MACrD;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAQ;AAAA,MAAS;AAAA,MAAK;AAAA,MAAM;AAAA,IACrD,CAAC;AACD,eAAW,KAAK,SAAU,OAAM,IAAI,CAAC;AAAA,EACvC;AAEA,oBAAkB,IAAI,KAAK,KAAK;AAChC,SAAO;AACT;AAWO,IAAM,cAAN,MAAkB;AAAA,EACf,YAAsC,oBAAI,IAAI;AAAA,EAC9C,aAAkC,oBAAI,IAAI;AAAA,EAC1C,eAAe;AAAA,EACf,cAA2C,oBAAI,IAAI;AAAA,EACnD,gBAA6C,oBAAI,IAAI;AAAA,EACrD,YAA8B;AAAA,EAC9B,WAAiC;AAAA,EACjC,aAAqD,CAAC;AAAA,EACtD,kBAAkB;AAAA;AAAA,EAElB,gBAAgB;AAAA,EAChB,eAAe;AAAA;AAAA,EAEf,mBAAkC;AAAA,EAClC,sBAAqC;AAAA,EACrC,oBAAmC;AAAA;AAAA,EAEnC,qBAA+B,CAAC,OAAO,KAAK;AAAA,EAEpD,OAAO,KAAsB;AAC3B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,YAAY,UAA+B;AACzC,SAAK,WAAW;AAAA,EAClB;AAAA;AAAA,EAGA,iBAAiB,SAAiB,QAAsB;AACtD,SAAK,gBAAgB;AACrB,SAAK,eAAe;AAAA,EACtB;AAAA;AAAA,EAGA,mBAAmB,OAAe,UAAyB,QAA6B;AACtF,SAAK,mBAAmB;AACxB,SAAK,sBAAsB;AAC3B,SAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA,EAGA,sBAAsB,OAAuB;AAC3C,QAAI,MAAM,SAAS,EAAG,MAAK,qBAAqB;AAAA,EAClD;AAAA;AAAA,EAGA,qBAA+F;AAC7F,QAAI,CAAC,KAAK,iBAAkB,QAAO;AACnC,WAAO,EAAE,OAAO,KAAK,kBAAkB,UAAU,KAAK,qBAAqB,QAAQ,KAAK,kBAAkB;AAAA,EAC5G;AAAA,EAEQ,gBAAgB,IAAY,SAAuB;AACzD,QAAI,CAAC,KAAK,SAAU;AACpB,SAAK,WAAW,KAAK,EAAE,IAAI,QAAQ,CAAC;AACpC,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,MAAc,oBAAmC;AAC/C,QAAI,KAAK,mBAAmB,CAAC,KAAK,SAAU;AAC5C,SAAK,kBAAkB;AAEvB,WAAO,KAAK,WAAW,SAAS,GAAG;AACjC,YAAM,QAAQ,KAAK,WAAW,OAAO,GAAG,CAAC;AACzC,YAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,EAAE,IAAI,QAAQ,MAAM;AACrD,YAAI;AACF,gBAAM,MAAM,MAAM,KAAK,SAAU,MAAM,OAAO;AAC9C,cAAI,KAAK;AACP,kBAAM,MAAM,KAAK,UAAU,IAAI,EAAE;AACjC,gBAAI,IAAK,KAAI,QAAQ;AAAA,UACvB;AAAA,QACF,QAAQ;AAAA,QAA+B;AAAA,MACzC,CAAC,CAAC;AAAA,IACJ;AAEA,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,YAAY,IAAY,SAAiB,UAA8B;AACrE,UAAM,SAAS,KAAK,SAAS,OAAO;AACpC,UAAM,KAAK,oBAAI,IAAoB;AACnC,eAAW,KAAK,QAAQ;AACtB,SAAG,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA,IAChC;AAEA,UAAM,WAAW,KAAK,UAAU,IAAI,EAAE;AACtC,QAAI,UAAU;AACZ,iBAAW,KAAK,SAAS,MAAM,KAAK,GAAG;AACrC,cAAM,OAAO,KAAK,WAAW,IAAI,CAAC;AAClC,YAAI,SAAS,QAAW;AACtB,cAAI,QAAQ,EAAG,MAAK,WAAW,OAAO,CAAC;AAAA,cAClC,MAAK,WAAW,IAAI,GAAG,OAAO,CAAC;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAM,cAAc,QAAQ,EAAE;AACpC,UAAM,YAAY,KAAK,UAAU,OAAO;AACxC,UAAM,QAAQ,oBAAI,IAAoB;AACtC,eAAW,CAAC,MAAM,KAAK,KAAK,KAAK;AAC/B,YAAM,MAAM,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK;AAC9C,YAAM,MAAM,KAAK,IAAK,YAAa,EAAE,IAAI;AACzC,UAAI,MAAM,EAAG,OAAM,IAAI,MAAM,QAAQ,GAAG;AAAA,IAC1C;AAEA,QAAI,OAAO;AACX,eAAW,KAAK,MAAM,OAAO,EAAG,SAAQ,IAAI;AAC5C,WAAO,KAAK,KAAK,IAAI;AAErB,SAAK,UAAU,IAAI,IAAI,EAAE,IAAI,SAAS,UAAU,OAAO,KAAK,CAAC;AAE7D,eAAW,KAAK,QAAQ;AACtB,WAAK,WAAW,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA,IAC1D;AAEA,SAAK,YAAY,MAAM;AACvB,SAAK,cAAc,MAAM;AAEzB,SAAK,gBAAgB,IAAI,OAAO;AAAA,EAClC;AAAA,EAEA,OAAO,OAAe,OAAO,GAAmB;AAC9C,WAAO,KAAK,aAAa,OAAO,IAAI;AAAA,EACtC;AAAA,EAEA,MAAM,eAAe,OAAe,OAAO,GAAG,OAAmB,UAAmC;AAClG,UAAM,WAAW,GAAG,IAAI,KAAK,KAAK,KAAK,IAAI;AAC3C,UAAM,SAAS,KAAK,YAAY,IAAI,QAAQ;AAC5C,QAAI,OAAQ,QAAO;AAEnB,QAAI,KAAK,UAAU,SAAS,EAAG,QAAO,CAAC;AAEvC,QAAI;AAEJ,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,kBAAU,MAAM,KAAK,YAAY,OAAO,IAAI;AAC5C;AAAA,MACF,KAAK;AACH,kBAAU,MAAM,KAAK,aAAa,OAAO,IAAI;AAC7C;AAAA,MACF,KAAK;AAAA,MACL;AACE,kBAAU,KAAK,aAAa,OAAO,IAAI;AACvC;AAAA,IACJ;AAEA,QAAI,KAAK,YAAY,QAAQ,KAAK,cAAc;AAC9C,YAAM,WAAW,KAAK,YAAY,KAAK,EAAE,KAAK,EAAE;AAChD,UAAI,aAAa,OAAW,MAAK,YAAY,OAAO,QAAQ;AAAA,IAC9D;AACA,SAAK,YAAY,IAAI,UAAU,OAAO;AAEtC,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,OAAe,MAA8B;AAChE,UAAM,cAAc,KAAK,SAAS,KAAK;AACvC,QAAI,YAAY,WAAW,EAAG,QAAO,CAAC;AAEtC,UAAM,UAAU,oBAAI,IAAoB;AACxC,eAAW,KAAK,aAAa;AAC3B,cAAQ,IAAI,IAAI,QAAQ,IAAI,CAAC,KAAK,KAAK,CAAC;AAAA,IAC1C;AACA,UAAM,MAAM,cAAc,aAAa,OAAO;AAC9C,UAAM,YAAY,KAAK,UAAU;AAEjC,QAAI,QAAQ;AACZ,UAAM,UAAU,oBAAI,IAAoB;AACxC,eAAW,CAAC,MAAM,KAAK,KAAK,KAAK;AAC/B,YAAM,KAAK,KAAK,WAAW,IAAI,IAAI,KAAK;AACxC,YAAM,MAAM,KAAK,IAAI,KAAK,IAAK,YAAa,EAAE,IAAI,IAAI;AACtD,YAAM,IAAI,QAAQ;AAClB,cAAQ,IAAI,MAAM,CAAC;AACnB,eAAS,IAAI;AAAA,IACf;AACA,YAAQ,KAAK,KAAK,KAAK;AACvB,QAAI,UAAU,EAAG,QAAO,CAAC;AAEzB,UAAM,SAAyB,CAAC;AAChC,eAAW,OAAO,KAAK,UAAU,OAAO,GAAG;AACzC,UAAI,MAAM;AACV,iBAAW,CAAC,MAAM,EAAE,KAAK,SAAS;AAChC,cAAM,KAAK,IAAI,MAAM,IAAI,IAAI;AAC7B,YAAI,GAAI,QAAO,KAAK;AAAA,MACtB;AACA,YAAM,QAAQ,IAAI,OAAO,IAAI,OAAO,QAAQ,IAAI,QAAQ;AACxD,UAAI,QAAQ,MAAM;AAChB,eAAO,KAAK,EAAE,IAAI,IAAI,IAAI,SAAS,IAAI,SAAS,UAAU,EAAE,GAAG,IAAI,SAAS,GAAG,MAAM,CAAC;AAAA,MACxF;AAAA,IACF;AAEA,WAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACvC,WAAO,OAAO,MAAM,GAAG,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAc,YAAY,OAAe,MAAuC;AAC9E,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,SAAS,OAAO;AAC1C,aAAO,KAAK,aAAa,OAAO,IAAI;AAAA,IACtC;AAEA,UAAM,WAAW,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,OAAK,EAAE,KAAK;AAC/D,QAAI,CAAC,SAAU,QAAO,KAAK,aAAa,OAAO,IAAI;AAEnD,UAAM,OAAO,MAAM,KAAK,SAAS,MAAM,KAAK;AAC5C,QAAI,CAAC,KAAM,QAAO,KAAK,aAAa,OAAO,IAAI;AAE/C,UAAM,UAA0B,CAAC;AACjC,eAAW,OAAO,KAAK,UAAU,OAAO,GAAG;AACzC,UAAI,CAAC,IAAI,MAAO;AAChB,UAAI,MAAM,GAAG,KAAK,GAAG,KAAK;AAC1B,eAAS,IAAI,GAAG,IAAI,IAAI,MAAM,QAAQ,KAAK;AACzC,cAAM,KAAK,KAAK,CAAC,KAAK;AACtB,cAAM,KAAK,IAAI,MAAM,CAAC,KAAK;AAC3B,eAAO,KAAK;AACZ,cAAM,KAAK;AACX,cAAM,KAAK;AAAA,MACb;AACA,YAAM,MAAM,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,EAAE;AACxC,YAAM,QAAQ,QAAQ,IAAI,IAAI,MAAM;AACpC,UAAI,QAAQ,KAAK;AACf,gBAAQ,KAAK,EAAE,IAAI,IAAI,IAAI,SAAS,IAAI,SAAS,UAAU,EAAE,GAAG,IAAI,SAAS,GAAG,MAAM,CAAC;AAAA,MACzF;AAAA,IACF;AAEA,YAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACxC,WAAO,QAAQ,MAAM,GAAG,IAAI;AAAA,EAC9B;AAAA,EAEA,MAAc,aAAa,OAAe,MAAuC;AAC/E,UAAM,CAAC,cAAc,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,MACtD,KAAK,YAAY,OAAO,KAAK,IAAI,OAAO,GAAG,EAAE,CAAC;AAAA,MAC9C,QAAQ,QAAQ,KAAK,aAAa,OAAO,KAAK,IAAI,OAAO,GAAG,EAAE,CAAC,CAAC;AAAA,IAClE,CAAC;AAED,UAAM,WAAW,oBAAI,IAA+E;AAEpG,UAAM,YAAY,cAAc,CAAC,GAAG,SAAS;AAC7C,eAAW,KAAK,eAAe;AAC7B,eAAS,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,WAAW,YAAY,GAAG,QAAQ,EAAE,CAAC;AAAA,IACnF;AAEA,UAAM,WAAW,aAAa,CAAC,GAAG,SAAS;AAC3C,eAAW,KAAK,cAAc;AAC5B,YAAM,WAAW,SAAS,IAAI,EAAE,EAAE;AAClC,UAAI,UAAU;AACZ,iBAAS,aAAa,EAAE,QAAQ;AAAA,MAClC,OAAO;AACL,iBAAS,IAAI,EAAE,IAAI,EAAE,aAAa,GAAG,YAAY,EAAE,QAAQ,UAAU,QAAQ,EAAE,CAAC;AAAA,MAClF;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK;AACnB,UAAM,UAAU,CAAC,GAAG,SAAS,OAAO,CAAC,EAClC,IAAI,CAAC,EAAE,aAAa,YAAY,OAAO,OAAO;AAAA,MAC7C,GAAG;AAAA,MACH,OAAQ,KAAK,gBAAiB,cAAe,KAAK,eAAgB;AAAA,IACpE,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,IAAI;AAEhB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,eAAe,OAAe,OAAO,GAA4B;AACrE,QAAI,KAAK,UAAU,SAAS,EAAG,QAAO,CAAC;AAEvC,UAAM,SAAS,KAAK,cAAc,IAAI,GAAG,KAAK,KAAK,IAAI,EAAE;AACzD,QAAI,OAAQ,QAAO;AAEnB,UAAM,iBAAiB,KAAK,IAAI,OAAO,GAAG,EAAE;AAC5C,UAAM,gBAAgB,MAAM,KAAK,aAAa,OAAO,cAAc;AAEnE,QAAI,CAAC,KAAK,aAAa,cAAc,UAAU,MAAM;AACnD,YAAM,UAAU,cAAc,MAAM,GAAG,IAAI;AAC3C,WAAK,cAAc,IAAI,GAAG,KAAK,KAAK,IAAI,IAAI,OAAO;AACnD,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,UAAU,cAAc,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,QAAQ,MAAM,GAAG,GAAG,CAAC,EAAE,EAAE,KAAK,IAAI;AAC1F,YAAM,OAAO,MAAM,KAAK,UAAU,KAAK;AAAA,QACrC,cAAc;AAAA,QACd,YAAY,WAAW,KAAK;AAAA;AAAA;AAAA,EAAoB,OAAO;AAAA;AAAA;AAAA,QACvD,UAAU;AAAA,QACV,aAAa;AAAA,QACb,WAAW;AAAA,MACb,CAAC;AAED,YAAM,WAAqB,KAAK,MAAM,KAAK,OAAO;AAClD,YAAM,WAA2B,CAAC;AAClC,YAAM,OAAO,oBAAI,IAAY;AAE7B,iBAAW,OAAO,UAAU;AAC1B,YAAI,OAAO,KAAK,MAAM,cAAc,UAAU,CAAC,KAAK,IAAI,GAAG,GAAG;AAC5D,mBAAS,KAAK,EAAE,GAAG,cAAc,GAAG,GAAG,OAAO,IAAI,SAAS,SAAS,SAAS,OAAO,CAAC;AACrF,eAAK,IAAI,GAAG;AAAA,QACd;AAAA,MACF;AACA,eAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,YAAI,CAAC,KAAK,IAAI,CAAC,EAAG,UAAS,KAAK,EAAE,GAAG,cAAc,CAAC,GAAG,OAAO,IAAI,CAAC;AAAA,MACrE;AAEA,YAAM,UAAU,SAAS,MAAM,GAAG,IAAI;AACtC,WAAK,cAAc,IAAI,GAAG,KAAK,KAAK,IAAI,IAAI,OAAO;AACnD,aAAO;AAAA,IACT,QAAQ;AACN,YAAM,UAAU,cAAc,MAAM,GAAG,IAAI;AAC3C,WAAK,cAAc,IAAI,GAAG,KAAK,KAAK,IAAI,IAAI,OAAO;AACnD,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,aAAa,OAAe,MAAoB,OAAO,GAAmB;AACxE,UAAM,UAAU,KAAK,OAAO,OAAO,OAAO,CAAC;AAC3C,WAAO,QAAQ,OAAO,OAAK,EAAE,SAAS,SAAS,IAAI,EAAE,MAAM,GAAG,IAAI;AAAA,EACpE;AAAA,EAEA,MAAM,qBAAqB,OAAe,MAAoB,OAAO,GAA4B;AAC/F,UAAM,UAAU,MAAM,KAAK,eAAe,OAAO,OAAO,CAAC;AACzD,WAAO,QAAQ,OAAO,OAAK,EAAE,SAAS,SAAS,IAAI,EAAE,MAAM,GAAG,IAAI;AAAA,EACpE;AAAA,EAEA,eAAe,IAAqB;AAClC,UAAM,QAAQ,KAAK,UAAU,IAAI,EAAE;AACnC,QAAI,CAAC,MAAO,QAAO;AACnB,eAAW,KAAK,MAAM,MAAM,KAAK,GAAG;AAClC,YAAM,OAAO,KAAK,WAAW,IAAI,CAAC;AAClC,UAAI,SAAS,QAAW;AACtB,YAAI,QAAQ,EAAG,MAAK,WAAW,OAAO,CAAC;AAAA,YAClC,MAAK,WAAW,IAAI,GAAG,OAAO,CAAC;AAAA,MACtC;AAAA,IACF;AACA,SAAK,UAAU,OAAO,EAAE;AACxB,SAAK,YAAY,MAAM;AACvB,SAAK,cAAc,MAAM;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,OAAe;AAAE,WAAO,KAAK,UAAU;AAAA,EAAK;AAAA,EAC5C,QAAc;AAAE,SAAK,UAAU,MAAM;AAAG,SAAK,WAAW,MAAM;AAAG,SAAK,YAAY,MAAM;AAAG,SAAK,cAAc,MAAM;AAAA,EAAE;AAAA,EACtH,aAAmB;AAAE,SAAK,YAAY,MAAM;AAAG,SAAK,cAAc,MAAM;AAAA,EAAE;AAAA,EAElE,SAAS,MAAwB;AACvC,UAAM,YAAY,eAAe,KAAK,kBAAkB;AAGxD,WAAO,KAAK,YAAY,EACrB,MAAM,kBAAkB,EACxB,OAAO,OAAK,EAAE,SAAS,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;AAAA,EAClD;AACF;AAEA,SAAS,cAAc,QAAkB,IAA8C;AACrF,QAAM,MAAM,OAAO;AACnB,QAAM,SAAS,oBAAI,IAAoB;AACvC,aAAW,CAAC,GAAG,CAAC,KAAK,IAAI;AACvB,WAAO,IAAI,GAAG,IAAI,GAAG;AAAA,EACvB;AACA,SAAO;AACT;;;ACzaO,IAAM,gBAAN,MAAoB;AAAA,EACjB,QAAQ,oBAAI,IAAwB;AAAA,EACpC,eAAsC,oBAAI,IAAI;AAAA,EAErC,yBAAyB;AAAA,EAE1C,cAAc;AACZ,SAAK,aAAa,IAAI,QAAQ,CAAC,CAAC;AAChC,SAAK,aAAa,IAAI,WAAW,CAAC,CAAC;AAAA,EACrC;AAAA,EAEA,cAAc,OAAe,QAAwB;AACnD,SAAK,aAAa,IAAI,OAAO,MAAM;AAAA,EACrC;AAAA,EAEA,SAAS,MAAoB;AAC3B,QAAI,CAAC,KAAK,MAAM,IAAI,IAAI,GAAG;AACzB,WAAK,MAAM,IAAI,MAAM;AAAA,QACnB,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,aAAa;AAAA,QACb,oBAAoB;AAAA,QACpB,cAAc;AAAA,QACd,UAAU;AAAA,QACV,qBAAqB;AAAA,QACrB,sBAAsB;AAAA,QACtB,iBAAiB;AAAA,QACjB,YAAY,CAAC;AAAA,MACf,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,WAAW,OAAe,SAAkB,WAAmB,UAAyB;AACtF,SAAK,SAAS,KAAK;AACnB,UAAMI,QAAO,KAAK,MAAM,IAAI,KAAK;AACjC,IAAAA,MAAK;AACL,IAAAA,MAAK,WAAW,KAAK,IAAI;AAEzB,QAAI,SAAS;AACX,MAAAA,MAAK;AACL,MAAAA,MAAK,sBAAsB;AAC3B,MAAAA,MAAK;AAEL,YAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,UAAIA,MAAK,kBAAkB,KAAKA,MAAK,wBAAwB,KAAKA,MAAK,cAAc,KAAK,SAAS,MAAM,oBAAoB,KAAK;AAChI,QAAAA,MAAK,kBAAkB;AAAA,MACzB;AAAA,IACF,OAAO;AACL,MAAAA,MAAK;AACL,MAAAA,MAAK;AACL,MAAAA,MAAK,uBAAuB;AAE5B,UAAIA,MAAK,uBAAuB,GAAG;AACjC,aAAK,gBAAgB,OAAO,EAAE;AAAA,MAChC;AAAA,IACF;AAEA,IAAAA,MAAK,eAAeA,MAAK,iBAAiB,IACtC,aACCA,MAAK,gBAAgBA,MAAK,aAAa,KAAK,aAAaA,MAAK;AAGnE,QAAI,YAAYA,MAAK,YAAY;AAC/B,UAAI,CAACA,MAAK,WAAW,QAAQ,GAAG;AAC9B,QAAAA,MAAK,WAAW,QAAQ,IAAI;AAAA,UAC1B,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,aAAa;AAAA,UACb,oBAAoB;AAAA,UACpB,cAAc;AAAA,UACd,UAAU;AAAA,UACV,qBAAqB;AAAA,UACrB,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,QACnB;AAAA,MACF;AACA,YAAM,WAAWA,MAAK,WAAW,QAAQ;AACzC,eAAS;AACT,eAAS,WAAW,KAAK,IAAI;AAC7B,UAAI,SAAS;AACX,iBAAS;AACT,iBAAS,sBAAsB;AAAA,MACjC,OAAO;AACL,iBAAS;AACT,iBAAS;AAAA,MACX;AACA,eAAS,eAAe,SAAS,iBAAiB,IAC9C,aACC,SAAS,gBAAgB,SAAS,aAAa,KAAK,aAAa,SAAS;AAAA,IACjF;AAAA,EACF;AAAA,EAEA,oBAAoB,OAAqB;AACvC,SAAK,SAAS,KAAK;AACnB,UAAMA,QAAO,KAAK,MAAM,IAAI,KAAK;AACjC,IAAAA,MAAK;AAAA,EACP;AAAA,EAEA,SAAS,OAAkC;AACzC,UAAMA,QAAO,KAAK,MAAM,IAAI,KAAK;AACjC,QAAI,CAACA,SAAQA,MAAK,eAAe,GAAG;AAClC,aAAO;AAAA,QACL;AAAA,QACA,aAAa;AAAA,QACb,mBAAmB;AAAA,QACnB,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,cAAcA,MAAK,eAAeA,MAAK;AAC7C,UAAM,oBAAoBA,MAAK,qBAAqBA,MAAK;AACzD,UAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,cAAc,oBAAoB,CAAC,CAAC;AAEhF,QAAI,SAA+B;AACnC,QAAIA,MAAK,uBAAuB,KAAK,uBAAwB,UAAS;AACtE,QAAI,oBAAoB,OAAO,cAAc,IAAK,UAAS;AAE3D,WAAO,EAAE,OAAO,aAAa,mBAAmB,YAAYA,MAAK,YAAY,OAAO;AAAA,EACtF;AAAA,EAEA,mBAAmB,OAAe,UAAqC;AACrE,UAAMA,QAAO,KAAK,MAAM,IAAI,KAAK;AACjC,QAAI,CAACA,SAAQ,CAACA,MAAK,cAAc,CAACA,MAAK,WAAW,QAAQ,GAAG;AAC3D,aAAO;AAAA,QACL;AAAA,QACA,aAAa;AAAA,QACb,mBAAmB;AAAA,QACnB,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,WAAWA,MAAK,WAAW,QAAQ;AACzC,QAAI,SAAS,eAAe,GAAG;AAC7B,aAAO;AAAA,QACL;AAAA,QACA,aAAa;AAAA,QACb,mBAAmB;AAAA,QACnB,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,UAAM,cAAc,SAAS,eAAe,SAAS;AACrD,UAAM,oBAAoB,SAAS,qBAAqB,SAAS;AACjE,UAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,cAAc,oBAAoB,CAAC,CAAC;AAEhF,QAAI,SAA+B;AACnC,QAAI,SAAS,uBAAuB,KAAK,uBAAwB,UAAS;AAC1E,QAAI,oBAAoB,OAAO,cAAc,IAAK,UAAS;AAE3D,WAAO,EAAE,OAAO,aAAa,mBAAmB,YAAY,SAAS,YAAY,OAAO;AAAA,EAC1F;AAAA,EAEA,eAA6B;AAC3B,UAAM,SAAS,oBAAI,IAAY;AAC/B,eAAW,OAAO,KAAK,MAAM,KAAK,EAAG,QAAO,IAAI,GAAG;AACnD,eAAW,CAAC,EAAE,OAAO,KAAK,KAAK,cAAc;AAC3C,iBAAW,KAAK,QAAS,QAAO,IAAI,CAAC;AAAA,IACvC;AACA,WAAO,CAAC,GAAG,MAAM,EAAE,IAAI,OAAK,KAAK,SAAS,CAAC,CAAE,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,EAAE,WAAW;AAAA,EAC7F;AAAA,EAEA,aAAa,OAAyB;AACpC,WAAO,KAAK,aAAa,IAAI,KAAK,MAAM,QAAQ,CAAC,KAAK,IAAI,CAAC;AAAA,EAC7D;AAAA,EAEA,oBAAoB,MAAc,kBAA4B,CAAC,GAAa;AAC1E,UAAM,aAAa,oBAAI,IAAY;AAEnC,eAAW,KAAK,iBAAiB;AAC/B,YAAM,WAAW,KAAK,aAAa,CAAC;AACpC,iBAAW,KAAK,SAAU,KAAI,EAAG,YAAW,IAAI,CAAC;AAAA,IACnD;AAEA,eAAW,OAAO,KAAK,MAAM,KAAK,EAAG,YAAW,IAAI,GAAG;AAEvD,QAAI,WAAW,SAAS,EAAG,QAAO,CAAC,SAAS;AAE5C,UAAM,SAAS,CAAC,GAAG,UAAU,EAC1B,IAAI,QAAM,EAAE,OAAO,GAAG,OAAO,KAAK,SAAS,CAAC,EAAE,EAAE,EAChD,KAAK,CAAC,GAAG,MAAM;AACd,UAAI,CAAC,EAAE,SAAS,CAAC,EAAE,MAAO,QAAO;AACjC,UAAI,EAAE,MAAM,WAAW,aAAa,EAAE,MAAM,WAAW,UAAW,QAAO;AACzE,UAAI,EAAE,MAAM,WAAW,aAAa,EAAE,MAAM,WAAW,UAAW,QAAO;AACzE,aAAO,EAAE,MAAM,cAAc,EAAE,MAAM;AAAA,IACvC,CAAC;AAEH,WAAO,OAAO,IAAI,OAAK,EAAE,KAAK;AAAA,EAChC;AAAA,EAEA,UAAU,OAAe,QAAuK;AAC9L,UAAMA,QAAO,KAAK,MAAM,IAAI,KAAK;AACjC,QAAI,CAACA,MAAM,QAAO,EAAE,SAAS,OAAO,QAAQ,IAAI,UAAU,KAAK;AAE/D,QAAIA,MAAK,kBAAkB,KAAK,KAAK,IAAI,IAAIA,MAAK,iBAAiB;AACjE,YAAM,mBAAmB,KAAK,MAAMA,MAAK,kBAAkB,KAAK,IAAI,MAAM,KAAK,IAAK;AACpF,aAAO,EAAE,SAAS,MAAM,QAAQ,qBAAqB,gBAAgB,iBAAiB,UAAU,OAAO;AAAA,IACzG;AAEA,QAAIA,MAAK,aAAa,OAAO,eAAe;AAC1C,aAAO,EAAE,SAAS,OAAO,QAAQ,IAAI,UAAU,KAAK;AAAA,IACtD;AAEA,UAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,QAAI,CAAC,MAAO,QAAO,EAAE,SAAS,OAAO,QAAQ,IAAI,UAAU,KAAK;AAEhE,QAAI,MAAM,cAAc,OAAO,sBAAsB;AACnD,aAAO,EAAE,SAAS,MAAM,QAAQ,gBAAgB,MAAM,cAAc,KAAK,QAAQ,CAAC,CAAC,QAAQ,OAAO,uBAAuB,KAAK,QAAQ,CAAC,CAAC,KAAK,UAAU,OAAO;AAAA,IAChK;AACA,QAAIA,MAAK,uBAAuB,GAAG;AACjC,aAAO,EAAE,SAAS,MAAM,QAAQ,GAAGA,MAAK,mBAAmB,yBAAyB,UAAU,OAAO;AAAA,IACvG;AACA,QAAI,MAAM,oBAAoB,KAAK;AACjC,aAAO,EAAE,SAAS,MAAM,QAAQ,uBAAuB,MAAM,oBAAoB,KAAK,QAAQ,CAAC,CAAC,WAAW,UAAU,OAAO;AAAA,IAC9H;AAEA,QAAI,MAAM,cAAc,OAAO,sBAAsB;AACnD,aAAO,EAAE,SAAS,MAAM,QAAQ,gBAAgB,MAAM,cAAc,KAAK,QAAQ,CAAC,CAAC,QAAQ,OAAO,uBAAuB,KAAK,QAAQ,CAAC,CAAC,KAAK,UAAU,OAAO;AAAA,IAChK;AAEA,WAAO,EAAE,SAAS,OAAO,QAAQ,IAAI,UAAU,KAAK;AAAA,EACtD;AAAA,EAEA,gBACE,UACA,iBACA,gBACQ;AACR,QAAI,gBAAgB,WAAW,EAAG,QAAO;AACzC,QAAI,gBAAgB,WAAW,EAAG,QAAO,gBAAgB,CAAC;AAE1D,UAAM,SAAS,gBACZ,IAAI,WAAS;AACZ,YAAM,iBAAiB,KAAK,aAAa,KAAK;AAC9C,UAAI,eAAe,WAAW,EAAG,QAAO,EAAE,OAAO,OAAO,MAAM,SAAS,MAAM;AAE7E,YAAM,eAAe,eAClB,IAAI,OAAK;AACR,cAAM,cAAc,iBAChB,KAAK,UAAU,GAAG,cAAc,IAChC,EAAE,SAAS,OAAO,QAAQ,IAAI,UAAU,KAAK;AACjD,eAAO;AAAA,UACL,OAAO;AAAA,UACP,OAAO,KAAK,mBAAmB,GAAG,QAAQ;AAAA,UAC1C,SAAS,YAAY,WAAW,YAAY,aAAa;AAAA,QAC3D;AAAA,MACF,CAAC,EACA,OAAO,OAAK,CAAC,EAAE,OAAO,EACtB,KAAK,CAAC,GAAG,MAAM;AACd,YAAI,CAAC,EAAE,SAAS,CAAC,EAAE,MAAO,QAAO;AACjC,YAAI,EAAE,MAAM,WAAW,aAAa,EAAE,MAAM,WAAW,UAAW,QAAO;AACzE,YAAI,EAAE,MAAM,WAAW,aAAa,EAAE,MAAM,WAAW,UAAW,QAAO;AACzE,eAAO,EAAE,MAAM,cAAc,EAAE,MAAM;AAAA,MACvC,CAAC,EAAE,CAAC;AAEN,aAAO;AAAA,IACT,CAAC,EACA,OAAO,OAAK,KAAK,EAAE,UAAU,IAAI,EACjC,KAAK,CAAC,GAAG,MAAM;AACd,UAAI,CAAC,EAAE,SAAS,CAAC,EAAE,MAAO,QAAO;AACjC,UAAI,EAAE,MAAM,WAAW,aAAa,EAAE,MAAM,WAAW,UAAW,QAAO;AACzE,UAAI,EAAE,MAAM,WAAW,aAAa,EAAE,MAAM,WAAW,UAAW,QAAO;AACzE,aAAO,EAAE,MAAM,cAAc,EAAE,MAAM;AAAA,IACvC,CAAC;AAEH,WAAO,OAAO,SAAS,IAAI,OAAO,CAAC,EAAE,QAAQ,gBAAgB,CAAC;AAAA,EAChE;AAAA,EAEA,mBACE,UACA,iBACA,gBAC4F;AAC5F,QAAI,gBAAgB,WAAW,GAAG;AAChC,aAAO,EAAE,OAAO,WAAW,MAAM,SAAS,UAAU,CAAC,oCAAoC,EAAE;AAAA,IAC7F;AAEA,UAAM,WAAqB,CAAC;AAC5B,UAAM,cAAoG;AAAA,MACxG,SAAS,CAAC;AAAA,MACV,UAAU,CAAC;AAAA,MACX,UAAU,CAAC;AAAA,MACX,aAAa,CAAC;AAAA,IAChB;AAEA,eAAW,SAAS,iBAAiB;AACnC,YAAM,cAAc,KAAK,UAAU,OAAO,cAAc;AACxD,UAAI,YAAY,WAAW,YAAY,aAAa,QAAQ;AAC1D,oBAAY,YAAY,KAAK,KAAK;AAClC,iBAAS,KAAK,GAAG,KAAK,oBAAoB,YAAY,MAAM,EAAE;AAC9D;AAAA,MACF;AAEA,YAAM,QAAQ,KAAK,SAAS,KAAK;AACjC,UAAI,CAAC,SAAS,MAAM,aAAa,eAAe,eAAe;AAC7D,oBAAY,QAAQ,KAAK,KAAK;AAAA,MAChC,WAAW,MAAM,WAAW,WAAW;AACrC,oBAAY,QAAQ,KAAK,KAAK;AAAA,MAChC,WAAW,MAAM,WAAW,YAAY;AACtC,oBAAY,SAAS,KAAK,KAAK;AAAA,MACjC,OAAO;AACL,oBAAY,SAAS,KAAK,KAAK;AAAA,MACjC;AAAA,IACF;AAEA,QAAI,YAAY,QAAQ,SAAS,GAAG;AAClC,aAAO,EAAE,OAAO,YAAY,QAAQ,CAAC,GAAG,MAAM,WAAW,SAAS;AAAA,IACpE;AAEA,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,eAAS,KAAK,wBAAwB,YAAY,SAAS,CAAC,CAAC,mCAAmC;AAChG,aAAO,EAAE,OAAO,YAAY,SAAS,CAAC,GAAG,MAAM,YAAY,SAAS;AAAA,IACtE;AAEA,QAAI,YAAY,SAAS,SAAS,GAAG;AACnC,eAAS,KAAK,wBAAwB,YAAY,SAAS,CAAC,CAAC,4CAA4C;AACzG,aAAO,EAAE,OAAO,YAAY,SAAS,CAAC,GAAG,MAAM,YAAY,SAAS;AAAA,IACtE;AAEA,UAAM,gBAAgB,gBAAgB,CAAC;AACvC,SAAK,WAAW,aAAa;AAC7B,aAAS,KAAK,8BAA8B,aAAa,eAAe;AACxE,WAAO,EAAE,OAAO,eAAe,MAAM,SAAS,SAAS;AAAA,EACzD;AAAA,EAEA,WAAW,OAAqB;AAC9B,UAAMA,QAAO,KAAK,MAAM,IAAI,KAAK;AACjC,QAAI,CAACA,MAAM;AAEX,IAAAA,MAAK,aAAa;AAClB,IAAAA,MAAK,eAAe;AACpB,IAAAA,MAAK,cAAc;AACnB,IAAAA,MAAK,qBAAqB;AAC1B,IAAAA,MAAK,sBAAsB;AAC3B,IAAAA,MAAK,aAAa,CAAC;AAAA,EACrB;AAAA,EAEA,iBAAiB,YAAoB,GAAa;AAChD,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,iBAAiB,YAAY,KAAK,KAAK,KAAK;AAClD,UAAM,cAAwB,CAAC;AAE/B,eAAW,CAAC,OAAOA,KAAI,KAAK,KAAK,MAAM,QAAQ,GAAG;AAChD,UAAIA,MAAK,WAAW,KAAM,MAAMA,MAAK,WAAY,gBAAgB;AAC/D,aAAK,WAAW,KAAK;AACrB,oBAAY,KAAK,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAgB,OAAe,kBAA0B,IAAU;AACjE,UAAMA,QAAO,KAAK,MAAM,IAAI,KAAK;AACjC,QAAI,CAACA,MAAM;AAEX,IAAAA,MAAK,kBAAkB,KAAK,IAAI,IAAK,kBAAkB,KAAK;AAC5D,IAAAA,MAAK,uBAAuB;AAAA,EAC9B;AAAA,EAEA,aAAqB;AACnB,UAAM,SAAS,KAAK,aAAa;AACjC,QAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,WAAO,OAAO,IAAI,OAAK;AACrB,YAAM,OAAO,EAAE,WAAW,YAAY,WAAM,EAAE,WAAW,aAAa,iBAAO;AAC7E,aAAO,GAAG,IAAI,MAAM,EAAE,KAAK,2BAAsB,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC,uBAAuB,EAAE,oBAAoB,KAAK,QAAQ,CAAC,CAAC,aAAa,EAAE,UAAU;AAAA,IACvK,CAAC,EAAE,KAAK,IAAI;AAAA,EACd;AAAA,EAEA,SAAqC;AACnC,WAAO,OAAO,YAAY,KAAK,KAAK;AAAA,EACtC;AAAA,EAEA,SAAS,MAAwC;AAC/C,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC7C,WAAK,MAAM,IAAI,KAAK,GAAG;AAAA,IACzB;AAAA,EACF;AACF;;;ACpZA,SAAS,gBAAAC,eAAc,iBAAAC,gBAAe,aAAAC,YAAW,cAAAC,aAAY,aAAa;AAC1E,SAAS,QAAAC,aAAY;AA6Dd,IAAM,iBAAsC;AAAA,EACjD,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,oBAAoB,CAAC,OAAO,KAAK;AAAA,IACjC,QAAQ;AAAA,MACN,eAAe;AAAA,MACf,cAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,oBAAoB;AAAA,IACpB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,sBAAsB;AAAA,IACtB,sBAAsB;AAAA,IACtB,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,oBAAoB;AAAA,IACpB,eAAe;AAAA,EACjB;AACF;AAMO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACS;AAAA,EACA;AAAA,EACT,UAA2C;AAAA,EAC3C,YAA0D,CAAC;AAAA,EAEnE,YAAY,UAAkB;AAC5B,SAAK,WAAW,YAAY,QAAQ,IAAI;AACxC,SAAK,aAAaA,MAAK,KAAK,UAAU,YAAY,aAAa;AAC/D,SAAK,SAAS,EAAE,GAAG,eAAe;AAAA,EACpC;AAAA;AAAA,EAGA,OAA4B;AAC1B,QAAI;AACF,UAAI,CAACD,YAAW,KAAK,UAAU,GAAG;AAChC,aAAK,KAAK,cAAc;AACxB,aAAK,SAAS,EAAE,GAAG,eAAe;AAClC,eAAO,KAAK;AAAA,MACd;AAEA,YAAM,MAAMH,cAAa,KAAK,YAAY,OAAO;AACjD,YAAM,SAAS,KAAK,MAAM,GAAG;AAG7B,WAAK,SAAS,KAAK,UAAU,EAAE,GAAG,eAAe,GAAG,MAAM;AAC1D,aAAO,KAAK;AAAA,IACd,QAAQ;AAEN,WAAK,SAAS,EAAE,GAAG,eAAe;AAClC,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AAAA;AAAA,EAGA,KAAK,QAAmC;AACtC,UAAM,MAAMI,MAAK,KAAK,UAAU,UAAU;AAC1C,QAAI,CAACD,YAAW,GAAG,GAAG;AACpB,MAAAD,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AACA,IAAAD,eAAc,KAAK,YAAY,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACvE,SAAK,SAAS,EAAE,GAAG,OAAO;AAAA,EAC5B;AAAA;AAAA,EAGA,MAA2B;AACzB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,OAAO,SAA4D;AACjE,SAAK,SAAS,KAAK,UAAU,KAAK,QAAQ,OAAO;AACjD,SAAK,KAAK,KAAK,MAAM;AACrB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,aAAmB;AACjB,QAAI,KAAK,QAAS;AAClB,QAAI;AACF,WAAK,UAAU,MAAM,KAAK,YAAY,CAAC,cAAc;AACnD,YAAI,cAAc,UAAU;AAC1B,eAAK,KAAK;AACV,qBAAW,YAAY,KAAK,WAAW;AACrC,qBAAS,KAAK,MAAM;AAAA,UACtB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AAAA;AAAA,EAGA,YAAkB;AAChB,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,MAAM;AACnB,WAAK,UAAU;AAAA,IACjB;AACA,SAAK,YAAY,CAAC;AAAA,EACpB;AAAA;AAAA,EAGA,SAAS,UAA6D;AACpE,SAAK,UAAU,KAAK,QAAQ;AAC5B,WAAO,MAAM;AACX,YAAM,MAAM,KAAK,UAAU,QAAQ,QAAQ;AAC3C,UAAI,QAAQ,GAAI,MAAK,UAAU,OAAO,KAAK,CAAC;AAAA,IAC9C;AAAA,EACF;AAAA;AAAA,EAGA,eAAwB;AACtB,WAAO,KAAK,OAAO,aAAa,QAAQ,CAAC,CAAC,KAAK,OAAO,UAAU;AAAA,EAClE;AAAA;AAAA,EAGA,sBAA8C;AAC5C,QAAI,KAAK,aAAa,EAAG,QAAO;AAChC,WAAO,KAAK,OAAO,OAAO;AAAA,EAC5B;AAAA;AAAA,EAGQ,UAAyC,QAAW,QAAuB;AACjF,UAAM,SAAS,EAAE,GAAG,OAAO;AAC3B,eAAW,OAAO,OAAO,KAAK,MAAM,GAAqB;AACvD,YAAM,MAAM,OAAO,GAAG;AACtB,UAAI,QAAQ,UAAa,QAAQ,QAAQ,OAAO,QAAQ,YAAY,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvF,eAAO,GAAG,IAAI,KAAK,UAAU,OAAO,GAAG,GAA0B,GAA0B;AAAA,MAC7F,WAAW,QAAQ,QAAW;AAC5B,eAAO,GAAG,IAAI;AAAA,MAChB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;;;ACvGO,IAAM,mBAAN,MAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS5B,QACE,UACA,cAA4B,CAAC,GAC7B,SAA2E,CAAC,GAC5E,UAA+D,CAAC,GACjD;AACf,UAAM,cAAc,QAAQ,eAAe;AAC3C,UAAM,mBAAmB,QAAQ,oBAAoB;AACrD,UAAM,aAAa,CAAC,GAAG,IAAI,IAAI,SAAS,IAAI,OAAK,EAAE,SAAS,CAAC,CAAC;AAE9D,UAAM,gBAAgB,KAAK,cAAc,UAAU,aAAa,YAAY,WAAW;AACvF,UAAM,eAAe,KAAK,aAAa,UAAU,YAAY,gBAAgB;AAC7E,UAAM,kBAAkB,KAAK,uBAAuB,UAAU,UAAU;AACxE,UAAM,qBAAqB,KAAK,cAAc,MAAM;AACpD,UAAM,kBAAkB,KAAK,wBAAwB;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,eAAe,WAAW;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAIQ,cACN,UACA,aACA,YACA,aACgB;AAEhB,UAAM,kBAAkB,oBAAI,IAIzB;AAEH,eAAW,KAAK,aAAa;AAC3B,UAAI,EAAE,QAAS;AACf,YAAM,MAAM,EAAE,YAAY;AAC1B,UAAI,QAAQ,gBAAgB,IAAI,GAAG;AACnC,UAAI,CAAC,OAAO;AACV,gBAAQ,EAAE,UAAU,oBAAI,IAAI,GAAG,OAAO,GAAG,eAAe,EAAE;AAC1D,wBAAgB,IAAI,KAAK,KAAK;AAAA,MAChC;AACA,YAAM,SAAS,IAAI,EAAE,SAAS;AAC9B,YAAM;AACN,UAAI,EAAE,YAAY,MAAM,cAAe,OAAM,gBAAgB,EAAE;AAAA,IACjE;AAGA,eAAW,MAAM,UAAU;AACzB,UAAI,GAAG,YAAY,YAAY,GAAG,YAAY,WAAW;AAEvD,cAAM,OAAO,GAAG,SAAS,YAAY;AACrC,cAAM,cAAc,KAAK,cAAc,IAAI;AAC3C,YAAI,aAAa;AACf,cAAI,QAAQ,gBAAgB,IAAI,WAAW;AAC3C,cAAI,CAAC,OAAO;AACV,oBAAQ,EAAE,UAAU,oBAAI,IAAI,GAAG,OAAO,GAAG,eAAe,EAAE;AAC1D,4BAAgB,IAAI,aAAa,KAAK;AAAA,UACxC;AACA,gBAAM,SAAS,IAAI,GAAG,SAAS;AAC/B,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,WAAW;AACjC,UAAM,WAA2B,CAAC;AAElC,eAAW,CAAC,UAAU,IAAI,KAAK,iBAAiB;AAC9C,UAAI,KAAK,SAAS,OAAO,YAAa;AAEtC,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,cAAc,KAAK,SAAS;AAAA,QAC5B,kBAAkB,KAAK;AAAA,QACvB,iBAAiB,gBAAgB,IAAI,KAAK,SAAS,OAAO,gBAAgB;AAAA,QAC1E,gBAAgB,IAAI,KAAK,KAAK,aAAa,EAAE,YAAY;AAAA,QACzD,YAAY,KAAK,gBAAgB,QAAQ;AAAA,QACzC,gBAAgB,CAAC,GAAG,KAAK,QAAQ,EAAE,MAAM,GAAG,CAAC;AAAA,MAC/C,CAAC;AAAA,IACH;AAGA,aAAS,KAAK,CAAC,GAAG,MAAM,EAAE,eAAe,EAAE,YAAY;AACvD,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,aACN,UACA,YACA,kBACe;AAEf,UAAM,eAAe,oBAAI,IAAyB;AAClD,UAAM,cAAc,oBAAI,IAAoB;AAC5C,UAAM,iBAAiB,oBAAI,IAAiC;AAE5D,eAAW,MAAM,UAAU;AACzB,YAAM,QAAQ,GAAG;AACjB,UAAI,MAAM,WAAW,EAAG;AAExB,iBAAW,QAAQ,OAAO;AAExB,YAAI,WAAW,aAAa,IAAI,IAAI;AACpC,YAAI,CAAC,UAAU;AACb,qBAAW,oBAAI,IAAI;AACnB,uBAAa,IAAI,MAAM,QAAQ;AAAA,QACjC;AACA,iBAAS,IAAI,GAAG,SAAS;AAGzB,oBAAY,IAAI,OAAO,YAAY,IAAI,IAAI,KAAK,KAAK,CAAC;AAGtD,mBAAW,SAAS,OAAO;AACzB,cAAI,UAAU,KAAM;AACpB,cAAI,SAAS,eAAe,IAAI,IAAI;AACpC,cAAI,CAAC,QAAQ;AACX,qBAAS,oBAAI,IAAI;AACjB,2BAAe,IAAI,MAAM,MAAM;AAAA,UACjC;AACA,iBAAO,IAAI,QAAQ,OAAO,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,gBAAgB,WAAW;AACjC,UAAM,WAA0B,CAAC;AAEjC,eAAW,CAAC,UAAU,QAAQ,KAAK,cAAc;AAC/C,UAAI,SAAS,OAAO,EAAG;AAEvB,YAAM,YAAgE,CAAC;AACvE,YAAM,SAAS,eAAe,IAAI,QAAQ;AAC1C,UAAI,QAAQ;AACV,mBAAW,CAAC,QAAQ,KAAK,KAAK,QAAQ;AACpC,oBAAU,KAAK,EAAE,UAAU,QAAQ,eAAe,MAAM,CAAC;AAAA,QAC3D;AACA,kBAAU,KAAK,CAAC,GAAG,MAAM,EAAE,gBAAgB,EAAE,aAAa;AAAA,MAC5D;AAEA,YAAM,eAAe,YAAY,IAAI,QAAQ,KAAK,SAAS;AAE3D,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,cAAc,SAAS;AAAA,QACvB;AAAA,QACA,gBAAgB,UAAU,MAAM,GAAG,CAAC;AAAA;AAAA,QACpC,WAAW,SAAS,QAAQ;AAAA,QAC5B,YAAY,KAAK,kBAAkB,UAAU,SAAS,MAAM,eAAe,UAAU,MAAM;AAAA,MAC7F,CAAC;AAAA,IACH;AAGA,aAAS,KAAK,CAAC,GAAG,MAAM;AACtB,UAAI,EAAE,aAAa,CAAC,EAAE,UAAW,QAAO;AACxC,UAAI,CAAC,EAAE,aAAa,EAAE,UAAW,QAAO;AACxC,aAAO,EAAE,eAAe,EAAE;AAAA,IAC5B,CAAC;AAED,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,uBACN,UACA,YACyB;AACzB,UAAM,WAAoC,CAAC;AAE3C,QAAI,WAAW,SAAS,EAAG,QAAO;AAGlC,UAAM,qBAAqB,SAAS;AAAA,MAAO,OACzC,EAAE,aAAa,UAAU,KAAK,WAAW,SAAS,EAAE,SAAS;AAAA,IAC/D;AACA,QAAI,mBAAmB,UAAU,GAAG;AAClC,YAAM,WAAW,KAAK,cAAc,kBAAkB;AACtD,YAAM,cAAc,SAAS,QAAQ,IAAI,SAAS,UAAU,SAAS,QAAQ;AAC7E,eAAS,KAAK;AAAA,QACZ,aAAa;AAAA,QACb,cAAc;AAAA,QACd,kBAAkB,mBAAmB;AAAA,QACrC;AAAA,QACA,YAAY,CAAC,cAAc,cAAc;AAAA,QACzC,OAAO,KAAK,aAAa,kBAAkB;AAAA,QAC3C,SAAS,cAAc,MACnB,mFACA;AAAA,MACN,CAAC;AAAA,IACH;AAGA,UAAM,YAAY,KAAK,YAAY,UAAU,UAAU;AACvD,eAAW,CAAC,KAAK,WAAW,KAAK,WAAW;AAC1C,UAAI,YAAY,SAAS,EAAG;AAC5B,YAAM,WAAW,KAAK,cAAc,WAAW;AAC/C,YAAM,cAAc,SAAS,QAAQ,IAAI,SAAS,UAAU,SAAS,QAAQ;AAC7E,eAAS,KAAK;AAAA,QACZ,aAAa,oBAAoB,GAAG,WAAW,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA,QAC5E,cAAc;AAAA,QACd,kBAAkB,YAAY;AAAA,QAC9B;AAAA,QACA,YAAY,CAAC,GAAG;AAAA,QAChB,OAAO,KAAK,aAAa,WAAW;AAAA,QACpC,SAAS,cAAc,MACnB,oBAAoB,GAAG,4EACvB,oBAAoB,GAAG;AAAA,MAC7B,CAAC;AAAA,IACH;AAGA,UAAM,mBAAmB,SAAS;AAAA,MAAO,QACtC,EAAE,SAAS,YAAY,EAAE,SAAS,UAAU,KAC5C,EAAE,SAAS,YAAY,EAAE,SAAS,SAAS,KAC3C,EAAE,SAAS,YAAY,EAAE,SAAS,SAAS,MAC5C,WAAW,SAAS,EAAE,SAAS;AAAA,IACjC;AACA,QAAI,iBAAiB,UAAU,GAAG;AAChC,YAAM,WAAW,KAAK,cAAc,gBAAgB;AACpD,eAAS,KAAK;AAAA,QACZ,aAAa;AAAA,QACb,cAAc;AAAA,QACd,kBAAkB,iBAAiB;AAAA,QACnC,aAAa,SAAS,QAAQ,IAAI,SAAS,UAAU,SAAS,QAAQ;AAAA,QACtE,YAAY,CAAC,YAAY,WAAW;AAAA,QACpC,OAAO,KAAK,aAAa,gBAAgB;AAAA,QACzC,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,cACN,QACsB;AACtB,WAAO,OAAO,IAAI,WAAS;AAEzB,UAAI;AACJ,UAAI;AAEJ,UAAI,MAAM,eAAe,GAAG;AAC1B,iBAAS;AACT,qBAAa;AAAA,MACf,WAAW,MAAM,eAAe,OAAO,MAAM,cAAc,GAAG;AAC5D,iBAAS;AACT,qBAAa;AAAA,MACf,WAAW,MAAM,eAAe,KAAK;AACnC,iBAAS;AACT,qBAAa;AAAA,MACf,WAAW,MAAM,eAAe,KAAK;AACnC,iBAAS;AACT,qBAAa,oBAAoB,MAAM,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA,MACtE,OAAO;AACL,iBAAS;AACT,qBAAa,oCAAoC,MAAM,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA,MACtF;AAGA,YAAM,cACJ,MAAM,aAAa,IAAI,sBAAsB,MAAM,eAAe,MAAM,cAAc,MAAM,eAAe,MAAM,WAAW;AAE9H,aAAO;AAAA,QACL,WAAW,MAAM;AAAA,QACjB,aAAa,MAAM;AAAA,QACnB,YAAY,MAAM;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAIQ,wBAAwB,SAOX;AACnB,UAAM,OAAyB,CAAC;AAGhC,eAAW,MAAM,QAAQ,eAAe;AACtC,UAAI,GAAG,mBAAmB,KAAK;AAC7B,aAAK,KAAK;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,aAAa,IAAI,GAAG,QAAQ,sBAAsB,GAAG,kBAAkB,KAAK,QAAQ,CAAC,CAAC,kBAAkB,GAAG,YAAY,IAAI,QAAQ,WAAW,MAAM;AAAA,UACpJ,QAAQ,GAAG;AAAA,UACX,kBAAkB,GAAG;AAAA,QACvB,CAAC;AAAA,MACH,WAAW,GAAG,mBAAmB,KAAK;AACpC,aAAK,KAAK;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,aAAa,IAAI,GAAG,QAAQ,yBAAyB,GAAG,YAAY;AAAA,UACpE,QAAQ,GAAG;AAAA,UACX,kBAAkB,GAAG;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,eAAW,MAAM,QAAQ,cAAc;AACrC,UAAI,GAAG,aAAa,GAAG,eAAe,UAAU,GAAG;AACjD,aAAK,KAAK;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,aAAa,uBAAuB,GAAG,QAAQ,iBAAiB,GAAG,YAAY,kBAAkB,GAAG,eAAe,MAAM;AAAA,UACzH,QAAQ,yBAAyB,GAAG,QAAQ,gEAAgE,GAAG,eAAe,MAAM,GAAG,CAAC,EAAE,IAAI,OAAK,IAAI,EAAE,QAAQ,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,UAChL,kBAAkB,GAAG;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,eAAW,MAAM,QAAQ,iBAAiB;AACxC,UAAI,GAAG,cAAc,OAAO,GAAG,oBAAoB,GAAG;AACpD,aAAK,KAAK;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,aAAa,GAAG;AAAA,UAChB,QAAQ,GAAG;AAAA,UACX,kBAAkB,GAAG;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,eAAW,MAAM,QAAQ,oBAAoB;AAC3C,UAAI,GAAG,WAAW,mBAAmB;AACnC,aAAK,KAAK;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,aAAa,UAAU,GAAG,SAAS,0BAA0B,GAAG,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA,UAC7F,QAAQ,GAAG;AAAA,UACX,kBAAkB,GAAG;AAAA,QACvB,CAAC;AAAA,MACH,WAAW,GAAG,WAAW,sBAAsB,GAAG,cAAc,GAAG;AACjE,aAAK,KAAK;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,aAAa,UAAU,GAAG,SAAS,2BAA2B,GAAG,cAAc,KAAK,QAAQ,CAAC,CAAC,kBAAkB,GAAG,UAAU;AAAA,UAC7H,QAAQ,GAAG;AAAA,UACX,kBAAkB,GAAG;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF;AAGA,QAAI,QAAQ,WAAW,UAAU,GAAG;AAClC,YAAM,YAAY,CAAC,GAAG,QAAQ,QAAQ,EACnC,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC,EACrD,MAAM,GAAG,KAAK,IAAI,GAAG,QAAQ,SAAS,MAAM,CAAC;AAChD,YAAM,kBAAkB,UAAU,OAAO,OAAK,EAAE,YAAY,SAAS,EAAE;AACvE,YAAM,aAAa,UAAU,SAAS,IAAI,kBAAkB,UAAU,SAAS;AAE/E,UAAI,aAAa,OAAO,UAAU,UAAU,GAAG;AAC7C,aAAK,KAAK;AAAA,UACR,UAAU;AAAA,UACV,UAAU;AAAA,UACV,aAAa;AAAA,UACb,QAAQ;AAAA,UACR,kBAAkB,UAAU;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,gBAAgB,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,EAAE;AACnD,SAAK,KAAK,CAAC,GAAG,MAAM,cAAc,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ,CAAC;AAEzE,WAAO;AAAA,EACT;AAAA;AAAA,EAIQ,cAAc,MAA6B;AACjD,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,WAAW,EAAG,QAAO;AAC7H,QAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,YAAY,KAAK,MAAM,SAAS,WAAW,EAAG,QAAO;AAClG,QAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,KAAK,EAAG,QAAO;AACtH,QAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,QAAQ,EAAG,QAAO;AACrH,QAAI,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,WAAW,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,WAAW,EAAG,QAAO;AACzJ,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,UAA0B;AAChD,UAAM,cAAsC;AAAA,MAC1C,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AACA,WAAO,YAAY,QAAQ,KAAK,UAAU,QAAQ;AAAA,EACpD;AAAA,EAEQ,kBAAkB,UAAkB,cAAsB,eAAuB,eAA+B;AACtH,UAAM,WAAW,gBAAgB,KAAK,eAAe,gBAAgB,KAAK,QAAQ,CAAC,IAAI;AACvF,QAAI,iBAAiB,GAAG;AACtB,aAAO,2BAA2B,aAAa,wBAAwB,QAAQ,gBAAgB,QAAQ;AAAA,IACzG;AACA,QAAI,SAAS,QAAQ,IAAI,IAAI;AAC3B,aAAO,IAAI,QAAQ,oBAAoB,QAAQ;AAAA,IACjD;AACA,WAAO,IAAI,QAAQ,mCAAmC,YAAY;AAAA,EACpE;AAAA,EAEQ,cAAc,UAA0F;AAC9G,WAAO;AAAA,MACL,OAAO,SAAS;AAAA,MAChB,SAAS,SAAS,OAAO,OAAK,EAAE,YAAY,SAAS,EAAE;AAAA,MACvD,SAAS,SAAS,OAAO,OAAK,EAAE,YAAY,SAAS,EAAE;AAAA,MACvD,QAAQ,SAAS,OAAO,OAAK,EAAE,YAAY,QAAQ,EAAE;AAAA,IACvD;AAAA,EACF;AAAA,EAEQ,YAAY,UAAqB,YAA8C;AACrF,UAAM,SAAS,oBAAI,IAAuB;AAC1C,eAAW,MAAM,UAAU;AACzB,UAAI,CAAC,WAAW,SAAS,GAAG,SAAS,EAAG;AACxC,iBAAW,OAAO,GAAG,MAAM;AACzB,YAAI,QAAQ,OAAO,IAAI,GAAG;AAC1B,YAAI,CAAC,OAAO;AACV,kBAAQ,CAAC;AACT,iBAAO,IAAI,KAAK,KAAK;AAAA,QACvB;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,UAA2D;AAC9E,QAAI,SAAS,SAAS,EAAG,QAAO;AAEhC,UAAM,SAAS,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,cAAc,EAAE,SAAS,CAAC;AAClF,UAAM,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC;AACxC,UAAM,YAAY,OAAO,MAAM,GAAG,GAAG;AACrC,UAAM,aAAa,OAAO,MAAM,GAAG;AAEnC,UAAM,eAAe,UAAU,OAAO,OAAK,EAAE,YAAY,SAAS,EAAE,SAAS,UAAU;AACvF,UAAM,gBAAgB,WAAW,OAAO,OAAK,EAAE,YAAY,SAAS,EAAE,SAAS,WAAW;AAE1F,QAAI,gBAAgB,eAAe,IAAK,QAAO;AAC/C,QAAI,gBAAgB,eAAe,IAAK,QAAO;AAC/C,WAAO;AAAA,EACT;AACF;;;ACjjBO,IAAM,gBAAN,MAAoB;AAAA,EACjB,cAA+E,CAAC;AAAA,EAChF,kBAAkE,CAAC;AAAA,EACnE,cAAgF,CAAC;AAAA,EACjF,cAAyE,CAAC;AAAA,EAC1E,eAA0C,CAAC;AAAA;AAAA,EAInD,eAAe,MAAsE;AACnF,SAAK,YAAY,KAAK,IAAI;AAAA,EAC5B;AAAA,EAEA,kBAAkB,SAAiB,WAA0B;AAC3D,SAAK,gBAAgB,KAAK,EAAE,SAAS,UAAU,CAAC;AAAA,EAClD;AAAA,EAEA,eAAe,OAAe,cAA4B;AACxD,SAAK,YAAY,KAAK,EAAE,OAAO,cAAc,SAAS,eAAe,KAAK,gBAAgB,GAAG,CAAC;AAAA,EAChG;AAAA,EAEA,eAAe,QAAgB,MAAc,SAAwB;AACnE,SAAK,YAAY,KAAK,EAAE,QAAQ,MAAM,QAAQ,CAAC;AAAA,EACjD;AAAA,EAEA,gBAAgB,OAAsB;AACpC,SAAK,aAAa,KAAK,EAAE,MAAM,CAAC;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,qBAA6B;AAC3B,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,UAAU,EAAG,QAAO;AACxB,UAAM,YAAY,KAAK,YAAY,OAAO,OAAK,EAAE,OAAO,EAAE;AAC1D,WAAO,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAA+B;AAC7B,UAAM,QAAQ,KAAK,gBAAgB;AACnC,QAAI,UAAU,EAAG,QAAO;AACxB,UAAM,YAAY,KAAK,gBAAgB,OAAO,OAAK,EAAE,SAAS,EAAE;AAChE,WAAO,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,0BAAkC;AAChC,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,UAAU,EAAG,QAAO;AACxB,UAAM,UAAU,KAAK,YAAY,OAAO,OAAK,EAAE,OAAO,EAAE;AACxD,WAAO,UAAU;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAA4B;AAC1B,UAAM,QAAQ,KAAK,YAAY;AAC/B,QAAI,UAAU,EAAG,QAAO;AACxB,UAAM,YAAY,KAAK,YAAY,OAAO,OAAK,EAAE,OAAO,EAAE;AAC1D,WAAO,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAA4B;AAC1B,UAAM,QAAQ,KAAK,aAAa;AAChC,QAAI,UAAU,EAAG,QAAO;AACxB,UAAM,QAAQ,KAAK,aAAa,OAAO,OAAK,EAAE,KAAK,EAAE;AACrD,WAAO,QAAQ;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,eAA8B;AAC5B,UAAM,mBAAmB,KAAK,mBAAmB;AACjD,UAAM,qBAAqB,KAAK,qBAAqB;AACrD,UAAM,wBAAwB,KAAK,wBAAwB;AAC3D,UAAM,kBAAkB,KAAK,kBAAkB;AAC/C,UAAM,kBAAkB,KAAK,kBAAkB;AAE/C,UAAM,aAAgD;AAAA,MACpD,aAAa;AAAA,QACX,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA;AAAA,QACR,QAAQ,IAAI,mBAAmB,KAAK,QAAQ,CAAC,CAAC;AAAA,MAChD;AAAA,MACA,eAAe;AAAA,QACb,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ,IAAI,qBAAqB,KAAK,QAAQ,CAAC,CAAC;AAAA,MAClD;AAAA,MACA,kBAAkB;AAAA,QAChB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ,IAAI,wBAAwB,KAAK,QAAQ,CAAC,CAAC;AAAA,MACrD;AAAA,MACA,YAAY;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,CAAC,CAAC;AAAA,MAC/C;AAAA,MACA,YAAY;AAAA,QACV,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ,IAAI,kBAAkB,KAAK,QAAQ,CAAC,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,OAAO,UAAU,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC;AACpF,UAAM,gBAAgB,mBAAmB;AACzC,UAAM,eAAe,UAAU;AAE/B,WAAO;AAAA,MACL,SAAS,KAAK,MAAM,UAAU,GAAG;AAAA,MACjC;AAAA,MACA,YAAY,KAAK,YAAY;AAAA,MAC7B,aAAa,KAAK,gBAAgB;AAAA,MAClC,iBAAiB,KAAK,gBAAgB,OAAO,OAAK,EAAE,SAAS,EAAE;AAAA,MAC/D,kBAAkB,KAAK,YAAY;AAAA,MACnC,uBAAuB,KAAK,YAAY,OAAO,OAAK,EAAE,OAAO,EAAE;AAAA,MAC/D,eAAe,KAAK,MAAM,aAAa;AAAA,MACvC,cAAc,KAAK,MAAM,YAAY;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,cAAc,MAAc;AACvC,UAAM,QAAQ,KAAK,aAAa;AAEhC,QAAI,MAAM;AAAA;AAAA;AACV,WAAO,gBAAgB,MAAM,OAAO;AAAA;AACpC,WAAO,wBAAwB,MAAM,aAAa;AAAA;AAClD,WAAO,sBAAsB,MAAM,YAAY;AAAA;AAAA;AAE/C,WAAO;AAAA;AACP,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,MAAM,UAAU,GAAG;AAC1D,YAAM,MAAM,SAAI,OAAO,KAAK,MAAM,IAAI,QAAQ,EAAE,CAAC;AACjD,YAAM,OAAO,IAAI,SAAS,IAAI,SAAS,WAAM,IAAI,SAAS,IAAI,SAAS,MAAM,iBAAO;AACpF,aAAO,GAAG,IAAI,MAAM,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC,KACtD,IAAI,OAAO,IAAI,QAAG,CAAC,cACT,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC,eAAe,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC;AAAA;AACtF,aAAO,KAAK,IAAI,MAAM;AAAA;AAAA,IACxB;AAEA,WAAO;AAAA;AAAA;AACP,WAAO,gBAAgB,MAAM,UAAU,kBAAkB,MAAM,WAAW,KAAK,MAAM,eAAe;AAAA;AACpG,WAAO,sBAAsB,MAAM,gBAAgB,KAAK,MAAM,qBAAqB;AAAA;AAEnF,QAAI,eAAe,MAAM,UAAU,IAAI;AACrC,aAAO;AAAA;AAAA;AACP,UAAI,MAAM,WAAW,YAAY,QAAQ,KAAK;AAC5C,eAAO;AAAA;AAAA,MACT;AACA,UAAI,MAAM,WAAW,cAAc,QAAQ,KAAK;AAC9C,eAAO;AAAA;AAAA,MACT;AACA,UAAI,MAAM,WAAW,iBAAiB,QAAQ,KAAK;AACjD,eAAO;AAAA;AAAA,MACT;AACA,UAAI,MAAM,WAAW,WAAW,QAAQ,KAAK;AAC3C,eAAO;AAAA;AAAA,MACT;AACA,UAAI,MAAM,WAAW,WAAW,QAAQ,KAAK;AAC3C,eAAO;AAAA;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ApC/KA,SAAS,eAAe,QAAgB,SAA0B;AAChE,QAAM,IAAI,OAAO,MAAM,GAAG,EAAE,IAAI,MAAM;AACtC,QAAM,IAAI,QAAQ,MAAM,GAAG,EAAE,IAAI,MAAM;AACvC,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK;AACrD,SAAK,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,KAAK,GAAI,QAAO;AACtC,SAAK,EAAE,CAAC,KAAK,MAAM,EAAE,CAAC,KAAK,GAAI,QAAO;AAAA,EACxC;AACA,SAAO;AACT;AAMA,eAAe,iBAAiB,gBAAuC;AACrE,MAAI,MAAoC;AACxC,MAAI;AACF,UAAM,MAAM,MAAM;AAAA,MAChB;AAAA,MACA,EAAE,QAAQ,YAAY,QAAQ,GAAI,EAAE;AAAA,IACtC;AACA,QAAI,CAAC,IAAI,GAAI;AACb,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,eAAe,QAAQ,cAAc,EAAG;AAG7C,UAAM,UAAU,cAAc,YAAY,GAAG;AAC7C,UAAM,UAAUI,SAAQ,OAAO;AAC/B,UAAM,YAAYA,SAAQ,OAAO;AAGjC,UAAM,SAAS,YAAYC,MAAK,OAAO,GAAG,0BAA0B,CAAC;AACrE,QAAI;AACF,MAAAC,cAAa,OAAO,CAAC,QAAQ,gCAAgC,GAAG;AAAA,QAC9D,KAAK;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AAGD,YAAM,UAAUC,aAAY,MAAM,EAAE,KAAK,OAAK,EAAE,SAAS,MAAM,CAAC;AAChE,UAAI,CAAC,QAAS;AAGd,MAAAD,cAAa,OAAO,CAAC,QAAQ,OAAO,GAAG;AAAA,QACrC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,SAAS;AAAA,MACX,CAAC;AAGD,YAAM,aAAaD,MAAK,QAAQ,SAAS;AACzC,UAAIG,YAAW,UAAU,GAAG;AAC1B,eAAO,YAAY,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAChE;AAGA,cAAQ,OAAO;AAAA,QACb;AAAA,uCAAqC,cAAc,YAAO,MAAM;AAAA;AAAA,MAClE;AAAA,IACF,UAAE;AACA,aAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACjD;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEA,IAAM,eAAuB,OAAO,OAAO,aAAa;AAEtD,QAAM,cAAc,MAAM,YAAY,QAAQ,IAAI;AAClD,QAAM,WAAW,gBAAgB,MAAM,QAAQ,IAAI,IAAI;AAGvD,QAAM,eAAe,IAAI,aAAa,QAAQ;AAC9C,QAAM,SAAS,aAAa,KAAK;AACjC,eAAa,WAAW;AAGxB,QAAM,YAAYH,MAAK,UAAU,aAAa,QAAQ;AACtD,QAAM,mBAAmBA,MAAK,WAAW,YAAY;AACrD,MAAI,CAACG,YAAW,gBAAgB,GAAG;AACjC,QAAI;AACF,MAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,MAAAC,eAAc,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAuEnC,OAAO;AAAA,IACN,QAAQ;AAAA,IAA0C;AAAA,EACpD;AAEA,QAAM,eAAe,IAAI,aAAa;AACtC,QAAM,WAAW,IAAI,SAAS;AAC9B,QAAM,WAAW,IAAI,SAAS;AAC9B,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,UAAU,IAAI,QAAQ;AAC5B,QAAM,YAAY,IAAI,kBAAkB;AACxC,QAAM,aAAa,IAAI,kBAAkB;AAEzC,MAAI;AACF,UAAM,YAAYL,MAAK,UAAU,KAAK;AACtC,QAAIG,YAAW,SAAS,GAAG;AACzB,YAAM,YAAoC,CAAC;AAC3C,YAAM,UAAU,CAAC,QAAgB;AAC/B,YAAI;AACF,qBAAW,SAASD,aAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC7D,kBAAM,OAAOF,MAAK,KAAK,MAAM,IAAI;AACjC,gBAAI,MAAM,YAAY,KAAK,CAAC,CAAC,gBAAgB,QAAQ,QAAQ,UAAU,EAAE,SAAS,MAAM,IAAI;AAC1F,sBAAQ,IAAI;AAAA,qBACL,MAAM,OAAO,KAAK,yBAAyB,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,SAAS,EAAE,SAAS;AACtG,kBAAI;AAAE,0BAAU,IAAI,IAAIM,cAAa,MAAM,OAAO;AAAA,cAAE,QAAQ;AAAA,cAAC;AAAA,UACjE;AAAA,QACF,QAAQ;AAAA,QAAC;AAAA,MACX;AACA,cAAQ,SAAS;AACjB,iBAAW,UAAU,WAAW,QAAQ;AAAA,IAC1C;AAAA,EACF,QAAQ;AAAA,EAAkB;AAC1B,QAAM,oBAAoB,IAAI,kBAAkB;AAChD,QAAM,MAAM,IAAI,eAAe,QAAQ;AACvC,QAAM,aAAa,IAAI,eAAe;AACtC,QAAM,aAAa,IAAI,WAAW;AAClC,QAAM,cAAc,IAAI,iBAAiB,UAAU;AACnD,QAAM,eAAe,IAAI,aAAa;AACtC,aAAW,YAAY,aAAa,oBAAoB,GAAG;AACzD,iBAAa,eAAe,QAAQ;AAAA,EACtC;AACA,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,cAAc,IAAI,iBAAiB;AACzC,QAAM,qBAAqB,IAAI,mBAAmB,QAAQ;AAC1D,QAAM,eAAe,IAAI,iBAAiB;AAC1C,QAAM,YAAY,IAAI,UAAU;AAChC,QAAM,eAAe,IAAI,aAAa;AACtC,QAAM,cAAc,IAAI,YAAY,QAAQ;AAC5C,QAAM,eAAe,IAAI,aAAa;AACtC,QAAM,gBAAgB,IAAI,oBAAoB;AAC9C,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,sBAAsB,IAAI,oBAAoB;AACpD,QAAM,mBAAmB,IAAI,iBAAiB;AAC9C,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAM,gBAAgB,IAAI,cAAc;AACxC,QAAMC,aAAY,IAAI,UAAU;AAChC,EAAAA,WAAU,kBAAkB,MAAM,MAAM;AACtC,EAAAA,WAAU,iBAAiB,aAAa;AACxC,EAAAA,WAAU,gBAAgB,YAAY;AACxC,eAAa,aAAaA,UAAS;AACnC,gBAAc,OAAOA,UAAS;AAC9B,WAAS,OAAOA,UAAS;AAEzB,QAAM,eAAe,IAAI,aAAa;AACtC,eAAa,kBAAkB,MAAM,MAAM;AAC3C,eAAa,iBAAiB,aAAa;AAG1C,GAAC,YAAY;AACZ,QAAI;AACF,YAAM,SAAS,MAAM;AACrB,YAAM,YAAsB,CAAC;AAG7B,UAAI,QAAQ,QAAQ,WAAW;AAC7B,cAAM,WAAW,MAAM,OAAO,OAAO,UAAU;AAC/C,cAAM,YAAY,WAAW,GAAG,GAAG,aAAa,CAAC;AACjD,cAAM,aAAa,WAAW,GAAG,GAAG,WAAW,CAAC;AAChD,cAAM,mBAAmB,WAAW,OAAO,KAAK,UAAU,EAAE,CAAC,KAAK,EAAE,GAAG,MAAM,GAAG,GAAG,IAAI,KAAK;AAC5F,YAAI,iBAAkB,WAAU,KAAK,gBAAgB;AACrD,mBAAW,KAAK,WAAW;AACzB,cAAI,EAAE,QAAQ;AACZ,uBAAW,YAAY,OAAO,KAAK,EAAE,MAAM,GAAG;AAC5C,oBAAM,OAAO,SAAS,SAAS,GAAG,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI,IAAK;AACnE,kBAAI,QAAQ,CAAC,UAAU,SAAS,IAAI,EAAG,WAAU,KAAK,IAAI;AAAA,YAC5D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,UAAU,WAAW,KAAK,OAAO,QAAQ,WAAW,YAAY;AAClE,cAAM,SAAS,MAAM,OAAO,OAAO;AACnC,mBAAW,KAAK,QAAQ;AACtB,cAAI,EAAE,MAAM,CAAC,UAAU,SAAS,EAAE,EAAE,EAAG,WAAU,KAAK,EAAE,EAAE;AAAA,QAC5D;AAAA,MACF;AAGA,YAAM,WAAW,QAAQ,IAAI,gBAAgB,QAAQ,IAAI,aAAa;AACtE,UAAI,YAAY,CAAC,UAAU,SAAS,QAAQ,EAAG,WAAU,KAAK,QAAQ;AAGtE,YAAM,YAAY,QAAQ,IAAI,cAAc,UAAU,CAAC,KAAK;AAC5D,YAAM,eAAe,QAAQ,IAAI,iBAAiB,UAAU,CAAC,KAAK;AAElE,iBAAW,KAAK,UAAW,eAAc,SAAS,CAAC;AACnD,UAAI,UAAW,eAAc,cAAc,QAAQ,CAAC,SAAS,CAAC;AAC9D,UAAI,gBAAgB,iBAAiB,UAAW,eAAc,SAAS,YAAY;AACnF,UAAI,aAAc,eAAc,cAAc,WAAW,CAAC,YAAY,CAAC;AAAA,IACzE,QAAQ;AAEN,YAAM,WAAW,QAAQ,IAAI,gBAAgB,QAAQ,IAAI,aAAa;AACtE,YAAM,YAAY,QAAQ,IAAI,cAAc;AAC5C,YAAM,eAAe,QAAQ,IAAI,iBAAiB;AAClD,UAAI,WAAW;AAAE,sBAAc,SAAS,SAAS;AAAG,sBAAc,cAAc,QAAQ,CAAC,SAAS,CAAC;AAAA,MAAE;AACrG,UAAI,gBAAgB,iBAAiB,UAAW,eAAc,SAAS,YAAY;AACnF,UAAI,aAAc,eAAc,cAAc,WAAW,CAAC,YAAY,CAAC;AAAA,IACzE;AAAA,EACF,GAAG;AACH,EAAAA,WAAU,gBAAgB;AAAA,IACxB,gBAAgB,CAAC,UAAkB,cAAc,OAAO,KAAK;AAAA,IAC7D,YAAY,CAAC,UAAkB,WAAW,KAAK,KAAK,EAAE,IAAI,QAAM,EAAE,MAAM,EAAE,WAAW,KAAK,MAAM,aAAa,EAAE,YAAY,EAAE;AAAA,EAC/H,CAAC;AACD,QAAM,YAAY,IAAI,UAAUA,YAAW,EAAE,eAAe,IAAI,WAAW,MAAM,YAAY,GAAG,iBAAiB,MAAM,CAAC;AACxH,QAAM,cAAc,IAAI,iBAAiB,QAAQ;AACjD,QAAM,cAAc,IAAI,YAAY;AACpC,cAAY,OAAOA,UAAS;AAE5B,cAAY,iBAAiB,OAAO,OAAO,OAAO,eAAe,OAAO,OAAO,OAAO,YAAY;AAElG,cAAY,sBAAsB,OAAO,OAAO,kBAAkB;AAIlE,QAAM,cAAc,OAAO;AAC3B,MAAI,eAAe,YAAY,OAAO;AACpC,gBAAY,mBAAmB,YAAY,OAAO,YAAY,UAAU,YAAY,MAAM;AAC1F,gBAAY,OAAOA,UAAS;AAAA,EAC9B;AAGA,oBAAkB,OAAOA,UAAS;AAClC,WAAS,eAAe,QAAQ;AAGhC,QAAM,cAAc,YAAY,QAAuE,QAAQ;AAC/G,aAAW,KAAK,aAAa;AAC3B,kBAAc,SAAS,EAAE,IAAI;AAAA,EAC/B;AAGA,QAAM,gBAAgB,YAAY,QAAkJ,UAAU;AAC9L,aAAW,MAAM,eAAe;AAC9B,kBAAc,OAAO,GAAG,KAAK,WAAW,GAAG,KAAK,UAAU,GAAG,KAAK,SAA6C,GAAG,KAAK,WAAW,GAAG,KAAK,YAAY;AAAA,EACxJ;AAEA,gBAAc,uBAAuB,CAAC,YAAY;AAChD,gBAAY,KAAK,YAAY,QAAQ,WAAW,OAAO;AAAA,EACzD,CAAC;AACD,QAAM,cAAc,YAAY,QAA4D,QAAQ;AACpG,aAAW,MAAM,aAAa;AAC5B,eAAW,mBAAmB,KAAK,UAAU,qBAAqB,GAAG,MAAM,OAAO,CAAC,CAAC;AAAA,EACtF;AAGA,QAAM,eAAe,YAAY,QAAyD,SAAS;AACnG,MAAI,aAAa,SAAS,GAAG;AAE3B,UAAM,SAAS,aAAa,OAAO,CAAC,GAAG,MAAM;AAC3C,YAAM,QAAQ,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAC5C,YAAM,QAAQ,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAC5C,aAAO,QAAQ,QAAQ,IAAI;AAAA,IAC7B,CAAC;AACD,UAAM,aAAa,OAAO;AAC1B,eAAW,SAAS,YAAY;AAC9B,YAAM,QAAQ,aAAa,eAAe,MAAM,IAAI;AACpD,UAAI,OAAO;AAET;AAAA,MACF;AAEA,iBAAW,QAAQ,MAAM,SAAS;AAChC,YAAI,gBAAgB,aAAa,UAAU,MAAM,IAAI;AACrD,YAAI,iBAAiB,KAAK,WAAW,eAAe;AAClD,uBAAa,aAAa,MAAM,MAAiE,KAAK,QAAQ,KAAK,QAAQ,KAAK,WAAW;AAAA,QAC7I;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AAAE,UAAM,YAAY,KAAK;AAAA,EAAE,QAAQ;AAAA,EAA2C;AAGlF,mBAAiB,OAAW;AAI5B,eAAa,SAAS,CAAC,cAAc;AAEnC,gBAAY,iBAAiB,UAAU,OAAO,OAAO,eAAe,UAAU,OAAO,OAAO,YAAY;AACxG,gBAAY,sBAAsB,UAAU,OAAO,kBAAkB;AAGrE,UAAM,WAAW,UAAU;AAC3B,QAAI,YAAY,SAAS,OAAO;AAC9B,kBAAY,mBAAmB,SAAS,OAAO,SAAS,UAAU,SAAS,MAAM;AAAA,IACnF;AAGA,UAAM,WAAW,UAAU,MAAM;AACjC,QAAI,WAAW,GAAG;AAChB,kBAAY,YAAY,QAAQ;AAAA,IAClC;AAGA,UAAM,aAAa,UAAU,OAAO;AACpC,QAAI,aAAa,GAAG;AAClB,mBAAa,mBAAmB,UAAU;AAAA,IAC5C;AAGA,UAAM,gBAAgB,UAAU,QAAQ;AACxC,QAAI,gBAAgB,GAAG;AACrB,kBAAY,iBAAiB,aAAa;AAAA,IAC5C;AAAA,EACF,CAAC;AAGD,iBAAe,gBAAiC;AAC9C,UAAM,YAAY,MAAM;AAExB,UAAM,YAAY,WAAW,OAAO;AACpC,UAAM,cAAc,cAAc,UAAU,EAAE;AAC9C,UAAM,iBAAiB,IAAI,IAAI,YAAY,IAAI,OAAK,EAAE,SAAS,CAAC;AAEhE,QAAI,WAAwB,CAAC;AAC7B,eAAW,OAAO,gBAAgB;AAChC,iBAAW,SAAS,OAAO,YAAY,SAAS,GAAG,CAAC;AAAA,IACtD;AAEA,UAAM,gBAA6E,CAAC;AACpF,eAAW,OAAO,gBAAgB;AAChC,YAAM,UAAU,aAAa,YAAY,GAAG;AAC5C,YAAM,WAAW,QAAQ,MAAM,OAAO,YAAY,CAAC;AACnD,iBAAW,QAAQ,UAAU;AAC3B,cAAM,QAAQ,SAAS,aAAa,KAAK,KAAK,EAAE;AAChD,YAAI,OAAO,QAAQ;AACjB,wBAAc,KAAK;AAAA,YACjB,QAAQ,KAAK;AAAA,YACb,SAAS,MAAM,OAAO;AAAA,YACtB,QAAQ,MAAM,OAAO;AAAA,UACvB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAsE,CAAC;AAC3E,UAAM,YAAY,GAAG,QAAQ;AAC7B,QAAI;AACF,YAAM,UAAUD,cAAa,WAAW,OAAO;AAC/C,iBAAW,QAAQ,QAAQ,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO,GAAG;AAC7D,cAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,eAAO,KAAK;AAAA,UACV,UAAU,OAAO,YAAY;AAAA,UAC7B,SAAS,OAAO,WAAW;AAAA,UAC3B,MAAM,OAAO,QAAQ;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAAsB;AAE9B,gBAAY,WAAW,SAAS;AAChC,gBAAY,aAAa,WAAW;AACpC,gBAAY,UAAU,QAAQ;AAC9B,gBAAY,eAAe,aAAa;AACxC,gBAAY,WAAW,MAAM;AAE7B,UAAM,SAAS,YAAY,OAAO;AAGlC,UAAM,eAAyB,CAAC;AAChC,eAAW,QAAQ,OAAO,iBAAiB;AACzC,UAAI;AACF,oBAAY,mBAAmB;AAAA,UAC7B,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,OAAO,KAAK;AAAA,UACZ,QAAQ,WAAW,KAAK,IAAI,KAAK,KAAK,MAAM;AAAA;AAAA,WAAgB,KAAK,cAAc;AAAA,QACjF,CAAC;AACD,qBAAa,KAAK,KAAK,IAAI;AAAA,MAC7B,QAAQ;AAAA,MAAE;AAAA,IACZ;AAGA,UAAM,gBAA0B,CAAC;AACjC,eAAW,SAAS,OAAO,cAAc;AACvC,YAAM,SAAS,WAAW,QAAQ,MAAM,OAAO;AAC/C,UAAI,CAAC,OAAQ;AACb,YAAM,MAAM,OAAO;AACnB,UAAI,WAAW;AAEf,iBAAW,UAAU,MAAM,kBAAkB;AAC3C,YAAI,OAAO,SAAS,gBAAgB;AAClC,qBAAW,QAAQ,IAAI,SAAS,OAAO;AACrC,gBAAI,CAAC,KAAK,UAAU;AAClB,mBAAK,WAAW,OAAO;AACvB,yBAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF;AACA,YAAI,OAAO,SAAS,YAAY;AAC9B,gBAAM,UAAwD;AAAA,YAC5D,OAAO,IAAI,SAAS,MAAM,SAAS;AAAA,YACnC,QAAQ;AAAA,YACR,aAAa,OAAO;AAAA,YACpB,gBAAgB;AAAA,UAClB;AACA,cAAI,SAAS,MAAM,KAAK,OAAO;AAC/B,qBAAW;AAAA,QACb;AAAA,MACF;AAEA,UAAI,UAAU;AACZ,YAAI,QAAQ,aAAa,OAAO;AAChC,YAAI,QAAQ,cAAc,OAAO;AACjC,YAAI,MAAM,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAChD,YAAI,MAAM,aAAa;AACvB,YAAI,KAAK;AACT,oBAAY,KAAK,UAAU,IAAI,KAAK,IAAI,GAAG;AAC3C,sBAAc,KAAK,MAAM,SAAS;AAAA,MACpC;AAAA,IACF;AAGA,UAAM,iBAA2B,CAAC;AAClC,eAAW,SAAS,OAAO,eAAe;AACxC,UAAI;AACF,cAAM,iBAAiB,aAAa,UAAU,MAAM,IAAI;AACxD,YAAI,kBAAkB,CAAC,eAAe,SAAS,MAAM,YAAY,MAAM,GAAG,EAAE,CAAC,GAAG;AAC9E,gBAAM,YAAY,iBAAiB;AAAA;AAAA,oCAAyC,MAAM,aAAa;AAAA,EAAa,MAAM,WAAW;AAC7H,uBAAa,aAAa,MAAM,MAAiE,WAAW,eAAe,cAAc,MAAM,aAAa,YAAY,MAAM,WAAW,IAAI;AAC7L,sBAAY,KAAK,WAAW,SAAS,aAAa,mBAAmB,CAAC;AACtE,yBAAe,KAAK,GAAG,MAAM,IAAI,MAAM,MAAM,YAAY,MAAM,GAAG,EAAE,CAAC,MAAM;AAAA,QAC7E;AAAA,MACF,QAAQ;AAAA,MAAkB;AAAA,IAC5B;AAEA,QAAI,SAAS;AAAA;AACb,cAAU,cAAc,OAAO,gBAAgB;AAAA;AAC/C,cAAU,iBAAiB,OAAO,QAAQ,aAAa,iBAAiB,OAAO,QAAQ,UAAU,yBAAyB,OAAO,QAAQ,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA;AACtK,QAAI,aAAa,SAAS,EAAG,WAAU,yBAAyB,aAAa,KAAK,IAAI,CAAC;AAAA;AACvF,QAAI,cAAc,SAAS,EAAG,WAAU,uBAAuB,cAAc,KAAK,IAAI,CAAC;AAAA;AACvF,QAAI,eAAe,SAAS,EAAG,WAAU,wBAAwB,eAAe,MAAM;AAAA;AACtF,QAAI,aAAa,WAAW,KAAK,cAAc,WAAW,KAAK,eAAe,WAAW,GAAG;AAC1F,gBAAU;AAAA;AAAA,IACZ;AACA,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,WAAS,OAAO,SAAmD;AACjE,WAAO,QAAQ;AAAA,EACjB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,MACJ,cAAc,KAAK;AAAA,QACjB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,MAAM,KAAK,OAAO,OAAO,EAAE,SAAS,8BAA8B;AAAA,UAClE,aAAa,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,UACtG,eAAe,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,UACxG,eAAe,KAAK,OAAO,QAAQ,EAAE,SAAS,EAAE,SAAS,0GAA0G;AAAA,UACnK,cAAc,KAAK,OAAO,QAAQ,EAAE,SAAS,EAAE,SAAS,oGAAoG;AAAA,UAC5J,UAAU,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO;AAAA,YAC7C,IAAI,KAAK,OAAO,OAAO,EAAE,SAAS,oCAAoC;AAAA,YACtE,aAAa,KAAK,OAAO,OAAO,EAAE,SAAS,qCAAqC;AAAA,YAChF,WAAW,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,YACrH,sBAAsB,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,UAC1H,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,qGAAqG;AAAA,QAC/H;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAAC,WAAU,aAAa,QAAQ,SAAS;AACxC,cAAI,WAAW,KAAK,YAAY,CAAC;AAEjC,cAAI,SAAS,WAAW,KAAK,KAAK,kBAAkB,OAAO;AACzD,gBAAI,KAAK,iBAAiB,OAAO;AAC/B,oBAAM,UAAU,KAAK,QAAQ;AAC7B,oBAAM,kBAAkB,UAAU,WAAW;AAC7C,kBAAI;AACF,sBAAM,YAAY,MAAM,QAAQ,iBAAiBA,YAAW,KAAK,MAAM,eAAe;AACtF,2BAAW,UAAU;AAAA,cACvB,QAAQ;AAAA,cAER;AAAA,YACF;AAEA,gBAAI,SAAS,WAAW,GAAG;AACzB,oBAAM,gBAAgB,QAAQ,UAAU,KAAK,MAAM,KAAK,iBAAiB,CAAC,CAAC;AAC3E,kBAAI,cAAc,eAAe;AAC/B,2BAAW,cAAc,OAAO;AAAA,cAClC;AAAA,YACF;AAAA,UACF;AAEA,gBAAM,SAAqB;AAAA,YACzB,MAAM,KAAK;AAAA,YACX,aAAa,KAAK,eAAe,CAAC;AAAA,YAClC,SAAS;AAAA,cACP,eAAe,KAAK,iBAAiB,CAAC;AAAA,cACtC,cAAc,CAAC;AAAA,YACjB;AAAA,YACA,UAAU,SAAS,IAAI,QAAM;AAAA,cAC3B,IAAI,EAAE;AAAA,cACN,aAAa,EAAE;AAAA,cACf,WAAW,EAAE,aAAa,CAAC;AAAA,cAC3B,sBAAsB,EAAE,wBAAwB,CAAC;AAAA,YACnD,EAAE;AAAA,UACJ;AAEA,gBAAM,OAAO,aAAa,WAAW,MAAM;AAC3C,gBAAM,SAAS,aAAa,aAAa,IAAI;AAE7C,mBAAS,cAAc,QAAQ,WAAW,IAAI;AAC9C,uBAAa,YAAY,QAAQ,SAAS,EAAE,OAAO;AAGnD,qBAAW,QAAQ,UAAU;AAC3B,uBAAW,OAAQ,KAAK,aAAa,CAAC,GAAI;AACxC,yBAAW,cAAc,KAAK,IAAI,KAAK,SAAS;AAAA,YAClD;AAAA,UACF;AAGA,cAAI,KAAK,iBAAiB,KAAK,cAAc,SAAS,GAAG;AACvD,uBAAW,QAAQ,KAAK,eAAe;AACrC,yBAAW,cAAc,QAAQ,IAAI,IAAI,QAAQ,KAAK,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI,UAAU;AAAA,YACvF;AAAA,UACF;AAEA,sBAAY,IAAI;AAAA,YACd,MAAM;AAAA,YACN,OAAO,KAAK;AAAA,YACZ,QAAQ,KAAK,UAAU,IAAI;AAAA,YAC3B,UAAU;AAAA,YACV,SAAS,OAAO,WAAW;AAAA,YAC3B,YAAY;AAAA,YACZ,UAAU,EAAE,QAAQ,YAAY,KAAK,YAAY,gBAAgB,aAAa,KAAK,UAAU,eAAe,CAAC,CAAC,KAAK,aAAa;AAAA,UAClI,CAAC;AAED,cAAI,OAAO,SAAS,GAAG;AACrB,mBAAO;AAAA,cACL,QAAQ;AAAA;AAAA,EAAsC,OAAO,IAAI,OAAK,iBAAO,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAA8D,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,cAC/K,UAAU,EAAE,WAAW,MAAM,KAAK;AAAA,YACpC;AAAA,UACF;AAEA,gBAAM,WAAW,KAAK,OAAO,SAAS;AAAA,YAAI,CAAC,GAAG,MAC5C,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,aAAQ,EAAE,WAAW,GAAG,EAAE,UAAU,SAAS,eAAe,EAAE,UAAU,KAAK,IAAI,CAAC,MAAM,EAAE;AAAA,UAC/G,EAAE,KAAK,IAAI;AAEX,gBAAM,UAAU,aAAa,KAAK,WAAW,uBAAuB;AAEpE,iBAAO;AAAA,YACL,QAAQ,kBAAkB,OAAO;AAAA;AAAA,YAAiB,KAAK,OAAO,IAAI;AAAA,kBAAqB,KAAK,UAAU;AAAA,aAAgB,KAAK,cAAc;AAAA;AAAA;AAAA,EAAkB,QAAQ;AAAA;AAAA;AAAA,YACnK,UAAU,EAAE,KAAK;AAAA,UACnB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MAED,aAAa,KAAK;AAAA,QAChB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,oFAA+E;AAAA,UACpH,YAAY,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,UACtG,aAAa,KAAK,OAAO,QAAQ,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,QAC9F;AAAA,QACA,MAAM,QAAQ,MAAM,UAAU;AAC5B,gBAAM,aAAa,KAAK,cAAc;AACtC,gBAAM,UAAU,KAAK,QAAQ;AAC7B,gBAAM,QAAQ,UAAU,kBAAkB,KAAK,OAAO,UAAU;AAGhE,qBAAW,QAAQ,OAAO;AACxB,wBAAY,YAAY,QAAQ,IAAI,IAAI,QAAQ,IAAI,IAAI;AAAA,cACtD,MAAM;AAAA,cACN,MAAM;AAAA,cACN,MAAM,CAAC;AAAA,YACT,CAAC;AAAA,UACH;AAEA,cAAI,SAAS;AAAA;AAAA,aAA0C,KAAK,KAAK;AAAA;AAAA;AAEjE,cAAI,KAAK,aAAa;AACpB,sBAAU,UAAU,WAAW,IAAI;AAAA,UACrC;AAEA,cAAI,MAAM,WAAW,GAAG;AACtB,sBAAU;AAAA,UACZ,OAAO;AACL,sBAAU,uBAAuB,MAAM,MAAM;AAAA;AAC7C,sBAAU,MAAM,IAAI,OAAK,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI;AAEhD,kBAAM,YAAY,MAAM,QAAQ,OAAK,UAAU,aAAa,CAAC,CAAC;AAC9D,gBAAI,UAAU,SAAS,GAAG;AACxB,wBAAU;AAAA;AAAA;AAAA;AACV,wBAAU,UAAU,IAAI,OAAK,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI;AAAA,YACtD;AAAA,UACF;AAEA,sBAAY,IAAI;AAAA,YACd,MAAM;AAAA,YACN,OAAO,KAAK;AAAA,YACZ,QAAQ,GAAG,MAAM,MAAM;AAAA,YACvB,UAAU;AAAA,YACV,SAAS;AAAA,YACT,YAAY;AAAA,UACd,CAAC;AAED,iBAAO,EAAE,QAAQ,UAAU,EAAE,OAAO,gBAAgB,KAAK,cAAc,UAAU,WAAW,IAAI,OAAU,EAAE;AAAA,QAC9G;AAAA,MACF,CAAC;AAAA,MAED,iBAAiB,KAAK;AAAA,QACpB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,OAAO,EAAE,SAAS,sCAAsC;AAAA,UAC5E,SAAS,KAAK,OAAO,QAAQ,EAAE,SAAS,yCAAyC;AAAA,UACjF,QAAQ,KAAK,OAAO,OAAO,EAAE,SAAS,0EAAqE;AAAA,UAC3G,eAAe,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,UACrI,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,UAClF,YAAY,KAAK,OAAO,QAAQ,EAAE,SAAS,EAAE,SAAS,iEAAiE;AAAA,UACvH,UAAU,KAAK,OAAO,KAAK,CAAC,YAAY,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,yIAAyI;AAAA,QACpN;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAAA,WAAU,aAAa,QAAQ,SAAS;AACxC,gBAAM,YAAY,KAAK,IAAI;AAC3B,gBAAM,aAAa,OAAO,OAAO;AAEjC,gBAAM,WAAW,eAAe,KAAK,MAAM;AAE3C,gBAAM,UAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,kBAAQ,kBAAkB;AAE1B,cAAI,KAAK,iBAAiB,KAAK,cAAc,SAAS,GAAG;AACvD,uBAAW,aAAa,QAAQ,WAAW,KAAK,QAAQ,KAAK,aAAa;AAE1E,uBAAW,KAAK,KAAK,eAAe;AAClC,oBAAM,UAAUP,MAAK,YAAY,CAAC;AAClC,kBAAI;AACF,sBAAM,UAAUM,cAAa,SAAS,OAAO;AAC7C,2BAAW,WAAW,SAAS,SAAS,UAAU;AAAA,cACpD,QAAQ;AAAA,cAA8C;AAAA,YACxD;AAAA,UACF;AAEA,mBAAS,aAAa,QAAQ,WAAW;AAAA,YACvC,QAAQ,KAAK;AAAA,YACb,SAAS,KAAK;AAAA,YACd,QAAQ,KAAK;AAAA,YACb,eAAe,KAAK,iBAAiB,CAAC;AAAA,YACtC,OAAO,KAAK;AAAA,UACd,CAAC;AAED,uBAAa,QAAQ,QAAQ,WAAW;AAAA,YACtC,MAAM;AAAA,YACN,SAAS,QAAQ,KAAK,MAAM,KAAK,KAAK,UAAU,YAAY,QAAQ,WAAM,KAAK,MAAM;AAAA,YACrF,WAAW;AAAA,UACb,CAAC;AAGD,gBAAM,iBAAiB,YAAY,SAAS,KAAK,QAAQ,KAAK,QAAQ,KAAK,iBAAiB,CAAC,CAAC;AAE9F,cAAI,WAAW,WAAW,KAAK,MAAM,KAAK,KAAK,UAAU,mBAAc,eAAU;AAAA;AAAA,EAAO,KAAK,MAAM;AAAA;AAEnG,cAAI,eAAe,SAAS,GAAG;AAC7B,wBAAY;AAAA;AAAA;AACZ,uBAAW,MAAM,gBAAgB;AAC/B,oBAAM,OAAO,GAAG,SAAS,UAAU,cAAO,GAAG,SAAS,WAAW,cAAO;AACxE,0BAAY,GAAG,IAAI,MAAM,GAAG,KAAK,YAAY,CAAC,OAAO,GAAG,WAAW;AAAA;AACnE,0BAAY,OAAO,GAAG,OAAO;AAAA;AAAA,YAC/B;AAAA,UACF;AAGA,gBAAM,cAAc,YAAY,UAAU;AAC1C,cAAI,YAAY,SAAS;AACvB,wBAAY;AAAA;AAAA,EAAqB,YAAY,MAAM;AAAA;AAAA;AACnD,wBAAY;AACZ,mBAAO,EAAE,QAAQ,UAAU,UAAU,EAAE,UAAU,SAAS,YAAY,QAAQ,SAAS,GAAG,SAAS,KAAK,EAAE;AAAA,UAC5G;AAEA,cAAI,eAAe;AACnB,cAAI,KAAK,WAAW,KAAK,eAAe,OAAO;AAC7C,wBAAY;AAAA;AAAA;AACZ,kBAAM,eAAe,KAAK,iBAAiB,CAAC;AAG5C,kBAAME,WAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,kBAAM,SAASA,SAAQ,MAAM,OAAO,QAAQ,KAAK;AACjD,kBAAM,kBAAkB,aAAa,IAAI,EAAE,MAAM;AACjD,2BAAe,MAAM,SAAS,cAAc,KAAK,QAAQ,YAAY,QAAQ,cAAc,eAAe;AAE1G,gBAAI,aAAa,QAAQ;AACvB,0BAAY;AAAA;AAEZ,2BAAa,OAAO,QAAQ,OAAK;AAC/B,4BAAY,KAAK,EAAE,SAAS,WAAM,QAAG,IAAI,EAAE,IAAI;AAAA;AAAA,cACjD,CAAC;AAAA,YACH,OAAO;AACL,0BAAY;AAAA;AACZ,0BAAY,aAAa,OAAO;AAAA,gBAAI,OAClC,GAAG,EAAE,SAAS,WAAM,QAAG,MAAM,EAAE,IAAI;AAAA;AAAA,EAAe,EAAE,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA,cAC1E,EAAE,KAAK,MAAM;AACb,0BAAY;AAAA;AAAA;AAAA,YACd;AAAA,UACF;AAEA,cAAI,KAAK,WAAW,aAAa,IAAI,EAAE,MAAM,wBAAwB;AACnE,wBAAY;AAAA;AAAA;AACZ,kBAAM,cAAc,mBAAmB,MAAM,KAAK,QAAQ,KAAK,iBAAiB,CAAC,CAAC;AAElF,gBAAI,YAAY,OAAO,SAAS,GAAG;AACjC,oBAAM,eAAe,YAAY,OAAO,OAAO,CAAC,MAAW,CAAC,EAAE,QAAQ;AACtE,oBAAM,oBAAoB,aAAa,SAAS,YAAY,OAAO;AAEnE,kBAAI,aAAa,SAAS,GAAG;AAC3B,4BAAY,yBAAe,aAAa,MAAM,IAAI,YAAY,OAAO,MAAM,4CAA4C,oBAAoB,KAAK,QAAQ,CAAC,CAAC;AAAA;AAC1J,6BAAa,QAAQ,CAAC,MAAW;AAC/B,8BAAY,YAAO,EAAE,IAAI,KAAK,EAAE,KAAK;AAAA;AAAA,gBACvC,CAAC;AAED,sBAAM,UAAUD,WAAU,gBAAgB;AAC1C,oBAAI,SAAS;AACX,gCAAc,oBAAoB,OAAO;AAAA,gBAC3C;AAEA,sBAAM,YAAY,aAAa,IAAI,EAAE,MAAM;AAC3C,sBAAM,eAAe,aAAa,IAAI,EAAE,MAAM;AAC9C,oBAAI,qBAAqB,aAAa,cAAc;AAClD,8BAAY;AAAA,6CAAyC,oBAAoB,KAAK,QAAQ,CAAC,CAAC,wBAAwB,YAAY,KAAK,QAAQ,CAAC,CAAC;AAAA;AAC3I,8BAAY;AAAA;AACZ,8BAAY;AAAA;AAEZ,2BAAS,aAAa,QAAQ,WAAW;AAAA,oBACvC,QAAQ,KAAK;AAAA,oBACb,SAAS;AAAA,oBACT,QAAQ,KAAK;AAAA,oBACb,eAAe,KAAK,iBAAiB,CAAC;AAAA,oBACtC,OAAO,2BAA2B,aAAa,MAAM;AAAA,kBACvD,CAAC;AAED,yBAAO,EAAE,QAAQ,UAAU,UAAU,EAAE,UAAU,SAAS,YAAY,QAAQ,SAAS,GAAG,SAAS,MAAM,uBAAuB,KAAK,EAAE;AAAA,gBACzI;AAAA,cACF,OAAO;AACL,4BAAY,cAAS,YAAY,OAAO,MAAM;AAAA;AAAA,cAChD;AAAA,YACF,OAAO;AACL,0BAAY;AAAA;AAAA,YACd;AAAA,UACF;AAEA,cAAI,CAAC,KAAK,SAAS;AACjB,kBAAM,gBAAgB,SAAS,oBAAoB,QAAQ,SAAS;AACpE,kBAAM,WAAW,MAAM,cAAc,YAAY,KAAK,SAAS,KAAK,QAAQ,aAAa;AACzF,kBAAM,aAAa,SAAS,cAAc,SAAS,QAAQ;AAC3D,kBAAM,WAAW,SAAS,SAAS,QAAQ,WAAW,KAAK,QAAQ,SAAS,QAAQ;AACpF,kBAAM,cAAc,SAAS,cAAc,QAAQ,WAAW,KAAK,MAAM;AACzE,kBAAM,cAAc,aAAa;AAEjC,wBAAY;AAAA;AAAA;AACZ,wBAAY,mBAAmB,SAAS,QAAQ,sBAAsB,SAAS,QAAQ;AAAA;AACvF,wBAAY,qBAAqB,SAAS,eAAe;AAAA;AAGzD,kBAAMC,WAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,kBAAM,YAAYA,SAAQ,MAAM,OAAO,SAAS,IAAI,OAAK,EAAE,EAAE,KAAK,CAAC;AACnE,kBAAM,eAAe,WAAW,wBAAwB,QAAQ,WAAW,KAAK,QAAQ,KAAK,SAAS,KAAK,QAAQ,SAAS;AAE5H,gBAAI,aAAa,eAAe;AAC9B,0BAAY;AAAA;AAAA;AACZ,0BAAY,wBAAwB,aAAa,aAAa;AAAA;AAC9D,0BAAY,yBAAyB,aAAa,gBAAgB,SAAS,IAAI,aAAa,gBAAgB,IAAI,OAAK,KAAK,CAAC,IAAI,EAAE,KAAK,UAAK,IAAI,gBAAgB;AAAA;AAC/J,0BAAY,mBAAmB,aAAa,UAAU;AAAA;AAAA,YACxD;AAEA,wBAAY;AAAA,qBAAwB,SAAS,YAAY;AAAA;AAEzD,gBAAI,UAAU;AACZ,0BAAY;AAAA,mCAA+B,WAAW,IAAI,UAAU,KAAK,SAAS,QAAQ;AAAA,YAC5F,OAAO;AACL,0BAAY;AAAA,2BAAuB,UAAU,iBAAiB,SAAS,QAAQ;AAAA,YACjF;AAGA,gCAAoB,eAAe;AAAA,cACjC,QAAQ,KAAK;AAAA,cACb,SAAS;AAAA,cACT,QAAQ,KAAK;AAAA,cACb,WAAW,QAAQ;AAAA,cACnB,WAAW;AAAA,cACX,UAAU,SAAS;AAAA,YACrB,CAAC;AAAA,UACH;AAEA,cAAI,KAAK,SAAS;AAEhB,gCAAoB,eAAe;AAAA,cACjC,QAAQ,KAAK;AAAA,cACb,SAAS;AAAA,cACT,QAAQ,KAAK;AAAA,cACb,WAAW,QAAQ;AAAA,cACnB,WAAW;AAAA,YACb,CAAC;AAAA,UACH;AAEA,gBAAM,WAAW,SAAS,YAAY,QAAQ,SAAS;AACvD,gBAAM,WAAW,SAAS,YAAY,QAAQ,SAAS;AAEvD,sBAAY;AAAA;AAAA;AACZ,sBAAY;AAAA;AACZ,sBAAY,oBAAe,SAAS,SAAS;AAAA;AAC7C,sBAAY,oBAAe,SAAS,MAAM;AAAA;AAC1C,sBAAY,uBAAgB,SAAS,OAAO;AAAA;AAC5C,sBAAY,qBAAgB,SAAS,QAAQ,SAAS,YAAY,SAAS,SAAS,SAAS,OAAO;AAAA;AACpG,sBAAY;AAAA;AAEZ,cAAI,KAAK,WAAW,UAAU;AAC5B,wBAAY;AAAA;AAAA,WAAmB,SAAS,EAAE,aAAQ,SAAS,WAAW;AAAA,UACxE,WAAW,KAAK,WAAW,CAAC,UAAU;AACpC,wBAAY;AAAA;AAAA;AAGZ,kBAAMA,WAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,gBAAIA,SAAQ,MAAM;AAChB,oBAAM,aAAa,SAAS,UAAU,QAAQ,SAAS;AACvD,oBAAM,WAAW,SAAS,oBAAoB,QAAQ,SAAS;AAC/D,oBAAM,YAAY,SAAS,kBAAkB,QAAQ,SAAS,EAAE,IAAI,MAAM,WAAW;AACrF,4BAAc;AAAA,gBACZ,QAAQ;AAAA,gBACRA,SAAQ,KAAK,OAAO;AAAA,gBACpB,aAAa,YAAY;AAAA,gBACzB;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAGA,cAAI,KAAK,UAAU;AACjB,kBAAM,aAAa,KAAK,aAAa;AACrC,wBAAY;AAAA;AAAA;AACZ,wBAAY,GAAG,aAAa,gDAAsC,oCAA0B;AAAA;AAG5F,kBAAMA,WAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,kBAAM,OAAOA,SAAQ,MAAM,OAAO,QAAQ,KAAK;AAC/C,kBAAM,iBAAiB,WAAW,KAAK,IAAI;AAC3C,uBAAW,SAAS,eAAe,MAAM,GAAG,CAAC,GAAG;AAC9C,kBAAI,YAAY;AAEd,sBAAM;AACN,sBAAM,cAAc,KAAK,IAAI,GAAG,MAAM,cAAc,IAAI;AACxD,4BAAY,KAAK,UAAU,MAAM,WAAW,KAAK,IAAI,MAAM,UAAU;AAAA,cACvE,OAAO;AAEL,2BAAW,cAAc,MAAM,WAAW,KAAK,EAAE;AAAA,cACnD;AAAA,YACF;AAGA,gBAAI,CAAC,YAAY;AAEf,oBAAM,gBAAgB,SAAS,oBAAoB,QAAQ,SAAS;AACpE,oBAAM,mBAAmB,MAAM,cAAc,YAAY,KAAK,QAAQ,aAAa;AACnF,oBAAM,aAAa,SAAS,cAAc,iBAAiB,QAAQ;AACnE,uBAAS,eAAe,iBAAiB,UAAU,KAAK,IAAI,aAAa,GAAG,CAAC,CAAC;AAC9E,0BAAY,kCAAkC,iBAAiB,QAAQ,aAAQ,KAAK,IAAI,aAAa,GAAG,CAAC,CAAC;AAAA;AAG1G,kCAAoB,eAAe;AAAA,gBACjC,QAAQ,YAAY,KAAK,MAAM;AAAA,gBAC/B,SAAS;AAAA,gBACT,QAAQ,2BAA2B,KAAK,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA,gBAC5D,WAAW,QAAQ;AAAA,gBACnB,WAAW,KAAK,IAAI;AAAA,gBACpB,UAAU,iBAAiB;AAAA,cAC7B,CAAC;AAGD,oBAAM,UAAU,oBAAoB,aAAa,QAAQ,SAAS;AAClE,kBAAI,SAAS;AACX,4BAAY,6CAAsC,QAAQ,MAAM;AAAA;AAChE,oBAAI;AACF,wBAAM,gBAAgB,MAAM,cAAc;AAC1C,8BAAY,KAAK,cAAc,QAAQ,OAAO,MAAM,CAAC;AAAA;AAAA,gBACvD,SAAS,GAAG;AACV,8BAAY,uDAA8C,EAAY,OAAO;AAAA;AAAA,gBAC/E;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAEA,iBAAO,EAAE,QAAQ,UAAU,UAAU,EAAE,UAAU,UAAU,UAAU,IAAI,aAAa,EAAE;AAAA,QAC1F;AAAA,MACF,CAAC;AAAA,MAED,iBAAiB,KAAK;AAAA,QACpB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,OAAO,EAAE,SAAS,sCAAsC;AAAA,UAC5E,cAAc,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,gEAAgE;AAAA,UACvH,cAAc,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,QACnG;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAAD,WAAU,aAAa,QAAQ,SAAS;AACxC,gBAAM,YAAY,SAAS,aAAa,QAAQ,WAAW,KAAK,MAAM;AACtE,cAAI,CAAC,aAAa,CAAC,UAAU,QAAQ;AACnC,mBAAO,EAAE,QAAQ,iCAAiC,KAAK,MAAM,8CAA8C;AAAA,UAC7G;AAEA,cAAI,UAAU,OAAO,SAAS;AAC5B,mBAAO,EAAE,QAAQ,SAAS,KAAK,MAAM,gDAA2C;AAAA,UAClF;AAEA,gBAAM,YAAY,CAAC,KAAK,cAAc,UAAU,OAAO,QAAQ,UAAU,OAAO,KAAK,EAClF,OAAO,OAAO,EACd,KAAK,IAAI;AACZ,gBAAM,gBAAgB,SAAS,oBAAoB,QAAQ,SAAS;AACpE,gBAAM,WAAW,MAAM,cAAc,YAAY,WAAW,aAAa;AACzE,gBAAM,WAAW,SAAS,SAAS,QAAQ,WAAW,KAAK,MAAM;AACjE,gBAAM,cAAc,SAAS,cAAc,QAAQ,WAAW,KAAK,MAAM;AAEzE,cAAI,KAAK,cAAc;AACrB,qBAAS,iBAAiB,QAAQ,WAAW,KAAK,QAAQ,KAAK,cAAc,KAAK;AAAA,UACpF;AAGA,gBAAM,UAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,gBAAM,YAAY,QAAQ,MAAM,OAAO,SAAS,IAAI,OAAK,EAAE,EAAE,KAAK,CAAC;AACnE,gBAAM,eAAe,WAAW,wBAAwB,QAAQ,WAAW,KAAK,QAAQ,WAAW,SAAS;AAE5G,cAAI,SAAS,sCAA+B,KAAK,MAAM;AAAA;AAAA;AACvD,oBAAU,mBAAmB,SAAS,QAAQ;AAAA;AAC9C,oBAAU,iBAAiB,SAAS,QAAQ;AAAA;AAC5C,oBAAU,YAAY,WAAW;AAAA;AAAA;AACjC,oBAAU;AAAA,EAAmB,SAAS,eAAe;AAAA;AAAA;AAErD,cAAI,aAAa,iBAAiB,aAAa,gBAAgB,SAAS,GAAG;AACzE,sBAAU;AAAA;AACV,gBAAI,aAAa,eAAe;AAC9B,wBAAU,wBAAwB,aAAa,aAAa;AAAA;AAAA,YAC9D;AACA,gBAAI,aAAa,gBAAgB,SAAS,GAAG;AAC3C,wBAAU,yBAAyB,aAAa,gBAAgB,IAAI,OAAK,KAAK,CAAC,IAAI,EAAE,KAAK,UAAK,CAAC;AAAA;AAAA,YAClG;AACA,sBAAU,mBAAmB,aAAa,UAAU;AAAA;AAAA;AAAA,UACtD;AAEA,oBAAU;AAAA,EAAsB,SAAS,YAAY;AAAA;AAErD,cAAI,cAAc,SAAS,GAAG;AAC5B,sBAAU;AAAA;AAAA;AACV,sBAAU,cAAc,IAAI,OAAK,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI;AAAA,UAC9D;AAEA,cAAI,SAAS,aAAa,aAAa,SAAS,aAAa,QAAQ;AACnE,sBAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UACZ,WAAW,SAAS,aAAa,QAAQ;AACvC,sBAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UACZ,OAAO;AACL,sBAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UACZ;AAEA,cAAI,UAAU;AACZ,sBAAU;AAAA;AAAA,cAAe,IAAI,WAAW;AAAA,UAC1C,OAAO;AACL,sBAAU;AAAA;AAAA;AAAA,UACZ;AAEA,iBAAO,EAAE,OAAO;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,MAED,gBAAgB,KAAK;AAAA,QACnB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,UAC9E,YAAY,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,QAC9F;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,gBAAM,aAAa,KAAK,cAAc,OAAO,OAAO;AACpD,gBAAM,SAAS,KAAK,UAAU;AAE9B,gBAAM,SAAS,SAAS,UAAU,QAAQ,UAAU;AAEpD,sBAAY,IAAI;AAAA,YACd,MAAM,UAAU,MAAM;AAAA,YACtB,OAAO;AAAA,YACP,QAAQ,KAAK,UAAU,MAAM;AAAA,YAC7B,UAAU;AAAA,YACV,SAAS,OAAO;AAAA,YAChB,YAAY;AAAA,UACd,CAAC;AAED,gBAAM,cAAc,OAAO,OAAO;AAAA,YAAI,OACpC,GAAG,EAAE,SAAS,WAAM,QAAG,MAAM,EAAE,IAAI;AAAA;AAAA,EAAe,EAAE,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA,UAC1E,EAAE,KAAK,MAAM;AAEb,cAAI,OAAO,QAAQ;AACjB,mBAAO,EAAE,QAAQ;AAAA;AAAA,EAA+B,WAAW,IAAI,UAAU,OAAO;AAAA,UAClF;AAEA,gBAAM,WAAW,MAAM,cAAc,YAAY,OAAO,OAAO,KAAK,IAAI,GAAG,CAAC,CAAC;AAC7E,iBAAO;AAAA,YACL,QAAQ;AAAA;AAAA,EAA+B,WAAW;AAAA;AAAA;AAAA,kBAAqC,SAAS,QAAQ;AAAA,oBAAyB,SAAS,eAAe;AAAA,WAAc,SAAS,YAAY;AAAA,YAC5L,UAAU;AAAA,UACZ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MAED,gBAAgB,KAAK;AAAA,QACnB,aAAa;AAAA,QACb,MAAM,CAAC;AAAA,QACP,MAAM,QAAQ,OAAO,SAAS;AAC5B,gBAAM,WAAW,SAAS,YAAY,QAAQ,SAAS;AACvD,gBAAM,WAAW,SAAS,YAAY,QAAQ,SAAS;AACvD,gBAAM,eAAe,SAAS,gBAAgB,QAAQ,SAAS;AAC/D,gBAAM,aAAa,SAAS,WAAW,QAAQ,SAAS;AACxD,gBAAM,YAAY,SAAS,UAAU,QAAQ,SAAS;AACtD,gBAAM,WAAW,SAAS,oBAAoB,QAAQ,SAAS;AAE/D,cAAI,SAAS;AAAA;AAAA;AAEb,cAAI,SAAS,QAAQ,GAAG;AACtB,kBAAM,MAAM,KAAK,IAAI,KAAK,KAAK,MAAO,SAAS,YAAY,SAAS,QAAS,GAAG,CAAC;AACjF,kBAAM,SAAS;AACf,kBAAM,SAAS,KAAK,IAAI,QAAQ,KAAK,MAAO,MAAM,MAAO,MAAM,CAAC;AAChE,sBAAU;AAAA,GAAY,SAAI,OAAO,MAAM,CAAC,GAAG,SAAI,OAAO,SAAS,MAAM,CAAC,KAAK,GAAG;AAAA;AAAA;AAAA,UAChF;AAEA,oBAAU,eAAe,YAAY,uBAAkB,qBAAW;AAAA;AAClE,oBAAU,eAAe,aAAa,uBAAgB,oBAAe;AAAA;AAAA;AACrE,oBAAU;AAAA;AAAA;AACV,oBAAU,mBAAc,SAAS,SAAS;AAAA;AAC1C,oBAAU,qBAAgB,SAAS,MAAM;AAAA;AACzC,oBAAU,yBAAkB,SAAS,OAAO;AAAA;AAE5C,cAAI,UAAU;AACZ,sBAAU;AAAA;AAAA,WAAyB,SAAS,EAAE,aAAQ,SAAS,WAAW;AAAA;AAAA,UAC5E;AAEA,cAAI,aAAa,SAAS,GAAG;AAC3B,sBAAU;AAAA;AAAA;AACV,uBAAW,KAAK,cAAc;AAC5B,wBAAU,OAAO,EAAE,EAAE,aAAQ,EAAE,WAAW;AAAA;AAC1C,wBAAU,iBAAiB,EAAE,UAAU,IAAI,OAAK,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,YACxE;AAAA,UACF;AAEA,cAAI,SAAS,SAAS,GAAG;AACvB,sBAAU;AAAA;AAAA;AACV,sBAAU,SAAS,IAAI,OAAK,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI;AAAA,UACzD;AAEA,oBAAU;AAAA;AAAA;AACV,gBAAM,eAAe,cAAc,WAAW;AAC9C,oBAAU,eAAe;AAGzB,gBAAM,aAAa,aAAa,uBAAuB,QAAQ,SAAS;AACxE,cAAI,WAAW,SAAS,GAAG;AACzB,sBAAU;AAAA;AAAA;AACV,sBAAU,WAAW,IAAI,OAAK,OAAO,EAAE,IAAI,eAAU,EAAE,KAAK,IAAI,EAAE,KAAK,IAAI,IAAI;AAAA,UACjF;AAGA,gBAAM,QAAQ,oBAAoB,SAAS;AAC3C,cAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,kBAAM,UAAU,MAAM,QAAQ,cAAc,cAAc,cAAO,MAAM,QAAQ,cAAc,cAAc,cAAO;AAClH,sBAAU;AAAA;AAAA;AACV,sBAAU,iBAAiB,MAAM,QAAQ,cAAc,KAAK,QAAQ,CAAC,CAAC,MAAM,MAAM,QAAQ,OAAO,IAAI,MAAM,QAAQ,KAAK;AAAA;AACxH,sBAAU,kBAAkB,MAAM,QAAQ,UAAU,SAAS,MAAM,QAAQ,cAAc,KAAK,QAAQ,CAAC,CAAC,YAAO,OAAO,IAAI,MAAM,QAAQ,SAAS;AAAA;AACjJ,gBAAI,MAAM,qBAAqB;AAC7B,wBAAU;AAAA;AACV,kBAAI;AACF,0BAAU,IAAI,MAAM,cAAc,GAAG,QAAQ,OAAO,IAAI,CAAC;AAAA;AAAA,cAC3D,QAAQ;AACN,0BAAU;AAAA;AAAA,cACZ;AAAA,YACF;AAEA,gBAAI,MAAM,YAAY,MAAM,SAAS,YAAY,SAAS,GAAG;AAC3D,wBAAU,8BAA8B,MAAM,SAAS,iBAAiB,KAAK,QAAQ,CAAC,CAAC;AACvF,kBAAI,MAAM,SAAS,UAAU;AAC3B,0BAAU;AAAA,cACZ;AACA,kBAAI,MAAM,SAAS,uBAAuB,MAAM;AAC9C,0BAAU,MAAM,MAAM,SAAS,kBAAkB;AAAA,cACnD;AACA,wBAAU;AAAA;AACV,wBAAU,sBAAsB,MAAM,SAAS,YAAY,IAAI,OAAK,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,EAAE,KAAK,UAAK,CAAC;AAAA;AAAA,YAC7G;AACA,gBAAI,MAAM,gBAAgB,SAAS,GAAG;AACpC,wBAAU;AAAA;AACV,wBAAU,MAAM,gBAAgB,IAAI,OAAK,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,IAAI;AAAA,YAClE;AAAA,UACF;AAGA,gBAAM,YAAY,cAAc,aAAa;AAC7C,cAAI,UAAU,aAAa,KAAK,UAAU,mBAAmB,GAAG;AAC9D,sBAAU;AAAA;AAAA;AACV,kBAAM,MAAM,SAAI,OAAO,KAAK,MAAM,UAAU,UAAU,CAAC,CAAC;AACxD,sBAAU,gBAAgB,UAAU,OAAO,QAAQ,IAAI,OAAO,IAAI,QAAG,CAAC;AAAA;AACtE,uBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,UAAU,UAAU,GAAG;AAC9D,kBAAI,IAAI,SAAS,GAAG;AAClB,0BAAU,OAAO,IAAI,QAAQ,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC,cAAc,IAAI,SAAS,KAAK,QAAQ,CAAC,CAAC;AAAA;AAAA,cACpG;AAAA,YACF;AACA,sBAAU;AAAA;AAAA,UACZ;AAEA,iBAAO,EAAE,QAAQ,UAAU,EAAE,UAAU,UAAU,UAAU,IAAI,cAAc,YAAY,UAAU,EAAE;AAAA,QACvG;AAAA,MACF,CAAC;AAAA,MAED,iBAAiB,KAAK;AAAA,QACpB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,KAAK,CAAC,QAAQ,UAAU,CAAC,EAAE,SAAS,sFAAsF;AAAA,QAChJ;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,gBAAM,QAAQ,aAAa,WAAW,QAAQ,WAAW,GAAG;AAC5D,gBAAM,UAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,gBAAM,WAAW,SAAS,oBAAoB,QAAQ,SAAS;AAC/D,gBAAM,YAAsB,CAAC;AAE7B,cAAI,KAAK,WAAW,QAAQ;AAC1B,gBAAIE,UAAS;AAAA;AAAA;AACb,YAAAA,WAAU,wBAAwB,MAAM,MAAM;AAAA;AAC9C,YAAAA,WAAU,sBAAsB,SAAS,MAAM;AAAA;AAC/C,YAAAA,WAAU,mBAAmB,QAAQ,MAAM,OAAO,SAAS,UAAU,CAAC;AAAA;AAEtE,kBAAMC,WAAU,MAAM,kBAAkB;AAAA,cACtC,QAAQ,MAAM,OAAO,QAAQ;AAAA,cAC7B;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAEA,YAAAD,WAAU,0BAA0BC,SAAQ,eAAe;AAAA;AAE3D,kBAAM,iBAAiB,kBAAkB,eAAe,MAAM,QAAQA,SAAQ,eAAe;AAC7F,gBAAI,gBAAgB;AAClB,cAAAD,WAAU;AAAA;AAAA;AAAA,YACZ,OAAO;AACL,cAAAA,WAAU;AAAA;AAAA;AAAA,YACZ;AAEA,mBAAO,EAAE,QAAAA,QAAO;AAAA,UAClB;AAGA,gBAAM,UAAU,MAAM,kBAAkB;AAAA,YACtC,QAAQ,MAAM,OAAO,QAAQ;AAAA,YAC7B;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,SAAS,kBAAkB,iBAAiB,OAAO;AAEzD,cAAI,SAAS;AAAA;AAAA;AACb,oBAAU,cAAc,MAAM,MAAM,gBAAgB,QAAQ,eAAe;AAAA;AAAA;AAC3E,oBAAU;AAEV,sBAAY,IAAI;AAAA,YACd,MAAM;AAAA,YACN,OAAO,GAAG,MAAM,MAAM;AAAA,YACtB,QAAQ,GAAG,QAAQ,eAAe;AAAA,YAClC,UAAU;AAAA,YACV,SAAS;AAAA,YACT,YAAY;AAAA,UACd,CAAC;AAED,iBAAO,EAAE,OAAO;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,MAED,kBAAkB,KAAK;AAAA,QACrB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,KAAK,CAAC,QAAQ,MAAM,CAAC,EAAE,SAAS,+DAA+D;AAAA,UACnH,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,uDAAuD;AAAA,QACzG;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,cAAI,KAAK,WAAW,QAAQ;AAC1B,kBAAM,WAAW,SAAS,YAAY,QAAQ,SAAS;AACvD,kBAAM,WAAW,SAAS,oBAAoB,QAAQ,SAAS;AAC/D,kBAAMD,WAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,kBAAM,WAAWA,SAAQ,MAAM,OAAO,QAAQ;AAE9C,kBAAM,WAAW;AAAA,cACf,OAAO,KAAK,SAAS,QAAQ,KAAK,IAAI,CAAC;AAAA,cACvC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,cAClC;AAAA,cACA;AAAA,cACA,eAAe;AAAA,cACf,gBAAgBA,SAAQ,MAAM,OAAO,SAAS;AAAA,gBAAO,OACnD,SAAS,kBAAkB,QAAQ,SAAS,EAAE,SAAS,EAAE,EAAE;AAAA,cAC7D,EAAE,IAAI,OAAK,EAAE,EAAE,KAAK,CAAC;AAAA,YACvB;AAEA,YAAAA,SAAQ,UAAU,IAAI,YAAY,SAAS,KAAK,IAAI,KAAK,UAAU,QAAQ,CAAC;AAE5E,wBAAY,IAAI;AAAA,cACd,MAAM;AAAA,cACN,OAAO,SAAS;AAAA,cAChB,QAAQ,GAAG,SAAS,MAAM,WAAW,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,cACzE,UAAU;AAAA,cACV,SAAS;AAAA,cACT,YAAY;AAAA,YACd,CAAC;AAED,mBAAO;AAAA,cACL,QAAQ;AAAA;AAAA,eAAwC,SAAS,KAAK;AAAA,gBAAqB,SAAS,SAAS,IAAI,SAAS,KAAK;AAAA,aAAgB,SAAS,MAAM;AAAA,iBAAoB,SAAS,SAAS;AAAA,YAC9L;AAAA,UACF;AAGA,gBAAM,UAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,gBAAM,YAAsB,CAAC;AAC7B,qBAAW,CAAC,GAAG,KAAK,QAAQ,WAAW;AACrC,gBAAI,IAAI,WAAW,WAAW,GAAG;AAC/B,wBAAU,KAAK,IAAI,QAAQ,aAAa,EAAE,CAAC;AAAA,YAC7C;AAAA,UACF;AAEA,cAAI,UAAU,WAAW,GAAG;AAC1B,mBAAO,EAAE,QAAQ,8DAAgE;AAAA,UACnF;AAEA,iBAAO,EAAE,QAAQ;AAAA;AAAA,EAAsB,UAAU,IAAI,OAAK,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,QACvF;AAAA,MACF,CAAC;AAAA,MAED,kBAAkB,KAAK;AAAA,QACrB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,KAAK,CAAC,UAAU,QAAQ,OAAO,UAAU,SAAS,CAAC,EAAE,SAAS,yJAAyJ;AAAA,UAC3O,YAAY,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,UAC1F,QAAQ,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO;AAAA,YAC3C,MAAM,KAAK,OAAO,OAAO,EAAE,SAAS,2BAA2B;AAAA,YAC/D,aAAa,KAAK,OAAO,OAAO,EAAE,SAAS,mCAAmC;AAAA,YAC9E,oBAAoB,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,iCAAiC;AAAA,UACnH,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,qCAAqC;AAAA,UAC7D,MAAM,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,UAClF,aAAa,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,QAC/F;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,kBAAQ,KAAK,QAAQ;AAAA,YACnB,KAAK,UAAU;AACb,kBAAI,CAAC,KAAK,cAAc,CAAC,KAAK,UAAU,KAAK,OAAO,WAAW,GAAG;AAChE,uBAAO,EAAE,QAAQ,oDAAoD;AAAA,cACvE;AACA,oBAAM,WAA6B;AAAA,gBACjC,IAAI,KAAK;AAAA,gBACT,MAAM,KAAK,QAAQ,KAAK;AAAA,gBACxB,QAAQ,KAAK;AAAA,gBACb,WAAW,KAAK,IAAI;AAAA,cACtB;AACA,2BAAa,eAAe,QAAQ;AACpC,qBAAO;AAAA,gBACL,QAAQ;AAAA;AAAA,YAAuC,SAAS,EAAE;AAAA,YAAiB,SAAS,IAAI;AAAA,cAAiB,SAAS,OAAO,MAAM;AAAA;AAAA,IAC7H,SAAS,OAAO,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,aAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,IAAI;AAAA,cACzF;AAAA,YACF;AAAA,YAEA,KAAK,QAAQ;AACX,oBAAM,YAAY,aAAa,cAAc;AAC7C,kBAAI,UAAU,WAAW,EAAG,QAAO,EAAE,QAAQ,8DAAgE;AAC7G,kBAAI,MAAM,mCAA4B,UAAU,MAAM;AAAA;AAAA;AACtD,yBAAW,KAAK,WAAW;AACzB,uBAAO,KAAK,EAAE,IAAI,SAAS,EAAE,EAAE,cAAS,EAAE,OAAO,MAAM;AAAA;AACvD,uBAAO,EAAE,OAAO,IAAI,OAAK,OAAO,EAAE,IAAI,KAAK,EAAE,WAAW,EAAE,EAAE,KAAK,IAAI,IAAI;AAAA,cAC3E;AACA,qBAAO,EAAE,QAAQ,IAAI;AAAA,YACvB;AAAA,YAEA,KAAK,WAAW;AACd,oBAAM,YAAY,aAAa,qBAAqB,KAAK,eAAe,EAAE;AAC1E,oBAAM,WAAW,aAAa,YAAY,SAAS;AACnD,kBAAI,CAAC,SAAU,QAAO,EAAE,QAAQ,yBAAyB,SAAS,kDAAkD;AACpH,kBAAI,MAAM,sCAA+B,SAAS,IAAI;AAAA;AAAA;AACtD,qBAAO,sEAAsE,SAAS,EAAE;AAAA;AAAA;AACxF,qBAAO,SAAS,OAAO,IAAI,CAAC,GAAG,MAAM;AACnC,sBAAM,WAAW,EAAE,SAAS,aAAa,aAAa,EAAE,IAAI;AAC5D,sBAAM,WAAW,cAAc,aAAa,QAAQ;AACpD,sBAAM,aAAa,SAAS,SAAS,KAAK,SAAS,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,KAAK,QAAQ,MAAM;AACtG,uBAAO,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,aAAQ,EAAE,WAAW,YAAY,UAAU;AAAA,cACzE,CAAC,EAAE,KAAK,IAAI;AACZ,qBAAO,EAAE,QAAQ,IAAI;AAAA,YACvB;AAAA,YAEA,KAAK,OAAO;AACV,kBAAI,CAAC,KAAK,WAAY,QAAO,EAAE,QAAQ,uBAAuB;AAC9D,oBAAM,WAAW,aAAa,YAAY,KAAK,UAAU;AACzD,kBAAI,CAAC,SAAU,QAAO,EAAE,QAAQ,aAAa,KAAK,UAAU,+CAA+C,aAAa,cAAc,EAAE,IAAI,OAAK,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG;AAEpK,oBAAM,QAAQ,OAAO,QAAQ,SAAS,IAAI,KAAK,UAAU;AACzD,2BAAa,SAAS,OAAO,KAAK,UAAU;AAE5C,0BAAY,kBAAkB,gBAAgB,KAAK,IAAI,oBAAoB,SAAS,IAAI,IAAI,aAAa;AAEzG,kBAAI,MAAM;AAAA;AAAA;AACV,qBAAO,iBAAiB,SAAS,IAAI,OAAO,KAAK,UAAU;AAAA;AAC3D,qBAAO,iBAAiB,KAAK;AAAA;AAAA;AAC7B,qBAAO;AAAA;AACP,qBAAO,SAAS,OAAO,IAAI,CAAC,GAAG,MAAM;AACnC,sBAAM,SAAS,MAAM,IAAI,WAAM;AAC/B,sBAAM,WAAW,EAAE,SAAS,aAAa,aAAa,EAAE,IAAI;AAC5D,sBAAM,WAAW,cAAc,aAAa,QAAQ;AACpD,sBAAM,aAAa,SAAS,SAAS,KAAK,SAAS,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,KAAK,QAAQ,MAAM;AACtG,uBAAO,GAAG,MAAM,MAAM,EAAE,IAAI,aAAQ,EAAE,WAAW,YAAY,UAAU;AAAA,cACzE,CAAC,EAAE,KAAK,IAAI;AACZ,qBAAO;AAAA;AAAA;AAAA,sFAA0G,SAAS,OAAO,CAAC,EAAE,IAAI;AAExI,qBAAO,EAAE,QAAQ,KAAK,UAAU,EAAE,OAAO,YAAY,KAAK,WAAW,EAAE;AAAA,YACzE;AAAA,YAEA,KAAK,UAAU;AACb,oBAAM,QAAQ,KAAK,aACf,OAAO,QAAQ,SAAS,IAAI,KAAK,UAAU,KAC3C;AAEJ,kBAAI,CAAC,OAAO;AACV,uBAAO,EAAE,QAAQ,sCAAsC;AAAA,cACzD;AAEA,oBAAM,UAAU,aAAa,gBAAgB,KAAK;AAClD,oBAAM,UAAU,aAAa,mBAAmB,KAAK;AAErD,kBAAI,MAAM;AAAA;AAAA;AACV,qBAAO,cAAc,KAAK;AAAA;AAE1B,oBAAM,WAAW,KAAK,aAAa,aAAa,YAAY,KAAK,UAAU,IAAI;AAC/E,kBAAI,UAAU;AACZ,uBAAO,iBAAiB,SAAS,IAAI;AAAA;AAAA;AACrC,uBAAO;AAAA;AAAA;AACP,2BAAW,SAAS,SAAS,QAAQ;AACnC,wBAAM,YAAY,QAAQ,IAAI,MAAM,IAAI;AACxC,wBAAM,OAAO,YAAY,WAAM,MAAM,SAAS,SAAS,OAAO,WAAM;AACpE,yBAAO,KAAK,IAAI,IAAI,MAAM,IAAI,MAAM,YAAY,aAAa,MAAM,SAAS,SAAS,OAAO,WAAW,SAAS;AAAA;AAAA,gBAClH;AAAA,cACF;AAEA,kBAAI,SAAS;AACX,uBAAO;AAAA;AAAA,IAA0B,QAAQ,IAAI,aAAQ,QAAQ,WAAW;AAAA;AAAA,cAC1E,OAAO;AACL,uBAAO;AAAA;AAAA;AAAA;AAAA,cACT;AAEA,qBAAO,EAAE,QAAQ,IAAI;AAAA,YACvB;AAAA,YAEA;AACE,qBAAO,EAAE,QAAQ,mBAAmB,KAAK,MAAM,oDAAoD;AAAA,UACvG;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MAED,YAAY,KAAK;AAAA,QACf,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,mDAAmD;AAAA,UACnG,QAAQ,KAAK,OAAO,KAAK,CAAC,YAAY,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,2EAA2E;AAAA,UAChJ,YAAY,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,6CAA6C;AAAA,QACpG;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,gBAAM,UAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,gBAAM,WAAW,SAAS,oBAAoB,QAAQ,SAAS;AAE/D,cAAI,CAAC,QAAQ,MAAM;AACjB,mBAAO,EAAE,QAAQ,0DAA0D;AAAA,UAC7E;AAEA,gBAAM,QAAQ,QAAQ,KAAK,OAAO,SAAS,IAAI,OAAK;AAClD,kBAAM,YAAY,SAAS,aAAa,QAAQ,WAAW,EAAE,EAAE;AAC/D,mBAAO;AAAA,cACL,IAAI,EAAE;AAAA,cACN,aAAa,EAAE;AAAA,cACf,SAAS,WAAW,QAAQ,WAAW;AAAA,YACzC;AAAA,UACF,CAAC;AAED,gBAAM,KAAK,IAAI,sBAAsB,KAAK,SAAS,QAAQ,KAAK,OAAO,MAAM,OAAO,QAAQ;AAE5F,cAAI,SAAS;AAAA;AAAA;AACb,oBAAU;AAAA,SAAe,GAAG,KAAK;AAAA;AAAA;AAAA;AACjC,oBAAU;AAAA;AAAA,EAAiB,GAAG,OAAO;AAAA;AAAA;AACrC,oBAAU;AAAA;AAAA,EAAiB,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA;AAChD,oBAAU;AAAA;AAAA,EAAuB,SAAS,IAAI,OAAK,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAC3E,oBAAU;AAAA;AAAA,EAAmB,GAAG,QAAQ;AAAA;AAAA;AAExC,cAAI,GAAG,iBAAiB;AACtB,sBAAU;AAAA;AAAA;AAAA;AAAA;AAAA,UACZ;AAEA,oBAAU;AAAA;AAAA;AACV,oBAAU,MAAM;AAAA,YAAI,OAClB,KAAK,EAAE,UAAU,WAAM,QAAG,MAAM,EAAE,EAAE,aAAQ,EAAE,WAAW;AAAA,UAC3D,EAAE,KAAK,IAAI;AAGX,gBAAM,aAAa,MAAM,MAAM,OAAK,EAAE,OAAO;AAC7C,cAAI,aAAa;AACjB,cAAI,cAAc,SAAS,SAAS,KAAK,IAAI,YAAY,GAAG;AAC1D,yBAAa,IAAI,OAAO,SAAS,GAAG,KAAK,IAAI,QAAQ;AAAA,UACvD;AAEA,cAAI,YAAY;AACd,sBAAU;AAAA;AAAA;AAAA;AAAA;AACV,sBAAU,iBAAiB,WAAW,KAAK,MAAM,GAAG,CAAC,CAAC;AAAA;AACtD,sBAAU,gBAAgB,WAAW,OAAO;AAAA;AAC5C,sBAAU,cAAc,WAAW,MAAM,MAAM;AAAA;AAAA,UACjD;AAGA,cAAI,KAAK,WAAW,UAAU;AAC5B,kBAAM,SAAS,GAAG,GAAG,OAAO;AAAA;AAAA;AAAA,EAAmB,GAAG,QAAQ,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,EAAqB,GAAG,QAAQ;AACpG,kBAAM,OAAO,KAAK,cAAc;AAChC,kBAAM,WAAW,IAAI,SAAS,GAAG,OAAO,QAAQ,IAAI;AACpD,gBAAI,UAAU;AACZ,wBAAU;AAAA;AAAA;AAAA;AAAA;AACV,wBAAU,YAAY,SAAS,GAAG;AAAA;AAClC,wBAAU,gBAAgB,SAAS,MAAM;AAAA;AACzC,wBAAU,eAAe,SAAS,MAAM;AAAA;AAAA,YAC1C,OAAO;AACL,wBAAU;AAAA;AAAA;AAAA;AAAA;AACV,wBAAU;AAAA;AAAA,YACZ;AAAA,UACF;AAEA,sBAAY,IAAI;AAAA,YACd,MAAM;AAAA,YACN,OAAO,GAAG;AAAA,YACV,QAAQ,GAAG,MAAM,MAAM,WAAW,SAAS,MAAM;AAAA,YACjD,UAAU;AAAA,YACV,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,UAAU,EAAE,YAAY,YAAY,MAAM,WAAW,KAAK,WAAW,SAAS;AAAA,UAChF,CAAC;AAED,iBAAO,EAAE,OAAO;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,MAED,eAAe,KAAK;AAAA,QAClB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,OAAO,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,QAC/H;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,gBAAM,WAAW,SAAS,oBAAoB,QAAQ,SAAS;AAC/D,gBAAM,QAAQ,KAAK,SAAS;AAE5B,cAAI,MAAM,WAAW,GAAG;AACtB,mBAAO,EAAE,QAAQ,oDAAoD;AAAA,UACvE;AAEA,gBAAM,WAAW,oBAAI,IAAoB;AACzC,qBAAW,QAAQ,OAAO;AACxB,gBAAI;AACF,uBAAS,IAAI,MAAMF,cAAa,MAAM,OAAO,CAAC;AAAA,YAChD,QAAQ;AACN,uBAAS,IAAI,MAAM,mBAAmB,IAAI,GAAG;AAAA,YAC/C;AAAA,UACF;AAEA,gBAAM,UAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,gBAAM,QAAQ,WAAW,MAAM,QAAQ,MAAM,OAAO,QAAQ,WAAW,OAAO,QAAQ;AAEtF,cAAI,SAAS,mCAA4B,MAAM,QAAQ,YAAY,CAAC;AAAA;AAAA;AACpE,oBAAU,qBAAqB,MAAM,WAAW;AAAA;AAAA;AAChD,oBAAU;AAAA;AAAA;AAEV,qBAAW,OAAO,MAAM,WAAW;AACjC,kBAAM,MAAM,SAAI,OAAO,KAAK,IAAI,IAAI,OAAO,EAAE,CAAC,IAAI,SAAI,OAAO,KAAK,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC;AACxF,sBAAU,KAAK,IAAI,QAAQ,SAAS,GAAG,OAAO,IAAI,KAAK;AAAA;AACvD,uBAAW,SAAS,IAAI,QAAQ;AAC9B,wBAAU,OAAO,KAAK;AAAA;AAAA,YACxB;AACA,sBAAU;AAAA,UACZ;AAEA,oBAAU;AAAA,EAAmB,MAAM,UAAU;AAAA;AAE7C,sBAAY,IAAI;AAAA,YACd,MAAM;AAAA,YACN,OAAO,GAAG,MAAM,MAAM;AAAA,YACtB,QAAQ,MAAM;AAAA,YACd,UAAU;AAAA,YACV,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,UAAU,EAAE,SAAS,MAAM,SAAS,aAAa,MAAM,YAAY;AAAA,UACrE,CAAC;AAED,iBAAO,EAAE,OAAO;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,MAED,kBAAkB,KAAK;AAAA,QACrB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,OAAO,EAAE,SAAS,mCAAmC;AAAA,UACzE,aAAa,KAAK,OAAO,OAAO,EAAE,SAAS,2BAA2B;AAAA,UACtE,MAAM,KAAK,OAAO,KAAK,CAAC,aAAa,aAAa,MAAM,eAAe,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,wCAAwC;AAAA,UAC1I,SAAS,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,UACpG,eAAe,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,8DAA8D;AAAA,UACtH,QAAQ,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,4FAA4F;AAAA,UAC7I,QAAQ,KAAK,OAAO,KAAK,CAAC,WAAW,WAAW,QAAQ,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,qBAAqB;AAAA,UAC5G,eAAe,KAAK,OAAO,QAAQ,EAAE,SAAS,EAAE,SAAS,kEAAkE;AAAA,QAC7H;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,gBAAM,WAAW,YAAY,SAAS,QAAQ,SAAS;AAGvD,cAAI,KAAK,UAAU,KAAK,QAAQ;AAC9B,kBAAM,UAAU,YAAY,WAAW,QAAQ,WAAW,KAAK,QAAQ,KAAK,UAAU,QAAQ,KAAK,MAAM;AACzG,gBAAI,CAAC,QAAS,QAAO,EAAE,QAAQ,SAAS,KAAK,MAAM,eAAe;AAGlE,wBAAY,kBAAkB,QAAQ,KAAK,MAAM,KAAK,KAAK,UAAU,IAAI,MAAM,GAAG,GAAG,GAAG,KAAK,QAAQ,SAAS;AAE9G,gBAAIG,UAAS;AAAA;AAAA;AACb,YAAAA,WAAU,eAAe,KAAK,MAAM,eAAU,KAAK,UAAU,MAAM;AAAA;AACnE,gBAAI,KAAK,OAAQ,CAAAA,WAAU,eAAe,KAAK,OAAO,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA;AAGnE,gBAAI,KAAK,eAAe;AACtB,oBAAM,aAAa,KAAK,cAAc,QAAQ,OAAO,QAAQ,SAAS,KAAK,EAAE;AAC7E,oBAAM,WAAW,aAAa,YAAY,UAAU;AACpD,kBAAI,UAAU;AACZ,sBAAM,cAAwB,CAAC;AAC/B,sBAAM,YAAY,aAAa,aAAa,KAAK,eAAe,KAAK,UAAU,IAAI,WAAW;AAC9F,sBAAM,aAAa,aAAa,mBAAmB,KAAK,aAAa;AAErE,oBAAI,WAAW;AACb,wBAAME,mBAAkB,aAAa,oBAAoB,UAAU,MAAM,KAAK,eAAe,YAAY,mBAAmB,CAAC;AAE7H,kBAAAF,WAAU;AAAA;AACV,kBAAAA,WAAU,mBAAmB,UAAU,IAAI,WAAM,UAAU,WAAW;AAAA;AAAA;AAGtE,8BAAY,YAAY;AAAA,oBACtB,MAAM,KAAK,QAAQ;AAAA,oBACnB,IAAI,UAAU;AAAA,oBACd,QAAQ,KAAK;AAAA,oBACb,MAAM;AAAA,oBACN,SAAS,SAAS,KAAK,IAAI,qBAAqB,UAAU,IAAI;AAAA;AAAA;AAAA,EAAkBE,gBAAe;AAAA,kBACjG,CAAC;AAED,kBAAAF,WAAU,8BAA8B,UAAU,IAAI;AAAA;AAAA,gBACxD,OAAO;AACL,kBAAAA,WAAU;AAAA;AAAA;AAGV,wBAAM,kBAAkB,MAAM,aAAa;AAAA,oBACzC;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,YAAY,mBAAmB;AAAA,kBACjC;AACA,kBAAAA,WAAU;AAAA;AAAA,cAAuC,gBAAgB,SAAS,kBAAa,qBAAgB;AAAA;AACvG,kBAAAA,WAAU,gBAAgB,gBAAgB,OAAO;AAAA;AACjD,sBAAI,gBAAgB,OAAO,SAAS,GAAG;AACrC,oBAAAA,WAAU,gBAAgB,OAAO;AAAA,sBAAI,OACnC,MAAM,EAAE,QAAQ,KAAK,EAAE,WAAW,UAAU,EAAE,MAAM;AAAA,oBACtD,EAAE,KAAK,IAAI;AAAA,kBACb;AAAA,gBACF;AAGA,oBAAI,KAAK,WAAW,UAAU,WAAW,OAAO,GAAG;AACjD,wBAAM,aAAa,MAAM,aAAa;AAAA,oBACpC,KAAK,QAAQ;AAAA,oBACb,KAAK,UAAU;AAAA,oBACf;AAAA,oBACA,YAAY,mBAAmB;AAAA,kBACjC;AACA,sBAAI,WAAW,OAAO,SAAS,GAAG;AAChC,oBAAAA,WAAU;AAAA;AAAA;AACV,+BAAW,SAAS,WAAW,QAAQ;AACrC,sBAAAA,WAAU,MAAM,MAAM,QAAQ,KAAK,MAAM,WAAW;AAAA;AAAA,oBACtD;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAGA,gBAAI,KAAK,iBAAiB,KAAK,QAAQ;AACrC,oBAAM,aAAa,KAAK,SAAS,cAAc,OAAO,KAAK,SAAS,cAAc,cAAc;AAChG,0BAAY,YAAY;AAAA,gBACtB,MAAM,KAAK,QAAQ;AAAA,gBACnB,IAAI;AAAA,gBACJ,QAAQ,KAAK;AAAA,gBACb,MAAM;AAAA,gBACN,SAAS,8BAA8B,KAAK,MAAM;AAAA;AAAA;AAAA,EAAkB,KAAK,OAAO,MAAM,GAAG,GAAI,CAAC;AAAA,cAChG,CAAC;AACD,cAAAA,WAAU;AAAA;AAAA,gBAA4C,UAAU;AAAA;AAAA;AAAA,YAClE;AAEA,wBAAY,IAAI;AAAA,cACd,MAAM;AAAA,cACN,OAAO,KAAK;AAAA,cACZ,QAAQ,UAAK,KAAK,MAAM;AAAA,cACxB,UAAU;AAAA,cACV,SAAS;AAAA,cACT,YAAY;AAAA,YACd,CAAC;AAED,mBAAO,EAAE,QAAAA,QAAO;AAAA,UAClB;AAGA,gBAAM,OAAkB,KAAK,QAAQ,MAAM,YAAY,iBAAiB,KAAK,aAAaF,UAAS;AACnG,gBAAM,QAAQ,YAAY,SAAS,IAAI;AACvC,cAAI,CAAC,OAAO;AACV,mBAAO,EAAE,QAAQ,iBAAiB,IAAI,uDAAuD;AAAA,UAC/F;AAEA,gBAAM,oBAAoB,KAAK,WAAW,KAAK;AAG/C,gBAAM,iBAAiB,WAAW,KAAK,KAAK,WAAW,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,QAAM;AAAA,YAC7E,MAAM,EAAE,WAAW,KAAK;AAAA,YACxB,aAAa,EAAE;AAAA,YACf,OAAO,EAAE,WAAW,SAAS,MAAM,IAAI,QAAM,GAAG,GAAG,MAAM,KAAK,GAAG,WAAW,EAAE,EAAE,KAAK,IAAI;AAAA,UAC3F,EAAE;AAEF,gBAAM,OAAO,YAAY,SAAS,MAAM;AAAA,YACtC,IAAI,KAAK;AAAA,YACT,YAAY;AAAA,YACZ,aAAa,KAAK;AAAA,YAClB,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,eAAe,KAAK;AAAA,UACtB,GAAG,QAAQ,WAAW,GAAG,cAAc;AAGvC,cAAI,kBAAkB;AACtB,cAAI,KAAK,eAAe;AACtB,8BAAkB,aAAa,oBAAoB,MAAM,KAAK,eAAe,YAAY,mBAAmB,CAAC;AAAA,UAC/G;AAGA,gBAAM,kBAAkB,YAAY,YAAY,MAAM,IAAI;AAG1D,gBAAM,WAAW;AAAA,YACf,cAAc,MAAM,UAAU,aAAa,IAAI;AAAA,YAC/C,WAAW,QAAQ;AAAA,YACnB;AAAA,YACA,iBAAiB;AAAA,YACjB,iBAAiB,mBAAmB;AAAA,YACpC,iBAAiB,gBAAgB,SAAS,IAAI,gBAAgB,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,EAAE,IAAI;AAAA,YACjH,cAAc,YAAY,mBAAmB,EAAE,IAAI,QAAM,EAAE,KAAK,EAAE,KAAK,OAAO,EAAE,OAAO,WAAW,EAAE,UAAU,EAAE;AAAA,UAClH;AACA,gBAAM,iBAAiB,MAAM,aAAa,QAAQ,QAAQ;AAC1D,gBAAM,cAAc,eAAe,UAAU,eAAe,SAAS;AACrE,gBAAM,iBAAiB,eAAe,UAAU,OAAQ,eAAe,SAAS;AAEhF,cAAI,aAAa;AACf,wBAAY,WAAW,QAAQ,WAAW,KAAK,QAAQ,QAAQ,WAAW;AAC1E,wBAAY,kBAAkB,QAAQ,KAAK,MAAM,IAAI,YAAY,MAAM,GAAG,GAAG,GAAG,IAAI;AACpF,wBAAY,kBAAkB,QAAQ,KAAK,MAAM,SAAS,aAAa,IAAI;AAAA,UAC7E,OAAO;AACL,wBAAY,WAAW,QAAQ,WAAW,KAAK,QAAQ,UAAU,kBAAkB,iBAAiB;AAAA,UACtG;AAEA,cAAI,SAAS;AAAA;AAAA;AACb,oBAAU,eAAe,KAAK,MAAM;AAAA;AACpC,oBAAU,aAAa,IAAI,KAAK,MAAM,IAAI;AAAA;AAC1C,oBAAU,oBAAoB,KAAK,WAAW;AAAA;AAC9C,oBAAU,eAAe,cAAc,gBAAW,iBAAiB,kBAAa,sBAAY;AAAA;AAC5F,cAAI,aAAa;AACf,sBAAU,eAAe,YAAY,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA,UACpD,WAAW,gBAAgB;AACzB,sBAAU,cAAc,eAAe,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA,UACtD;AACA,oBAAU;AAAA;AAAA,GAA+B,MAAM,UAAU,uBAAuB,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA;AAAA;AAG7F,gBAAM,mBAAmB,aAAa,mBAAmB,QAAQ,WAAW,IAAI;AAChF,cAAI;AACJ,cAAI;AAEJ,cAAI,kBAAkB;AAEpB,6BAAiB;AACjB,yBAAa,GAAG,cAAc;AAC9B,0BAAc,SAAS,cAAc;AAAA,UACvC,OAAO;AACL,kBAAM,oBAAoB,aAAa,aAAa,IAAI;AACxD,kBAAM,kBAAkB,cAAc,oBAAoB,MAAM,CAAC,iBAAiB,CAAC;AACnF,6BAAiB,gBAAgB,SAAS,IAAI,gBAAgB,CAAC,IAAI;AACnE,yBAAa,mBAAmB,oBAAoB,GAAG,cAAc,KAAK,iBAAiB,MAAM;AAAA,UACnG;AACA,oBAAU,mBAAmB,UAAU;AAAA;AACvC,cAAI,MAAM,MAAO,WAAU,yBAAyB,MAAM,KAAK;AAAA;AAG/D,gBAAM,aAAa,cAAc,SAAS,cAAc;AACxD,cAAI,YAAY;AACd,gBAAI,WAAW,aAAa,GAAG;AAC7B,oBAAM,OAAO,WAAW,WAAW,YAAY,WAAM,WAAW,WAAW,aAAa,iBAAO;AAC/F,wBAAU,qBAAqB,IAAI,IAAI,WAAW,MAAM,mBAAmB,WAAW,cAAc,KAAK,QAAQ,CAAC,CAAC,uBAAuB,WAAW,oBAAoB,KAAK,QAAQ,CAAC,CAAC;AAAA;AAAA,YAC1L,OAAO;AACL,wBAAU;AAAA;AAAA,YACZ;AAAA,UACF;AAEA,cAAI,KAAK,eAAe;AACtB,sBAAU,uBAAuB,KAAK,aAAa;AAAA;AAAA,UACrD;AAEA,cAAI,aAAa;AACf,sBAAU;AAAA;AAAA;AAAA,EAA+B,YAAY,MAAM,GAAG,GAAI,CAAC;AAAA;AAAA;AAAA,UACrE,WAAW,gBAAgB;AACzB,sBAAU;AAAA;AAAA,EAA0B,cAAc;AAAA;AAAA,UACpD;AAEA,cAAI,gBAAgB,SAAS,GAAG;AAC9B,sBAAU;AAAA,kCAA8B,gBAAgB,MAAM;AAAA;AAC9D,uBAAW,OAAO,iBAAiB;AACjC,wBAAU,YAAY,IAAI,IAAI,OAAO,IAAI,QAAQ,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA,YAChE;AAAA,UACF;AAEA,oBAAU;AAAA,oBAAuB,SAAS,SAAS,CAAC;AAAA;AACpD,oBAAU,CAAC,GAAG,YAAY,SAAS,QAAQ,SAAS,CAAC,EAAE;AAAA,YAAI,OACzD,KAAK,EAAE,WAAW,SAAS,WAAM,EAAE,WAAW,WAAW,WAAM,QAAG,MAAM,EAAE,EAAE,aAAQ,EAAE,UAAU,KAAK,EAAE,WAAW;AAAA,UACpH,EAAE,KAAK,IAAI;AAGX,cAAI,eAAe,KAAK,eAAe;AACrC,kBAAM,aAAa,KAAK,cAAc,QAAQ,OAAO,QAAQ,SAAS,KAAK,EAAE;AAC7E,kBAAM,WAAW,aAAa,YAAY,UAAU;AACpD,gBAAI,UAAU;AACZ,oBAAM,cAAwB,CAAC;AAC/B,oBAAM,YAAY,aAAa,aAAa,KAAK,eAAe,aAAa,WAAW;AACxF,oBAAM,aAAa,aAAa,mBAAmB,KAAK,aAAa;AACrE,kBAAI,WAAW;AACb,sBAAM,UAAU,aAAa,oBAAoB,UAAU,MAAM,KAAK,eAAe,YAAY,mBAAmB,CAAC;AACrH,4BAAY,YAAY;AAAA,kBACtB,MAAM;AAAA,kBAAM,IAAI,UAAU;AAAA,kBAAM,QAAQ,KAAK;AAAA,kBAC7C,MAAM;AAAA,kBACN,SAAS,SAAS,IAAI,qBAAqB,UAAU,IAAI;AAAA;AAAA;AAAA,EAAkB,OAAO;AAAA,gBACpF,CAAC;AACD,0BAAU;AAAA;AAAA,WAAmC,UAAU,IAAI,aAAQ,UAAU,WAAW;AAAA;AAAA,cAC1F,OAAO;AACL,0BAAU;AAAA;AAAA;AAAA;AACV,sBAAM,kBAAkB,MAAM,aAAa,cAAc,eAAe,sBAAsB,YAAY,YAAY,mBAAmB,CAAC;AAC1I,0BAAU,yBAAyB,gBAAgB,SAAS,kBAAa,eAAU;AAAA;AAAA,cACrF;AAAA,YACF;AAAA,UACF;AAEA,sBAAY,IAAI;AAAA,YACd,MAAM;AAAA,YACN,OAAO,KAAK;AAAA,YACZ,QAAQ,UAAK,IAAI,KAAK,cAAc,SAAS,QAAQ;AAAA,YACrD,UAAU;AAAA,YACV,SAAS,CAAC,CAAC;AAAA,YACX,YAAY;AAAA,UACd,CAAC;AAED,iBAAO,EAAE,OAAO;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,MAED,iBAAiB,KAAK;AAAA,QACpB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,KAAK,CAAC,QAAQ,SAAS,gBAAgB,WAAW,CAAC,EAAE,SAAS,4HAA4H;AAAA,UAC9M,IAAI,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,kCAAkC;AAAA,UAC/E,QAAQ,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,yDAAyD;AAAA,UAC1G,SAAS,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,UACrF,MAAM,KAAK,OAAO,KAAK,CAAC,UAAU,kBAAkB,mBAAmB,iBAAiB,YAAY,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,UACrK,WAAW,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,mDAAmD;AAAA,QACzG;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,kBAAQ,KAAK,QAAQ;AAAA,YACnB,KAAK,QAAQ;AACX,kBAAI,CAAC,KAAK,MAAM,CAAC,KAAK,QAAS,QAAO,EAAE,QAAQ,+BAA+B;AAC/E,oBAAM,MAAM,YAAY,YAAY;AAAA,gBAClC,MAAM,QAAQ,SAAS;AAAA,gBACvB,IAAI,KAAK;AAAA,gBACT,QAAQ,KAAK,UAAU;AAAA,gBACvB,MAAM,KAAK,QAAQ;AAAA,gBACnB,SAAS,KAAK;AAAA,cAChB,CAAC;AACD,qBAAO;AAAA,gBACL,QAAQ;AAAA;AAAA,YAAmC,IAAI,IAAI;AAAA,UAAa,IAAI,EAAE;AAAA,YAAe,IAAI,IAAI;AAAA,YAAe,IAAI,EAAE;AAAA;AAAA,EAAS,IAAI,QAAQ,MAAM,GAAG,GAAG,CAAC;AAAA,cACtJ;AAAA,YACF;AAAA,YAEA,KAAK,SAAS;AACZ,oBAAM,OAAO,QAAQ,SAAS;AAC9B,oBAAM,WAAW,YAAY,YAAY,MAAM,IAAI;AACnD,kBAAI,SAAS,WAAW,EAAG,QAAO,EAAE,QAAQ,gCAAyB;AAErE,kBAAI,MAAM,uBAAgB,SAAS,MAAM;AAAA;AAAA;AACzC,yBAAW,OAAO,UAAU;AAC1B,uBAAO,KAAK,IAAI,KAAK,YAAY,CAAC,aAAa,IAAI,IAAI,SAAS,IAAI,EAAE;AAAA;AACtE,uBAAO,WAAW,IAAI,MAAM,QAAQ,IAAI,KAAK,IAAI,SAAS,EAAE,mBAAmB,CAAC;AAAA;AAChF,uBAAO,KAAK,IAAI,QAAQ,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA;AAAA,cACvC;AACA,qBAAO,EAAE,QAAQ,IAAI;AAAA,YACvB;AAAA,YAEA,KAAK,gBAAgB;AACnB,kBAAI,CAAC,KAAK,OAAQ,QAAO,EAAE,QAAQ,mBAAmB;AACtD,oBAAM,SAAS,YAAY,gBAAgB,KAAK,MAAM;AACtD,kBAAI,OAAO,WAAW,EAAG,QAAO,EAAE,QAAQ,yBAAyB,KAAK,MAAM,KAAK;AAEnF,kBAAI,MAAM,gCAAyB,KAAK,MAAM;AAAA;AAAA;AAC9C,yBAAW,OAAO,QAAQ;AACxB,sBAAM,OAAO,IAAI,SAAS,aAAa,WAAM,IAAI,SAAS,mBAAmB,cAAO,IAAI,SAAS,aAAa,cAAO;AACrH,uBAAO,GAAG,IAAI,MAAM,IAAI,IAAI,eAAU,IAAI,EAAE,OAAO,IAAI,IAAI;AAAA;AAC3D,uBAAO,KAAK,IAAI,QAAQ,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA;AAAA,cACvC;AACA,qBAAO,EAAE,QAAQ,IAAI;AAAA,YACvB;AAAA,YAEA,KAAK,aAAa;AAChB,kBAAI,CAAC,KAAK,UAAW,QAAO,EAAE,QAAQ,sBAAsB;AAC5D,oBAAM,KAAK,YAAY,SAAS,KAAK,SAAS;AAC9C,qBAAO,EAAE,QAAQ,KAAK,oBAAe,KAAK,SAAS,uBAAuB,aAAa,KAAK,SAAS,gBAAgB;AAAA,YACvH;AAAA,YAEA;AACE,qBAAO,EAAE,QAAQ,mBAAmB,KAAK,MAAM,sDAAsD;AAAA,UACzG;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MAED,eAAe,KAAK;AAAA,QAClB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,KAAK,CAAC,WAAW,QAAQ,MAAM,CAAC,EAAE,SAAS,8DAA8D;AAAA,UAC7H,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,4CAA4C;AAAA,QAC9F;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,cAAI,KAAK,WAAW,WAAW;AAC7B,kBAAM,SAAS,KAAK;AACpB,gBAAI,CAAC,OAAQ,QAAO,EAAE,QAAQ,qDAAqD;AAEnF,kBAAM,YAAY,SAAS,aAAa,QAAQ,WAAW,MAAM;AACjE,gBAAI,CAAC,WAAW,OAAQ,QAAO,EAAE,QAAQ,iCAAiC,MAAM,KAAK;AAErF,kBAAM,QAAQ,MAAM,WAAW,QAAQ;AAAA,cACrC,MAAM;AAAA,cACN,SAAS,UAAU,OAAO;AAAA,YAC5B,CAAC;AAED,gBAAI,CAAC,MAAO,QAAO,EAAE,QAAQ,wCAAwC,MAAM,2CAA2C;AAEtH,wBAAY,KAAK,UAAU,MAAM,WAAW,KAAK,IAAI,MAAM,UAAU;AAErE,mBAAO;AAAA,cACL,QAAQ;AAAA;AAAA,YAAsC,MAAM,WAAW,KAAK,IAAI;AAAA,iBAAoB,MAAM,WAAW,QAAQ,OAAO;AAAA,aAAkB,MAAM,WAAW,SAAS,MAAM,MAAM;AAAA,qBAAwB,MAAM,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,EAAgB,MAAM,WAAW,SAAS,MAAM,IAAI,OAAK,EAAE,WAAW,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,YACnU;AAAA,UACF;AAEA,cAAI,KAAK,WAAW,QAAQ;AAC1B,gBAAI,CAAC,KAAK,MAAO,QAAO,EAAE,QAAQ,0BAA0B;AAC5D,kBAAMK,UAAS,WAAW,KAAK,KAAK,KAAK;AACzC,gBAAIA,QAAO,WAAW,EAAG,QAAO,EAAE,QAAQ,wBAAwB,KAAK,KAAK,KAAK;AACjF,gBAAIH,UAAS,iCAA0B,KAAK,KAAK;AAAA;AAAA;AACjD,YAAAA,WAAUG,QAAO,IAAI,OAAK,OAAO,EAAE,WAAW,KAAK,IAAI,QAAQ,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC,cAAc,EAAE,UAAU;AAAA,eAAwB,EAAE,WAAW,QAAQ,OAAO,IAAI,EAAE,KAAK,IAAI;AAC3L,mBAAO,EAAE,QAAAH,QAAO;AAAA,UAClB;AAEA,gBAAM,SAAS,WAAW,OAAO;AACjC,cAAI,OAAO,WAAW,EAAG,QAAO,EAAE,QAAQ,wFAA0F;AAEpI,cAAI,SAAS,+BAAwB,OAAO,MAAM;AAAA;AAAA;AAClD,oBAAU,OAAO,IAAI,OAAK,OAAO,EAAE,WAAW,KAAK,IAAI,cAAS,EAAE,cAAc,KAAK,QAAQ,CAAC,CAAC,MAAM,EAAE,UAAU,QAAQ,EAAE,KAAK,IAAI;AACpI,iBAAO,EAAE,OAAO;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,MAED,eAAe,KAAK;AAAA,QAClB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,KAAK,CAAC,OAAO,OAAO,QAAQ,OAAO,CAAC,EAAE,SAAS,sDAAsD;AAAA,UACzH,MAAM,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,wDAAwD;AAAA,UACvG,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,wDAAwD;AAAA,QAC1G;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,gBAAM,cAAc,CAAC,aAAa,aAAa,MAAM,eAAe,IAAI;AAExE,cAAI,KAAK,WAAW,QAAQ;AAC1B,kBAAM,QAAQ,aAAa,uBAAuB,QAAQ,SAAS;AACnE,gBAAI,MAAM,WAAW,GAAG;AACtB,qBAAO,EAAE,QAAQ,yGAA2G;AAAA,YAC9H;AACA,gBAAI,SAAS;AACb,sBAAU;AACV,sBAAU;AACV,sBAAU,MAAM,IAAI,OAAK,OAAO,EAAE,IAAI,UAAU,EAAE,KAAK,MAAM,EAAE,KAAK,IAAI;AACxE,sBAAU;AACV,mBAAO,EAAE,OAAO;AAAA,UAClB;AAEA,cAAI,KAAK,WAAW,OAAO;AACzB,gBAAI,CAAC,KAAK,KAAM,QAAO,EAAE,QAAQ,+EAA+E;AAChH,gBAAI,CAAC,KAAK,MAAO,QAAO,EAAE,QAAQ,sEAAsE;AACxG,kBAAM,YAAY,KAAK,KAAK,YAAY;AACxC,gBAAI,CAAC,YAAY,SAAS,SAAS,GAAG;AACpC,qBAAO,EAAE,QAAQ,iBAAiB,KAAK,IAAI,mBAAmB,YAAY,KAAK,IAAI,CAAC,GAAG;AAAA,YACzF;AACA,yBAAa,mBAAmB,QAAQ,WAAW,WAAW,KAAK,KAAK;AAExE,0BAAc,SAAS,KAAK,KAAK;AACjC,0BAAc,cAAc,WAAW,CAAC,KAAK,KAAK,CAAC;AACnD,mBAAO,EAAE,QAAQ,kCAA6B,SAAS,eAAU,KAAK,KAAK;AAAA,uDAA4D,SAAS,yBAAyB;AAAA,UAC3K;AAEA,cAAI,KAAK,WAAW,OAAO;AACzB,gBAAI,CAAC,KAAK,KAAM,QAAO,EAAE,QAAQ,gDAAgD;AACjF,kBAAM,QAAQ,aAAa,mBAAmB,QAAQ,WAAW,KAAK,IAAI;AAC1E,gBAAI,CAAC,OAAO;AACV,qBAAO,EAAE,QAAQ,qCAAqC,KAAK,IAAI,kDAAkD;AAAA,YACnH;AACA,mBAAO,EAAE,QAAQ,KAAK,KAAK,IAAI,eAAU,KAAK,KAAK;AAAA,UACrD;AAEA,cAAI,KAAK,WAAW,SAAS;AAC3B,yBAAa,qBAAqB,QAAQ,WAAW,KAAK,IAAI;AAC9D,gBAAI,KAAK,MAAM;AACb,qBAAO,EAAE,QAAQ,sCAAsC,KAAK,IAAI,KAAK;AAAA,YACvE;AACA,mBAAO,EAAE,QAAQ,kDAAkD;AAAA,UACrE;AAEA,iBAAO,EAAE,QAAQ,wDAAwD;AAAA,QAC3E;AAAA,MACF,CAAC;AAAA,MAED,qBAAqB,KAAK;AAAA,QACxB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,KAAK,CAAC,SAAS,eAAe,WAAW,CAAC,EAAE,SAAS,2FAA2F;AAAA,UACpK,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,0CAA0C;AAAA,UAC1F,WAAW,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,QACvG;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,cAAI,KAAK,WAAW,SAAS;AAC3B,gBAAI,CAAC,KAAK,MAAO,QAAO,EAAE,QAAQ,mDAAmD;AAErF,kBAAM,cAAc,cAAc,SAAS,KAAK,KAAK;AACrD,0BAAc,WAAW,KAAK,KAAK;AACnC,kBAAM,aAAa,cAAc,SAAS,KAAK,KAAK;AAEpD,mBAAO;AAAA,cACL,QAAQ,uCAAkC,KAAK,KAAK;AAAA;AAAA,cAAqB,cAAc,IAAI,YAAY,cAAc,KAAK,QAAQ,CAAC,CAAC,kBAAkB,YAAY,UAAU,WAAW,SAAS;AAAA,aAAgB,aAAa,IAAI,WAAW,cAAc,KAAK,QAAQ,CAAC,CAAC,kBAAkB,WAAW,UAAU,WAAW,aAAa;AAAA,YAC1U;AAAA,UACF;AAEA,cAAI,KAAK,WAAW,eAAe;AACjC,kBAAM,YAAY,KAAK,aAAa;AACpC,kBAAM,cAAc,cAAc,iBAAiB,SAAS;AAE5D,gBAAI,YAAY,WAAW,GAAG;AAC5B,qBAAO,EAAE,QAAQ,qCAAqC,SAAS,iBAAiB;AAAA,YAClF;AAEA,mBAAO,EAAE,QAAQ,gBAAW,YAAY,MAAM;AAAA,EAAqB,YAAY,IAAI,OAAK,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,oCAAyC,SAAS,UAAU;AAAA,UAC9K;AAEA,cAAI,KAAK,WAAW,aAAa;AAC/B,kBAAM,YAAY,cAAc,aAAa;AAC7C,uBAAW,SAAS,WAAW;AAC7B,4BAAc,WAAW,MAAM,KAAK;AAAA,YACtC;AACA,mBAAO,EAAE,QAAQ,4DAAkD,UAAU,MAAM;AAAA;AAAA,6EAA4F;AAAA,UACjL;AAEA,iBAAO,EAAE,QAAQ,8DAA8D;AAAA,QACjF;AAAA,MACF,CAAC;AAAA,MAED,kBAAkB,KAAK;AAAA,QACrB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,KAAK,CAAC,UAAU,UAAU,OAAO,CAAC,EAAE,SAAS,kFAAkF;AAAA,UACnJ,OAAO,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,QACtF;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,cAAI,KAAK,WAAW,UAAU;AAC5B,gBAAI,CAAC,KAAK,MAAO,QAAO,EAAE,QAAQ,0BAA0B;AAG5D,kBAAM,cAAc,cAAc,UAAU,EAAE;AAC9C,uBAAW,MAAM,aAAa;AAC5B,0BAAY,YAAY,MAAM,GAAG,SAAS,IAAI,GAAG,GAAG,QAAQ,IAAI,GAAG,OAAO,IAAI,GAAG,UAAU,KAAK,GAAG,CAAC,IAAI;AAAA,gBACtG,MAAM;AAAA,gBACN,WAAW,GAAG;AAAA,gBACd,SAAS,GAAG;AAAA,gBACZ,MAAM,CAAC;AAAA,cACT,CAAC;AAAA,YACH;AACA,kBAAM,gBAAgB,MAAM,YAAY,eAAe,KAAK,OAAO,CAAC;AACpE,kBAAM,WAAW,YAAY,OAAO,OAAK,cAAc,KAAK,OAAK,EAAE,OAAO,MAAM,EAAE,SAAS,EAAE,CAAC;AAC9F,gBAAI,SAAS,WAAW,EAAG,QAAO,EAAE,QAAQ,0BAA0B,KAAK,KAAK,KAAK;AACrF,gBAAI,SAAS,wCAAiC,KAAK,KAAK;AAAA;AAAA;AACxD,sBAAU,SAAS;AAAA,cAAI,OACrB,OAAO,EAAE,YAAY,YAAY,WAAM,EAAE,YAAY,YAAY,iBAAO,QAAG,IAAI,EAAE,QAAQ;AAAA,WAAgB,cAAc,KAAK,OAAK,EAAE,OAAO,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,KAAK,GAAG,aAAa,EAAE,aAAa,MAAM,MAAM,EAAE,UAAU,MAAM,GAAG,EAAE,CAAC;AAAA,YACzP,EAAE,KAAK,IAAI;AACX,mBAAO,EAAE,OAAO;AAAA,UAClB;AAEA,cAAI,KAAK,WAAW,UAAU;AAC5B,kBAAM,WAAW,cAAc,UAAU,EAAE;AAC3C,gBAAI,SAAS,WAAW,EAAG,QAAO,EAAE,QAAQ,0BAA0B;AACtE,gBAAI,SAAS;AAAA;AAAA;AACb,sBAAU,SAAS;AAAA,cAAI,OACrB,KAAK,EAAE,UAAU,MAAM,GAAG,EAAE,CAAC,aAAQ,EAAE,QAAQ,YAAY,CAAC,OAAO,EAAE,SAAS,MAAM,GAAG,EAAE,CAAC;AAAA,YAC5F,EAAE,KAAK,IAAI;AACX,mBAAO,EAAE,OAAO;AAAA,UAClB;AAEA,gBAAM,QAAQ,cAAc,SAAS;AACrC,iBAAO;AAAA,YACL,QAAQ;AAAA;AAAA,sBAA8C,MAAM,KAAK;AAAA,kBAAqB,MAAM,UAAU;AAAA,eAAkB,MAAM,OAAO;AAAA,cAAiB,MAAM,MAAM;AAAA;AAAA,gBAAqB,MAAM,QAAQ,KAAM,MAAM,aAAa,MAAM,QAAS,KAAK,QAAQ,CAAC,IAAI,CAAC;AAAA,UAClQ;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MAED,kBAAkB,KAAK;AAAA,QACrB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,KAAK,CAAC,WAAW,SAAS,CAAC,EAAE,SAAS,EAAE,SAAS,qFAAqF;AAAA,UAC1J,cAAc,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,gEAAgE;AAAA,UACvH,gBAAgB,KAAK,OAAO,QAAQ,EAAE,SAAS,EAAE,SAAS,uDAAuD;AAAA,QACnH;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,gBAAM,UAAU,aAAa,YAAY,QAAQ,SAAS;AAC1D,cAAI,CAAC,QAAQ,KAAM,QAAO,EAAE,QAAQ,uDAAuD;AAE3F,gBAAM,WAAW,QAAQ,KAAK,OAAO;AACrC,gBAAM,YAAY,SAAS,kBAAkB,QAAQ,SAAS;AAC9D,gBAAM,OAAO,aAAa,mBAAmB,QAAQ;AAErD,cAAI,KAAK,WAAW,WAAW;AAC7B,kBAAM,aAAa,SAAS;AAAA,cAAO,OACjC,CAAC,UAAU,SAAS,EAAE,EAAE,KACxB,EAAE,UAAU,MAAM,OAAK,UAAU,SAAS,CAAC,CAAC;AAAA,YAC9C;AACA,gBAAI,WAAW,WAAW,GAAG;AAC3B,qBAAO,EAAE,QAAQ,wFAAwF;AAAA,YAC3G;AAEA,kBAAM,MAAM,OAAO,OAAO;AAE1B,gBAAI;AACJ,gBAAI,KAAK,cAAc;AACrB,2BAAa,CAAC,SAAS,aAAa,2BAA2B,MAAM,KAAK,cAAe,KAAK,QAAQ,SAAS;AAAA,YACjH,OAAO;AACL,2BAAa,aAAa,cAAc;AAAA,gBACtC,WAAAF;AAAA,gBACA,YAAY;AAAA,gBACZ,UAAU,QAAQ,KAAK,OAAO;AAAA,gBAC9B,WAAW,QAAQ;AAAA,cACrB,CAAC;AAAA,YACH;AAEA,kBAAM,EAAE,SAAS,WAAW,IAAI,MAAM,aAAa;AAAA,cACjD;AAAA,cAAM;AAAA,cAAY,KAAK,kBAAkB;AAAA,YAC3C;AAEA,uBAAW,KAAK,SAAS;AACvB,uBAAS,aAAa,QAAQ,WAAW;AAAA,gBACvC,QAAQ,EAAE;AAAA,gBACV,SAAS,EAAE;AAAA,gBACX,QAAQ,EAAE,UAAU;AAAA,gBACpB,eAAe,EAAE;AAAA,gBACjB,OAAO,EAAE;AAAA,cACX,CAAC;AAAA,YACH;AAEA,wBAAY,IAAI;AAAA,cACd,MAAM;AAAA,cACN,OAAO,GAAG,WAAW,MAAM;AAAA,cAC3B,QAAQ,GAAG,QAAQ,OAAO,OAAK,EAAE,OAAO,EAAE,MAAM,IAAI,QAAQ,MAAM;AAAA,cAClE,UAAU;AAAA,cACV,SAAS,QAAQ,MAAM,OAAK,EAAE,OAAO;AAAA,cACrC;AAAA,cACA,UAAU,EAAE,OAAO,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,OAAK,EAAE,OAAO,EAAE,OAAO;AAAA,YACnF,CAAC;AAED,gBAAIE,UAAS,2CAAsC,aAAa,KAAM,QAAQ,CAAC,CAAC;AAAA;AAAA;AAChF,YAAAA,WAAU,uBAAuB,WAAW,MAAM;AAAA;AAClD,YAAAA,WAAU,eAAe,QAAQ,OAAO,OAAK,EAAE,OAAO,EAAE,MAAM;AAAA;AAC9D,YAAAA,WAAU,eAAe,QAAQ,OAAO,OAAK,CAAC,EAAE,OAAO,EAAE,MAAM;AAAA;AAAA;AAE/D,uBAAW,KAAK,SAAS;AACvB,oBAAM,OAAO,EAAE,UAAU,WAAM;AAC/B,cAAAA,WAAU,GAAG,IAAI,MAAM,EAAE,MAAM,aAAQ,EAAE,QAAQ,MAAM,GAAG,GAAG,KAAK,WAAW;AAAA;AAC7E,kBAAI,EAAE,MAAO,CAAAA,WAAU,aAAa,EAAE,MAAM,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA,YAC3D;AAEA,kBAAM,WAAW,SAAS,YAAY,QAAQ,SAAS;AACvD,YAAAA,WAAU;AAAA;AAAA;AACV,YAAAA,WAAU,UAAK,SAAS,SAAS,IAAI,SAAS,KAAK,aAAQ,SAAS,MAAM,aAAQ,SAAS,QAAQ,SAAS,YAAY,SAAS,MAAM;AAEvI,mBAAO,EAAE,QAAAA,SAAQ,UAAU,EAAE,SAAS,WAAW,EAAE;AAAA,UACrD;AAGA,cAAI,SAAS;AAAA;AAAA;AACb,oBAAU,wBAAwB,KAAK,cAAc;AAAA;AACrD,oBAAU,eAAe,KAAK,OAAO,MAAM;AAAA;AAAA;AAE3C,oBAAU;AAAA;AAAA;AACV,qBAAW,SAAS,KAAK,QAAQ;AAC/B,kBAAM,UAAU,MAAM,MAAM,IAAI,OAAK,EAAE,EAAE,EAAE,KAAK,IAAI;AACpD,sBAAU,KAAK,MAAM,QAAQ,CAAC,MAAM,OAAO,MAAM,MAAM,mBAAmB,WAAM,WAAI;AAAA;AAAA,UACtF;AAEA,gBAAM,cAAc,aAAa,qBAAqB,UAAU,SAAS;AACzE,cAAI,YAAY,SAAS,GAAG;AAC1B,sBAAU;AAAA;AAAA;AACV,kBAAM,SAAS,oBAAI,IAAsB;AACzC,uBAAW,KAAK,aAAa;AAC3B,oBAAM,OAAO,OAAO,IAAI,EAAE,aAAa,KAAK,CAAC;AAC7C,mBAAK,KAAK,EAAE,MAAM;AAClB,qBAAO,IAAI,EAAE,eAAe,IAAI;AAAA,YAClC;AACA,uBAAW,CAAC,OAAO,KAAK,KAAK,QAAQ;AACnC,oBAAM,QAAQ,MAAM,SAAS,IAAI,4BAAqB,KAAK,KAAK;AAChE,wBAAU,OAAO,KAAK,OAAO,MAAM,IAAI,OAAK,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,YACpE;AACA,sBAAU;AAAA;AAAA,UACZ;AAEA,gBAAM,WAAW,oBAAI,IAAsB;AAC3C,qBAAW,QAAQ,UAAU;AAC3B,kBAAM,YAAY,SAAS,aAAa,QAAQ,WAAW,KAAK,EAAE;AAClE,gBAAI,WAAW,QAAQ,eAAe;AACpC,uBAAS,IAAI,KAAK,IAAI,UAAU,OAAO,aAAa;AAAA,YACtD;AAAA,UACF;AACA,gBAAM,YAAY,aAAa;AAAA,YAC7B,YAAY,IAAI,OAAK,EAAE,MAAM;AAAA,YAC7B;AAAA,UACF;AACA,cAAI,UAAU,SAAS,GAAG;AACxB,sBAAU;AAAA;AAAA;AACV,uBAAW,KAAK,WAAW;AACzB,wBAAU,OAAO,EAAE,KAAK,qBAAW,EAAE,KAAK,mBAAmB,EAAE,eAAe;AAAA;AAAA,YAChF;AAAA,UACF;AAEA,iBAAO,EAAE,OAAO;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,MAED,mBAAmB,KAAK;AAAA,QACtB,aAAa;AAAA,QACb,MAAM,CAAC;AAAA,QACP,MAAM,QAAQ,MAAM,UAAU;AAE5B,gBAAM,mBAAmB,cAAc,WAAW;AAClD,cAAI,eAAe;AAGnB,gBAAM,YAAY,MAAM;AACxB,gBAAM,YAAY,GAAG,QAAQ;AAC7B,cAAI,SAAS,CAAC;AACd,cAAI;AACF,kBAAM,UAAUH,cAAa,WAAW,OAAO;AAC/C,qBAAS,QAAQ,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO,EAAE,IAAI,OAAK,KAAK,MAAM,CAAC,CAAC;AAAA,UAC5E,QAAQ;AAAA,UAAsB;AAE9B,cAAI,OAAO,SAAS,GAAG;AACrB,kBAAM,OAAO,UAAU,SAAS,QAAQ,KAAK,IAAI,CAAC;AAClD,2BAAe,UAAU,iBAAiB,IAAI;AAAA,UAChD;AAEA,cAAI,SAAS,gBAAgB;AAC7B,oBAAU;AAAA;AAAA,EAA+B,gBAAgB;AAAA;AAGzD,gBAAM,cAAc,cAAc,UAAU,GAAG;AAC/C,cAAI,YAAY,UAAU,GAAG;AAC3B,kBAAM,iBAAiB,CAAC;AACxB,kBAAM,YAAY,WAAW,OAAO,EAAE,IAAI,QAAM;AAAA,cAC9C,MAAM,EAAE,WAAW,KAAK;AAAA,cACxB,aAAa,EAAE;AAAA,cACf,YAAY,EAAE;AAAA,YAChB,EAAE;AACF,kBAAM,SAAS,iBAAiB,QAAQ,aAAa,CAAC,GAAG,SAAS;AAElE,gBAAI,OAAO,cAAc,SAAS,KAAK,OAAO,gBAAgB,SAAS,GAAG;AACxE,wBAAU;AAAA,wCAAoC,OAAO,aAAa;AAAA;AAElE,kBAAI,OAAO,cAAc,SAAS,GAAG;AACnC,0BAAU;AAAA;AAAA;AACV,2BAAW,MAAM,OAAO,cAAc,MAAM,GAAG,CAAC,GAAG;AACjD,4BAAU,OAAO,GAAG,QAAQ,OAAO,GAAG,YAAY,IAAI,OAAO,aAAa,eAAe,GAAG,kBAAkB,KAAK,QAAQ,CAAC,CAAC;AAAA;AAAA,gBAC/H;AAAA,cACF;AAEA,kBAAI,OAAO,aAAa,KAAK,OAAK,EAAE,SAAS,GAAG;AAC9C,0BAAU;AAAA;AAAA;AACV,2BAAW,MAAM,OAAO,aAAa,OAAO,OAAK,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG;AACzE,4BAAU,OAAO,GAAG,QAAQ,mBAAmB,GAAG,YAAY;AAC9D,sBAAI,GAAG,eAAe,SAAS,GAAG;AAChC,8BAAU,iBAAiB,GAAG,eAAe,MAAM,GAAG,CAAC,EAAE,IAAI,OAAK,KAAK,EAAE,QAAQ,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,kBACnG;AACA,4BAAU;AAAA,gBACZ;AAAA,cACF;AAEA,kBAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,sBAAM,WAAW,OAAO,gBAAgB,OAAO,OAAK,EAAE,aAAa,MAAM;AACzE,oBAAI,SAAS,SAAS,GAAG;AACvB,4BAAU;AAAA;AAAA;AACV,6BAAW,OAAO,SAAS,MAAM,GAAG,CAAC,GAAG;AACtC,8BAAU,KAAK,IAAI,WAAW;AAAA;AAAA,kBAChC;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAGA,gBAAM,YAAY,cAAc,aAAa;AAC7C,cAAI,UAAU,aAAa,KAAK,UAAU,mBAAmB,GAAG;AAC9D,sBAAU;AAAA;AAAA;AACV,sBAAU,cAAc,aAAa,KAAK;AAAA,UAC5C;AAEA,iBAAO,EAAE,OAAO;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,MAED,eAAe,KAAK;AAAA,QAClB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,OAAO,EAAE,SAAS,oCAAoC;AAAA,QAC5E;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,gBAAM,YAAY,SAAS,aAAa,QAAQ,WAAW,KAAK,MAAM;AACtE,cAAI,CAAC,WAAW,OAAQ,QAAO,EAAE,QAAQ,iCAAiC,KAAK,MAAM,KAAK;AAE1F,gBAAM,SAAS,UAAU,OAAO;AAChC,gBAAM,QAAQ,SAAS,oBAAoB,QAAQ,SAAS;AAC5D,gBAAM,QAAQ,mBAAmB,MAAM,QAAQ,KAAK;AAEpD,cAAI,CAAC,MAAM,QAAQ;AACjB,0BAAc,oBAAoBC,WAAU,gBAAgB,CAAC;AAAA,UAC/D;AAEA,cAAI,WAAW,iDAAqC,KAAK,MAAM;AAAA;AAAA;AAC/D,sBAAY,gBAAgB,MAAM,SAAS,+BAA0B,gCAA2B;AAAA;AAAA;AAChG,sBAAY,gBAAgB,MAAM,OAAO;AAAA;AAAA;AAEzC,cAAI,MAAM,OAAO,SAAS,GAAG;AAC3B,wBAAY;AAAA;AAAA;AACZ,wBAAY;AAAA;AAAA;AACZ,uBAAW,KAAK,MAAM,OAAO,MAAM,GAAG,EAAE,GAAG;AACzC,oBAAM,OAAO,EAAE,WAAW,WAAM;AAChC,0BAAY,KAAK,IAAI,IAAI,EAAE,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,MAAM,EAAE,UAAU,GAAG;AAAA;AAAA,YAChF;AAAA,UACF;AAEA,cAAI,CAAC,MAAM,QAAQ;AACjB,wBAAY;AAAA;AAAA;AACZ,wBAAY;AAAA;AACZ,uBAAW,KAAK,MAAM,OAAO,OAAO,CAAAM,OAAK,CAACA,GAAE,QAAQ,GAAG;AACrD,0BAAY,MAAM,EAAE,KAAK,qBAAgB,EAAE,QAAQ,YAAY,EAAE,MAAM;AAAA;AAAA,YACzE;AACA,wBAAY;AAAA;AAAA,UACd;AAEA,sBAAY;AAAA;AAAA;AACZ,gBAAM,aAAa,cAAc,SAASN,WAAU,gBAAgB,CAAC;AACrE,cAAI,cAAc,WAAW,aAAa,GAAG;AAC3C,kBAAM,OAAO,WAAW,WAAW,YAAY,WAAM,WAAW,WAAW,aAAa,iBAAO;AAC/F,wBAAY,GAAG,IAAI,MAAM,WAAW,KAAK,2BAAsB,WAAW,cAAc,KAAK,QAAQ,CAAC,CAAC,uBAAuB,WAAW,oBAAoB,KAAK,QAAQ,CAAC,CAAC,aAAa,WAAW,UAAU;AAAA;AAAA,UAChN,OAAO;AACL,wBAAY;AAAA;AAAA,UACd;AAEA,sBAAY,IAAI;AAAA,YACd,MAAM,SAAS,KAAK,MAAM;AAAA,YAC1B,OAAO,KAAK;AAAA,YACZ,QAAQ,MAAM;AAAA,YACd,UAAU;AAAA,YACV,SAAS,MAAM;AAAA,YACf,YAAY;AAAA,UACd,CAAC;AAED,iBAAO,EAAE,QAAQ,SAAS;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,MAED,gBAAgB,KAAK;AAAA,QACnB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,QAAQ,KAAK,OAAO,KAAK,CAAC,WAAW,iBAAiB,gBAAgB,iBAAiB,UAAU,eAAe,eAAe,kBAAkB,mBAAmB,sBAAsB,CAAC,EAAE,SAAS,4MAA4M;AAAA,UAClZ,MAAM,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,2DAA2D;AAAA,UAC1G,QAAQ,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,0FAA0F;AAAA,UAC3I,OAAO,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,gCAAgC;AAAA,UACnG,SAAS,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,+BAA+B;AAAA,UACjF,MAAM,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,4EAA4E;AAAA,UAC3H,SAAS,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,UACxF,aAAa,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,qDAAqD;AAAA,UAC3G,QAAQ,KAAK,OAAO,KAAK,CAAC,UAAU,cAAc,CAAC,EAAE,SAAS,EAAE,SAAS,6EAA6E;AAAA,UACtJ,gBAAgB,KAAK,OAAO,OAAO,EAAE,SAAS,EAAE,SAAS,gFAAgF;AAAA,QAC3I;AAAA,QACA,MAAM,QAAQ,MAAM,UAAU;AAC5B,kBAAQ,KAAK,QAAQ;AAAA,YACnB,KAAK,WAAW;AACd,oBAAM,UAAU,aAAa,cAAc;AAC3C,oBAAM,SAAS,aAAa,aAAa;AACzC,oBAAM,aAAa,cAAc,cAAc;AAE/C,kBAAI,MAAM;AAAA;AAAA;AACV,qBAAO,8BAA8B,oBAAoB,eAAe,CAAC;AAAA;AACzE,qBAAO,8BAA8B,WAAW,MAAM;AAAA;AAAA;AACtD,qBAAO,uBAAuB,QAAQ,MAAM;AAAA;AAC5C,yBAAW,KAAK,SAAS;AACvB,uBAAO,OAAO,EAAE,IAAI,SAAS,EAAE,IAAI,cAAS,EAAE,MAAM,MAAM;AAAA;AAAA,cAC5D;AACA,kBAAI,OAAO,SAAS,GAAG;AACrB,uBAAO;AAAA,oBAAuB,OAAO,MAAM;AAAA;AAC3C,2BAAW,KAAK,QAAQ;AACtB,yBAAO,OAAO,EAAE,IAAI,SAAS,EAAE,IAAI,cAAS,EAAE,MAAM,MAAM;AAAA;AAAA,gBAC5D;AAAA,cACF;AACA,qBAAO;AAAA;AAAA;AACP,qBAAO;AAAA;AACP,qBAAO;AAAA;AACP,qBAAO;AAAA;AACP,qBAAO,EAAE,QAAQ,IAAI;AAAA,YACvB;AAAA,YAEA,KAAK,iBAAiB;AACpB,kBAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,QAAQ;AAC9B,uBAAO,EAAE,QAAQ,mEAAmE;AAAA,cACtF;AACA,oBAAM,SAAS,KAAK,KAAK,YAAY,EAAE,QAAQ,QAAQ,GAAG;AAC1D,2BAAa,eAAe;AAAA,gBAC1B,MAAM;AAAA,gBACN,MAAM,KAAK;AAAA,gBACX,QAAQ,KAAK;AAAA,gBACb,OAAO,KAAK,SAAS,CAAC,QAAQ,QAAQ,SAAS,MAAM;AAAA,cACvD,CAAC;AACD,qBAAO,EAAE,QAAQ,gBAAgB,KAAK,IAAI,qBAAqB,MAAM,6CAA6C,MAAM,MAAM;AAAA,YAChI;AAAA,YAEA,KAAK,gBAAgB;AACnB,oBAAM,UAAU,KAAK;AACrB,oBAAM,YAAY;AAAA,gBAChB,KAAK,QAAQ;AAAA,gBACb,KAAK,QAAQ;AAAA,gBACb,KAAK,SAAS,CAAC;AAAA,gBACf,CAAC,EAAE,QAAQ,aAAa,aAAa,KAAK,QAAQ,QAAQ,gBAAgB,YAAY,CAAC;AAAA,cACzF;AAEA,oBAAM,OAAO,eAAe,SAAS;AACrC,oBAAM,aAAa,aAAa,SAAS;AAEzC,kBAAI,MAAM;AACV,qBAAO;AAAA;AAAA;AAAA;AAAA,EAAmE,IAAI;AAAA;AAC9E,qBAAO,EAAE,QAAQ,IAAI;AAAA,YACvB;AAAA,YAEA,KAAK,iBAAiB;AACpB,kBAAI,MAAM,+BAAwB,oBAAoB,eAAe,CAAC;AAAA;AAAA;AACtE,qBAAO;AAAA;AAAA,EAAkC,KAAK,UAAU,qBAAqB,EAAE,SAAS,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA;AACpH,qBAAO;AAAA;AACP,oBAAM,aAAa,cAAc,cAAc;AAC/C,kBAAI,WAAW,WAAW,GAAG;AAC3B,uBAAO,yCAAyC,oBAAoB,eAAe,CAAC;AAAA;AAAA,cACtF,OAAO;AACL,2BAAW,KAAK,YAAY;AAC1B,yBAAO,MAAM,EAAE,IAAI,YAAO,EAAE,EAAE,KAAK,EAAE,WAAW;AAAA;AAAA,gBAClD;AAAA,cACF;AACA,qBAAO;AAAA;AAAA;AACP,qBAAO;AAAA;AACP,qBAAO;AAAA;AACP,qBAAO;AAAA;AAAA;AACP,qBAAO;AAAA;AACP,qBAAO,EAAE,QAAQ,IAAI;AAAA,YACvB;AAAA,YAEA,KAAK,UAAU;AACb,oBAAM,YAAY,MAAM;AAExB,oBAAM,YAAY,WAAW,OAAO;AACpC,oBAAM,cAAc,cAAc,UAAU,EAAE;AAE9C,oBAAM,iBAAiB,IAAI,IAAI,YAAY,IAAI,OAAK,EAAE,SAAS,CAAC;AAChE,kBAAI,WAAwB,CAAC;AAC7B,yBAAW,OAAO,gBAAgB;AAChC,2BAAW,SAAS,OAAO,YAAY,SAAS,GAAG,CAAC;AAAA,cACtD;AAEA,oBAAM,gBAA6E,CAAC;AACpF,yBAAW,OAAO,gBAAgB;AAChC,sBAAM,UAAU,aAAa,YAAY,GAAG;AAC5C,sBAAM,WAAW,QAAQ,MAAM,OAAO,YAAY,CAAC;AACnD,2BAAW,QAAQ,UAAU;AAC3B,wBAAM,QAAQ,SAAS,aAAa,KAAK,KAAK,EAAE;AAChD,sBAAI,OAAO,QAAQ;AACjB,kCAAc,KAAK;AAAA,sBACjB,QAAQ,KAAK;AAAA,sBACb,SAAS,MAAM,OAAO;AAAA,sBACtB,QAAQ,MAAM,OAAO;AAAA,oBACvB,CAAC;AAAA,kBACH;AAAA,gBACF;AAAA,cACF;AAEA,kBAAI,SAAsE,CAAC;AAC3E,oBAAM,YAAY,GAAG,QAAQ;AAC7B,kBAAI;AACF,sBAAM,UAAUD,cAAa,WAAW,OAAO;AAC/C,2BAAW,QAAQ,QAAQ,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO,GAAG;AAC7D,wBAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,yBAAO,KAAK;AAAA,oBACV,UAAU,OAAO,YAAY;AAAA,oBAC7B,SAAS,OAAO,WAAW;AAAA,oBAC3B,MAAM,OAAO,QAAQ;AAAA,kBACvB,CAAC;AAAA,gBACH;AAAA,cACF,QAAQ;AAAA,cAAsB;AAE9B,0BAAY,WAAW,SAAS;AAChC,0BAAY,aAAa,WAAW;AACpC,0BAAY,UAAU,QAAQ;AAC9B,0BAAY,eAAe,aAAa;AACxC,0BAAY,WAAW,MAAM;AAE7B,oBAAM,SAAS,YAAY,OAAO;AAGlC,oBAAM,eAAyB,CAAC;AAChC,yBAAW,QAAQ,OAAO,iBAAiB;AACzC,oBAAI;AACF,8BAAY,mBAAmB;AAAA,oBAC7B,MAAM,KAAK;AAAA,oBACX,MAAM,KAAK;AAAA,oBACX,OAAO,KAAK;AAAA,oBACZ,QAAQ,WAAW,KAAK,IAAI,KAAK,KAAK,MAAM;AAAA;AAAA,WAAgB,KAAK,cAAc;AAAA,kBACjF,CAAC;AACD,+BAAa,KAAK,KAAK,IAAI;AAAA,gBAC7B,QAAQ;AAAA,gBAAE;AAAA,cACZ;AAGA,oBAAM,gBAA0B,CAAC;AACjC,yBAAW,SAAS,OAAO,cAAc;AACvC,sBAAM,SAAS,WAAW,QAAQ,MAAM,OAAO;AAC/C,oBAAI,CAAC,OAAQ;AACb,sBAAM,MAAM,OAAO;AACnB,oBAAI,WAAW;AAEf,2BAAW,UAAU,MAAM,kBAAkB;AAC3C,sBAAI,OAAO,SAAS,gBAAgB;AAClC,+BAAW,QAAQ,IAAI,SAAS,OAAO;AACrC,0BAAI,CAAC,KAAK,UAAU;AAClB,6BAAK,WAAW,OAAO;AACvB,mCAAW;AAAA,sBACb;AAAA,oBACF;AAAA,kBACF;AACA,sBAAI,OAAO,SAAS,YAAY;AAC9B,0BAAM,UAAwD;AAAA,sBAC5D,OAAO,IAAI,SAAS,MAAM,SAAS;AAAA,sBACnC,QAAQ;AAAA,sBACR,aAAa,OAAO;AAAA,sBACpB,gBAAgB;AAAA,oBAClB;AACA,wBAAI,SAAS,MAAM,KAAK,OAAO;AAC/B,+BAAW;AAAA,kBACb;AAAA,gBACF;AAEA,oBAAI,UAAU;AACZ,sBAAI,QAAQ,aAAa,OAAO;AAChC,sBAAI,QAAQ,cAAc,OAAO;AACjC,sBAAI,MAAM,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAChD,sBAAI,MAAM,aAAa;AACvB,sBAAI,KAAK;AACT,8BAAY,KAAK,UAAU,IAAI,KAAK,IAAI,GAAG;AAC3C,gCAAc,KAAK,MAAM,SAAS;AAAA,gBACpC;AAAA,cACF;AAEA,kBAAI,MAAM;AAAA;AAAA;AACV,qBAAO,0BAA0B,OAAO,gBAAgB;AAAA;AACxD,qBAAO,0BAA0B,OAAO,QAAQ,aAAa;AAAA;AAC7D,qBAAO,uBAAuB,OAAO,QAAQ,UAAU;AAAA;AACvD,qBAAO,8BAA8B,OAAO,QAAQ,cAAc,KAAK,QAAQ,CAAC,CAAC;AAAA;AACjF,qBAAO,oBAAoB,OAAO,QAAQ,YAAY,KAAK,QAAQ,CAAC,CAAC;AAAA;AAAA;AAErE,kBAAI,aAAa,SAAS,GAAG;AAC3B,uBAAO;AAAA;AACP,2BAAW,QAAQ,cAAc;AAC/B,yBAAO,OAAO,IAAI;AAAA;AAAA,gBACpB;AACA,uBAAO;AAAA;AAAA,cACT;AAGA,oBAAM,iBAA2B,CAAC;AAClC,yBAAW,SAAS,OAAO,eAAe;AACxC,oBAAI;AACF,wBAAM,iBAAiB,aAAa,UAAU,MAAM,IAAI;AACxD,sBAAI,kBAAkB,CAAC,eAAe,SAAS,MAAM,YAAY,MAAM,GAAG,EAAE,CAAC,GAAG;AAC9E,0BAAM,YAAY,iBAAiB;AAAA;AAAA,oCAAyC,MAAM,aAAa;AAAA,EAAa,MAAM,WAAW;AAC7H,iCAAa,aAAa,MAAM,MAAiE,WAAW,eAAe,cAAc,MAAM,aAAa,YAAY,MAAM,WAAW,IAAI;AAC7L,gCAAY,KAAK,WAAW,SAAS,aAAa,mBAAmB,CAAC;AACtE,mCAAe,KAAK,GAAG,MAAM,IAAI,MAAM,MAAM,YAAY,MAAM,GAAG,EAAE,CAAC,MAAM;AAAA,kBAC7E;AAAA,gBACF,QAAQ;AAAA,gBAAkB;AAAA,cAC5B;AAEA,kBAAI,cAAc,SAAS,GAAG;AAC5B,uBAAO;AAAA;AACP,2BAAW,QAAQ,eAAe;AAChC,yBAAO,OAAO,IAAI;AAAA;AAAA,gBACpB;AACA,uBAAO;AAAA;AAAA,cACT;AAEA,kBAAI,eAAe,SAAS,GAAG;AAC7B,uBAAO;AAAA;AACP,2BAAW,KAAK,gBAAgB;AAC9B,yBAAO,KAAK,CAAC;AAAA;AAAA,gBACf;AACA,uBAAO;AAAA;AAAA,cACT;AAEA,qBAAO;AAAA;AACP,kBAAI,OAAO,QAAQ,gBAAgB,WAAW,GAAG;AAC/C,uBAAO;AAAA;AAAA,cACT,OAAO;AACL,2BAAW,OAAO,OAAO,QAAQ,iBAAiB;AAChD,yBAAO,KAAK,GAAG;AAAA;AAAA,gBACjB;AAAA,cACF;AAEA,kBAAI,OAAO,aAAa,SAAS,GAAG;AAClC,uBAAO;AAAA,+BAA2B,OAAO,aAAa,MAAM;AAAA;AAC5D,2BAAW,SAAS,OAAO,cAAc;AACvC,yBAAO;AAAA,IAAO,MAAM,SAAS,aAAQ,MAAM,QAAQ;AAAA;AACnD,6BAAW,UAAU,MAAM,kBAAkB;AAC3C,2BAAO,MAAM,OAAO,IAAI,KAAK,OAAO,WAAW;AAAA;AAC/C,2BAAO,YAAO,OAAO,MAAM;AAAA;AAAA,kBAC7B;AAAA,gBACF;AAAA,cACF;AAEA,kBAAI,OAAO,gBAAgB,SAAS,GAAG;AACrC,uBAAO;AAAA,kCAA8B,OAAO,gBAAgB,MAAM;AAAA;AAClE,2BAAW,QAAQ,OAAO,iBAAiB;AACzC,yBAAO;AAAA,IAAO,KAAK,IAAI;AAAA;AACvB,yBAAO,eAAe,KAAK,cAAc;AAAA;AACzC,yBAAO,YAAY,KAAK,eAAe,IAAI,OAAK,KAAK,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA;AACtE,yBAAO,aAAa,KAAK,MAAM;AAAA;AAAA,gBACjC;AAAA,cACF;AAEA,kBAAI,OAAO,QAAQ,mBAAmB,SAAS,GAAG;AAChD,uBAAO;AAAA;AAAA;AACP,2BAAW,OAAO,OAAO,QAAQ,oBAAoB;AACnD,yBAAO,OAAO,IAAI,QAAQ,OAAO,IAAI,KAAK;AAAA;AAAA,gBAC5C;AAAA,cACF;AAEA,kBAAI,OAAO,cAAc,SAAS,GAAG;AACnC,uBAAO;AAAA,qCAAiC,OAAO,cAAc,MAAM;AAAA;AACnE,2BAAW,MAAM,OAAO,eAAe;AACrC,wBAAM,eAAe,GAAG,aAAa,SAAS,cAAO,GAAG,aAAa,WAAW,cAAO;AACvF,yBAAO,GAAG,YAAY,MAAM,GAAG,IAAI,aAAQ,GAAG,aAAa,KAAK,GAAG,WAAW;AAAA;AAC9E,yBAAO,YAAO,GAAG,WAAW;AAAA;AAAA,gBAC9B;AAAA,cACF;AAGA,oBAAM,iBAAiB,WAAW,OAAO,EAAE,IAAI,QAAM;AAAA,gBACnD,MAAM,EAAE,WAAW,KAAK;AAAA,gBACxB,aAAa,EAAE;AAAA,gBACf,YAAY,EAAE;AAAA,cAChB,EAAE;AACF,oBAAM,gBAAgB,iBAAiB,QAAQ,aAAa,CAAC,GAAG,cAAc;AAC9E,kBAAI,cAAc,gBAAgB,SAAS,GAAG;AAC5C,uBAAO;AAAA;AAAA;AACP,uBAAO,gCAAgC,cAAc,aAAa;AAAA;AAAA;AAElE,sBAAM,WAAW,cAAc,gBAAgB,OAAO,OAAK,EAAE,aAAa,MAAM;AAChF,oBAAI,SAAS,SAAS,GAAG;AACvB,yBAAO,iCAAuB,SAAS,MAAM;AAAA;AAC7C,6BAAW,OAAO,UAAU;AAC1B,2BAAO,KAAK,IAAI,WAAW;AAAA;AAC3B,2BAAO,YAAO,IAAI,MAAM;AAAA;AAAA,kBAC1B;AACA,yBAAO;AAAA,gBACT;AAEA,sBAAM,UAAU,cAAc,gBAAgB,OAAO,OAAK,EAAE,aAAa,QAAQ;AACjF,oBAAI,QAAQ,SAAS,GAAG;AACtB,yBAAO,sBAAsB,QAAQ,MAAM;AAAA;AAC3C,6BAAW,OAAO,SAAS;AACzB,2BAAO,KAAK,IAAI,WAAW;AAAA;AAAA,kBAC7B;AACA,yBAAO;AAAA,gBACT;AAEA,oBAAI,cAAc,cAAc,SAAS,GAAG;AAC1C,yBAAO;AAAA;AACP,6BAAW,MAAM,cAAc,eAAe;AAC5C,2BAAO,OAAO,GAAG,QAAQ,OAAO,GAAG,YAAY,IAAI,cAAc,aAAa,eAAe,GAAG,kBAAkB,KAAK,QAAQ,CAAC,CAAC;AAAA;AAAA,kBACnI;AACA,yBAAO;AAAA,gBACT;AAEA,oBAAI,cAAc,aAAa,KAAK,OAAK,EAAE,SAAS,GAAG;AACrD,yBAAO;AAAA;AACP,6BAAW,MAAM,cAAc,aAAa,OAAO,OAAK,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,GAAG;AAChF,2BAAO,OAAO,GAAG,QAAQ,aAAQ,GAAG,YAAY;AAChD,wBAAI,GAAG,eAAe,SAAS,GAAG;AAChC,6BAAO,iBAAiB,GAAG,eAAe,IAAI,OAAK,KAAK,EAAE,QAAQ,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,oBACpF;AACA,2BAAO;AAAA,kBACT;AAAA,gBACF;AAAA,cACF;AAEA,qBAAO,EAAE,QAAQ,IAAI;AAAA,YACvB;AAAA,YAEA,KAAK,eAAe;AAClB,oBAAM,aAAa,KAAK,QAAQ;AAChC,oBAAM,SAAS,aAAa,UAAU,UAAU;AAChD,kBAAI,CAAC,OAAQ,QAAO,EAAE,QAAQ,SAAS,UAAU,eAAe;AAChE,oBAAM,QAAQ,aAAa,eAAe,UAAU;AACpD,oBAAM,MAAM,OAAO,kBAAkB;AACrC,qBAAO;AAAA,gBACL,QAAQ,6BAAsB,UAAU,QAAQ,GAAG;AAAA;AAAA;AAAA,EAAgB,MAAM;AAAA;AAAA,cAC3E;AAAA,YACF;AAAA,YAEA,KAAK,eAAe;AAClB,oBAAM,aAAa,KAAK,QAAQ;AAChC,kBAAI,CAAC,KAAK,OAAQ,QAAO,EAAE,QAAQ,gEAAgE;AACnG,oBAAM,iBAAiB,aAAa,UAAU,UAAU;AACxD,kBAAI,CAAC,eAAgB,QAAO,EAAE,QAAQ,SAAS,UAAU,eAAe;AACxE,oBAAM,YAAY,iBAAiB;AAAA;AAAA;AAAA,EAAmD,KAAK,MAAM;AACjG,oBAAM,UAAU,aAAa,aAAa,YAAuE,WAAW,cAAc,KAAK,eAAe,yBAAyB;AACvL,kBAAI,CAAC,QAAS,QAAO,EAAE,QAAQ,qCAAqC,UAAU,wCAAwC;AACtH,0BAAY,KAAK,WAAW,SAAS,aAAa,mBAAmB,CAAC;AACtE,qBAAO;AAAA,gBACL,QAAQ,uBAAkB,UAAU,gBAAgB,aAAa,eAAe,UAAU,GAAG,cAAc;AAAA,cAC7G;AAAA,YACF;AAAA,YAEA,KAAK,kBAAkB;AACrB,oBAAM,aAAa,KAAK,QAAQ;AAChC,oBAAM,UAAU,aAAa,iBAAiB,UAAU;AACxD,kBAAI,QAAQ,WAAW,EAAG,QAAO,EAAE,QAAQ,0BAA0B,UAAU,KAAK;AACpF,kBAAI,MAAM,qCAA8B,UAAU;AAAA;AAAA;AAClD,yBAAW,SAAS,SAAS;AAC3B,sBAAM,UAAU,MAAM,OAAO,MAAM,IAAI,EAAE,QAAQ,OAAO,GAAG;AAC3D,uBAAO,MAAM,MAAM,OAAO,aAAQ,MAAM,SAAS,mBAAc,MAAM,MAAM;AAC3E,oBAAI,MAAM,YAAa,QAAO,WAAM,MAAM,WAAW;AACrD,uBAAO;AAAA;AAAA,KAAgB,QAAQ,MAAM,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA,cAC5C;AACA,qBAAO,EAAE,QAAQ,IAAI;AAAA,YACvB;AAAA,YAEA,KAAK,mBAAmB;AACtB,oBAAM,aAAa,KAAK,QAAQ;AAChC,oBAAM,UAAU,KAAK;AACrB,kBAAI,CAAC,QAAS,QAAO,EAAE,QAAQ,6CAA6C;AAC5E,oBAAM,UAAU,aAAa,iBAAiB,UAAU;AACxD,kBAAI,QAAQ,WAAW,EAAG,QAAO,EAAE,QAAQ,0BAA0B,UAAU,KAAK;AACpF,oBAAM,SAAS,QAAQ,KAAK,OAAK,EAAE,YAAY,OAAO;AACtD,kBAAI,CAAC,OAAQ,QAAO,EAAE,QAAQ,WAAW,OAAO,mBAAmB,UAAU,0BAA0B,QAAQ,IAAI,OAAK,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC,GAAG;AACtJ,oBAAM,KAAK,aAAa,eAAe,YAAY,OAAO;AAC1D,kBAAI,CAAC,GAAI,QAAO,EAAE,QAAQ,kCAAkC,UAAU,KAAK;AAC3E,0BAAY,KAAK,WAAW,SAAS,aAAa,mBAAmB,CAAC;AACtE,qBAAO;AAAA,gBACL,QAAQ,uBAAkB,UAAU,sBAAsB,OAAO,UAAU,OAAO,SAAS;AAAA,cAC7F;AAAA,YACF;AAAA,YAEA,KAAK,wBAAwB;AAC3B,oBAAM,YAAY,WAAW,OAAO;AACpC,oBAAM,MAAM,KAAK,UAAU;AAC3B,oBAAM,UAAU,KAAK,kBAAkB;AACvC,oBAAM,UAAU,qBAAqB,WAAW,KAAK,OAAO;AAE5D,oBAAM,iBAAiB,UAAU,OAAO,OAAK,EAAE,eAAe,OAAO;AACrE,oBAAM,WAAW,eAAe,IAAI,OAAK,uBAAuB,CAAC,CAAC;AAClE,oBAAM,UAAU,uBAAuB,QAAQ;AAE/C,kBAAI,MAAM;AACV,qBAAO;AAAA;AAAA,qBAA0B,QAAQ,MAAM;AAAA;AAC/C,qBAAO;AAAA,EAAW,QAAQ,KAAK,MAAM,GAAG,GAAI,CAAC,GAAG,QAAQ,KAAK,SAAS,MAAO,yBAAoB,EAAE;AAAA;AACnG,kBAAI,QAAQ,KAAK,SAAS,KAAM;AAC9B,uBAAO;AAAA;AAAA,oBAAyB,QAAQ,KAAK,MAAM,gBAAgB,QAAQ,aAAa;AAAA,cAC1F;AACA,qBAAO,EAAE,QAAQ,IAAI;AAAA,YACvB;AAAA,YAEA;AACE,qBAAO,EAAE,QAAQ,mBAAmB,KAAK,MAAM,6JAA6J;AAAA,UAChN;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MAED,cAAc,KAAK;AAAA,QACjB,aAAa;AAAA,QACb,MAAM;AAAA,UACJ,MAAM,KAAK,OAAO,OAAO,EAAE,SAAS,qCAAqC;AAAA,UACzE,aAAa,KAAK,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,QACxG;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAAC,WAAU,aAAa,QAAQ,SAAS;AACxC,gBAAM,YAAY,KAAK,IAAI;AAC3B,gBAAM,aAAa,OAAO,OAAO;AAGjC,gBAAM,UAAU,KAAK,UAAU;AAC/B,gBAAM,UAAU,UAAU,WAAW;AAGrC,cAAI,WAAsB,CAAC;AAC3B,cAAI;AACF,kBAAM,SAAS,MAAM,QAAQ,iBAAiBA,YAAW,KAAK,MAAM,OAAO;AAC3E,gBAAI,OAAO,SAAS,SAAS,EAAG,YAAW,OAAO;AAAA,UACpD,QAAQ;AAAA,UAAqB;AAC7B,cAAI,SAAS,WAAW,GAAG;AACzB,kBAAM,WAAW,QAAQ,UAAU,KAAK,MAAM,CAAC,CAAC;AAChD,gBAAI,SAAS,cAAe,YAAW,SAAS,OAAO;AAAA,UACzD;AACA,cAAI,SAAS,WAAW,GAAG;AACzB,uBAAW;AAAA,cACT,EAAE,IAAI,UAAU,aAAa,KAAK,MAAM,WAAW,CAAC,GAAG,sBAAsB,CAAC,qBAAqB,kBAAkB,EAAE;AAAA,YACzH;AAAA,UACF;AACA,cAAI,SAAS,WAAW,GAAG;AACzB,mBAAO;AAAA,cACL,QAAQ;AAAA;AAAA,YAA8C,KAAK,IAAI;AAAA;AAAA,cAC/D,UAAU,EAAE,QAAQ,EAAE,gBAAgB,CAAC,GAAG,aAAa,CAAC,GAAG,iBAAiB,GAAG,SAAS,OAAO,SAAS,yCAAyC,EAAE;AAAA,YACrJ;AAAA,UACF;AAEA,gBAAM,OAAO,aAAa,WAAW;AAAA,YACnC,MAAM,KAAK;AAAA,YACX,aAAa,KAAK,eAAe,CAAC;AAAA,YAClC,SAAS,EAAE,eAAe,CAAC,GAAG,cAAc,CAAC,EAAE;AAAA,YAC/C;AAAA,UACF,CAAC;AACD,mBAAS,cAAc,QAAQ,WAAW,IAAI;AAG9C,gBAAM,kBAAkB,CAAC,YAA4F;AACnH,kBAAM,UAAU,QAAQ,KAAK;AAC7B,gBAAI;AACF,oBAAM,SAAS,KAAK,MAAM,OAAO;AACjC,kBAAI,UAAU,OAAO,WAAW,SAAU,QAAO;AAAA,YACnD,QAAQ;AAAA,YAAiB;AACzB,kBAAM,YAAY,QAAQ,MAAM,2CAA2C;AAC3E,gBAAI,WAAW;AACb,kBAAI;AAAE,uBAAO,KAAK,MAAM,UAAU,CAAC,CAAC;AAAA,cAAE,QAAQ;AAAA,cAAiB;AAAA,YACjE;AACA,kBAAM,YAAY,QAAQ,MAAM,8CAA8C;AAC9E,gBAAI,WAAW;AACb,kBAAI;AACF,sBAAM,IAAI,KAAK,MAAM,UAAU,CAAC,CAAC;AACjC,oBAAI,MAAM,QAAQ,EAAE,KAAK,KAAK,EAAE,QAAS,QAAO;AAAA,cAClD,QAAQ;AAAA,cAAiB;AAAA,YAC3B;AACA,mBAAO,EAAE,OAAO,CAAC,GAAG,SAAS,QAAQ,QAAQ,mBAAmB,EAAE,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE;AAAA,UAC3F;AAEA,gBAAM,eAAe,OAAO,SAAkB;AAC5C,kBAAM,aAAa,SAAS,kBAAkB,QAAQ,SAAS;AAC/D,kBAAM,YAAY,SAAS,aAAa,QAAQ,WAAW,KAAK,EAAE;AAClE,kBAAM,YAAY,WAAW,cAAc,UAAU,aAAa,IAC9D;AAAA,kCAAqC,UAAU,UAAU;AAAA,GAAkB,UAAU,gBAAgB,CAAC,GAAG,IAAI,OAAK,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC,KAC5I;AACJ,kBAAM,OAAO,MAAMA,WAAU,KAAK;AAAA,cAChC,cAAc;AAAA;AAAA;AAAA,kEAGsCA,WAAU,iBAAiB,KAAK,WAAW;AAAA,cAC/F,YAAY,SAAS,KAAK,IAAI;AAAA,QAAW,KAAK,EAAE,MAAM,KAAK,WAAW;AAAA,OAAU,UAAU;AAAA,mBAAsB,WAAW,KAAK,IAAI,KAAK,MAAM,GAAG,SAAS;AAAA,cAC3J,UAAU;AAAA,cACV,aAAa,WAAW,aAAa,MAAM;AAAA,YAC7C,CAAC;AAED,kBAAM,OAAO,gBAAgB,KAAK,OAAO;AAGzC,kBAAM,aAAc,KAAK,SAAS,KAAK,MAAM,SAAS,KAAO,KAAK,WAAW,KAAK,QAAQ,SAAS;AACnG,gBAAI,CAAC,YAAY;AACf,qBAAO,EAAE,SAAS,OAAO,QAAQ,+CAA+C,KAAK,QAAQ,MAAM,GAAG,GAAG,CAAC,IAAI,eAAe,CAAC,EAAE;AAAA,YAClI;AAEA,kBAAM,QAAkB,CAAC;AACzB,uBAAW,QAAQ,KAAK,SAAS,CAAC,GAAG;AACnC,oBAAM,WAAWP,MAAK,YAAY,KAAK,IAAI;AAC3C,cAAAI,WAAUL,SAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,cAAAM,eAAc,UAAU,KAAK,SAAS,OAAO;AAC7C,oBAAM,KAAK,KAAK,IAAI;AAAA,YACtB;AAEA,mBAAO,EAAE,SAAS,MAAM,QAAQ,KAAK,WAAW,KAAK,aAAa,eAAe,MAAM;AAAA,UACzF;AAEA,gBAAM,cAAc,OAAO,QAAgB;AACzC,gBAAI;AACF,cAAAJ,cAAa,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,KAAK,YAAY,SAAS,KAAO,OAAO,OAAO,CAAC;AACpF,qBAAO;AAAA,YACT,QAAQ;AAAE,qBAAO;AAAA,YAAM;AAAA,UACzB;AAEA,gBAAM,SAAS,MAAM,UAAU;AAAA,YAC7B,QAAQ;AAAA,YAAW;AAAA,YAAU;AAAA,YAAU;AAAA,YAAe;AAAA,YACtD;AAAA,YAAY;AAAA,YAAc;AAAA,UAC5B;AAGA,gBAAM,WAAW,SAAS,oBAAoB,QAAQ,SAAS;AAC/D,sBAAY,IAAI;AAAA,YACd,MAAM;AAAA,YAAQ,OAAO,KAAK;AAAA,YAAM,QAAQ,KAAK,UAAU,MAAM;AAAA,YAC7D,UAAU;AAAA,YAAgB,SAAS,OAAO;AAAA,YAC1C,YAAY,KAAK,IAAI,IAAI;AAAA,YAAW,UAAU,EAAE,GAAG,OAAO;AAAA,UAC5D,CAAC;AAED,wBAAc;AAAA,YACZ,QAAQ;AAAA,YAAW,KAAK;AAAA,YACxB,OAAO,UAAU,YAAY;AAAA,YAC7B,OAAO,eAAe,IAAI,MAAM,WAAW;AAAA,YAC3C;AAAA,UACF;AAGA,gBAAM,iBAAiB,SAAS,kBAAkB,QAAQ,SAAS;AACnE,qBAAW,UAAU,gBAAgB;AACnC,gCAAoB,eAAe;AAAA,cACjC;AAAA,cACA,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,WAAW,QAAQ;AAAA,cACnB,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AAAA,UACH;AACA,qBAAW,UAAU,OAAO,aAAa;AACvC,gCAAoB,eAAe;AAAA,cACjC;AAAA,cACA,SAAS;AAAA,cACT,QAAQ;AAAA,cACR,WAAW,QAAQ;AAAA,cACnB,WAAW,KAAK,IAAI;AAAA,YACtB,CAAC;AAAA,UACH;AACA,gBAAM,YAAY,oBAAoB,eAAe;AAGrD,cAAI,OAAO,WAAW,OAAO,eAAe,SAAS,GAAG;AACtD,kBAAM,cAAc,MAAM,WAAW,QAAQ;AAAA,cAC3C,MAAM;AAAA,cACN,SAAS,kCAA6B,KAAK,IAAI;AAAA,mBAAsB,OAAO,eAAe,KAAK,IAAI,CAAC;AAAA,WAAc,OAAO,OAAO;AAAA,YACnI,GAAG,CAAC,KAAK,MAAM,GAAI,KAAK,eAAe,CAAC,CAAE,CAAC;AAC3C,gBAAI,aAAa;AACf,0BAAY,KAAK,UAAU,YAAY,WAAW,KAAK,IAAI,YAAY,UAAU;AAAA,YACnF;AAAA,UACF;AAGA,gBAAM,aAAa,OAAO,eAAe,SAAS,OAAO,YAAY;AACrE,cAAI,SAAS;AAAA;AAAA;AACb,oBAAU,aAAa,KAAK,IAAI;AAAA;AAChC,oBAAU,eAAe,OAAO,eAAe,MAAM,IAAI,UAAU,WAAW,OAAO,eAAe;AAAA;AACpG,oBAAU,GAAG,OAAO,UAAU,sBAAiB,0BAAgB;AAAA;AAC/D,oBAAU,mBAAmB,KAAK,IAAI,IAAI,aAAa,KAAM,QAAQ,CAAC,CAAC;AAAA;AAAA;AACvE,cAAI,SAAS,SAAS,GAAG;AACvB,sBAAU;AAAA;AAAA,EAA+B,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,UAC5E;AACA,oBAAU;AAAA,EAAK,OAAO,OAAO;AAG7B,cAAI,UAAU,QAAQ,SAAS,KAAK,UAAU,qBAAqB;AACjE,kBAAM,UAAU,UAAU,QAAQ,cAAc,cAAc,cAAO,UAAU,QAAQ,cAAc,cAAc,cAAO;AAC1H,sBAAU;AAAA;AAAA,MAAW,OAAO;AAAA;AAC5B,sBAAU,iBAAiB,UAAU,QAAQ,cAAc,KAAK,QAAQ,CAAC,CAAC,MAAM,UAAU,QAAQ,OAAO,IAAI,UAAU,QAAQ,KAAK;AAAA;AACpI,sBAAU,kBAAkB,UAAU,QAAQ,UAAU,SAAS,UAAU,QAAQ,cAAc,KAAK,QAAQ,CAAC,CAAC,YAAO,UAAU,QAAQ,SAAS;AAAA;AAClJ,gBAAI,UAAU,qBAAqB;AACjC,wBAAU;AAAA;AACV,kBAAI;AACF,sBAAM,gBAAgB,MAAM,cAAc;AAC1C,0BAAU,GAAG,cAAc,QAAQ,OAAO,IAAI,CAAC;AAAA;AAAA,cACjD,SAAS,GAAG;AACV,0BAAU,qDAA4C,EAAY,OAAO;AAAA;AAAA,cAC3E;AAAA,YACF;AACA,gBAAI,UAAU,gBAAgB,SAAS,GAAG;AACxC,wBAAU;AAAA,EAAqB,UAAU,gBAAgB,IAAI,OAAK,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,YACxF;AAAA,UACF;AAGA,cAAI,cAAc,aAAa,EAAE,aAAa,KAAK,cAAc,aAAa,EAAE,mBAAmB,GAAG;AACpG,sBAAU;AAAA;AAAA,EAAO,cAAc,aAAa,KAAK,CAAC;AAAA,UACpD;AAEA,iBAAO,EAAE,QAAQ,QAAQ,UAAU,EAAE,OAAO,EAAE;AAAA,QAChD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IAEA,sBAAsB,OAAO,WAA+F,YAAkE;AAC5L,kBAAY,IAAI;AAAA,QACd,MAAM;AAAA,QACN,OAAO,KAAK,UAAU,UAAU,QAAQ,CAAC,CAAC;AAAA,QAC1C,QAAQ;AAAA,QACR,UAAU,UAAU;AAAA,QACpB,SAAS;AAAA,QACT,YAAY;AAAA,MACd,CAAC;AAGD,UAAI;AACF,cAAM,OAAO,UAAU,QAAQ,CAAC;AAChC,gBAAQ,UAAU,MAAM;AAAA,UACtB,KAAK,mBAAmB;AACtB,kBAAM,UAAU,KAAK,YAAY;AACjC,gBAAI,KAAK,QAAQ;AACf,4BAAc,eAAe,EAAE,QAAQ,OAAO,KAAK,MAAM,GAAG,SAAS,WAAW,UAAU,UAAU,CAAC;AAErG,kBAAI,WAAW,KAAK,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AAC1D,8BAAc,kBAAkB,QAAQ,KAAK,MAAM,IAAI,IAAI;AAAA,cAC7D,WAAW,CAAC,WAAW,KAAK,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,GAAG;AAClE,8BAAc,kBAAkB,QAAQ,KAAK,MAAM,IAAI,KAAK;AAAA,cAC9D;AAAA,YACF;AACA;AAAA,UACF;AAAA,UACA,KAAK,mBAAmB;AAEtB,gBAAI,KAAK,QAAQ;AACf,4BAAc,kBAAkB,WAAW,KAAK,MAAM,IAAI,IAAI;AAAA,YAChE;AACA;AAAA,UACF;AAAA,UACA,KAAK,eAAe;AAClB,gBAAI,KAAK,OAAO;AACd,oBAAM,aAAa,SAAS,UAAU;AACtC,oBAAM,eAAe,WAAW,MAAM,OAAO,KAAK,CAAC,GAAG;AACtD,4BAAc,eAAe,OAAO,KAAK,KAAK,GAAG,WAAW;AAAA,YAC9D;AACA;AAAA,UACF;AAAA,UACA,KAAK,oBAAoB;AACvB,gBAAI,KAAK,UAAU,KAAK,MAAM;AAC5B,oBAAM,YAAY,SAAS,UAAU,IAAI,SAAS,WAAW,MAAM,SAAS,UAAU,IAAI,SAAS,WAAW;AAC9G,4BAAc,eAAe,OAAO,KAAK,MAAM,GAAG,OAAO,KAAK,IAAI,GAAG,QAAQ;AAAA,YAC/E;AACA;AAAA,UACF;AAAA,UACA,KAAK,iBAAiB;AACpB,gBAAI,KAAK,WAAW,UAAU,KAAK,WAAW,UAAU;AACtD,oBAAM,SAAS,SAAS,UAAU,IAAI,SAAS,OAAO,MAAM,SAAS,UAAU,IAAI,SAAS,OAAO;AACnG,4BAAc,gBAAgB,KAAK;AAAA,YACrC;AACA;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAAkB;AAAA,IAC5B;AAAA,IAEA,SAAS,YAAY;AACnB,mBAAa,UAAU;AACvB,kBAAY,KAAK,UAAU,YAAY,cAAc,OAAO,CAAC;AAC7D,kBAAY,KAAK,WAAW,SAAS,aAAa,mBAAmB,CAAC;AACtE,YAAM,YAAY,QAAQ;AAAA,IAC5B;AAAA,EACF;AACF;AAEO,IAAM,gBAAwB;AAErC,IAAM,eAA6B;AAAA,EACjC,IAAI;AAAA,EACJ,QAAQ;AACV;AACA,IAAO,gBAAQ;",
|
|
4
|
+
"sourcesContent": ["import type { Plugin, PluginModule } from \"@opencode-ai/plugin\"\nimport { tool } from \"@opencode-ai/plugin\"\nimport { readFileSync, writeFileSync, mkdirSync, existsSync, readdirSync, cpSync, rmSync, mkdtempSync } from \"node:fs\"\nimport { execFileSync } from \"node:child_process\"\nimport { join, dirname } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { tmpdir } from \"node:os\"\nimport { IntentParser, type TaskIntent, type Subtask } from \"./core/intent-parser.js\"\nimport { Executor } from \"./core/executor.js\"\nimport { Verifier } from \"./core/verifier.js\"\nimport { ErrorAnalyzer } from \"./core/error-analyzer.js\"\nimport { Planner } from \"./core/planner.js\"\nimport { CodebaseNavigator } from \"./core/navigator.js\"\nimport { DependencyTracker } from \"./drift/dependency-tracker.js\"\nimport { ContextCompressor } from \"./drift/context-compressor.js\"\nimport { GitIntegration } from \"./core/git.js\"\nimport { TechDebtScorer } from \"./core/tech-debt-scorer.js\"\nimport { AgentCoordinator } from \"./agents/coordinator.js\"\nimport { AgentRuntime } from \"./agents/agent-runtime.js\"\nimport type { AgentRole, AgentTask } from \"./agents/coordinator.js\"\nimport { Orchestrator, type WorkflowPipeline, type CrossValidationResult } from \"./agents/orchestrator.js\"\nimport { SkillStore } from \"./memory/skill-store.js\"\nimport { EpisodicStore } from \"./memory/episodic-store.js\"\nimport { HallucinationGuard } from \"./drift/hallucination-guard.js\"\nimport { ParallelExecutor } from \"./core/parallel.js\"\nimport { Dashboard } from \"./observability/dashboard.js\"\nimport { CheckpointSystem } from \"./drift/checkpoints.js\"\nimport { SessionStore } from \"./memory/session-store.js\"\nimport { TraceLogger } from \"./observability/trace-logger.js\"\nimport { RoleRegistry, type PromptEntry } from \"./agents/role-registry.js\"\nimport { MemorySchemaVersion, createMemoryEnvelope, parseMemoryEnvelope } from \"./memory/schema-version.js\"\nimport { createSkillDefinition, inspectSkill, serializeSkill, deserializeSkill } from \"./memory/skill-format.js\"\nimport { detectTaskType } from \"./core/task-classifier.js\"\nimport { skillsToTrainingData, trainingDatasetSummary, skillToTrainingExample } from \"./memory/skill-training.js\"\nimport { SelfEvolver } from \"./evolution/self-evolver.js\"\nimport { ContinuousEvolution } from \"./evolution/continuous-evolution.js\"\nimport { LLMEngine } from \"./core/llm.js\"\nimport { AgentLoop } from \"./core/agent-loop.js\"\nimport { PersistenceLayer } from \"./memory/persistence.js\"\nimport { VectorStore } from \"./memory/vector-store.js\"\nimport { ModelRegistry } from \"./core/model-registry.js\"\nimport { ConfigLoader } from \"./core/config.js\"\nimport { PatternDiscovery } from \"./drift/pattern-discovery.js\"\nimport { LiveEvaluator } from \"./evaluation/live-evaluator.js\"\n\n// \u2500\u2500 Build-time version injected by esbuild define \u2500\u2500\ndeclare const __VERSION__: string\n\n/**\n * Compare semver strings: returns true if latest > current\n */\nfunction isNewerVersion(latest: string, current: string): boolean {\n const l = latest.split(\".\").map(Number)\n const c = current.split(\".\").map(Number)\n for (let i = 0; i < Math.max(l.length, c.length); i++) {\n if ((l[i] ?? 0) > (c[i] ?? 0)) return true\n if ((l[i] ?? 0) < (c[i] ?? 0)) return false\n }\n return false\n}\n\n/**\n * Auto-update: fire-and-forget. Fetch latest version from npm, download and\n * overwrite local plugin files if newer. User must restart OpenCode to apply.\n */\nasync function autoUpdatePlugin(currentVersion: string): Promise<void> {\n if (typeof __VERSION__ === \"undefined\") return\n try {\n const res = await fetch(\n \"https://registry.npmjs.org/opencode-agentic-engine/latest\",\n { signal: AbortSignal.timeout(5000) }\n )\n if (!res.ok) return\n const data = await res.json() as { version: string }\n const latest = data.version\n if (!isNewerVersion(latest, currentVersion)) return\n\n // Find own location: import.meta.url points to dist/index.js\n const ownFile = fileURLToPath(import.meta.url)\n const distDir = dirname(ownFile)\n const pluginDir = dirname(distDir)\n\n // Temp dir for npm pack\n const tmpDir = mkdtempSync(join(tmpdir(), \"opencode-agentic-engine-\"))\n try {\n execFileSync(\"npm\", [\"pack\", \"opencode-agentic-engine@latest\"], {\n cwd: tmpDir,\n stdio: \"pipe\",\n timeout: 30000,\n })\n\n // Find tarball\n const tarball = readdirSync(tmpDir).find(f => f.endsWith(\".tgz\"))\n if (!tarball) return\n\n // Extract\n execFileSync(\"tar\", [\"-xzf\", tarball], {\n cwd: tmpDir,\n stdio: \"pipe\",\n timeout: 10000,\n })\n\n // Overwrite plugin files\n const extractDir = join(tmpDir, \"package\")\n if (existsSync(extractDir)) {\n cpSync(extractDir, pluginDir, { recursive: true, force: true })\n }\n\n // Notify user (console \u2014 not visible in OpenCode chat, but shows in process stderr)\n process.stderr.write(\n `\\n[AgenticEngine] \u2705 Auto-updated v${currentVersion} \u2192 v${latest}. Restart OpenCode to apply.\\n`\n )\n } finally {\n rmSync(tmpDir, { recursive: true, force: true })\n }\n } catch {\n // Silent fail \u2014 never block plugin startup\n }\n}\n\nconst createEngine: Plugin = async (input, _options) => {\n // \u2500\u2500 Normalize worktree: jangan sampai \"/\" (root) karena akan crash \u2500\u2500\n // Pakai input.directory dulu (paling akurat), fallback ke worktree, lalu HOME\n const rawWorktree = input.directory || input.worktree || process.env.HOME || process.cwd()\n const worktree = rawWorktree === \"/\" || rawWorktree === \"/home\"\n ? (input.directory || process.env.HOME || process.cwd())\n : rawWorktree\n\n // \u2500\u2500 Config (load first, everything else depends on it) \u2500\u2500\n const configLoader = new ConfigLoader(worktree)\n const config = configLoader.load()\n configLoader.startWatch()\n\n // \u2500\u2500 Auto-register \"agentic\" agent if not present \u2500\u2500\n const agentsDir = join(worktree, \".opencode\", \"agents\")\n const agenticAgentPath = join(agentsDir, \"agentic.md\")\n if (!existsSync(agenticAgentPath)) {\n try {\n mkdirSync(agentsDir, { recursive: true })\n writeFileSync(agenticAgentPath, `---\ndescription: Multi-agent software engineering assistant \u2014 22 tools for autonomous planning, execution, verification, delegation, and self-evolution.\nmode: all\n---\n\n# Agentic Engineering Agent\n\n## \uD83D\uDEA8 CRITICAL RULES\n\nYou have access to **22 specialized agentic_* tools** designed for software engineering. **YOU MUST PREFER THESE TOOLS OVER BUILT-IN TOOLS** for any software engineering task.\n\n### Tool Preference Hierarchy (HIGHEST first):\n1. **agentic_*** \u2014 Use FIRST. Far more powerful than built-in tools.\n2. bash/edit/read/write \u2014 Only if no agentic_* tool fits the need.\n\n**NEVER** use bash, edit, write, read, glob, grep directly for multi-step engineering tasks. Instead:\n- Use **agentic_plan** instead of planning manually\n- Use **agentic_auto** instead of implementing step by step manually\n- Use **agentic_execute** instead of tracking progress manually\n\n### FOR MULTI-STEP FEATURES (apps, APIs, refactors):\nCall **agentic_auto** IMMEDIATELY. Just pass the goal. Example:\n\\`@agentic_auto goal=\"Buat aplikasi POS dengan Express dan SQLite\"\\`\n\n### FOR SINGLE-STEP TASKS:\nCall the specific tool (agentic_nav, agentic_execute, etc.) directly.\n\n## Standard Workflow\n\n1. **agentic_auto** \u2014 For multi-step tasks, call this FIRST. It handles everything.\n2. OR manually: **agentic_plan** \u2192 **agentic_nav** \u2192 **agentic_execute** \u2192 **agentic_verify** \u2192 **agentic_reflect**\n\n## Tool Reference\n\n### Stage V \u2014 Autonomous (BEST for multi-step)\n- **agentic_auto**: Fully autonomous loop: plan \u2192 execute \u2192 verify \u2192 retry in ONE call. Just give a goal. USE THIS FIRST for any feature work.\n\n### Stage I \u2014 Core Engineering Loop\n- **agentic_plan**: Decompose a goal into subtasks with dependencies. Supports auto-decomposition via LLM.\n- **agentic_execute**: Record a completed subtask with auto-verification + retry tracking.\n- **agentic_reflect**: Analyze a failed step \u2014 error category, propagation, root cause, recovery.\n- **agentic_verify**: Full compile + lint + test suite. Auto-detects language.\n- **agentic_status**: Dashboard with progress, health, blocked steps, model reliability.\n\n### Stage II \u2014 Codebase & Context\n- **agentic_nav**: Scan codebase and find relevant files.\n- **agentic_context**: View or compress conversation context.\n- **agentic_snapshot**: Save/list execution checkpoints.\n- **agentic_pr**: Generate PR description from plan + results.\n- **agentic_score**: Analyze changeset for technical debt.\n- **agentic_model**: Configure per-role LLM model preferences.\n\n### Stage III \u2014 Multi-Agent & Memory\n- **agentic_delegate**: Assign to architect/developer/qa/coordinator/pm roles.\n- **agentic_pipeline**: Define and run multi-agent pipelines.\n- **agentic_message**: Inter-agent messaging system.\n- **agentic_parallel**: Execute ready steps concurrently.\n- **agentic_skill**: Extract/find/list reusable skills.\n- **agentic_episodes**: Search cross-session memory.\n- **agentic_dashboard**: Observability timeline + anomaly detection.\n- **agentic_guard**: Verify claims to catch hallucinations.\n\n### Stage IV \u2014 Self-Evolution\n- **agentic_evolve**: Inspect/extend the agent system, manage prompts.\n\n## CRITICAL RULES\n1. **ALWAYS prefer agentic_* tools over built-in tools** for engineering tasks\n2. For multi-step tasks: call **agentic_auto** immediately\n3. Never ask \"should I...\" \u2014 just call the tool\n4. If a step fails, call **agentic_reflect** before retrying\n5. After all steps done, call **agentic_verify** for final verification\n`, \"utf-8\")\n } catch { /* non-fatal: agent file is optional */ }\n }\n\n const intentParser = new IntentParser()\n const executor = new Executor()\n const verifier = new Verifier()\n const errorAnalyzer = new ErrorAnalyzer()\n const planner = new Planner()\n const navigator = new CodebaseNavigator()\n const depTracker = new DependencyTracker()\n // Build initial file-level dependency graph from project source\n try {\n const sourceDir = join(worktree, \"src\")\n if (existsSync(sourceDir)) {\n const scanBatch: Record<string, string> = {}\n const walkDir = (dir: string) => {\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name)\n if (entry.isDirectory() && ![\"node_modules\", \".git\", \"dist\", \".agentic\"].includes(entry.name))\n walkDir(full)\n else if (entry.isFile() && /\\.(ts|tsx|js|jsx|mjs)$/.test(entry.name) && Object.keys(scanBatch).length < 100)\n try { scanBatch[full] = readFileSync(full, \"utf-8\") } catch {}\n }\n } catch {}\n }\n walkDir(sourceDir)\n depTracker.scanFiles(scanBatch, worktree)\n }\n } catch { /* non-fatal */ }\n const contextCompressor = new ContextCompressor()\n const git = new GitIntegration(worktree)\n const debtScorer = new TechDebtScorer()\n const skillStore = new SkillStore()\n const coordinator = new AgentCoordinator(skillStore)\n const orchestrator = new Orchestrator()\n for (const pipeline of orchestrator.getBuiltInPipelines()) {\n orchestrator.definePipeline(pipeline)\n }\n const episodicStore = new EpisodicStore()\n const checkpoints = new CheckpointSystem()\n const hallucinationGuard = new HallucinationGuard(worktree)\n const parallelExec = new ParallelExecutor()\n const dashboard = new Dashboard()\n const sessionStore = new SessionStore()\n const traceLogger = new TraceLogger(worktree)\n const roleRegistry = new RoleRegistry()\n const schemaVersion = new MemorySchemaVersion()\n const selfEvolver = new SelfEvolver()\n const continuousEvolution = new ContinuousEvolution()\n const patternDiscovery = new PatternDiscovery()\n const liveEvaluator = new LiveEvaluator()\n const modelRegistry = new ModelRegistry()\n const llmEngine = new LLMEngine()\n llmEngine.setOpencodeClient(input.client)\n llmEngine.setModelRegistry(modelRegistry)\n llmEngine.setSessionStore(sessionStore)\n orchestrator.setLLMEngine(llmEngine)\n errorAnalyzer.setLLM(llmEngine)\n verifier.setLLM(llmEngine)\n\n const agentRuntime = new AgentRuntime()\n agentRuntime.setOpencodeClient(input.client)\n agentRuntime.setModelRegistry(modelRegistry)\n\n // Discover models from OpenCode client + env vars\n ;(async () => {\n try {\n const client = input.client as { config?: { providers?: () => Promise<{ 200?: { providers: Array<{ name: string; id: string; models?: Record<string, unknown> }>; default?: Record<string, string> } }> }; models?: () => Promise<Array<{ id: string }>> }\n const allModels: string[] = []\n\n // 1. Try client.config.providers() \u2014 daftar provider + model dari OpenCode\n if (client?.config?.providers) {\n const provResp = await client.config.providers()\n const providers = provResp?.[200]?.providers ?? []\n const defaultMap = provResp?.[200]?.default ?? {}\n const defaultModelName = defaultMap[Object.keys(defaultMap)[0] ?? \"\"]?.split(\"/\")?.pop() || \"\"\n if (defaultModelName) allModels.push(defaultModelName)\n for (const p of providers) {\n if (p.models) {\n for (const modelKey of Object.keys(p.models)) {\n const name = modelKey.includes(\"/\") ? modelKey.split(\"/\").pop()! : modelKey\n if (name && !allModels.includes(name)) allModels.push(name)\n }\n }\n }\n }\n\n // 2. Try client.models() \u2014 alternatif\n if (allModels.length === 0 && typeof client?.models === \"function\") {\n const models = await client.models()\n for (const m of models) {\n if (m.id && !allModels.includes(m.id)) allModels.push(m.id)\n }\n }\n\n // 3. Fallback: env vars\n const envModel = process.env.OPENAI_MODEL || process.env.LLM_MODEL || \"\"\n if (envModel && !allModels.includes(envModel)) allModels.push(envModel)\n\n // 4. Register semua model yang ditemukan\n const fastModel = process.env.FAST_MODEL || allModels[0] || \"\"\n const capableModel = process.env.CAPABLE_MODEL || allModels[0] || \"\"\n\n for (const m of allModels) modelRegistry.addModel(m)\n if (fastModel) modelRegistry.registerAlias(\"fast\", [fastModel])\n if (capableModel && capableModel !== fastModel) modelRegistry.addModel(capableModel)\n if (capableModel) modelRegistry.registerAlias(\"capable\", [capableModel])\n } catch {\n // Silent fallback \u2014 discovery gagal, pake env var\n const envModel = process.env.OPENAI_MODEL || process.env.LLM_MODEL || \"\"\n const fastModel = process.env.FAST_MODEL || envModel\n const capableModel = process.env.CAPABLE_MODEL || envModel\n if (fastModel) { modelRegistry.addModel(fastModel); modelRegistry.registerAlias(\"fast\", [fastModel]) }\n if (capableModel && capableModel !== fastModel) modelRegistry.addModel(capableModel)\n if (capableModel) modelRegistry.registerAlias(\"capable\", [capableModel])\n }\n })()\n llmEngine.setMemoryStores({\n searchEpisodes: (query: string) => episodicStore.search(query),\n findSkills: (query: string) => skillStore.find(query).map(s => ({ name: s.definition.meta.name, successRate: s.successRate })),\n })\n const agentLoop = new AgentLoop(llmEngine, { maxIterations: 10, autoRetry: true, maxRetries: 2, verifyAfterEach: false })\n const persistence = new PersistenceLayer(worktree)\n const vectorStore = new VectorStore()\n vectorStore.setLLM(llmEngine)\n // Set search weights from config\n vectorStore.setSearchWeights(config.memory.search.keywordWeight, config.memory.search.vectorWeight)\n // Set stop word languages from config\n vectorStore.setStopWordsLanguages(config.memory.stopWordsLanguages)\n\n // Embedding: dari config \u2014 kalau ada endpoint, pake remote embedding\n // Kalau null \u2192 lightweight mode (TF-IDF sparse-only, zero dep)\n const embedConfig = config.embedding\n if (embedConfig && embedConfig.model) {\n vectorStore.setEmbeddingConfig(embedConfig.model, embedConfig.endpoint, embedConfig.apiKey)\n vectorStore.setLLM(llmEngine)\n }\n // Lightweight mode: tanpa embedder \u2192 VectorStore fallback ke sparse search otomatis\n\n contextCompressor.setLLM(llmEngine)\n verifier.detectLanguage(worktree)\n\n // Restore persisted model stats\n const savedModels = persistence.loadAll<Record<string, import(\"./core/model-registry.js\").ModelStats>>(\"models\")\n for (const m of savedModels) {\n modelRegistry.fromJSON(m.data)\n }\n\n // Restore persisted episodes and skills\n const savedEpisodes = persistence.loadAll<{ planGoal: string; outcome: string; decisions: string[]; filesChanged: string[]; sessionId: string; timestamp: string; tags: string[] }>(\"episodes\")\n for (const ep of savedEpisodes) {\n episodicStore.record(ep.data.sessionId, ep.data.planGoal, ep.data.outcome as \"success\" | \"partial\" | \"failed\", ep.data.decisions, ep.data.filesChanged)\n }\n // Auto-save episodes when recorded\n episodicStore.setPersistenceCallback((episode) => {\n persistence.save(\"episodes\", episode.sessionId, episode)\n })\n const savedSkills = persistence.loadAll<import(\"./memory/skill-format.js\").SkillDefinition>(\"skills\")\n for (const sk of savedSkills) {\n skillStore.importFromEnvelope(JSON.stringify(createMemoryEnvelope(sk.data, \"skill\")))\n }\n\n // Restore persisted prompt states (Stage IV: versioned prompt history)\n const savedPrompts = persistence.loadAll<Array<{ role: string; history: PromptEntry[] }>>(\"prompts\")\n if (savedPrompts.length > 0) {\n // Find the latest state and pass to RoleRegistry constructor\n const latest = savedPrompts.reduce((a, b) => {\n const aTime = new Date(a.updatedAt).getTime()\n const bTime = new Date(b.updatedAt).getTime()\n return aTime > bTime ? a : b\n })\n const promptData = latest.data\n for (const entry of promptData) {\n const state = roleRegistry.getPromptState(entry.role)\n if (state) {\n // Role already has initial history \u2014 skip\n continue\n }\n // Replay history into RoleRegistry (construct already set initial prompts)\n for (const hist of entry.history) {\n let currentPrompt = roleRegistry.getPrompt(entry.role)\n if (currentPrompt && hist.prompt !== currentPrompt) {\n roleRegistry.updatePrompt(entry.role as \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\", hist.prompt, hist.source, hist.description)\n }\n }\n }\n }\n\n try { await traceLogger.init() } catch { /* non-fatal: cannot create trace dir */ }\n\n // \u2500\u2500 Auto-update: fire-and-forget version check + download \u2500\u2500\n autoUpdatePlugin(__VERSION__)\n\n // \u2500\u2500 Config hot-reload propagation \u2500\u2500\n // Ketika config berubah di disk, module-module berikut di-update\n configLoader.onChange((newConfig) => {\n // 1. Vector store: search weights + stop words\n vectorStore.setSearchWeights(newConfig.memory.search.keywordWeight, newConfig.memory.search.vectorWeight)\n vectorStore.setStopWordsLanguages(newConfig.memory.stopWordsLanguages)\n\n // 2. Embedding config\n const embedCfg = newConfig.embedding\n if (embedCfg && embedCfg.model) {\n vectorStore.setEmbeddingConfig(embedCfg.model, embedCfg.endpoint, embedCfg.apiKey)\n }\n\n // 3. Agent delegation depth \u2014 propagate ke coordinator (akan dipakai untuk validasi depth)\n const maxDepth = newConfig.agent.maxDelegationDepth\n if (maxDepth > 0) {\n coordinator.setMaxDepth(maxDepth)\n }\n\n // 4. Session store TTL \u2014 propagate ke session store untuk expired session cleanup\n const forgetDays = newConfig.memory.forgetAfterDays\n if (forgetDays > 0) {\n sessionStore.setForgetAfterDays(forgetDays)\n }\n\n // 5. Trace retention \u2014 propagate ke trace logger untuk pruning\n const retentionDays = newConfig.storage.traceRetentionDays\n if (retentionDays > 0) {\n traceLogger.setRetentionDays(retentionDays)\n }\n })\n\n /** Helper: run the full self-evolution cycle and return a summary */\n async function runAutoEvolve(): Promise<string> {\n await traceLogger.flush()\n\n const allSkills = skillStore.getAll()\n const allEpisodes = episodicStore.getRecent(50)\n const uniqueSessions = new Set(allEpisodes.map(e => e.sessionId))\n\n let allTasks: AgentTask[] = []\n for (const sid of uniqueSessions) {\n allTasks = allTasks.concat(coordinator.getTasks(sid))\n }\n\n const allStepStates: Array<{ stepId: string; success: boolean; output: string }> = []\n for (const sid of uniqueSessions) {\n const session = sessionStore.getOrCreate(sid)\n const subtasks = session.plan?.intent.subtasks ?? []\n for (const step of subtasks) {\n const state = executor.getStepState(sid, step.id)\n if (state?.result) {\n allStepStates.push({\n stepId: step.id,\n success: state.result.success,\n output: state.result.output,\n })\n }\n }\n }\n\n let traces: Array<{ toolUsed: string; success: boolean; step: string }> = []\n const tracePath = `${worktree}/.agentic/trace.jsonl`\n try {\n const content = readFileSync(tracePath, \"utf-8\")\n for (const line of content.trim().split(\"\\n\").filter(Boolean)) {\n const parsed = JSON.parse(line)\n traces.push({\n toolUsed: parsed.toolUsed ?? \"unknown\",\n success: parsed.success ?? true,\n step: parsed.step ?? \"\",\n })\n }\n } catch { /* no traces yet */ }\n\n selfEvolver.feedSkills(allSkills)\n selfEvolver.feedEpisodes(allEpisodes)\n selfEvolver.feedTasks(allTasks)\n selfEvolver.feedStepStates(allStepStates)\n selfEvolver.feedTraces(traces)\n\n const report = selfEvolver.evolve()\n\n // Auto-apply role suggestions\n const appliedRoles: string[] = []\n for (const role of report.roleSuggestions) {\n try {\n coordinator.registerCustomRole({\n role: role.name,\n name: role.name,\n tools: role.suggestedTools,\n prompt: `You are ${role.name}. ${role.reason}\\n\\nTrigger: ${role.triggerPattern}`,\n })\n appliedRoles.push(role.name)\n } catch { }\n }\n\n // Auto-apply skill patches\n const patchedSkills: string[] = []\n for (const patch of report.skillPatches) {\n const record = skillStore.getById(patch.skillId)\n if (!record) continue\n const def = record.definition\n let modified = false\n\n for (const change of patch.suggestedChanges) {\n if (change.type === \"add_rollback\") {\n for (const step of def.workflow.steps) {\n if (!step.rollback) {\n step.rollback = change.detail\n modified = true\n }\n }\n }\n if (change.type === \"add_step\") {\n const newStep: import(\"./memory/skill-format.js\").SkillStep = {\n order: def.workflow.steps.length + 1,\n action: \"verify\",\n description: change.detail,\n expectedOutput: \"Step completed successfully\",\n }\n def.workflow.steps.push(newStep)\n modified = true\n }\n }\n\n if (modified) {\n def.quality.usageCount = record.usageCount\n def.quality.successRate = record.successRate\n def.audit.lastModified = new Date().toISOString()\n def.audit.modifiedBy = \"system\"\n def.meta.version++\n persistence.save(\"skills\", def.meta.id, def)\n patchedSkills.push(patch.skillName)\n }\n }\n\n // Auto-apply prompt patches (Stage IV: versioned, source-tracked)\n const appliedPatches: string[] = []\n for (const patch of report.promptPatches) {\n try {\n const existingPrompt = roleRegistry.getPrompt(patch.role)\n if (existingPrompt && !existingPrompt.includes(patch.instruction.slice(0, 40))) {\n const newPrompt = existingPrompt + `\\n\\n## Auto-Patched Instruction (from ${patch.errorCategory} errors)\\n${patch.instruction}`\n roleRegistry.updatePrompt(patch.role as \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\", newPrompt, \"auto-evolve\", `Patch from ${patch.errorCategory} errors (${patch.occurrences}x)`)\n persistence.save(\"prompts\", \"state\", roleRegistry.getAllPromptStates())\n appliedPatches.push(`${patch.role}: \"${patch.instruction.slice(0, 60)}...\"`)\n }\n } catch { /* non-fatal */ }\n }\n\n let result = `### \uD83D\uDD2E Auto-Evolution Complete\\n`\n result += `**Score:** ${report.improvementScore}/100\\n`\n result += `**Sessions:** ${report.metrics.totalSessions} | **Steps:** ${report.metrics.totalSteps} | **Success Rate:** ${(report.metrics.successRate * 100).toFixed(0)}%\\n`\n if (appliedRoles.length > 0) result += `**Roles Registered:** ${appliedRoles.join(\", \")}\\n`\n if (patchedSkills.length > 0) result += `**Skills Patched:** ${patchedSkills.join(\", \")}\\n`\n if (appliedPatches.length > 0) result += `**Prompts Patched:** ${appliedPatches.length}\\n`\n if (appliedRoles.length === 0 && patchedSkills.length === 0 && appliedPatches.length === 0) {\n result += `No changes needed \u2014 system is healthy.\\n`\n }\n return result.trim()\n }\n\n function ctxDir(context: { worktree: string; directory?: string }) {\n return context.worktree\n }\n\n return {\n tool: {\n agentic_plan: tool({\n description: \"Create a structured execution plan. Can auto-decompose feature requests using built-in templates (create/implement, fix/bug, refactor, test, deploy, migrate, doc, perf). Use `llmDecompose: true` for AI-powered decomposition. Call this FIRST for any multi-step task.\",\n args: {\n goal: tool.schema.string().describe(\"The overall goal of the task\"),\n constraints: tool.schema.array(tool.schema.string()).optional().describe(\"Constraints or requirements\"),\n relevantFiles: tool.schema.array(tool.schema.string()).optional().describe(\"Files relevant to this task\"),\n autoDecompose: tool.schema.boolean().optional().describe(\"Auto-decompose the goal into subtasks (default: true). Uses LLM first, falls back to built-in templates.\"),\n llmDecompose: tool.schema.boolean().optional().describe(\"Use LLM for smarter task decomposition (default: true, falls back to templates if LLM unavailable)\"),\n subtasks: tool.schema.array(tool.schema.object({\n id: tool.schema.string().describe(\"Unique identifier for this subtask\"),\n description: tool.schema.string().describe(\"What this subtask should accomplish\"),\n dependsOn: tool.schema.array(tool.schema.string()).optional().describe(\"IDs of subtasks that must be completed first\"),\n verificationCriteria: tool.schema.array(tool.schema.string()).optional().describe(\"How to verify this subtask succeeded\"),\n })).optional().describe(\"Manual subtask list. If omitted and autoDecompose is enabled, the planner will auto-generate steps.\"),\n },\n async execute(args, context) {\n llmEngine.setSessionId(context.sessionID)\n let subtasks = args.subtasks ?? []\n\n if (subtasks.length === 0 && args.autoDecompose !== false) {\n if (args.llmDecompose !== false) {\n await navigator.scan(worktree)\n const codebaseSummary = navigator.getSummary()\n try {\n const llmIntent = await planner.decomposeWithLLM(llmEngine, args.goal, codebaseSummary)\n subtasks = llmIntent.subtasks\n } catch {\n // Fall through to template-based\n }\n }\n\n if (subtasks.length === 0) {\n const decomposition = planner.decompose(args.goal, args.relevantFiles ?? [])\n if (decomposition.autoGenerated) {\n subtasks = decomposition.intent.subtasks\n }\n }\n }\n\n const intent: TaskIntent = {\n goal: args.goal,\n constraints: args.constraints ?? [],\n context: {\n relevantFiles: args.relevantFiles ?? [],\n dependencies: [],\n },\n subtasks: subtasks.map(s => ({\n id: s.id,\n description: s.description,\n dependsOn: s.dependsOn ?? [],\n verificationCriteria: s.verificationCriteria ?? [],\n })),\n }\n\n const plan = intentParser.createPlan(intent)\n const errors = intentParser.validatePlan(plan)\n\n executor.initExecution(context.sessionID, plan)\n sessionStore.getOrCreate(context.sessionID).plan = plan\n\n // Wire up dependency tracking from plan \u2014 step-level\n for (const step of subtasks) {\n for (const dep of (step.dependsOn ?? [])) {\n depTracker.addDependency(step.id, dep, \"imports\")\n }\n }\n\n // Wire file-level dependencies from navigator scan\n if (args.relevantFiles && args.relevantFiles.length > 0) {\n for (const file of args.relevantFiles) {\n depTracker.addDependency(`file:${file}`, `goal:${args.goal.slice(0, 40)}`, \"type-ref\")\n }\n }\n\n traceLogger.log({\n step: \"plan\",\n input: args.goal,\n output: JSON.stringify(plan),\n toolUsed: \"agentic_plan\",\n success: errors.length === 0,\n durationMs: 0,\n metadata: { errors, complexity: plan.complexity, autoDecomposed: subtasks !== args.subtasks, llmDecomposed: !!args.llmDecompose },\n })\n\n if (errors.length > 0) {\n return {\n output: `## Plan Created (with warnings)\\n\\n${errors.map(e => `\u26A0\uFE0F ${e}`).join(\"\\n\")}\\n\\n<details>\\n<summary>Plan JSON</summary>\\n\\n\\`\\`\\`json\\n${JSON.stringify(plan, null, 2)}\\n\\`\\`\\`\\n</details>`,\n metadata: { hasErrors: true, plan },\n }\n }\n\n const stepList = plan.intent.subtasks.map((s, i) =>\n `${i + 1}. **${s.id}** \u2014 ${s.description}${s.dependsOn.length ? ` (requires: ${s.dependsOn.join(\", \")})` : \"\"}`\n ).join(\"\\n\")\n\n const autoTag = subtasks !== args.subtasks ? \" (auto-decomposed)\" : \"\"\n\n return {\n output: `## Plan Created${autoTag}\\n\\n**Goal:** ${plan.intent.goal}\\n**Complexity:** ${plan.complexity}\\n**Steps:** ${plan.estimatedSteps}\\n\\n### Steps\\n${stepList}\\n\\nStart with \\`agentic_execute\\` for the first ready step.`,\n metadata: { plan },\n }\n },\n }),\n\n agentic_nav: tool({\n description: \"Scan the project codebase and find relevant files for a task. Use this to understand the project structure before planning, or to find which files to modify.\",\n args: {\n query: tool.schema.string().describe(\"What you're looking for \u2014 a task description, module name, or feature keyword\"),\n maxResults: tool.schema.number().optional().describe(\"Maximum number of files to return (default: 10)\"),\n showSummary: tool.schema.boolean().optional().describe(\"Show full project structure summary\"),\n },\n async execute(args, _context) {\n const maxResults = args.maxResults ?? 10\n await navigator.scan(worktree)\n const files = navigator.findRelevantFiles(args.query, maxResults)\n\n // Index files into vector store for hybrid search\n for (const file of files) {\n vectorStore.addDocument(`file:${file}`, `File ${file}`, {\n type: \"file\",\n path: file,\n tags: [],\n })\n }\n\n let output = `## \uD83D\uDD0D Codebase Navigator\\n\\n**Query:** ${args.query}\\n\\n`\n\n if (args.showSummary) {\n output += navigator.getSummary() + \"\\n\\n\"\n }\n\n if (files.length === 0) {\n output += \"No matching files found. Try a different query, or use `showSummary: true` to see the project structure.\"\n } else {\n output += `### Matching Files (${files.length})\\n`\n output += files.map(f => `- \\`${f}\\``).join(\"\\n\")\n\n const testFiles = files.flatMap(f => navigator.getTestFiles(f))\n if (testFiles.length > 0) {\n output += `\\n\\n### Related Test Files\\n`\n output += testFiles.map(f => `- \\`${f}\\``).join(\"\\n\")\n }\n }\n\n traceLogger.log({\n step: \"nav\",\n input: args.query,\n output: `${files.length} files found`,\n toolUsed: \"agentic_nav\",\n success: true,\n durationMs: 0,\n })\n\n return { output, metadata: { files, projectSummary: args.showSummary ? navigator.getSummary() : undefined } }\n },\n }),\n\n agentic_execute: tool({\n description: \"Record completion of a subtask. Auto-verifies compilation on success. Includes error recovery guidance + error propagation analysis on failure. Supports user feedback for continuous learning.\",\n args: {\n stepId: tool.schema.string().describe(\"The ID of the step that was executed\"),\n success: tool.schema.boolean().describe(\"Whether the step completed successfully\"),\n output: tool.schema.string().describe(\"Summary of what was done \u2014 what files changed, what was implemented\"),\n filesModified: tool.schema.array(tool.schema.string()).optional().describe(\"List of files that were modified or created in this step\"),\n error: tool.schema.string().optional().describe(\"Error message if the step failed\"),\n autoVerify: tool.schema.boolean().optional().describe(\"Auto-run compile verification (default: true when success=true)\"),\n feedback: tool.schema.enum([\"positive\", \"negative\"]).optional().describe(\"User feedback on the result. Positive boosts skill confidence; negative triggers adaptation (Gap #9: continuous learning from feedback)\"),\n },\n async execute(args, context) {\n llmEngine.setSessionId(context.sessionID)\n const startTime = Date.now()\n const projectDir = ctxDir(context)\n \n const taskType = detectTaskType(args.output)\n \n const session = sessionStore.getOrCreate(context.sessionID)\n session.currentTaskType = taskType\n\n if (args.filesModified && args.filesModified.length > 0) {\n depTracker.recordChange(context.sessionID, args.stepId, args.filesModified)\n // Update file-level dependency graph for modified/created files\n for (const f of args.filesModified) {\n const absPath = join(projectDir, f)\n try {\n const content = readFileSync(absPath, \"utf-8\")\n depTracker.updateFile(absPath, content, projectDir)\n } catch { /* non-fatal: file may have been deleted */ }\n }\n }\n\n executor.recordResult(context.sessionID, {\n stepId: args.stepId,\n success: args.success,\n output: args.output,\n filesModified: args.filesModified ?? [],\n error: args.error,\n })\n\n sessionStore.addTurn(context.sessionID, {\n role: \"tool\",\n content: `Step ${args.stepId}: ${args.success ? \"SUCCESS\" : \"FAILED\"} \u2014 ${args.output}`,\n timestamp: startTime,\n })\n\n // Checkpoints for risky operations\n const newCheckpoints = checkpoints.evaluate(args.stepId, args.output, args.filesModified ?? [])\n\n let response = `## Step ${args.stepId}: ${args.success ? \"\u2705 SUCCESS\" : \"\u274C FAILED\"}\\n\\n${args.output}\\n`\n\n if (newCheckpoints.length > 0) {\n response += `\\n### \u26A0\uFE0F Checkpoints\\n`\n for (const cp of newCheckpoints) {\n const icon = cp.type === \"block\" ? \"\uD83D\uDED1\" : cp.type === \"review\" ? \"\uD83D\uDC40\" : \"\u26A0\uFE0F\"\n response += `${icon} **${cp.type.toUpperCase()}**: ${cp.description}\\n`\n response += ` _${cp.context}_\\n`\n }\n }\n\n // Enforce block checkpoints\n const blockStatus = checkpoints.isBlocked()\n if (blockStatus.blocked) {\n response += `\\n### \uD83D\uDED1 BLOCKED\\n${blockStatus.reason}\\n\\n`\n response += `Use \\`agentic_execute\\` with the same stepId to acknowledge and proceed, or investigate the issue first.`\n return { output: response, metadata: { progress: executor.getProgress(context.sessionID), blocked: true } }\n }\n\n let verifyResult = undefined\n if (args.success && args.autoVerify !== false) {\n response += `\\n### Auto-Verify\\n`\n const changedFiles = args.filesModified ?? []\n \n // Use verifyAllDeep to include semantic check (Gap #4 fix)\n const session = sessionStore.getOrCreate(context.sessionID)\n const intent = session.plan?.intent.goal ?? args.output\n const requireSemantic = configLoader.get().agent.requireSemanticCheck\n verifyResult = await verifier.verifyAllDeep(args.stepId, projectDir, intent, changedFiles, requireSemantic)\n \n if (verifyResult.passed) {\n response += `\u2705 All checks passed\\n`\n // Show individual check results\n verifyResult.checks.forEach(c => {\n response += ` ${c.passed ? \"\u2705\" : \"\u274C\"} ${c.name}\\n`\n })\n } else {\n response += `\u274C Verification failed after this step!\\n`\n response += verifyResult.checks.map(c =>\n `${c.passed ? \"\u2705\" : \"\u274C\"} **${c.name}**\\n\\`\\`\\`\\n${c.output.slice(0, 400)}\\n\\`\\`\\``\n ).join(\"\\n\\n\")\n response += `\\n\\n\u26A0\uFE0F **Recommendation:** Run \\`agentic_reflect\\` on this step for propagation analysis and fix suggestions.`\n }\n }\n\n if (args.success && configLoader.get().agent.autoHallucinationCheck) {\n response += `\\n### Auto-Hallucination Check\\n`\n const guardResult = hallucinationGuard.check(args.output, args.filesModified ?? [])\n\n if (guardResult.claims.length > 0) {\n const failedClaims = guardResult.claims.filter((c: any) => !c.verified)\n const hallucinationRate = failedClaims.length / guardResult.claims.length\n\n if (failedClaims.length > 0) {\n response += `\u26A0\uFE0F Detected ${failedClaims.length}/${guardResult.claims.length} unverified claims (hallucination rate: ${(hallucinationRate * 100).toFixed(1)}%)\\n`\n failedClaims.forEach((c: any) => {\n response += ` \u274C ${c.type}: ${c.claim}\\n`\n })\n\n const modelId = llmEngine.getCurrentModel()\n if (modelId) {\n modelRegistry.recordHallucination(modelId)\n }\n\n const threshold = configLoader.get().agent.hallucinationThreshold\n const blockEnabled = configLoader.get().agent.blockOnHallucination\n if (hallucinationRate >= threshold && blockEnabled) {\n response += `\\n\uD83D\uDED1 **BLOCKED**: Hallucination rate ${(hallucinationRate * 100).toFixed(1)}% exceeds threshold ${(threshold * 100).toFixed(1)}%\\n`\n response += `This step will be marked as FAILED to prevent cascading errors from phantom files/functions.\\n`\n response += `\\n\u26A0\uFE0F **Recommendation:** Review the step output and verify all file/function references exist before proceeding.`\n \n executor.recordResult(context.sessionID, {\n stepId: args.stepId,\n success: false,\n output: args.output,\n filesModified: args.filesModified ?? [],\n error: `Hallucination detected: ${failedClaims.length} unverified claims`,\n })\n\n return { output: response, metadata: { progress: executor.getProgress(context.sessionID), blocked: true, hallucinationDetected: true } }\n }\n } else {\n response += `\u2705 All ${guardResult.claims.length} claims verified\\n`\n }\n } else {\n response += `\u2705 No claims detected (clean output)\\n`\n }\n }\n\n if (!args.success) {\n const modifiedFiles = executor.getAllFilesModified(context.sessionID)\n const analysis = await errorAnalyzer.analyzeDeep(args.error ?? args.output, modifiedFiles)\n const maxAllowed = executor.getMaxRetries(analysis.category)\n const canRetry = executor.canRetry(context.sessionID, args.stepId, analysis.category)\n const retriesUsed = executor.getRetryCount(context.sessionID, args.stepId)\n const retriesLeft = maxAllowed - retriesUsed\n\n response += `\\n### Error Analysis\\n`\n response += `**Category:** \\`${analysis.category}\\` | **Severity:** ${analysis.severity}\\n`\n response += `**Likely cause:** ${analysis.likelyRootCause}\\n`\n\n // Error propagation trace\n const session = sessionStore.getOrCreate(context.sessionID)\n const planSteps = session.plan?.intent.subtasks.map(s => s.id) ?? []\n const propAnalysis = depTracker.analyzeErrorPropagation(context.sessionID, args.stepId, args.error ?? args.output, planSteps)\n\n if (propAnalysis.likelyCulprit) {\n response += `\\n### \uD83D\uDD17 Error Propagation Trace\\n`\n response += `**Likely origin:** \\`${propAnalysis.likelyCulprit}\\`\\n`\n response += `**Propagation path:** ${propAnalysis.propagationPath.length > 0 ? propAnalysis.propagationPath.map(p => `\\`${p}\\``).join(\" \u2192 \") : \"Direct failure\"}\\n`\n response += `**Suggestion:** ${propAnalysis.suggestion}\\n`\n }\n\n response += `\\n**Suggested fix:** ${analysis.suggestedFix}\\n`\n\n if (canRetry) {\n response += `\\n\uD83D\uDD04 **Retries remaining:** ${retriesLeft}/${maxAllowed} (${analysis.category}) \u2014 fix the issue and call \\`agentic_execute\\` again.`\n } else {\n response += `\\n\uD83D\uDED1 **Max retries (${maxAllowed}) reached for ${analysis.category}.** Address the underlying issue or revise the plan.`\n }\n\n // Feed failure to ContinuousEvolution\n continuousEvolution.feedStepResult({\n stepId: args.stepId,\n success: false,\n output: args.output,\n sessionId: context.sessionID,\n timestamp: startTime,\n category: analysis.category,\n })\n }\n\n if (args.success) {\n // Feed success to ContinuousEvolution\n continuousEvolution.feedStepResult({\n stepId: args.stepId,\n success: true,\n output: args.output,\n sessionId: context.sessionID,\n timestamp: startTime,\n })\n }\n\n const progress = executor.getProgress(context.sessionID)\n const nextStep = executor.getNextStep(context.sessionID)\n\n response += `\\n### Progress\\n`\n response += `\\`\\`\\`\\n`\n response += `\u2705 Done: ${progress.completed}\\n`\n response += `\u274C Failed: ${progress.failed}\\n`\n response += `\uD83D\uDD12 Blocked: ${progress.blocked}\\n`\n response += `\u23F3 Remaining: ${progress.total - progress.completed - progress.failed - progress.blocked}\\n`\n response += `\\`\\`\\`\\n`\n\n if (args.success && nextStep) {\n response += `\\n### Next\\n\u25B6 **${nextStep.id}** \u2014 ${nextStep.description}`\n } else if (args.success && !nextStep) {\n response += `\\n### \uD83C\uDF89 All steps complete!\\nRun \\`agentic_verify\\` for final verification.`\n\n // Record episode\n const session = sessionStore.getOrCreate(context.sessionID)\n if (session.plan) {\n const allSuccess = executor.isHealthy(context.sessionID)\n const allFiles = executor.getAllFilesModified(context.sessionID)\n const decisions = executor.getCompletedSteps(context.sessionID).map(() => \"completed\")\n episodicStore.record(\n context.sessionID,\n session.plan.intent.goal,\n allSuccess ? \"success\" : \"partial\",\n decisions,\n allFiles,\n )\n }\n }\n\n // \u2500\u2500 User Feedback for Continuous Learning (Gap #9) \u2500\u2500\n if (args.feedback) {\n const isPositive = args.feedback === \"positive\"\n response += `\\n### \uD83D\uDCDD Feedback Recorded\\n`\n response += `${isPositive ? \"\u2705 Positive \u2014 confidence increased\" : \"\u274C Negative \u2014 adapting...\"}\\n`\n\n // Update skill success rates based on feedback\n const session = sessionStore.getOrCreate(context.sessionID)\n const goal = session.plan?.intent.goal ?? args.output\n const existingSkills = skillStore.find(goal)\n for (const skill of existingSkills.slice(0, 3)) {\n if (isPositive) {\n // Boost: record success\n skill.usageCount++\n skill.successRate = Math.min(1, skill.successRate + 0.05)\n persistence.save(\"skills\", skill.definition.meta.id, skill.definition)\n } else {\n // Penalize: report failure\n skillStore.reportFailure(skill.definition.meta.id)\n }\n }\n\n // Negative feedback \u2192 trigger adaptation\n if (!isPositive) {\n // Increase retry allowance for this error category\n const modifiedFiles = executor.getAllFilesModified(context.sessionID)\n const feedbackAnalysis = await errorAnalyzer.analyzeDeep(args.output, modifiedFiles)\n const currentMax = executor.getMaxRetries(feedbackAnalysis.category)\n executor.setRetryPolicy(feedbackAnalysis.category, Math.min(currentMax + 1, 5))\n response += ` **Retry limit increased:** \\`${feedbackAnalysis.category}\\` \u2192 ${Math.min(currentMax + 1, 5)}\\n`\n\n // Feed into continuous evolution\n continuousEvolution.feedStepResult({\n stepId: `feedback-${args.stepId}`,\n success: false,\n output: `User negative feedback: ${args.output.slice(0, 200)}`,\n sessionId: context.sessionID,\n timestamp: Date.now(),\n category: feedbackAnalysis.category,\n })\n\n // Check if evolution should trigger \u2014 auto-execute if so\n const trigger = continuousEvolution.shouldEvolve(context.sessionID)\n if (trigger) {\n response += ` \uD83D\uDD04 **Auto-evolution triggered:** ${trigger.reason}\\n`\n try {\n const evolveSummary = await runAutoEvolve()\n response += ` ${evolveSummary.replace(/\\n/g, \"\\n \")}\\n`\n } catch (e) {\n response += ` \u26A0\uFE0F Auto-evolution encountered an error: ${(e as Error).message}\\n`\n }\n }\n }\n }\n\n return { output: response, metadata: { progress, nextStep: nextStep?.id, verifyResult } }\n },\n }),\n\n agentic_reflect: tool({\n description: \"Analyze a failed step. Diagnoses the error category, traces error propagation across the step chain, and suggests a recovery plan.\",\n args: {\n stepId: tool.schema.string().describe(\"The ID of the failed step to analyze\"),\n errorDetails: tool.schema.string().optional().describe(\"Additional error context (full stack trace, test output, etc.)\"),\n attemptedFix: tool.schema.string().optional().describe(\"What you tried to fix the error (if any)\"),\n },\n async execute(args, context) {\n llmEngine.setSessionId(context.sessionID)\n const stepState = executor.getStepState(context.sessionID, args.stepId)\n if (!stepState || !stepState.result) {\n return { output: `No execution record for step \"${args.stepId}\". Has it been run via \\`agentic_execute\\`?` }\n }\n\n if (stepState.result.success) {\n return { output: `Step \"${args.stepId}\" was successful \u2014 no reflection needed.` }\n }\n\n const errorText = [args.errorDetails, stepState.result.output, stepState.result.error]\n .filter(Boolean)\n .join(\"\\n\")\n const modifiedFiles = executor.getAllFilesModified(context.sessionID)\n const analysis = await errorAnalyzer.analyzeDeep(errorText, modifiedFiles)\n const canRetry = executor.canRetry(context.sessionID, args.stepId)\n const retriesUsed = executor.getRetryCount(context.sessionID, args.stepId)\n\n if (args.attemptedFix) {\n executor.recordFixAttempt(context.sessionID, args.stepId, args.attemptedFix, false)\n }\n\n // Error propagation analysis\n const session = sessionStore.getOrCreate(context.sessionID)\n const planSteps = session.plan?.intent.subtasks.map(s => s.id) ?? []\n const propAnalysis = depTracker.analyzeErrorPropagation(context.sessionID, args.stepId, errorText, planSteps)\n\n let output = `## \uD83D\uDD0D Error Analysis: Step \"${args.stepId}\"\\n\\n`\n output += `**Category:** \\`${analysis.category}\\`\\n`\n output += `**Severity:** ${analysis.severity}\\n`\n output += `**Retry #${retriesUsed}/3**\\n\\n`\n output += `### Root Cause\\n${analysis.likelyRootCause}\\n\\n`\n\n if (propAnalysis.likelyCulprit || propAnalysis.propagationPath.length > 0) {\n output += `### \uD83D\uDD17 Error Propagation Trace\\n`\n if (propAnalysis.likelyCulprit) {\n output += `**Likely origin:** \\`${propAnalysis.likelyCulprit}\\`\\n`\n }\n if (propAnalysis.propagationPath.length > 0) {\n output += `**Propagation path:** ${propAnalysis.propagationPath.map(p => `\\`${p}\\``).join(\" \u2192 \")}\\n`\n }\n output += `**Suggestion:** ${propAnalysis.suggestion}\\n\\n`\n }\n\n output += `### Suggested Fix\\n${analysis.suggestedFix}\\n`\n\n if (modifiedFiles.length > 0) {\n output += `\\n### Modified Files (likely sources)\\n`\n output += modifiedFiles.map(f => `- \\`${f}\\``).join(\"\\n\") + \"\\n\"\n }\n\n if (analysis.category === \"compile\" || analysis.category === \"type\") {\n output += `\\n### Recovery Plan\\n1. Check the error output for exact file path and line number\\n2. Fix the syntax/type issue\\n3. Call \\`agentic_execute\\` with \\`success: true\\`\\n`\n } else if (analysis.category === \"test\") {\n output += `\\n### Recovery Plan\\n1. Verify if the test expectation is still correct after changes\\n2. Update code or test accordingly\\n3. Retry the step\\n`\n } else {\n output += `\\n### Recovery Plan\\n1. Review what the step was supposed to accomplish\\n2. Check for unintended side effects in modified files\\n3. Fix and retry\\n`\n }\n\n if (canRetry) {\n output += `\\n---\\n\uD83D\uDD04 **${3 - retriesUsed} retries left.** Fix and call \\`agentic_execute\\` to retry.`\n } else {\n output += `\\n---\\n\uD83D\uDED1 **No retries remaining.** Consider adding a new plan step for this fix.`\n }\n\n return { output }\n },\n }),\n\n agentic_verify: tool({\n description: \"Run full verification: compile + lint + test suite. Auto-detects language (TypeScript, Python, Go, Rust, JavaScript). Includes error analysis on failure.\",\n args: {\n stepId: tool.schema.string().optional().describe(\"Label for this verification\"),\n projectDir: tool.schema.string().optional().describe(\"Project directory (default: worktree)\"),\n },\n async execute(args, context) {\n const projectDir = args.projectDir ?? ctxDir(context)\n const stepId = args.stepId ?? \"full\"\n\n const result = verifier.verifyAll(stepId, projectDir)\n\n traceLogger.log({\n step: `verify:${stepId}`,\n input: projectDir,\n output: JSON.stringify(result),\n toolUsed: \"agentic_verify\",\n success: result.passed,\n durationMs: 0,\n })\n\n const checkOutput = result.checks.map(c =>\n `${c.passed ? \"\u2705\" : \"\u274C\"} **${c.name}**\\n\\`\\`\\`\\n${c.output.slice(0, 600)}\\n\\`\\`\\``\n ).join(\"\\n\\n\")\n\n if (result.passed) {\n return { output: `## \u2705 Verification Passed\\n\\n${checkOutput}`, metadata: result }\n }\n\n const analysis = await errorAnalyzer.analyzeDeep(result.errors.join(\"\\n\"), [])\n return {\n output: `## \u274C Verification Failed\\n\\n${checkOutput}\\n\\n### Analysis\\n**Category:** \\`${analysis.category}\\`\\n**Likely cause:** ${analysis.likelyRootCause}\\n**Fix:** ${analysis.suggestedFix}`,\n metadata: result,\n }\n },\n }),\n\n agentic_status: tool({\n description: \"Show execution dashboard: progress bar, health, blocked steps, dependency graph, retry history, and file change summary.\",\n args: {},\n async execute(_args, context) {\n const progress = executor.getProgress(context.sessionID)\n const nextStep = executor.getNextStep(context.sessionID)\n const blockedSteps = executor.getBlockedSteps(context.sessionID)\n const isComplete = executor.isComplete(context.sessionID)\n const isHealthy = executor.isHealthy(context.sessionID)\n const allFiles = executor.getAllFilesModified(context.sessionID)\n\n let output = `## \uD83D\uDCCA Execution Dashboard\\n\\n`\n\n if (progress.total > 0) {\n const pct = Math.min(100, Math.round((progress.completed / progress.total) * 100))\n const barLen = 20\n const filled = Math.min(barLen, Math.round((pct / 100) * barLen))\n output += `\\`\\`\\`\\n[${\"\u2588\".repeat(filled)}${\"\u2591\".repeat(barLen - filled)}] ${pct}%\\n\\`\\`\\`\\n`\n }\n\n output += `**Health:** ${isHealthy ? \"\u2705 All passing\" : \"\u26A0\uFE0F Errors\"}\\n`\n output += `**Status:** ${isComplete ? \"\uD83C\uDF89 Complete\" : \"\u23F3 In progress\"}\\n\\n`\n output += `| Status | Count |\\n|--------|-------|\\n`\n output += `| \u2705 Done | ${progress.completed} |\\n`\n output += `| \u274C Failed | ${progress.failed} |\\n`\n output += `| \uD83D\uDD12 Blocked | ${progress.blocked} |\\n`\n\n if (nextStep) {\n output += `\\n### Next Ready\\n\u25B6 **${nextStep.id}** \u2014 ${nextStep.description}\\n`\n }\n\n if (blockedSteps.length > 0) {\n output += `\\n### \uD83D\uDD12 Blocked Steps\\n`\n for (const b of blockedSteps) {\n output += `- **${b.id}** \u2014 ${b.description}\\n`\n output += ` Waiting on: ${b.blockedBy.map(d => `\\`${d}\\``).join(\", \")}\\n`\n }\n }\n\n if (allFiles.length > 0) {\n output += `\\n### \uD83D\uDCC1 Files Modified\\n`\n output += allFiles.map(f => `- \\`${f}\\``).join(\"\\n\") + \"\\n\"\n }\n\n output += `\\n### \uD83E\uDD16 Model Reliability\\n`\n const modelSummary = modelRegistry.getSummary()\n output += modelSummary + \"\\n\"\n\n // Session model preferences (Gap: per-role model selection)\n const modelPrefs = sessionStore.getAllModelPreferences(context.sessionID)\n if (modelPrefs.length > 0) {\n output += `\\n### \uD83C\uDFAF Per-Role Model Preferences\\n`\n output += modelPrefs.map(p => `- **${p.role}** \u2192 \\`${p.model}\\``).join(\"\\n\") + \"\\n\"\n }\n\n // Evolution trend\n const trend = continuousEvolution.getTrend()\n if (trend.overall.total > 0) {\n const dirIcon = trend.rolling.direction === \"improving\" ? \"\uD83D\uDCC8\" : trend.rolling.direction === \"degrading\" ? \"\uD83D\uDCC9\" : \"\uD83D\uDCCA\"\n output += `\\n### \uD83D\uDD04 Evolution Trend\\n`\n output += `**Overall:** ${(trend.overall.successRate * 100).toFixed(0)}% (${trend.overall.success}/${trend.overall.total} steps)\\n`\n output += `**Recent (last ${trend.rolling.windowSize}):** ${(trend.rolling.successRate * 100).toFixed(0)}% \u2014 ${dirIcon} ${trend.rolling.direction}\\n`\n if (trend.degradationDetected) {\n output += `\u26A0\uFE0F **Performance degradation detected!** Auto-running self-evolution...\\n`\n try {\n output += `${(await runAutoEvolve()).replace(/\\n/g, \"\\n\")}\\n`\n } catch {\n output += `\u26A0\uFE0F Auto-evolution encountered an error.\\n`\n }\n }\n // Forecast (Gap #12)\n if (trend.forecast && trend.forecast.bucketRates.length > 0) {\n output += `**Forecast next window:** ${(trend.forecast.nextWindowRate * 100).toFixed(0)}%`\n if (trend.forecast.critical) {\n output += ` \uD83D\uDD34 **Critical**`\n }\n if (trend.forecast.stepsUntilCritical !== null) {\n output += ` (~${trend.forecast.stepsUntilCritical} steps to 50%)`\n }\n output += `\\n`\n output += `**Trend buckets:** ${trend.forecast.bucketRates.map(r => `${(r * 100).toFixed(0)}%`).join(\" \u2192 \")}\\n`\n }\n if (trend.recommendations.length > 0) {\n output += `**Tips:**\\n`\n output += trend.recommendations.map(r => `- ${r}`).join(\"\\n\") + \"\\n\"\n }\n }\n\n // Live evaluation score\n const liveScore = liveEvaluator.computeScore()\n if (liveScore.totalSteps > 0 || liveScore.totalDelegations > 0) {\n output += `\\n### \uD83D\uDCCA Live Evaluation Score\\n`\n const bar = \"\u2588\".repeat(Math.round(liveScore.overall / 5))\n output += `**Overall:** ${liveScore.overall}/100 ${bar.padEnd(20, \"\u2591\")}\\n`\n for (const [name, dim] of Object.entries(liveScore.dimensions)) {\n if (dim.weight > 0) {\n output += `- **${name}:** ${(dim.score * 100).toFixed(0)}% (target ${(dim.target * 100).toFixed(0)}%)\\n`\n }\n }\n output += `\\n`\n }\n\n return { output, metadata: { progress, nextStep: nextStep?.id, blockedSteps, isComplete, isHealthy } }\n },\n }),\n\n agentic_context: tool({\n description: \"View and compress the execution context. When approaching context limits, this tool summarizes the conversation history into a compact form preserving key decisions, file changes, and invariants.\",\n args: {\n action: tool.schema.enum([\"view\", \"compress\"]).describe(\"'view' shows current context stats; 'compress' generates a compressed context prompt\"),\n },\n async execute(args, context) {\n const turns = sessionStore.getContext(context.sessionID, 100)\n const session = sessionStore.getOrCreate(context.sessionID)\n const allFiles = executor.getAllFilesModified(context.sessionID)\n const decisions: string[] = []\n\n if (args.action === \"view\") {\n let output = `## \uD83E\uDDE0 Context Status\\n\\n`\n output += `**Turns in memory:** ${turns.length}\\n`\n output += `**Files tracked:** ${allFiles.length}\\n`\n output += `**Plan steps:** ${session.plan?.intent.subtasks.length ?? 0}\\n`\n\n const summary = await contextCompressor.compressWithLLM(\n session.plan?.intent.goal ?? \"N/A\",\n turns,\n decisions,\n allFiles,\n )\n\n output += `**Estimated tokens:** ~${summary.estimatedTokens}\\n`\n\n const shouldCompress = contextCompressor.shouldCompress(turns.length, summary.estimatedTokens)\n if (shouldCompress) {\n output += `\\n\u26A0\uFE0F **Context window approaching capacity.** Run \\`agentic_context\\` with \\`action: \"compress\"\\` to compact.\\n`\n } else {\n output += `\\n\u2705 Context is healthy.\\n`\n }\n\n return { output }\n }\n\n // Compress \u2014 use LLM-enhanced version when available\n const summary = await contextCompressor.compressWithLLM(\n session.plan?.intent.goal ?? \"N/A\",\n turns,\n decisions,\n allFiles,\n )\n\n const prompt = contextCompressor.compressToPrompt(summary)\n\n let output = `## \uD83D\uDDDC\uFE0F Context Compressed\\n\\n`\n output += `Compressed ${turns.length} turns into ~${summary.estimatedTokens} tokens.\\n\\n`\n output += prompt\n\n traceLogger.log({\n step: \"context:compress\",\n input: `${turns.length} turns`,\n output: `${summary.estimatedTokens} tokens`,\n toolUsed: \"agentic_context\",\n success: true,\n durationMs: 0,\n })\n\n return { output }\n },\n }),\n\n agentic_snapshot: tool({\n description: \"Save or restore execution snapshots. Use 'save' to checkpoint current state (plan progress, file changes, decisions). Use 'list' to see all snapshots.\",\n args: {\n action: tool.schema.enum([\"save\", \"list\"]).describe(\"'save' creates a checkpoint; 'list' shows all saved snapshots\"),\n label: tool.schema.string().optional().describe(\"Optional label for the snapshot (e.g., 'after-types')\"),\n },\n async execute(args, context) {\n if (args.action === \"save\") {\n const progress = executor.getProgress(context.sessionID)\n const allFiles = executor.getAllFilesModified(context.sessionID)\n const session = sessionStore.getOrCreate(context.sessionID)\n const planGoal = session.plan?.intent.goal ?? \"N/A\"\n\n const snapshot = {\n label: args.label ?? `snap-${Date.now()}`,\n timestamp: new Date().toISOString(),\n planGoal,\n progress,\n filesModified: allFiles,\n completedSteps: session.plan?.intent.subtasks.filter(s =>\n executor.getCompletedSteps(context.sessionID).includes(s.id)\n ).map(s => s.id) ?? [],\n }\n\n session.artifacts.set(`snapshot:${snapshot.label}`, JSON.stringify(snapshot))\n\n traceLogger.log({\n step: \"snapshot:save\",\n input: snapshot.label,\n output: `${allFiles.length} files, ${progress.completed}/${progress.total} steps`,\n toolUsed: \"agentic_snapshot\",\n success: true,\n durationMs: 0,\n })\n\n return {\n output: `## \uD83D\uDCF8 Snapshot Saved\\n\\n**Label:** \\`${snapshot.label}\\`\\n**Progress:** ${progress.completed}/${progress.total}\\n**Files:** ${allFiles.length}\\n**Timestamp:** ${snapshot.timestamp}`,\n }\n }\n\n // List snapshots\n const session = sessionStore.getOrCreate(context.sessionID)\n const snapshots: string[] = []\n for (const [key] of session.artifacts) {\n if (key.startsWith(\"snapshot:\")) {\n snapshots.push(key.replace(\"snapshot:\", \"\"))\n }\n }\n\n if (snapshots.length === 0) {\n return { output: \"No snapshots saved yet. Use `action: \\\"save\\\"` to create one.\" }\n }\n\n return { output: `## \uD83D\uDCF8 Snapshots\\n\\n${snapshots.map(s => `- \\`${s}\\``).join(\"\\n\")}` }\n },\n }),\n\n agentic_pipeline: tool({\n description: \"Define and run multi-agent workflow pipelines. Chain PM \u2192 Architect \u2192 Developer \u2192 QA for complete feature development. Includes cross-validation between stages.\",\n args: {\n action: tool.schema.enum([\"define\", \"list\", \"run\", \"status\", \"suggest\"]).describe(\"'define' to create a new pipeline; 'list' to show existing; 'run' to start a pipeline; 'status' to check progress; 'suggest' to auto-suggest a pipeline\"),\n pipelineId: tool.schema.string().optional().describe(\"Pipeline ID (for define/run/status)\"),\n stages: tool.schema.array(tool.schema.object({\n role: tool.schema.string().describe(\"Agent role for this stage\"),\n description: tool.schema.string().describe(\"What this stage should accomplish\"),\n validationCriteria: tool.schema.array(tool.schema.string()).optional().describe(\"Criteria to validate this stage\"),\n })).optional().describe(\"Pipeline stages (for define action)\"),\n name: tool.schema.string().optional().describe(\"Pipeline name (for define action)\"),\n description: tool.schema.string().optional().describe(\"Task description (for suggest action)\"),\n },\n async execute(args, context) {\n switch (args.action) {\n case \"define\": {\n if (!args.pipelineId || !args.stages || args.stages.length === 0) {\n return { output: \"pipelineId and stages (non-empty array) required.\" }\n }\n const pipeline: WorkflowPipeline = {\n id: args.pipelineId,\n name: args.name ?? args.pipelineId,\n stages: args.stages,\n createdAt: Date.now(),\n }\n orchestrator.definePipeline(pipeline)\n return {\n output: `## \uD83D\uDCCB Pipeline Defined\\n\\n**ID:** \\`${pipeline.id}\\`\\n**Name:** ${pipeline.name}\\n**Stages:** ${pipeline.stages.length}\\n\\n` +\n pipeline.stages.map((s, i) => `${i + 1}. **${s.role}** \u2014 ${s.description}`).join(\"\\n\"),\n }\n }\n\n case \"list\": {\n const pipelines = orchestrator.listPipelines()\n if (pipelines.length === 0) return { output: \"No pipelines defined. Use `action: \\\"define\\\"` to create one.\" }\n let out = `## \uD83D\uDCCB Defined Pipelines (${pipelines.length})\\n\\n`\n for (const p of pipelines) {\n out += `**${p.name}** (\\`${p.id}\\`) \u2014 ${p.stages.length} stages\\n`\n out += p.stages.map(s => ` - ${s.role}: ${s.description}`).join(\"\\n\") + \"\\n\\n\"\n }\n return { output: out }\n }\n\n case \"suggest\": {\n const suggested = orchestrator.getSuggestedPipeline(args.description ?? \"\")\n const pipeline = orchestrator.getPipeline(suggested)\n if (!pipeline) return { output: `Suggested pipeline: \\`${suggested}\\`. Run \\`action: \"run\"\\` with this pipelineId.` }\n let out = `## \uD83D\uDCA1 Suggested Pipeline: **${pipeline.name}**\\n\\n`\n out += `Run \\`agentic_pipeline\\` with \\`action: \"run\"\\` and \\`pipelineId: \"${pipeline.id}\"\\` to start.\\n\\n`\n out += pipeline.stages.map((s, i) => {\n const category = s.model ?? roleRegistry.suggestModel(s.role)\n const resolved = modelRegistry.resolveAlias(category)\n const modelLabel = resolved.length > 0 && resolved[0] !== category ? `${resolved[0]} (${category})` : category\n return `${i + 1}. **${s.role}** \u2014 ${s.description} (model: ${modelLabel})`\n }).join(\"\\n\")\n return { output: out }\n }\n\n case \"run\": {\n if (!args.pipelineId) return { output: \"pipelineId required.\" }\n const pipeline = orchestrator.getPipeline(args.pipelineId)\n if (!pipeline) return { output: `Pipeline \"${args.pipelineId}\" not found. Define it first or use one of: ${orchestrator.listPipelines().map(p => p.id).join(\", \")}` }\n\n const runId = `run-${context.sessionID}-${args.pipelineId}`\n orchestrator.startRun(runId, args.pipelineId)\n\n coordinator.writeSharedMemory(`pipeline:run:${runId}`, `Started pipeline ${pipeline.name}`, \"coordinator\")\n\n let out = `## \uD83D\uDE80 Pipeline Run Started\\n\\n`\n out += `**Pipeline:** ${pipeline.name} (\\`${args.pipelineId}\\`)\\n`\n out += `**Run ID:** \\`${runId}\\`\\n\\n`\n out += `### Stages\\n`\n out += pipeline.stages.map((s, i) => {\n const prefix = i === 0 ? \"\u25B6\" : \"\u23F3\"\n const category = s.model ?? roleRegistry.suggestModel(s.role)\n const resolved = modelRegistry.resolveAlias(category)\n const modelLabel = resolved.length > 0 && resolved[0] !== category ? `${resolved[0]} (${category})` : category\n return `${prefix} **${s.role}** \u2014 ${s.description} (model: ${modelLabel})`\n }).join(\"\\n\")\n out += `\\n\\n### Next Step\\nDelegate tasks to each stage. Start with \\`agentic_delegate\\` for the first role: **${pipeline.stages[0].role}**.`\n\n return { output: out, metadata: { runId, pipelineId: args.pipelineId } }\n }\n\n case \"status\": {\n const runId = args.pipelineId\n ? `run-${context.sessionID}-${args.pipelineId}`\n : null\n\n if (!runId) {\n return { output: \"Specify pipelineId to check status.\" }\n }\n\n const current = orchestrator.getCurrentStage(runId)\n const results = orchestrator.getAllStageResults(runId)\n\n let out = `## \uD83D\uDCCA Pipeline Status\\n\\n`\n out += `**Run:** \\`${runId}\\`\\n`\n\n const pipeline = args.pipelineId ? orchestrator.getPipeline(args.pipelineId) : null\n if (pipeline) {\n out += `**Pipeline:** ${pipeline.name}\\n\\n`\n out += `| Stage | Status |\\n|-------|--------|\\n`\n for (const stage of pipeline.stages) {\n const hasResult = results.has(stage.role)\n const icon = hasResult ? \"\u2705\" : stage.role === current?.role ? \"\u25B6\" : \"\u23F3\"\n out += `| ${icon} ${stage.role} | ${hasResult ? \"Complete\" : stage.role === current?.role ? \"Active\" : \"Pending\"} |\\n`\n }\n }\n\n if (current) {\n out += `\\n### Current Stage\\n**${current.role}** \u2014 ${current.description}\\n`\n } else {\n out += `\\n### Pipeline Complete\\nAll stages finished.\\n`\n }\n\n return { output: out }\n }\n\n default:\n return { output: `Unknown action \"${args.action}\". Available: define, list, run, status, suggest.` }\n }\n },\n }),\n\n agentic_pr: tool({\n description: \"Generate a pull request description from the execution plan, all step results, and files changed. Use `action: 'create'` to actually open a PR via GitHub CLI (`gh`).\",\n args: {\n title: tool.schema.string().optional().describe(\"Override the PR title (defaults to the plan goal)\"),\n action: tool.schema.enum([\"generate\", \"create\"]).optional().describe(\"'generate' returns PR body (default); 'create' opens actual PR via gh CLI\"),\n baseBranch: tool.schema.string().optional().describe(\"Base branch for PR creation (default: main)\"),\n },\n async execute(args, context) {\n const session = sessionStore.getOrCreate(context.sessionID)\n const allFiles = executor.getAllFilesModified(context.sessionID)\n\n if (!session.plan) {\n return { output: \"No plan found. Create a plan with `agentic_plan` first.\" }\n }\n\n const steps = session.plan.intent.subtasks.map(s => {\n const stepState = executor.getStepState(context.sessionID, s.id)\n return {\n id: s.id,\n description: s.description,\n success: stepState?.result?.success ?? false,\n }\n })\n\n const pr = git.generatePRDescription(args.title ?? session.plan.intent.goal, steps, allFiles)\n\n let output = `## \uD83D\uDCCB PR Description\\n\\n`\n output += `---\\ntitle: ${pr.title}\\n---\\n\\n`\n output += `## Summary\\n\\n${pr.summary}\\n\\n`\n output += `## Changes\\n\\n${pr.changes.join(\"\\n\")}\\n\\n`\n output += `## Files Changed\\n\\n${allFiles.map(f => `- \\`${f}\\``).join(\"\\n\")}\\n\\n`\n output += `## Test Plan\\n\\n${pr.testPlan}\\n\\n`\n\n if (pr.breakingChanges) {\n output += `## \u26A0\uFE0F Breaking Changes\\n\\nSome steps failed. Review carefully before merging.\\n\\n`\n }\n\n output += `## Steps Executed\\n\\n`\n output += steps.map(s =>\n `- ${s.success ? \"\u2705\" : \"\u274C\"} **${s.id}** \u2014 ${s.description}`\n ).join(\"\\n\")\n\n // Auto-commit if git available\n const allSuccess = steps.every(s => s.success)\n let commitInfo = null\n if (allSuccess && allFiles.length > 0 && git.isAvailable()) {\n commitInfo = git.commit(`feat: ${pr.title}`, allFiles)\n }\n\n if (commitInfo) {\n output += `\\n\\n## \uD83D\uDD16 Auto-commit\\n\\n`\n output += `**Commit:** \\`${commitInfo.hash.slice(0, 7)}\\`\\n`\n output += `**Message:** ${commitInfo.message}\\n`\n output += `**Files:** ${commitInfo.files.length}\\n`\n }\n\n // Create actual PR\n if (args.action === \"create\") {\n const prBody = `${pr.summary}\\n\\n## Changes\\n${pr.changes.join(\"\\n\")}\\n\\n## Test Plan\\n${pr.testPlan}`\n const base = args.baseBranch ?? \"main\"\n const prResult = git.createPR(pr.title, prBody, base)\n if (prResult) {\n output += `\\n\\n## \uD83D\uDE80 PR Created\\n\\n`\n output += `**URL:** ${prResult.url}\\n`\n output += `**Number:** #${prResult.number}\\n`\n output += `**Branch:** ${prResult.branch}\\n`\n } else {\n output += `\\n\\n## \u26A0\uFE0F PR Creation Failed\\n\\n`\n output += `Make sure \\`gh\\` CLI is installed and authenticated: \\`gh auth login\\`\\n`\n }\n }\n\n traceLogger.log({\n step: \"pr\",\n input: pr.title,\n output: `${steps.length} steps, ${allFiles.length} files`,\n toolUsed: \"agentic_pr\",\n success: true,\n durationMs: 0,\n metadata: { commitHash: commitInfo?.hash, prCreated: args.action === \"create\" },\n })\n\n return { output }\n },\n }),\n\n agentic_score: tool({\n description: \"Score the current changeset for technical debt. Analyzes coupling, file size, scope, and code patterns. Use before completing to ensure code quality.\",\n args: {\n files: tool.schema.array(tool.schema.string()).optional().describe(\"Specific files to score (defaults to all modified files)\"),\n },\n async execute(args, context) {\n const allFiles = executor.getAllFilesModified(context.sessionID)\n const files = args.files ?? allFiles\n\n if (files.length === 0) {\n return { output: \"No files modified yet. Complete some steps first.\" }\n }\n\n const contents = new Map<string, string>()\n for (const file of files) {\n try {\n contents.set(file, readFileSync(file, \"utf-8\"))\n } catch {\n contents.set(file, `[Unable to read ${file}]`)\n }\n }\n\n const session = sessionStore.getOrCreate(context.sessionID)\n const score = debtScorer.score(session.plan?.intent.goal ?? \"Unknown\", files, contents)\n\n let output = `## \uD83D\uDCCA Tech Debt Score: **${score.overall.toUpperCase()}**\\n\\n`\n output += `**Issues found:** ${score.totalIssues}\\n\\n`\n output += `### Breakdown\\n\\n`\n\n for (const cat of score.breakdown) {\n const bar = \"\u2588\".repeat(Math.min(cat.score, 10)) + \"\u2591\".repeat(Math.max(10 - cat.score, 0))\n output += `**${cat.category}** \\`[${bar}]\\` ${cat.score}/10\\n`\n for (const issue of cat.issues) {\n output += ` - ${issue}\\n`\n }\n output += \"\\n\"\n }\n\n output += `### Suggestion\\n${score.suggestion}\\n`\n\n traceLogger.log({\n step: \"score\",\n input: `${files.length} files`,\n output: score.overall,\n toolUsed: \"agentic_score\",\n success: true,\n durationMs: 0,\n metadata: { overall: score.overall, totalIssues: score.totalIssues },\n })\n\n return { output }\n },\n }),\n\n agentic_delegate: tool({\n description: \"Assign a task to a specialized agent role (architect/developer/qa/coordinator/pm). Supports pipeline-aware delegation with cross-validation between stages and inter-agent messaging.\",\n args: {\n taskId: tool.schema.string().describe(\"Unique ID for this delegated task\"),\n description: tool.schema.string().describe(\"What this agent should do\"),\n role: tool.schema.enum([\"architect\", \"developer\", \"qa\", \"coordinator\", \"pm\"]).optional().describe(\"Target role (auto-detected if omitted)\"),\n context: tool.schema.string().optional().describe(\"Additional context or instructions for the agent\"),\n pipelineRunId: tool.schema.string().optional().describe(\"Pipeline run ID to associate this task with a pipeline stage\"),\n result: tool.schema.string().optional().describe(\"Task result (set when completing a task to trigger downstream stages and cross-validation)\"),\n status: tool.schema.enum([\"pending\", \"running\", \"done\", \"failed\"]).optional().describe(\"Set the task status\"),\n requestReview: tool.schema.boolean().optional().describe(\"Request review from a downstream role after completing this task\"),\n },\n async execute(args, context) {\n const allTasks = coordinator.getTasks(context.sessionID)\n\n // If result is provided, we're completing a task\n if (args.result || args.status) {\n const updated = coordinator.updateTask(context.sessionID, args.taskId, args.status ?? \"done\", args.result)\n if (!updated) return { output: `Task \"${args.taskId}\" not found.` }\n\n // Write to shared memory\n coordinator.writeSharedMemory(`task:${args.taskId}`, (args.result ?? \"\").slice(0, 500), args.role ?? \"unknown\")\n\n let output = `## \u2705 Task Updated\\n\\n`\n output += `**Task:** \\`${args.taskId}\\` \u2192 **${args.status ?? \"done\"}**\\n`\n if (args.result) output += `**Result:** ${args.result.slice(0, 300)}\\n\\n`\n\n // Pipeline: advance to next stage\n if (args.pipelineRunId) {\n const pipelineId = args.pipelineRunId.replace(`run-${context.sessionID}-`, \"\")\n const pipeline = orchestrator.getPipeline(pipelineId)\n if (pipeline) {\n const stageIssues: string[] = []\n const nextStage = orchestrator.advanceStage(args.pipelineRunId, args.result ?? \"\", stageIssues)\n const allResults = orchestrator.getAllStageResults(args.pipelineRunId)\n\n if (nextStage) {\n const pipelineContext = orchestrator.buildContextForRole(nextStage.role, args.pipelineRunId, coordinator.getAllSharedMemory())\n\n output += `### \u25B6 Pipeline Advancing\\n`\n output += `**Next stage:** ${nextStage.role} \u2014 ${nextStage.description}\\n\\n`\n\n // Auto-send message to next agent\n coordinator.sendMessage({\n from: args.role ?? \"coordinator\",\n to: nextStage.role,\n taskId: args.taskId,\n type: \"result\",\n payload: `Stage ${args.role} completed. Next: ${nextStage.role}.\\n\\nContext:\\n${pipelineContext}`,\n })\n\n output += `**Context forwarded** to \\`${nextStage.role}\\` via message bus.\\n`\n } else {\n output += `### \uD83C\uDF89 Pipeline Complete\\nAll stages finished!\\n`\n\n // Run final cross-validation\n const finalValidation = await orchestrator.crossValidate(\n \"coordinator\",\n \"Pipeline completed\",\n allResults,\n coordinator.getAllSharedMemory(),\n )\n output += `\\n### Cross-Validation\\n**Status:** ${finalValidation.passed ? \"\u2705 Passed\" : \"\u274C Issues found\"}\\n`\n output += `**Summary:** ${finalValidation.summary}\\n`\n if (finalValidation.issues.length > 0) {\n output += finalValidation.issues.map(i =>\n `- [${i.severity}] ${i.description} (from ${i.source})`\n ).join(\"\\n\")\n }\n }\n\n // Cross-validate: auto-check against previous stages\n if (args.status === \"done\" && allResults.size > 1) {\n const validation = await orchestrator.crossValidate(\n args.role ?? \"unknown\",\n args.result ?? \"\",\n allResults,\n coordinator.getAllSharedMemory(),\n )\n if (validation.issues.length > 0) {\n output += `\\n### \uD83D\uDD0D Cross-Validation Notes\\n`\n for (const issue of validation.issues) {\n output += `- [${issue.severity}] ${issue.description}\\n`\n }\n }\n }\n }\n }\n\n // Request review from next logical role\n if (args.requestReview && args.result) {\n const reviewRole = args.role === \"developer\" ? \"qa\" : args.role === \"architect\" ? \"developer\" : \"qa\"\n coordinator.sendMessage({\n from: args.role ?? \"developer\",\n to: reviewRole,\n taskId: args.taskId,\n type: \"review_request\",\n payload: `Review requested for task \"${args.taskId}\".\\n\\nResult:\\n${args.result.slice(0, 1000)}`,\n })\n output += `\\n### \uD83D\uDCE8 Review Requested\\n**Reviewer:** ${reviewRole}\\n**Message sent** via inter-agent message bus.\\n`\n }\n\n traceLogger.log({\n step: \"delegate:update\",\n input: args.taskId,\n output: `\u2192 ${args.status}`,\n toolUsed: \"agentic_delegate\",\n success: true,\n durationMs: 0,\n })\n\n return { output }\n }\n\n // Normal delegation flow (LLM-based role suggestion, Gap #6)\n const role: AgentRole = args.role ?? await coordinator.getSuggestedRole(args.description, llmEngine)\n const agent = coordinator.getAgent(role)\n if (!agent) {\n return { output: `Unknown role \"${role}\". Available: architect, developer, qa, coordinator.` }\n }\n\n const contextWithMemory = args.context ?? args.description\n\n // Auto-load relevant skills from skill store (Gap #4: skill-aware delegation)\n const relevantSkills = skillStore.find(args.description).slice(0, 3).map(s => ({\n name: s.definition.meta.name,\n successRate: s.successRate,\n steps: s.definition.workflow.steps.map(st => `${st.action}: ${st.description}`).join(\"; \"),\n }))\n\n const task = coordinator.delegate(role, {\n id: args.taskId,\n assignedTo: role,\n description: args.description,\n input: contextWithMemory,\n status: \"running\",\n pipelineRunId: args.pipelineRunId,\n }, context.sessionID, 0, relevantSkills)\n\n // Build pipeline context if part of a pipeline run\n let pipelineContext = \"\"\n if (args.pipelineRunId) {\n pipelineContext = orchestrator.buildContextForRole(role, args.pipelineRunId, coordinator.getAllSharedMemory())\n }\n\n // Check for pending messages for this role\n const pendingMessages = coordinator.getMessages(role, true)\n\n // \u2500\u2500 Actual Agent Execution via Isolated AgentRuntime \u2500\u2500\n const agentCtx = {\n systemPrompt: agent.prompt ?? `You are a ${role} in a software engineering team.`,\n sessionId: context.sessionID,\n role,\n taskDescription: contextWithMemory,\n pipelineContext: pipelineContext || undefined,\n pendingMessages: pendingMessages.length > 0 ? pendingMessages.map(m => ({ from: m.from, payload: m.payload })) : undefined,\n sharedMemory: coordinator.getAllSharedMemory().map(e => ({ key: e.key, value: e.value, writtenBy: e.writtenBy })),\n }\n const agentResultObj = await agentRuntime.execute(agentCtx)\n const agentResult = agentResultObj.success ? agentResultObj.output : \"\"\n const executionError = agentResultObj.success ? null : (agentResultObj.error ?? \"Agent execution failed\")\n\n if (agentResult) {\n coordinator.updateTask(context.sessionID, args.taskId, \"done\", agentResult)\n coordinator.writeSharedMemory(`task:${args.taskId}`, agentResult.slice(0, 500), role)\n coordinator.writeSharedMemory(`task:${args.taskId}:full`, agentResult, role)\n } else {\n coordinator.updateTask(context.sessionID, args.taskId, \"failed\", executionError ?? \"LLM unavailable\")\n }\n\n let output = `## \uD83E\uDD16 Task Delegated\\n\\n`\n output += `**Task:** \\`${args.taskId}\\`\\n`\n output += `**Role:** ${role} (${agent.name})\\n`\n output += `**Description:** ${args.description}\\n`\n output += `**Status:** ${agentResult ? \"\u2705 Done\" : executionError ? \"\u274C Failed\" : \"\u26A0\uFE0F Unknown\"}\\n`\n if (agentResult) {\n output += `**Result:** ${agentResult.slice(0, 500)}\\n`\n } else if (executionError) {\n output += `**Error:** ${executionError.slice(0, 200)}\\n`\n }\n output += `**Agent Prompt:**\\n\\`\\`\\`\\n${(agent.prompt ?? \"No prompt available\").slice(0, 400)}\\n\\`\\`\\`\\n\\n`\n\n // Model suggestion \u2014 check session preference first, then fall through\n const sessionModelPref = sessionStore.getModelPreference(context.sessionID, role)\n let suggestedModel: string\n let modelLabel: string\n\n if (sessionModelPref) {\n // Session-seeded model preference (Gap: per-role model selection)\n suggestedModel = sessionModelPref\n modelLabel = `${suggestedModel} (session preference)`\n modelRegistry.addModel(suggestedModel)\n } else {\n const suggestedCategory = roleRegistry.suggestModel(role)\n const suggestedModels = modelRegistry.suggestWithFallback(role, [suggestedCategory])\n suggestedModel = suggestedModels.length > 0 ? suggestedModels[0] : suggestedCategory\n modelLabel = suggestedModel !== suggestedCategory ? `${suggestedModel} (${suggestedCategory})` : suggestedModel\n }\n output += `**Model Used:** ${modelLabel}\\n`\n if (agent.model) output += `**Configured Model:** ${agent.model}\\n`\n\n // Model reliability info\n const modelScore = modelRegistry.getScore(suggestedModel)\n if (modelScore) {\n if (modelScore.totalCalls > 0) {\n const icon = modelScore.status === \"healthy\" ? \"\u2705\" : modelScore.status === \"degraded\" ? \"\u26A0\uFE0F\" : \"\u274C\"\n output += `**Model Status:** ${icon} ${modelScore.status} (reliability: ${(modelScore.reliability * 100).toFixed(0)}%, hallucinations: ${(modelScore.hallucinationRate * 100).toFixed(0)}%)\\n`\n } else {\n output += `**Model Status:** No reliability data yet (new model)\\n`\n }\n }\n\n if (args.pipelineRunId) {\n output += `**Pipeline Run:** \\`${args.pipelineRunId}\\`\\n`\n }\n\n if (agentResult) {\n output += `\\n### Agent Output\\n\\`\\`\\`\\n${agentResult.slice(0, 2000)}\\n\\`\\`\\`\\n`\n } else if (executionError) {\n output += `\\n### Execution Error\\n${executionError}\\n`\n }\n\n if (pendingMessages.length > 0) {\n output += `\\n### \uD83D\uDCE8 Pending Messages (${pendingMessages.length})\\n`\n for (const msg of pendingMessages) {\n output += `- From **${msg.from}**: ${msg.payload.slice(0, 200)}\\n`\n }\n }\n\n output += `\\n### Active Tasks (${allTasks.length + 1})\\n`\n output += [...coordinator.getTasks(context.sessionID)].map(t =>\n `- ${t.status === \"done\" ? \"\u2705\" : t.status === \"failed\" ? \"\u274C\" : \"\u23F3\"} **${t.id}** \u2192 ${t.assignedTo}: ${t.description}`\n ).join(\"\\n\")\n\n // Pipeline: auto-advance if part of pipeline\n if (agentResult && args.pipelineRunId) {\n const pipelineId = args.pipelineRunId.replace(`run-${context.sessionID}-`, \"\")\n const pipeline = orchestrator.getPipeline(pipelineId)\n if (pipeline) {\n const stageIssues: string[] = []\n const nextStage = orchestrator.advanceStage(args.pipelineRunId, agentResult, stageIssues)\n const allResults = orchestrator.getAllStageResults(args.pipelineRunId)\n if (nextStage) {\n const nextCtx = orchestrator.buildContextForRole(nextStage.role, args.pipelineRunId, coordinator.getAllSharedMemory())\n coordinator.sendMessage({\n from: role, to: nextStage.role, taskId: args.taskId,\n type: \"result\",\n payload: `Stage ${role} completed. Next: ${nextStage.role}.\\n\\nContext:\\n${nextCtx}`,\n })\n output += `\\n### Pipeline: Next Stage\\n\u25B6 **${nextStage.role}** \u2014 ${nextStage.description}\\n`\n } else {\n output += `\\n### \uD83C\uDF89 Pipeline Complete\\nAll stages finished!\\n`\n const finalValidation = await orchestrator.crossValidate(\"coordinator\", \"Pipeline completed\", allResults, coordinator.getAllSharedMemory())\n output += `**Cross-Validation:** ${finalValidation.passed ? \"\u2705 Passed\" : \"\u274C Issues\"}\\n`\n }\n }\n }\n\n traceLogger.log({\n step: \"delegate\",\n input: args.taskId,\n output: `\u2192 ${role}: ${agentResult ? \"done\" : \"failed\"}`,\n toolUsed: \"agentic_delegate\",\n success: !!agentResult,\n durationMs: 0,\n })\n\n return { output }\n },\n }),\n\n agentic_message: tool({\n description: \"Inter-agent messaging system. Send messages between agent roles, request reviews, check inbox, and view conversation threads. Part of the multi-agent coordination framework.\",\n args: {\n action: tool.schema.enum([\"send\", \"inbox\", \"conversation\", \"mark-read\"]).describe(\"'send' to send a message; 'inbox' to check messages; 'conversation' to view a thread; 'mark-read' to acknowledge a message\"),\n to: tool.schema.string().optional().describe(\"Recipient role (for send action)\"),\n taskId: tool.schema.string().optional().describe(\"Task ID this message relates to (for send/conversation)\"),\n message: tool.schema.string().optional().describe(\"Message content (for send action)\"),\n type: tool.schema.enum([\"result\", \"review_request\", \"review_response\", \"clarification\", \"approval\", \"revision\"]).optional().describe(\"Message type (for send action)\"),\n messageId: tool.schema.string().optional().describe(\"Message ID to mark as read (for mark-read action)\"),\n },\n async execute(args, context) {\n switch (args.action) {\n case \"send\": {\n if (!args.to || !args.message) return { output: \"`to` and `message` required.\" }\n const msg = coordinator.sendMessage({\n from: context.agent ?? \"user\",\n to: args.to,\n taskId: args.taskId ?? \"general\",\n type: args.type ?? \"clarification\",\n payload: args.message,\n })\n return {\n output: `## \uD83D\uDCE8 Message Sent\\n\\n**From:** ${msg.from}\\n**To:** ${msg.to}\\n**Type:** ${msg.type}\\n**ID:** \\`${msg.id}\\`\\n\\n${msg.payload.slice(0, 500)}`,\n }\n }\n\n case \"inbox\": {\n const role = context.agent ?? \"user\"\n const messages = coordinator.getMessages(role, true)\n if (messages.length === 0) return { output: \"\uD83D\uDCED No unread messages.\" }\n\n let out = `## \uD83D\uDCEC Inbox (${messages.length} unread)\\n\\n`\n for (const msg of messages) {\n out += `**${msg.type.toUpperCase()}** from **${msg.from}** [\\`${msg.id}\\`]\\n`\n out += `Task: \\`${msg.taskId}\\` | ${new Date(msg.timestamp).toLocaleTimeString()}\\n`\n out += `> ${msg.payload.slice(0, 200)}\\n\\n`\n }\n return { output: out }\n }\n\n case \"conversation\": {\n if (!args.taskId) return { output: \"taskId required.\" }\n const thread = coordinator.getConversation(args.taskId)\n if (thread.length === 0) return { output: `No messages for task \"${args.taskId}\".` }\n\n let out = `## \uD83D\uDCAC Conversation: \\`${args.taskId}\\`\\n\\n`\n for (const msg of thread) {\n const icon = msg.type === \"approval\" ? \"\u2705\" : msg.type === \"review_request\" ? \"\uD83D\uDD0D\" : msg.type === \"revision\" ? \"\uD83D\uDD04\" : \"\uD83D\uDCAC\"\n out += `${icon} **${msg.from}** \u2192 **${msg.to}** (${msg.type})\\n`\n out += `> ${msg.payload.slice(0, 300)}\\n\\n`\n }\n return { output: out }\n }\n\n case \"mark-read\": {\n if (!args.messageId) return { output: \"messageId required.\" }\n const ok = coordinator.markRead(args.messageId)\n return { output: ok ? `\u2705 Message \\`${args.messageId}\\` marked as read.` : `Message \\`${args.messageId}\\` not found.` }\n }\n\n default:\n return { output: `Unknown action \"${args.action}\". Available: send, inbox, conversation, mark-read.` }\n }\n },\n }),\n\n agentic_skill: tool({\n description: \"Manage reusable skills extracted from successful task completions. Use 'extract' to create a skill from a completed step. Use 'find' to search existing skills.\",\n args: {\n action: tool.schema.enum([\"extract\", \"find\", \"list\"]).describe(\"'extract' creates a skill; 'find' searches; 'list' shows all\"),\n query: tool.schema.string().optional().describe(\"Search query or extraction target (stepId)\"),\n },\n async execute(args, context) {\n if (args.action === \"extract\") {\n const stepId = args.query\n if (!stepId) return { output: \"Provide a stepId as query to extract a skill from.\" }\n\n const stepState = executor.getStepState(context.sessionID, stepId)\n if (!stepState?.result) return { output: `No execution record for step \"${stepId}\".` }\n\n const skill = await skillStore.extract({\n role: \"tool\",\n content: stepState.result.output,\n })\n\n if (!skill) return { output: `Could not extract a skill from step \"${stepId}\". The output pattern is not recognized.` }\n\n persistence.save(\"skills\", skill.definition.meta.id, skill.definition)\n\n return {\n output: `## \uD83E\uDDE0 Skill Extracted\\n\\n**Name:** ${skill.definition.meta.name}\\n**Pattern:** \\`${skill.definition.trigger.pattern}\\`\\n**Steps:** ${skill.definition.workflow.steps.length}\\n**Success rate:** ${(skill.successRate * 100).toFixed(0)}%\\n\\n\\`\\`\\`\\n${skill.definition.workflow.steps.map(s => s.description).join(\"\\n\")}\\n\\`\\`\\``,\n }\n }\n\n if (args.action === \"find\") {\n if (!args.query) return { output: \"Provide a search query.\" }\n const skills = skillStore.find(args.query)\n if (skills.length === 0) return { output: `No skills found for \"${args.query}\".` }\n let output = `## \uD83D\uDD0D Skills Matching \"${args.query}\"\\n\\n`\n output += skills.map(s => `- **${s.definition.meta.name}** (${(s.successRate * 100).toFixed(0)}% success, ${s.usageCount} uses)\\n Pattern: \\`${s.definition.trigger.pattern}\\``).join(\"\\n\")\n return { output }\n }\n\n const skills = skillStore.getAll()\n if (skills.length === 0) return { output: \"No skills yet. Complete tasks and use `action: \\\"extract\\\"` to build the skill library.\" }\n\n let output = `## \uD83E\uDDE0 Skill Library (${skills.length})\\n\\n`\n output += skills.map(s => `- **${s.definition.meta.name}** \u2014 ${(s.successRate * 100).toFixed(0)}% (${s.usageCount} uses)`).join(\"\\n\")\n return { output }\n },\n }),\n\n agentic_model: tool({\n description: \"Configure per-role LLM model preferences for the current session. Use 'set' to assign a model to an agent role. Use 'get' to see current assignment. Use 'list' to view all preferences. Use 'clear' to remove a preference.\",\n args: {\n action: tool.schema.enum([\"set\", \"get\", \"list\", \"clear\"]).describe(\"Action: set/get/list/clear per-role model preference\"),\n role: tool.schema.string().optional().describe(\"Agent role (architect, developer, qa, coordinator, pm)\"),\n model: tool.schema.string().optional().describe(\"Model name (e.g. 'gpt-4o', 'claude-sonnet-4-20250514')\"),\n },\n async execute(args, context) {\n const VALID_ROLES = [\"architect\", \"developer\", \"qa\", \"coordinator\", \"pm\"]\n\n if (args.action === \"list\") {\n const prefs = sessionStore.getAllModelPreferences(context.sessionID)\n if (prefs.length === 0) {\n return { output: \"No model preferences configured for this session. Use `action: \\\"set\\\"` to assign models to agent roles.\" }\n }\n let output = \"## \uD83C\uDFAF Session Model Preferences\\n\\n\"\n output += \"| Role | Model |\\n\"\n output += \"|------|-------|\\n\"\n output += prefs.map(p => `| **${p.role}** | \\`${p.model}\\` |`).join(\"\\n\")\n output += \"\\n\\nThese preferences override the default model selection during delegation.\"\n return { output }\n }\n\n if (args.action === \"set\") {\n if (!args.role) return { output: \"Provide a `role` (e.g. 'architect', 'developer', 'qa', 'coordinator', 'pm').\" }\n if (!args.model) return { output: \"Provide a `model` name (e.g. 'gpt-4o', 'claude-sonnet-4-20250514').\" }\n const roleLower = args.role.toLowerCase()\n if (!VALID_ROLES.includes(roleLower)) {\n return { output: `Invalid role \"${args.role}\". Valid roles: ${VALID_ROLES.join(\", \")}` }\n }\n sessionStore.setModelPreference(context.sessionID, roleLower, args.model)\n // Also register in model registry so it's tracked\n modelRegistry.addModel(args.model)\n modelRegistry.registerAlias(roleLower, [args.model])\n return { output: `\u2705 Model preference set: **${roleLower}** \u2192 \\`${args.model}\\`\\nThis model will be used when delegating tasks to the ${roleLower} role in this session.` }\n }\n\n if (args.action === \"get\") {\n if (!args.role) return { output: \"Provide a `role` to check (e.g. 'architect').\" }\n const model = sessionStore.getModelPreference(context.sessionID, args.role)\n if (!model) {\n return { output: `No model preference set for role \"${args.role}\". Delegation will use default model selection.` }\n }\n return { output: `**${args.role}** \u2192 \\`${model}\\`` }\n }\n\n if (args.action === \"clear\") {\n sessionStore.clearModelPreference(context.sessionID, args.role)\n if (args.role) {\n return { output: `Cleared model preference for role \"${args.role}\".` }\n }\n return { output: \"Cleared all model preferences for this session.\" }\n }\n\n return { output: \"Unknown action. Use 'set', 'get', 'list', or 'clear'.\" }\n },\n }),\n\n agentic_model_reset: tool({\n description: \"Reset model statistics to recover from degraded performance. Use 'reset' to clear stats for a specific model. Use 'reset-stale' to auto-reset models not used in 7+ days. Use 'reset-all' for emergency recovery.\",\n args: {\n action: tool.schema.enum([\"reset\", \"reset-stale\", \"reset-all\"]).describe(\"Action: reset (single model), reset-stale (auto-detect old models), reset-all (emergency)\"),\n model: tool.schema.string().optional().describe(\"Model name (required for 'reset' action)\"),\n staleDays: tool.schema.number().optional().describe(\"Days threshold for stale detection (default: 7)\"),\n },\n async execute(args, context) {\n if (args.action === \"reset\") {\n if (!args.model) return { output: \"Provide a `model` name to reset (e.g. 'gpt-4o').\" }\n \n const beforeScore = modelRegistry.getScore(args.model)\n modelRegistry.resetModel(args.model)\n const afterScore = modelRegistry.getScore(args.model)\n \n return { \n output: `\u2705 Reset model statistics for \\`${args.model}\\`\\n\\n**Before:** ${beforeScore ? `${(beforeScore.reliability * 100).toFixed(0)}% reliability, ${beforeScore.totalCalls} calls` : \"No data\"}\\n**After:** ${afterScore ? `${(afterScore.reliability * 100).toFixed(0)}% reliability, ${afterScore.totalCalls} calls` : \"Clean slate\"}` \n }\n }\n\n if (args.action === \"reset-stale\") {\n const staleDays = args.staleDays ?? 7\n const resetModels = modelRegistry.resetStaleModels(staleDays)\n \n if (resetModels.length === 0) {\n return { output: `No stale models found (threshold: ${staleDays} days unused).` }\n }\n \n return { output: `\u2705 Reset ${resetModels.length} stale model(s):\\n${resetModels.map(m => `- \\`${m}\\``).join(\"\\n\")}\\n\\nThese models had not been used in ${staleDays}+ days.` }\n }\n\n if (args.action === \"reset-all\") {\n const allScores = modelRegistry.getAllScores()\n for (const score of allScores) {\n modelRegistry.resetModel(score.model)\n }\n return { output: `\u26A0\uFE0F **EMERGENCY RESET:** Cleared statistics for ${allScores.length} model(s).\\n\\nAll models now have clean slate. Use this only when all models are blocked.` }\n }\n\n return { output: \"Unknown action. Use 'reset', 'reset-stale', or 'reset-all'.\" }\n },\n }),\n\n agentic_episodes: tool({\n description: \"Browse cross-session memory. Search past tasks and their outcomes to learn from previous sessions. Use before planning similar tasks to avoid repeating mistakes.\",\n args: {\n action: tool.schema.enum([\"search\", \"recent\", \"stats\"]).describe(\"'search' finds relevant past tasks; 'recent' shows latest; 'stats' shows summary\"),\n query: tool.schema.string().optional().describe(\"Search query (for 'search' action)\"),\n },\n async execute(args, context) {\n if (args.action === \"search\") {\n if (!args.query) return { output: \"Provide a search query.\" }\n\n // Index episodes into vector store for RAG-enhanced search\n const allEpisodes = episodicStore.getRecent(50)\n for (const ep of allEpisodes) {\n vectorStore.addDocument(`ep:${ep.sessionId}`, `${ep.planGoal} ${ep.outcome} ${ep.decisions.join(\" \")}`, {\n type: \"episode\",\n sessionId: ep.sessionId,\n outcome: ep.outcome,\n tags: [],\n })\n }\n const vectorResults = await vectorStore.semanticSearch(args.query, 5)\n const episodes = allEpisodes.filter(e => vectorResults.some(r => r.id === `ep:${e.sessionId}`))\n if (episodes.length === 0) return { output: `No episodes found for \"${args.query}\".` }\n let output = `## \uD83E\uDDE0 Episodic Memory (RAG): \"${args.query}\"\\n\\n`\n output += episodes.map(e =>\n `- **${e.outcome === \"success\" ? \"\u2705\" : e.outcome === \"partial\" ? \"\u26A0\uFE0F\" : \"\u274C\"} ${e.planGoal}**\\n Score: ${vectorResults.find(r => r.id === `ep:${e.sessionId}`)?.score.toFixed(2) ?? \"?\"} | Files: ${e.filesChanged.length} | ${e.timestamp.slice(0, 10)}`\n ).join(\"\\n\")\n return { output }\n }\n\n if (args.action === \"recent\") {\n const episodes = episodicStore.getRecent(10)\n if (episodes.length === 0) return { output: \"No episode history yet.\" }\n let output = `## \uD83D\uDCDC Recent Episodes\\n\\n`\n output += episodes.map(e =>\n `- ${e.timestamp.slice(0, 10)} \u2014 **${e.outcome.toUpperCase()}**: ${e.planGoal.slice(0, 80)}`\n ).join(\"\\n\")\n return { output }\n }\n\n const stats = episodicStore.getStats()\n return {\n output: `## \uD83D\uDCCA Episode Stats\\n\\n**Total sessions:** ${stats.total}\\n**Successful:** ${stats.successful}\\n**Partial:** ${stats.partial}\\n**Failed:** ${stats.failed}\\n\\nSuccess rate: ${stats.total > 0 ? ((stats.successful / stats.total) * 100).toFixed(0) : 0}%`,\n }\n },\n }),\n\n agentic_parallel: tool({\n description: \"Analyze or execute steps concurrently. Use `analyze` to see parallelism opportunities, or `execute` to run ready steps in parallel with Promise.all. Supports LLM-driven execution and sub-process OpenCode spawn.\",\n args: {\n action: tool.schema.enum([\"analyze\", \"execute\"]).optional().describe(\"'analyze' (default) shows parallelism plan; 'execute' runs ready steps concurrently\"),\n opencodePath: tool.schema.string().optional().describe(\"Path to `opencode` binary for sub-process spawn (execute mode)\"),\n abortOnFailure: tool.schema.boolean().optional().describe(\"Stop all tasks in phase if one fails (default: false)\"),\n },\n async execute(args, context) {\n const session = sessionStore.getOrCreate(context.sessionID)\n if (!session.plan) return { output: \"No plan found. Create one with `agentic_plan` first.\" }\n\n const subtasks = session.plan.intent.subtasks\n const completed = executor.getCompletedSteps(context.sessionID)\n const plan = parallelExec.analyzeParallelism(subtasks)\n\n if (args.action === \"execute\") {\n const readySteps = subtasks.filter(s =>\n !completed.includes(s.id) &&\n s.dependsOn.every(d => completed.includes(d))\n )\n if (readySteps.length === 0) {\n return { output: \"No ready steps to execute. All steps are either completed or blocked by dependencies.\" }\n }\n\n const cwd = ctxDir(context)\n\n let stepRunner: import(\"./core/parallel.js\").StepRunner\n if (args.opencodePath) {\n stepRunner = (step) => parallelExec.executeWithSubprocessSpawn(step, args.opencodePath!, cwd, context.sessionID)\n } else {\n stepRunner = parallelExec.llmStepRunner({\n llmEngine,\n projectDir: cwd,\n planGoal: session.plan.intent.goal,\n sessionId: context.sessionID,\n })\n }\n\n const { results, durationMs } = await parallelExec.executePlanConcurrently(\n plan, stepRunner, args.abortOnFailure ?? false,\n )\n\n for (const r of results) {\n executor.recordResult(context.sessionID, {\n stepId: r.stepId,\n success: r.success,\n output: r.output ?? \"\",\n filesModified: r.filesModified,\n error: r.error,\n })\n }\n\n traceLogger.log({\n step: \"parallel:execute\",\n input: `${readySteps.length} steps`,\n output: `${results.filter(r => r.success).length}/${results.length} passed`,\n toolUsed: \"agentic_parallel\",\n success: results.every(r => r.success),\n durationMs,\n metadata: { total: results.length, passed: results.filter(r => r.success).length },\n })\n\n let output = `## \u26A1 Parallel Execution Complete (${(durationMs / 1000).toFixed(1)}s)\\n\\n`\n output += `**Steps executed:** ${readySteps.length}\\n`\n output += `**Passed:** ${results.filter(r => r.success).length}\\n`\n output += `**Failed:** ${results.filter(r => !r.success).length}\\n\\n`\n\n for (const r of results) {\n const icon = r.success ? \"\u2705\" : \"\u274C\"\n output += `${icon} **${r.stepId}** \u2014 ${r.output?.slice(0, 120) ?? \"no output\"}\\n`\n if (r.error) output += ` Error: ${r.error.slice(0, 200)}\\n`\n }\n\n const progress = executor.getProgress(context.sessionID)\n output += `\\n### Overall Progress\\n`\n output += `\u2705 ${progress.completed}/${progress.total} | \u274C ${progress.failed} | \u23F3 ${progress.total - progress.completed - progress.failed}`\n\n return { output, metadata: { results, durationMs } }\n }\n\n // Analyze mode (default)\n let output = `## \u26A1 Parallel Execution Plan\\n\\n`\n output += `**Max parallelism:** ${plan.maxParallelism}\\n`\n output += `**Phases:** ${plan.phases.length}\\n\\n`\n\n output += `| Phase | Steps | Parallel |\\n|-------|-------|----------|\\n`\n for (const phase of plan.phases) {\n const stepIds = phase.steps.map(s => s.id).join(\", \")\n output += `| ${phase.index + 1} | ${stepIds} | ${phase.canRunInParallel ? \"\u2705\" : \"\uD83D\uDD12\"} |\\n`\n }\n\n const suggestions = parallelExec.suggestParallelTasks(subtasks, completed)\n if (suggestions.length > 1) {\n output += `\\n### Currently Runnable\\n`\n const groups = new Map<number, string[]>()\n for (const s of suggestions) {\n const list = groups.get(s.parallelGroup) ?? []\n list.push(s.taskId)\n groups.set(s.parallelGroup, list)\n }\n for (const [group, tasks] of groups) {\n const label = tasks.length > 1 ? `\uD83D\uDFE2 Parallel group ${group}` : `\uD83D\uDFE1 Sequential`\n output += `- **${label}**: ${tasks.map(t => `\\`${t}\\``).join(\", \")}\\n`\n }\n output += `\\nRun \\`agentic_parallel\\` with \\`action: \"execute\"\\` to run these steps concurrently.`\n }\n\n const allFiles = new Map<string, string[]>()\n for (const step of subtasks) {\n const stepState = executor.getStepState(context.sessionID, step.id)\n if (stepState?.result?.filesModified) {\n allFiles.set(step.id, stepState.result.filesModified)\n }\n }\n const conflicts = parallelExec.detectConflicts(\n suggestions.map(s => s.taskId),\n allFiles,\n )\n if (conflicts.length > 0) {\n output += `\\n### \u26A0\uFE0F Potential Conflicts\\n`\n for (const c of conflicts) {\n output += `- \\`${c.taskA}\\` \u2694\uFE0F \\`${c.taskB}\\` both touch \\`${c.conflictingFile}\\`\\n`\n }\n }\n\n return { output }\n },\n }),\n\n agentic_dashboard: tool({\n description: \"Generate an observability dashboard from execution traces. Shows timeline, statistics, tool usage, anomaly detection, and model reliability (timeouts, retry storms, silent failures).\",\n args: {},\n async execute(args, _context) {\n // Always show model reliability regardless of trace data\n const modelReliability = modelRegistry.getSummary()\n let traceSection = \"\"\n\n // Read traces from file\n await traceLogger.flush()\n const tracePath = `${worktree}/.agentic/trace.jsonl`\n let traces = []\n try {\n const content = readFileSync(tracePath, \"utf-8\")\n traces = content.trim().split(\"\\n\").filter(Boolean).map(l => JSON.parse(l))\n } catch { /* no traces yet */ }\n\n if (traces.length > 0) {\n const data = dashboard.generate(traces, Date.now())\n traceSection = dashboard.formatForDisplay(data)\n }\n\n let output = traceSection || \"### \uD83D\uDCCA Execution Overview\\n\\nNo trace data available yet. Execute some steps first.\\n\"\n output += `\\n### \uD83E\uDD16 Model Reliability\\n${modelReliability}\\n`\n\n // Cross-session pattern discovery\n const allEpisodes = episodicStore.getRecent(200)\n if (allEpisodes.length >= 3) {\n const allStepResults = [] // No direct access to CE's internal results; use episodes instead\n const allSkills = skillStore.getAll().map(s => ({\n name: s.definition.meta.name,\n successRate: s.successRate,\n usageCount: s.usageCount,\n }))\n const report = patternDiscovery.analyze(allEpisodes, [], allSkills)\n\n if (report.errorPatterns.length > 0 || report.recommendations.length > 0) {\n output += `\\n### \uD83D\uDD0D Cross-Session Patterns (${report.totalSessions} sessions)\\n`\n\n if (report.errorPatterns.length > 0) {\n output += `\\n**Recurring Errors:**\\n`\n for (const ep of report.errorPatterns.slice(0, 3)) {\n output += `- \\`${ep.category}\\`: ${ep.sessionCount}/${report.totalSessions} sessions (${(ep.sessionAffinity * 100).toFixed(0)}%)\\n`\n }\n }\n\n if (report.filePatterns.some(f => f.isHotSpot)) {\n output += `\\n**Hot Spot Files:**\\n`\n for (const fp of report.filePatterns.filter(f => f.isHotSpot).slice(0, 3)) {\n output += `- \\`${fp.filePath}\\`: modified in ${fp.sessionCount} sessions`\n if (fp.coChangedFiles.length > 0) {\n output += ` (co-changes: ${fp.coChangedFiles.slice(0, 2).map(c => `\\`${c.filePath}\\``).join(\", \")})`\n }\n output += \"\\n\"\n }\n }\n\n if (report.recommendations.length > 0) {\n const highRecs = report.recommendations.filter(r => r.priority === \"high\")\n if (highRecs.length > 0) {\n output += `\\n**\u26A0\uFE0F High Priority Recommendations:**\\n`\n for (const rec of highRecs.slice(0, 3)) {\n output += `- ${rec.description}\\n`\n }\n }\n }\n }\n }\n\n // Live evaluation score\n const liveScore = liveEvaluator.computeScore()\n if (liveScore.totalSteps > 0 || liveScore.totalDelegations > 0) {\n output += `\\n### \uD83D\uDCCA Live Evaluation Score\\n`\n output += liveEvaluator.formatReport(false)\n }\n\n return { output }\n },\n }),\n\n agentic_guard: tool({\n description: \"Verify the truthfulness of claims made in step outputs. Checks that files referenced actually exist, functions claimed exist in code, and imports are valid. Use to catch LLM hallucinations before they corrupt the codebase.\",\n args: {\n stepId: tool.schema.string().describe(\"The step ID whose output to verify\"),\n },\n async execute(args, context) {\n const stepState = executor.getStepState(context.sessionID, args.stepId)\n if (!stepState?.result) return { output: `No execution record for step \"${args.stepId}\".` }\n\n const output = stepState.result.output\n const files = executor.getAllFilesModified(context.sessionID)\n const check = hallucinationGuard.check(output, files)\n\n if (!check.passed) {\n modelRegistry.recordHallucination(llmEngine.getCurrentModel())\n }\n\n let response = `## \uD83D\uDEE1\uFE0F Hallucination Check: Step \"${args.stepId}\"\\n\\n`\n response += `**Verdict:** ${check.passed ? \"\u2705 All claims verified\" : \"\u274C Unverified claims found\"}\\n\\n`\n response += `**Summary:** ${check.summary}\\n\\n`\n\n if (check.claims.length > 0) {\n response += `### Claims Checked\\n\\n`\n response += `| Claim | Type | Verified |\\n|-------|------|----------|\\n`\n for (const c of check.claims.slice(0, 20)) {\n const icon = c.verified ? \"\u2705\" : \"\u274C\"\n response += `| ${icon} ${c.claim.slice(0, 50)} | ${c.type} | ${c.actual ?? \"?\"} |\\n`\n }\n }\n\n if (!check.passed) {\n response += `\\n### \u26A0\uFE0F Action Required\\n`\n response += `The following claims could not be verified: \\n`\n for (const c of check.claims.filter(c => !c.verified)) {\n response += `- \"${c.claim}\" \u2014 expected ${c.expected} but got ${c.actual}\\n`\n }\n response += `\\nDouble-check these before proceeding. The agent may be hallucinating about files/functions that don't exist.`\n }\n\n response += `\\n### \uD83E\uDD16 Model Reliability\\n`\n const modelScore = modelRegistry.getScore(llmEngine.getCurrentModel())\n if (modelScore && modelScore.totalCalls > 0) {\n const icon = modelScore.status === \"healthy\" ? \"\u2705\" : modelScore.status === \"degraded\" ? \"\u26A0\uFE0F\" : \"\u274C\"\n response += `${icon} **${modelScore.model}** \u2014 reliability: ${(modelScore.reliability * 100).toFixed(0)}%, hallucinations: ${(modelScore.hallucinationRate * 100).toFixed(0)}%, calls: ${modelScore.totalCalls}\\n`\n } else {\n response += `No data yet for current model.\\n`\n }\n\n traceLogger.log({\n step: `guard:${args.stepId}`,\n input: args.stepId,\n output: check.summary,\n toolUsed: \"agentic_guard\",\n success: check.passed,\n durationMs: 0,\n })\n\n return { output: response }\n },\n }),\n\n agentic_evolve: tool({\n description: \"Inspect and extend the agent system itself (Stage IV). Register custom agent roles, define versioned memory schemas, and export skills in self-describing format for other agents to consume.\",\n args: {\n action: tool.schema.enum([\"inspect\", \"register-role\", \"export-skill\", \"memory-schema\", \"evolve\", \"read-prompt\", \"edit-prompt\", \"prompt-history\", \"rollback-prompt\", \"export-training-data\"]).describe(\"What to do: inspect system state, register a custom agent role, export a skill, view memory schema, run self-evolution, manage agent prompts (Stage IV), or export skills as training data for fine-tuning\"),\n name: tool.schema.string().optional().describe(\"Role name or skill name (for register-role, export-skill)\"),\n prompt: tool.schema.string().optional().describe(\"Agent prompt template (for register-role) or new instruction to append (for edit-prompt)\"),\n tools: tool.schema.array(tool.schema.string()).optional().describe(\"Tools available to custom role\"),\n skillId: tool.schema.string().optional().describe(\"Skill ID to export or inspect\"),\n role: tool.schema.string().optional().describe(\"Agent role (for read-prompt, edit-prompt, prompt-history, rollback-prompt)\"),\n version: tool.schema.number().optional().describe(\"Version number (for rollback-prompt)\"),\n description: tool.schema.string().optional().describe(\"Description for the prompt change (for edit-prompt)\"),\n format: tool.schema.enum([\"openai\", \"instructions\"]).optional().describe(\"Output format for training data (for export-training-data, default: openai)\"),\n minSuccessRate: tool.schema.number().optional().describe(\"Minimum skill success rate to include (for export-training-data, default: 0.5)\"),\n },\n async execute(args, _context) {\n switch (args.action) {\n case \"inspect\": {\n const builtIn = roleRegistry.getAllBuiltIn()\n const custom = roleRegistry.getAllCustom()\n const migrations = schemaVersion.getMigrations()\n\n let out = `## \uD83D\uDD2E Agent System State (Stage IV)\\n\\n`\n out += `**Memory schema version:** ${MemorySchemaVersion.currentVersion()}\\n`\n out += `**Registered migrations:** ${migrations.length}\\n\\n`\n out += `### Built-in Roles (${builtIn.length})\\n`\n for (const r of builtIn) {\n out += `- **${r.name}** (\\`${r.role}\\`) \u2014 ${r.tools.length} tools\\n`\n }\n if (custom.length > 0) {\n out += `\\n### Custom Roles (${custom.length})\\n`\n for (const r of custom) {\n out += `- **${r.name}** (\\`${r.role}\\`) \u2014 ${r.tools.length} tools\\n`\n }\n }\n out += `\\n### Extensibility\\n`\n out += `- Custom roles: \\`agentic_evolve register-role\\`\\n`\n out += `- Export skills: \\`agentic_evolve export-skill\\`\\n`\n out += `- Schema info: \\`agentic_evolve memory-schema\\`\\n`\n return { output: out }\n }\n\n case \"register-role\": {\n if (!args.name || !args.prompt) {\n return { output: \"Both `name` and `prompt` are required to register a custom role.\" }\n }\n const roleId = args.name.toLowerCase().replace(/\\s+/g, \"-\")\n roleRegistry.registerCustom({\n role: roleId,\n name: args.name,\n prompt: args.prompt,\n tools: args.tools ?? [\"read\", \"edit\", \"write\", \"bash\"],\n })\n return { output: `Custom role \"${args.name}\" registered as \\`${roleId}\\`. Available via \\`agentic_delegate role=${roleId}\\`.` }\n }\n\n case \"export-skill\": {\n const skillId = args.skillId\n const skillData = createSkillDefinition(\n args.name ?? \"unnamed-skill\",\n args.name ?? \"generic pattern\",\n args.tools ?? [],\n [{ action: \"implement\", description: args.name ?? \"task\", expectedOutput: \"completed\" }],\n )\n\n const json = serializeSkill(skillData)\n const inspection = inspectSkill(skillData)\n\n let out = inspection\n out += `\\n\\n### Machine-Readable Export (agentic-skill/v1)\\n\\`\\`\\`json\\n${json}\\n\\`\\`\\``\n return { output: out }\n }\n\n case \"memory-schema\": {\n let out = `## \uD83E\uDDE0 Memory Schema v${MemorySchemaVersion.currentVersion()}\\n\\n`\n out += `### Envelope Format\\n\\`\\`\\`ts\\n${JSON.stringify(createMemoryEnvelope({ example: true }, \"example\"), null, 2)}\\n\\`\\`\\`\\n\\n`\n out += `### Registered Migrations\\n`\n const migrations = schemaVersion.getMigrations()\n if (migrations.length === 0) {\n out += `No migrations registered yet. Schema v${MemorySchemaVersion.currentVersion()} is current.\\n`\n } else {\n for (const m of migrations) {\n out += `- v${m.from} \u2192 v${m.to}: ${m.description}\\n`\n }\n }\n out += `\\n### Upgrading\\n`\n out += `Data is stored with \\`schema_version\\`. On read, the system auto-migrates from any version to current.\\n`\n out += `New migrations can be registered via \\`schemaVersion.registerMigration()\\` in plugin code.\\n`\n out += `\\n### Compatibility\\n`\n out += `All episodes, skills, and artifacts support schema evolution without data loss.\\n`\n return { output: out }\n }\n\n case \"evolve\": {\n await traceLogger.flush()\n\n const allSkills = skillStore.getAll()\n const allEpisodes = episodicStore.getRecent(50)\n\n const uniqueSessions = new Set(allEpisodes.map(e => e.sessionId))\n let allTasks: AgentTask[] = []\n for (const sid of uniqueSessions) {\n allTasks = allTasks.concat(coordinator.getTasks(sid))\n }\n\n const allStepStates: Array<{ stepId: string; success: boolean; output: string }> = []\n for (const sid of uniqueSessions) {\n const session = sessionStore.getOrCreate(sid)\n const subtasks = session.plan?.intent.subtasks ?? []\n for (const step of subtasks) {\n const state = executor.getStepState(sid, step.id)\n if (state?.result) {\n allStepStates.push({\n stepId: step.id,\n success: state.result.success,\n output: state.result.output,\n })\n }\n }\n }\n\n let traces: Array<{ toolUsed: string; success: boolean; step: string }> = []\n const tracePath = `${worktree}/.agentic/trace.jsonl`\n try {\n const content = readFileSync(tracePath, \"utf-8\")\n for (const line of content.trim().split(\"\\n\").filter(Boolean)) {\n const parsed = JSON.parse(line)\n traces.push({\n toolUsed: parsed.toolUsed ?? \"unknown\",\n success: parsed.success ?? true,\n step: parsed.step ?? \"\",\n })\n }\n } catch { /* no traces yet */ }\n\n selfEvolver.feedSkills(allSkills)\n selfEvolver.feedEpisodes(allEpisodes)\n selfEvolver.feedTasks(allTasks)\n selfEvolver.feedStepStates(allStepStates)\n selfEvolver.feedTraces(traces)\n\n const report = selfEvolver.evolve()\n\n // Auto-apply role suggestions\n const appliedRoles: string[] = []\n for (const role of report.roleSuggestions) {\n try {\n coordinator.registerCustomRole({\n role: role.name,\n name: role.name,\n tools: role.suggestedTools,\n prompt: `You are ${role.name}. ${role.reason}\\n\\nTrigger: ${role.triggerPattern}`,\n })\n appliedRoles.push(role.name)\n } catch { }\n }\n\n // Auto-apply skill patches\n const patchedSkills: string[] = []\n for (const patch of report.skillPatches) {\n const record = skillStore.getById(patch.skillId)\n if (!record) continue\n const def = record.definition\n let modified = false\n\n for (const change of patch.suggestedChanges) {\n if (change.type === \"add_rollback\") {\n for (const step of def.workflow.steps) {\n if (!step.rollback) {\n step.rollback = change.detail\n modified = true\n }\n }\n }\n if (change.type === \"add_step\") {\n const newStep: import(\"./memory/skill-format.js\").SkillStep = {\n order: def.workflow.steps.length + 1,\n action: \"verify\",\n description: change.detail,\n expectedOutput: \"Step completed successfully\",\n }\n def.workflow.steps.push(newStep)\n modified = true\n }\n }\n\n if (modified) {\n def.quality.usageCount = record.usageCount\n def.quality.successRate = record.successRate\n def.audit.lastModified = new Date().toISOString()\n def.audit.modifiedBy = \"system\"\n def.meta.version++\n persistence.save(\"skills\", def.meta.id, def)\n patchedSkills.push(patch.skillName)\n }\n }\n\n let out = `## \uD83D\uDD2E Self-Evolution Report\\n\\n`\n out += `**Improvement Score:** ${report.improvementScore}/100\\n`\n out += `**Sessions Analyzed:** ${report.metrics.totalSessions}\\n`\n out += `**Steps Analyzed:** ${report.metrics.totalSteps}\\n`\n out += `**Overall Success Rate:** ${(report.metrics.successRate * 100).toFixed(0)}%\\n`\n out += `**Retry Rate:** ${(report.metrics.retryRate * 100).toFixed(0)}%\\n\\n`\n\n if (appliedRoles.length > 0) {\n out += `### \u2705 Auto-Registered Roles\\n`\n for (const name of appliedRoles) {\n out += `- **${name}** \u2014 registered automatically\\n`\n }\n out += `\\n`\n }\n\n // Auto-apply prompt patches (Stage IV: versioned, source-tracked)\n const appliedPatches: string[] = []\n for (const patch of report.promptPatches) {\n try {\n const existingPrompt = roleRegistry.getPrompt(patch.role)\n if (existingPrompt && !existingPrompt.includes(patch.instruction.slice(0, 40))) {\n const newPrompt = existingPrompt + `\\n\\n## Auto-Patched Instruction (from ${patch.errorCategory} errors)\\n${patch.instruction}`\n roleRegistry.updatePrompt(patch.role as \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\", newPrompt, \"auto-evolve\", `Patch from ${patch.errorCategory} errors (${patch.occurrences}x)`)\n persistence.save(\"prompts\", \"state\", roleRegistry.getAllPromptStates())\n appliedPatches.push(`${patch.role}: \"${patch.instruction.slice(0, 60)}...\"`)\n }\n } catch { /* non-fatal */ }\n }\n\n if (patchedSkills.length > 0) {\n out += `### \u2705 Auto-Patched Skills\\n`\n for (const name of patchedSkills) {\n out += `- **${name}** \u2014 patched automatically\\n`\n }\n out += `\\n`\n }\n\n if (appliedPatches.length > 0) {\n out += `### \u2705 Auto-Patched Prompts\\n`\n for (const p of appliedPatches) {\n out += `- ${p}\\n`\n }\n out += `\\n`\n }\n\n out += `### Recommendations\\n`\n if (report.metrics.recommendations.length === 0) {\n out += `All metrics within healthy ranges. No changes recommended.\\n`\n } else {\n for (const rec of report.metrics.recommendations) {\n out += `- ${rec}\\n`\n }\n }\n\n if (report.skillPatches.length > 0) {\n out += `\\n### \uD83D\uDD27 Skill Patches (${report.skillPatches.length})\\n`\n for (const patch of report.skillPatches) {\n out += `\\n**${patch.skillName}** \u2014 ${patch.failures} failures\\n`\n for (const change of patch.suggestedChanges) {\n out += `- [${change.type}] ${change.description}\\n`\n out += ` \u2192 ${change.detail}\\n`\n }\n }\n }\n\n if (report.roleSuggestions.length > 0) {\n out += `\\n### \uD83D\uDC65 Role Suggestions (${report.roleSuggestions.length})\\n`\n for (const role of report.roleSuggestions) {\n out += `\\n**${role.name}**\\n`\n out += `- Trigger: \"${role.triggerPattern}\"\\n`\n out += `- Tools: ${role.suggestedTools.map(t => `\\`${t}\\``).join(\", \")}\\n`\n out += `- Reason: ${role.reason}\\n`\n }\n }\n\n if (report.metrics.topErrorCategories.length > 0) {\n out += `\\n### \uD83D\uDCCA Top Error Categories\\n`\n for (const err of report.metrics.topErrorCategories) {\n out += `- **${err.category}**: ${err.count} occurrence(s)\\n`\n }\n }\n\n if (report.promptPatches.length > 0) {\n out += `\\n### \uD83D\uDCDD Prompt Auto-Patches (${report.promptPatches.length})\\n`\n for (const pp of report.promptPatches) {\n const priorityIcon = pp.priority === \"high\" ? \"\uD83D\uDD34\" : pp.priority === \"medium\" ? \"\uD83D\uDFE1\" : \"\uD83D\uDFE2\"\n out += `${priorityIcon} **${pp.role}** \u2014 ${pp.errorCategory} (${pp.occurrences}x)\\n`\n out += ` \u2192 ${pp.instruction}\\n`\n }\n }\n\n // Cross-session pattern discovery (Gap #3)\n const allSkillsForPd = skillStore.getAll().map(s => ({\n name: s.definition.meta.name,\n successRate: s.successRate,\n usageCount: s.usageCount,\n }))\n const patternReport = patternDiscovery.analyze(allEpisodes, [], allSkillsForPd)\n if (patternReport.recommendations.length > 0) {\n out += `\\n### \uD83D\uDD0D Cross-Session Patterns\\n`\n out += `**Total sessions analyzed:** ${patternReport.totalSessions}\\n\\n`\n\n const highRecs = patternReport.recommendations.filter(r => r.priority === \"high\")\n if (highRecs.length > 0) {\n out += `**\u26A0\uFE0F High Priority (${highRecs.length})**\\n`\n for (const rec of highRecs) {\n out += `- ${rec.description}\\n`\n out += ` \u2192 ${rec.action}\\n`\n }\n out += \"\\n\"\n }\n\n const medRecs = patternReport.recommendations.filter(r => r.priority === \"medium\")\n if (medRecs.length > 0) {\n out += `**Medium Priority (${medRecs.length})**\\n`\n for (const rec of medRecs) {\n out += `- ${rec.description}\\n`\n }\n out += \"\\n\"\n }\n\n if (patternReport.errorPatterns.length > 0) {\n out += `**Error Patterns:**\\n`\n for (const ep of patternReport.errorPatterns) {\n out += `- \\`${ep.category}\\`: ${ep.sessionCount}/${patternReport.totalSessions} sessions (${(ep.sessionAffinity * 100).toFixed(0)}%)\\n`\n }\n out += \"\\n\"\n }\n\n if (patternReport.filePatterns.some(f => f.isHotSpot)) {\n out += `**Hot Spot Files:**\\n`\n for (const fp of patternReport.filePatterns.filter(f => f.isHotSpot).slice(0, 5)) {\n out += `- \\`${fp.filePath}\\` \u2192 ${fp.sessionCount} sessions`\n if (fp.coChangedFiles.length > 0) {\n out += ` (co-changed: ${fp.coChangedFiles.map(c => `\\`${c.filePath}\\``).join(\", \")}`\n }\n out += \")\\n\"\n }\n }\n }\n\n return { output: out }\n }\n\n case \"read-prompt\": {\n const targetRole = args.role ?? \"developer\"\n const prompt = roleRegistry.getPrompt(targetRole)\n if (!prompt) return { output: `Role \"${targetRole}\" not found.` }\n const state = roleRegistry.getPromptState(targetRole)\n const ver = state?.currentVersion ?? 1\n return {\n output: `## \uD83D\uDCD6 Prompt for \\`${targetRole}\\` (v${ver})\\n\\n\\`\\`\\`\\n${prompt}\\n\\`\\`\\``,\n }\n }\n\n case \"edit-prompt\": {\n const targetRole = args.role ?? \"developer\"\n if (!args.prompt) return { output: \"`prompt` (instruction to append) is required for edit-prompt.\" }\n const existingPrompt = roleRegistry.getPrompt(targetRole)\n if (!existingPrompt) return { output: `Role \"${targetRole}\" not found.` }\n const newPrompt = existingPrompt + `\\n\\n## Self-Patched Instruction (agent-driven)\\n${args.prompt}`\n const updated = roleRegistry.updatePrompt(targetRole as \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\", newPrompt, \"agent-self\", args.description ?? \"Agent self-modification\")\n if (!updated) return { output: `Failed to update prompt for role \"${targetRole}\". Only built-in roles can be edited.` }\n persistence.save(\"prompts\", \"state\", roleRegistry.getAllPromptStates())\n return {\n output: `\u2705 Prompt for \\`${targetRole}\\` updated (v${roleRegistry.getPromptState(targetRole)?.currentVersion}). New instruction appended at the end.`,\n }\n }\n\n case \"prompt-history\": {\n const targetRole = args.role ?? \"developer\"\n const history = roleRegistry.getPromptHistory(targetRole)\n if (history.length === 0) return { output: `No prompt history for \"${targetRole}\".` }\n let out = `## \uD83D\uDCDC Prompt History for \\`${targetRole}\\`\\n\\n`\n for (const entry of history) {\n const preview = entry.prompt.slice(-200).replace(/\\n/g, \" \")\n out += `**v${entry.version}** \u2014 ${entry.timestamp} \u2014 source: ${entry.source}`\n if (entry.description) out += ` \u2014 ${entry.description}`\n out += `\\n\\`\\`\\`\\n...${preview.slice(-200)}\\n\\`\\`\\`\\n\\n`\n }\n return { output: out }\n }\n\n case \"rollback-prompt\": {\n const targetRole = args.role ?? \"developer\"\n const version = args.version\n if (!version) return { output: \"`version` is required for rollback-prompt.\" }\n const history = roleRegistry.getPromptHistory(targetRole)\n if (history.length === 0) return { output: `No prompt history for \"${targetRole}\".` }\n const target = history.find(e => e.version === version)\n if (!target) return { output: `Version ${version} not found for \"${targetRole}\". Available versions: ${history.map(e => `v${e.version}`).join(\", \")}` }\n const ok = roleRegistry.rollbackPrompt(targetRole, version)\n if (!ok) return { output: `Failed to rollback prompt for \"${targetRole}\".` }\n persistence.save(\"prompts\", \"state\", roleRegistry.getAllPromptStates())\n return {\n output: `\u2705 Prompt for \\`${targetRole}\\` rolled back to v${version} (from ${target.timestamp}).`,\n }\n }\n\n case \"export-training-data\": {\n const allSkills = skillStore.getAll()\n const fmt = args.format ?? \"openai\"\n const minRate = args.minSuccessRate ?? 0.5\n const dataset = skillsToTrainingData(allSkills, fmt, minRate)\n\n const filteredSkills = allSkills.filter(s => s.successRate >= minRate)\n const examples = filteredSkills.map(s => skillToTrainingExample(s))\n const summary = trainingDatasetSummary(examples)\n\n let out = summary\n out += `\\n\\n### Training Data (${dataset.format})\\n`\n out += `\\`\\`\\`\\n${dataset.data.slice(0, 2000)}${dataset.data.length > 2000 ? \"\\n\u2026 (truncated)\" : \"\"}\\n\\`\\`\\``\n if (dataset.data.length > 2000) {\n out += `\\n\\n**Full dataset:** ${dataset.data.length} characters, ${dataset.totalExamples} examples`\n }\n return { output: out }\n }\n\n default:\n return { output: `Unknown action: ${args.action}. Available: inspect, register-role, export-skill, memory-schema, evolve, read-prompt, edit-prompt, prompt-history, rollback-prompt, export-training-data.` }\n }\n },\n }),\n\n agentic_auto: tool({\n description: \"Fully autonomous engineering agent. Give it a goal and it plans, implements, verifies, and fixes code automatically \u2014 no step-by-step guidance needed.\",\n args: {\n goal: tool.schema.string().describe(\"The goal to accomplish autonomously\"),\n constraints: tool.schema.array(tool.schema.string()).optional().describe(\"Constraints or requirements\"),\n },\n async execute(args, context) {\n llmEngine.setSessionId(context.sessionID)\n const startTime = Date.now()\n const projectDir = ctxDir(context)\n\n // 1. Scan codebase for context\n await navigator.scan(projectDir)\n const summary = navigator.getSummary()\n\n // 2. LLM-driven plan (fallback to template if LLM returns empty)\n let subtasks: Subtask[] = []\n try {\n const intent = await planner.decomposeWithLLM(llmEngine, args.goal, summary)\n if (intent.subtasks.length > 0) subtasks = intent.subtasks\n } catch { /* fall through */ }\n if (subtasks.length === 0) {\n const template = planner.decompose(args.goal, [])\n if (template.autoGenerated) subtasks = template.intent.subtasks\n }\n if (subtasks.length === 0) {\n subtasks = [\n { id: \"step-1\", description: args.goal, dependsOn: [], verificationCriteria: [\"All code compiles\", \"Logic is correct\"] },\n ]\n }\n if (subtasks.length === 0) {\n return {\n output: `## \uD83E\uDD16 Autonomous Agent Report\\n\\n**Goal:** ${args.goal}\\n**Result:** 0/0 steps \u2014 could not decompose into subtasks. Try rephrasing the goal or using \\`agentic_plan\\` manually.`,\n metadata: { result: { completedSteps: [], failedSteps: [], totalIterations: 0, success: false, summary: \"Planning failed: no subtasks generated\" } },\n }\n }\n\n const plan = intentParser.createPlan({\n goal: args.goal,\n constraints: args.constraints ?? [],\n context: { relevantFiles: [], dependencies: [] },\n subtasks,\n })\n executor.initExecution(context.sessionID, plan)\n\n // 3. Execute steps via AgentLoop.runLoop()\n const parseStepOutput = (content: string): { files?: Array<{ path: string; content: string }>; summary?: string } => {\n const cleaned = content.trim()\n try {\n const parsed = JSON.parse(cleaned)\n if (parsed && typeof parsed === \"object\") return parsed\n } catch { /* try next */ }\n const jsonBlock = cleaned.match(/```(?:json)?\\s*\\n?(\\{[\\s\\S]*?\\})\\s*\\n?```/)\n if (jsonBlock) {\n try { return JSON.parse(jsonBlock[1]) } catch { /* try next */ }\n }\n const jsonMatch = cleaned.match(/\\{[\\s\\S]*?\"files\"[\\s\\S]*?\"summary\"[\\s\\S]*?\\}/)\n if (jsonMatch) {\n try {\n const p = JSON.parse(jsonMatch[0])\n if (Array.isArray(p.files) || p.summary) return p\n } catch { /* try next */ }\n }\n return { files: [], summary: cleaned.replace(/```[\\s\\S]*?```/g, \"\").slice(0, 200).trim() }\n }\n\n const stepExecutor = async (step: Subtask) => {\n const stepsSoFar = executor.getCompletedSteps(context.sessionID)\n const prevState = executor.getStepState(context.sessionID, step.id)\n const retryNote = prevState?.retryCount && prevState.retryCount > 0\n ? `\\nPREVIOUS ATTEMPT FAILED (retry #${prevState.retryCount}/3). Errors:\\n${(prevState.errorHistory || []).map(e => `- ${e.error}`).join(\"\\n\")}`\n : \"\"\n const resp = await llmEngine.call({\n systemPrompt: `You are an autonomous software engineer implementing a step of a larger plan. Generate implementation as JSON with:\n- \"files\": [{ \"path\": \"relative/file/path\", \"content\": \"file content\" }]\n- \"summary\": \"what was done\"\nOnly include files that need changing. Return ONLY valid JSON.` + llmEngine.getMemoryContext(step.description),\n userPrompt: `Goal: ${args.goal}\\nStep (${step.id}): ${step.description}\\nDir: ${projectDir}\\nCompleted steps: ${stepsSoFar.join(\", \") || \"none\"}${retryNote}`,\n jsonMode: false,\n temperature: prevState?.retryCount ? 0.4 : 0.3,\n })\n\n const impl = parseStepOutput(resp.content)\n\n // Validate LLM actually produced implementation\n const hasContent = (impl.files && impl.files.length > 0) || (impl.summary && impl.summary.length > 20)\n if (!hasContent) {\n return { success: false, output: `LLM produced no implementation. Raw output: ${resp.content.slice(0, 200)}`, filesModified: [] }\n }\n\n const files: string[] = []\n for (const file of impl.files ?? []) {\n const fullPath = join(projectDir, file.path)\n mkdirSync(dirname(fullPath), { recursive: true })\n writeFileSync(fullPath, file.content, \"utf-8\")\n files.push(file.path)\n }\n\n return { success: true, output: impl.summary ?? step.description, filesModified: files }\n }\n\n const fixExecutor = async (fix: string) => {\n try {\n execFileSync(\"bash\", [\"-c\", fix], { cwd: projectDir, timeout: 30000, stdio: \"pipe\" })\n return true\n } catch { return false }\n }\n\n const result = await agentLoop.runLoop(\n context.sessionID, executor, verifier, errorAnalyzer, depTracker,\n projectDir, stepExecutor, fixExecutor,\n )\n\n // 4. Trace + episode\n const allFiles = executor.getAllFilesModified(context.sessionID)\n traceLogger.log({\n step: \"auto\", input: args.goal, output: JSON.stringify(result),\n toolUsed: \"agentic_auto\", success: result.success,\n durationMs: Date.now() - startTime, metadata: { ...result } as unknown as Record<string, unknown>,\n })\n\n episodicStore.record(\n context.sessionID, args.goal,\n result.success ? \"success\" : \"partial\",\n result.completedSteps.map(() => \"completed\"),\n allFiles,\n )\n\n // 5. Feed results to ContinuousEvolution\n const completedSteps = executor.getCompletedSteps(context.sessionID)\n for (const stepId of completedSteps) {\n continuousEvolution.feedStepResult({\n stepId,\n success: true,\n output: \"completed\",\n sessionId: context.sessionID,\n timestamp: Date.now(),\n })\n }\n for (const stepId of result.failedSteps) {\n continuousEvolution.feedStepResult({\n stepId,\n success: false,\n output: \"failed\",\n sessionId: context.sessionID,\n timestamp: Date.now(),\n })\n }\n const autoTrend = continuousEvolution.checkAndNotify()\n\n // 6. Auto-extract skill if successful\n if (result.success && result.completedSteps.length > 0) {\n const skillResult = await skillStore.extract({\n role: \"tool\",\n content: `\u2705 Successfully completed: ${args.goal}\\nSteps completed: ${result.completedSteps.join(\", \")}\\nSummary: ${result.summary}`,\n }, [args.goal, ...(args.constraints ?? [])])\n if (skillResult) {\n persistence.save(\"skills\", skillResult.definition.meta.id, skillResult.definition)\n }\n }\n\n // 7. Report\n const totalSteps = result.completedSteps.length + result.failedSteps.length\n let report = `## \uD83E\uDD16 Autonomous Agent Report\\n\\n`\n report += `**Goal:** ${args.goal}\\n`\n report += `**Result:** ${result.completedSteps.length}/${totalSteps} steps (${result.totalIterations} iterations)\\n`\n report += `${result.success ? \"\u2705 All passed\" : \"\u26A0\uFE0F Some failed\"}\\n`\n report += `**Duration:** ${((Date.now() - startTime) / 1000).toFixed(1)}s\\n\\n`\n if (allFiles.length > 0) {\n report += `### Files Modified\\n\\`\\`\\`\\n${[...new Set(allFiles)].join(\"\\n\")}\\n\\`\\`\\`\\n`\n }\n report += `\\n${result.summary}`\n\n // Evolution trend summary\n if (autoTrend.overall.total >= 5 || autoTrend.degradationDetected) {\n const dirIcon = autoTrend.rolling.direction === \"improving\" ? \"\uD83D\uDCC8\" : autoTrend.rolling.direction === \"degrading\" ? \"\uD83D\uDCC9\" : \"\uD83D\uDCCA\"\n report += `\\n\\n### ${dirIcon} Evolution Trend\\n`\n report += `**Overall:** ${(autoTrend.overall.successRate * 100).toFixed(0)}% (${autoTrend.overall.success}/${autoTrend.overall.total})\\n`\n report += `**Recent (last ${autoTrend.rolling.windowSize}):** ${(autoTrend.rolling.successRate * 100).toFixed(0)}% \u2014 ${autoTrend.rolling.direction}\\n`\n if (autoTrend.degradationDetected) {\n report += `\u26A0\uFE0F **Degradation detected!** Auto-running self-evolution...\\n`\n try {\n const evolveSummary = await runAutoEvolve()\n report += `${evolveSummary.replace(/\\n/g, \"\\n\")}\\n`\n } catch (e) {\n report += `\u26A0\uFE0F Auto-evolution encountered an error: ${(e as Error).message}\\n`\n }\n }\n if (autoTrend.recommendations.length > 0) {\n report += `**Suggestions:**\\n${autoTrend.recommendations.map(r => `- ${r}`).join(\"\\n\")}\\n`\n }\n }\n\n // Live evaluation score\n if (liveEvaluator.computeScore().totalSteps > 0 || liveEvaluator.computeScore().totalDelegations > 0) {\n report += `\\n\\n${liveEvaluator.formatReport(false)}`\n }\n\n return { output: report, metadata: { result } }\n },\n }),\n },\n\n \"tool.execute.after\": async (toolInput: { tool: string; args: Record<string, unknown>; sessionID: string; callID: string }, _output: { title: string; output: string; metadata: unknown }) => {\n traceLogger.log({\n step: \"tool\",\n input: JSON.stringify(toolInput.args ?? {}),\n output: \"completed\",\n toolUsed: toolInput.tool,\n success: true,\n durationMs: 0,\n })\n\n // Feed LiveEvaluator from tool execution\n try {\n const args = toolInput.args ?? {}\n switch (toolInput.tool) {\n case \"agentic_execute\": {\n const success = args.success === true\n if (args.stepId) {\n liveEvaluator.feedStepResult({ stepId: String(args.stepId), success, sessionId: toolInput.sessionID })\n // Error recovery tracking: if retry succeeded after an error\n if (success && args.error && String(args.error).length > 0) {\n liveEvaluator.feedErrorRecovery(`exec-${args.stepId}`, true)\n } else if (!success && args.error && String(args.error).length > 0) {\n liveEvaluator.feedErrorRecovery(`exec-${args.stepId}`, false)\n }\n }\n break\n }\n case \"agentic_reflect\": {\n // Each reflect call counts as error recovery attempt\n if (args.stepId) {\n liveEvaluator.feedErrorRecovery(`reflect-${args.stepId}`, true)\n }\n break\n }\n case \"agentic_nav\": {\n if (args.query) {\n const outputText = _output?.output || \"\"\n const fileMatches = (outputText.match(/\\.ts/g) ?? []).length\n liveEvaluator.feedNavigation(String(args.query), fileMatches)\n }\n break\n }\n case \"agentic_delegate\": {\n if (args.taskId && args.role) {\n const outputOk = (_output?.output || \"\").includes(\"delegated\") || (_output?.output || \"\").includes(\"Delegated\")\n liveEvaluator.feedDelegation(String(args.taskId), String(args.role), outputOk)\n }\n break\n }\n case \"agentic_skill\": {\n if (args.action === \"find\" || args.action === \"search\") {\n const found = (_output?.output || \"\").includes(\"Skill\") || (_output?.output || \"\").includes(\"skill\")\n liveEvaluator.feedSkillLookup(found)\n }\n break\n }\n }\n } catch { /* non-fatal */ }\n },\n\n dispose: async () => {\n configLoader.stopWatch()\n persistence.save(\"models\", \"registry\", modelRegistry.toJSON())\n persistence.save(\"prompts\", \"state\", roleRegistry.getAllPromptStates())\n await traceLogger.dispose()\n },\n }\n}\n\nexport const AgenticEngine: Plugin = createEngine\n\nconst pluginModule: PluginModule = {\n id: \"agentic-engine\",\n server: createEngine,\n}\nexport default pluginModule\n\n// Re-export key classes so tests can construct them directly\nexport { ErrorAnalyzer } from \"./core/error-analyzer.js\"\nexport { RoleRegistry } from \"./agents/role-registry.js\"\nexport { VectorStore } from \"./memory/vector-store.js\"\nexport { Verifier } from \"./core/verifier.js\"\nexport { ContinuousEvolution } from \"./evolution/continuous-evolution.js\"\nexport { SelfEvolver } from \"./evolution/self-evolver.js\"\nexport { AgentCoordinator } from \"./agents/coordinator.js\"\nexport { Executor } from \"./core/executor.js\"\nexport { PatternDiscovery } from \"./drift/pattern-discovery.js\"\nexport { skillToTrainingExample, skillsToTrainingData, exportOpenAIJSONL, exportInstructionsJSON, trainingDatasetSummary } from \"./memory/skill-training.js\"\nexport { LiveEvaluator } from \"./evaluation/live-evaluator.js\"\n", "export interface Subtask {\n id: string\n description: string\n dependsOn: string[]\n verificationCriteria: string[]\n}\n\nexport interface TaskIntent {\n goal: string\n constraints: string[]\n context: {\n relevantFiles: string[]\n dependencies: string[]\n }\n subtasks: Subtask[]\n}\n\nexport interface Plan {\n intent: TaskIntent\n estimatedSteps: number\n complexity: \"low\" | \"medium\" | \"high\"\n warnings: string[]\n}\n\nexport class IntentParser {\n createPlan(intent: TaskIntent): Plan {\n const complexity = intent.subtasks.length <= 3 ? \"low\"\n : intent.subtasks.length <= 8 ? \"medium\"\n : \"high\"\n\n const warnings: string[] = []\n if (complexity === \"high\") {\n warnings.push(\"Complex task detected. Consider breaking it down further.\")\n }\n if (intent.constraints.length === 0) {\n warnings.push(\"No constraints specified. Consider adding guardrails.\")\n }\n\n return {\n intent,\n estimatedSteps: intent.subtasks.length,\n complexity,\n warnings,\n }\n }\n\n validatePlan(plan: Plan): string[] {\n const errors: string[] = []\n const ids = new Set(plan.intent.subtasks.map(s => s.id))\n\n for (const step of plan.intent.subtasks) {\n for (const dep of step.dependsOn) {\n if (!ids.has(dep)) {\n errors.push(`Step \"${step.id}\" depends on unknown step \"${dep}\"`)\n }\n }\n }\n\n if (plan.intent.subtasks.length === 0) {\n errors.push(\"Plan has no subtasks\")\n }\n\n return errors\n }\n}\n", "import type { Subtask, Plan } from \"./intent-parser\"\n\nexport interface ExecutionResult {\n stepId: string\n success: boolean\n output: string\n filesModified?: string[]\n error?: string\n}\n\nexport interface StepErrorHistory {\n error: string\n attemptedFix: string\n timestamp: number\n success: boolean\n}\n\nexport interface StepState {\n result?: ExecutionResult\n retryCount: number\n errorHistory: StepErrorHistory[]\n}\n\nexport interface ExecutionState {\n plan: Plan\n completedSteps: Set<string>\n failedSteps: Map<string, string>\n stepStates: Map<string, StepState>\n currentStepIndex: number\n}\n\nexport class Executor {\n private maxRetries = 3\n private states = new Map<string, ExecutionState>()\n\n /** Per-error-category retry limits (Gap #13: adaptive retry policies).\n * Different error types need different retry strategies:\n * - compile/type: usually deterministic, 3 retries\n * - test: flaky tests may need fewer retries\n * - import: file-not-found won't fix by retrying\n * - runtime: environmental, worth a few retries\n */\n private retryPolicies = new Map<string, number>([\n [\"compile\", 3],\n [\"type\", 3],\n [\"test\", 2],\n [\"import\", 1],\n [\"runtime\", 3],\n [\"unknown\", 3],\n ])\n\n /** Set max retries for a specific error category. Default categories: compile, type, test, import, runtime, unknown */\n setRetryPolicy(category: string, maxRetries: number): void {\n this.retryPolicies.set(category, maxRetries)\n }\n\n /** Get max retries for an error category, or the global default if not categorized */\n getMaxRetries(category?: string): number {\n if (category && this.retryPolicies.has(category)) {\n return this.retryPolicies.get(category)!\n }\n return this.maxRetries\n }\n\n /** Get all retry policy summaries */\n getRetryPolicies(): Array<{ category: string; maxRetries: number }> {\n return [...this.retryPolicies.entries()]\n .map(([category, maxRetries]) => ({ category, maxRetries }))\n .sort((a, b) => a.category.localeCompare(b.category))\n }\n\n initExecution(sessionId: string, plan: Plan): ExecutionState {\n const state: ExecutionState = {\n plan,\n completedSteps: new Set(),\n failedSteps: new Map(),\n stepStates: new Map(),\n currentStepIndex: 0,\n }\n this.states.set(sessionId, state)\n return state\n }\n\n getNextStep(sessionId: string): Subtask | null {\n const state = this.states.get(sessionId)\n if (!state) return null\n\n for (const step of state.plan.intent.subtasks) {\n if (state.completedSteps.has(step.id)) continue\n if (state.failedSteps.has(step.id)) continue\n\n const depsMet = step.dependsOn.every(d => state.completedSteps.has(d))\n if (depsMet) {\n state.currentStepIndex = state.plan.intent.subtasks.indexOf(step)\n return step\n }\n }\n\n return null\n }\n\n getBlockedSteps(sessionId: string): Array<{ id: string; description: string; blockedBy: string[] }> {\n const state = this.states.get(sessionId)\n if (!state) return []\n\n const blocked: Array<{ id: string; description: string; blockedBy: string[] }> = []\n for (const step of state.plan.intent.subtasks) {\n if (state.completedSteps.has(step.id)) continue\n if (state.failedSteps.has(step.id)) continue\n const unmet = step.dependsOn.filter(d => !state.completedSteps.has(d))\n if (unmet.length > 0) {\n blocked.push({ id: step.id, description: step.description, blockedBy: unmet })\n }\n }\n return blocked\n }\n\n recordResult(sessionId: string, result: ExecutionResult): void {\n const state = this.states.get(sessionId)\n if (!state) return\n\n let stepState = state.stepStates.get(result.stepId)\n if (!stepState) {\n stepState = { retryCount: 0, errorHistory: [] }\n state.stepStates.set(result.stepId, stepState)\n }\n\n stepState.result = result\n\n if (result.success) {\n state.completedSteps.add(result.stepId)\n } else {\n stepState.retryCount++\n stepState.errorHistory.push({\n error: result.error ?? \"Unknown error\",\n attemptedFix: \"\",\n timestamp: Date.now(),\n success: false,\n })\n\n // Adaptive: use per-category retry limit (Gap #13)\n const errorCategory = this.detectErrorCategory(result.error ?? result.output)\n const maxRetries = this.getMaxRetries(errorCategory)\n\n if (stepState.retryCount < maxRetries) {\n state.failedSteps.delete(result.stepId)\n } else {\n state.failedSteps.set(result.stepId, result.error ?? `Max retries (${maxRetries}) exceeded for category: ${errorCategory}`)\n }\n }\n }\n\n recordFixAttempt(sessionId: string, stepId: string, fix: string, success: boolean): void {\n const state = this.states.get(sessionId)\n if (!state) return\n\n const stepState = state.stepStates.get(stepId)\n if (stepState && stepState.errorHistory.length > 0) {\n const last = stepState.errorHistory[stepState.errorHistory.length - 1]\n last.attemptedFix = fix\n last.success = success\n }\n }\n\n canRetry(sessionId: string, stepId: string, category?: string): boolean {\n const state = this.states.get(sessionId)\n if (!state) return false\n const ss = state.stepStates.get(stepId)\n\n // Adaptive: if category provided, use per-category limit\n if (category) {\n return (ss?.retryCount ?? 0) < this.getMaxRetries(category)\n }\n\n // Fall back to last known error's category\n if (ss?.result?.error) {\n const detectedCategory = this.detectErrorCategory(ss.result.error)\n return (ss?.retryCount ?? 0) < this.getMaxRetries(detectedCategory)\n }\n\n return (ss?.retryCount ?? 0) < this.maxRetries\n }\n\n /** Detect error category from error text */\n private detectErrorCategory(errorText: string): string {\n const lower = errorText.toLowerCase()\n if (lower.includes(\"cannot find module\") || lower.includes(\"module not found\") || lower.includes(\"import\") || lower.includes(\"require\")) return \"import\"\n if (lower.includes(\"type\") && (lower.includes(\"not assignable\") || lower.includes(\"is not a type\") || lower.includes(\"property\") || lower.includes(\"does not exist\"))) return \"type\"\n if (lower.includes(\"compile\") || lower.includes(\"tsc\") || lower.includes(\"syntax error\") || lower.includes(\"unexpected token\")) return \"compile\"\n if (lower.includes(\"test\") || lower.includes(\"assert\") || lower.includes(\"expected\") && lower.includes(\"to be\") || lower.includes(\"expect.\")) return \"test\"\n if (lower.includes(\"timeout\") || lower.includes(\"econnrefused\") || lower.includes(\"etimedout\") || lower.includes(\"network\")) return \"runtime\"\n return \"unknown\"\n }\n\n getRetryCount(sessionId: string, stepId: string): number {\n const state = this.states.get(sessionId)\n if (!state) return 0\n return state.stepStates.get(stepId)?.retryCount ?? 0\n }\n\n getCompletedSteps(sessionId: string): string[] {\n const state = this.states.get(sessionId)\n if (!state) return []\n return [...state.completedSteps]\n }\n\n getStepState(sessionId: string, stepId: string): StepState | undefined {\n return this.states.get(sessionId)?.stepStates.get(stepId)\n }\n\n isComplete(sessionId: string): boolean {\n const state = this.states.get(sessionId)\n if (!state) return false\n\n return state.plan.intent.subtasks.every(\n s => state.completedSteps.has(s.id) || state.failedSteps.has(s.id)\n )\n }\n\n isHealthy(sessionId: string): boolean {\n const state = this.states.get(sessionId)\n if (!state) return false\n return state.failedSteps.size === 0\n }\n\n getProgress(sessionId: string): { completed: number; total: number; failed: number; blocked: number } {\n const state = this.states.get(sessionId)\n if (!state) return { completed: 0, total: 0, failed: 0, blocked: 0 }\n\n return {\n completed: state.completedSteps.size,\n total: state.plan.intent.subtasks.length,\n failed: state.failedSteps.size,\n blocked: this.getBlockedSteps(sessionId).length,\n }\n }\n\n getAllFilesModified(sessionId: string): string[] {\n const state = this.states.get(sessionId)\n if (!state) return []\n const files = new Set<string>()\n for (const stepState of state.stepStates.values()) {\n if (stepState.result?.filesModified) {\n for (const f of stepState.result.filesModified) files.add(f)\n }\n }\n return [...files]\n }\n\n removeSession(sessionId: string): void {\n this.states.delete(sessionId)\n }\n}\n", "import { execFileSync } from \"node:child_process\"\nimport { existsSync, readFileSync } from \"node:fs\"\nimport { resolve } from \"node:path\"\nimport type { LLMEngine } from \"./llm.js\"\n\nexport type SupportedLanguage = \"typescript\" | \"python\" | \"go\" | \"rust\" | \"javascript\" | \"unknown\"\n\nexport interface VerificationResult {\n passed: boolean\n stepId: string\n checks: CheckResult[]\n errors: string[]\n}\n\nexport interface CheckResult {\n name: string\n passed: boolean\n output: string\n}\n\nexport interface LanguageConfig {\n compileCmd: (projectDir: string) => { bin: string; args: string[]; timeout: number }\n testCmd: (projectDir: string, testPattern?: string) => { bin: string; args: string[]; timeout: number }\n fileExts: string[]\n testFileExts: string[]\n}\n\nconst LANGUAGE_CONFIGS: Record<SupportedLanguage, LanguageConfig> = {\n typescript: {\n compileCmd: (dir) => ({ bin: \"npx\", args: [\"tsc\", \"--noEmit\", \"--pretty\", \"false\"], timeout: 30000 }),\n testCmd: (dir, pattern) => {\n const args = [\"vitest\", \"run\", \"--reporter\", \"verbose\"]\n if (pattern) args.push(\"--\", pattern)\n return { bin: \"npx\", args, timeout: 60000 }\n },\n fileExts: [\".ts\", \".tsx\"],\n testFileExts: [\".test.ts\", \".spec.ts\", \".test.tsx\", \".spec.tsx\"],\n },\n javascript: {\n compileCmd: (dir) => ({ bin: \"node\", args: [\"-e\", \"process.exit(0)\"], timeout: 5000 }),\n testCmd: (dir, pattern) => {\n const args = [\"vitest\", \"run\", \"--reporter\", \"verbose\"]\n if (pattern) args.push(\"--\", pattern)\n return { bin: \"npx\", args, timeout: 60000 }\n },\n fileExts: [\".js\", \".jsx\", \".mjs\"],\n testFileExts: [\".test.js\", \".spec.js\", \".test.jsx\", \".spec.jsx\"],\n },\n python: {\n compileCmd: (dir) => ({ bin: \"python\", args: [\"-m\", \"py_compile\", \"-q\", \".\"], timeout: 30000 }),\n testCmd: (dir, pattern) => {\n const args = [\"-m\", \"pytest\", \"-q\"]\n if (pattern) args.push(pattern)\n return { bin: \"python\", args, timeout: 60000 }\n },\n fileExts: [\".py\"],\n testFileExts: [\"test_\", \"_test.py\"],\n },\n go: {\n compileCmd: (dir) => ({ bin: \"go\", args: [\"vet\", \"./...\"], timeout: 30000 }),\n testCmd: (dir, pattern) => {\n const args = [\"test\", \"./...\", \"-count=1\"]\n if (pattern) args.push(\"-run\", pattern)\n return { bin: \"go\", args, timeout: 120000 }\n },\n fileExts: [\".go\"],\n testFileExts: [\"_test.go\"],\n },\n rust: {\n compileCmd: (dir) => ({ bin: \"cargo\", args: [\"check\", \"--quiet\"], timeout: 120000 }),\n testCmd: (dir, pattern) => {\n const args = [\"test\"]\n if (pattern) args.push(pattern)\n return { bin: \"cargo\", args, timeout: 120000 }\n },\n fileExts: [\".rs\"],\n testFileExts: [\"test.rs\"],\n },\n unknown: {\n compileCmd: (dir) => ({ bin: \"echo\", args: [\"no compile step\"], timeout: 1000 }),\n testCmd: (dir) => ({ bin: \"echo\", args: [\"no test step\"], timeout: 1000 }),\n fileExts: [],\n testFileExts: [],\n },\n}\n\nexport class Verifier {\n private detectedLang: SupportedLanguage = \"unknown\"\n private llm: LLMEngine | null = null\n\n setLLM(llm: LLMEngine): void {\n this.llm = llm\n }\n\n hasLLM(): boolean {\n return this.llm !== null\n }\n\n async verifySemantic(stepId: string, intent: string, changedFiles: string[], projectDir: string): Promise<CheckResult> {\n if (!this.llm) {\n return { name: \"semantic\", passed: true, output: \"Semantic verification skipped (no LLM configured)\" }\n }\n\n const fileContents: Record<string, string> = {}\n for (const f of changedFiles) {\n const absPath = resolve(projectDir, f)\n try {\n fileContents[f] = readFileSync(absPath, \"utf-8\")\n } catch { /* skip unreadable files */ }\n }\n\n if (Object.keys(fileContents).length === 0) {\n return { name: \"semantic\", passed: true, output: \"Semantic verification skipped (no readable changed files)\" }\n }\n\n const filesBlock = Object.entries(fileContents).map(([path, content]) =>\n `### ${path}\\n\\`\\`\\`\\n${content.slice(0, 2000)}\\n\\`\\`\\``\n ).join(\"\\n\\n\")\n\n const resp = await this.llm.call({\n systemPrompt: \"You are a semantic verification assistant. Given an intent/goal and the code changes made, determine if the changes correctly implement the intent. Consider: edge cases, completeness, correctness. Respond as JSON with keys: passed (boolean), reasoning (string), issuesFound (array of strings). If the code correctly implements the intent, passed must be true.\",\n userPrompt: `## Intent\\n${intent}\\n\\n## Changed Files\\n${filesBlock}\\n\\nVerify if these changes correctly implement the intent. Return JSON.`,\n jsonMode: true,\n temperature: 0.1,\n })\n\n try {\n const parsed = JSON.parse(resp.content)\n const issues = Array.isArray(parsed.issuesFound) ? parsed.issuesFound : []\n const passed = parsed.passed !== false\n return {\n name: \"semantic\",\n passed,\n output: `Semantic verification: ${passed ? \"PASS\" : \"ISSUES FOUND\"}\\nReasoning: ${parsed.reasoning ?? \"N/A\"}\\n${issues.length > 0 ? `Issues:\\n${issues.map((i: string) => `- ${i}`).join(\"\\n\")}` : \"\"}`,\n }\n } catch {\n return { name: \"semantic\", passed: true, output: `Semantic verification: ${resp.content.slice(0, 500)}` }\n }\n }\n\n async verifyAllDeep(stepId: string, projectDir: string, intent?: string, changedFiles?: string[], requireSemanticCheck = false): Promise<VerificationResult> {\n const checks: CheckResult[] = [\n this.verifyCompile(projectDir),\n ]\n if (this.detectedLang !== \"unknown\") {\n checks.push(this.verifyLint(projectDir))\n }\n checks.push(this.verifyTests(projectDir))\n\n if (this.llm && intent && changedFiles && changedFiles.length > 0) {\n const semantic = await this.verifySemantic(stepId, intent, changedFiles, projectDir)\n checks.push(semantic)\n } else if (requireSemanticCheck && changedFiles && changedFiles.length > 0) {\n checks.push({\n name: \"semantic\",\n passed: false,\n output: \"Semantic verification required but no LLM configured. Set requireSemanticCheck=false or configure LLM.\",\n })\n }\n\n const errors = checks.filter(c => !c.passed).map(c => c.output)\n return { passed: errors.length === 0, stepId, checks, errors }\n }\n\n detectLanguage(projectDir: string): SupportedLanguage {\n const checks: Array<{ lang: SupportedLanguage; file: string }> = [\n { lang: \"typescript\", file: \"tsconfig.json\" },\n { lang: \"rust\", file: \"Cargo.toml\" },\n { lang: \"go\", file: \"go.mod\" },\n { lang: \"python\", file: \"pyproject.toml\" },\n { lang: \"python\", file: \"setup.py\" },\n { lang: \"python\", file: \"requirements.txt\" },\n { lang: \"javascript\", file: \"package.json\" },\n ]\n\n for (const { lang, file } of checks) {\n if (existsSync(resolve(projectDir, file))) {\n if (lang === \"javascript\" && existsSync(resolve(projectDir, \"tsconfig.json\"))) {\n this.detectedLang = \"typescript\"\n return \"typescript\"\n }\n this.detectedLang = lang\n return lang\n }\n }\n\n this.detectedLang = \"unknown\"\n return \"unknown\"\n }\n\n getLanguage(): SupportedLanguage {\n return this.detectedLang\n }\n\n verifyCompile(projectDir: string): CheckResult {\n const lang = this.detectedLang === \"unknown\" ? this.detectLanguage(projectDir) : this.detectedLang\n const config = LANGUAGE_CONFIGS[lang] ?? LANGUAGE_CONFIGS.unknown\n const { bin, args, timeout } = config.compileCmd(projectDir)\n\n try {\n const output = execFileSync(bin, args, {\n cwd: projectDir,\n timeout,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n })\n return {\n name: `compile:${lang}`,\n passed: true,\n output: output || \"Compilation successful\",\n }\n } catch (e: unknown) {\n const err = e as { stdout?: string; stderr?: string; message?: string }\n return {\n name: `compile:${lang}`,\n passed: false,\n output: err.stderr || err.stdout || err.message || \"Compilation failed\",\n }\n }\n }\n\n verifyTests(projectDir: string, testPattern = \"\"): CheckResult {\n const lang = this.detectedLang === \"unknown\" ? this.detectLanguage(projectDir) : this.detectedLang\n const config = LANGUAGE_CONFIGS[lang] ?? LANGUAGE_CONFIGS.unknown\n const { bin, args, timeout } = config.testCmd(projectDir, testPattern)\n\n try {\n const output = execFileSync(bin, args, {\n cwd: projectDir,\n timeout,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n })\n return {\n name: testPattern ? `test:${testPattern}` : `test:all:${lang}`,\n passed: true,\n output: output || \"Tests passed\",\n }\n } catch (e: unknown) {\n const err = e as { stdout?: string; stderr?: string; message?: string }\n return {\n name: testPattern ? `test:${testPattern}` : `test:all:${lang}`,\n passed: false,\n output: err.stdout || err.stderr || err.message || \"Tests failed\",\n }\n }\n }\n\n verifyLint(projectDir: string): CheckResult {\n const lang = this.detectedLang === \"unknown\" ? this.detectLanguage(projectDir) : this.detectedLang\n\n const lintConfigs: Partial<Record<SupportedLanguage, { bin: string; args: string[] }>> = {\n typescript: { bin: \"npx\", args: [\"eslint\", \".\", \"--quiet\"] },\n javascript: { bin: \"npx\", args: [\"eslint\", \".\", \"--quiet\"] },\n python: { bin: \"python\", args: [\"-m\", \"ruff\", \"check\", \".\"] },\n go: { bin: \"golangci-lint\", args: [\"run\", \"./...\"] },\n }\n\n const config = lintConfigs[lang]\n if (!config) {\n return { name: `lint:${lang}`, passed: true, output: \"No linter configured for this language\" }\n }\n\n try {\n const output = execFileSync(config.bin, config.args, {\n cwd: projectDir,\n timeout: 60000,\n encoding: \"utf-8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n })\n return { name: `lint:${lang}`, passed: true, output: output || \"Lint passed\" }\n } catch (e: unknown) {\n const err = e as { stdout?: string; stderr?: string; message?: string }\n return {\n name: `lint:${lang}`,\n passed: false,\n output: err.stdout || err.stderr || err.message || \"Lint failed\",\n }\n }\n }\n\n verifyAll(stepId: string, projectDir: string): VerificationResult {\n if (this.detectedLang === \"unknown\") this.detectLanguage(projectDir)\n\n const checks = [\n this.verifyCompile(projectDir),\n ]\n if (this.detectedLang !== \"unknown\") {\n checks.push(this.verifyLint(projectDir))\n }\n checks.push(this.verifyTests(projectDir))\n\n const errors = checks.filter(c => !c.passed).map(c => c.output)\n\n return {\n passed: errors.length === 0,\n stepId,\n checks,\n errors,\n }\n }\n\n verifyRelated(stepId: string, projectDir: string, changedFiles: string[]): VerificationResult {\n if (this.detectedLang === \"unknown\") this.detectLanguage(projectDir)\n const lang = this.detectedLang\n const config = LANGUAGE_CONFIGS[lang] ?? LANGUAGE_CONFIGS.typescript\n\n const checks: CheckResult[] = [this.verifyCompile(projectDir)]\n\n const isTestFile = (f: string): boolean => config.testFileExts.some(ext => {\n if (ext.startsWith(\"test_\")) {\n const basename = f.split(\"/\").pop() ?? f\n return basename.startsWith(\"test_\")\n }\n if (ext.startsWith(\"_test.\")) return f.endsWith(ext)\n return f.endsWith(ext)\n })\n\n const testFiles = changedFiles.filter(f => isTestFile(f))\n const sourceFiles = changedFiles.filter(f =>\n !isTestFile(f) && config.fileExts.some(ext => f.endsWith(ext))\n )\n\n const inferredTestFiles = sourceFiles.flatMap(f => {\n const base = f.replace(/\\.\\w+$/, \"\")\n const dir = base.replace(/\\/[^/]*$/, \"\")\n const filename = base.replace(/.*\\//, \"\")\n\n return config.testFileExts.flatMap(ext => {\n if (ext.startsWith(\"test_\")) {\n return [`${dir}/test_${filename}${config.fileExts[0] ?? \".py\"}`]\n }\n if (ext.endsWith(\"_\")) {\n return [`${base}${ext}`]\n }\n return [`${base}${ext}`]\n })\n })\n\n const allTestFiles = [...new Set([...testFiles, ...inferredTestFiles])]\n\n if (allTestFiles.length > 0) {\n checks.push({\n name: `test:${allTestFiles.length} related files`,\n passed: true,\n output: `Related test files: ${allTestFiles.join(\", \")}`,\n })\n }\n\n if (lang !== \"unknown\") {\n checks.push(this.verifyLint(projectDir))\n }\n checks.push(this.verifyTests(projectDir))\n\n const errors = checks.filter(c => !c.passed).map(c => c.output)\n return {\n passed: errors.length === 0,\n stepId,\n checks,\n errors,\n }\n }\n}\n", "/** Minimal LLM interface \u2014 avoids importing the full LLMEngine */\nexport interface ErrorAnalyzerLLM {\n call(req: { systemPrompt: string; userPrompt: string; temperature?: number }): Promise<{ content: string }>\n}\n\nexport interface ErrorAnalysis {\n category: \"compile\" | \"type\" | \"test\" | \"import\" | \"runtime\" | \"unknown\"\n summary: string\n likelyRootCause: string\n suggestedFix: string\n affectedFiles: string[]\n severity: \"low\" | \"medium\" | \"high\" | \"critical\"\n}\n\nexport class ErrorAnalyzer {\n private llm: ErrorAnalyzerLLM | null = null\n\n /** Inject an LLM engine for asynchronous fallback analysis. */\n setLLM(llm: ErrorAnalyzerLLM): void {\n this.llm = llm\n }\n\n /** Check whether an LLM is configured for fallback. */\n hasLLM(): boolean {\n return this.llm !== null\n }\n\n /**\n * Synchronous rule-based analysis. Fast and dependency-free.\n * For ambiguous errors, returns category:\"unknown\".\n */\n analyze(errorMessage: string, modifiedFiles: string[]): ErrorAnalysis {\n const msg = errorMessage.toLowerCase()\n\n if (msg.includes(\"cannot find module\") || msg.includes(\"module not found\") || msg.includes(\"could not resolve\")) {\n const match = errorMessage.match(/['\"]([@\\w\\-/.]+)['\"]/)\n return {\n category: \"import\",\n summary: \"Missing module or broken import\",\n likelyRootCause: `The module ${match?.[1] ?? \"imported\"} could not be resolved. Check the import path or install the dependency.`,\n suggestedFix: `Verify the import statement is correct. If it's an npm package, run: npm install ${match?.[1] ?? \"\"}`,\n affectedFiles: modifiedFiles,\n severity: \"critical\",\n }\n }\n\n if (msg.includes(\"type\") && (msg.includes(\"is not assignable\") || msg.includes(\"has no\") || msg.includes(\"does not exist on type\"))) {\n return {\n category: \"type\",\n summary: \"TypeScript type error\",\n likelyRootCause: \"A type mismatch or missing property was introduced by recent changes.\",\n suggestedFix: \"Check the type annotations on recently modified code. Ensure function signatures, interfaces, and type imports match.\",\n affectedFiles: modifiedFiles,\n severity: \"high\",\n }\n }\n\n if (msg.includes(\"error ts\") || msg.includes(\"compilation failed\") || msg.includes(\"syntax error\")) {\n return {\n category: \"compile\",\n summary: \"Code fails to compile\",\n likelyRootCause: \"Syntax errors, missing imports, or broken references in recently modified files.\",\n suggestedFix: \"Run the compiler to see exact line numbers. Check the most recently modified files first.\",\n affectedFiles: modifiedFiles,\n severity: \"high\",\n }\n }\n\n if (msg.includes(\"test\") && (msg.includes(\"failed\") || msg.includes(\"assert\") || msg.includes(\"expect\"))) {\n return {\n category: \"test\",\n summary: \"Test assertion failure\",\n likelyRootCause: \"A code change broke existing behavior or the test expectations are outdated.\",\n suggestedFix: \"Review the failing test assertions. Either the code change introduced a bug, or the test needs to be updated to match new behavior.\",\n affectedFiles: modifiedFiles,\n severity: \"medium\",\n }\n }\n\n if (msg.includes(\"error\") && (msg.includes(\"throw\") || msg.includes(\"cannot\") || msg.includes(\"undefined\") || msg.includes(\"null\"))) {\n return {\n category: \"runtime\",\n summary: \"Runtime error detected\",\n likelyRootCause: \"A code path is hitting an unexpected state \u2014 possibly null/undefined access, missing guard, or unhandled edge case.\",\n suggestedFix: \"Add defensive checks (null guards, try/catch) at the point of failure. Consider adding input validation.\",\n affectedFiles: modifiedFiles,\n severity: \"high\",\n }\n }\n\n return {\n category: \"unknown\",\n summary: \"Unclassified error\",\n likelyRootCause: \"The error message does not match known patterns. Manual investigation needed.\",\n suggestedFix: \"Read the full error output carefully. Compare against the last successful state of the codebase.\",\n affectedFiles: modifiedFiles,\n severity: \"medium\",\n }\n }\n\n /**\n * Asynchronous LLM-enhanced analysis.\n * Tries rule-based first; if unknown AND LLM is available, asks the LLM\n * to classify the error and suggest a fix.\n */\n async analyzeDeep(errorMessage: string, modifiedFiles: string[]): Promise<ErrorAnalysis> {\n // Try rule-based first\n const ruleResult = this.analyze(errorMessage, modifiedFiles)\n if (ruleResult.category !== \"unknown\" || !this.llm) {\n return ruleResult\n }\n\n // LLM fallback for unknown errors\n try {\n const resp = await this.llm.call({\n systemPrompt: `You are an expert error analyzer for software engineering.\nGiven an error message, classify it into one category: compile, type, test, import, runtime, or unknown.\nThen provide:\n1. A short summary of the error\n2. The likely root cause (1-2 sentences)\n3. A specific, actionable suggested fix\n4. Severity: low, medium, high, or critical\n\nReturn your answer as JSON with fields: category, summary, likelyRootCause, suggestedFix, severity.\nOnly return valid JSON, no other text.`,\n userPrompt: `Error message:\n\\`\\`\\`\n${errorMessage.slice(0, 2000)}\n\\`\\`\\`\n\nModified files:\n${modifiedFiles.map(f => `- ${f}`).join(\"\\n\")}`,\n temperature: 0.1,\n })\n\n const cleaned = resp.content.trim()\n const jsonMatch = cleaned.match(/\\{[\\s\\S]*\\}/)\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0])\n const validCategories = [\"compile\", \"type\", \"test\", \"import\", \"runtime\", \"unknown\"]\n return {\n category: validCategories.includes(parsed.category) ? parsed.category : \"unknown\",\n summary: parsed.summary ?? \"LLM-analyzed error\",\n likelyRootCause: parsed.likelyRootCause ?? parsed.rootCause ?? \"Could not determine root cause\",\n suggestedFix: parsed.suggestedFix ?? parsed.fix ?? \"Could not determine fix\",\n affectedFiles: modifiedFiles,\n severity: [\"low\", \"medium\", \"high\", \"critical\"].includes(parsed.severity) ? parsed.severity : \"medium\",\n }\n }\n } catch {\n // LLM fallback failed \u2014 return original unknown result\n }\n\n return ruleResult\n }\n}\n", "import type { TaskIntent, Subtask } from \"./intent-parser.js\"\nimport type { LLMEngine } from \"./llm.js\"\n\nexport interface DecompositionRule {\n pattern: RegExp | string\n keywords: string[]\n template: (context: string) => Subtask[]\n}\n\nexport class Planner {\n private rules: DecompositionRule[] = [\n {\n pattern: /add|create|build|implement/i,\n keywords: [\"feature\", \"component\", \"module\", \"page\", \"endpoint\", \"api\"],\n template: (goal: string) => [\n { id: \"plan-types\", description: \"Define TypeScript interfaces and types needed\", dependsOn: [], verificationCriteria: [\"No type errors\"] },\n { id: \"plan-impl\", description: `Implement: ${goal}`, dependsOn: [\"plan-types\"], verificationCriteria: [\"Tests pass\"] },\n { id: \"plan-tests\", description: \"Write comprehensive unit tests\", dependsOn: [\"plan-impl\"], verificationCriteria: [\"All tests pass\"] },\n ],\n },\n {\n pattern: /fix|bug|repair|resolve|patch/i,\n keywords: [\"bug\", \"issue\", \"error\", \"crash\", \"broken\"],\n template: (goal: string) => [\n { id: \"fix-repro\", description: \"Reproduce the bug and add a failing test\", dependsOn: [], verificationCriteria: [\"Test reproduces the error\"] },\n { id: \"fix-root\", description: `Identify root cause and apply fix: ${goal}`, dependsOn: [\"fix-repro\"], verificationCriteria: [\"Failing test now passes\"] },\n { id: \"fix-regression\", description: \"Run full test suite to check for regressions\", dependsOn: [\"fix-root\"], verificationCriteria: [\"All tests pass\"] },\n ],\n },\n {\n pattern: /refactor|clean|restructure|extract/i,\n keywords: [\"refactor\", \"cleanup\", \"extract\", \"move\", \"rename\"],\n template: (goal: string) => [\n { id: \"refactor-audit\", description: \"Audit current implementation and document dependencies\", dependsOn: [], verificationCriteria: [\"Dependency map created\"] },\n { id: \"refactor-extract\", description: `Extract and restructure: ${goal}`, dependsOn: [\"refactor-audit\"], verificationCriteria: [\"Tests still pass\"] },\n { id: \"refactor-cleanup\", description: \"Remove old code and update references\", dependsOn: [\"refactor-extract\"], verificationCriteria: [\"No dead code\", \"Tests pass\"] },\n ],\n },\n {\n pattern: /test|spec|verify/i,\n keywords: [\"test\", \"spec\", \"coverage\", \"verify\"],\n template: (goal: string) => [\n { id: \"test-audit\", description: \"Identify untested code paths and edge cases\", dependsOn: [], verificationCriteria: [\"Coverage gaps documented\"] },\n { id: \"test-write\", description: `Write tests: ${goal}`, dependsOn: [\"test-audit\"], verificationCriteria: [\"New tests pass\"] },\n { id: \"test-verify\", description: \"Run full suite and verify coverage improved\", dependsOn: [\"test-write\"], verificationCriteria: [\"Coverage increased\"] },\n ],\n },\n {\n pattern: /deploy|release|ship/i,\n keywords: [\"deploy\", \"release\", \"publish\", \"launch\", \"ship\"],\n template: (goal: string) => [\n { id: \"deploy-audit\", description: \"Verify all tests pass and build succeeds\", dependsOn: [], verificationCriteria: [\"CI green\"] },\n { id: \"deploy-build\", description: `Build production artifacts: ${goal}`, dependsOn: [\"deploy-audit\"], verificationCriteria: [\"Build succeeds\"] },\n { id: \"deploy-release\", description: \"Tag release and update changelog\", dependsOn: [\"deploy-build\"], verificationCriteria: [\"Release tagged\"] },\n ],\n },\n {\n pattern: /migrate|upgrade|update dep/i,\n keywords: [\"migrate\", \"upgrade\", \"update\", \"bump\", \"dependency\"],\n template: (goal: string) => [\n { id: \"migrate-check\", description: \"Check breaking changes and compatibility\", dependsOn: [], verificationCriteria: [\"Breaking changes documented\"] },\n { id: \"migrate-impl\", description: `Apply migration: ${goal}`, dependsOn: [\"migrate-check\"], verificationCriteria: [\"Migration applied\"] },\n { id: \"migrate-verify\", description: \"Run full test suite and check for regressions\", dependsOn: [\"migrate-impl\"], verificationCriteria: [\"All tests pass\"] },\n ],\n },\n {\n pattern: /doc|document|readme/i,\n keywords: [\"document\", \"documentation\", \"readme\", \"docs\", \"comment\"],\n template: (goal: string) => [\n { id: \"doc-audit\", description: \"Identify undocumented APIs and missing docs\", dependsOn: [], verificationCriteria: [\"Gaps documented\"] },\n { id: \"doc-write\", description: `Write documentation: ${goal}`, dependsOn: [\"doc-audit\"], verificationCriteria: [\"Docs generated\"] },\n { id: \"doc-review\", description: \"Review documentation accuracy and completeness\", dependsOn: [\"doc-write\"], verificationCriteria: [\"Docs reviewed\"] },\n ],\n },\n {\n pattern: /perf|optimize|speed|slow|fast/i,\n keywords: [\"performance\", \"optimize\", \"speed\", \"slow\", \"bottleneck\", \"profile\"],\n template: (goal: string) => [\n { id: \"perf-profile\", description: \"Profile and identify bottlenecks\", dependsOn: [], verificationCriteria: [\"Bottleneck identified\"] },\n { id: \"perf-impl\", description: `Apply optimization: ${goal}`, dependsOn: [\"perf-profile\"], verificationCriteria: [\"Performance improved\"] },\n { id: \"perf-verify\", description: \"Benchmark and verify no regressions\", dependsOn: [\"perf-impl\"], verificationCriteria: [\"Benchmarks stable\"] },\n ],\n },\n {\n pattern: /security|auth|vuln|injection|xss|csrf/i,\n keywords: [\"security\", \"vulnerability\", \"auth\", \"permission\", \"encrypt\", \"harden\", \"protect\"],\n template: (goal: string) => [\n { id: \"sec-audit\", description: \"Audit current security posture and identify vulnerabilities\", dependsOn: [], verificationCriteria: [\"Vulnerabilities documented\"] },\n { id: \"sec-fix\", description: `Apply security fix: ${goal}`, dependsOn: [\"sec-audit\"], verificationCriteria: [\"Fix verified\"] },\n { id: \"sec-verify\", description: \"Run security scan and verify no regressions\", dependsOn: [\"sec-fix\"], verificationCriteria: [\"Scan passes\"] },\n ],\n },\n {\n pattern: /docker|container|image/i,\n keywords: [\"docker\", \"container\", \"image\", \"dockerfile\", \"compose\"],\n template: (goal: string) => [\n { id: \"docker-audit\", description: \"Review current Docker setup and dependencies\", dependsOn: [], verificationCriteria: [\"Dockerfile reviewed\"] },\n { id: \"docker-build\", description: `Build and optimize Docker image: ${goal}`, dependsOn: [\"docker-audit\"], verificationCriteria: [\"Image builds\"] },\n { id: \"docker-test\", description: \"Test container startup and health check\", dependsOn: [\"docker-build\"], verificationCriteria: [\"Container healthy\"] },\n ],\n },\n {\n pattern: /ci|cd|pipeline|github.action|gitlab/i,\n keywords: [\"ci\", \"cd\", \"pipeline\", \"github action\", \"gitlab\", \"deploy\", \"automation\"],\n template: (goal: string) => [\n { id: \"ci-design\", description: \"Design CI/CD pipeline stages and triggers\", dependsOn: [], verificationCriteria: [\"Pipeline stages defined\"] },\n { id: \"ci-impl\", description: `Implement CI/CD pipeline: ${goal}`, dependsOn: [\"ci-design\"], verificationCriteria: [\"Pipeline runs\"] },\n { id: \"ci-verify\", description: \"Verify pipeline executes end-to-end\", dependsOn: [\"ci-impl\"], verificationCriteria: [\"Pipeline green\"] },\n ],\n },\n ]\n\n decompose(goal: string, relevantFiles: string[]): { intent: TaskIntent; autoGenerated: boolean } {\n const intent: TaskIntent = {\n goal,\n constraints: [],\n context: { relevantFiles, dependencies: [] },\n subtasks: [],\n }\n\n for (const rule of this.rules) {\n const patternMatch = typeof rule.pattern === \"string\"\n ? goal.toLowerCase().includes(rule.pattern.toLowerCase())\n : rule.pattern.test(goal)\n\n const keywordMatch = rule.keywords.some(k => goal.toLowerCase().includes(k.toLowerCase()))\n\n if (patternMatch && keywordMatch) {\n intent.subtasks = rule.template(goal)\n return { intent, autoGenerated: true }\n }\n }\n\n return { intent, autoGenerated: false }\n }\n\n registerRule(rule: DecompositionRule): void {\n this.rules.push(rule)\n }\n\n getRules(): DecompositionRule[] {\n return [...this.rules]\n }\n\n async decomposeWithLLM(llm: LLMEngine, goal: string, codebaseSummary: string): Promise<TaskIntent> {\n const llmPlan = await llm.generatePlan(goal, [], codebaseSummary)\n const subtasks = Array.isArray(llmPlan.steps)\n ? llmPlan.steps.map(s => ({\n id: s.id,\n description: s.description,\n dependsOn: s.dependsOn ?? [],\n verificationCriteria: [],\n }))\n : []\n const intent: TaskIntent = {\n goal,\n constraints: [],\n context: { relevantFiles: [], dependencies: [] },\n subtasks,\n }\n return intent\n }\n\n suggestSubtask(id: string, description: string, dependsOn: string[] = []): Subtask {\n return { id, description, dependsOn, verificationCriteria: [] }\n }\n}\n", "import { readdir, readFile, stat, access } from \"node:fs/promises\"\nimport type { Dirent } from \"node:fs\"\nimport { join, extname, basename, dirname } from \"node:path\"\n\nexport interface ModuleInfo {\n path: string\n name: string\n ext: string\n size: number\n exports: string[]\n imports: string[]\n}\n\nexport interface ProjectIndex {\n root: string\n modules: ModuleInfo[]\n language: \"typescript\" | \"javascript\" | \"python\" | \"unknown\"\n hasTests: boolean\n testDir: string | null\n srcDir: string | null\n}\n\nexport class CodebaseNavigator {\n private index: ProjectIndex | null = null\n\n async scan(root: string): Promise<ProjectIndex> {\n if (this.index) return this.index\n\n const modules: ModuleInfo[] = []\n const srcDir = await this.findDir(root, [\"src\", \"lib\", \"app\", \"source\"])\n const testDir = await this.findDir(root, [\"test\", \"tests\", \"spec\", \"__tests__\"])\n\n const scanDir = srcDir ?? root\n await this.walk(scanDir, modules, root)\n\n const hasTests = testDir !== null\n const language = this.detectLanguage(modules)\n\n this.index = { root, modules, language, hasTests, testDir, srcDir }\n return this.index\n }\n\n findRelevantFiles(taskDescription: string, maxFiles = 10): string[] {\n if (!this.index) return []\n\n const keywords = taskDescription\n .toLowerCase()\n .split(/[\\s,_\\-.:/]+/)\n .filter(w => w.length > 2)\n\n const scored = this.index.modules.map(m => {\n let score = 0\n const name = m.name.toLowerCase()\n const path = m.path.toLowerCase()\n\n for (const kw of keywords) {\n if (name.includes(kw)) score += 10\n if (path.includes(kw)) score += 5\n if (m.imports.some(i => i.toLowerCase().includes(kw))) score += 3\n if (m.exports.some(e => e.toLowerCase().includes(kw))) score += 8\n }\n\n if (m.ext === \".test.ts\" || m.ext === \".spec.ts\") score -= 2\n\n return { path: m.path, score }\n })\n\n return scored\n .filter(s => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, maxFiles)\n .map(s => s.path)\n }\n\n getTestFiles(sourceFile: string): string[] {\n if (!this.index) return []\n const stem = basename(sourceFile, extname(sourceFile))\n const dir = dirname(sourceFile)\n\n const candidates = [\n join(dir, `${stem}.test.ts`),\n join(dir, `${stem}.spec.ts`),\n join(dir, \"__tests__\", `${stem}.test.ts`),\n ]\n\n if (this.index.testDir) {\n const relDir = dir.replace(this.index.srcDir ?? this.index.root, \"\")\n candidates.push(join(this.index.testDir, relDir, `${stem}.test.ts`))\n candidates.push(join(this.index.testDir, `${stem}.test.ts`))\n }\n\n return candidates.filter(t => this.index!.modules.some(m => m.path === t))\n }\n\n getSummary(): string {\n if (!this.index) return \"No index available. Run scan first.\"\n\n const i = this.index\n return [\n `**Root:** ${i.root}`,\n `**Language:** ${i.language}`,\n `**Modules:** ${i.modules.length} files`,\n `**Tests:** ${i.hasTests ? `Yes (${i.testDir})` : \"No test directory found\"}`,\n `**Source:** ${i.srcDir ?? i.root}`,\n ``,\n `**File breakdown:**`,\n ...this.groupByDir(i.modules).map(([dir, count]) => ` ${dir}: ${count} files`),\n ].join(\"\\n\")\n }\n\n private groupByDir(modules: ModuleInfo[]): Array<[string, number]> {\n const groups = new Map<string, number>()\n for (const m of modules) {\n const dir = dirname(m.path)\n groups.set(dir, (groups.get(dir) ?? 0) + 1)\n }\n return [...groups].sort((a, b) => b[1] - a[1])\n }\n\n private async findDir(root: string, names: string[]): Promise<string | null> {\n for (const name of names) {\n const p = join(root, name)\n try {\n const s = await stat(p)\n if (s.isDirectory()) return p\n } catch { /* skip */ }\n }\n return null\n }\n\n private async walk(dir: string, modules: ModuleInfo[], root: string): Promise<void> {\n let entries: Dirent[]\n try {\n entries = await readdir(dir, { withFileTypes: true })\n } catch {\n return\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name)\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name === \".git\" || entry.name === \"dist\" || entry.name === \".agentic\") continue\n await this.walk(fullPath, modules, root)\n } else if (entry.isFile()) {\n const ext = extname(entry.name)\n if (![\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".mts\"].includes(ext)) continue\n\n let size = 0\n try { size = (await stat(fullPath)).size } catch { /* skip */ }\n\n const imports: string[] = []\n const exports: string[] = []\n try {\n const content = await readFile(fullPath, \"utf-8\")\n for (const line of content.split(\"\\n\")) {\n const impMatch = line.match(/import\\s+.*?from\\s+['\"](.+?)['\"]/)\n if (impMatch) imports.push(impMatch[1])\n const expMatch = line.match(/export\\s+(const|function|class|interface|type|default)\\s+(\\w+)/)\n if (expMatch) exports.push(expMatch[2])\n }\n } catch { /* skip */ }\n\n modules.push({\n path: fullPath,\n name: entry.name.replace(ext, \"\"),\n ext,\n size,\n exports,\n imports,\n })\n }\n }\n }\n\n private detectLanguage(modules: ModuleInfo[]): ProjectIndex[\"language\"] {\n const ts = modules.filter(m => [\".ts\", \".tsx\", \".mts\"].includes(m.ext)).length\n const js = modules.filter(m => [\".js\", \".jsx\", \".mjs\"].includes(m.ext)).length\n if (ts > js) return \"typescript\"\n if (js > ts) return \"javascript\"\n if (ts + js > 0) return \"unknown\"\n return \"unknown\"\n }\n}\n", "import { readFileSync, existsSync } from \"node:fs\"\nimport { join, relative, dirname, resolve } from \"node:path\"\n\nexport interface FileChange {\n file: string\n stepId: string\n changeType: \"create\" | \"modify\" | \"delete\"\n timestamp: number\n}\n\nexport interface DependencyEdge {\n from: string\n to: string\n relation: \"imports\" | \"extends\" | \"type-ref\"\n}\n\nexport interface PropagationAnalysis {\n likelyCulprit: string | null\n affectedSteps: string[]\n propagationPath: string[]\n suggestion: string\n rootCauseConfidence: number\n}\n\nexport interface ImpactAnalysis {\n file: string\n impactedFiles: string[]\n impactedSteps: string[]\n risk: \"low\" | \"medium\" | \"high\"\n}\n\nexport class DependencyTracker {\n private fileChanges = new Map<string, FileChange[]>()\n private dependencies = new Map<string, DependencyEdge[]>()\n private stepFiles = new Map<string, Map<string, string[]>>()\n private fileGraph = new Map<string, Set<string>>()\n\n // \u2500\u2500 File-level import parsing \u2500\u2500\n\n /**\n * Parse import/require statements from file content.\n * Supports: import x from \"y\", import { x } from \"y\", import * as x from \"y\",\n * const x = require(\"y\"), dynamic import(), re-exports.\n */\n parseImports(content: string): string[] {\n const imports: string[] = []\n const seen = new Set<string>()\n\n // ESM import + export from\n const importRegex = /(?:import\\s+(?:(?:\\{[^}]*\\}|[^;{]+?)\\s+from\\s+|)\\s*[\"'`]|export\\s+(?:\\{[^}]*\\}|\\*)\\s+from\\s+[\"'`])([^\"'`]+)[\"'`]/g\n // require() calls\n const requireRegex = /(?:require|import)\\s*\\(\\s*[\"'`]([^\"'`]+)[\"'`]\\s*\\)/g\n // dynamic import()\n const dynamicImportRegex = /import\\s*\\(\\s*[\"'`]([^\"'`]+)[\"'`]\\s*\\)/g\n\n for (const match of content.matchAll(importRegex)) {\n const raw = match[1]\n if (raw && !seen.has(raw)) { seen.add(raw); imports.push(raw) }\n }\n for (const match of content.matchAll(requireRegex)) {\n const raw = match[1]\n if (raw && !seen.has(raw)) { seen.add(raw); imports.push(raw) }\n }\n for (const match of content.matchAll(dynamicImportRegex)) {\n const raw = match[1]\n if (raw && !seen.has(raw)) { seen.add(raw); imports.push(raw) }\n }\n\n return imports\n }\n\n /**\n * Resolve a relative import specifier to possible filesystem paths.\n */\n resolveImportPath(sourceFile: string, specifier: string): string[] {\n if (!specifier.startsWith(\".\")) return [] // skip npm packages\n const sourceDir = dirname(sourceFile)\n const base = join(sourceDir, specifier).replace(/\\\\/g, \"/\")\n\n // Remove known extension if present\n const withoutExt = base.replace(/\\.(ts|tsx|js|jsx|mjs|cjs)$/, \"\")\n const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\"]\n\n const candidates: string[] = []\n // Try exact path first\n candidates.push(base)\n // Try with/extensions\n for (const ext of extensions) {\n if (!base.endsWith(ext)) candidates.push(withoutExt + ext)\n }\n // Try as index file in directory\n for (const ext of extensions) {\n candidates.push(join(withoutExt, \"index\") + ext)\n }\n\n return candidates\n }\n\n /**\n * Scan a batch of files and build the file-level dependency graph.\n * Only processes relative imports (local files), skips npm packages.\n *\n * @param files Record<absoluteFilePath, fileContent>\n * @param projectDir Project root for computing relative paths\n */\n scanFiles(files: Record<string, string>, projectDir: string): void {\n for (const [absPath, content] of Object.entries(files)) {\n const allImportSpecifiers = this.parseImports(content)\n const localSpecifiers = allImportSpecifiers.filter(s => s.startsWith(\".\"))\n\n if (localSpecifiers.length === 0) continue\n\n const sourceRel = relative(projectDir, absPath).replace(/\\\\/g, \"/\")\n const resolvedTargets: string[] = []\n\n for (const spec of localSpecifiers) {\n const candidates = this.resolveImportPath(absPath, spec)\n for (const cand of candidates) {\n if (existsSync(cand)) {\n const targetRel = relative(projectDir, cand).replace(/\\\\/g, \"/\")\n resolvedTargets.push(targetRel)\n break // first existing resolution wins\n }\n }\n }\n\n if (resolvedTargets.length > 0) {\n const existing = this.fileGraph.get(sourceRel) ?? new Set()\n for (const t of resolvedTargets) {\n existing.add(t)\n this.addDependency(sourceRel, t, \"imports\")\n }\n this.fileGraph.set(sourceRel, existing)\n }\n }\n }\n\n /**\n * Get files that directly import the given file (via file-level graph).\n */\n getFileDependents(filePath: string): string[] {\n const normalized = filePath.replace(/\\\\/g, \"/\")\n const result: string[] = []\n for (const [source, targets] of this.fileGraph) {\n for (const t of targets) {\n if (t === normalized || t.endsWith(\"/\" + normalized) || normalized.endsWith(\"/\" + t)) {\n result.push(source)\n break\n }\n }\n }\n return [...new Set(result)]\n }\n\n /**\n * Incrementally update the file graph for a single file (e.g., after creation/modification).\n * Re-parses imports and replaces the entry in the graph.\n */\n updateFile(absPath: string, content: string, projectDir: string): void {\n const relPath = relative(projectDir, absPath).replace(/\\\\/g, \"/\")\n // Remove old entries for this file\n this.fileGraph.delete(relPath)\n this.dependencies.delete(relPath)\n // Remove old edges where this file was the target\n for (const [src, targets] of this.fileGraph) {\n if (targets.has(relPath)) {\n targets.delete(relPath)\n }\n }\n // Re-scan\n this.scanFiles({ [absPath]: content }, projectDir)\n }\n\n /**\n * Get files that a given file directly imports (via file-level graph).\n */\n getFileImports(filePath: string): string[] {\n const normalized = filePath.replace(/\\\\/g, \"/\")\n return [...(this.fileGraph.get(normalized) ?? [])]\n }\n\n /**\n * Traverse transitive dependents (A imports B imports C \u2192 change C impacts A).\n */\n private getTransitiveDependents(file: string, visited?: Set<string>): string[] {\n const visitedSet = visited ?? new Set<string>()\n if (visitedSet.has(file)) return []\n visitedSet.add(file)\n const direct = this.getFileDependents(file)\n const all = [...direct]\n for (const d of direct) {\n all.push(...this.getTransitiveDependents(d, visitedSet))\n }\n return all\n }\n\n recordChange(sessionId: string, stepId: string, files: string[]): void {\n const changes = this.fileChanges.get(sessionId) ?? []\n for (const file of files) {\n changes.push({\n file,\n stepId,\n changeType: \"modify\",\n timestamp: Date.now(),\n })\n }\n this.fileChanges.set(sessionId, changes)\n\n const sessionFiles = this.stepFiles.get(sessionId) ?? new Map()\n const existing = sessionFiles.get(stepId) ?? []\n sessionFiles.set(stepId, [...new Set([...existing, ...files])])\n this.stepFiles.set(sessionId, sessionFiles)\n }\n\n addDependency(from: string, to: string, relation: DependencyEdge[\"relation\"]): void {\n const edges = this.dependencies.get(from) ?? []\n const exists = edges.some(e => e.to === to && e.relation === relation)\n if (!exists) {\n edges.push({ from, to, relation })\n this.dependencies.set(from, edges)\n }\n }\n\n getDependencies(module: string): DependencyEdge[] {\n return this.dependencies.get(module) ?? []\n }\n\n getDependents(module: string): DependencyEdge[] {\n const dependents: DependencyEdge[] = []\n for (const edges of this.dependencies.values()) {\n for (const edge of edges) {\n if (edge.to === module) dependents.push(edge)\n }\n }\n return dependents\n }\n\n analyzeImpact(sessionId: string, changedFiles: string[]): ImpactAnalysis[] {\n const results: ImpactAnalysis[] = []\n for (const file of changedFiles) {\n // Combine step-level + file-level dependents\n const stepDeps = this.getDependents(file).map(e => e.from)\n const fileDeps = this.getFileDependents(file)\n const transitiveDeps = this.getTransitiveDependents(file)\n const combinedFiles = [...new Set([...stepDeps, ...fileDeps, ...transitiveDeps])]\n\n // Map back to steps\n const sessionFiles = this.stepFiles.get(sessionId)\n const impactedSteps: string[] = []\n if (sessionFiles) {\n for (const [stepId, files] of sessionFiles) {\n const overlap = files.some(f => combinedFiles.includes(f) || f === file)\n if (overlap) impactedSteps.push(stepId)\n }\n }\n\n results.push({\n file,\n impactedFiles: combinedFiles,\n impactedSteps: [...new Set(impactedSteps)],\n risk: combinedFiles.length > 5 ? \"high\" : combinedFiles.length > 2 ? \"medium\" : \"low\",\n })\n }\n return results\n }\n\n getFilesChangedByStep(sessionId: string, stepId: string): string[] {\n const changes = this.fileChanges.get(sessionId) ?? []\n return [...new Set(changes.filter(c => c.stepId === stepId).map(c => c.file))]\n }\n\n getFilesChangedByPreviousSteps(sessionId: string, currentStepId: string, planSteps: string[]): string[] {\n const currentIdx = planSteps.indexOf(currentStepId)\n if (currentIdx <= 0) return []\n\n const changes = this.fileChanges.get(sessionId) ?? []\n const files = new Set<string>()\n for (const c of changes) {\n const stepIdx = planSteps.indexOf(c.stepId)\n if (stepIdx >= 0 && stepIdx < currentIdx) {\n files.add(c.file)\n }\n }\n return [...files]\n }\n\n analyzeErrorPropagation(sessionId: string, failingStepId: string, error: string, planSteps: string[]): PropagationAnalysis {\n const previousFiles = this.getFilesChangedByPreviousSteps(sessionId, failingStepId, planSteps)\n\n const currentStepFiles = this.getFilesChangedByStep(sessionId, failingStepId)\n const allPreviousFiles = new Set<string>()\n\n for (const stepId of planSteps) {\n if (stepId === failingStepId) break\n const stepFiles = this.getFilesChangedByStep(sessionId, stepId)\n for (const f of stepFiles) allPreviousFiles.add(f)\n }\n\n const matchesInError: string[] = []\n for (const file of allPreviousFiles) {\n if (error.toLowerCase().includes(file.toLowerCase())) {\n matchesInError.push(file)\n }\n }\n\n let likelyCulprit: string | null = null\n let confidence = 0\n\n if (matchesInError.length > 0) {\n likelyCulprit = matchesInError[matchesInError.length - 1]\n confidence = matchesInError.length >= 2 ? 0.8 : 0.5\n } else if (previousFiles.length > 0) {\n const latestStepBefore = planSteps.slice(0, planSteps.indexOf(failingStepId)).reverse()\n for (const stepId of latestStepBefore) {\n const stepFiles = this.getFilesChangedByStep(sessionId, stepId)\n if (stepFiles.length > 0) {\n likelyCulprit = stepFiles[stepFiles.length - 1]\n confidence = 0.3\n break\n }\n }\n }\n\n if (currentStepFiles.length > 0 && !likelyCulprit) {\n likelyCulprit = currentStepFiles[0]\n confidence = 0.2\n }\n\n const affectedSteps: string[] = []\n const changes = this.fileChanges.get(sessionId) ?? []\n const conflictFiles = new Set(changes.map(c => c.file))\n if (previousFiles.some(f => conflictFiles.has(f))) {\n for (const c of changes) {\n if (c.stepId !== failingStepId) affectedSteps.push(c.stepId)\n }\n }\n\n const propagationPath: string[] = []\n for (const stepId of planSteps) {\n if (stepId === failingStepId) break\n const changedFiles = this.getFilesChangedByStep(sessionId, stepId)\n const hasOverlap = changedFiles.some(f =>\n error.toLowerCase().includes(f.toLowerCase())\n )\n if (hasOverlap || changedFiles.length > 0) {\n propagationPath.push(stepId)\n }\n }\n\n let suggestion = \"\"\n if (likelyCulprit) {\n // Check both file-level and step-level impact\n const fileImpact = this.analyzeImpact(sessionId, [likelyCulprit])\n const stepImpact = this.getDependents(likelyCulprit)\n const ri = fileImpact[0]\n const combinedImpact = [...new Set([\n ...(ri?.impactedSteps ?? []),\n ...stepImpact.map(e => e.from),\n ])]\n\n // Include file-level dependents in suggestion\n const fileLevelDeps = this.getFileDependents(likelyCulprit)\n suggestion = `Error likely originates from changes to ${likelyCulprit} (confidence: ${(confidence * 100).toFixed(0)}%).`\n if (combinedImpact.length > 0) {\n suggestion += ` Step impacts: ${combinedImpact.join(\", \")}.`\n }\n if (fileLevelDeps.length > 0) {\n suggestion += ` File-level dependents: ${fileLevelDeps.join(\", \")}.`\n }\n suggestion += ` Review this file first, then check propagation.`\n } else if (propagationPath.length > 0) {\n suggestion = `Error may have propagated from earlier steps: ${propagationPath.join(\", \")}. Check those changes for side effects.`\n } else {\n suggestion = \"Unable to trace error source with confidence. Review the most recent changes manually and consider adding dependency tracking.\"\n }\n\n return { likelyCulprit, affectedSteps: [...new Set(affectedSteps)], propagationPath, suggestion, rootCauseConfidence: confidence }\n }\n\n clear(sessionId?: string): void {\n if (sessionId) {\n this.fileChanges.delete(sessionId)\n this.stepFiles.delete(sessionId)\n } else {\n this.fileChanges.clear()\n this.dependencies.clear()\n this.stepFiles.clear()\n this.fileGraph.clear()\n }\n }\n}\n", "import type { LLMEngine } from \"../core/llm.js\"\n\nexport interface ContextSummary {\n planSummary: string\n decisions: string[]\n fileChanges: string[]\n invariants: string[]\n openItems: string[]\n estimatedTokens: number\n}\n\nexport class ContextCompressor {\n private windowSize = 5\n private summaryInterval = 5\n private llm: LLMEngine | null = null\n\n setLLM(llm: LLMEngine): void {\n this.llm = llm\n }\n\n compress(planSummary: string, turns: Array<{ role: string; content: string }>, decisions: string[], fileChanges: string[]): ContextSummary {\n const relevantTurns = turns.slice(-this.windowSize * 3)\n\n const extracted = this.extractKeyInfo(relevantTurns)\n\n const allDecisions = [...new Set([...decisions, ...extracted.decisions])]\n const allFileChanges = [...new Set([...fileChanges, ...extracted.fileChanges])]\n const allInvariants = extracted.invariants\n const allOpenItems = extracted.openItems\n\n const summary: ContextSummary = {\n planSummary: `Goal: ${planSummary.slice(0, 200)}`,\n decisions: allDecisions.slice(-10),\n fileChanges: allFileChanges.slice(-15),\n invariants: allInvariants,\n openItems: allOpenItems,\n estimatedTokens: this.estimateTokens(planSummary, allDecisions, allFileChanges),\n }\n\n return summary\n }\n\n async compressWithLLM(planGoal: string, turns: Array<{ role: string; content: string }>, decisions: string[], fileChanges: string[]): Promise<ContextSummary> {\n if (!this.llm) return this.compress(planGoal, turns, decisions, fileChanges)\n\n try {\n const turnTexts = turns.map(t => `[${t.role}]: ${t.content}`)\n const llmSummary = await this.llm.summarizeContext(planGoal, turnTexts)\n\n const extracted = this.extractKeyInfo(turns)\n\n return {\n planSummary: `Goal: ${planGoal.slice(0, 200)}\\n\\nLLM Summary: ${llmSummary.slice(0, 500)}`,\n decisions: [...new Set([...decisions, ...extracted.decisions])].slice(-10),\n fileChanges: [...new Set([...fileChanges, ...extracted.fileChanges])].slice(-15),\n invariants: extracted.invariants,\n openItems: extracted.openItems,\n estimatedTokens: Math.ceil(llmSummary.length / 4),\n }\n } catch {\n return this.compress(planGoal, turns, decisions, fileChanges)\n }\n }\n\n shouldCompress(turnCount: number, currentTokensEstimate: number, maxTokens = 100_000): boolean {\n return turnCount > this.summaryInterval * 3 || currentTokensEstimate > maxTokens * 0.7\n }\n\n compressToPrompt(summary: ContextSummary): string {\n const parts: string[] = [\n \"## Compressed Context\",\n \"\",\n `**Plan:** ${summary.planSummary}`,\n ]\n\n if (summary.decisions.length > 0) {\n parts.push(\"\", \"### Key Decisions\", ...summary.decisions.map((d, i) => `${i + 1}. ${d}`))\n }\n\n if (summary.fileChanges.length > 0) {\n parts.push(\"\", \"### Files Modified\", ...summary.fileChanges.map(f => `- \\`${f}\\``))\n }\n\n if (summary.invariants.length > 0) {\n parts.push(\"\", \"### Invariants (MUST be preserved)\", ...summary.invariants.map(i => `- ${i}`))\n }\n\n if (summary.openItems.length > 0) {\n parts.push(\"\", \"### Open Items\", ...summary.openItems.map(i => `- ${i}`))\n }\n\n parts.push(\"\", `---`, `*Compressed context (~${summary.estimatedTokens} tokens)*`)\n\n return parts.join(\"\\n\")\n }\n\n private extractKeyInfo(turns: Array<{ role: string; content: string }>): {\n decisions: string[]\n fileChanges: string[]\n invariants: string[]\n openItems: string[]\n } {\n const decisions: string[] = []\n const fileChanges: string[] = []\n const invariants: string[] = []\n const openItems: string[] = []\n\n for (const turn of turns) {\n const content = turn.content ?? \"\"\n\n const decisionMatches = content.match(/(?:decided|chose|opted|will use|using|selected|picked) (.+?)(?:\\.|$)/gi)\n if (decisionMatches) {\n decisions.push(...decisionMatches.map(d => d.trim()).slice(0, 3))\n }\n\n const fileMatches = content.match(/(?:src|lib|test|app|pkg|cmd)\\/[\\w/.\\-]+/gi)\n if (fileMatches) {\n fileChanges.push(...fileMatches)\n }\n\n if (content.includes(\"must not\") || content.includes(\"should never\") || content.includes(\"invariant\") || content.includes(\"must preserve\")) {\n const lines = content.split(\"\\n\").filter(l =>\n l.includes(\"must not\") || l.includes(\"should never\") || l.includes(\"invariant\") || l.includes(\"must preserve\")\n )\n invariants.push(...lines.map(l => l.trim()).slice(0, 3))\n }\n\n if (content.includes(\"TODO\") || content.includes(\"FIXME\") || content.includes(\"remaining\") || content.includes(\"still need\") || content.includes(\"pending\")) {\n openItems.push(content.slice(0, 120))\n }\n }\n\n return { decisions, fileChanges, invariants, openItems }\n }\n\n private estimateTokens(planSummary: string, decisions: string[], fileChanges: string[]): number {\n const text = [planSummary, ...decisions, ...fileChanges].join(\" \")\n return Math.ceil(text.length / 4)\n }\n}\n", "import { execFileSync } from \"node:child_process\"\n\nexport interface CommitInfo {\n hash: string\n message: string\n files: string[]\n timestamp: string\n}\n\nexport interface PRDescription {\n title: string\n summary: string\n changes: string[]\n testPlan: string\n breakingChanges: boolean\n}\n\nexport interface PRCreationResult {\n url: string\n number: number\n title: string\n branch: string\n}\n\nexport class GitIntegration {\n private cwd: string\n\n constructor(cwd: string) {\n this.cwd = cwd\n }\n\n isAvailable(): boolean {\n try {\n execFileSync(\"git\", [\"rev-parse\", \"--git-dir\"], { cwd: this.cwd, stdio: \"ignore\" })\n return true\n } catch {\n return false\n }\n }\n\n stage(files: string[]): boolean {\n if (!this.isAvailable()) return false\n try {\n execFileSync(\"git\", [\"add\", ...files], { cwd: this.cwd, stdio: \"ignore\" })\n return true\n } catch {\n return false\n }\n }\n\n commit(message: string, files: string[]): CommitInfo | null {\n if (!this.isAvailable()) return null\n try {\n if (files.length > 0) {\n execFileSync(\"git\", [\"add\", ...files], { cwd: this.cwd, stdio: \"ignore\" })\n }\n execFileSync(\"git\", [\"commit\", \"-m\", message], { cwd: this.cwd, stdio: \"ignore\" })\n const hash = execFileSync(\"git\", [\"rev-parse\", \"HEAD\"], { cwd: this.cwd, encoding: \"utf-8\" }).trim()\n const timestamp = execFileSync(\"git\", [\"log\", \"-1\", \"--format=%aI\"], { cwd: this.cwd, encoding: \"utf-8\" }).trim()\n return { hash, message, files, timestamp }\n } catch {\n return null\n }\n }\n\n getHistory(count = 10): CommitInfo[] {\n if (!this.isAvailable()) return []\n try {\n const output = execFileSync(\n \"git\",\n [\"log\", `-${count}`, \"--format=%H|||%s|||%aI\", \"--name-only\"],\n { cwd: this.cwd, encoding: \"utf-8\" }\n )\n const commits: CommitInfo[] = []\n let current: CommitInfo | null = null\n\n for (const line of output.split(\"\\n\")) {\n if (line.includes(\"|||\")) {\n if (current) commits.push(current)\n const [hash, message, timestamp] = line.split(\"|||\")\n current = { hash, message, timestamp, files: [] }\n } else if (line && current) {\n current.files.push(line.trim())\n }\n }\n if (current) commits.push(current)\n return commits\n } catch {\n return []\n }\n }\n\n getCurrentBranch(): string {\n try {\n return execFileSync(\"git\", [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"], {\n cwd: this.cwd, encoding: \"utf-8\",\n }).trim()\n } catch {\n return \"main\"\n }\n }\n\n push(branch?: string): boolean {\n if (!this.isAvailable()) return false\n try {\n const args = [\"push\"]\n if (branch) args.push(\"origin\", branch)\n execFileSync(\"git\", args, { cwd: this.cwd, stdio: \"ignore\" })\n return true\n } catch {\n return false\n }\n }\n\n createBranch(name: string): boolean {\n if (!this.isAvailable()) return false\n try {\n execFileSync(\"git\", [\"checkout\", \"-b\", name], { cwd: this.cwd, stdio: \"ignore\" })\n return true\n } catch {\n return false\n }\n }\n\n createPR(title: string, body: string, base = \"main\"): PRCreationResult | null {\n if (!this.isAvailable()) return null\n try {\n const branch = this.getCurrentBranch()\n this.push(branch)\n\n const output = execFileSync(\"gh\", [\n \"pr\", \"create\",\n \"--title\", title,\n \"--body\", body,\n \"--base\", base,\n \"--head\", branch,\n ], { cwd: this.cwd, encoding: \"utf-8\" }).trim()\n\n const urlMatch = output.match(/https:\\/\\/github\\.com\\/[^/]+\\/[^/]+\\/pull\\/(\\d+)/)\n if (urlMatch) {\n return {\n url: urlMatch[0],\n number: parseInt(urlMatch[1], 10),\n title,\n branch,\n }\n }\n\n return { url: output, number: 0, title, branch }\n } catch {\n return null\n }\n }\n\n getDiff(base = \"main\"): string {\n if (!this.isAvailable()) return \"\"\n try {\n return execFileSync(\"git\", [\"diff\", base], { cwd: this.cwd, encoding: \"utf-8\" })\n } catch {\n return \"\"\n }\n }\n\n generatePRDescription(\n goal: string,\n steps: Array<{ id: string; description: string; success: boolean }>,\n filesChanged: string[],\n ): PRDescription {\n const completedSteps = steps.filter(s => s.success)\n const failedSteps = steps.filter(s => !s.success)\n const allSuccess = failedSteps.length === 0\n\n const title = goal.length > 72 ? goal.slice(0, 69) + \"...\" : goal\n\n const summary = allSuccess\n ? `Implements: ${goal}\\n\\nCompleted ${completedSteps.length} steps across ${filesChanged.length} files.`\n : `Partially implements: ${goal}\\n\\nCompleted ${completedSteps.length}/${steps.length} steps. ${failedSteps.length} steps need follow-up.`\n\n const changes = completedSteps.map(s => `- ${s.description}`)\n\n const testPlan = [\n `- [ ] Verify all changes compile without errors`,\n `- [ ] Run full test suite`,\n `- [ ] Manual review of ${filesChanged.slice(0, 5).join(\", \")}`,\n ].join(\"\\n\")\n\n return {\n title,\n summary,\n changes,\n testPlan,\n breakingChanges: !allSuccess,\n }\n }\n}\n", "export interface DebtScore {\n overall: \"low\" | \"medium\" | \"high\" | \"critical\"\n breakdown: DebtCategory[]\n totalIssues: number\n suggestion: string\n}\n\nexport interface DebtCategory {\n category: string\n score: number\n issues: string[]\n}\n\nexport class TechDebtScorer {\n score(planGoal: string, filesChanged: string[], fileContents: Map<string, string>): DebtScore {\n const breakdown: DebtCategory[] = []\n let totalIssues = 0\n\n // 1. Coupling analysis\n const coupling = this.analyzeCoupling(filesChanged, fileContents)\n breakdown.push(coupling)\n totalIssues += coupling.issues.length\n\n // 2. File size analysis\n const size = this.analyzeSize(filesChanged, fileContents)\n breakdown.push(size)\n totalIssues += size.issues.length\n\n // 3. Change scope analysis\n const scope = this.analyzeScope(filesChanged)\n breakdown.push(scope)\n totalIssues += scope.issues.length\n\n // 4. Pattern analysis\n const patterns = this.analyzePatterns(fileContents)\n breakdown.push(patterns)\n totalIssues += patterns.issues.length\n\n const maxScore = Math.max(...breakdown.map(b => b.score))\n let overall: DebtScore[\"overall\"] = \"low\"\n if (maxScore >= 8) overall = \"critical\"\n else if (maxScore >= 6) overall = \"high\"\n else if (maxScore >= 3) overall = \"medium\"\n\n const suggestion = this.generateSuggestion(overall, breakdown, totalIssues)\n\n return { overall, breakdown, totalIssues, suggestion }\n }\n\n private analyzeCoupling(filesChanged: string[], contents: Map<string, string>): DebtCategory {\n const issues: string[] = []\n let score = 0\n\n if (filesChanged.length > 5) {\n issues.push(`${filesChanged.length} files modified \u2014 high coupling risk`)\n score += 3\n }\n\n for (const [file, content] of contents) {\n const importCount = (content.match(/^import\\s/gm) || []).length\n if (importCount > 10) {\n issues.push(`${file} has ${importCount} imports \u2014 consider splitting`)\n score += 1\n }\n }\n\n return { category: \"coupling\", score: Math.min(score, 10), issues }\n }\n\n private analyzeSize(filesChanged: string[], contents: Map<string, string>): DebtCategory {\n const issues: string[] = []\n let score = 0\n\n for (const [file, content] of contents) {\n const lines = content.split(\"\\n\").length\n if (lines > 300) {\n issues.push(`${file} is ${lines} lines \u2014 too large, consider splitting`)\n score += 2\n } else if (lines > 150) {\n issues.push(`${file} is ${lines} lines \u2014 monitor size`)\n score += 1\n }\n }\n\n return { category: \"size\", score: Math.min(score, 10), issues }\n }\n\n private analyzeScope(filesChanged: string[]): DebtCategory {\n const issues: string[] = []\n let score = 0\n\n const dirs = new Set(filesChanged.map(f => f.split(\"/\").slice(0, -1).join(\"/\")))\n if (dirs.size > 3) {\n issues.push(`Changes span ${dirs.size} directories \u2014 broad impact`)\n score += 2\n }\n\n const hasTest = filesChanged.some(f => f.includes(\".test.\") || f.includes(\".spec.\"))\n if (!hasTest && filesChanged.length > 0) {\n issues.push(\"No test files changed \u2014 add tests for new code\")\n score += 2\n }\n\n return { category: \"scope\", score: Math.min(score, 10), issues }\n }\n\n private analyzePatterns(contents: Map<string, string>): DebtCategory {\n const issues: string[] = []\n let score = 0\n\n for (const [file, content] of contents) {\n if (content.includes(\"any\")) {\n issues.push(`${file} uses 'any' type \u2014 replace with specific types`)\n score += 2\n }\n if ((content.match(/\\/\\/\\s*TODO/g) || []).length > 2) {\n issues.push(`${file} has multiple TODOs \u2014 address before merging`)\n score += 1\n }\n if (content.includes(\"as unknown as\")) {\n issues.push(`${file} uses 'as unknown as' cast \u2014 type-safety bypass`)\n score += 1\n }\n }\n\n return { category: \"patterns\", score: Math.min(score, 10), issues }\n }\n\n private generateSuggestion(overall: string, breakdown: DebtCategory[], total: number): string {\n if (overall === \"low\") return \"Minimal debt. Proceed confidently.\"\n if (overall === \"medium\") return `${total} issue(s) found. Address before next iteration.`\n if (overall === \"high\") return `${total} issue(s) found. Fix before merging \u2014 add to next sprint.`\n return `${total} issue(s) found. Critical debt \u2014 block merge until resolved.`\n }\n}\n", "import type { AgentRole } from \"./coordinator.js\"\n\nexport interface AgentDef {\n role: AgentRole\n name: string\n prompt: string\n tools: string[]\n model?: string\n}\n\nexport type CustomRole = string\n\nexport interface CustomAgentDef {\n role: CustomRole\n name: string\n prompt: string\n tools: string[]\n model?: string\n}\n\n/** Complexity level for model suggestion */\nexport type TaskComplexity = \"simple\" | \"moderate\" | \"complex\"\n\nexport type PromptSource = \"auto-evolve\" | \"agent-self\" | \"manual\" | \"initial\"\n\nexport interface PromptEntry {\n version: number\n prompt: string\n timestamp: string\n source: PromptSource\n description?: string\n}\n\nexport interface PromptState {\n currentVersion: number\n history: PromptEntry[]\n}\n\nexport class RoleRegistry {\n private builtIn: Map<AgentRole, AgentDef> = new Map()\n private custom: Map<CustomRole, CustomAgentDef> = new Map()\n private promptHistory: Map<string, PromptState> = new Map()\n\n private defaultModels: Record<AgentRole, string> = {\n architect: \"fast\", // analisis \u2014 cukup model cepat\n developer: \"capable\", // implementasi \u2014 model paling capable\n qa: \"fast\", // review \u2014 model cepat sudah cukup\n coordinator: \"capable\", // koordinasi \u2014 perlu reasoning baik\n pm: \"fast\", // requirement \u2014 model cepat\n }\n\n constructor(initialPrompts?: Array<{ role: string; history: PromptEntry[] }>) {\n if (initialPrompts) {\n for (const entry of initialPrompts) {\n const latest = entry.history.reduce((a, b) => a.version > b.version ? a : b)\n this.promptHistory.set(entry.role, { currentVersion: latest.version, history: entry.history })\n }\n }\n this.builtIn.set(\"architect\", {\n role: \"architect\",\n name: \"System Architect\",\n prompt: `You are a software architect. Analyze requirements and produce architecture decisions.\n\n## Output Format\nAlways structure your output as:\n\n### Architecture Decisions\n- **Decision**: <what was decided>\n- **Rationale**: <why this decision>\n- **Alternatives Considered**: <other options>\n\n### File Structure\n- \\`src/module/file.ts\\` \u2014 <purpose>\n\n### Interface Contracts\n- \\`Interface\\` / \\`Function signature\\` \u2014 <contract description>\n\n### Trade-offs\n- <trade-off description>\n\n## Few-Shot Examples\n\n**Input**: \"Add a user authentication system with JWT tokens\"\n**Output**:\n### Architecture Decisions\n- **Decision**: Use JWT with refresh tokens instead of session-based auth\n- **Rationale**: Stateless, scales horizontally without Redis session store; refresh tokens reduce exposure window\n- **Alternatives Considered**: Session-based (needs Redis), OAuth2 (overkill for first-party auth)\n\n### File Structure\n- \\`src/auth/jwt.ts\\` \u2014 JWT sign/verify helpers\n- \\`src/auth/middleware.ts\\` \u2014 Express/Koa middleware for route protection\n- \\`src/auth/refresh.ts\\` \u2014 Refresh token rotation logic\n\n### Interface Contracts\n- \\`signToken(payload: object, expiresIn: string): string\\`\n- \\`verifyToken(token: string): TokenPayload | null\\`\n- \\`authMiddleware(required?: boolean): Middleware\\`\n\n### Trade-offs\n- Refresh token rotation adds complexity but improves security\n- Pure JWT without server-side revocation means tokens live until expiry\n\n---\n\n**Input**: \"Refactor the payment module to support multiple providers\"\n**Output**:\n### Architecture Decisions\n- **Decision**: Strategy pattern with provider interface\n- **Rationale**: Each provider (Stripe, PayPal, Midtrans) implements same contract; adding new provider = new class, no existing code changes\n- **Alternatives Considered**: Switch statements (fragile), inheritance (tight coupling), feature flags (temporary)\n\n### File Structure\n- \\`src/payment/provider.ts\\` \u2014 Provider interface\n- \\`src/payment/stripe.ts\\` \u2014 Stripe implementation\n- \\`src/payment/paypal.ts\\` \u2014 PayPal implementation\n- \\`src/payment/factory.ts\\` \u2014 Provider selection logic\n\n### Interface Contracts\n- \\`interface PaymentProvider { charge(amount: number, currency: string, source: string): PaymentResult; refund(transactionId: string): RefundResult }\\`\n- \\`function createProvider(type: \"stripe\" | \"paypal\"): PaymentProvider\\`\n\n### Trade-offs\n- Strategy pattern adds indirection but makes testing easier (mock provider)\n- Factory needs config or env var to determine provider\n\n---\n\nIf this requires sub-tasks, delegate to developers via agentic_delegate. After ALL work is done, extract a reusable skill via agentic_skill with action \"extract\".\n\nBe concise. Focus on structure, not implementation details.`,\n tools: [\"read\", \"grep\", \"glob\", \"agentic_nav\", \"agentic_score\", \"agentic_delegate\", \"agentic_skill\"],\n })\n\n this.builtIn.set(\"developer\", {\n role: \"developer\",\n name: \"Feature Developer\",\n prompt: `You are a senior developer. Implement features following existing codebase patterns.\n\n## Rules\n1. Always read existing files first to understand patterns before writing new code\n2. Write unit tests for all new code\n3. Follow the project's conventions (naming, imports with .js extensions, types)\n4. Keep functions small (< 30 lines), one responsibility each\n5. Don't break existing tests \u2014 run them after changes\n6. After completing, call agentic_skill with action \"extract\" to save a reusable skill\n\n## Few-Shot Examples\n\n**Task**: \"Add a calculateTotal function that sums items with tax\"\n**Step 1**: Read existing patterns\n\\`\\`\\`\nread src/pricing/utils.ts\n\\`\\`\\`\n\n**Step 2**: Implement\n\\`\\`\\`\n// src/pricing/utils.ts\nexport interface LineItem {\n price: number\n quantity: number\n taxRate?: number // default 0.1 (10%)\n}\n\nexport function calculateTotal(items: LineItem[]): number {\n return items.reduce((sum, item) => {\n const subtotal = item.price * item.quantity\n const tax = subtotal * (item.taxRate ?? 0.1)\n return sum + subtotal + tax\n }, 0)\n}\n\\`\\`\\`\n\n**Step 3**: Write tests\n\\`\\`\\`\n// src/pricing/utils.test.ts\nimport { describe, it, expect } from \"vitest\"\nimport { calculateTotal } from \"./utils.js\"\n\ndescribe(\"calculateTotal\", () => {\n it(\"sums item prices with default tax\", () => {\n const items = [{ price: 100, quantity: 2 }]\n expect(calculateTotal(items)).toBe(220) // 200 + 20 tax\n })\n\n it(\"accepts custom tax rate\", () => {\n const items = [{ price: 100, quantity: 1, taxRate: 0 }]\n expect(calculateTotal(items)).toBe(100) // no tax\n })\n})\n\\`\\`\\`\n\n**Step 4**: Verify tests pass\n\\`\\`\\`\nnpm test\n\\`\\`\\`\n\n---\n\n**Task**: \"Fix bug: calculateTotal crashes on empty array\"\n**Step 1**: Read current code\n\\`\\`\\`\nread src/pricing/utils.ts\n\\`\\`\\`\n// Current: return items.reduce(...) \u2192 crashes on []\n\n**Step 2**: Fix with guard\n\\`\\`\\`\nexport function calculateTotal(items: LineItem[]): number {\n if (items.length === 0) return 0 // \u274C was missing this\n return items.reduce(...)\n}\n\\`\\`\\`\n\n**Step 3**: Add test for edge case\n\\`\\`\\`\nit(\"returns 0 for empty items\", () => {\n expect(calculateTotal([])).toBe(0)\n})\n\\`\\`\\`\n\n---\n\nPrioritize correctness and readability. Don't over-engineer.`,\n tools: [\"read\", \"edit\", \"write\", \"bash\", \"glob\", \"grep\", \"agentic_skill\"],\n })\n\n this.builtIn.set(\"qa\", {\n role: \"qa\",\n name: \"QA Engineer\",\n prompt: `You are a QA engineer. Review implementations for bugs, edge cases, and security issues.\n\n## Review Checklist\n- \u2705 Edge cases: empty arrays, null/undefined inputs, boundary values\n- \u2705 Error handling: are errors caught? Are error messages helpful?\n- \u2705 Security: injection risks, auth bypass, data exposure\n- \u2705 Test quality: do tests actually verify behavior? Any missing test scenarios?\n- \u2705 Regression: do existing tests still pass?\n\n## Output Format\nFor each issue, use this format:\n\\`\\`\\`\n\u274C [severity] <brief title>\n- **File**: src/file.ts:line\n- **Issue**: <description>\n- **Repro**: <steps to reproduce or input that triggers it>\n- **Fix**: <suggested fix>\n\\`\\`\\`\n\nSeverity: critical | high | medium | low\n\n## Few-Shot Examples\n\n**Code under review**:\nexport function calculateTotal(items: { price: number; quantity: number }[]) {\n return items.reduce((sum, item) => sum + item.price * item.quantity)\n}\n\n**QA Report**:\n\\`\\`\\`\n\u274C [critical] No guard against empty array\n- **File**: pricing.ts:1\n- **Issue**: reduce() throws TypeError on empty array\n- **Repro**: calculateTotal([])\n- **Fix**: Add items.length === 0 guard, or pass initial value 0 to reduce\n\n\u274C [medium] taxRate not handled\n- **File**: pricing.ts:1\n- **Issue**: Items may have tax rate but parameter is not accepted\n- **Repro**: Any item with tax expectations\n- **Fix**: Accept optional taxRate parameter per item\n\\`\\`\\`\n\n---\n\n**Code under review**:\napp.get(\"/api/users/:id\", async (req, res) => {\n const user = db.users.findById(req.params.id)\n res.json(user)\n})\n\n**QA Report**:\n\\`\\`\\`\n\u274C [critical] SQL injection risk\n- **File**: routes.ts:2\n- **Issue**: req.params.id used directly \u2014 possible injection if db layer doesn't sanitize\n- **Repro**: GET /api/users/1; DROP TABLE users --\n- **Fix**: Use parameterized queries or ORM that handles sanitization\n\n\u274C [high] Missing auth check\n- **File**: routes.ts:1-3\n- **Issue**: No authentication middleware attached\n- **Repro**: Any unauthenticated request returns user data\n- **Fix**: Add auth middleware: app.get(\"/api/users/:id\", authMiddleware, handler)\n\\`\\`\\`\n\n---\n\nBe thorough. Every edge case matters. Report ONLY real issues \u2014 don't flag style preferences.`,\n tools: [\"read\", \"glob\", \"grep\", \"bash\", \"agentic_verify\", \"agentic_skill\"],\n })\n\n this.builtIn.set(\"coordinator\", {\n role: \"coordinator\",\n name: \"Task Coordinator\",\n prompt: `You are a project coordinator. Decompose goals into tasks, delegate to the right agents, and ensure quality.\n\n## Workflow\n1. Understand the goal \u2014 use agentic_nav to scan the codebase first\n2. Decompose into ordered subtasks with clear dependencies\n3. Delegate each subtask to the correct role:\n - **architect**: structural decisions, file layout, interface design\n - **developer**: implementation, unit tests\n - **qa**: code review, test verification, security audit\n4. Track progress with agentic_status\n5. Resolve blockers by re-assigning or adjusting scope\n6. After all done, call agentic_skill action \"extract\" to save the workflow\n7. Report final status to user\n\n## Few-Shot Examples\n\n**Input**: \"Add user profile page with avatar upload\"\n**Plan**:\n1. **architect**: Design profile page structure, file layout, API contracts\n \u2192 depends on: nothing\n2. **developer**: Implement profile page UI and API endpoints\n \u2192 depends on: step 1 (architecture)\n3. **developer**: Implement avatar upload with image resizing\n \u2192 depends on: step 2 (profile API)\n4. **qa**: Review all code, test upload edge cases\n \u2192 depends on: step 2, step 3\n\n**Delegation sequence**:\n\\`\\`\\`\nagentic_delegate taskId=\"arch-profile\" role=\"architect\" description=\"Design profile page structure\" \n\u2192 wait for result\nagentic_delegate taskId=\"dev-profile\" role=\"developer\" description=\"Implement profile page\" \nagentic_delegate taskId=\"dev-avatar\" role=\"developer\" description=\"Implement avatar upload\" \n\u2192 run dev tasks in parallel (they depend on arch, not each other)\nagentic_delegate taskId=\"qa-review\" role=\"qa\" description=\"Review all profile code\"\n\\`\\`\\`\n\n---\n\n**Input**: \"Fix login failing on Safari\"\n**Plan**:\n1. **developer**: Investigate Safari-specific issue (cookie/WebKit/Storage)\n2. **developer**: Implement fix with browser detection or polyfill\n3. **qa**: Verify fix on Safari + regression on Chrome/Firefox\n\n---\n\nThink like a tech lead. Prioritize, delegate, verify.`,\n tools: [\"agentic_plan\", \"agentic_delegate\", \"agentic_status\", \"agentic_pr\", \"agentic_skill\"],\n })\n\n this.builtIn.set(\"pm\", {\n role: \"pm\",\n name: \"Product Manager\",\n prompt: `You are a product manager. Translate business goals into technical specifications.\n\n## Output Format\nFor each feature:\n### Feature: <name>\n**Business Value**: <why this matters>\n**Acceptance Criteria**:\n- [ ] <criterion 1>\n- [ ] <criterion 2>\n**Dependencies**: <what must exist first>\n**Scope Boundary**: <what is NOT included>\n\n## Few-Shot Examples\n\n**Input**: \"Users are abandoning the signup flow at step 3 \u2014 the phone verification is too slow. We need to let users skip it and verify later.\"\n\n**Output**:\n### Feature: Deferred Phone Verification\n**Business Value**: Reduce signup abandonment by allowing users to start using the app immediately\n**Acceptance Criteria**:\n- [ ] User can complete signup without phone verification\n- [ ] App shows \"Verify phone\" banner post-signup until verified\n- [ ] Verified badge shows on profile after verification\n- [ ] Unverified users can still use all core features (read-only for sensitive actions)\n**Dependencies**: Existing signup flow must be refactored to make phone step optional\n**Scope Boundary**: Not changing SMS provider; not adding email fallback\n\n---\n\n**Input**: \"Competitor just launched AI-powered code review. We need parity within 2 sprints.\"\n\n**Output**:\n### Feature: AI Code Review Assistant\n**Business Value**: Competitor parity \u2014 retain developers who expect AI review\n**Acceptance Criteria**:\n- [ ] PR diff analyzed for common bug patterns (off-by-one, null ref, injection)\n- [ ] Suggestions posted as PR comments\n- [ ] User can dismiss/snooze suggestions\n- [ ] Works with GitHub and GitLab\n**Dependencies**: LLM API integration, GitHub app permissions\n**Scope Boundary**: Not doing auto-fix yet (Phase 2); not analyzing non-code files\n\n### Prioritization\n1. P0: PR analysis + comments (core value)\n2. P1: Dismiss/snooze UX\n3. P2: GitLab support (lower user share)\n\n---\n\nFocus on the \"what\" and \"why\". Leave the \"how\" to architects and developers.`,\n tools: [\"agentic_plan\", \"agentic_nav\", \"agentic_delegate\", \"agentic_episodes\", \"read\"],\n })\n // Initialize prompt history for all built-in roles (if not already loaded from persistence)\n const builtInRoles: AgentRole[] = [\"architect\", \"developer\", \"qa\", \"coordinator\", \"pm\"]\n for (const role of builtInRoles) {\n if (!this.promptHistory.has(role)) {\n this.addHistoryEntry(role, this.builtIn.get(role)!.prompt, \"initial\", \"Built-in prompt\")\n }\n }\n }\n\n registerCustom(def: CustomAgentDef): void {\n this.custom.set(def.role, def)\n if (!this.promptHistory.has(def.role)) {\n this.addHistoryEntry(def.role, def.prompt, \"manual\", `Custom role: ${def.name}`)\n }\n }\n\n private addHistoryEntry(role: string, prompt: string, source: PromptSource, description?: string): void {\n const existing = this.promptHistory.get(role)\n const version = existing ? existing.currentVersion + 1 : 1\n const entry: PromptEntry = { version, prompt, timestamp: new Date().toISOString(), source, description }\n if (existing) {\n existing.history.push(entry)\n existing.currentVersion = version\n } else {\n this.promptHistory.set(role, { currentVersion: version, history: [entry] })\n }\n }\n\n /**\n * Update the system prompt for a built-in role with version tracking.\n * Returns true if the role was found and updated.\n */\n updatePrompt(role: AgentRole, newPrompt: string, source: PromptSource = \"manual\", description?: string): boolean {\n const existing = this.builtIn.get(role)\n if (!existing) return false\n this.builtIn.set(role, { ...existing, prompt: newPrompt })\n this.addHistoryEntry(role, newPrompt, source, description)\n return true\n }\n\n /** Get the current prompt for a role (built-in or custom) */\n getPrompt(role: string): string | undefined {\n return this.builtIn.get(role as AgentRole)?.prompt ?? this.custom.get(role)?.prompt\n }\n\n /** Get prompt version history for a role */\n getPromptHistory(role: string): PromptEntry[] {\n return this.promptHistory.get(role)?.history ?? []\n }\n\n /** Get the full prompt state for a role (current version + history) */\n getPromptState(role: string): PromptState | undefined {\n return this.promptHistory.get(role)\n }\n\n /** Get all prompt states (for persistence) */\n getAllPromptStates(): Array<{ role: string; history: PromptEntry[] }> {\n return [...this.promptHistory.entries()].map(([role, state]) => ({ role, history: state.history }))\n }\n\n /**\n * Rollback a role's prompt to a specific version.\n * Returns true if the rollback succeeded.\n */\n rollbackPrompt(role: string, version: number): boolean {\n const state = this.promptHistory.get(role)\n if (!state) return false\n const entry = state.history.find(e => e.version === version)\n if (!entry) return false\n\n const def = this.builtIn.get(role as AgentRole)\n if (def) {\n this.builtIn.set(role as AgentRole, { ...def, prompt: entry.prompt })\n }\n const custom = this.custom.get(role)\n if (custom) {\n this.custom.set(role, { ...custom, prompt: entry.prompt })\n }\n if (!def && !custom) return false\n\n this.addHistoryEntry(role, entry.prompt, \"manual\", `Rollback to version ${version}`)\n return true\n }\n\n getBuiltIn(role: AgentRole): AgentDef | undefined {\n return this.builtIn.get(role)\n }\n\n getCustom(role: CustomRole): CustomAgentDef | undefined {\n return this.custom.get(role)\n }\n\n getAllBuiltIn(): AgentDef[] {\n return [...this.builtIn.values()]\n }\n\n getAllCustom(): CustomAgentDef[] {\n return [...this.custom.values()]\n }\n\n listRoles(): string[] {\n return [\n ...this.builtIn.keys(),\n ...this.custom.keys(),\n ]\n }\n\n suggestModel(role: string, complexity: TaskComplexity = \"moderate\"): string {\n // 1. Custom role? check its model\n const custom = this.custom.get(role)\n if (custom?.model) return custom.model\n\n // 2. Built-in role? check if user set a model\n const builtIn = this.builtIn.get(role as AgentRole)\n if (builtIn?.model) return builtIn.model\n\n // 3. Auto-suggest based on role + complexity\n const base = this.defaultModels[role as AgentRole] ?? \"capable\"\n if (complexity === \"simple\" && base === \"capable\") return \"fast\"\n if (complexity === \"complex\" && base === \"fast\") return \"capable\"\n return base\n }\n\n setModel(role: AgentRole, model: string): void {\n const def = this.builtIn.get(role)\n if (def) def.model = model\n }\n}\n", "import { RoleRegistry, type AgentDef, type CustomAgentDef } from \"./role-registry.js\"\nimport type { SkillStore } from \"../memory/skill-store.js\"\n\nexport type AgentRole = \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\"\n\nexport interface AgentTask {\n id: string\n assignedTo: string\n description: string\n input: string\n status: \"pending\" | \"running\" | \"done\" | \"failed\"\n result?: string\n sharedContext?: string\n validatedBy?: string[]\n pipelineRunId?: string\n delegationDepth?: number\n}\n\nexport interface SharedMemoryEntry {\n key: string\n value: string\n writtenBy: string\n timestamp: number\n}\n\nexport interface AgentMessage {\n id: string\n from: string\n to: string\n taskId: string\n type: \"result\" | \"review_request\" | \"review_response\" | \"clarification\" | \"approval\" | \"revision\"\n payload: string\n context?: Record<string, string>\n timestamp: number\n read: boolean\n}\n\nexport type SharedMemoryListener = (entry: SharedMemoryEntry) => void\n\nexport class AgentCoordinator {\n private sharedMemory = new Map<string, SharedMemoryEntry>()\n private memoryListeners: SharedMemoryListener[] = []\n private messages = new Map<string, AgentMessage[]>()\n private registry: RoleRegistry\n private tasks = new Map<string, AgentTask[]>()\n private pipelineRuns = new Map<string, string[]>()\n private maxDepth = 3\n private skillStore?: SkillStore\n\n constructor(skillStore?: SkillStore) {\n this.registry = new RoleRegistry()\n this.skillStore = skillStore\n }\n\n /** Set max delegation depth (from config hot-reload) */\n setMaxDepth(depth: number): void {\n this.maxDepth = depth\n }\n\n /** Get current max delegation depth */\n getMaxDepth(): number {\n return this.maxDepth\n }\n\n onSharedMemoryWrite(listener: SharedMemoryListener): void {\n this.memoryListeners.push(listener)\n }\n\n writeSharedMemory(key: string, value: string, agentRole: string): SharedMemoryEntry {\n const entry: SharedMemoryEntry = { key, value, writtenBy: agentRole, timestamp: Date.now() }\n this.sharedMemory.set(key, entry)\n for (const listener of this.memoryListeners) {\n try { listener(entry) } catch { }\n }\n return entry\n }\n\n writeSharedMemoryBatch(entries: Array<{ key: string; value: string; agentRole: string }>): void {\n for (const e of entries) {\n this.writeSharedMemory(e.key, e.value, e.agentRole)\n }\n }\n\n readSharedMemory(key: string): SharedMemoryEntry | undefined {\n return this.sharedMemory.get(key)\n }\n\n searchSharedMemory(query: string): SharedMemoryEntry[] {\n const q = query.toLowerCase()\n return [...this.sharedMemory.values()].filter(e =>\n e.key.toLowerCase().includes(q) || e.value.toLowerCase().includes(q)\n )\n }\n\n getAllSharedMemory(): SharedMemoryEntry[] {\n return [...this.sharedMemory.values()]\n }\n\n getAgent(role: string): AgentDef | CustomAgentDef | undefined {\n return this.registry.getBuiltIn(role as AgentRole) ?? this.registry.getCustom(role)\n }\n\n registerCustomRole(def: CustomAgentDef): void {\n this.registry.registerCustom(def)\n }\n\n // --- Message Bus ---\n\n sendMessage(msg: Omit<AgentMessage, \"id\" | \"timestamp\" | \"read\">): AgentMessage {\n const message: AgentMessage = {\n ...msg,\n id: `msg-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n timestamp: Date.now(),\n read: false,\n }\n const inbox = this.messages.get(msg.to) ?? []\n inbox.push(message)\n this.messages.set(msg.to, inbox)\n return message\n }\n\n getMessages(agentRole: string, unreadOnly = false): AgentMessage[] {\n const inbox = this.messages.get(agentRole) ?? []\n if (unreadOnly) return inbox.filter(m => !m.read)\n return inbox\n }\n\n markRead(messageId: string): boolean {\n for (const [, inbox] of this.messages) {\n const msg = inbox.find(m => m.id === messageId)\n if (msg) { msg.read = true; return true }\n }\n return false\n }\n\n getConversation(taskId: string): AgentMessage[] {\n const all: AgentMessage[] = []\n for (const [, inbox] of this.messages) {\n all.push(...inbox.filter(m => m.taskId === taskId))\n }\n return all.sort((a, b) => a.timestamp - b.timestamp)\n }\n\n // --- Task Management ---\n\n delegate(role: string, task: AgentTask, sessionId: string, parentDepth = 0, relevantSkills?: Array<{ name: string; successRate: number; steps: string }>): AgentTask {\n task.assignedTo = role\n task.status = \"pending\"\n task.delegationDepth = parentDepth + 1\n\n if (!relevantSkills && this.skillStore) {\n const foundSkills = this.skillStore.find(task.description).slice(0, 3)\n relevantSkills = foundSkills.map((s: any) => ({\n name: s.name,\n successRate: s.successRate,\n steps: s.steps.map((step: any) => step.description).join(\" \u2192 \")\n }))\n }\n\n const entries = this.getAllSharedMemory()\n const contextParts: string[] = []\n if (entries.length > 0) {\n contextParts.push(entries\n .map(e => `[${e.key}] (by ${e.writtenBy}): ${e.value}`)\n .join(\"\\n\"))\n }\n\n if (relevantSkills && relevantSkills.length > 0) {\n const skillsBlock = relevantSkills.slice(0, 3).map(s =>\n `- **${s.name}** (${(s.successRate * 100).toFixed(0)}% success rate)\\n Steps: ${s.steps}`\n ).join(\"\\n\\n\")\n contextParts.push(`## Relevant Skills\\n${skillsBlock}\\n\\nConsider applying these proven patterns from past successful tasks.`)\n }\n\n if (contextParts.length > 0) {\n task.sharedContext = contextParts.join(\"\\n\\n\")\n }\n\n const sessionTasks = this.tasks.get(sessionId) ?? []\n sessionTasks.push(task)\n this.tasks.set(sessionId, sessionTasks)\n\n return task\n }\n\n getTasks(sessionId: string): AgentTask[] {\n return this.tasks.get(sessionId) ?? []\n }\n\n getTasksByRole(sessionId: string, role: string): AgentTask[] {\n return (this.tasks.get(sessionId) ?? []).filter(t => t.assignedTo === role)\n }\n\n updateTask(sessionId: string, taskId: string, status: AgentTask[\"status\"], result?: string): boolean {\n const tasks = this.tasks.get(sessionId)\n if (!tasks) return false\n\n const task = tasks.find(t => t.id === taskId)\n if (!task) return false\n\n task.status = status\n if (result) task.result = result\n\n if (status === \"done\" && task.assignedTo) {\n this.writeSharedMemory(`task:${taskId}:result`, result ?? \"completed\", task.assignedTo)\n }\n\n return true\n }\n\n /** Get downstream tasks that depend on a completed task via the pipeline */\n getNextInPipeline(taskId: string, sessionId: string): AgentTask | null {\n const tasks = this.tasks.get(sessionId) ?? []\n const currentIdx = tasks.findIndex(t => t.id === taskId)\n if (currentIdx < 0 || currentIdx >= tasks.length - 1) return null\n\n const current = tasks[currentIdx]\n if (current.status !== \"done\") return null\n\n for (let i = currentIdx + 1; i < tasks.length; i++) {\n const next = tasks[i]\n if (next.status === \"pending\") return next\n }\n return null\n }\n\n // --- Pipeline Run Tracking ---\n\n setPipelineRun(sessionId: string, pipelineId: string, taskIds: string[]): void {\n this.pipelineRuns.set(sessionId, taskIds)\n this.writeSharedMemory(`pipeline:${sessionId}`, pipelineId, \"coordinator\")\n }\n\n getPipelineRun(sessionId: string): string[] | undefined {\n return this.pipelineRuns.get(sessionId)\n }\n\n /**\n * Suggest the best agent role for a task description.\n * Uses LLM when available (Gap #6), falls back to keyword matching.\n */\n async getSuggestedRole(description: string, llm?: { suggestRole: (desc: string) => Promise<string | null> }): Promise<AgentRole> {\n // Try LLM first when available (paper's intelligent agent assignment)\n if (llm) {\n try {\n const llmRole = await llm.suggestRole(description)\n if (llmRole && [\"architect\", \"developer\", \"qa\", \"coordinator\", \"pm\"].includes(llmRole)) {\n return llmRole as AgentRole\n }\n } catch { /* fall through to keyword */ }\n }\n\n // Keyword fallback\n const d = description.toLowerCase()\n if (d.includes(\"architect\") || d.includes(\"design\") || d.includes(\"structure\") || d.includes(\"api contract\")) return \"architect\"\n if (d.includes(\"test\") || d.includes(\"qa\") || d.includes(\"verify\") || d.includes(\"validate\") || d.includes(\"check\")) return \"qa\"\n if (d.includes(\"coordinate\") || d.includes(\"orchestrate\") || d.includes(\"plan\") || d.includes(\"overview\")) return \"coordinator\"\n if (d.includes(\"pm\") || d.includes(\"product\") || d.includes(\"requirement\") || d.includes(\"spec\") || d.includes(\"acceptance\")) return \"pm\"\n return \"developer\"\n }\n}\n", "import { execFileSync } from \"node:child_process\"\n\n// Error logging helper for silent catch blocks\nfunction logParseError(context: string, error: unknown): void {\n if (process.env.DEBUG_LLM_PARSING) {\n console.error(`[LLM Parse Error] ${context}:`, error);\n }\n}\n\nexport interface LLMConfig {\n provider: \"openai\" | \"anthropic\" | \"local\" | \"opencode\"\n apiKey?: string\n baseURL?: string\n model?: string\n maxTokens?: number\n temperature?: number\n variant?: string\n}\n\nexport interface LLMRequest {\n systemPrompt: string\n userPrompt: string\n maxTokens?: number\n temperature?: number\n jsonMode?: boolean\n}\n\nexport interface LLMResponse {\n content: string\n usage?: { promptTokens: number; completionTokens: number }\n finishReason?: string\n}\n\nconst DEFAULT_MODELS: Record<string, string> = {\n openai: \"gpt-4o\",\n anthropic: \"claude-3-5-sonnet-20240620\",\n local: \"codellama\",\n opencode: \"opencode-default\",\n}\n\nimport type { ModelRegistry } from \"./model-registry.js\"\n\nexport class LLMEngine {\n private config: LLMConfig\n private opencodeClient: unknown = null\n private pluginSessionId: string | null = null\n private modelRegistry?: ModelRegistry\n private sessionStore?: import(\"../memory/session-store.js\").SessionStore\n private memoryStores?: {\n searchEpisodes: (query: string) => Array<{ planGoal: string; outcome: string; timestamp: string }>\n findSkills: (query: string) => Array<{ name: string; successRate: number }>\n }\n\n constructor(config: Partial<LLMConfig> = {}) {\n this.config = {\n provider: config.provider ?? this.detectProvider(),\n apiKey: config.apiKey ?? process.env.OPENAI_API_KEY,\n baseURL: config.baseURL ?? process.env.OPENAI_BASE_URL,\n model: config.model ?? process.env.OPENAI_MODEL,\n maxTokens: config.maxTokens ?? 4096,\n temperature: config.temperature ?? 0.3,\n variant: config.variant ?? process.env.OPENAI_VARIANT,\n }\n }\n\n setMemoryStores(stores: {\n searchEpisodes: (query: string) => Array<{ planGoal: string; outcome: string; timestamp: string }>\n findSkills: (query: string) => Array<{ name: string; successRate: number }>\n }): void {\n this.memoryStores = stores\n }\n\n getMemoryContext(query: string): string {\n return this.buildMemoryContext(query)\n }\n\n private buildMemoryContext(query: string): string {\n if (!this.memoryStores) return \"\"\n const parts: string[] = []\n try {\n const episodes = this.memoryStores.searchEpisodes(query).slice(0, 3)\n if (episodes.length > 0) {\n parts.push(\"Relevant past sessions:\")\n parts.push(episodes.map(e => `- ${e.outcome === \"success\" ? \"\u2705\" : e.outcome === \"partial\" ? \"\u26A0\uFE0F\" : \"\u274C\"} ${e.planGoal} (${e.timestamp.slice(0, 10)})`).join(\"\\n\"))\n }\n const skills = this.memoryStores.findSkills(query).slice(0, 3)\n if (skills.length > 0) {\n parts.push(\"Relevant known skills:\")\n parts.push(skills.map(s => `- ${s.name} (${(s.successRate * 100).toFixed(0)}% success rate)`).join(\"\\n\"))\n }\n } catch (error) {\n logParseError('buildMemoryContext', error);\n }\n return parts.length > 0 ? `\\n\\n## Memory Context\\n${parts.join(\"\\n\\n\")}` : \"\"\n }\n\n setOpencodeClient(client: unknown): void {\n this.opencodeClient = client\n if (this.config.provider === \"opencode\" || !process.env.OPENAI_API_KEY) {\n this.config.provider = \"opencode\"\n }\n }\n\n setSessionId(sessionId: string): void {\n this.pluginSessionId = sessionId\n }\n\n setModelRegistry(registry: ModelRegistry): void {\n this.modelRegistry = registry\n }\n\n setSessionStore(store: import(\"../memory/session-store.js\").SessionStore): void {\n this.sessionStore = store\n }\n\n updateConfig(config: Partial<LLMConfig>): void {\n Object.assign(this.config, config)\n }\n\n getCurrentModel(): string {\n return this.config.model ?? \"unknown\"\n }\n\n async call(req: LLMRequest): Promise<LLMResponse> {\n const startTime = Date.now()\n let success = false\n let response: LLMResponse\n\n try {\n switch (this.config.provider) {\n case \"openai\":\n response = await this.callOpenAI(req)\n break\n case \"anthropic\":\n response = await this.callAnthropic(req)\n break\n case \"local\":\n response = await this.callLocal(req)\n break\n case \"opencode\":\n response = await this.callOpenCode(req)\n break\n default:\n if (this.opencodeClient) response = await this.callOpenCode(req)\n else response = await this.callOpenAI(req)\n }\n success = !response.content.startsWith(\"LLM error\") && !response.content.startsWith(\"[NO_LLM]\") && !response.content.startsWith(\"LLM call failed\")\n } catch (error) {\n logParseError('LLM call', error);\n response = { content: \"LLM call threw an exception\", finishReason: \"error\" }\n success = false\n }\n\n const latency = Date.now() - startTime\n \n const taskType = this.sessionStore && this.pluginSessionId\n ? this.sessionStore.getOrCreate(this.pluginSessionId).currentTaskType\n : undefined\n this.modelRegistry?.recordCall(this.getCurrentModel(), success, latency, taskType)\n\n return response\n }\n\n async decomposeTask(goal: string, context: string): Promise<string[]> {\n try {\n const resp = await this.call({\n systemPrompt: \"You are a software task decomposer. Break down the given goal into sequential subtasks. Each subtask should be a single, concrete action. Return as JSON array of strings.\" + this.buildMemoryContext(goal),\n userPrompt: `Goal: ${goal}\\n\\nContext:\\n${context}\\n\\nBreak this down into 3-7 sequential subtasks. Return JSON array of strings.`,\n jsonMode: false,\n temperature: 0.2,\n })\n\n const cleaned = resp.content.trim()\n try {\n const parsed = JSON.parse(cleaned)\n if (Array.isArray(parsed)) return parsed\n if (parsed.subtasks && Array.isArray(parsed.subtasks)) return parsed.subtasks\n if (parsed.steps && Array.isArray(parsed.steps)) return parsed.steps\n } catch (error) {\n logParseError('decomposeTask JSON parse', error);\n }\n\n const codeBlock = cleaned.match(/```(?:json)?\\s*\\n?(\\[[\\s\\S]*?\\])\\s*\\n?```/)\n if (codeBlock) {\n try { const arr = JSON.parse(codeBlock[1]); if (Array.isArray(arr)) return arr } catch (error) { logParseError('decomposeTask codeBlock', error); }\n }\n\n const arrMatch = cleaned.match(/\\[[\\s\\S]*?\\]/)\n if (arrMatch) {\n try { const arr = JSON.parse(arrMatch[0]); if (Array.isArray(arr)) return arr } catch (error) { logParseError('decomposeTask arrMatch', error); }\n }\n } catch (error) {\n logParseError('decomposeTask', error);\n }\n\n return []\n }\n\n async summarizeContext(planGoal: string, turns: string[]): Promise<string> {\n const resp = await this.call({\n systemPrompt: \"You are a context compressor. Summarize the following conversation into a compact form that preserves: key decisions made, files changed, invariants that must be preserved, and remaining tasks. Be concise.\" + this.buildMemoryContext(planGoal),\n userPrompt: `Goal: ${planGoal}\\n\\nConversation:\\n${turns.join(\"\\n\")}\\n\\nProvide a compact summary.`,\n maxTokens: 1024,\n temperature: 0.1,\n })\n return resp.content\n }\n\n async analyzeError(errorText: string, modifiedFiles: string[]): Promise<{\n category: string\n rootCause: string\n fix: string\n }> {\n try {\n const resp = await this.call({\n systemPrompt: \"You are an error analyst. Given an error message and list of recently modified files, determine: the error category (compile/type/test/import/runtime), the likely root cause, and a specific fix suggestion. Return as JSON with keys: category, rootCause, fix.\" + this.buildMemoryContext(errorText),\n userPrompt: `Error:\\n${errorText}\\n\\nRecently modified files:\\n${modifiedFiles.join(\"\\n\")}\\n\\nAnalyze and return JSON.`,\n jsonMode: false,\n temperature: 0.2,\n })\n\n const cleaned = resp.content.trim()\n try {\n const parsed = JSON.parse(cleaned)\n if (parsed.category || parsed.rootCause) return parsed\n } catch (error) {\n logParseError('analyzeError JSON parse', error);\n }\n\n const codeBlock = cleaned.match(/```(?:json)?\\s*\\n?(\\{[\\s\\S]*?\\})\\s*\\n?```/)\n if (codeBlock) {\n try {\n const parsed = JSON.parse(codeBlock[1])\n if (parsed.category) return parsed\n } catch (error) {\n logParseError('analyzeError codeBlock', error);\n }\n }\n\n const jsonMatch = cleaned.match(/\\{[\\s\\S]*?\"category\"[\\s\\S]*?\"rootCause\"[\\s\\S]*?\"fix\"[\\s\\S]*?\\}/)\n if (jsonMatch) {\n try {\n const parsed = JSON.parse(jsonMatch[0])\n if (parsed.category) return parsed\n } catch (error) {\n logParseError('analyzeError jsonMatch', error);\n }\n }\n } catch (error) {\n logParseError('analyzeError', error);\n }\n\n return { category: \"unknown\", rootCause: \"Unable to analyze\", fix: \"Manual investigation needed\" }\n }\n\n private extractJSON<T>(content: string, requiredKey?: string): T | null {\n const cleaned = content.trim()\n try {\n const parsed = JSON.parse(cleaned)\n if (!requiredKey || (parsed && typeof parsed === \"object\" && requiredKey in parsed)) return parsed as T\n } catch (error) {\n logParseError('extractJSON direct parse', error);\n }\n const codeBlock = cleaned.match(/```(?:json)?\\s*\\n?(\\{[\\s\\S]*?\\})\\s*\\n?```/)\n if (codeBlock) {\n try {\n const parsed = JSON.parse(codeBlock[1])\n if (!requiredKey || (parsed && typeof parsed === \"object\" && requiredKey in parsed)) return parsed as T\n } catch (error) {\n logParseError('extractJSON codeBlock', error);\n }\n }\n if (requiredKey) {\n const loose = cleaned.match(new RegExp(`\\\\{[\\s\\S]*?\"${requiredKey}\"[\\\\s\\\\S]*?\\\\}`))\n if (loose) {\n try {\n const parsed = JSON.parse(loose[0])\n if (requiredKey in parsed) return parsed as T\n } catch (error) {\n logParseError('extractJSON loose match', error);\n }\n }\n const arrMatch = cleaned.match(/\\[[\\s\\S]*?\\]/)\n if (requiredKey === \"steps\" && arrMatch) {\n try {\n const arr = JSON.parse(arrMatch[0])\n if (Array.isArray(arr)) return { steps: arr, complexity: \"medium\" } as unknown as T\n } catch (error) {\n logParseError('extractJSON arrMatch', error);\n }\n }\n }\n return null\n }\n\n async generatePlan(goal: string, constraints: string[], codebaseSummary: string): Promise<{\n steps: Array<{ id: string; description: string; dependsOn: string[] }>\n complexity: string\n }> {\n try {\n const resp = await this.call({\n systemPrompt: `You are a software planning assistant. Generate a plan as JSON with \"steps\" (array of {id, description, dependsOn}) and \"complexity\" (\"low\"/\"medium\"/\"high\"). Steps IDs like \"step-1\", \"step-2\".` + this.buildMemoryContext(goal),\n userPrompt: `Goal: ${goal}\\nCodebase: ${codebaseSummary}\\n\\nGenerate plan JSON.`,\n jsonMode: false,\n temperature: 0.3,\n })\n const parsed = this.extractJSON<{ steps: Array<{ id: string; description: string; dependsOn: string[] }>; complexity: string }>(resp.content, \"steps\")\n if (parsed && Array.isArray(parsed.steps) && parsed.steps.length > 0) return parsed\n } catch (error) {\n logParseError('generatePlan', error);\n }\n return { steps: [], complexity: \"low\" }\n }\n\n async reviewCode(goal: string, files: Record<string, string>): Promise<string[]> {\n const filesStr = Object.entries(files).map(([path, content]) => `### ${path}\\n\\`\\`\\`\\n${content.slice(0, 2000)}\\n\\`\\`\\``).join(\"\\n\\n\")\n const resp = await this.call({\n systemPrompt: \"You are a code reviewer. Review the given files for potential issues: type safety, edge cases, error handling, performance, security, and maintainability. Return a JSON array of issue descriptions (strings). If no issues found, return empty array.\" + this.buildMemoryContext(goal),\n userPrompt: `Goal: ${goal}\\n\\nFiles:\\n${filesStr}\\n\\nList issues found as JSON array.`,\n jsonMode: true,\n temperature: 0.2,\n })\n try {\n return JSON.parse(resp.content)\n } catch (error) {\n logParseError('reviewCode JSON parse', error);\n return []\n }\n }\n\n async suggestRole(description: string): Promise<string | null> {\n try {\n const resp = await this.call({\n systemPrompt: \"You are an agent role classifier. Given a task description, determine the best agent role for it. Available roles: architect (design/structure/API), developer (implementation/coding/fix), qa (testing/verification/review), coordinator (planning/orchestration/coordination), pm (requirements/specs/acceptance). Return ONLY the role name in lowercase: architect, developer, qa, coordinator, or pm. No explanation, no punctuation.\" + this.buildMemoryContext(description),\n userPrompt: description,\n temperature: 0.1,\n maxTokens: 20,\n })\n const role = resp.content.trim().toLowerCase()\n if ([\"architect\", \"developer\", \"qa\", \"coordinator\", \"pm\"].includes(role)) {\n return role as \"architect\" | \"developer\" | \"qa\" | \"coordinator\" | \"pm\"\n }\n } catch (error) {\n logParseError('suggestAgentRole', error);\n }\n return null\n }\n\n async suggestSkillSteps(taskDescription: string, successOutput: string): Promise<{\n steps: Array<{ action: string; description: string; tool?: string; expectedOutput: string; rollback?: string }>\n }> {\n const resp = await this.call({\n systemPrompt: \"You are a skill extractor. Given a task description and its successful output, extract reusable procedural steps. Each step should have: action, description, tool (optional), expectedOutput, and rollback (optional). Return as JSON with \\\"steps\\\" array.\" + this.buildMemoryContext(taskDescription),\n userPrompt: `Task: ${taskDescription}\\n\\nSuccessful output:\\n${successOutput}\\n\\nExtract reusable steps as JSON.`,\n jsonMode: true,\n temperature: 0.3,\n })\n try {\n return JSON.parse(resp.content)\n } catch (error) {\n logParseError('suggestSkillSteps JSON parse', error);\n return { steps: [{ action: \"execute\", description: taskDescription, expectedOutput: \"completed\" }] }\n }\n }\n\n private detectProvider(): LLMConfig[\"provider\"] {\n if (process.env.OPENAI_API_KEY || process.env.OPENAI_BASE_URL) return \"openai\"\n if (process.env.ANTHROPIC_API_KEY) return \"anthropic\"\n return \"opencode\"\n }\n\n private async callOpenAI(req: LLMRequest): Promise<LLMResponse> {\n const apiKey = this.config.apiKey ?? process.env.OPENAI_API_KEY ?? \"\"\n const baseUrl = this.config.baseURL ?? process.env.OPENAI_BASE_URL\n if (!apiKey && !baseUrl) return this.fallbackResponse(req)\n\n const body: Record<string, unknown> = {\n model: this.config.model ?? DEFAULT_MODELS.openai,\n messages: [\n { role: \"system\", content: req.systemPrompt },\n { role: \"user\", content: req.userPrompt },\n ],\n max_tokens: req.maxTokens ?? this.config.maxTokens,\n temperature: req.temperature ?? this.config.temperature,\n }\n\n if (this.config.variant) {\n body.variant = this.config.variant\n }\n\n if (req.jsonMode) {\n body.response_format = { type: \"json_object\" }\n }\n\n return this.httpCall(\n this.config.baseURL ?? \"https://api.openai.com/v1/chat/completions\",\n apiKey,\n body,\n )\n }\n\n private async callAnthropic(req: LLMRequest): Promise<LLMResponse> {\n const apiKey = this.config.apiKey ?? process.env.ANTHROPIC_API_KEY\n if (!apiKey) return this.fallbackResponse(req)\n\n const body = {\n model: this.config.model ?? DEFAULT_MODELS.anthropic,\n max_tokens: req.maxTokens ?? this.config.maxTokens,\n temperature: req.temperature ?? this.config.temperature,\n system: req.systemPrompt + (req.jsonMode ? \"\\nYou MUST return valid JSON only.\" : \"\"),\n messages: [{ role: \"user\", content: req.userPrompt }],\n }\n\n return this.httpCall(\n \"https://api.anthropic.com/v1/messages\",\n apiKey,\n body,\n { \"anthropic-version\": \"2023-06-01\" },\n )\n }\n\n private async callLocal(req: LLMRequest): Promise<LLMResponse> {\n try {\n const prompt = req.systemPrompt + \"\\n\\n\" + req.userPrompt\n const output = execFileSync(\"ollama\", [\"run\", this.config.model ?? \"codellama\", prompt], {\n encoding: \"utf-8\",\n timeout: 60000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n })\n return { content: output.trim() }\n } catch (error) {\n logParseError('callLocal ollama', error);\n return this.fallbackResponse(req)\n }\n }\n\n private async callOpenCode(req: LLMRequest): Promise<LLMResponse> {\n // Try direct HTTP call first if we have credentials for any provider\n const openaiKey = this.config.apiKey ?? process.env.OPENAI_API_KEY\n const openaiBaseUrl = this.config.baseURL ?? process.env.OPENAI_BASE_URL\n const anthropicKey = process.env.ANTHROPIC_API_KEY\n if (openaiKey || openaiBaseUrl) {\n return this.callOpenAI(req)\n }\n if (anthropicKey) {\n return this.callAnthropic(req)\n }\n\n // Fall back to OpenCode SDK client (noReply must be false to get a response)\n if (this.opencodeClient && this.pluginSessionId) {\n try {\n const client = this.opencodeClient as {\n session: {\n prompt: (opts: {\n body: { system?: string; noReply?: boolean; parts: Array<{ type: string; text: string }> }\n path: { id: string }\n }) => Promise<{ data?: { parts?: Array<{ type: string; text?: string }> }; parts?: Array<{ type: string; text?: string }> }>\n }\n }\n\n const result = await client.session.prompt({\n body: {\n system: req.jsonMode\n ? `${req.systemPrompt}\\n\\nRespond with ONLY valid JSON. No markdown, no explanation.`\n : req.systemPrompt,\n noReply: false,\n parts: [{ type: \"text\", text: req.userPrompt }],\n },\n path: { id: this.pluginSessionId },\n })\n\n const parts = result.data?.parts ?? result.parts ?? []\n const textPart = parts.find((p: { type: string; text?: string }) => p.type === \"text\")\n const text = textPart?.text ?? \"\"\n\n if (text.trim()) {\n return { content: text.trim(), finishReason: \"stop\" }\n }\n } catch (error) {\n logParseError('callOpenCode', error);\n }\n }\n\n return this.fallbackResponse(req)\n }\n\n private async httpCall(url: string, apiKey: string, body: unknown, extraHeaders: Record<string, string> = {}): Promise<LLMResponse> {\n try {\n const payload = JSON.stringify(body)\n const args = [\n \"-s\", \"-X\", \"POST\", url,\n \"-H\", \"Content-Type: application/json\",\n \"-H\", `Authorization: Bearer ${apiKey}`,\n ]\n for (const [k, v] of Object.entries(extraHeaders)) {\n args.push(\"-H\", `${k}: ${v}`)\n }\n args.push(\"-d\", payload)\n\n const output = execFileSync(\"curl\", args, {\n encoding: \"utf-8\",\n timeout: 60000,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n })\n\n const data = JSON.parse(output)\n\n if (data.error) {\n return { content: `LLM error: ${data.error.message ?? JSON.stringify(data.error)}` }\n }\n\n if (data.content) {\n return {\n content: typeof data.content === \"string\" ? data.content : data.content[0]?.text ?? JSON.stringify(data.content),\n usage: data.usage ? { promptTokens: data.usage.input_tokens ?? 0, completionTokens: data.usage.output_tokens ?? 0 } : undefined,\n finishReason: data.stop_reason,\n }\n }\n\n const choice = data.choices?.[0]\n if (choice) {\n return {\n content: choice.message?.content ?? JSON.stringify(choice),\n usage: data.usage ? { promptTokens: data.usage.prompt_tokens ?? 0, completionTokens: data.usage.completion_tokens ?? 0 } : undefined,\n finishReason: choice.finish_reason,\n }\n }\n\n return { content: JSON.stringify(data) }\n } catch (e) {\n return { content: `LLM call failed: ${(e as Error).message}` }\n }\n }\n\n private fallbackResponse(req: LLMRequest): LLMResponse {\n if (req.jsonMode) {\n return { content: `{\"_no_llm\": true}`, finishReason: \"no_llm\" }\n }\n return { content: `[NO_LLM] No LLM configured. Set OPENAI_API_KEY (OpenAI/compatible), ANTHROPIC_API_KEY (Claude), or OPENAI_BASE_URL (local LLM), or run within OpenCode for native LLM access.`, finishReason: \"no_llm\" }\n }\n}\n\nexport const llmEngine = new LLMEngine()\n", "import { LLMEngine } from \"../core/llm.js\"\nimport type { ModelRegistry } from \"../core/model-registry.js\"\nimport type { AgentRole } from \"./coordinator.js\"\nimport { RoleRegistry } from \"./role-registry.js\"\n\nexport interface AgentContext {\n systemPrompt: string\n sessionId: string\n role: AgentRole | string\n taskDescription: string\n pipelineContext?: string\n pendingMessages?: Array<{ from: string; payload: string }>\n sharedMemory?: Array<{ key: string; value: string; writtenBy: string }>\n}\n\nexport interface AgentResult {\n output: string\n success: boolean\n error?: string\n modelUsed?: string\n}\n\n/**\n * Manages isolated LLM runtimes per role + session.\n * Each role gets its own LLMEngine instance with a dedicated session ID,\n * so architect, developer, and QA operate in separate context windows.\n */\nexport class AgentRuntime {\n private engines = new Map<string, LLMEngine>()\n private opencodeClient: unknown = null\n private modelRegistry?: ModelRegistry\n private roleRegistry: RoleRegistry\n\n constructor() {\n this.roleRegistry = new RoleRegistry()\n }\n\n setOpencodeClient(client: unknown): void {\n this.opencodeClient = client\n }\n\n setModelRegistry(registry: ModelRegistry): void {\n this.modelRegistry = registry\n }\n\n getRoleRegistry(): RoleRegistry {\n return this.roleRegistry\n }\n\n /**\n * Get or create an isolated LLM engine for a specific role + session.\n * Each engine has its own sessionId = `${parentSessionId}-${role}`.\n */\n private getEngine(parentSessionId: string, role: string): LLMEngine {\n const key = `${parentSessionId}::${role}`\n if (!this.engines.has(key)) {\n const engine = new LLMEngine()\n engine.setOpencodeClient(this.opencodeClient)\n engine.setSessionId(`${parentSessionId}-${role}`)\n if (this.modelRegistry) engine.setModelRegistry(this.modelRegistry)\n this.engines.set(key, engine)\n }\n return this.engines.get(key)!\n }\n\n /**\n * Execute a task with a dedicated LLM call using the role's system prompt.\n * The engine is isolated per (session, role) pair.\n */\n async execute(ctx: AgentContext): Promise<AgentResult> {\n const engine = this.getEngine(ctx.sessionId, ctx.role)\n const roleDef = this.roleRegistry.getBuiltIn(ctx.role as AgentRole)\n ?? this.roleRegistry.getCustom(ctx.role)\n\n // Build the system prompt from the role definition + context\n const promptParts: string[] = []\n if (roleDef?.prompt) {\n promptParts.push(roleDef.prompt)\n } else {\n promptParts.push(`You are a ${ctx.role} in a software engineering team.`)\n }\n promptParts.push(`\\n\\nCurrent task: ${ctx.taskDescription}`)\n\n if (ctx.pipelineContext) {\n promptParts.push(`\\n\\n## Pipeline Context\\n${ctx.pipelineContext}`)\n }\n if (ctx.pendingMessages && ctx.pendingMessages.length > 0) {\n promptParts.push(`\\n\\n## Pending Messages\\n${ctx.pendingMessages.map(m => `From ${m.from}: ${m.payload}`).join(\"\\n\")}`)\n }\n if (ctx.sharedMemory && ctx.sharedMemory.length > 0) {\n promptParts.push(`\\n\\n## Shared Memory\\n${ctx.sharedMemory.map(m => `[${m.key}] (by ${m.writtenBy}): ${m.value.slice(0, 200)}`).join(\"\\n\")}`)\n }\n\n try {\n const resp = await engine.call({\n systemPrompt: promptParts.join(\"\\n\"),\n userPrompt: ctx.taskDescription,\n temperature: 0.3,\n maxTokens: 4096,\n })\n const output = resp.content\n if (output.startsWith(\"LLM error\") || output.startsWith(\"[NO_LLM]\")) {\n return { output, success: false, error: output }\n }\n return { output, success: true, modelUsed: engine.getCurrentModel() }\n } catch (e) {\n return { output: \"\", success: false, error: (e as Error).message }\n }\n }\n}\n", "import type { AgentRole, AgentTask, SharedMemoryEntry } from \"./coordinator.js\"\nimport type { AgentDef, CustomAgentDef } from \"./role-registry.js\"\nimport type { LLMEngine } from \"../core/llm.js\"\n\nexport interface PipelineStage {\n role: string\n description: string\n validationCriteria?: string[]\n model?: string\n}\n\nexport interface WorkflowPipeline {\n id: string\n name: string\n stages: PipelineStage[]\n createdAt: number\n}\n\nexport interface CrossValidationResult {\n stage: string\n targetStage: string\n issues: Array<{\n severity: \"error\" | \"warning\" | \"info\"\n description: string\n source: string\n }>\n passed: boolean\n summary: string\n}\n\nexport class Orchestrator {\n private pipelines = new Map<string, WorkflowPipeline>()\n private activeRuns = new Map<string, {\n pipelineId: string\n currentStageIndex: number\n stageResults: Map<string, { output: string; issues: string[]; validatedBy: string[] }>\n }>()\n private llmEngine: LLMEngine | null = null\n\n setLLMEngine(engine: LLMEngine): void {\n this.llmEngine = engine\n }\n\n definePipeline(pipeline: WorkflowPipeline): void {\n this.pipelines.set(pipeline.id, pipeline)\n }\n\n getPipeline(id: string): WorkflowPipeline | undefined {\n return this.pipelines.get(id)\n }\n\n listPipelines(): WorkflowPipeline[] {\n return [...this.pipelines.values()]\n }\n\n startRun(runId: string, pipelineId: string): boolean {\n const pipeline = this.pipelines.get(pipelineId)\n if (!pipeline) return false\n this.activeRuns.set(runId, {\n pipelineId,\n currentStageIndex: 0,\n stageResults: new Map(),\n })\n return true\n }\n\n getCurrentStage(runId: string): PipelineStage | null {\n const run = this.activeRuns.get(runId)\n if (!run) return null\n const pipeline = this.pipelines.get(run.pipelineId)\n if (!pipeline) return null\n if (run.currentStageIndex >= pipeline.stages.length) return null\n return pipeline.stages[run.currentStageIndex]\n }\n\n advanceStage(runId: string, output: string, issues: string[]): PipelineStage | null {\n const run = this.activeRuns.get(runId)\n if (!run) return null\n const pipeline = this.pipelines.get(run.pipelineId)\n if (!pipeline) return null\n\n const currentStage = pipeline.stages[run.currentStageIndex]\n if (currentStage) {\n run.stageResults.set(currentStage.role, { output, issues, validatedBy: [] })\n }\n\n run.currentStageIndex++\n if (run.currentStageIndex >= pipeline.stages.length) return null\n return pipeline.stages[run.currentStageIndex]\n }\n\n getStageResult(runId: string, role: string): { output: string; issues: string[]; validatedBy: string[] } | undefined {\n return this.activeRuns.get(runId)?.stageResults.get(role)\n }\n\n getAllStageResults(runId: string): Map<string, { output: string; issues: string[]; validatedBy: string[] }> {\n return this.activeRuns.get(runId)?.stageResults ?? new Map()\n }\n\n async crossValidate(\n targetRole: string,\n output: string,\n allStageResults: Map<string, { output: string; issues: string[]; validatedBy: string[] }>,\n sharedMemory: SharedMemoryEntry[],\n ): Promise<CrossValidationResult> {\n const issues: CrossValidationResult[\"issues\"] = []\n\n // Basic structural checks\n for (const [role, result] of allStageResults) {\n if (role === targetRole) continue\n if (!result.output || result.output.trim().length === 0) {\n issues.push({ severity: \"warning\", description: `Output from ${role} stage appears empty or incomplete`, source: role })\n }\n }\n\n // Semantic validation via LLM (if available)\n if (this.llmEngine && allStageResults.size >= 2) {\n const previousStages = [...allStageResults].filter(([r]) => r !== targetRole)\n const previousOutputs = previousStages.map(([r, res]) => `### ${r}\\n${res.output.slice(0, 1000)}`).join(\"\\n\\n\")\n\n const validationPrompt = `You are a cross-validator. Compare the outputs of different stages in a software engineering pipeline. Identify any inconsistencies, contradictions, or missing pieces between stages.\n\nPrevious stage outputs:\n${previousOutputs}\n\nCurrent stage (${targetRole}) output:\n${output.slice(0, 1500)}\n\nCheck:\n1. Does the current output contradict any previous stage?\n2. Are there requirements from earlier stages that are not addressed?\n3. Are there any gaps or missing pieces?\n\nReturn your analysis as JSON with:\n- \"passed\": boolean\n- \"issues\": array of { \"severity\": \"error\"|\"warning\"|\"info\", \"description\": string, \"source\": string }\n- \"summary\": string`\n\n try {\n const llmResp = await this.llmEngine.call({\n systemPrompt: \"You are a strict cross-validator. Compare pipeline stage outputs for consistency.\",\n userPrompt: validationPrompt,\n jsonMode: true,\n temperature: 0.1,\n maxTokens: 1024,\n })\n const parsed = JSON.parse(llmResp.content)\n if (parsed.issues && Array.isArray(parsed.issues)) {\n for (const issue of parsed.issues) {\n if (issue.severity && issue.description && !issues.some(i => i.description === issue.description)) {\n issues.push({\n severity: issue.severity as \"error\" | \"warning\" | \"info\",\n description: issue.description,\n source: issue.source ?? \"llm-validator\",\n })\n }\n }\n }\n } catch { /* LLM call failed, fall through */ }\n }\n\n const passed = issues.filter(i => i.severity === \"error\").length === 0\n const summary = passed\n ? `Cross-validation passed: ${allStageResults.size} stages reviewed, no critical issues`\n : `Cross-validation found ${issues.length} issue(s): ${issues.filter(i => i.severity === \"error\").length} error(s), ${issues.filter(i => i.severity === \"warning\").length} warning(s)`\n\n return { stage: targetRole, targetStage: targetRole, issues, passed, summary }\n }\n\n buildContextForRole(role: string, runId: string, sharedMemory: SharedMemoryEntry[]): string {\n const parts: string[] = []\n const run = this.activeRuns.get(runId)\n if (!run) return \"\"\n\n const pipeline = this.pipelines.get(run.pipelineId)\n if (pipeline) {\n parts.push(`## Pipeline: ${pipeline.name}`)\n parts.push(pipeline.stages.map((s, i) =>\n ` ${i < run.currentStageIndex ? \"\u2705\" : i === run.currentStageIndex ? \"\u25B6\" : \"\u23F3\"} **${s.role}**: ${s.description}`\n ).join(\"\\n\"))\n parts.push(\"\")\n }\n\n for (const [prevRole, result] of run.stageResults) {\n if (prevRole === role) continue\n parts.push(`### Output from ${prevRole}`)\n parts.push(result.output.slice(0, 500))\n if (result.issues.length > 0) {\n parts.push(`Issues flagged: ${result.issues.join(\", \")}`)\n }\n parts.push(\"\")\n }\n\n if (sharedMemory.length > 0) {\n parts.push(\"### Shared Memory\")\n for (const entry of sharedMemory) {\n parts.push(`[${entry.key}] (by ${entry.writtenBy}): ${entry.value.slice(0, 200)}`)\n }\n }\n\n return parts.join(\"\\n\")\n }\n\n getSuggestedPipeline(description: string): string {\n const d = description.toLowerCase()\n if (d.includes(\"feature\") || d.includes(\"new\") || d.includes(\"implement\") || d.includes(\"add\")) return \"feature-dev\"\n if (d.includes(\"fix\") || d.includes(\"bug\") || d.includes(\"repair\")) return \"fix-verify\"\n if (d.includes(\"refactor\") || d.includes(\"restructure\") || d.includes(\"extract\")) return \"refactor-review\"\n if (d.includes(\"deploy\") || d.includes(\"release\") || d.includes(\"ci\") || d.includes(\"cd\")) return \"deploy-check\"\n return \"feature-dev\"\n }\n\n getBuiltInPipelines(): WorkflowPipeline[] {\n return [\n {\n id: \"feature-dev\",\n name: \"Feature Development\",\n stages: [\n { role: \"pm\", description: \"Define requirements and acceptance criteria\" },\n { role: \"architect\", description: \"Design architecture and interface contracts\" },\n { role: \"developer\", description: \"Implement the feature following the architecture\" },\n { role: \"qa\", description: \"Review implementation for correctness, edge cases, and regressions\" },\n ],\n createdAt: Date.now(),\n },\n {\n id: \"fix-verify\",\n name: \"Bug Fix + Verify\",\n stages: [\n { role: \"qa\", description: \"Reproduce the bug and document the exact failure\" },\n { role: \"developer\", description: \"Fix the root cause\" },\n { role: \"qa\", description: \"Verify the fix and run regression tests\" },\n ],\n createdAt: Date.now(),\n },\n {\n id: \"refactor-review\",\n name: \"Refactor + Review\",\n stages: [\n { role: \"architect\", description: \"Design the new structure and migration path\" },\n { role: \"developer\", description: \"Execute the refactoring\" },\n { role: \"qa\", description: \"Verify no regressions from refactoring\" },\n ],\n createdAt: Date.now(),\n },\n {\n id: \"deploy-check\",\n name: \"Deploy Checklist\",\n stages: [\n { role: \"pm\", description: \"Confirm scope and readiness\" },\n { role: \"qa\", description: \"Run full regression suite and check for blockers\" },\n { role: \"coordinator\", description: \"Orchestrate the deploy and monitor\" },\n ],\n createdAt: Date.now(),\n },\n ]\n }\n}\n", "export interface SkillMeta {\n format: \"agentic-skill/v1\"\n id: string\n name: string\n version: number\n author: \"agent\" | \"human\"\n agentRole?: string\n}\n\nexport interface SkillDefinition {\n meta: SkillMeta\n trigger: {\n pattern: string\n keywords: string[]\n context: string[]\n }\n workflow: {\n steps: SkillStep[]\n estimatedDuration: string\n parallelizable: boolean\n }\n quality: {\n successRate: number\n usageCount: number\n failureScenarios: string[]\n }\n audit: {\n createdAt: string\n lastUsed: string\n lastModified: string\n modifiedBy: string\n }\n}\n\nexport interface SkillStep {\n order: number\n action: string\n description: string\n tool?: string\n expectedOutput: string\n rollback?: string\n}\n\nexport function createSkillDefinition(\n name: string,\n triggerPattern: string,\n keywords: string[],\n steps: { action: string; description: string; tool?: string; expectedOutput: string; rollback?: string }[],\n triggerContext?: string[],\n): SkillDefinition {\n const now = new Date().toISOString()\n return {\n meta: {\n format: \"agentic-skill/v1\",\n id: `skill-${Date.now()}`,\n name,\n version: 1,\n author: \"agent\",\n },\n trigger: {\n pattern: triggerPattern,\n keywords: keywords.slice(0, 10),\n context: triggerContext ?? [],\n },\n workflow: {\n steps: steps.map((s, i) => ({\n order: i + 1,\n action: s.action,\n description: s.description,\n tool: s.tool,\n expectedOutput: s.expectedOutput,\n rollback: s.rollback ?? inferRollback(s.action, s.description),\n })),\n estimatedDuration: `${steps.length * 2}m`,\n parallelizable: steps.some(s => s.tool === \"agentic_parallel\"),\n },\n quality: {\n successRate: 1.0,\n usageCount: 1,\n failureScenarios: [],\n },\n audit: {\n createdAt: now,\n lastUsed: now,\n lastModified: now,\n modifiedBy: \"system\",\n },\n }\n}\n\nfunction inferRollback(action: string, description: string): string | undefined {\n const lower = action.toLowerCase() + \" \" + description.toLowerCase()\n\n if (lower.includes(\"create\") || lower.includes(\"add\") || lower.includes(\"write\")) {\n return \"Delete the created file or revert the addition\"\n }\n if (lower.includes(\"delete\") || lower.includes(\"remove\")) {\n return \"Restore from git: git checkout -- <file>\"\n }\n if (lower.includes(\"modify\") || lower.includes(\"update\") || lower.includes(\"edit\")) {\n return \"Revert changes: git checkout -- <file> or git revert <commit>\"\n }\n if (lower.includes(\"install\") || lower.includes(\"add dep\")) {\n return \"Remove dependency: npm uninstall <package>\"\n }\n if (lower.includes(\"migrate\")) {\n return \"Run down migration: <tool> migrate down\"\n }\n if (lower.includes(\"rename\") || lower.includes(\"move\")) {\n return \"Move file back to original location\"\n }\n\n return \"Undo changes via git: git stash or git checkout\"\n}\n\nexport function serializeSkill(skill: SkillDefinition): string {\n return JSON.stringify(skill, null, 2)\n}\n\nexport function deserializeSkill(json: string): SkillDefinition | null {\n try {\n const parsed = JSON.parse(json)\n if (parsed?.meta?.format?.startsWith(\"agentic-skill/\")) return parsed as SkillDefinition\n return null\n } catch {\n return null\n }\n}\n\nexport function inspectSkill(skill: SkillDefinition): string {\n let out = `## Skill: ${skill.meta.name}\\n\\n`\n out += `**Format:** ${skill.meta.format}\\n`\n out += `**Version:** ${skill.meta.version}\\n`\n out += `**Author:** ${skill.meta.author}\\n`\n out += `**Success Rate:** ${(skill.quality.successRate * 100).toFixed(0)}%\\n`\n out += `**Usage:** ${skill.quality.usageCount}\\n\\n`\n out += `### Trigger\\n- Pattern: \"${skill.trigger.pattern}\"\\n- Keywords: ${skill.trigger.keywords.join(\", \")}\\n\\n`\n out += `### Workflow\\n`\n for (const step of skill.workflow.steps) {\n out += `${step.order}. **${step.action}** \u2014 ${step.description}\\n`\n if (step.tool) out += ` Tool: \\`${step.tool}\\`\\n`\n out += ` Expected: ${step.expectedOutput}\\n`\n }\n return out\n}\n", "export const MEMORY_SCHEMA_VERSION = 1\n\nexport interface SchemaMigration {\n from: number\n to: number\n description: string\n apply: (data: unknown) => unknown\n}\n\nexport class MemorySchemaVersion {\n private migrations: SchemaMigration[] = []\n\n constructor() {\n this.registerBuiltIn()\n }\n\n private registerBuiltIn(): void {\n this.registerMigration({\n from: 0,\n to: 1,\n description: \"Initial schema: add schema_version and timestamp fields to all memory objects\",\n apply: (data: unknown) => {\n const d = data as Record<string, unknown>\n return {\n schema_version: 1,\n ...d,\n migrated_at: new Date().toISOString(),\n _migration: \"v0\u2192v1: added schema envelope\",\n }\n },\n })\n }\n\n registerMigration(migration: SchemaMigration): void {\n const exists = this.migrations.some(m => m.from === migration.from && m.to === migration.to)\n if (!exists) {\n this.migrations.push(migration)\n this.migrations.sort((a, b) => a.from - b.from)\n }\n }\n\n upgrade<T>(data: T, currentVersion: number): T {\n let result = data\n for (const m of this.migrations) {\n if (m.from === currentVersion) {\n result = m.apply(result) as T\n currentVersion = m.to\n }\n }\n return result\n }\n\n getMigrations(): SchemaMigration[] {\n return [...this.migrations]\n }\n\n static currentVersion(): number {\n return MEMORY_SCHEMA_VERSION\n }\n}\n\nexport function createMemoryEnvelope<T>(data: T, type: string): { schema_version: number; type: string; data: T; created_at: string } {\n return {\n schema_version: MEMORY_SCHEMA_VERSION,\n type,\n data,\n created_at: new Date().toISOString(),\n }\n}\n\nexport function parseMemoryEnvelope<T>(envelope: unknown): { version: number; type: string; data: T; createdAt: string } | null {\n const e = envelope as Record<string, unknown> | undefined\n if (!e || typeof e.schema_version !== \"number\" || typeof e.type !== \"string\" || !e.data) return null\n return {\n version: e.schema_version,\n type: e.type,\n data: e.data as T,\n createdAt: (typeof e.created_at === \"string\" ? e.created_at : new Date().toISOString()),\n }\n}\n", "import { type SkillDefinition, type SkillStep, type SkillMeta, createSkillDefinition, inspectSkill, serializeSkill, deserializeSkill } from \"./skill-format.js\"\nimport { createMemoryEnvelope, parseMemoryEnvelope, MEMORY_SCHEMA_VERSION } from \"./schema-version.js\"\n\nexport { type SkillDefinition, type SkillStep, type SkillMeta, inspectSkill, serializeSkill, deserializeSkill, createSkillDefinition }\n\nexport interface SkillRecord {\n definition: SkillDefinition\n usageCount: number\n successRate: number\n lastUsed: string\n}\n\nexport class SkillStore {\n private skills = new Map<string, SkillRecord>()\n\n async extract(turn: { role: string; content: string }, contextTags: string[] = []): Promise<SkillRecord | null> {\n const content = turn.content\n\n if (!this.isExtractablePattern(content)) return null\n\n const name = this.extractName(content)\n if (!name) return null\n\n const steps = this.extractSteps(content)\n if (steps.length === 0) return null\n\n const existing = [...this.skills.values()].find(s => s.definition.meta.name === name)\n if (existing) {\n existing.usageCount++\n existing.successRate = (existing.successRate * (existing.usageCount - 1) + 1) / existing.usageCount\n existing.lastUsed = new Date().toISOString()\n existing.definition.quality.usageCount = existing.usageCount\n existing.definition.quality.successRate = existing.successRate\n existing.definition.audit.lastUsed = existing.lastUsed\n existing.definition.audit.lastModified = existing.lastUsed\n existing.definition.audit.modifiedBy = \"agent\"\n return existing\n }\n\n const keywords = this.extractKeywords(content)\n const inferredTools = this.inferTools(content)\n\n const def = createSkillDefinition(\n name,\n this.extractPattern(content),\n keywords,\n steps.map((s, i) => ({\n action: this.inferAction(s),\n description: s,\n tool: inferredTools[i] ?? this.inferToolForStep(s),\n expectedOutput: `Step ${i + 1} completed`,\n })),\n contextTags.length > 0 ? contextTags : undefined,\n )\n\n const record: SkillRecord = {\n definition: def,\n usageCount: 1,\n successRate: 1.0,\n lastUsed: new Date().toISOString(),\n }\n\n this.skills.set(def.meta.id, record)\n return record\n }\n\n find(query: string): SkillRecord[] {\n const q = query.toLowerCase()\n return [...this.skills.values()]\n .filter(s =>\n s.definition.meta.name.toLowerCase().includes(q) ||\n s.definition.trigger.pattern.toLowerCase().includes(q) ||\n s.definition.meta.name.toLowerCase().includes(q)\n )\n .sort((a, b) => b.successRate - a.successRate)\n .slice(0, 5)\n }\n\n getAll(): SkillRecord[] {\n return [...this.skills.values()].sort((a, b) => b.lastUsed.localeCompare(a.lastUsed))\n }\n\n getById(id: string): SkillRecord | undefined {\n return this.skills.get(id)\n }\n\n reportFailure(skillId: string): boolean {\n const record = this.skills.get(skillId)\n if (!record) return false\n\n record.usageCount++\n record.successRate = (record.successRate * (record.usageCount - 1)) / record.usageCount\n record.definition.quality.usageCount = record.usageCount\n record.definition.quality.successRate = record.successRate\n record.definition.quality.failureScenarios.push(`Failed at ${new Date().toISOString()}`)\n record.definition.audit.lastModified = new Date().toISOString()\n return true\n }\n\n exportEnvelope(skillId: string): string | null {\n const record = this.skills.get(skillId)\n if (!record) return null\n return JSON.stringify(createMemoryEnvelope(record.definition, \"skill\"), null, 2)\n }\n\n importFromEnvelope(json: string): boolean {\n const parsed = parseMemoryEnvelope<SkillDefinition>(JSON.parse(json))\n if (!parsed || parsed.type !== \"skill\") return false\n\n const existing = this.skills.get(parsed.data.meta.id)\n if (existing) {\n existing.definition = parsed.data\n existing.usageCount = parsed.data.quality.usageCount\n existing.successRate = parsed.data.quality.successRate\n existing.lastUsed = parsed.data.audit.lastUsed\n return true\n }\n\n this.skills.set(parsed.data.meta.id, {\n definition: parsed.data,\n usageCount: parsed.data.quality.usageCount,\n successRate: parsed.data.quality.successRate,\n lastUsed: parsed.data.audit.lastUsed,\n })\n return true\n }\n\n private isExtractablePattern(content: string): boolean {\n const lower = content.toLowerCase()\n return (lower.includes(\"\u2705\") || lower.includes(\"success\")) && (lower.includes(\"step\") || lower.includes(\"complete\") || lower.includes(\"done\"))\n }\n\n private extractName(content: string): string | null {\n const patterns = [\n /(?:created|added|implemented|built)\\s+(\\w[\\w\\s]{3,40})/i,\n /Step\\s+\\w+:\\s*(.+?)(?:\\.|$)/i,\n /Completed\\s+(.+?)(?:\\.|$)/i,\n ]\n for (const p of patterns) {\n const m = content.match(p)\n if (m) return m[1].trim().slice(0, 50)\n }\n return null\n }\n\n private extractSteps(content: string): string[] {\n const steps: string[] = []\n const lines = content.split(\"\\n\")\n for (const line of lines) {\n const m = line.match(/^\\d+\\.\\s+(.+)/)\n if (m) steps.push(m[1].trim())\n }\n return steps\n }\n\n private extractPattern(content: string): string {\n const keywords = content.match(/\\b(\\w{4,})\\b/g)\n return (keywords ?? []).slice(0, 5).join(\" \")\n }\n\n private extractKeywords(content: string): string[] {\n return [...new Set(content.match(/\\b(\\w{3,})\\b/g) ?? [])].slice(0, 10)\n }\n\n private inferAction(stepDesc: string): string {\n const lower = stepDesc.toLowerCase()\n if (lower.includes(\"create\") || lower.includes(\"add\") || lower.includes(\"write\")) return \"create\"\n if (lower.includes(\"delete\") || lower.includes(\"remove\")) return \"delete\"\n if (lower.includes(\"modify\") || lower.includes(\"update\") || lower.includes(\"edit\") || lower.includes(\"change\")) return \"modify\"\n if (lower.includes(\"install\") || lower.includes(\"setup\")) return \"install\"\n if (lower.includes(\"test\") || lower.includes(\"verify\") || lower.includes(\"check\")) return \"verify\"\n if (lower.includes(\"run\") || lower.includes(\"exec\")) return \"execute\"\n if (lower.includes(\"review\") || lower.includes(\"audit\") || lower.includes(\"inspect\")) return \"review\"\n return \"execute\"\n }\n\n private inferToolForStep(stepDesc: string): string | undefined {\n const lower = stepDesc.toLowerCase()\n if (lower.includes(\"read\") || lower.includes(\"check file\")) return \"read\"\n if (lower.includes(\"write\") || lower.includes(\"create file\")) return \"write\"\n if (lower.includes(\"edit\") || lower.includes(\"modify\")) return \"edit\"\n if (lower.includes(\"run\") || lower.includes(\"test\") || lower.includes(\"exec\")) return \"bash\"\n if (lower.includes(\"install\") || lower.includes(\"npm\") || lower.includes(\"pip\")) return \"bash\"\n if (lower.includes(\"search\") || lower.includes(\"find\")) return \"grep\"\n return undefined\n }\n\n private inferTools(content: string): string[] {\n const tools: string[] = []\n const toolPatterns: Array<{ pattern: RegExp; tool: string }> = [\n { pattern: /\\b(read|Read)\\b/, tool: \"read\" },\n { pattern: /\\b(edit|Edit)\\b/, tool: \"edit\" },\n { pattern: /\\b(write|Write)\\b/, tool: \"write\" },\n { pattern: /\\b(bash|Bash|exec|run)\\b/, tool: \"bash\" },\n { pattern: /\\b(grep|search|find)\\b/, tool: \"grep\" },\n ]\n for (const { pattern, tool } of toolPatterns) {\n if (pattern.test(content)) tools.push(tool)\n }\n return [...new Set(tools)]\n }\n}\n", "import { createMemoryEnvelope, parseMemoryEnvelope, MEMORY_SCHEMA_VERSION, MemorySchemaVersion } from \"./schema-version.js\"\n\nexport interface Episode {\n id: string\n sessionId: string\n planGoal: string\n summary: string\n outcome: \"success\" | \"partial\" | \"failed\"\n decisions: string[]\n filesChanged: string[]\n timestamp: string\n tags: string[]\n}\n\nexport interface EpisodeEnvelope {\n schema_version: number\n type: \"episode\"\n data: Episode\n created_at: string\n}\n\nexport class EpisodicStore {\n private episodes: Episode[] = []\n private migrator = new MemorySchemaVersion()\n private onRecord?: (episode: Episode) => void\n\n setPersistenceCallback(cb: (episode: Episode) => void): void {\n this.onRecord = cb\n }\n\n record(sessionId: string, planGoal: string, outcome: Episode[\"outcome\"], decisions: string[], filesChanged: string[]): Episode {\n const episode: Episode = {\n id: `ep-${Date.now()}`,\n sessionId,\n planGoal,\n summary: `${outcome === \"success\" ? \"Completed\" : outcome === \"partial\" ? \"Partially completed\" : \"Failed\"}: ${planGoal}`,\n outcome,\n decisions,\n filesChanged,\n timestamp: new Date().toISOString(),\n tags: this.extractTags(planGoal, decisions),\n }\n\n this.episodes.push(episode)\n this.onRecord?.(episode)\n return episode\n }\n\n search(query: string): Episode[] {\n const q = query.toLowerCase()\n return this.episodes\n .filter(e =>\n e.planGoal.toLowerCase().includes(q) ||\n e.tags.some(t => t.includes(q)) ||\n e.decisions.some(d => d.toLowerCase().includes(q)) ||\n e.filesChanged.some(f => f.toLowerCase().includes(q))\n )\n .sort((a, b) => b.timestamp.localeCompare(a.timestamp))\n .slice(0, 10)\n }\n\n getRecent(limit = 10): Episode[] {\n return [...this.episodes]\n .sort((a, b) => b.timestamp.localeCompare(a.timestamp))\n .slice(0, limit)\n }\n\n getBySession(sessionId: string): Episode[] {\n return this.episodes.filter(e => e.sessionId === sessionId)\n }\n\n getStats(): { total: number; successful: number; partial: number; failed: number } {\n return {\n total: this.episodes.length,\n successful: this.episodes.filter(e => e.outcome === \"success\").length,\n partial: this.episodes.filter(e => e.outcome === \"partial\").length,\n failed: this.episodes.filter(e => e.outcome === \"failed\").length,\n }\n }\n\n exportEpisode(id: string): EpisodeEnvelope | null {\n const ep = this.episodes.find(e => e.id === id)\n if (!ep) return null\n return createMemoryEnvelope(ep, \"episode\") as EpisodeEnvelope\n }\n\n importEpisode(envelope: EpisodeEnvelope): boolean {\n const parsed = parseMemoryEnvelope<Episode>(envelope)\n if (!parsed || parsed.type !== \"episode\") return false\n\n if (parsed.version < MEMORY_SCHEMA_VERSION) {\n const upgraded = this.migrator.upgrade(parsed.data, parsed.version)\n this.episodes.push(upgraded)\n return true\n }\n\n if (!this.episodes.some(e => e.id === parsed.data.id)) {\n this.episodes.push(parsed.data)\n return true\n }\n return false\n }\n\n exportAll(): EpisodeEnvelope[] {\n return this.episodes.map(e => createMemoryEnvelope(e, \"episode\") as EpisodeEnvelope)\n }\n\n getMigrator(): MemorySchemaVersion {\n return this.migrator\n }\n\n private extractTags(goal: string, decisions: string[]): string[] {\n const words = [...goal.split(/\\s+/), ...decisions.join(\" \").split(/\\s+/)]\n return [...new Set(words.filter(w => w.length > 3).map(w => w.toLowerCase()))]\n }\n}\n", "import { existsSync, readFileSync } from \"node:fs\"\nimport { resolve, isAbsolute } from \"node:path\"\n\nexport interface HallucinationCheck {\n passed: boolean\n claims: ClaimResult[]\n summary: string\n}\n\nexport interface ClaimResult {\n claim: string\n type: \"file_exists\" | \"function_exists\" | \"import_valid\" | \"api_signature\"\n verified: boolean\n actual?: string\n expected?: string\n}\n\nexport class HallucinationGuard {\n private worktree: string\n\n constructor(worktree: string) {\n this.worktree = worktree\n }\n\n check(executionOutput: string, modifiedFiles: string[]): HallucinationCheck {\n const claims: ClaimResult[] = []\n\n const fileClaims = this.extractFileClaims(executionOutput)\n for (const claim of fileClaims) {\n const resolved = this.resolveSafe(claim)\n const exists = resolved ? existsSync(resolved) : false\n claims.push({\n claim,\n type: \"file_exists\",\n verified: exists,\n actual: exists ? \"exists\" : \"does not exist\",\n expected: \"exists\",\n })\n }\n\n const funcClaims = this.extractFunctionClaims(executionOutput)\n for (const claim of funcClaims) {\n const resolved = this.resolveSafe(claim.file)\n const found = resolved ? this.functionExists(claim.function, resolved, modifiedFiles) : false\n claims.push({\n claim: `${claim.function} in ${claim.file}`,\n type: \"function_exists\",\n verified: found,\n actual: found ? \"found\" : \"not found\",\n expected: \"found\",\n })\n }\n\n const importClaims = this.extractImportClaims(executionOutput)\n for (const claim of importClaims) {\n const resolved = this.resolveSafe(claim)\n const exists = resolved ? existsSync(resolved) : false\n claims.push({\n claim,\n type: \"import_valid\",\n verified: exists,\n actual: exists ? \"exists\" : \"missing\",\n expected: \"exists\",\n })\n }\n\n const sigClaims = this.extractApiSignatureClaims(executionOutput, modifiedFiles)\n for (const claim of sigClaims) {\n const resolved = this.resolveSafe(claim.file)\n const sigValid = resolved ? this.verifyApiSignature(claim.method, claim.file, resolved) : false\n claims.push({\n claim: `${claim.method} in ${claim.file}`,\n type: \"api_signature\",\n verified: sigValid,\n actual: sigValid ? \"signature matches\" : \"signature mismatch or not found\",\n expected: \"signature exists\",\n })\n }\n\n const passed = claims.every(c => c.verified)\n const failedCount = claims.filter(c => !c.verified).length\n\n return {\n passed,\n claims,\n summary: passed\n ? \"All claims verified.\"\n : `${failedCount} unverified claim(s) found. These statements may be hallucinations.`,\n }\n }\n\n private resolveSafe(claim: string): string | null {\n const normalized = claim.replace(/['\"]/g, \"\")\n if (isAbsolute(normalized)) {\n if (!normalized.startsWith(this.worktree)) return null\n return normalized\n }\n const resolved = resolve(this.worktree, normalized)\n if (!resolved.startsWith(this.worktree)) return null\n return resolved\n }\n\n private extractFileClaims(output: string): string[] {\n const patterns = [\n /(?:created|wrote|generated|saved)\\s+['\"]?([\\w/.\\-]+\\.(?:ts|js|tsx|jsx|json|py|go|rs|md|yaml|yml|toml))['\"]?/gi,\n /(?:in|at|to)\\s+['\"]?([\\w/.\\-]+\\.(?:ts|js|tsx|jsx|py|go|rs|md))['\"]?/gi,\n ]\n\n const files = new Set<string>()\n for (const pattern of patterns) {\n for (const match of output.matchAll(pattern)) {\n const file = match[1]\n if (file && file.length > 2) files.add(file)\n }\n }\n\n return [...files]\n }\n\n private extractFunctionClaims(output: string): Array<{ function: string; file: string }> {\n const results: Array<{ function: string; file: string }> = []\n const pattern = /(?:added|implemented|created|modified)\\s+(\\w+)\\s+(?:in|to|at)\\s+['\"]?([\\w/.\\-]+)['\"]?/gi\n\n for (const match of output.matchAll(pattern)) {\n results.push({ function: match[1], file: match[2] })\n }\n\n return results\n }\n\n private extractImportClaims(output: string): string[] {\n const files = new Set<string>()\n const pattern = /(?:import|require)\\s+.*?['\"](.+?)['\"]/g\n\n for (const match of output.matchAll(pattern)) {\n const imp = match[1]\n if (imp && imp.length > 1) files.add(imp)\n }\n\n return [...files]\n }\n\n private extractApiSignatureClaims(output: string, _modifiedFiles: string[]): Array<{ method: string; file: string }> {\n const results: Array<{ method: string; file: string }> = []\n\n const patterns = [\n /(?:calls|invokes|uses|references)\\s+(\\w+)\\s+(?:from|in)\\s+['\"]?([\\w/.\\-]+\\.(?:ts|js|py|go|rs))['\"]?/gi,\n /(?:API|endpoint|method|function)\\s+(\\w+)\\s+(?:in|at)\\s+['\"]?([\\w/.\\-]+\\.(?:ts|js|py|go|rs))['\"]?/gi,\n /(?:returns|exports)\\s+(\\w+)\\s+(?:from)\\s+['\"]?([\\w/.\\-]+\\.(?:ts|js|py|go|rs))['\"]?/gi,\n ]\n\n for (const pattern of patterns) {\n for (const match of output.matchAll(pattern)) {\n results.push({ method: match[1], file: match[2] })\n }\n }\n\n return results\n }\n\n private verifyApiSignature(methodName: string, relativePath: string, absolutePath: string): boolean {\n try {\n const content = readFileSync(absolutePath, \"utf-8\")\n\n const isPython = relativePath.endsWith(\".py\")\n const isGo = relativePath.endsWith(\".go\")\n const isRust = relativePath.endsWith(\".rs\")\n\n if (isPython) {\n const defPattern = new RegExp(`def\\\\s+${methodName}\\\\s*\\\\(`)\n const classPattern = new RegExp(`class\\\\s+${methodName}\\\\s*[(:]`)\n return defPattern.test(content) || classPattern.test(content)\n }\n\n if (isGo) {\n const funcPattern = new RegExp(`func\\\\s+(?:\\\\(\\\\w+\\\\s+\\\\*?\\\\w+\\\\)\\\\s+)?${methodName}\\\\s*\\\\(`)\n return funcPattern.test(content)\n }\n\n if (isRust) {\n const fnPattern = new RegExp(`(?:pub\\\\s+)?fn\\\\s+${methodName}\\\\s*[<(]`)\n const implPattern = new RegExp(`impl\\\\s+.*\\\\{[^}]*fn\\\\s+${methodName}\\\\s*[<(]`)\n return fnPattern.test(content) || implPattern.test(content)\n }\n\n const patterns = [\n new RegExp(`(?:function|const|let|var|export\\\\s+(?:const|function|class|default|async\\\\s+function))\\\\s+${methodName}\\\\b`),\n new RegExp(`${methodName}\\\\s*[=(:]`),\n new RegExp(`(?:async\\\\s+)?${methodName}\\\\s*\\\\(`),\n ]\n return patterns.some(p => p.test(content))\n } catch {\n return false\n }\n }\n\n private functionExists(funcName: string, file: string, _knownFiles: string[]): boolean {\n try {\n const content = readFileSync(file, \"utf-8\")\n const patterns = [\n new RegExp(`(?:function|const|let|var|export\\\\s+(?:const|function|class|default|async\\\\s+function))\\\\s+${funcName}\\\\b`),\n new RegExp(`${funcName}\\\\s*[=(:]`),\n new RegExp(`(?:async\\\\s+)?${funcName}\\\\s*\\\\(`),\n ]\n return patterns.some(p => p.test(content))\n } catch {\n return false\n }\n }\n}\n", "import type { Subtask } from \"./intent-parser.js\"\nimport type { LLMEngine } from \"./llm.js\"\nimport { execFileSync } from \"node:child_process\"\nimport { writeFileSync, mkdirSync, existsSync } from \"node:fs\"\nimport { join, dirname } from \"node:path\"\n\nexport interface ParallelPlan {\n phases: Phase[]\n maxParallelism: number\n}\n\nexport interface Phase {\n index: number\n steps: Subtask[]\n canRunInParallel: boolean\n}\n\nexport interface ParallelExecutionResult {\n stepId: string\n success: boolean\n output?: string\n error?: string\n filesModified: string[]\n}\n\nexport type StepRunner = (step: Subtask) => Promise<ParallelExecutionResult>\n\nexport interface LLMStepRunnerOptions {\n llmEngine: LLMEngine\n projectDir: string\n planGoal: string\n sessionId: string\n opencodePath?: string\n verbose?: boolean\n}\n\nexport interface ConcurrentExecutionReport {\n phaseResults: Array<{\n phaseIndex: number\n steps: Array<{ id: string; description: string }>\n results: ParallelExecutionResult[]\n }>\n totalSteps: number\n completedSteps: number\n failedSteps: number\n totalDurationMs: number\n summary: string\n}\n\nexport class ParallelExecutor {\n analyzeParallelism(subtasks: Subtask[]): ParallelPlan {\n const phases: Phase[] = []\n const completed = new Set<string>()\n const remaining = new Set(subtasks.map(s => s.id))\n\n let phaseIndex = 0\n while (remaining.size > 0) {\n const ready: Subtask[] = []\n for (const step of subtasks) {\n if (!remaining.has(step.id)) continue\n if (step.dependsOn.every(d => completed.has(d))) {\n ready.push(step)\n }\n }\n\n if (ready.length === 0) {\n // Circular dependency or all blocked\n const leftover = subtasks.filter(s => remaining.has(s.id))\n phases.push({ index: phaseIndex++, steps: leftover, canRunInParallel: false })\n break\n }\n\n for (const step of ready) {\n remaining.delete(step.id)\n completed.add(step.id)\n }\n\n phases.push({ index: phaseIndex++, steps: ready, canRunInParallel: ready.length > 1 })\n }\n\n return {\n phases,\n maxParallelism: Math.max(...phases.map(p => p.steps.length), 1),\n }\n }\n\n async executePhase(\n phase: Phase,\n runner: StepRunner,\n abortOnFailure = false,\n ): Promise<ParallelExecutionResult[]> {\n if (!phase.canRunInParallel || phase.steps.length <= 1) {\n const results: ParallelExecutionResult[] = []\n for (const step of phase.steps) {\n const result = await runner(step)\n results.push(result)\n if (abortOnFailure && !result.success) break\n }\n return results\n }\n\n const promises = phase.steps.map(step => runner(step))\n const results = await Promise.all(promises)\n\n if (abortOnFailure && results.some(r => !r.success)) {\n return results\n }\n\n return results\n }\n\n async executeAll(\n plan: ParallelPlan,\n runner: StepRunner,\n abortOnFailure = false,\n ): Promise<ParallelExecutionResult[]> {\n const allResults: ParallelExecutionResult[] = []\n\n for (const phase of plan.phases) {\n const phaseResults = await this.executePhase(phase, runner, abortOnFailure)\n allResults.push(...phaseResults)\n\n if (abortOnFailure && phaseResults.some(r => !r.success)) {\n break\n }\n }\n\n return allResults\n }\n\n suggestParallelTasks(subtasks: Subtask[], currentlyCompleted: string[]): { taskId: string; parallelGroup: number }[] {\n const completed = new Set(currentlyCompleted)\n const ready: Subtask[] = []\n\n for (const step of subtasks) {\n if (completed.has(step.id)) continue\n if (step.dependsOn.every(d => completed.has(d))) {\n ready.push(step)\n }\n }\n\n // Group steps that have no shared dependencies (can truly run in parallel)\n const groups = new Map<string, number>()\n let groupId = 0\n\n for (const step of ready) {\n const depKey = [...step.dependsOn].sort().join(\",\")\n const group = groups.get(depKey)\n if (group !== undefined) {\n groups.set(step.id, group)\n } else {\n groups.set(depKey, groupId)\n groups.set(step.id, groupId)\n groupId++\n }\n }\n\n return ready.map(s => ({ taskId: s.id, parallelGroup: groups.get(s.id) ?? 0 }))\n }\n\n detectConflicts(parallelTasks: string[], modifiedFiles: Map<string, string[]>): Array<{ taskA: string; taskB: string; conflictingFile: string }> {\n const conflicts: Array<{ taskA: string; taskB: string; conflictingFile: string }> = []\n\n for (let i = 0; i < parallelTasks.length; i++) {\n for (let j = i + 1; j < parallelTasks.length; j++) {\n const filesA = modifiedFiles.get(parallelTasks[i]) ?? []\n const filesB = modifiedFiles.get(parallelTasks[j]) ?? []\n\n for (const file of filesA) {\n if (filesB.includes(file)) {\n conflicts.push({\n taskA: parallelTasks[i],\n taskB: parallelTasks[j],\n conflictingFile: file,\n })\n }\n }\n }\n }\n\n return conflicts\n }\n\n llmStepRunner(opts: LLMStepRunnerOptions): StepRunner {\n return async (step: Subtask): Promise<ParallelExecutionResult> => {\n const startTime = Date.now()\n try {\n const resp = await opts.llmEngine.call({\n systemPrompt: `You are an autonomous software engineer implementing a step of a larger plan. Generate implementation as JSON with:\n- \"files\": [{ \"path\": \"relative/file/path\", \"content\": \"file content\" }]\n- \"summary\": \"what was done\"\nOnly include files that need changing. Return ONLY valid JSON.` + opts.llmEngine.getMemoryContext(step.description),\n userPrompt: `Goal: ${opts.planGoal}\\nStep (${step.id}): ${step.description}\\nDir: ${opts.projectDir}\\nComplete the step.`,\n jsonMode: true,\n temperature: 0.3,\n })\n\n let impl: { files?: Array<{ path: string; content: string }>; summary?: string }\n try { impl = JSON.parse(resp.content) } catch {\n return { stepId: step.id, success: false, error: \"LLM JSON parse error\", output: resp.content, filesModified: [] }\n }\n\n const files: string[] = []\n for (const file of impl.files ?? []) {\n const fullPath = join(opts.projectDir, file.path)\n mkdirSync(dirname(fullPath), { recursive: true })\n writeFileSync(fullPath, file.content, \"utf-8\")\n files.push(file.path)\n }\n\n return {\n stepId: step.id,\n success: true,\n output: impl.summary ?? step.description,\n filesModified: files,\n }\n } catch (e) {\n return { stepId: step.id, success: false, error: (e as Error).message, output: \"\", filesModified: [] }\n }\n }\n }\n\n async executePlanConcurrently(\n plan: ParallelPlan,\n stepRunner: StepRunner,\n abortOnFailure = false,\n ): Promise<{ results: ParallelExecutionResult[]; durationMs: number }> {\n const startTime = Date.now()\n const results = await this.executeAll(plan, stepRunner, abortOnFailure)\n return { results, durationMs: Date.now() - startTime }\n }\n\n async executeWithSubprocessSpawn(\n step: Subtask,\n opencodePath: string,\n projectDir: string,\n sessionId: string,\n ): Promise<ParallelExecutionResult> {\n try {\n if (!existsSync(opencodePath)) {\n return { stepId: step.id, success: false, error: `opencode not found at ${opencodePath}`, output: \"\", filesModified: [] }\n }\n\n const taskJson = JSON.stringify({\n goal: `Implement: ${step.description}`,\n sessionId,\n constraints: [],\n })\n\n const result = execFileSync(opencodePath, [\"eval\", \"--json\", taskJson], {\n cwd: projectDir,\n encoding: \"utf-8\",\n timeout: 120000,\n maxBuffer: 10 * 1024 * 1024,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n })\n\n return {\n stepId: step.id,\n success: true,\n output: result.trim(),\n filesModified: [],\n }\n } catch (e) {\n return {\n stepId: step.id,\n success: false,\n error: (e as Error).message,\n output: \"\",\n filesModified: [],\n }\n }\n }\n}\n", "import type { TraceEntry } from \"./trace-logger\"\n\nexport interface DashboardData {\n timeline: TimelineEvent[]\n statistics: Statistics\n anomalies: Anomaly[]\n}\n\nexport interface TimelineEvent {\n time: string\n tool: string\n step: string\n success: boolean\n durationMs: number\n}\n\nexport interface Statistics {\n totalCalls: number\n successRate: number\n averageLatency: number\n toolsUsed: Map<string, number>\n peakConcurrency: number\n}\n\nexport interface Anomaly {\n type: \"timeout\" | \"loop\" | \"retry_storm\" | \"silent_failure\"\n description: string\n detectedAt: string\n tool?: string\n count?: number\n}\n\nexport class Dashboard {\n generate(traces: TraceEntry[], sessionStart: number): DashboardData {\n const timeline: TimelineEvent[] = traces.map(t => ({\n time: t.timestamp,\n tool: t.toolUsed,\n step: t.step,\n success: t.success,\n durationMs: t.durationMs,\n }))\n\n const totalCalls = traces.length\n const successCount = traces.filter(t => t.success).length\n const avgLatency = traces.reduce((sum, t) => sum + t.durationMs, 0) / Math.max(totalCalls, 1)\n const toolsUsed = new Map<string, number>()\n for (const t of traces) {\n toolsUsed.set(t.toolUsed, (toolsUsed.get(t.toolUsed) ?? 0) + 1)\n }\n\n const statistics: Statistics = {\n totalCalls,\n successRate: totalCalls > 0 ? successCount / totalCalls : 0,\n averageLatency: avgLatency,\n toolsUsed,\n peakConcurrency: this.computePeakConcurrency(traces),\n }\n\n const anomalies = this.detectAnomalies(traces)\n\n return { timeline, statistics, anomalies }\n }\n\n formatForDisplay(data: DashboardData): string {\n let output = `## \uD83D\uDCC8 Observability Dashboard\\n\\n`\n\n // Stats\n output += `### Statistics\\n`\n output += `| Metric | Value |\\n|--------|-------|\\n`\n output += `| Total calls | ${data.statistics.totalCalls} |\\n`\n output += `| Success rate | ${(data.statistics.successRate * 100).toFixed(1)}% |\\n`\n output += `| Avg latency | ${data.statistics.averageLatency.toFixed(0)}ms |\\n`\n output += `| Peak concurrent | ${data.statistics.peakConcurrency} |\\n`\n\n // Tools used\n output += `\\n### Tools Used\\n`\n for (const [tool, count] of [...data.statistics.toolsUsed].sort((a, b) => b[1] - a[1])) {\n output += `| \\`${tool}\\` | ${count} |\\n`\n }\n\n // Timeline\n output += `\\n### Timeline (last 20)\\n`\n const recent = data.timeline.slice(-20)\n for (const evt of recent) {\n const icon = evt.success ? \"\u2705\" : \"\u274C\"\n const dur = evt.durationMs > 0 ? ` (${evt.durationMs}ms)` : \"\"\n output += `| ${evt.time.slice(11, 19)} | ${icon} \\`${evt.tool}\\` | ${evt.step}${dur} |\\n`\n }\n\n // Anomalies\n if (data.anomalies.length > 0) {\n output += `\\n### \u26A0\uFE0F Anomalies Detected\\n`\n for (const a of data.anomalies) {\n output += `- **${a.type}**: ${a.description}\\n`\n }\n } else {\n output += `\\n### \u2705 No anomalies detected\\n`\n }\n\n return output\n }\n\n private computePeakConcurrency(traces: TraceEntry[]): number {\n let max = 0\n for (let i = 0; i < traces.length; i++) {\n let concurrent = 0\n const start = new Date(traces[i].timestamp).getTime()\n for (let j = 0; j < traces.length; j++) {\n const t = new Date(traces[j].timestamp).getTime()\n if (Math.abs(t - start) < 100) concurrent++\n }\n max = Math.max(max, concurrent)\n }\n return max\n }\n\n private detectAnomalies(traces: TraceEntry[]): Anomaly[] {\n const anomalies: Anomaly[] = []\n\n // Slow operations (>30s)\n for (const t of traces) {\n if (t.durationMs > 30_000) {\n anomalies.push({\n type: \"timeout\",\n description: `Slow operation: ${t.toolUsed} took ${t.durationMs}ms`,\n detectedAt: t.timestamp,\n tool: t.toolUsed,\n })\n }\n }\n\n // Retry storms (>3 failures for same step)\n const failCounts = new Map<string, number>()\n for (const t of traces) {\n if (!t.success && t.step.startsWith(\"execute:\")) {\n const stepId = t.step.replace(\"execute:\", \"\")\n failCounts.set(stepId, (failCounts.get(stepId) ?? 0) + 1)\n }\n }\n for (const [stepId, count] of failCounts) {\n if (count >= 3) {\n anomalies.push({\n type: \"retry_storm\",\n description: `Step \"${stepId}\" failed ${count} times`,\n detectedAt: new Date().toISOString(),\n count,\n })\n }\n }\n\n // Loop detection: same tool/step repeating without progress\n const sequence: Array<{ step: string; tool: string; idx: number }> = []\n for (let i = 0; i < traces.length; i++) {\n sequence.push({ step: traces[i].step, tool: traces[i].toolUsed, idx: i })\n }\n\n for (let cycleLen = 2; cycleLen <= 5; cycleLen++) {\n for (let start = 0; start + cycleLen * 2 < sequence.length; start++) {\n const cycle1 = sequence.slice(start, start + cycleLen)\n const cycle2 = sequence.slice(start + cycleLen, start + cycleLen * 2)\n const isRepeat = cycle1.every((c, i) =>\n c.step === cycle2[i].step && c.tool === cycle2[i].tool\n )\n if (isRepeat) {\n const toolNames = [...new Set(cycle1.map(c => c.tool))].join(\", \")\n anomalies.push({\n type: \"loop\",\n description: `Repeating pattern detected: ${toolNames} x ${cycleLen} steps at index ${start}`,\n detectedAt: traces[start + cycleLen * 2]?.timestamp ?? new Date().toISOString(),\n tool: toolNames,\n count: cycleLen,\n })\n break\n }\n }\n }\n\n // Silent failures (false success claims with failed verify)\n let lastVerifyFailed = false\n let lastFailedVerifyStep = \"\"\n for (const t of traces) {\n if (t.step.startsWith(\"verify:\") && !t.success) {\n lastVerifyFailed = true\n lastFailedVerifyStep = t.step\n }\n if (lastVerifyFailed && t.step.startsWith(\"execute:\") && t.success) {\n anomalies.push({\n type: \"silent_failure\",\n description: `Step reported success but verification \"${lastFailedVerifyStep}\" had previously failed`,\n detectedAt: t.timestamp,\n tool: t.toolUsed,\n })\n lastVerifyFailed = false\n }\n if (t.step.startsWith(\"execute:\") && !t.success) {\n lastVerifyFailed = false\n }\n }\n\n return anomalies\n }\n}\n", "export interface Checkpoint {\n id: string\n type: \"warning\" | \"review\" | \"block\"\n description: string\n context: string\n timestamp: string\n acknowledged: boolean\n}\n\nexport class CheckpointSystem {\n private checkpoints = new Map<string, Checkpoint[]>()\n private blockEnforcement = true\n\n enableBlockEnforcement(enabled: boolean): void {\n this.blockEnforcement = enabled\n }\n\n isBlocked(): { blocked: boolean; reason?: string } {\n if (!this.blockEnforcement) return { blocked: false }\n const unacknowledged = this.getUnacknowledged()\n const blocker = unacknowledged.find(c => c.type === \"block\")\n if (blocker) {\n return {\n blocked: true,\n reason: `Blocked by checkpoint \"${blocker.id}\": ${blocker.description}. Acknowledge to proceed.`,\n }\n }\n return { blocked: false }\n }\n\n evaluate(stepId: string, action: string, filesModified: string[]): Checkpoint[] {\n const results: Checkpoint[] = []\n\n // File deletion\n if (action.includes(\"delete\") || action.includes(\"remove\")) {\n if (filesModified.some(f => f.endsWith(\".ts\") || f.endsWith(\".js\") || f.endsWith(\".py\") || f.endsWith(\".go\") || f.endsWith(\".rs\"))) {\n results.push({\n id: `${stepId}-delete`,\n type: \"warning\",\n description: `Deleting source files: ${filesModified.filter(f => f.match(/\\.(ts|js|tsx|py|go|rs)$/)).join(\", \")}`,\n context: \"Deleted files may break imports in other modules.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n }\n\n // Large change set\n if (filesModified.length > 5) {\n results.push({\n id: `${stepId}-scope`,\n type: \"review\",\n description: `Modifying ${filesModified.length} files in one step`,\n context: \"Large change sets increase risk of merge conflicts and regressions.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n\n // API contract change\n if (action.toLowerCase().includes(\"export\") || action.toLowerCase().includes(\"interface\") || action.toLowerCase().includes(\"api\")) {\n results.push({\n id: `${stepId}-api`,\n type: \"review\",\n description: \"Public API or interface change detected\",\n context: \"API contract changes may affect consumers. Document the change.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n\n // Critical infrastructure\n for (const file of filesModified) {\n if (file.includes(\"config\") || file.includes(\"env\") || file.includes(\"secret\") || file.includes(\".env\") || file.includes(\"credentials\")) {\n results.push({\n id: `${stepId}-config-${file.replace(/[^a-zA-Z0-9]/g, \"-\")}`,\n type: \"block\",\n description: `Configuration/secret file changed: ${file}`,\n context: \"\u26A0\uFE0F Manual review required for config/env/secret changes. Acknowledge with agentic_execute to proceed.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n\n const highRiskPatterns = [\"/etc/\", \"/var/\", \"/boot/\", \"/usr/lib\", \"/lib/systemd\", \".ssh/\", \".gnupg/\", \".aws/credentials\", \".kube/config\"]\n for (const risky of highRiskPatterns) {\n if (file.includes(risky)) {\n results.push({\n id: `${stepId}-system-${file.replace(/[^a-zA-Z0-9]/g, \"-\")}`,\n type: \"block\",\n description: `System-critical path modified: ${file}`,\n context: \"\u26A0\uFE0F System-level file changes require explicit approval.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n }\n }\n\n // Test-only changes without source changes\n const onlyTests = filesModified.every(f => f.includes(\".test.\") || f.includes(\".spec.\") || f.includes(\"_test.\"))\n if (onlyTests && filesModified.length > 0) {\n results.push({\n id: `${stepId}-tests-only`,\n type: \"warning\",\n description: \"Only test files modified \u2014 no production code changed\",\n context: \"Verify tests are testing real scenarios, not just passing.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n\n // Schema or migration files\n for (const file of filesModified) {\n if (file.includes(\"schema\") || file.includes(\"migration\") || file.includes(\".sql\")) {\n results.push({\n id: `${stepId}-schema-${file.replace(/[^a-zA-Z0-9]/g, \"-\")}`,\n type: \"review\",\n description: `Schema/migration file changed: ${file}`,\n context: \"Database or data schema changes should be reviewed for backward compatibility.\",\n timestamp: new Date().toISOString(),\n acknowledged: false,\n })\n }\n }\n\n this.checkpoints.set(stepId, results)\n return results\n }\n\n acknowledge(stepId: string, checkpointId: string): boolean {\n const cps = this.checkpoints.get(stepId)\n if (!cps) return false\n\n const cp = cps.find(c => c.id === checkpointId)\n if (!cp) return false\n\n cp.acknowledged = true\n return true\n }\n\n acknowledgeAll(stepId: string): number {\n const cps = this.checkpoints.get(stepId)\n if (!cps) return 0\n let count = 0\n for (const cp of cps) {\n if (!cp.acknowledged) {\n cp.acknowledged = true\n count++\n }\n }\n return count\n }\n\n getUnacknowledged(): Checkpoint[] {\n const all: Checkpoint[] = []\n for (const cps of this.checkpoints.values()) {\n all.push(...cps.filter(c => !c.acknowledged))\n }\n return all\n }\n\n hasBlockers(): boolean {\n return this.getUnacknowledged().some(c => c.type === \"block\")\n }\n}\n", "export interface ConversationTurn {\n role: \"user\" | \"assistant\" | \"tool\"\n content: string\n timestamp: number\n metadata?: Record<string, unknown>\n}\n\nexport interface SessionState {\n sessionId: string\n turns: ConversationTurn[]\n plan?: import(\"../core/intent-parser\").Plan\n artifacts: Map<string, string>\n currentTaskType?: string\n}\n\nexport interface ExecutorSnapshot {\n completedSteps: string[]\n stepStates: Map<string, { id: string; success: boolean }>\n}\n\nexport class SessionStore {\n private sessions = new Map<string, SessionState>()\n private executorSnapshots = new Map<string, ExecutorSnapshot>()\n /** Per-session model preferences: role \u2192 model name */\n private modelPreferences = new Map<string, Map<string, string>>()\n /** TTL in days for session expiry (0 = never expire). Config-hot-reloadable. */\n private forgetAfterDays = 30\n\n /** Set the TTL for session expiry \u2014 called on config hot-reload. */\n setForgetAfterDays(days: number): void {\n this.forgetAfterDays = Math.max(0, days)\n }\n\n /** Remove sessions that haven't been touched since TTL. */\n pruneExpired(): number {\n if (this.forgetAfterDays <= 0) return 0\n const cutoff = Date.now() - this.forgetAfterDays * 24 * 60 * 60 * 1000\n let removed = 0\n for (const [id, session] of this.sessions) {\n const lastTurn = session.turns[session.turns.length - 1]\n if (lastTurn && lastTurn.timestamp < cutoff) {\n this.removeSession(id)\n removed++\n }\n }\n return removed\n }\n\n getOrCreate(sessionId: string): SessionState {\n let session = this.sessions.get(sessionId)\n if (!session) {\n session = {\n sessionId,\n turns: [],\n artifacts: new Map(),\n }\n this.sessions.set(sessionId, session)\n }\n return session\n }\n\n updateProgress(sessionId: string, snapshot: ExecutorSnapshot): void {\n this.executorSnapshots.set(sessionId, snapshot)\n }\n\n addTurn(sessionId: string, turn: ConversationTurn): void {\n const session = this.getOrCreate(sessionId)\n session.turns.push(turn)\n }\n\n getContext(sessionId: string, maxTurns = 20): ConversationTurn[] {\n const session = this.sessions.get(sessionId)\n if (!session) return []\n return session.turns.slice(-maxTurns)\n }\n\n getContextSummary(sessionId: string): string {\n const session = this.sessions.get(sessionId)\n if (!session) return \"\"\n const snapshot = this.executorSnapshots.get(sessionId)\n\n const plan = session.plan\n const turnCount = session.turns.length\n const completedCount = snapshot?.completedSteps.length ?? 0\n const totalSteps = plan?.estimatedSteps ?? snapshot?.stepStates.size ?? 0\n\n let summary = `Session: ${sessionId}\\n`\n summary += `Turns: ${turnCount}\\n`\n summary += `Progress: ${completedCount}/${totalSteps} steps\\n`\n\n if (plan) {\n summary += `Plan: ${plan.intent.goal}\\n`\n }\n\n return summary\n }\n\n removeSession(sessionId: string): void {\n this.sessions.delete(sessionId)\n this.executorSnapshots.delete(sessionId)\n this.modelPreferences.delete(sessionId)\n }\n\n // \u2500\u2500 Session-Seeded Model Preference (Gap: per-role model selection) \u2500\u2500\n\n /** Set preferred model for a given agent role in this session. */\n setModelPreference(sessionId: string, role: string, model: string): void {\n let prefs = this.modelPreferences.get(sessionId)\n if (!prefs) {\n prefs = new Map()\n this.modelPreferences.set(sessionId, prefs)\n }\n prefs.set(role.toLowerCase(), model)\n }\n\n /** Get preferred model for a given agent role, or undefined. */\n getModelPreference(sessionId: string, role: string): string | undefined {\n const prefs = this.modelPreferences.get(sessionId)\n return prefs?.get(role.toLowerCase())\n }\n\n /** Get all model preferences for a session. Returns array of { role, model }. */\n getAllModelPreferences(sessionId: string): Array<{ role: string; model: string }> {\n const prefs = this.modelPreferences.get(sessionId)\n if (!prefs) return []\n return [...prefs.entries()].map(([role, model]) => ({ role, model }))\n }\n\n /** Clear model preference for a specific role, or all roles if omitted. */\n clearModelPreference(sessionId: string, role?: string): void {\n const prefs = this.modelPreferences.get(sessionId)\n if (!prefs) return\n if (role) {\n prefs.delete(role.toLowerCase())\n } else {\n this.modelPreferences.delete(sessionId)\n }\n }\n}\n", "import { mkdir, writeFile, appendFile, readFile, rm } from \"node:fs/promises\"\nimport { join, dirname } from \"node:path\"\nimport { existsSync } from \"node:fs\"\n\nexport interface TraceEntry {\n timestamp: string\n step: string\n input: string\n output: string\n toolUsed: string\n success: boolean\n durationMs: number\n metadata?: Record<string, unknown>\n}\n\nexport class TraceLogger {\n private logPath: string\n private buffer: TraceEntry[] = []\n private flushInterval: ReturnType<typeof setInterval> | null = null\n /** Retention days for trace entries (0 = never prune). Config-hot-reloadable. */\n private retentionDays = 7\n\n constructor(worktree: string) {\n this.logPath = join(worktree || process.cwd(), \".agentic\", \"trace.jsonl\")\n }\n\n /** Set retention days for pruning old traces \u2014 called on config hot-reload. */\n setRetentionDays(days: number): void {\n this.retentionDays = Math.max(0, days)\n }\n\n /** Prune trace entries older than retentionDays, in-place rewriting the file. */\n async pruneOldTraces(): Promise<number> {\n if (this.retentionDays <= 0) return 0\n if (!existsSync(this.logPath)) return 0\n const cutoff = Date.now() - this.retentionDays * 24 * 60 * 60 * 1000\n const cutoffStr = new Date(cutoff).toISOString()\n try {\n const content = await readFile(this.logPath, \"utf-8\")\n const lines = content.split(\"\\n\").filter(Boolean)\n const kept = lines.filter(line => {\n try {\n const entry = JSON.parse(line)\n return entry.timestamp >= cutoffStr\n } catch { return false }\n })\n // Only rewrite if we actually removed something\n if (kept.length < lines.length) {\n await writeFile(this.logPath, kept.map(e => JSON.stringify(e)).join(\"\\n\") + \"\\n\")\n }\n return lines.length - kept.length\n } catch { return 0 }\n }\n\n async init(): Promise<void> {\n const dir = dirname(this.logPath)\n await mkdir(dir, { recursive: true })\n }\n\n log(entry: Omit<TraceEntry, \"timestamp\">): void {\n this.buffer.push({\n ...entry,\n timestamp: new Date().toISOString(),\n })\n\n if (this.buffer.length >= 10) {\n this.flush()\n }\n\n if (!this.flushInterval) {\n this.flushInterval = setInterval(() => this.flush(), 5000)\n }\n }\n\n async flush(): Promise<void> {\n if (this.buffer.length === 0) return\n\n const snapshot = [...this.buffer]\n const lines = snapshot.map(e => JSON.stringify(e)).join(\"\\n\") + \"\\n\"\n\n try {\n await appendFile(this.logPath, lines)\n this.buffer = this.buffer.slice(snapshot.length)\n } catch {\n try {\n await writeFile(this.logPath, lines)\n this.buffer = this.buffer.slice(snapshot.length)\n } catch {\n // Silently fail \u2014 data retained in buffer for next flush\n }\n }\n }\n\n async dispose(): Promise<void> {\n if (this.flushInterval) {\n clearInterval(this.flushInterval)\n this.flushInterval = null\n }\n await this.flush()\n }\n}\n", "/**\n * Task Type Classifier\n * \n * Automatically detects task type from description for capability-aware model selection.\n */\n\nexport enum TaskType {\n CODING = 'coding',\n REASONING = 'reasoning',\n TESTING = 'testing',\n DOCUMENTATION = 'documentation',\n DEBUGGING = 'debugging',\n}\n\ninterface TaskPattern {\n type: TaskType\n keywords: RegExp\n}\n\nconst TASK_PATTERNS: TaskPattern[] = [\n {\n type: TaskType.CODING,\n keywords: /\\b(implement|create|add|build|code|develop|write|program|construct|generate|refactor)\\b/i,\n },\n {\n type: TaskType.REASONING,\n keywords: /\\b(design|architect|analyze|decide|evaluate|assess|compare|tradeoff|strategy|plan|approach|consider)\\b/i,\n },\n {\n type: TaskType.TESTING,\n keywords: /\\b(test|verify|validate|check|qa|quality|coverage|assert|expect|spec)\\b/i,\n },\n {\n type: TaskType.DOCUMENTATION,\n keywords: /\\b(document|readme|comment|explain|describe|guide|tutorial|example|doc)\\b/i,\n },\n {\n type: TaskType.DEBUGGING,\n keywords: /\\b(debug|fix|error|bug|crash|issue|problem|troubleshoot|diagnose|investigate)\\b/i,\n },\n]\n\n/**\n * Detect task type from description using keyword matching.\n * \n * @param description Task description or action text\n * @returns Detected task type (defaults to CODING if no match)\n */\nexport function detectTaskType(description: string): TaskType {\n if (!description || typeof description !== 'string') {\n return TaskType.CODING // Default fallback\n }\n\n // Check each pattern in order of priority\n for (const pattern of TASK_PATTERNS) {\n if (pattern.keywords.test(description)) {\n return pattern.type\n }\n }\n\n // Default to CODING if no keywords matched\n return TaskType.CODING\n}\n\n/**\n * Get human-readable label for task type.\n */\nexport function getTaskTypeLabel(type: TaskType): string {\n const labels: Record<TaskType, string> = {\n [TaskType.CODING]: 'Implementation & Development',\n [TaskType.REASONING]: 'Analysis & Design',\n [TaskType.TESTING]: 'Testing & Verification',\n [TaskType.DOCUMENTATION]: 'Documentation & Guides',\n [TaskType.DEBUGGING]: 'Debugging & Troubleshooting',\n }\n return labels[type] || type\n}\n", "import type { SkillRecord } from \"./skill-store.js\"\n\nexport interface TrainingExample {\n instruction: string\n response: string\n skillName: string\n quality: number\n}\n\nexport interface TrainingDataset {\n format: \"openai\" | \"instructions\"\n totalExamples: number\n qualityFilter: number\n data: string\n}\n\n/**\n * Convert a single skill into a training example.\n * instruction = trigger pattern + name \u2192 what the agent should do\n * response = structured workflow steps \u2192 how the agent should do it\n */\nexport function skillToTrainingExample(skill: SkillRecord): TrainingExample {\n const def = skill.definition\n const stepsText = def.workflow.steps\n .map(s => `${s.order}. ${s.action}: ${s.description}${s.tool ? ` (tool: ${s.tool})` : \"\"}`)\n .join(\"\\n\")\n\n const response = [\n `## Workflow: ${def.meta.name}`,\n stepsText,\n def.workflow.steps.length > 0 ? `\\nEstimated duration: ${def.workflow.estimatedDuration}` : \"\",\n def.quality.failureScenarios.length > 0\n ? `\\nCommon failure scenarios:\\n${def.quality.failureScenarios.map(f => `- ${f}`).join(\"\\n\")}`\n : \"\",\n def.workflow.steps.some(s => s.rollback)\n ? `\\nRollback strategies:\\n${def.workflow.steps.filter(s => s.rollback).map(s => `- ${s.action}: ${s.rollback}`).join(\"\\n\")}`\n : \"\",\n ].filter(Boolean).join(\"\\n\")\n\n const instruction = def.trigger.pattern || def.meta.name\n\n return {\n instruction,\n response,\n skillName: def.meta.name,\n quality: skill.successRate,\n }\n}\n\n/**\n * Export skills as OpenAI fine-tuning JSONL format.\n * Each line: {\"messages\": [{\"role\": \"system\", \"content\": \"...\"}, {\"role\": \"user\", \"content\": \"...\"}, {\"role\": \"assistant\", \"content\": \"...\"}]}\n */\nexport function exportOpenAIJSONL(examples: TrainingExample[]): string {\n return examples.map(ex => {\n const entry = {\n messages: [\n { role: \"system\", content: \"You are a senior software engineer implementing features following reusable patterns.\" },\n { role: \"user\", content: ex.instruction },\n { role: \"assistant\", content: ex.response },\n ],\n }\n return JSON.stringify(entry)\n }).join(\"\\n\")\n}\n\n/**\n * Export skills as simple instruction-response JSON array.\n */\nexport function exportInstructionsJSON(examples: TrainingExample[]): string {\n return JSON.stringify(examples.map(ex => ({\n instruction: ex.instruction,\n output: ex.response,\n source: ex.skillName,\n quality: ex.quality,\n })), null, 2)\n}\n\n/**\n * Generate a summary of the training dataset quality.\n */\nexport function trainingDatasetSummary(examples: TrainingExample[]): string {\n if (examples.length === 0) return \"No training examples generated.\"\n\n const avgQuality = examples.reduce((s, e) => s + e.quality, 0) / examples.length\n const highQuality = examples.filter(e => e.quality >= 0.8).length\n const mediumQuality = examples.filter(e => e.quality >= 0.5 && e.quality < 0.8).length\n const lowQuality = examples.filter(e => e.quality < 0.5).length\n\n let out = `## \uD83D\uDCCA Training Dataset Summary\\n\\n`\n out += `**Total examples:** ${examples.length}\\n`\n out += `**Average quality score:** ${(avgQuality * 100).toFixed(0)}%\\n`\n out += `**Quality distribution:**\\n`\n out += `- High (\u226580%): ${highQuality}\\n`\n out += `- Medium (50-79%): ${mediumQuality}\\n`\n out += `- Low (<50%): ${lowQuality}\\n\\n`\n out += `### Examples\\n`\n for (const ex of examples.slice(0, 5)) {\n out += `- **${ex.skillName}** (quality: ${(ex.quality * 100).toFixed(0)}%)\\n`\n out += ` Instruction: ${ex.instruction.slice(0, 100)}${ex.instruction.length > 100 ? \"\u2026\" : \"\"}\\n`\n }\n if (examples.length > 5) {\n out += ` \u2026 and ${examples.length - 5} more\\n`\n }\n return out\n}\n\n/**\n * Convert all skills to training examples, filtered by minimum success rate.\n */\nexport function skillsToTrainingData(\n skills: SkillRecord[],\n format: \"openai\" | \"instructions\" = \"openai\",\n minSuccessRate = 0.5,\n): TrainingDataset {\n const examples = skills\n .filter(s => s.successRate >= minSuccessRate)\n .map(s => skillToTrainingExample(s))\n\n const data = format === \"openai\"\n ? exportOpenAIJSONL(examples)\n : exportInstructionsJSON(examples)\n\n return {\n format,\n totalExamples: examples.length,\n qualityFilter: minSuccessRate,\n data,\n }\n}\n", "import type { SkillRecord } from \"../memory/skill-store.js\"\nimport type { Episode } from \"../memory/episodic-store.js\"\nimport type { AgentTask } from \"../agents/coordinator.js\"\nimport type { CustomAgentDef } from \"../agents/role-registry.js\"\n\nexport interface EvolutionMetrics {\n totalSessions: number\n totalSteps: number\n successRate: number\n retryRate: number\n avgRetriesPerFailure: number\n topErrorCategories: Array<{ category: string; count: number }>\n skillEffectiveness: Array<{ name: string; successRate: number; usage: number }>\n toolUsage: Array<{ tool: string; calls: number; failureRate: number }>\n recommendations: string[]\n}\n\nexport interface SkillPatch {\n skillId: string\n skillName: string\n failures: number\n suggestedChanges: Array<{\n type: \"add_step\" | \"add_tool\" | \"add_rollback\" | \"reorder\" | \"split\"\n description: string\n detail: string\n }>\n}\n\nexport interface RoleSuggestion {\n name: string\n triggerPattern: string\n suggestedTools: string[]\n reason: string\n}\n\nexport interface PromptPatch {\n role: string\n errorCategory: string\n instruction: string\n priority: \"high\" | \"medium\" | \"low\"\n occurrences: number\n}\n\nexport interface EvolutionReport {\n metrics: EvolutionMetrics\n skillPatches: SkillPatch[]\n roleSuggestions: RoleSuggestion[]\n promptPatches: PromptPatch[]\n improvementScore: number // 0-100, higher = more evolving\n}\n\nexport class SelfEvolver {\n private skills: SkillRecord[] = []\n private episodes: Episode[] = []\n private tasks: AgentTask[] = []\n private stepStates: Array<{ stepId: string; success: boolean; output: string }> = []\n private traceEntries: Array<{ toolUsed: string; success: boolean; step: string }> = []\n\n feedSkills(skills: SkillRecord[]): void { this.skills = skills }\n feedEpisodes(episodes: Episode[]): void { this.episodes = episodes }\n feedTasks(tasks: AgentTask[]): void { this.tasks = tasks }\n feedStepStates(steps: Array<{ stepId: string; success: boolean; output: string }>): void { this.stepStates = steps }\n feedTraces(traces: Array<{ toolUsed: string; success: boolean; step: string }>): void { this.traceEntries = traces }\n\n evolve(): EvolutionReport {\n const metrics = this.computeMetrics()\n const skillPatches = this.analyzeSkills()\n const roleSuggestions = this.suggestRoles()\n const promptPatches = this.suggestPromptPatches(metrics)\n\n // Auto-apply safe prompt patches (low-risk, high-priority)\n const appliedPatches: PromptPatch[] = []\n for (const patch of promptPatches) {\n // Auto-apply if: (1) high-priority AND (2) low occurrences (new pattern, not widespread)\n // OR: medium-priority with very high occurrences (proven pattern)\n const shouldAutoApply = \n (patch.priority === \"high\" && patch.occurrences >= 2 && patch.occurrences <= 5) ||\n (patch.priority === \"medium\" && patch.occurrences >= 10)\n \n if (shouldAutoApply) {\n // Mark as applied (actual prompt injection happens in RoleRegistry)\n appliedPatches.push(patch)\n }\n }\n\n const improvementScore = Math.min(100, Math.round(\n (skillPatches.length * 15) +\n (roleSuggestions.length * 10) +\n (promptPatches.length * 8) +\n (appliedPatches.length * 12) + // Bonus for auto-applied patches\n (metrics.successRate * 20) +\n (metrics.recommendations.length * 5)\n ))\n\n return { metrics, skillPatches, roleSuggestions, promptPatches, improvementScore }\n }\n\n private computeMetrics(): EvolutionMetrics {\n const sessions = new Set(this.episodes.map(e => e.sessionId))\n const totalSteps = this.stepStates.length || this.tasks.length\n const doneSteps = this.stepStates.filter(s => s.success).length\n const failedSteps = this.stepStates.filter(s => !s.success).length\n const done = doneSteps + this.tasks.filter(t => t.status === \"done\").length\n const failed = failedSteps + this.tasks.filter(t => t.status === \"failed\").length\n const total = done + failed || 1\n\n const errorCategories = new Map<string, number>()\n for (const ep of this.episodes) {\n if (ep.outcome !== \"success\") {\n for (const tag of ep.tags) {\n errorCategories.set(tag, (errorCategories.get(tag) ?? 0) + 1)\n }\n }\n }\n\n const topErrors = [...errorCategories.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([category, count]) => ({ category, count }))\n\n const skillEff = this.skills.map(s => ({\n name: s.definition.meta.name,\n successRate: s.successRate,\n usage: s.usageCount,\n }))\n\n const toolUsage = new Map<string, { calls: number; failures: number }>()\n for (const t of this.traceEntries) {\n const entry = toolUsage.get(t.toolUsed) ?? { calls: 0, failures: 0 }\n entry.calls++\n if (!t.success) entry.failures++\n toolUsage.set(t.toolUsed, entry)\n }\n\n const toolStats = [...toolUsage.entries()]\n .map(([tool, stats]) => ({\n tool,\n calls: stats.calls,\n failureRate: stats.calls > 0 ? stats.failures / stats.calls : 0,\n }))\n .sort((a, b) => b.calls - a.calls)\n\n const recommendations: string[] = []\n\n if (total > 0 && done / total < 0.5) {\n recommendations.push(\"Task success rate is below 50%. Consider more granular task decomposition in agentic_plan.\")\n }\n\n if (sessions.size > 3 && this.episodes.filter(e => e.outcome === \"failed\").length / Math.max(this.episodes.length, 1) > 0.3) {\n recommendations.push(\"High cross-session failure rate. Consider adding a 'review' checkpoint between plan and execute phases.\")\n }\n\n const unusedTools = [\n \"agentic_context\", \"agentic_snapshot\", \"agentic_score\",\n ].filter(t => !toolUsage.has(t))\n\n if (unusedTools.length > 0) {\n recommendations.push(`Underutilized tools: ${unusedTools.join(\", \")}. These could improve observability and quality.`)\n }\n\n const retryFraction = failed / Math.max(total, 1)\n if (retryFraction > 0.3) {\n recommendations.push(\"High retry rate (>30%). Consider adding more explicit verification criteria to plan steps.\")\n }\n\n // Error pattern analysis\n for (const step of this.stepStates) {\n if (!step.success && step.output.length > 0) {\n const lower = step.output.toLowerCase()\n if (lower.includes(\"type\") || lower.includes(\"compile\")) {\n recommendations.push(\"Frequent type/compile errors detected. Enable `autoVerify` on all execute calls to catch these early.\")\n break\n }\n }\n }\n\n return {\n totalSessions: sessions.size,\n totalSteps,\n successRate: total > 0 ? done / total : 0,\n retryRate: retryFraction,\n avgRetriesPerFailure: failed > 0 ? (totalSteps - done) / failed : 0,\n topErrorCategories: topErrors,\n skillEffectiveness: skillEff,\n toolUsage: toolStats,\n recommendations,\n }\n }\n\n private analyzeSkills(): SkillPatch[] {\n const patches: SkillPatch[] = []\n\n for (const skill of this.skills) {\n if (skill.successRate >= 0.8) continue // healthy skills\n\n const def = skill.definition\n const suggestions: SkillPatch[\"suggestedChanges\"] = []\n\n for (const scenario of def.quality.failureScenarios.slice(-3)) {\n if (scenario.includes(\"rollback\") || scenario.includes(\"undo\")) {\n suggestions.push({\n type: \"add_rollback\",\n description: \"Add rollback step for failed operations\",\n detail: \"Each step that modifies state should have a corresponding undo action\",\n })\n }\n if (scenario.includes(\"timeout\") || scenario.includes(\"slow\")) {\n suggestions.push({\n type: \"add_step\",\n description: \"Add timeout/retry wrapper step\",\n detail: \"Wrap long-running operations with retry: utils/retry.ts handles exponential backoff\",\n })\n }\n if (scenario.includes(\"missing\") || scenario.includes(\"not found\")) {\n suggestions.push({\n type: \"add_step\",\n description: \"Add pre-flight validation step\",\n detail: \"Check prerequisites before executing main workflow\",\n })\n }\n }\n\n if (def.workflow.steps.length > 5) {\n suggestions.push({\n type: \"split\",\n description: \"Split into smaller, independently testable sub-skills\",\n detail: `This skill has ${def.workflow.steps.length} steps. Consider splitting at logical boundaries.`,\n })\n }\n\n if (suggestions.length > 0) {\n patches.push({\n skillId: def.meta.id,\n skillName: def.meta.name,\n failures: Math.round(skill.usageCount * (1 - skill.successRate)),\n suggestedChanges: suggestions,\n })\n }\n }\n\n return patches\n }\n\n private suggestRoles(): RoleSuggestion[] {\n const suggestions: RoleSuggestion[] = []\n\n const taskOutcomes = new Map<string, { total: number; failed: number }>()\n for (const task of this.tasks) {\n const entry = taskOutcomes.get(task.assignedTo) ?? { total: 0, failed: 0 }\n entry.total++\n if (task.status === \"failed\") entry.failed++\n taskOutcomes.set(task.assignedTo, entry)\n }\n\n const failedTasks = this.tasks.filter(t => t.status === \"failed\")\n const failKeywords = new Map<string, number>()\n\n for (const task of failedTasks) {\n const words = task.description.toLowerCase().split(/\\W+/).filter(w => w.length > 3)\n for (const w of words) {\n failKeywords.set(w, (failKeywords.get(w) ?? 0) + 1)\n }\n }\n\n const significantKeywords = [...failKeywords.entries()]\n .filter(([, count]) => count >= 2)\n .sort((a, b) => b[1] - a[1])\n\n for (const [keyword, count] of significantKeywords) {\n if (keyword === \"security\" || keyword === \"vulnerability\" || keyword === \"injection\") {\n suggestions.push({\n name: \"Security Auditor\",\n triggerPattern: `tasks involving ${keyword}`,\n suggestedTools: [\"read\", \"grep\", \"agentic_guard\", \"agentic_verify\"],\n reason: `${count} task(s) involving \"${keyword}\" failed. A dedicated security role could prevent these via specialized review patterns.`,\n })\n }\n\n if (keyword === \"performance\" || keyword === \"optimize\" || keyword === \"slow\") {\n suggestions.push({\n name: \"Performance Engineer\",\n triggerPattern: `tasks involving ${keyword}`,\n suggestedTools: [\"bash\", \"agentic_score\", \"agentic_verify\"],\n reason: `${count} task(s) involving \"${keyword}\" failed. A performance-focused agent could catch bottlenecks early.`,\n })\n }\n\n if (keyword === \"database\" || keyword === \"migration\" || keyword === \"schema\") {\n suggestions.push({\n name: \"DB Specialist\",\n triggerPattern: `tasks involving ${keyword}`,\n suggestedTools: [\"bash\", \"read\", \"agentic_nav\"],\n reason: `${count} task(s) involving \"${keyword}\" failed. A database specialist could prevent schema drift and migration errors.`,\n })\n }\n }\n\n const hasCoordinator = taskOutcomes.has(\"coordinator\")\n if (!hasCoordinator && this.tasks.length > 10) {\n suggestions.push({\n name: \"Task Coordinator\",\n triggerPattern: \"multi-step tasks with cross-cutting concerns\",\n suggestedTools: [\"agentic_plan\", \"agentic_status\", \"agentic_delegate\", \"agentic_parallel\"],\n reason: \"With 10+ tasks and no coordinator role active, orchestration overhead may cause failures.\",\n })\n }\n\n return suggestions.slice(0, 5)\n }\n\n /**\n * Generate prompt patches from recurring error patterns (Gap #1: prompt auto-patching).\n * Maps error categories \u2192 specific instruction additions for the relevant agent role.\n */\n private suggestPromptPatches(metrics: EvolutionMetrics): PromptPatch[] {\n const patches: PromptPatch[] = []\n\n // Error category \u2192 (role, instruction) mapping\n const errorToPatch: Array<{\n category: string\n role: string\n instruction: string\n priority: \"high\" | \"medium\" | \"low\"\n }> = [\n {\n category: \"compile\",\n role: \"developer\",\n instruction: \"Before writing code, verify that all types and interfaces are compatible. Run `npx tsc --noEmit` to check for type errors before considering a step complete.\",\n priority: \"high\",\n },\n {\n category: \"type\",\n role: \"developer\",\n instruction: \"Always define explicit type annotations for function parameters and return values. Avoid `any` types. Verify type exports/imports match between files.\",\n priority: \"high\",\n },\n {\n category: \"import\",\n role: \"architect\",\n instruction: \"Before implementing, document all file dependencies and ensure import paths are correct. Verify the import exists at the expected relative path.\",\n priority: \"high\",\n },\n {\n category: \"test\",\n role: \"qa\",\n instruction: \"When reviewing code, check edge cases: empty inputs, null/undefined values, boundary conditions, and error paths. Ensure tests cover both success and failure scenarios.\",\n priority: \"medium\",\n },\n {\n category: \"runtime\",\n role: \"developer\",\n instruction: \"Add error handling for runtime edge cases: network timeouts, file not found, permission denied, and invalid input. Use try/catch blocks and return user-friendly error messages.\",\n priority: \"medium\",\n },\n ]\n\n for (const errCat of metrics.topErrorCategories) {\n const mapping = errorToPatch.find(e => e.category === errCat.category)\n if (mapping && errCat.count >= 2) {\n patches.push({\n role: mapping.role,\n errorCategory: errCat.category,\n instruction: mapping.instruction,\n priority: errCat.count >= 5 ? \"high\" : mapping.priority,\n occurrences: errCat.count,\n })\n }\n }\n\n return patches\n }\n}\n", "/**\n * ContinuousEvolution \u2014 auto-feedback pipeline for self-evolving agents.\n *\n * Tracks a rolling window of step results, detects performance degradation,\n * and triggers evolution analysis when anomalies are found.\n *\n * Aligns with the paper's \"continuous evolution\" vision:\n * agents that monitor their own performance and self-improve over time.\n */\n\nexport interface StepResult {\n stepId: string\n success: boolean\n output: string\n sessionId: string\n timestamp: number\n category?: string\n}\n\nexport interface ForecastData {\n /** Predicted success rate for the next window */\n nextWindowRate: number\n /** Estimated remaining steps until success rate drops below 50%, or null if not predictable */\n stepsUntilCritical: number | null\n /** True if the forecast shows imminent critical degradation */\n critical: boolean\n /** Per-bucket success rates for transparency */\n bucketRates: number[]\n}\n\nexport interface PerformanceTrend {\n overall: { total: number; success: number; successRate: number }\n rolling: { windowSize: number; successRate: number; direction: \"improving\" | \"stable\" | \"degrading\" }\n degradationDetected: boolean\n anomalyCount: number\n recentErrors: Array<{ stepId: string; output: string; category: string; timestamp: number }>\n recommendations: string[]\n /** Predictive degradation forecast (Gap #12) */\n forecast: ForecastData\n}\n\nexport interface EvolutionTrigger {\n reason: string\n type: \"degradation\" | \"anomaly_spike\" | \"milestone\"\n metrics: {\n recentRate: number\n overallRate: number\n anomalyRatio: number\n }\n}\n\nexport type DegradationCallback = (trend: PerformanceTrend, trigger: EvolutionTrigger) => void\n\nexport class ContinuousEvolution {\n private windowSize: number\n private results: StepResult[] = []\n private degradationCallbacks: DegradationCallback[] = []\n private lastEvolveSession: string | null = null\n private evolveCount = 0\n\n constructor(windowSize = 20) {\n this.windowSize = windowSize\n }\n\n /** Feed a step result into the rolling window */\n feedStepResult(result: StepResult): void {\n this.results.push(result)\n // Keep bounded \u2014 retain 2\u00D7 window for historical comparison\n if (this.results.length > this.windowSize * 2 + 10) {\n this.results = this.results.slice(-this.windowSize * 2)\n }\n }\n\n /** Feed multiple results at once (e.g. after a session completes) */\n feedBatch(results: StepResult[]): void {\n for (const r of results) {\n this.feedStepResult(r)\n }\n }\n\n /** Register a callback that fires when degradation is detected */\n onDegradation(cb: DegradationCallback): void {\n this.degradationCallbacks.push(cb)\n }\n\n /** Get current performance trend */\n getTrend(): PerformanceTrend {\n const total = this.results.length\n const successes = this.results.filter(r => r.success).length\n const overallRate = total > 0 ? successes / total : 1\n\n // Rolling window (most recent N)\n const recent = this.results.slice(-this.windowSize)\n const recentSuccesses = recent.filter(r => r.success).length\n const recentRate = recent.length > 0 ? recentSuccesses / recent.length : 1\n\n // Earlier window for comparison\n const earlier = this.results.slice(0, Math.min(this.windowSize, this.results.length - recent.length))\n const earlierSuccesses = earlier.filter(r => r.success).length\n const earlierRate = earlier.length > 0 ? earlierSuccesses / earlier.length : 1\n\n // Direction: \u22655% swing in either direction\n const direction = recentRate > earlierRate + 0.05\n ? \"improving\"\n : recentRate < earlierRate - 0.05\n ? \"degrading\"\n : \"stable\"\n\n const degradationDetected = direction === \"degrading\" && recentRate < 0.6\n\n const recentErrors: PerformanceTrend[\"recentErrors\"] = []\n const categories = new Map<string, number>()\n for (const r of this.results) {\n if (!r.success) {\n if (r.category) categories.set(r.category, (categories.get(r.category) ?? 0) + 1)\n }\n }\n\n for (const r of this.results.slice(-5).filter(r => !r.success)) {\n recentErrors.push({\n stepId: r.stepId,\n output: r.output.slice(0, 200),\n category: r.category ?? \"unknown\",\n timestamp: r.timestamp,\n })\n }\n\n const recommendations: string[] = []\n\n // \u2500\u2500 Predictive Degradation Forecast (Gap #12) \u2500\u2500\n // Divide results into 5 chronological buckets and compute per-bucket rates\n const forecast: ForecastData = {\n nextWindowRate: recentRate,\n stepsUntilCritical: null,\n critical: false,\n bucketRates: [],\n }\n\n if (this.results.length >= 10) {\n const bucketSize = Math.max(1, Math.floor(this.results.length / 5))\n const bucketRates: number[] = []\n for (let i = 0; i < 5; i++) {\n const start = i * bucketSize\n const end = Math.min(start + bucketSize, this.results.length)\n const bucket = this.results.slice(start, end)\n const bucketSuccesses = bucket.filter(r => r.success).length\n bucketRates.push(bucket.length > 0 ? bucketSuccesses / bucket.length : 0)\n }\n forecast.bucketRates = bucketRates\n\n // Simple linear regression: if rates are consistently decreasing, extrapolate\n const isDecreasing = bucketRates.length >= 3 &&\n bucketRates.slice(1).every((r, i) => r <= bucketRates[i]) &&\n bucketRates[0] > bucketRates[bucketRates.length - 1]\n\n if (isDecreasing) {\n // Compute average decline per bucket\n const totalDecline = bucketRates[0] - bucketRates[bucketRates.length - 1]\n const avgDecline = totalDecline / (bucketRates.length - 1)\n\n // Predict next window rate\n const nextRate = Math.max(0, bucketRates[bucketRates.length - 1] - avgDecline)\n forecast.nextWindowRate = nextRate\n forecast.critical = nextRate < 0.5\n\n // Estimate when rate would cross 50%\n if (bucketRates[bucketRates.length - 1] > 0.5 && avgDecline > 0) {\n const stepsToCross = Math.ceil((bucketRates[bucketRates.length - 1] - 0.5) / avgDecline) * bucketSize\n forecast.stepsUntilCritical = stepsToCross\n }\n\n if (forecast.critical) {\n recommendations.push(`\uD83D\uDD2E **Forecast:** Performance projected to drop to ${(nextRate * 100).toFixed(0)}% in the next window. ${forecast.stepsUntilCritical ? `Critical threshold (~50%) expected in ~${forecast.stepsUntilCritical} steps.` : \"Consider proactive evolution analysis.\"}`)\n }\n }\n }\n if (degradationDetected) {\n recommendations.push(\"Performance degradation detected. Run `agentic_evolve evolve` or enable auto-evolution to analyze root causes.\")\n }\n if (categories.size > 0) {\n const topCat = [...categories.entries()].sort((a, b) => b[1] - a[1])[0]\n if (topCat && topCat[1] >= 3) {\n recommendations.push(`Recurring error pattern: \"${topCat[0]}\" (${topCat[1]} occurrences). Consider adding targeted verification for this category.`)\n }\n }\n if (this.results.length >= 10 && overallRate < 0.5) {\n recommendations.push(\"Overall success rate below 50%. Review plan decomposition granularity and verification criteria.\")\n }\n if (this.results.length >= this.windowSize && recentRate === 1 && overallRate < 0.8) {\n recommendations.push(\"Recent improvement trend detected. Extract successful patterns as reusable skills via `agentic_skill extract`.\")\n }\n\n return {\n overall: { total, success: successes, successRate: overallRate },\n rolling: { windowSize: this.windowSize, successRate: recentRate, direction },\n degradationDetected,\n anomalyCount: this.results.filter(r => !r.success).length,\n recentErrors,\n recommendations,\n forecast,\n }\n }\n\n /** Check trend and fire callbacks if degradation found. Returns current trend. */\n checkAndNotify(): PerformanceTrend {\n const trend = this.getTrend()\n if (trend.degradationDetected) {\n const trigger: EvolutionTrigger = {\n reason: `Success rate dropped to ${(trend.rolling.successRate * 100).toFixed(0)}% in last ${trend.rolling.windowSize} steps (direction: ${trend.rolling.direction})`,\n type: \"degradation\",\n metrics: {\n recentRate: trend.rolling.successRate,\n overallRate: trend.overall.successRate,\n anomalyRatio: trend.anomalyCount / Math.max(trend.overall.total, 1),\n },\n }\n for (const cb of this.degradationCallbacks) {\n try { cb(trend, trigger) } catch { /* non-fatal */ }\n }\n }\n return trend\n }\n\n /**\n * Decide whether to auto-trigger evolution analysis.\n * Returns null if no trigger needed, or an EvolutionTrigger explaining why.\n */\n shouldEvolve(sessionId: string): EvolutionTrigger | null {\n const trend = this.getTrend()\n\n // Don't evolve twice in the same session\n if (this.lastEvolveSession === sessionId) return null\n\n // Cap total evolutions to prevent infinite loops\n if (this.evolveCount >= 5) return null\n\n // Trigger 1: Degradation\n if (trend.degradationDetected) {\n this.lastEvolveSession = sessionId\n this.evolveCount++\n return {\n reason: `Auto-evolution triggered by performance degradation: ${(trend.rolling.successRate * 100).toFixed(0)}% success rate in recent window`,\n type: \"degradation\",\n metrics: {\n recentRate: trend.rolling.successRate,\n overallRate: trend.overall.successRate,\n anomalyRatio: trend.anomalyCount / Math.max(trend.overall.total, 1),\n },\n }\n }\n\n // Trigger 2: Milestone \u2014 every 50 completed steps, auto-evolve\n if (this.results.length > 0 && this.results.length % 50 === 0) {\n this.lastEvolveSession = sessionId\n this.evolveCount++\n return {\n reason: `Milestone reached: ${this.results.length} steps completed. Periodic evolution analysis.`,\n type: \"milestone\",\n metrics: {\n recentRate: trend.rolling.successRate,\n overallRate: trend.overall.successRate,\n anomalyRatio: trend.anomalyCount / Math.max(trend.overall.total, 1),\n },\n }\n }\n\n return null\n }\n\n /** Reset state (for testing) */\n reset(): void {\n this.results = []\n this.lastEvolveSession = null\n this.evolveCount = 0\n }\n\n /** Get raw counts */\n getStats(): { totalResults: number; evolveCount: number; windowSize: number } {\n return {\n totalResults: this.results.length,\n evolveCount: this.evolveCount,\n windowSize: this.windowSize,\n }\n }\n}\n", "import type { Subtask } from \"./intent-parser.js\"\nimport { Executor } from \"./executor.js\"\nimport { Verifier } from \"./verifier.js\"\nimport { ErrorAnalyzer } from \"./error-analyzer.js\"\nimport { DependencyTracker } from \"../drift/dependency-tracker.js\"\nimport { LLMEngine } from \"./llm.js\"\n\nexport interface AgentLoopConfig {\n maxIterations: number\n autoRetry: boolean\n maxRetries: number\n verifyAfterEach: boolean\n}\n\nexport interface LoopResult {\n completedSteps: string[]\n failedSteps: string[]\n totalIterations: number\n success: boolean\n summary: string\n}\n\nexport interface LoopObserver {\n onStepStart(stepId: string, iteration: number): void\n onStepComplete(stepId: string, success: boolean, output: string): void\n onLoopComplete(result: LoopResult): void\n}\n\nexport class AgentLoop {\n private config: AgentLoopConfig\n private llm: LLMEngine\n private observers: LoopObserver[] = []\n\n constructor(llm: LLMEngine, config: Partial<AgentLoopConfig> = {}) {\n this.llm = llm\n this.config = {\n maxIterations: config.maxIterations ?? 20,\n autoRetry: config.autoRetry ?? true,\n maxRetries: config.maxRetries ?? 3,\n verifyAfterEach: config.verifyAfterEach ?? true,\n }\n }\n\n addObserver(observer: LoopObserver): void {\n this.observers.push(observer)\n }\n\n async runLoop(\n sessionId: string,\n executor: Executor,\n verifier: Verifier,\n errorAnalyzer: ErrorAnalyzer,\n depTracker: DependencyTracker,\n projectDir: string,\n stepExecutor: (step: Subtask) => Promise<{ success: boolean; output: string; filesModified: string[]; error?: string }>,\n fixExecutor?: (fix: string) => Promise<boolean>,\n ): Promise<LoopResult> {\n const completedSteps: string[] = []\n const failedSteps: string[] = []\n let iteration = 0\n\n while (iteration < this.config.maxIterations) {\n iteration++\n\n const nextStep = executor.getNextStep(sessionId)\n if (!nextStep) break\n\n let retryCount = 0\n let stepSuccess = false\n let stepOutput = \"\"\n\n while (retryCount <= this.config.maxRetries) {\n this.observers.forEach(o => o.onStepStart(nextStep.id, iteration))\n\n const result = await stepExecutor(nextStep)\n\n if (result.filesModified && result.filesModified.length > 0) {\n depTracker.recordChange(sessionId, nextStep.id, result.filesModified)\n }\n\n executor.recordResult(sessionId, {\n stepId: nextStep.id,\n success: result.success,\n output: result.output,\n filesModified: result.filesModified,\n error: result.error,\n })\n\n stepSuccess = result.success\n stepOutput = result.output\n\n if (stepSuccess) {\n if (this.config.verifyAfterEach) {\n const verifyResult = result.filesModified.length > 0\n ? verifier.verifyRelated(nextStep.id, projectDir, result.filesModified)\n : verifier.verifyAll(nextStep.id, projectDir)\n\n if (!verifyResult.passed) {\n stepSuccess = false\n stepOutput = `Verification failed: ${verifyResult.errors.join(\"\\n\")}`\n const analysis = await errorAnalyzer.analyzeDeep(stepOutput, result.filesModified)\n this.observers.forEach(o => o.onStepComplete(nextStep.id, false, analysis.suggestedFix))\n\n if (!this.config.autoRetry) break\n\n const repairResult = await this.attemptRepair(nextStep, stepOutput, analysis, fixExecutor)\n if (!repairResult) {\n retryCount++\n break\n }\n continue\n }\n }\n\n completedSteps.push(nextStep.id)\n this.observers.forEach(o => o.onStepComplete(nextStep.id, true, stepOutput))\n break\n }\n\n retryCount++\n this.observers.forEach(o => o.onStepComplete(nextStep.id, false, stepOutput))\n\n if (!this.config.autoRetry || retryCount > this.config.maxRetries) break\n\n const analysis = await errorAnalyzer.analyzeDeep(stepOutput, result.filesModified ?? [])\n const repairResult = await this.attemptRepair(nextStep, stepOutput, analysis, fixExecutor)\n if (!repairResult) break\n }\n\n if (!stepSuccess) {\n failedSteps.push(nextStep.id)\n }\n }\n\n const result: LoopResult = {\n completedSteps,\n failedSteps,\n totalIterations: iteration,\n success: failedSteps.length === 0,\n summary: `Completed ${completedSteps.length} steps, ${failedSteps.length} failed in ${iteration} iterations.`,\n }\n\n this.observers.forEach(o => o.onLoopComplete(result))\n return result\n }\n\n private async attemptRepair(\n step: Subtask,\n error: string,\n analysis: ReturnType<ErrorAnalyzer[\"analyze\"]>,\n fixExecutor?: (fix: string) => Promise<boolean>,\n ): Promise<boolean> {\n try {\n const llmAnalysis = await this.llm.analyzeError(error, [])\n if (llmAnalysis && llmAnalysis.category !== \"unknown\" && llmAnalysis.fix && llmAnalysis.fix !== \"Manual investigation needed\") {\n // If a fixExecutor is provided, try it. If it fails, still retry (the step executor\n // will get another chance with the error context).\n if (fixExecutor) {\n const fixed = await fixExecutor(llmAnalysis.fix).catch(() => false)\n if (fixed) return true\n }\n return true // retry step execution even if bash fix failed\n }\n } catch {\n // LLM repair failed, but we can still try basic fixes\n }\n\n // Compile/type/import errors are generally retryable - the step executor\n // will try again with the error signal\n if (analysis && (analysis.category === \"import\" || analysis.category === \"compile\" || analysis.category === \"type\")) {\n return true\n }\n return true // always allow retry for non-fatal errors\n }\n}\n", "import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, unlinkSync } from \"node:fs\"\nimport { resolve } from \"node:path\"\n\nexport interface PersistentState<T> {\n key: string\n data: T\n updatedAt: string\n}\n\nexport class PersistenceLayer {\n private baseDir: string\n private storeDir: string\n\n constructor(worktree: string) {\n this.baseDir = worktree || process.cwd()\n this.storeDir = resolve(this.baseDir, \".agentic\", \"store\")\n }\n\n save<T>(namespace: string, key: string, data: T): void {\n try { this.ensureDir() } catch { /* non-fatal */ }\n const dir = resolve(this.storeDir, namespace)\n if (!existsSync(dir)) { try { mkdirSync(dir, { recursive: true }) } catch { return } }\n\n const state: PersistentState<T> = {\n key,\n data,\n updatedAt: new Date().toISOString(),\n }\n writeFileSync(resolve(dir, `${key}.json`), JSON.stringify(state, null, 2), \"utf-8\")\n }\n\n load<T>(namespace: string, key: string): T | null {\n const filePath = resolve(this.storeDir, namespace, `${key}.json`)\n if (!existsSync(filePath)) return null\n try {\n const state = JSON.parse(readFileSync(filePath, \"utf-8\")) as PersistentState<T>\n return state.data\n } catch {\n return null\n }\n }\n\n loadAll<T>(namespace: string): PersistentState<T>[] {\n const dir = resolve(this.storeDir, namespace)\n if (!existsSync(dir)) return []\n const results: PersistentState<T>[] = []\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.isFile() && entry.name.endsWith(\".json\")) {\n try {\n const state = JSON.parse(readFileSync(resolve(dir, entry.name), \"utf-8\")) as PersistentState<T>\n results.push(state)\n } catch {\n // skip corrupted files\n }\n }\n }\n return results\n }\n\n delete(namespace: string, key: string): boolean {\n const filePath = resolve(this.storeDir, namespace, `${key}.json`)\n if (!existsSync(filePath)) return false\n try {\n unlinkSync(filePath)\n return true\n } catch {\n return false\n }\n }\n\n listKeys(namespace: string): string[] {\n const dir = resolve(this.storeDir, namespace)\n if (!existsSync(dir)) return []\n return readdirSync(dir, { withFileTypes: true })\n .filter(e => e.isFile() && e.name.endsWith(\".json\"))\n .map(e => e.name.replace(\".json\", \"\"))\n }\n\n private ensureDir(): void {\n if (!existsSync(this.storeDir)) {\n mkdirSync(this.storeDir, { recursive: true })\n }\n }\n}\n", "import type { LLMEngine } from \"../core/llm.js\"\nimport type { LocalEmbedder } from \"./local-embedder.js\"\nimport { createRequire } from \"node:module\"\n\nconst _require = createRequire(import.meta.url)\n\nexport type DocumentType = \"episode\" | \"skill\" | \"file\" | \"code\"\n\nexport interface DocumentMeta {\n type: DocumentType\n sessionId?: string\n tags?: string[]\n [key: string]: unknown\n}\n\nexport interface SearchResult {\n id: string\n content: string\n metadata: DocumentMeta\n score: number\n}\n\nexport type SearchMode = \"sparse\" | \"dense\" | \"hybrid\" | \"llm-rerank\"\n\n/**\n * Stop words dari package `stopword` (62 bahasa, zero deps).\n * Di-load lazy via require \u2014 esbuild akan bundle seluruh package.\n */\nlet stopWordModule: Record<string, string[]> | null = null\nlet stopWordLoadAttempted = false\n\nfunction loadStopWords(): Record<string, string[]> | null {\n if (stopWordLoadAttempted) return stopWordModule\n stopWordLoadAttempted = true\n try {\n stopWordModule = _require(\"stopword\") as Record<string, string[]>\n } catch {\n stopWordModule = null\n }\n return stopWordModule\n}\n\nconst combinedStopCache = new Map<string, Set<string>>()\n\nfunction getStopWordSet(langs: string[]): Set<string> {\n const key = [...langs].sort().join(\",\")\n const cached = combinedStopCache.get(key)\n if (cached) return cached\n\n const mod = loadStopWords()\n const words = new Set<string>()\n\n if (mod) {\n for (const lang of langs) {\n const arr = mod[lang]\n if (Array.isArray(arr)) {\n for (const w of arr) words.add(w)\n }\n }\n }\n\n // Fallback: minimal English + Indonesian stop words built-in\n if (words.size === 0) {\n const FALLBACK = new Set([\n \"yang\", \"dan\", \"di\", \"ke\", \"dari\", \"ini\", \"itu\", \"dan\", \"atau\",\n \"tidak\", \"adalah\", \"akan\", \"dengan\", \"untuk\", \"pada\", \"dalam\",\n \"the\", \"and\", \"is\", \"are\", \"was\", \"were\", \"be\", \"been\",\n \"a\", \"an\", \"to\", \"for\", \"of\", \"in\", \"on\", \"at\", \"by\", \"with\",\n \"this\", \"that\", \"these\", \"those\", \"it\", \"its\", \"we\", \"our\",\n \"you\", \"your\", \"they\", \"them\", \"their\", \"i\", \"me\", \"my\",\n ])\n for (const w of FALLBACK) words.add(w)\n }\n\n combinedStopCache.set(key, words)\n return words\n}\n\ninterface VectorEntry {\n id: string\n content: string\n metadata: DocumentMeta\n tfidf: Map<string, number>\n norm: number\n dense?: Float32Array\n}\n\nexport class VectorStore {\n private documents: Map<string, VectorEntry> = new Map()\n private vocabulary: Map<string, number> = new Map()\n private maxCacheSize = 100\n private searchCache: Map<string, SearchResult[]> = new Map()\n private semanticCache: Map<string, SearchResult[]> = new Map()\n private llmEngine: LLMEngine | null = null\n private embedder: LocalEmbedder | null = null\n private embedQueue: Array<{ id: string; content: string }> = []\n private embedProcessing = false\n /** Search weights \u2014 from config */\n private keywordWeight = 0.3\n private vectorWeight = 0.7\n /** Remote embedding config \u2014 dari config, bukan local embedder */\n private remoteEmbedModel: string | null = null\n private remoteEmbedEndpoint: string | null = null\n private remoteEmbedApiKey: string | null = null\n /** ISO 639-3 language codes for stop word filtering */\n private stopWordsLanguages: string[] = [\"ind\", \"eng\"]\n\n setLLM(llm: LLMEngine): void {\n this.llmEngine = llm\n }\n\n setEmbedder(embedder: LocalEmbedder): void {\n this.embedder = embedder\n }\n\n /** Set search weights from config \u2014 menggantikan hardcoded alpha */\n setSearchWeights(keyword: number, vector: number): void {\n this.keywordWeight = keyword\n this.vectorWeight = vector\n }\n\n /** Set remote embedding config \u2014 untuk full vector mode */\n setEmbeddingConfig(model: string, endpoint: string | null, apiKey: string | null): void {\n this.remoteEmbedModel = model\n this.remoteEmbedEndpoint = endpoint\n this.remoteEmbedApiKey = apiKey\n }\n\n /** Set stop word languages \u2014 dari config */\n setStopWordsLanguages(langs: string[]): void {\n if (langs.length > 0) this.stopWordsLanguages = langs\n }\n\n /** Get remote embedding config */\n getEmbeddingConfig(): { model: string; endpoint: string | null; apiKey: string | null } | null {\n if (!this.remoteEmbedModel) return null\n return { model: this.remoteEmbedModel, endpoint: this.remoteEmbedEndpoint, apiKey: this.remoteEmbedApiKey }\n }\n\n private queueDenseEmbed(id: string, content: string): void {\n if (!this.embedder) return\n this.embedQueue.push({ id, content })\n this.processEmbedQueue()\n }\n\n private async processEmbedQueue(): Promise<void> {\n if (this.embedProcessing || !this.embedder) return\n this.embedProcessing = true\n\n while (this.embedQueue.length > 0) {\n const batch = this.embedQueue.splice(0, 5)\n await Promise.all(batch.map(async ({ id, content }) => {\n try {\n const vec = await this.embedder!.embed(content)\n if (vec) {\n const doc = this.documents.get(id)\n if (doc) doc.dense = vec\n }\n } catch { /* skip failed embeddings */ }\n }))\n }\n\n this.embedProcessing = false\n }\n\n addDocument(id: string, content: string, metadata: DocumentMeta): void {\n const tokens = this.tokenize(content)\n const tf = new Map<string, number>()\n for (const t of tokens) {\n tf.set(t, (tf.get(t) ?? 0) + 1)\n }\n\n const existing = this.documents.get(id)\n if (existing) {\n for (const t of existing.tfidf.keys()) {\n const prev = this.vocabulary.get(t)\n if (prev !== undefined) {\n if (prev <= 1) this.vocabulary.delete(t)\n else this.vocabulary.set(t, prev - 1)\n }\n }\n }\n\n const tfs = tokenFreqToTF(tokens, tf)\n const totalDocs = this.documents.size + 1\n const tfidf = new Map<string, number>()\n for (const [term, tfVal] of tfs) {\n const df = (this.vocabulary.get(term) ?? 0) + 1\n const idf = Math.log((totalDocs) / df) + 1\n if (idf > 0) tfidf.set(term, tfVal * idf)\n }\n\n let norm = 0\n for (const v of tfidf.values()) norm += v * v\n norm = Math.sqrt(norm)\n\n this.documents.set(id, { id, content, metadata, tfidf, norm })\n\n for (const t of tokens) {\n this.vocabulary.set(t, (this.vocabulary.get(t) ?? 0) + 1)\n }\n\n this.searchCache.clear()\n this.semanticCache.clear()\n\n this.queueDenseEmbed(id, content)\n }\n\n search(query: string, topK = 5): SearchResult[] {\n return this.sparseSearch(query, topK)\n }\n\n async searchWithMode(query: string, topK = 5, mode: SearchMode = \"hybrid\"): Promise<SearchResult[]> {\n const cacheKey = `${mode}::${query}::${topK}`\n const cached = this.searchCache.get(cacheKey)\n if (cached) return cached\n\n if (this.documents.size === 0) return []\n\n let results: SearchResult[]\n\n switch (mode) {\n case \"dense\":\n results = await this.denseSearch(query, topK)\n break\n case \"hybrid\":\n results = await this.hybridSearch(query, topK)\n break\n case \"sparse\":\n default:\n results = this.sparseSearch(query, topK)\n break\n }\n\n if (this.searchCache.size >= this.maxCacheSize) {\n const firstKey = this.searchCache.keys().next().value\n if (firstKey !== undefined) this.searchCache.delete(firstKey)\n }\n this.searchCache.set(cacheKey, results)\n\n return results\n }\n\n private sparseSearch(query: string, topK: number): SearchResult[] {\n const queryTokens = this.tokenize(query)\n if (queryTokens.length === 0) return []\n\n const queryTF = new Map<string, number>()\n for (const t of queryTokens) {\n queryTF.set(t, (queryTF.get(t) ?? 0) + 1)\n }\n const qTf = tokenFreqToTF(queryTokens, queryTF)\n const totalDocs = this.documents.size\n\n let qNorm = 0\n const qWeight = new Map<string, number>()\n for (const [term, tfVal] of qTf) {\n const df = this.vocabulary.get(term) ?? 0\n const idf = df > 0 ? Math.log((totalDocs) / df) + 1 : 1\n const w = tfVal * idf\n qWeight.set(term, w)\n qNorm += w * w\n }\n qNorm = Math.sqrt(qNorm)\n if (qNorm === 0) return []\n\n const scores: SearchResult[] = []\n for (const doc of this.documents.values()) {\n let dot = 0\n for (const [term, qw] of qWeight) {\n const dw = doc.tfidf.get(term)\n if (dw) dot += qw * dw\n }\n const score = doc.norm > 0 ? dot / (qNorm * doc.norm) : 0\n if (score > 0.01) {\n scores.push({ id: doc.id, content: doc.content, metadata: { ...doc.metadata }, score })\n }\n }\n\n scores.sort((a, b) => b.score - a.score)\n return scores.slice(0, topK)\n }\n\n private async denseSearch(query: string, topK: number): Promise<SearchResult[]> {\n if (!this.embedder || !this.embedder.ready) {\n return this.sparseSearch(query, topK)\n }\n\n const hasDense = [...this.documents.values()].some(d => d.dense)\n if (!hasDense) return this.sparseSearch(query, topK)\n\n const qVec = await this.embedder.embed(query)\n if (!qVec) return this.sparseSearch(query, topK)\n\n const results: SearchResult[] = []\n for (const doc of this.documents.values()) {\n if (!doc.dense) continue\n let dot = 0, nA = 0, nB = 0\n for (let i = 0; i < doc.dense.length; i++) {\n const qv = qVec[i] ?? 0\n const dv = doc.dense[i] ?? 0\n dot += qv * dv\n nA += qv * qv\n nB += dv * dv\n }\n const sim = Math.sqrt(nA) * Math.sqrt(nB)\n const score = sim === 0 ? 0 : dot / sim\n if (score > 0.1) {\n results.push({ id: doc.id, content: doc.content, metadata: { ...doc.metadata }, score })\n }\n }\n\n results.sort((a, b) => b.score - a.score)\n return results.slice(0, topK)\n }\n\n private async hybridSearch(query: string, topK: number): Promise<SearchResult[]> {\n const [denseResults, sparseResults] = await Promise.all([\n this.denseSearch(query, Math.max(topK * 3, 15)),\n Promise.resolve(this.sparseSearch(query, Math.max(topK * 3, 15))),\n ])\n\n const combined = new Map<string, { sparseScore: number; denseScore: number; result: SearchResult }>()\n\n const maxSparse = sparseResults[0]?.score ?? 1\n for (const r of sparseResults) {\n combined.set(r.id, { sparseScore: r.score / maxSparse, denseScore: 0, result: r })\n }\n\n const maxDense = denseResults[0]?.score ?? 1\n for (const r of denseResults) {\n const existing = combined.get(r.id)\n if (existing) {\n existing.denseScore = r.score / maxDense\n } else {\n combined.set(r.id, { sparseScore: 0, denseScore: r.score / maxDense, result: r })\n }\n }\n\n const alpha = this.keywordWeight\n const results = [...combined.values()]\n .map(({ sparseScore, denseScore, result }) => ({\n ...result,\n score: (this.keywordWeight) * sparseScore + (this.vectorWeight) * denseScore,\n }))\n .sort((a, b) => b.score - a.score)\n .slice(0, topK)\n\n return results\n }\n\n async semanticSearch(query: string, topK = 5): Promise<SearchResult[]> {\n if (this.documents.size === 0) return []\n\n const cached = this.semanticCache.get(`${query}::${topK}`)\n if (cached) return cached\n\n const candidateCount = Math.max(topK * 2, 10)\n const hybridResults = await this.hybridSearch(query, candidateCount)\n\n if (!this.llmEngine || hybridResults.length <= topK) {\n const results = hybridResults.slice(0, topK)\n this.semanticCache.set(`${query}::${topK}`, results)\n return results\n }\n\n try {\n const docList = hybridResults.map((r, i) => `[${i}] ${r.content.slice(0, 200)}`).join(\"\\n\")\n const resp = await this.llmEngine.call({\n systemPrompt: \"You are a search relevance ranker. Given a query and a list of documents, rank the documents by relevance. Return ONLY a JSON array of document indices in descending relevance order (most relevant first), e.g. [3, 0, 7].\",\n userPrompt: `Query: \"${query}\"\\n\\nDocuments:\\n${docList}\\n\\nReturn indices sorted by relevance as JSON array.`,\n jsonMode: true,\n temperature: 0,\n maxTokens: 256,\n })\n\n const rankings: number[] = JSON.parse(resp.content)\n const reranked: SearchResult[] = []\n const seen = new Set<number>()\n\n for (const idx of rankings) {\n if (idx >= 0 && idx < hybridResults.length && !seen.has(idx)) {\n reranked.push({ ...hybridResults[idx], score: 1 - reranked.length / rankings.length })\n seen.add(idx)\n }\n }\n for (let i = 0; i < hybridResults.length; i++) {\n if (!seen.has(i)) reranked.push({ ...hybridResults[i], score: 0.1 })\n }\n\n const results = reranked.slice(0, topK)\n this.semanticCache.set(`${query}::${topK}`, results)\n return results\n } catch {\n const results = hybridResults.slice(0, topK)\n this.semanticCache.set(`${query}::${topK}`, results)\n return results\n }\n }\n\n searchByType(query: string, type: DocumentType, topK = 5): SearchResult[] {\n const results = this.search(query, topK * 2)\n return results.filter(r => r.metadata.type === type).slice(0, topK)\n }\n\n async semanticSearchByType(query: string, type: DocumentType, topK = 5): Promise<SearchResult[]> {\n const results = await this.semanticSearch(query, topK * 2)\n return results.filter(r => r.metadata.type === type).slice(0, topK)\n }\n\n removeDocument(id: string): boolean {\n const entry = this.documents.get(id)\n if (!entry) return false\n for (const t of entry.tfidf.keys()) {\n const prev = this.vocabulary.get(t)\n if (prev !== undefined) {\n if (prev <= 1) this.vocabulary.delete(t)\n else this.vocabulary.set(t, prev - 1)\n }\n }\n this.documents.delete(id)\n this.searchCache.clear()\n this.semanticCache.clear()\n return true\n }\n\n size(): number { return this.documents.size }\n clear(): void { this.documents.clear(); this.vocabulary.clear(); this.searchCache.clear(); this.semanticCache.clear() }\n clearCache(): void { this.searchCache.clear(); this.semanticCache.clear() }\n\n private tokenize(text: string): string[] {\n const stopWords = getStopWordSet(this.stopWordsLanguages)\n // Unicode-aware tokenizer: dukung semua script (Latin, Arab, CJK, dll)\n // \\p{L} = any Unicode letter, \\p{N} = any Unicode number\n return text.toLowerCase()\n .split(/[^\\p{L}\\p{N}_]+/u)\n .filter(t => t.length > 1 && !stopWords.has(t))\n }\n}\n\nfunction tokenFreqToTF(tokens: string[], tf: Map<string, number>): Map<string, number> {\n const len = tokens.length\n const result = new Map<string, number>()\n for (const [t, c] of tf) {\n result.set(t, c / len)\n }\n return result\n}\n", "export interface ModelStats {\n model: string\n totalCalls: number\n successCalls: number\n failedCalls: number\n hallucinationCount: number\n avgLatencyMs: number\n lastUsed: number\n consecutiveFailures: number\n consecutiveSuccesses: number\n quarantineUntil: number\n byTaskType?: Record<string, Omit<ModelStats, 'model' | 'byTaskType'>>\n}\n\nexport interface ModelScore {\n model: string\n reliability: number\n hallucinationRate: number\n totalCalls: number\n status: \"healthy\" | \"degraded\" | \"unstable\"\n}\n\nexport class ModelRegistry {\n private stats = new Map<string, ModelStats>()\n private modelAliases: Map<string, string[]> = new Map()\n\n private readonly maxConsecutiveFailures = 3\n\n constructor() {\n this.modelAliases.set(\"fast\", [])\n this.modelAliases.set(\"capable\", [])\n }\n\n registerAlias(alias: string, models: string[]): void {\n this.modelAliases.set(alias, models)\n }\n\n addModel(name: string): void {\n if (!this.stats.has(name)) {\n this.stats.set(name, {\n model: name,\n totalCalls: 0,\n successCalls: 0,\n failedCalls: 0,\n hallucinationCount: 0,\n avgLatencyMs: 0,\n lastUsed: 0,\n consecutiveFailures: 0,\n consecutiveSuccesses: 0,\n quarantineUntil: 0,\n byTaskType: {},\n })\n }\n }\n\n recordCall(model: string, success: boolean, latencyMs: number, taskType?: string): void {\n this.addModel(model)\n const stat = this.stats.get(model)!\n stat.totalCalls++\n stat.lastUsed = Date.now()\n\n if (success) {\n stat.successCalls++\n stat.consecutiveFailures = 0\n stat.consecutiveSuccesses++\n \n const score = this.getScore(model)\n if (stat.quarantineUntil > 0 && stat.consecutiveSuccesses >= 3 && stat.totalCalls >= 5 && score && score.hallucinationRate < 0.2) {\n stat.quarantineUntil = 0\n }\n } else {\n stat.failedCalls++\n stat.consecutiveFailures++\n stat.consecutiveSuccesses = 0\n \n if (stat.consecutiveFailures >= 5) {\n this.enterQuarantine(model, 30)\n }\n }\n\n stat.avgLatencyMs = stat.avgLatencyMs === 0\n ? latencyMs\n : (stat.avgLatencyMs * (stat.totalCalls - 1) + latencyMs) / stat.totalCalls\n\n // Record per-task-type stats if taskType provided\n if (taskType && stat.byTaskType) {\n if (!stat.byTaskType[taskType]) {\n stat.byTaskType[taskType] = {\n totalCalls: 0,\n successCalls: 0,\n failedCalls: 0,\n hallucinationCount: 0,\n avgLatencyMs: 0,\n lastUsed: 0,\n consecutiveFailures: 0,\n consecutiveSuccesses: 0,\n quarantineUntil: 0,\n }\n }\n const taskStat = stat.byTaskType[taskType]\n taskStat.totalCalls++\n taskStat.lastUsed = Date.now()\n if (success) {\n taskStat.successCalls++\n taskStat.consecutiveFailures = 0\n } else {\n taskStat.failedCalls++\n taskStat.consecutiveFailures++\n }\n taskStat.avgLatencyMs = taskStat.avgLatencyMs === 0\n ? latencyMs\n : (taskStat.avgLatencyMs * (taskStat.totalCalls - 1) + latencyMs) / taskStat.totalCalls\n }\n }\n\n recordHallucination(model: string): void {\n this.addModel(model)\n const stat = this.stats.get(model)!\n stat.hallucinationCount++\n }\n\n getScore(model: string): ModelScore | null {\n const stat = this.stats.get(model)\n if (!stat || stat.totalCalls === 0) {\n return {\n model,\n reliability: 0.5,\n hallucinationRate: 0,\n totalCalls: 0,\n status: \"healthy\",\n }\n }\n\n const successRate = stat.successCalls / stat.totalCalls\n const hallucinationRate = stat.hallucinationCount / stat.totalCalls\n const reliability = Math.max(0, Math.min(1, successRate - hallucinationRate * 2))\n\n let status: ModelScore[\"status\"] = \"healthy\"\n if (stat.consecutiveFailures >= this.maxConsecutiveFailures) status = \"degraded\"\n if (hallucinationRate > 0.3 || successRate < 0.4) status = \"unstable\"\n\n return { model, reliability, hallucinationRate, totalCalls: stat.totalCalls, status }\n }\n\n getScoreByTaskType(model: string, taskType: string): ModelScore | null {\n const stat = this.stats.get(model)\n if (!stat || !stat.byTaskType || !stat.byTaskType[taskType]) {\n return {\n model,\n reliability: 0.5,\n hallucinationRate: 0,\n totalCalls: 0,\n status: \"healthy\",\n }\n }\n\n const taskStat = stat.byTaskType[taskType]\n if (taskStat.totalCalls === 0) {\n return {\n model,\n reliability: 0.5,\n hallucinationRate: 0,\n totalCalls: 0,\n status: \"healthy\",\n }\n }\n\n const successRate = taskStat.successCalls / taskStat.totalCalls\n const hallucinationRate = taskStat.hallucinationCount / taskStat.totalCalls\n const reliability = Math.max(0, Math.min(1, successRate - hallucinationRate * 2))\n\n let status: ModelScore[\"status\"] = \"healthy\"\n if (taskStat.consecutiveFailures >= this.maxConsecutiveFailures) status = \"degraded\"\n if (hallucinationRate > 0.3 || successRate < 0.4) status = \"unstable\"\n\n return { model, reliability, hallucinationRate, totalCalls: taskStat.totalCalls, status }\n }\n\n getAllScores(): ModelScore[] {\n const models = new Set<string>()\n for (const key of this.stats.keys()) models.add(key)\n for (const [, aliases] of this.modelAliases) {\n for (const m of aliases) models.add(m)\n }\n return [...models].map(m => this.getScore(m)!).sort((a, b) => b.reliability - a.reliability)\n }\n\n resolveAlias(alias: string): string[] {\n return this.modelAliases.get(alias) ?? (alias ? [alias] : [])\n }\n\n suggestWithFallback(role: string, preferredModels: string[] = []): string[] {\n const candidates = new Set<string>()\n\n for (const m of preferredModels) {\n const resolved = this.resolveAlias(m)\n for (const r of resolved) if (r) candidates.add(r)\n }\n\n for (const key of this.stats.keys()) candidates.add(key)\n\n if (candidates.size === 0) return [\"default\"]\n\n const scored = [...candidates]\n .map(m => ({ model: m, score: this.getScore(m) }))\n .sort((a, b) => {\n if (!a.score || !b.score) return 0\n if (a.score.status === \"healthy\" && b.score.status !== \"healthy\") return -1\n if (a.score.status !== \"healthy\" && b.score.status === \"healthy\") return 1\n return b.score.reliability - a.score.reliability\n })\n\n return scored.map(s => s.model)\n }\n\n isBlocked(model: string, config: { hardBlockReliability: number; softBlockReliability: number; minSampleSize: number }): { blocked: boolean; reason: string; severity: \"hard\" | \"soft\" | null } {\n const stat = this.stats.get(model)\n if (!stat) return { blocked: false, reason: \"\", severity: null }\n\n if (stat.quarantineUntil > 0 && Date.now() < stat.quarantineUntil) {\n const remainingMinutes = Math.ceil((stat.quarantineUntil - Date.now()) / (60 * 1000))\n return { blocked: true, reason: `In quarantine for ${remainingMinutes} more minutes`, severity: \"hard\" }\n }\n\n if (stat.totalCalls < config.minSampleSize) {\n return { blocked: false, reason: \"\", severity: null }\n }\n\n const score = this.getScore(model)\n if (!score) return { blocked: false, reason: \"\", severity: null }\n\n if (score.reliability < config.hardBlockReliability) {\n return { blocked: true, reason: `Reliability ${(score.reliability * 100).toFixed(0)}% < ${(config.hardBlockReliability * 100).toFixed(0)}%`, severity: \"hard\" }\n }\n if (stat.consecutiveFailures >= 5) {\n return { blocked: true, reason: `${stat.consecutiveFailures} consecutive failures`, severity: \"hard\" }\n }\n if (score.hallucinationRate > 0.5) {\n return { blocked: true, reason: `Hallucination rate ${(score.hallucinationRate * 100).toFixed(0)}% > 50%`, severity: \"hard\" }\n }\n\n if (score.reliability < config.softBlockReliability) {\n return { blocked: true, reason: `Reliability ${(score.reliability * 100).toFixed(0)}% < ${(config.softBlockReliability * 100).toFixed(0)}%`, severity: \"soft\" }\n }\n\n return { blocked: false, reason: \"\", severity: null }\n }\n\n selectBestModel(\n taskType: string, \n availableModels: string[], \n blockingConfig?: { hardBlockReliability: number; softBlockReliability: number; minSampleSize: number }\n ): string {\n if (availableModels.length === 0) return \"default\"\n if (availableModels.length === 1) return availableModels[0]\n\n const scored = availableModels\n .map(model => {\n const resolvedModels = this.resolveAlias(model)\n if (resolvedModels.length === 0) return { model, score: null, blocked: false }\n \n const bestResolved = resolvedModels\n .map(m => {\n const blockStatus = blockingConfig \n ? this.isBlocked(m, blockingConfig)\n : { blocked: false, reason: \"\", severity: null }\n return { \n model: m, \n score: this.getScoreByTaskType(m, taskType),\n blocked: blockStatus.blocked && blockStatus.severity === \"hard\"\n }\n })\n .filter(s => !s.blocked)\n .sort((a, b) => {\n if (!a.score || !b.score) return 0\n if (a.score.status === \"healthy\" && b.score.status !== \"healthy\") return -1\n if (a.score.status !== \"healthy\" && b.score.status === \"healthy\") return 1\n return b.score.reliability - a.score.reliability\n })[0]\n \n return bestResolved\n })\n .filter(s => s && s.score !== null)\n .sort((a, b) => {\n if (!a.score || !b.score) return 0\n if (a.score.status === \"healthy\" && b.score.status !== \"healthy\") return -1\n if (a.score.status !== \"healthy\" && b.score.status === \"healthy\") return 1\n return b.score.reliability - a.score.reliability\n })\n\n return scored.length > 0 ? scored[0].model : availableModels[0]\n }\n\n selectWithFallback(\n taskType: string,\n availableModels: string[],\n blockingConfig: { hardBlockReliability: number; softBlockReliability: number; minSampleSize: number }\n ): { model: string; tier: \"healthy\" | \"degraded\" | \"unstable\" | \"reset\"; warnings: string[] } {\n if (availableModels.length === 0) {\n return { model: \"default\", tier: \"reset\", warnings: [\"No models available, using default\"] }\n }\n\n const warnings: string[] = []\n const categorized: { healthy: string[]; degraded: string[]; unstable: string[]; hardBlocked: string[] } = {\n healthy: [],\n degraded: [],\n unstable: [],\n hardBlocked: []\n }\n\n for (const model of availableModels) {\n const blockStatus = this.isBlocked(model, blockingConfig)\n if (blockStatus.blocked && blockStatus.severity === \"hard\") {\n categorized.hardBlocked.push(model)\n warnings.push(`${model}: HARD BLOCKED - ${blockStatus.reason}`)\n continue\n }\n\n const score = this.getScore(model)\n if (!score || score.totalCalls < blockingConfig.minSampleSize) {\n categorized.healthy.push(model)\n } else if (score.status === \"healthy\") {\n categorized.healthy.push(model)\n } else if (score.status === \"degraded\") {\n categorized.degraded.push(model)\n } else {\n categorized.unstable.push(model)\n }\n }\n\n if (categorized.healthy.length > 0) {\n return { model: categorized.healthy[0], tier: \"healthy\", warnings }\n }\n\n if (categorized.degraded.length > 0) {\n warnings.push(`Using degraded model ${categorized.degraded[0]} - all healthy models unavailable`)\n return { model: categorized.degraded[0], tier: \"degraded\", warnings }\n }\n\n if (categorized.unstable.length > 0) {\n warnings.push(`Using unstable model ${categorized.unstable[0]} - all healthy/degraded models unavailable`)\n return { model: categorized.unstable[0], tier: \"unstable\", warnings }\n }\n\n const leastBadModel = availableModels[0]\n this.resetModel(leastBadModel)\n warnings.push(`All models blocked - reset ${leastBadModel} and retrying`)\n return { model: leastBadModel, tier: \"reset\", warnings }\n }\n\n resetModel(model: string): void {\n const stat = this.stats.get(model)\n if (!stat) return\n \n stat.totalCalls = 0\n stat.successCalls = 0\n stat.failedCalls = 0\n stat.hallucinationCount = 0\n stat.consecutiveFailures = 0\n stat.byTaskType = {}\n }\n\n resetStaleModels(staleDays: number = 7): string[] {\n const now = Date.now()\n const staleThreshold = staleDays * 24 * 60 * 60 * 1000\n const resetModels: string[] = []\n\n for (const [model, stat] of this.stats.entries()) {\n if (stat.lastUsed > 0 && (now - stat.lastUsed) > staleThreshold) {\n this.resetModel(model)\n resetModels.push(model)\n }\n }\n\n return resetModels\n }\n\n enterQuarantine(model: string, durationMinutes: number = 30): void {\n const stat = this.stats.get(model)\n if (!stat) return\n \n stat.quarantineUntil = Date.now() + (durationMinutes * 60 * 1000)\n stat.consecutiveSuccesses = 0\n }\n\n getSummary(): string {\n const scores = this.getAllScores()\n if (scores.length === 0) return \"No model data recorded yet.\"\n\n return scores.map(s => {\n const icon = s.status === \"healthy\" ? \"\u2705\" : s.status === \"degraded\" ? \"\u26A0\uFE0F\" : \"\u274C\"\n return `${icon} **${s.model}** \u2014 reliability: ${(s.reliability * 100).toFixed(0)}%, hallucinations: ${(s.hallucinationRate * 100).toFixed(0)}%, calls: ${s.totalCalls}`\n }).join(\"\\n\")\n }\n\n toJSON(): Record<string, ModelStats> {\n return Object.fromEntries(this.stats)\n }\n\n fromJSON(data: Record<string, ModelStats>): void {\n for (const [key, val] of Object.entries(data)) {\n this.stats.set(key, val)\n }\n }\n}\n", "import { readFileSync, writeFileSync, mkdirSync, existsSync, watch } from \"node:fs\"\nimport { join } from \"node:path\"\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Schema\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport interface EmbeddingConfig {\n /** Model name, e.g. \"text-embedding-3-small\", \"nomic-embed-text\" */\n model: string\n /** Embedding endpoint \u2014 null berarti pakai base URL dari provider utama */\n endpoint: string | null\n /** API key \u2014 null berarti pakai key dari provider utama */\n apiKey: string | null\n}\n\nexport interface MemoryConfig {\n enabled: boolean\n /** \"lightweight\" (TF-IDF, no deps) | \"full\" (vector embedding) */\n mode: \"lightweight\" | \"full\"\n maxEntries: number\n compressThreshold: number\n forgetAfterDays: number\n /** ISO 639-3 language codes for stop word filtering */\n stopWordsLanguages: string[]\n search: {\n keywordWeight: number\n vectorWeight: number\n }\n}\n\nexport interface AgentConfig {\n maxDelegationDepth: number\n autoSkillExtract: boolean\n defaultRole: string\n requireSemanticCheck: boolean\n autoHallucinationCheck: boolean\n blockOnHallucination: boolean\n hallucinationThreshold: number\n hardBlockReliability: number\n softBlockReliability: number\n minSampleSize: number\n}\n\nexport interface StorageConfig {\n traceRetentionDays: number\n skillMaxCount: number\n}\n\nexport interface AgenticConfigSchema {\n $schema: string\n /** Embedding \u2014 null = lightweight mode */\n embedding: EmbeddingConfig | null\n memory: MemoryConfig\n agent: AgentConfig\n storage: StorageConfig\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Defaults\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const DEFAULT_CONFIG: AgenticConfigSchema = {\n $schema: \"v1\",\n embedding: null,\n memory: {\n enabled: true,\n mode: \"lightweight\",\n maxEntries: 1000,\n compressThreshold: 500,\n forgetAfterDays: 30,\n stopWordsLanguages: [\"ind\", \"eng\"],\n search: {\n keywordWeight: 0.3,\n vectorWeight: 0.7,\n },\n },\n agent: {\n maxDelegationDepth: 3,\n autoSkillExtract: true,\n defaultRole: \"developer\",\n requireSemanticCheck: false,\n autoHallucinationCheck: true,\n blockOnHallucination: false,\n hallucinationThreshold: 0.3,\n hardBlockReliability: 0.2,\n softBlockReliability: 0.4,\n minSampleSize: 5,\n },\n storage: {\n traceRetentionDays: 7,\n skillMaxCount: 200,\n },\n}\n\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n// Loader\n// \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport class ConfigLoader {\n private config: AgenticConfigSchema\n private readonly configPath: string\n private readonly worktree: string\n private watcher: ReturnType<typeof watch> | null = null\n private listeners: Array<(config: AgenticConfigSchema) => void> = []\n\n constructor(worktree: string) {\n this.worktree = worktree || process.cwd()\n this.configPath = join(this.worktree, \".agentic\", \"config.json\")\n this.config = { ...DEFAULT_CONFIG }\n }\n\n /** Load config from file, auto-create default if missing */\n load(): AgenticConfigSchema {\n try {\n if (!existsSync(this.configPath)) {\n this.save(DEFAULT_CONFIG)\n this.config = { ...DEFAULT_CONFIG }\n return this.config\n }\n\n const raw = readFileSync(this.configPath, \"utf-8\")\n const parsed = JSON.parse(raw)\n\n // Merge with defaults (so new fields always have values)\n this.config = this.mergeDeep({ ...DEFAULT_CONFIG }, parsed)\n return this.config\n } catch {\n // Parse error \u2014 fallback ke default\n this.config = { ...DEFAULT_CONFIG }\n return this.config\n }\n }\n\n /** Save config to file */\n save(config: AgenticConfigSchema): void {\n const dir = join(this.worktree, \".agentic\")\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true })\n }\n writeFileSync(this.configPath, JSON.stringify(config, null, 2), \"utf-8\")\n this.config = { ...config }\n }\n\n /** Get current config */\n get(): AgenticConfigSchema {\n return this.config\n }\n\n /** Update specific keys and persist */\n update(partial: Partial<AgenticConfigSchema>): AgenticConfigSchema {\n this.config = this.mergeDeep(this.config, partial)\n this.save(this.config)\n return this.config\n }\n\n /** Watch config file for changes */\n startWatch(): void {\n if (this.watcher) return\n try {\n this.watcher = watch(this.configPath, (eventType) => {\n if (eventType === \"change\") {\n this.load()\n for (const listener of this.listeners) {\n listener(this.config)\n }\n }\n })\n } catch {\n // File not exist yet or permission denied \u2014 skip watching\n }\n }\n\n /** Stop watching and clear all listeners */\n stopWatch(): void {\n if (this.watcher) {\n this.watcher.close()\n this.watcher = null\n }\n this.listeners = []\n }\n\n /** Listen for config changes. Returns an unsubscribe function. */\n onChange(listener: (config: AgenticConfigSchema) => void): () => void {\n this.listeners.push(listener)\n return () => {\n const idx = this.listeners.indexOf(listener)\n if (idx !== -1) this.listeners.splice(idx, 1)\n }\n }\n\n /** Check if full embedding is configured */\n hasEmbedding(): boolean {\n return this.config.embedding != null && !!this.config.embedding.model\n }\n\n /** Get effective memory mode \u2014 auto-switch to \"full\" if embedding configured */\n effectiveMemoryMode(): \"lightweight\" | \"full\" {\n if (this.hasEmbedding()) return \"full\"\n return this.config.memory.mode\n }\n\n /** Deep merge helper (simple version, no array merge) */\n private mergeDeep<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const result = { ...target }\n for (const key of Object.keys(source) as Array<keyof T>) {\n const val = source[key]\n if (val !== undefined && val !== null && typeof val === \"object\" && !Array.isArray(val)) {\n result[key] = this.mergeDeep(result[key] as Record<string, any>, val as Record<string, any>) as T[keyof T]\n } else if (val !== undefined) {\n result[key] = val as T[keyof T]\n }\n }\n return result\n }\n}\n", "/**\n * PatternDiscovery \u2014 cross-session pattern analysis for self-evolving agents.\n *\n * Analyzes episodic memory, error history, file changes, and skill usage\n * across sessions to identify recurring issues, systemic improvements,\n * and actionable recommendations.\n *\n * Aligns with the paper's vision of agents that learn from collective\n * experience rather than operating in isolation.\n */\n\nimport type { Episode } from \"../memory/episodic-store.js\"\nimport type { StepResult } from \"../evolution/continuous-evolution.js\"\n\n// \u2500\u2500 Interfaces \u2500\u2500\n\nexport interface ErrorPattern {\n /** Error category (compile, type, import, test, runtime) */\n category: string\n /** Number of distinct sessions where this error occurred */\n sessionCount: number\n /** Total occurrences across all sessions */\n totalOccurrences: number\n /** Percentage of sessions that experienced this error */\n sessionAffinity: number\n /** Most recent occurrence timestamp */\n lastOccurrence: string\n /** Actionable suggestion */\n suggestion: string\n /** Example session IDs */\n sampleSessions: string[]\n}\n\nexport interface FilePattern {\n /** File path (relative) */\n filePath: string\n /** Number of sessions where this file was modified */\n sessionCount: number\n /** Total modifications across sessions */\n totalChanges: number\n /** Files frequently changed together with this one (co-change frequency) */\n coChangedFiles: Array<{ filePath: string; coOccurrences: number }>\n /** Whether this file is a \"hot spot\" (frequently changed, high risk) */\n isHotSpot: boolean\n /** Suggestion */\n suggestion: string\n}\n\nexport interface SessionOutcomePattern {\n /** Description of the pattern */\n description: string\n /** Outcome statistics for sessions matching this pattern */\n outcomeStats: { total: number; success: number; partial: number; failed: number }\n /** Number of sessions matching */\n matchingSessions: number\n /** Success rate among matching sessions */\n successRate: number\n /** Tags or characteristics common to these sessions */\n commonTags: string[]\n /** Trend over time */\n trend: \"improving\" | \"degrading\" | \"stable\"\n /** Actionable insight */\n insight: string\n}\n\nexport interface SkillEffectiveness {\n /** Skill name */\n skillName: string\n /** Current success rate (0-1) */\n successRate: number\n /** Usage count */\n usageCount: number\n /** Success rate trend: recent 5 vs overall */\n recentTrend: \"improving\" | \"degrading\" | \"stable\" | \"insufficient_data\"\n /** Whether this skill should be reviewed or promoted */\n status: \"healthy\" | \"needs_review\" | \"underperforming\" | \"highly_effective\"\n /** Suggestion */\n suggestion: string\n}\n\nexport interface Recommendation {\n /** Priority level */\n priority: \"high\" | \"medium\" | \"low\"\n /** Category of recommendation */\n category: \"error_prevention\" | \"architecture\" | \"testing\" | \"process\" | \"skill\" | \"infrastructure\"\n /** Human-readable description */\n description: string\n /** Concrete action to take */\n action: string\n /** Number of sessions affected by this issue */\n affectedSessions: number\n}\n\nexport interface PatternReport {\n /** When the analysis was generated */\n timestamp: string\n /** Number of sessions analyzed */\n totalSessions: number\n /** Error patterns found */\n errorPatterns: ErrorPattern[]\n /** File change patterns found */\n filePatterns: FilePattern[]\n /** Session outcome patterns found */\n sessionPatterns: SessionOutcomePattern[]\n /** Skill effectiveness analysis */\n skillEffectiveness: SkillEffectiveness[]\n /** Actionable recommendations */\n recommendations: Recommendation[]\n}\n\n// \u2500\u2500 PatternDiscovery Class \u2500\u2500\n\nexport class PatternDiscovery {\n /**\n * Generate a comprehensive pattern report from session data.\n *\n * @param episodes All recorded episodes (cross-session memory)\n * @param stepResults Step execution results (from ContinuousEvolution)\n * @param skills Known skills with usage stats\n * @param options Analysis options\n */\n analyze(\n episodes: Episode[],\n stepResults: StepResult[] = [],\n skills: Array<{ name: string; successRate: number; usageCount: number }> = [],\n options: { minSessions?: number; hotSpotThreshold?: number } = {},\n ): PatternReport {\n const minSessions = options.minSessions ?? 2\n const hotSpotThreshold = options.hotSpotThreshold ?? 3\n const sessionIds = [...new Set(episodes.map(e => e.sessionId))]\n\n const errorPatterns = this.analyzeErrors(episodes, stepResults, sessionIds, minSessions)\n const filePatterns = this.analyzeFiles(episodes, sessionIds, hotSpotThreshold)\n const sessionPatterns = this.analyzeSessionOutcomes(episodes, sessionIds)\n const skillEffectiveness = this.analyzeSkills(skills)\n const recommendations = this.generateRecommendations({\n errorPatterns,\n filePatterns,\n sessionPatterns,\n skillEffectiveness,\n episodes,\n sessionIds,\n })\n\n return {\n timestamp: new Date().toISOString(),\n totalSessions: sessionIds.length,\n errorPatterns,\n filePatterns,\n sessionPatterns,\n skillEffectiveness,\n recommendations,\n }\n }\n\n // \u2500\u2500 Error Pattern Analysis \u2500\u2500\n\n private analyzeErrors(\n episodes: Episode[],\n stepResults: StepResult[],\n sessionIds: string[],\n minSessions: number,\n ): ErrorPattern[] {\n // Collect error categories from step results\n const errorByCategory = new Map<string, {\n sessions: Set<string>\n count: number\n lastTimestamp: number\n }>()\n\n for (const r of stepResults) {\n if (r.success) continue\n const cat = r.category ?? \"unknown\"\n let entry = errorByCategory.get(cat)\n if (!entry) {\n entry = { sessions: new Set(), count: 0, lastTimestamp: 0 }\n errorByCategory.set(cat, entry)\n }\n entry.sessions.add(r.sessionId)\n entry.count++\n if (r.timestamp > entry.lastTimestamp) entry.lastTimestamp = r.timestamp\n }\n\n // Also infer errors from failed episodes\n for (const ep of episodes) {\n if (ep.outcome === \"failed\" || ep.outcome === \"partial\") {\n // Try to extract error category from plan goal\n const goal = ep.planGoal.toLowerCase()\n const inferredCat = this.inferCategory(goal)\n if (inferredCat) {\n let entry = errorByCategory.get(inferredCat)\n if (!entry) {\n entry = { sessions: new Set(), count: 0, lastTimestamp: 0 }\n errorByCategory.set(inferredCat, entry)\n }\n entry.sessions.add(ep.sessionId)\n entry.count++\n }\n }\n }\n\n const totalSessions = sessionIds.length\n const patterns: ErrorPattern[] = []\n\n for (const [category, data] of errorByCategory) {\n if (data.sessions.size < minSessions) continue\n\n patterns.push({\n category,\n sessionCount: data.sessions.size,\n totalOccurrences: data.count,\n sessionAffinity: totalSessions > 0 ? data.sessions.size / totalSessions : 0,\n lastOccurrence: new Date(data.lastTimestamp).toISOString(),\n suggestion: this.suggestErrorFix(category),\n sampleSessions: [...data.sessions].slice(0, 3),\n })\n }\n\n // Sort by session count descending\n patterns.sort((a, b) => b.sessionCount - a.sessionCount)\n return patterns\n }\n\n // \u2500\u2500 File Change Pattern Analysis \u2500\u2500\n\n private analyzeFiles(\n episodes: Episode[],\n sessionIds: string[],\n hotSpotThreshold: number,\n ): FilePattern[] {\n // Track file changes per session\n const fileSessions = new Map<string, Set<string>>() // filePath \u2192 Set<sessionId>\n const fileChanges = new Map<string, number>() // filePath \u2192 total changes\n const coChangeMatrix = new Map<string, Map<string, number>>() // filePath \u2192 { coFile \u2192 count }\n\n for (const ep of episodes) {\n const files = ep.filesChanged\n if (files.length === 0) continue\n\n for (const file of files) {\n // Track sessions per file\n let sessions = fileSessions.get(file)\n if (!sessions) {\n sessions = new Set()\n fileSessions.set(file, sessions)\n }\n sessions.add(ep.sessionId)\n\n // Track total changes\n fileChanges.set(file, (fileChanges.get(file) ?? 0) + 1)\n\n // Track co-changes\n for (const other of files) {\n if (other === file) continue\n let matrix = coChangeMatrix.get(file)\n if (!matrix) {\n matrix = new Map()\n coChangeMatrix.set(file, matrix)\n }\n matrix.set(other, (matrix.get(other) ?? 0) + 1)\n }\n }\n }\n\n const totalSessions = sessionIds.length\n const patterns: FilePattern[] = []\n\n for (const [filePath, sessions] of fileSessions) {\n if (sessions.size < 2) continue // skip files changed in only 1 session\n\n const coChanged: Array<{ filePath: string; coOccurrences: number }> = []\n const matrix = coChangeMatrix.get(filePath)\n if (matrix) {\n for (const [coFile, count] of matrix) {\n coChanged.push({ filePath: coFile, coOccurrences: count })\n }\n coChanged.sort((a, b) => b.coOccurrences - a.coOccurrences)\n }\n\n const totalChanges = fileChanges.get(filePath) ?? sessions.size\n\n patterns.push({\n filePath,\n sessionCount: sessions.size,\n totalChanges,\n coChangedFiles: coChanged.slice(0, 5), // top 5 co-changed\n isHotSpot: sessions.size >= hotSpotThreshold,\n suggestion: this.suggestFileAction(filePath, sessions.size, totalSessions, coChanged.length),\n })\n }\n\n // Sort: hot spots first, then by session count\n patterns.sort((a, b) => {\n if (a.isHotSpot && !b.isHotSpot) return -1\n if (!a.isHotSpot && b.isHotSpot) return 1\n return b.sessionCount - a.sessionCount\n })\n\n return patterns\n }\n\n // \u2500\u2500 Session Outcome Pattern Analysis \u2500\u2500\n\n private analyzeSessionOutcomes(\n episodes: Episode[],\n sessionIds: string[],\n ): SessionOutcomePattern[] {\n const patterns: SessionOutcomePattern[] = []\n\n if (sessionIds.length < 3) return patterns\n\n // Pattern 1: Sessions with many file changes tend to fail more\n const highChangeSessions = episodes.filter(e =>\n e.filesChanged.length >= 5 && sessionIds.includes(e.sessionId)\n )\n if (highChangeSessions.length >= 2) {\n const outcomes = this.countOutcomes(highChangeSessions)\n const successRate = outcomes.total > 0 ? outcomes.success / outcomes.total : 0\n patterns.push({\n description: \"High file churn sessions (>5 files changed) have lower success rates\",\n outcomeStats: outcomes,\n matchingSessions: highChangeSessions.length,\n successRate,\n commonTags: [\"high-churn\", \"large-change\"],\n trend: this.computeTrend(highChangeSessions),\n insight: successRate < 0.6\n ? \"Large changes tend to fail. Consider breaking into smaller, independent steps.\"\n : \"Large changes are handled well. Keep current decomposition strategy.\",\n })\n }\n\n // Pattern 2: Sessions with specific tags\n const tagGroups = this.groupByTags(episodes, sessionIds)\n for (const [tag, tagEpisodes] of tagGroups) {\n if (tagEpisodes.length < 2) continue\n const outcomes = this.countOutcomes(tagEpisodes)\n const successRate = outcomes.total > 0 ? outcomes.success / outcomes.total : 0\n patterns.push({\n description: `Sessions tagged \"${tag}\" have ${(successRate * 100).toFixed(0)}% success rate`,\n outcomeStats: outcomes,\n matchingSessions: tagEpisodes.length,\n successRate,\n commonTags: [tag],\n trend: this.computeTrend(tagEpisodes),\n insight: successRate < 0.5\n ? `Tasks involving \"${tag}\" frequently fail. Consider adding targeted verification or pre-checks.`\n : `Tasks involving \"${tag}\" perform well. Consider extracting as a reusable pattern.`,\n })\n }\n\n // Pattern 3: Sessions with \"refactor\" or \"migration\" in goal\n const refactorSessions = episodes.filter(e =>\n (e.planGoal.toLowerCase().includes(\"refactor\") ||\n e.planGoal.toLowerCase().includes(\"migrate\") ||\n e.planGoal.toLowerCase().includes(\"extract\")) &&\n sessionIds.includes(e.sessionId)\n )\n if (refactorSessions.length >= 2) {\n const outcomes = this.countOutcomes(refactorSessions)\n patterns.push({\n description: \"Refactoring/migration sessions have mixed outcomes\",\n outcomeStats: outcomes,\n matchingSessions: refactorSessions.length,\n successRate: outcomes.total > 0 ? outcomes.success / outcomes.total : 0,\n commonTags: [\"refactor\", \"migration\"],\n trend: this.computeTrend(refactorSessions),\n insight: \"Refactoring tasks benefit from pre-change baseline tests and incremental commits.\",\n })\n }\n\n return patterns\n }\n\n // \u2500\u2500 Skill Effectiveness Analysis \u2500\u2500\n\n private analyzeSkills(\n skills: Array<{ name: string; successRate: number; usageCount: number }>,\n ): SkillEffectiveness[] {\n return skills.map(skill => {\n // Determine status based on success rate and usage\n let status: SkillEffectiveness[\"status\"]\n let suggestion: string\n\n if (skill.usageCount === 0) {\n status = \"needs_review\"\n suggestion = \"Skill has not been used yet. Consider testing with a suitable task.\"\n } else if (skill.successRate >= 0.9 && skill.usageCount >= 3) {\n status = \"highly_effective\"\n suggestion = \"Highly reliable skill. Consider marking as a 'trusted' pattern for auto-delegation.\"\n } else if (skill.successRate >= 0.7) {\n status = \"healthy\"\n suggestion = \"Skill performs well. Continue monitoring.\"\n } else if (skill.successRate >= 0.4) {\n status = \"needs_review\"\n suggestion = `Success rate is ${(skill.successRate * 100).toFixed(0)}%. Review the skill steps for edge cases or missing preconditions.`\n } else {\n status = \"underperforming\"\n suggestion = `Success rate is critically low (${(skill.successRate * 100).toFixed(0)}%). Consider retiring and replacing with a more reliable pattern.`\n }\n\n // Determine recent trend based on mock data or mark as insufficient\n const recentTrend: SkillEffectiveness[\"recentTrend\"] =\n skill.usageCount < 3 ? \"insufficient_data\" : skill.successRate >= 0.8 ? \"improving\" : skill.successRate >= 0.5 ? \"stable\" : \"degrading\"\n\n return {\n skillName: skill.name,\n successRate: skill.successRate,\n usageCount: skill.usageCount,\n recentTrend,\n status,\n suggestion,\n }\n })\n }\n\n // \u2500\u2500 Recommendation Engine \u2500\u2500\n\n private generateRecommendations(context: {\n errorPatterns: ErrorPattern[]\n filePatterns: FilePattern[]\n sessionPatterns: SessionOutcomePattern[]\n skillEffectiveness: SkillEffectiveness[]\n episodes: Episode[]\n sessionIds: string[]\n }): Recommendation[] {\n const recs: Recommendation[] = []\n\n // Error-based recommendations\n for (const ep of context.errorPatterns) {\n if (ep.sessionAffinity >= 0.5) {\n recs.push({\n priority: \"high\",\n category: \"error_prevention\",\n description: `\"${ep.category}\" error occurs in ${(ep.sessionAffinity * 100).toFixed(0)}% of sessions (${ep.sessionCount}/${context.sessionIds.length})`,\n action: ep.suggestion,\n affectedSessions: ep.sessionCount,\n })\n } else if (ep.sessionAffinity >= 0.3) {\n recs.push({\n priority: \"medium\",\n category: \"error_prevention\",\n description: `\"${ep.category}\" error is recurring (${ep.sessionCount} sessions)`,\n action: ep.suggestion,\n affectedSessions: ep.sessionCount,\n })\n }\n }\n\n // File hotspot recommendations\n for (const fp of context.filePatterns) {\n if (fp.isHotSpot && fp.coChangedFiles.length >= 3) {\n recs.push({\n priority: \"high\",\n category: \"architecture\",\n description: `Hot spot detected: \"${fp.filePath}\" modified in ${fp.sessionCount} sessions with ${fp.coChangedFiles.length} co-changed files`,\n action: `Consider refactoring \"${fp.filePath}\" into smaller modules to reduce coupling. Co-changed files: ${fp.coChangedFiles.slice(0, 3).map(c => `\"${c.filePath}\"`).join(\", \")}.`,\n affectedSessions: fp.sessionCount,\n })\n }\n }\n\n // Session outcome recommendations\n for (const sp of context.sessionPatterns) {\n if (sp.successRate < 0.5 && sp.matchingSessions >= 2) {\n recs.push({\n priority: \"high\",\n category: \"process\",\n description: sp.description,\n action: sp.insight,\n affectedSessions: sp.matchingSessions,\n })\n }\n }\n\n // Skill recommendations\n for (const sk of context.skillEffectiveness) {\n if (sk.status === \"underperforming\") {\n recs.push({\n priority: \"high\",\n category: \"skill\",\n description: `Skill \"${sk.skillName}\" is underperforming (${(sk.successRate * 100).toFixed(0)}% success)`,\n action: sk.suggestion,\n affectedSessions: sk.usageCount,\n })\n } else if (sk.status === \"highly_effective\" && sk.usageCount >= 3) {\n recs.push({\n priority: \"medium\",\n category: \"skill\",\n description: `Skill \"${sk.skillName}\" is highly effective (${(sk.successRate * 100).toFixed(0)}% success over ${sk.usageCount} uses)`,\n action: sk.suggestion,\n affectedSessions: sk.usageCount,\n })\n }\n }\n\n // Global observations\n if (context.sessionIds.length >= 3) {\n const recentEps = [...context.episodes]\n .sort((a, b) => b.timestamp.localeCompare(a.timestamp))\n .slice(0, Math.min(5, context.episodes.length))\n const recentSuccesses = recentEps.filter(e => e.outcome === \"success\").length\n const recentRate = recentEps.length > 0 ? recentSuccesses / recentEps.length : 0\n\n if (recentRate < 0.4 && recentEps.length >= 3) {\n recs.push({\n priority: \"high\",\n category: \"process\",\n description: \"Recent sessions show declining success rate\",\n action: \"Consider reviewing plan decomposition strategy. Are tasks too large? Are verification criteria clear?\",\n affectedSessions: recentEps.length,\n })\n }\n }\n\n // Sort by priority\n const priorityOrder = { high: 0, medium: 1, low: 2 }\n recs.sort((a, b) => priorityOrder[a.priority] - priorityOrder[b.priority])\n\n return recs\n }\n\n // \u2500\u2500 Helpers \u2500\u2500\n\n private inferCategory(text: string): string | null {\n const lower = text.toLowerCase()\n if (lower.includes(\"import\") || lower.includes(\"module\") || lower.includes(\"require\") || lower.includes(\"not found\")) return \"import\"\n if (lower.includes(\"type\") || lower.includes(\"assignable\") || lower.includes(\"interface\")) return \"type\"\n if (lower.includes(\"compile\") || lower.includes(\"syntax\") || lower.includes(\"build\") || lower.includes(\"tsc\")) return \"compile\"\n if (lower.includes(\"test\") || lower.includes(\"spec\") || lower.includes(\"assert\") || lower.includes(\"expect\")) return \"test\"\n if (lower.includes(\"runtime\") || lower.includes(\"undefined\") || lower.includes(\"null\") || lower.includes(\"error\") || lower.includes(\"exception\")) return \"runtime\"\n return null\n }\n\n private suggestErrorFix(category: string): string {\n const suggestions: Record<string, string> = {\n import: \"Add import path verification before execution. Check module existence and export names.\",\n type: \"Run TypeScript type-checker before implementation. Ensure interfaces match between modules.\",\n compile: \"Add incremental compilation checks. Verify syntax before full build.\",\n test: \"Improve test isolation. Ensure tests don't share mutable state. Add setup/teardown hooks.\",\n runtime: \"Add input validation and defensive checks. Consider adding try-catch at module boundaries.\",\n }\n return suggestions[category] ?? `Review ${category} error patterns and add targeted verification.`\n }\n\n private suggestFileAction(filePath: string, sessionCount: number, totalSessions: number, coChangeCount: number): string {\n const affinity = totalSessions > 0 ? (sessionCount / totalSessions * 100).toFixed(0) : \"?\"\n if (coChangeCount >= 3) {\n return `High coupling detected (${coChangeCount} co-changed files). \"${filePath}\" changes in ${affinity}% of sessions. Consider extracting stable interfaces.`\n }\n if (parseInt(affinity) > 50) {\n return `\"${filePath}\" is modified in ${affinity}% of sessions. High churn may indicate scope creep.`\n }\n return `\"${filePath}\" is a recurring change target (${sessionCount} sessions). Monitor for stability.`\n }\n\n private countOutcomes(episodes: Episode[]): { total: number; success: number; partial: number; failed: number } {\n return {\n total: episodes.length,\n success: episodes.filter(e => e.outcome === \"success\").length,\n partial: episodes.filter(e => e.outcome === \"partial\").length,\n failed: episodes.filter(e => e.outcome === \"failed\").length,\n }\n }\n\n private groupByTags(episodes: Episode[], sessionIds: string[]): Map<string, Episode[]> {\n const groups = new Map<string, Episode[]>()\n for (const ep of episodes) {\n if (!sessionIds.includes(ep.sessionId)) continue\n for (const tag of ep.tags) {\n let group = groups.get(tag)\n if (!group) {\n group = []\n groups.set(tag, group)\n }\n group.push(ep)\n }\n }\n return groups\n }\n\n private computeTrend(episodes: Episode[]): \"improving\" | \"degrading\" | \"stable\" {\n if (episodes.length < 4) return \"stable\"\n\n const sorted = [...episodes].sort((a, b) => a.timestamp.localeCompare(b.timestamp))\n const mid = Math.floor(sorted.length / 2)\n const firstHalf = sorted.slice(0, mid)\n const secondHalf = sorted.slice(mid)\n\n const firstSuccess = firstHalf.filter(e => e.outcome === \"success\").length / firstHalf.length\n const secondSuccess = secondHalf.filter(e => e.outcome === \"success\").length / secondHalf.length\n\n if (secondSuccess > firstSuccess + 0.1) return \"improving\"\n if (secondSuccess < firstSuccess - 0.1) return \"degrading\"\n return \"stable\"\n }\n}\n", "// src/evaluation/live-evaluator.ts \u2014 Real-time evaluation score\n// Mengukur performa agent secara live dari aktivitas sesi nyata,\n// mirip metrik SWE-bench (task success) dan EvoClaw (continuous evolution).\n//\n// Bobot:\n// taskSuccess: 40% \u2014 % step yang sukses\n// errorRecovery: 20% \u2014 % error yang pulih setelah retry\n// contextStability: 15% \u2014 konsistensi navigasi file\n// multiAgent: 15% \u2014 % delegasi sukses\n// skillReuse: 10% \u2014 skill ditemukan & dipakai ulang\n\nexport interface LiveEvalDimension {\n score: number // 0-1\n weight: number // bobot kontribusi ke overall\n target: number // target minimal (0-1)\n detail: string // human-readable\n}\n\nexport interface LiveEvalScore {\n overall: number // 0-100\n dimensions: Record<string, LiveEvalDimension>\n totalSteps: number\n totalErrors: number\n recoveredErrors: number\n totalDelegations: number\n successfulDelegations: number\n /**\n * SWE-bench-style: berapa % task yang success dari total\n * EvoClaw-style: composite weighted score\n */\n sweBenchScore: number // task success rate (0-100)\n evoClawScore: number // composite score (0-100)\n}\n\nexport class LiveEvaluator {\n private stepResults: Array<{ stepId: string; success: boolean; sessionId?: string }> = []\n private errorRecoveries: Array<{ errorId: string; recovered: boolean }> = []\n private navigations: Array<{ query: string; resultsCount: number; focused: boolean }> = []\n private delegations: Array<{ taskId: string; role: string; success: boolean }> = []\n private skillLookups: Array<{ found: boolean }> = []\n\n // \u2500\u2500 Feed methods \u2500\u2500\n\n feedStepResult(step: { stepId: string; success: boolean; sessionId?: string }): void {\n this.stepResults.push(step)\n }\n\n feedErrorRecovery(errorId: string, recovered: boolean): void {\n this.errorRecoveries.push({ errorId, recovered })\n }\n\n feedNavigation(query: string, resultsCount: number): void {\n this.navigations.push({ query, resultsCount, focused: resultsCount > 0 && resultsCount <= 10 })\n }\n\n feedDelegation(taskId: string, role: string, success: boolean): void {\n this.delegations.push({ taskId, role, success })\n }\n\n feedSkillLookup(found: boolean): void {\n this.skillLookups.push({ found })\n }\n\n // \u2500\u2500 Compute methods \u2500\u2500\n\n /**\n * Task success rate (SWE-bench style).\n * Berapa % step yang sukses dari total.\n */\n computeTaskSuccess(): number {\n const total = this.stepResults.length\n if (total === 0) return 0\n const successes = this.stepResults.filter(s => s.success).length\n return successes / total\n }\n\n /**\n * Error recovery rate.\n * Berapa % error yang berhasil pulih (retry sukses setelah error).\n */\n computeErrorRecovery(): number {\n const total = this.errorRecoveries.length\n if (total === 0) return 1 // no errors = perfect recovery\n const recovered = this.errorRecoveries.filter(e => e.recovered).length\n return recovered / total\n }\n\n /**\n * Context stability score.\n * Navigasi yang fokus (\u226410 results) mengindikasikan pemahaman codebase yang baik.\n */\n computeContextStability(): number {\n const total = this.navigations.length\n if (total === 0) return 1 // no nav = stable (nothing drifted)\n const focused = this.navigations.filter(n => n.focused).length\n return focused / total\n }\n\n /**\n * Multi-agent coordination rate.\n * Berapa % delegasi yang sukses.\n */\n computeMultiAgent(): number {\n const total = this.delegations.length\n if (total === 0) return 1 // no delegation = not relevant\n const successes = this.delegations.filter(d => d.success).length\n return successes / total\n }\n\n /**\n * Skill reuse rate.\n * Berapa % lookup skill yang berhasil ditemukan.\n */\n computeSkillReuse(): number {\n const total = this.skillLookups.length\n if (total === 0) return 0.5 // neutral \u2014 no skill usage tracked\n const found = this.skillLookups.filter(s => s.found).length\n return found / total\n }\n\n /**\n * Compute overall live evaluation score.\n */\n computeScore(): LiveEvalScore {\n const taskSuccessScore = this.computeTaskSuccess()\n const errorRecoveryScore = this.computeErrorRecovery()\n const contextStabilityScore = this.computeContextStability()\n const multiAgentScore = this.computeMultiAgent()\n const skillReuseScore = this.computeSkillReuse()\n\n const dimensions: Record<string, LiveEvalDimension> = {\n taskSuccess: {\n score: taskSuccessScore,\n weight: 0.40,\n target: 0.80, // SWE-bench target\n detail: `${(taskSuccessScore * 100).toFixed(0)}% step success (target >80%)`,\n },\n errorRecovery: {\n score: errorRecoveryScore,\n weight: 0.20,\n target: 0.70,\n detail: `${(errorRecoveryScore * 100).toFixed(0)}% error recovery (target >70%)`,\n },\n contextStability: {\n score: contextStabilityScore,\n weight: 0.15,\n target: 0.80,\n detail: `${(contextStabilityScore * 100).toFixed(0)}% focused navigation (target >80%)`,\n },\n multiAgent: {\n score: multiAgentScore,\n weight: 0.15,\n target: 0.90,\n detail: `${(multiAgentScore * 100).toFixed(0)}% delegation success (target >90%)`,\n },\n skillReuse: {\n score: skillReuseScore,\n weight: 0.10,\n target: 0.50,\n detail: `${(skillReuseScore * 100).toFixed(0)}% skill found (target >50%)`,\n },\n }\n\n const overall = Object.values(dimensions).reduce((s, d) => s + d.score * d.weight, 0)\n const sweBenchScore = taskSuccessScore * 100\n const evoClawScore = overall * 100\n\n return {\n overall: Math.round(overall * 100),\n dimensions,\n totalSteps: this.stepResults.length,\n totalErrors: this.errorRecoveries.length,\n recoveredErrors: this.errorRecoveries.filter(e => e.recovered).length,\n totalDelegations: this.delegations.length,\n successfulDelegations: this.delegations.filter(d => d.success).length,\n sweBenchScore: Math.round(sweBenchScore),\n evoClawScore: Math.round(evoClawScore),\n }\n }\n\n /**\n * Generate human-readable report.\n */\n formatReport(includeTips = true): string {\n const score = this.computeScore()\n\n let out = `## \uD83D\uDCCA Live Evaluation Score\\n\\n`\n out += `**Overall:** ${score.overall}/100\\n`\n out += `**SWE-bench Score:** ${score.sweBenchScore}/100 (task success)\\n`\n out += `**EvoClaw Score:** ${score.evoClawScore}/100 (composite)\\n\\n`\n\n out += `### Dimensions\\n`\n for (const [name, dim] of Object.entries(score.dimensions)) {\n const bar = \"\u2588\".repeat(Math.round(dim.score * 20))\n const icon = dim.score >= dim.target ? \"\u2705\" : dim.score >= dim.target * 0.7 ? \"\u26A0\uFE0F\" : \"\u274C\"\n out += `${icon} **${name}:** ${(dim.score * 100).toFixed(0)}% ` +\n `${bar.padEnd(20, \"\u2591\")} ` +\n `(target: ${(dim.target * 100).toFixed(0)}%, weight: ${(dim.weight * 100).toFixed(0)}%)\\n`\n out += ` ${dim.detail}\\n`\n }\n\n out += `\\n### Activity\\n`\n out += `- **Steps:** ${score.totalSteps} | **Errors:** ${score.totalErrors} (${score.recoveredErrors} recovered)\\n`\n out += `- **Delegations:** ${score.totalDelegations} (${score.successfulDelegations} successful)\\n`\n\n if (includeTips && score.overall < 80) {\n out += `\\n### Tips\\n`\n if (score.dimensions.taskSuccess.score < 0.8) {\n out += `- \uD83D\uDD27 Task success rendah. Aktifkan \\`autoVerify\\` di agentic_execute.\\n`\n }\n if (score.dimensions.errorRecovery.score < 0.7) {\n out += `- \uD83D\uDD27 Error recovery rendah. Tambah retry steps atau refine error messages.\\n`\n }\n if (score.dimensions.contextStability.score < 0.8) {\n out += `- \uD83D\uDD27 Navigasi terlalu broad. Pakai \\`agentic_context\\` lebih sering.\\n`\n }\n if (score.dimensions.multiAgent.score < 0.9) {\n out += `- \uD83D\uDD27 Delegasi sering gagal. Cek role availability.\\n`\n }\n if (score.dimensions.skillReuse.score < 0.5) {\n out += `- \uD83D\uDD27 Skill jarang dipakai. Extract skill setelah task sukses via \\`agentic_skill extract\\`.\\n`\n }\n }\n\n return out\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["readFileSync", "writeFileSync", "mkdirSync", "existsSync", "readdirSync", "execFileSync", "join", "dirname", "basename", "existsSync", "join", "dirname", "execFileSync", "execFileSync", "tool", "existsSync", "readFileSync", "resolve", "execFileSync", "existsSync", "join", "dirname", "results", "tool", "readFile", "join", "dirname", "existsSync", "tool", "r", "result", "analysis", "repairResult", "existsSync", "mkdirSync", "readFileSync", "writeFileSync", "resolve", "stat", "readFileSync", "writeFileSync", "mkdirSync", "existsSync", "join", "dirname", "join", "execFileSync", "readdirSync", "existsSync", "mkdirSync", "writeFileSync", "readFileSync", "llmEngine", "session", "output", "summary", "pipelineContext", "skills", "c"]
|
|
7
7
|
}
|