usemint-cli 0.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/config.ts","../../src/providers/types.ts","../../src/providers/tiers.ts","../../src/usage/pricing.ts","../../src/providers/router.ts","../../src/providers/anthropic.ts","../../src/providers/deepseek.ts","../../src/providers/openai-agent-format.ts","../../src/providers/openai-compatible.ts","../../src/providers/kimi.ts","../../src/providers/grok.ts","../../src/providers/groq.ts","../../src/providers/mistral.ts","../../src/providers/qwen.ts","../../src/providers/gemini.ts","../../src/providers/gateway.ts","../../src/agents/model-selector.ts","../../src/providers/index.ts","../../src/context/graph.ts","../../src/context/indexer.ts","../../src/context/search.ts","../../src/context/project-rules.ts","../../src/context/budget.ts","../../src/context/compress.ts","../../src/context/agentmd.ts","../../src/context/skills.ts","../../src/context/index.ts","../../src/pipeline/diff-parser.ts","../../src/pipeline/diff-apply.ts","../../src/cli/commands/simple.ts","../../src/tui/utils/colorize.ts","../../src/tui/components/PipelinePhase.tsx","../../src/tui/components/MarkdownContent.tsx","../../src/tui/components/MessageList.tsx","../../src/tui/components/SlashAutocomplete.tsx","../../src/tui/components/ContextChips.tsx","../../src/tui/components/InputBox.tsx","../../src/tui/components/StatusBar.tsx","../../src/tui/components/WelcomeScreen.tsx","../../src/tui/components/LiveTaskInspector.tsx","../../src/tui/hooks/useAgentEvents.ts","../../src/usage/db.ts","../../src/usage/tracker.ts","../../src/context/session-memory.ts","../../src/agents/specialists/frontend.ts","../../src/agents/specialists/backend.ts","../../src/agents/specialists/database.ts","../../src/agents/specialists/testing.ts","../../src/agents/specialists/devops.ts","../../src/agents/specialists/docs.ts","../../src/agents/prompts/builder.ts","../../src/agents/specialists/general.ts","../../src/agents/specialists/mobile.ts","../../src/agents/specialists/ai.ts","../../src/agents/specialists/fullstack.ts","../../src/agents/specialists/debugging.ts","../../src/agents/specialists/index.ts","../../src/agents/conversation-gate.ts","../../src/agents/prompts/scout.ts","../../src/agents/scout.ts","../../src/agents/task-intent.ts","../../src/agents/adaptive-gate.ts","../../src/agents/clarifier.ts","../../src/tools/types.ts","../../src/tools/file-read.ts","../../src/tools/file-write.ts","../../src/tools/file-edit.ts","../../src/tools/bash.ts","../../src/tools/grep.ts","../../src/tools/glob.ts","../../src/tools/list-dir.ts","../../src/tools/search-replace.ts","../../src/tools/run-tests.ts","../../src/tools/git-diff.ts","../../src/tools/web-fetch.ts","../../src/tools/index.ts","../../src/agent/tools.ts","../../src/agent/loop.ts","../../src/context/pack.ts","../../src/agent/index.ts","../../src/agents/prompts/architect.ts","../../src/agents/prompts/reviewer.ts","../../src/agents/architect.ts","../../src/agents/reviewer.ts","../../src/agents/prompts/explore.ts","../../src/agents/prompts/plan-phase.ts","../../src/agents/prompts/verify.ts","../../src/agents/deep-loop.ts","../../src/agents/worker-agent.ts","../../src/agents/scheduler.ts","../../src/agents/runtime.ts","../../src/agents/index.ts","../../src/pipeline/diff-display.ts","../../src/pipeline/index.ts","../../src/orchestrator/prompts.ts","../../src/orchestrator/write-code.ts","../../src/orchestrator/tools.ts","../../src/orchestrator/loop.ts","../../src/tui/App.tsx","../../src/cli/commands/orchestrator.ts","../../src/usage/dashboard.tsx","../../src/cli/index.ts","../../src/cli/commands/auth.ts","../../src/cli/commands/config.ts","../../src/cli/commands/compare.ts","../../src/context/gather.ts","../../src/cli/commands/usage.ts"],"sourcesContent":["import Conf from 'conf';\nimport { z } from 'zod';\n\n// Config schema\nconst configSchema = z.object({\n // Auth\n apiKey: z.string().optional(),\n gatewayToken: z.string().optional(),\n userId: z.string().optional(),\n email: z.string().optional(),\n orgId: z.string().optional(),\n \n // Preferences\n defaultModel: z.enum(['auto', 'deepseek', 'sonnet', 'opus', 'gemini']).default('auto'),\n autoContext: z.boolean().default(true),\n maxContextTokens: z.number().default(100000),\n \n // Provider keys (for BYOK mode)\n providers: z.object({\n anthropic: z.string().optional(),\n deepseek: z.string().optional(),\n openrouter: z.string().optional(),\n gemini: z.string().optional(),\n }).default({}),\n \n // Backend\n apiBaseUrl: z.string().default('https://api.usemint.dev'),\n});\n\nexport type Config = z.infer<typeof configSchema>;\n\nconst conf = new Conf<Config>({\n projectName: 'mint-cli',\n schema: {\n apiKey: { type: 'string' },\n gatewayToken: { type: 'string' },\n userId: { type: 'string' },\n email: { type: 'string' },\n orgId: { type: 'string' },\n defaultModel: { \n type: 'string', \n enum: ['auto', 'deepseek', 'sonnet', 'opus', 'gemini'],\n default: 'auto' \n },\n autoContext: { type: 'boolean', default: true },\n maxContextTokens: { type: 'number', default: 100000 },\n providers: { \n type: 'object',\n default: {},\n properties: {\n anthropic: { type: 'string' },\n deepseek: { type: 'string' },\n openrouter: { type: 'string' },\n gemini: { type: 'string' },\n }\n },\n apiBaseUrl: { type: 'string', default: 'https://api.usemint.dev' },\n },\n});\n\nexport function getConfig(): Partial<Config> {\n return conf.store;\n}\n\nexport function get<K extends keyof Config>(key: K): Config[K] | undefined {\n return conf.get(key);\n}\n\nexport function set<K extends keyof Config>(key: K, value: Config[K]): void {\n conf.set(key, value);\n}\n\nexport function setAll(values: Partial<Config>): void {\n for (const [key, value] of Object.entries(values)) {\n conf.set(key as keyof Config, value);\n }\n}\n\nexport function clear(): void {\n conf.clear();\n}\n\nexport function isAuthenticated(): boolean {\n return !!conf.get('apiKey');\n}\n\nexport function getConfigPath(): string {\n return conf.path;\n}\n\nexport function getGatewayUrl(): string {\n return conf.get('apiBaseUrl') ?? 'https://api.usemint.dev';\n}\n\nexport const config = {\n get,\n set,\n setAll,\n clear,\n getConfig,\n isAuthenticated,\n getConfigPath,\n getGatewayUrl,\n};\n","export type ModelId =\n | 'deepseek-v3'\n | 'deepseek-coder'\n | 'claude-sonnet-4'\n | 'claude-opus-4'\n | 'gemini-2-flash'\n | 'gemini-2-pro'\n | 'gpt-4o'\n | 'qwen-coder-32b'\n | 'kimi-k2'\n | 'moonshot-v1-8k'\n | 'moonshot-v1-32k'\n | 'grok-3'\n | 'grok-3-fast'\n | 'grok-3-mini-fast'\n | 'gemini-1-5-flash'\n | 'gemini-1-5-pro'\n | 'groq-llama-70b'\n | 'groq-llama-8b'\n | 'groq-gpt-oss-120b'\n | 'groq-gpt-oss-20b'\n | 'grok-4-beta'\n | 'grok-4.1-fast'\n | 'mistral-small';\n\nexport type ProviderId = 'anthropic' | 'deepseek' | 'openrouter' | 'gemini' | 'openai' | 'kimi' | 'grok' | 'groq' | 'mistral';\n\nexport interface ModelInfo {\n id: ModelId;\n provider: ProviderId;\n name: string;\n inputPrice: number; // per 1M tokens\n outputPrice: number; // per 1M tokens\n contextWindow: number;\n capabilities: {\n coding: number; // 1-10\n reasoning: number; // 1-10\n speed: number; // 1-10\n };\n}\n\nexport const MODELS: Record<ModelId, ModelInfo> = {\n 'deepseek-v3': {\n id: 'deepseek-v3',\n provider: 'deepseek',\n name: 'DeepSeek V3',\n inputPrice: 0.28,\n outputPrice: 0.42,\n contextWindow: 128000,\n capabilities: { coding: 9, reasoning: 8, speed: 8 },\n },\n 'deepseek-coder': {\n id: 'deepseek-coder',\n provider: 'deepseek',\n name: 'DeepSeek Coder',\n inputPrice: 0.14,\n outputPrice: 0.28,\n contextWindow: 128000,\n capabilities: { coding: 9, reasoning: 7, speed: 9 },\n },\n 'claude-sonnet-4': {\n id: 'claude-sonnet-4',\n provider: 'anthropic',\n name: 'Claude Sonnet 4',\n inputPrice: 3.0,\n outputPrice: 15.0,\n contextWindow: 200000,\n capabilities: { coding: 9, reasoning: 9, speed: 7 },\n },\n 'claude-opus-4': {\n id: 'claude-opus-4',\n provider: 'anthropic',\n name: 'Claude Opus 4',\n inputPrice: 15.0,\n outputPrice: 75.0,\n contextWindow: 200000,\n capabilities: { coding: 10, reasoning: 10, speed: 5 },\n },\n 'gemini-2-flash': {\n id: 'gemini-2-flash',\n provider: 'gemini',\n name: 'Gemini 2.0 Flash',\n inputPrice: 0.10,\n outputPrice: 0.40,\n contextWindow: 1000000,\n capabilities: { coding: 7, reasoning: 7, speed: 10 },\n },\n 'gemini-2-pro': {\n id: 'gemini-2-pro',\n provider: 'gemini',\n name: 'Gemini 2.0 Pro',\n inputPrice: 1.25,\n outputPrice: 5.0,\n contextWindow: 1000000,\n capabilities: { coding: 8, reasoning: 9, speed: 7 },\n },\n 'gpt-4o': {\n id: 'gpt-4o',\n provider: 'openai',\n name: 'GPT-4o',\n inputPrice: 2.5,\n outputPrice: 10.0,\n contextWindow: 128000,\n capabilities: { coding: 8, reasoning: 8, speed: 8 },\n },\n 'qwen-coder-32b': {\n id: 'qwen-coder-32b',\n provider: 'openrouter',\n name: 'Qwen 2.5 Coder 32B',\n inputPrice: 0.40,\n outputPrice: 1.20,\n contextWindow: 128000,\n capabilities: { coding: 8, reasoning: 7, speed: 8 },\n },\n 'kimi-k2': {\n id: 'kimi-k2',\n provider: 'kimi',\n name: 'Kimi K2',\n inputPrice: 0.60,\n outputPrice: 2.50,\n contextWindow: 128000,\n capabilities: { coding: 8, reasoning: 8, speed: 9 },\n },\n 'moonshot-v1-8k': {\n id: 'moonshot-v1-8k',\n provider: 'kimi',\n name: 'Moonshot v1 8k',\n inputPrice: 0.12,\n outputPrice: 0.12,\n contextWindow: 8000,\n capabilities: { coding: 7, reasoning: 7, speed: 10 },\n },\n 'moonshot-v1-32k': {\n id: 'moonshot-v1-32k',\n provider: 'kimi',\n name: 'Moonshot v1 32k',\n inputPrice: 0.24,\n outputPrice: 0.24,\n contextWindow: 32000,\n capabilities: { coding: 7, reasoning: 7, speed: 10 },\n },\n 'grok-3': {\n id: 'grok-3',\n provider: 'grok',\n name: 'Grok 3',\n inputPrice: 3.0,\n outputPrice: 15.0,\n contextWindow: 131072,\n capabilities: { coding: 9, reasoning: 9, speed: 7 },\n },\n 'grok-3-fast': {\n id: 'grok-3-fast',\n provider: 'grok',\n name: 'Grok 3 Fast',\n inputPrice: 5.0,\n outputPrice: 25.0,\n contextWindow: 131072,\n capabilities: { coding: 8, reasoning: 8, speed: 10 },\n },\n 'grok-3-mini-fast': {\n id: 'grok-3-mini-fast',\n provider: 'grok',\n name: 'Grok 3 Mini Fast',\n inputPrice: 0.60,\n outputPrice: 4.0,\n contextWindow: 131072,\n capabilities: { coding: 7, reasoning: 8, speed: 10 },\n },\n 'gemini-1-5-flash': {\n id: 'gemini-1-5-flash',\n provider: 'gemini',\n name: 'Gemini 1.5 Flash',\n inputPrice: 0.075,\n outputPrice: 0.30,\n contextWindow: 1000000,\n capabilities: { coding: 7, reasoning: 7, speed: 10 },\n },\n 'gemini-1-5-pro': {\n id: 'gemini-1-5-pro',\n provider: 'gemini',\n name: 'Gemini 1.5 Pro',\n inputPrice: 1.25,\n outputPrice: 5.0,\n contextWindow: 2000000,\n capabilities: { coding: 8, reasoning: 9, speed: 7 },\n },\n 'groq-llama-70b': {\n id: 'groq-llama-70b',\n provider: 'groq',\n name: 'Llama 3.3 70B (Groq)',\n inputPrice: 0.59,\n outputPrice: 0.79,\n contextWindow: 128000,\n capabilities: { coding: 8, reasoning: 7, speed: 10 },\n },\n 'groq-llama-8b': {\n id: 'groq-llama-8b',\n provider: 'groq',\n name: 'Llama 3.1 8B (Groq)',\n inputPrice: 0.05,\n outputPrice: 0.08,\n contextWindow: 128000,\n capabilities: { coding: 6, reasoning: 6, speed: 10 },\n },\n 'groq-gpt-oss-120b': {\n id: 'groq-gpt-oss-120b',\n provider: 'groq',\n name: 'GPT OSS 120B (Groq)',\n inputPrice: 0.15,\n outputPrice: 0.60,\n contextWindow: 128000,\n capabilities: { coding: 8, reasoning: 8, speed: 9 },\n },\n 'groq-gpt-oss-20b': {\n id: 'groq-gpt-oss-20b',\n provider: 'groq',\n name: 'GPT OSS 20B (Groq)',\n inputPrice: 0.075,\n outputPrice: 0.30,\n contextWindow: 128000,\n capabilities: { coding: 7, reasoning: 7, speed: 10 },\n },\n 'grok-4-beta': {\n id: 'grok-4-beta',\n provider: 'grok',\n name: 'Grok 4.2 Beta',\n inputPrice: 2.0,\n outputPrice: 6.0,\n contextWindow: 131072,\n capabilities: { coding: 9, reasoning: 10, speed: 7 },\n },\n 'grok-4.1-fast': {\n id: 'grok-4.1-fast',\n provider: 'grok',\n name: 'Grok 4.1 Fast (Reasoning)',\n inputPrice: 0.20,\n outputPrice: 0.50,\n contextWindow: 131072,\n capabilities: { coding: 8, reasoning: 9, speed: 10 },\n },\n 'mistral-small': {\n id: 'mistral-small',\n provider: 'mistral',\n name: 'Mistral Small 4',\n inputPrice: 0.15,\n outputPrice: 0.60,\n contextWindow: 32768,\n capabilities: { coding: 7, reasoning: 6, speed: 10 },\n },\n};\n\nexport interface Message {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n}\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n input_schema: {\n type: 'object';\n properties: Record<string, { type: string; description?: string }>;\n required?: string[];\n };\n}\n\nexport interface AgentStreamChunk {\n type: 'text' | 'tool_call' | 'tool_result';\n text?: string;\n toolName?: string;\n toolInput?: Record<string, unknown>;\n toolCallId?: string;\n}\n\nexport interface CompletionRequest {\n model: ModelId;\n messages: Message[];\n maxTokens?: number;\n temperature?: number;\n stream?: boolean;\n signal?: AbortSignal;\n sessionId?: string;\n tools?: ToolDefinition[];\n systemPrompt?: string;\n /** Provider-specific options (e.g. Grok reasoning toggle, Mistral reasoning_effort). */\n providerOptions?: Record<string, unknown>;\n}\n\nexport interface CompletionResponse {\n content: string;\n model: ModelId;\n usage: {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n };\n cost: {\n input: number;\n output: number;\n total: number;\n };\n latency: number; // ms\n}\n\nexport interface Provider {\n id: ProviderId;\n name: string;\n complete(request: CompletionRequest): Promise<CompletionResponse>;\n streamComplete?(request: CompletionRequest): AsyncIterable<string>;\n}\n","// src/providers/tiers.ts\nimport type { ModelId } from './types.js';\n\nexport type ContextTier = 'apex' | 'smart' | 'fast' | 'ultra';\n\n/**\n * Model tier classification.\n * - APEX: Claude Opus, GPT-4o, Gemini 1.5 Pro — full context, no compression\n * - SMART: Claude Sonnet, DeepSeek-V3, Grok-3, Gemini 2 Pro — light compression\n * - FAST: Kimi K2, Grok-3-fast, Gemini Flash, Qwen-Coder, Groq 70B — heavy compression\n * - ULTRA: Groq 8B, Moonshot 8k — max compression, skeleton context only\n */\nexport const MODEL_TIERS: Record<ModelId, ContextTier> = {\n 'claude-opus-4': 'apex',\n 'gpt-4o': 'apex',\n 'gemini-2-pro': 'apex',\n 'gemini-1-5-pro': 'apex',\n 'claude-sonnet-4': 'smart',\n 'deepseek-v3': 'smart',\n 'grok-3': 'smart',\n 'gemini-2-flash': 'smart',\n 'kimi-k2': 'fast',\n 'grok-3-fast': 'fast',\n 'grok-3-mini-fast': 'fast',\n 'gemini-1-5-flash': 'fast',\n 'qwen-coder-32b': 'fast',\n 'groq-llama-70b': 'fast',\n 'deepseek-coder': 'fast',\n 'moonshot-v1-32k': 'ultra',\n 'moonshot-v1-8k': 'ultra',\n 'groq-llama-8b': 'ultra',\n 'groq-gpt-oss-120b': 'fast',\n 'groq-gpt-oss-20b': 'ultra',\n 'grok-4-beta': 'apex',\n 'mistral-small': 'ultra',\n};\n\n/** Maximum context tokens to send to the model (reserve the rest for output). */\nexport const CONTEXT_BUDGETS: Record<ContextTier, { maxContextTokens: number; reservedOutputTokens: number }> = {\n apex: { maxContextTokens: 180_000, reservedOutputTokens: 20_000 },\n smart: { maxContextTokens: 60_000, reservedOutputTokens: 8_000 },\n fast: { maxContextTokens: 20_000, reservedOutputTokens: 4_000 },\n ultra: { maxContextTokens: 8_000, reservedOutputTokens: 2_000 },\n};\n\nexport function getTier(modelId: ModelId): ContextTier {\n return MODEL_TIERS[modelId] ?? 'fast';\n}\n\nexport function getBudget(modelId: ModelId) {\n return CONTEXT_BUDGETS[getTier(modelId)];\n}\n","// Shared Anthropic Opus 4 pricing constants.\n// Update here when Anthropic changes rates — single source of truth.\nexport const OPUS_INPUT_PRICE_PER_M = 15; // $15 per 1M input tokens\nexport const OPUS_OUTPUT_PRICE_PER_M = 75; // $75 per 1M output tokens\n\n// Claude Sonnet 4.6 pricing\nexport const SONNET_INPUT_PRICE_PER_M = 3.0;\nexport const SONNET_OUTPUT_PRICE_PER_M = 15.0;\n","import { ModelId, MODELS, ModelInfo } from './types.js';\nimport { getTier } from './tiers.js';\nimport { OPUS_INPUT_PRICE_PER_M } from '../usage/pricing.js';\n\nexport type TaskType = 'code' | 'refactor' | 'debug' | 'explain' | 'review' | 'general';\n\ninterface RouterOptions {\n taskType?: TaskType;\n contextSize?: number;\n maxCost?: number;\n preferSpeed?: boolean;\n preferQuality?: boolean;\n}\n\n// Keywords to detect task type from prompt\nconst TASK_PATTERNS: Record<TaskType, RegExp[]> = {\n code: [/write|create|implement|build|generate|add/i],\n refactor: [/refactor|restructure|reorganize|clean up|improve/i],\n debug: [/debug|fix|bug|error|issue|broken|not working/i],\n explain: [/explain|what does|how does|why|understand/i],\n review: [/review|check|audit|look at|feedback/i],\n general: [/.*/],\n};\n\n// Model tiers for different scenarios\nconst MODEL_TIERS = {\n budget: ['deepseek-v3', 'deepseek-coder', 'qwen-coder-32b'] as ModelId[],\n balanced: ['gemini-2-pro', 'gpt-4o', 'claude-sonnet-4'] as ModelId[],\n premium: ['claude-opus-4'] as ModelId[],\n};\n\nexport function detectTaskType(prompt: string): TaskType {\n for (const [type, patterns] of Object.entries(TASK_PATTERNS)) {\n if (type === 'general') continue;\n if (patterns.some(p => p.test(prompt))) {\n return type as TaskType;\n }\n }\n return 'general';\n}\n\nexport function selectModel(prompt: string, options: RouterOptions = {}): ModelId {\n const {\n taskType = detectTaskType(prompt),\n contextSize = 0,\n maxCost,\n preferSpeed = false,\n preferQuality = false,\n } = options;\n\n // Get eligible models based on context size\n const eligibleModels = Object.values(MODELS).filter(\n (m) => m.contextWindow >= contextSize\n );\n\n if (eligibleModels.length === 0) {\n // Fallback to largest context model\n return 'gemini-2-pro';\n }\n\n // Apply cost filter if specified\n let candidates = eligibleModels;\n if (maxCost !== undefined) {\n candidates = candidates.filter((m) => m.inputPrice <= maxCost);\n }\n\n // Score models based on task and preferences\n const scored = candidates.map((model) => {\n let score = 0;\n\n // Task-specific scoring\n switch (taskType) {\n case 'code':\n case 'refactor':\n score += model.capabilities.coding * 2;\n score += model.capabilities.reasoning;\n break;\n case 'debug':\n score += model.capabilities.reasoning * 2;\n score += model.capabilities.coding;\n break;\n case 'explain':\n case 'review':\n score += model.capabilities.reasoning * 2;\n break;\n default:\n score += model.capabilities.coding + model.capabilities.reasoning;\n }\n\n // Preference adjustments\n if (preferSpeed) {\n score += model.capabilities.speed * 1.5;\n }\n if (preferQuality) {\n score += model.capabilities.coding + model.capabilities.reasoning;\n }\n\n // Cost efficiency bonus (lower price = higher bonus)\n const avgPrice = (model.inputPrice + model.outputPrice) / 2;\n score += Math.max(0, (20 - avgPrice) / 2);\n\n return { model, score };\n });\n\n // Sort by score descending\n scored.sort((a, b) => b.score - a.score);\n\n // Default strategy: pick best budget model unless quality demanded\n if (!preferQuality) {\n const budgetMatch = scored.find((s) =>\n MODEL_TIERS.budget.includes(s.model.id)\n );\n if (budgetMatch && budgetMatch.score > scored[0].score * 0.7) {\n return budgetMatch.model.id;\n }\n }\n\n return scored[0].model.id;\n}\n\nexport function getModelInfo(modelId: ModelId): ModelInfo {\n return MODELS[modelId];\n}\n\nexport function calculateCost(\n modelId: ModelId,\n inputTokens: number,\n outputTokens: number\n): { input: number; output: number; total: number } {\n const model = MODELS[modelId];\n const input = (inputTokens / 1_000_000) * model.inputPrice;\n const output = (outputTokens / 1_000_000) * model.outputPrice;\n return {\n input,\n output,\n total: input + output,\n };\n}\n\n\nexport type ClassifiedTask = 'code' | 'explain' | 'architect' | 'debug' | 'general';\n\nconst TASK_CLASSIFY_PATTERNS: Record<ClassifiedTask, RegExp[]> = {\n code: [/write|create|implement|build|generate|add|refactor|restructure|fix|debug/i],\n explain: [/explain|what does|how does|why|understand|what is/i],\n architect: [/design|architect|plan|structure|system|pattern/i],\n debug: [/bug|error|issue|broken|not working|failing|crash/i],\n general: [/.*/],\n};\n\nexport function classifyTask(prompt: string): ClassifiedTask {\n for (const [type, patterns] of Object.entries(TASK_CLASSIFY_PATTERNS)) {\n if (type === 'general') continue;\n if (patterns.some((p) => p.test(prompt))) {\n return type as ClassifiedTask;\n }\n }\n return 'general';\n}\n\nexport interface RoutingDecision {\n model: ModelId;\n tier: string;\n taskType: ClassifiedTask;\n reason: string;\n savingsPct: number;\n}\n\nexport function selectModelWithReason(prompt: string): RoutingDecision {\n const model = selectModel(prompt);\n const tier = getTier(model);\n\n // Savings vs opus: (opusInputPrice - modelInputPrice) / opusInputPrice * 100\n const modelInfo = MODELS[model];\n const savingsPct = modelInfo\n ? Math.max(0, Math.round((1 - modelInfo.inputPrice / OPUS_INPUT_PRICE_PER_M) * 100))\n : 0;\n\n const taskType = classifyTask(prompt);\n const reason = savingsPct > 0\n ? `${taskType} task \\u2192 ${model} (${savingsPct}% cheaper than Opus)`\n : `${taskType} task \\u2192 ${model}`;\n\n return { model, tier, taskType, reason, savingsPct };\n}\n\nexport function formatCost(cost: number): string {\n if (cost < 0.01) {\n return `${(cost * 100).toFixed(3)}¢`;\n }\n return `$${cost.toFixed(4)}`;\n}\n\nexport function compareCosts(\n inputTokens: number,\n outputTokens: number\n): Array<{ model: ModelId; cost: number; savings: string }> {\n const results = Object.keys(MODELS).map((id) => {\n const modelId = id as ModelId;\n const { total } = calculateCost(modelId, inputTokens, outputTokens);\n return { model: modelId, cost: total };\n });\n\n results.sort((a, b) => a.cost - b.cost);\n\n const maxCost = results[results.length - 1].cost;\n \n return results.map((r) => ({\n ...r,\n savings: maxCost > 0 \n ? `${Math.round((1 - r.cost / maxCost) * 100)}% cheaper` \n : '0%',\n }));\n}\n","import Anthropic from '@anthropic-ai/sdk';\nimport { Provider, CompletionRequest, CompletionResponse, ModelId, MODELS, AgentStreamChunk } from './types.js';\nimport { calculateCost } from './router.js';\nimport { config } from '../utils/config.js';\n\nconst MODEL_MAP: Partial<Record<ModelId, string>> = {\n 'claude-sonnet-4': 'claude-sonnet-4-20250514',\n 'claude-opus-4': 'claude-opus-4-20250514',\n};\n\nexport class AnthropicProvider implements Provider {\n id = 'anthropic' as const;\n name = 'Anthropic';\n private client: Anthropic | null = null;\n\n private getClient(): Anthropic {\n if (this.client) return this.client;\n \n const apiKey = config.get('providers')?.anthropic;\n if (!apiKey) {\n throw new Error('Anthropic API key not configured. Run: axon config:set providers.anthropic <key>');\n }\n \n this.client = new Anthropic({ apiKey });\n return this.client;\n }\n\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const client = this.getClient();\n const modelString = MODEL_MAP[request.model];\n \n if (!modelString) {\n throw new Error(`Model ${request.model} not supported by Anthropic provider`);\n }\n\n const startTime = Date.now();\n\n // Extract system message if present\n const systemMessage = request.messages.find(m => m.role === 'system');\n const otherMessages = request.messages.filter(m => m.role !== 'system');\n\n const response = await client.messages.create({\n model: modelString,\n max_tokens: request.maxTokens ?? 4096,\n system: systemMessage?.content,\n messages: otherMessages.map(m => ({\n role: m.role as 'user' | 'assistant',\n content: m.content,\n })),\n });\n\n const latency = Date.now() - startTime;\n const inputTokens = response.usage.input_tokens;\n const outputTokens = response.usage.output_tokens;\n\n const content = response.content\n .filter(block => block.type === 'text')\n .map(block => (block as { type: 'text'; text: string }).text)\n .join('\\n');\n\n return {\n content,\n model: request.model,\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n cost: calculateCost(request.model, inputTokens, outputTokens),\n latency,\n };\n }\n\n async *streamComplete(request: CompletionRequest): AsyncIterable<string> {\n const client = this.getClient();\n const modelString = MODEL_MAP[request.model];\n\n if (!modelString) {\n throw new Error(`Model ${request.model} not supported by Anthropic provider`);\n }\n\n const systemMessage = request.messages.find(m => m.role === 'system');\n const otherMessages = request.messages.filter(m => m.role !== 'system');\n\n const stream = client.messages.stream({\n model: modelString,\n max_tokens: request.maxTokens ?? 4096,\n system: systemMessage?.content,\n messages: otherMessages.map(m => ({\n role: m.role as 'user' | 'assistant',\n content: m.content,\n })),\n }, { signal: request.signal });\n\n for await (const event of stream) {\n if (event.type === 'content_block_delta') {\n const delta = event.delta as { type: string; text?: string };\n if (delta.type === 'text_delta' && delta.text) {\n yield delta.text;\n }\n }\n }\n }\n\n async *streamAgent(request: CompletionRequest): AsyncIterable<AgentStreamChunk> {\n const client = this.getClient();\n const modelString = MODEL_MAP[request.model];\n\n if (!modelString) {\n throw new Error(`Model ${request.model} not supported by Anthropic provider`);\n }\n\n const systemPrompt = request.systemPrompt ??\n request.messages.find(m => m.role === 'system')?.content;\n const otherMessages = request.messages.filter(m => m.role !== 'system');\n\n const anthropicMessages: Anthropic.MessageParam[] = otherMessages.map(m => {\n if (m.role === 'user') {\n return { role: 'user' as const, content: m.content };\n }\n const am = m as typeof m & { toolCalls?: Array<{ id: string; name: string; input: Record<string, unknown> }> };\n if (am.toolCalls && am.toolCalls.length > 0) {\n const content: Anthropic.ContentBlock[] = [];\n if (m.content) {\n content.push({ type: 'text', text: m.content } as Anthropic.TextBlock);\n }\n for (const tc of am.toolCalls) {\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: tc.input,\n } as Anthropic.ToolUseBlock);\n }\n return { role: 'assistant' as const, content };\n }\n if (m.role === 'tool') {\n const tm = m as unknown as { toolResults: Array<{ toolCallId: string; content: string }> };\n return {\n role: 'user' as const,\n content: tm.toolResults.map(r => ({\n type: 'tool_result' as const,\n tool_use_id: r.toolCallId,\n content: r.content,\n })),\n };\n }\n return { role: 'assistant' as const, content: m.content };\n });\n\n const tools: Anthropic.Tool[] | undefined = request.tools?.map(t => ({\n name: t.name,\n description: t.description,\n input_schema: t.input_schema,\n }));\n\n const stream = client.messages.stream({\n model: modelString,\n max_tokens: request.maxTokens ?? 8192,\n system: systemPrompt,\n messages: anthropicMessages,\n tools,\n }, { signal: request.signal });\n\n for await (const event of stream) {\n if (event.type === 'content_block_delta') {\n const delta = event.delta as { type: string; text?: string };\n if (delta.type === 'text_delta' && delta.text) {\n yield { type: 'text', text: delta.text };\n }\n } else if (event.type === 'content_block_start') {\n // Tool use blocks are emitted when the content block starts\n const block = (event as unknown as { content_block?: Anthropic.ContentBlock }).content_block;\n if (block && block.type === 'tool_use') {\n yield {\n type: 'tool_call',\n toolName: block.name,\n toolInput: block.input as Record<string, unknown>,\n toolCallId: block.id,\n };\n }\n }\n }\n }\n}\n\nexport const anthropicProvider = new AnthropicProvider();\n","import OpenAI from 'openai';\nimport { Provider, CompletionRequest, CompletionResponse, ModelId, AgentStreamChunk } from './types.js';\nimport { calculateCost } from './router.js';\nimport { config } from '../utils/config.js';\n\nconst MODEL_MAP: Partial<Record<ModelId, string>> = {\n 'deepseek-v3': 'deepseek-chat',\n 'deepseek-coder': 'deepseek-coder',\n};\n\nexport class DeepSeekProvider implements Provider {\n id = 'deepseek' as const;\n name = 'DeepSeek';\n private client: OpenAI | null = null;\n\n private getClient(): OpenAI {\n if (this.client) return this.client;\n \n const apiKey = config.get('providers')?.deepseek;\n if (!apiKey) {\n throw new Error('DeepSeek API key not configured. Run: axon config:set providers.deepseek <key>');\n }\n \n this.client = new OpenAI({\n apiKey,\n baseURL: 'https://api.deepseek.com/v1',\n });\n return this.client;\n }\n\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const client = this.getClient();\n const modelString = MODEL_MAP[request.model];\n \n if (!modelString) {\n throw new Error(`Model ${request.model} not supported by DeepSeek provider`);\n }\n\n const startTime = Date.now();\n\n const response = await client.chat.completions.create({\n model: modelString,\n max_tokens: request.maxTokens ?? 4096,\n temperature: request.temperature ?? 0.7,\n messages: request.messages.map(m => ({\n role: m.role,\n content: m.content,\n })),\n });\n\n const latency = Date.now() - startTime;\n const inputTokens = response.usage?.prompt_tokens ?? 0;\n const outputTokens = response.usage?.completion_tokens ?? 0;\n const content = response.choices[0]?.message?.content ?? '';\n\n return {\n content,\n model: request.model,\n usage: {\n inputTokens,\n outputTokens,\n totalTokens: inputTokens + outputTokens,\n },\n cost: calculateCost(request.model, inputTokens, outputTokens),\n latency,\n };\n }\n\n async *streamComplete(request: CompletionRequest): AsyncIterable<string> {\n const client = this.getClient();\n const modelString = MODEL_MAP[request.model];\n\n if (!modelString) {\n throw new Error(`Model ${request.model} not supported by DeepSeek provider`);\n }\n\n const stream = await client.chat.completions.create({\n model: modelString,\n max_tokens: request.maxTokens ?? 4096,\n temperature: request.temperature ?? 0.7,\n messages: request.messages.map(m => ({\n role: m.role,\n content: m.content,\n })),\n stream: true,\n }, { signal: request.signal });\n\n for await (const chunk of stream) {\n const content = chunk.choices[0]?.delta?.content;\n if (content) {\n yield content;\n }\n }\n }\n\n async *streamAgent(request: CompletionRequest): AsyncIterable<AgentStreamChunk> {\n const client = this.getClient();\n const modelString = MODEL_MAP[request.model];\n\n if (!modelString) {\n throw new Error(`Model ${request.model} not supported by DeepSeek provider`);\n }\n\n // Build messages array, injecting systemPrompt as system message if provided\n const messages: OpenAI.Chat.ChatCompletionMessageParam[] = [];\n if (request.systemPrompt) {\n messages.push({ role: 'system', content: request.systemPrompt });\n }\n for (const m of request.messages) {\n if (m.role === 'system') {\n messages.push({ role: 'system', content: m.content });\n } else if (m.role === 'user') {\n messages.push({ role: 'user', content: m.content });\n } else if (m.role === 'assistant') {\n const am = m as typeof m & { toolCalls?: Array<{ id: string; name: string; input: Record<string, unknown> }>; toolResults?: Array<{ toolCallId: string; content: string }> };\n if (am.toolCalls && am.toolCalls.length > 0) {\n messages.push({\n role: 'assistant',\n content: m.content || null,\n tool_calls: am.toolCalls.map(tc => ({\n id: tc.id,\n type: 'function' as const,\n function: { name: tc.name, arguments: JSON.stringify(tc.input) },\n })),\n });\n } else {\n messages.push({ role: 'assistant', content: m.content });\n }\n } else if (m.role === 'tool') {\n const tm = m as typeof m & { toolResults?: Array<{ toolCallId: string; content: string }> };\n const results = (tm as unknown as { toolResults: Array<{ toolCallId: string; content: string }> }).toolResults;\n if (results) {\n for (const r of results) {\n messages.push({ role: 'tool', content: r.content, tool_call_id: r.toolCallId });\n }\n } else {\n // Skip tool-role messages without toolResults — invalid API payload\n }\n }\n }\n\n const tools: OpenAI.Chat.ChatCompletionTool[] | undefined = request.tools?.map(t => ({\n type: 'function' as const,\n function: {\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n },\n }));\n\n const stream = await client.chat.completions.create({\n model: modelString,\n max_tokens: request.maxTokens ?? 8192,\n temperature: request.temperature ?? 0.7,\n messages,\n tools,\n tool_choice: tools && tools.length > 0 ? 'auto' : undefined,\n stream: true,\n }, { signal: request.signal });\n\n // Collect streaming tool call fragments\n const toolCallAccumulators: Map<number, { id: string; name: string; arguments: string }> = new Map();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n // Text content\n if (delta.content) {\n yield { type: 'text', text: delta.content };\n }\n\n // Tool call streaming\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index ?? 0;\n if (!toolCallAccumulators.has(idx)) {\n toolCallAccumulators.set(idx, { id: tc.id ?? '', name: tc.function?.name ?? '', arguments: '' });\n }\n const acc = toolCallAccumulators.get(idx)!;\n if (tc.id) acc.id = tc.id;\n if (tc.function?.name) acc.name = tc.function.name;\n if (tc.function?.arguments) acc.arguments += tc.function.arguments;\n }\n }\n\n // When stream finishes, emit accumulated tool calls\n const finishReason = chunk.choices[0]?.finish_reason;\n if (finishReason === 'tool_calls' || finishReason === 'stop') {\n for (const [, acc] of toolCallAccumulators) {\n let parsedInput: Record<string, unknown> = {};\n try {\n parsedInput = JSON.parse(acc.arguments || '{}');\n } catch {\n parsedInput = { raw: acc.arguments };\n }\n yield {\n type: 'tool_call',\n toolName: acc.name,\n toolInput: parsedInput,\n toolCallId: acc.id,\n };\n }\n toolCallAccumulators.clear();\n }\n }\n }\n}\n\nexport const deepseekProvider = new DeepSeekProvider();\n","import type OpenAI from 'openai';\nimport type { CompletionRequest } from './types.js';\n\ntype AgentMessage = {\n role: string;\n content: string;\n toolCalls?: Array<{ id: string; name: string; input: Record<string, unknown> }>;\n toolResults?: Array<{ toolCallId: string; content: string }>;\n};\n\nexport function getCombinedSystemPrompt(request: CompletionRequest): string | undefined {\n const parts: string[] = [];\n\n if (request.systemPrompt?.trim()) {\n parts.push(request.systemPrompt.trim());\n }\n\n for (const message of request.messages) {\n if (message.role === 'system' && message.content.trim()) {\n parts.push(message.content.trim());\n }\n }\n\n return parts.length > 0 ? parts.join('\\n\\n') : undefined;\n}\n\nexport function buildOpenAICompatibleAgentMessages(\n request: CompletionRequest,\n): OpenAI.Chat.ChatCompletionMessageParam[] {\n const out: OpenAI.Chat.ChatCompletionMessageParam[] = [];\n const systemPrompt = getCombinedSystemPrompt(request);\n\n if (systemPrompt) {\n out.push({ role: 'system', content: systemPrompt });\n }\n\n for (const message of request.messages) {\n const agentMessage = message as AgentMessage;\n\n if (message.role === 'system') {\n continue;\n }\n\n if (message.role === 'user') {\n out.push({ role: 'user', content: message.content });\n continue;\n }\n\n if (message.role === 'assistant') {\n if (agentMessage.toolCalls && agentMessage.toolCalls.length > 0) {\n out.push({\n role: 'assistant',\n content: message.content || null,\n tool_calls: agentMessage.toolCalls.map((toolCall) => ({\n id: toolCall.id,\n type: 'function' as const,\n function: {\n name: toolCall.name,\n arguments: JSON.stringify(toolCall.input),\n },\n })),\n });\n } else {\n out.push({ role: 'assistant', content: message.content });\n }\n continue;\n }\n\n if (message.role === 'tool' && agentMessage.toolResults) {\n for (const result of agentMessage.toolResults) {\n out.push({\n role: 'tool',\n content: result.content,\n tool_call_id: result.toolCallId,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function buildOpenAICompatibleToolDefinitions(\n tools: CompletionRequest['tools'],\n): OpenAI.Chat.ChatCompletionTool[] | undefined {\n return tools?.map((tool) => ({\n type: 'function' as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.input_schema,\n },\n }));\n}\n","// src/providers/openai-compatible.ts\nimport OpenAI from 'openai';\nimport type { Provider, CompletionRequest, CompletionResponse, ModelId, AgentStreamChunk } from './types.js';\nimport { calculateCost } from './router.js';\nimport { config } from '../utils/config.js';\nimport {\n buildOpenAICompatibleAgentMessages,\n buildOpenAICompatibleToolDefinitions,\n} from './openai-agent-format.js';\n\nexport interface OpenAICompatibleConfig {\n providerId: string;\n providerName: string;\n baseURL: string;\n /** Dot-path into config store, e.g. \"providers.kimi\" */\n apiKeyConfigPath: string;\n /** Map from our ModelId to the actual API model string */\n modelMap: Partial<Record<ModelId, string>>;\n}\n\nexport class OpenAICompatibleProvider implements Provider {\n readonly id: string;\n readonly name: string;\n private client: OpenAI | null = null;\n private cfg: OpenAICompatibleConfig;\n\n constructor(cfg: OpenAICompatibleConfig) {\n this.id = cfg.providerId;\n this.name = cfg.providerName;\n this.cfg = cfg;\n }\n\n private getClient(): OpenAI {\n if (this.client) return this.client;\n const [section, key] = this.cfg.apiKeyConfigPath.split('.') as [string, string];\n const sectionData = config.get(section as never) as Record<string, string> | undefined;\n const apiKey = sectionData?.[key];\n if (!apiKey) {\n throw new Error(\n `${this.cfg.providerName} API key not configured. Run: axon config:set ${this.cfg.apiKeyConfigPath} <key>`\n );\n }\n this.client = new OpenAI({ apiKey, baseURL: this.cfg.baseURL });\n return this.client;\n }\n\n private resolveModel(modelId: ModelId): string {\n const mapped = this.cfg.modelMap[modelId];\n if (!mapped) {\n throw new Error(`Model ${modelId} not supported by ${this.cfg.providerName} provider`);\n }\n return mapped;\n }\n\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const client = this.getClient();\n const modelString = this.resolveModel(request.model);\n const startTime = Date.now();\n\n const messages = buildOAIMessages(request);\n const response = await client.chat.completions.create({\n model: modelString,\n max_tokens: request.maxTokens ?? 4096,\n temperature: request.temperature ?? 0.7,\n messages,\n ...request.providerOptions as Record<string, unknown>,\n } as Parameters<typeof client.chat.completions.create>[0]);\n\n const latency = Date.now() - startTime;\n const inputTokens = response.usage?.prompt_tokens ?? 0;\n const outputTokens = response.usage?.completion_tokens ?? 0;\n const content = response.choices[0]?.message?.content ?? '';\n\n return {\n content,\n model: request.model,\n usage: { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens },\n cost: calculateCost(request.model, inputTokens, outputTokens),\n latency,\n };\n }\n\n async *streamComplete(request: CompletionRequest): AsyncIterable<string> {\n const client = this.getClient();\n const modelString = this.resolveModel(request.model);\n const messages = buildOAIMessages(request);\n\n const stream = await client.chat.completions.create({\n model: modelString,\n max_tokens: request.maxTokens ?? 4096,\n temperature: request.temperature ?? 0.7,\n messages,\n stream: true,\n ...request.providerOptions as Record<string, unknown>,\n } as Parameters<typeof client.chat.completions.create>[0], { signal: request.signal });\n\n for await (const chunk of stream) {\n const content = chunk.choices[0]?.delta?.content;\n if (content) yield content;\n }\n }\n\n async *streamAgent(request: CompletionRequest): AsyncIterable<AgentStreamChunk> {\n const client = this.getClient();\n const modelString = this.resolveModel(request.model);\n const messages = buildOpenAICompatibleAgentMessages(request);\n const tools = buildOpenAICompatibleToolDefinitions(request.tools);\n\n const stream = await client.chat.completions.create({\n model: modelString,\n max_tokens: request.maxTokens ?? 8192,\n temperature: request.temperature ?? 0.7,\n messages,\n tools,\n tool_choice: tools && tools.length > 0 ? 'auto' : undefined,\n stream: true,\n ...request.providerOptions as Record<string, unknown>,\n } as Parameters<typeof client.chat.completions.create>[0], { signal: request.signal });\n\n const toolCallAccumulators: Map<number, { id: string; name: string; arguments: string }> = new Map();\n\n for await (const chunk of stream) {\n const delta = chunk.choices[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) yield { type: 'text', text: delta.content };\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index ?? 0;\n if (!toolCallAccumulators.has(idx)) {\n toolCallAccumulators.set(idx, { id: tc.id ?? '', name: tc.function?.name ?? '', arguments: '' });\n }\n const acc = toolCallAccumulators.get(idx)!;\n if (tc.id) acc.id = tc.id;\n if (tc.function?.name) acc.name = tc.function.name;\n if (tc.function?.arguments) acc.arguments += tc.function.arguments;\n }\n }\n\n const finishReason = chunk.choices[0]?.finish_reason;\n if (finishReason === 'tool_calls' || finishReason === 'stop') {\n for (const [, acc] of toolCallAccumulators) {\n let parsedInput: Record<string, unknown> = {};\n try { parsedInput = JSON.parse(acc.arguments || '{}'); }\n catch { parsedInput = { raw: acc.arguments }; }\n yield { type: 'tool_call', toolName: acc.name, toolInput: parsedInput, toolCallId: acc.id };\n }\n toolCallAccumulators.clear();\n }\n }\n }\n}\n\n// ─── Message builders ────────────────────────────────────────────────────────\n\nfunction buildOAIMessages(request: CompletionRequest): OpenAI.Chat.ChatCompletionMessageParam[] {\n const out: OpenAI.Chat.ChatCompletionMessageParam[] = [];\n if (request.systemPrompt) out.push({ role: 'system', content: request.systemPrompt });\n for (const m of request.messages) {\n out.push({ role: m.role as 'user' | 'assistant' | 'system', content: m.content });\n }\n return out;\n}\n","// src/providers/kimi.ts\nimport { OpenAICompatibleProvider } from './openai-compatible.js';\n\nexport const kimiProvider = new OpenAICompatibleProvider({\n providerId: 'kimi',\n providerName: 'Kimi (Moonshot AI)',\n baseURL: 'https://api.moonshot.cn/v1',\n apiKeyConfigPath: 'providers.kimi',\n modelMap: {\n 'kimi-k2': 'kimi-k2-0711-preview',\n 'moonshot-v1-8k': 'moonshot-v1-8k',\n 'moonshot-v1-32k': 'moonshot-v1-32k',\n },\n});\n","// src/providers/grok.ts\nimport { OpenAICompatibleProvider } from './openai-compatible.js';\n\nexport const grokProvider = new OpenAICompatibleProvider({\n providerId: 'grok',\n providerName: 'Grok (xAI)',\n baseURL: 'https://api.x.ai/v1',\n apiKeyConfigPath: 'providers.grok',\n modelMap: {\n 'grok-3': 'grok-3',\n 'grok-3-fast': 'grok-3-fast',\n 'grok-3-mini-fast': 'grok-3-mini-fast',\n 'grok-4-beta': 'grok-4.20-beta',\n 'grok-4.1-fast': 'grok-4.1-fast-reasoning',\n },\n});\n","// src/providers/groq.ts\nimport { OpenAICompatibleProvider } from './openai-compatible.js';\n\nexport const groqProvider = new OpenAICompatibleProvider({\n providerId: 'groq',\n providerName: 'Groq',\n baseURL: 'https://api.groq.com/openai/v1',\n apiKeyConfigPath: 'providers.groq',\n modelMap: {\n 'groq-llama-70b': 'llama-3.3-70b-versatile',\n 'groq-llama-8b': 'llama-3.1-8b-instant',\n 'groq-gpt-oss-120b': 'openai/gpt-oss-120b',\n 'groq-gpt-oss-20b': 'openai/gpt-oss-20b',\n },\n});\n","// src/providers/mistral.ts\nimport { OpenAICompatibleProvider } from './openai-compatible.js';\n\nexport const mistralProvider = new OpenAICompatibleProvider({\n providerId: 'mistral',\n providerName: 'Mistral AI',\n baseURL: 'https://api.mistral.ai/v1',\n apiKeyConfigPath: 'providers.mistral',\n modelMap: {\n 'mistral-small': 'mistral-small-2603',\n },\n});\n","// src/providers/qwen.ts\nimport { OpenAICompatibleProvider } from './openai-compatible.js';\n\nexport const qwenProvider = new OpenAICompatibleProvider({\n providerId: 'openrouter',\n providerName: 'Qwen (OpenRouter)',\n baseURL: 'https://openrouter.ai/api/v1',\n apiKeyConfigPath: 'providers.openrouter',\n modelMap: {\n 'qwen-coder-32b': 'qwen/qwen-2.5-coder-32b-instruct',\n },\n});\n","// src/providers/gemini.ts\nimport { GoogleGenerativeAI, type GenerativeModel } from '@google/generative-ai';\nimport type { Provider, CompletionRequest, CompletionResponse, ModelId, AgentStreamChunk } from './types.js';\nimport { calculateCost } from './router.js';\nimport { config } from '../utils/config.js';\n\nconst MODEL_MAP: Partial<Record<ModelId, string>> = {\n 'gemini-2-flash': 'gemini-2.0-flash',\n 'gemini-2-pro': 'gemini-2.0-pro-exp',\n 'gemini-1-5-flash': 'gemini-1.5-flash',\n 'gemini-1-5-pro': 'gemini-1.5-pro',\n};\n\nexport class GeminiProvider implements Provider {\n id = 'gemini' as const;\n name = 'Gemini (Google)';\n private sdk: GoogleGenerativeAI | null = null;\n\n private getSDK(): GoogleGenerativeAI {\n if (this.sdk) return this.sdk;\n const sectionData = config.get('providers') as Record<string, string> | undefined;\n const apiKey = sectionData?.['gemini'];\n if (!apiKey) throw new Error('Gemini API key not configured. Run: axon config:set providers.gemini <key>');\n this.sdk = new GoogleGenerativeAI(apiKey);\n return this.sdk;\n }\n\n private getModel(modelId: ModelId): GenerativeModel {\n const modelString = MODEL_MAP[modelId];\n if (!modelString) throw new Error(`Model ${modelId} not supported by Gemini provider`);\n return this.getSDK().getGenerativeModel({ model: modelString });\n }\n\n async complete(request: CompletionRequest): Promise<CompletionResponse> {\n const model = this.getModel(request.model);\n const startTime = Date.now();\n\n const history = request.messages\n .filter(m => m.role !== 'system')\n .slice(0, -1)\n .map(m => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: m.content }],\n }));\n\n const lastMsg = request.messages[request.messages.length - 1];\n const chat = model.startChat({\n history,\n systemInstruction: request.systemPrompt,\n });\n\n const result = await chat.sendMessage(lastMsg.content);\n const content = result.response.text();\n const latency = Date.now() - startTime;\n\n const usage = result.response.usageMetadata;\n const inputTokens = usage?.promptTokenCount ?? 0;\n const outputTokens = usage?.candidatesTokenCount ?? 0;\n\n return {\n content,\n model: request.model,\n usage: { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens },\n cost: calculateCost(request.model, inputTokens, outputTokens),\n latency,\n };\n }\n\n async *streamComplete(request: CompletionRequest): AsyncIterable<string> {\n const model = this.getModel(request.model);\n const history = request.messages\n .filter(m => m.role !== 'system')\n .slice(0, -1)\n .map(m => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: m.content }],\n }));\n const lastMsg = request.messages[request.messages.length - 1];\n const chat = model.startChat({ history, systemInstruction: request.systemPrompt });\n const result = await chat.sendMessageStream(lastMsg.content);\n for await (const chunk of result.stream) {\n const text = chunk.text();\n if (text) yield text;\n }\n }\n\n async *streamAgent(request: CompletionRequest): AsyncIterable<AgentStreamChunk> {\n // Gemini function-calling: use generateContentStream with tools\n const modelString = MODEL_MAP[request.model];\n if (!modelString) throw new Error(`Model ${request.model} not supported by Gemini provider`);\n\n const tools = request.tools ? [{\n functionDeclarations: request.tools.map(t => ({\n name: t.name,\n description: t.description,\n parameters: t.input_schema,\n })),\n }] : undefined;\n\n const model = this.getSDK().getGenerativeModel({\n model: modelString,\n tools,\n systemInstruction: request.systemPrompt,\n });\n\n const history = request.messages\n .filter(m => m.role !== 'system')\n .slice(0, -1)\n .map(m => ({\n role: m.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: m.content }],\n }));\n\n const lastMsg = request.messages[request.messages.length - 1];\n const chat = model.startChat({ history });\n const result = await chat.sendMessageStream(lastMsg.content);\n\n for await (const chunk of result.stream) {\n // Text parts\n const text = chunk.text();\n if (text) yield { type: 'text', text };\n\n // Function call parts\n const candidates = chunk.candidates ?? [];\n for (const candidate of candidates) {\n for (const part of candidate.content.parts) {\n if (part.functionCall) {\n yield {\n type: 'tool_call',\n toolName: part.functionCall.name,\n toolInput: part.functionCall.args as Record<string, unknown>,\n toolCallId: `gemini_${Date.now()}`,\n };\n }\n }\n }\n }\n }\n}\n\nexport const geminiProvider = new GeminiProvider();\n","import type { Provider, CompletionRequest, CompletionResponse, AgentStreamChunk } from './types.js'\nimport { config } from '../utils/config.js'\nimport {\n buildOpenAICompatibleAgentMessages,\n buildOpenAICompatibleToolDefinitions,\n getCombinedSystemPrompt,\n} from './openai-agent-format.js'\n\nconst AUTH_HELP =\n 'Run `mint login` for a personal token, or for local testing set a shared gateway token with `mint config:set gatewayToken <token>`.'\n\nfunction getGatewayUrl(): string {\n return process.env.MINT_GATEWAY_URL ?? config.getGatewayUrl()\n}\n\nfunction getToken(): string {\n const gatewayToken = config.get('gatewayToken')\n if (gatewayToken) return gatewayToken as string\n\n const userToken = config.get('apiKey')\n if (userToken) return userToken as string\n\n const envToken = process.env.MINT_GATEWAY_TOKEN ?? process.env.MINT_API_TOKEN ?? ''\n if (envToken) return envToken\n\n throw new Error(`Mint Gateway auth is not configured. ${AUTH_HELP}`)\n}\n\nfunction buildGatewayError(kind: 'chat' | 'agent', status: number, body: string): Error {\n if (status === 401) {\n return new Error(`Gateway ${kind} error 401: Unauthorized. ${AUTH_HELP}`)\n }\n\n return new Error(`Gateway ${kind} error ${status}: ${body}`)\n}\n\nexport const gatewayProvider: Provider = {\n id: 'groq', // reported provider — gateway decides actual provider\n name: 'Mint Gateway',\n\n async complete(req: CompletionRequest): Promise<CompletionResponse> {\n const chunks: string[] = []\n for await (const chunk of this.streamComplete!(req)) {\n chunks.push(chunk)\n }\n const content = chunks.join('')\n const inputTokens = Math.ceil(req.messages.reduce((s, m) => s + m.content.length, 0) / 4)\n const outputTokens = Math.ceil(content.length / 4)\n return {\n content,\n model: req.model,\n usage: { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens },\n cost: { input: 0, output: 0, total: 0 },\n latency: 0,\n }\n },\n\n async *streamComplete(req: CompletionRequest): AsyncIterable<string> {\n const chatMessages = req.messages.filter(m => m.role !== 'system')\n const systemPrompt = getCombinedSystemPrompt(req)\n\n const res = await fetch(`${getGatewayUrl()}/v1/chat`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${getToken()}`,\n },\n body: JSON.stringify({\n session_id: req.sessionId ?? 'cli',\n messages: chatMessages,\n system: systemPrompt,\n }),\n signal: req.signal,\n })\n\n if (!res.ok) {\n const body = await res.text()\n throw buildGatewayError('chat', res.status, body)\n }\n\n if (!res.body) throw new Error('No response body from gateway')\n\n const decoder = new TextDecoder()\n const reader = res.body.getReader()\n\n try {\n let buf = ''\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buf += decoder.decode(value, { stream: true })\n const lines = buf.split('\\n')\n buf = lines.pop() ?? ''\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed.startsWith('data:')) continue\n const data = trimmed.slice(5).trim()\n if (data === '[DONE]') return\n try {\n const parsed = JSON.parse(data)\n if (parsed.error) throw new Error(parsed.error)\n if (parsed.text) yield parsed.text\n } catch (e) {\n if (e instanceof Error && e.message !== 'Unexpected end of JSON input') throw e\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n },\n\n async *streamAgent(req: CompletionRequest): AsyncIterable<AgentStreamChunk> {\n const systemPrompt = getCombinedSystemPrompt(req);\n const chatMessages = buildOpenAICompatibleAgentMessages(req)\n .filter((message) => message.role !== 'system');\n const tools = buildOpenAICompatibleToolDefinitions(req.tools);\n\n const res = await fetch(`${getGatewayUrl()}/v1/agent`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${getToken()}`,\n },\n body: JSON.stringify({\n session_id: req.sessionId ?? 'cli',\n messages: chatMessages,\n system: systemPrompt,\n tools,\n }),\n signal: req.signal,\n });\n\n if (!res.ok) {\n const body = await res.text();\n throw buildGatewayError('agent', res.status, body);\n }\n\n if (!res.body) throw new Error('No response body from gateway agent');\n\n const decoder = new TextDecoder();\n const reader = res.body.getReader();\n const toolCallAccs = new Map<number, { id: string; name: string; arguments: string }>();\n\n try {\n let buf = '';\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buf += decoder.decode(value, { stream: true });\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('data:')) continue;\n const data = trimmed.slice(5).trim();\n if (data === '[DONE]') return;\n try {\n const parsed = JSON.parse(data);\n if (parsed.error) throw new Error(typeof parsed.error === 'string' ? parsed.error : JSON.stringify(parsed.error));\n\n const delta = parsed.choices?.[0]?.delta;\n if (!delta) continue;\n\n if (delta.content) {\n yield { type: 'text', text: delta.content };\n }\n\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n const idx = tc.index ?? 0;\n if (!toolCallAccs.has(idx)) {\n toolCallAccs.set(idx, { id: tc.id ?? '', name: tc.function?.name ?? '', arguments: '' });\n }\n const acc = toolCallAccs.get(idx)!;\n if (tc.id) acc.id = tc.id;\n if (tc.function?.name) acc.name = tc.function.name;\n if (tc.function?.arguments) acc.arguments += tc.function.arguments;\n }\n }\n\n const finish = parsed.choices?.[0]?.finish_reason;\n if (finish === 'tool_calls' || finish === 'stop') {\n for (const [, acc] of toolCallAccs) {\n let parsedInput: Record<string, unknown> = {};\n try { parsedInput = JSON.parse(acc.arguments || '{}'); }\n catch { parsedInput = { raw: acc.arguments }; }\n yield { type: 'tool_call', toolName: acc.name, toolInput: parsedInput, toolCallId: acc.id };\n }\n toolCallAccs.clear();\n }\n } catch (e) {\n if (e instanceof Error && e.message !== 'Unexpected end of JSON input') throw e;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n },\n}\n","/**\n * Model selection matrix — picks the cheapest model that can handle the job.\n *\n * Each agent gets a different model based on task complexity:\n * - Scout: fast+cheap (just classification + file search)\n * - Architect: reasoning-heavy (planning)\n * - Builder: coding-optimized (code generation)\n * - Reviewer: moderate (verification)\n */\nimport type { ModelId } from '../providers/types.js';\nimport type { AgentRole, TaskComplexity } from './types.js';\n\nconst MODEL_MATRIX: Record<AgentRole, Record<TaskComplexity, ModelId>> = {\n scout: {\n trivial: 'mistral-small', // $0.15/$0.60 — fast matching, scout is 90% grep\n simple: 'mistral-small',\n moderate: 'mistral-small',\n complex: 'deepseek-v3', // complex scout needs better file relevance\n },\n architect: {\n trivial: 'mistral-small', // trivial never reaches architect\n simple: 'grok-4.1-fast', // $0.20/$0.50 — reasoning OFF for simple planning\n moderate: 'grok-4.1-fast', // $0.20/$0.50 — reasoning ON for deep planning (same price!)\n complex: 'grok-4-beta', // $2/$6 — strongest reasoning for hard problems\n },\n builder: {\n trivial: 'mistral-small', // fast + cheap for trivial one-liners\n simple: 'deepseek-v3', // $0.28/$0.42 — solid coder\n moderate: 'kimi-k2', // $0.60/$2.50 — best coder, 128k context\n complex: 'kimi-k2', // best coder for complex multi-file work\n },\n reviewer: {\n trivial: 'mistral-small', // $0.15/$0.60 — fast pattern matching\n simple: 'mistral-small', // reviewer needs SPEED not intelligence\n moderate: 'mistral-small', // fast + cheap, catches obvious bugs\n complex: 'deepseek-v3', // complex review needs more depth\n },\n explore: {\n trivial: 'mistral-small',\n simple: 'mistral-small',\n moderate: 'mistral-small',\n complex: 'mistral-small',\n },\n plan: {\n trivial: 'mistral-small',\n simple: 'grok-4.1-fast',\n moderate: 'grok-4.1-fast',\n complex: 'grok-4-beta',\n },\n verify: {\n trivial: 'mistral-small',\n simple: 'mistral-small',\n moderate: 'mistral-small',\n complex: 'deepseek-v3',\n },\n};\n\nconst FALLBACK_CHAIN: Record<ModelId, ModelId[]> = {\n 'mistral-small': ['groq-llama-70b', 'deepseek-v3'],\n 'deepseek-v3': ['groq-llama-70b', 'mistral-small'],\n 'grok-4-beta': ['grok-4.1-fast', 'deepseek-v3'],\n 'grok-4.1-fast': ['deepseek-v3', 'groq-llama-70b'],\n 'groq-llama-70b': ['deepseek-v3', 'mistral-small'],\n 'groq-llama-8b': ['mistral-small', 'groq-llama-70b'],\n 'claude-sonnet-4': ['deepseek-v3', 'groq-llama-70b'],\n 'claude-opus-4': ['claude-sonnet-4', 'deepseek-v3'],\n 'gemini-2-flash': ['mistral-small', 'deepseek-v3'],\n 'gemini-2-pro': ['gemini-2-flash', 'deepseek-v3'],\n 'gpt-4o': ['deepseek-v3', 'groq-llama-70b'],\n 'qwen-coder-32b': ['deepseek-v3', 'groq-llama-70b'],\n 'kimi-k2': ['deepseek-v3', 'groq-llama-70b'],\n 'moonshot-v1-8k': ['mistral-small', 'deepseek-v3'],\n 'moonshot-v1-32k': ['moonshot-v1-8k', 'deepseek-v3'],\n 'grok-3': ['grok-4-beta', 'deepseek-v3'],\n 'grok-3-fast': ['grok-3', 'deepseek-v3'],\n 'grok-3-mini-fast': ['mistral-small', 'deepseek-v3'],\n 'gemini-1-5-flash': ['mistral-small', 'deepseek-v3'],\n 'gemini-1-5-pro': ['gemini-2-pro', 'deepseek-v3'],\n 'groq-gpt-oss-120b': ['deepseek-v3', 'groq-llama-70b'],\n 'groq-gpt-oss-20b': ['mistral-small', 'deepseek-v3'],\n 'deepseek-coder': ['deepseek-v3', 'groq-llama-70b'],\n};\n\nexport function selectAgentModel(role: AgentRole, complexity: TaskComplexity, gateMode?: string): ModelId {\n const base = MODEL_MATRIX[role][complexity];\n // direct_builder already proved scope is narrow — cap at deepseek-v3 to save cost\n if (role === 'builder' && (gateMode === 'direct_builder' || gateMode === 'direct_builder_with_memory')) {\n return complexity === 'trivial' ? 'mistral-small' : 'deepseek-v3';\n }\n return base;\n}\n\nexport function getFallbacks(model: ModelId): ModelId[] {\n return FALLBACK_CHAIN[model] ?? ['deepseek-v3', 'groq-llama-70b'];\n}\n\n/**\n * Get provider-specific options for a model selection.\n * Enables reasoning toggles for Grok and reasoning_effort for Mistral.\n */\nexport function getModelOptions(role: AgentRole, complexity: TaskComplexity): Record<string, unknown> | undefined {\n const model = MODEL_MATRIX[role][complexity];\n\n // Grok 4.1 Fast — always reason for planning, toggle for other roles\n if (model === 'grok-4.1-fast') {\n return {\n reasoning: { enabled: role === 'plan' || role === 'architect' || complexity !== 'simple' },\n };\n }\n\n // Grok 4 Beta — always enable reasoning (that's why we pay for it)\n if (model === 'grok-4-beta') {\n return {\n reasoning: { enabled: true },\n };\n }\n\n // Mistral — set reasoning_effort based on role\n if (model === 'mistral-small') {\n if (role === 'scout' || role === 'reviewer') {\n return { reasoning_effort: 'none' };\n }\n if (role === 'builder') {\n return { reasoning_effort: 'low' };\n }\n }\n\n return undefined;\n}\n","import { Provider, ModelId, MODELS, CompletionRequest, CompletionResponse, AgentStreamChunk } from './types.js';\nimport { config } from '../utils/config.js';\nimport { anthropicProvider } from './anthropic.js';\nimport { deepseekProvider } from './deepseek.js';\nimport { kimiProvider } from './kimi.js';\nimport { grokProvider } from './grok.js';\nimport { groqProvider } from './groq.js';\nimport { mistralProvider } from './mistral.js';\nimport { qwenProvider } from './qwen.js';\nimport { geminiProvider } from './gemini.js';\nimport { gatewayProvider } from './gateway.js';\n\n// Registry of all providers\nconst providers: Map<string, Provider> = new Map([\n ['anthropic', anthropicProvider],\n ['deepseek', deepseekProvider],\n ['kimi', kimiProvider],\n ['grok', grokProvider],\n ['groq', groqProvider],\n ['mistral', mistralProvider],\n ['openrouter', qwenProvider],\n ['gemini', geminiProvider],\n]);\n\nexport function getProvider(modelId: ModelId): Provider {\n // If a direct BYOK key is configured for this model's provider, use it directly.\n // Otherwise fall back to the Mint Gateway.\n const modelInfo = MODELS[modelId];\n if (modelInfo) {\n const directProvider = providers.get(modelInfo.provider);\n if (directProvider && hasProviderKey(modelInfo.provider)) {\n return directProvider;\n }\n }\n return gatewayProvider;\n}\n\nfunction hasProviderKey(providerId: string): boolean {\n try {\n const providerKeys = config.get('providers') as Record<string, string> | undefined;\n return !!providerKeys?.[providerId];\n } catch {\n return false;\n }\n}\n\nexport async function complete(request: CompletionRequest): Promise<CompletionResponse> {\n const provider = getProvider(request.model);\n return provider.complete(request);\n}\n\nexport async function* streamComplete(request: CompletionRequest): AsyncIterable<string> {\n const provider = getProvider(request.model);\n if (!provider.streamComplete) {\n throw new Error(`Provider ${provider.id} does not support streaming`);\n }\n yield* provider.streamComplete(request);\n}\n\nfunction isRetryableError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n return err.message.includes('429') || err.message.includes('500') ||\n err.message.includes('timeout') || err.message.includes('ECONNREFUSED') ||\n err.message.includes('402') || /insufficient balance/i.test(err.message);\n}\n\nexport async function completeWithFallback(request: CompletionRequest): Promise<CompletionResponse> {\n const { getFallbacks } = await import('../agents/model-selector.js');\n const models: ModelId[] = [request.model, ...getFallbacks(request.model)];\n\n for (const model of models) {\n try {\n const provider = getProvider(model);\n const result = await provider.complete({ ...request, model });\n return result;\n } catch (err) {\n if (!isRetryableError(err) || model === models[models.length - 1]) {\n throw err;\n }\n console.error(`[fallback] ${model} failed, trying next...`);\n }\n }\n throw new Error('All providers failed');\n}\n\nexport async function* streamCompleteWithFallback(request: CompletionRequest): AsyncIterable<string> {\n const { getFallbacks } = await import('../agents/model-selector.js');\n const models: ModelId[] = [request.model, ...getFallbacks(request.model)];\n\n for (const model of models) {\n try {\n const provider = getProvider(model);\n if (!provider.streamComplete) {\n throw new Error(`Provider ${provider.id} does not support streaming`);\n }\n yield* provider.streamComplete({ ...request, model });\n return; // success — stop trying fallbacks\n } catch (err) {\n if (!isRetryableError(err) || model === models[models.length - 1]) {\n throw err;\n }\n console.error(`[fallback] ${model} failed, trying next...`);\n }\n }\n throw new Error('All providers failed');\n}\n\nexport async function* streamAgent(request: CompletionRequest): AsyncIterable<AgentStreamChunk> {\n // Agent streaming requires tool-call support (OpenAI function calling format).\n // The gateway doesn't support this — only direct providers do.\n // Try: 1) direct provider for requested model, 2) any direct provider with a key, 3) error.\n\n type AgentProvider = Provider & { streamAgent: (r: CompletionRequest) => AsyncIterable<AgentStreamChunk> };\n\n const hasAgent = (p: Provider): p is AgentProvider =>\n typeof (p as AgentProvider).streamAgent === 'function';\n\n const candidates: Array<{ label: string; request: CompletionRequest; provider: AgentProvider }> = [];\n\n const pushCandidate = (label: string, model: ModelId, provider: Provider | undefined) => {\n if (!provider || !hasAgent(provider)) return;\n if (candidates.some((candidate) => candidate.label === label)) return;\n candidates.push({\n label,\n request: { ...request, model },\n provider,\n });\n };\n\n // Try the requested model's direct provider first\n const modelInfo = MODELS[request.model];\n if (modelInfo) {\n const directProvider = providers.get(modelInfo.provider);\n if (directProvider && hasProviderKey(modelInfo.provider) && hasAgent(directProvider)) {\n pushCandidate(`${modelInfo.provider}/${request.model}`, request.model, directProvider);\n }\n }\n\n // Try fallback models that have direct keys\n const { getFallbacks } = await import('../agents/model-selector.js');\n const fallbacks = getFallbacks(request.model);\n for (const fallbackModel of fallbacks) {\n const fbInfo = MODELS[fallbackModel];\n if (!fbInfo) continue;\n const fbProvider = providers.get(fbInfo.provider);\n if (fbProvider && hasProviderKey(fbInfo.provider) && hasAgent(fbProvider)) {\n pushCandidate(`${fbInfo.provider}/${fallbackModel}`, fallbackModel, fbProvider);\n }\n }\n\n // Last resort: try any provider that has a key and supports agent streaming\n for (const [providerId, provider] of providers) {\n if (hasProviderKey(providerId) && hasAgent(provider)) {\n // Find any model this provider supports\n const anyModel = Object.entries(MODELS).find(([, info]) => info.provider === providerId);\n if (anyModel) {\n pushCandidate(`${providerId}/${anyModel[0]}`, anyModel[0] as ModelId, provider);\n }\n }\n }\n\n if (candidates.length > 0) {\n for (let index = 0; index < candidates.length; index++) {\n const candidate = candidates[index]!;\n let emittedAny = false;\n\n try {\n if (index > 0) {\n console.error(`[agent] Falling back to ${candidate.label}`);\n }\n\n for await (const chunk of candidate.provider.streamAgent(candidate.request)) {\n emittedAny = true;\n yield chunk;\n }\n return;\n } catch (err) {\n const isLast = index === candidates.length - 1;\n if (emittedAny || !isRetryableError(err) || isLast) {\n throw err;\n }\n console.error(`[agent] ${candidate.label} failed, trying next...`);\n }\n }\n }\n\n // Fall back to the gateway — it supports agent streaming via /v1/agent\n if (hasAgent(gatewayProvider)) {\n // silent — gateway fallback is expected behavior\n yield* gatewayProvider.streamAgent(request);\n return;\n }\n\n throw new Error(\n 'No provider with a direct API key supports agent mode. ' +\n 'Add a key with: mint config:set providers.deepseek <key>'\n );\n}\n\nexport function isModelAvailable(modelId: ModelId): boolean {\n const modelInfo = MODELS[modelId];\n return modelInfo ? providers.has(modelInfo.provider) : false;\n}\n\nexport function listProviders(): Provider[] {\n return Array.from(providers.values());\n}\n\nexport function listModels(): Array<{ id: ModelId; provider: string; name: string }> {\n return Object.entries(MODELS).map(([id, info]) => ({\n id: id as ModelId,\n provider: info.provider,\n name: info.name,\n }));\n}\n","/**\n * Dependency graph — adjacency list with BFS/DFS traversal.\n * Used by the indexer to map import relationships and by search\n * to expand relevant files to their immediate dependencies.\n */\n\nexport interface GraphNode {\n path: string;\n imports: string[]; // files this node imports\n importedBy: string[]; // files that import this node (reverse edges)\n}\n\nexport class DependencyGraph {\n private nodes = new Map<string, GraphNode>();\n\n /** Add a file and its import edges. */\n addFile(path: string, imports: string[]): void {\n const node = this.getOrCreate(path);\n node.imports = imports;\n\n // Build reverse edges\n for (const imp of imports) {\n const target = this.getOrCreate(imp);\n if (!target.importedBy.includes(path)) {\n target.importedBy.push(path);\n }\n }\n }\n\n /** Get a node by path. */\n get(path: string): GraphNode | undefined {\n return this.nodes.get(path);\n }\n\n /** Get all file paths in the graph. */\n allPaths(): string[] {\n return Array.from(this.nodes.keys());\n }\n\n /** Get the number of files in the graph. */\n get size(): number {\n return this.nodes.size;\n }\n\n /**\n * BFS from a set of seed files, expanding up to `maxDepth` levels.\n * Returns all reachable files (both forward imports and reverse importedBy).\n */\n expand(seeds: string[], maxDepth: number = 1): string[] {\n const visited = new Set<string>(seeds);\n let frontier = [...seeds];\n\n for (let depth = 0; depth < maxDepth && frontier.length > 0; depth++) {\n const next: string[] = [];\n for (const path of frontier) {\n const node = this.nodes.get(path);\n if (!node) continue;\n\n for (const neighbor of [...node.imports, ...node.importedBy]) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n next.push(neighbor);\n }\n }\n }\n frontier = next;\n }\n\n return Array.from(visited);\n }\n\n /**\n * Find the most \"central\" files — those with the highest combined\n * in-degree + out-degree. These are typically core modules.\n */\n centralFiles(topN: number = 10): Array<{ path: string; degree: number }> {\n const scored: Array<{ path: string; degree: number }> = [];\n for (const [path, node] of this.nodes) {\n scored.push({ path, degree: node.imports.length + node.importedBy.length });\n }\n scored.sort((a, b) => b.degree - a.degree);\n return scored.slice(0, topN);\n }\n\n /** Serialize to a plain object for JSON persistence. */\n toJSON(): Record<string, { imports: string[]; importedBy: string[] }> {\n const out: Record<string, { imports: string[]; importedBy: string[] }> = {};\n for (const [path, node] of this.nodes) {\n out[path] = { imports: node.imports, importedBy: node.importedBy };\n }\n return out;\n }\n\n /** Restore from a serialized object. */\n static fromJSON(data: Record<string, { imports: string[]; importedBy: string[] }>): DependencyGraph {\n const graph = new DependencyGraph();\n for (const [path, edges] of Object.entries(data)) {\n const node = graph.getOrCreate(path);\n node.imports = edges.imports;\n node.importedBy = edges.importedBy;\n }\n return graph;\n }\n\n private getOrCreate(path: string): GraphNode {\n let node = this.nodes.get(path);\n if (!node) {\n node = { path, imports: [], importedBy: [] };\n this.nodes.set(path, node);\n }\n return node;\n }\n}\n","/**\n * Project indexer — scans a codebase and builds a structured index.\n *\n * Runs on `mint init`. For each source file:\n * 1. Extract imports/requires\n * 2. Extract exported symbols (regex-based, not AST)\n * 3. Count lines of code\n * 4. Build the dependency graph\n *\n * Saves result to `.mint/context.json`.\n */\nimport { readFile, writeFile, mkdir, readdir, stat } from 'node:fs/promises';\nimport { join, relative, extname, dirname, resolve } from 'node:path';\nimport { glob } from 'glob';\nimport ignore from 'ignore';\nimport { DependencyGraph } from './graph.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface FileIndex {\n imports: string[];\n exports: string[];\n summary: string;\n loc: number;\n language: string;\n}\n\nexport interface ProjectIndex {\n projectRoot: string;\n totalFiles: number;\n totalLOC: number;\n language: string; // dominant language\n files: Record<string, FileIndex>;\n graph: Record<string, { imports: string[]; importedBy: string[] }>;\n indexedAt: string;\n}\n\n// ─── Source file patterns ────────────────────────────────────────────────────\n\nconst SOURCE_EXTENSIONS = new Set([\n '.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs',\n '.py', '.go', '.rs', '.java', '.rb', '.php',\n '.c', '.cpp', '.h', '.hpp', '.cs', '.swift', '.kt', '.scala',\n '.vue', '.svelte',\n '.html', '.css', '.scss', '.sass', '.less',\n '.json', '.yaml', '.yml', '.toml', '.md',\n]);\n\nconst LANGUAGE_MAP: Record<string, string> = {\n '.ts': 'typescript', '.tsx': 'typescript', '.js': 'javascript', '.jsx': 'javascript',\n '.mjs': 'javascript', '.cjs': 'javascript',\n '.py': 'python', '.go': 'go', '.rs': 'rust', '.java': 'java',\n '.rb': 'ruby', '.php': 'php', '.c': 'c', '.cpp': 'cpp',\n '.h': 'c', '.hpp': 'cpp', '.cs': 'csharp', '.swift': 'swift',\n '.kt': 'kotlin', '.scala': 'scala', '.vue': 'vue', '.svelte': 'svelte',\n '.html': 'html', '.css': 'css', '.scss': 'scss', '.sass': 'sass', '.less': 'less',\n '.json': 'json', '.yaml': 'yaml', '.yml': 'yaml', '.toml': 'toml', '.md': 'markdown',\n};\n\nconst DEFAULT_IGNORES = [\n 'node_modules', '.git', 'dist', 'build', '.next', '.nuxt', 'landing/dist',\n 'coverage', '__pycache__', '.venv', 'venv', 'target',\n '.mint', '.axon', '.claude',\n // Common vendored / reference directories\n 'vendor', 'third_party', 'external',\n];\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nexport interface IndexOptions {\n /** Called with progress updates. */\n onProgress?: (message: string) => void;\n}\n\n/**\n * Scan a project directory and build the full index.\n * Returns the index object and also saves it to `.mint/context.json`.\n */\nexport async function indexProject(cwd: string, options: IndexOptions = {}): Promise<ProjectIndex> {\n const { onProgress } = options;\n const ig = await loadIgnoreFilter(cwd);\n\n onProgress?.('Scanning files...');\n\n // Prefer git-tracked files (avoids indexing untracked reference dirs, vendor, etc.)\n // Fall back to glob if not a git repo.\n let allFiles: string[];\n try {\n const { execSync } = await import('node:child_process');\n // --cached: tracked files. --others --exclude-standard: untracked but not gitignored.\n // This catches both committed files and new files the user is working on.\n const gitOutput = execSync('git ls-files --cached --others --exclude-standard', {\n cwd,\n encoding: 'utf8',\n timeout: 10_000,\n maxBuffer: 10 * 1024 * 1024, // 10MB — large repos\n stdio: ['pipe', 'pipe', 'pipe'], // suppress git's \"fatal: not a git repository\" stderr\n });\n allFiles = gitOutput.split('\\n').filter(Boolean);\n } catch {\n allFiles = await glob('**/*', { cwd, nodir: true, absolute: false });\n }\n\n let sourceFiles = allFiles\n .filter(f => SOURCE_EXTENSIONS.has(extname(f)))\n .filter(f => !ig.ignores(f));\n\n // Auto-exclude top-level directories that dominate the file count\n // (likely vendored, reference, or generated code).\n if (sourceFiles.length > 200) {\n const dirCounts = new Map<string, number>();\n for (const f of sourceFiles) {\n const topDir = f.split('/')[0];\n dirCounts.set(topDir, (dirCounts.get(topDir) ?? 0) + 1);\n }\n const threshold = sourceFiles.length * 0.4;\n const excludeDirs = new Set<string>();\n for (const [dir, count] of dirCounts) {\n // Exclude dirs that aren't the main source (src/, lib/, app/) and are huge\n if (count > threshold && !['src', 'lib', 'app', 'packages'].includes(dir)) {\n excludeDirs.add(dir);\n onProgress?.(`Skipping ${dir}/ (${count} files — likely vendored/reference)`);\n }\n }\n if (excludeDirs.size > 0) {\n sourceFiles = sourceFiles.filter(f => !excludeDirs.has(f.split('/')[0]));\n }\n }\n\n onProgress?.(`Found ${sourceFiles.length} source files`);\n\n // Process each file\n const files: Record<string, FileIndex> = {};\n const graph = new DependencyGraph();\n const langCounts: Record<string, number> = {};\n let totalLOC = 0;\n\n for (let i = 0; i < sourceFiles.length; i++) {\n const filePath = sourceFiles[i];\n const ext = extname(filePath);\n const language = LANGUAGE_MAP[ext] ?? 'text';\n\n try {\n const content = await readFile(join(cwd, filePath), 'utf-8');\n const lines = content.split('\\n');\n const loc = lines.filter(l => l.trim().length > 0).length;\n\n const imports = extractImports(content, filePath, language);\n const exports = extractExports(content, language);\n const summary = generateSummary(filePath, exports, loc, language);\n\n // Resolve import paths to actual files in the project\n const resolvedImports = imports\n .map(imp => resolveImportPath(imp, filePath, cwd, sourceFiles))\n .filter((p): p is string => p !== null);\n\n files[filePath] = { imports: resolvedImports, exports, summary, loc, language };\n graph.addFile(filePath, resolvedImports);\n\n totalLOC += loc;\n langCounts[language] = (langCounts[language] ?? 0) + loc;\n } catch {\n // Skip unreadable files\n }\n\n // Progress every 50 files\n if ((i + 1) % 50 === 0) {\n onProgress?.(`Indexed ${i + 1}/${sourceFiles.length} files`);\n }\n }\n\n // Determine dominant language\n const dominantLanguage = Object.entries(langCounts)\n .sort((a, b) => b[1] - a[1])[0]?.[0] ?? 'unknown';\n\n const index: ProjectIndex = {\n projectRoot: cwd,\n totalFiles: sourceFiles.length,\n totalLOC: totalLOC,\n language: dominantLanguage,\n files,\n graph: graph.toJSON(),\n indexedAt: new Date().toISOString(),\n };\n\n // Save to .mint/context.json\n const mintDir = join(cwd, '.mint');\n await mkdir(mintDir, { recursive: true });\n await writeFile(join(mintDir, 'context.json'), JSON.stringify(index, null, 2), 'utf-8');\n\n onProgress?.(`Done: ${sourceFiles.length} files, ${totalLOC.toLocaleString()} LOC, primary language: ${dominantLanguage}`);\n\n return index;\n}\n\n/**\n * Load a previously saved index from `.mint/context.json`.\n * Returns null if no index exists or it's stale.\n */\nexport async function loadIndex(cwd: string): Promise<ProjectIndex | null> {\n try {\n const content = await readFile(join(cwd, '.mint', 'context.json'), 'utf-8');\n return JSON.parse(content) as ProjectIndex;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if the index is stale (older than the newest file modification).\n */\nexport async function isIndexStale(cwd: string): Promise<boolean> {\n const index = await loadIndex(cwd);\n if (!index) return true;\n\n const indexTime = new Date(index.indexedAt).getTime();\n const now = Date.now();\n\n // Consider stale if older than 1 hour\n if (now - indexTime > 3600_000) return true;\n\n // Spot-check: pick 5 random files and see if any are newer\n const paths = Object.keys(index.files);\n const sample = paths.sort(() => Math.random() - 0.5).slice(0, 5);\n\n for (const filePath of sample) {\n try {\n const s = await stat(join(cwd, filePath));\n if (s.mtimeMs > indexTime) return true;\n } catch {\n // File deleted — stale\n return true;\n }\n }\n\n return false;\n}\n\n// ─── Import extraction ──────────────────────────────────────────────────────\n\nfunction extractImports(content: string, filePath: string, language: string): string[] {\n const imports: string[] = [];\n\n if (['typescript', 'javascript'].includes(language)) {\n // ES imports: import ... from 'path'\n const esImportRe = /(?:import|export)\\s+.*?from\\s+['\"]([^'\"]+)['\"]/g;\n let m: RegExpExecArray | null;\n while ((m = esImportRe.exec(content)) !== null) {\n imports.push(m[1]);\n }\n // Dynamic imports: import('path')\n const dynamicRe = /import\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n while ((m = dynamicRe.exec(content)) !== null) {\n imports.push(m[1]);\n }\n // require()\n const requireRe = /require\\s*\\(\\s*['\"]([^'\"]+)['\"]\\s*\\)/g;\n while ((m = requireRe.exec(content)) !== null) {\n imports.push(m[1]);\n }\n } else if (language === 'python') {\n // from X import Y / import X\n const pyImportRe = /(?:from\\s+(\\S+)\\s+import|import\\s+(\\S+))/g;\n let m: RegExpExecArray | null;\n while ((m = pyImportRe.exec(content)) !== null) {\n imports.push(m[1] ?? m[2]);\n }\n } else if (language === 'go') {\n // import \"path\" or import ( \"path\" )\n const goImportRe = /import\\s+(?:\\(\\s*([\\s\\S]*?)\\s*\\)|\"([^\"]+)\")/g;\n let m: RegExpExecArray | null;\n while ((m = goImportRe.exec(content)) !== null) {\n if (m[2]) {\n imports.push(m[2]);\n } else if (m[1]) {\n const blockRe = /\"([^\"]+)\"/g;\n let bm: RegExpExecArray | null;\n while ((bm = blockRe.exec(m[1])) !== null) {\n imports.push(bm[1]);\n }\n }\n }\n } else if (language === 'rust') {\n // use crate::path or use path\n const rustUseRe = /use\\s+([\\w:]+)/g;\n let m: RegExpExecArray | null;\n while ((m = rustUseRe.exec(content)) !== null) {\n imports.push(m[1]);\n }\n } else if (language === 'java' || language === 'kotlin' || language === 'scala') {\n const javaImportRe = /import\\s+([\\w.]+)/g;\n let m: RegExpExecArray | null;\n while ((m = javaImportRe.exec(content)) !== null) {\n imports.push(m[1]);\n }\n }\n\n return imports;\n}\n\n// ─── Export extraction ──────────────────────────────────────────────────────\n\nfunction extractExports(content: string, language: string): string[] {\n const exports: string[] = [];\n\n if (['typescript', 'javascript'].includes(language)) {\n // export function/const/class/type/interface/enum NAME\n const exportRe = /export\\s+(?:default\\s+)?(?:async\\s+)?(?:function|const|let|var|class|type|interface|enum)\\s+(\\w+)/g;\n let m: RegExpExecArray | null;\n while ((m = exportRe.exec(content)) !== null) {\n exports.push(m[1]);\n }\n // export { name1, name2 }\n const namedExportRe = /export\\s*\\{([^}]+)\\}/g;\n while ((m = namedExportRe.exec(content)) !== null) {\n const names = m[1].split(',').map(n => n.trim().split(/\\s+as\\s+/).pop()!.trim());\n exports.push(...names.filter(Boolean));\n }\n // export default (anonymous)\n if (/export\\s+default\\s+/.test(content) && !exports.includes('default')) {\n exports.push('default');\n }\n } else if (language === 'python') {\n // def name / class name / NAME = (module-level)\n const pyDefRe = /^(?:def|class)\\s+(\\w+)/gm;\n let m: RegExpExecArray | null;\n while ((m = pyDefRe.exec(content)) !== null) {\n exports.push(m[1]);\n }\n // __all__ = [...]\n const allRe = /__all__\\s*=\\s*\\[([^\\]]+)\\]/;\n const allMatch = allRe.exec(content);\n if (allMatch) {\n const names = allMatch[1].match(/['\"](\\w+)['\"]/g);\n if (names) {\n exports.push(...names.map(n => n.replace(/['\"]/g, '')));\n }\n }\n } else if (language === 'go') {\n // Exported = starts with uppercase: func Name / type Name\n const goExportRe = /^(?:func|type|var|const)\\s+([A-Z]\\w*)/gm;\n let m: RegExpExecArray | null;\n while ((m = goExportRe.exec(content)) !== null) {\n exports.push(m[1]);\n }\n }\n\n return [...new Set(exports)];\n}\n\n// ─── Summary generation ─────────────────────────────────────────────────────\n\nfunction generateSummary(filePath: string, exports: string[], loc: number, language: string): string {\n const fileName = filePath.split('/').pop() ?? filePath;\n const dir = dirname(filePath);\n\n // Infer purpose from path segments\n const pathParts = filePath.toLowerCase().split('/');\n const hints: string[] = [];\n\n if (pathParts.some(p => ['test', 'tests', '__tests__', 'spec'].includes(p))) hints.push('test');\n if (pathParts.some(p => ['util', 'utils', 'helpers', 'lib'].includes(p))) hints.push('utility');\n if (pathParts.some(p => ['api', 'routes', 'controllers', 'handlers'].includes(p))) hints.push('API');\n if (pathParts.some(p => ['components', 'views', 'pages'].includes(p))) hints.push('UI');\n if (pathParts.some(p => ['models', 'entities', 'schemas'].includes(p))) hints.push('data model');\n if (pathParts.some(p => ['services', 'providers'].includes(p))) hints.push('service');\n if (pathParts.some(p => ['config', 'settings'].includes(p))) hints.push('configuration');\n if (pathParts.some(p => ['middleware'].includes(p))) hints.push('middleware');\n if (pathParts.some(p => ['hooks'].includes(p))) hints.push('hook');\n if (pathParts.some(p => ['context'].includes(p))) hints.push('context');\n if (pathParts.some(p => ['agent', 'agents'].includes(p))) hints.push('agent');\n if (pathParts.some(p => ['tools'].includes(p))) hints.push('tool');\n if (fileName === 'index.ts' || fileName === 'index.js') hints.push('entry point');\n\n const typeHint = hints.length > 0 ? hints.join('/') + ' ' : '';\n const exportList = exports.slice(0, 5).join(', ');\n const moreExports = exports.length > 5 ? ` +${exports.length - 5} more` : '';\n\n return `${typeHint}${language} (${loc} LOC)${exportList ? ` — exports: ${exportList}${moreExports}` : ''}`;\n}\n\n// ─── Import resolution ──────────────────────────────────────────────────────\n\n/**\n * Try to resolve a raw import string to an actual file in the project.\n * Returns null for external packages (node_modules, stdlib).\n */\nfunction resolveImportPath(\n rawImport: string,\n fromFile: string,\n cwd: string,\n knownFiles: string[],\n): string | null {\n // Skip external packages\n if (!rawImport.startsWith('.') && !rawImport.startsWith('/')) {\n return null;\n }\n\n const fromDir = dirname(fromFile);\n let resolved = join(fromDir, rawImport).replace(/\\\\/g, '/');\n\n // Strip .js/.ts extension variants for matching\n const stripped = resolved.replace(/\\.(js|ts|tsx|jsx|mjs|cjs)$/, '');\n\n // Try exact match, then with extensions\n const candidates = [\n resolved,\n stripped + '.ts',\n stripped + '.tsx',\n stripped + '.js',\n stripped + '.jsx',\n stripped + '/index.ts',\n stripped + '/index.tsx',\n stripped + '/index.js',\n ];\n\n for (const candidate of candidates) {\n // Normalize: remove leading ./\n const normalized = candidate.replace(/^\\.\\//, '');\n if (knownFiles.includes(normalized)) {\n return normalized;\n }\n }\n\n return null;\n}\n\n// ─── Ignore filter ──────────────────────────────────────────────────────────\n\nasync function loadIgnoreFilter(cwd: string) {\n const ig = ignore();\n ig.add(DEFAULT_IGNORES);\n try {\n const content = await readFile(join(cwd, '.gitignore'), 'utf-8');\n ig.add(content.split('\\n').filter(l => l.trim() && !l.startsWith('#')));\n } catch { /* no .gitignore */ }\n return ig;\n}\n","/**\n * File relevance search — finds the most relevant files for a given task.\n *\n * Uses the project index (from indexer.ts) + dependency graph to:\n * 1. Extract keywords from the task\n * 2. Score files by keyword match against paths, exports, summaries\n * 3. Expand top hits via the dependency graph (1 level)\n * 4. Return ranked files with content\n */\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { ProjectIndex } from './indexer.js';\nimport { DependencyGraph } from './graph.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface SearchResult {\n path: string;\n content: string;\n language: string;\n score: number;\n reason: string; // why this file was included\n}\n\nexport interface SearchOptions {\n /** Maximum files to return (default: 8) */\n maxFiles?: number;\n /** Depth to expand via dependency graph (default: 1) */\n graphDepth?: number;\n /** Extra file paths to always include */\n alwaysInclude?: string[];\n}\n\n// ─── Stop words ──────────────────────────────────────────────────────────────\n\nconst STOP_WORDS = new Set([\n 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being',\n 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',\n 'should', 'may', 'might', 'can', 'shall', 'to', 'of', 'in', 'for',\n 'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through', 'during',\n 'before', 'after', 'above', 'below', 'between', 'out', 'off', 'over',\n 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when',\n 'where', 'why', 'how', 'all', 'each', 'every', 'both', 'few', 'more',\n 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own',\n 'same', 'so', 'than', 'too', 'very', 'just', 'because', 'but', 'and',\n 'or', 'if', 'while', 'this', 'that', 'these', 'those', 'it', 'its',\n 'i', 'me', 'my', 'we', 'our', 'you', 'your', 'he', 'she', 'they',\n 'them', 'what', 'which', 'who', 'whom', 'make', 'like', 'use', 'get',\n 'new', 'file', 'code', 'change', 'update', 'need', 'want', 'please',\n]);\n\nconst GENERIC_PATH_SEGMENTS = new Set([\n 'src', 'app', 'lib', 'dist', 'build', 'node_modules', 'public', 'assets',\n 'index', 'main', 'test', 'tests',\n]);\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\n/**\n * Search the project index for files relevant to a task description.\n */\nexport async function searchRelevantFiles(\n cwd: string,\n task: string,\n index: ProjectIndex,\n options: SearchOptions = {},\n): Promise<SearchResult[]> {\n const { maxFiles = 8, graphDepth = 1, alwaysInclude = [] } = options;\n\n const rawKeywords = extractKeywords(task);\n if (rawKeywords.length === 0) return [];\n const keywords = expandKeywordsFromTask(task, rawKeywords);\n const pathHintFiles = collectPathHintFiles(task, index, maxFiles);\n\n // Score every indexed file\n const scored: Array<{ path: string; score: number; reasons: string[] }> = [];\n\n for (const [filePath, fileInfo] of Object.entries(index.files)) {\n const { score, reasons } = scoreFile(filePath, fileInfo, keywords);\n if (score > 0) {\n scored.push({ path: filePath, score, reasons });\n }\n }\n\n // Sort by score descending\n scored.sort((a, b) => b.score - a.score);\n\n // Take top candidates (before graph expansion)\n const topPaths = scored.slice(0, Math.max(4, maxFiles)).map(s => s.path);\n\n // Expand via dependency graph\n const graph = DependencyGraph.fromJSON(index.graph);\n const expanded = graph.expand(topPaths, graphDepth);\n\n // Merge: scored files + graph-expanded files + always-include\n const allPaths = new Set<string>([...topPaths, ...alwaysInclude, ...pathHintFiles]);\n for (const p of expanded) {\n if (allPaths.size >= maxFiles * 2) break; // cap expansion\n allPaths.add(p);\n }\n\n // Build final scored list\n const scoreMap = new Map(scored.map(s => [s.path, s]));\n const pathHintSet = new Set(pathHintFiles);\n const finalScored: Array<{ path: string; score: number; reason: string }> = [];\n\n for (const p of allPaths) {\n const entry = scoreMap.get(p);\n if (entry) {\n finalScored.push({ path: p, score: entry.score, reason: entry.reasons.join(', ') });\n } else if (pathHintSet.has(p)) {\n finalScored.push({ path: p, score: 90, reason: 'path-hint match' });\n } else if (alwaysInclude.includes(p)) {\n finalScored.push({ path: p, score: 100, reason: 'always-include' });\n } else {\n // Graph-expanded file\n finalScored.push({ path: p, score: 0.5, reason: 'dependency of matched file' });\n }\n }\n\n // Sort and take top N\n finalScored.sort((a, b) => b.score - a.score);\n const topN = finalScored.slice(0, maxFiles);\n\n // Read file contents\n const results: SearchResult[] = [];\n for (const { path, score, reason } of topN) {\n try {\n const content = await readFile(join(cwd, path), 'utf-8');\n const language = index.files[path]?.language ?? 'text';\n results.push({ path, content, language, score, reason });\n } catch {\n // File may have been deleted since indexing\n }\n }\n\n return results;\n}\n\n/**\n * Lightweight search without a full index — falls back to keyword grep\n * on file paths and content. Used when no index exists.\n */\nexport function extractKeywords(task: string): string[] {\n return task\n .toLowerCase()\n .replace(/[^a-z0-9_\\-\\.\\/]/g, ' ')\n .split(/\\s+/)\n .filter(w => w.length > 2 && !STOP_WORDS.has(w))\n // Deduplicate\n .filter((w, i, arr) => arr.indexOf(w) === i);\n}\n\nexport function collectPathHintFiles(\n task: string,\n index: ProjectIndex,\n maxFiles = 8,\n): string[] {\n const indexedPaths = new Set(Object.keys(index.files));\n\n // 1. Direct file path extraction — if the user wrote an exact path, use it\n const directPaths: string[] = [];\n const pathPattern = /(?:^|\\s)([\\w\\-\\.\\/]+\\.[\\w]{1,6})(?:\\s|$|[,;:!?)])/g;\n let pathMatch;\n while ((pathMatch = pathPattern.exec(task)) !== null) {\n const candidate = pathMatch[1];\n if (indexedPaths.has(candidate)) {\n directPaths.push(candidate);\n }\n }\n if (directPaths.length > 0) return directPaths;\n\n // 2. Keyword-based matching against path segments\n const taskTokens = task\n .toLowerCase()\n .replace(/[^a-z0-9_\\-\\.\\/]/g, ' ')\n .split(/\\s+/)\n .filter((token) => token.length > 1);\n\n if (taskTokens.length === 0) return [];\n\n return Object.keys(index.files)\n .map((filePath) => {\n const segments = getPathSegments(filePath);\n const matches = taskTokens.filter((token) => segments.includes(token));\n if (matches.length === 0) return null;\n\n const entryPointBoost =\n /(?:^|\\/)(index|main|app|home)\\.[a-z0-9]+$/i.test(filePath) ? 1 : 0;\n const shallowBoost = Math.max(0, 3 - filePath.split('/').length) * 0.1;\n return {\n path: filePath,\n score: matches.length + entryPointBoost + shallowBoost,\n };\n })\n .filter((entry): entry is { path: string; score: number } => entry !== null)\n .sort((left, right) => right.score - left.score)\n .slice(0, Math.max(4, Math.min(maxFiles, 6)))\n .map((entry) => entry.path);\n}\n\n// ─── Scoring ────────────────────────────────────────────────────────────────\n\ninterface FileInfo {\n imports: string[];\n exports: string[];\n summary: string;\n loc: number;\n language: string;\n}\n\n// Map intent phrases to file path patterns they likely refer to\nconst CONCEPT_EXPANSIONS: Array<{ pattern: RegExp; pathHints: string[] }> = [\n { pattern: /\\b(backend|endpoint|api|route|server|health)\\b/i, pathHints: ['gateway', 'server', 'api', 'routes', 'index.ts'] },\n { pattern: /\\b(frontend|hero|landing|footer|header|navbar|page|section|ui)\\b/i, pathHints: ['landing', 'index.html', 'components', 'pages', 'app'] },\n { pattern: /\\b(database|schema|migration|table|query)\\b/i, pathHints: ['db', 'database', 'schema', 'migration', 'prisma'] },\n { pattern: /\\b(test|spec|assert)\\b/i, pathHints: ['test', 'spec', '__tests__'] },\n { pattern: /\\b(config|env|setting)\\b/i, pathHints: ['config', '.env', 'settings'] },\n { pattern: /\\b(deploy|docker|ci|pipeline)\\b/i, pathHints: ['docker', 'ci', 'deploy', '.github'] },\n];\n\nfunction expandKeywordsFromTask(task: string, keywords: string[]): string[] {\n const expanded = [...keywords];\n for (const { pattern, pathHints } of CONCEPT_EXPANSIONS) {\n if (pattern.test(task)) {\n for (const hint of pathHints) {\n if (!expanded.includes(hint)) expanded.push(hint);\n }\n }\n }\n return expanded;\n}\n\nfunction scoreFile(\n filePath: string,\n fileInfo: FileInfo,\n keywords: string[],\n): { score: number; reasons: string[] } {\n let score = 0;\n const reasons: string[] = [];\n const pathLower = filePath.toLowerCase();\n\n for (const kw of keywords) {\n // Path match (highest signal — user mentioned a specific file/dir)\n if (pathLower.includes(kw)) {\n // Landing page files get higher boost\n if (pathLower.includes('landing/')) {\n score += 5;\n reasons.push(`path contains \"${kw}\" (landing page boost)`);\n } else {\n score += 3;\n reasons.push(`path contains \"${kw}\"`);\n }\n }\n\n // Export name match (strong signal — user mentioned a function/class)\n const exportMatch = fileInfo.exports.some(e => e.toLowerCase().includes(kw));\n if (exportMatch) {\n score += 2;\n reasons.push(`exports match \"${kw}\"`);\n }\n\n // Summary match\n if (fileInfo.summary.toLowerCase().includes(kw)) {\n score += 1;\n reasons.push(`summary contains \"${kw}\"`);\n }\n }\n\n // Boost entry points and central files\n if (filePath.endsWith('index.ts') || filePath.endsWith('index.js')) {\n score *= 1.1;\n }\n\n // Landing page specific boosts\n if (pathLower.includes('landing/')) {\n score *= 1.3; // 30% boost for landing page files\n }\n\n // Slight boost for smaller files (more focused)\n if (fileInfo.loc < 100) {\n score *= 1.05;\n }\n\n return { score, reasons: [...new Set(reasons)] };\n}\n\nfunction getPathSegments(filePath: string): string[] {\n return filePath\n .toLowerCase()\n .split('/')\n .flatMap((part) => part.split(/[._-]/g))\n .filter((segment) => segment.length > 1 && !GENERIC_PATH_SEGMENTS.has(segment));\n}\n\n// ─── Hotspots ───────────────────────────────────────────────────────────────\n\nexport interface Hotspot {\n file: string;\n line: number;\n content: string;\n context: string;\n}\n\nconst MAX_HOTSPOTS_PER_FILE = 5;\nconst MAX_HOTSPOTS_TOTAL = 20;\nconst CONTEXT_LINES = 2;\n\n/**\n * Scan already-loaded file contents for task-relevant lines.\n * Returns the top matching lines with surrounding context.\n * No extra I/O — works purely on in-memory content.\n */\nexport function extractHotspots(files: SearchResult[], task: string): Hotspot[] {\n const keywords = extractKeywords(task);\n if (keywords.length === 0) return [];\n\n const allHotspots: Hotspot[] = [];\n\n for (const file of files) {\n if (!file.content) continue;\n const lines = file.content.split('\\n');\n const scored: Array<{ line: number; content: string; score: number }> = [];\n\n for (let i = 0; i < lines.length; i++) {\n const lower = lines[i].toLowerCase();\n let score = 0;\n for (const kw of keywords) {\n if (lower.includes(kw)) score++;\n }\n if (score > 0) {\n scored.push({ line: i + 1, content: lines[i], score });\n }\n }\n\n // Take top N by score, then by line order\n scored.sort((a, b) => b.score - a.score || a.line - b.line);\n const top = scored.slice(0, MAX_HOTSPOTS_PER_FILE);\n\n for (const match of top) {\n const start = Math.max(0, match.line - 1 - CONTEXT_LINES);\n const end = Math.min(lines.length, match.line + CONTEXT_LINES);\n const contextLines = lines.slice(start, end).map((l, idx) => {\n const lineNum = start + idx + 1;\n const marker = lineNum === match.line ? '>' : ' ';\n return `${marker} ${lineNum}: ${l}`;\n });\n\n allHotspots.push({\n file: file.path,\n line: match.line,\n content: match.content,\n context: contextLines.join('\\n'),\n });\n }\n }\n\n // Sort by keyword density (best matches first), cap total\n return allHotspots\n .sort((a, b) => {\n const aScore = keywords.filter(kw => a.content.toLowerCase().includes(kw)).length;\n const bScore = keywords.filter(kw => b.content.toLowerCase().includes(kw)).length;\n return bScore - aScore;\n })\n .slice(0, MAX_HOTSPOTS_TOTAL);\n}\n","/**\n * MINT.md — project rules file.\n *\n * Auto-generated on `mint init` with detected project patterns.\n * User can edit manually. Injected into every prompt as system context.\n */\nimport { readFile, writeFile, stat, mkdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { ProjectIndex } from './indexer.js';\n\n// ─── Types ───────────────────────────────────────────────────────────────────\n\nexport interface ProjectRules {\n raw: string;\n sourcePath: string;\n loadedAt: number;\n}\n\n// ─── Cache ───────────────────────────────────────────────────────────────────\n\ninterface CacheEntry {\n data: ProjectRules;\n mtime: number;\n}\n\nconst cache = new Map<string, CacheEntry>();\n\n// ─── Load ────────────────────────────────────────────────────────────────────\n\n/**\n * Search for MINT.md in standard locations (first found wins):\n * 1. {cwd}/MINT.md\n * 2. {cwd}/.mint/MINT.md\n *\n * Caches with mtime invalidation — safe to call on every agent iteration.\n */\nexport async function loadProjectRules(cwd: string): Promise<ProjectRules | null> {\n const candidates = [\n join(cwd, 'MINT.md'),\n join(cwd, '.mint', 'MINT.md'),\n ];\n\n for (const candidatePath of candidates) {\n try {\n const stats = await stat(candidatePath);\n const mtime = stats.mtimeMs;\n\n // Cache hit\n const cached = cache.get(candidatePath);\n if (cached && cached.mtime === mtime) {\n return cached.data;\n }\n\n // Cache miss or stale\n const raw = await readFile(candidatePath, 'utf-8');\n const data: ProjectRules = { raw, sourcePath: candidatePath, loadedAt: Date.now() };\n cache.set(candidatePath, { data, mtime });\n return data;\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\n/**\n * Format MINT.md content for injection into the system prompt.\n */\nexport function formatProjectRulesForPrompt(rules: ProjectRules): string {\n return `<project_rules source=\"${rules.sourcePath}\">\\n${rules.raw}\\n</project_rules>\\n`;\n}\n\n// ─── Auto-generate ──────────────────────────────────────────────────────────\n\n/**\n * Auto-generate a MINT.md based on detected project patterns.\n * Only creates it if it doesn't already exist.\n */\nexport async function generateProjectRules(cwd: string, index: ProjectIndex): Promise<string> {\n // Don't overwrite existing\n const existing = await loadProjectRules(cwd);\n if (existing) return existing.sourcePath;\n\n const sections: string[] = [];\n\n // Header\n sections.push('# MINT.md — Project Rules');\n sections.push('');\n sections.push('> Auto-generated by `mint init`. Edit freely — this file is injected into every prompt.');\n sections.push('');\n\n // Project overview\n sections.push('## Project');\n sections.push('');\n sections.push(`- **Language:** ${index.language}`);\n sections.push(`- **Files:** ${index.totalFiles}`);\n sections.push(`- **LOC:** ${index.totalLOC.toLocaleString()}`);\n\n // Detect framework\n const framework = detectFramework(cwd);\n if (framework) {\n sections.push(`- **Framework:** ${framework}`);\n }\n\n // Detect package manager\n const pkgManager = detectPackageManager(cwd);\n if (pkgManager) {\n sections.push(`- **Package Manager:** ${pkgManager}`);\n }\n\n sections.push('');\n\n // Rules section\n sections.push('## Rules');\n sections.push('');\n sections.push('- Be concise. Prefer direct code changes over explanations.');\n sections.push('- Use `read_file` before editing — never edit blindly.');\n sections.push('- Run tests after making changes.');\n sections.push('- Keep changes minimal and focused on the task.');\n sections.push('');\n\n // Architecture section — list central files\n sections.push('## Architecture');\n sections.push('');\n sections.push('Key files (edit these carefully):');\n\n const centralFiles = findCentralFiles(index);\n for (const f of centralFiles.slice(0, 10)) {\n const info = index.files[f];\n sections.push(`- \\`${f}\\` — ${info?.summary ?? ''}`);\n }\n sections.push('');\n\n // Commands section — detect from package.json\n const commands = await detectCommands(cwd);\n if (commands.length > 0) {\n sections.push('## Commands');\n sections.push('');\n for (const cmd of commands) {\n sections.push(`- \\`${cmd.command}\\` — ${cmd.description}`);\n }\n sections.push('');\n }\n\n // Gotchas section (placeholder)\n sections.push('## Gotchas');\n sections.push('');\n sections.push('<!-- Add project-specific pitfalls here -->');\n sections.push('');\n\n const content = sections.join('\\n');\n\n // Write to MINT.md at project root\n const outPath = join(cwd, 'MINT.md');\n await writeFile(outPath, content, 'utf-8');\n\n return outPath;\n}\n\n// ─── Detection helpers ──────────────────────────────────────────────────────\n\nfunction detectFramework(cwd: string): string | null {\n const checks: Array<{ file: string; pattern?: RegExp; name: string }> = [\n { file: 'next.config.js', name: 'Next.js' },\n { file: 'next.config.ts', name: 'Next.js' },\n { file: 'nuxt.config.ts', name: 'Nuxt' },\n { file: 'svelte.config.js', name: 'SvelteKit' },\n { file: 'astro.config.mjs', name: 'Astro' },\n { file: 'vite.config.ts', name: 'Vite' },\n { file: 'vite.config.js', name: 'Vite' },\n { file: 'angular.json', name: 'Angular' },\n { file: 'remix.config.js', name: 'Remix' },\n { file: 'Cargo.toml', name: 'Rust/Cargo' },\n { file: 'go.mod', name: 'Go' },\n { file: 'pyproject.toml', name: 'Python' },\n { file: 'requirements.txt', name: 'Python' },\n { file: 'Gemfile', name: 'Ruby' },\n { file: 'build.gradle', name: 'Gradle' },\n { file: 'pom.xml', name: 'Maven' },\n // Landing page frameworks\n { file: 'landing/vite.config.ts', name: 'Landing (Vite + React)' },\n { file: 'landing/vite.config.js', name: 'Landing (Vite + React)' },\n { file: 'landing/package.json', name: 'Landing (React)' },\n ];\n\n for (const { file, name } of checks) {\n if (existsSync(join(cwd, file))) return name;\n }\n\n // Check package.json dependencies\n try {\n const pkg = JSON.parse(require('node:fs').readFileSync(join(cwd, 'package.json'), 'utf-8'));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n if (deps['react']) return deps['next'] ? 'Next.js + React' : 'React';\n if (deps['vue']) return 'Vue';\n if (deps['express']) return 'Express';\n if (deps['fastify']) return 'Fastify';\n if (deps['hono']) return 'Hono';\n if (deps['ink']) return 'Ink (React CLI)';\n } catch { /* no package.json */ }\n\n return null;\n}\n\nfunction detectPackageManager(cwd: string): string | null {\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn';\n if (existsSync(join(cwd, 'bun.lockb'))) return 'bun';\n if (existsSync(join(cwd, 'package-lock.json'))) return 'npm';\n return null;\n}\n\nfunction findCentralFiles(index: ProjectIndex): string[] {\n // Files with most imports + importedBy = most central\n const scored: Array<{ path: string; degree: number }> = [];\n for (const [path, edges] of Object.entries(index.graph)) {\n scored.push({\n path,\n degree: (edges.imports?.length ?? 0) + (edges.importedBy?.length ?? 0),\n });\n }\n scored.sort((a, b) => b.degree - a.degree);\n return scored.slice(0, 15).map(s => s.path);\n}\n\ninterface CommandInfo {\n command: string;\n description: string;\n}\n\nasync function detectCommands(cwd: string): Promise<CommandInfo[]> {\n const commands: CommandInfo[] = [];\n\n try {\n const pkg = JSON.parse(await readFile(join(cwd, 'package.json'), 'utf-8'));\n const scripts = pkg.scripts ?? {};\n\n const importantScripts = ['build', 'dev', 'start', 'test', 'lint', 'typecheck', 'format'];\n for (const name of importantScripts) {\n if (scripts[name]) {\n commands.push({ command: `npm run ${name}`, description: scripts[name] });\n }\n }\n } catch { /* no package.json */ }\n\n // Makefile\n if (existsSync(join(cwd, 'Makefile'))) {\n commands.push({ command: 'make', description: 'See Makefile for targets' });\n }\n\n return commands;\n}\n\n// ─── Starter skills generation ────────────────────────────────────────────\n\n/**\n * Generate starter skill files in .mint/skills/ based on detected project type.\n * Called during `mint init`.\n */\nexport async function generateStarterSkills(cwd: string): Promise<string[]> {\n const skillsDir = join(cwd, '.mint', 'skills');\n await mkdir(skillsDir, { recursive: true });\n\n const created: string[] = [];\n\n // Detect project type from package.json dependencies\n let deps: Record<string, string> = {};\n let hasPackageJson = false;\n try {\n const pkg = JSON.parse(await readFile(join(cwd, 'package.json'), 'utf-8'));\n deps = { ...pkg.dependencies, ...pkg.devDependencies };\n hasPackageJson = true;\n } catch { /* no package.json */ }\n\n // Check for Python\n const hasPython = existsSync(join(cwd, 'requirements.txt')) ||\n existsSync(join(cwd, 'pyproject.toml')) ||\n existsSync(join(cwd, 'setup.py'));\n\n if (hasPackageJson && (deps['react'] || deps['next'] || deps['vue'] || deps['svelte'])) {\n const framework = deps['next'] ? 'Next.js' : deps['vue'] ? 'Vue' : deps['svelte'] ? 'Svelte' : 'React';\n const skillPath = join(skillsDir, 'react-patterns.md');\n if (!existsSync(skillPath)) {\n await writeFile(skillPath, `---\napplies_to: [frontend]\n---\n# ${framework} Patterns\n# Edit this file to teach Mint your project's conventions\n\n- Use functional components with hooks, not class components\n- Keep components small and focused (under 150 lines)\n- Co-locate component, styles, and tests in the same directory\n- Use TypeScript strict mode for all component props\n- Prefer composition over prop drilling — use context for shared state\n- Name components with PascalCase, hooks with use prefix\n- Extract reusable logic into custom hooks\n- Handle loading, error, and empty states in every data-fetching component\n- Use semantic HTML elements (button, nav, main) over generic divs\n- Keep styles scoped — avoid global CSS mutations\n`, 'utf-8');\n created.push(skillPath);\n }\n }\n\n if (hasPackageJson && (deps['express'] || deps['fastify'] || deps['@nestjs/core'] || deps['hono'])) {\n const framework = deps['express'] ? 'Express' : deps['fastify'] ? 'Fastify' : deps['@nestjs/core'] ? 'NestJS' : 'Hono';\n const skillPath = join(skillsDir, 'api-patterns.md');\n if (!existsSync(skillPath)) {\n await writeFile(skillPath, `---\napplies_to: [backend]\n---\n# ${framework} API Patterns\n# Edit this file to teach Mint your project's conventions\n\n- Validate all request inputs at the handler level\n- Use proper HTTP status codes (201 for create, 204 for delete, 422 for validation)\n- Return consistent error response shape: { error: string, code: string }\n- Use middleware for cross-cutting concerns (auth, logging, rate limiting)\n- Keep route handlers thin — delegate business logic to service layer\n- Never expose internal errors to clients — log and return generic message\n- Use async/await with proper try/catch, never unhandled promises\n- Document API endpoints with JSDoc or OpenAPI annotations\n- Group related routes in separate router files\n- Use environment variables for all configuration, never hardcode secrets\n`, 'utf-8');\n created.push(skillPath);\n }\n }\n\n if (hasPython) {\n const skillPath = join(skillsDir, 'python-style.md');\n if (!existsSync(skillPath)) {\n await writeFile(skillPath, `---\napplies_to: [backend, testing]\n---\n# Python Style Guide\n# Edit this file to teach Mint your project's conventions\n\n- Follow PEP 8 style guidelines\n- Use type hints for function signatures\n- Prefer f-strings over .format() or % formatting\n- Use dataclasses or Pydantic models for structured data\n- Keep functions short and single-purpose\n- Use context managers (with statements) for resource management\n- Write docstrings for all public functions and classes\n- Use virtual environments, never install globally\n- Prefer list comprehensions over map/filter for simple transformations\n- Handle exceptions specifically, never bare except\n`, 'utf-8');\n created.push(skillPath);\n }\n }\n\n // Landing page skills\n if (existsSync(join(cwd, 'landing', 'package.json'))) {\n const skillPath = join(skillsDir, 'landing-page.md');\n if (!existsSync(skillPath)) {\n await writeFile(skillPath, `---applies_to: [frontend, landing]\n---\n# Landing Page Patterns\n# Edit this file to teach Mint your project's conventions for the landing page\n\n- Use functional React components with TypeScript\n- Keep components small and focused (under 200 lines)\n- Co-locate component, styles, and tests in the same directory\n- Use Tailwind CSS for styling (if configured)\n- Prefer CSS-in-JS or styled-components for complex animations\n- Handle loading states and error boundaries gracefully\n- Optimize images and assets for web performance\n- Use semantic HTML elements (button, section, header, footer)\n- Keep hero sections and CTAs above the fold\n- Minimize third-party scripts and trackers\n- Test responsiveness across mobile, tablet, and desktop\n- Use lazy loading for non-critical assets\n- Implement proper SEO meta tags in the head\n- Keep bundle size under control — audit with webpack-bundle-analyzer\n`, 'utf-8');\n created.push(skillPath);\n }\n }\n\n // Fallback: general code style\n if (created.length === 0) {\n const skillPath = join(skillsDir, 'code-style.md');\n if (!existsSync(skillPath)) {\n await writeFile(skillPath, `# Code Style Guide\n# Edit this file to teach Mint your project's conventions\n\n- Be consistent with existing code patterns in the project\n- Write clear, descriptive variable and function names\n- Keep functions focused — one function, one responsibility\n- Add comments only for \"why\", not \"what\" — code should be self-documenting\n- Handle errors explicitly, never silently swallow exceptions\n- Write tests for new functionality\n- Keep files under 300 lines — split when they grow\n- Use constants for magic numbers and repeated strings\n- Prefer immutable data structures when possible\n- Review your changes before committing — remove debug artifacts\n`, 'utf-8');\n created.push(skillPath);\n }\n }\n\n return created;\n}\n","// src/context/budget.ts\nexport { CONTEXT_BUDGETS, getTier, getBudget, type ContextTier } from '../providers/tiers.js';\n\n/**\n * Rough token estimate: 4 chars ≈ 1 token.\n * Use tiktoken for accurate counts when performance allows.\n */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Truncate text to approximately maxTokens tokens.\n * Preserves first `keepRatio` fraction if text must be cut.\n */\nexport function truncateToTokens(text: string, maxTokens: number, keepRatio = 0.9): string {\n const maxChars = maxTokens * 4;\n if (text.length <= maxChars) return text;\n const keepChars = Math.floor(maxChars * keepRatio);\n return text.slice(0, keepChars) + `\\n... [truncated: ${Math.ceil((text.length - keepChars) / 4)} tokens omitted]`;\n}\n","// src/context/compress.ts\nimport type { ContextTier } from '../providers/tiers.js';\nimport { truncateToTokens, estimateTokens } from './budget.js';\n\nexport interface FileEntry {\n path: string;\n content: string;\n language?: string;\n}\n\nexport interface CompressedContext {\n files: FileEntry[];\n tokenEstimate: number;\n compressionApplied: string[]; // human-readable log of what was compressed\n}\n\n/**\n * Apply tier-appropriate compression to a set of files.\n * APEX: no changes. SMART: truncate large outputs. FAST: heavy. ULTRA: skeleton only.\n */\nexport function compressContext(files: FileEntry[], tier: ContextTier): CompressedContext {\n const log: string[] = [];\n\n switch (tier) {\n case 'apex':\n return { files, tokenEstimate: sumTokens(files), compressionApplied: ['none'] };\n\n case 'smart': {\n const compressed = files.map(f => {\n if (estimateTokens(f.content) > 2000) {\n log.push(`truncated ${f.path} (>${2000} tokens)`);\n return { ...f, content: truncateToTokens(f.content, 2000) };\n }\n return f;\n });\n return { files: compressed, tokenEstimate: sumTokens(compressed), compressionApplied: log.length ? log : ['none'] };\n }\n\n case 'fast': {\n const compressed = files.map(f => {\n // Strip single-line comments from code\n let content = stripComments(f.content, f.language ?? '');\n // Truncate each file to 500 tokens\n if (estimateTokens(content) > 500) {\n log.push(`truncated ${f.path} to 500 tokens`);\n content = truncateToTokens(content, 500);\n }\n return { ...f, content };\n });\n log.push('stripped comments');\n return { files: compressed, tokenEstimate: sumTokens(compressed), compressionApplied: log };\n }\n\n case 'ultra': {\n // Skeleton only: extract function/class signatures, no bodies\n const compressed = files.map(f => ({\n ...f,\n content: extractSkeleton(f.content, f.language ?? ''),\n }));\n log.push('skeleton-only (signatures extracted)', 'bodies removed');\n return { files: compressed, tokenEstimate: sumTokens(compressed), compressionApplied: log };\n }\n }\n}\n\n/**\n * Compress tool output (bash results, file reads) per tier.\n * Used in agent loop to trim tool results before re-injecting into context.\n */\nexport function compressToolOutput(output: string, tier: ContextTier): string {\n const limits: Record<ContextTier, number> = {\n apex: 100_000,\n smart: 2_000,\n fast: 500,\n ultra: 200,\n };\n return truncateToTokens(output, limits[tier]);\n}\n\n// ─── Private helpers ─────────────────────────────────────────────────────────\n\nfunction sumTokens(files: FileEntry[]): number {\n return files.reduce((sum, f) => sum + estimateTokens(f.content), 0);\n}\n\nfunction stripComments(code: string, language: string): string {\n const lineComment = /\\/\\/.*/g;\n const blockComment = /\\/\\*[\\s\\S]*?\\*\\//g;\n const hashComment = /#.*/g;\n\n if (['typescript', 'javascript', 'go', 'java', 'rust', 'csharp', 'cpp', 'c'].includes(language)) {\n return code.replace(blockComment, '').replace(lineComment, '');\n }\n if (['python', 'ruby', 'bash', 'yaml'].includes(language)) {\n return code.replace(hashComment, '');\n }\n return code;\n}\n\n/**\n * Extract function/class/type signatures without bodies.\n * Handles TypeScript/JavaScript. Falls back to first-line-of-each-block heuristic.\n */\nfunction extractSkeleton(code: string, language: string): string {\n if (!['typescript', 'javascript'].includes(language)) {\n // Generic: return first 10 lines only\n return code.split('\\n').slice(0, 10).join('\\n') + '\\n... [body omitted]';\n }\n\n const lines = code.split('\\n');\n const skeleton: string[] = [];\n let depth = 0;\n let inSignature = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n // Always include imports, exports, type/interface/class/function declarations\n const isDecl = /^(import|export|type |interface |class |function |const |let |var |async function|export default)/.test(trimmed);\n\n if (isDecl && depth === 0) {\n skeleton.push(line);\n inSignature = true;\n } else if (inSignature && depth === 0 && trimmed === '{') {\n skeleton.push(line);\n depth++;\n } else if (depth > 0) {\n if (trimmed.includes('{')) depth++;\n if (trimmed.includes('}')) depth--;\n if (depth === 0) {\n skeleton.push(' // ... body omitted');\n skeleton.push('}');\n inSignature = false;\n }\n }\n }\n\n return skeleton.join('\\n');\n}\n","// src/context/agentmd.ts\nimport { readFile, stat } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface AgentMd {\n raw: string;\n sections: {\n project?: string;\n rules?: string;\n architecture?: string;\n gotchas?: string;\n commands?: string;\n };\n sourcePath: string;\n loadedAt: number;\n}\n\ninterface CacheEntry {\n data: AgentMd;\n mtime: number;\n}\n\nconst cache = new Map<string, CacheEntry>();\n\n/**\n * Search order (first found wins):\n * 1. {cwd}/AGENT.md\n * 2. {cwd}/.axon/AGENT.md\n * 3. ~/.axon/AGENT.md\n *\n * Returns null if none found.\n * Caches with mtime invalidation — safe to call on every agent iteration.\n */\nexport async function loadAgentMd(cwd: string): Promise<AgentMd | null> {\n const candidates = [\n join(cwd, 'AGENT.md'),\n join(cwd, '.mint', 'AGENT.md'),\n join(homedir(), '.mint', 'AGENT.md'),\n ];\n\n for (const candidatePath of candidates) {\n try {\n const stats = await stat(candidatePath);\n const mtime = stats.mtimeMs;\n\n // Cache hit: same mtime → return cached\n const cached = cache.get(candidatePath);\n if (cached && cached.mtime === mtime) {\n return cached.data;\n }\n\n // Cache miss or stale: re-read\n const raw = await readFile(candidatePath, 'utf-8');\n const data: AgentMd = {\n raw,\n sections: parseSections(raw),\n sourcePath: candidatePath,\n loadedAt: Date.now(),\n };\n cache.set(candidatePath, { data, mtime });\n return data;\n } catch {\n // File doesn't exist at this path — try next\n continue;\n }\n }\n\n return null;\n}\n\n/**\n * Format the AGENT.md content for injection into the system prompt.\n * Always injected FIRST — highest priority context.\n */\nexport function formatAgentMdForPrompt(agentMd: AgentMd): string {\n return `<agent_context source=\"${agentMd.sourcePath}\">\n${agentMd.raw}\n</agent_context>\n\n`;\n}\n\n// ─── Section parser ──────────────────────────────────────────────────────────\n\nfunction parseSections(raw: string): AgentMd['sections'] {\n const sections: AgentMd['sections'] = {};\n const sectionRegex = /^##\\s+(\\w+)\\s*$/gm;\n\n let match: RegExpExecArray | null;\n const boundaries: Array<{ name: string; start: number }> = [];\n\n while ((match = sectionRegex.exec(raw)) !== null) {\n boundaries.push({ name: match[1].toLowerCase(), start: match.index + match[0].length });\n }\n\n for (let i = 0; i < boundaries.length; i++) {\n const { name, start } = boundaries[i];\n const end = i + 1 < boundaries.length ? boundaries[i + 1].start : raw.length;\n const content = raw.slice(start, end).trim();\n\n switch (name) {\n case 'project': sections.project = content; break;\n case 'rules': sections.rules = content; break;\n case 'architecture': sections.architecture = content; break;\n case 'gotchas': sections.gotchas = content; break;\n case 'commands': sections.commands = content; break;\n }\n }\n\n return sections;\n}\n","/**\n * Skills system — loads project-specific conventions from .mint/skills/*.md\n *\n * Skills are markdown files with optional YAML frontmatter that specify\n * which specialist types they apply to. Skills without frontmatter apply to all.\n */\nimport { readdirSync, readFileSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport type { SpecialistType } from '../agents/specialists/types.js';\n\nexport interface Skill {\n name: string;\n content: string;\n appliesTo: SpecialistType[] | 'all';\n}\n\n/**\n * Load all .md skill files from {projectRoot}/.mint/skills/\n */\nexport function loadSkills(projectRoot: string): Skill[] {\n const skillsDir = join(projectRoot, '.mint', 'skills');\n\n let files: string[];\n try {\n files = readdirSync(skillsDir).filter(f => f.endsWith('.md'));\n } catch {\n return [];\n }\n\n const skills: Skill[] = [];\n\n for (const file of files) {\n try {\n const raw = readFileSync(join(skillsDir, file), 'utf-8');\n const name = basename(file, '.md');\n const { frontmatter, content } = parseFrontmatter(raw);\n\n let appliesTo: SpecialistType[] | 'all' = 'all';\n if (frontmatter.applies_to && Array.isArray(frontmatter.applies_to)) {\n appliesTo = frontmatter.applies_to as SpecialistType[];\n }\n\n skills.push({ name, content, appliesTo });\n } catch {\n // Skip unreadable files\n }\n }\n\n return skills;\n}\n\n/**\n * Filter skills for a specific specialist type.\n * Returns skills where appliesTo is 'all' or includes the specialist type.\n * Caps total content at ~2000 tokens (8000 chars).\n */\nexport function getSkillsForSpecialist(skills: Skill[], specialist: SpecialistType): Skill[] {\n const matching = skills.filter(s =>\n s.appliesTo === 'all' || s.appliesTo.includes(specialist)\n );\n\n // Cap at ~4000 tokens (4 chars per token = 16000 chars)\n const maxChars = 16000;\n let totalChars = 0;\n const capped: Skill[] = [];\n\n for (const skill of matching) {\n if (totalChars + skill.content.length > maxChars) break;\n capped.push(skill);\n totalChars += skill.content.length;\n }\n\n return capped;\n}\n\n/**\n * Parse simple YAML frontmatter from a markdown file.\n * Handles the `---` delimited block at the top.\n */\nfunction parseFrontmatter(raw: string): { frontmatter: Record<string, unknown>; content: string } {\n if (!raw.startsWith('---')) {\n return { frontmatter: {}, content: raw };\n }\n\n const endIndex = raw.indexOf('---', 3);\n if (endIndex === -1) {\n return { frontmatter: {}, content: raw };\n }\n\n const yamlBlock = raw.slice(3, endIndex).trim();\n const content = raw.slice(endIndex + 3).trim();\n\n // Simple YAML parser for our use case: `key: value` and `key: [a, b]`\n const frontmatter: Record<string, unknown> = {};\n for (const line of yamlBlock.split('\\n')) {\n const match = line.match(/^(\\w+)\\s*:\\s*(.+)$/);\n if (!match) continue;\n\n const key = match[1];\n let value: unknown = match[2].trim();\n\n // Parse array: [a, b, c]\n if (typeof value === 'string' && value.startsWith('[') && value.endsWith(']')) {\n value = value\n .slice(1, -1)\n .split(',')\n .map(v => v.trim())\n .filter(Boolean);\n }\n\n frontmatter[key] = value;\n }\n\n return { frontmatter, content };\n}\n","/**\n * Context Engine — public API.\n *\n * Orchestrates indexing, search, compression, and project rules\n * to produce optimized context for LLM calls.\n */\nexport { indexProject, loadIndex, isIndexStale, type ProjectIndex, type FileIndex } from './indexer.js';\nexport { DependencyGraph } from './graph.js';\nexport { searchRelevantFiles, extractKeywords, type SearchResult, type SearchOptions } from './search.js';\nexport { loadProjectRules, formatProjectRulesForPrompt, generateProjectRules, generateStarterSkills, type ProjectRules } from './project-rules.js';\nexport { compressContext, compressToolOutput, type FileEntry, type CompressedContext } from './compress.js';\nexport { estimateTokens, truncateToTokens } from './budget.js';\nexport { loadAgentMd, formatAgentMdForPrompt } from './agentmd.js';\nexport { loadSkills, getSkillsForSpecialist, type Skill } from './skills.js';\n","/**\n * Parse unified diffs from LLM response text.\n *\n * LLMs typically output diffs inside ```diff fenced blocks.\n * This parser extracts them and structures them for display/apply.\n */\nimport type { ParsedDiff, DiffHunk, DiffLine } from './types.js';\n\n/**\n * Extract all unified diffs from a model response string.\n */\nexport function parseDiffs(response: string): ParsedDiff[] {\n const diffs: ParsedDiff[] = [];\n\n // Match ```diff ... ``` blocks\n const fencedRe = /```diff\\s*\\n([\\s\\S]*?)```/g;\n let match: RegExpExecArray | null;\n\n while ((match = fencedRe.exec(response)) !== null) {\n const block = match[1].trim();\n const parsed = parseUnifiedDiff(block);\n if (parsed) {\n diffs.push(parsed);\n }\n }\n\n // Fallback: if no fenced blocks found, try to parse unfenced diffs (--- a/... lines)\n if (diffs.length === 0) {\n const unfencedRe = /^--- a\\/[\\s\\S]*?(?=^--- a\\/|\\Z)/gm;\n const blocks = response.match(/--- a\\/[^\\n]*\\n\\+\\+\\+ b\\/[^\\n]*\\n@@[\\s\\S]*?(?=\\n--- a\\/|\\n*$)/g);\n if (blocks) {\n for (const block of blocks) {\n const parsed = parseUnifiedDiff(block.trim());\n if (parsed) diffs.push(parsed);\n }\n }\n }\n\n return diffs;\n}\n\n/**\n * Parse a single unified diff block into structured data.\n */\nfunction parseUnifiedDiff(block: string): ParsedDiff | null {\n const lines = block.split('\\n');\n\n // Extract file path from --- a/path and +++ b/path headers\n let filePath = '';\n let oldContent = '';\n let newContent = '';\n const hunks: DiffHunk[] = [];\n let currentHunk: DiffHunk | null = null;\n\n for (const line of lines) {\n if (line.startsWith('--- ')) {\n // Old file path: --- a/path/to/file or --- /dev/null\n const path = line.slice(4).replace(/^a\\//, '').trim();\n if (path !== '/dev/null') {\n filePath = path;\n }\n } else if (line.startsWith('+++ ')) {\n // New file path: +++ b/path/to/file\n const path = line.slice(4).replace(/^b\\//, '').trim();\n filePath = path;\n } else if (line.startsWith('@@')) {\n // Hunk header: @@ -start,count +start,count @@\n currentHunk = { header: line, lines: [] };\n hunks.push(currentHunk);\n } else if (currentHunk) {\n if (line.startsWith('+')) {\n currentHunk.lines.push({ type: 'add', content: line.slice(1) });\n newContent += line.slice(1) + '\\n';\n } else if (line.startsWith('-')) {\n currentHunk.lines.push({ type: 'remove', content: line.slice(1) });\n oldContent += line.slice(1) + '\\n';\n } else {\n // Context line (starts with space or is empty)\n const content = line.startsWith(' ') ? line.slice(1) : line;\n currentHunk.lines.push({ type: 'context', content });\n oldContent += content + '\\n';\n newContent += content + '\\n';\n }\n }\n }\n\n if (!filePath || hunks.length === 0) return null;\n\n return { filePath, oldContent, newContent, hunks };\n}\n\n/**\n * Check if a response contains any diff blocks.\n */\nexport function hasDiffs(response: string): boolean {\n return /```diff\\s*\\n/.test(response);\n}\n","/**\n * Apply parsed diffs to the filesystem.\n *\n * Shared by both the CLI (non-TUI) and the TUI apply flow.\n * Returns per-file results so the caller can render success/failure.\n */\nimport { resolve, sep, dirname } from 'node:path';\nimport { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport type { ParsedDiff } from './types.js';\n\nexport interface ApplyResult {\n file: string;\n ok: boolean;\n action: 'created' | 'modified' | 'skipped' | 'blocked';\n error?: string;\n}\n\nexport function applyDiffsToProject(diffs: ParsedDiff[], cwd: string): ApplyResult[] {\n const cwdAbs = resolve(cwd);\n const results: ApplyResult[] = [];\n\n for (const diff of diffs) {\n const fullPath = resolve(cwdAbs, diff.filePath);\n if (!fullPath.startsWith(cwdAbs + sep) && fullPath !== cwdAbs) {\n results.push({ file: diff.filePath, ok: false, action: 'blocked', error: 'Path outside project' });\n continue;\n }\n\n try {\n // New file (old was /dev/null or empty)\n if (diff.oldContent === '') {\n mkdirSync(dirname(fullPath), { recursive: true });\n const newContent = diff.hunks\n .flatMap((h) => h.lines.filter((l) => l.type !== 'remove').map((l) => l.content))\n .join('\\n');\n writeFileSync(fullPath, newContent + '\\n', 'utf-8');\n results.push({ file: diff.filePath, ok: true, action: 'created' });\n continue;\n }\n\n // Edit existing file — apply hunks\n const current = readFileSync(fullPath, 'utf-8');\n let updated = current;\n\n for (const hunk of diff.hunks) {\n const removeLines = hunk.lines.filter((l) => l.type === 'remove').map((l) => l.content);\n const addLines = hunk.lines.filter((l) => l.type === 'add').map((l) => l.content);\n\n if (removeLines.length > 0) {\n const oldBlock = removeLines.join('\\n');\n const newBlock = addLines.join('\\n');\n if (updated.includes(oldBlock)) {\n updated = updated.replace(oldBlock, newBlock);\n } else {\n // Fallback: try line-by-line (handles minor whitespace diffs)\n let fallbackUpdated = updated;\n let allFound = true;\n for (let i = 0; i < removeLines.length; i++) {\n const removeLine = removeLines[i];\n const addLine = addLines[i] ?? '';\n if (fallbackUpdated.includes(removeLine)) {\n fallbackUpdated = fallbackUpdated.replace(removeLine, addLine);\n } else {\n allFound = false;\n break;\n }\n }\n if (allFound && fallbackUpdated !== updated) {\n updated = fallbackUpdated;\n }\n }\n }\n }\n\n if (updated !== current) {\n writeFileSync(fullPath, updated, 'utf-8');\n results.push({ file: diff.filePath, ok: true, action: 'modified' });\n } else {\n results.push({ file: diff.filePath, ok: false, action: 'skipped', error: 'Could not match diff text' });\n }\n } catch (err) {\n results.push({\n file: diff.filePath,\n ok: false,\n action: 'skipped',\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return results;\n}\n","/**\n * mint --simple: The minimum viable product.\n *\n * find files → one LLM call → diffs → apply\n *\n * No Scout. No Architect. No Builder. No Reviewer.\n * No DAG scheduler. No parallel execution. No specialists.\n */\nimport chalk from 'chalk';\nimport { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { createInterface } from 'node:readline';\nimport { complete } from '../../providers/index.js';\nimport { loadIndex, indexProject, searchRelevantFiles, extractKeywords } from '../../context/index.js';\nimport { parseDiffs } from '../../pipeline/diff-parser.js';\nimport { applyDiffsToProject } from '../../pipeline/diff-apply.js';\nimport type { SearchResult } from '../../context/search.js';\nimport type { ModelId } from '../../providers/types.js';\n\nconst MODEL: ModelId = 'deepseek-v3';\nconst MAX_FILES = 8;\nconst MAX_CONTEXT_TOKENS = 32000;\n\nconst SYSTEM_PROMPT = `You are a code editor. You receive a task and file contents. Output ONLY unified diffs.\n\nRules:\n- Output ONLY \\`\\`\\`diff blocks. No explanations. No commentary.\n- Use --- a/path and +++ b/path with repo-relative paths\n- For new files use --- /dev/null\n- Include 3 context lines around each change\n- One diff block per file\n- If the project is empty, create the files from scratch\n\nExample:\n\\`\\`\\`diff\n--- a/src/index.ts\n+++ b/src/index.ts\n@@ -5,3 +5,5 @@\n import { foo } from './foo';\n+import { bar } from './bar';\n\n export function main() {\n+ bar();\n }\n\\`\\`\\``;\n\nexport async function runSimple(task: string): Promise<void> {\n const cwd = process.cwd();\n const startTime = Date.now();\n\n // ── Step 1: Find relevant files ──────────────────────────────────────────\n console.log(chalk.dim(' Finding files...'));\n\n let files: SearchResult[] = [];\n\n // First: check for literal file paths in the task\n const literalPaths = extractLiteralPaths(task, cwd);\n if (literalPaths.length > 0) {\n files = literalPaths.map((p) => ({\n path: p,\n content: readFileSync(join(cwd, p), 'utf-8'),\n language: p.split('.').pop() ?? 'text',\n score: 100,\n reason: 'explicit path',\n }));\n }\n\n // Then: search the index for more\n if (files.length < MAX_FILES) {\n try {\n let index = await loadIndex(cwd);\n if (!index || index.totalFiles === 0) {\n index = await indexProject(cwd);\n }\n if (index && index.totalFiles > 0) {\n const found = await searchRelevantFiles(cwd, task, index, {\n maxFiles: MAX_FILES - files.length,\n });\n // Don't duplicate literal paths\n const existing = new Set(files.map((f) => f.path));\n for (const f of found) {\n if (!existing.has(f.path)) files.push(f);\n }\n }\n } catch {\n // No index — proceed with literal paths only\n }\n }\n\n // If still no files, list the directory so the LLM knows what's available\n let dirListing = '';\n if (files.length === 0) {\n try {\n const { execSync } = await import('node:child_process');\n dirListing = execSync('find . -type f -not -path \"*/node_modules/*\" -not -path \"*/.git/*\" -not -path \"*/.mint/*\" | head -50', {\n cwd,\n encoding: 'utf-8',\n timeout: 5000,\n }).trim();\n } catch {\n dirListing = '(empty project)';\n }\n }\n\n console.log(chalk.dim(` ${files.length} files found${files.length > 0 ? ': ' + files.map((f) => f.path).join(', ') : ''}`));\n\n // ── Step 2: Build the prompt ─────────────────────────────────────────────\n let fileContext = '';\n let tokenCount = 0;\n\n for (const file of files) {\n const block = `<file path=\"${file.path}\">\\n${file.content}\\n</file>\\n\\n`;\n const tokens = Math.ceil(block.length / 4);\n if (tokenCount + tokens > MAX_CONTEXT_TOKENS) break;\n fileContext += block;\n tokenCount += tokens;\n }\n\n const userMessage = [\n `Task: ${task}`,\n fileContext ? `\\nRelevant files:\\n${fileContext}` : null,\n dirListing ? `\\nProject files:\\n${dirListing}` : null,\n ].filter(Boolean).join('\\n');\n\n console.log(chalk.dim(` ~${tokenCount} tokens of context`));\n console.log(chalk.dim(` Calling ${MODEL}...`));\n\n // ── Step 3: One LLM call ─────────────────────────────────────────────────\n const response = await complete({\n model: MODEL,\n messages: [\n { role: 'system', content: SYSTEM_PROMPT },\n { role: 'user', content: userMessage },\n ],\n maxTokens: 8192,\n temperature: 0,\n });\n\n const duration = ((Date.now() - startTime) / 1000).toFixed(1);\n const cost = response.cost.total;\n console.log(chalk.dim(` Done in ${duration}s · $${cost.toFixed(4)}`));\n\n // ── Step 4: Parse diffs ──────────────────────────────────────────────────\n const diffs = parseDiffs(response.content);\n\n if (diffs.length === 0) {\n console.log(chalk.yellow('\\n No diffs in response. Raw output:\\n'));\n console.log(chalk.dim(response.content.slice(0, 500)));\n return;\n }\n\n // ── Step 5: Show diffs ───────────────────────────────────────────────────\n console.log('');\n for (const diff of diffs) {\n const isNew = diff.oldContent === '';\n const added = diff.hunks.flatMap((h) => h.lines.filter((l) => l.type === 'add'));\n const removed = diff.hunks.flatMap((h) => h.lines.filter((l) => l.type === 'remove'));\n const header = isNew\n ? chalk.green(` + ${diff.filePath} (new · ${added.length} lines)`)\n : chalk.cyan(` ~ ${diff.filePath} (+${added.length} -${removed.length})`);\n console.log(header);\n\n for (const hunk of diff.hunks) {\n for (const line of hunk.lines) {\n if (line.type === 'add') console.log(chalk.green(` + ${line.content}`));\n else if (line.type === 'remove') console.log(chalk.red(` - ${line.content}`));\n }\n }\n console.log('');\n }\n\n console.log(chalk.dim(` ${diffs.length} file(s) · ${duration}s · $${cost.toFixed(4)}`));\n\n // ── Step 6: Apply if confirmed ───────────────────────────────────────────\n const answer = await ask(' Apply changes? [Y/n] ');\n\n if (answer.toLowerCase() === 'n' || answer.toLowerCase() === 'no') {\n console.log(chalk.dim(' Discarded.'));\n return;\n }\n\n const results = applyDiffsToProject(diffs, cwd);\n for (const res of results) {\n if (res.ok) {\n console.log(chalk.green(` ✓ ${res.action === 'created' ? 'Created' : 'Modified'}: ${res.file}`));\n } else {\n console.log(chalk.red(` ✗ ${res.file}: ${res.error}`));\n }\n }\n}\n\nfunction extractLiteralPaths(task: string, cwd: string): string[] {\n const tokens = task.split(/\\s+/);\n const found: string[] = [];\n for (const token of tokens) {\n const cleaned = token.replace(/['\"`,;:!?()[\\]{}]+/g, '');\n if (!cleaned.includes('/') && !cleaned.includes('.')) continue;\n if (cleaned.length < 3 || cleaned.length > 200) continue;\n try {\n if (existsSync(join(cwd, cleaned))) found.push(cleaned);\n } catch { /* ignore */ }\n }\n return found;\n}\n\nfunction ask(prompt: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n","/**\n * Chalk level management — ported from claude-code-src/src/ink/colorize.ts\n *\n * Two environment problems this solves:\n *\n * 1. xterm.js (VS Code, Cursor) supports truecolor since 2017 but often\n * doesn't set COLORTERM=truecolor in containers. chalk falls back to\n * level 2 (256-color cube) → rgb() calls produce washed-out colours.\n * Fix: detect TERM_PROGRAM=vscode and boost to level 3.\n *\n * 2. tmux re-emits truecolor SGR correctly only when terminal-overrides\n * includes Tc/RGB capability (most configs don't). Without it, truecolor\n * backgrounds disappear on the outer terminal. Fix: clamp to level 2 so\n * chalk emits 256-color sequences tmux passes through cleanly.\n *\n * Call initChalkLevel() once at startup before any chalk output.\n */\nimport chalk from 'chalk'\n\n/**\n * Boost chalk to truecolor when running inside a VS Code terminal that\n * hasn't advertised COLORTERM=truecolor (common in devcontainers, code-server).\n */\nfunction boostForXtermJs(): boolean {\n if (process.env.TERM_PROGRAM === 'vscode' && chalk.level === 2) {\n chalk.level = 3\n return true\n }\n return false\n}\n\n/**\n * Clamp chalk to 256-color when running inside tmux without truecolor\n * passthrough configured. Set MINT_TMUX_TRUECOLOR=1 to skip if your tmux\n * has `terminal-overrides ,*:Tc` configured.\n */\nfunction clampForTmux(): boolean {\n if (process.env.MINT_TMUX_TRUECOLOR) return false\n if (process.env.TMUX && chalk.level > 2) {\n chalk.level = 2\n return true\n }\n return false\n}\n\n/** Call once at startup before any chalk output. */\nexport function initChalkLevel(): void {\n // Order matters: boost first so tmux-inside-vscode gets re-clamped.\n boostForXtermJs()\n clampForTmux()\n}\n\n/** Whether we're running inside a VS Code / xterm.js terminal. */\nexport function isXtermJs(): boolean {\n return process.env.TERM_PROGRAM === 'vscode'\n}\n\n/** Whether we're running inside tmux. */\nexport function isInsideTmux(): boolean {\n return !!process.env.TMUX\n}\n","// src/tui/components/PipelinePhase.tsx\nimport React, { useState, useEffect } from 'react';\nimport { Box, Text } from 'ink';\nimport Spinner from 'ink-spinner';\nimport type { PipelinePhaseData, SubtaskData } from '../types.js';\n\ninterface PipelinePhaseProps {\n phase: PipelinePhaseData;\n}\n\ntype TextColor = React.ComponentProps<typeof Text>['color'];\n\ninterface InlineSegment {\n text: string;\n color?: TextColor;\n dimColor?: boolean;\n bold?: boolean;\n}\n\ninterface PhaseRenderLine {\n key: string;\n spinnerColor?: TextColor;\n segments: InlineSegment[];\n}\n\nexport const ACTIVE_TASK_AUTO_EXPAND_DELAY_MS = 3000;\n\nfunction formatDuration(ms: number): string {\n return ms < 1000 ? `${ms}ms` : `${(ms / 1000).toFixed(1)}s`;\n}\n\nfunction formatCost(cost: number): string {\n if (cost === 0) return '$0';\n if (cost < 0.01) return `${(cost * 100).toFixed(3)}¢`;\n return `$${cost.toFixed(4)}`;\n}\n\nfunction pushWrappedTextLines(\n lines: PhaseRenderLine[],\n keyPrefix: string,\n text: string,\n maxWidth: number,\n firstPrefix: InlineSegment,\n continuationPrefix: InlineSegment,\n contentSegment: Omit<InlineSegment, 'text'>,\n): void {\n const wrapWithPrefix = (value: string, initialWidth: number, continuationWidth: number): string[] => {\n if (value.length === 0) return [''];\n\n const wrapped: string[] = [];\n let remaining = value;\n let isFirst = true;\n\n while (remaining.length > 0) {\n const width = Math.max(1, isFirst ? initialWidth : continuationWidth);\n if (remaining.length <= width) {\n wrapped.push(remaining);\n break;\n }\n\n const breakAt = remaining.lastIndexOf(' ', width);\n const splitAt = breakAt > 0 ? breakAt : width;\n wrapped.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt);\n if (breakAt > 0) {\n remaining = remaining.replace(/^ /, '');\n }\n isFirst = false;\n }\n\n return wrapped;\n };\n\n const sourceLines = text.split('\\n');\n const firstWidth = Math.max(1, maxWidth - firstPrefix.text.length);\n const continuationWidth = Math.max(1, maxWidth - continuationPrefix.text.length);\n\n sourceLines.forEach((sourceLine, sourceIndex) => {\n const wrapped = wrapWithPrefix(sourceLine, firstWidth, continuationWidth);\n\n wrapped.forEach((part, wrapIndex) => {\n const prefix = wrapIndex === 0 ? firstPrefix : continuationPrefix;\n lines.push({\n key: `${keyPrefix}-${sourceIndex}-${wrapIndex}`,\n segments: [\n prefix,\n { text: part || ' ', ...contentSegment },\n ],\n });\n });\n });\n}\n\nfunction buildSubtaskLines(\n subtask: SubtaskData,\n isLast: boolean,\n maxWidth: number,\n keyPrefix: string,\n active: boolean,\n): PhaseRenderLine[] {\n const lines: PhaseRenderLine[] = [];\n const branch = isLast ? '└─ ' : '├─ ';\n const outerPrefix = active ? '│ ' : ' ';\n const innerContinue = isLast ? ' ' : '│ ';\n const firstPrefixText = `${outerPrefix}${branch}`;\n const continuationPrefixText = `${outerPrefix}${innerContinue}`;\n const suffix = [\n subtask.model ?? null,\n subtask.duration != null ? formatDuration(subtask.duration) : null,\n subtask.cost != null ? formatCost(subtask.cost) : null,\n ].filter(Boolean).join(' · ');\n\n let statusText = `#${subtask.id} ${subtask.description}`;\n let contentStyle: Omit<InlineSegment, 'text'> = { dimColor: true };\n let spinnerColor: TextColor | undefined;\n\n switch (subtask.status) {\n case 'running':\n contentStyle = { color: 'cyan' };\n spinnerColor = 'cyan';\n break;\n case 'retry':\n statusText = `#${subtask.id} retry ${subtask.description}`;\n contentStyle = { color: 'yellow' };\n spinnerColor = 'yellow';\n break;\n case 'blocked':\n contentStyle = { color: 'yellow' };\n statusText = `… #${subtask.id} ${subtask.description}`;\n break;\n case 'waiting_approval':\n contentStyle = { color: 'magenta', bold: true };\n statusText = `! #${subtask.id} ${subtask.description}`;\n break;\n case 'failed':\n contentStyle = { color: 'red' };\n statusText = `✗ #${subtask.id} ${subtask.description}`;\n break;\n case 'done':\n statusText = `✓ #${subtask.id} ${subtask.description}${suffix ? ` · ${suffix}` : ''}`;\n contentStyle = { dimColor: true };\n break;\n case 'queued':\n statusText = `○ #${subtask.id} ${subtask.description}`;\n contentStyle = { dimColor: true };\n break;\n case 'pending':\n default:\n statusText = `○ #${subtask.id} ${subtask.description}`;\n contentStyle = { dimColor: true };\n break;\n }\n\n pushWrappedTextLines(\n lines,\n keyPrefix,\n statusText,\n maxWidth,\n { text: firstPrefixText, dimColor: true },\n { text: continuationPrefixText, dimColor: true },\n contentStyle,\n );\n\n if (lines[0] && spinnerColor) {\n lines[0]!.spinnerColor = spinnerColor;\n lines[0]!.segments.unshift({ text: '' });\n }\n\n const detailPrefix = `${outerPrefix}${innerContinue}`;\n const details: string[] = [];\n if (subtask.progressSummary) details.push(subtask.progressSummary);\n if (subtask.blockedBy && subtask.blockedBy.length > 0 && subtask.status === 'blocked') {\n details.push(`blocked by ${subtask.blockedBy.map((id) => `#${id}`).join(', ')}`);\n }\n if (subtask.requiresApproval) details.push('approval required');\n\n if (details.length > 0) {\n pushWrappedTextLines(\n lines,\n `${keyPrefix}-detail`,\n details.join(' · '),\n maxWidth,\n { text: detailPrefix, dimColor: true },\n { text: detailPrefix, dimColor: true },\n subtask.status === 'failed'\n ? { color: 'red', dimColor: false }\n : { dimColor: true },\n );\n }\n\n const visibleLogs = getVisibleSubtaskLogs(subtask);\n if (visibleLogs.length > 0) {\n const logPrefix = `${outerPrefix}${innerContinue}`;\n const logStyle: Omit<InlineSegment, 'text'> =\n subtask.status === 'failed'\n ? { color: 'red', dimColor: false }\n : subtask.status === 'waiting_approval'\n ? { color: 'magenta', dimColor: false }\n : { dimColor: true };\n\n visibleLogs.forEach((logLine, logIndex) => {\n pushWrappedTextLines(\n lines,\n `${keyPrefix}-log-${logIndex}`,\n logLine,\n maxWidth,\n { text: `${logPrefix}· `, dimColor: true },\n { text: `${logPrefix} `, dimColor: true },\n logStyle,\n );\n });\n }\n\n return lines;\n}\n\nfunction getVisibleSubtaskLogs(subtask: SubtaskData): string[] {\n const logs = subtask.recentLogs ?? [];\n if (logs.length === 0) return [];\n\n switch (subtask.status) {\n case 'running':\n case 'retry':\n case 'waiting_approval':\n return logs.slice(-2);\n case 'failed':\n return logs.slice(-2);\n default:\n return [];\n }\n}\n\nexport function shouldCompactSubtasks(\n phase: PipelinePhaseData,\n nowMs = Date.now(),\n): boolean {\n if (!phase.subtasks || phase.subtasks.length !== 1) return false;\n\n const [subtask] = phase.subtasks;\n if (\n phase.status === 'active' &&\n subtask.status === 'running' &&\n subtask.startedAt != null &&\n nowMs - subtask.startedAt >= ACTIVE_TASK_AUTO_EXPAND_DELAY_MS\n ) {\n return false;\n }\n\n return subtask.status !== 'waiting_approval'\n && subtask.status !== 'failed'\n && subtask.status !== 'blocked';\n}\n\nfunction getCompactActiveSummary(phase: PipelinePhaseData): string | undefined {\n if (!phase.subtasks || phase.subtasks.length !== 1) return undefined;\n\n const [subtask] = phase.subtasks;\n return subtask.progressSummary;\n}\n\nfunction getCompactActiveDetails(phase: PipelinePhaseData): string[] {\n if (!phase.subtasks || phase.subtasks.length !== 1) return [];\n\n const [subtask] = phase.subtasks;\n const details: string[] = [];\n\n if (subtask.description) {\n details.push(subtask.description);\n }\n\n const logs = getVisibleSubtaskLogs(subtask);\n if (logs.length > 0) {\n details.push(...logs.slice(-2));\n }\n\n return details;\n}\n\nfunction buildPhaseRenderLines(\n phase: PipelinePhaseData,\n maxWidth: number,\n keyPrefix: string,\n nowMs: number,\n): PhaseRenderLine[] {\n const lines: PhaseRenderLine[] = [];\n const hasSubtasks = phase.subtasks && phase.subtasks.length > 0;\n const compactSubtasks = shouldCompactSubtasks(phase, nowMs);\n\n switch (phase.status) {\n case 'done':\n lines.push({\n key: `${keyPrefix}-header`,\n segments: [\n { text: '✓', color: 'green' },\n { text: ` ${phase.name}`, dimColor: true },\n ...(phase.model ? [{ text: ` · ${phase.model}`, dimColor: true }] : []),\n ...(phase.duration != null ? [{ text: ` · ${formatDuration(phase.duration)}`, dimColor: true }] : []),\n ...(phase.cost != null ? [{ text: ` · ${formatCost(phase.cost)}`, dimColor: true }] : []),\n ],\n });\n if (phase.summary) {\n pushWrappedTextLines(\n lines,\n `${keyPrefix}-summary`,\n phase.summary,\n maxWidth,\n { text: ' ', dimColor: true },\n { text: ' ', dimColor: true },\n { dimColor: true },\n );\n }\n if (hasSubtasks && !compactSubtasks) {\n phase.subtasks!.forEach((subtask, index) => {\n lines.push(...buildSubtaskLines(subtask, index === phase.subtasks!.length - 1, maxWidth, `${keyPrefix}-subtask-${subtask.id}`, false));\n });\n }\n return lines;\n\n case 'active':\n lines.push({\n key: `${keyPrefix}-header`,\n spinnerColor: 'cyan',\n segments: [\n { text: ' ' },\n { text: phase.name, color: 'cyan', bold: true },\n ...(phase.model ? [{ text: ` · ${phase.model}`, dimColor: true }] : []),\n ],\n });\n if (compactSubtasks) {\n const compactSummary = getCompactActiveSummary(phase);\n if (compactSummary) {\n pushWrappedTextLines(\n lines,\n `${keyPrefix}-compact-summary`,\n compactSummary,\n maxWidth,\n { text: '│ ', color: 'cyan' },\n { text: '│ ', color: 'cyan' },\n { dimColor: true },\n );\n }\n const compactDetails = getCompactActiveDetails(phase);\n compactDetails.forEach((detail, index) => {\n pushWrappedTextLines(\n lines,\n `${keyPrefix}-compact-detail-${index}`,\n detail,\n maxWidth,\n { text: '│ ', dimColor: true },\n { text: '│ ', dimColor: true },\n { dimColor: true },\n );\n });\n } else if (hasSubtasks) {\n phase.subtasks!.forEach((subtask, index) => {\n lines.push(...buildSubtaskLines(subtask, index === phase.subtasks!.length - 1, maxWidth, `${keyPrefix}-subtask-${subtask.id}`, true));\n });\n }\n if (phase.streamingContent && !hasSubtasks) {\n pushWrappedTextLines(\n lines,\n `${keyPrefix}-stream`,\n phase.streamingContent,\n maxWidth,\n { text: '│ ', color: 'cyan' },\n { text: '│ ', color: 'cyan' },\n {},\n );\n lines.push({\n key: `${keyPrefix}-cursor`,\n segments: [\n { text: '│ ', color: 'cyan' },\n { text: '▋', color: 'cyan' },\n ],\n });\n }\n return lines;\n\n case 'pending':\n lines.push({\n key: `${keyPrefix}-pending`,\n segments: [\n { text: '○', dimColor: true },\n { text: ` ${phase.name} · waiting`, dimColor: true },\n ],\n });\n return lines;\n\n case 'skipped':\n lines.push({\n key: `${keyPrefix}-skipped`,\n segments: [\n { text: '–', dimColor: true },\n { text: ` ${phase.name} · skipped`, dimColor: true },\n ],\n });\n return lines;\n }\n}\n\nfunction renderPhaseLine(line: PhaseRenderLine, keyPrefix: string): React.ReactElement {\n return (\n <Box key={`${keyPrefix}-${line.key}`} gap={0}>\n {line.spinnerColor ? (\n <Text color={line.spinnerColor}>\n <Spinner type=\"dots\" />\n </Text>\n ) : null}\n {line.segments.map((segment, index) => (\n <Text\n key={`${keyPrefix}-${line.key}-segment-${index}`}\n color={segment.color}\n dimColor={segment.dimColor}\n bold={segment.bold}\n >\n {segment.text || ' '}\n </Text>\n ))}\n </Box>\n );\n}\n\nexport function countPhaseRenderLines(\n phases: PipelinePhaseData[] | undefined,\n maxWidth: number,\n nowMs = Date.now(),\n): number {\n if (!phases || phases.length === 0) return 0;\n\n return phases.reduce(\n (total, phase, index) => total + buildPhaseRenderLines(phase, Math.max(20, maxWidth), `phase-${index}`, nowMs).length,\n 0,\n );\n}\n\nexport function renderPipelinePhaseLines(\n phase: PipelinePhaseData,\n maxWidth: number,\n keyPrefix = 'phase',\n nowMs = Date.now(),\n): React.ReactElement[] {\n return buildPhaseRenderLines(phase, Math.max(20, maxWidth), keyPrefix, nowMs).map((line) =>\n renderPhaseLine(line, keyPrefix),\n );\n}\n\nexport function PipelinePhase({ phase }: PipelinePhaseProps): React.ReactElement {\n const maxWidth = Math.max(20, (process.stdout.columns ?? 80) - 4);\n\n // Force re-render after ACTIVE_TASK_AUTO_EXPAND_DELAY_MS so auto-expand is deterministic\n const [, forceUpdate] = useState(0);\n useEffect(() => {\n if (!phase.subtasks || phase.subtasks.length !== 1 || phase.status !== 'active') return;\n const [subtask] = phase.subtasks;\n if (subtask.status !== 'running' || subtask.startedAt == null) return;\n const elapsed = Date.now() - subtask.startedAt;\n if (elapsed >= ACTIVE_TASK_AUTO_EXPAND_DELAY_MS) return; // already past threshold\n const timer = setTimeout(\n () => forceUpdate((n) => n + 1),\n ACTIVE_TASK_AUTO_EXPAND_DELAY_MS - elapsed + 50,\n );\n return () => clearTimeout(timer);\n }, [phase.subtasks, phase.status]);\n\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n {renderPipelinePhaseLines(phase, maxWidth, `${phase.name.toLowerCase()}-${phase.status}`, Date.now())}\n </Box>\n );\n}\n","/**\n * Simple markdown renderer for terminal (Ink).\n * Strips code fences, styles code blocks, handles bold/inline-code.\n */\nimport React from 'react';\nimport { Box, Text } from 'ink';\n\ninterface MarkdownContentProps {\n content: string;\n /** If set, only render lines [lineOffset, lineOffset+maxLines) */\n lineOffset?: number;\n maxLines?: number;\n maxWidth?: number;\n}\n\ninterface ContentBlock {\n type: 'text' | 'code';\n lang?: string;\n lines: string[];\n}\n\ninterface RenderableLine {\n key: string;\n kind: 'text' | 'code' | 'code-header' | 'code-footer' | 'diff';\n text: string;\n bold?: boolean;\n color?: string;\n dimColor?: boolean;\n}\n\nfunction parseBlocks(content: string): ContentBlock[] {\n const blocks: ContentBlock[] = [];\n const rawLines = content.split('\\n');\n let inCode = false;\n let codeLang = '';\n let current: ContentBlock = { type: 'text', lines: [] };\n\n for (const line of rawLines) {\n const fenceMatch = line.match(/^```(\\w*)$/);\n if (fenceMatch && !inCode) {\n // Start code block — flush current text block\n if (current.lines.length > 0) blocks.push(current);\n codeLang = fenceMatch[1] ?? '';\n current = { type: 'code', lang: codeLang, lines: [] };\n inCode = true;\n } else if (line.match(/^```$/) && inCode) {\n // End code block\n blocks.push(current);\n current = { type: 'text', lines: [] };\n inCode = false;\n } else {\n current.lines.push(line);\n }\n }\n if (current.lines.length > 0) blocks.push(current);\n return blocks;\n}\n\nfunction normalizeTextLine(line: string): { text: string; bold?: boolean; color?: 'cyan' } {\n // Strip inline code backticks → just show the content\n const stripped = line.replace(/`([^`]*)`/g, '$1');\n // Strip **bold** markers — Ink can't bold inline, just show text\n const plain = stripped.replace(/\\*\\*([^*]*)\\*\\*/g, '$1');\n\n // Detect headers\n const headerMatch = plain.match(/^(#{1,3})\\s+(.*)/);\n if (headerMatch) {\n return { text: headerMatch[2], bold: true, color: 'cyan' };\n }\n\n return { text: plain };\n}\n\nexport function wrapContentLine(line: string, maxWidth: number): string[] {\n const width = Math.max(1, maxWidth);\n\n if (line.length === 0) return [''];\n\n const wrapped: string[] = [];\n let remaining = line;\n\n while (remaining.length > width) {\n const breakAt = remaining.lastIndexOf(' ', width);\n const splitAt = breakAt > 0 ? breakAt : width;\n wrapped.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt);\n if (breakAt > 0) {\n remaining = remaining.replace(/^ /, '');\n }\n }\n\n wrapped.push(remaining);\n return wrapped;\n}\n\nexport function countWrappedLines(content: string, maxWidth: number): number {\n if (content.length === 0) return 0;\n\n return content\n .split('\\n')\n .reduce((total, line) => total + wrapContentLine(line, maxWidth).length, 0);\n}\n\nfunction buildRenderableLines(content: string, maxWidth: number): RenderableLine[] {\n if (content.length === 0) return [];\n\n const blocks = parseBlocks(content);\n const lineEls: RenderableLine[] = [];\n const textWidth = Math.max(1, maxWidth);\n const codeWidth = Math.max(1, maxWidth - 4);\n\n for (let bi = 0; bi < blocks.length; bi++) {\n const block = blocks[bi];\n if (block.type === 'code') {\n if (block.lang === 'diff') {\n for (let li = 0; li < block.lines.length; li++) {\n const line = block.lines[li] ?? '';\n const wrapped = wrapContentLine(line, textWidth);\n const diffStyle = getDiffLineStyle(line);\n for (let wi = 0; wi < wrapped.length; wi++) {\n lineEls.push({\n key: `b${bi}-l${li}-w${wi}`,\n kind: 'diff',\n text: wrapped[wi],\n bold: wi === 0 ? diffStyle.bold : false,\n color: diffStyle.color,\n dimColor: diffStyle.dimColor,\n });\n }\n }\n continue;\n }\n\n lineEls.push({\n key: `b${bi}-header`,\n kind: 'code-header',\n text: block.lang ? ` ╭─ ${block.lang} ` : ' ╭─',\n });\n\n for (let li = 0; li < block.lines.length; li++) {\n const wrapped = wrapContentLine(block.lines[li], codeWidth);\n for (let wi = 0; wi < wrapped.length; wi++) {\n lineEls.push({\n key: `b${bi}-l${li}-w${wi}`,\n kind: 'code',\n text: wrapped[wi],\n color: 'yellow',\n });\n }\n }\n\n lineEls.push({\n key: `b${bi}-footer`,\n kind: 'code-footer',\n text: ' ╰─',\n });\n continue;\n }\n\n for (let li = 0; li < block.lines.length; li++) {\n const normalized = normalizeTextLine(block.lines[li]);\n const wrapped = wrapContentLine(normalized.text, textWidth);\n for (let wi = 0; wi < wrapped.length; wi++) {\n lineEls.push({\n key: `b${bi}-l${li}-w${wi}`,\n kind: 'text',\n text: wrapped[wi],\n bold: normalized.bold,\n color: normalized.color,\n });\n }\n }\n }\n\n return lineEls;\n}\n\nexport function renderMarkdownLineElements(\n content: string,\n maxWidth: number,\n keyPrefix = 'markdown',\n): React.ReactElement[] {\n return buildRenderableLines(content, maxWidth).map((line, index) => {\n const key = `${keyPrefix}-${index}-${line.key}`;\n switch (line.kind) {\n case 'text':\n return (\n <Text key={key} bold={line.bold} color={line.color as Parameters<typeof Text>[0]['color']}>\n {line.text || ' '}\n </Text>\n );\n\n case 'code':\n return (\n <Box key={key}>\n <Text dimColor> │ </Text>\n <Text color={line.color as Parameters<typeof Text>[0]['color']}>{line.text || ' '}</Text>\n </Box>\n );\n\n case 'code-header':\n case 'code-footer':\n return (\n <Text key={key} dimColor>\n {line.text}\n </Text>\n );\n\n case 'diff':\n return (\n <Text\n key={key}\n bold={line.bold}\n dimColor={line.dimColor}\n color={line.color as Parameters<typeof Text>[0]['color']}\n >\n {line.text || ' '}\n </Text>\n );\n }\n });\n}\n\nexport function MarkdownContent({ content, lineOffset = 0, maxLines, maxWidth }: MarkdownContentProps): React.ReactElement {\n const renderWidth = Math.max(20, maxWidth ?? (process.stdout.columns ?? 80) - 4);\n const lineEls = renderMarkdownLineElements(content, renderWidth);\n\n // Apply slice\n const sliced = lineEls.slice(lineOffset, maxLines !== undefined ? lineOffset + maxLines : undefined);\n\n return (\n <Box flexDirection=\"column\">\n {sliced}\n </Box>\n );\n}\n\n/** Count total renderable lines in content (for scroll calculations) */\nexport function countContentLines(content: string, maxWidth?: number): number {\n const renderWidth = Math.max(20, maxWidth ?? (process.stdout.columns ?? 80) - 4);\n return buildRenderableLines(content, renderWidth).length;\n}\n\nfunction getDiffLineStyle(line: string): {\n color?: string;\n dimColor?: boolean;\n bold?: boolean;\n} {\n if (line.startsWith('+++ ') || line.startsWith('--- ')) {\n return { color: 'cyan', bold: true };\n }\n\n if (line.startsWith('@@')) {\n return { color: 'cyan' };\n }\n\n if (line.startsWith('+')) {\n return { color: 'green' };\n }\n\n if (line.startsWith('-')) {\n return { color: 'red' };\n }\n\n if (line.startsWith('diff --git') || line.startsWith('index ')) {\n return { dimColor: true };\n }\n\n return { dimColor: true };\n}\n","// src/tui/components/MessageList.tsx\nimport React, { useEffect, useState } from 'react';\nimport { Box, Text } from 'ink';\nimport {\n ACTIVE_TASK_AUTO_EXPAND_DELAY_MS,\n PipelinePhase,\n countPhaseRenderLines,\n renderPipelinePhaseLines,\n} from './PipelinePhase.js';\nimport { MarkdownContent, countContentLines, renderMarkdownLineElements } from './MarkdownContent.js';\nimport type { PipelinePhaseData } from '../types.js';\n\nexport interface ChatMessage {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n model?: string;\n cost?: number;\n isStreaming?: boolean;\n phases?: PipelinePhaseData[];\n}\n\ninterface MessageListProps {\n messages: ChatMessage[];\n streamingContent: string;\n /** Available height in terminal rows for the message area. */\n availableHeight?: number;\n /** Live pipeline phases for the currently streaming message. */\n livePhases?: PipelinePhaseData[];\n /** Line scroll offset (lines scrolled up from bottom). */\n scrollOffset?: number;\n}\n\nfunction hasVisibleAssistantBody(msg: ChatMessage): boolean {\n return msg.content.trim().length > 0;\n}\n\nfunction estimateMessageHeight(\n msg: ChatMessage,\n termWidth: number,\n isFirst: boolean,\n livePhases?: PipelinePhaseData[],\n nowMs = Date.now(),\n): number {\n const contentWidth = Math.max(20, termWidth - 4);\n const phases = msg.isStreaming ? livePhases : msg.phases;\n let lines = isFirst ? 0 : 1;\n\n if (msg.role === 'user') {\n lines += countContentLines(msg.content, contentWidth);\n return lines;\n }\n\n lines += countPhaseRenderLines(phases, contentWidth, nowMs);\n if (hasVisibleAssistantBody(msg)) {\n lines += 1;\n lines += countContentLines(msg.content, contentWidth);\n }\n\n return lines;\n}\n\nfunction buildAssistantRenderLines(\n msg: ChatMessage,\n termWidth: number,\n isFirst: boolean,\n livePhases?: PipelinePhaseData[],\n nowMs = Date.now(),\n): React.ReactElement[] {\n const contentWidth = Math.max(20, termWidth - 4);\n const phases = msg.isStreaming ? livePhases : msg.phases;\n const lines: React.ReactElement[] = [];\n\n if (!isFirst) {\n lines.push(\n <Box key={`${msg.id}-separator`} marginTop={0} marginBottom={0}>\n <Text dimColor>{'─'.repeat(Math.min(60, termWidth - 2))}</Text>\n </Box>,\n );\n }\n\n if (phases && phases.length > 0) {\n lines.push(\n ...phases.flatMap((phase, phaseIndex) =>\n renderPipelinePhaseLines(phase, contentWidth, `${msg.id}-phase-${phaseIndex}`, nowMs),\n ),\n );\n }\n\n if (hasVisibleAssistantBody(msg)) {\n lines.push(\n <Text key={`${msg.id}-assistant-header`} color=\"green\" bold>\n {'Mint'}\n {msg.model ? <Text dimColor> [{msg.model}]</Text> : null}\n </Text>,\n );\n lines.push(...renderMarkdownLineElements(msg.content, contentWidth, `${msg.id}-content`));\n }\n\n return lines;\n}\n\nexport function MessageList({\n messages,\n streamingContent,\n availableHeight,\n livePhases,\n scrollOffset = 0,\n}: MessageListProps): React.ReactElement {\n const termWidth = process.stdout.columns ?? 80;\n const maxHeight = availableHeight ?? (process.stdout.rows ?? 24) - 6;\n const [nowMs, setNowMs] = useState(() => Date.now());\n\n useEffect(() => {\n const hasActiveSingleTask = (livePhases ?? []).some((phase) =>\n phase.status === 'active'\n && phase.subtasks?.length === 1\n && phase.subtasks[0]?.status === 'running'\n && phase.subtasks[0]?.startedAt != null,\n );\n\n if (!hasActiveSingleTask) {\n return undefined;\n }\n\n const timer = setInterval(() => {\n setNowMs(Date.now());\n }, Math.max(250, ACTIVE_TASK_AUTO_EXPAND_DELAY_MS / 6));\n\n return () => clearInterval(timer);\n }, [livePhases]);\n\n const allMessages = messages.map((msg) => {\n if (msg.isStreaming) {\n return { ...msg, content: streamingContent };\n }\n return msg;\n });\n\n // Window: show as many recent messages as fit in available height\n let visibleMessages = allMessages;\n if (maxHeight > 0 && allMessages.length > 0) {\n let totalLines = 0;\n let startIdx = allMessages.length;\n\n for (let i = allMessages.length - 1; i >= 0; i--) {\n const isFirst = i === 0;\n const msgHeight = estimateMessageHeight(allMessages[i], termWidth, isFirst, livePhases, nowMs);\n if (totalLines + msgHeight > maxHeight && i < allMessages.length - 1) {\n break;\n }\n totalLines += msgHeight;\n startIdx = i;\n }\n\n visibleMessages = allMessages.slice(startIdx);\n }\n\n const truncated = visibleMessages.length < allMessages.length;\n const contentWidth = Math.max(20, termWidth - 4);\n const baseNoticeLines = truncated ? 1 : 0;\n const lastVisibleIndex = visibleMessages.length - 1;\n const lastVisibleMessage = lastVisibleIndex >= 0 ? visibleMessages[lastVisibleIndex] : undefined;\n\n let effectiveScrollOffset = 0;\n let lastMessageLineOffset = 0;\n let lastMessageMaxLines: number | undefined;\n\n if (\n maxHeight > 0 &&\n lastVisibleMessage &&\n lastVisibleMessage.role === 'assistant'\n ) {\n const linesBeforeLastMessage = visibleMessages.slice(0, -1).reduce((total, msg, idx) => {\n const isFirst = idx === 0 && !truncated;\n return total + estimateMessageHeight(msg, termWidth, isFirst, livePhases, nowMs);\n }, 0);\n const lastIsFirst = lastVisibleIndex === 0 && !truncated;\n const totalMessageLines = estimateMessageHeight(lastVisibleMessage, termWidth, lastIsFirst, livePhases, nowMs);\n\n const computeViewport = (showScrollNotice: boolean) => {\n const noticeLines = baseNoticeLines + (showScrollNotice ? 1 : 0);\n const availableContentLines = Math.max(1, maxHeight - noticeLines - linesBeforeLastMessage);\n const maxScrollableLines = Math.max(0, totalMessageLines - availableContentLines);\n const clampedScrollOffset = Math.max(0, Math.min(scrollOffset, maxScrollableLines));\n\n return {\n availableContentLines,\n clampedScrollOffset,\n };\n };\n\n let viewport = computeViewport(scrollOffset > 0);\n if ((scrollOffset > 0) !== (viewport.clampedScrollOffset > 0)) {\n viewport = computeViewport(viewport.clampedScrollOffset > 0);\n }\n\n effectiveScrollOffset = viewport.clampedScrollOffset;\n lastMessageLineOffset = Math.max(0, totalMessageLines - viewport.availableContentLines - effectiveScrollOffset);\n lastMessageMaxLines = viewport.availableContentLines;\n }\n\n return (\n <Box flexDirection=\"column\" flexGrow={1} justifyContent=\"flex-end\" paddingX={1} overflow=\"hidden\">\n {allMessages.length === 0 && (\n <Box paddingTop={1}>\n <Text dimColor>Type a message to start chatting. /help for commands. Ctrl+C to exit.</Text>\n </Box>\n )}\n\n {truncated && (\n <Text dimColor>{' ↑ '}{allMessages.length - visibleMessages.length} earlier messages</Text>\n )}\n {effectiveScrollOffset > 0 && (\n <Text dimColor>{' ↑ '}scrolled {effectiveScrollOffset} lines · ↓ to scroll down</Text>\n )}\n\n {visibleMessages.map((msg, idx) => {\n const isFirst = idx === 0 && !truncated;\n const isLast = idx === visibleMessages.length - 1;\n\n if (msg.role === 'assistant' && isLast) {\n const assistantLines = buildAssistantRenderLines(msg, termWidth, isFirst, livePhases, nowMs);\n const visibleLines = assistantLines.slice(\n lastMessageLineOffset,\n lastMessageMaxLines !== undefined ? lastMessageLineOffset + lastMessageMaxLines : undefined,\n );\n\n return (\n <Box key={msg.id} flexDirection=\"column\" marginBottom={0}>\n {visibleLines}\n </Box>\n );\n }\n\n return (\n <Box key={msg.id} flexDirection=\"column\" marginBottom={0}>\n {/* Separator between turns (not before very first message) */}\n {!isFirst && (\n <Box marginTop={0} marginBottom={0}>\n <Text dimColor>{'─'.repeat(Math.min(60, termWidth - 2))}</Text>\n </Box>\n )}\n\n {msg.role === 'user' ? (\n <Box flexDirection=\"column\">\n <Text color=\"cyan\">{msg.content}</Text>\n </Box>\n ) : (\n <Box flexDirection=\"column\">\n {/* Pipeline phases — use live phases for streaming message */}\n {(() => {\n const phases = msg.isStreaming ? livePhases : msg.phases;\n if (phases && phases.length > 0) {\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n {phases.map((phase, phaseIndex) => (\n <PipelinePhase key={`${phase.name}-${phaseIndex}`} phase={phase} />\n ))}\n </Box>\n );\n }\n return null;\n })()}\n\n {/* Assistant response text */}\n {hasVisibleAssistantBody(msg) && (\n <Box flexDirection=\"column\">\n <Text color=\"green\" bold>\n {'Mint'}\n {msg.model ? <Text dimColor> [{msg.model}]</Text> : null}\n </Text>\n {(() => {\n const content = msg.content;\n const isLast = idx === visibleMessages.length - 1;\n return (\n <MarkdownContent\n content={content}\n lineOffset={isLast ? lastMessageLineOffset : 0}\n maxLines={isLast ? lastMessageMaxLines : undefined}\n maxWidth={contentWidth}\n />\n );\n })()}\n </Box>\n )}\n </Box>\n )}\n </Box>\n );\n })}\n </Box>\n );\n}\n","// src/tui/components/SlashAutocomplete.tsx\nimport React from 'react';\nimport { Box, Text } from 'ink';\n\nexport interface SlashCommandDef {\n name: string;\n description: string;\n}\n\ninterface SlashAutocompleteProps {\n input: string;\n commands: SlashCommandDef[];\n selectedIndex: number;\n}\n\nexport function SlashAutocomplete({\n input,\n commands,\n selectedIndex,\n}: SlashAutocompleteProps): React.ReactElement {\n const prefix = input.toLowerCase();\n const matches = commands.filter(\n (cmd) => `/${cmd.name}`.startsWith(prefix),\n );\n\n if (matches.length === 0) return <></>;\n\n const visible = matches.slice(0, 5);\n\n return (\n <Box flexDirection=\"column\" paddingX={2} marginBottom={0}>\n {visible.map((cmd, i) => {\n const isSelected = i === selectedIndex % visible.length;\n return (\n <Box key={cmd.name} gap={1}>\n <Text\n color={isSelected ? 'cyan' : undefined}\n bold={isSelected}\n >\n {isSelected ? '▸' : ' '} /{cmd.name.padEnd(8)}\n </Text>\n <Text dimColor>— {cmd.description}</Text>\n </Box>\n );\n })}\n </Box>\n );\n}\n\n/** All registered slash commands for autocomplete. */\nexport const SLASH_COMMANDS: SlashCommandDef[] = [\n { name: 'help', description: 'show commands + keyboard shortcuts' },\n { name: 'clear', description: 'clear chat history' },\n { name: 'model', description: 'show/switch model' },\n { name: 'models', description: 'list all models with tiers' },\n { name: 'agent', description: 'show/switch agent mode' },\n { name: 'usage', description: 'session stats + totals' },\n];\n","// src/tui/components/ContextChips.tsx\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport type { ContextChip } from '../types.js';\n\ninterface ContextChipsProps {\n chips: ContextChip[];\n}\n\nexport function ContextChips({ chips }: ContextChipsProps): React.ReactElement {\n if (chips.length === 0) return <></>;\n\n return (\n <Box paddingX={1} gap={1} flexWrap=\"wrap\">\n {chips.map((chip, i) => (\n <Text key={i} color={chip.color as Parameters<typeof Text>[0]['color']}>\n [{chip.label}]\n </Text>\n ))}\n </Box>\n );\n}\n","// src/tui/components/InputBox.tsx\nimport React, { useState } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport Spinner from 'ink-spinner';\nimport { SlashAutocomplete, SLASH_COMMANDS } from './SlashAutocomplete.js';\nimport type { ContextChip } from '../types.js';\nimport { ContextChips } from './ContextChips.js';\n\ninterface InputBoxProps {\n value: string;\n onChange: (val: string) => void;\n onSubmit: (val: string) => void;\n isBusy: boolean;\n isRouting: boolean;\n contextChips?: ContextChip[] | null;\n}\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nexport function InputBox({\n value,\n onChange,\n onSubmit,\n isBusy,\n isRouting,\n contextChips,\n}: InputBoxProps): React.ReactElement {\n const tokenEst = estimateTokens(value);\n const [cursorOffset, setCursorOffset] = useState(0);\n const [autocompleteIndex, setAutocompleteIndex] = useState(0);\n\n const showAutocomplete = value.startsWith('/') && value.length >= 1 && !isBusy && !isRouting;\n const autocompleteMatches = showAutocomplete\n ? SLASH_COMMANDS.filter((cmd) => `/${cmd.name}`.startsWith(value.toLowerCase()))\n : [];\n const hasAutocomplete = autocompleteMatches.length > 0 && showAutocomplete;\n\n useInput(\n (input, key) => {\n if (key.ctrl) return; // handled by App (Ctrl+C)\n\n if (key.return) {\n if (hasAutocomplete) {\n const selected = autocompleteMatches[autocompleteIndex % autocompleteMatches.length];\n if (selected) {\n onChange(`/${selected.name} `);\n setCursorOffset(`/${selected.name} `.length);\n setAutocompleteIndex(0);\n return;\n }\n }\n onSubmit(value);\n setCursorOffset(0);\n setAutocompleteIndex(0);\n return;\n }\n\n if (key.backspace || key.delete) {\n if (cursorOffset === 0) return;\n const newText = value.slice(0, cursorOffset - 1) + value.slice(cursorOffset);\n onChange(newText);\n setCursorOffset(cursorOffset - 1);\n return;\n }\n\n if (key.leftArrow) {\n setCursorOffset(Math.max(0, cursorOffset - 1));\n return;\n }\n if (key.rightArrow) {\n setCursorOffset(Math.min(value.length, cursorOffset + 1));\n return;\n }\n\n if (key.upArrow) {\n if (hasAutocomplete) setAutocompleteIndex((p) => Math.max(0, p - 1));\n return;\n }\n if (key.downArrow) {\n if (hasAutocomplete) setAutocompleteIndex((p) => Math.min(autocompleteMatches.length - 1, p + 1));\n return;\n }\n\n if (key.tab) {\n if (hasAutocomplete) {\n const selected = autocompleteMatches[autocompleteIndex % autocompleteMatches.length];\n if (selected) {\n onChange(`/${selected.name} `);\n setCursorOffset(`/${selected.name} `.length);\n setAutocompleteIndex(0);\n }\n }\n return;\n }\n\n // Printable character\n if (input && !key.meta && !key.escape && input.charCodeAt(0) >= 32) {\n const newText = value.slice(0, cursorOffset) + input + value.slice(cursorOffset);\n onChange(newText);\n setCursorOffset(cursorOffset + input.length);\n }\n },\n { isActive: !isBusy && !isRouting },\n );\n\n // Sync cursor when value is cleared externally (after submit)\n React.useEffect(() => {\n if (value.length === 0) setCursorOffset(0);\n }, [value]);\n\n React.useEffect(() => {\n setAutocompleteIndex(0);\n }, [value]);\n\n if (isRouting) {\n return (\n <Box flexDirection=\"column\">\n <Box borderStyle=\"single\" borderColor=\"yellow\" paddingX={1} flexDirection=\"row\" gap={1}>\n <Text color=\"yellow\"><Spinner type=\"dots\" /></Text>\n <Text dimColor>Routing to best model…</Text>\n </Box>\n </Box>\n );\n }\n\n if (isBusy) {\n return (\n <Box flexDirection=\"column\">\n <Box borderStyle=\"single\" borderColor=\"cyan\" paddingX={1} flexDirection=\"row\" gap={1}>\n <Text color=\"cyan\"><Spinner type=\"dots\" /></Text>\n <Text dimColor>Thinking…</Text>\n </Box>\n </Box>\n );\n }\n\n // Render text with cursor block\n const before = value.slice(0, cursorOffset);\n const at = value[cursorOffset] ?? ' ';\n const after = value.slice(cursorOffset + 1);\n\n return (\n <Box flexDirection=\"column\">\n {contextChips && contextChips.length > 0 && (\n <ContextChips chips={contextChips} />\n )}\n\n {hasAutocomplete && (\n <SlashAutocomplete\n input={value}\n commands={SLASH_COMMANDS}\n selectedIndex={autocompleteIndex}\n />\n )}\n\n <Box borderStyle=\"single\" borderColor=\"cyan\" paddingX={1} flexDirection=\"row\">\n <Box flexGrow={1}>\n {value.length === 0 ? (\n <Text dimColor>Ask anything… or try \"fix the auth bug\"<Text inverse> </Text></Text>\n ) : (\n <Text>\n {before}\n <Text inverse>{at}</Text>\n {after}\n </Text>\n )}\n </Box>\n {value.length > 0 && (\n <Text dimColor>{` ~${tokenEst}t`}</Text>\n )}\n </Box>\n </Box>\n );\n}\n","// src/tui/components/StatusBar.tsx\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport type { ModelId } from '../../providers/types.js';\n\ninterface StatusBarProps {\n currentModel: ModelId | null;\n sessionTokens: number;\n sessionCost: number;\n monthlyCost?: number;\n savingsPct?: number;\n agentMode?: string;\n inspectorHint?: string;\n}\n\nfunction formatTokens(tokens: number): string {\n if (tokens >= 1_000_000) return `${(tokens / 1_000_000).toFixed(1)}M`;\n if (tokens >= 1_000) return `${(tokens / 1_000).toFixed(1)}k`;\n return String(tokens);\n}\n\nfunction formatCost(cost: number): string {\n if (cost === 0) return '$0';\n if (cost < 0.01) return `${(cost * 100).toFixed(3)}¢`;\n return `$${cost.toFixed(4)}`;\n}\n\nfunction modeColor(mode: string): string {\n switch (mode) {\n case 'yolo': return 'red';\n case 'plan': return 'blue';\n case 'diff': return 'yellow';\n default: return 'green';\n }\n}\n\nexport function StatusBar({\n currentModel,\n sessionTokens,\n sessionCost,\n monthlyCost,\n savingsPct,\n agentMode = 'auto',\n inspectorHint,\n}: StatusBarProps): React.ReactElement {\n const model = currentModel ?? 'auto';\n\n return (\n <Box paddingX={1}>\n <Box flexGrow={1} flexShrink={1} gap={0} overflow=\"hidden\">\n <Text dimColor>{model}</Text>\n <Text dimColor> │ </Text>\n <Text dimColor>{formatTokens(sessionTokens)} tokens</Text>\n <Text dimColor> │ </Text>\n <Text dimColor>session {formatCost(sessionCost)}</Text>\n {monthlyCost != null && monthlyCost > 0 && (\n <>\n <Text dimColor> │ </Text>\n <Text color=\"cyan\">month {formatCost(monthlyCost)}</Text>\n </>\n )}\n {savingsPct != null && savingsPct > 0 && (\n <>\n <Text dimColor> │ </Text>\n <Text color=\"green\" bold>-{savingsPct}% vs Opus</Text>\n </>\n )}\n </Box>\n <Box flexShrink={0} gap={0}>\n <Text dimColor> │ </Text>\n <Text color={modeColor(agentMode) as Parameters<typeof Text>[0]['color']}>{agentMode}</Text>\n <Text dimColor> │ v0.2.0</Text>\n {inspectorHint && (\n <>\n <Text dimColor> │ </Text>\n <Text dimColor>{inspectorHint}</Text>\n </>\n )}\n </Box>\n </Box>\n );\n}\n","// src/tui/components/WelcomeScreen.tsx\nimport React from 'react';\nimport { Box, Text } from 'ink';\n\nconst MINT_LOGO = [\n ' ███╗ ███╗██╗███╗ ██╗████████╗ ██████╗██╗ ██╗',\n ' ████╗ ████║██║████╗ ██║╚══██╔══╝ ██╔════╝██║ ██║',\n ' ██╔████╔██║██║██╔██╗ ██║ ██║ ██║ ██║ ██║',\n ' ██║╚██╔╝██║██║██║╚██╗██║ ██║ ██║ ██║ ██║',\n ' ██║ ╚═╝ ██║██║██║ ╚████║ ██║ ╚██████╗███████╗██║',\n ' ╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═════╝╚══════╝╚═╝',\n];\n\ninterface WelcomeScreenProps {\n modelCount?: number;\n agentCount?: number;\n savingsLabel?: string;\n}\n\nexport function WelcomeScreen({\n modelCount = 18,\n agentCount = 4,\n savingsLabel = '97%',\n}: WelcomeScreenProps): React.ReactElement {\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" flexGrow={1} paddingTop={1}>\n {/* ASCII Logo */}\n <Box flexDirection=\"column\" alignItems=\"center\">\n {MINT_LOGO.map((line, i) => (\n <Text key={i} color=\"cyan\">{line}</Text>\n ))}\n </Box>\n\n {/* Subtitle */}\n <Box marginTop={0}>\n <Text color=\"cyan\" dimColor>{' AI CODING CLI'}</Text>\n </Box>\n\n {/* Stats Row */}\n <Box marginTop={1} gap={4}>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color=\"cyan\" bold>{String(modelCount)}</Text>\n <Text dimColor>models</Text>\n </Box>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color=\"cyan\" bold>{String(agentCount)}</Text>\n <Text dimColor>agents</Text>\n </Box>\n <Box flexDirection=\"column\" alignItems=\"center\">\n <Text color=\"cyan\" bold>{savingsLabel}</Text>\n <Text dimColor>cheaper</Text>\n </Box>\n </Box>\n\n {/* Info Cards */}\n <Box marginTop={1} gap={2}>\n {/* Quick Start */}\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1} width={30}>\n <Text dimColor bold>{'QUICK START'}</Text>\n <Text><Text color=\"cyan\">mint init</Text><Text dimColor> — index project</Text></Text>\n <Text><Text color=\"cyan\">/models </Text><Text dimColor> — all models</Text></Text>\n <Text><Text color=\"cyan\">/agent </Text><Text dimColor> — switch mode</Text></Text>\n <Text><Text color=\"cyan\">/usage </Text><Text dimColor> — session stats</Text></Text>\n </Box>\n\n {/* Keyboard */}\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1} width={30}>\n <Text dimColor bold>{'KEYBOARD'}</Text>\n <Text><Text color=\"yellow\">Esc </Text><Text dimColor> → normal mode</Text></Text>\n <Text><Text color=\"yellow\">i </Text><Text dimColor> → insert mode</Text></Text>\n <Text><Text color=\"yellow\">Enter </Text><Text dimColor> → send message</Text></Text>\n <Text><Text color=\"yellow\">Tab </Text><Text dimColor> → live inspector</Text></Text>\n <Text><Text color=\"yellow\">PgUp </Text><Text dimColor> → scroll faster</Text></Text>\n <Text><Text color=\"yellow\">Ctrl+C</Text><Text dimColor> → exit</Text></Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","import React from 'react';\nimport { Box, Text } from 'ink';\nimport type { PipelinePhaseData, SubtaskData } from '../types.js';\n\ninterface LiveTaskInspectorProps {\n phases: PipelinePhaseData[];\n selectedTaskId?: string | null;\n maxHeight: number;\n}\n\nexport function LiveTaskInspector({\n phases,\n selectedTaskId,\n maxHeight,\n}: LiveTaskInspectorProps): React.ReactElement | null {\n const tasks = flattenTasks(phases);\n if (tasks.length === 0 || maxHeight <= 0) {\n return null;\n }\n\n const selectedTask = tasks.find((task) => (task.taskId ?? task.id) === selectedTaskId) ?? tasks[0];\n const logs = selectedTask.recentLogs ?? [];\n const headerSuffix = [\n selectedTask.model ?? null,\n selectedTask.transcriptName ?? null,\n ].filter(Boolean).join(' · ');\n\n const lines: Array<{ text: string; color?: 'cyan' | 'yellow' | 'green' | 'red' | 'magenta'; dim?: boolean; bold?: boolean }> = [\n {\n text: `Task ${selectedTask.role ? `${selectedTask.role.toUpperCase()} ` : ''}#${selectedTask.id} · ${selectedTask.status}${headerSuffix ? ` · ${headerSuffix}` : ''}`,\n color: colorForStatus(selectedTask.status),\n bold: true,\n },\n { text: selectedTask.description, dim: true },\n ];\n\n if (selectedTask.progressSummary) {\n lines.push({ text: `progress: ${selectedTask.progressSummary}`, dim: true });\n }\n if (selectedTask.dependsOn && selectedTask.dependsOn.length > 0) {\n lines.push({ text: `depends on: ${selectedTask.dependsOn.map((id) => `#${id}`).join(', ')}`, dim: true });\n }\n if (selectedTask.writeTargets && selectedTask.writeTargets.length > 0) {\n lines.push({ text: `writes: ${selectedTask.writeTargets.join(', ')}`, dim: true });\n }\n if (selectedTask.transcriptPath) {\n lines.push({ text: `transcript: ${selectedTask.transcriptPath}`, dim: true });\n }\n if (logs.length > 0) {\n lines.push({ text: 'recent activity:', color: 'cyan', bold: true });\n for (const log of logs.slice(-Math.max(1, maxHeight - lines.length - 3))) {\n lines.push({ text: `- ${log}`, dim: true });\n }\n }\n\n const visibleLines = lines.slice(0, Math.max(1, maxHeight - 3));\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"cyan\" paddingX={1} height={maxHeight} overflow=\"hidden\">\n <Box justifyContent=\"space-between\">\n <Text color=\"cyan\" bold>Live Inspector</Text>\n <Text dimColor>Tab toggle · ←/→ task</Text>\n </Box>\n {visibleLines.map((line, index) => (\n <Text\n key={`${selectedTask.taskId ?? selectedTask.id}-${index}`}\n color={line.color}\n dimColor={line.dim}\n bold={line.bold}\n >\n {line.text}\n </Text>\n ))}\n </Box>\n );\n}\n\nfunction flattenTasks(phases: PipelinePhaseData[]): SubtaskData[] {\n const tasks = phases.flatMap((phase) => phase.subtasks ?? []);\n return [...tasks].sort((left, right) => rankTask(right) - rankTask(left));\n}\n\nfunction rankTask(task: SubtaskData): number {\n const statusRank = (() => {\n switch (task.status) {\n case 'waiting_approval': return 5;\n case 'running': return 4;\n case 'retry': return 3;\n case 'blocked': return 2;\n case 'queued': return 1;\n default: return 0;\n }\n })();\n return statusRank * 1000 + (task.recentLogs?.length ?? 0);\n}\n\nfunction colorForStatus(status: SubtaskData['status']): 'cyan' | 'yellow' | 'green' | 'red' | 'magenta' {\n switch (status) {\n case 'waiting_approval':\n return 'magenta';\n case 'running':\n case 'retry':\n return 'cyan';\n case 'blocked':\n return 'yellow';\n case 'failed':\n return 'red';\n default:\n return 'green';\n }\n}\n","// src/tui/hooks/useAgentEvents.ts\nimport { useState, useCallback } from 'react';\nimport type { PipelinePhaseData, PhaseName, SubtaskData } from '../types.js';\nimport type { PipelineTaskInfo } from '../../pipeline/types.js';\n\nexport type FileStatus = 'READ' | 'EDIT' | 'NEW' | 'BASH';\n\nexport interface TrackedFile {\n path: string;\n status: FileStatus;\n timestamp: number;\n}\n\nexport interface ToolCall {\n name: string;\n count: number;\n}\n\nexport interface PanelState {\n files: TrackedFile[];\n toolCalls: ToolCall[];\n totalCost: number;\n totalTokens: number;\n iterationCount: number;\n}\n\nexport function useAgentEvents() {\n const [panelState, setPanelState] = useState<PanelState>({\n files: [],\n toolCalls: [],\n totalCost: 0,\n totalTokens: 0,\n iterationCount: 0,\n });\n\n const [pipelinePhases, setPipelinePhases] = useState<PipelinePhaseData[]>([]);\n\n const onToolCall = useCallback((toolName: string, toolInput: Record<string, unknown>) => {\n setPanelState(prev => {\n const newFiles = [...prev.files];\n const fileStatus = inferFileStatus(toolName);\n if (fileStatus && toolInput.path) {\n const path = String(toolInput.path);\n const existing = newFiles.findIndex(f => f.path === path);\n if (existing >= 0) {\n newFiles[existing] = { path, status: fileStatus, timestamp: Date.now() };\n } else {\n newFiles.push({ path, status: fileStatus, timestamp: Date.now() });\n }\n }\n\n const newToolCalls = [...prev.toolCalls];\n const existingTool = newToolCalls.find(t => t.name === toolName);\n if (existingTool) {\n existingTool.count++;\n } else {\n newToolCalls.push({ name: toolName, count: 1 });\n }\n\n return {\n ...prev,\n files: newFiles,\n toolCalls: newToolCalls,\n iterationCount: prev.iterationCount + 1,\n };\n });\n }, []);\n\n const onCostUpdate = useCallback((cost: number, tokens: number) => {\n setPanelState(prev => ({\n ...prev,\n totalCost: prev.totalCost + cost,\n totalTokens: prev.totalTokens + tokens,\n }));\n }, []);\n\n const onPhaseStart = useCallback((name: PhaseName, model?: string, subtasks?: SubtaskData[]) => {\n setPipelinePhases(prev => [\n ...prev.map(p => p.status === 'active' ? { ...p, status: 'done' as const } : p),\n { name, status: 'active' as const, model, subtasks },\n ]);\n }, []);\n\n const onPhaseDone = useCallback((name: PhaseName, result: { duration?: number; cost?: number; summary?: string; subtasks?: SubtaskData[] }) => {\n setPipelinePhases(prev => {\n // Find the LAST phase with this name (handles multiple BUILDER phases)\n const idx = findLastMatchingPhaseIndex(prev, (phase) => phase.name === name && phase.status === 'active');\n if (idx === -1) {\n // fallback: update first matching\n return prev.map(p => p.name === name && p.status !== 'done'\n ? { ...p, status: 'done' as const, duration: result.duration, cost: result.cost, summary: result.summary, subtasks: result.subtasks ?? p.subtasks }\n : p\n );\n }\n return prev.map((p, i) => i === idx\n ? { ...p, status: 'done' as const, duration: result.duration, cost: result.cost, summary: result.summary, subtasks: result.subtasks ?? p.subtasks }\n : p\n );\n });\n }, []);\n\n const onTaskEvent = useCallback((task: PipelineTaskInfo, log?: string) => {\n setPipelinePhases((prev) => {\n const phaseIndex = findLastMatchingPhaseIndex(prev, (phase) => phase.name === task.phase && phase.status === 'active');\n if (phaseIndex === -1) {\n return prev;\n }\n\n return prev.map((phase, index) => {\n if (index !== phaseIndex) return phase;\n\n const subtasks = [...(phase.subtasks ?? [])];\n const subtaskIndex = subtasks.findIndex((subtask) => (subtask.taskId ?? subtask.id) === task.taskId);\n const existingSubtask = subtaskIndex >= 0 ? subtasks[subtaskIndex] : undefined;\n const recentLogs = log\n ? [...(existingSubtask?.recentLogs ?? []).slice(-11), log]\n : existingSubtask?.recentLogs;\n const nextSubtask: SubtaskData = {\n id: task.subtaskId ?? task.taskId,\n taskId: task.taskId,\n parentTaskId: task.parentTaskId,\n role: task.role,\n title: task.title,\n description: task.description,\n status: task.status,\n startedAt: task.startedAt,\n duration: task.duration,\n cost: task.cost,\n progressSummary: task.progressSummary,\n blockedBy: task.blockedBy,\n requiresApproval: task.requiresApproval,\n isBackground: task.isBackground,\n model: task.model,\n attempt: task.attempt,\n dependsOn: task.dependsOn,\n writeTargets: task.writeTargets,\n verificationTargets: task.verificationTargets,\n transcriptPath: task.transcriptPath,\n transcriptName: task.transcriptName,\n recentLogs,\n };\n\n if (subtaskIndex >= 0) {\n subtasks[subtaskIndex] = {\n ...subtasks[subtaskIndex],\n ...nextSubtask,\n };\n } else {\n subtasks.push(nextSubtask);\n }\n\n return { ...phase, subtasks };\n });\n });\n }, []);\n\n const resetPhases = useCallback(() => {\n setPipelinePhases([]);\n }, []);\n\n const reset = useCallback(() => {\n setPanelState({\n files: [],\n toolCalls: [],\n totalCost: 0,\n totalTokens: 0,\n iterationCount: 0,\n });\n setPipelinePhases([]);\n }, []);\n\n return {\n panelState,\n pipelinePhases,\n onToolCall,\n onCostUpdate,\n onPhaseStart,\n onPhaseDone,\n onTaskEvent,\n resetPhases,\n reset,\n };\n}\n\nfunction findLastMatchingPhaseIndex(\n phases: PipelinePhaseData[],\n predicate: (phase: PipelinePhaseData) => boolean,\n): number {\n for (let index = phases.length - 1; index >= 0; index--) {\n if (predicate(phases[index]!)) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction inferFileStatus(toolName: string): FileStatus | null {\n switch (toolName) {\n case 'read_file': return 'READ';\n case 'write_file': return 'NEW';\n case 'edit_file': return 'EDIT';\n default: return null;\n }\n}\n","import Database from 'better-sqlite3';\nimport { mkdirSync, existsSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\nexport interface UsageRecord {\n id: number;\n timestamp: number;\n sessionId: string;\n command: string;\n model: string;\n provider: string;\n tier: string;\n inputTokens: number;\n outputTokens: number;\n cost: number;\n opusCost: number;\n savedAmount: number;\n routingReason: string;\n taskPreview: string;\n latencyMs: number;\n costSonnet: number;\n}\n\nexport interface UsageSummary {\n totalRequests: number;\n totalCost: number;\n totalOpusCost: number;\n totalSaved: number;\n totalInputTokens: number;\n totalOutputTokens: number;\n byModel: Record<string, { requests: number; cost: number; inputTokens: number; outputTokens: number }>;\n}\n\nexport interface SessionSummary {\n sessionId: string;\n timestamp: number;\n command: string;\n model: string;\n cost: number;\n savedAmount: number;\n taskPreview: string;\n}\n\nexport class UsageDb {\n private db: Database.Database;\n\n constructor(dbPath: string = join(homedir(), '.mint', 'usage.db')) {\n const dir = join(dbPath, '..');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n this.db = new Database(dbPath);\n this.init();\n }\n\n private init(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS usage (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n timestamp INTEGER NOT NULL,\n sessionId TEXT NOT NULL,\n command TEXT NOT NULL DEFAULT 'chat',\n model TEXT NOT NULL,\n provider TEXT NOT NULL DEFAULT '',\n tier TEXT NOT NULL DEFAULT 'smart',\n inputTokens INTEGER NOT NULL DEFAULT 0,\n outputTokens INTEGER NOT NULL DEFAULT 0,\n cost REAL NOT NULL DEFAULT 0,\n opusCost REAL NOT NULL DEFAULT 0,\n savedAmount REAL NOT NULL DEFAULT 0,\n routingReason TEXT NOT NULL DEFAULT '',\n taskPreview TEXT NOT NULL DEFAULT '',\n latencyMs INTEGER NOT NULL DEFAULT 0,\n costSonnet REAL NOT NULL DEFAULT 0\n )\n `);\n }\n\n insert(record: Omit<UsageRecord, 'id'>): void {\n const stmt = this.db.prepare(`\n INSERT INTO usage\n (timestamp, sessionId, command, model, provider, tier,\n inputTokens, outputTokens, cost, opusCost, savedAmount,\n routingReason, taskPreview, latencyMs, costSonnet)\n VALUES\n (@timestamp, @sessionId, @command, @model, @provider, @tier,\n @inputTokens, @outputTokens, @cost, @opusCost, @savedAmount,\n @routingReason, @taskPreview, @latencyMs, @costSonnet)\n `);\n stmt.run(record);\n }\n\n getAll(): UsageRecord[] {\n return this.db.prepare('SELECT * FROM usage ORDER BY timestamp DESC').all() as UsageRecord[];\n }\n\n getSummary(): UsageSummary {\n const rows = this.getAll();\n const byModel: UsageSummary['byModel'] = {};\n\n let totalRequests = 0;\n let totalCost = 0;\n let totalOpusCost = 0;\n let totalSaved = 0;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n\n for (const row of rows) {\n totalRequests++;\n totalCost += row.cost;\n totalOpusCost += row.opusCost;\n totalSaved += row.savedAmount;\n totalInputTokens += row.inputTokens;\n totalOutputTokens += row.outputTokens;\n\n if (!byModel[row.model]) {\n byModel[row.model] = { requests: 0, cost: 0, inputTokens: 0, outputTokens: 0 };\n }\n byModel[row.model].requests++;\n byModel[row.model].cost += row.cost;\n byModel[row.model].inputTokens += row.inputTokens;\n byModel[row.model].outputTokens += row.outputTokens;\n }\n\n return { totalRequests, totalCost, totalOpusCost, totalSaved, totalInputTokens, totalOutputTokens, byModel };\n }\n\n getRecentSessions(limit: number): SessionSummary[] {\n const stmt = this.db.prepare(`\n SELECT sessionId, timestamp, command, model, cost, savedAmount, taskPreview\n FROM usage\n ORDER BY timestamp DESC\n LIMIT ?\n `);\n return stmt.all(limit) as SessionSummary[];\n }\n\n getTotalSaved(): number {\n const row = this.db.prepare('SELECT SUM(savedAmount) as total FROM usage').get() as { total: number | null };\n return row?.total ?? 0;\n }\n\n /**\n * Get cost summary for the current calendar month.\n */\n getMonthSummary(): MonthSummary {\n const now = new Date();\n const monthStart = new Date(now.getFullYear(), now.getMonth(), 1).getTime();\n const row = this.db.prepare(`\n SELECT\n COUNT(*) as requests,\n COALESCE(SUM(cost), 0) as cost,\n COALESCE(SUM(opusCost), 0) as opusCost,\n COALESCE(SUM(savedAmount), 0) as saved,\n COALESCE(SUM(inputTokens), 0) as inputTokens,\n COALESCE(SUM(outputTokens), 0) as outputTokens\n FROM usage\n WHERE timestamp >= ?\n `).get(monthStart) as { requests: number; cost: number; opusCost: number; saved: number; inputTokens: number; outputTokens: number };\n\n return {\n month: `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}`,\n requests: row.requests,\n cost: row.cost,\n opusCost: row.opusCost,\n saved: row.saved,\n inputTokens: row.inputTokens,\n outputTokens: row.outputTokens,\n };\n }\n\n /**\n * Get cost breakdown per day for the current month.\n */\n getDailyBreakdown(): DailyCost[] {\n const now = new Date();\n const monthStart = new Date(now.getFullYear(), now.getMonth(), 1).getTime();\n const rows = this.db.prepare(`\n SELECT\n date(timestamp / 1000, 'unixepoch', 'localtime') as day,\n COUNT(*) as requests,\n SUM(cost) as cost,\n SUM(opusCost) as opusCost\n FROM usage\n WHERE timestamp >= ?\n GROUP BY day\n ORDER BY day\n `).all(monthStart) as Array<{ day: string; requests: number; cost: number; opusCost: number }>;\n\n return rows;\n }\n\n /**\n * Get the running cost for the current session.\n */\n getSessionCost(sessionId: string): number {\n const row = this.db.prepare(\n 'SELECT COALESCE(SUM(cost), 0) as total FROM usage WHERE sessionId = ?'\n ).get(sessionId) as { total: number };\n return row.total;\n }\n\n close(): void {\n this.db.close();\n }\n}\n\nexport interface MonthSummary {\n month: string;\n requests: number;\n cost: number;\n opusCost: number;\n saved: number;\n inputTokens: number;\n outputTokens: number;\n}\n\nexport interface DailyCost {\n day: string;\n requests: number;\n cost: number;\n opusCost: number;\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { UsageDb } from './db.js';\nimport type { UsageRecord } from './db.js';\nimport { OPUS_INPUT_PRICE_PER_M, OPUS_OUTPUT_PRICE_PER_M, SONNET_INPUT_PRICE_PER_M, SONNET_OUTPUT_PRICE_PER_M } from './pricing.js';\n\nexport function calculateOpusCost(inputTokens: number, outputTokens: number): number {\n return (inputTokens / 1_000_000) * OPUS_INPUT_PRICE_PER_M +\n (outputTokens / 1_000_000) * OPUS_OUTPUT_PRICE_PER_M;\n}\n\nexport function calculateSonnetCost(inputTokens: number, outputTokens: number): number {\n return (inputTokens / 1_000_000) * SONNET_INPUT_PRICE_PER_M +\n (outputTokens / 1_000_000) * SONNET_OUTPUT_PRICE_PER_M;\n}\n\nexport interface TrackInput {\n model: string;\n provider: string;\n tier: string;\n inputTokens: number;\n outputTokens: number;\n cost: number;\n opusCost: number;\n savedAmount: number;\n routingReason: string;\n taskPreview: string;\n latencyMs: number;\n costSonnet: number;\n}\n\nlet _db: UsageDb | null = null;\n\nfunction getDb(): UsageDb {\n if (!_db) {\n _db = new UsageDb(join(homedir(), '.mint', 'usage.db'));\n }\n return _db;\n}\n\nexport function createUsageTracker(sessionId: string, command: string) {\n return {\n track(input: TrackInput): void {\n try {\n const record: Omit<UsageRecord, 'id'> = {\n timestamp: Date.now(),\n sessionId,\n command,\n model: input.model,\n provider: input.provider,\n tier: input.tier,\n inputTokens: input.inputTokens,\n outputTokens: input.outputTokens,\n cost: input.cost,\n opusCost: input.opusCost,\n savedAmount: input.savedAmount,\n routingReason: input.routingReason,\n taskPreview: input.taskPreview.slice(0, 80),\n latencyMs: input.latencyMs,\n costSonnet: input.costSonnet,\n };\n getDb().insert(record);\n } catch (e) {\n // Tracking failures should never crash the main flow\n process.stderr.write(`[axon:tracker] ${e instanceof Error ? e.message : String(e)}\\n`);\n }\n },\n };\n}\n\nexport function getUsageDb(): UsageDb {\n return getDb();\n}\n\n/**\n * Get the total cost for the current calendar month.\n * Safe to call at startup — returns 0 if no data.\n */\nexport function getMonthCost(): { cost: number; opusCost: number; saved: number; requests: number } {\n try {\n const summary = getDb().getMonthSummary();\n return { cost: summary.cost, opusCost: summary.opusCost, saved: summary.saved, requests: summary.requests };\n } catch {\n return { cost: 0, opusCost: 0, saved: 0, requests: 0 };\n }\n}\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type SessionTaskComplexity = 'trivial' | 'simple' | 'moderate' | 'complex';\n\nexport interface SessionMemorySnapshot {\n updatedAt: string;\n runId?: string;\n cwd: string;\n task: string;\n complexity: SessionTaskComplexity;\n filesSearched: string[];\n scopeDirectories: string[];\n entryFiles: string[];\n writeTargets: string[];\n architectPlan?: string;\n architectResearch: string[];\n builderBriefs: string[];\n finalResponseSummary?: string;\n reviewerFeedback?: string;\n}\n\nexport interface SessionMemoryDocument {\n raw: string;\n sourcePaths: string[];\n loadedAt: number;\n snapshot?: SessionMemorySnapshot | null;\n}\n\nconst AUTO_MEMORY_DIR = '.mint';\nconst AUTO_MEMORY_MARKDOWN = 'MEMORY.md';\nconst AUTO_MEMORY_JSON = 'memory.json';\n\nexport async function loadSessionMemory(cwd: string): Promise<SessionMemoryDocument | null> {\n const manualPath = join(cwd, 'MEMORY.md');\n const autoPath = join(cwd, AUTO_MEMORY_DIR, AUTO_MEMORY_MARKDOWN);\n const blocks: string[] = [];\n const sourcePaths: string[] = [];\n\n if (existsSync(manualPath)) {\n const manual = await readFile(manualPath, 'utf8');\n if (manual.trim().length > 0) {\n blocks.push(manual.trim());\n sourcePaths.push(manualPath);\n }\n }\n\n if (existsSync(autoPath)) {\n const auto = await readFile(autoPath, 'utf8');\n if (auto.trim().length > 0) {\n blocks.push(auto.trim());\n sourcePaths.push(autoPath);\n }\n }\n\n const snapshot = await loadSessionMemorySnapshot(cwd);\n if (blocks.length === 0 && !snapshot) {\n return null;\n }\n\n return {\n raw: blocks.join('\\n\\n---\\n\\n'),\n sourcePaths,\n loadedAt: Date.now(),\n snapshot,\n };\n}\n\nexport async function loadSessionMemorySnapshot(cwd: string): Promise<SessionMemorySnapshot | null> {\n const snapshotPath = join(cwd, AUTO_MEMORY_DIR, AUTO_MEMORY_JSON);\n if (!existsSync(snapshotPath)) {\n return null;\n }\n\n try {\n const raw = await readFile(snapshotPath, 'utf8');\n return JSON.parse(raw) as SessionMemorySnapshot;\n } catch {\n return null;\n }\n}\n\nexport function formatSessionMemoryForPrompt(memory: SessionMemoryDocument): string {\n const sourceAttr = memory.sourcePaths.length > 0\n ? memory.sourcePaths.join(',')\n : 'generated';\n return `<session_memory source=\"${sourceAttr}\">\\n${memory.raw}\\n</session_memory>`;\n}\n\nexport function formatSessionMemorySummary(snapshot: SessionMemorySnapshot): string {\n const parts: string[] = [\n `Last task: ${snapshot.task}`,\n snapshot.scopeDirectories.length > 0 ? `Scope: ${snapshot.scopeDirectories.join(', ')}` : '',\n snapshot.entryFiles.length > 0 ? `Entry files: ${snapshot.entryFiles.join(', ')}` : '',\n snapshot.writeTargets.length > 0 ? `Write targets: ${snapshot.writeTargets.join(', ')}` : '',\n ].filter(Boolean);\n return parts.join('\\n');\n}\n\nexport function getSessionMemoryCandidateFiles(snapshot: SessionMemorySnapshot | null | undefined): string[] {\n if (!snapshot) return [];\n return uniqueStrings([\n ...snapshot.entryFiles,\n ...snapshot.writeTargets,\n ...snapshot.filesSearched,\n ]).slice(0, 12);\n}\n\nexport function getSessionMemoryScopeHints(snapshot: SessionMemorySnapshot | null | undefined): string[] {\n if (!snapshot) return [];\n return uniqueStrings([\n ...snapshot.scopeDirectories,\n ...snapshot.entryFiles,\n ...snapshot.writeTargets,\n ]).slice(0, 12);\n}\n\nexport function isReferentialTask(task: string): boolean {\n return /\\b(it|that|those|them|this|previous|previously|before|back|again|same|revert|undo|restore|old|earlier)\\b|whatever was there/i.test(task);\n}\n\nexport async function persistSessionMemory(\n cwd: string,\n snapshot: SessionMemorySnapshot,\n): Promise<void> {\n const dir = join(cwd, AUTO_MEMORY_DIR);\n await mkdir(dir, { recursive: true });\n\n const markdownPath = join(dir, AUTO_MEMORY_MARKDOWN);\n const jsonPath = join(dir, AUTO_MEMORY_JSON);\n const markdown = renderSessionMemoryMarkdown(snapshot);\n\n await Promise.all([\n writeFile(markdownPath, markdown, 'utf8'),\n writeFile(jsonPath, JSON.stringify(snapshot, null, 2), 'utf8'),\n ]);\n}\n\nfunction renderSessionMemoryMarkdown(snapshot: SessionMemorySnapshot): string {\n const lines: string[] = [\n '# MEMORY.md — Session Memory',\n '',\n '> Auto-generated by Mint from the latest pipeline run. Use this to resolve follow-ups like \"revert that\" or \"put it back\".',\n '',\n '## Last Request',\n '',\n `- Updated: ${snapshot.updatedAt}`,\n snapshot.runId ? `- Run ID: ${snapshot.runId}` : '',\n `- Task: ${snapshot.task}`,\n `- Complexity: ${snapshot.complexity}`,\n '',\n '## Resolved Scope',\n '',\n snapshot.scopeDirectories.length > 0 ? `- Scope directories: ${snapshot.scopeDirectories.join(', ')}` : '- Scope directories: none',\n snapshot.entryFiles.length > 0 ? `- Entry files: ${snapshot.entryFiles.join(', ')}` : '- Entry files: none',\n snapshot.filesSearched.length > 0 ? `- Relevant files: ${snapshot.filesSearched.join(', ')}` : '- Relevant files: none',\n snapshot.writeTargets.length > 0 ? `- Write targets: ${snapshot.writeTargets.join(', ')}` : '- Write targets: none',\n '',\n '## Architect Handoff',\n '',\n snapshot.architectPlan ? snapshot.architectPlan : '- No architect plan captured.',\n '',\n '### Research',\n '',\n ...renderBulletList(snapshot.architectResearch, 'No architect research captured.'),\n '',\n '### Builder Briefs',\n '',\n ...renderBulletList(snapshot.builderBriefs, 'No builder briefs captured.'),\n '',\n '## Last Outcome',\n '',\n snapshot.finalResponseSummary ? `- Summary: ${snapshot.finalResponseSummary}` : '- Summary: none',\n snapshot.reviewerFeedback ? `- Reviewer feedback: ${snapshot.reviewerFeedback}` : '- Reviewer feedback: none',\n '',\n ];\n\n return lines.filter((line, index, all) => !(line === '' && all[index - 1] === '')).join('\\n');\n}\n\nfunction renderBulletList(items: string[], emptyText: string): string[] {\n if (items.length === 0) {\n return [`- ${emptyText}`];\n }\n return items.map((item) => `- ${item}`);\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n\n for (const value of values) {\n const normalized = value.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n result.push(normalized);\n }\n\n return result;\n}\n","import type { SpecialistConfig } from './types.js';\n\nexport const frontendSpecialist: SpecialistConfig = {\n type: 'frontend',\n systemPrompt: `You are a world-class frontend engineer — the best on the internet.\nYou have shipped production frontends used by millions. You think like a designer, execute like an engineer.\n\n## Your craft\n\n**Visual excellence:**\n- Every section must be pixel-perfect: correct spacing, rhythm, hierarchy, contrast\n- Use real design tokens (not magic numbers): 4/8/12/16/24/32/48/64/96/128px grid\n- Typography scale: establish a clear hierarchy (display → h1 → h2 → body → caption)\n- Color: don't use raw hex — map to semantic tokens (primary, surface, muted, accent)\n- Every hover, focus, and active state must be intentional — no bare unstyled interactions\n- Dark/light mode if the project uses it — never hardcode colors that break in dark mode\n\n**Component quality:**\n- Break UI into composable, reusable components — one responsibility per component\n- Props are typed with TypeScript — no 'any', no missing types\n- Extract repeated patterns: if you write the same JSX 3x, it becomes a component\n- Responsive by default: mobile-first, every layout works from 320px to 2560px\n- Accessibility: semantic HTML (section/article/nav/main/header/footer), aria labels where needed, keyboard-navigable\n\n**What makes a website look PROFESSIONAL vs AMATEUR:**\n\nStudy these patterns — this is the difference between a $50 Fiverr page and a $5,000 agency page:\n\nAMATEUR (what to AVOID):\n- Flat solid-color headers with white body (like a 2005 site)\n- Browser-default form elements (unstyled inputs, default buttons)\n- Everything the same size — no visual hierarchy\n- No spacing rhythm — elements crammed together or randomly placed\n- Generic stock content: \"Welcome to Our Company\", \"Lorem ipsum\"\n- No hover/transition effects — static, lifeless\n- Full-width text with no max-width container — unreadable lines\n\nPROFESSIONAL (what to BUILD):\n- Intentional color palette: 1 background tone, 1 primary accent, 1 text color, 1 muted text color — applied consistently\n- Clear visual hierarchy: hero headline is largest (text-5xl+), section titles smaller (text-3xl), body text readable (text-lg)\n- Consistent spacing rhythm: sections use py-20/py-24, content gaps use gap-8, elements use space-y-4/6 — never random pixel values\n- Every interactive element has: padding, rounded corners, hover state with transition-colors (200-300ms)\n- Cards have: background, generous padding (p-6+), rounded-xl, subtle border or shadow\n- Content in max-w-7xl mx-auto containers — never text spanning the full viewport width\n- Each section is visually DISTINCT — alternating backgrounds, different layouts (centered text → grid → cards → CTA band)\n- Real copy that sounds like it was written for this business, not copy-pasted from a template\n- Generous whitespace — let content breathe. When in doubt, add more space, not less.\n\n**Landing page structure (adapt sections to fit the business):**\n- Hero: the first impression. Big headline, clear value prop, 1-2 CTA buttons. Should fill most of the viewport.\n- Social proof / features / benefits: show WHY this business is worth it. Use a grid of cards, each with an icon or visual + title + short description.\n- Testimonials / results: real-feeling quotes from clients. Card layout with names and roles.\n- Pricing or programs: if applicable, show what the user gets. Use a multi-tier card layout, highlight the recommended option.\n- CTA: a conversion-focused band. Bold headline, one button. Different background from surrounding sections.\n- Footer: organized links, contact info, copyright. Multi-column grid.\n\nAdapt the number and type of sections to what makes sense for the business. A gym coach needs different sections than a SaaS product.\n\n**How to make forms look professional:**\n- Styled inputs: border, rounded, padding (px-4 py-3), focus ring (focus:ring-2 focus:ring-{accent}), placeholder text\n- Labels above inputs, not inside\n- Submit button: full-width or prominent, accent background, hover state, disabled state while submitting\n- Group related fields, add spacing between groups\n\n**Icons and visuals:**\n- Use inline SVG paths (from Lucide, Heroicons, or Feather) — not img tags pointing to missing files\n- If no icon library: use emoji as icons (they render everywhere and look clean at small sizes)\n- For avatar/profile placeholders: use gradient-colored circles (bg-gradient-to-br from-blue-500 to-purple-500 rounded-full)\n- Never leave broken image tags — if an image doesn't exist, use a CSS gradient or colored div instead\n\n## Execution discipline\n\n1. Read the existing codebase FIRST — understand the stack, the design tokens, the component patterns\n2. Build section by section — complete one section fully (markup + styles + logic + real copy) before moving to the next\n3. After each section: re-read what you wrote with \\`read_file\\` and verify:\n - Does it have REAL content (not placeholder)?\n - Does the layout work (proper flex/grid, spacing)?\n - Are interactive elements wired up (onClick, href, onSubmit)?\n - Would a designer approve this section?\n4. Use the project's existing component library if one exists (shadcn/ui, radix, etc.)\n5. Import from the right paths — check package.json and existing imports before writing new ones\n6. After ALL sections are complete: **COUNT them**. If the task asked for 6 sections and you built 4, you are NOT done. Build the remaining ones.\n7. **Polish pass**: re-read the ENTIRE page top to bottom. Fix spacing inconsistencies, color mismatches, copy that sounds robotic, missing hover states\n8. **Run the build** (if applicable): If the project has a build step, run \\`bash(\"cd {project_dir} && npm run build\")\\`. If it fails, fix and re-run. If the project is static HTML (no bundler, no framework), skip this step — there's nothing to build.\n9. **Final read**: re-read the main component one more time. If anything looks unfinished, fix it now.\n10. NEVER stop until every section is fully implemented with real content AND the build passes\n\n## Common frontend gotchas to avoid\n- Never inline URL-encoded SVG (e.g. \\`data:image/svg+xml,%3Csvg...\\`) inside a \\`<style>\\` block in HTML — Vite's HTML parser (parse5) will throw. Move SVGs to \\`public/\\` as files and reference with \\`url(\"/name.svg\")\\`\n- Do not put \\`<\\` \\`>\\` or unencoded XML inside HTML attributes or style tags\n- Always check that \\`import\\` paths resolve — use \\`find_files\\` to confirm the path exists before writing it\n\n## Output rules\n- Output unified diffs for every change\n- One file per diff block\n- New files: use \\`--- /dev/null\\` header\n- Never modify backend files, API routes, or database schemas`,\n allowedTools: ['read_file', 'write_file', 'edit_file', 'find_files', 'grep_files', 'list_dir', 'bash'],\n extraContextGlobs: [\n '**/package.json',\n '**/tsconfig.json',\n '**/tailwind.config.*',\n '**/components/**/*.tsx',\n '**/styles/**/*.css',\n '**/app/globals.css',\n '**/src/index.css',\n ],\n};\n","import type { SpecialistConfig } from './types.js';\n\nexport const backendSpecialist: SpecialistConfig = {\n type: 'backend',\n systemPrompt: `You are a senior backend engineer. Production-grade code only.\n\n## Standards\n\n**Every endpoint must have:**\n- Request validation (check required fields, types, bounds)\n- Proper HTTP status codes (201 for created, 400 for bad input, 404 for not found, 500 for server errors)\n- Error handling with try/catch — never let unhandled errors crash the server\n- Meaningful error messages in the response body\n- CORS headers if the frontend will call it\n\n**Every database operation must have:**\n- Input sanitization (parameterized queries, never string concatenation)\n- Error handling (what if the DB is down? what if the record doesn't exist?)\n- Proper async/await (no fire-and-forget without error logging)\n\n**Code organization:**\n- Routes in route files, business logic in separate functions\n- Shared types/interfaces for request and response shapes\n- Environment variables for secrets — never hardcode\n\n## Execution discipline\n1. Read existing backend code first — match the patterns (Express vs Hono vs Fastify, ORM vs raw SQL)\n2. Implement EVERY endpoint in the task completely — no stubs, no TODOs\n3. After writing: re-read each file with read_file and verify all endpoints have full implementations\n4. Run the build/typecheck to verify: \\`bash(\"npm run build\")\\` or \\`bash(\"npx tsc --noEmit\")\\`\n5. Test with curl if possible: \\`bash(\"curl -s http://localhost:PORT/api/health\")\\`\n6. Never modify frontend components, CSS, or UI files`,\n allowedTools: ['read_file', 'write_file', 'edit_file', 'find_files', 'grep_files', 'list_dir', 'bash'],\n extraContextGlobs: ['**/package.json', '**/.env.example', '**/tsconfig.json'],\n};\n","import type { SpecialistConfig } from './types.js';\n\nexport const databaseSpecialist: SpecialistConfig = {\n type: 'database',\n systemPrompt: 'You are a database specialist. You write migrations, schema changes, queries, ORM code (Prisma, Drizzle, TypeORM, Sequelize, Knex). You understand relations, indexes, and data integrity. You NEVER write destructive migrations without explicit instruction. Always create new migration files, never edit existing ones.',\n allowedTools: ['read_file', 'write_file', 'edit_file', 'bash'],\n extraContextGlobs: ['**/prisma/schema.prisma', '**/drizzle.config.*', '**/knexfile.*'],\n};\n","import type { SpecialistConfig } from './types.js';\n\nexport const testingSpecialist: SpecialistConfig = {\n type: 'testing',\n systemPrompt: 'You are a testing specialist. You write unit tests, integration tests, and e2e tests. You match the project\\'s existing test patterns, framework (Jest, Vitest, Pytest, Mocha), and file naming conventions. Look at existing test files first to match the style. Every test should have clear arrange/act/assert structure.',\n allowedTools: ['read_file', 'write_file', 'edit_file', 'bash'],\n extraContextGlobs: ['**/jest.config.*', '**/vitest.config.*', '**/pytest.ini'],\n};\n","import type { SpecialistConfig } from './types.js';\n\nexport const devopsSpecialist: SpecialistConfig = {\n type: 'devops',\n systemPrompt: `You are a senior DevOps/Platform engineer. Infrastructure as code, zero-downtime deployments, security by default.\n\n## Docker\n\n**Dockerfile best practices:**\n- Multi-stage builds: build stage (with dev deps) → production stage (minimal image)\n- Use specific base image tags (node:20-alpine, NOT node:latest)\n- COPY package*.json first, then npm ci, THEN copy source — leverages layer caching\n- Non-root user: USER node (never run as root in production)\n- .dockerignore: node_modules, .git, .env, dist, coverage\n- Health checks: HEALTHCHECK CMD curl -f http://localhost:PORT/health || exit 1\n\n**docker-compose:**\n- Named volumes for persistent data (databases)\n- Networks for service isolation\n- Environment variables via .env file (never hardcoded)\n- depends_on with healthcheck conditions for startup ordering\n- Resource limits: deploy.resources.limits.memory\n\n## CI/CD (GitHub Actions)\n\n**Workflow structure:**\n- Separate workflows: ci.yml (on PR), deploy.yml (on push to main), release.yml (on tag)\n- CI jobs: lint → typecheck → test → build (fail fast)\n- Use caching: actions/cache for node_modules, Docker layer caching\n- Matrix builds for multiple Node versions if supporting them\n- Secrets: use GitHub Secrets for API keys, NEVER echo or log them\n- Concurrency: cancel in-progress runs on new push to same branch\n\n**Deployment:**\n- Blue-green or rolling deployment — never all-at-once\n- Database migrations before app deployment, not during\n- Rollback plan: keep previous container image tagged\n- Health check verification after deploy before routing traffic\n- Smoke test: hit /health endpoint after deploy, alert on failure\n\n## Security\n\n- Secrets NEVER in code or Dockerfile — use env vars, secret managers, or sealed secrets\n- Least privilege: service accounts with minimal permissions\n- Image scanning: scan for CVEs in CI (trivy, snyk)\n- Network policies: services only talk to what they need\n- HTTPS everywhere, even internal services\n\n## Execution discipline\n1. Read existing infra files first — match the conventions (Docker, K8s, serverless?)\n2. Every Dockerfile must build successfully: \\`bash(\"docker build -t test .\")\\`\n3. Every CI workflow must be valid YAML: \\`bash(\"npx yaml-lint .github/workflows/*.yml\")\\`\n4. Test locally before pushing: docker compose up, verify services communicate\n5. Never modify application code — only infra/config/deployment files`,\n allowedTools: ['read_file', 'write_file', 'edit_file', 'find_files', 'grep_files', 'list_dir', 'bash'],\n extraContextGlobs: [\n '**/Dockerfile*',\n '**/.github/workflows/*',\n '**/docker-compose.*',\n '**/.env.example',\n '**/nginx.conf',\n '**/Procfile',\n '**/railway.json',\n '**/fly.toml',\n '**/vercel.json',\n ],\n};\n","import type { SpecialistConfig } from './types.js';\n\nexport const docsSpecialist: SpecialistConfig = {\n type: 'docs',\n systemPrompt: 'You are a documentation specialist. You write README files, API documentation, JSDoc/TSDoc comments, changelog entries, and inline code comments. You match the project\\'s existing documentation style and tone.',\n allowedTools: ['read_file', 'write_file', 'edit_file'],\n extraContextGlobs: ['**/README.md', '**/CHANGELOG.md', '**/docs/**'],\n};\n","export const BUILDER_PROMPT = `You are a code builder. You have full access to all tools — read files, write files, run commands, grep, search. Use whatever you need to get the job done.\n\n## How you work\n\n1. **Explore first** — use your tools to understand the project. Read files, list directories, grep for patterns. Know what exists before changing anything.\n2. **Follow the plan** — if an architect plan is provided, follow it step by step. The plan was created by a senior engineer who analyzed the codebase.\n3. **Create or edit** — if files exist, edit them. If they don't, create them. Use the right tool for the job.\n4. **Output diffs** — every code change should be in a unified diff block so the reviewer can see what changed.\n\n## Diff format\n\n\\`\\`\\`diff\n--- a/src/path/to/file.ts\n+++ b/src/path/to/file.ts\n@@ -10,6 +10,10 @@\n context line\n-old line\n+new line\n context line\n\\`\\`\\`\n\nFor NEW files:\n\\`\\`\\`diff\n--- /dev/null\n+++ b/src/path/to/newfile.ts\n@@ -0,0 +1,N @@\n+full file contents here\n\\`\\`\\`\n\n## After making changes — verify\n\n1. **Build check** — run the project build command. Fix errors until it passes. Static HTML/CSS — skip this.\n2. **Completeness check** — re-read every file you touched. No TODOs, no stubs, no placeholders. Every item in the spec is implemented.\n3. Output \"DONE\"\n\n## Retry instructions\n\nWhen you receive reviewer feedback, treat it as additional requirements on top of the original spec. The original spec is still your primary instruction — the feedback tells you what to fix.`;\n","import type { SpecialistConfig } from './types.js';\nimport { BUILDER_PROMPT } from '../prompts/builder.js';\n\nexport const generalSpecialist: SpecialistConfig = {\n type: 'general',\n systemPrompt: BUILDER_PROMPT,\n allowedTools: [\n 'read_file', 'write_file', 'edit_file', 'bash',\n 'grep_files', 'find_files', 'list_dir', 'search_replace',\n 'run_tests', 'git_diff', 'web_fetch',\n ],\n extraContextGlobs: [],\n};\n","import type { SpecialistConfig } from './types.js';\n\nexport const mobileSpecialist: SpecialistConfig = {\n type: 'mobile',\n systemPrompt: `You are a senior mobile engineer who ships apps used by millions.\n\n## Platforms\n\n**React Native / Expo:**\n- Use functional components + hooks exclusively\n- Navigation: React Navigation v6+ with typed routes\n- State: Zustand or React Context for local, TanStack Query for server state\n- Styling: StyleSheet.create (NOT inline objects — they cause re-renders)\n- Always handle: loading states, error states, empty states, offline states\n- Test on both iOS and Android mental models (back button behavior, safe areas, notch)\n\n**Native Android (Kotlin):**\n- MVVM architecture: ViewModel + StateFlow/SharedFlow + Repository pattern\n- Jetpack Compose for UI — never XML layouts for new code\n- Coroutines for async — structured concurrency, never GlobalScope\n- Room for local DB, Retrofit for network, Hilt for DI\n- Handle configuration changes (rotation, dark mode) properly\n- ProGuard rules for release builds\n\n**Flutter:**\n- BLoC or Riverpod for state management\n- Separate UI, business logic, and data layers\n- Use const constructors everywhere possible\n- Handle platform differences explicitly (Platform.isIOS)\n\n## Mobile-specific quality standards\n\n**Performance:**\n- Lazy load screens and heavy components\n- Optimize list rendering (FlatList/RecyclerView/ListView.builder with keys)\n- Image caching and proper sizing (never load a 4K image for a 100px thumbnail)\n- Minimize bundle size — tree-shake, remove unused assets\n\n**UX essentials:**\n- Touch targets: minimum 44x44pt (Apple HIG) / 48x48dp (Material)\n- Loading feedback: skeleton screens > spinners > blank screens\n- Error messages: actionable (\"Check your connection and try again\" not \"Error 500\")\n- Haptic feedback for important actions\n- Respect system font size (Dynamic Type / sp units)\n- Handle keyboard: auto-dismiss, scroll-to-input, proper insets\n\n**Offline-first:**\n- Cache API responses locally\n- Queue mutations when offline, sync when back online\n- Show stale data with \"last updated\" timestamp — never a blank screen\n- Handle network transitions gracefully\n\n## Execution discipline\n1. Read existing code first — match the architecture pattern already in use\n2. Check the navigation structure before adding new screens\n3. Every screen must handle: loading, error, empty, and data states\n4. Test both platforms mentally — what does \"back\" do? Where's the safe area?\n5. Run the build: \\`bash(\"npx expo build:web\")\\` or \\`bash(\"cd android && ./gradlew assembleDebug\")\\`\n6. Never leave TODO or placeholder text in user-visible UI`,\n allowedTools: ['read_file', 'write_file', 'edit_file', 'find_files', 'grep_files', 'list_dir', 'bash'],\n extraContextGlobs: [\n '**/package.json',\n '**/app.json',\n '**/app.config.*',\n '**/build.gradle*',\n '**/AndroidManifest.xml',\n '**/Info.plist',\n '**/pubspec.yaml',\n ],\n};\n","import type { SpecialistConfig } from './types.js';\n\nexport const aiSpecialist: SpecialistConfig = {\n type: 'ai',\n systemPrompt: `You are a senior AI/ML engineer who builds production AI systems — not notebooks, production code.\n\n## LLM integration patterns\n\n**API clients (OpenAI, Anthropic, Google, etc.):**\n- Always use the official SDK, not raw fetch — SDKs handle retries, streaming, and auth\n- Streaming: use server-sent events (SSE) for real-time token output to the user\n- Error handling: rate limits (429 — exponential backoff with jitter), context length exceeded (truncate or summarize), API down (fallback model or cached response)\n- Token counting: estimate BEFORE sending — don't burn money on requests that will fail\n- Cost tracking: log every API call with model, tokens, cost, latency\n\n**Prompt engineering (in code):**\n- System prompts in separate files/constants — never inline strings in business logic\n- Use XML tags or markdown headers to structure prompts (models parse them better than plain text)\n- Template prompts with typed variables — never string concatenation with user input (injection risk)\n- Few-shot examples: 2-3 examples in the system prompt beat long instructions\n- Output format: always request structured output (JSON) with a schema description\n\n**RAG (Retrieval-Augmented Generation):**\n- Chunk documents by semantic boundaries (paragraphs, sections) not fixed token counts\n- Embeddings: cache them, don't recompute on every query\n- Retrieval: hybrid search (vector similarity + keyword BM25) beats either alone\n- Context window: stuff retrieved chunks into the prompt with source attribution\n- Always include a \"no relevant information found\" fallback — don't let the model hallucinate\n\n**Agent loops:**\n- Tool definitions: clear name, description, and parameter schema — the model uses the description to decide when to call it\n- Max iterations: always set a cap (prevent infinite loops)\n- Tool results: feed back as structured messages, not appended to the user prompt\n- Conversation history: sliding window or summarization — don't let context grow unbounded\n- Abort signals: wire AbortController through every async operation\n\n## Production AI code standards\n\n**Reliability:**\n- Retry with exponential backoff on transient errors (429, 500, timeout)\n- Fallback chains: primary model → fallback model → cached response → graceful error\n- Timeout: 30s for chat completions, 120s for long-form generation — never unbounded\n- Validate model output: if expecting JSON, parse and validate before using\n\n**Cost control:**\n- Use the cheapest model that works for each task (don't use GPT-4 for classification)\n- Cache identical requests (same prompt + same model = same response)\n- Track cost per user/session/feature — log every API call\n- Set monthly cost alerts and hard caps\n\n**Security:**\n- Never put API keys in code — environment variables or secret managers only\n- Sanitize user input before injecting into prompts (prevent prompt injection)\n- Don't return raw model output to users without filtering (the model might leak system prompt)\n- Rate limit per user to prevent abuse\n\n## Execution discipline\n1. Read existing AI/ML code first — match the patterns (which SDK, which models, how prompts are structured)\n2. Every LLM call must have: error handling, timeout, cost tracking, and logging\n3. Test with a real API call if possible — \\`bash(\"node -e 'import ... ; await complete(...)'\")\\`\n4. Never hardcode API keys or model names — use config/environment\n5. Run the build to verify types: \\`bash(\"npx tsc --noEmit\")\\` or \\`bash(\"npm run build\")\\``,\n allowedTools: ['read_file', 'write_file', 'edit_file', 'find_files', 'grep_files', 'list_dir', 'bash'],\n extraContextGlobs: [\n '**/package.json',\n '**/.env.example',\n '**/tsconfig.json',\n '**/requirements.txt',\n '**/pyproject.toml',\n ],\n};\n","import type { SpecialistConfig } from './types.js';\n\nexport const fullstackSpecialist: SpecialistConfig = {\n type: 'fullstack',\n systemPrompt: `You are a senior fullstack engineer who owns features end-to-end — from database to deployment.\n\n## Your advantage\n\nYou see the FULL picture. When you build a feature, you think about:\n- Database schema → API endpoint → Frontend component → User interaction → Error handling\n- One change often requires updates in 3-4 files across the stack. You catch all of them.\n\n## Backend patterns\n\n**API design:**\n- RESTful by default: GET for reads, POST for creates, PUT/PATCH for updates, DELETE for deletes\n- Consistent response shape: { data, error, meta } — never mix conventions\n- Input validation at the boundary (zod, joi, or manual checks) — before any business logic\n- Proper HTTP status codes: 200 OK, 201 Created, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Internal Server Error\n- CORS: configure explicitly — never use \\`cors({ origin: '*' })\\` in production\n\n**Database:**\n- Parameterized queries ALWAYS — never interpolate user input into SQL\n- Migrations for schema changes — never modify production tables directly\n- Index frequently queried columns\n- Use transactions for multi-table writes\n\n**Auth:**\n- JWT for stateless auth, httpOnly cookies for web, Bearer header for APIs\n- Hash passwords with bcrypt (cost factor 10+) — never store plaintext\n- Validate tokens on every protected route — middleware pattern\n\n## Frontend patterns\n\n- Fetch data with proper loading/error/empty states — never assume success\n- Forms: validate on submit, show inline errors, disable button while submitting\n- Optimistic UI where it makes sense (toggle, like, delete) — revert on failure\n- Type-safe API calls: shared types between frontend and backend (or generated from schema)\n\n## Cross-stack consistency\n\nWhen you create an API endpoint, ALWAYS also:\n1. Add the frontend fetch call / API client method\n2. Wire it into the component that uses it\n3. Handle errors in the UI\n4. Update TypeScript types on both sides\n\nWhen you modify a database column, ALWAYS also:\n1. Update the API serializer/response shape\n2. Update the frontend type definitions\n3. Check all queries that reference the column\n\n## Execution discipline\n1. Read the full stack: backend routes, frontend components, and types/schemas\n2. Start with the data layer (schema/migration), then API, then frontend — bottom up\n3. After ALL changes: run both builds — backend AND frontend\n4. Verify cross-file references: grep for the function/route/type name you changed\n5. Never modify one layer without checking the impact on others`,\n allowedTools: ['read_file', 'write_file', 'edit_file', 'find_files', 'grep_files', 'list_dir', 'bash', 'search_replace'],\n extraContextGlobs: [\n '**/package.json',\n '**/tsconfig.json',\n '**/.env.example',\n '**/prisma/schema.prisma',\n '**/drizzle.config.*',\n ],\n};\n","import type { SpecialistConfig } from './types.js';\n\nexport const debuggingSpecialist: SpecialistConfig = {\n type: 'debugging',\n systemPrompt: `You are a senior debugging engineer. You find bugs that other developers gave up on.\n\n## Your method (FOLLOW THIS ORDER — never jump to fixing)\n\n### Step 1: REPRODUCE\nBefore touching any code, understand the bug:\n- What is the EXACT error message? (read it character by character)\n- What is the EXPECTED behavior vs ACTUAL behavior?\n- What triggers it? (specific input, timing, sequence of actions)\n- Is it consistent or intermittent?\n\nUse tools to verify: \\`bash(\"npm test\")\\`, \\`bash(\"curl ...\")\\`, \\`grep_files(\"error_message\")\\`\n\n### Step 2: LOCATE\nFind the exact line where the bug originates (not where it manifests):\n- Read the full stack trace — the ROOT cause is usually NOT the top frame\n- \\`grep_files\\` for the error message text, function name, or variable from the trace\n- Read the file at the line number from the stack trace\n- Trace the data flow BACKWARDS: where did the bad value come from?\n- Check: was it always wrong (logic error) or did it become wrong (state mutation, race condition)?\n\n### Step 3: UNDERSTAND\nBefore writing a fix, explain the bug to yourself:\n- What is the ACTUAL root cause? (not the symptom)\n- Why did the original code seem correct? (what assumption was wrong?)\n- Are there OTHER places with the same bug pattern? (grep for similar code)\n- Will the fix break anything else? (check callers of the function you're changing)\n\n### Step 4: FIX (minimal, targeted)\n- Fix the ROOT CAUSE, not the symptom\n- Smallest possible change — don't refactor surrounding code\n- If the fix is more than 10 lines, question whether you're fixing the right thing\n- Add a comment explaining WHY the bug happened (for the next developer)\n\n### Step 5: VERIFY\n- Run the failing test/command again — does it pass now?\n- Run the FULL test suite — did the fix break anything else?\n- Check edge cases: null input, empty array, concurrent access, boundary values\n- If no tests exist for this bug, WRITE ONE that would have caught it\n\n## Common bug patterns (check these first)\n\n**Off-by-one:**\n- Array index: \\`array[array.length]\\` → undefined (should be \\`length - 1\\`)\n- Loop bounds: \\`i <= length\\` → out of bounds (should be \\`< length\\`)\n- String slicing: \\`slice(0, -0)\\` → empty string (edge case when value is 0)\n\n**Null/undefined:**\n- Optional chaining missing: \\`obj.nested.value\\` → crash (should be \\`obj?.nested?.value\\`)\n- Falsy confusion: \\`if (value)\\` rejects 0, '', false (should be \\`value != null\\`)\n- Array destructuring: \\`const [first] = emptyArray\\` → undefined (no guard)\n\n**Async/race conditions:**\n- Missing await: \\`const result = asyncFn()\\` → gets Promise, not value\n- Stale closure: callback captures old state, not current\n- Parallel writes: two async operations overwrite each other's results\n- Event ordering: assumption that A completes before B starts\n\n**Type coercion (JS):**\n- \\`==\\` instead of \\`===\\` (number-string comparison)\n- \\`parseInt(\"08\")\\` → historically 0 in some environments\n- \\`JSON.parse\\` on non-JSON string → uncaught throw\n\n**Import/path:**\n- Missing \\`.js\\` extension in ESM imports\n- Circular imports: A imports B which imports A → undefined at runtime\n- Case sensitivity: works on macOS (case-insensitive), fails on Linux CI\n\n## Execution discipline\n1. REPRODUCE first — run the failing command before reading code\n2. READ the stack trace — don't guess, read the actual error\n3. LOCATE the root cause — trace backwards from the error\n4. FIX minimally — one focused change\n5. VERIFY — run the test/command that was failing, then run the full suite\n6. If the fix doesn't work after 3 attempts — step back, re-read the code, question your assumptions`,\n allowedTools: ['read_file', 'write_file', 'edit_file', 'find_files', 'grep_files', 'list_dir', 'bash', 'run_tests', 'git_diff'],\n extraContextGlobs: [\n '**/package.json',\n '**/tsconfig.json',\n '**/.env.example',\n ],\n};\n","import type { SpecialistType, SpecialistConfig } from './types.js';\nimport { frontendSpecialist } from './frontend.js';\nimport { backendSpecialist } from './backend.js';\nimport { databaseSpecialist } from './database.js';\nimport { testingSpecialist } from './testing.js';\nimport { devopsSpecialist } from './devops.js';\nimport { docsSpecialist } from './docs.js';\nimport { generalSpecialist } from './general.js';\nimport { mobileSpecialist } from './mobile.js';\nimport { aiSpecialist } from './ai.js';\nimport { fullstackSpecialist } from './fullstack.js';\nimport { debuggingSpecialist } from './debugging.js';\n\nexport type { SpecialistType, SpecialistConfig };\n\nconst specialists: Record<SpecialistType, SpecialistConfig> = {\n frontend: frontendSpecialist,\n backend: backendSpecialist,\n database: databaseSpecialist,\n testing: testingSpecialist,\n devops: devopsSpecialist,\n docs: docsSpecialist,\n general: generalSpecialist,\n mobile: mobileSpecialist,\n ai: aiSpecialist,\n fullstack: fullstackSpecialist,\n debugging: debuggingSpecialist,\n};\n\n/**\n * Get the specialist config for a given type.\n */\nexport function getSpecialist(type: SpecialistType): SpecialistConfig {\n return specialists[type] ?? specialists.general;\n}\n\n/**\n * Detect the most appropriate specialist based on file paths.\n * Uses first-match priority: frontend > backend > database > testing > devops > docs > general.\n */\nexport function detectSpecialist(files: string[]): SpecialistType {\n if (files.length === 0) return 'general';\n\n const counts: Record<string, number> = {\n frontend: 0, backend: 0, database: 0, testing: 0,\n devops: 0, docs: 0, mobile: 0, ai: 0,\n };\n\n for (const file of files) {\n const lower = file.toLowerCase();\n const parts = lower.split('/');\n\n // Mobile patterns\n if (\n lower.endsWith('.swift') || lower.endsWith('.kt') || lower.endsWith('.dart') ||\n lower.includes('android') || lower.includes('ios') ||\n parts.some(p => ['screens', 'navigation'].includes(p)) ||\n lower.includes('app.json') || lower.includes('pubspec.yaml')\n ) {\n counts.mobile++;\n continue;\n }\n\n // AI/ML patterns\n if (\n parts.some(p => ['agents', 'prompts', 'embeddings', 'rag', 'llm', 'ai', 'ml'].includes(p)) ||\n lower.includes('openai') || lower.includes('anthropic') || lower.includes('langchain') ||\n lower.endsWith('.ipynb')\n ) {\n counts.ai++;\n continue;\n }\n\n // Frontend patterns\n if (\n lower.endsWith('.tsx') || lower.endsWith('.jsx') ||\n lower.endsWith('.vue') || lower.endsWith('.svelte') ||\n lower.endsWith('.css') || lower.endsWith('.scss') ||\n parts.some(p => p === 'components')\n ) {\n counts.frontend++;\n continue;\n }\n\n // Backend patterns\n if (\n parts.some(p => ['routes', 'controllers', 'middleware', 'api'].includes(p)) ||\n lower.match(/^server\\.\\w+$/)\n ) {\n counts.backend++;\n continue;\n }\n\n // Database patterns\n if (\n parts.some(p => ['migrations', 'drizzle'].includes(p)) ||\n lower.endsWith('.sql') ||\n lower.includes('schema.prisma')\n ) {\n counts.database++;\n continue;\n }\n\n // Testing patterns\n if (\n lower.match(/\\.test\\.\\w+$/) || lower.match(/\\.spec\\.\\w+$/) ||\n parts.some(p => p === '__tests__')\n ) {\n counts.testing++;\n continue;\n }\n\n // DevOps patterns\n if (\n lower.includes('dockerfile') ||\n parts.some(p => p === '.github') ||\n lower.match(/^docker-compose\\./)\n ) {\n counts.devops++;\n continue;\n }\n\n // Docs patterns\n if (\n lower.match(/^readme/i) || lower.match(/^changelog/i) ||\n parts.some(p => p === 'docs')\n ) {\n counts.docs++;\n continue;\n }\n }\n\n // Return the type with highest count\n const ranked: Array<[SpecialistType, number]> = [\n ['mobile', counts.mobile],\n ['ai', counts.ai],\n ['frontend', counts.frontend],\n ['backend', counts.backend],\n ['database', counts.database],\n ['testing', counts.testing],\n ['devops', counts.devops],\n ['docs', counts.docs],\n ];\n\n const best = ranked.reduce((a, b) => a[1] >= b[1] ? a : b);\n return best[1] > 0 ? best[0] : 'general';\n}\n\n/**\n * Detect specialist from the TASK DESCRIPTION when no files are available.\n * Used for empty/new projects where file-based detection returns 'general'.\n */\nexport function detectSpecialistFromTask(task: string): SpecialistType {\n const lower = task.toLowerCase();\n\n // Frontend signals\n if (/\\b(landing\\s*page|website|homepage|web\\s*app|frontend|react|next\\.?js|vue|svelte|tailwind|css|ui|ux|dashboard|portfolio)\\b/.test(lower)) {\n return 'frontend';\n }\n\n // Mobile signals\n if (/\\b(mobile\\s*app|android|ios|react\\s*native|expo|flutter|swift|kotlin)\\b/.test(lower)) {\n return 'mobile';\n }\n\n // AI signals — require multi-word context to avoid false positives from \"AI\" in content text\n if (/\\b(ml\\s+model|llm|gpt|claude|openai|anthropic|embedding|rag\\s+pipeline|ai\\s+agent|prompt\\s+engineer|chatbot|fine.?tun)\\b/.test(lower)\n || (/\\bai\\b/.test(lower) && /\\b(model|train|inference|pipeline|vector|token)\\b/.test(lower))) {\n return 'ai';\n }\n\n // Backend signals\n if (/\\b(api|endpoint|server|backend|express|fastify|rest|graphql|middleware|auth|database|crud)\\b/.test(lower)) {\n return 'backend';\n }\n\n // DevOps signals\n if (/\\b(docker|ci.?cd|deploy|pipeline|kubernetes|k8s|github\\s*action|nginx|terraform)\\b/.test(lower)) {\n return 'devops';\n }\n\n // Debug signals\n if (/\\b(fix|bug|debug|broken|crash|error|not\\s*working|fails|issue)\\b/.test(lower)) {\n return 'debugging';\n }\n\n return 'general';\n}\n","export interface ConversationBypass {\n response: string;\n reason: 'greeting' | 'acknowledgement' | 'help' | 'vague';\n}\n\nconst TASK_HINTS =\n /\\b(fix|add|change|update|remove|delete|refactor|implement|create|build|debug|test|review|explain|inspect|search|find|compare|run|deploy|auth|login|landing|page|component|route|api|file|bug|error|issue|diff|cli|repo|project)\\b|[/.#]|\\.([cm]?[jt]sx?|py|go|rs|md|json|ya?ml|toml|css|html)\\b/i;\n\nconst GREETING_PATTERN =\n /^(hey+|hi+|hello+|yo+|sup|what'?s up|good (morning|afternoon|evening))(?:[!?.\\s]*)$/i;\n\nconst ACK_PATTERN =\n /^(thanks|thank you|thx|ok(?:ay)?|cool|nice|got it|sounds good)(?:[!?.\\s]*)$/i;\n\nconst HELP_PATTERN = /^help(?:[!?.\\s]*)$/i;\n\nexport function getConversationBypass(task: string): ConversationBypass | null {\n const normalized = task.trim();\n if (!normalized) return null;\n\n if (TASK_HINTS.test(normalized)) {\n return null;\n }\n\n if (GREETING_PATTERN.test(normalized)) {\n return {\n reason: 'greeting',\n response: 'Hey. Tell me what you want to inspect, explain, or change in this repo.',\n };\n }\n\n if (ACK_PATTERN.test(normalized)) {\n return {\n reason: 'acknowledgement',\n response: 'Ready when you are. Tell me what you want to inspect or change next.',\n };\n }\n\n if (HELP_PATTERN.test(normalized)) {\n return {\n reason: 'help',\n response: 'Tell me the bug, file, or feature you want me to work on, and I will inspect the repo.',\n };\n }\n\n const words = normalized.split(/\\s+/).filter(Boolean);\n if (words.length <= 2 && normalized.length <= 20) {\n return {\n reason: 'vague',\n response: 'Tell me what you want to inspect, explain, or change in this repo.',\n };\n }\n\n return null;\n}\n","export const SCOUT_PROMPT = `You are SCOUT, a task classifier and file finder.\n\nYour job:\n1. Classify the task complexity as one of: trivial, simple, moderate, complex\n2. List which project files are most relevant to this task\n\nRespond ONLY in this exact JSON format (no markdown, no explanation):\n{\n \"complexity\": \"simple\",\n \"reasoning\": \"one sentence why\",\n \"relevant_keywords\": [\"keyword1\", \"keyword2\"]\n}\n\nComplexity guide:\n- trivial: greeting, simple question, no code changes needed\n- simple: single-file change, small bug fix, add a comment\n- moderate: multi-file change, new feature, refactoring\n- complex: architectural change, multi-system coordination, new subsystem`;\n","/**\n * SCOUT agent — classifies task complexity and finds relevant files.\n *\n * Uses the cheapest model (Groq 8B) for classification,\n * then runs searchRelevantFiles() with the extracted keywords.\n */\nimport { complete } from '../providers/index.js';\nimport { calculateCost } from '../providers/router.js';\nimport { loadIndex, indexProject, searchRelevantFiles } from '../context/index.js';\nimport { extractHotspots } from '../context/search.js';\nimport { SCOUT_PROMPT } from './prompts/scout.js';\nimport { selectAgentModel } from './model-selector.js';\nimport type { AgentInput, ScoutOutput, TaskComplexity } from './types.js';\n\n// Fast heuristic classification — avoids an LLM call for obvious cases\nconst TRIVIAL_PATTERNS = /^(hey+|hi+|hello+|yo+|thanks|thank you|thx|ok(?:ay)?|yes|no)(?:[!?.\\s]*)$/i;\nconst COMPLEX_PATTERNS = /\\b(architect|redesign|migrate|rewrite|refactor.*entire|new system|multi.?file)\\b/i;\nconst MODERATE_PATTERNS = /\\b(fix all|all.*bugs|multiple.*fix|several.*change|each.*file|both.*files|security.*bugs)\\b/i;\n\nexport function classifyTaskHeuristically(task: string): TaskComplexity | undefined {\n if (TRIVIAL_PATTERNS.test(task) && task.length < 30) {\n return 'trivial';\n }\n if (COMPLEX_PATTERNS.test(task)) {\n return 'complex';\n }\n if (MODERATE_PATTERNS.test(task)) {\n return 'moderate';\n }\n if (task.length < 80) {\n return 'simple';\n }\n return undefined;\n}\n\nexport async function runScout(input: AgentInput): Promise<ScoutOutput> {\n const startTime = Date.now();\n const { task, cwd, signal } = input;\n\n // ── Fast-path: heuristic classification (no LLM call) ────────────────────\n let complexity: TaskComplexity = 'moderate';\n let usedLLM = false;\n\n const heuristicComplexity = classifyTaskHeuristically(task);\n if (heuristicComplexity) {\n complexity = heuristicComplexity;\n } else {\n // ── LLM classification for ambiguous tasks ───────────────────────────\n try {\n const model = selectAgentModel('scout', 'simple');\n const response = await complete({\n model,\n messages: [\n { role: 'system', content: SCOUT_PROMPT },\n { role: 'user', content: task },\n ],\n maxTokens: 200,\n temperature: 0,\n signal,\n });\n\n const parsed = parseScoutResponse(response.content);\n complexity = parsed.complexity;\n usedLLM = true;\n } catch {\n // LLM failed — fall back to heuristic\n complexity = 'moderate';\n }\n }\n\n // ── Search for relevant files ────────────────────────────────────────────\n let relevantFiles: ScoutOutput['relevantFiles'] = [];\n\n if (complexity !== 'trivial') {\n try {\n let index = await loadIndex(cwd);\n if (!index || index.totalFiles === 0) {\n index = await indexProject(cwd);\n }\n if (index && index.totalFiles > 0) {\n const maxFiles = complexity === 'complex' ? 12 : complexity === 'moderate' ? 8 : 5;\n relevantFiles = await searchRelevantFiles(cwd, task, index, { maxFiles });\n }\n } catch {\n // No files — builder will work without context\n }\n\n // Fallback grep\n if (relevantFiles.length === 0) {\n try {\n const { gatherRelevantFilesFallback } = await import('../pipeline/fallback-search.js');\n relevantFiles = await gatherRelevantFilesFallback(cwd, task);\n } catch { /* proceed without files */ }\n }\n }\n\n const hotspots = extractHotspots(relevantFiles, task);\n const duration = Date.now() - startTime;\n const fileSummary = relevantFiles.length > 0\n ? `${relevantFiles.length} files: ${relevantFiles.map(f => f.path).join(', ')}`\n : 'no files found';\n\n return {\n result: `complexity=${complexity}, ${fileSummary}`,\n complexity,\n relevantFiles,\n hotspots,\n fileSummary,\n model: usedLLM ? selectAgentModel('scout', 'simple') : 'groq-llama-8b',\n inputTokens: 0,\n outputTokens: 0,\n cost: 0,\n duration,\n };\n}\n\nexport function parseScoutResponse(text: string): { complexity: TaskComplexity } {\n try {\n // Try to extract JSON from the response\n const jsonMatch = text.match(/\\{[\\s\\S]*?\\}/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]);\n const valid: TaskComplexity[] = ['trivial', 'simple', 'moderate', 'complex'];\n if (valid.includes(parsed.complexity)) {\n return { complexity: parsed.complexity };\n }\n }\n } catch { /* parse failed */ }\n\n // Fallback: keyword detection in the raw text\n if (/trivial/i.test(text)) return { complexity: 'trivial' };\n if (/complex/i.test(text)) return { complexity: 'complex' };\n if (/moderate/i.test(text)) return { complexity: 'moderate' };\n return { complexity: 'simple' };\n}\n","export type BuilderTaskIntent = 'analysis' | 'change';\n\nconst CHANGE_HINTS =\n /\\b(fix|change|update|edit|modify|add|remove|delete|implement|build|create|refactor|rewrite|wire|connect|integrate|rename|move|patch|apply|make)\\b/i;\n\nconst ANALYSIS_HINTS =\n /\\b(review|scan|audit|inspect|analy[sz]e|check|look at|explore|understand|explain|compare|assess|evaluate|what can (?:we|i) improve|what should|what do you think|where is|find)\\b/i;\n\nexport function inferBuilderTaskIntent(task: string): BuilderTaskIntent {\n const normalized = task.trim();\n if (!normalized) return 'analysis';\n\n const hasChangeHint = CHANGE_HINTS.test(normalized);\n const hasAnalysisHint = ANALYSIS_HINTS.test(normalized) || normalized.includes('?');\n\n if (hasAnalysisHint && !hasChangeHint) {\n return 'analysis';\n }\n\n return 'change';\n}\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { indexProject, loadIndex, searchRelevantFiles } from '../context/index.js';\nimport { collectPathHintFiles, extractHotspots, type Hotspot, type SearchResult } from '../context/search.js';\nimport {\n formatSessionMemorySummary,\n getSessionMemoryCandidateFiles,\n getSessionMemoryScopeHints,\n isReferentialTask,\n loadSessionMemorySnapshot,\n type SessionMemorySnapshot,\n} from '../context/session-memory.js';\nimport { detectSpecialist, detectSpecialistFromTask } from './specialists/index.js';\nimport { getConversationBypass } from './conversation-gate.js';\nimport { classifyTaskHeuristically } from './scout.js';\nimport { inferBuilderTaskIntent } from './task-intent.js';\nimport type { AgentInput, Subtask, TaskComplexity } from './types.js';\n\nexport type AdaptiveGateMode =\n | 'chat'\n | 'question'\n | 'direct_builder'\n | 'direct_builder_with_memory'\n | 'architect_pipeline'\n | 'clarify'\n | 'spec_required';\n\nexport interface AdaptiveGateDecision {\n mode: AdaptiveGateMode;\n complexity: TaskComplexity;\n response?: string;\n searchResults: SearchResult[];\n hotspots: Hotspot[];\n scoutSummary: string;\n scoutModelLabel: string;\n directSubtask?: Subtask;\n}\n\ninterface LocalDiscoveryResult {\n searchResults: SearchResult[];\n explicitHintFiles: string[];\n usedMemory: boolean;\n}\n\nconst PLANNING_HEAVY_HINTS =\n /\\b(architect|plan|redesign|refactor|system|feature|flow|pipeline|orchestr|multi[- ]agent|integrat|migration|migrate|cross[- ]domain|end[- ]to[- ]end|from scratch)\\b/i;\n\nconst HIGH_TASTE_HINTS =\n /\\b(best|beaut[a-z]*|stunning|gorgeous|premium|world[- ]class|amazing|incredible|perfect|professional|sleek|modern|clean|minimal[a-z]*|elegant)\\b/i;\n\nconst GREENFIELD_SURFACE_HINTS =\n /\\b(frontend|website|site|landing page|homepage|page|game|app|ui|interface)\\b/i;\n\nconst GENERIC_UNDERSPECIFIED_CHANGE =\n /^(?:please\\s+)?(?:fix|change|update|edit|modify|make|build|create|improve|review|scan|check)(?:\\s+(?:it|that|this|thing|stuff|bug|issue|page|site|frontend))?(?:[!?.\\s]*)$/i;\n\nexport async function resolveAdaptiveGate(args: {\n input: AgentInput;\n}): Promise<AdaptiveGateDecision> {\n const { input } = args;\n const bypass = getConversationBypass(input.task);\n if (bypass) {\n return {\n mode: 'chat',\n complexity: 'trivial',\n response: bypass.response,\n searchResults: [],\n hotspots: [],\n scoutSummary: bypass.reason,\n scoutModelLabel: 'conversation',\n };\n }\n\n const sessionSnapshot = await loadSessionMemorySnapshot(input.cwd).catch(() => null);\n const referential = isReferentialTask(input.task);\n\n const discovery = await runLocalDiscovery({\n input,\n sessionSnapshot,\n });\n const searchResults = discovery.searchResults;\n const hotspots = extractHotspots(searchResults, input.task);\n const files = searchResults.map((file) => file.path);\n const domains = countDistinctDomains(files);\n const clearDirectoryCluster = hasClearDirectoryCluster(files);\n const scopeKnown = files.length > 0;\n const builderIntent = inferBuilderTaskIntent(input.task);\n const planningHeavy = PLANNING_HEAVY_HINTS.test(input.task);\n const highTaste = HIGH_TASTE_HINTS.test(input.task);\n const greenfieldSurface = GREENFIELD_SURFACE_HINTS.test(input.task);\n const complexity = estimateGateComplexity({\n task: input.task,\n scopeKnown,\n fileCount: files.length,\n domainCount: domains,\n planningHeavy,\n });\n const memoryConflict = hasMemoryConflict(sessionSnapshot, discovery.explicitHintFiles);\n const usableMemory = referential && hasUsableMemory(sessionSnapshot) && !memoryConflict;\n\n // Greenfield + no existing files + vague prompt → need more info before building\n // But NOT when the user wants to fix/update something existing — the builder can read the files\n const isFixIntent = /\\b(fix|update|change|edit|modify|patch|debug|repair)\\b/i.test(input.task);\n if (greenfieldSurface && !scopeKnown && !isFixIntent) {\n const hasConcreteSpec = input.task.length > 150\n || /\\b(section|hero|pricing|footer|feature|testimonial|navbar|sidebar)\\b/i.test(input.task)\n || /\\b(react|next|vue|svelte|vite|tailwind|html|css)\\b/i.test(input.task);\n\n if (!hasConcreteSpec) {\n return {\n mode: 'clarify',\n complexity,\n searchResults,\n hotspots,\n scoutSummary: 'need business context',\n scoutModelLabel: 'local gate',\n };\n }\n\n if (highTaste) {\n return {\n mode: 'spec_required',\n complexity,\n response: buildSpecRequiredResponse(input.task),\n searchResults,\n hotspots,\n scoutSummary: 'spec required',\n scoutModelLabel: 'local gate',\n };\n }\n }\n\n if (referential && usableMemory && scopeKnown) {\n return {\n mode: 'direct_builder_with_memory',\n complexity: complexity === 'trivial' ? 'simple' : complexity,\n searchResults,\n hotspots,\n scoutSummary: formatScoutSummary('direct builder + memory', searchResults),\n scoutModelLabel: 'memory + index',\n directSubtask: buildDirectBuilderSubtask({\n task: input.task,\n searchResults,\n sessionSnapshot,\n useMemory: true,\n }),\n };\n }\n\n if (referential && !usableMemory && !scopeKnown) {\n return {\n mode: 'clarify',\n complexity,\n searchResults,\n hotspots,\n scoutSummary: 'clarification required',\n scoutModelLabel: 'local gate',\n };\n }\n\n if (builderIntent === 'change' && scopeKnown && domains <= 1 && (files.length <= 3 || clearDirectoryCluster) && !planningHeavy) {\n return {\n mode: 'direct_builder',\n complexity: complexity === 'trivial' ? 'simple' : complexity,\n searchResults,\n hotspots,\n scoutSummary: formatScoutSummary('direct builder', searchResults),\n scoutModelLabel: 'index',\n directSubtask: buildDirectBuilderSubtask({\n task: input.task,\n searchResults,\n sessionSnapshot: memoryConflict ? null : sessionSnapshot,\n useMemory: false,\n }),\n };\n }\n\n // Questions / inspection requests → answer from found files, skip build pipeline\n // Must check BEFORE clarification — \"scan the project\" is a question, not a build task\n if (builderIntent === 'analysis') {\n return {\n mode: 'question',\n complexity: 'simple',\n searchResults,\n hotspots,\n scoutSummary: formatScoutSummary('question', searchResults),\n scoutModelLabel: 'local gate',\n };\n }\n\n if (!scopeKnown && shouldClarify(input.task)) {\n return {\n mode: 'clarify',\n complexity,\n searchResults,\n hotspots,\n scoutSummary: 'clarification required',\n scoutModelLabel: 'local gate',\n };\n }\n\n return {\n mode: 'architect_pipeline',\n complexity,\n searchResults,\n hotspots,\n scoutSummary: formatScoutSummary('architect pipeline', searchResults),\n scoutModelLabel: 'local gate',\n };\n}\n\nasync function runLocalDiscovery(args: {\n input: AgentInput;\n sessionSnapshot: SessionMemorySnapshot | null;\n}): Promise<LocalDiscoveryResult> {\n const { input, sessionSnapshot } = args;\n let index = await loadIndex(input.cwd);\n if (!index || index.totalFiles === 0) {\n index = await indexProject(input.cwd);\n }\n\n // Bulletproof: if the user typed a file path that exists on disk, always include it\n const literalPaths = extractLiteralFilePaths(input.task, input.cwd);\n\n // If the user gave explicit file paths, use ONLY those — don't dilute with other files\n if (literalPaths.length > 0) {\n const searchResults = await hydrateSearchResults(input.cwd, index, literalPaths, 'explicit path');\n return { searchResults, explicitHintFiles: literalPaths, usedMemory: false };\n }\n\n const explicitHintFiles = collectPathHintFiles(input.task, index, 6);\n const referential = isReferentialTask(input.task);\n const memoryConflict = hasMemoryConflict(sessionSnapshot, explicitHintFiles);\n const useMemory = referential && hasUsableMemory(sessionSnapshot) && !memoryConflict;\n const alwaysInclude = uniqueStrings([\n ...explicitHintFiles,\n ...(useMemory ? getSessionMemoryCandidateFiles(sessionSnapshot) : []),\n ]);\n const query = buildLocalSearchQuery(input.task, input.history, useMemory ? sessionSnapshot : null);\n\n let searchResults = await searchRelevantFiles(input.cwd, query, index, {\n maxFiles: 10,\n alwaysInclude,\n });\n\n if (searchResults.length === 0 && alwaysInclude.length > 0) {\n searchResults = await hydrateSearchResults(input.cwd, index, alwaysInclude, useMemory ? 'session memory' : 'path hint');\n }\n\n return {\n searchResults,\n explicitHintFiles,\n usedMemory: useMemory,\n };\n}\n\nfunction buildLocalSearchQuery(\n task: string,\n history: AgentInput['history'],\n sessionSnapshot: SessionMemorySnapshot | null,\n): string {\n const parts: string[] = [task];\n if (history && history.length > 0) {\n const historySummary = history\n .slice(-3)\n .map((message) => `${message.role}: ${message.content.trim()}`)\n .filter((line) => line.length > 0)\n .join('\\n');\n if (historySummary) {\n parts.push(`Recent conversation:\\n${historySummary}`);\n }\n }\n if (sessionSnapshot) {\n parts.push(`Session memory:\\n${formatSessionMemorySummary(sessionSnapshot)}`);\n }\n return parts.join('\\n\\n');\n}\n\nasync function hydrateSearchResults(\n cwd: string,\n index: Awaited<ReturnType<typeof loadIndex>>,\n filePaths: string[],\n reason: string,\n): Promise<SearchResult[]> {\n if (!index) return [];\n\n const results: SearchResult[] = [];\n for (const filePath of uniqueStrings(filePaths).slice(0, 10)) {\n try {\n const content = await readFile(join(cwd, filePath), 'utf8');\n results.push({\n path: filePath,\n content,\n language: index.files[filePath]?.language ?? 'text',\n score: 100,\n reason,\n });\n } catch {\n // Ignore missing files.\n }\n }\n return results;\n}\n\nfunction buildDirectBuilderSubtask(args: {\n task: string;\n searchResults: SearchResult[];\n sessionSnapshot: SessionMemorySnapshot | null;\n useMemory: boolean;\n}): Subtask {\n const files = args.searchResults.map((file) => file.path);\n const scopeDirectory = args.useMemory\n ? args.sessionSnapshot?.scopeDirectories.find(Boolean) ?? deriveScopeDirectory(files)\n : deriveScopeDirectory(files);\n const entryFiles = uniqueStrings([\n ...(args.useMemory ? args.sessionSnapshot?.entryFiles ?? [] : []),\n ...files,\n ]).slice(0, 3);\n const writeTargets = uniqueStrings([\n ...(args.useMemory ? args.sessionSnapshot?.writeTargets ?? [] : []),\n ...files,\n ]);\n const memoryHints = args.useMemory && args.sessionSnapshot\n ? getSessionMemoryScopeHints(args.sessionSnapshot)\n : [];\n const researchSummary = [\n files.length > 0 ? `Resolved local scope: ${files.join(', ')}.` : undefined,\n memoryHints.length > 0 ? `Prior scope: ${memoryHints.join(', ')}.` : undefined,\n args.useMemory ? 'Use session memory only as grounding for this continuation request.' : undefined,\n ].filter(Boolean).join(' ');\n\n const builderBrief = [\n scopeDirectory ? `Start in ${scopeDirectory}.` : 'Start in the resolved files.',\n entryFiles.length > 0 ? `Read ${entryFiles.join(', ')} first.` : undefined,\n args.useMemory ? 'Use the last successful scope to interpret the referential request before making changes.' : 'This is a local bounded change. Stay inside the resolved scope unless you hit a hard dependency.',\n ].filter(Boolean).join(' ');\n\n return {\n id: '0',\n description: describeScope(files, 'Work on the requested change'),\n relevantFiles: files,\n plan: args.useMemory\n ? `Resolve this continuation using the stored scope and current files: ${args.task}`\n : `Implement this local change directly in the resolved scope: ${args.task}`,\n specialist: (() => {\n const fromFiles = detectSpecialist(writeTargets.length > 0 ? writeTargets : files);\n return fromFiles !== 'general' ? fromFiles : detectSpecialistFromTask(args.task);\n })(),\n ...(scopeDirectory ? { scopeDirectory } : {}),\n ...(entryFiles.length > 0 ? { entryFiles } : {}),\n ...(researchSummary ? { researchSummary } : {}),\n ...(builderBrief ? { builderBrief } : {}),\n ...(writeTargets.length > 0 ? { writeTargets } : {}),\n };\n}\n\nfunction estimateGateComplexity(args: {\n task: string;\n scopeKnown: boolean;\n fileCount: number;\n domainCount: number;\n planningHeavy: boolean;\n}): TaskComplexity {\n let complexity = classifyTaskHeuristically(args.task) ?? 'moderate';\n\n if (args.domainCount > 1 || args.planningHeavy) {\n complexity = bumpComplexity(complexity, 'moderate');\n }\n if (!args.scopeKnown || args.fileCount > 6) {\n complexity = bumpComplexity(complexity, 'moderate');\n }\n if (args.fileCount > 10) {\n complexity = 'complex';\n }\n if (args.scopeKnown && args.domainCount <= 1 && args.fileCount <= 3 && !args.planningHeavy) {\n complexity = 'simple';\n }\n\n return complexity;\n}\n\nfunction bumpComplexity(current: TaskComplexity, next: TaskComplexity): TaskComplexity {\n const rank: Record<TaskComplexity, number> = {\n trivial: 0,\n simple: 1,\n moderate: 2,\n complex: 3,\n };\n return rank[next] > rank[current] ? next : current;\n}\n\nfunction countDistinctDomains(files: string[]): number {\n const domains = new Set<string>();\n for (const file of files) {\n domains.add(detectSpecialist([file]));\n }\n domains.delete('general');\n return domains.size === 0 ? 1 : domains.size;\n}\n\nfunction hasClearDirectoryCluster(files: string[]): boolean {\n if (files.length <= 1) return true;\n const root = deriveScopeDirectory(files);\n if (!root) return false;\n return files.every((file) => file === root || file.startsWith(`${root}/`));\n}\n\nfunction shouldClarify(task: string): boolean {\n const normalized = task.trim();\n if (!normalized) return true;\n if (GENERIC_UNDERSPECIFIED_CHANGE.test(normalized)) return true;\n return normalized.split(/\\s+/).length <= 4 && !/[/.#]/.test(normalized);\n}\n\nfunction buildSpecRequiredResponse(task: string): string {\n return [\n `This is too open-ended to build well from \"${task}\" in one pass.`,\n '',\n 'Give me a minimum spec first:',\n '1. Target surface or directory',\n '2. One or two visual references',\n '3. Must-have sections or behaviors',\n '4. Constraints like framework, colors, or existing design system',\n '5. What \"good\" should look like when it is done',\n ].join('\\n');\n}\n\nfunction formatScoutSummary(routeLabel: string, searchResults: SearchResult[]): string {\n const filesLabel = searchResults.length === 1 ? '1 file' : `${searchResults.length} files`;\n return `${routeLabel} · ${filesLabel}`;\n}\n\nfunction hasUsableMemory(snapshot: SessionMemorySnapshot | null): boolean {\n if (!snapshot) return false;\n return snapshot.entryFiles.length > 0 || snapshot.writeTargets.length > 0 || snapshot.scopeDirectories.length > 0;\n}\n\nfunction hasMemoryConflict(\n snapshot: SessionMemorySnapshot | null,\n explicitHintFiles: string[],\n): boolean {\n if (!snapshot || explicitHintFiles.length === 0) return false;\n const memoryPaths = new Set(getSessionMemoryCandidateFiles(snapshot));\n return !explicitHintFiles.some((file) => memoryPaths.has(file));\n}\n\nfunction deriveScopeDirectory(files: string[]): string | undefined {\n if (files.length === 0) return undefined;\n const first = files.find((file) => file.includes('/'));\n if (!first) return undefined;\n const parts = first.split('/');\n return parts.length > 1 ? parts.slice(0, -1).join('/') : undefined;\n}\n\nfunction describeScope(files: string[], fallback: string): string {\n if (files.length === 0) return fallback;\n if (files.length === 1) return `Work on ${files[0]}`;\n const preview = files.slice(0, 2).join(', ');\n const remaining = files.length - 2;\n return remaining > 0 ? `Work on ${preview}, +${remaining} more` : `Work on ${preview}`;\n}\n\n/**\n * Extract literal file paths from the task text by checking if they exist on disk.\n * No regex guessing — if a token looks like a path and the file exists, include it.\n */\nfunction extractLiteralFilePaths(task: string, cwd: string): string[] {\n const tokens = task.split(/\\s+/);\n const found: string[] = [];\n for (const token of tokens) {\n // Must contain a / or . to look like a path\n const cleaned = token.replace(/['\"`,;:!?()[\\]{}]+/g, '');\n if (!cleaned.includes('/') && !cleaned.includes('.')) continue;\n if (cleaned.length < 3 || cleaned.length > 200) continue;\n try {\n if (existsSync(join(cwd, cleaned))) {\n found.push(cleaned);\n }\n } catch {\n // ignore\n }\n }\n return found;\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n\n for (const value of values) {\n const normalized = value.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n result.push(normalized);\n }\n\n return result;\n}\n","/**\n * Clarifier — generates SMART clarifying questions based on what's missing.\n *\n * NEVER asks about things the project files already answer (framework, stack, structure).\n * ONLY asks about things the agent can't figure out by reading the code:\n * business context, audience, content, design preferences.\n */\nimport { complete } from '../providers/index.js';\nimport { selectAgentModel } from './model-selector.js';\n\nconst CLARIFIER_PROMPT = `You are a task clarifier. Read the user's prompt and ask ONLY about what's genuinely unclear.\n\nRules:\n- Ask about what YOU need to know to do THIS task well. No templates, no categories.\n- Never ask about technical choices the code already answers (framework, language, file structure — the agent reads files itself).\n- If the prompt is clear enough to act on, return [] (empty array — no questions needed).\n- Modifications to existing work (\"make it darker\", \"fix the form\") need ZERO questions — just do it.\n- Max 2 questions. Fewer is better. Zero is best if the prompt is clear.\n\nReturn ONLY a valid JSON array of question strings. Empty array [] if no questions needed.`;\n\nexport async function generateClarifyingQuestions(\n task: string,\n signal?: AbortSignal,\n projectContext?: string,\n): Promise<string[]> {\n const model = selectAgentModel('scout', 'simple');\n\n const userMessage = projectContext\n ? `Task: ${task}\\n\\nProject context:\\n${projectContext}`\n : `Task: ${task}`;\n\n try {\n const response = await complete({\n model,\n messages: [\n { role: 'system', content: CLARIFIER_PROMPT },\n { role: 'user', content: userMessage },\n ],\n maxTokens: 200,\n temperature: 0.3,\n signal,\n });\n\n const jsonMatch = response.content.match(/\\[[\\s\\S]*?\\]/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as unknown[];\n return parsed.map(String).filter(Boolean).slice(0, 2);\n }\n } catch {\n // On any failure, return no questions — never block the pipeline\n }\n return [];\n}\n","import { z } from 'zod';\n\nexport interface ToolContext {\n cwd: string;\n projectRoot: string;\n abortSignal?: AbortSignal;\n}\n\nexport interface ToolResult {\n success: boolean;\n output: string;\n tokensUsed?: number;\n error?: string;\n}\n\nexport interface Tool {\n name: string;\n description: string;\n parameters: z.ZodObject<z.ZodRawShape>;\n execute(params: z.infer<z.ZodObject<z.ZodRawShape>>, context: ToolContext): Promise<ToolResult>;\n}\n\n/** Shape expected by LLM provider APIs (OpenAI function-calling format). */\nexport interface ToolDefinition {\n name: string;\n description: string;\n input_schema: {\n type: 'object';\n properties: Record<string, { type: string; description?: string }>;\n required?: string[];\n };\n}\n\n/** Convert a Tool to the provider-facing ToolDefinition. */\nexport function toToolDefinition(tool: Tool): ToolDefinition {\n const jsonSchema = zodToJsonSchema(tool.parameters);\n return {\n name: tool.name,\n description: tool.description,\n input_schema: jsonSchema,\n };\n}\n\n/**\n * Minimal zod-to-JSON-Schema converter for flat object schemas.\n * Handles string, number, boolean, and optional fields.\n */\nfunction zodToJsonSchema(schema: z.ZodObject<z.ZodRawShape>): ToolDefinition['input_schema'] {\n const shape = schema.shape;\n const properties: Record<string, { type: string; description?: string }> = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(shape)) {\n const field = value as z.ZodTypeAny;\n const { type, description, isOptional } = extractZodMeta(field);\n properties[key] = { type, ...(description ? { description } : {}) };\n if (!isOptional) required.push(key);\n }\n\n return { type: 'object', properties, ...(required.length ? { required } : {}) };\n}\n\nfunction extractZodMeta(field: z.ZodTypeAny): { type: string; description?: string; isOptional: boolean } {\n let current = field;\n let isOptional = false;\n let description: string | undefined;\n\n // Unwrap optional/default/describe wrappers\n while (true) {\n if (current._def.description) {\n description = current._def.description;\n }\n if (current instanceof z.ZodOptional || current instanceof z.ZodDefault) {\n isOptional = true;\n current = current._def.innerType;\n continue;\n }\n if (current instanceof z.ZodNullable) {\n current = current._def.innerType;\n continue;\n }\n break;\n }\n\n let type = 'string';\n if (current instanceof z.ZodNumber) type = 'number';\n else if (current instanceof z.ZodBoolean) type = 'boolean';\n\n return { type, description, isOptional };\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { resolve, sep } from 'node:path';\nimport { z } from 'zod';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\nconst parameters = z.object({\n path: z.string().describe('Absolute or relative path to file'),\n start_line: z.number().optional().describe('First line to read (1-based)'),\n end_line: z.number().optional().describe('Last line to read (1-based, inclusive)'),\n});\n\nexport const fileReadTool: Tool = {\n name: 'read_file',\n description: 'Read the contents of a file. Optionally specify a line range.',\n parameters,\n\n async execute(params: z.infer<typeof parameters>, ctx: ToolContext): Promise<ToolResult> {\n try {\n const abs = resolveSafe(params.path, ctx.cwd);\n if (!existsSync(abs)) {\n return { success: false, output: '', error: `File not found: ${params.path}` };\n }\n\n let content = readFileSync(abs, 'utf8');\n\n // Apply line range\n if (params.start_line !== undefined || params.end_line !== undefined) {\n const lines = content.split('\\n');\n const start = Math.max(0, (params.start_line ?? 1) - 1);\n const end = params.end_line ?? lines.length;\n content = lines.slice(start, end)\n .map((line, i) => `${start + i + 1}\\t${line}`)\n .join('\\n');\n } else if (content.length > 64000) {\n content = content.slice(0, 64000) + '\\n... [truncated at 64KB]';\n }\n\n return { success: true, output: content };\n } catch (err) {\n return { success: false, output: '', error: errMsg(err) };\n }\n },\n};\n\nfunction resolveSafe(filePath: string, cwd: string): string {\n const abs = resolve(cwd, filePath);\n const cwdAbs = resolve(cwd);\n if (!abs.startsWith(cwdAbs + sep) && abs !== cwdAbs) {\n throw new Error(`Path outside working directory: ${filePath}`);\n }\n return abs;\n}\n\nfunction errMsg(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","import { writeFileSync, mkdirSync } from 'node:fs';\nimport { resolve, sep, dirname } from 'node:path';\nimport { z } from 'zod';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\nconst parameters = z.object({\n path: z.string().describe('Path to file'),\n content: z.string().describe('Content to write'),\n});\n\nexport const fileWriteTool: Tool = {\n name: 'write_file',\n description: 'Write content to a file (creates or overwrites). Creates parent directories if needed.',\n parameters,\n\n async execute(params: z.infer<typeof parameters>, ctx: ToolContext): Promise<ToolResult> {\n try {\n const abs = resolveSafe(params.path, ctx.cwd);\n mkdirSync(dirname(abs), { recursive: true });\n writeFileSync(abs, params.content, 'utf8');\n return { success: true, output: `Written ${params.content.length} chars to ${params.path}` };\n } catch (err) {\n return { success: false, output: '', error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n\nfunction resolveSafe(filePath: string, cwd: string): string {\n const abs = resolve(cwd, filePath);\n const cwdAbs = resolve(cwd);\n if (!abs.startsWith(cwdAbs + sep) && abs !== cwdAbs) {\n throw new Error(`Path outside working directory: ${filePath}`);\n }\n return abs;\n}\n","import { readFileSync, writeFileSync, existsSync } from 'node:fs';\nimport { resolve, sep } from 'node:path';\nimport { z } from 'zod';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\nconst parameters = z.object({\n path: z.string().describe('Path to file'),\n old_text: z.string().describe('Exact text to replace'),\n new_text: z.string().describe('Replacement text'),\n});\n\nexport const fileEditTool: Tool = {\n name: 'edit_file',\n description: 'Replace exact text in a file. Fails if old_text not found or matches multiple times.',\n parameters,\n\n async execute(params: z.infer<typeof parameters>, ctx: ToolContext): Promise<ToolResult> {\n try {\n const abs = resolveSafe(params.path, ctx.cwd);\n if (!existsSync(abs)) {\n return { success: false, output: '', error: `File not found: ${params.path}` };\n }\n\n const current = readFileSync(abs, 'utf8');\n const idx = current.indexOf(params.old_text);\n if (idx === -1) {\n return { success: false, output: '', error: `old_text not found in ${params.path}. Make sure it matches exactly.` };\n }\n\n // Check for ambiguous matches\n const secondIdx = current.indexOf(params.old_text, idx + 1);\n if (secondIdx !== -1) {\n return { success: false, output: '', error: `old_text matches multiple locations in ${params.path}. Provide more surrounding context to make it unique.` };\n }\n\n const updated = current.slice(0, idx) + params.new_text + current.slice(idx + params.old_text.length);\n writeFileSync(abs, updated, 'utf8');\n return { success: true, output: `Replaced text in ${params.path}` };\n } catch (err) {\n return { success: false, output: '', error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n\nfunction resolveSafe(filePath: string, cwd: string): string {\n const abs = resolve(cwd, filePath);\n const cwdAbs = resolve(cwd);\n if (!abs.startsWith(cwdAbs + sep) && abs !== cwdAbs) {\n throw new Error(`Path outside working directory: ${filePath}`);\n }\n return abs;\n}\n","import { spawnSync } from 'node:child_process';\nimport { z } from 'zod';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\nconst DANGEROUS_PATTERNS = [\n /\\brm\\s+-rf\\s+\\/(?!\\S)/, // rm -rf /\n /\\bsudo\\b/, // sudo anything\n /\\bmkfs\\b/, // format filesystem\n /\\bdd\\s+if=/, // raw disk write\n />\\s*\\/dev\\/sd/, // write to block device\n];\n\nconst MAX_OUTPUT = 64 * 1024; // 64KB\nconst DEFAULT_TIMEOUT = 30_000; // 30s\n\nconst parameters = z.object({\n command: z.string().describe('Shell command to run'),\n timeout: z.number().optional().describe('Timeout in ms (default 30000)'),\n});\n\nexport const bashTool: Tool = {\n name: 'bash',\n description: 'Execute a shell command. Returns stdout, stderr, exit code. 30s timeout, 64KB output cap.',\n parameters,\n\n async execute(params: z.infer<typeof parameters>, ctx: ToolContext): Promise<ToolResult> {\n const { command, timeout = DEFAULT_TIMEOUT } = params;\n\n // Block dangerous commands\n for (const pattern of DANGEROUS_PATTERNS) {\n if (pattern.test(command)) {\n return { success: false, output: '', error: `Blocked dangerous command: ${command}` };\n }\n }\n\n const result = spawnSync('sh', ['-c', command], {\n cwd: ctx.cwd,\n encoding: 'utf8',\n timeout,\n maxBuffer: MAX_OUTPUT,\n });\n\n if (result.error) {\n const msg = result.error.message ?? 'Unknown error';\n if (msg.includes('ETIMEDOUT') || msg.includes('timeout')) {\n return { success: false, output: '', error: `Command timed out after ${timeout}ms` };\n }\n return { success: false, output: '', error: msg };\n }\n\n const stdout = (result.stdout ?? '').slice(0, MAX_OUTPUT);\n const stderr = (result.stderr ?? '').slice(0, 4000);\n const exitCode = result.status ?? 0;\n\n let output = '';\n if (stdout) output += stdout;\n if (stderr) output += (output ? '\\n[stderr] ' : '[stderr] ') + stderr;\n if (!output) output = `[exit ${exitCode}]`;\n else if (exitCode !== 0) output += `\\n[exit ${exitCode}]`;\n\n return { success: exitCode === 0, output };\n },\n};\n","import { execFileSync } from 'node:child_process';\nimport { resolve, sep } from 'node:path';\nimport { z } from 'zod';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\nconst MAX_MATCHES = 100;\n\nconst parameters = z.object({\n pattern: z.string().describe('Regex pattern to search for'),\n dir: z.string().optional().describe('Directory to search in (default: cwd)'),\n glob: z.string().optional().describe('File glob filter (e.g. \"*.ts\")'),\n});\n\nexport const grepTool: Tool = {\n name: 'grep_files',\n description: 'Search file contents for a regex pattern. Returns matching lines with file:line format. Respects .gitignore.',\n parameters,\n\n async execute(params: z.infer<typeof parameters>, ctx: ToolContext): Promise<ToolResult> {\n try {\n const cwdAbs = resolve(ctx.cwd);\n const searchDir = resolve(ctx.cwd, params.dir ?? '.');\n if (!searchDir.startsWith(cwdAbs + sep) && searchDir !== cwdAbs) {\n return { success: false, output: '', error: `Path outside working directory: ${params.dir}` };\n }\n const args = ['-rn', '-E', params.pattern];\n\n // Respect common ignore patterns\n args.push('--exclude-dir=node_modules', '--exclude-dir=.git', '--exclude-dir=dist', '--exclude-dir=build');\n\n if (params.glob) args.push(`--include=${params.glob}`);\n args.push(searchDir);\n\n const output = execFileSync('grep', args, {\n encoding: 'utf8',\n timeout: 15_000,\n });\n\n const lines = output.split('\\n').filter(Boolean).slice(0, MAX_MATCHES);\n const result = lines.join('\\n');\n return {\n success: true,\n output: result || 'No matches found',\n };\n } catch (err: unknown) {\n // grep exits 1 when no matches — not an error\n const spawnErr = err as { status?: number };\n if (spawnErr.status === 1) {\n return { success: true, output: 'No matches found' };\n }\n return { success: false, output: '', error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n","import { glob } from 'glob';\nimport { resolve } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport ignore from 'ignore';\nimport { z } from 'zod';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\nconst MAX_RESULTS = 200;\n\nconst parameters = z.object({\n pattern: z.string().describe('Glob pattern (e.g. \"**/*.ts\", \"src/**/*.tsx\")'),\n dir: z.string().optional().describe('Directory to search in (default: cwd)'),\n});\n\nexport const globTool: Tool = {\n name: 'find_files',\n description: 'Find files matching a glob pattern. Respects .gitignore.',\n parameters,\n\n async execute(params: z.infer<typeof parameters>, ctx: ToolContext): Promise<ToolResult> {\n try {\n const searchDir = resolve(ctx.cwd, params.dir ?? '.');\n const ig = await loadGitignore(searchDir);\n\n const matches = await glob(params.pattern, {\n cwd: searchDir,\n nodir: true,\n absolute: false,\n });\n\n const filtered = matches\n .filter(f => !ig.ignores(f))\n .slice(0, MAX_RESULTS);\n\n if (filtered.length === 0) {\n return { success: true, output: `No files found matching: ${params.pattern}` };\n }\n\n return { success: true, output: filtered.join('\\n') };\n } catch (err) {\n return { success: false, output: '', error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n\nasync function loadGitignore(dir: string) {\n const ig = ignore();\n ig.add(['node_modules', '.git', 'dist', 'build', '.next', 'coverage']);\n try {\n const content = await readFile(join(dir, '.gitignore'), 'utf-8');\n ig.add(content.split('\\n').filter(l => l.trim() && !l.startsWith('#')));\n } catch { /* no .gitignore */ }\n return ig;\n}\n","import { readdirSync, statSync } from 'node:fs';\nimport { resolve, sep, join, relative } from 'node:path';\nimport { z } from 'zod';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\nconst IGNORE_DIRS = new Set(['node_modules', '.git', 'dist', 'build', '.next', 'coverage', '__pycache__', '.venv']);\nconst MAX_ENTRIES = 200;\n\nconst parameters = z.object({\n path: z.string().optional().describe('Directory path (default: cwd)'),\n depth: z.number().optional().describe('Max depth to traverse (default: 3)'),\n});\n\nexport const listDirTool: Tool = {\n name: 'list_dir',\n description: 'List directory structure with files and subdirectories. Respects common ignore patterns.',\n parameters,\n\n async execute(params: z.infer<typeof parameters>, ctx: ToolContext): Promise<ToolResult> {\n try {\n const cwdAbs = resolve(ctx.cwd);\n const targetDir = resolve(ctx.cwd, params.path ?? '.');\n if (!targetDir.startsWith(cwdAbs + sep) && targetDir !== cwdAbs) {\n return { success: false, output: '', error: `Path outside working directory: ${params.path}` };\n }\n const maxDepth = params.depth ?? 3;\n const entries: string[] = [];\n\n walk(targetDir, targetDir, 0, maxDepth, entries);\n\n if (entries.length === 0) {\n return { success: true, output: '(empty directory)' };\n }\n\n return { success: true, output: entries.join('\\n') };\n } catch (err) {\n return { success: false, output: '', error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n\nfunction walk(dir: string, root: string, depth: number, maxDepth: number, entries: string[]): void {\n if (depth > maxDepth || entries.length >= MAX_ENTRIES) return;\n\n let items: string[];\n try {\n items = readdirSync(dir);\n } catch {\n return;\n }\n\n // Sort: directories first, then files\n const sorted = items\n .filter(name => !name.startsWith('.') || name === '.env.example')\n .sort((a, b) => {\n const aIsDir = isDir(join(dir, a));\n const bIsDir = isDir(join(dir, b));\n if (aIsDir && !bIsDir) return -1;\n if (!aIsDir && bIsDir) return 1;\n return a.localeCompare(b);\n });\n\n for (const name of sorted) {\n if (entries.length >= MAX_ENTRIES) break;\n if (IGNORE_DIRS.has(name)) continue;\n\n const fullPath = join(dir, name);\n const relPath = relative(root, fullPath);\n const indent = ' '.repeat(depth);\n\n if (isDir(fullPath)) {\n entries.push(`${indent}${name}/`);\n walk(fullPath, root, depth + 1, maxDepth, entries);\n } else {\n entries.push(`${indent}${name}`);\n }\n }\n}\n\nfunction isDir(path: string): boolean {\n try {\n return statSync(path).isDirectory();\n } catch {\n return false;\n }\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { resolve, sep } from 'node:path';\nimport { createTwoFilesPatch } from 'diff';\nimport { z } from 'zod';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\nconst MAX_PREVIEW = 64 * 1024;\n\nconst parameters = z.object({\n path: z.string().min(1).describe('Path to file'),\n search: z.string().min(1).describe('Text or regex pattern to search for'),\n replace: z.string().describe('Replacement text'),\n regex: z.boolean().optional().describe('Treat search as a regex pattern'),\n all: z.boolean().optional().describe('Replace all matches instead of just the first one'),\n});\n\nexport interface SearchReplacePlan {\n updated: string;\n replacementCount: number;\n}\n\nexport const searchReplaceTool: Tool = {\n name: 'search_replace',\n description: 'Search and replace text in a file. Supports regex and multi-replace previews with 3 lines of context.',\n parameters,\n\n async execute(params: z.infer<typeof parameters>, ctx: ToolContext): Promise<ToolResult> {\n try {\n const abs = resolveSafe(params.path, ctx.cwd);\n if (!existsSync(abs)) {\n return { success: false, output: '', error: `File not found: ${params.path}` };\n }\n\n const current = readFileSync(abs, 'utf8');\n const plan = buildSearchReplacePlan(current, params);\n\n if (plan.updated !== current) {\n writeFileSync(abs, plan.updated, 'utf8');\n }\n\n const preview = buildSearchReplacePreview(params.path, current, plan.updated);\n const summary = `Replaced ${plan.replacementCount} occurrence(s) in ${params.path}.`;\n const output = preview\n ? `${summary}\\n\\n${preview}`\n : `${summary}\\n\\nMatched content, but the replacement produced no file changes.`;\n\n return { success: true, output };\n } catch (err) {\n return { success: false, output: '', error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n\nexport function buildSearchReplacePlan(\n current: string,\n params: z.infer<typeof parameters>,\n): SearchReplacePlan {\n if (params.regex) {\n return buildRegexPlan(current, params.search, params.replace, params.all ?? false);\n }\n\n return buildLiteralPlan(current, params.search, params.replace, params.all ?? false);\n}\n\nexport function buildSearchReplacePreview(path: string, before: string, after: string): string {\n if (before === after) {\n return '';\n }\n\n const patch = createTwoFilesPatch(path, path, before, after, 'before', 'after', { context: 3 });\n if (patch.length <= MAX_PREVIEW) {\n return patch;\n }\n\n return patch.slice(0, MAX_PREVIEW) + '\\n... [truncated at 64KB]';\n}\n\nfunction buildLiteralPlan(current: string, search: string, replace: string, replaceAll: boolean): SearchReplacePlan {\n let replacementCount = 0;\n\n if (replaceAll) {\n let index = current.indexOf(search);\n while (index !== -1) {\n replacementCount++;\n index = current.indexOf(search, index + search.length);\n }\n } else if (current.includes(search)) {\n replacementCount = 1;\n }\n\n if (replacementCount === 0) {\n throw new Error('No matches found.');\n }\n\n if (!replaceAll) {\n const index = current.indexOf(search);\n return {\n updated: current.slice(0, index) + replace + current.slice(index + search.length),\n replacementCount,\n };\n }\n\n return {\n updated: current.split(search).join(replace),\n replacementCount,\n };\n}\n\nfunction buildRegexPlan(current: string, search: string, replace: string, replaceAll: boolean): SearchReplacePlan {\n const flags = replaceAll ? 'g' : '';\n const regex = compileRegex(search, flags);\n const counter = compileRegex(search, replaceAll ? 'g' : '');\n\n let replacementCount = 0;\n let match: RegExpExecArray | null;\n while ((match = counter.exec(current)) !== null) {\n if (match[0].length === 0) {\n throw new Error('Regex search must not match empty strings.');\n }\n replacementCount++;\n if (!replaceAll) {\n break;\n }\n if (counter.lastIndex === match.index) {\n counter.lastIndex++;\n }\n }\n\n if (replacementCount === 0) {\n throw new Error('No matches found.');\n }\n\n return {\n updated: current.replace(regex, replace),\n replacementCount,\n };\n}\n\nfunction compileRegex(pattern: string, flags: string): RegExp {\n try {\n return new RegExp(pattern, flags);\n } catch (err) {\n throw new Error(`Invalid regex pattern: ${err instanceof Error ? err.message : String(err)}`);\n }\n}\n\nfunction resolveSafe(filePath: string, cwd: string): string {\n const abs = resolve(cwd, filePath);\n const cwdAbs = resolve(cwd);\n if (!abs.startsWith(cwdAbs + sep) && abs !== cwdAbs) {\n throw new Error(`Path outside working directory: ${filePath}`);\n }\n return abs;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { spawnSync } from 'node:child_process';\nimport { join } from 'node:path';\nimport { z } from 'zod';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\nconst DEFAULT_TIMEOUT = 60_000;\nconst MAX_OUTPUT = 128 * 1024;\nconst MAX_LINES = 50;\nconst DANGEROUS_PATTERNS = [\n /\\brm\\s+-rf\\s+\\/(?!\\S)/,\n /\\bsudo\\b/,\n /\\bmkfs\\b/,\n /\\bdd\\s+if=/,\n />\\s*\\/dev\\/sd/,\n];\n\nconst parameters = z.object({\n command: z.string().optional().describe('Optional test command override'),\n timeout: z.number().optional().describe('Timeout in ms (default 60000)'),\n});\n\nexport const runTestsTool: Tool = {\n name: 'run_tests',\n description: 'Run the project test suite or a specific test command. Returns pass/fail counts and the last 50 lines of output.',\n parameters,\n\n async execute(params: z.infer<typeof parameters>, ctx: ToolContext): Promise<ToolResult> {\n try {\n const command = params.command?.trim() || detectTestCommand(ctx.cwd);\n const timeout = params.timeout ?? DEFAULT_TIMEOUT;\n\n for (const pattern of DANGEROUS_PATTERNS) {\n if (pattern.test(command)) {\n return { success: false, output: '', error: `Blocked dangerous command: ${command}` };\n }\n }\n\n const result = spawnSync('sh', ['-c', command], {\n cwd: ctx.cwd,\n encoding: 'utf8',\n timeout,\n maxBuffer: MAX_OUTPUT,\n });\n\n if (result.error) {\n const msg = result.error.message ?? 'Unknown error';\n if (msg.includes('ETIMEDOUT') || msg.includes('timeout')) {\n return { success: false, output: '', error: `Test command timed out after ${timeout}ms` };\n }\n return { success: false, output: '', error: msg };\n }\n\n const combinedOutput = [result.stdout ?? '', result.stderr ?? '']\n .filter(Boolean)\n .join('\\n')\n .trim();\n const summary = summarizeTestOutput(combinedOutput);\n const tail = lastLines(combinedOutput, MAX_LINES);\n const passed = summary.passed ?? 0;\n const failed = summary.failed ?? 0;\n const status = (result.status ?? 0) === 0 ? 'PASS' : 'FAIL';\n\n return {\n success: (result.status ?? 0) === 0,\n output: [\n `Status: ${status}`,\n `Command: ${command}`,\n `Passed: ${passed}`,\n `Failed: ${failed}`,\n '',\n 'Last 50 lines:',\n tail || '(no output)',\n ].join('\\n'),\n };\n } catch (err) {\n return { success: false, output: '', error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n\nfunction detectTestCommand(cwd: string): string {\n const packageJsonPath = join(cwd, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as {\n scripts?: Record<string, string>;\n };\n if (packageJson.scripts?.test) {\n return 'npm test';\n }\n } catch {\n // Ignore invalid package.json and continue probing other runners.\n }\n }\n\n if (existsSync(join(cwd, 'pytest.ini')) || existsSync(join(cwd, 'pyproject.toml'))) {\n return 'pytest';\n }\n\n if (existsSync(join(cwd, 'go.mod'))) {\n return 'go test ./...';\n }\n\n if (existsSync(join(cwd, 'Cargo.toml'))) {\n return 'cargo test';\n }\n\n throw new Error('Could not detect a test runner. Pass an explicit command.');\n}\n\nfunction summarizeTestOutput(output: string): { passed?: number; failed?: number } {\n const lines = output.split(/\\r?\\n/);\n\n for (const line of [...lines].reverse()) {\n const testsLine = line.match(/Tests?:\\s*(.*)/i);\n if (testsLine) {\n return {\n passed: pickCount(testsLine[1], /(\\d+)\\s+passed/i),\n failed: pickCount(testsLine[1], /(\\d+)\\s+failed/i),\n };\n }\n\n const cargoLine = line.match(/test result:\\s+\\w+\\.\\s+(\\d+)\\s+passed;\\s+(\\d+)\\s+failed;/i);\n if (cargoLine) {\n return {\n passed: Number(cargoLine[1]),\n failed: Number(cargoLine[2]),\n };\n }\n\n const pytestLine = line.match(/=+\\s*(.*?)\\s+in\\s+[0-9.]+s\\s*=+/i);\n if (pytestLine) {\n return {\n passed: pickCount(pytestLine[1], /(\\d+)\\s+passed/i),\n failed: pickCount(pytestLine[1], /(\\d+)\\s+failed/i),\n };\n }\n }\n\n const goPassed = lines.filter((line) => line.startsWith('--- PASS:')).length;\n const goFailed = lines.filter((line) => line.startsWith('--- FAIL:')).length;\n if (goPassed > 0 || goFailed > 0) {\n return { passed: goPassed, failed: goFailed };\n }\n\n return {\n passed: lastNumericMatch(output, /(\\d+)\\s+passed/gi),\n failed: lastNumericMatch(output, /(\\d+)\\s+failed/gi),\n };\n}\n\nfunction lastNumericMatch(text: string, pattern: RegExp): number | undefined {\n let match: RegExpExecArray | null;\n let value: number | undefined;\n\n while ((match = pattern.exec(text)) !== null) {\n value = Number(match[1]);\n }\n\n return value;\n}\n\nfunction pickCount(text: string, pattern: RegExp): number | undefined {\n const match = text.match(pattern);\n return match ? Number(match[1]) : undefined;\n}\n\nfunction lastLines(text: string, count: number): string {\n return text\n .split(/\\r?\\n/)\n .slice(-count)\n .join('\\n')\n .trim();\n}\n","import { spawnSync } from 'node:child_process';\nimport { resolve, relative, sep } from 'node:path';\nimport { z } from 'zod';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\nconst MAX_OUTPUT = 64 * 1024;\nconst MAX_BUFFER = 10 * 1024 * 1024;\n\nconst parameters = z.object({\n staged: z.boolean().optional().describe('Show staged changes instead of unstaged changes'),\n file: z.string().optional().describe('Optional file path filter'),\n});\n\nexport const gitDiffTool: Tool = {\n name: 'git_diff',\n description: 'Show git status summary plus the current diff. Supports staged diffs and per-file filtering.',\n parameters,\n\n async execute(params: z.infer<typeof parameters>, ctx: ToolContext): Promise<ToolResult> {\n try {\n const output = buildGitDiffOutput(params, ctx.cwd);\n return { success: true, output };\n } catch (err) {\n return { success: false, output: '', error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n\nexport function buildGitDiffOutput(\n params: z.infer<typeof parameters>,\n cwd: string,\n): string {\n const fileArg = params.file ? normalizeGitPath(params.file, cwd) : undefined;\n const status = runGit(['status', '--short', ...(fileArg ? ['--', fileArg] : [])], cwd);\n const diffArgs = ['diff', ...(params.staged ? ['--staged'] : []), ...(fileArg ? ['--', fileArg] : [])];\n const diff = runGit(diffArgs, cwd);\n\n const combined = [\n 'Status:',\n status.trim() || '(clean)',\n '',\n 'Diff:',\n diff.trim() || '(no diff)',\n ].join('\\n');\n\n if (combined.length <= MAX_OUTPUT) {\n return combined;\n }\n\n return combined.slice(0, MAX_OUTPUT) + '\\n... [truncated at 64KB]';\n}\n\nfunction runGit(args: string[], cwd: string): string {\n const result = spawnSync('git', args, {\n cwd,\n encoding: 'utf8',\n timeout: 15_000,\n maxBuffer: MAX_BUFFER,\n });\n\n if (result.error) {\n throw new Error(result.error.message ?? 'Unknown git error');\n }\n\n if ((result.status ?? 0) !== 0) {\n const output = `${result.stdout ?? ''}\\n${result.stderr ?? ''}`.trim();\n throw new Error(output || `git ${args.join(' ')} failed`);\n }\n\n return `${result.stdout ?? ''}${result.stderr ?? ''}`.trim();\n}\n\nfunction normalizeGitPath(filePath: string, cwd: string): string {\n const abs = resolve(cwd, filePath);\n const cwdAbs = resolve(cwd);\n if (!abs.startsWith(cwdAbs + sep) && abs !== cwdAbs) {\n throw new Error(`Path outside working directory: ${filePath}`);\n }\n\n const rel = relative(cwdAbs, abs);\n return rel === '' ? '.' : rel;\n}\n","import { z } from 'zod';\nimport type { Tool, ToolContext, ToolResult } from './types.js';\n\nconst DEFAULT_MAX_LENGTH = 16_000;\nconst FETCH_TIMEOUT = 10_000;\n\nconst parameters = z.object({\n url: z.string().url().describe('HTTP or HTTPS URL to fetch'),\n maxLength: z.number().optional().describe('Maximum number of characters to return (default 16000)'),\n});\n\nexport const webFetchTool: Tool = {\n name: 'web_fetch',\n description: 'Fetch a URL and return extracted text content. Blocks localhost and non-HTTP URLs.',\n parameters,\n\n async execute(params: z.infer<typeof parameters>, _ctx: ToolContext): Promise<ToolResult> {\n try {\n const url = validateFetchUrl(params.url);\n const maxLength = params.maxLength ?? DEFAULT_MAX_LENGTH;\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), FETCH_TIMEOUT);\n\n try {\n const response = await fetch(url, {\n method: 'GET',\n signal: controller.signal,\n headers: {\n 'user-agent': 'mint-cli/0.1.0',\n accept: 'text/plain,text/html,application/json;q=0.9,*/*;q=0.8',\n },\n });\n\n if (!response.ok) {\n return { success: false, output: '', error: `HTTP ${response.status} ${response.statusText}` };\n }\n\n const contentType = response.headers.get('content-type') ?? '';\n const body = await response.text();\n const text = extractText(body, contentType);\n const truncated = truncateText(text, maxLength);\n return { success: true, output: truncated };\n } finally {\n clearTimeout(timeout);\n }\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n return { success: false, output: '', error: 'Fetch timed out after 10000ms' };\n }\n return { success: false, output: '', error: err instanceof Error ? err.message : String(err) };\n }\n },\n};\n\nfunction validateFetchUrl(rawUrl: string): string {\n const parsed = new URL(rawUrl);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new Error('Only HTTP and HTTPS URLs are allowed.');\n }\n\n const hostname = parsed.hostname.toLowerCase();\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname === '0.0.0.0' || hostname === '::1' || hostname === '[::1]') {\n throw new Error('Localhost URLs are blocked.');\n }\n\n return parsed.toString();\n}\n\nfunction extractText(body: string, contentType: string): string {\n if (!/html/i.test(contentType) && !/<html[\\s>]/i.test(body)) {\n return body.trim();\n }\n\n const withoutScripts = body\n .replace(/<script[\\s\\S]*?<\\/script>/gi, ' ')\n .replace(/<style[\\s\\S]*?<\\/style>/gi, ' ')\n .replace(/<noscript[\\s\\S]*?<\\/noscript>/gi, ' ');\n\n const withBreaks = withoutScripts\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<\\/(p|div|section|article|main|header|footer|aside|li|tr|h[1-6])>/gi, '\\n');\n\n const withoutTags = withBreaks.replace(/<[^>]+>/g, ' ');\n const decoded = decodeHtmlEntities(withoutTags);\n\n return decoded\n .replace(/\\r/g, '')\n .replace(/[ \\t]+\\n/g, '\\n')\n .replace(/\\n{3,}/g, '\\n\\n')\n .replace(/[ \\t]{2,}/g, ' ')\n .trim();\n}\n\nfunction truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) {\n return text;\n }\n\n return text.slice(0, maxLength) + '\\n... [truncated]';\n}\n\nfunction decodeHtmlEntities(text: string): string {\n return text\n .replace(/&nbsp;/gi, ' ')\n .replace(/&amp;/gi, '&')\n .replace(/&lt;/gi, '<')\n .replace(/&gt;/gi, '>')\n .replace(/&quot;/gi, '\"')\n .replace(/&#39;/gi, \"'\")\n .replace(/&#x([0-9a-f]+);/gi, (_, hex: string) => String.fromCodePoint(parseInt(hex, 16)))\n .replace(/&#(\\d+);/g, (_, num: string) => String.fromCodePoint(parseInt(num, 10)));\n}\n","import type { Tool, ToolContext, ToolResult, ToolDefinition } from './types.js';\nimport { toToolDefinition } from './types.js';\nimport { fileReadTool } from './file-read.js';\nimport { fileWriteTool } from './file-write.js';\nimport { fileEditTool } from './file-edit.js';\nimport { bashTool } from './bash.js';\nimport { grepTool } from './grep.js';\nimport { globTool } from './glob.js';\nimport { listDirTool } from './list-dir.js';\nimport { searchReplaceTool } from './search-replace.js';\nimport { runTestsTool } from './run-tests.js';\nimport { gitDiffTool } from './git-diff.js';\nimport { webFetchTool } from './web-fetch.js';\n\nexport type { Tool, ToolContext, ToolResult, ToolDefinition };\nexport { toToolDefinition };\nexport type ToolRole = 'scout' | 'architect' | 'builder' | 'reviewer' | 'general';\n\n// ─── Tool Registry ───────────────────────────────────────────────────────────\n\nconst registry = new Map<string, Tool>();\n\nfunction register(tool: Tool): void {\n registry.set(tool.name, tool);\n}\n\n// Register all built-in tools\nregister(fileReadTool);\nregister(fileWriteTool);\nregister(fileEditTool);\nregister(bashTool);\nregister(grepTool);\nregister(globTool);\nregister(listDirTool);\nregister(searchReplaceTool);\nregister(runTestsTool);\nregister(gitDiffTool);\nregister(webFetchTool);\n\n/** Get a tool by name. */\nexport function getTool(name: string): Tool | undefined {\n return registry.get(name);\n}\n\n/** Get all registered tools. */\nexport function getAllTools(): Tool[] {\n return Array.from(registry.values());\n}\n\n/** Get tool definitions in LLM provider format. */\nexport function getToolDefinitions(toolNames?: string[]): ToolDefinition[] {\n const tools = toolNames\n ? toolNames.map((name) => registry.get(name)).filter((tool): tool is Tool => Boolean(tool))\n : getAllTools();\n return tools.map(toToolDefinition);\n}\n\n/**\n * Execute a tool by name.\n * Returns a ToolResult — callers don't need to know which tool ran.\n */\nexport async function executeTool(\n toolName: string,\n input: Record<string, unknown>,\n ctx: ToolContext,\n): Promise<ToolResult> {\n const tool = registry.get(toolName);\n if (!tool) {\n return { success: false, output: '', error: `Unknown tool: ${toolName}` };\n }\n\n // Validate input with zod\n const parsed = tool.parameters.safeParse(input);\n if (!parsed.success) {\n return {\n success: false,\n output: '',\n error: `Invalid input for ${toolName}: ${parsed.error.issues.map(i => i.message).join(', ')}`,\n };\n }\n\n return tool.execute(parsed.data, ctx);\n}\n\n/** Classify a tool as destructive (writes to filesystem or runs commands). */\nexport function isDestructiveTool(toolName: string): boolean {\n return ['write_file', 'edit_file', 'search_replace', 'bash'].includes(toolName);\n}\n\nconst READ_ONLY_TOOLS = new Set([\n 'read_file',\n 'find_files',\n 'grep_files',\n 'list_dir',\n 'git_diff',\n 'web_fetch',\n]);\n\nconst CONCURRENCY_SAFE_TOOLS = new Set([\n 'read_file',\n 'find_files',\n 'grep_files',\n 'list_dir',\n 'git_diff',\n 'web_fetch',\n]);\n\nconst ROLE_TOOL_ALLOWLIST: Record<ToolRole, string[]> = {\n scout: ['grep_files', 'find_files', 'list_dir', 'read_file'],\n architect: ['read_file', 'grep_files', 'web_fetch'],\n builder: [\n 'read_file',\n 'grep_files',\n 'find_files',\n 'list_dir',\n 'write_file',\n 'edit_file',\n 'search_replace',\n 'git_diff',\n 'run_tests',\n 'web_fetch',\n 'bash',\n ],\n reviewer: ['read_file', 'grep_files', 'find_files', 'list_dir', 'run_tests', 'git_diff', 'web_fetch', 'bash'],\n general: getAllTools().map((tool) => tool.name),\n};\n\nconst RISKY_BASH_PATTERN = /\\b(rm|mv|del|format|truncate|drop|delete|unlink)\\b/i;\n\nexport function getAllowedToolNamesForRole(role: ToolRole): string[] {\n return [...ROLE_TOOL_ALLOWLIST[role]];\n}\n\nexport function isReadOnlyTool(toolName: string): boolean {\n return READ_ONLY_TOOLS.has(toolName);\n}\n\nexport function isConcurrencySafeTool(toolName: string): boolean {\n return CONCURRENCY_SAFE_TOOLS.has(toolName);\n}\n\nexport function toolRequiresApproval(\n toolName: string,\n input: Record<string, unknown>,\n): boolean {\n if (toolName === 'bash') {\n const command = typeof input.command === 'string' ? input.command : '';\n return RISKY_BASH_PATTERN.test(command);\n }\n\n return ['write_file', 'edit_file', 'search_replace'].includes(toolName);\n}\n","/**\n * Agent tool layer — wraps src/tools/ registry with agent-specific concerns:\n * approval modes, diff preview, plan-mode blocking.\n *\n * The actual tool implementations live in src/tools/*.ts.\n */\nimport {\n getToolDefinitions,\n executeTool as executeToolRaw,\n isDestructiveTool,\n toolRequiresApproval,\n type ToolContext,\n type ToolDefinition,\n} from '../tools/index.js';\n\n// Re-export the tool definitions for the agent loop / providers\nexport const TOOLS: ToolDefinition[] = getToolDefinitions();\nexport function getAgentToolDefinitions(toolNames?: string[]): ToolDefinition[] {\n return getToolDefinitions(toolNames);\n}\n\n// ─── Agent-level types ──────────────────────────────────────────────────────\n\nexport interface ToolResult {\n toolCallId: string;\n toolName: string;\n content: string;\n isError: boolean;\n}\n\nexport type AgentMode = 'yolo' | 'plan' | 'diff' | 'auto';\n\nexport interface AgentOptions {\n cwd: string;\n model?: string;\n signal?: AbortSignal;\n verbose?: boolean;\n mode?: AgentMode;\n toolNames?: string[];\n onApprovalNeeded?: (toolName: string, toolInput: Record<string, unknown>) => Promise<boolean>;\n onDiffProposed?: (path: string, diff: string) => Promise<boolean>;\n onIterationApprovalNeeded?: (\n iteration: number,\n toolCalls: Array<{ name: string; input: Record<string, unknown> }>,\n ) => Promise<boolean>;\n}\n\n// ─── Agent tool executor ────────────────────────────────────────────────────\n\n/**\n * Execute a tool call with agent-mode policy (plan/diff/auto/yolo).\n */\nexport async function executeTool(\n toolName: string,\n input: Record<string, unknown>,\n toolCallId: string,\n options: AgentOptions,\n): Promise<ToolResult> {\n const mode = options.mode ?? 'auto';\n const destructive = isDestructiveTool(toolName);\n const diffApprovalTools = new Set(['write_file', 'edit_file', 'search_replace']);\n\n // --plan mode: block all writes\n if (mode === 'plan' && destructive) {\n return {\n toolCallId,\n toolName,\n content: `[PLAN MODE] Would execute: ${toolName}(${JSON.stringify(input).slice(0, 200)}) — skipped (--plan mode)`,\n isError: false,\n };\n }\n\n // --diff mode: for write_file/edit_file, show diff and ask\n if (mode === 'diff' && diffApprovalTools.has(toolName)) {\n const diffPreview = await generateDiffPreview(toolName, input, options.cwd);\n if (options.onDiffProposed) {\n const target = String(input.path ?? input.file ?? '(working tree)');\n const approved = await options.onDiffProposed(target, diffPreview);\n if (!approved) {\n return {\n toolCallId,\n toolName,\n content: `[DIFF MODE] Change rejected by user for ${target}`,\n isError: false,\n };\n }\n }\n }\n\n if (\n mode !== 'yolo' &&\n !diffApprovalTools.has(toolName) &&\n toolRequiresApproval(toolName, input) &&\n options.onApprovalNeeded\n ) {\n const approved = await options.onApprovalNeeded(toolName, input);\n if (!approved) {\n return {\n toolCallId,\n toolName,\n content: `[${mode.toUpperCase()} MODE] Action rejected by user for ${toolName}`,\n isError: false,\n };\n }\n }\n\n // Execute through the tools registry\n const ctx: ToolContext = {\n cwd: options.cwd,\n projectRoot: options.cwd,\n abortSignal: options.signal,\n };\n\n const result = await executeToolRaw(toolName, input, ctx);\n\n return {\n toolCallId,\n toolName,\n content: result.success ? result.output : `[ERROR] ${result.error ?? result.output}`,\n isError: !result.success,\n };\n}\n\n// ─── Diff preview ───────────────────────────────────────────────────────────\n\nasync function generateDiffPreview(\n toolName: string,\n input: Record<string, unknown>,\n cwd: string,\n): Promise<string> {\n const { createTwoFilesPatch } = await import('diff');\n const { readFile } = await import('node:fs/promises');\n const { join } = await import('node:path');\n\n if (toolName === 'write_file') {\n const path = String(input.path ?? '');\n const newContent = String(input.content ?? '');\n let oldContent = '';\n try {\n oldContent = await readFile(join(cwd, path), 'utf-8');\n } catch { /* new file */ }\n return createTwoFilesPatch(path, path, oldContent, newContent, 'old', 'new');\n }\n\n if (toolName === 'edit_file') {\n const path = String(input.path ?? '');\n const oldStr = String(input.old_text ?? '');\n const newStr = String(input.new_text ?? '');\n try {\n const current = await readFile(join(cwd, path), 'utf-8');\n const firstMatch = current.indexOf(oldStr);\n const secondMatch = firstMatch === -1 ? -1 : current.indexOf(oldStr, firstMatch + oldStr.length);\n\n if (firstMatch !== -1 && secondMatch === -1) {\n const updated = current.slice(0, firstMatch) + newStr + current.slice(firstMatch + oldStr.length);\n return createTwoFilesPatch(path, path, current, updated, 'old', 'new');\n }\n } catch {\n // Fall back to the local snippet preview below if the file cannot be read.\n }\n\n return createTwoFilesPatch(path, path, oldStr, newStr, 'old', 'new');\n }\n\n if (toolName === 'search_replace') {\n const path = String(input.path ?? '');\n const current = await readFile(join(cwd, path), 'utf-8');\n const { buildSearchReplacePlan, buildSearchReplacePreview } = await import('../tools/search-replace.js');\n const plan = buildSearchReplacePlan(current, {\n path,\n search: String(input.search ?? ''),\n replace: String(input.replace ?? ''),\n regex: Boolean(input.regex),\n all: Boolean(input.all),\n });\n return buildSearchReplacePreview(path, current, plan.updated);\n }\n\n if (toolName === 'git_diff') {\n const { buildGitDiffOutput } = await import('../tools/git-diff.js');\n return buildGitDiffOutput({\n staged: Boolean(input.staged),\n file: typeof input.file === 'string' ? input.file : undefined,\n }, cwd);\n }\n\n return '';\n}\n","import { streamAgent } from '../providers/index.js';\nimport { isModelAvailable } from '../providers/index.js';\nimport type { Message, AgentStreamChunk } from '../providers/types.js';\nimport type { ModelId } from '../providers/types.js';\nimport { isConcurrencySafeTool, toolRequiresApproval } from '../tools/index.js';\nimport {\n TOOLS,\n executeTool,\n getAgentToolDefinitions,\n type ToolResult,\n type AgentOptions,\n} from './tools.js';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface AgentLoopChunk {\n type: 'text' | 'tool_call' | 'tool_result' | 'done' | 'error';\n text?: string;\n toolName?: string;\n toolInput?: Record<string, unknown>;\n toolCallId?: string;\n results?: ToolResult[];\n error?: string;\n}\n\ninterface ToolCallRecord {\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\n// Extended message for agent use — carries tool call metadata\ninterface AgentMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content: string;\n toolCalls?: ToolCallRecord[];\n toolResults?: Array<{ toolCallId: string; content: string }>;\n}\n\n// ─── Agent Loop ───────────────────────────────────────────────────────────────\n\n/**\n * The core agent loop. Streams LLM response → detects tool calls → executes them\n * → feeds results back → repeats until no more tool calls.\n *\n * Yields AgentLoopChunk events so callers can stream output progressively.\n */\nexport async function* agentLoop(\n task: string,\n options: AgentOptions & { systemPrompt?: string; maxIterations?: number; maxTokens?: number; providerOptions?: Record<string, unknown> }\n): AsyncGenerator<AgentLoopChunk> {\n const messages: AgentMessage[] = [{ role: 'user', content: task }];\n const maxIterations = options.maxIterations ?? 40;\n const toolDefinitions = options.toolNames\n ? getAgentToolDefinitions(options.toolNames)\n : TOOLS;\n\n // Resolve model with fallback\n let model: ModelId = 'deepseek-v3';\n if (options.model && isModelAvailable(options.model as ModelId)) {\n model = options.model as ModelId;\n } else if (!isModelAvailable('deepseek-v3')) {\n // fallback scan\n const fallbacks: ModelId[] = ['claude-sonnet-4', 'deepseek-coder'];\n for (const fb of fallbacks) {\n if (isModelAvailable(fb)) {\n model = fb;\n break;\n }\n }\n }\n\n for (let iteration = 0; iteration < maxIterations; iteration++) {\n if (options.signal?.aborted) {\n yield { type: 'error', error: 'Aborted' };\n return;\n }\n\n let fullText = '';\n const toolCallsThisRound: ToolCallRecord[] = [];\n\n try {\n // Stream agent response with tool definitions\n for await (const chunk of streamAgent({\n model,\n messages: messages as Message[],\n systemPrompt: options.systemPrompt,\n tools: toolDefinitions,\n maxTokens: options.maxTokens ?? 16384,\n signal: options.signal,\n providerOptions: options.providerOptions,\n })) {\n if (chunk.type === 'text' && chunk.text) {\n fullText += chunk.text;\n yield { type: 'text', text: chunk.text };\n } else if (chunk.type === 'tool_call') {\n toolCallsThisRound.push({\n id: chunk.toolCallId ?? `tc_${Date.now()}_${toolCallsThisRound.length}`,\n name: chunk.toolName ?? 'unknown',\n input: chunk.toolInput ?? {},\n });\n yield {\n type: 'tool_call',\n toolName: chunk.toolName,\n toolInput: chunk.toolInput,\n toolCallId: chunk.toolCallId,\n };\n }\n }\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n yield { type: 'error', error: errMsg };\n return;\n }\n\n // If no tool calls, the agent is done\n if (toolCallsThisRound.length === 0) {\n break;\n }\n\n // Record assistant message with tool calls\n const assistantMsg: AgentMessage = {\n role: 'assistant',\n content: fullText,\n toolCalls: toolCallsThisRound,\n };\n messages.push(assistantMsg);\n\n const hasApprovalGatedCall = toolCallsThisRound.some((toolCall) =>\n toolRequiresApproval(toolCall.name, toolCall.input)\n );\n\n if (\n hasApprovalGatedCall &&\n options.mode !== 'yolo' &&\n options.mode !== 'auto' &&\n options.onIterationApprovalNeeded\n ) {\n const approved = await options.onIterationApprovalNeeded(\n iteration + 1,\n toolCallsThisRound.map((toolCall) => ({ name: toolCall.name, input: toolCall.input })),\n );\n\n if (!approved) {\n const rejectedResults: ToolResult[] = toolCallsThisRound.map((toolCall) => ({\n toolCallId: toolCall.id,\n toolName: toolCall.name,\n content: `[REJECTED] User denied executing ${toolCall.name} in iteration ${iteration + 1}.`,\n isError: true,\n }));\n\n yield { type: 'tool_result', results: rejectedResults };\n\n const toolMsg: AgentMessage = {\n role: 'tool',\n content: '',\n toolResults: rejectedResults.map((result) => ({\n toolCallId: result.toolCallId,\n content: result.content,\n })),\n };\n messages.push(toolMsg);\n continue;\n }\n }\n\n const toolResults = await executeToolCalls(toolCallsThisRound, options);\n\n yield { type: 'tool_result', results: toolResults };\n\n // Feed tool results back as a tool message\n const toolMsg: AgentMessage = {\n role: 'tool',\n content: '',\n toolResults: toolResults.map(r => ({ toolCallId: r.toolCallId, content: r.content })),\n };\n messages.push(toolMsg);\n }\n\n yield { type: 'done' };\n}\n\nasync function executeToolCalls(\n toolCalls: ToolCallRecord[],\n options: AgentOptions,\n): Promise<ToolResult[]> {\n const results: ToolResult[] = [];\n\n for (let index = 0; index < toolCalls.length;) {\n if (options.signal?.aborted) break;\n\n const current = toolCalls[index];\n if (!isConcurrencySafeTool(current.name)) {\n results.push(await executeTool(current.name, current.input, current.id, options));\n index += 1;\n continue;\n }\n\n const batch: ToolCallRecord[] = [];\n while (index < toolCalls.length && isConcurrencySafeTool(toolCalls[index]!.name)) {\n batch.push(toolCalls[index]!);\n index += 1;\n }\n\n const batchResults = await Promise.all(\n batch.map((toolCall) => executeTool(toolCall.name, toolCall.input, toolCall.id, options)),\n );\n results.push(...batchResults);\n }\n\n return results;\n}\n","// src/context/pack.ts\nimport { exec } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { join } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport { glob } from 'glob';\nimport ignore from 'ignore';\nimport type { ModelId } from '../providers/types.js';\nimport { getTier } from '../providers/tiers.js';\nimport { estimateTokens, getBudget } from './budget.js';\nimport { compressContext, type FileEntry } from './compress.js';\nimport { loadAgentMd, formatAgentMdForPrompt } from './agentmd.js';\n\nconst execAsync = promisify(exec);\n\nexport interface ContextPack {\n /** Ready-to-inject system context string */\n systemContext: string;\n /** Estimated token count of systemContext */\n tokenEstimate: number;\n /** Paths of files included */\n filesIncluded: string[];\n /** Was AGENT.md found and injected? */\n agentMdFound: boolean;\n /** Compression tier applied */\n tier: string;\n}\n\n/**\n * Build a complete context pack for an agent task.\n *\n * @param cwd - Project working directory\n * @param modelId - The model that will receive this context (determines tier)\n * @param task - The task description (used for semantic relevance ranking)\n */\nexport async function buildContextPack(cwd: string, modelId: ModelId, task: string): Promise<ContextPack> {\n const tier = getTier(modelId);\n const budget = getBudget(modelId);\n\n const parts: string[] = [];\n let agentMdFound = false;\n\n // 1. AGENT.md — highest priority, always first\n const agentMd = await loadAgentMd(cwd);\n if (agentMd) {\n parts.push(formatAgentMdForPrompt(agentMd));\n agentMdFound = true;\n }\n\n // 2. Git context (cheap, high-signal)\n const gitContext = await getGitContext(cwd);\n if (gitContext) {\n parts.push(`<git_context>\\n${gitContext}\\n</git_context>\\n`);\n }\n\n // 3. File tree (up to 3 levels deep, .gitignore filtered)\n const fileTree = await getFileTree(cwd);\n parts.push(`<file_tree>\\n${fileTree}\\n</file_tree>\\n`);\n\n // 4. Relevant source files\n const tokenBudgetForFiles = budget.maxContextTokens - estimateTokens(parts.join(''));\n const files = await gatherRelevantFiles(cwd, task, tokenBudgetForFiles);\n const { files: compressedFiles } = compressContext(files, tier);\n\n const filesIncluded: string[] = [];\n for (const f of compressedFiles) {\n const snippet = `<file path=\"${f.path}\">\\n${f.content}\\n</file>`;\n parts.push(snippet);\n filesIncluded.push(f.path);\n }\n\n const systemContext = parts.join('\\n');\n\n return {\n systemContext,\n tokenEstimate: estimateTokens(systemContext),\n filesIncluded,\n agentMdFound,\n tier,\n };\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nasync function getGitContext(cwd: string): Promise<string | null> {\n try {\n const [status, diffStat] = await Promise.all([\n execAsync('git status --short', { cwd }),\n execAsync('git diff --stat HEAD~1 2>/dev/null || echo \"(no prior commit)\"', { cwd }),\n ]);\n return `$ git status --short\\n${status.stdout}\\n$ git diff --stat HEAD~1\\n${diffStat.stdout}`;\n } catch {\n return null;\n }\n}\n\nasync function getFileTree(cwd: string): Promise<string> {\n try {\n const { stdout } = await execAsync(\n 'find . -not -path \"*/node_modules/*\" -not -path \"*/.git/*\" -not -path \"*/dist/*\" -maxdepth 3 -print | sort | head -80',\n { cwd }\n );\n return stdout.trim();\n } catch {\n return '(could not generate file tree)';\n }\n}\n\nasync function getGitignoreFilter(cwd: string) {\n const ig = ignore();\n ig.add(['node_modules', '.git', 'dist', 'build', '.next', 'coverage', '*.lock', '.env*']);\n try {\n const content = await readFile(join(cwd, '.gitignore'), 'utf-8');\n ig.add(content.split('\\n').filter(l => l.trim() && !l.startsWith('#')));\n } catch { /* no .gitignore */ }\n return ig;\n}\n\n/**\n * Find the top N files most likely relevant to `task`.\n * Strategy: keyword grep for task words → score by match count → top 10.\n */\nasync function gatherRelevantFiles(cwd: string, task: string, tokenBudget: number): Promise<FileEntry[]> {\n const ig = await getGitignoreFilter(cwd);\n\n const allFiles = (await glob('**/*.{ts,tsx,js,jsx,py,go,rs,java,rb,md}', {\n cwd,\n nodir: true,\n absolute: false,\n })).filter(f => !ig.ignores(f));\n\n // Score files by keyword overlap with task\n const keywords = task.toLowerCase().split(/\\s+/).filter(w => w.length > 3);\n\n const scored: Array<{ path: string; score: number }> = await Promise.all(\n allFiles.map(async (filePath) => {\n try {\n const content = await readFile(join(cwd, filePath), 'utf-8');\n const lower = content.toLowerCase();\n const score = keywords.reduce((n, kw) => n + (lower.includes(kw) ? 1 : 0), 0);\n return { path: filePath, score };\n } catch {\n return { path: filePath, score: 0 };\n }\n })\n );\n\n scored.sort((a, b) => b.score - a.score);\n\n // Take top 10 by relevance, then fill budget\n const topFiles = scored.slice(0, 10);\n const result: FileEntry[] = [];\n let used = 0;\n\n for (const { path: filePath } of topFiles) {\n try {\n const content = await readFile(join(cwd, filePath), 'utf-8');\n const tokens = estimateTokens(content);\n if (used + tokens > tokenBudget) break;\n result.push({ path: filePath, content, language: detectLanguage(filePath) });\n used += tokens;\n } catch { /* skip */ }\n }\n\n return result;\n}\n\nfunction detectLanguage(filePath: string): string {\n const ext = filePath.split('.').pop() ?? '';\n const map: Record<string, string> = {\n ts: 'typescript', tsx: 'typescript', js: 'javascript', jsx: 'javascript',\n py: 'python', go: 'go', rs: 'rust', java: 'java', rb: 'ruby',\n md: 'markdown', json: 'json', yaml: 'yaml', yml: 'yaml',\n };\n return map[ext] ?? 'text';\n}\n","import * as os from 'node:os';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { agentLoop, type AgentLoopChunk } from './loop.js';\nimport type { AgentOptions, AgentMode } from './tools.js';\nimport { buildContextPack } from '../context/pack.js';\nimport { loadSessionMemory, formatSessionMemoryForPrompt } from '../context/session-memory.js';\nimport type { ModelId } from '../providers/types.js';\nimport { MODELS } from '../providers/types.js';\nimport { getTier } from '../providers/tiers.js';\nimport { selectModelWithReason } from '../providers/router.js';\nimport { createUsageTracker, calculateOpusCost } from '../usage/tracker.js';\n\n// ─── System Prompt ────────────────────────────────────────────────────────────\n\nexport function buildSystemPrompt(cwd: string): string {\n const homeDir = os.homedir();\n const platform = process.platform;\n return `You are Mint, an expert AI coding agent running in a terminal.\n\n<environment>\n <cwd>${cwd}</cwd>\n <home>${homeDir}</home>\n <platform>${platform}</platform>\n</environment>\n\n<capabilities>\nYou have access to these tools:\n- bash: Execute shell commands (with 30s timeout and 64KB output cap)\n- read_file: Read file contents\n- write_file: Create or overwrite files\n- edit_file: Replace exact text in a file\n- find_files: Find files by glob pattern\n- grep_files: Search file contents with regex\n- list_dir: Inspect directory structure\n- search_replace: Replace targeted or regex matches with preview support\n- run_tests: Run the detected project test suite or a custom test command\n- git_diff: Inspect working tree changes and git status\n- web_fetch: Fetch HTTP(S) documentation pages as plain text\n</capabilities>\n\n<rules>\n1. Think step-by-step before acting. Plan before coding.\n2. Use read_file before editing — never edit blindly.\n3. Use edit_file for targeted changes, write_file only for new files or full rewrites.\n4. After making changes, verify with bash (run tests, build, lint).\n5. Keep changes minimal and focused on the task.\n6. If a command fails, analyze the error and try again with a fix.\n7. When done, summarize what you accomplished.\n</rules>`;\n}\n\n// ─── Enriched system prompt ────────────────────────────────────────────────────\n\nexport async function buildEnrichedSystemPrompt(\n task: string,\n cwd: string,\n modelId: ModelId,\n): Promise<string> {\n const base = buildSystemPrompt(cwd);\n const sessionMemory = await loadSessionMemory(cwd).catch(() => null);\n const memoryBlock = sessionMemory ? `\\n\\n${formatSessionMemoryForPrompt(sessionMemory)}` : '';\n try {\n const pack = await buildContextPack(cwd, modelId, task);\n return pack.systemContext + memoryBlock + '\\n\\n' + base;\n } catch {\n // Context pack failed (e.g. not a git repo) — fall back to base prompt\n return memoryBlock ? `${memoryBlock}\\n\\n${base}` : base;\n }\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport interface RunAgentOptions {\n model?: string;\n cwd?: string;\n signal?: AbortSignal;\n verbose?: boolean;\n onChunk?: (chunk: AgentLoopChunk) => void;\n mode?: AgentMode;\n toolNames?: string[];\n /** Max output tokens per LLM turn. Default: 16384. */\n maxTokens?: number;\n /** Provider-specific options (e.g. Grok reasoning toggle, Mistral reasoning_effort). */\n providerOptions?: Record<string, unknown>;\n onApprovalNeeded?: (toolName: string, toolInput: Record<string, unknown>) => Promise<boolean>;\n onDiffProposed?: (path: string, diff: string) => Promise<boolean>;\n onIterationApprovalNeeded?: (\n iteration: number,\n toolCalls: Array<{ name: string; input: Record<string, unknown> }>,\n ) => Promise<boolean>;\n}\n\nexport interface RunAgentSessionResult {\n output: string;\n model: ModelId;\n duration: number;\n inputTokens: number;\n outputTokens: number;\n cost: number;\n stoppedReason: 'done' | 'error';\n error?: string;\n}\n\n/**\n * Run the coding agent on a task description.\n * Streams output to stdout by default, or calls onChunk for custom rendering.\n */\nexport async function runAgent(task: string, options: RunAgentOptions = {}): Promise<void> {\n const cwd = options.cwd ?? process.cwd();\n const resolvedModel = (options.model ?? 'deepseek-v3') as ModelId;\n const systemPrompt = await buildEnrichedSystemPrompt(task, cwd, resolvedModel);\n\n const agentOptions: AgentOptions = {\n cwd,\n model: options.model,\n signal: options.signal,\n verbose: options.verbose ?? false,\n mode: options.mode,\n toolNames: options.toolNames,\n onApprovalNeeded: options.onApprovalNeeded,\n onDiffProposed: options.onDiffProposed,\n onIterationApprovalNeeded: options.onIterationApprovalNeeded,\n };\n\n const onChunk = options.onChunk ?? defaultRenderer;\n const tracker = createUsageTracker(Date.now().toString(36), 'agent');\n const routing = selectModelWithReason(task);\n let accumulatedOutput = '';\n\n for await (const chunk of agentLoop(task, { ...agentOptions, systemPrompt })) {\n onChunk(chunk);\n if (chunk.type === 'text' && chunk.text) {\n accumulatedOutput += chunk.text;\n }\n if (chunk.type === 'done') {\n const inputTokens = Math.ceil(task.length / 4);\n const outputTokens = Math.ceil(accumulatedOutput.length / 4);\n const modelInfo = MODELS[resolvedModel];\n const cost = modelInfo\n ? (inputTokens / 1_000_000) * modelInfo.inputPrice + (outputTokens / 1_000_000) * modelInfo.outputPrice\n : 0;\n const opusCost = calculateOpusCost(inputTokens, outputTokens);\n tracker.track({\n model: resolvedModel,\n provider: modelInfo?.provider ?? 'unknown',\n tier: getTier(resolvedModel),\n inputTokens,\n outputTokens,\n cost,\n opusCost,\n savedAmount: Math.max(0, opusCost - cost),\n routingReason: routing.reason,\n taskPreview: task,\n latencyMs: 0,\n costSonnet: 0,\n });\n break;\n }\n if (chunk.type === 'error') {\n break;\n }\n }\n}\n\nexport async function runAgentSession(\n task: string,\n options: RunAgentOptions & { systemPrompt?: string; maxIterations?: number } = {},\n): Promise<RunAgentSessionResult> {\n const startTime = Date.now();\n const cwd = options.cwd ?? process.cwd();\n const resolvedModel = (options.model ?? 'deepseek-v3') as ModelId;\n const systemPrompt = options.systemPrompt ?? await buildEnrichedSystemPrompt(task, cwd, resolvedModel);\n\n const agentOptions: AgentOptions = {\n cwd,\n model: options.model,\n signal: options.signal,\n verbose: options.verbose ?? false,\n mode: options.mode,\n toolNames: options.toolNames,\n onApprovalNeeded: options.onApprovalNeeded,\n onDiffProposed: options.onDiffProposed,\n onIterationApprovalNeeded: options.onIterationApprovalNeeded,\n };\n\n let output = '';\n\n for await (const chunk of agentLoop(task, {\n ...agentOptions,\n systemPrompt,\n maxIterations: options.maxIterations,\n maxTokens: options.maxTokens,\n providerOptions: options.providerOptions,\n })) {\n await Promise.resolve(options.onChunk?.(chunk));\n if (chunk.type === 'text' && chunk.text) {\n output += chunk.text;\n }\n if (chunk.type === 'done') {\n const usage = estimateSessionUsage(resolvedModel, systemPrompt, task, output, startTime);\n return { ...usage, output, stoppedReason: 'done' };\n }\n if (chunk.type === 'error') {\n const usage = estimateSessionUsage(resolvedModel, systemPrompt, task, output, startTime);\n return {\n ...usage,\n output,\n stoppedReason: 'error',\n error: chunk.error ?? 'Agent session failed',\n };\n }\n }\n\n const usage = estimateSessionUsage(resolvedModel, systemPrompt, task, output, startTime);\n return { ...usage, output, stoppedReason: 'done' };\n}\n\n// ─── Default Terminal Renderer ────────────────────────────────────────────────\n\nfunction defaultRenderer(chunk: AgentLoopChunk): void {\n switch (chunk.type) {\n case 'text':\n if (chunk.text) {\n process.stdout.write(chunk.text);\n }\n break;\n\n case 'tool_call':\n process.stdout.write('\\n');\n process.stdout.write(\n chalk.cyan(`\\n [tool] ${chunk.toolName}`) +\n chalk.gray(` ${JSON.stringify(chunk.toolInput ?? {}).slice(0, 120)}`) +\n '\\n'\n );\n break;\n\n case 'tool_result':\n if (chunk.results) {\n for (const result of chunk.results) {\n const preview = result.content.slice(0, 200).replace(/\\n/g, ' ');\n const color = result.isError ? chalk.red : chalk.green;\n process.stdout.write(\n color(` [result] ${result.toolName}: `) +\n chalk.gray(preview) +\n '\\n'\n );\n }\n }\n break;\n\n case 'done':\n process.stdout.write('\\n');\n break;\n\n case 'error':\n process.stderr.write(chalk.red(`\\n[agent error] ${chunk.error}\\n`));\n break;\n }\n}\n\nfunction estimateSessionUsage(\n model: ModelId,\n systemPrompt: string,\n task: string,\n output: string,\n startTime: number,\n): Pick<RunAgentSessionResult, 'model' | 'duration' | 'inputTokens' | 'outputTokens' | 'cost'> {\n const inputTokens = Math.ceil((systemPrompt.length + task.length) / 4);\n const outputTokens = Math.ceil(output.length / 4);\n const modelInfo = MODELS[model];\n const cost = modelInfo\n ? (inputTokens / 1_000_000) * modelInfo.inputPrice + (outputTokens / 1_000_000) * modelInfo.outputPrice\n : 0;\n\n return {\n model,\n duration: Date.now() - startTime,\n inputTokens,\n outputTokens,\n cost,\n };\n}\n","export const ARCHITECT_PROMPT = `You are ARCHITECT. Before deciding anything, reason through:\n1. Which files already exist that need changing? (check project_tree and provided files)\n2. Which NEW files need to be created — list their exact repo-relative paths and which directory they belong in\n3. Which specialist domains are involved?\n\nThen decide SINGLE vs SPLIT and output JSON.\n\nALWAYS SPLIT when the task involves different specialist domains:\n- Backend API + Frontend UI → SPLIT (backend specialist + frontend specialist)\n- Database schema + API routes → SPLIT (database specialist + backend specialist)\n- Code changes + Tests → SPLIT (general/backend specialist + testing specialist)\n- Any task touching 2+ different domains → SPLIT\n\nOnly use SINGLE when ALL changes are in the same domain (e.g. fixing two related backend files).\n\nOutput ONLY valid JSON, no markdown fences:\n\nFor SINGLE (same domain only):\n{\"type\":\"single\",\"plan\":\"1. In src/foo.ts, change X to Y\",\"specialist\":\"backend\"}\n\nFor SPLIT (different domains — PREFERRED):\n{\"type\":\"split\",\"reason\":\"API and UI are different domains\",\"subtasks\":[{\"id\":\"1\",\"description\":\"Add /api/users endpoint\",\"relevantFiles\":[\"src/api/server.js\"],\"plan\":\"1. In server.js, add GET /api/users route that queries the database and returns JSON\",\"specialist\":\"backend\",\"scopeDirectory\":\"src/api\",\"entryFiles\":[\"src/api/server.js\"],\"researchSummary\":\"The API server already owns route registration and should remain the single place for the new endpoint.\",\"builderBrief\":\"Start in src/api/server.js. Follow the existing route style, add GET /api/users next to the related routes, and keep the response JSON-only.\",\"writeTargets\":[\"src/api/server.js\"]},{\"id\":\"2\",\"description\":\"Create UserTable React component\",\"relevantFiles\":[\"src/components/App.jsx\"],\"plan\":\"1. Create src/components/UserTable.jsx with fetch + table render\\n2. Import and render in App.jsx\",\"specialist\":\"frontend\",\"scopeDirectory\":\"src/components\",\"entryFiles\":[\"src/components/App.jsx\"],\"researchSummary\":\"App.jsx already owns the page composition, so the new table should be introduced there instead of wiring a new entry point.\",\"builderBrief\":\"Read App.jsx first, then add UserTable.jsx in the same directory. Reuse the existing data-loading patterns and render the new component from App.jsx.\",\"dependsOn\":[\"1\"],\"writeTargets\":[\"src/components/App.jsx\",\"src/components/UserTable.jsx\"]}]}\n\nSpecialist types: frontend, backend, database, testing, devops, docs, mobile, ai, fullstack, debugging, general\n\nRules:\n- Each subtask gets ONE specialist — never mix domains in a subtask\n- Plans must be ticket-level precise — the Builder should barely need to think\n- Reference exact line numbers from the Hotspots section when available\n- Format each change as: \"In \\`file:line\\`, [add after / change / remove] [what]. Import [x] from [y] if needed.\"\n- Every change instruction must name the file, the line number, and the exact action\n- If hotspots are provided, use them as anchors — don't make the Builder hunt for the right location\n- For every subtask, include:\n - scopeDirectory: the repo-relative directory the Builder should start in\n - entryFiles: 1-3 exact files the Builder should read first, in order\n - researchSummary: a short summary of what your file research discovered\n - builderBrief: a short tutorial telling the Builder where to start, what patterns to follow, and what dependencies matter\n- Max 4 subtasks\n- Include dependsOn when one subtask must wait for another\n- Include writeTargets with ALL files the subtask will modify OR CREATE — new file paths are required here even if the file does not exist yet\n- Include verificationTargets only for verification-only subtasks that should not block implementation scheduling\n\n## CRITICAL: Frontend subtask plans must include a DESIGN SPEC\n\nWhen a subtask has specialist \"frontend\" and involves building a page or UI, you MUST include a detailed visual specification in the plan field. The builder cannot design — it can only implement what you describe. If you say \"create a landing page\" it will build the ugliest minimal HTML possible.\n\nYour plan for frontend subtasks MUST specify:\n\n**Theme:** dark/light, primary color (hex), accent color, background style (gradient/solid/pattern)\n\n**For each section, describe:**\n- Layout (full-width, centered container, grid columns, card-based)\n- Visual style (background color/gradient, text color, spacing)\n- Exact content: headline text, subtitle text, button text, number of items\n- Interactive elements (hover effects, animations, accordion behavior)\n\n**Example of a GOOD frontend plan (adapt the sections to fit the actual business):**\n\"Build a landing page with these sections:\n1. HERO: Full viewport height. Large bold headline about the value proposition. Subtitle explaining differentiation. Two buttons: primary CTA and secondary action. Match the tone and energy to the business.\n2. SOCIAL PROOF / FEATURES: Card grid layout. Each card: icon or visual, title, 2-line description. Choose the 3-6 most important benefits or services for this specific business.\n3. TESTIMONIALS: 3 testimonial cards with realistic quotes, names, and roles that match the business's audience.\n4. PRICING / PROGRAMS: Multi-tier card layout. Highlight the recommended option. Each card: name, price, feature list, CTA button.\n5. CTA BAND: Visually distinct section (different background). Bold headline, one conversion button.\n6. FOOTER: Multi-column grid with brand info, navigation links, and contact details. Copyright at bottom.\"\n\nThe key: describe the LAYOUT and PURPOSE of each section. The Builder fills in the content and design to match the specific business. Never hardcode the content in the plan — describe what KIND of content goes in each section.\n\n**Example of a BAD frontend plan (NEVER do this):**\n\"Create the landing page with a hero section and contact form.\"\n\nToo vague. The builder will build the bare minimum. List every section, describe its layout and purpose.`;\n","export const REVIEWER_PROMPT = `You are REVIEWER — a senior engineer and design-aware QA lead. You and the Builder are on the same mission: deliver work the user would be proud of. You are not a gatekeeper — you are a partner who pushes the work to excellence.\n\nYour job: read the actual files, run the build, and assess whether the mission is COMPLETE. If it's not, tell the Builder exactly what to fix so the next iteration gets closer to done.\n\n## How to review\n\n### Step 1 — Read the actual files (REQUIRED)\nDo NOT just read diffs. Use read_file to open every file that was created or modified. See the full picture.\n\n### Step 2 — Run the build (REQUIRED)\nRun the project's build command with bash. If it fails, that's the first thing to fix.\n\n### Step 3 — Assess the mission\n\nAsk yourself these questions:\n\n**Is the work COMPLETE?**\n- Does it implement everything the user asked for?\n- For a landing page: count the sections. Are there enough? Is each one fully built with real content?\n- For an API: are all endpoints implemented? Do they handle errors?\n- Are there any TODOs, placeholders, \"Lorem ipsum\", empty function bodies, or stubs?\n\n**Does it look and feel PROFESSIONAL?**\n- For frontend: would a real user trust this site? Does it have proper spacing, visual hierarchy, hover states, readable text?\n- Is the design consistent throughout? (same colors, spacing rhythm, typography scale)\n- Are forms styled properly? (not browser-default unstyled inputs)\n- Are there broken images, missing icons, or empty sections?\n\n**Is it CORRECT?**\n- Are imports/paths valid?\n- Are there obvious bugs or logic errors?\n- Do cross-file references match? (component names, route paths, API endpoints)\n\n### Step 4 — Give mission feedback\n\nIf the mission is NOT complete, be SPECIFIC and CONSTRUCTIVE:\n- Name exactly which files and which sections need work\n- Describe what \"done\" looks like for each issue (don't just say \"fix it\" — say what to add)\n- Prioritize: fix the biggest gaps first (missing sections > styling issues > minor polish)\n\nThink of your feedback as a briefing for the next iteration, not a rejection letter.\n\n## Response format\n\nWhen the mission is complete — you would deploy this:\n{\"approved\":true,\"feedback\":\"Mission complete. All sections implemented with real content, build passes, design is consistent and professional.\",\"subtaskFeedback\":{}}\n\nWhen there's more work to do — be specific so the builder can finish:\n{\"approved\":false,\"feedback\":\"Good progress — hero and features are solid. But the page needs more work to be complete.\",\"subtaskFeedback\":{\"1\":\"3 issues to fix: (1) Pricing section has only 1 tier — need 3 tiers with a highlighted recommended option. (2) Footer has no links, just copyright — add 3-4 columns with link groups. (3) Testimonials section is missing entirely — add 3 client quotes with names.\",\"2\":\"Backend endpoint /api/contact saves to DB correctly but returns no success message to the frontend — add a JSON response body.\"}}\n\n## Your standards\n- Incomplete work → send back with specific instructions for what to build next\n- Placeholder content → send back (\"Write real copy that fits this business\")\n- Build fails → send back with the exact error message\n- Missing sections → send back with a list of what to add\n- Everything is implemented, builds, looks professional → APPROVE\n- NEVER suggest running scaffolding tools (create-react-app, npm init, etc.) or destructive commands (rm -rf). The builder writes code directly — it does not run generators.\n\nYou are not looking for perfection on the first try. You are guiding the Builder to perfection over iterations.`;\n","/**\n * ARCHITECT agent — creates a structured implementation plan.\n *\n * Only runs for moderate/complex tasks. Gets the task + relevant file\n * contents and outputs JSON: either a single plan or split subtasks.\n */\nimport { complete } from '../providers/index.js';\nimport { calculateCost } from '../providers/router.js';\nimport { compressContext } from '../context/compress.js';\nimport { getTier } from '../providers/tiers.js';\nimport { estimateTokens } from '../context/budget.js';\nimport { ARCHITECT_PROMPT } from './prompts/architect.js';\nimport { selectAgentModel } from './model-selector.js';\nimport { detectSpecialist } from './specialists/index.js';\nimport type { SpecialistType } from './specialists/types.js';\nimport type { AgentInput, ArchitectOutput, TaskComplexity, Subtask } from './types.js';\n\n/**\n * Parse the architect's JSON response into a typed ArchitectOutput shape.\n * Exported for testing.\n */\nexport function parseArchitectResponse(text: string): Pick<ArchitectOutput, 'type' | 'plan' | 'subtasks'> {\n try {\n // Try to extract JSON from the response (model may wrap in markdown)\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as { type?: string; plan?: string; subtasks?: unknown[]; reason?: string };\n\n if (parsed.type === 'single' && typeof parsed.plan === 'string') {\n return { type: 'single', plan: parsed.plan };\n }\n\n if (parsed.type === 'split' && Array.isArray(parsed.subtasks)) {\n const subtasks: Subtask[] = parsed.subtasks.map((s: unknown) => {\n const subtask = s as Record<string, unknown>;\n const relevantFiles = Array.isArray(subtask.relevantFiles)\n ? (subtask.relevantFiles as unknown[]).map(String)\n : [];\n const dependsOn = Array.isArray(subtask.dependsOn)\n ? (subtask.dependsOn as unknown[]).map(String).filter(Boolean)\n : undefined;\n const entryFiles = Array.isArray(subtask.entryFiles)\n ? (subtask.entryFiles as unknown[]).map(String).filter(Boolean)\n : (relevantFiles.length > 0 ? relevantFiles.slice(0, 3) : undefined);\n const scopeDirectory = typeof subtask.scopeDirectory === 'string' && subtask.scopeDirectory.trim().length > 0\n ? subtask.scopeDirectory.trim()\n : deriveScopeDirectory(relevantFiles);\n const researchSummary = typeof subtask.researchSummary === 'string' && subtask.researchSummary.trim().length > 0\n ? subtask.researchSummary.trim()\n : buildDefaultResearchSummary(relevantFiles, subtask.description, subtask.plan);\n const builderBrief = typeof subtask.builderBrief === 'string' && subtask.builderBrief.trim().length > 0\n ? subtask.builderBrief.trim()\n : buildDefaultBuilderBrief(scopeDirectory, entryFiles, subtask.plan);\n const writeTargets = Array.isArray(subtask.writeTargets)\n ? (subtask.writeTargets as unknown[]).map(String).filter(Boolean)\n : (relevantFiles.length > 0 ? [...relevantFiles] : undefined);\n const verificationTargets = Array.isArray(subtask.verificationTargets)\n ? (subtask.verificationTargets as unknown[]).map(String).filter(Boolean)\n : undefined;\n const specialist = (typeof subtask.specialist === 'string' && isSpecialistType(subtask.specialist))\n ? subtask.specialist\n : detectSpecialist(relevantFiles);\n return {\n id: String(subtask.id ?? ''),\n description: String(subtask.description ?? ''),\n relevantFiles,\n plan: String(subtask.plan ?? ''),\n specialist,\n ...(scopeDirectory ? { scopeDirectory } : {}),\n ...(entryFiles && entryFiles.length > 0 ? { entryFiles } : {}),\n ...(researchSummary ? { researchSummary } : {}),\n ...(builderBrief ? { builderBrief } : {}),\n ...(dependsOn && dependsOn.length > 0 ? { dependsOn } : {}),\n ...(writeTargets && writeTargets.length > 0 ? { writeTargets } : {}),\n ...(verificationTargets && verificationTargets.length > 0 ? { verificationTargets } : {}),\n };\n });\n return { type: 'split', subtasks };\n }\n }\n } catch { /* parse failed — fall through to fallback */ }\n\n // Fallback: treat raw response as single plan\n return { type: 'single', plan: text };\n}\n\nconst SPECIALIST_TYPES = new Set(['frontend', 'backend', 'database', 'testing', 'devops', 'docs', 'general']);\n\nfunction isSpecialistType(value: string): value is SpecialistType {\n return SPECIALIST_TYPES.has(value);\n}\n\nfunction deriveScopeDirectory(files: string[]): string | undefined {\n if (files.length === 0) return undefined;\n\n const splitPaths = files\n .map((file) => file.split('/').filter(Boolean))\n .filter((segments) => segments.length > 1);\n if (splitPaths.length === 0) return undefined;\n\n const first = splitPaths[0];\n const shared: string[] = [];\n for (let index = 0; index < first.length - 1; index++) {\n const segment = first[index];\n if (splitPaths.every((parts) => parts[index] === segment)) {\n shared.push(segment);\n continue;\n }\n break;\n }\n\n if (shared.length > 0) {\n return shared.join('/');\n }\n\n const fallback = first.slice(0, -1).join('/');\n return fallback || undefined;\n}\n\nfunction buildDefaultResearchSummary(\n files: string[],\n description: unknown,\n plan: unknown,\n): string | undefined {\n const scope = files.length > 0 ? files.join(', ') : 'the assigned scope';\n const descriptionText = typeof description === 'string' && description.trim().length > 0\n ? description.trim()\n : 'the requested task';\n const planText = typeof plan === 'string' && plan.trim().length > 0\n ? plan.trim()\n : 'Follow the assigned files and existing local patterns.';\n\n return `Focus on ${scope}. This subtask covers ${descriptionText}. ${planText}`;\n}\n\nfunction buildDefaultBuilderBrief(\n scopeDirectory: string | undefined,\n entryFiles: string[] | undefined,\n plan: unknown,\n): string | undefined {\n const orderedFiles = entryFiles && entryFiles.length > 0\n ? entryFiles.join(', ')\n : 'the assigned files';\n const start = scopeDirectory\n ? `Start in ${scopeDirectory}.`\n : 'Start in the assigned scope.';\n const planText = typeof plan === 'string' && plan.trim().length > 0\n ? plan.trim()\n : 'Follow the existing local implementation patterns.';\n\n return `${start} Read ${orderedFiles} first. ${planText}`;\n}\n\nexport async function runArchitect(\n input: AgentInput,\n complexity: TaskComplexity,\n): Promise<ArchitectOutput> {\n const startTime = Date.now();\n const { task, signal, searchResults = [] } = input;\n const model = selectAgentModel('architect', complexity);\n const tier = getTier(model);\n\n // Build context: compressed file contents\n const fileEntries = searchResults.map(r => ({\n path: r.path,\n content: r.content,\n language: r.language,\n }));\n const { files: compressed } = compressContext(fileEntries, tier);\n\n let fileContext = '';\n let tokenBudget = 4000;\n for (const f of compressed) {\n const block = `<file path=\"${f.path}\">\\n${f.content}\\n</file>\\n`;\n const tokens = estimateTokens(block);\n if (tokens > tokenBudget) break;\n fileContext += block;\n tokenBudget -= tokens;\n }\n\n const userMessage = fileContext\n ? `Task: ${task}\\n\\nRelevant files:\\n${fileContext}`\n : `Task: ${task}`;\n\n const response = await complete({\n model,\n messages: [\n { role: 'system', content: ARCHITECT_PROMPT },\n { role: 'user', content: userMessage },\n ],\n maxTokens: 1500,\n temperature: 0.3,\n signal,\n });\n\n const duration = Date.now() - startTime;\n const cost = calculateCost(model, response.usage.inputTokens, response.usage.outputTokens);\n\n const parsed = parseArchitectResponse(response.content);\n\n return {\n result: response.content,\n type: parsed.type,\n plan: parsed.plan,\n subtasks: parsed.subtasks,\n model,\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n cost: cost.total,\n duration,\n };\n}\n","/**\n * REVIEWER agent — verifies the builder's output.\n *\n * Only runs for moderate/complex tasks.\n * Accepts combined diffs from all builders and per-subtask IDs.\n * Outputs per-subtask feedback for targeted retries.\n */\nimport { complete } from '../providers/index.js';\nimport { calculateCost } from '../providers/router.js';\nimport { REVIEWER_PROMPT } from './prompts/reviewer.js';\nimport { selectAgentModel } from './model-selector.js';\nimport type { AgentInput, ReviewerOutput, TaskComplexity } from './types.js';\n\n/**\n * Parse reviewer response JSON into typed shape.\n * Exported for testing.\n */\nexport function parseReviewerResponseFull(\n text: string,\n): { approved: boolean; feedback: string; subtaskFeedback: Record<string, string> } {\n try {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as {\n approved?: unknown;\n feedback?: unknown;\n subtaskFeedback?: unknown;\n };\n return {\n approved: parsed.approved === true,\n feedback: typeof parsed.feedback === 'string' ? parsed.feedback : '',\n subtaskFeedback: (parsed.subtaskFeedback && typeof parsed.subtaskFeedback === 'object' && !Array.isArray(parsed.subtaskFeedback))\n ? (parsed.subtaskFeedback as Record<string, string>)\n : {},\n };\n }\n } catch { /* parse failed */ }\n\n // Fallback: detect approval from raw text\n const approved = /approved[\"']?\\s*:\\s*true/i.test(text);\n return { approved, feedback: text.slice(0, 200), subtaskFeedback: {} };\n}\n\nexport async function runReviewer(\n input: AgentInput,\n complexity: TaskComplexity,\n allDiffs: string,\n subtaskIds: string[] = [],\n): Promise<ReviewerOutput> {\n const startTime = Date.now();\n const { task, signal } = input;\n const model = selectAgentModel('reviewer', complexity);\n\n // Pass full diffs up to 8000 chars\n const diffsSlice = allDiffs.slice(0, 8000);\n\n let userContent = `Original task: ${task}\\n\\nProposed changes:\\n${diffsSlice}`;\n if (subtaskIds.length > 1) {\n userContent += `\\n\\nSubtask IDs to evaluate: ${subtaskIds.join(', ')}`;\n }\n\n const response = await complete({\n model,\n messages: [\n { role: 'system', content: REVIEWER_PROMPT },\n { role: 'user', content: userContent },\n ],\n maxTokens: 600,\n temperature: 0,\n signal,\n });\n\n const duration = Date.now() - startTime;\n const cost = calculateCost(model, response.usage.inputTokens, response.usage.outputTokens);\n const parsed = parseReviewerResponseFull(response.content);\n\n return {\n result: response.content,\n approved: parsed.approved,\n feedback: parsed.feedback,\n subtaskFeedback: parsed.subtaskFeedback,\n model,\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n cost: cost.total,\n duration,\n };\n}\n","export const EXPLORE_PROMPT = `You are an EXPLORE agent. Your job is to understand the codebase and produce a structured briefing for the builder.\n\nRead files, search for patterns, understand the project structure. Do NOT write code. Do NOT suggest solutions. Do NOT create files.\n\n## What to investigate\n\n1. **Stack detection**: What framework, language, build tool, CSS approach?\n2. **Project structure**: Where do components live? Where are styles? Where are routes?\n3. **Existing patterns**: How are components structured? What naming conventions? What imports style?\n4. **Entry points**: Which file is the main entry? Where do new pages/components get registered?\n5. **Dependencies**: What libraries are installed? What's available without adding new deps?\n6. **Build command**: What command builds the project? (check package.json scripts). If the project is static HTML (no framework, no bundler, no TypeScript) set buildCommand to \"none\" — static files don't need a build step.\n\n## How to investigate\n\n- Use list_dir to understand the directory structure\n- Use read_file on package.json, tsconfig.json, and the main entry file\n- Use grep_files to find patterns (e.g., how existing components are structured)\n- Use find_files to locate relevant files by name pattern\n- Read 2-3 existing files similar to what will need to be created\n\n## Output format\n\nAfter investigating, output ONLY a JSON block (no markdown fences, no explanation):\n\n{\"stack\":\"Vite + React 18 + Tailwind CSS\",\"buildCommand\":\"npm run build\",\"projectRoot\":\"src\",\"structure\":\"Components in src/components/, styles in src/index.css, routes in src/App.tsx\",\"existingPatterns\":\"Functional components, arrow functions, Tailwind utility classes, no state management library\",\"relevantFiles\":[{\"path\":\"src/App.tsx\",\"snippet\":\"first 20 lines of the file\",\"why\":\"Entry point — new routes and imports go here\"},{\"path\":\"package.json\",\"snippet\":\"dependencies section\",\"why\":\"Available libraries\"}],\"dependencies\":[\"react\",\"react-dom\",\"react-router-dom\",\"tailwindcss\"],\"concerns\":\"No existing components — building from scratch in empty project\"}\n\nKeep relevantFiles to 3-5 entries max. Snippets should be 5-20 lines — enough context for the builder to match patterns, not full file dumps.`;\n","export const PLAN_PHASE_PROMPT = `You are a PLAN agent. Given an explore briefing and a task, create a step-by-step implementation plan.\n\nYou have NO tools. You cannot read files or run commands. The explore briefing contains everything you need.\n\nThink carefully about:\n1. What files need to be created vs modified\n2. What order to make changes (dependencies first)\n3. What each file should contain (be specific about sections, components, functions)\n4. What the verification criteria are (how do we know it's done?)\n5. Whether a build step is actually needed — if the briefing says buildCommand is \"none\" (static HTML), do NOT include \"Build passes\" in verificationSteps. Use \"Files contain correct content\" instead.\n\n## Output format\n\nOutput ONLY a JSON block (no markdown fences, no explanation):\n\n{\"steps\":[{\"file\":\"src/components/Landing.tsx\",\"action\":\"create\",\"description\":\"Main landing page with 6 sections\",\"details\":\"Hero section with gradient background and large headline. Features grid with 3 cards. Testimonials with 3 quotes. Pricing with 3 tiers. CTA band. Footer with 4 columns. Use Tailwind, match existing component patterns from the briefing.\"},{\"file\":\"src/App.tsx\",\"action\":\"modify\",\"description\":\"Add Landing route\",\"details\":\"Import Landing from ./components/Landing. Add Route path=/ element={Landing} inside the existing Routes block.\"}],\"verificationSteps\":[\"Build command exits 0\",\"All sections render with real content — no TODOs or placeholders\",\"Forms have styled inputs with focus states\",\"Responsive layout works at 375px and 1440px\"]}\n\nRules:\n- Every step must specify file path, action (create/modify), description, and details\n- Details must describe WHAT goes in the file — specific sections, specific functionality\n- Do not be vague. \"Add a hero section\" is bad. \"Hero: full viewport height, gradient bg, centered h1 with the business name, subtitle with value proposition, two CTA buttons\" is good.\n- Include verification steps that the verify phase can mechanically check\n- Max 6 steps. If more are needed, combine related changes into one step.`;\n","export const VERIFY_PROMPT = `You are VERIFY — an independent quality inspector. A builder just finished implementing code. Your job: determine if the mission is COMPLETE and the code is PRODUCTION-READY.\n\nYou MUST use your tools. Do NOT guess. Read every file that was created or modified.\n\n## Verification protocol (follow ALL steps in order)\n\n### 1. BUILD CHECK (mandatory unless static project)\nIf the task says \"Build: none needed\" or \"static project\" — SKIP this step, set buildPassed to true, and go straight to step 2. Static HTML/CSS/JS files don't need a build step.\nOtherwise: run the build command from the plan. If it fails, FAIL immediately with the exact error.\nCommon build commands: check package.json scripts for \"build\", \"dev\", or \"typecheck\".\n\n### 2. FILE-BY-FILE COMPLETENESS CHECK (mandatory)\nFor EACH file in the plan's steps:\n- Use read_file to read the full file\n- Is it fully implemented? (no TODOs, no placeholder text like \"Lorem ipsum\", no empty function bodies, no \"Feature 1\" generic text)\n- Are all imports valid? (use find_files to verify imported paths exist)\n- For frontend components: count the distinct sections. Does the count match the plan?\n- For backend: are all endpoints implemented with request validation and error handling?\n\n### 3. QUALITY CHECK (mandatory)\nRead the main files again with a critical eye:\n- Are styles consistent throughout? (same spacing values, same color palette, same typography)\n- Do forms have styled inputs? (padding, border, rounded corners, focus ring — NOT browser defaults)\n- Do buttons have hover states and transitions?\n- Is there dead code, console.logs, or commented-out blocks?\n- Is the content realistic and specific to the business? (not generic \"Welcome to Our Website\")\n\n### 4. PLAN COMPLIANCE (mandatory)\nGo through each step in the plan. For each one: was it implemented? Mark it done or missing.\nGo through each verification step. For each one: does it pass?\n\n## Output format\n\nOutput ONLY a JSON block (no markdown fences):\n\n{\"passed\":false,\"buildPassed\":true,\"filesChecked\":[\"src/components/Landing.tsx\",\"src/App.tsx\"],\"planCompliance\":[{\"step\":\"Create Landing.tsx with 6 sections\",\"done\":true,\"issues\":[\"Pricing section has 1 tier, plan says 3\"]},{\"step\":\"Modify App.tsx with route\",\"done\":true,\"issues\":[]}],\"completenessIssues\":[\"Pricing section has only 1 tier — plan requires 3 with highlighted middle\",\"Footer has only copyright — plan requires 4-column grid\"],\"qualityIssues\":[\"Contact form inputs have no focus ring styling\"],\"summary\":\"4 of 6 sections complete. Pricing and footer need work.\"}\n\n## Standards\n- Be THOROUGH. Read every file. Run the build. Count sections.\n- If the plan says 6 sections and you count 4, that is a FAIL — list the missing ones.\n- If any text says \"Lorem ipsum\", \"Feature 1\", \"Your Business Name\", or \"TODO\" — FAIL.\n- If the build fails — FAIL with the exact error.\n- Only PASS when you would confidently deploy this.`;\n","import { runAgentSession, type RunAgentSessionResult } from '../agent/index.js';\nimport { getAllowedToolNamesForRole } from '../tools/index.js';\nimport { selectAgentModel, getModelOptions } from './model-selector.js';\nimport { getSpecialist, detectSpecialistFromTask } from './specialists/index.js';\nimport { loadSkills, getSkillsForSpecialist } from '../context/skills.js';\nimport { loadProjectRules, formatProjectRulesForPrompt } from '../context/project-rules.js';\nimport { EXPLORE_PROMPT } from './prompts/explore.js';\nimport { PLAN_PHASE_PROMPT } from './prompts/plan-phase.js';\nimport { BUILDER_PROMPT } from './prompts/builder.js';\nimport { VERIFY_PROMPT } from './prompts/verify.js';\nimport type { TaskComplexity } from './types.js';\nimport type { SpecialistType } from './specialists/types.js';\nimport type { WorkerTaskReporter } from './runtime.js';\nimport type { AgentMode } from '../agent/tools.js';\n\nexport interface DeepLoopInput {\n task: string;\n cwd: string;\n complexity: TaskComplexity;\n specialist?: SpecialistType;\n signal?: AbortSignal;\n reporter?: WorkerTaskReporter;\n mode?: AgentMode;\n /** Conversation history — so follow-up prompts have context about what was built before. */\n history?: Array<{ role: 'user' | 'assistant'; content: string }>;\n}\n\nexport interface DeepLoopResult {\n response: string;\n model: string;\n inputTokens: number;\n outputTokens: number;\n cost: number;\n duration: number;\n phases: {\n explore: { duration: number; cost: number };\n plan: { duration: number; cost: number };\n implement: { duration: number; cost: number; attempts: number };\n verify: { duration: number; cost: number; passed: boolean };\n };\n}\n\ninterface ExploreBriefing {\n stack: string;\n buildCommand: string;\n projectRoot?: string;\n structure: string;\n existingPatterns: string;\n relevantFiles: Array<{ path: string; snippet: string; why: string }>;\n dependencies: string[];\n concerns: string;\n}\n\ninterface PlanOutput {\n steps: Array<{ file: string; action: string; description: string; details: string }>;\n verificationSteps: string[];\n}\n\ninterface VerifyOutput {\n passed: boolean;\n buildPassed: boolean;\n filesChecked: string[];\n planCompliance: Array<{ step: string; done: boolean; issues: string[] }>;\n completenessIssues: string[];\n qualityIssues: string[];\n summary: string;\n}\n\nconst MAX_VERIFY_RETRIES = 1;\n\nconst IMPLEMENT_ITERATIONS: Record<TaskComplexity, number> = {\n trivial: 10,\n simple: 20,\n moderate: 35,\n complex: 50,\n};\n\nconst STATIC_STACKS = /\\b(static\\s*html|vanilla\\s*html|plain\\s*html|no\\s*framework)\\b/i;\nconst STATIC_BUILD_NONE = /\\bnone\\b/i;\n\nfunction isStaticProject(briefing: ExploreBriefing): boolean {\n if (STATIC_BUILD_NONE.test(briefing.buildCommand)) return true;\n if (STATIC_STACKS.test(briefing.stack)) return true;\n // No framework deps and only HTML/CSS/JS files → static\n const frameworkDeps = ['react', 'vue', 'svelte', 'next', 'nuxt', 'angular', 'vite', 'webpack', 'parcel', 'typescript'];\n const hasFramework = briefing.dependencies.some((d) => frameworkDeps.some((f) => d.toLowerCase().includes(f)));\n if (!hasFramework && briefing.relevantFiles.every((f) => /\\.(html?|css|js)$/.test(f.path))) return true;\n return false;\n}\n\nexport async function runDeepLoop(input: DeepLoopInput): Promise<DeepLoopResult> {\n const { task, cwd, complexity, signal, reporter, mode, history } = input;\n // Resolve specialist — never stay on 'general' if the task clearly implies a domain\n const specialist = input.specialist && input.specialist !== 'general'\n ? input.specialist\n : detectSpecialistFromTask(task);\n const startTime = Date.now();\n\n // Build conversation context so follow-up prompts have memory of what was discussed\n const conversationContext = buildConversationContext(history);\n const totals = { inputTokens: 0, outputTokens: 0, cost: 0 };\n const phaseTimes: DeepLoopResult['phases'] = {\n explore: { duration: 0, cost: 0 },\n plan: { duration: 0, cost: 0 },\n implement: { duration: 0, cost: 0, attempts: 0 },\n verify: { duration: 0, cost: 0, passed: false },\n };\n\n // ── PHASE 1: EXPLORE ────────────────────────────────────────────────────\n await reporter?.progress('reading codebase');\n\n const exploreModel = selectAgentModel('explore', complexity);\n const exploreStart = Date.now();\n\n const exploreSession = await runAgentSession(\n [\n `Task: ${task}`,\n conversationContext,\n 'Explore the codebase and produce a JSON briefing. Do NOT write code.',\n ].filter(Boolean).join('\\n\\n'),\n {\n cwd,\n model: exploreModel,\n signal,\n mode: mode ?? 'auto',\n toolNames: ['read_file', 'grep_files', 'find_files', 'list_dir'],\n systemPrompt: EXPLORE_PROMPT,\n maxIterations: 15,\n maxTokens: 8192,\n providerOptions: getModelOptions('explore', complexity),\n },\n );\n\n phaseTimes.explore = { duration: Date.now() - exploreStart, cost: exploreSession.cost };\n totals.inputTokens += exploreSession.inputTokens;\n totals.outputTokens += exploreSession.outputTokens;\n totals.cost += exploreSession.cost;\n\n const briefing = parseJSON<ExploreBriefing>(exploreSession.output) ?? {\n stack: 'unknown',\n buildCommand: 'npm run build',\n structure: '',\n existingPatterns: '',\n relevantFiles: [],\n dependencies: [],\n concerns: exploreSession.output.slice(0, 500),\n };\n\n // ── Smart build detection: skip build for static HTML projects ──────────\n if (isStaticProject(briefing)) {\n briefing.buildCommand = 'none';\n }\n\n await reporter?.log(`${briefing.stack} · ${briefing.relevantFiles.length} files`);\n\n // ── PHASE 2: PLAN ───────────────────────────────────────────────────────\n await reporter?.progress('planning approach');\n\n const planModel = selectAgentModel('plan', complexity);\n const planStart = Date.now();\n\n const briefingText = JSON.stringify(briefing, null, 2);\n const planSession = await runAgentSession(\n [\n `Task: ${task}`,\n conversationContext,\n `Explore briefing:\\n${briefingText}`,\n 'Create an implementation plan. Output JSON only.',\n ].filter(Boolean).join('\\n\\n'),\n {\n cwd,\n model: planModel,\n signal,\n mode: mode ?? 'auto',\n toolNames: [],\n systemPrompt: PLAN_PHASE_PROMPT,\n maxIterations: 1,\n maxTokens: complexity === 'complex' ? 8192 : 6144,\n providerOptions: getModelOptions('plan', complexity),\n },\n );\n\n phaseTimes.plan = { duration: Date.now() - planStart, cost: planSession.cost };\n totals.inputTokens += planSession.inputTokens;\n totals.outputTokens += planSession.outputTokens;\n totals.cost += planSession.cost;\n\n const plan = parseJSON<PlanOutput>(planSession.output) ?? {\n steps: [{ file: 'unknown', action: 'create', description: task, details: planSession.output.slice(0, 500) }],\n verificationSteps: ['Build passes'],\n };\n\n const planPreview = plan.steps.map((s) => `${s.action}: ${s.file}`).join(', ');\n await reporter?.log(`plan: ${planPreview}`);\n\n // ── Build system prompt for implement phase ─────────────────────────────\n const implementSystemParts: string[] = [\n 'You are a BUILDER. Follow the implementation plan step by step.',\n 'The plan was created by a senior architect who analyzed the codebase. Trust it.',\n ];\n\n if (specialist) {\n implementSystemParts.push(getSpecialist(specialist).systemPrompt);\n try {\n const skills = loadSkills(cwd);\n const matched = getSkillsForSpecialist(skills, specialist);\n if (matched.length > 0) {\n implementSystemParts.push(\n `<skills>\\n${matched.map((s) => `<skill name=\"${s.name}\">\\n${s.content}\\n</skill>`).join('\\n\\n')}\\n</skills>`,\n );\n }\n } catch { /* ignore */ }\n }\n\n implementSystemParts.push(BUILDER_PROMPT);\n implementSystemParts.push(`Repository root: ${cwd}`);\n\n try {\n const rules = await loadProjectRules(cwd);\n if (rules) implementSystemParts.push(formatProjectRulesForPrompt(rules));\n } catch { /* ignore */ }\n\n const implementSystemPrompt = implementSystemParts.join('\\n\\n');\n\n // ── Build implement task with plan + briefing context ───────────────────\n const briefingContext = briefing.relevantFiles\n .map((f) => `<file path=\"${f.path}\" why=\"${f.why}\">\\n${f.snippet}\\n</file>`)\n .join('\\n\\n');\n\n const planText = plan.steps\n .map((s, i) => `${i + 1}. [${s.action}] ${s.file}: ${s.description}\\n ${s.details}`)\n .join('\\n\\n');\n\n const buildImplementTask = (retryIssues?: string) => {\n const parts = [\n `Task: ${task}`,\n conversationContext,\n `Stack: ${briefing.stack}`,\n briefing.buildCommand !== 'none'\n ? `Build command: ${briefing.buildCommand}`\n : 'Build: none needed (static project — no build step, verify by reading files only)',\n briefingContext ? `Reference files:\\n${briefingContext}` : null,\n `Implementation plan:\\n${planText}`,\n retryIssues ? `RETRY — the verifier found these issues. Fix ONLY these:\\n${retryIssues}` : null,\n briefing.buildCommand !== 'none'\n ? 'Follow the plan step by step. Implement every step completely. Run the build when done.'\n : 'Follow the plan step by step. Implement every step completely. No build step needed — re-read your files to verify correctness.',\n ];\n return parts.filter(Boolean).join('\\n\\n');\n };\n\n // ── PHASE 3 + 4: IMPLEMENT → VERIFY loop ──────────────────────────────\n let lastImplementOutput = '';\n let verifyResult: VerifyOutput | null = null;\n\n for (let attempt = 0; attempt <= MAX_VERIFY_RETRIES; attempt++) {\n // ── IMPLEMENT ──\n const isRetry = attempt > 0;\n const retryIssues = verifyResult\n ? [...verifyResult.completenessIssues, ...verifyResult.qualityIssues].join('\\n')\n : undefined;\n\n await reporter?.progress(isRetry ? `fixing issues (attempt ${attempt + 1})` : 'writing code');\n\n const implModel = selectAgentModel('builder', complexity);\n const implStart = Date.now();\n\n const implSession = await runAgentSession(\n buildImplementTask(retryIssues),\n {\n cwd,\n model: implModel,\n signal,\n mode: mode ?? 'auto',\n toolNames: getAllowedToolNamesForRole('builder'),\n systemPrompt: implementSystemPrompt,\n maxIterations: IMPLEMENT_ITERATIONS[complexity] ?? 35,\n maxTokens: 16384,\n providerOptions: getModelOptions('builder', complexity),\n },\n );\n\n const implDuration = Date.now() - implStart;\n phaseTimes.implement.duration += implDuration;\n phaseTimes.implement.cost += implSession.cost;\n phaseTimes.implement.attempts = attempt + 1;\n totals.inputTokens += implSession.inputTokens;\n totals.outputTokens += implSession.outputTokens;\n totals.cost += implSession.cost;\n lastImplementOutput = implSession.output;\n\n await reporter?.log(`code written (${(implDuration / 1000).toFixed(1)}s)`);\n\n // ── VERIFY ──\n await reporter?.progress('checking quality');\n\n const verifyModel = selectAgentModel('verify', complexity);\n const verifyStart = Date.now();\n\n const noBuild = briefing.buildCommand === 'none';\n const verifyTask = [\n `Original task: ${task}`,\n noBuild\n ? 'Build: none needed (static project). Skip the build check — set buildPassed to true. Verify by reading files only.'\n : `Build command: ${briefing.buildCommand}`,\n `Implementation plan:\\n${planText}`,\n `Verification criteria:\\n${plan.verificationSteps.filter((v) => noBuild ? !/build/i.test(v) : true).map((v, i) => `${i + 1}. ${v}`).join('\\n')}`,\n `Files the builder claims to have changed:\\n${plan.steps.map((s) => ` ${s.action}: ${s.file}`).join('\\n')}`,\n noBuild\n ? 'Read every file listed above. Check completeness against the plan. Output JSON only.'\n : 'Read every file listed above. Run the build. Check completeness against the plan. Output JSON only.',\n ].join('\\n\\n');\n\n const verifySession = await runAgentSession(verifyTask, {\n cwd,\n model: verifyModel,\n signal,\n mode: mode ?? 'auto',\n toolNames: ['read_file', 'grep_files', 'find_files', 'list_dir', 'bash', 'run_tests'],\n systemPrompt: VERIFY_PROMPT,\n maxIterations: 15,\n maxTokens: 8192,\n providerOptions: getModelOptions('verify', complexity),\n });\n\n const verifyDuration = Date.now() - verifyStart;\n phaseTimes.verify.duration += verifyDuration;\n phaseTimes.verify.cost += verifySession.cost;\n totals.inputTokens += verifySession.inputTokens;\n totals.outputTokens += verifySession.outputTokens;\n totals.cost += verifySession.cost;\n\n verifyResult = parseJSON<VerifyOutput>(verifySession.output) ?? {\n passed: false,\n buildPassed: false,\n filesChecked: [],\n planCompliance: [],\n completenessIssues: ['Could not parse verify output'],\n qualityIssues: [],\n summary: verifySession.output.slice(0, 300),\n };\n\n phaseTimes.verify.passed = verifyResult.passed;\n\n if (verifyResult.passed) {\n await reporter?.log(`quality check passed: ${verifyResult.summary}`);\n break;\n }\n\n const issueCount = verifyResult.completenessIssues.length + verifyResult.qualityIssues.length;\n await reporter?.log(\n `${issueCount} issues found: ${verifyResult.summary}`,\n );\n\n if (attempt >= MAX_VERIFY_RETRIES) {\n await reporter?.log('max retries — moving to final review');\n }\n }\n\n return {\n response: lastImplementOutput,\n model: selectAgentModel('builder', complexity),\n inputTokens: totals.inputTokens,\n outputTokens: totals.outputTokens,\n cost: totals.cost,\n duration: Date.now() - startTime,\n phases: phaseTimes,\n };\n}\n\nfunction parseJSON<T>(text: string): T | null {\n try {\n const match = text.match(/\\{[\\s\\S]*\\}/);\n if (match) return JSON.parse(match[0]) as T;\n } catch { /* ignore */ }\n return null;\n}\n\n/**\n * Build conversation context from history.\n * User messages: full (they're short — requests + feedback).\n * Assistant messages: truncated (they contain huge code dumps — keep first 500 chars as summary).\n * Last 4 messages (2 turns) — enough to know what was built and what feedback was given.\n */\nfunction buildConversationContext(\n history?: Array<{ role: 'user' | 'assistant'; content: string }>,\n): string | null {\n if (!history || history.length === 0) return null;\n\n const recent = history.slice(-4);\n const lines = recent.map((m) => {\n if (m.role === 'user') {\n return `User: ${m.content}`;\n }\n // Assistant messages may contain full code output — summarize\n const summary = m.content.length > 500\n ? m.content.slice(0, 500) + '\\n[... truncated — read actual files on disk to see current state]'\n : m.content;\n return `Assistant: ${summary}`;\n });\n\n return `<conversation_history>\\n${lines.join('\\n\\n')}\\n</conversation_history>`;\n}\n","import { readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { runAgentSession, type RunAgentOptions } from '../agent/index.js';\nimport { getAllowedToolNamesForRole } from '../tools/index.js';\nimport { compressContext } from '../context/compress.js';\nimport { estimateTokens } from '../context/budget.js';\nimport { getTier } from '../providers/tiers.js';\nimport { loadIndex, indexProject, searchRelevantFiles, extractKeywords } from '../context/index.js';\nimport { loadProjectRules, formatProjectRulesForPrompt } from '../context/project-rules.js';\nimport {\n formatSessionMemoryForPrompt,\n formatSessionMemorySummary,\n getSessionMemoryCandidateFiles,\n isReferentialTask,\n loadSessionMemory,\n loadSessionMemorySnapshot,\n} from '../context/session-memory.js';\nimport { loadSkills, getSkillsForSpecialist } from '../context/skills.js';\nimport { getSpecialist } from './specialists/index.js';\nimport { SCOUT_PROMPT } from './prompts/scout.js';\nimport { ARCHITECT_PROMPT } from './prompts/architect.js';\nimport { BUILDER_PROMPT } from './prompts/builder.js';\nimport { REVIEWER_PROMPT } from './prompts/reviewer.js';\nimport { parseArchitectResponse } from './architect.js';\nimport { classifyTaskHeuristically, parseScoutResponse } from './scout.js';\nimport { parseReviewerResponseFull } from './reviewer.js';\nimport { selectAgentModel, getModelOptions } from './model-selector.js';\nimport { inferBuilderTaskIntent, type BuilderTaskIntent } from './task-intent.js';\nimport { runDeepLoop } from './deep-loop.js';\nimport type { AgentInput, ArchitectOutput, ReviewerOutput, ScoutOutput, TaskComplexity } from './types.js';\nimport type { Hotspot, SearchResult } from '../context/search.js';\nimport type { SpecialistType } from './specialists/types.js';\nimport type { AgentLoopChunk } from '../agent/loop.js';\nimport type { AgentMode } from '../agent/tools.js';\nimport type { ModelId } from '../providers/types.js';\nimport type { WorkerTaskReporter } from './runtime.js';\n\ninterface SharedWorkerOptions {\n cwd: string;\n signal?: AbortSignal;\n reporter?: WorkerTaskReporter;\n mode?: AgentMode;\n onApprovalNeeded?: RunAgentOptions['onApprovalNeeded'];\n onDiffProposed?: RunAgentOptions['onDiffProposed'];\n onIterationApprovalNeeded?: RunAgentOptions['onIterationApprovalNeeded'];\n}\n\nexport interface BuilderWorkerResult {\n response: string;\n model: ModelId;\n inputTokens: number;\n outputTokens: number;\n cost: number;\n duration: number;\n}\n\ninterface ScoutWorkerDecision {\n complexity: TaskComplexity;\n relevantKeywords: string[];\n candidateFiles: string[];\n reasoning?: string;\n}\n\nexport async function runScoutWorkerAgent(args: {\n input: AgentInput;\n} & SharedWorkerOptions): Promise<ScoutOutput> {\n const { input, cwd, signal, reporter } = args;\n const model = selectAgentModel('scout', 'simple');\n const startTime = Date.now();\n const sessionMemory = await loadSessionMemory(cwd).catch(() => null);\n const sessionSnapshot = sessionMemory?.snapshot ?? await loadSessionMemorySnapshot(cwd).catch(() => null);\n\n await reporter?.progress('classifying task');\n\n let decision: ScoutWorkerDecision;\n let responseText = '';\n let metrics = {\n model,\n inputTokens: 0,\n outputTokens: 0,\n cost: 0,\n duration: 0,\n };\n\n const heuristicComplexity = classifyTaskHeuristically(input.task);\n if (heuristicComplexity) {\n const relevantKeywords = extractKeywords(input.task);\n decision = {\n complexity: heuristicComplexity,\n relevantKeywords,\n candidateFiles: [],\n reasoning: 'heuristic classification',\n };\n responseText = JSON.stringify(decision, null, 2);\n // Internal: don't surface mechanism details to user\n } else {\n const systemPrompt = await buildScoutWorkerSystemPrompt(cwd, sessionMemory);\n const scoutPrompt = buildScoutTaskPrompt(input.task, input.history);\n\n const session = await runAgentSession(scoutPrompt, {\n cwd,\n model,\n signal,\n mode: args.mode,\n toolNames: getAllowedToolNamesForRole('scout'),\n systemPrompt,\n maxIterations: 12,\n providerOptions: getModelOptions('scout', 'simple'),\n onApprovalNeeded: wrapApprovalCallback('scout', reporter, args.onApprovalNeeded),\n onDiffProposed: wrapDiffApprovalCallback('scout', reporter, args.onDiffProposed),\n onIterationApprovalNeeded: wrapIterationApprovalCallback('scout', reporter, args.onIterationApprovalNeeded),\n onChunk: (chunk) => handleWorkerChunk(chunk, reporter),\n });\n\n if (session.stoppedReason === 'error') {\n throw new Error(session.error ?? 'Scout agent failed');\n }\n\n responseText = session.output;\n decision = parseScoutWorkerResponse(session.output, input.task);\n metrics = {\n model: session.model,\n inputTokens: session.inputTokens,\n outputTokens: session.outputTokens,\n cost: session.cost,\n duration: session.duration,\n };\n }\n\n await reporter?.progress('searching relevant files');\n\n let relevantFiles: SearchResult[] = [];\n if (decision.complexity !== 'trivial') {\n try {\n let index = await loadIndex(cwd);\n if (!index || index.totalFiles === 0) {\n await reporter?.log('indexing project');\n index = await indexProject(cwd);\n }\n if (index && index.totalFiles > 0) {\n const maxFiles = getScoutMaxFiles(decision.complexity);\n const useMemory = isReferentialTask(input.task);\n const searchQuery = buildScoutSearchQuery(\n input.task,\n decision.relevantKeywords,\n input.history,\n useMemory && sessionSnapshot ? formatSessionMemorySummary(sessionSnapshot) : undefined,\n );\n relevantFiles = await searchRelevantFiles(cwd, searchQuery, index, {\n maxFiles,\n alwaysInclude: useMemory\n ? uniqueStrings([...decision.candidateFiles, ...getSessionMemoryCandidateFiles(sessionSnapshot)])\n : decision.candidateFiles,\n });\n }\n } catch {\n // Ignore index/search failures and fall back below.\n }\n\n if (relevantFiles.length === 0) {\n try {\n const { gatherRelevantFilesFallback } = await import('../pipeline/fallback-search.js');\n relevantFiles = await gatherRelevantFilesFallback(cwd, input.task);\n } catch {\n // Proceed without files.\n }\n }\n }\n\n const { extractHotspots } = await import('../context/search.js');\n const scoutHotspots = extractHotspots(relevantFiles, input.task);\n const fileSummary = relevantFiles.length > 0\n ? `${relevantFiles.length} files: ${relevantFiles.map((file) => file.path).join(', ')}`\n : 'no files found';\n\n return {\n result: responseText || `complexity=${decision.complexity}, ${fileSummary}`,\n complexity: decision.complexity,\n relevantFiles,\n hotspots: scoutHotspots,\n fileSummary,\n model: metrics.model,\n inputTokens: metrics.inputTokens,\n outputTokens: metrics.outputTokens,\n cost: metrics.cost,\n duration: metrics.duration || (Date.now() - startTime),\n };\n}\n\nexport async function runArchitectWorkerAgent(args: {\n input: AgentInput;\n complexity: TaskComplexity;\n searchResults: SearchResult[];\n hotspots?: Hotspot[];\n} & SharedWorkerOptions): Promise<ArchitectOutput> {\n const { input, complexity, searchResults, hotspots = [], cwd, signal, reporter } = args;\n const model = selectAgentModel('architect', complexity);\n const sessionMemory = await loadSessionMemory(cwd).catch(() => null);\n const systemPrompt = await buildArchitectWorkerSystemPrompt(cwd, sessionMemory);\n const taskPrompt = buildArchitectTaskPrompt(input.task, searchResults, model, input.history, hotspots);\n\n await reporter?.progress('planning implementation');\n\n const session = await runAgentSession(taskPrompt, {\n cwd,\n model,\n signal,\n mode: args.mode,\n toolNames: getAllowedToolNamesForRole('architect'),\n systemPrompt,\n maxIterations: 20,\n maxTokens: 16384,\n providerOptions: getModelOptions('architect', complexity),\n onApprovalNeeded: wrapApprovalCallback('architect', reporter, args.onApprovalNeeded),\n onDiffProposed: wrapDiffApprovalCallback('architect', reporter, args.onDiffProposed),\n onIterationApprovalNeeded: wrapIterationApprovalCallback('architect', reporter, args.onIterationApprovalNeeded),\n onChunk: (chunk) => handleWorkerChunk(chunk, reporter),\n });\n\n if (session.stoppedReason === 'error') {\n throw new Error(session.error ?? 'Architect agent failed');\n }\n\n const parsed = parseArchitectResponse(session.output);\n\n return {\n result: session.output,\n type: parsed.type,\n plan: parsed.plan,\n subtasks: parsed.subtasks,\n model: session.model,\n inputTokens: session.inputTokens,\n outputTokens: session.outputTokens,\n cost: session.cost,\n duration: session.duration,\n };\n}\n\nexport async function runBuilderWorkerAgent(args: {\n input: AgentInput;\n complexity: TaskComplexity;\n plan?: string;\n searchResults: SearchResult[];\n specialist?: SpecialistType;\n scopeDirectory?: string;\n entryFiles?: string[];\n researchSummary?: string;\n builderBrief?: string;\n writeTargets?: string[];\n gateMode?: string;\n} & SharedWorkerOptions): Promise<BuilderWorkerResult> {\n const {\n input,\n complexity,\n plan,\n searchResults,\n specialist,\n scopeDirectory,\n entryFiles,\n researchSummary,\n builderBrief,\n writeTargets,\n gateMode,\n cwd,\n signal,\n reporter,\n } = args;\n const model = selectAgentModel('builder', complexity, gateMode);\n\n // Deep loop only for moderate+ tasks WITHOUT an architect plan.\n // Simple tasks with a plan → just execute it directly, no extra explore/plan cycle.\n const hasPlan = !!(args.plan || args.researchSummary);\n const useDeepLoop = complexity !== 'trivial' && complexity !== 'simple' && !hasPlan;\n\n if (useDeepLoop) {\n await reporter?.log('analyzing code');\n const result = await runDeepLoop({\n task: input.task,\n cwd,\n complexity,\n specialist,\n signal,\n reporter,\n mode: args.mode,\n history: input.history,\n });\n\n await reporter?.log(\n `done · ${result.phases.implement.attempts} attempt${result.phases.implement.attempts > 1 ? 's' : ''} · ` +\n `${result.phases.verify.passed ? 'verified' : 'needs review'} · ` +\n `${(result.duration / 1000).toFixed(1)}s · $${result.cost.toFixed(4)}`,\n );\n\n return {\n response: result.response,\n model: result.model as import('../providers/types.js').ModelId,\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n cost: result.cost,\n duration: result.duration,\n };\n }\n\n const intent = inferBuilderTaskIntent(input.task);\n\n // ── Surface specialist + skills selection to TUI ──\n // Internal: don't surface mechanism details to user\n if (specialist) {\n try {\n const skills = loadSkills(cwd);\n const matched = getSkillsForSpecialist(skills, specialist);\n if (matched.length > 0) {\n // Internal: skills loaded, don't surface to user\n } else {\n // Internal: no skills found, don't surface to user\n }\n } catch {\n // Skills discovery is best-effort.\n }\n }\n\n const sessionMemory = await loadSessionMemory(cwd).catch(() => null);\n const systemPrompt = await buildBuilderWorkerSystemPrompt({\n cwd,\n searchResults,\n specialist,\n model,\n intent,\n scopeDirectory,\n entryFiles,\n researchSummary,\n builderBrief,\n sessionMemoryBlock: sessionMemory ? formatSessionMemoryForPrompt(sessionMemory) : undefined,\n });\n\n const taskPrompt = buildBuilderTaskPrompt({\n task: input.task,\n plan,\n searchResults,\n intent,\n cwd,\n history: input.history,\n scopeDirectory,\n entryFiles,\n researchSummary,\n builderBrief,\n writeTargets,\n });\n const session = await runAgentSession(taskPrompt, {\n cwd,\n model,\n signal,\n mode: args.mode,\n toolNames: getBuilderToolNames(intent),\n systemPrompt,\n maxIterations: 50,\n maxTokens: 16384,\n providerOptions: getModelOptions('builder', complexity),\n onApprovalNeeded: wrapApprovalCallback('builder', reporter, args.onApprovalNeeded),\n onDiffProposed: wrapDiffApprovalCallback('builder', reporter, args.onDiffProposed),\n onIterationApprovalNeeded: wrapIterationApprovalCallback('builder', reporter, args.onIterationApprovalNeeded),\n onChunk: (chunk) => handleWorkerChunk(chunk, reporter),\n });\n\n if (session.stoppedReason === 'error') {\n throw new Error(session.error ?? 'Builder agent failed');\n }\n\n return {\n response: session.output,\n model: session.model,\n inputTokens: session.inputTokens,\n outputTokens: session.outputTokens,\n cost: session.cost,\n duration: session.duration,\n };\n}\n\nexport async function runReviewerWorkerAgent(args: {\n input: AgentInput;\n complexity: TaskComplexity;\n allDiffs: string;\n subtaskIds?: string[];\n writeTargets?: string[];\n} & SharedWorkerOptions): Promise<ReviewerOutput> {\n const { input, complexity, allDiffs, subtaskIds = [], writeTargets = [], cwd, signal, reporter } = args;\n const model = selectAgentModel('reviewer', complexity);\n const systemPrompt = await buildReviewerWorkerSystemPrompt(cwd);\n const reviewTask = buildReviewerTaskPrompt(input.task, allDiffs, subtaskIds, writeTargets);\n\n const session = await runAgentSession(reviewTask, {\n cwd,\n model,\n signal,\n mode: args.mode,\n toolNames: getAllowedToolNamesForRole('reviewer'),\n systemPrompt,\n maxIterations: 25,\n maxTokens: 16384,\n providerOptions: getModelOptions('reviewer', complexity),\n onApprovalNeeded: wrapApprovalCallback('reviewer', reporter, args.onApprovalNeeded),\n onDiffProposed: wrapDiffApprovalCallback('reviewer', reporter, args.onDiffProposed),\n onIterationApprovalNeeded: wrapIterationApprovalCallback('reviewer', reporter, args.onIterationApprovalNeeded),\n onChunk: (chunk) => handleWorkerChunk(chunk, reporter),\n });\n\n if (session.stoppedReason === 'error') {\n throw new Error(session.error ?? 'Reviewer agent failed');\n }\n\n const parsed = parseReviewerResponseFull(session.output);\n const inputTokens = Math.ceil(reviewTask.length / 4);\n const outputTokens = Math.ceil(session.output.length / 4);\n\n return {\n result: session.output,\n approved: parsed.approved,\n feedback: parsed.feedback,\n subtaskFeedback: parsed.subtaskFeedback,\n model: session.model,\n inputTokens: session.inputTokens || inputTokens,\n outputTokens: session.outputTokens || outputTokens,\n cost: session.cost,\n duration: session.duration,\n };\n}\n\nasync function buildBuilderWorkerSystemPrompt(args: {\n cwd: string;\n searchResults: SearchResult[];\n specialist?: SpecialistType;\n model: ModelId;\n intent: BuilderTaskIntent;\n scopeDirectory?: string;\n entryFiles?: string[];\n researchSummary?: string;\n builderBrief?: string;\n sessionMemoryBlock?: string;\n}): Promise<string> {\n const scopeDirectories = deriveScopeDirectories(args.searchResults);\n const isAnalysis = args.intent === 'analysis';\n\n // ── 1. Identity: WHO I AM ──────────────────────────────────────────────────\n const parts: string[] = [\n isAnalysis\n ? 'You are a scoped Mint ANALYSIS worker running inside the multi-agent pipeline.'\n : 'You are a scoped Mint BUILDER worker running inside the multi-agent pipeline.',\n ];\n\n // ── 2. Specialist persona (FIRST — establishes domain expertise) ───────────\n if (args.specialist) {\n parts.push(getSpecialist(args.specialist).systemPrompt);\n }\n\n // ── 3. Project skills/conventions (SECOND — defines how to apply expertise) ─\n if (args.specialist) {\n try {\n const skills = loadSkills(args.cwd);\n const matching = getSkillsForSpecialist(skills, args.specialist);\n if (matching.length > 0) {\n parts.push(\n `<skills>\\n${matching.map((s) => `<skill name=\"${s.name}\">\\n${s.content}\\n</skill>`).join('\\n\\n')}\\n</skills>`,\n );\n }\n } catch {\n // Ignore skill loading errors.\n }\n }\n\n // ── 4. Output format + behavioral instructions ────────────────────────────\n parts.push(BUILDER_PROMPT);\n parts.push(\n 'IMPORTANT: Before writing ANY code, use read_file to read the target files first. Understand what exists before changing it.',\n isAnalysis\n ? 'Use read/search tools to inspect the assigned scope and nearby dependencies. Do not modify files.'\n : 'Use tools to inspect the assigned scope, discover nearby dependencies, and edit only when required.',\n 'Start by checking the most relevant directory or file cluster before broad exploration.',\n 'Stay within the assigned scope unless you discover a hard dependency.',\n isAnalysis\n ? 'Finish with concise findings, concrete improvement suggestions, and the files you inspected. Do not output diffs.'\n : 'Always finish with a brief explanation followed by unified diff blocks.',\n 'Treat the architect handoff as the authoritative starting point. Do not spend time rediscovering the whole repository unless the handoff is clearly incomplete.',\n `Repository root: ${args.cwd}`,\n );\n\n // ── 5. Architect handoff (WHERE to start + WHAT to do) ────────────────────\n if (args.scopeDirectory || (args.entryFiles && args.entryFiles.length > 0) || args.researchSummary || args.builderBrief) {\n parts.push([\n '<architect_handoff>',\n args.scopeDirectory ? `Start directory: ${args.scopeDirectory}` : undefined,\n args.entryFiles && args.entryFiles.length > 0 ? `Read first:\\n${args.entryFiles.join('\\n')}` : undefined,\n args.researchSummary ? `Research summary:\\n${args.researchSummary}` : undefined,\n args.builderBrief ? `Tutorial:\\n${args.builderBrief}` : undefined,\n '</architect_handoff>',\n ].filter(Boolean).join('\\n'));\n }\n\n if (args.sessionMemoryBlock) {\n parts.push(`${args.sessionMemoryBlock}\\nUse this only to resolve continuation, rollback, or referential requests.`);\n }\n\n // ── 6. Scope hints ────────────────────────────────────────────────────────\n if (scopeDirectories.length > 0) {\n parts.push(`<scope_hints>\\nPrimary directories:\\n${scopeDirectories.join('\\n')}\\n</scope_hints>`);\n }\n\n // ── 7. Project tree (WHERE everything lives) ──────────────────────────────\n try {\n const tree = await buildProjectTree(args.cwd);\n parts.push(`<project_tree>\\n${tree}\\n</project_tree>`);\n } catch {\n // Ignore tree failures.\n }\n\n // ── 8. Project rules (MINT.md conventions) ────────────────────────────────\n try {\n const rules = await loadProjectRules(args.cwd);\n if (rules) {\n parts.push(formatProjectRulesForPrompt(rules));\n }\n } catch {\n // Ignore missing rules.\n }\n\n // ── 9. Assigned file context (WHAT files to work with) ────────────────────\n const compressed = compressContext(\n args.searchResults.map((file) => ({\n path: file.path,\n content: file.content,\n language: file.language,\n })),\n getTier(args.model),\n ).files;\n const fileBlocks: string[] = [];\n let budget = 8000;\n for (const file of compressed) {\n const block = `<file path=\"${file.path}\">\\n${file.content}\\n</file>`;\n const tokens = estimateTokens(block);\n if (tokens > budget) break;\n budget -= tokens;\n fileBlocks.push(block);\n }\n if (fileBlocks.length > 0) {\n parts.push(`<assigned_context files=\"${fileBlocks.length}\">\\n${fileBlocks.join('\\n\\n')}\\n</assigned_context>`);\n }\n\n return parts.join('\\n\\n');\n}\n\nasync function buildScoutWorkerSystemPrompt(\n cwd: string,\n sessionMemory?: Awaited<ReturnType<typeof loadSessionMemory>> | null,\n): Promise<string> {\n const parts: string[] = [\n 'You are a scoped Mint SCOUT worker.',\n 'Your job is to classify task complexity and identify likely relevant files.',\n 'Use only read/search tools when needed. Return JSON only.',\n `${SCOUT_PROMPT}\n\nAdditional output fields:\n- include \"candidateFiles\": an array of repo-relative file paths that are likely relevant\n- include \"relevantKeywords\": an array of useful search keywords\n- keep candidateFiles to at most 8 entries`,\n ];\n\n try {\n const rules = await loadProjectRules(cwd);\n if (rules) {\n parts.push(formatProjectRulesForPrompt(rules));\n }\n } catch {\n // Ignore missing rules.\n }\n\n if (sessionMemory) {\n parts.push(`${formatSessionMemoryForPrompt(sessionMemory)}\\nUse this only to resolve references to earlier work.`);\n }\n\n return parts.join('\\n\\n');\n}\n\nasync function buildArchitectWorkerSystemPrompt(\n cwd: string,\n sessionMemory?: Awaited<ReturnType<typeof loadSessionMemory>> | null,\n): Promise<string> {\n const parts: string[] = [\n 'You are a scoped Mint ARCHITECT worker.',\n 'Plan the implementation, split into subtasks when domains differ, and return JSON only.',\n 'Use read/search/web tools if the provided context is insufficient.',\n `Repository root: ${cwd}`,\n ARCHITECT_PROMPT,\n ];\n\n try {\n const tree = await buildProjectTree(cwd);\n parts.push(`<project_tree>\\n${tree}\\n</project_tree>`);\n } catch {\n // Ignore tree failures.\n }\n\n try {\n const rules = await loadProjectRules(cwd);\n if (rules) {\n parts.push(formatProjectRulesForPrompt(rules));\n }\n } catch {\n // Ignore missing rules.\n }\n\n // Inject ALL project skills so architect knows conventions when planning\n try {\n const skills = loadSkills(cwd);\n if (skills.length > 0) {\n parts.push(\n `<skills>\\n${skills.slice(0, 6).map((s) => `<skill name=\"${s.name}\">\\n${s.content}\\n</skill>`).join('\\n\\n')}\\n</skills>`,\n );\n }\n } catch {\n // Ignore skill loading errors.\n }\n\n if (sessionMemory) {\n parts.push(`${formatSessionMemoryForPrompt(sessionMemory)}\\nUse this only to resolve continuation, revert, or pronoun-based follow-ups.`);\n }\n\n return parts.join('\\n\\n');\n}\n\nasync function buildReviewerWorkerSystemPrompt(cwd: string): Promise<string> {\n const parts: string[] = [\n 'You are a scoped Mint REVIEWER worker.',\n 'Use the available tools to inspect diffs, read files, and run focused verification.',\n 'Never modify files. Report only JSON matching the REVIEWER contract.',\n REVIEWER_PROMPT,\n ];\n\n try {\n const rules = await loadProjectRules(cwd);\n if (rules) {\n parts.push(formatProjectRulesForPrompt(rules));\n }\n } catch {\n // Ignore missing rules.\n }\n\n return parts.join('\\n\\n');\n}\n\nfunction buildBuilderTaskPrompt(args: {\n task: string;\n plan: string | undefined;\n searchResults: SearchResult[];\n intent: BuilderTaskIntent;\n cwd: string;\n history?: AgentInput['history'];\n scopeDirectory?: string;\n entryFiles?: string[];\n researchSummary?: string;\n builderBrief?: string;\n writeTargets?: string[];\n}): string {\n const files = args.searchResults.map((file) => file.path);\n return [\n `Task: ${args.task}`,\n `Repository root: ${args.cwd}`,\n formatRecentHistoryBlock(args.history),\n args.scopeDirectory ? `Assigned start directory: ${args.scopeDirectory}` : undefined,\n args.entryFiles && args.entryFiles.length > 0 ? `Read these files first:\\n${args.entryFiles.join('\\n')}` : undefined,\n args.researchSummary ? `Architect research:\\n${args.researchSummary}` : undefined,\n args.builderBrief ? `Architect tutorial:\\n${args.builderBrief}` : undefined,\n args.plan ? `Implementation plan:\\n${args.plan}` : undefined,\n files.length > 0 ? `Context files (read-only reference):\\n${files.join('\\n')}` : undefined,\n args.writeTargets && args.writeTargets.length > 0\n ? `Files to create or modify (authoritative — includes new files):\\n${args.writeTargets.join('\\n')}`\n : undefined,\n args.intent === 'analysis'\n ? 'Inspect the assigned scope and nearby files if needed. Do not modify the project. Return findings, improvement ideas, and the specific files/directories you inspected.'\n : 'Begin in the assigned start directory and entry files. Treat the architect tutorial as your starting map before broad exploration. Use your tools to inspect and edit the project. Return the final proposed changes as unified diffs.',\n ].filter(Boolean).join('\\n\\n');\n}\n\nfunction buildScoutTaskPrompt(task: string, history?: AgentInput['history']): string {\n return [\n `Task: ${task}`,\n formatRecentHistoryBlock(history),\n 'Inspect the repository only as needed and return JSON with complexity, reasoning, candidateFiles, and relevantKeywords.',\n ].join('\\n\\n');\n}\n\nfunction buildArchitectTaskPrompt(\n task: string,\n searchResults: SearchResult[],\n model: ModelId,\n history?: AgentInput['history'],\n hotspots: Hotspot[] = [],\n): string {\n const compressed = compressContext(\n searchResults.map((file) => ({\n path: file.path,\n content: file.content,\n language: file.language,\n })),\n getTier(model),\n ).files;\n\n let fileContext = '';\n let tokenBudget = 7000;\n for (const file of compressed) {\n const block = `<file path=\"${file.path}\">\\n${file.content}\\n</file>\\n`;\n const tokens = estimateTokens(block);\n if (tokens > tokenBudget) break;\n fileContext += block;\n tokenBudget -= tokens;\n }\n\n const hotspotsBlock = hotspots.length > 0\n ? `Hotspots (most relevant lines — reference these line numbers in your plan):\\n${hotspots.map((h) => ` ${h.file}:${h.line} — ${h.content.trim()}`).join('\\n')}`\n : undefined;\n\n return [\n `Task: ${task}`,\n formatRecentHistoryBlock(history),\n fileContext ? `Relevant files:\\n${fileContext}` : undefined,\n hotspotsBlock,\n 'Return JSON only.',\n ].filter(Boolean).join('\\n\\n');\n}\n\nfunction buildReviewerTaskPrompt(\n task: string,\n allDiffs: string,\n subtaskIds: string[],\n writeTargets: string[],\n): string {\n const diffsSlice = allDiffs.slice(0, 12000);\n return [\n `Original task: ${task}`,\n writeTargets.length > 0\n ? `Files written/modified by the builder:\\n${writeTargets.map((f) => ` - ${f}`).join('\\n')}\\nIMPORTANT: Use these exact paths when reading files. Do NOT guess file locations.`\n : undefined,\n `Current proposed changes:\\n${diffsSlice}`,\n subtaskIds.length > 0 ? `Subtask IDs: ${subtaskIds.join(', ')}` : undefined,\n 'Inspect the changes with your tools if needed, then return JSON only.',\n ].filter(Boolean).join('\\n\\n');\n}\n\nasync function handleWorkerChunk(\n chunk: AgentLoopChunk,\n reporter?: WorkerTaskReporter,\n): Promise<void> {\n if (!reporter) return;\n\n switch (chunk.type) {\n case 'tool_call':\n await reporter.progress(describeToolActivity(chunk.toolName ?? 'tool', chunk.toolInput));\n await reporter.log(describeToolLog(chunk.toolName ?? 'tool', chunk.toolInput));\n return;\n case 'tool_result':\n if (chunk.results) {\n for (const result of chunk.results) {\n await reporter.log(summarizeToolResult(result.toolName, result.content));\n }\n }\n return;\n case 'text': {\n return;\n }\n case 'error':\n await reporter.log(`[error] ${chunk.error ?? 'unknown error'}`);\n return;\n default:\n return;\n }\n}\n\nfunction wrapApprovalCallback(\n role: 'scout' | 'architect' | 'builder' | 'reviewer',\n reporter: WorkerTaskReporter | undefined,\n callback: RunAgentOptions['onApprovalNeeded'],\n): RunAgentOptions['onApprovalNeeded'] | undefined {\n if (!callback) return undefined;\n return async (toolName, toolInput) => {\n await reporter?.setStatus('waiting_approval', `${role} waiting for approval on ${toolName}`);\n const approved = await callback(toolName, toolInput);\n await reporter?.setStatus('running', approved ? `${toolName} approved` : `${toolName} rejected`);\n return approved;\n };\n}\n\nfunction wrapDiffApprovalCallback(\n role: 'scout' | 'architect' | 'builder' | 'reviewer',\n reporter: WorkerTaskReporter | undefined,\n callback: RunAgentOptions['onDiffProposed'],\n): RunAgentOptions['onDiffProposed'] | undefined {\n if (!callback) return undefined;\n return async (path, diff) => {\n await reporter?.setStatus('waiting_approval', `${role} waiting for diff approval on ${path}`);\n const approved = await callback(path, diff);\n await reporter?.setStatus('running', approved ? `${path} approved` : `${path} rejected`);\n return approved;\n };\n}\n\nfunction wrapIterationApprovalCallback(\n role: 'scout' | 'architect' | 'builder' | 'reviewer',\n reporter: WorkerTaskReporter | undefined,\n callback: RunAgentOptions['onIterationApprovalNeeded'],\n): RunAgentOptions['onIterationApprovalNeeded'] | undefined {\n if (!callback) return undefined;\n return async (iteration, toolCalls) => {\n await reporter?.setStatus('waiting_approval', `${role} waiting for approval on iteration ${iteration}`);\n const approved = await callback(iteration, toolCalls);\n await reporter?.setStatus('running', approved ? `iteration ${iteration} approved` : `iteration ${iteration} rejected`);\n return approved;\n };\n}\n\nfunction formatPreview(input: Record<string, unknown> | undefined): string {\n if (!input) return '';\n const json = JSON.stringify(input);\n return json.length > 0 ? ` ${json.slice(0, 140)}` : '';\n}\n\nfunction describeToolActivity(\n toolName: string,\n input: Record<string, unknown> | undefined,\n): string {\n const path = typeof input?.path === 'string' ? input.path : undefined;\n const file = typeof input?.file === 'string' ? input.file : undefined;\n const directory = typeof input?.directory === 'string' ? input.directory : undefined;\n const query = typeof input?.query === 'string' ? input.query : undefined;\n const pattern = typeof input?.pattern === 'string' ? input.pattern : undefined;\n const url = typeof input?.url === 'string' ? input.url : undefined;\n const command = typeof input?.command === 'string' ? input.command : undefined;\n\n switch (toolName) {\n case 'read_file':\n return `reading ${path ?? 'file'}`;\n case 'write_file':\n return `writing ${path ?? 'file'}`;\n case 'edit_file':\n return `editing ${path ?? 'file'}`;\n case 'search_replace':\n return `patching ${path ?? 'file'}`;\n case 'grep_files':\n return `searching ${query ?? pattern ?? 'codebase'}${path ? ` in ${path}` : ''}`;\n case 'find_files':\n return `finding files${pattern ? ` matching ${pattern}` : ''}${path ? ` in ${path}` : ''}`;\n case 'list_dir':\n return `listing ${path ?? directory ?? 'directory'}`;\n case 'git_diff':\n return file ? `checking diff for ${file}` : 'checking git diff';\n case 'run_tests':\n return command ? `running ${summarizeCommand(command)}` : 'running tests';\n case 'web_fetch':\n return `fetching ${summarizeUrl(url)}`;\n case 'bash':\n return `running ${summarizeCommand(command)}`;\n default:\n return `using ${toolName}`;\n }\n}\n\nfunction describeToolLog(\n toolName: string,\n input: Record<string, unknown> | undefined,\n): string {\n const activity = describeToolActivity(toolName, input);\n const preview = formatPreview(input);\n return preview ? `${activity}${preview}` : activity;\n}\n\nfunction summarizeToolResult(toolName: string, content: string): string {\n const cleaned = content.replace(/\\s+/g, ' ').trim();\n if (!cleaned) {\n return `${toolName} completed`;\n }\n\n const preview = cleaned.slice(0, 180);\n switch (toolName) {\n case 'grep_files':\n return `search results: ${preview}`;\n case 'find_files':\n case 'list_dir':\n return `found: ${preview}`;\n case 'read_file':\n return `read: ${preview}`;\n case 'git_diff':\n return `diff: ${preview}`;\n case 'run_tests':\n return `tests: ${preview}`;\n case 'bash':\n return `command output: ${preview}`;\n default:\n return `${toolName}: ${preview}`;\n }\n}\n\nfunction summarizeCommand(command: string | undefined): string {\n if (!command || command.trim().length === 0) return 'command';\n const normalized = command.replace(/\\s+/g, ' ').trim();\n const truncated = normalized.slice(0, 72);\n return truncated.length < normalized.length ? `${truncated}...` : truncated;\n}\n\nfunction summarizeUrl(url: string | undefined): string {\n if (!url) return 'URL';\n try {\n const parsed = new URL(url);\n return `${parsed.hostname}${parsed.pathname === '/' ? '' : parsed.pathname}`;\n } catch {\n return url;\n }\n}\n\nfunction getBuilderToolNames(intent: BuilderTaskIntent): string[] {\n if (intent === 'analysis') {\n return ['read_file', 'grep_files', 'find_files', 'list_dir', 'git_diff', 'web_fetch'];\n }\n\n return getAllowedToolNamesForRole('builder');\n}\n\nconst TREE_IGNORE = new Set([\n '.git', 'node_modules', 'dist', 'coverage', '.next', '__pycache__', '.DS_Store', '.turbo',\n]);\n\nasync function buildProjectTree(cwd: string, maxDepth = 3, maxLines = 80): Promise<string> {\n const lines: string[] = ['./'];\n\n async function walk(dir: string, depth: number, prefix: string): Promise<void> {\n if (lines.length >= maxLines || depth > maxDepth) return;\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n const filtered = entries\n .filter((e) => !TREE_IGNORE.has(e.name))\n .sort((a, b) => {\n if (a.isDirectory() !== b.isDirectory()) return a.isDirectory() ? -1 : 1;\n return a.name.localeCompare(b.name);\n });\n for (let i = 0; i < filtered.length; i++) {\n if (lines.length >= maxLines) {\n lines.push(`${prefix}...`);\n return;\n }\n const entry = filtered[i];\n const isLast = i === filtered.length - 1;\n lines.push(`${prefix}${isLast ? '└── ' : '├── '}${entry.name}${entry.isDirectory() ? '/' : ''}`);\n if (entry.isDirectory()) {\n await walk(join(dir, entry.name), depth + 1, prefix + (isLast ? ' ' : '│ '));\n }\n }\n }\n\n await walk(cwd, 1, '');\n return lines.join('\\n');\n}\n\nfunction deriveScopeDirectories(searchResults: SearchResult[]): string[] {\n const seen = new Set<string>();\n const directories: string[] = [];\n\n for (const result of searchResults) {\n const parts = result.path.split('/');\n if (parts.length <= 1) continue;\n const directory = parts.slice(0, -1).join('/');\n if (seen.has(directory)) continue;\n seen.add(directory);\n directories.push(directory);\n if (directories.length >= 4) break;\n }\n\n return directories;\n}\n\nfunction parseScoutWorkerResponse(text: string, task: string): ScoutWorkerDecision {\n const fallback = parseScoutResponse(text);\n try {\n const jsonMatch = text.match(/\\{[\\s\\S]*\\}/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as Record<string, unknown>;\n const relevantKeywords = Array.isArray(parsed.relevantKeywords)\n ? parsed.relevantKeywords.map(String).filter(Boolean)\n : Array.isArray(parsed.relevant_keywords)\n ? parsed.relevant_keywords.map(String).filter(Boolean)\n : extractKeywords(task);\n const candidateFiles = Array.isArray(parsed.candidateFiles)\n ? parsed.candidateFiles.map(String).filter(Boolean)\n : Array.isArray(parsed.candidate_files)\n ? parsed.candidate_files.map(String).filter(Boolean)\n : [];\n return {\n complexity: fallback.complexity,\n relevantKeywords,\n candidateFiles,\n reasoning: typeof parsed.reasoning === 'string' ? parsed.reasoning : undefined,\n };\n }\n } catch {\n // Fall through to keyword fallback.\n }\n\n return {\n complexity: fallback.complexity,\n relevantKeywords: extractKeywords(task),\n candidateFiles: [],\n };\n}\n\nfunction buildScoutSearchQuery(\n task: string,\n relevantKeywords: string[],\n history?: AgentInput['history'],\n memorySummary?: string,\n): string {\n const parts: string[] = [task];\n const historySummary = summarizeRecentHistory(history);\n if (historySummary) {\n parts.push(`Recent conversation:\\n${historySummary}`);\n }\n if (memorySummary) {\n parts.push(`Session memory:\\n${memorySummary}`);\n }\n if (relevantKeywords.length > 0) {\n parts.push(`Keywords: ${relevantKeywords.join(' ')}`);\n }\n return parts.join('\\n\\n');\n}\n\nfunction formatRecentHistoryBlock(history?: AgentInput['history']): string | undefined {\n const summary = summarizeRecentHistory(history);\n return summary ? `Recent conversation context:\\n${summary}` : undefined;\n}\n\nfunction summarizeRecentHistory(history?: AgentInput['history']): string | undefined {\n if (!history || history.length === 0) return undefined;\n\n const recent = history\n .slice(-4)\n .map((message) => `${message.role === 'assistant' ? 'Assistant' : 'User'}: ${message.content.trim()}`)\n .filter((line) => line.length > 0);\n\n return recent.length > 0 ? recent.join('\\n') : undefined;\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values) {\n const normalized = value.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n result.push(normalized);\n }\n return result;\n}\n\nfunction getScoutMaxFiles(complexity: TaskComplexity): number {\n if (complexity === 'complex') return 20;\n if (complexity === 'moderate') return 14;\n return 8;\n}\n","export type SchedulerTaskStatus =\n | 'pending'\n | 'queued'\n | 'blocked'\n | 'running'\n | 'waiting_approval'\n | 'done'\n | 'retry'\n | 'failed';\n\nexport interface SchedulerTask {\n taskId: string;\n dependsOn?: string[];\n writeTargets?: string[];\n}\n\nexport interface SchedulerTaskState {\n taskId: string;\n status: SchedulerTaskStatus;\n}\n\nexport interface DependencyStatus {\n waitingOn: string[];\n failed: string[];\n}\n\nexport interface SchedulerWarning {\n type: 'write-conflict';\n taskId: string;\n conflictingWith: string[];\n message: string;\n}\n\nexport interface ScheduleDecision {\n runnableTaskIds: string[];\n warnings: SchedulerWarning[];\n}\n\nexport function validateTaskGraph(tasks: SchedulerTask[]): void {\n const byId = new Map<string, SchedulerTask>();\n\n for (const task of tasks) {\n if (byId.has(task.taskId)) {\n throw new Error(`Duplicate task id: ${task.taskId}`);\n }\n byId.set(task.taskId, task);\n }\n\n for (const task of tasks) {\n for (const dependencyId of task.dependsOn ?? []) {\n if (!byId.has(dependencyId)) {\n throw new Error(`Task ${task.taskId} depends on missing task ${dependencyId}`);\n }\n }\n }\n\n const cycle = detectDependencyCycle(tasks);\n if (cycle) {\n throw new Error(`Task dependency cycle detected: ${cycle.join(' -> ')}`);\n }\n}\n\nexport function detectDependencyCycle(tasks: SchedulerTask[]): string[] | null {\n const byId = new Map(tasks.map((task) => [task.taskId, task]));\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const stack: string[] = [];\n\n const visit = (taskId: string): string[] | null => {\n if (visiting.has(taskId)) {\n const cycleStart = stack.indexOf(taskId);\n return [...stack.slice(cycleStart), taskId];\n }\n if (visited.has(taskId)) return null;\n\n visiting.add(taskId);\n stack.push(taskId);\n\n const task = byId.get(taskId);\n for (const dependencyId of task?.dependsOn ?? []) {\n const cycle = visit(dependencyId);\n if (cycle) return cycle;\n }\n\n stack.pop();\n visiting.delete(taskId);\n visited.add(taskId);\n return null;\n };\n\n for (const task of tasks) {\n const cycle = visit(task.taskId);\n if (cycle) return cycle;\n }\n\n return null;\n}\n\nexport function getDependencyStatus(\n task: SchedulerTask,\n stateById: Map<string, SchedulerTaskState>,\n): DependencyStatus {\n const waitingOn: string[] = [];\n const failed: string[] = [];\n\n for (const dependencyId of task.dependsOn ?? []) {\n const dependencyState = stateById.get(dependencyId);\n if (!dependencyState || dependencyState.status === 'done') {\n continue;\n }\n if (dependencyState.status === 'failed') {\n failed.push(dependencyId);\n } else {\n waitingOn.push(dependencyId);\n }\n }\n\n return { waitingOn, failed };\n}\n\nexport function selectRunnableTaskIds(\n tasks: SchedulerTask[],\n stateById: Map<string, SchedulerTaskState>,\n runningTaskIds: string[],\n limit: number,\n): ScheduleDecision {\n const byId = new Map(tasks.map((task) => [task.taskId, task]));\n const queued = tasks.filter((task) => {\n const status = stateById.get(task.taskId)?.status;\n return status === 'queued' || status === 'retry';\n });\n const selected: string[] = [];\n const warnings: SchedulerWarning[] = [];\n\n for (const task of queued) {\n if (selected.length >= limit) break;\n\n const conflicting = findConflictingTaskIds(task, [...runningTaskIds, ...selected], byId);\n if (conflicting.length === 0) {\n selected.push(task.taskId);\n continue;\n }\n\n const independentConflicts = conflicting.filter((otherTaskId) =>\n !hasDependencyRelationship(task.taskId, otherTaskId, byId)\n );\n\n if (independentConflicts.length > 0) {\n warnings.push({\n type: 'write-conflict',\n taskId: task.taskId,\n conflictingWith: independentConflicts,\n message: `Serialized #${task.taskId} because it overlaps writes with ${independentConflicts.map((id) => `#${id}`).join(', ')}`,\n });\n }\n }\n\n return {\n runnableTaskIds: selected,\n warnings,\n };\n}\n\nfunction findConflictingTaskIds(\n task: SchedulerTask,\n candidateIds: string[],\n byId: Map<string, SchedulerTask>,\n): string[] {\n if (!task.writeTargets || task.writeTargets.length === 0) return [];\n\n const taskTargets = new Set(task.writeTargets);\n const conflicting: string[] = [];\n\n for (const candidateId of candidateIds) {\n const candidate = byId.get(candidateId);\n if (!candidate?.writeTargets || candidate.writeTargets.length === 0) continue;\n if (candidate.writeTargets.some((target) => taskTargets.has(target))) {\n conflicting.push(candidateId);\n }\n }\n\n return conflicting;\n}\n\nfunction hasDependencyRelationship(\n leftTaskId: string,\n rightTaskId: string,\n byId: Map<string, SchedulerTask>,\n): boolean {\n return dependsOn(leftTaskId, rightTaskId, byId, new Set()) || dependsOn(rightTaskId, leftTaskId, byId, new Set());\n}\n\nfunction dependsOn(\n sourceTaskId: string,\n targetTaskId: string,\n byId: Map<string, SchedulerTask>,\n seen: Set<string>,\n): boolean {\n if (sourceTaskId === targetTaskId) return true;\n if (seen.has(sourceTaskId)) return false;\n seen.add(sourceTaskId);\n\n const source = byId.get(sourceTaskId);\n for (const dependencyId of source?.dependsOn ?? []) {\n if (dependencyId === targetTaskId) return true;\n if (dependsOn(dependencyId, targetTaskId, byId, seen)) return true;\n }\n\n return false;\n}\n","import * as os from 'node:os';\nimport { appendFile, mkdir, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { getAllowedToolNamesForRole } from '../tools/index.js';\nimport {\n getDependencyStatus,\n selectRunnableTaskIds,\n validateTaskGraph,\n type SchedulerTask,\n} from './scheduler.js';\nimport type {\n PipelineChunk,\n PipelinePhaseName,\n PipelineTaskInfo,\n PipelineTaskStatus,\n SubtaskInfo,\n} from '../pipeline/types.js';\nimport type { AgentRole } from './types.js';\n\nexport interface WorkerTaskRunResult<TResult> {\n value: TResult;\n responseText?: string;\n summary?: string;\n model?: string;\n duration?: number;\n cost?: number;\n inputTokens?: number;\n outputTokens?: number;\n}\n\nexport interface WorkerTaskReporter {\n progress: (message: string) => Promise<void>;\n log: (message: string) => Promise<void>;\n setStatus: (\n status: Extract<PipelineTaskStatus, 'running' | 'waiting_approval'>,\n message?: string,\n ) => Promise<void>;\n}\n\nexport interface WorkerTaskDefinition<TResult> {\n id: string;\n phase: PipelinePhaseName;\n role: AgentRole;\n title: string;\n description: string;\n parentTaskId?: string;\n dependsOn?: string[];\n writeTargets?: string[];\n verificationTargets?: string[];\n attempt?: number;\n isBackground?: boolean;\n requiresApproval?: boolean;\n transcriptName?: string;\n run: (reporter: WorkerTaskReporter) => Promise<WorkerTaskRunResult<TResult>>;\n}\n\nexport interface WorkerTaskState<TResult> extends Omit<WorkerTaskDefinition<TResult>, 'run'> {\n status: PipelineTaskStatus;\n progressSummary?: string;\n blockedBy?: string[];\n allowedTools: string[];\n startedAt?: number;\n finishedAt?: number;\n duration?: number;\n cost?: number;\n model?: string;\n outputPath?: string;\n transcriptPath?: string;\n result?: WorkerTaskRunResult<TResult>;\n error?: string;\n}\n\nexport interface PipelineRunMeta {\n runId: string;\n request: string;\n cwd: string;\n startedAt: string;\n completedAt?: string;\n status: 'running' | 'completed' | 'failed';\n totalCost: number;\n totalDurationMs?: number;\n}\n\ninterface RunningTask<TResult> {\n state: WorkerTaskState<TResult>;\n promise: Promise<void>;\n}\n\ninterface TaskExecutionEvent<TResult> {\n type: 'chunk' | 'settled';\n chunk?: PipelineChunk;\n taskId?: string;\n ok?: boolean;\n result?: WorkerTaskRunResult<TResult>;\n error?: string;\n}\n\nexport interface OrchestrationRuntime {\n runId: string;\n baseDir: string;\n tasksDir: string;\n maxConcurrency: number;\n appendParentEvent: (event: Record<string, unknown>) => Promise<void>;\n appendTaskEvent: <TResult>(task: WorkerTaskState<TResult>, event: Record<string, unknown>) => Promise<void>;\n persistTaskMeta: <TResult>(task: WorkerTaskState<TResult>) => Promise<void>;\n writeTaskOutput: <TResult>(task: WorkerTaskState<TResult>, output: string) => Promise<void>;\n persistRunMeta: (patch: Partial<PipelineRunMeta>) => Promise<void>;\n}\n\nexport async function createOrchestrationRuntime(\n cwd: string,\n request: string,\n): Promise<OrchestrationRuntime> {\n const runId = createRunId();\n const baseDir = join(cwd, '.mint', 'runs', runId);\n const tasksDir = join(baseDir, 'tasks');\n const parentPath = join(baseDir, 'parent.jsonl');\n const metaPath = join(baseDir, 'meta.json');\n const runMeta: PipelineRunMeta = {\n runId,\n request,\n cwd,\n startedAt: new Date().toISOString(),\n status: 'running',\n totalCost: 0,\n };\n\n await mkdir(tasksDir, { recursive: true });\n await writeFile(metaPath, JSON.stringify(runMeta, null, 2), 'utf8');\n await appendJsonLine(parentPath, {\n type: 'run-start',\n request,\n runId,\n cwd,\n timestamp: new Date().toISOString(),\n });\n\n return {\n runId,\n baseDir,\n tasksDir,\n maxConcurrency: getDefaultConcurrency(),\n appendParentEvent: async (event) => {\n await appendJsonLine(parentPath, event);\n },\n appendTaskEvent: async (task, event) => {\n const taskJsonlPath = getTaskTranscriptPath(baseDir, task, 'jsonl');\n const legacyTaskPath = join(tasksDir, `${task.id}.jsonl`);\n await Promise.all([\n appendJsonLine(legacyTaskPath, event),\n appendJsonLine(taskJsonlPath, event),\n ]);\n },\n persistTaskMeta: async (task) => {\n const meta = {\n ...task,\n result: task.result\n ? {\n summary: task.result.summary,\n model: task.result.model,\n duration: task.result.duration,\n cost: task.result.cost,\n inputTokens: task.result.inputTokens,\n outputTokens: task.result.outputTokens,\n }\n : undefined,\n };\n const legacyTaskMetaPath = join(tasksDir, `${task.id}.meta.json`);\n const taskMetaPath = getTaskTranscriptPath(baseDir, task, 'meta.json');\n await Promise.all([\n writeFile(legacyTaskMetaPath, JSON.stringify(meta, null, 2), 'utf8'),\n writeFile(taskMetaPath, JSON.stringify(meta, null, 2), 'utf8'),\n ]);\n },\n writeTaskOutput: async (task, output) => {\n const legacyOutputPath = join(tasksDir, `${task.id}.output.md`);\n const outputPath = getTaskTranscriptPath(baseDir, task, 'output.md');\n task.outputPath = outputPath;\n await Promise.all([\n writeFile(legacyOutputPath, output, 'utf8'),\n writeFile(outputPath, output, 'utf8'),\n ]);\n },\n persistRunMeta: async (patch) => {\n Object.assign(runMeta, patch);\n await writeFile(metaPath, JSON.stringify(runMeta, null, 2), 'utf8');\n },\n };\n}\n\nexport function createInitialSubtasks<TResult>(\n tasks: WorkerTaskDefinition<TResult>[],\n): SubtaskInfo[] {\n return tasks.map((task) => {\n const blockedBy = task.dependsOn?.filter(Boolean) ?? [];\n return {\n id: task.id,\n taskId: task.id,\n parentTaskId: task.parentTaskId,\n role: task.role,\n title: task.title,\n description: task.description,\n status: blockedBy.length > 0 ? 'blocked' : 'queued',\n progressSummary: blockedBy.length > 0\n ? `waiting on ${blockedBy.map((id) => `#${id}`).join(', ')}`\n : 'queued',\n blockedBy: blockedBy.length > 0 ? blockedBy : undefined,\n requiresApproval: task.requiresApproval,\n isBackground: task.isBackground,\n attempt: task.attempt ?? 1,\n dependsOn: task.dependsOn,\n writeTargets: task.writeTargets,\n verificationTargets: task.verificationTargets,\n model: undefined,\n startedAt: undefined,\n };\n });\n}\n\nexport async function* runTaskGraph<TResult>(\n runtime: OrchestrationRuntime,\n tasks: WorkerTaskDefinition<TResult>[],\n options: { signal?: AbortSignal } = {},\n): AsyncGenerator<PipelineChunk, WorkerTaskState<TResult>[]> {\n validateTaskGraph(tasks.map(toSchedulerTask));\n\n const states = tasks.map((task) => createTaskState(runtime.baseDir, task));\n const statesById = new Map(states.map((task) => [task.id, task]));\n const definitionsById = new Map(tasks.map((task) => [task.id, task]));\n const running = new Map<string, RunningTask<TResult>>();\n const warnedConflictKeys = new Set<string>();\n const executionEvents = createAsyncEventQueue<TaskExecutionEvent<TResult>>();\n\n for (const state of states) {\n await runtime.persistTaskMeta(state);\n await runtime.appendTaskEvent(state, { type: 'task-created', task: toPipelineTaskInfo(state) });\n }\n\n while (states.some((task) => !isTerminal(task.status))) {\n if (options.signal?.aborted) {\n throw new Error('Aborted');\n }\n\n const pendingExecutionEvents = executionEvents.drain();\n if (pendingExecutionEvents.length > 0) {\n for (const event of pendingExecutionEvents) {\n yield* handleTaskExecutionEvent(runtime, running, event);\n }\n continue;\n }\n\n for (const state of states) {\n if (state.status !== 'blocked') continue;\n\n const dependencyStatus = getDependencyStatus(toSchedulerTask(state), createSchedulerStateMap(states));\n if (dependencyStatus.failed.length > 0 && !isVerificationOnly(state)) {\n state.status = 'failed';\n state.blockedBy = dependencyStatus.failed;\n state.progressSummary = `blocked by failed dependency ${dependencyStatus.failed.map((dependencyId) => `#${dependencyId}`).join(', ')}`;\n state.error = state.progressSummary;\n await runtime.persistTaskMeta(state);\n\n const taskInfo = toPipelineTaskInfo(state);\n yield* emitTaskChunk(runtime, { type: 'task-failed', task: taskInfo });\n yield* emitTaskChunk(runtime, { type: 'task-notification', task: taskInfo });\n continue;\n }\n\n if (dependencyStatus.waitingOn.length === 0) {\n state.status = 'queued';\n state.blockedBy = undefined;\n state.progressSummary = 'queued';\n await runtime.persistTaskMeta(state);\n yield* emitTaskChunk(runtime, { type: 'task-progress', task: toPipelineTaskInfo(state) });\n } else {\n const nextSummary = `waiting on ${dependencyStatus.waitingOn.map((dependencyId) => `#${dependencyId}`).join(', ')}`;\n if (state.progressSummary !== nextSummary) {\n state.blockedBy = dependencyStatus.waitingOn;\n state.progressSummary = nextSummary;\n await runtime.persistTaskMeta(state);\n yield* emitTaskChunk(runtime, { type: 'task-progress', task: toPipelineTaskInfo(state) });\n }\n }\n }\n\n const availableSlots = runtime.maxConcurrency - running.size;\n if (availableSlots > 0) {\n const decision = selectRunnableTaskIds(\n tasks.map(toSchedulerTask),\n createSchedulerStateMap(states),\n Array.from(running.keys()),\n availableSlots,\n );\n\n for (const warning of decision.warnings) {\n const conflictKey = `${warning.taskId}:${warning.conflictingWith.slice().sort().join(',')}`;\n if (warnedConflictKeys.has(conflictKey)) continue;\n warnedConflictKeys.add(conflictKey);\n\n const warningState = statesById.get(warning.taskId);\n if (!warningState) continue;\n\n warningState.progressSummary = warning.message;\n await runtime.persistTaskMeta(warningState);\n yield* emitTaskChunk(runtime, {\n type: 'task-log',\n task: toPipelineTaskInfo(warningState),\n log: warning.message,\n });\n }\n\n for (const taskId of decision.runnableTaskIds) {\n const state = statesById.get(taskId);\n if (!state) continue;\n\n state.status = 'running';\n state.startedAt = Date.now();\n state.progressSummary = state.progressSummary && state.progressSummary !== 'queued'\n ? state.progressSummary\n : 'running';\n await runtime.persistTaskMeta(state);\n yield* emitTaskChunk(runtime, { type: 'task-start', task: toPipelineTaskInfo(state) });\n\n const taskDef = definitionsById.get(taskId);\n if (!taskDef) {\n throw new Error(`Missing task definition for ${taskId}`);\n }\n\n const reporter = createTaskReporter(runtime, state, executionEvents);\n const promise = taskDef.run(reporter)\n .then((result) => {\n executionEvents.push({ type: 'settled', taskId: state.id, ok: true, result });\n })\n .catch((error: unknown) => {\n executionEvents.push({\n type: 'settled',\n taskId: state.id,\n ok: false,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n\n running.set(state.id, { state, promise });\n }\n }\n\n if (running.size === 0) {\n const remaining = states.filter((task) => !isTerminal(task.status));\n if (remaining.length === 0) {\n break;\n }\n const unresolvedIds = remaining.map((task) => task.id);\n const cycleMessage = unresolvedIds.length > 0\n ? `No runnable tasks remain. Unresolved tasks: ${unresolvedIds.map((taskId) => `#${taskId}`).join(', ')}`\n : 'No runnable tasks remain.';\n for (const state of remaining) {\n state.status = 'failed';\n state.error = cycleMessage;\n state.progressSummary = cycleMessage;\n await runtime.persistTaskMeta(state);\n yield* emitTaskChunk(runtime, { type: 'task-failed', task: toPipelineTaskInfo(state) });\n }\n throw new Error(cycleMessage);\n }\n\n const nextExecutionEvent = await executionEvents.next();\n yield* handleTaskExecutionEvent(runtime, running, nextExecutionEvent);\n }\n\n return states;\n}\n\nfunction createTaskState<TResult>(\n baseDir: string,\n task: WorkerTaskDefinition<TResult>,\n): WorkerTaskState<TResult> {\n const blockedBy = task.dependsOn?.filter(Boolean) ?? [];\n const transcriptPath = getTaskTranscriptPath(baseDir, task, 'jsonl');\n return {\n ...task,\n status: blockedBy.length > 0 ? 'blocked' : 'queued',\n progressSummary: blockedBy.length > 0\n ? `waiting on ${blockedBy.map((id) => `#${id}`).join(', ')}`\n : 'queued',\n blockedBy: blockedBy.length > 0 ? blockedBy : undefined,\n allowedTools: getAllowedToolNamesForRole(task.role),\n attempt: task.attempt ?? 1,\n transcriptPath,\n };\n}\n\nfunction toSchedulerTask(task: Pick<WorkerTaskDefinition<unknown>, 'id' | 'dependsOn' | 'writeTargets'> | WorkerTaskState<unknown>): SchedulerTask {\n return {\n taskId: task.id,\n dependsOn: task.dependsOn,\n writeTargets: task.writeTargets,\n };\n}\n\nfunction createSchedulerStateMap<TResult>(\n tasks: WorkerTaskState<TResult>[],\n): Map<string, { taskId: string; status: PipelineTaskStatus }> {\n return new Map(tasks.map((task) => [task.id, { taskId: task.id, status: task.status }]));\n}\n\nfunction toPipelineTaskInfo<TResult>(task: WorkerTaskState<TResult>): PipelineTaskInfo {\n return {\n taskId: task.id,\n subtaskId: task.id,\n parentTaskId: task.parentTaskId,\n phase: task.phase,\n role: task.role,\n title: task.title,\n description: task.description,\n status: task.status,\n progressSummary: task.progressSummary,\n blockedBy: task.blockedBy,\n isBackground: task.isBackground,\n requiresApproval: task.requiresApproval,\n model: task.model,\n startedAt: task.startedAt,\n duration: task.duration,\n cost: task.cost,\n attempt: task.attempt,\n dependsOn: task.dependsOn,\n writeTargets: task.writeTargets,\n verificationTargets: task.verificationTargets,\n outputPath: task.outputPath,\n transcriptPath: task.transcriptPath,\n transcriptName: task.transcriptName,\n allowedTools: task.allowedTools,\n };\n}\n\nexport function toSubtaskInfo<TResult>(task: WorkerTaskState<TResult>): SubtaskInfo {\n return {\n id: task.id,\n taskId: task.id,\n parentTaskId: task.parentTaskId,\n role: task.role,\n title: task.title,\n description: task.description,\n status: task.status,\n startedAt: task.startedAt,\n duration: task.duration,\n cost: task.cost,\n progressSummary: task.progressSummary,\n blockedBy: task.blockedBy,\n requiresApproval: task.requiresApproval,\n isBackground: task.isBackground,\n model: task.model,\n attempt: task.attempt,\n dependsOn: task.dependsOn,\n writeTargets: task.writeTargets,\n verificationTargets: task.verificationTargets,\n transcriptPath: task.transcriptPath,\n transcriptName: task.transcriptName,\n };\n}\n\nasync function* handleTaskExecutionEvent<TResult>(\n runtime: OrchestrationRuntime,\n running: Map<string, RunningTask<TResult>>,\n event: TaskExecutionEvent<TResult>,\n): AsyncGenerator<PipelineChunk> {\n if (event.type === 'chunk' && event.chunk) {\n yield* emitTaskChunk(runtime, event.chunk);\n return;\n }\n\n if (event.type !== 'settled' || !event.taskId) {\n return;\n }\n\n const runningState = running.get(event.taskId);\n if (!runningState) return;\n running.delete(event.taskId);\n\n const state = runningState.state;\n state.finishedAt = Date.now();\n\n if (event.ok && event.result) {\n state.status = 'done';\n state.result = event.result;\n state.duration = event.result.duration ?? durationFromState(state);\n state.cost = event.result.cost;\n state.model = event.result.model;\n state.progressSummary = event.result.summary ?? 'completed';\n if (event.result.responseText) {\n await runtime.writeTaskOutput(state, event.result.responseText);\n }\n await runtime.persistTaskMeta(state);\n yield* emitTaskChunk(runtime, { type: 'task-done', task: toPipelineTaskInfo(state) });\n yield* emitTaskChunk(runtime, { type: 'task-notification', task: toPipelineTaskInfo(state) });\n return;\n }\n\n state.status = 'failed';\n state.error = event.error ?? 'Task failed';\n state.progressSummary = state.error;\n state.duration = durationFromState(state);\n await runtime.persistTaskMeta(state);\n yield* emitTaskChunk(runtime, { type: 'task-failed', task: toPipelineTaskInfo(state) });\n yield* emitTaskChunk(runtime, { type: 'task-notification', task: toPipelineTaskInfo(state) });\n}\n\nfunction createTaskReporter<TResult>(\n runtime: OrchestrationRuntime,\n task: WorkerTaskState<TResult>,\n executionEvents: AsyncEventQueue<TaskExecutionEvent<TResult>>,\n): WorkerTaskReporter {\n return {\n progress: async (message) => {\n task.progressSummary = message;\n await runtime.persistTaskMeta(task);\n executionEvents.push({\n type: 'chunk',\n chunk: { type: 'task-progress', task: toPipelineTaskInfo(task) },\n });\n },\n log: async (message) => {\n await runtime.persistTaskMeta(task);\n executionEvents.push({\n type: 'chunk',\n chunk: { type: 'task-log', task: toPipelineTaskInfo(task), log: message },\n });\n },\n setStatus: async (status, message) => {\n task.status = status;\n if (message) {\n task.progressSummary = message;\n }\n await runtime.persistTaskMeta(task);\n executionEvents.push({\n type: 'chunk',\n chunk: { type: 'task-progress', task: toPipelineTaskInfo(task) },\n });\n },\n };\n}\n\nasync function* emitTaskChunk(\n runtime: OrchestrationRuntime,\n chunk: PipelineChunk,\n): AsyncGenerator<PipelineChunk> {\n await runtime.appendParentEvent(chunkToLogRecord(chunk));\n if (chunk.task) {\n await runtime.appendTaskEvent(\n {\n id: chunk.task.taskId,\n phase: chunk.task.phase,\n role: chunk.task.role,\n title: chunk.task.title,\n description: chunk.task.description,\n parentTaskId: chunk.task.parentTaskId,\n dependsOn: chunk.task.dependsOn,\n writeTargets: chunk.task.writeTargets,\n verificationTargets: chunk.task.verificationTargets,\n attempt: chunk.task.attempt,\n isBackground: chunk.task.isBackground,\n requiresApproval: chunk.task.requiresApproval,\n transcriptName: taskTranscriptNameFromChunk(chunk.task),\n status: chunk.task.status,\n progressSummary: chunk.task.progressSummary,\n blockedBy: chunk.task.blockedBy,\n allowedTools: chunk.task.allowedTools ?? [],\n duration: chunk.task.duration,\n cost: chunk.task.cost,\n model: chunk.task.model,\n outputPath: chunk.task.outputPath,\n transcriptPath: chunk.task.transcriptPath,\n },\n chunkToLogRecord(chunk),\n );\n }\n yield chunk;\n}\n\nfunction chunkToLogRecord(chunk: PipelineChunk): Record<string, unknown> {\n return {\n ...chunk,\n timestamp: new Date().toISOString(),\n };\n}\n\nfunction durationFromState<TResult>(task: WorkerTaskState<TResult>): number | undefined {\n return task.startedAt != null && task.finishedAt != null\n ? task.finishedAt - task.startedAt\n : undefined;\n}\n\nfunction isTerminal(status: PipelineTaskStatus): boolean {\n return status === 'done' || status === 'failed';\n}\n\nfunction isVerificationOnly<TResult>(task: WorkerTaskState<TResult>): boolean {\n return Boolean(task.verificationTargets && task.verificationTargets.length > 0);\n}\n\nfunction getDefaultConcurrency(): number {\n const cpuCount = typeof os.availableParallelism === 'function'\n ? os.availableParallelism()\n : os.cpus().length;\n return Math.max(1, Math.min(6, Math.min(4, cpuCount)));\n}\n\nfunction createRunId(): string {\n const iso = new Date().toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n const safeIso = iso.replace(/:/g, '-').replace(/\\.\\d+/, '');\n return `${safeIso}-${randomUUID().slice(0, 6)}`;\n}\n\nfunction getTaskTranscriptPath(\n baseDir: string,\n task: Pick<WorkerTaskDefinition<unknown>, 'id' | 'role' | 'transcriptName'>,\n suffix: 'jsonl' | 'meta.json' | 'output.md',\n): string {\n const stem = getTaskStem(task);\n return join(baseDir, `${stem}.${suffix}`);\n}\n\nfunction getTaskStem(\n task: Pick<WorkerTaskDefinition<unknown>, 'id' | 'role' | 'transcriptName'>,\n): string {\n const preferred = task.transcriptName?.trim();\n if (preferred) return preferred;\n return `${task.role}-${task.id}`;\n}\n\nfunction taskTranscriptNameFromChunk(task: PipelineTaskInfo): string | undefined {\n return task.transcriptName;\n}\n\nasync function appendJsonLine(path: string, value: Record<string, unknown>): Promise<void> {\n await appendFile(path, JSON.stringify(value) + '\\n', 'utf8');\n}\n\ninterface AsyncEventQueue<T> {\n push: (value: T) => void;\n next: () => Promise<T>;\n drain: () => T[];\n}\n\nfunction createAsyncEventQueue<T>(): AsyncEventQueue<T> {\n const values: T[] = [];\n const waiters: Array<(value: T) => void> = [];\n\n return {\n push(value) {\n const waiter = waiters.shift();\n if (waiter) {\n waiter(value);\n return;\n }\n values.push(value);\n },\n next() {\n const value = values.shift();\n if (value !== undefined) {\n return Promise.resolve(value);\n }\n return new Promise<T>((resolve) => {\n waiters.push(resolve);\n });\n },\n drain() {\n if (values.length === 0) return [];\n return values.splice(0, values.length);\n },\n };\n}\n","/**\n * Multi-agent pipeline orchestrator.\n *\n * Scout → Architect → Builder task graph → [Reviewer with retry]\n *\n * Trivial tasks: Scout → Builder (skip architect + reviewer)\n * Simple/Moderate/Complex:\n * Scout → Architect → Builder task graph → Reviewer (with retry, max 2)\n *\n * Yields PipelineChunks for progressive TUI rendering.\n */\nimport { parseDiffs } from '../pipeline/diff-parser.js';\nimport { calculateOpusCost } from '../usage/tracker.js';\nimport { complete } from '../providers/index.js';\nimport { persistSessionMemory, type SessionMemorySnapshot } from '../context/session-memory.js';\nimport { detectSpecialist, detectSpecialistFromTask } from './specialists/index.js';\nimport { selectAgentModel } from './model-selector.js';\nimport { resolveAdaptiveGate, type AdaptiveGateDecision } from './adaptive-gate.js';\nimport { generateClarifyingQuestions } from './clarifier.js';\nimport {\n runArchitectWorkerAgent,\n runBuilderWorkerAgent,\n runReviewerWorkerAgent,\n} from './worker-agent.js';\nimport {\n createInitialSubtasks,\n createOrchestrationRuntime,\n runTaskGraph,\n toSubtaskInfo,\n type WorkerTaskDefinition,\n type WorkerTaskState,\n} from './runtime.js';\nimport type {\n AgentInput,\n ArchitectOutput,\n MultiAgentResult,\n ReviewerOutput,\n Subtask,\n SubtaskBuilderResult,\n TaskComplexity,\n} from './types.js';\nimport type { PipelineChunk, PipelineOptions, PipelineResult, SubtaskInfo } from '../pipeline/types.js';\n\nexport type { MultiAgentResult };\n\n/**\n * Run the full multi-agent pipeline as a streaming generator.\n */\nexport async function* runAgentPipeline(\n task: string,\n options: PipelineOptions,\n): AsyncGenerator<PipelineChunk> {\n const { cwd, signal, history = [] } = options;\n const startTime = Date.now();\n\n let agentInput: AgentInput = { task, cwd, signal, history };\n const workerExecutionOptions = {\n mode: options.agentMode,\n onApprovalNeeded: options.onApprovalNeeded,\n onDiffProposed: options.onDiffProposed,\n onIterationApprovalNeeded: options.onIterationApprovalNeeded,\n };\n\n let gateDecision: AdaptiveGateDecision;\n let clarificationAttempts = 0;\n\n while (true) {\n gateDecision = await resolveAdaptiveGate({ input: agentInput });\n\n if (gateDecision.mode === 'chat') {\n const result = buildImmediateResult(\n gateDecision.response ?? 'Ready when you are.',\n [],\n startTime,\n options.model ?? selectAgentModel('scout', 'trivial'),\n );\n yield { type: 'text', text: result.response };\n yield { type: 'done', result };\n return;\n }\n\n if (gateDecision.mode === 'question') {\n const files = gateDecision.searchResults;\n const fileContext = files.length > 0\n ? files.map((f) => `--- ${f.path} ---\\n${f.content}`).join('\\n\\n')\n : 'No relevant files found in this project.';\n const model = options.model ?? selectAgentModel('scout', 'simple');\n const llmResponse = await complete({\n model,\n messages: [\n {\n role: 'system',\n content: [\n 'You are an assistant that answers questions about a codebase.',\n 'Answer the user\\'s question based on the file contents below.',\n 'Be concise and direct. If the files don\\'t contain the answer, say so.',\n '',\n fileContext,\n ].join('\\n'),\n },\n { role: 'user', content: task },\n ],\n maxTokens: 1024,\n temperature: 0,\n signal,\n });\n const result: PipelineResult = {\n response: llmResponse.content,\n diffs: [],\n filesSearched: files.map((f) => f.path),\n model,\n cost: llmResponse.cost.total,\n inputTokens: llmResponse.usage.inputTokens,\n outputTokens: llmResponse.usage.outputTokens,\n duration: Date.now() - startTime,\n opusCost: 0,\n };\n yield { type: 'text', text: result.response };\n yield { type: 'done', result };\n return;\n }\n\n if (gateDecision.mode === 'spec_required') {\n const result = buildImmediateResult(\n gateDecision.response ?? 'Please provide a more concrete spec.',\n gateDecision.searchResults.map((file) => file.path),\n startTime,\n options.model ?? selectAgentModel('scout', 'simple'),\n );\n yield { type: 'text', text: result.response };\n yield { type: 'done', result };\n return;\n }\n\n if (gateDecision.mode === 'clarify') {\n const projectContext = gateDecision.searchResults.length > 0\n ? `Existing files: ${gateDecision.searchResults.map((f) => f.path).join(', ')}`\n : 'Empty project — no existing files.';\n const questions = await generateClarifyingQuestions(agentInput.task, signal, projectContext);\n\n // If clarifier says no questions needed → just proceed, don't show fallback questions\n if (questions.length === 0) {\n break;\n }\n\n if (options.onClarificationNeeded && clarificationAttempts < 2) {\n yield { type: 'clarification', questions };\n const answer = await options.onClarificationNeeded(questions);\n clarificationAttempts += 1;\n\n // User dismissed clarification — proceed with what we have\n if (!answer.trim() || isDismissal(answer)) {\n break;\n }\n\n agentInput = {\n ...agentInput,\n task: `${agentInput.task}\\n\\nUser clarifications:\\n${answer.trim()}`,\n };\n continue;\n }\n\n // Clarification attempts exhausted — proceed anyway instead of stopping\n break;\n }\n\n break;\n }\n\n const runtime = await createOrchestrationRuntime(cwd, agentInput.task);\n const totals = {\n cost: 0,\n inputTokens: 0,\n outputTokens: 0,\n };\n\n const emit = async (chunk: PipelineChunk): Promise<PipelineChunk> => {\n await runtime.appendParentEvent({\n ...chunk,\n timestamp: new Date().toISOString(),\n });\n return chunk;\n };\n\n const complexity: TaskComplexity = gateDecision.complexity;\n const searchResults = gateDecision.searchResults;\n const hotspots = gateDecision.hotspots;\n\n yield await emit({\n type: 'phase-start',\n phase: 'SCOUT',\n phaseModel: gateDecision.scoutModelLabel,\n });\n yield await emit({\n type: 'phase-done',\n phase: 'SCOUT',\n phaseSummary: `${complexity} · ${gateDecision.scoutSummary || `${searchResults.length} files`}`,\n });\n yield await emit({ type: 'search', filesFound: searchResults.map((file) => file.path) });\n\n // ── ARCHITECT (always plan for non-trivial tasks — cheap models need precise instructions) ──\n let architectResult: ArchitectOutput | undefined;\n\n if (complexity !== 'trivial') {\n const architectTask = createArchitectTask({\n agentInput: { ...agentInput, searchResults },\n complexity,\n searchResults,\n hotspots,\n workerOptions: workerExecutionOptions,\n });\n\n yield await emit({\n type: 'phase-start',\n phase: 'ARCHITECT',\n phaseModel: selectAgentModel('architect', complexity),\n subtasks: createInitialSubtasks([architectTask]),\n });\n\n try {\n const architectStates = yield* runTaskGraph(runtime, [architectTask], { signal });\n throwOnFailedTasks(architectStates, 'architect');\n\n const architectState = architectStates[0];\n if (!architectState?.result) {\n throw new Error('Missing architect result');\n }\n\n architectResult = architectState.result.value;\n totals.cost += architectState.result.cost ?? 0;\n totals.inputTokens += architectState.result.inputTokens ?? 0;\n totals.outputTokens += architectState.result.outputTokens ?? 0;\n\n yield await emit({\n type: 'phase-done',\n phase: 'ARCHITECT',\n phaseDuration: architectState.duration,\n phaseCost: architectState.cost,\n phaseSummary: architectState.progressSummary ?? (architectResult.type === 'split'\n ? `split into ${architectResult.subtasks?.length ?? 0} tasks`\n : `plan ready (${architectResult.outputTokens} tokens)`),\n subtasks: architectStates.map((state) => toSubtaskInfo(state)),\n });\n } catch {\n yield await emit({ type: 'phase-done', phase: 'ARCHITECT', phaseSummary: 'skipped (error)' });\n }\n }\n\n // ── BUILDER(S) — single or task graph ─────────────────────────────────────\n let builderResults: SubtaskBuilderResult[];\n let allWriteTargets: string[] = [];\n\n if (\n architectResult?.type === 'split' &&\n architectResult.subtasks &&\n architectResult.subtasks.length > 1\n ) {\n const builderTasks = architectResult.subtasks.map((subtask) => createBuilderTask({\n agentInput,\n complexity,\n subtask,\n searchResults,\n attempt: 1,\n gateMode: gateDecision.mode,\n workerOptions: workerExecutionOptions,\n }));\n\n yield await emit({\n type: 'phase-start',\n phase: 'BUILDER',\n phaseModel: `${builderTasks.length} worker DAG`,\n subtasks: createInitialSubtasks(builderTasks),\n });\n\n const builderStates = yield* runTaskGraph(runtime, builderTasks, { signal });\n throwOnFailedTasks(builderStates, 'builder');\n\n builderResults = architectResult.subtasks.map((subtask) => {\n const state = builderStates.find((entry) => entry.id === subtask.id);\n if (!state?.result) {\n throw new Error(`Missing builder result for subtask ${subtask.id}`);\n }\n totals.cost += state.result.cost ?? 0;\n totals.inputTokens += state.result.inputTokens ?? 0;\n totals.outputTokens += state.result.outputTokens ?? 0;\n return state.result.value;\n });\n allWriteTargets = architectResult.subtasks.flatMap((s) => [\n ...(s.writeTargets ?? []),\n ...s.relevantFiles,\n ]);\n\n const combinedText = builderResults\n .map((result) => `**Subtask ${result.subtaskId}:**\\n${result.response}`)\n .join('\\n\\n');\n yield await emit({ type: 'text', text: combinedText });\n\n yield await emit({\n type: 'phase-done',\n phase: 'BUILDER',\n phaseCost: sumTaskCost(builderStates),\n phaseSummary: `${builderResults.length} worker(s) complete`,\n subtasks: builderStates.map((task) => toSubtaskInfo(task)),\n });\n } else {\n const directBuilderSubtask = gateDecision.directSubtask ?? {\n id: '0',\n description: describeBuilderScope(\n searchResults.map((file) => file.path),\n 'Work on the requested change',\n ),\n relevantFiles: searchResults.map((file) => file.path),\n plan: architectResult?.plan ?? '',\n specialist: resolveSpecialist(searchResults.map((file) => file.path), agentInput.task),\n scopeDirectory: deriveBuilderScopeDirectory(searchResults.map((file) => file.path)),\n entryFiles: deriveBuilderEntryFiles(searchResults.map((file) => file.path)),\n researchSummary: buildBuilderResearchSummary(\n searchResults.map((file) => file.path),\n describeBuilderScope(searchResults.map((file) => file.path), 'Work on the requested change'),\n architectResult?.plan ?? '',\n ),\n builderBrief: buildBuilderBrief(\n deriveBuilderScopeDirectory(searchResults.map((file) => file.path)),\n deriveBuilderEntryFiles(searchResults.map((file) => file.path)),\n architectResult?.plan ?? '',\n ),\n writeTargets: searchResults.map((file) => file.path),\n };\n\n const singleBuilderTask = createBuilderTask({\n agentInput: { ...agentInput, searchResults, history },\n complexity,\n subtask: directBuilderSubtask,\n searchResults,\n attempt: 1,\n gateMode: gateDecision.mode,\n workerOptions: workerExecutionOptions,\n });\n\n yield await emit({\n type: 'phase-start',\n phase: 'BUILDER',\n phaseModel: selectAgentModel('builder', complexity),\n subtasks: createInitialSubtasks([singleBuilderTask]),\n });\n\n const builderStates = yield* runTaskGraph(runtime, [singleBuilderTask], { signal });\n throwOnFailedTasks(builderStates, 'builder');\n\n const state = builderStates[0];\n if (!state?.result) {\n throw new Error('Missing builder result for task #0');\n }\n\n totals.cost += state.result.cost ?? 0;\n totals.inputTokens += state.result.inputTokens ?? 0;\n totals.outputTokens += state.result.outputTokens ?? 0;\n\n yield await emit({ type: 'text', text: state.result.value.response });\n yield await emit({\n type: 'phase-done',\n phase: 'BUILDER',\n phaseDuration: state.duration,\n phaseCost: state.cost,\n phaseSummary: state.progressSummary ?? `${state.model} complete`,\n subtasks: builderStates.map((taskState) => toSubtaskInfo(taskState)),\n });\n\n builderResults = [state.result.value];\n allWriteTargets = [\n ...(directBuilderSubtask.writeTargets ?? []),\n ...directBuilderSubtask.relevantFiles,\n ];\n }\n\n // ── REVIEWER with retry loop (not trivial) ─────────────────────────────────\n const MAX_RETRIES = 2; // invest in planning upfront, not retrying after\n let retryCount = 0;\n let currentResults = builderResults;\n let finalReviewerResult: ReviewerOutput | undefined;\n\n const COST_CAP = 2.0; // stop iterating if total cost exceeds $2 (safety net)\n if (complexity !== 'trivial') {\n while (retryCount <= MAX_RETRIES && totals.cost < COST_CAP) {\n const reviewTaskId = `review-${retryCount + 1}`;\n const reviewerTasks: WorkerTaskDefinition<ReviewerOutput>[] = [\n {\n id: reviewTaskId,\n phase: 'REVIEWER',\n role: 'reviewer',\n transcriptName: retryCount === 0 ? 'reviewer' : `reviewer-${retryCount + 1}`,\n title: retryCount === 0 ? 'Review builder changes' : `Review retry ${retryCount}`,\n description: 'Validate the current builder output and provide per-subtask feedback.',\n verificationTargets: currentResults.map((result) => result.subtaskId),\n run: async (reporter) => {\n const allDiffs = currentResults.map((result) => result.response).join('\\n\\n---\\n\\n');\n const subtaskIds = currentResults.map((result) => result.subtaskId);\n const reviewerResult = await runReviewerWorkerAgent({\n input: agentInput,\n complexity,\n allDiffs,\n subtaskIds,\n writeTargets: [...new Set(allWriteTargets)],\n cwd,\n signal,\n reporter,\n ...workerExecutionOptions,\n });\n return {\n value: reviewerResult,\n responseText: reviewerResult.result,\n summary: reviewerResult.approved\n ? 'approved'\n : `issues: ${reviewerResult.feedback.slice(0, 80)}`,\n model: reviewerResult.model,\n duration: reviewerResult.duration,\n cost: reviewerResult.cost,\n inputTokens: reviewerResult.inputTokens,\n outputTokens: reviewerResult.outputTokens,\n };\n },\n },\n ];\n\n yield await emit({\n type: 'phase-start',\n phase: 'REVIEWER',\n phaseModel: 'review task',\n subtasks: createInitialSubtasks(reviewerTasks),\n });\n\n let reviewerStates: WorkerTaskState<ReviewerOutput>[];\n try {\n reviewerStates = yield* runTaskGraph(runtime, reviewerTasks, { signal });\n } catch {\n // Reviewer crashed — don't kill the pipeline, just skip review\n yield await emit({ type: 'phase-done', phase: 'REVIEWER', phaseSummary: 'skipped (error)' });\n break;\n }\n\n const reviewerState = reviewerStates[0];\n if (!reviewerState?.result || reviewerState.status === 'failed') {\n yield await emit({ type: 'phase-done', phase: 'REVIEWER', phaseSummary: 'skipped (error)' });\n break;\n }\n\n const reviewerResult = reviewerState.result.value;\n finalReviewerResult = reviewerResult;\n totals.cost += reviewerState.result.cost ?? 0;\n totals.inputTokens += reviewerState.result.inputTokens ?? 0;\n totals.outputTokens += reviewerState.result.outputTokens ?? 0;\n\n yield await emit({\n type: 'phase-done',\n phase: 'REVIEWER',\n phaseDuration: reviewerState.duration,\n phaseCost: reviewerState.cost,\n phaseSummary: reviewerState.progressSummary ?? 'review complete',\n subtasks: reviewerStates.map((state) => toSubtaskInfo(state)),\n });\n\n if (reviewerResult.approved || retryCount >= MAX_RETRIES) break;\n\n // Find subtasks with specific feedback; if none, retry ALL with general feedback\n let toRetry = currentResults.filter((result) =>\n reviewerResult.subtaskFeedback?.[result.subtaskId]\n );\n if (toRetry.length === 0 && reviewerResult.feedback) {\n // Reviewer gave general feedback but no per-subtask keys — retry all\n toRetry = currentResults;\n }\n\n if (toRetry.length === 0) break;\n\n const retryTasks = toRetry.map((previous) => {\n const subtask = architectResult?.subtasks?.find((entry) => entry.id === previous.subtaskId);\n const feedback = reviewerResult.subtaskFeedback?.[previous.subtaskId] ?? reviewerResult.feedback;\n // Keep the original spec and append feedback — don't replace\n const originalPlan = subtask?.plan ?? task;\n const retryTask = `${originalPlan}\\n\\n---\\nREVIEWER FEEDBACK (fix these issues, do not re-investigate):\\n${feedback}`;\n\n const retrySubtask: Subtask = subtask\n ? {\n ...subtask,\n plan: retryTask,\n }\n : {\n id: previous.subtaskId,\n description: describeBuilderScope(\n searchResults.map((file) => file.path),\n 'Apply reviewer-requested changes',\n ),\n relevantFiles: searchResults.map((file) => file.path),\n plan: retryTask,\n specialist: resolveSpecialist(searchResults.map((file) => file.path), agentInput.task),\n scopeDirectory: deriveBuilderScopeDirectory(searchResults.map((file) => file.path)),\n entryFiles: deriveBuilderEntryFiles(searchResults.map((file) => file.path)),\n researchSummary: buildBuilderResearchSummary(\n searchResults.map((file) => file.path),\n describeBuilderScope(searchResults.map((file) => file.path), 'Apply reviewer-requested changes'),\n retryTask,\n ),\n builderBrief: buildBuilderBrief(\n deriveBuilderScopeDirectory(searchResults.map((file) => file.path)),\n deriveBuilderEntryFiles(searchResults.map((file) => file.path)),\n retryTask,\n ),\n writeTargets: searchResults.map((file) => file.path),\n };\n\n return createBuilderTask({\n agentInput: { ...agentInput, task: retryTask },\n complexity,\n subtask: retrySubtask,\n searchResults,\n attempt: retryCount + 2,\n phaseSummaryPrefix: 'retry',\n gateMode: gateDecision.mode,\n workerOptions: workerExecutionOptions,\n });\n });\n\n yield await emit({\n type: 'phase-start',\n phase: 'BUILDER',\n phaseModel: `retry ${retryCount + 1}`,\n subtasks: createRetrySubtasks(retryTasks),\n });\n\n const retryStates = yield* runTaskGraph(runtime, retryTasks, { signal });\n throwOnFailedTasks(retryStates, 'builder retry');\n\n const retried = retryStates.map((state) => {\n if (!state.result) {\n throw new Error(`Missing retry result for task ${state.id}`);\n }\n totals.cost += state.result.cost ?? 0;\n totals.inputTokens += state.result.inputTokens ?? 0;\n totals.outputTokens += state.result.outputTokens ?? 0;\n return state.result.value;\n });\n\n const retryText = retried\n .map((result) => `**Subtask ${result.subtaskId} (retry):**\\n${result.response}`)\n .join('\\n\\n');\n yield await emit({ type: 'text', text: '\\n\\n---\\n**Revised after review:**\\n\\n' + retryText });\n\n yield await emit({\n type: 'phase-done',\n phase: 'BUILDER',\n phaseCost: sumTaskCost(retryStates),\n phaseSummary: `retry ${retried.length} builder(s)`,\n subtasks: retryStates.map((state) => toSubtaskInfo(state)),\n });\n\n currentResults = currentResults.map((result) =>\n retried.find((retryResult) => retryResult.subtaskId === result.subtaskId) ?? result\n );\n\n retryCount++;\n }\n }\n\n // ── DONE — aggregate costs, parse diffs, emit result ──────────────────────\n const totalDuration = Date.now() - startTime;\n const finalResponse = currentResults.map((result) => result.response).join('\\n\\n');\n const diffs = parseDiffs(finalResponse);\n const primary = currentResults[0];\n const result: PipelineResult = {\n response: finalResponse,\n diffs,\n filesSearched: searchResults.map((file) => file.path),\n model: primary.model,\n cost: totals.cost,\n inputTokens: totals.inputTokens,\n outputTokens: totals.outputTokens,\n duration: totalDuration,\n opusCost: calculateOpusCost(totals.inputTokens, totals.outputTokens),\n };\n\n await runtime.appendParentEvent({\n type: 'run-done',\n timestamp: new Date().toISOString(),\n result: {\n cost: result.cost,\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n duration: result.duration,\n filesSearched: result.filesSearched,\n },\n });\n await runtime.persistRunMeta({\n status: 'completed',\n completedAt: new Date().toISOString(),\n totalCost: result.cost,\n totalDurationMs: result.duration,\n });\n if (complexity !== 'trivial' && (searchResults.length > 0 || diffs.length > 0 || architectResult)) {\n await persistSessionMemory(\n cwd,\n buildSessionMemorySnapshot({\n cwd,\n runId: runtime.runId,\n task: agentInput.task,\n complexity,\n filesSearched: searchResults.map((file) => file.path),\n architectResult,\n directBuilderSubtask: architectResult ? undefined : gateDecision.directSubtask,\n finalResponse,\n diffs,\n reviewerResult: finalReviewerResult,\n }),\n );\n }\n\n yield await emit({ type: 'done', result });\n}\n\nfunction createArchitectTask(args: {\n agentInput: AgentInput;\n complexity: TaskComplexity;\n searchResults: NonNullable<AgentInput['searchResults']>;\n hotspots: import('../context/search.js').Hotspot[];\n workerOptions: Pick<\n PipelineOptions,\n 'agentMode' | 'onApprovalNeeded' | 'onDiffProposed' | 'onIterationApprovalNeeded'\n >;\n}): WorkerTaskDefinition<ArchitectOutput> {\n const { agentInput, complexity, searchResults, hotspots, workerOptions } = args;\n\n return {\n id: 'architect',\n phase: 'ARCHITECT',\n role: 'architect',\n transcriptName: 'architect',\n title: 'Plan implementation',\n description: 'Create a structured implementation plan for the task.',\n run: async (reporter) => {\n const architectResult = await runArchitectWorkerAgent({\n input: agentInput,\n complexity,\n searchResults,\n hotspots,\n cwd: agentInput.cwd,\n signal: agentInput.signal,\n reporter,\n mode: workerOptions.agentMode,\n onApprovalNeeded: workerOptions.onApprovalNeeded,\n onDiffProposed: workerOptions.onDiffProposed,\n onIterationApprovalNeeded: workerOptions.onIterationApprovalNeeded,\n });\n\n return {\n value: architectResult,\n responseText: architectResult.result,\n summary: architectResult.type === 'split'\n ? `split into ${architectResult.subtasks?.length ?? 0} tasks`\n : `plan ready (${architectResult.outputTokens} tokens)`,\n model: architectResult.model,\n duration: architectResult.duration,\n cost: architectResult.cost,\n inputTokens: architectResult.inputTokens,\n outputTokens: architectResult.outputTokens,\n };\n },\n };\n}\n\nfunction createBuilderTask(args: {\n agentInput: AgentInput;\n complexity: TaskComplexity;\n subtask: Subtask;\n searchResults: NonNullable<AgentInput['searchResults']>;\n attempt: number;\n phaseSummaryPrefix?: string;\n gateMode?: string;\n workerOptions: Pick<\n PipelineOptions,\n 'agentMode' | 'onApprovalNeeded' | 'onDiffProposed' | 'onIterationApprovalNeeded'\n >;\n}): WorkerTaskDefinition<SubtaskBuilderResult> {\n const { agentInput, complexity, subtask, searchResults, attempt, phaseSummaryPrefix, gateMode, workerOptions } = args;\n\n return {\n id: subtask.id,\n phase: 'BUILDER',\n role: 'builder',\n transcriptName: buildBuilderTranscriptName(subtask.id, phaseSummaryPrefix),\n title: phaseSummaryPrefix\n ? `${phaseSummaryPrefix} #${subtask.id}`\n : `Build #${subtask.id} [${subtask.specialist}]`,\n description: `[${subtask.specialist} specialist] ${subtask.description}`,\n dependsOn: subtask.dependsOn,\n writeTargets: subtask.writeTargets ?? subtask.relevantFiles,\n verificationTargets: subtask.verificationTargets,\n attempt,\n run: async (reporter) => {\n const subtaskFiles = searchResults.filter((file) =>\n subtask.relevantFiles.includes(file.path)\n );\n const builderResult = await runBuilderWorkerAgent({\n input: { ...agentInput, searchResults: subtaskFiles },\n complexity,\n plan: subtask.plan,\n searchResults: subtaskFiles,\n specialist: subtask.specialist,\n scopeDirectory: subtask.scopeDirectory,\n entryFiles: subtask.entryFiles,\n researchSummary: subtask.researchSummary,\n builderBrief: subtask.builderBrief,\n writeTargets: subtask.writeTargets,\n gateMode,\n cwd: agentInput.cwd,\n signal: agentInput.signal,\n reporter,\n mode: workerOptions.agentMode,\n onApprovalNeeded: workerOptions.onApprovalNeeded,\n onDiffProposed: workerOptions.onDiffProposed,\n onIterationApprovalNeeded: workerOptions.onIterationApprovalNeeded,\n });\n\n const value: SubtaskBuilderResult = {\n subtaskId: subtask.id,\n response: builderResult.response,\n model: builderResult.model,\n inputTokens: builderResult.inputTokens,\n outputTokens: builderResult.outputTokens,\n cost: builderResult.cost,\n duration: builderResult.duration,\n };\n\n return {\n value,\n responseText: builderResult.response,\n summary: `${builderResult.model} · ${builderResult.outputTokens} tokens`,\n model: builderResult.model,\n duration: builderResult.duration,\n cost: builderResult.cost,\n inputTokens: builderResult.inputTokens,\n outputTokens: builderResult.outputTokens,\n };\n },\n };\n}\n\nfunction resolveSpecialist(files: string[], task: string): import('./specialists/types.js').SpecialistType {\n const fromFiles = detectSpecialist(files);\n if (fromFiles !== 'general') return fromFiles;\n return detectSpecialistFromTask(task);\n}\n\nfunction describeBuilderScope(files: string[], fallback: string): string {\n if (files.length === 0) {\n return fallback;\n }\n\n if (files.length === 1) {\n return `Work on ${files[0]}`;\n }\n\n const preview = files.slice(0, 2).join(', ');\n const remaining = files.length - 2;\n return remaining > 0\n ? `Work on ${preview}, +${remaining} more`\n : `Work on ${preview}`;\n}\n\nfunction deriveBuilderScopeDirectory(files: string[]): string | undefined {\n const first = files.find((file) => file.includes('/'));\n if (!first) return undefined;\n const segments = first.split('/');\n return segments.length > 1 ? segments.slice(0, -1).join('/') : undefined;\n}\n\nfunction deriveBuilderEntryFiles(files: string[]): string[] | undefined {\n const ordered = files.filter(Boolean).slice(0, 3);\n return ordered.length > 0 ? ordered : undefined;\n}\n\nfunction buildBuilderResearchSummary(files: string[], description: string, plan: string): string | undefined {\n if (files.length === 0 && !description && !plan) return undefined;\n const fileLine = files.length > 0 ? `Relevant files: ${files.join(', ')}.` : undefined;\n const descriptionLine = description ? `Task scope: ${description}.` : undefined;\n const planLine = plan ? `Planned work: ${plan}` : undefined;\n return [fileLine, descriptionLine, planLine].filter(Boolean).join(' ');\n}\n\nfunction buildBuilderBrief(\n scopeDirectory: string | undefined,\n entryFiles: string[] | undefined,\n plan: string,\n): string | undefined {\n const startLine = scopeDirectory\n ? `Start in ${scopeDirectory}.`\n : 'Start in the assigned files.';\n const filesLine = entryFiles && entryFiles.length > 0\n ? `Read ${entryFiles.join(', ')} first.`\n : undefined;\n const planLine = plan ? `Then execute: ${plan}` : undefined;\n return [startLine, filesLine, planLine].filter(Boolean).join(' ');\n}\n\nfunction createRetrySubtasks(\n tasks: WorkerTaskDefinition<SubtaskBuilderResult>[],\n): SubtaskInfo[] {\n return createInitialSubtasks(tasks).map((task) => ({\n ...task,\n status: task.status === 'queued' ? 'retry' : task.status,\n progressSummary: task.status === 'queued' ? 'retry queued' : task.progressSummary,\n }));\n}\n\nfunction throwOnFailedTasks<TResult>(\n tasks: WorkerTaskState<TResult>[],\n label: string,\n): void {\n const failures = tasks.filter((task) => task.status === 'failed');\n if (failures.length === 0) return;\n\n const message = failures\n .map((task) => {\n const err = task.error ?? task.progressSummary ?? 'failed';\n return `#${task.id}: ${typeof err === 'string' ? err : JSON.stringify(err)}`;\n })\n .join('; ');\n throw new Error(`${label} task(s) failed: ${message}`);\n}\n\nfunction sumTaskCost<TResult>(tasks: WorkerTaskState<TResult>[]): number {\n return tasks.reduce((total, task) => total + (task.cost ?? task.result?.cost ?? 0), 0);\n}\n\nfunction buildBuilderTranscriptName(subtaskId: string, phaseSummaryPrefix?: string): string {\n const safeId = subtaskId.toLowerCase().replace(/[^a-z0-9_-]+/g, '-');\n return phaseSummaryPrefix ? `builder-${phaseSummaryPrefix}-${safeId}` : `builder-${safeId}`;\n}\n\nfunction buildSessionMemorySnapshot(args: {\n cwd: string;\n runId: string;\n task: string;\n complexity: TaskComplexity;\n filesSearched: string[];\n architectResult?: ArchitectOutput;\n directBuilderSubtask?: Subtask;\n finalResponse: string;\n diffs: PipelineResult['diffs'];\n reviewerResult?: ReviewerOutput;\n}): SessionMemorySnapshot {\n const architectSubtasks = args.architectResult?.subtasks ?? [];\n const directSubtasks = args.directBuilderSubtask ? [args.directBuilderSubtask] : [];\n const memorySubtasks = architectSubtasks.length > 0 ? architectSubtasks : directSubtasks;\n const scopeDirectories = uniqueStrings([\n ...memorySubtasks.map((subtask) => subtask.scopeDirectory ?? ''),\n deriveBuilderScopeDirectory(args.filesSearched) ?? '',\n ]);\n const entryFiles = uniqueStrings([\n ...memorySubtasks.flatMap((subtask) => subtask.entryFiles ?? []),\n ...(deriveBuilderEntryFiles(args.filesSearched) ?? []),\n ]);\n const writeTargets = uniqueStrings([\n ...memorySubtasks.flatMap((subtask) => subtask.writeTargets ?? []),\n ...args.diffs.map((diff) => diff.filePath),\n ]);\n const architectResearch = uniqueStrings(\n memorySubtasks.flatMap((subtask) => subtask.researchSummary ? [subtask.researchSummary] : []),\n );\n const builderBriefs = uniqueStrings(\n memorySubtasks.flatMap((subtask) => subtask.builderBrief ? [subtask.builderBrief] : []),\n );\n const architectPlan = args.architectResult?.type === 'single'\n ? args.architectResult.plan\n : architectSubtasks.length > 0\n ? architectSubtasks.map((subtask) => `#${subtask.id} ${subtask.description}: ${subtask.plan}`).join('\\n')\n : args.directBuilderSubtask\n ? args.directBuilderSubtask.plan\n : undefined;\n\n return {\n updatedAt: new Date().toISOString(),\n runId: args.runId,\n cwd: args.cwd,\n task: args.task,\n complexity: args.complexity,\n filesSearched: uniqueStrings(args.filesSearched),\n scopeDirectories,\n entryFiles,\n writeTargets,\n architectPlan,\n architectResearch,\n builderBriefs,\n finalResponseSummary: summarizeSessionOutcome(args.finalResponse),\n reviewerFeedback: args.reviewerResult && !args.reviewerResult.approved\n ? args.reviewerResult.feedback\n : undefined,\n };\n}\n\nfunction buildImmediateResult(\n response: string,\n filesSearched: string[],\n startTime: number,\n model = selectAgentModel('scout', 'simple'),\n): PipelineResult {\n return {\n response,\n diffs: [],\n filesSearched,\n model,\n cost: 0,\n inputTokens: 0,\n outputTokens: 0,\n duration: Date.now() - startTime,\n opusCost: 0,\n };\n}\n\nfunction summarizeSessionOutcome(text: string): string | undefined {\n const normalized = text.replace(/\\s+/g, ' ').trim();\n if (!normalized) return undefined;\n return normalized.slice(0, 320);\n}\n\n// Detect answers that contain no actionable information — short, no technical\n// terms, no file paths, no error descriptions. These are dismissals.\nconst TECHNICAL_CONTENT =\n /\\b(file|error|bug|crash|broken|missing|wrong|css|html|js|tsx?|component|route|api|button|form|header|footer|nav|style|color|font|layout|margin|padding|import|function|class|div|section|page|image|link|url|database|server|port|env|config|deploy)\\b|[/.#{}()<>]|\\d{3,}/i;\n\nfunction isDismissal(answer: string): boolean {\n const normalized = answer.trim();\n if (!normalized) return true;\n // Short answer with no technical content = dismissal\n if (normalized.length < 40 && !TECHNICAL_CONTENT.test(normalized)) return true;\n return false;\n}\n\nfunction uniqueStrings(values: string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values) {\n const normalized = value.trim();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n result.push(normalized);\n }\n return result;\n}\n","/**\n * Colored diff display for the terminal.\n */\nimport chalk from 'chalk';\nimport type { ParsedDiff } from './types.js';\n\n/**\n * Render a list of diffs as a colored string for terminal output.\n */\nexport function formatDiffs(diffs: ParsedDiff[]): string {\n if (diffs.length === 0) return '';\n\n const parts: string[] = [];\n\n for (const diff of diffs) {\n parts.push('');\n parts.push(chalk.bold.white(` ${diff.filePath}`));\n parts.push(chalk.dim(' ' + '─'.repeat(Math.min(60, diff.filePath.length + 4))));\n\n for (const hunk of diff.hunks) {\n parts.push(chalk.cyan(` ${hunk.header}`));\n for (const line of hunk.lines) {\n switch (line.type) {\n case 'add':\n parts.push(chalk.green(` + ${line.content}`));\n break;\n case 'remove':\n parts.push(chalk.red(` - ${line.content}`));\n break;\n case 'context':\n parts.push(chalk.dim(` ${line.content}`));\n break;\n }\n }\n }\n }\n\n parts.push('');\n return parts.join('\\n');\n}\n\n/**\n * Render a raw unified diff text block with colors.\n */\nexport function formatRawUnifiedDiff(diffText: string): string {\n return diffText\n .split('\\n')\n .map((line) => {\n if (line.startsWith('+++ ') || line.startsWith('--- ')) {\n return chalk.bold.cyan(line);\n }\n if (line.startsWith('@@')) {\n return chalk.cyan(line);\n }\n if (line.startsWith('+')) {\n return chalk.green(line);\n }\n if (line.startsWith('-')) {\n return chalk.red(line);\n }\n if (line.startsWith('diff --git') || line.startsWith('index ')) {\n return chalk.dim(line);\n }\n return chalk.dim(line);\n })\n .join('\\n');\n}\n\n/**\n * Render a cost summary line.\n */\nexport function formatCostSummary(\n cost: number,\n opusCost: number,\n duration: number,\n filesModified: string[],\n): string {\n const parts: string[] = [];\n\n const durationStr = duration < 1000\n ? `${duration}ms`\n : `${(duration / 1000).toFixed(1)}s`;\n\n parts.push(chalk.green(` Done in ${durationStr}`));\n\n if (filesModified.length > 0) {\n parts.push(chalk.dim(` Modified: ${filesModified.join(', ')}`));\n }\n\n const formatCost = (c: number): string => {\n if (c < 0.0001) return `${(c * 100).toFixed(4)}¢`;\n if (c < 0.10) return `${(c * 100).toFixed(2)}¢`;\n return `$${c.toFixed(3)}`;\n };\n\n const costStr = formatCost(cost);\n const opusCostStr = formatCost(opusCost);\n\n const savedPct = opusCost > 0\n ? Math.round((1 - cost / opusCost) * 100)\n : 0;\n\n parts.push(\n chalk.dim(` Cost: `) + chalk.yellow(costStr) +\n (savedPct > 0\n ? chalk.dim(` (Opus: ${opusCostStr} — saved ${chalk.green(`${savedPct}%`)})`)\n : '')\n );\n\n return parts.join('\\n');\n}\n","/**\n * Core pipeline entry point.\n *\n * Delegates to the multi-agent pipeline (Scout → Architect → Builder → Reviewer).\n * Both one-shot CLI and interactive TUI consume this.\n */\nimport { runAgentPipeline } from '../agents/index.js';\nimport type {\n PipelineChunk,\n PipelineResult,\n PipelineOptions,\n ParsedDiff,\n} from './types.js';\n\nexport type { PipelineChunk, PipelineResult, PipelineOptions, ParsedDiff };\nexport { parseDiffs, hasDiffs } from './diff-parser.js';\nexport { formatDiffs, formatCostSummary, formatRawUnifiedDiff } from './diff-display.js';\n\n/**\n * Run the pipeline as a streaming generator.\n *\n * Yields PipelineChunks as agents complete:\n * phase-start → phase-done → text (many) → done\n */\nexport async function* runPipeline(\n task: string,\n options: PipelineOptions,\n): AsyncGenerator<PipelineChunk> {\n yield* runAgentPipeline(task, options);\n}\n\n/**\n * One-shot pipeline — collects the full result without streaming.\n */\nexport async function collectPipeline(\n task: string,\n options: PipelineOptions,\n): Promise<PipelineResult> {\n let result: PipelineResult | undefined;\n\n for await (const chunk of runPipeline(task, options)) {\n if (chunk.type === 'done' && chunk.result) {\n result = chunk.result;\n }\n if (chunk.type === 'error') {\n throw new Error(chunk.error);\n }\n }\n\n if (!result) {\n throw new Error('Pipeline completed without producing a result');\n }\n\n return result;\n}\n","export const ORCHESTRATOR_PROMPT = `You are Mint CLI, a code editing assistant. You help developers fix bugs, add features, and refactor code.\n\nYou have these tools:\n- search_files: find relevant files in the project by keywords\n- read_file: read a file's contents\n- list_files: list directory contents\n- edit_file: replace exact text in a file (most reliable for edits)\n- write_file: create a new file or overwrite entirely\n- write_code: dispatch a coding task to a fast coding model (for complex multi-file changes)\n- run_command: execute a shell command (npm test, npm run build, etc)\n\nYour workflow:\n1. Search for relevant files using search_files\n2. Read the files you need with read_file\n3. For simple edits (changing text, fixing a line): use edit_file directly — find the exact text to replace and provide the replacement\n4. For complex changes (new features, multi-file refactors): use write_code to generate the code, then apply with edit_file or write_file\n5. For new files: use write_file\n6. If you want to verify, run tests with run_command\n\nRules:\n- Always search and read files before editing\n- For large files (truncated): use grep_file to find the exact line, then edit_file with the exact text from grep_file output\n- For edit_file: copy the EXACT text from the file (as shown by read_file or grep_file). Whitespace matters.\n- Only pass relevant files to write_code (max 4-8 files, keep context focused)\n- write_code is for code changes only — YOU do the planning and thinking\n- Be concise. Do not explain what you're about to do, just do it.\n- After applying changes, briefly tell the user what you changed and which files were modified.\n- If the project directory is empty, use list_files first to check, then create files directly via write_file.\n- Never run destructive commands (rm -rf, sudo, etc).`;\n","/**\n * write_code tool — the ONLY place a second LLM (DeepSeek) is called.\n * Everything else is the orchestrator (Grok) or pure code.\n */\nimport { completeWithFallback } from '../providers/index.js';\nimport { parseDiffs } from '../pipeline/diff-parser.js';\nimport type { ModelId } from '../providers/types.js';\n\nconst WRITE_CODE_MODEL: ModelId = 'deepseek-v3';\n\nconst WRITE_CODE_PROMPT = `You are a code editor. Output ONLY unified diffs inside \\`\\`\\`diff blocks.\nNever explain. Never investigate. Just output the diff.\n\nFor new files:\n\\`\\`\\`diff\n--- /dev/null\n+++ b/path/to/newfile.ts\n@@ -0,0 +1,N @@\n+line 1\n+line 2\n\\`\\`\\`\n\nFor edits:\n\\`\\`\\`diff\n--- a/path/to/file.ts\n+++ b/path/to/file.ts\n@@ -10,6 +10,8 @@\n context line\n-old line\n+new line\n context line\n\\`\\`\\`\n\nInclude 3 context lines around each change. One diff block per file.`;\n\nexport interface WriteCodeResult {\n diffs: string;\n rawResponse: string;\n model: ModelId;\n cost: number;\n inputTokens: number;\n outputTokens: number;\n}\n\nexport async function writeCode(\n task: string,\n files: Record<string, string>,\n): Promise<WriteCodeResult> {\n const fileContext = Object.entries(files)\n .map(([path, content]) => `<file path=\"${path}\">\\n${content}\\n</file>`)\n .join('\\n\\n');\n\n const userMessage = `Task: ${task}\\n\\n${fileContext}`;\n\n const response = await completeWithFallback({\n model: WRITE_CODE_MODEL,\n messages: [\n { role: 'system', content: WRITE_CODE_PROMPT },\n { role: 'user', content: userMessage },\n ],\n maxTokens: 8192,\n temperature: 0,\n });\n\n const diffs = parseDiffs(response.content);\n const diffText = diffs.length > 0\n ? diffs.map((d) => {\n const header = d.oldContent === ''\n ? `--- /dev/null\\n+++ b/${d.filePath}`\n : `--- a/${d.filePath}\\n+++ b/${d.filePath}`;\n const hunks = d.hunks.map((h) => {\n const hunkHeader = `@@ -${h.oldStart},${h.oldCount} +${h.newStart},${h.newCount} @@`;\n const lines = h.lines.map((l) => {\n if (l.type === 'add') return `+${l.content}`;\n if (l.type === 'remove') return `-${l.content}`;\n return ` ${l.content}`;\n }).join('\\n');\n return `${hunkHeader}\\n${lines}`;\n }).join('\\n');\n return `${header}\\n${hunks}`;\n }).join('\\n\\n')\n : response.content; // Return raw if no diffs parsed — let orchestrator see it\n\n return {\n diffs: diffText,\n rawResponse: response.content,\n model: response.model as ModelId,\n cost: response.cost.total,\n inputTokens: response.usage.inputTokens,\n outputTokens: response.usage.outputTokens,\n };\n}\n","/**\n * Orchestrator tools — the toolkit available to the Grok orchestrator.\n *\n * All tools except write_code are pure code ($0 cost).\n * write_code dispatches to DeepSeek for the actual code generation.\n */\nimport { readFileSync, writeFileSync, readdirSync, statSync, existsSync, mkdirSync } from 'node:fs';\nimport { execSync } from 'node:child_process';\nimport { join, dirname, relative } from 'node:path';\nimport { loadIndex, indexProject, searchRelevantFiles } from '../context/index.js';\nimport { parseDiffs } from '../pipeline/diff-parser.js';\nimport { applyDiffsToProject } from '../pipeline/diff-apply.js';\nimport { writeCode } from './write-code.js';\nimport type { ToolDefinition } from '../tools/types.js';\n\nexport interface OrchestratorToolContext {\n cwd: string;\n onLog?: (message: string) => void;\n onApprovalNeeded?: (description: string) => Promise<boolean>;\n}\n\n// Cost tracking for the session\nlet sessionWriteCodeCost = 0;\nexport function getWriteCodeCost(): number { return sessionWriteCodeCost; }\nexport function resetWriteCodeCost(): void { sessionWriteCodeCost = 0; }\n\n// ─── Tool Definitions (for LLM function calling) ──────────────────────────\n\nexport const ORCHESTRATOR_TOOL_DEFINITIONS: ToolDefinition[] = [\n {\n name: 'search_files',\n description: 'Search for files relevant to a task using keywords. Returns file paths with relevance scores.',\n input_schema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Keywords to search for (e.g. \"mobile menu toggle\", \"auth login\")' },\n },\n required: ['query'],\n },\n },\n {\n name: 'read_file',\n description: 'Read the contents of a file. Returns the file content as text.',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path relative to project root' },\n },\n required: ['path'],\n },\n },\n {\n name: 'list_files',\n description: 'List files in a directory. Returns file and directory names.',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'Directory path relative to project root (default: \".\")' },\n },\n required: [],\n },\n },\n {\n name: 'write_code',\n description: 'Send a coding task to a fast coding model. Provide a precise description of what to change and the relevant file contents as a JSON object mapping file paths to their contents. Returns a unified diff.',\n input_schema: {\n type: 'object',\n properties: {\n task: { type: 'string', description: 'Precise description of what code to write or change' },\n files: { type: 'object', description: 'Map of filepath -> file contents to include as context' },\n },\n required: ['task', 'files'],\n },\n },\n {\n name: 'apply_diff',\n description: 'Apply a unified diff to modify or create files. Pass the raw diff text.',\n input_schema: {\n type: 'object',\n properties: {\n diff: { type: 'string', description: 'Unified diff text to apply' },\n },\n required: ['diff'],\n },\n },\n {\n name: 'grep_file',\n description: 'Search for a pattern inside a file. Returns matching lines with line numbers. Use this to find the exact text before using edit_file.',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path relative to project root' },\n pattern: { type: 'string', description: 'Text or regex pattern to search for' },\n },\n required: ['path', 'pattern'],\n },\n },\n {\n name: 'edit_file',\n description: 'Edit a file by replacing exact text. The old_text must match exactly (including whitespace). Use this for precise edits instead of diffs.',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path relative to project root' },\n old_text: { type: 'string', description: 'The exact text to find and replace (must match exactly)' },\n new_text: { type: 'string', description: 'The replacement text' },\n },\n required: ['path', 'old_text', 'new_text'],\n },\n },\n {\n name: 'write_file',\n description: 'Create or overwrite a file with the given content. Use for new files or full rewrites.',\n input_schema: {\n type: 'object',\n properties: {\n path: { type: 'string', description: 'File path relative to project root' },\n content: { type: 'string', description: 'Full file content to write' },\n },\n required: ['path', 'content'],\n },\n },\n {\n name: 'run_command',\n description: 'Run a shell command (e.g. npm test, npm run build, git status). Returns stdout and stderr.',\n input_schema: {\n type: 'object',\n properties: {\n command: { type: 'string', description: 'Shell command to execute' },\n },\n required: ['command'],\n },\n },\n];\n\n// ─── Tool Executors ────────────────────────────────────────────────────────\n\nconst DANGEROUS_COMMANDS = /\\b(rm\\s+-rf|sudo|chmod\\s+777|mkfs|dd\\s+if|shutdown|reboot|kill\\s+-9|pkill)\\b/;\nconst MAX_OUTPUT = 4000;\n\nexport async function executeOrchestratorTool(\n toolName: string,\n input: Record<string, unknown>,\n ctx: OrchestratorToolContext,\n): Promise<string> {\n switch (toolName) {\n case 'search_files':\n return await toolSearchFiles(String(input.query ?? ''), ctx);\n case 'read_file':\n return toolReadFile(String(input.path ?? ''), ctx);\n case 'list_files':\n return toolListFiles(String(input.path ?? '.'), ctx);\n case 'write_code':\n return await toolWriteCode(\n String(input.task ?? ''),\n (input.files ?? {}) as Record<string, string>,\n ctx,\n );\n case 'apply_diff':\n return toolApplyDiff(String(input.diff ?? ''), ctx);\n case 'grep_file':\n return toolGrepFile(String(input.path ?? ''), String(input.pattern ?? ''), ctx);\n case 'edit_file':\n return toolEditFile(\n String(input.path ?? ''),\n String(input.old_text ?? ''),\n String(input.new_text ?? ''),\n ctx,\n );\n case 'write_file':\n return toolWriteFile(String(input.path ?? ''), String(input.content ?? ''), ctx);\n case 'run_command':\n return toolRunCommand(String(input.command ?? ''), ctx);\n default:\n return `Unknown tool: ${toolName}`;\n }\n}\n\n// ─── Individual tool implementations ───────────────────────────────────────\n\nasync function toolSearchFiles(query: string, ctx: OrchestratorToolContext): Promise<string> {\n ctx.onLog?.('searching files...');\n try {\n let index = await loadIndex(ctx.cwd);\n if (!index || index.totalFiles === 0) {\n index = await indexProject(ctx.cwd);\n }\n if (!index || index.totalFiles === 0) {\n return 'No files indexed. The project may be empty. Use list_files to check.';\n }\n const results = await searchRelevantFiles(ctx.cwd, query, index, { maxFiles: 10 });\n if (results.length === 0) {\n return 'No matching files found. Try different keywords or use list_files to browse.';\n }\n return results\n .map((r) => `${r.path} (score: ${r.score}, reason: ${r.reason})`)\n .join('\\n');\n } catch (err) {\n return `Search error: ${err instanceof Error ? err.message : String(err)}`;\n }\n}\n\nfunction toolReadFile(filePath: string, ctx: OrchestratorToolContext): string {\n ctx.onLog?.(`reading ${filePath}`);\n const fullPath = join(ctx.cwd, filePath);\n if (!fullPath.startsWith(ctx.cwd)) return 'Error: path outside project directory';\n try {\n const content = readFileSync(fullPath, 'utf-8');\n if (content.length > 32000) {\n // For large files, show structure: first 200 lines + line count + hint to use grep_file\n const lines = content.split('\\n');\n const preview = lines.slice(0, 200).map((l, i) => `${i + 1}: ${l}`).join('\\n');\n return `${preview}\\n\\n... (${lines.length} total lines, file truncated at line 200. Use grep_file to search for specific content.)`;\n }\n return content;\n } catch {\n return `Error: file not found: ${filePath}`;\n }\n}\n\nfunction toolGrepFile(filePath: string, pattern: string, ctx: OrchestratorToolContext): string {\n ctx.onLog?.(`grep ${filePath}: ${pattern}`);\n const fullPath = join(ctx.cwd, filePath);\n if (!fullPath.startsWith(ctx.cwd)) return 'Error: path outside project directory';\n try {\n const content = readFileSync(fullPath, 'utf-8');\n const lines = content.split('\\n');\n const matches: string[] = [];\n const patternLower = pattern.toLowerCase();\n\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].toLowerCase().includes(patternLower)) {\n // Show 2 lines before and after for context\n const start = Math.max(0, i - 2);\n const end = Math.min(lines.length, i + 3);\n matches.push(\n lines.slice(start, end)\n .map((l, idx) => `${start + idx + 1}${start + idx === i ? '>' : ' '}: ${l}`)\n .join('\\n')\n );\n matches.push('---');\n }\n }\n\n if (matches.length === 0) return `No matches for \"${pattern}\" in ${filePath}`;\n return matches.slice(0, 30).join('\\n'); // Cap at ~30 match blocks\n } catch {\n return `Error: file not found: ${filePath}`;\n }\n}\n\nfunction toolListFiles(dirPath: string, ctx: OrchestratorToolContext): string {\n ctx.onLog?.(`listing ${dirPath}`);\n const fullPath = join(ctx.cwd, dirPath);\n if (!fullPath.startsWith(ctx.cwd) && fullPath !== ctx.cwd) return 'Error: path outside project directory';\n try {\n const entries = readdirSync(fullPath, { withFileTypes: true });\n const lines = entries\n .filter((e) => !e.name.startsWith('.') && e.name !== 'node_modules')\n .map((e) => e.isDirectory() ? `${e.name}/` : e.name)\n .sort();\n return lines.length > 0 ? lines.join('\\n') : '(empty directory)';\n } catch {\n return `Error: cannot list directory: ${dirPath}`;\n }\n}\n\nasync function toolWriteCode(\n task: string,\n files: Record<string, string>,\n ctx: OrchestratorToolContext,\n): Promise<string> {\n ctx.onLog?.('writing code (deepseek)...');\n\n // If files map has paths but no content, read the files\n const resolvedFiles: Record<string, string> = {};\n for (const [path, content] of Object.entries(files)) {\n if (content && content.length > 0) {\n resolvedFiles[path] = content;\n } else {\n try {\n resolvedFiles[path] = readFileSync(join(ctx.cwd, path), 'utf-8');\n } catch {\n resolvedFiles[path] = '(file does not exist — create it)';\n }\n }\n }\n\n try {\n const result = await writeCode(task, resolvedFiles);\n sessionWriteCodeCost += result.cost;\n ctx.onLog?.(`code written ($${result.cost.toFixed(4)})`);\n // Return raw response — the orchestrator sees it and decides to apply\n return result.rawResponse;\n } catch (err) {\n return `write_code error: ${err instanceof Error ? err.message : String(err)}`;\n }\n}\n\nasync function toolEditFile(filePath: string, oldText: string, newText: string, ctx: OrchestratorToolContext): Promise<string> {\n ctx.onLog?.(`editing ${filePath}`);\n if (ctx.onApprovalNeeded) {\n const preview = `Edit ${filePath}:\\n - ${oldText.slice(0, 80).replace(/\\n/g, '\\\\n')}...\\n + ${newText.slice(0, 80).replace(/\\n/g, '\\\\n')}...`;\n const approved = await ctx.onApprovalNeeded(preview);\n if (!approved) return 'User rejected this edit.';\n }\n const fullPath = join(ctx.cwd, filePath);\n if (!fullPath.startsWith(ctx.cwd)) return 'Error: path outside project directory';\n try {\n const content = readFileSync(fullPath, 'utf-8');\n\n // Try exact match first\n if (content.includes(oldText)) {\n const count = content.split(oldText).length - 1;\n if (count > 1) {\n return `Error: old_text matches ${count} locations in ${filePath}. Make it more specific by including more surrounding context.`;\n }\n const updated = content.replace(oldText, newText);\n writeFileSync(fullPath, updated, 'utf-8');\n return `Edited ${filePath}: replaced ${oldText.length} chars with ${newText.length} chars.`;\n }\n\n // Try whitespace-normalized match (collapse all whitespace to single space)\n const normalize = (s: string) => s.replace(/\\s+/g, ' ').trim();\n const normalizedOld = normalize(oldText);\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n // Try single line match\n if (normalize(lines[i]).includes(normalizedOld)) {\n const updated = content.replace(lines[i], lines[i].replace(\n // Find the part that matches when normalized\n new RegExp(escapeRegex(normalizedOld).replace(/ /g, '\\\\s+'), 's'),\n newText,\n ));\n if (updated !== content) {\n writeFileSync(fullPath, updated, 'utf-8');\n return `Edited ${filePath} (fuzzy match on line ${i + 1}): replaced text.`;\n }\n }\n // Try multi-line window\n for (let windowSize = 2; windowSize <= 5 && i + windowSize <= lines.length; windowSize++) {\n const window = lines.slice(i, i + windowSize).join('\\n');\n if (normalize(window).includes(normalizedOld)) {\n const replacement = lines.slice(0, i).join('\\n') +\n '\\n' + newText + '\\n' +\n lines.slice(i + windowSize).join('\\n');\n writeFileSync(fullPath, replacement, 'utf-8');\n return `Edited ${filePath} (fuzzy match lines ${i + 1}-${i + windowSize}): replaced text.`;\n }\n }\n }\n\n // Show nearby content to help the LLM\n const preview = lines.slice(0, 5).map((l, i) => ` ${i + 1}: ${l}`).join('\\n');\n return `Error: could not find the text to replace in ${filePath}. The file starts with:\\n${preview}\\n\\nTip: use read_file to see the exact content, then copy-paste the exact text you want to replace.`;\n } catch (err) {\n return `Error editing ${filePath}: ${err instanceof Error ? err.message : String(err)}`;\n }\n}\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nasync function toolWriteFile(filePath: string, content: string, ctx: OrchestratorToolContext): Promise<string> {\n ctx.onLog?.(`writing ${filePath}`);\n if (ctx.onApprovalNeeded) {\n const preview = `Create ${filePath} (${content.length} chars):\\n ${content.slice(0, 120).replace(/\\n/g, '\\\\n')}...`;\n const approved = await ctx.onApprovalNeeded(preview);\n if (!approved) return 'User rejected this file creation.';\n }\n const fullPath = join(ctx.cwd, filePath);\n if (!fullPath.startsWith(ctx.cwd)) return 'Error: path outside project directory';\n try {\n mkdirSync(dirname(fullPath), { recursive: true });\n writeFileSync(fullPath, content, 'utf-8');\n return `Created ${filePath} (${content.length} chars).`;\n } catch (err) {\n return `Error writing ${filePath}: ${err instanceof Error ? err.message : String(err)}`;\n }\n}\n\nfunction toolApplyDiff(diffText: string, ctx: OrchestratorToolContext): string {\n ctx.onLog?.('applying diff...');\n try {\n // Try multiple parsing strategies\n let diffs = parseDiffs(diffText);\n if (diffs.length === 0) {\n diffs = parseDiffs('```diff\\n' + diffText + '\\n```');\n }\n if (diffs.length === 0) {\n // Try wrapping each --- block\n const blocks = diffText.split(/(?=^---\\s)/m).filter((b) => b.trim());\n for (const block of blocks) {\n const parsed = parseDiffs('```diff\\n' + block.trim() + '\\n```');\n diffs.push(...parsed);\n }\n }\n if (diffs.length === 0) {\n return 'Error: could not parse diff. The diff text was:\\n' + diffText.slice(0, 500);\n }\n const results = applyDiffsToProject(diffs, ctx.cwd);\n return formatApplyResults(results);\n } catch (err) {\n return `apply_diff error: ${err instanceof Error ? err.message : String(err)}`;\n }\n}\n\nfunction formatApplyResults(results: Array<{ file: string; ok: boolean; action: string; error?: string }>): string {\n return results\n .map((r) => r.ok ? `Applied: ${r.action} ${r.file}` : `Failed: ${r.file} — ${r.error}`)\n .join('\\n');\n}\n\nfunction toolRunCommand(command: string, ctx: OrchestratorToolContext): string {\n if (DANGEROUS_COMMANDS.test(command)) {\n return `Blocked: \"${command}\" is a potentially dangerous command.`;\n }\n ctx.onLog?.(`running: ${command.slice(0, 60)}...`);\n try {\n const output = execSync(command, {\n cwd: ctx.cwd,\n encoding: 'utf-8',\n timeout: 30_000,\n maxBuffer: 1024 * 1024,\n });\n return output.length > MAX_OUTPUT\n ? output.slice(0, MAX_OUTPUT) + '\\n... (truncated)'\n : output || '(no output)';\n } catch (err: unknown) {\n const execErr = err as { stdout?: string; stderr?: string; message?: string };\n const out = [execErr.stdout, execErr.stderr, execErr.message].filter(Boolean).join('\\n');\n return out.length > MAX_OUTPUT ? out.slice(0, MAX_OUTPUT) + '\\n... (truncated)' : out || 'Command failed';\n }\n}\n","/**\n * Single Orchestrator Loop — the core of Mint CLI v2.\n *\n * One continuous Grok 4.1 Fast conversation with tool calling.\n * The orchestrator plans and thinks. Tools execute.\n * write_code dispatches to DeepSeek for actual code generation.\n * Everything else is pure code ($0).\n */\nimport { streamAgent } from '../providers/index.js';\nimport { ORCHESTRATOR_PROMPT } from './prompts.js';\nimport {\n ORCHESTRATOR_TOOL_DEFINITIONS,\n executeOrchestratorTool,\n getWriteCodeCost,\n resetWriteCodeCost,\n type OrchestratorToolContext,\n} from './tools.js';\nimport type { ModelId, Message, AgentStreamChunk } from '../providers/types.js';\nimport { MODELS } from '../providers/types.js';\n\nconst ORCHESTRATOR_MODEL: ModelId = 'grok-4.1-fast';\nconst MAX_ITERATIONS = 20;\n\nexport interface OrchestratorResult {\n output: string;\n orchestratorModel: ModelId;\n orchestratorCost: number;\n writeCodeCost: number;\n totalCost: number;\n iterations: number;\n duration: number;\n /** The full messages array — pass this back as history for follow-up turns. */\n messages: Message[];\n}\n\nexport interface OrchestratorCallbacks {\n onLog?: (message: string) => void;\n onText?: (text: string) => void;\n onToolCall?: (toolName: string, input: Record<string, unknown>) => void;\n onToolResult?: (toolName: string, result: string) => void;\n onApprovalNeeded?: (description: string) => Promise<boolean>;\n}\n\nexport async function runOrchestrator(\n task: string,\n cwd: string,\n callbacks?: OrchestratorCallbacks,\n signal?: AbortSignal,\n /** Previous conversation messages — pass OrchestratorResult.messages from the last turn. */\n previousMessages?: Message[],\n): Promise<OrchestratorResult> {\n const startTime = Date.now();\n resetWriteCodeCost();\n\n const messages: Message[] = [\n ...(previousMessages ?? []),\n { role: 'user', content: task },\n ];\n\n const toolCtx: OrchestratorToolContext = {\n cwd,\n onLog: callbacks?.onLog,\n onApprovalNeeded: callbacks?.onApprovalNeeded,\n };\n\n let fullOutput = '';\n let iterations = 0;\n let orchestratorInputTokens = 0;\n let orchestratorOutputTokens = 0;\n\n for (let i = 0; i < MAX_ITERATIONS; i++) {\n if (signal?.aborted) break;\n iterations = i + 1;\n\n let responseText = '';\n const toolCalls: Array<{ id: string; name: string; input: Record<string, unknown> }> = [];\n\n // Stream from Grok orchestrator\n try {\n for await (const chunk of streamAgent({\n model: ORCHESTRATOR_MODEL,\n messages,\n systemPrompt: ORCHESTRATOR_PROMPT,\n tools: ORCHESTRATOR_TOOL_DEFINITIONS,\n maxTokens: 4096,\n signal,\n providerOptions: { reasoning: true },\n })) {\n if (chunk.type === 'text' && chunk.text) {\n responseText += chunk.text;\n callbacks?.onText?.(chunk.text);\n } else if (chunk.type === 'tool_call') {\n toolCalls.push({\n id: chunk.toolCallId ?? `tc_${Date.now()}_${toolCalls.length}`,\n name: chunk.toolName ?? 'unknown',\n input: chunk.toolInput ?? {},\n });\n callbacks?.onToolCall?.(chunk.toolName ?? 'unknown', chunk.toolInput ?? {});\n }\n }\n } catch (err) {\n const errMsg = formatError(err);\n callbacks?.onLog?.(`${errMsg}`);\n fullOutput += `\\n${errMsg}`;\n break;\n }\n\n // Rough token tracking\n const turnInputTokens = Math.ceil(JSON.stringify(messages).length / 4);\n const turnOutputTokens = Math.ceil(responseText.length / 4);\n orchestratorInputTokens += turnInputTokens;\n orchestratorOutputTokens += turnOutputTokens;\n\n // No tool calls → orchestrator is done\n if (toolCalls.length === 0) {\n fullOutput += responseText;\n break;\n }\n\n // Record assistant message with tool calls (using the format openai-agent-format.ts expects)\n messages.push({\n role: 'assistant',\n content: responseText,\n toolCalls: toolCalls.map((tc) => ({\n id: tc.id,\n name: tc.name,\n input: tc.input,\n })),\n } as unknown as Message);\n\n // Execute tool calls and collect results\n const toolResults: Array<{ toolCallId: string; content: string }> = [];\n for (const tc of toolCalls) {\n callbacks?.onLog?.(`tool: ${tc.name}`);\n const result = await executeOrchestratorTool(tc.name, tc.input, toolCtx);\n callbacks?.onToolResult?.(tc.name, result.slice(0, 200));\n toolResults.push({ toolCallId: tc.id, content: result });\n }\n\n messages.push({\n role: 'tool',\n content: '',\n toolResults,\n } as unknown as Message);\n }\n\n // Calculate costs\n const modelInfo = MODELS[ORCHESTRATOR_MODEL];\n const orchestratorCost = modelInfo\n ? (orchestratorInputTokens / 1_000_000) * modelInfo.inputPrice +\n (orchestratorOutputTokens / 1_000_000) * modelInfo.outputPrice\n : 0;\n const writeCodeCost = getWriteCodeCost();\n\n return {\n output: fullOutput,\n orchestratorModel: ORCHESTRATOR_MODEL,\n orchestratorCost,\n writeCodeCost,\n totalCost: orchestratorCost + writeCodeCost,\n iterations,\n duration: Date.now() - startTime,\n messages,\n };\n}\n\nfunction formatError(err: unknown): string {\n const raw = err instanceof Error ? err.message : typeof err === 'object' && err !== null ? JSON.stringify(err) : String(err);\n\n // Gateway errors\n if (raw.includes('401') || raw.includes('Unauthorized')) return 'Gateway auth failed. Run `mint login` or check your API keys.';\n if (raw.includes('429') || raw.includes('rate')) return 'Rate limited. Waiting a moment before retrying...';\n if (raw.includes('500') || raw.includes('Internal server')) return 'Gateway error. The provider may be temporarily unavailable.';\n if (raw.includes('timeout') || raw.includes('ETIMEDOUT')) return 'Request timed out. Check your network connection.';\n if (raw.includes('ECONNREFUSED')) return 'Cannot reach the gateway. Is it running?';\n if (raw.includes('fetch failed') || raw.includes('ENOTFOUND')) return 'Network error. Check your internet connection.';\n if (raw.includes('No provider')) return 'No API key configured. Run `mint config:set providers.deepseek <key>` or `mint login`.';\n\n // Keep it short and readable\n return raw.length > 200 ? raw.slice(0, 200) + '...' : raw;\n}\n","import React, { useState, useRef, useCallback, useEffect } from 'react';\nimport { Box, Text, useApp, useInput } from 'ink';\nimport { initChalkLevel } from './utils/colorize.js';\nimport { MessageList, ChatMessage } from './components/MessageList.js';\nimport { InputBox } from './components/InputBox.js';\nimport { StatusBar } from './components/StatusBar.js';\nimport { WelcomeScreen } from './components/WelcomeScreen.js';\nimport { LiveTaskInspector } from './components/LiveTaskInspector.js';\nimport { SLASH_COMMANDS } from './components/SlashAutocomplete.js';\nimport { useAgentEvents } from './hooks/useAgentEvents.js';\nimport { getTier } from '../providers/tiers.js';\nimport type { ModelId } from '../providers/types.js';\nimport { MODELS } from '../providers/types.js';\nimport { config } from '../utils/config.js';\nimport { createUsageTracker, calculateSonnetCost, getMonthCost } from '../usage/tracker.js';\nimport { runPipeline, type PipelineChunk } from '../pipeline/index.js';\nimport type { PipelineTaskInfo } from '../pipeline/types.js';\nimport type { PipelinePhaseData, ContextChip, SubtaskData } from './types.js';\n\ninitChalkLevel();\n\n// ── Diff approval selector (arrow keys + enter) ─────────────────────────────\n\nconst APPROVAL_OPTIONS = [\n { label: 'Apply all changes', key: 'apply' },\n { label: 'Skip — tell me what to change', key: 'skip' },\n] as const;\n\nfunction DiffApprovalSelect({ onSelect }: { onSelect: (key: 'apply' | 'skip') => void }): React.ReactElement {\n const [selected, setSelected] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow || key.leftArrow) setSelected((s) => (s - 1 + APPROVAL_OPTIONS.length) % APPROVAL_OPTIONS.length);\n if (key.downArrow || key.rightArrow) setSelected((s) => (s + 1) % APPROVAL_OPTIONS.length);\n if (key.return) onSelect(APPROVAL_OPTIONS[selected].key);\n if (input === 'y' || input === 'Y') onSelect('apply');\n if (input === 'n' || input === 'N') onSelect('skip');\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={1} borderStyle=\"round\" borderColor=\"cyan\">\n {APPROVAL_OPTIONS.map((opt, i) => (\n <Box key={opt.key}>\n <Text color={i === selected ? 'cyan' : undefined} bold={i === selected}>\n {i === selected ? '❯ ' : ' '}{opt.label}\n </Text>\n </Box>\n ))}\n <Box marginTop={0}>\n <Text dimColor> ↑↓ select · Enter confirm · y/n shortcut</Text>\n </Box>\n </Box>\n );\n}\n\ninterface AppProps {\n initialPrompt?: string;\n modelPreference?: string;\n agentMode?: 'yolo' | 'plan' | 'diff' | 'auto';\n useOrchestrator?: boolean;\n}\n\nlet messageIdCounter = 0;\nfunction nextId(): string {\n return `msg-${++messageIdCounter}`;\n}\n\nfunction formatDiffForDisplay(diffs: import('../pipeline/types.js').ParsedDiff[]): string {\n return diffs.map((d) => {\n const isNew = d.oldContent === '';\n const added = d.hunks.flatMap((h) => h.lines.filter((l) => l.type === 'add'));\n const removed = d.hunks.flatMap((h) => h.lines.filter((l) => l.type === 'remove'));\n const header = isNew\n ? `+++ ${d.filePath} (new file · ${added.length} lines)`\n : `--- ${d.filePath} (+${added.length} -${removed.length})`;\n\n const lines: string[] = [];\n for (const hunk of d.hunks) {\n for (const line of hunk.lines) {\n if (lines.length >= 20) { break; }\n if (line.type === 'add') lines.push(`+ ${line.content}`);\n else if (line.type === 'remove') lines.push(`- ${line.content}`);\n }\n }\n const totalChanged = added.length + removed.length;\n if (totalChanged > lines.length) {\n lines.push(` ... ${totalChanged - lines.length} more lines`);\n }\n\n return `${header}\\n${lines.join('\\n')}`;\n }).join('\\n\\n');\n}\n\nfunction estimateContextChipLines(contextChips: ContextChip[] | null | undefined, terminalWidth: number): number {\n if (!contextChips || contextChips.length === 0) return 0;\n\n const usableWidth = Math.max(20, terminalWidth - 2);\n let rows = 1;\n let currentWidth = 0;\n\n for (const chip of contextChips) {\n const chipWidth = chip.label.length + 2;\n const gap = currentWidth === 0 ? 0 : 1;\n\n if (currentWidth + gap + chipWidth > usableWidth) {\n rows += 1;\n currentWidth = chipWidth;\n } else {\n currentWidth += gap + chipWidth;\n }\n }\n\n return rows;\n}\n\nfunction estimateInputAreaHeight(\n input: string,\n isBusy: boolean,\n isRouting: boolean,\n contextChips: ContextChip[] | null | undefined,\n terminalWidth: number,\n): number {\n if (isBusy || isRouting) {\n return 3;\n }\n\n let lines = 3;\n lines += estimateContextChipLines(contextChips, terminalWidth);\n\n const showAutocomplete = input.startsWith('/') && input.length >= 1;\n if (showAutocomplete) {\n const matches = SLASH_COMMANDS.filter((cmd) => `/${cmd.name}`.startsWith(input.toLowerCase()));\n lines += Math.min(matches.length, 5);\n }\n\n return lines;\n}\n\nexport function App({ initialPrompt, modelPreference, agentMode, useOrchestrator = true }: AppProps): React.ReactElement {\n const { exit } = useApp();\n\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [input, setInput] = useState('');\n const [isBusy, setIsBusy] = useState(false);\n const [isRouting, setIsRouting] = useState(false);\n const [currentModel, setCurrentModel] = useState<ModelId | null>(null);\n const [sessionTokens, setSessionTokens] = useState(0);\n const [sessionCost, setSessionCost] = useState(0);\n const [monthlyCost, setMonthlyCost] = useState(0);\n const [streamingContent, setStreamingContent] = useState('');\n const [errorMsg, setErrorMsg] = useState<string | null>(null);\n const [savingsPct, setSavingsPct] = useState<number | undefined>(undefined);\n const [contextChips, setContextChips] = useState<ContextChip[] | null>(null);\n const [scrollOffset, setScrollOffset] = useState(0);\n const [isInspectorOpen, setIsInspectorOpen] = useState(false);\n const [selectedTaskId, setSelectedTaskId] = useState<string | null>(null);\n\n const {\n panelState,\n pipelinePhases,\n onCostUpdate,\n onPhaseStart,\n onPhaseDone,\n onTaskEvent,\n resetPhases,\n } = useAgentEvents();\n\n const streamRef = useRef('');\n const orchestratorMessagesRef = useRef<import('../providers/types.js').Message[]>([]);\n const busyRef = useRef(false);\n const abortRef = useRef<AbortController | null>(null);\n const clarificationResolveRef = useRef<((answer: string) => void) | null>(null);\n const pendingDiffsRef = useRef<{ diffs: import('../pipeline/types.js').ParsedDiff[]; resolve: (apply: boolean) => void } | null>(null);\n const assistantMsgIdRef = useRef('');\n const trackerRef = useRef(createUsageTracker(Date.now().toString(36), 'chat'));\n const pipelinePhasesRef = useRef<PipelinePhaseData[]>([]);\n const lastIdleInputHeightRef = useRef(3);\n\n // Load context chips + monthly cost on mount\n useEffect(() => {\n loadContextChips().then(setContextChips).catch(() => {});\n try { setMonthlyCost(getMonthCost().cost); } catch { /* ignore */ }\n }, []);\n\n useEffect(() => {\n return () => { abortRef.current?.abort(); };\n }, []);\n\n useEffect(() => {\n pipelinePhasesRef.current = pipelinePhases;\n }, [pipelinePhases]);\n\n // Handle terminal resize — clear screen to prevent ghost artifacts\n const [termSize, setTermSize] = useState({ cols: process.stdout.columns ?? 80, rows: process.stdout.rows ?? 24 });\n useEffect(() => {\n const onResize = () => {\n // Clear the entire screen and move cursor to top-left\n process.stdout.write('\\x1B[2J\\x1B[H');\n setTermSize({ cols: process.stdout.columns ?? 80, rows: process.stdout.rows ?? 24 });\n };\n process.stdout.on('resize', onResize);\n return () => { process.stdout.off('resize', onResize); };\n }, []);\n\n useInput((keypress, key) => {\n if (key.ctrl && keypress === 'c') {\n abortRef.current?.abort();\n exit();\n }\n if (key.tab && pipelinePhases.length > 0 && (isBusy || isRouting || input.length === 0)) {\n setIsInspectorOpen((open) => !open);\n if (!isInspectorOpen) {\n setSelectedTaskId(null);\n }\n return;\n }\n if (isInspectorOpen && (isBusy || isRouting || input.length === 0) && (key.leftArrow || key.rightArrow)) {\n const taskIds = getInspectorTaskIds(pipelinePhases);\n if (taskIds.length > 0) {\n const currentId = selectedTaskId ?? selectDefaultInspectorTaskId(pipelinePhases);\n const currentIndex = Math.max(0, taskIds.indexOf(currentId ?? taskIds[0]!));\n const nextIndex = key.rightArrow\n ? (currentIndex + 1) % taskIds.length\n : (currentIndex - 1 + taskIds.length) % taskIds.length;\n setSelectedTaskId(taskIds[nextIndex]!);\n }\n return;\n }\n const canScroll = messages.length > 0 && (isBusy || isRouting || scrollOffset > 0 || input.length === 0);\n const pageStep = Math.max(8, Math.floor(termSize.rows / 2));\n\n if (key.upArrow && canScroll) {\n setScrollOffset((n) => n + 3);\n return;\n }\n if (key.downArrow && canScroll) {\n setScrollOffset((n) => Math.max(0, n - 3));\n return;\n }\n if (key.pageUp && canScroll) {\n setScrollOffset((n) => n + pageStep);\n return;\n }\n if (key.pageDown && canScroll) {\n setScrollOffset((n) => Math.max(0, n - pageStep));\n return;\n }\n }, { isActive: messages.length > 0 });\n\n const handleSubmit = useCallback(async (userInput: string) => {\n const trimmed = userInput.trim();\n if (!trimmed) return;\n\n // If pipeline is paused waiting for clarification answers, resolve it\n if (clarificationResolveRef.current) {\n const resolve = clarificationResolveRef.current;\n clarificationResolveRef.current = null;\n // Add user's answer\n setMessages((prev) => [...prev, { id: nextId(), role: 'user', content: trimmed }]);\n // Create a FRESH streaming message for the resumed pipeline (below the Q&A)\n assistantMsgIdRef.current = nextId();\n setMessages((prev) => [\n ...prev,\n { id: assistantMsgIdRef.current, role: 'assistant', content: '', isStreaming: true, phases: [] },\n ]);\n setInput('');\n setScrollOffset(0);\n resetPhases();\n streamRef.current = '';\n busyRef.current = true;\n setIsBusy(true);\n setIsRouting(true);\n resolve(trimmed);\n return;\n }\n\n if (busyRef.current) return;\n\n // Handle slash commands\n if (trimmed === '/help') {\n setScrollOffset(0);\n setMessages((prev) => [\n ...prev,\n {\n id: nextId(),\n role: 'assistant',\n content: [\n 'Commands:',\n ' /help — this help',\n ' /clear — clear chat',\n ' /model — current model',\n ' /models — list all models',\n ' /agent — agent mode',\n ' /usage — session stats',\n '',\n 'Keyboard:',\n ' Enter — send message',\n ' ↑ / ↓ — scroll response',\n ' PgUp / PgDn — faster scroll',\n ' Tab — toggle live inspector',\n ' ← / → — switch inspector task',\n ' Ctrl+C — exit',\n ].join('\\n'),\n },\n ]);\n setInput('');\n return;\n }\n\n if (trimmed === '/clear') {\n setMessages([]);\n setInput('');\n setSessionTokens(0);\n setSessionCost(0);\n setSavingsPct(undefined);\n setScrollOffset(0);\n resetPhases();\n return;\n }\n\n if (trimmed === '/model') {\n setScrollOffset(0);\n setMessages((prev) => [\n ...prev,\n { id: nextId(), role: 'assistant', content: `Current model: ${currentModel ?? 'auto'}` },\n ]);\n setInput('');\n return;\n }\n\n if (trimmed === '/usage') {\n setScrollOffset(0);\n const month = getMonthCost();\n const formatUsd = (n: number) => n < 0.01 ? `${(n * 100).toFixed(3)}¢` : `$${n.toFixed(4)}`;\n const savPct = month.opusCost > 0 ? Math.round((1 - month.cost / month.opusCost) * 100) : 0;\n setMessages((prev) => [\n ...prev,\n {\n id: nextId(),\n role: 'assistant',\n content: [\n `This month:`,\n ` Workflows: ${month.requests}`,\n ` Spent: ${formatUsd(month.cost)}`,\n ` Opus equiv: ${formatUsd(month.opusCost)}`,\n ` Saved: ${formatUsd(month.saved)}${savPct > 0 ? ` (-${savPct}%)` : ''}`,\n '',\n `This session:`,\n ` Spent: ${formatUsd(sessionCost)}`,\n ` Tokens: ${sessionTokens.toLocaleString()}`,\n ].join('\\n'),\n },\n ]);\n setInput('');\n return;\n }\n\n // Add user message\n const userMsgId = nextId();\n setMessages((prev) => [\n ...prev,\n { id: userMsgId, role: 'user', content: trimmed },\n ]);\n setInput('');\n busyRef.current = true;\n setIsBusy(true);\n setIsRouting(true);\n setErrorMsg(null);\n setScrollOffset(0);\n resetPhases();\n\n // Resolve model\n const modelMap: Record<string, ModelId> = {\n deepseek: 'deepseek-v3', sonnet: 'claude-sonnet-4', opus: 'claude-opus-4',\n };\n const preferredModel = (modelPreference && modelPreference !== 'auto')\n ? (modelMap[modelPreference] ?? modelPreference) as ModelId\n : undefined;\n\n // Create streaming placeholder with phase tracking\n assistantMsgIdRef.current = nextId();\n setMessages((prev) => [\n ...prev,\n { id: assistantMsgIdRef.current, role: 'assistant', content: '', isStreaming: true, phases: [] },\n ]);\n\n streamRef.current = '';\n setStreamingContent('');\n\n const controller = new AbortController();\n abortRef.current = controller;\n\n const history = messages.map((m) => ({\n role: m.role as 'user' | 'assistant',\n content: m.content,\n }));\n\n // ── V2 Orchestrator path ─────────────────────────────────────────────\n if (useOrchestrator) {\n setIsRouting(false);\n try {\n const { runOrchestrator } = await import('../orchestrator/loop.js');\n let responseText = '';\n let currentToolLine = '';\n const result = await runOrchestrator(trimmed, process.cwd(), {\n\n onLog: () => {\n // Internal logs — don't show to user\n },\n onText: (text) => {\n responseText += text;\n currentToolLine = '';\n streamRef.current = responseText;\n setStreamingContent(responseText);\n },\n onToolCall: (name, input) => {\n const preview = name === 'write_code'\n ? `writing code...`\n : name === 'read_file'\n ? `reading ${String(input.path ?? '')}`\n : name === 'grep_file'\n ? `searching in ${String(input.path ?? '')}`\n : name === 'search_files'\n ? `searching \"${String(input.query ?? '')}\"`\n : name === 'edit_file'\n ? `editing ${String(input.path ?? '')}`\n : name === 'write_file'\n ? `creating ${String(input.path ?? '')}`\n : name === 'run_command'\n ? `running ${String(input.command ?? '').slice(0, 40)}`\n : name;\n currentToolLine = `> ${preview}`;\n streamRef.current = responseText + (responseText ? '\\n' : '') + currentToolLine;\n setStreamingContent(streamRef.current);\n },\n onApprovalNeeded: async (description) => {\n // Show the proposed change and wait for user approval\n return new Promise<boolean>((resolve) => {\n responseText += `\\n${description}\\n`;\n streamRef.current = responseText;\n setStreamingContent(responseText);\n\n // Temporarily release the input for the user to respond\n setIsBusy(false);\n busyRef.current = false;\n\n const handleApproval = (answer: string) => {\n busyRef.current = true;\n setIsBusy(true);\n const rejected = answer.toLowerCase() === 'n' || answer.toLowerCase() === 'no';\n resolve(!rejected);\n };\n\n // Store the resolver so the input handler can call it\n clarificationResolveRef.current = handleApproval;\n });\n },\n }, controller.signal, orchestratorMessagesRef.current);\n\n // Persist messages for follow-up turns\n orchestratorMessagesRef.current = result.messages;\n\n // Show final result — response text + cost, no tool call history\n const costLine = `\\nCost: $${result.totalCost.toFixed(4)} · ${(result.duration / 1000).toFixed(1)}s · ${result.iterations} steps`;\n responseText += costLine;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMsgIdRef.current\n ? { ...m, content: responseText, isStreaming: false }\n : m\n )\n );\n setStreamingContent('');\n\n // Track usage\n trackerRef.current.track({\n model: result.orchestratorModel,\n provider: 'grok',\n tier: getTier(result.orchestratorModel),\n inputTokens: 0,\n outputTokens: 0,\n cost: result.totalCost,\n opusCost: result.totalCost * 50,\n savedAmount: result.totalCost * 49,\n routingReason: 'orchestrator',\n taskPreview: trimmed,\n latencyMs: result.duration,\n costSonnet: 0,\n });\n setSessionCost((prev) => prev + result.totalCost);\n setMonthlyCost(getMonthCost());\n setCurrentModel(result.orchestratorModel);\n } catch (err) {\n const raw = err instanceof Error ? err.message : typeof err === 'object' ? JSON.stringify(err) : String(err);\n const friendly = raw.includes('401') ? 'Auth failed. Run `mint login`.'\n : raw.includes('429') ? 'Rate limited. Try again in a moment.'\n : raw.includes('500') ? 'Provider temporarily unavailable.'\n : raw.includes('timeout') ? 'Request timed out.'\n : raw.includes('fetch failed') ? 'Network error.'\n : raw.length > 150 ? raw.slice(0, 150) + '...' : raw;\n setErrorMsg(friendly);\n setMessages((prev) => prev.filter((m) => m.id !== assistantMsgIdRef.current));\n } finally {\n busyRef.current = false;\n setIsBusy(false);\n abortRef.current = null;\n }\n return;\n }\n\n // ── Legacy pipeline path ─────────────────────────────────────────────\n try {\n for await (const chunk of runPipeline(trimmed, {\n cwd: process.cwd(),\n model: preferredModel,\n signal: controller.signal,\n history,\n agentMode,\n onClarificationNeeded: async (questions: string[]) => {\n return new Promise<string>((resolve) => {\n // Finalize the current streaming message (phases rendered so far)\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMsgIdRef.current\n ? { ...m, content: streamRef.current, isStreaming: false, phases: [...pipelinePhasesRef.current] }\n : m\n )\n );\n\n // Show clarification questions as a new message\n const questionsText = questions.map((q, i) => `${i + 1}. ${q}`).join('\\n');\n setMessages((prev) => [...prev, {\n id: nextId(),\n role: 'assistant',\n content: `Before I keep going, I need a few quick answers:\\n\\n${questionsText}\\n\\nAnswer all of the above to proceed.`,\n }]);\n\n // Release the input box while we wait\n setIsRouting(false);\n busyRef.current = false;\n setIsBusy(false);\n clarificationResolveRef.current = resolve;\n });\n },\n })) {\n switch (chunk.type) {\n case 'search':\n setIsRouting(false);\n break;\n\n case 'context':\n if (chunk.contextTokens) {\n onPhaseStart('ARCHITECT');\n onPhaseDone('ARCHITECT', {\n summary: `${chunk.contextTokens.toLocaleString()} context tokens`,\n });\n }\n break;\n\n case 'phase-start':\n if (chunk.phase) {\n onPhaseStart(chunk.phase, chunk.phaseModel, chunk.subtasks as import('./types.js').SubtaskData[] | undefined);\n }\n break;\n\n case 'phase-done':\n if (chunk.phase) {\n onPhaseDone(chunk.phase, {\n duration: chunk.phaseDuration,\n cost: chunk.phaseCost,\n summary: chunk.phaseSummary,\n subtasks: chunk.subtasks as import('./types.js').SubtaskData[] | undefined,\n });\n }\n break;\n\n case 'task-start':\n case 'task-progress':\n case 'task-done':\n case 'task-failed':\n case 'task-notification':\n if (chunk.task) {\n onTaskEvent(chunk.task as PipelineTaskInfo);\n }\n break;\n\n case 'task-log':\n if (chunk.task) {\n onTaskEvent(chunk.task as PipelineTaskInfo, chunk.log);\n }\n break;\n\n case 'text':\n if (chunk.text) {\n streamRef.current += chunk.text;\n }\n break;\n\n case 'done': {\n const r = chunk.result!;\n setCurrentModel(r.model);\n setSessionTokens((t) => t + r.inputTokens + r.outputTokens);\n setSessionCost((c) => c + r.cost);\n setMonthlyCost((m) => m + r.cost);\n onCostUpdate(r.cost, r.inputTokens + r.outputTokens);\n\n const savPct = r.opusCost > 0\n ? Math.round((1 - r.cost / r.opusCost) * 100)\n : 0;\n if (savPct > 0) setSavingsPct(savPct);\n\n // Complete any remaining active phases\n onPhaseDone('BUILDER', {\n duration: r.duration,\n cost: r.cost,\n summary: `${r.model} · ${r.filesSearched.length} files`,\n });\n\n trackerRef.current.track({\n model: r.model,\n provider: MODELS[r.model]?.provider ?? 'unknown',\n tier: getTier(r.model),\n inputTokens: r.inputTokens,\n outputTokens: r.outputTokens,\n cost: r.cost,\n opusCost: r.opusCost,\n savedAmount: Math.max(0, r.opusCost - r.cost),\n routingReason: `pipeline → ${r.model}`,\n taskPreview: trimmed,\n latencyMs: r.duration,\n costSonnet: calculateSonnetCost(r.inputTokens, r.outputTokens),\n });\n\n // Finalize message with phases\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantMsgIdRef.current\n ? {\n ...m,\n content: streamRef.current,\n cost: r.cost,\n model: r.model,\n isStreaming: false,\n phases: [...pipelinePhasesRef.current],\n }\n : m\n )\n );\n setStreamingContent('');\n\n // If diffs were generated, apply or ask\n if (r.diffs && r.diffs.length > 0) {\n const autoApply = agentMode === 'auto' || agentMode === 'yolo';\n\n // Build a recap with diffs so user sees what changed (original output may have scrolled off)\n const phaseRecap = pipelinePhasesRef.current\n .filter((p) => p.status === 'done' && p.summary)\n .map((p) => ` ${p.name} · ${p.summary}`)\n .join('\\n');\n\n const diffSummary = r.diffs.map((d) => {\n const isNew = d.oldContent === '';\n const added = d.hunks.flatMap((h) => h.lines.filter((l) => l.type === 'add'));\n const removed = d.hunks.flatMap((h) => h.lines.filter((l) => l.type === 'remove'));\n const header = isNew\n ? `+ ${d.filePath} (new · ${added.length} lines)`\n : `~ ${d.filePath} (+${added.length} -${removed.length})`;\n\n // Show a compact preview: up to 8 changed lines per file\n const previewLines: string[] = [];\n for (const hunk of d.hunks) {\n for (const line of hunk.lines) {\n if (previewLines.length >= 8) break;\n if (line.type === 'add') previewLines.push(` + ${line.content}`);\n else if (line.type === 'remove') previewLines.push(` - ${line.content}`);\n }\n }\n const moreCount = added.length + removed.length - previewLines.length;\n if (moreCount > 0) previewLines.push(` ... ${moreCount} more lines`);\n\n return ` ${header}\\n${previewLines.join('\\n')}`;\n }).join('\\n\\n');\n\n const costLine = `Cost: ${r.cost < 0.01 ? (r.cost * 100).toFixed(3) + '¢' : '$' + r.cost.toFixed(4)} · ${(r.duration / 1000).toFixed(1)}s`;\n\n // Always show diffs and ask for approval — agents work freely, user approves at the end\n if (false) {\n const { applyDiffsToProject } = await import('../pipeline/diff-apply.js');\n const results = applyDiffsToProject(r.diffs, process.cwd());\n const resultLines = results.map((res) => {\n if (res.ok) return res.action === 'created' ? ` + ${res.file}` : ` ~ ${res.file}`;\n return ` ! ${res.file}: ${res.error}`;\n }).join('\\n');\n const diffDisplay = formatDiffForDisplay(r.diffs);\n setMessages((prev) => [...prev, {\n id: nextId(),\n role: 'assistant',\n content: [\n phaseRecap ? `Pipeline:\\n${phaseRecap}` : null,\n `Applied ${results.filter((res) => res.ok).length}/${results.length} files:\\n${resultLines}`,\n `\\`\\`\\`diff\\n${diffDisplay}\\n\\`\\`\\``,\n costLine,\n ].filter(Boolean).join('\\n\\n'),\n }]);\n } else {\n setMessages((prev) => [...prev, {\n id: nextId(),\n role: 'assistant',\n content: [\n phaseRecap ? `Pipeline:\\n${phaseRecap}` : null,\n `Changes:\\n\\n${diffSummary}`,\n costLine,\n ].filter(Boolean).join('\\n\\n'),\n }]);\n busyRef.current = false;\n setIsBusy(false);\n pendingDiffsRef.current = {\n diffs: r.diffs,\n resolve: () => {},\n };\n }\n }\n break;\n }\n\n case 'error':\n throw new Error(chunk.error);\n }\n }\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n setErrorMsg(`Error: ${errMsg}`);\n setMessages((prev) => prev.filter((m) => m.id !== assistantMsgIdRef.current));\n } finally {\n clarificationResolveRef.current = null;\n // Don't clear pendingDiffsRef here — it persists after pipeline completes\n if (!pendingDiffsRef.current) {\n busyRef.current = false;\n setIsBusy(false);\n }\n setIsRouting(false);\n streamRef.current = '';\n }\n }, [messages, currentModel, modelPreference, agentMode, pipelinePhases]);\n\n // Auto-submit initialPrompt on mount\n useEffect(() => {\n if (initialPrompt?.trim()) {\n const timer = setTimeout(() => handleSubmit(initialPrompt), 100);\n return () => clearTimeout(timer);\n }\n }, []);\n\n const showApproval = pendingDiffsRef.current != null && !isBusy;\n\n const handleDiffApproval = useCallback(async (choice: 'apply' | 'skip') => {\n if (!pendingDiffsRef.current) return;\n const { diffs } = pendingDiffsRef.current;\n pendingDiffsRef.current = null;\n\n if (choice === 'apply') {\n const { applyDiffsToProject } = await import('../pipeline/diff-apply.js');\n const results = applyDiffsToProject(diffs, process.cwd());\n const resultLines = results.map((res) => {\n if (res.ok) return res.action === 'created' ? ` + ${res.file}` : ` ~ ${res.file}`;\n return ` ! ${res.file}: ${res.error}`;\n }).join('\\n');\n const diffDisplay = formatDiffForDisplay(diffs);\n setMessages((prev) => [...prev, {\n id: nextId(),\n role: 'assistant',\n content: `Applied ${results.filter((res) => res.ok).length}/${results.length} files:\\n${resultLines}\\n\\n\\`\\`\\`diff\\n${diffDisplay}\\n\\`\\`\\``,\n }]);\n } else {\n setMessages((prev) => [...prev, {\n id: nextId(),\n role: 'assistant',\n content: 'Got it — changes skipped, your files are untouched. Tell me what to change and I\\'ll rebuild it.',\n }]);\n }\n }, []);\n\n const showWelcome = messages.length === 0 && !isBusy && !isRouting;\n const inspectorHeight = isInspectorOpen && pipelinePhases.length > 0\n ? Math.min(10, Math.max(6, Math.floor(termSize.rows * 0.28)))\n : 0;\n const estimatedInputHeight = estimateInputAreaHeight(input, isBusy, isRouting, contextChips, termSize.cols);\n if (!isBusy && !isRouting) {\n lastIdleInputHeightRef.current = estimatedInputHeight;\n }\n const inputAreaHeight = (isBusy || isRouting)\n ? Math.max(estimatedInputHeight, lastIdleInputHeightRef.current)\n : estimatedInputHeight;\n const reservedRows =\n (errorMsg ? 1 : 0)\n + inspectorHeight\n + inputAreaHeight\n + 1;\n const messageAreaHeight = Math.max(1, termSize.rows - reservedRows);\n const effectiveSelectedTaskId = selectedTaskId ?? selectDefaultInspectorTaskId(pipelinePhases);\n\n return (\n <Box flexDirection=\"column\" height={termSize.rows}>\n {errorMsg && (\n <Box paddingX={1}>\n <Text color=\"red\">{errorMsg}</Text>\n </Box>\n )}\n\n {showWelcome ? (\n <WelcomeScreen />\n ) : (\n <MessageList\n messages={messages}\n streamingContent={streamingContent}\n livePhases={pipelinePhases}\n availableHeight={messageAreaHeight}\n scrollOffset={scrollOffset}\n />\n )}\n\n {isInspectorOpen && !showWelcome && (\n <LiveTaskInspector\n phases={pipelinePhases}\n selectedTaskId={effectiveSelectedTaskId}\n maxHeight={inspectorHeight}\n />\n )}\n\n <Box height={inputAreaHeight} overflow=\"hidden\" flexDirection=\"column\">\n {showApproval ? (\n <DiffApprovalSelect onSelect={handleDiffApproval} />\n ) : (\n <InputBox\n value={input}\n onChange={setInput}\n onSubmit={handleSubmit}\n isBusy={isBusy}\n isRouting={isRouting}\n contextChips={contextChips}\n />\n )}\n </Box>\n\n <Box height={1} overflow=\"hidden\">\n <StatusBar\n currentModel={currentModel}\n sessionTokens={sessionTokens}\n sessionCost={sessionCost}\n monthlyCost={monthlyCost}\n savingsPct={savingsPct}\n agentMode={agentMode ?? 'auto'}\n inspectorHint={pipelinePhases.length > 0 ? 'Tab inspector' : undefined}\n />\n </Box>\n </Box>\n );\n}\n\n/** Load context chips from .mint/context.json if it exists. */\nasync function loadContextChips(): Promise<ContextChip[] | null> {\n try {\n const { readFileSync } = await import('node:fs');\n const { join } = await import('node:path');\n const indexPath = join(process.cwd(), '.mint', 'context.json');\n const raw = readFileSync(indexPath, 'utf-8');\n const index = JSON.parse(raw);\n\n const chips: ContextChip[] = [];\n if (index.language) chips.push({ label: index.language, color: 'green' });\n if (index.totalFiles) chips.push({ label: `${index.totalFiles} files`, color: 'blue' });\n if (index.framework) chips.push({ label: index.framework, color: 'yellow' });\n chips.push({ label: 'indexed', color: 'cyan' });\n\n return chips.length > 0 ? chips : null;\n } catch {\n return null;\n }\n}\n\nfunction getInspectorTaskIds(phases: PipelinePhaseData[]): string[] {\n return flattenInspectorTasks(phases).map((task) => task.taskId ?? task.id);\n}\n\nfunction selectDefaultInspectorTaskId(phases: PipelinePhaseData[]): string | null {\n const tasks = flattenInspectorTasks(phases);\n return tasks[0]?.taskId ?? tasks[0]?.id ?? null;\n}\n\nfunction flattenInspectorTasks(phases: PipelinePhaseData[]): SubtaskData[] {\n return [...phases.flatMap((phase) => phase.subtasks ?? [])].sort((left, right) => {\n return rankInspectorTask(right) - rankInspectorTask(left);\n });\n}\n\nfunction rankInspectorTask(task: SubtaskData): number {\n const statusRank = (() => {\n switch (task.status) {\n case 'waiting_approval': return 5;\n case 'running': return 4;\n case 'retry': return 3;\n case 'blocked': return 2;\n case 'queued': return 1;\n default: return 0;\n }\n })();\n return statusRank * 1000 + (task.recentLogs?.length ?? 0);\n}\n","/**\n * CLI wrapper for the v2 orchestrator.\n * Shows real-time progress as the orchestrator works.\n */\nimport chalk from 'chalk';\nimport { runOrchestrator } from '../../orchestrator/loop.js';\n\nexport async function runOrchestratorCLI(task: string): Promise<void> {\n const cwd = process.cwd();\n\n console.log(chalk.dim(`\\n Task: ${task}\\n`));\n\n const result = await runOrchestrator(task, cwd, {\n onLog: (msg) => {\n process.stdout.write(chalk.dim(` ${msg}\\n`));\n },\n onText: (text) => {\n process.stdout.write(text);\n },\n onToolCall: (name, input) => {\n const preview = name === 'write_code'\n ? `task: \"${String(input.task ?? '').slice(0, 60)}...\"`\n : name === 'read_file'\n ? String(input.path ?? '')\n : name === 'search_files'\n ? String(input.query ?? '')\n : name === 'run_command'\n ? String(input.command ?? '').slice(0, 60)\n : name === 'apply_diff'\n ? '(applying...)'\n : JSON.stringify(input).slice(0, 60);\n console.log(chalk.cyan(` > ${name}`) + chalk.dim(` ${preview}`));\n },\n onToolResult: (name, result) => {\n if (name === 'search_files' || name === 'list_files') {\n console.log(chalk.dim(` ${result.split('\\n').length} results`));\n } else if (name === 'apply_diff') {\n console.log(chalk.green(` ${result.slice(0, 100)}`));\n }\n },\n });\n\n // Summary\n const duration = (result.duration / 1000).toFixed(1);\n const opusCost = result.totalCost * 50; // rough Opus equivalent\n console.log('');\n console.log(chalk.dim(` ${result.iterations} steps · ${duration}s · $${result.totalCost.toFixed(4)} (orchestrator: $${result.orchestratorCost.toFixed(4)} + code: $${result.writeCodeCost.toFixed(4)})`));\n if (opusCost > result.totalCost * 2) {\n console.log(chalk.dim(` Opus equivalent: $${opusCost.toFixed(2)} — saved ${Math.round((1 - result.totalCost / opusCost) * 100)}%`));\n }\n console.log('');\n}\n","import React from 'react';\nimport { Box, Text, useInput, useApp } from 'ink';\nimport { getUsageDb } from './tracker.js';\nimport type { UsageSummary, SessionSummary } from './db.js';\n\nfunction formatCost(cost: number): string {\n if (cost < 0.001) return `${(cost * 100_000).toFixed(3)}mc`;\n if (cost < 0.01) return `${(cost * 100).toFixed(4)}c`;\n return `$${cost.toFixed(4)}`;\n}\n\ninterface DashboardProps {\n summary: UsageSummary;\n sessions: SessionSummary[];\n totalSaved: number;\n}\n\nfunction Dashboard({ summary, sessions, totalSaved }: DashboardProps): React.ReactElement {\n const { exit } = useApp();\n\n useInput((input, key) => {\n if (input === 'q' || key.ctrl && input === 'c') {\n exit();\n }\n });\n\n const avgCost = summary.totalRequests > 0\n ? summary.totalCost / summary.totalRequests\n : 0;\n\n const opusWouldCost = summary.totalOpusCost;\n\n // Model breakdown\n const modelEntries = Object.entries(summary.byModel)\n .sort((a, b) => b[1].requests - a[1].requests);\n\n const totalReq = summary.totalRequests || 1;\n const topModels = modelEntries.slice(0, 3);\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n {/* Header */}\n <Box borderStyle=\"single\" borderColor=\"cyan\" paddingX={2} marginBottom={1}>\n <Text bold color=\"cyan\">AXON -- Usage Dashboard</Text>\n </Box>\n\n {/* Total Saved */}\n <Text bold color=\"yellow\">TOTAL SAVED vs Claude Opus</Text>\n <Box borderStyle=\"double\" borderColor=\"green\" paddingX={2} paddingY={0} marginBottom={1}>\n <Box flexDirection=\"column\">\n <Text bold color=\"green\">{`$${totalSaved.toFixed(2)} saved`}</Text>\n {opusWouldCost > 0 && (\n <Text dimColor>{`(would have cost $${opusWouldCost.toFixed(2)} with Opus)`}</Text>\n )}\n </Box>\n </Box>\n\n {/* This period summary */}\n <Text bold color=\"yellow\">ALL TIME</Text>\n <Box marginBottom={1} flexDirection=\"column\">\n <Text>{`Requests: ${summary.totalRequests.toString().padEnd(10)} Avg cost: ${formatCost(avgCost)}`}</Text>\n <Text>{`Total cost: ${formatCost(summary.totalCost).padEnd(10)} Saved: ${formatCost(totalSaved)}`}</Text>\n {topModels.length > 0 && (\n <Text>\n {`Models: `}\n {topModels.map(([m, s]) => `${m} (${Math.round((s.requests / totalReq) * 100)}%)`).join(' ')}\n </Text>\n )}\n </Box>\n\n {/* Top sessions */}\n {sessions.length > 0 && (\n <>\n <Text bold color=\"yellow\">TOP SESSIONS (recent)</Text>\n <Box flexDirection=\"column\" marginBottom={1}>\n {sessions.slice(0, 5).map((s, i) => (\n <Text key={i}>\n {`${s.taskPreview.slice(0, 40).padEnd(40)} ${formatCost(s.cost).padStart(8)} saved ${formatCost(s.savedAmount)}`}\n </Text>\n ))}\n </Box>\n </>\n )}\n\n {/* Model breakdown */}\n {modelEntries.length > 0 && (\n <>\n <Text bold color=\"yellow\">MODEL BREAKDOWN</Text>\n <Box flexDirection=\"column\" marginBottom={1}>\n {modelEntries.slice(0, 6).map(([model, stats], i) => {\n const avg = stats.requests > 0 ? stats.cost / stats.requests : 0;\n return (\n <Text key={i}>\n {`${model.padEnd(22)} ${stats.requests.toString().padStart(4)} req ${formatCost(stats.cost).padStart(9)} avg ${formatCost(avg)}`}\n </Text>\n );\n })}\n </Box>\n </>\n )}\n\n {/* Footer */}\n <Text dimColor>[q] quit</Text>\n </Box>\n );\n}\n\nexport async function renderDashboard(): Promise<void> {\n const { render } = await import('ink');\n\n const db = getUsageDb();\n const summary = db.getSummary();\n const sessions = db.getRecentSessions(10);\n const totalSaved = db.getTotalSaved();\n\n const app = render(\n React.createElement(Dashboard, { summary, sessions, totalSaved })\n );\n await app.waitUntilExit();\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname, resolve, sep } from 'node:path';\nimport { runPrompt } from './commands/run.js';\nimport { login, logout, whoami, signup } from './commands/auth.js';\nimport { showConfig, setConfig } from './commands/config.js';\nimport { compareModels } from './commands/compare.js';\nimport { showUsage } from './commands/usage.js';\n\nconst program = new Command();\n\nprogram\n .name('mint')\n .description('AI coding CLI with smart model routing')\n .version('0.1.0');\n\n// Main command - run a prompt\nprogram\n .argument('[prompt...]', 'The prompt to send to the AI')\n .option('-m, --model <model>', 'Model to use (auto, deepseek, sonnet, opus)', 'auto')\n .option('-c, --compare', 'Compare results across models')\n .option('--no-context', 'Disable automatic context gathering')\n .option('-v, --verbose', 'Show detailed output including tokens and cost')\n .option('--v2', 'V2 orchestrator mode — single smart loop with tool calling')\n .option('--simple', 'Simple mode — one LLM call, no agents, just diffs')\n .option('--legacy', 'Use legacy single-call mode instead of pipeline')\n .option('--auto', 'Auto mode — apply changes without asking')\n .option('--yolo', 'Full autonomy — no approvals at all')\n .option('--plan', 'Plan mode — ask clarifying questions first')\n .option('--diff', 'Diff mode — review each file change')\n .action(async (promptParts: string[], options) => {\n const prompt = promptParts.join(' ').trim();\n const agentMode = options.yolo ? 'yolo' : options.plan ? 'plan' : options.diff ? 'diff' : options.auto ? 'auto' : undefined;\n\n if (options.simple && prompt) {\n const { runSimple } = await import('./commands/simple.js');\n await runSimple(prompt);\n return;\n }\n\n if (!prompt) {\n // No args → open TUI with orchestrator\n const { render } = await import('ink');\n const React = await import('react');\n const { App } = await import('../tui/App.js');\n const app = render(\n React.default.createElement(App, {\n modelPreference: options.model,\n agentMode,\n useOrchestrator: !options.legacy,\n })\n );\n await app.waitUntilExit();\n return;\n }\n\n // Legacy pipeline mode\n if (options.legacy) {\n await runOneShotPipeline(prompt, options);\n return;\n }\n\n // Default: v2 orchestrator\n const { runOrchestratorCLI } = await import('./commands/orchestrator.js');\n await runOrchestratorCLI(prompt);\n });\n\n// Auth commands\nprogram\n .command('signup')\n .description('Create a new Mint account')\n .action(signup);\n\nprogram\n .command('login')\n .description('Login with email and password')\n .action(login);\n\nprogram\n .command('logout')\n .description('Clear local credentials')\n .action(logout);\n\nprogram\n .command('whoami')\n .description('Show current user info')\n .action(whoami);\n\n// Config commands\nprogram\n .command('config')\n .description('Show current configuration')\n .action(showConfig);\n\nprogram\n .command('config:set <key> <value>')\n .description('Set a configuration value')\n .action(setConfig);\n\n// Compare command\nprogram\n .command('compare <prompt...>')\n .description('Run prompt on multiple models and compare results')\n .option('--models <models>', 'Comma-separated list of models', 'deepseek,sonnet')\n .action(async (promptParts: string[], options) => {\n const prompt = promptParts.join(' ');\n await compareModels(prompt, options);\n });\n\n// Usage command (legacy text view)\nprogram\n .command('usage:legacy')\n .description('Show usage statistics (legacy text view)')\n .option('-d, --days <days>', 'Number of days to show', '7')\n .action(showUsage);\n\n// Usage dashboard command (Ink TUI)\nprogram\n .command('usage')\n .description('Show interactive usage dashboard with savings vs Claude Opus')\n .action(async () => {\n const { renderDashboard } = await import('../usage/dashboard.js');\n await renderDashboard();\n });\n\n// Savings command — one-liner for sharing\nprogram\n .command('savings')\n .description('Show total $ saved vs Claude Opus (shareable one-liner)')\n .action(async () => {\n const { getUsageDb } = await import('../usage/tracker.js');\n const db = getUsageDb();\n const summary = db.getSummary();\n const totalSaved = db.getTotalSaved();\n const { totalRequests, totalCost } = summary;\n const avgSavingsPct = totalCost + totalSaved > 0\n ? Math.round((totalSaved / (totalCost + totalSaved)) * 100)\n : 0;\n console.log(\n chalk.green(`$${totalSaved.toFixed(2)} saved vs Claude Opus`) +\n chalk.dim(` (${totalRequests} requests · ${avgSavingsPct}% avg savings)`)\n );\n });\n\n// Chat TUI command\nprogram\n .command('chat')\n .description('Start interactive AI chat session')\n .argument('[prompt...]', 'Optional initial prompt')\n .option('-m, --model <model>', 'Model to use (auto, deepseek, sonnet, opus)', 'auto')\n .option('--auto', 'Auto mode — apply changes without asking')\n .option('--yolo', 'Full autonomy — no approvals at all')\n .option('--plan', 'Plan mode — ask clarifying questions first')\n .option('--diff', 'Diff mode — review each file change')\n .action(async (promptParts: string[], options) => {\n const { render } = await import('ink');\n const React = await import('react');\n const { App } = await import('../tui/App.js');\n const initialPrompt = promptParts.join(' ').trim();\n const agentMode = options.yolo ? 'yolo' : options.plan ? 'plan' : options.diff ? 'diff' : options.auto ? 'auto' : undefined;\n const app = render(\n React.default.createElement(App, {\n initialPrompt: initialPrompt || undefined,\n modelPreference: options.model,\n agentMode,\n })\n );\n await app.waitUntilExit();\n });\n\n// Agent command\nprogram\n .command('agent')\n .description('Run the AI coding agent on a task (autonomous tool use)')\n .argument('[task...]', 'Task description for the agent')\n .option('-m, --model <model>', 'Model to use (default: deepseek-v3)', 'deepseek-v3')\n .option('-v, --verbose', 'Show verbose output')\n .option('--auto', 'Auto mode — skip approval prompts except risky bash commands')\n .option('--yolo', 'No approvals — full autonomy mode')\n .option('--plan', 'Plan only — no writes, show intent')\n .option('--diff', 'Show diffs and require approval for each change')\n .action(async (taskParts: string[], options) => {\n const task = taskParts.join(' ').trim();\n if (!task) {\n console.error(chalk.red('Error: task description required. Example: axon agent \"add a hello world function\"'));\n process.exit(1);\n }\n const { runAgent } = await import('../agent/index.js');\n type AgentMode = 'yolo' | 'plan' | 'diff' | 'auto';\n const mode: AgentMode = resolveAgentMode(options);\n\n const abortController = new AbortController();\n\n // Handle Ctrl+C\n process.on('SIGINT', () => {\n abortController.abort();\n process.stdout.write('\\n' + chalk.yellow('[agent] Interrupted\\n'));\n process.exit(0);\n });\n\n console.log(chalk.cyan(`\\n[axon agent] Task: ${task}`));\n console.log(chalk.gray(`[axon agent] Model: ${options.model} | Mode: ${mode} | cwd: ${process.cwd()}\\n`));\n\n // Interactive approval callbacks (used in auto/diff modes)\n const readline = await import('node:readline');\n\n const onIterationApprovalNeeded = async (\n iteration: number,\n toolCalls: Array<{ name: string; input: Record<string, unknown> }>,\n ): Promise<boolean> => {\n console.log(chalk.blue(`\\n[review] Iteration ${iteration} proposes destructive actions:`));\n for (const toolCall of toolCalls) {\n const preview = JSON.stringify(toolCall.input).slice(0, 120);\n console.log(chalk.dim(` - ${toolCall.name} ${preview}`));\n }\n\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise(resolve => {\n rl.question(chalk.yellow('Continue with this iteration? [y/N] '), (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'y');\n });\n });\n };\n\n const onApprovalNeeded = async (toolName: string, toolInput: Record<string, unknown>): Promise<boolean> => {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise(resolve => {\n rl.question(\n chalk.yellow(`\\n[approve] ${toolName}(${JSON.stringify(toolInput).slice(0, 80)})\\nAllow? [y/n] `),\n (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'y');\n }\n );\n });\n };\n\n const onDiffProposed = async (filePath: string, diff: string): Promise<boolean> => {\n const { formatRawUnifiedDiff } = await import('../pipeline/index.js');\n console.log(chalk.blue(`\\n--- diff: ${filePath} ---`));\n console.log(formatRawUnifiedDiff(diff));\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise(resolve => {\n rl.question(chalk.yellow('Apply? [y/n] '), (answer) => {\n rl.close();\n resolve(answer.trim().toLowerCase() === 'y');\n });\n });\n };\n\n try {\n await runAgent(task, {\n model: options.model,\n cwd: process.cwd(),\n signal: abortController.signal,\n verbose: options.verbose ?? false,\n mode,\n onApprovalNeeded: mode !== 'yolo' ? onApprovalNeeded : undefined,\n onDiffProposed: mode === 'diff' ? onDiffProposed : undefined,\n onIterationApprovalNeeded: mode === 'diff' ? onIterationApprovalNeeded : undefined,\n });\n } catch (err) {\n console.error(chalk.red('[agent error]'), err instanceof Error ? err.message : String(err));\n process.exit(1);\n }\n });\n\n// Models command\nprogram\n .command('models')\n .description('List available models and their tiers')\n .action(async () => {\n const { listModels } = await import('../providers/index.js');\n const { getTier } = await import('../providers/tiers.js');\n for (const m of listModels()) {\n const tier = getTier(m.id as import('../providers/types.js').ModelId);\n console.log(`${m.id.padEnd(22)} ${m.provider.padEnd(12)} ${tier}`);\n }\n });\n\n// Init command — scan project, build search index\nprogram\n .command('init')\n .description('Scan project and build search index')\n .action(async () => {\n const { indexProject } = await import('../context/index.js');\n const cwd = process.cwd();\n\n console.log(chalk.cyan('\\n Mint Init\\n'));\n console.log(chalk.dim(' Scanning project...\\n'));\n\n const index = await indexProject(cwd, {\n onProgress: (msg) => console.log(chalk.dim(` ${msg}`)),\n });\n\n // Show summary\n const languages = new Map<string, number>();\n for (const file of Object.values(index.files)) {\n const lang = file.language || 'other';\n languages.set(lang, (languages.get(lang) ?? 0) + 1);\n }\n const topLangs = [...languages.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5)\n .map(([lang, count]) => `${lang} (${count})`)\n .join(', ');\n\n // Check for package.json dependencies\n let depCount = 0;\n try {\n const { readFileSync } = await import('node:fs');\n const { join } = await import('node:path');\n const pkg = JSON.parse(readFileSync(join(cwd, 'package.json'), 'utf-8'));\n depCount = Object.keys(pkg.dependencies ?? {}).length + Object.keys(pkg.devDependencies ?? {}).length;\n } catch { /* no package.json */ }\n\n console.log(chalk.green(`\\n Ready.`));\n console.log(chalk.dim(` ${index.totalFiles} files · ${index.totalLOC.toLocaleString()} lines of code`));\n console.log(chalk.dim(` Languages: ${topLangs}`));\n if (depCount > 0) console.log(chalk.dim(` ${depCount} dependencies`));\n console.log(chalk.dim(` Index: .mint/context.json`));\n console.log(chalk.dim(`\\n Run ${chalk.cyan('mint')} to start editing.\\n`));\n });\n\n// Skills command\nprogram\n .command('skills')\n .description('List all skills in .mint/skills/')\n .action(async () => {\n const { loadSkills } = await import('../context/skills.js');\n const skills = loadSkills(process.cwd());\n if (skills.length === 0) {\n console.log(chalk.dim('No skills found. Run mint init to generate starter skills.'));\n return;\n }\n for (const skill of skills) {\n const applies = skill.appliesTo === 'all' ? 'all' : (skill.appliesTo as string[]).join(', ');\n console.log(` ${chalk.cyan(skill.name)} ${chalk.dim(`\\u2192 ${applies}`)}`);\n }\n });\n\n// Parse and run\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(chalk.red('Error:'), err.message);\n process.exit(1);\n});\n\nfunction resolveAgentMode(options: {\n auto?: boolean;\n yolo?: boolean;\n plan?: boolean;\n diff?: boolean;\n}): 'yolo' | 'plan' | 'diff' | 'auto' {\n if (options.yolo) return 'yolo';\n if (options.plan) return 'plan';\n if (options.auto) return 'auto';\n if (options.diff) return 'diff';\n\n const envMode = process.env.MINT_AGENT_MODE?.trim().toLowerCase();\n if (envMode === 'yolo' || envMode === 'plan' || envMode === 'diff' || envMode === 'auto') {\n return envMode;\n }\n\n const humanInLoop = parseHumanInLoopEnv(process.env.MINT_HUMAN_IN_THE_LOOP);\n if (humanInLoop != null) {\n return humanInLoop ? 'diff' : 'auto';\n }\n\n return 'diff';\n}\n\nfunction parseHumanInLoopEnv(raw: string | undefined): boolean | undefined {\n if (raw == null) return undefined;\n\n const normalized = raw.trim().toLowerCase();\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true;\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false;\n return true;\n}\n\n// ─── One-shot pipeline ──────────────────────────────────────────────────────\n\nasync function runOneShotPipeline(\n task: string,\n options: { model?: string; verbose?: boolean },\n): Promise<void> {\n const { runPipeline, formatDiffs, formatCostSummary } = await import('../pipeline/index.js');\n const { createUsageTracker } = await import('../usage/tracker.js');\n const { MODELS } = await import('../providers/types.js');\n const { getTier } = await import('../providers/tiers.js');\n const cwd = process.cwd();\n\n const modelMap: Record<string, string> = {\n deepseek: 'deepseek-v3', sonnet: 'claude-sonnet-4', opus: 'claude-opus-4',\n gemini: 'gemini-2-flash', groq: 'groq-llama-70b',\n };\n const modelId = options.model && options.model !== 'auto'\n ? (modelMap[options.model] ?? options.model) as import('../providers/types.js').ModelId\n : undefined;\n\n console.log(chalk.cyan(`\\n Task: ${task}\\n`));\n\n const abortController = new AbortController();\n process.on('SIGINT', () => {\n abortController.abort();\n console.log(chalk.yellow('\\n Interrupted'));\n process.exit(0);\n });\n\n try {\n let result: import('../pipeline/types.js').PipelineResult | undefined;\n\n // Stream pipeline events — show each phase as it happens\n for await (const chunk of runPipeline(task, {\n cwd,\n model: modelId,\n signal: abortController.signal,\n })) {\n switch (chunk.type) {\n case 'phase-start': {\n const model = chunk.phaseModel ? chalk.dim(` · ${chunk.phaseModel}`) : '';\n process.stdout.write(chalk.cyan(` ⟳ ${chunk.phase}${model}...`));\n // Show subtask list for parallel builders\n if (chunk.subtasks && chunk.subtasks.length > 0) {\n process.stdout.write('\\n');\n for (let i = 0; i < chunk.subtasks.length; i++) {\n const st = chunk.subtasks[i];\n const prefix = i === chunk.subtasks.length - 1 ? ' └─' : ' ├─';\n console.log(chalk.dim(`${prefix} #${st.id} ${st.description}`));\n }\n }\n break;\n }\n\n case 'phase-done': {\n // Clear the \"⟳ PHASE...\" line and replace with \"✓ PHASE\"\n process.stdout.write('\\r\\x1B[K'); // clear current line\n const dur = chunk.phaseDuration != null ? chalk.dim(` · ${chunk.phaseDuration < 1000 ? `${chunk.phaseDuration}ms` : `${(chunk.phaseDuration / 1000).toFixed(1)}s`}`) : '';\n const cost = chunk.phaseCost != null ? chalk.dim(` · ${chunk.phaseCost < 0.01 ? `${(chunk.phaseCost * 100).toFixed(3)}¢` : `$${chunk.phaseCost.toFixed(4)}`}`) : '';\n console.log(chalk.green(` ✓ ${chunk.phase}${dur}${cost}`));\n if (chunk.phaseSummary) {\n console.log(chalk.dim(` ${chunk.phaseSummary}`));\n }\n // Show completed subtasks\n if (chunk.subtasks && chunk.subtasks.length > 0) {\n for (let i = 0; i < chunk.subtasks.length; i++) {\n const st = chunk.subtasks[i];\n const prefix = i === chunk.subtasks.length - 1 ? ' └─' : ' ├─';\n const stDur = st.duration != null ? ` · ${st.duration < 1000 ? `${st.duration}ms` : `${(st.duration / 1000).toFixed(1)}s`}` : '';\n const stCost = st.cost != null ? ` · ${st.cost < 0.01 ? `${(st.cost * 100).toFixed(3)}¢` : `$${st.cost.toFixed(4)}`}` : '';\n console.log(chalk.dim(`${prefix} ✓ #${st.id} ${st.description}${stDur}${stCost}`));\n }\n }\n break;\n }\n\n case 'task-start':\n if (chunk.task) {\n console.log(chalk.cyan(` ⟳ #${chunk.task.subtaskId ?? chunk.task.taskId} ${chunk.task.description}`));\n }\n break;\n\n case 'task-progress':\n if (chunk.task?.progressSummary) {\n console.log(chalk.dim(` ${chunk.task.progressSummary}`));\n }\n break;\n\n case 'task-done':\n if (chunk.task) {\n const suffix = [\n chunk.task.model,\n chunk.task.duration != null ? (chunk.task.duration < 1000 ? `${chunk.task.duration}ms` : `${(chunk.task.duration / 1000).toFixed(1)}s`) : null,\n chunk.task.cost != null ? (chunk.task.cost < 0.01 ? `${(chunk.task.cost * 100).toFixed(3)}¢` : `$${chunk.task.cost.toFixed(4)}`) : null,\n ].filter(Boolean).join(' · ');\n console.log(chalk.green(` ✓ #${chunk.task.subtaskId ?? chunk.task.taskId} ${chunk.task.description}${suffix ? ` · ${suffix}` : ''}`));\n }\n break;\n\n case 'task-failed':\n if (chunk.task) {\n console.log(chalk.red(` ✗ #${chunk.task.subtaskId ?? chunk.task.taskId} ${chunk.task.description}`));\n if (chunk.task.progressSummary) {\n console.log(chalk.red(` ${chunk.task.progressSummary}`));\n }\n }\n break;\n\n case 'task-notification':\n case 'task-log':\n break;\n\n case 'text':\n // Don't show raw text — we'll show formatted diffs from the result\n break;\n\n case 'done':\n result = chunk.result;\n break;\n\n case 'error':\n throw new Error(chunk.error);\n }\n }\n\n if (!result) throw new Error('Pipeline completed without producing a result');\n\n // Show the response text (without diff blocks or reasoning headers)\n let textWithoutDiffs = result.response\n .replace(/```diff[\\s\\S]*?```/g, '')\n .replace(/^#{1,3}\\s*Reasoning\\b.*$/im, '')\n .replace(/<think>[\\s\\S]*?<\\/think>/g, '')\n .trim();\n textWithoutDiffs = textWithoutDiffs.replace(/\\n{3,}/g, '\\n\\n').replace(/^\\n+/, '').replace(/\\n+$/, '');\n if (textWithoutDiffs) {\n console.log('\\n' + textWithoutDiffs);\n }\n\n // Show colored diffs\n if (result.diffs.length > 0) {\n console.log(formatDiffs(result.diffs));\n }\n\n // Show cost summary\n console.log(formatCostSummary(\n result.cost,\n result.opusCost,\n result.duration,\n result.diffs.map(d => d.filePath),\n ));\n\n // Track usage\n const tracker = createUsageTracker(Date.now().toString(36), 'pipeline');\n const modelInfo = MODELS[result.model];\n tracker.track({\n model: result.model,\n provider: modelInfo?.provider ?? 'unknown',\n tier: getTier(result.model),\n inputTokens: result.inputTokens,\n outputTokens: result.outputTokens,\n cost: result.cost,\n opusCost: result.opusCost,\n savedAmount: Math.max(0, result.opusCost - result.cost),\n routingReason: `pipeline → ${result.model}`,\n taskPreview: task,\n latencyMs: result.duration,\n costSonnet: 0,\n });\n\n // Apply diffs if any\n if (result.diffs.length > 0) {\n const answer = await askUser('\\n Apply changes? [Y/n] ');\n if (answer.toLowerCase() !== 'n') {\n applyDiffs(result.diffs, cwd);\n } else {\n console.log(chalk.dim(' Changes not applied.'));\n }\n }\n\n console.log('');\n } catch (err) {\n console.error(chalk.red(`\\n Error: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n}\n\nasync function askUser(prompt: string): Promise<string> {\n const { createInterface } = await import('node:readline');\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise(resolve => {\n rl.question(prompt, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction applyDiffs(\n diffs: import('../pipeline/types.js').ParsedDiff[],\n cwd: string,\n): void {\n const cwdAbs = resolve(cwd);\n for (const diff of diffs) {\n const fullPath = resolve(cwdAbs, diff.filePath);\n if (!fullPath.startsWith(cwdAbs + sep) && fullPath !== cwdAbs) {\n console.log(chalk.red(` ! Blocked path outside project: ${diff.filePath}`));\n continue;\n }\n\n try {\n // New file (old was /dev/null)\n if (diff.oldContent === '') {\n mkdirSync(dirname(fullPath), { recursive: true });\n const newContent = diff.hunks\n .flatMap(h => h.lines.filter(l => l.type !== 'remove').map(l => l.content))\n .join('\\n');\n writeFileSync(fullPath, newContent + '\\n', 'utf-8');\n console.log(chalk.green(` + Created ${diff.filePath}`));\n continue;\n }\n\n // Edit existing file — apply hunks\n const current = readFileSync(fullPath, 'utf-8');\n let updated = current;\n\n for (const hunk of diff.hunks) {\n const removeLines = hunk.lines.filter(l => l.type === 'remove').map(l => l.content);\n const addLines = hunk.lines.filter(l => l.type === 'add').map(l => l.content);\n\n if (removeLines.length > 0) {\n const oldBlock = removeLines.join('\\n');\n const newBlock = addLines.join('\\n');\n if (updated.includes(oldBlock)) {\n updated = updated.replace(oldBlock, newBlock);\n } else {\n // Fallback: try matching each remove line individually (trimmed)\n // Handles minor whitespace differences in model output\n let fallbackUpdated = updated;\n let allFound = true;\n for (let i = 0; i < removeLines.length; i++) {\n const removeLine = removeLines[i];\n const addLine = addLines[i] ?? '';\n if (fallbackUpdated.includes(removeLine)) {\n fallbackUpdated = fallbackUpdated.replace(removeLine, addLine);\n } else {\n allFound = false;\n break;\n }\n }\n if (allFound && fallbackUpdated !== updated) {\n updated = fallbackUpdated;\n }\n }\n }\n }\n\n if (updated !== current) {\n writeFileSync(fullPath, updated, 'utf-8');\n console.log(chalk.green(` ~ Modified ${diff.filePath}`));\n } else {\n console.log(chalk.yellow(` ? Could not apply diff to ${diff.filePath} (text not found)`));\n }\n } catch (err) {\n console.log(chalk.red(` ! Error applying to ${diff.filePath}: ${err instanceof Error ? err.message : String(err)}`));\n }\n }\n}\n","import chalk from 'chalk';\nimport boxen from 'boxen';\nimport { createInterface } from 'node:readline';\nimport { config } from '../../utils/config.js';\n\nfunction prompt(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n}\n\nfunction promptHidden(question: string): Promise<string> {\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n return new Promise((resolve) => {\n // Disable echo for password input\n if (process.stdin.isTTY) process.stdin.setRawMode?.(true);\n process.stdout.write(question);\n let password = '';\n const onData = (ch: Buffer) => {\n const c = ch.toString();\n if (c === '\\n' || c === '\\r') {\n process.stdin.removeListener('data', onData);\n if (process.stdin.isTTY) process.stdin.setRawMode?.(false);\n process.stdout.write('\\n');\n rl.close();\n resolve(password);\n } else if (c === '\\u007f' || c === '\\b') {\n if (password.length > 0) {\n password = password.slice(0, -1);\n process.stdout.write('\\b \\b');\n }\n } else if (c === '\\u0003') {\n // Ctrl+C\n process.exit(1);\n } else {\n password += c;\n process.stdout.write('*');\n }\n };\n process.stdin.on('data', onData);\n });\n}\n\nexport async function signup(): Promise<void> {\n if (config.isAuthenticated()) {\n console.log(chalk.yellow('Already logged in. Run `mint logout` first.'));\n return;\n }\n\n console.log(chalk.bold.cyan('\\n Create your Mint account\\n'));\n\n const email = await prompt(' Email: ');\n const password = await promptHidden(' Password (min 8 chars): ');\n const name = await prompt(' Name (optional): ');\n\n if (!email || !password) {\n console.log(chalk.red('\\n Email and password are required.'));\n return;\n }\n\n if (password.length < 8) {\n console.log(chalk.red('\\n Password must be at least 8 characters.'));\n return;\n }\n\n const gatewayUrl = config.getGatewayUrl();\n\n try {\n const res = await fetch(`${gatewayUrl}/auth/signup`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password, name: name || undefined }),\n });\n\n const data = await res.json() as any;\n\n if (!res.ok) {\n console.log(chalk.red(`\\n Signup failed: ${data.error || res.statusText}`));\n return;\n }\n\n // Store credentials\n config.setAll({\n apiKey: data.api_token,\n userId: data.user.id,\n email: data.user.email,\n });\n\n console.log(boxen(\n `${chalk.bold.green('Account created!')}\\n\\n` +\n `Email: ${chalk.cyan(data.user.email)}\\n` +\n `API Token: ${chalk.dim(data.api_token.slice(0, 20))}...\\n\\n` +\n `${chalk.dim('Token saved. You can now use mint commands.')}`,\n { padding: 1, borderColor: 'green', borderStyle: 'round' }\n ));\n } catch (err) {\n console.log(chalk.red(`\\n Network error: ${(err as Error).message}`));\n }\n}\n\nexport async function login(): Promise<void> {\n if (config.isAuthenticated()) {\n const email = config.get('email');\n console.log(chalk.yellow(`Already logged in as ${email}`));\n console.log(chalk.dim('Run `mint logout` to switch accounts'));\n return;\n }\n\n console.log(chalk.bold.cyan('\\n Login to Mint\\n'));\n\n const email = await prompt(' Email: ');\n const password = await promptHidden(' Password: ');\n\n if (!email || !password) {\n console.log(chalk.red('\\n Email and password are required.'));\n return;\n }\n\n const gatewayUrl = config.getGatewayUrl();\n\n try {\n const res = await fetch(`${gatewayUrl}/auth/login`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ email, password }),\n });\n\n const data = await res.json() as any;\n\n if (!res.ok) {\n console.log(chalk.red(`\\n Login failed: ${data.error || res.statusText}`));\n return;\n }\n\n // Login returns JWT but we need an API token for CLI use\n // Request a new API token using the JWT\n const tokenRes = await fetch(`${gatewayUrl}/auth/tokens`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${data.jwt}`,\n },\n body: JSON.stringify({ name: 'cli' }),\n });\n\n const tokenData = await tokenRes.json() as any;\n\n if (!tokenRes.ok) {\n console.log(chalk.red(`\\n Failed to create API token: ${tokenData.error}`));\n return;\n }\n\n // Store credentials\n config.setAll({\n apiKey: tokenData.token,\n userId: data.user.id,\n email: data.user.email,\n });\n\n console.log(chalk.green(`\\n Logged in as ${data.user.email}`));\n } catch (err) {\n console.log(chalk.red(`\\n Network error: ${(err as Error).message}`));\n }\n}\n\nexport async function logout(): Promise<void> {\n if (!config.isAuthenticated()) {\n console.log(chalk.yellow('Not currently logged in'));\n return;\n }\n\n const email = config.get('email');\n config.clear();\n console.log(chalk.green(`Logged out from ${email}`));\n}\n\nexport async function whoami(): Promise<void> {\n if (!config.isAuthenticated()) {\n console.log(chalk.yellow('Not logged in'));\n console.log(chalk.dim('Run `mint login` or `mint signup` to authenticate'));\n return;\n }\n\n const email = config.get('email');\n const configPath = config.getConfigPath();\n\n console.log(boxen(\n `${chalk.bold('Current User')}\\n\\n` +\n `Email: ${chalk.cyan(email)}\\n` +\n `Config: ${chalk.dim(configPath)}`,\n { padding: 1, borderColor: 'green', borderStyle: 'round' }\n ));\n}\n","import chalk from 'chalk';\nimport boxen from 'boxen';\nimport Table from 'cli-table3';\nimport { config } from '../../utils/config.js';\n\nexport async function showConfig(): Promise<void> {\n const currentConfig = config.getConfig();\n const configPath = config.getConfigPath();\n\n console.log(boxen(\n chalk.bold('Mint Configuration') + '\\n\\n' +\n chalk.dim(`Path: ${configPath}`),\n { padding: 1, borderColor: 'cyan', borderStyle: 'round' }\n ));\n\n const table = new Table({\n head: [chalk.cyan('Key'), chalk.cyan('Value')],\n style: { head: [], border: [] },\n });\n\n // Auth\n table.push(\n [chalk.bold('Authentication'), ''],\n [' apiKey', currentConfig.apiKey ? chalk.green('[configured]') : chalk.dim('Not set')],\n [' gatewayToken', currentConfig.gatewayToken ? chalk.green('[configured]') : chalk.dim('Not set')],\n [' email', currentConfig.email || chalk.dim('Not set')],\n [' orgId', currentConfig.orgId || chalk.dim('Personal')],\n );\n\n // Preferences\n table.push(\n ['', ''],\n [chalk.bold('Preferences'), ''],\n [' defaultModel', currentConfig.defaultModel || 'auto'],\n [' autoContext', String(currentConfig.autoContext ?? true)],\n [' maxContextTokens', String(currentConfig.maxContextTokens || 100000)],\n );\n\n table.push(\n ['', ''],\n [chalk.bold('Gateway'), ''],\n [' apiBaseUrl', currentConfig.apiBaseUrl || 'https://api.usemint.dev'],\n );\n\n // Providers\n const providers = currentConfig.providers || {};\n table.push(\n ['', ''],\n [chalk.bold('Provider Keys (BYOK)'), ''],\n [' anthropic', providers.anthropic ? chalk.green('Configured') : chalk.dim('Not set')],\n [' deepseek', providers.deepseek ? chalk.green('Configured') : chalk.dim('Not set')],\n [' openrouter', providers.openrouter ? chalk.green('Configured') : chalk.dim('Not set')],\n [' gemini', providers.gemini ? chalk.green('Configured') : chalk.dim('Not set')],\n );\n\n console.log(table.toString());\n}\n\nexport async function setConfig(key: string, value: string): Promise<void> {\n // Handle nested keys like providers.anthropic\n if (key.startsWith('providers.')) {\n const provider = key.split('.')[1];\n const currentProviders = config.get('providers') || {};\n config.set('providers', {\n ...currentProviders,\n [provider]: value,\n });\n console.log(chalk.green(`✓ Set ${key}`));\n return;\n }\n\n // Handle boolean values\n if (value === 'true' || value === 'false') {\n config.set(key as any, value === 'true');\n console.log(chalk.green(`✓ Set ${key} = ${value}`));\n return;\n }\n\n // Handle numeric values\n if (!isNaN(Number(value))) {\n config.set(key as any, Number(value));\n console.log(chalk.green(`✓ Set ${key} = ${value}`));\n return;\n }\n\n // String value\n config.set(key as any, value);\n console.log(chalk.green(`✓ Set ${key} = ${value}`));\n}\n","import chalk from 'chalk';\nimport ora from 'ora';\nimport Table from 'cli-table3';\nimport { complete } from '../../providers/index.js';\nimport { formatCost, getModelInfo } from '../../providers/router.js';\nimport { ModelId, MODELS } from '../../providers/types.js';\nimport { gatherContext, formatContextForPrompt } from '../../context/gather.js';\nimport { config } from '../../utils/config.js';\n\ninterface CompareOptions {\n models: string;\n}\n\ninterface ModelResult {\n model: ModelId;\n content: string;\n tokens: number;\n cost: number;\n latency: number;\n error?: string;\n}\n\nexport async function compareModels(prompt: string, options: CompareOptions): Promise<void> {\n const modelList = options.models.split(',').map(m => m.trim());\n \n // Map short names to IDs\n const modelMap: Record<string, ModelId> = {\n 'deepseek': 'deepseek-v3',\n 'sonnet': 'claude-sonnet-4',\n 'opus': 'claude-opus-4',\n 'gemini': 'gemini-2-pro',\n 'gpt4': 'gpt-4o',\n };\n\n const modelIds: ModelId[] = modelList.map(m => \n (modelMap[m.toLowerCase()] || m) as ModelId\n ).filter(m => MODELS[m]);\n\n if (modelIds.length === 0) {\n console.error(chalk.red('No valid models specified'));\n console.log(chalk.dim('Available: deepseek, sonnet, opus, gemini, gpt4'));\n process.exit(1);\n }\n\n console.log(chalk.bold(`\\nComparing ${modelIds.length} models on: \"${prompt.slice(0, 50)}${prompt.length > 50 ? '...' : ''}\"\\n`));\n\n // Gather context\n const cwd = process.cwd();\n let contextStr = '';\n \n const contextSpinner = ora('Gathering context...').start();\n try {\n const context = await gatherContext(cwd, { maxTokens: 50000 });\n contextStr = formatContextForPrompt(context);\n contextSpinner.succeed(`Context: ${context.files.length} files`);\n } catch {\n contextSpinner.warn('No context gathered');\n }\n\n // Build messages\n const messages = [\n { role: 'system' as const, content: 'You are an expert software engineer. Be concise.' },\n ];\n\n if (contextStr) {\n messages.push({ role: 'user' as const, content: contextStr });\n messages.push({ role: 'assistant' as const, content: 'I\\'ve reviewed the context.' });\n }\n\n messages.push({ role: 'user' as const, content: prompt });\n\n // Run on each model\n const results: ModelResult[] = [];\n\n for (const modelId of modelIds) {\n const modelInfo = getModelInfo(modelId);\n const spinner = ora(`Running on ${modelInfo.name}...`).start();\n\n try {\n const response = await complete({ model: modelId, messages });\n \n results.push({\n model: modelId,\n content: response.content,\n tokens: response.usage.totalTokens,\n cost: response.cost.total,\n latency: response.latency,\n });\n\n spinner.succeed(`${modelInfo.name}: ${response.usage.totalTokens} tokens, ${formatCost(response.cost.total)}`);\n } catch (error) {\n results.push({\n model: modelId,\n content: '',\n tokens: 0,\n cost: 0,\n latency: 0,\n error: (error as Error).message,\n });\n spinner.fail(`${modelInfo.name}: ${(error as Error).message}`);\n }\n }\n\n // Summary table\n console.log('\\n' + chalk.bold('Comparison Summary'));\n \n const table = new Table({\n head: [\n chalk.cyan('Model'),\n chalk.cyan('Tokens'),\n chalk.cyan('Cost'),\n chalk.cyan('Latency'),\n chalk.cyan('Status'),\n ],\n style: { head: [], border: [] },\n });\n\n // Sort by cost\n results.sort((a, b) => a.cost - b.cost);\n\n const cheapest = results[0]?.cost || 0;\n const mostExpensive = results[results.length - 1]?.cost || 0;\n\n for (const result of results) {\n const modelInfo = MODELS[result.model];\n const savings = mostExpensive > 0 \n ? `${Math.round((1 - result.cost / mostExpensive) * 100)}% cheaper`\n : '';\n\n table.push([\n modelInfo.name,\n result.tokens.toLocaleString(),\n formatCost(result.cost),\n `${(result.latency / 1000).toFixed(2)}s`,\n result.error \n ? chalk.red('Failed') \n : result.cost === cheapest \n ? chalk.green('✓ Cheapest')\n : chalk.dim(savings),\n ]);\n }\n\n console.log(table.toString());\n\n // Show responses\n console.log('\\n' + chalk.bold('Responses'));\n \n for (const result of results) {\n if (result.error) continue;\n \n const modelInfo = MODELS[result.model];\n console.log(chalk.cyan(`\\n─── ${modelInfo.name} ───`));\n console.log(result.content.slice(0, 500) + (result.content.length > 500 ? '...' : ''));\n }\n\n // Savings summary\n if (results.length > 1 && cheapest < mostExpensive) {\n const savings = mostExpensive - cheapest;\n const savingsPercent = Math.round((savings / mostExpensive) * 100);\n console.log(chalk.green(`\\n💰 Potential savings: ${formatCost(savings)} (${savingsPercent}%) using ${MODELS[results[0].model].name}`));\n }\n}\n","import { readFile, readdir, stat } from 'fs/promises';\nimport { join, relative, extname } from 'path';\nimport { glob } from 'glob';\nimport ignore from 'ignore';\n\nexport interface ContextFile {\n path: string;\n content: string;\n language: string;\n tokens: number; // estimated\n}\n\nexport interface Context {\n files: ContextFile[];\n totalTokens: number;\n summary: string;\n}\n\n// Language detection by extension\nconst LANGUAGE_MAP: Record<string, string> = {\n '.ts': 'typescript',\n '.tsx': 'typescript',\n '.js': 'javascript',\n '.jsx': 'javascript',\n '.py': 'python',\n '.rs': 'rust',\n '.go': 'go',\n '.java': 'java',\n '.rb': 'ruby',\n '.php': 'php',\n '.c': 'c',\n '.cpp': 'cpp',\n '.h': 'c',\n '.hpp': 'cpp',\n '.cs': 'csharp',\n '.swift': 'swift',\n '.kt': 'kotlin',\n '.scala': 'scala',\n '.md': 'markdown',\n '.json': 'json',\n '.yaml': 'yaml',\n '.yml': 'yaml',\n '.toml': 'toml',\n '.sql': 'sql',\n '.sh': 'bash',\n '.bash': 'bash',\n '.zsh': 'bash',\n '.css': 'css',\n '.scss': 'scss',\n '.html': 'html',\n '.vue': 'vue',\n '.svelte': 'svelte',\n};\n\n// Patterns to always ignore\nconst DEFAULT_IGNORES = [\n 'node_modules/**',\n '.git/**',\n 'dist/**',\n 'build/**',\n '.next/**',\n '.nuxt/**',\n 'coverage/**',\n '*.lock',\n 'package-lock.json',\n 'yarn.lock',\n 'pnpm-lock.yaml',\n '.env*',\n '*.min.js',\n '*.min.css',\n '*.map',\n '*.d.ts',\n '__pycache__/**',\n '*.pyc',\n '.venv/**',\n 'venv/**',\n 'target/**',\n '*.exe',\n '*.dll',\n '*.so',\n '*.dylib',\n];\n\n// Rough estimate: ~4 chars per token for code\nfunction estimateTokens(content: string): number {\n return Math.ceil(content.length / 4);\n}\n\nasync function loadGitignore(dir: string): Promise<ReturnType<typeof ignore>> {\n const ig = ignore();\n ig.add(DEFAULT_IGNORES);\n\n try {\n const gitignorePath = join(dir, '.gitignore');\n const content = await readFile(gitignorePath, 'utf-8');\n ig.add(content.split('\\n').filter(line => line.trim() && !line.startsWith('#')));\n } catch {\n // No .gitignore, use defaults only\n }\n\n return ig;\n}\n\nexport async function gatherContext(\n cwd: string,\n options: {\n maxTokens?: number;\n patterns?: string[];\n relevantTo?: string; // prompt to use for relevance scoring\n } = {}\n): Promise<Context> {\n const { maxTokens = 100000, patterns = ['**/*.{ts,tsx,js,jsx,py,go,rs,java,rb}'] } = options;\n\n const ig = await loadGitignore(cwd);\n const files: ContextFile[] = [];\n let totalTokens = 0;\n\n // Find all matching files\n const matches = await glob(patterns, {\n cwd,\n nodir: true,\n absolute: false,\n });\n\n // Filter out ignored files\n const validFiles = matches.filter(f => !ig.ignores(f));\n\n // Sort by likely relevance (shorter paths first, common entry points priority)\n const priorityFiles = ['index', 'main', 'app', 'server', 'lib', 'src'];\n validFiles.sort((a, b) => {\n const aHasPriority = priorityFiles.some(p => a.toLowerCase().includes(p));\n const bHasPriority = priorityFiles.some(p => b.toLowerCase().includes(p));\n if (aHasPriority && !bHasPriority) return -1;\n if (!aHasPriority && bHasPriority) return 1;\n return a.split('/').length - b.split('/').length;\n });\n\n // Read files until we hit token limit\n for (const filePath of validFiles) {\n if (totalTokens >= maxTokens) break;\n\n try {\n const fullPath = join(cwd, filePath);\n const content = await readFile(fullPath, 'utf-8');\n const tokens = estimateTokens(content);\n\n // Skip if adding this file would exceed limit\n if (totalTokens + tokens > maxTokens) {\n continue;\n }\n\n const ext = extname(filePath);\n const language = LANGUAGE_MAP[ext] || 'text';\n\n files.push({\n path: filePath,\n content,\n language,\n tokens,\n });\n\n totalTokens += tokens;\n } catch {\n // Skip unreadable files\n }\n }\n\n return {\n files,\n totalTokens,\n summary: `Gathered ${files.length} files (${totalTokens.toLocaleString()} tokens)`,\n };\n}\n\nexport function formatContextForPrompt(context: Context): string {\n if (context.files.length === 0) {\n return '';\n }\n\n let formatted = '<context>\\n';\n\n for (const file of context.files) {\n formatted += `<file path=\"${file.path}\" language=\"${file.language}\">\\n`;\n formatted += file.content;\n formatted += '\\n</file>\\n\\n';\n }\n\n formatted += '</context>';\n return formatted;\n}\n\nexport function getContextSummary(context: Context): string {\n const byLanguage = new Map<string, number>();\n \n for (const file of context.files) {\n byLanguage.set(file.language, (byLanguage.get(file.language) || 0) + 1);\n }\n\n const langSummary = Array.from(byLanguage.entries())\n .sort((a, b) => b[1] - a[1])\n .map(([lang, count]) => `${lang}: ${count}`)\n .join(', ');\n\n return `${context.files.length} files | ${context.totalTokens.toLocaleString()} tokens | ${langSummary}`;\n}\n","import chalk from 'chalk';\nimport boxen from 'boxen';\nimport Table from 'cli-table3';\nimport { config } from '../../utils/config.js';\n\ninterface UsageOptions {\n days: string;\n}\n\nexport async function showUsage(options: UsageOptions): Promise<void> {\n if (!config.isAuthenticated()) {\n console.log(chalk.yellow('Not authenticated. Usage tracking requires login.'));\n console.log(chalk.dim('Run `axon login` to authenticate'));\n return;\n }\n\n const days = parseInt(options.days, 10) || 7;\n const apiBaseUrl = config.get('apiBaseUrl') || 'https://api.axon.dev';\n const apiKey = config.get('apiKey');\n\n console.log(chalk.dim(`Fetching usage for last ${days} days...\\n`));\n\n try {\n const response = await fetch(`${apiBaseUrl}/usage?days=${days}`, {\n headers: {\n 'Authorization': `Bearer ${apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(`API error: ${response.status}`);\n }\n\n const data = await response.json() as UsageData;\n displayUsage(data, days);\n\n } catch (error) {\n // Show placeholder data for now\n console.log(chalk.dim('(Showing sample data - API not connected)\\n'));\n \n displayUsage({\n totalTokens: 1_250_000,\n totalCost: 12.50,\n totalSaved: 45.30,\n byModel: [\n { model: 'deepseek-v3', tokens: 800000, cost: 0.22, requests: 45 },\n { model: 'claude-sonnet-4', tokens: 350000, cost: 8.75, requests: 12 },\n { model: 'claude-opus-4', tokens: 100000, cost: 3.50, requests: 3 },\n ],\n byDay: [\n { date: '2026-03-21', tokens: 150000, cost: 1.50 },\n { date: '2026-03-22', tokens: 200000, cost: 2.00 },\n { date: '2026-03-23', tokens: 180000, cost: 1.80 },\n { date: '2026-03-24', tokens: 220000, cost: 2.20 },\n { date: '2026-03-25', tokens: 190000, cost: 1.90 },\n { date: '2026-03-26', tokens: 160000, cost: 1.60 },\n { date: '2026-03-27', tokens: 150000, cost: 1.50 },\n ],\n }, days);\n }\n}\n\ninterface UsageData {\n totalTokens: number;\n totalCost: number;\n totalSaved: number;\n byModel: Array<{\n model: string;\n tokens: number;\n cost: number;\n requests: number;\n }>;\n byDay: Array<{\n date: string;\n tokens: number;\n cost: number;\n }>;\n}\n\nfunction displayUsage(data: UsageData, days: number): void {\n // Summary box\n console.log(boxen(\n `${chalk.bold('Usage Summary')} (Last ${days} days)\\n\\n` +\n `Total Tokens: ${chalk.cyan(data.totalTokens.toLocaleString())}\\n` +\n `Total Cost: ${chalk.yellow('$' + data.totalCost.toFixed(2))}\\n` +\n `Total Saved: ${chalk.green('$' + data.totalSaved.toFixed(2))} vs Opus baseline`,\n { padding: 1, borderColor: 'cyan', borderStyle: 'round' }\n ));\n\n // By model table\n console.log(chalk.bold('\\nUsage by Model'));\n \n const modelTable = new Table({\n head: [\n chalk.cyan('Model'),\n chalk.cyan('Requests'),\n chalk.cyan('Tokens'),\n chalk.cyan('Cost'),\n ],\n style: { head: [], border: [] },\n });\n\n for (const row of data.byModel) {\n modelTable.push([\n row.model,\n row.requests.toString(),\n row.tokens.toLocaleString(),\n '$' + row.cost.toFixed(2),\n ]);\n }\n\n console.log(modelTable.toString());\n\n // Daily chart (simple ASCII)\n console.log(chalk.bold('\\nDaily Usage'));\n \n const maxTokens = Math.max(...data.byDay.map(d => d.tokens));\n const chartWidth = 30;\n\n for (const day of data.byDay) {\n const barLength = Math.round((day.tokens / maxTokens) * chartWidth);\n const bar = '█'.repeat(barLength);\n const date = day.date.slice(5); // MM-DD\n console.log(\n chalk.dim(date) + ' ' +\n chalk.cyan(bar) + ' ' +\n chalk.dim((day.tokens / 1000).toFixed(0) + 'K')\n );\n }\n\n // Savings insight\n if (data.totalSaved > 0) {\n const savingsPercent = Math.round((data.totalSaved / (data.totalCost + data.totalSaved)) * 100);\n console.log(chalk.green(`\\n💰 Smart routing saved you ${savingsPercent}% ($${data.totalSaved.toFixed(2)})`));\n }\n}\n"],"mappings":"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","names":["prompt","MODEL_TIERS","MODEL_MAP","OpenAI","MODEL_MAP","getGatewayUrl","getFallbacks","readFile","stat","join","extname","glob","ignore","execSync","LANGUAGE_MAP","DEFAULT_IGNORES","readFile","join","readFile","writeFile","stat","mkdir","join","estimateTokens","estimateTokens","readFile","stat","join","cache","join","estimateTokens","resolve","dirname","readFileSync","chalk","readFileSync","existsSync","join","createInterface","execSync","prompt","resolve","chalk","formatCost","continuationWidth","Box","Text","jsx","jsxs","useEffect","useState","Box","Text","jsx","jsxs","isLast","Box","Text","jsx","jsxs","Box","Text","Fragment","jsx","jsxs","React","useState","Box","Text","Spinner","jsx","jsxs","estimateTokens","Box","Text","Fragment","jsx","jsxs","formatCost","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","useState","mkdirSync","existsSync","homedir","join","homedir","join","mkdir","readFile","writeFile","existsSync","join","init_scout","existsSync","readFile","join","searchResults","uniqueStrings","init_scout","z","init_types","readFileSync","existsSync","resolve","sep","z","writeFileSync","mkdirSync","resolve","sep","dirname","z","resolveSafe","parameters","readFileSync","writeFileSync","existsSync","resolve","sep","z","resolveSafe","parameters","z","parameters","resolve","sep","z","parameters","glob","resolve","readFile","join","ignore","z","loadGitignore","parameters","readdirSync","resolve","sep","join","relative","z","parameters","existsSync","readFileSync","writeFileSync","resolve","sep","z","resolveSafe","parameters","existsSync","readFileSync","spawnSync","join","z","DEFAULT_TIMEOUT","MAX_OUTPUT","DANGEROUS_PATTERNS","parameters","spawnSync","resolve","relative","sep","z","MAX_OUTPUT","parameters","z","parameters","init_types","executeTool","createTwoFilesPatch","readFile","join","buildSearchReplacePlan","buildSearchReplacePreview","buildGitDiffOutput","init_tools","errMsg","toolMsg","executeTool","init_tools","join","readFile","glob","ignore","estimateTokens","chalk","usage","dependsOn","deriveScopeDirectory","init_architect","init_reviewer","readdir","join","estimateTokens","walk","init_architect","init_scout","init_reviewer","os","mkdir","writeFile","join","resolve","result","task","reviewerResult","uniqueStrings","chalk","formatCost","readFileSync","writeFileSync","readdirSync","mkdirSync","join","dirname","MAX_OUTPUT","init_tools","errMsg","init_loop","init_tools","useState","useCallback","useEffect","Box","Text","useInput","jsx","jsxs","resolve","runOrchestrator","input","applyDiffsToProject","errMsg","readFileSync","join","chalk","result","init_loop","React","Box","Text","useInput","useApp","Fragment","jsx","jsxs","formatCost","chalk","readFileSync","writeFileSync","mkdirSync","dirname","resolve","sep","resolve","email","chalk","boxen","providers","chalk","Table","prompt","chalk","Table","chalk","boxen","Table","prompt","runSimple","React","App","runOrchestratorCLI","renderDashboard","getUsageDb","chalk","runAgent","resolve","formatRawUnifiedDiff","listModels","getTier","indexProject","readFileSync","join","loadSkills","runPipeline","formatDiffs","formatCostSummary","createUsageTracker","MODELS","createInterface","sep","mkdirSync","dirname","writeFileSync"]}