{"version":3,"sources":["../src/utils.ts","../src/index.ts","../src/types.ts","../src/verify/patterns.ts","../src/tools/verifier.ts","../src/tools/orchestrator.ts","../src/hooks.ts","../src/loop.ts","../src/tools/registry.ts","../src/tools/tool.ts","../src/context/tokenizer.ts","../src/context/manager.ts","../src/model/project.ts","../src/context/project-context.ts","../src/permissions/engine.ts","../src/cost/tracker.ts","../src/agent.ts","../src/tools/bash.ts","../src/tools/file-read.ts","../src/tools/file-write.ts","../src/tools/file-edit.ts","../src/tools/fuzzy-edit.ts","../src/tools/glob.ts","../src/tools/grep.ts","../src/tools/web-fetch.ts","../src/context/indexer.ts","../src/llm/provider.ts","../src/llm/anthropic.ts","../src/llm/openai.ts","../src/llm/ollama.ts","../src/llm/cluster.ts","../src/llm/cost-table.ts","../src/llm/router.ts","../src/llm/index.ts","../src/stream.ts","../src/memory/store.ts","../src/memory/sqlite.ts","../src/mcp/client.ts","../src/mcp/adapter.ts","../src/cli/init.ts","../src/circuit-breaker.ts","../src/model/adapters.ts","../src/model/registry.ts","../src/model/inspector.ts","../src/verify/types.ts","../src/verify/fast-path.ts","../src/verify/slow-path.ts","../src/verify/world-model.ts","../src/verify/router.ts","../src/loop/fix.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nexport function globToRegExp(pattern: string): RegExp {\n  const parts = pattern.split(\"/\");\n  let regex = \"\";\n\n  for (let i = 0; i < parts.length; i++) {\n    const part = parts[i];\n    if (part === \"**\") {\n      regex += \"(?:[^/]*(?:\\\\/|$))*\";\n    } else {\n      const escaped = part\n        .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n        .replace(/\\*/g, \"[^/]*\")\n        .replace(/\\?/g, \"[^/]\");\n      regex += escaped + \"\\\\/\";\n    }\n  }\n\n  regex = regex.replace(/\\\\\\//g, \"/\").replace(/\\/$/, \"\");\n  return new RegExp(`(^|/)${regex}(/|$)`);\n}\n\nexport interface WalkEntry {\n  path: string;\n  stat: fs.Stats;\n}\n\nexport async function walkDir(dir: string, options?: { maxDepth?: number; followSymlinks?: boolean }): Promise<WalkEntry[]> {\n  const maxDepth = options?.maxDepth ?? Infinity;\n  const followSymlinks = options?.followSymlinks ?? false;\n  const results: WalkEntry[] = [];\n\n  async function walk(current: string, depth: number): Promise<void> {\n    if (depth > maxDepth) return;\n\n    let entries: fs.Dirent[];\n    try {\n      entries = await fs.promises.readdir(current, { withFileTypes: true });\n    } catch {\n      return;\n    }\n\n    for (const entry of entries) {\n      const fullPath = path.join(current, entry.name);\n\n      if (entry.name === \"node_modules\" || entry.name === \".git\") continue;\n\n      try {\n        let stat: fs.Stats;\n        if (entry.isSymbolicLink() && !followSymlinks) continue;\n        stat = await fs.promises.stat(fullPath);\n\n        if (stat.isFile()) {\n          results.push({ path: fullPath, stat });\n        } else if (stat.isDirectory()) {\n          await walk(fullPath, depth + 1);\n        }\n      } catch {\n        continue;\n      }\n    }\n  }\n\n  await walk(dir, 0);\n  return results;\n}\n","export { Agent } from \"./agent.js\";\nexport type { AgentConfigV2 } from \"./agent.js\";\nexport { agentLoop } from \"./loop.js\";\nexport type { AgentLoopConfig } from \"./loop.js\";\n\nexport {\n  defineTool,\n  defineToolFromClass,\n} from \"./tools/tool.js\";\nexport { ToolRegistry } from \"./tools/registry.js\";\nexport { orchestrateTools, ToolVerifier } from \"./tools/orchestrator.js\";\nexport type { Tool, ToolExecuteOptions, APIToolDefinition } from \"./tools/tool.js\";\nexport type { ToolExecutionResult, VerificationCheck, VerificationResult, VerificationRule, VerificationContext } from \"./tools/orchestrator.js\";\nexport { BashTool } from \"./tools/bash.js\";\nexport { FileReadTool } from \"./tools/file-read.js\";\nexport { FileWriteTool } from \"./tools/file-write.js\";\nexport { FileEditTool } from \"./tools/file-edit.js\";\nexport { GlobTool } from \"./tools/glob.js\";\nexport { GrepTool } from \"./tools/grep.js\";\nexport { WebFetchTool } from \"./tools/web-fetch.js\";\nexport { fuzzyReplace, fuzzyContains, FuzzyEditError } from \"./tools/fuzzy-edit.js\";\n\nexport { ContextManager } from \"./context/manager.js\";\nexport { estimateTokens, estimateMessageTokens, estimateConversationTokens } from \"./context/tokenizer.js\";\nexport type { TokenCount } from \"./context/tokenizer.js\";\nexport type { ContextCheck } from \"./context/manager.js\";\nexport { ProjectContext } from \"./context/project-context.js\";\nexport { CodebaseIndexer } from \"./context/indexer.js\";\nexport type { SymbolEntry, ImportEntry, FileEntry, CodebaseIndex } from \"./context/indexer.js\";\n\nexport { PermissionEngine } from \"./permissions/engine.js\";\nexport type { PermissionResult } from \"./permissions/engine.js\";\nexport type { PermissionConfig } from \"./types.js\";\n\nexport { createProvider, BaseProvider, RetryableError } from \"./llm/index.js\";\nexport { AnthropicProvider, OpenAIProvider, OllamaProvider, ClusterProvider } from \"./llm/index.js\";\nexport { anthropic, openai, ollama, cluster } from \"./llm/index.js\";\nexport type { Provider, ChatRequest, ChatMessage, ClusterConfig, ClusterSlot } from \"./llm/index.js\";\n\nexport { HookRunner } from \"./hooks.js\";\nexport type { AgentHooks } from \"./hooks.js\";\n\nexport { createStreamAggregator } from \"./stream.js\";\nexport type { StreamEvent } from \"./stream.js\";\n\nexport { InMemoryStore } from \"./memory/index.js\";\nexport { SQLiteStore } from \"./memory/index.js\";\nexport type { MemoryStore } from \"./memory/index.js\";\n\nexport { CostTracker } from \"./cost/index.js\";\nexport { DEFAULT_PRICING } from \"./cost/index.js\";\nexport type { CostRecord, ModelPricing } from \"./cost/index.js\";\n\nexport { TieredRouter } from \"./llm/router.js\";\nexport type { TieredRouterConfig, ModelTier, RouterStats } from \"./llm/router.js\";\n\nexport { MCPClient, loadMCPTools } from \"./mcp/index.js\";\nexport type { MCPServerConfig, MCPToolDefinition } from \"./mcp/index.js\";\n\nexport { init } from \"./cli/index.js\";\nexport type { InitOptions } from \"./cli/init.js\";\n\nexport type {\n  Message,\n  UserMessage,\n  AssistantMessage,\n  ToolResultMessage,\n  ContentBlock,\n  TextBlock,\n  ToolUseBlock,\n  ThinkingBlock,\n  LoopEvent,\n  TokenUsage,\n  ModelResponse,\n  ToolContext,\n  AgentConfig,\n  ContextConfig,\n  CompactionResult,\n} from \"./types.js\";\n\nexport {\n  DEFAULT_CONTEXT_WINDOW,\n  DEFAULT_MAX_OUTPUT_TOKENS,\n  DEFAULT_COMPACT_THRESHOLD,\n  DEFAULT_MAX_TURNS,\n  MAX_CONCURRENT_TOOLS,\n} from \"./types.js\";\n\nexport { CircuitBreaker } from \"./circuit-breaker.js\";\n\nexport { ModelRegistry } from \"./model/index.js\";\nexport { OpenAICompatAdapter, AnthropicAdapter, GoogleAIAdapter } from \"./model/index.js\";\nexport { BENCHMARK_PRESETS } from \"./model/index.js\";\nexport type {\n  ModelInfo,\n  ModelCapability,\n  BenchmarkResult,\n  BenchmarkConfig,\n  BenchmarkPreset,\n  SelectionCriteria,\n  RankedModel,\n  ProviderAdapter,\n} from \"./model/index.js\";\n\nexport { DualPathVerifier, WorldModel, runFastPath, runSlowPath, DEFAULT_ROUTING_POLICY } from \"./verify/index.js\";\nexport type {\n  SafetyClass,\n  Verdict,\n  FastPathResult,\n  SlowPathResult,\n  DualPathVerdict,\n  ToolOperation,\n  RoutingPolicy,\n} from \"./verify/index.js\";\n\nexport { FixLoop } from \"./loop/index.js\";\nexport type {\n  FixLoopConfig,\n  ParsedError as FixLoopParsedError,\n  VerificationResult as FixLoopVerificationResult,\n  FixLoopResult,\n  FixIteration,\n  FixLoopEvent,\n} from \"./loop/index.js\";\n","export type Message = UserMessage | AssistantMessage | ToolResultMessage;\n\nexport interface UserMessage {\n  role: \"user\";\n  content: string;\n}\n\nexport interface AssistantMessage {\n  role: \"assistant\";\n  content: ContentBlock[];\n}\n\nexport interface ToolResultMessage {\n  role: \"tool\";\n  tool_use_id: string;\n  content: string;\n  is_error?: boolean;\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ThinkingBlock;\n\nexport interface TextBlock {\n  type: \"text\";\n  text: string;\n}\n\nexport interface ToolUseBlock {\n  type: \"tool_use\";\n  id: string;\n  name: string;\n  input: Record<string, unknown>;\n}\n\nexport interface ThinkingBlock {\n  type: \"thinking\";\n  thinking: string;\n}\n\nexport type LoopEvent =\n  | { type: \"text\"; text: string }\n  | { type: \"thinking\"; thinking: string }\n  | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n  | { type: \"tool_result\"; id: string; name: string; output: string; isError: boolean }\n  | { type: \"error\"; error: Error }\n  | { type: \"done\"; usage: TokenUsage; messages: Message[] };\n\nexport interface TokenUsage {\n  inputTokens: number;\n  outputTokens: number;\n  cacheReadTokens?: number;\n  cacheWriteTokens?: number;\n}\n\nexport interface ModelResponse {\n  content: ContentBlock[];\n  usage: TokenUsage;\n  stopReason: \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\";\n}\n\nexport interface ToolContext {\n  cwd: string;\n  env: Record<string, string>;\n  abortSignal?: AbortSignal;\n}\n\nexport interface ProviderConfig {\n  model: string;\n  maxOutputTokens?: number;\n  temperature?: number;\n}\n\nexport interface AgentConfig {\n  model: import(\"./llm/provider.js\").Provider;\n  tools?: import(\"./tools/tool.js\").Tool[];\n  systemPrompt?: string;\n  maxTurns?: number;\n  context?: ContextConfig;\n  permissions?: PermissionConfig;\n  cwd?: string;\n  maxRetries?: number;\n  verifier?: import(\"./tools/verifier.js\").ToolVerifier;\n  dualPathVerifier?: import(\"./verify/router.js\").DualPathVerifier;\n}\n\nexport interface ContextConfig {\n  maxTokens?: number;\n  compactThreshold?: number;\n  maxOutputTokens?: number;\n}\n\nexport interface PermissionConfig {\n  allowedTools?: string[];\n  deniedTools?: string[];\n  askTools?: string[];\n  defaultAction?: \"allow\" | \"deny\" | \"ask\";\n}\n\nexport interface CompactionResult {\n  messages: Message[];\n  tokensSaved: number;\n  method: \"snip\" | \"compact\" | \"none\";\n}\n\nexport const DEFAULT_CONTEXT_WINDOW = 200_000;\nexport const DEFAULT_MAX_OUTPUT_TOKENS = 16_384;\nexport const DEFAULT_COMPACT_THRESHOLD = 0.85;\nexport const DEFAULT_MAX_TURNS = 100;\nexport const MAX_CONCURRENT_TOOLS = 10;\n","export const DANGEROUS_PATTERNS: RegExp[] = [\n  /\\brm\\s+-rf\\s+\\//,\n  /\\bdd\\s+if=/,\n  /\\bformat\\s+[A-Z]:/i,\n  /\\bshutdown\\b/,\n  /\\breboot\\b/,\n  /\\bmkfs\\b/,\n  /\\b:\\s*\\(\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;/,\n];\n\nexport const PATH_TRAVERSAL: RegExp[] = [\n  /\\.\\.\\//,\n  /\\.\\.\\\\/,\n];\n\nexport const SECRET_PATTERNS: RegExp[] = [\n  /(?:password|passwd|secret|token|api[_-]?key)\\s*[:=]\\s*[\"'][^\"']{8,}/i,\n  /sk-[a-zA-Z0-9]{20,}/,\n  /ghp_[a-zA-Z0-9]{30,}/,\n  /AKIA[A-Z0-9]{16}/,\n];\n\nexport const DESTRUCTIVE_COMMANDS: string[] = [\n  \"DROP TABLE\",\n  \"TRUNCATE\",\n  \"DELETE FROM\",\n];\n","export type VerificationSeverity = \"critical\" | \"warning\" | \"info\";\n\nexport interface VerificationCheck {\n  name: string;\n  passed: boolean;\n  severity: VerificationSeverity;\n  message: string;\n}\n\nexport interface VerificationRule {\n  name: string;\n  check: (toolName: string, input: Record<string, unknown>, context: VerificationContext) => VerificationCheck;\n}\n\nexport interface VerificationContext {\n  turnCount: number;\n  previousToolCalls: Array<{ name: string; input: Record<string, unknown> }>;\n  cwd: string;\n}\n\nexport interface VerificationResult {\n  approved: boolean;\n  checks: VerificationCheck[];\n  rejectedBy?: string;\n  reason?: string;\n}\n\nimport { DANGEROUS_PATTERNS, PATH_TRAVERSAL, SECRET_PATTERNS, DESTRUCTIVE_COMMANDS } from \"../verify/patterns.js\";\n\nexport class ToolVerifier {\n  private rules: VerificationRule[] = [];\n\n  constructor() {\n    this.rules = [\n      { name: \"dangerous_command\", check: checkDangerousCommand },\n      { name: \"path_traversal\", check: checkPathTraversal },\n      { name: \"secret_exposure\", check: checkSecretExposure },\n      { name: \"destructive_sql\", check: checkDestructiveSQL },\n      { name: \"repetitive_call\", check: checkRepetitiveCall },\n      { name: \"write_binary\", check: checkWriteBinary },\n    ];\n  }\n\n  addRule(rule: VerificationRule): void {\n    this.rules.push(rule);\n  }\n\n  verify(\n    toolName: string,\n    input: Record<string, unknown>,\n    context: VerificationContext,\n  ): VerificationResult {\n    const checks: VerificationCheck[] = [];\n\n    for (const rule of this.rules) {\n      const check = rule.check(toolName, input, context);\n      checks.push(check);\n    }\n\n    const criticalFailures = checks.filter(\n      (c) => !c.passed && c.severity === \"critical\",\n    );\n\n    if (criticalFailures.length > 0) {\n      return {\n        approved: false,\n        checks,\n        rejectedBy: criticalFailures[0].name,\n        reason: criticalFailures.map((c) => c.message).join(\"; \"),\n      };\n    }\n\n    return { approved: true, checks };\n  }\n}\n\nfunction checkDangerousCommand(\n  toolName: string,\n  input: Record<string, unknown>,\n): VerificationCheck {\n  if (toolName !== \"bash\") {\n    return { name: \"dangerous_command\", passed: true, severity: \"info\", message: \"Not a shell command\" };\n  }\n\n  const command = String(input.command ?? input.cmd ?? \"\");\n  for (const pattern of DANGEROUS_PATTERNS) {\n    if (pattern.test(command)) {\n      return {\n        name: \"dangerous_command\",\n        passed: false,\n        severity: \"critical\",\n        message: `Dangerous command pattern detected: ${pattern.source}`,\n      };\n    }\n  }\n\n  return { name: \"dangerous_command\", passed: true, severity: \"info\", message: \"No dangerous patterns\" };\n}\n\nfunction checkPathTraversal(\n  toolName: string,\n  input: Record<string, unknown>,\n): VerificationCheck {\n  const paths = [String(input.path ?? \"\"), String(input.file_path ?? \"\"), String(input.filePath ?? \"\")];\n\n  for (const p of paths) {\n    for (const pattern of PATH_TRAVERSAL) {\n      if (pattern.test(p)) {\n        return {\n          name: \"path_traversal\",\n          passed: false,\n          severity: \"critical\",\n          message: `Path traversal detected in: ${p}`,\n        };\n      }\n    }\n  }\n\n  return { name: \"path_traversal\", passed: true, severity: \"info\", message: \"No path traversal\" };\n}\n\nfunction checkSecretExposure(\n  _toolName: string,\n  input: Record<string, unknown>,\n): VerificationCheck {\n  const serialized = JSON.stringify(input);\n\n  for (const pattern of SECRET_PATTERNS) {\n    if (pattern.test(serialized)) {\n      return {\n        name: \"secret_exposure\",\n        passed: false,\n        severity: \"critical\",\n        message: \"Potential secret or credential detected in tool input\",\n      };\n    }\n  }\n\n  return { name: \"secret_exposure\", passed: true, severity: \"info\", message: \"No secrets detected\" };\n}\n\nfunction checkDestructiveSQL(\n  toolName: string,\n  input: Record<string, unknown>,\n): VerificationCheck {\n  if (toolName !== \"bash\") {\n    return { name: \"destructive_sql\", passed: true, severity: \"info\", message: \"N/A\" };\n  }\n\n  const command = String(input.command ?? \"\").toUpperCase();\n  for (const pattern of DESTRUCTIVE_COMMANDS) {\n    if (command.includes(pattern)) {\n      return {\n        name: \"destructive_sql\",\n        passed: false,\n        severity: \"critical\",\n        message: `Destructive SQL detected: ${pattern}`,\n      };\n    }\n  }\n\n  return { name: \"destructive_sql\", passed: true, severity: \"info\", message: \"No destructive SQL\" };\n}\n\nfunction checkRepetitiveCall(\n  toolName: string,\n  input: Record<string, unknown>,\n  context: VerificationContext,\n): VerificationCheck {\n  const recent = context.previousToolCalls.slice(-5);\n  let identicalCount = 0;\n\n  for (const prev of recent) {\n    if (prev.name === toolName && JSON.stringify(prev.input) === JSON.stringify(input)) {\n      identicalCount++;\n    }\n  }\n\n  if (identicalCount >= 3) {\n    return {\n      name: \"repetitive_call\",\n      passed: false,\n      severity: \"warning\",\n      message: `${toolName} called ${identicalCount + 1} times with identical input (possible loop)`,\n    };\n  }\n\n  return { name: \"repetitive_call\", passed: true, severity: \"info\", message: \"No repetition detected\" };\n}\n\nfunction checkWriteBinary(\n  toolName: string,\n  input: Record<string, unknown>,\n): VerificationCheck {\n  if (toolName !== \"file_write\" && toolName !== \"write_file\") {\n    return { name: \"write_binary\", passed: true, severity: \"info\", message: \"N/A\" };\n  }\n\n  const content = String(input.content ?? \"\");\n  const nonPrintable = content.split(\"\").filter((c) => {\n    const code = c.charCodeAt(0);\n    return code < 32 && code !== 10 && code !== 13 && code !== 9;\n  });\n\n  if (nonPrintable.length > content.length * 0.1) {\n    return {\n      name: \"write_binary\",\n      passed: false,\n      severity: \"warning\",\n      message: \"File content appears to contain binary data\",\n    };\n  }\n\n  return { name: \"write_binary\", passed: true, severity: \"info\", message: \"Text content\" };\n}\n","import type { ToolContext, ToolUseBlock } from '../types.js';\nimport type { Tool } from './tool.js';\nimport { ToolRegistry } from './registry.js';\nimport { ToolVerifier, type VerificationContext } from './verifier.js';\nimport type { DualPathVerifier } from '../verify/router.js';\n\nexport { ToolVerifier } from './verifier.js';\nexport type { VerificationCheck, VerificationResult, VerificationRule, VerificationContext } from './verifier.js';\n\n/** Result of a single tool execution. */\nexport interface ToolExecutionResult {\n  id: string;\n  name: string;\n  output: string;\n  isError: boolean;\n  durationMs: number;\n}\n\nclass Semaphore {\n  private current = 0;\n  private queue: (() => void)[] = [];\n\n  constructor(private readonly max: number) {}\n\n  acquire(): Promise<void> {\n    if (this.current < this.max) {\n      this.current++;\n      return Promise.resolve();\n    }\n    return new Promise<void>((resolve) => {\n      this.queue.push(resolve);\n    });\n  }\n\n  release(): void {\n    this.current--;\n    const next = this.queue.shift();\n    if (next) {\n      this.current++;\n      next();\n    }\n  }\n}\n\nfunction partitionToolCalls(\n  toolCalls: ToolUseBlock[],\n  registry: ToolRegistry,\n): ToolUseBlock[][] {\n  const batches: ToolUseBlock[][] = [];\n  let currentBatch: ToolUseBlock[] = [];\n  let currentBatchIsConcurrent = false;\n\n  for (const call of toolCalls) {\n    const tool = registry.get(call.name);\n    const isConcurrent = tool ? tool.isReadOnly && tool.isConcurrencySafe : false;\n\n    if (isConcurrent && currentBatchIsConcurrent) {\n      currentBatch.push(call);\n    } else {\n      if (currentBatch.length > 0) {\n        batches.push(currentBatch);\n      }\n      currentBatch = [call];\n      currentBatchIsConcurrent = isConcurrent;\n    }\n  }\n\n  if (currentBatch.length > 0) {\n    batches.push(currentBatch);\n  }\n\n  return batches;\n}\n\nasync function executeToolCall(\n  call: ToolUseBlock,\n  registry: ToolRegistry,\n  context: ToolContext,\n  permissionCheck?: (name: string, input: Record<string, unknown>) => Promise<boolean>,\n  abortSignal?: AbortSignal,\n  verifier?: ToolVerifier,\n  verificationContext?: VerificationContext,\n  dualPathVerifier?: DualPathVerifier,\n  turnCount?: number,\n): Promise<ToolExecutionResult> {\n  if (abortSignal?.aborted) {\n    return {\n      id: call.id,\n      name: call.name,\n      output: 'Execution aborted',\n      isError: true,\n      durationMs: 0,\n    };\n  }\n\n  const tool = registry.get(call.name);\n  if (!tool) {\n    return {\n      id: call.id,\n      name: call.name,\n      output: `Unknown tool: ${call.name}`,\n      isError: true,\n      durationMs: 0,\n    };\n  }\n\n  const start = performance.now();\n\n  try {\n    const parseResult = tool.inputSchema.safeParse(call.input);\n    if (!parseResult.success) {\n      return {\n        id: call.id,\n        name: call.name,\n        output: `Invalid input for ${call.name}: ${parseResult.error.issues.map((i) => i.message).join(', ')}`,\n        isError: true,\n        durationMs: Math.round(performance.now() - start),\n      };\n    }\n\n    if (permissionCheck) {\n      const allowed = await permissionCheck(call.name, call.input);\n      if (!allowed) {\n        return {\n          id: call.id,\n          name: call.name,\n          output: `Permission denied for tool: ${call.name}`,\n          isError: true,\n          durationMs: Math.round(performance.now() - start),\n        };\n      }\n    }\n\n    if (dualPathVerifier) {\n      const verdict = dualPathVerifier.verify(call.name, parseResult.data as Record<string, unknown>, turnCount ?? 0);\n      if (verdict.finalVerdict === \"block\") {\n        return {\n          id: call.id,\n          name: call.name,\n          output: `Verification blocked: ${verdict.reason ?? \"safety policy violation\"} [${verdict.pathTaken} path, ${verdict.totalLatencyMs.toFixed(2)}ms]`,\n          isError: true,\n          durationMs: Math.round(performance.now() - start),\n        };\n      }\n    } else if (verifier && verificationContext) {\n      const result = verifier.verify(call.name, parseResult.data as Record<string, unknown>, verificationContext);\n      if (!result.approved) {\n        return {\n          id: call.id,\n          name: call.name,\n          output: `Verification failed: ${result.reason ?? \"unknown reason\"}`,\n          isError: true,\n          durationMs: Math.round(performance.now() - start),\n        };\n      }\n    }\n\n    const output = await tool.execute(parseResult.data, context);\n\n    if (dualPathVerifier) {\n      dualPathVerifier.recordSuccess(call.name, parseResult.data as Record<string, unknown>, turnCount ?? 0);\n    }\n\n    return {\n      id: call.id,\n      name: call.name,\n      output,\n      isError: false,\n      durationMs: Math.round(performance.now() - start),\n    };\n  } catch (err: unknown) {\n    const message = err instanceof Error ? err.message : String(err);\n    if (dualPathVerifier) {\n      dualPathVerifier.recordFailure(call.name, call.input, turnCount ?? 0);\n    }\n    return {\n      id: call.id,\n      name: call.name,\n      output: `Error executing ${call.name}: ${message}`,\n      isError: true,\n      durationMs: Math.round(performance.now() - start),\n    };\n  }\n}\n\nexport interface OrchestrateOptions {\n  verifier?: ToolVerifier;\n  dualPathVerifier?: DualPathVerifier;\n  previousToolCalls?: Array<{ name: string; input: Record<string, unknown> }>;\n  turnCount?: number;\n}\n\n/**\n * Orchestrate execution of multiple tool calls with partition-based concurrency.\n *\n * Read-only, concurrency-safe tools are grouped into concurrent batches (max 10 parallel).\n * Non-safe tools are executed serially in their own batches.\n * Results are returned in the original call order.\n *\n * If a verifier is provided, each tool call is verified before execution.\n */\nexport async function orchestrateTools(\n  tools: ToolRegistry,\n  toolCalls: ToolUseBlock[],\n  context: ToolContext,\n  permissionCheck?: (name: string, input: Record<string, unknown>) => Promise<boolean>,\n  abortSignal?: AbortSignal,\n  options?: OrchestrateOptions,\n): Promise<ToolExecutionResult[]> {\n  const verifier = options?.verifier;\n  const dualVerifier = options?.dualPathVerifier;\n  const batches = partitionToolCalls(toolCalls, tools);\n  const results: ToolExecutionResult[] = [];\n\n  for (const batch of batches) {\n    if (abortSignal?.aborted) {\n      for (const call of batch) {\n        results.push({\n          id: call.id,\n          name: call.name,\n          output: 'Execution aborted',\n          isError: true,\n          durationMs: 0,\n        });\n      }\n      continue;\n    }\n\n    if (batch.length > 1) {\n      const semaphore = new Semaphore(10);\n      const promises = batch.map((call) =>\n        semaphore.acquire().then(async () => {\n          try {\n            return await executeToolCall(call, tools, context, permissionCheck, abortSignal, verifier, buildVerificationContext(options), dualVerifier, options?.turnCount);\n          } finally {\n            semaphore.release();\n          }\n        }),\n      );\n      const settled = await Promise.allSettled(promises);\n      for (let i = 0; i < settled.length; i++) {\n        const s = settled[i];\n        if (s.status === 'fulfilled') {\n          results.push(s.value);\n        } else {\n          results.push({\n            id: batch[i].id,\n            name: batch[i].name,\n            output: `Unexpected error: ${s.reason instanceof Error ? s.reason.message : String(s.reason)}`,\n            isError: true,\n            durationMs: 0,\n          });\n        }\n      }\n    } else {\n      const result = await executeToolCall(batch[0], tools, context, permissionCheck, abortSignal, verifier, buildVerificationContext(options), dualVerifier, options?.turnCount);\n      results.push(result);\n    }\n  }\n\n  return results;\n}\n\nfunction buildVerificationContext(options?: OrchestrateOptions): VerificationContext | undefined {\n  if (!options?.verifier) return undefined;\n  return {\n    turnCount: options.turnCount ?? 0,\n    previousToolCalls: options.previousToolCalls ?? [],\n    cwd: process.cwd(),\n  };\n}\n","import type { Message, CompactionResult } from \"./types.js\";\n\nexport interface AgentHooks {\n  onTurnStart?: (turn: number, messages: Message[]) => Promise<Message[] | void>;\n  onTurnEnd?: (turn: number, messages: Message[]) => Promise<void>;\n  onToolUse?: (\n    name: string,\n    input: Record<string, unknown>,\n  ) => Promise<{ allow?: boolean; input?: Record<string, unknown> } | void>;\n  onToolResult?: (result: {\n    id: string;\n    name: string;\n    output: string;\n    isError: boolean;\n    durationMs: number;\n  }) => Promise<string | void>;\n  onError?: (error: Error, turn: number) => Promise<{ retry?: boolean; message?: string } | void>;\n  onCompact?: (result: CompactionResult) => Promise<void>;\n}\n\nexport class HookRunner {\n  private hooks: AgentHooks;\n\n  constructor(hooks?: AgentHooks) {\n    this.hooks = hooks ?? {};\n  }\n\n  async runOnTurnStart(turn: number, messages: Message[]): Promise<Message[]> {\n    if (!this.hooks.onTurnStart) return messages;\n    const result = await this.hooks.onTurnStart(turn, messages);\n    return Array.isArray(result) ? result : messages;\n  }\n\n  async runOnTurnEnd(turn: number, messages: Message[]): Promise<void> {\n    await this.hooks.onTurnEnd?.(turn, messages);\n  }\n\n  async runOnToolUse(\n    name: string,\n    input: Record<string, unknown>,\n  ): Promise<{ allow: boolean; input: Record<string, unknown> }> {\n    if (!this.hooks.onToolUse) return { allow: true, input };\n    const result = await this.hooks.onToolUse(name, input);\n    return {\n      allow: result?.allow ?? true,\n      input: result?.input ?? input,\n    };\n  }\n\n  async runOnToolResult(result: {\n    id: string;\n    name: string;\n    output: string;\n    isError: boolean;\n    durationMs: number;\n  }): Promise<string> {\n    if (!this.hooks.onToolResult) return result.output;\n    const modified = await this.hooks.onToolResult(result);\n    return modified ?? result.output;\n  }\n\n  async runOnError(error: Error, turn: number): Promise<{ retry: boolean; message?: string }> {\n    if (!this.hooks.onError) return { retry: false };\n    const result = await this.hooks.onError(error, turn);\n    return { retry: result?.retry ?? false, message: result?.message };\n  }\n\n  async runOnCompact(result: CompactionResult): Promise<void> {\n    await this.hooks.onCompact?.(result);\n  }\n}\n","import type { Message, ContentBlock, ToolUseBlock, LoopEvent, ToolContext, TokenUsage } from \"./types.js\";\nimport { DEFAULT_MAX_TURNS } from \"./types.js\";\nimport { ToolRegistry } from \"./tools/registry.js\";\nimport { orchestrateTools, type OrchestrateOptions } from \"./tools/orchestrator.js\";\nimport type { ToolVerifier } from \"./tools/verifier.js\";\nimport type { DualPathVerifier } from \"./verify/router.js\";\nimport { ContextManager } from \"./context/manager.js\";\nimport { PermissionEngine } from \"./permissions/engine.js\";\nimport type { Provider } from \"./llm/provider.js\";\nimport type { AgentHooks } from \"./hooks.js\";\nimport { HookRunner } from \"./hooks.js\";\nimport type { CostTracker } from \"./cost/tracker.js\";\n\nconst DEFAULT_MAX_RETRIES = 5;\nconst INITIAL_RETRY_DELAY_MS = 1000;\nconst MAX_RETRY_DELAY_MS = 30000;\nconst DOOM_LOOP_THRESHOLD = 3;\nconst PRE_OVERFLOW_BUFFER = 20_000;\nconst OUTPUT_MAX_LINES = 2000;\nconst OUTPUT_MAX_BYTES = 50_000;\n\nexport interface AgentLoopConfig {\n  model: Provider;\n  tools: ToolRegistry;\n  messages: Message[];\n  systemPrompt?: string;\n  maxTurns?: number;\n  contextManager: ContextManager;\n  permissionEngine: PermissionEngine;\n  cwd?: string;\n  abortSignal?: AbortSignal;\n  maxRetries?: number;\n  hooks?: AgentHooks;\n  costTracker?: CostTracker;\n  verifier?: ToolVerifier;\n  dualPathVerifier?: DualPathVerifier;\n}\n\nfunction parseRetryAfterMs(error: Error): number | null {\n  const msg = error.message ?? \"\";\n  const retryAfterMsMatch = msg.match(/retry-after-ms:\\s*(\\d+)/i);\n  if (retryAfterMsMatch) return parseInt(retryAfterMsMatch[1], 10);\n  const retryAfterMatch = msg.match(/retry-after:\\s*(\\d+)/i);\n  if (retryAfterMatch) return parseInt(retryAfterMatch[1], 10) * 1000;\n  return null;\n}\n\nfunction truncateOutput(output: string, toolName: string, hasSubAgent: boolean): string {\n  const lines = output.split(\"\\n\");\n  if (lines.length <= OUTPUT_MAX_LINES && output.length <= OUTPUT_MAX_BYTES) return output;\n\n  let truncated = \"\";\n  let byteCount = 0;\n  for (const line of lines) {\n    if (byteCount + line.length > OUTPUT_MAX_BYTES) break;\n    truncated += line + \"\\n\";\n    byteCount += line.length;\n    if (byteCount > OUTPUT_MAX_BYTES) break;\n  }\n\n  const lineCount = truncated.split(\"\\n\").filter(l => l.length > 0).length;\n  const suffix = hasSubAgent\n    ? `\\n\\n[Output truncated: ${lineCount}/${lines.length} lines shown. Use the Task tool to have a sub-agent process the full output.]`\n    : `\\n\\n[Output truncated: ${lineCount}/${lines.length} lines shown. Use Grep to search or Read with offset/limit for the full content.]`;\n\n  return truncated.trimEnd() + suffix;\n}\n\nexport function detectDoomLoop(messages: Message[]): ToolUseBlock | null {\n  const recentToolCalls: ToolUseBlock[] = [];\n  for (let i = messages.length - 1; i >= 0; i--) {\n    const msg = messages[i];\n    if (msg.role !== \"assistant\") continue;\n    if (typeof msg.content === \"string\") continue;\n    for (const block of msg.content) {\n      if (block.type === \"tool_use\") recentToolCalls.push(block);\n    }\n    if (recentToolCalls.length >= DOOM_LOOP_THRESHOLD) break;\n  }\n\n  if (recentToolCalls.length < DOOM_LOOP_THRESHOLD) return null;\n\n  const last = recentToolCalls[0];\n  return recentToolCalls.every(\n    tc => tc.name === last.name && JSON.stringify(tc.input) === JSON.stringify(last.input),\n  )\n    ? last\n    : null;\n}\n\nexport async function* agentLoop(config: AgentLoopConfig): AsyncGenerator<LoopEvent> {\n  const {\n    model,\n    tools,\n    messages,\n    systemPrompt,\n    maxTurns = DEFAULT_MAX_TURNS,\n    contextManager,\n    permissionEngine,\n    cwd = process.cwd(),\n    abortSignal,\n    hooks,\n    costTracker,\n    verifier,\n    dualPathVerifier,\n  } = config;\n\n  const hookRunner = new HookRunner(hooks);\n  const context: ToolContext = { cwd, env: { ...process.env } as Record<string, string> };\n  let turns = 0;\n  let consecutiveRetries = 0;\n  const maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n  let totalUsage = { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 };\n  let inFlightText = \"\";\n  let inFlightReasoning = \"\";\n  let inFlightToolCalls: ToolUseBlock[] = [];\n\n  while (turns < maxTurns) {\n    if (abortSignal?.aborted) {\n      yield finalizeLoop(\"Aborted\");\n      return;\n    }\n\n    const messagesAfterHook = await hookRunner.runOnTurnStart(turns + 1, messages);\n    if (messagesAfterHook !== messages) {\n      messages.length = 0;\n      messages.push(...messagesAfterHook);\n    }\n\n    const contextCheck = contextManager.check(messages);\n    if (contextCheck.needsCompact) {\n      const result = await contextManager.compact(messages);\n      messages.length = 0;\n      messages.push(...result.messages);\n      if (result.tokensSaved > 0) {\n        const thinking = `Context ${result.method}: saved ~${result.tokensSaved} tokens (${contextCheck.totalTokens} → ${contextCheck.totalTokens - result.tokensSaved})`;\n        yield { type: \"thinking\", thinking };\n        await hookRunner.runOnCompact(result);\n      }\n      const pruned = contextManager.pruneToolOutputs(messages);\n      if (pruned.length !== messages.length) {\n        messages.length = 0;\n        messages.push(...pruned);\n        yield { type: \"thinking\", thinking: \"Pruned large tool outputs to free additional context\" };\n      }\n    }\n\n    const estimatedTotal = totalUsage.inputTokens + totalUsage.outputTokens\n      + (totalUsage.cacheReadTokens ?? 0) + (totalUsage.cacheWriteTokens ?? 0);\n    const maxContext = contextManager.maxTokens;\n    const maxOutput = contextManager.maxOutputTokens;\n    if (maxContext > 0 && estimatedTotal + maxOutput + PRE_OVERFLOW_BUFFER >= maxContext) {\n      yield { type: \"thinking\", thinking: \"Approaching context limit, compacting preemptively...\" };\n      const result = await contextManager.compact(messages);\n      messages.length = 0;\n      messages.push(...result.messages);\n      if (result.tokensSaved > 0) {\n        yield { type: \"thinking\", thinking: `Pre-overflow compact: freed ~${result.tokensSaved} tokens` };\n      }\n    }\n\n    const available = contextManager.getAvailableTokens(messages);\n    const maxTokens = Math.min(available, contextManager.maxOutputTokens);\n    if (maxTokens < 1024) {\n      yield finalizeLoop(\"Insufficient context window for next turn\");\n      return;\n    }\n\n    inFlightText = \"\";\n    inFlightReasoning = \"\";\n    inFlightToolCalls = [];\n\n    let response;\n    let textAlreadyYielded = false;\n    try {\n      const mappedMessages = messages.map((m) => {\n        if (m.role === \"tool\") {\n          const toolCall = inFlightToolCalls.find(tc => tc.id === (m as { tool_use_id?: string }).tool_use_id);\n          if (toolCall) {\n            return {\n              role: \"tool\" as const,\n              tool_use_id: m.role === \"tool\" ? (m as { tool_use_id: string }).tool_use_id : undefined,\n              is_error: m.role === \"tool\" ? (m as { is_error?: boolean }).is_error : undefined,\n              content: truncateOutput(\n                (m as { content: string }).content,\n                toolCall.name,\n                tools.has(\"delegate_agent\"),\n              ),\n            };\n          }\n        }\n        return {\n          role: m.role,\n          content: m.role === \"tool\"\n            ? (m as { content: string }).content\n            : m.role === \"user\"\n              ? (m as { content: string }).content\n              : (m as { content: ContentBlock[] }).content,\n          tool_use_id: m.role === \"tool\" ? (m as { tool_use_id: string }).tool_use_id : undefined,\n          is_error: m.role === \"tool\" ? (m as { is_error?: boolean }).is_error : undefined,\n        };\n      });\n\n      if (model.chatStream) {\n        const streamGen = model.chatStream({\n          messages: mappedMessages,\n          tools: tools.getAPI(),\n          systemPrompt,\n          maxOutputTokens: maxTokens,\n          abortSignal,\n        });\n        const toolAccumulators = new Map<string, { id: string; name: string; input: string }>();\n        let accumulatedText = \"\";\n        let streamUsage: TokenUsage | undefined;\n        let streamStopReason: \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\" = \"end_turn\";\n\n        for await (const event of streamGen) {\n          switch (event.type) {\n            case \"text_delta\":\n              if (event.text) {\n                accumulatedText += event.text;\n                yield { type: \"text\", text: event.text };\n              }\n              break;\n            case \"tool_use_start\":\n              if (event.id) {\n                toolAccumulators.set(event.id, { id: event.id, name: event.name ?? \"\", input: \"\" });\n                streamStopReason = \"tool_use\";\n              }\n              break;\n            case \"tool_use_delta\":\n              if (event.id && toolAccumulators.has(event.id)) {\n                toolAccumulators.get(event.id)!.input += event.input ?? \"\";\n              }\n              break;\n            case \"done\":\n              streamUsage = event.usage;\n              break;\n            case \"error\":\n              throw event.error ?? new Error(\"Stream error\");\n          }\n        }\n\n        const streamContent: ContentBlock[] = [];\n        if (accumulatedText) {\n          streamContent.push({ type: \"text\", text: accumulatedText });\n        }\n        for (const [, tc] of toolAccumulators) {\n          let input: Record<string, unknown> = {};\n          try { input = JSON.parse(tc.input); } catch {}\n          streamContent.push({ type: \"tool_use\", id: tc.id, name: tc.name, input });\n        }\n\n        response = {\n          content: streamContent,\n          usage: streamUsage ?? { inputTokens: 0, outputTokens: 0 },\n          stopReason: streamStopReason,\n        };\n        textAlreadyYielded = true;\n      } else {\n        response = await model.chat({\n          messages: mappedMessages,\n          tools: tools.getAPI(),\n          systemPrompt,\n          maxOutputTokens: maxTokens,\n          abortSignal,\n        });\n      }\n    } catch (err) {\n      yield* flushInFlight();\n      const error = err instanceof Error ? err : new Error(String(err));\n\n      const hookResult = await hookRunner.runOnError(error, turns + 1);\n      if (hookResult.retry && hookResult.message) {\n        messages.push({ role: \"user\", content: hookResult.message });\n        turns++;\n        continue;\n      }\n\n      if (error.message.includes(\"429\") || error.message.includes(\"529\") || error.message.includes(\"overloaded\")) {\n        consecutiveRetries++;\n        if (consecutiveRetries > maxRetries) {\n          yield { type: \"error\", error: new Error(`Max retries (${maxRetries}) exceeded`) };\n          return;\n        }\n        const headerDelay = parseRetryAfterMs(error);\n        const backoffDelay = headerDelay\n          ?? Math.min(INITIAL_RETRY_DELAY_MS * 2 ** (consecutiveRetries - 1) + Math.random() * 500, MAX_RETRY_DELAY_MS);\n        yield { type: \"thinking\", thinking: `Rate limited, retry ${consecutiveRetries}/${maxRetries} in ${Math.round(backoffDelay)}ms...` };\n        await new Promise((r) => setTimeout(r, backoffDelay));\n        continue;\n      }\n\n      yield { type: \"error\", error };\n      return;\n    }\n\n    totalUsage.inputTokens += response.usage.inputTokens;\n    totalUsage.outputTokens += response.usage.outputTokens;\n    totalUsage.cacheReadTokens = (totalUsage.cacheReadTokens ?? 0) + (response.usage.cacheReadTokens ?? 0);\n    totalUsage.cacheWriteTokens = (totalUsage.cacheWriteTokens ?? 0) + (response.usage.cacheWriteTokens ?? 0);\n\n    if (costTracker) {\n      costTracker.record(model.model, response.usage, turns + 1);\n    }\n\n    const toolCalls: ToolUseBlock[] = [];\n    for (const block of response.content) {\n      if (block.type === \"text\") {\n        inFlightText += block.text;\n        if (!textAlreadyYielded) {\n          yield { type: \"text\", text: block.text };\n        }\n      } else if (block.type === \"thinking\") {\n        inFlightReasoning += block.thinking;\n        yield { type: \"thinking\", thinking: block.thinking };\n      } else if (block.type === \"tool_use\") {\n        const resolvedName = tools.has(block.name) ? block.name : tools.findCaseInsensitive(block.name);\n        if (!resolvedName) {\n          yield { type: \"tool_result\", id: block.id, name: block.name, output: `Unknown tool: ${block.name}. Available: ${tools.listNames().join(\", \")}`, isError: true };\n          messages.push({ role: \"assistant\", content: response.content });\n          messages.push({ role: \"tool\", tool_use_id: block.id, content: `Unknown tool: ${block.name}`, is_error: true });\n          continue;\n        }\n        const modifiedBlock: ToolUseBlock = resolvedName !== block.name ? { ...block, name: resolvedName } : block;\n\n        const hookToolResult = await hookRunner.runOnToolUse(modifiedBlock.name, modifiedBlock.input);\n        if (!hookToolResult.allow) {\n          yield { type: \"tool_result\", id: modifiedBlock.id, name: modifiedBlock.name, output: \"Tool denied by hook\", isError: true };\n          messages.push({ role: \"assistant\", content: response.content });\n          messages.push({ role: \"tool\", tool_use_id: modifiedBlock.id, content: \"Tool denied by hook\", is_error: true });\n          continue;\n        }\n        const finalBlock: ToolUseBlock = { ...modifiedBlock, input: hookToolResult.input };\n        toolCalls.push(finalBlock);\n        inFlightToolCalls.push(finalBlock);\n        yield { type: \"tool_use\", id: finalBlock.id, name: finalBlock.name, input: finalBlock.input };\n      }\n    }\n\n    const hasNonToolContent = inFlightText.length > 0 || inFlightReasoning.length > 0;\n    if (!hasNonToolContent && toolCalls.length === 0) {\n      yield finalizeLoop(\"Assistant produced no content\");\n      return;\n    }\n\n    const assistantContent = response.content.filter(b => {\n      if (b.type !== \"tool_use\") return true;\n      return toolCalls.some(tc => tc.id === b.id);\n    });\n\n    messages.push({ role: \"assistant\", content: assistantContent });\n    turns++;\n    consecutiveRetries = 0;\n    inFlightText = \"\";\n    inFlightReasoning = \"\";\n    inFlightToolCalls = [];\n\n    await hookRunner.runOnTurnEnd(turns, messages);\n\n    if (response.stopReason !== \"tool_use\" || toolCalls.length === 0) {\n      yield {\n        type: \"done\",\n        usage: {\n          inputTokens: totalUsage.inputTokens,\n          outputTokens: totalUsage.outputTokens,\n          cacheReadTokens: totalUsage.cacheReadTokens,\n          cacheWriteTokens: totalUsage.cacheWriteTokens,\n        },\n        messages: [...messages],\n      };\n      return;\n    }\n\n    const doomLoopCall = detectDoomLoop(messages);\n    if (doomLoopCall) {\n      yield { type: \"thinking\", thinking: `Detected repetitive tool calls: ${doomLoopCall.name} called ${DOOM_LOOP_THRESHOLD} times with identical input. Breaking the loop.` };\n      messages.push({ role: \"user\", content: `STOP. You have called ${doomLoopCall.name} ${DOOM_LOOP_THRESHOLD} times in a row with the same input. This indicates a loop. Try a different approach or tool.` });\n      turns++;\n      continue;\n    }\n\n    const orchestrateOptions: OrchestrateOptions = {\n      verifier,\n      dualPathVerifier,\n      previousToolCalls: collectPreviousToolCalls(messages),\n      turnCount: turns,\n    };\n\n    const results = await orchestrateTools(\n      tools,\n      toolCalls,\n      context,\n      async (name, _input) => {\n        const perm = permissionEngine.check(name);\n        return perm.allowed;\n      },\n      abortSignal,\n      orchestrateOptions,\n    );\n\n    for (const result of results) {\n      let output = truncateOutput(result.output, result.name, tools.has(\"delegate_agent\"));\n      const toolResult = await hookRunner.runOnToolResult({\n        id: result.id,\n        name: result.name,\n        output: result.output,\n        isError: result.isError,\n        durationMs: result.durationMs,\n      });\n      output = toolResult;\n\n      messages.push({\n        role: \"tool\",\n        tool_use_id: result.id,\n        content: output,\n        is_error: result.isError,\n      });\n      yield {\n        type: \"tool_result\",\n        id: result.id,\n        name: result.name,\n        output,\n        isError: result.isError,\n      };\n    }\n  }\n\n  yield { type: \"error\", error: new Error(`Max turns (${maxTurns}) reached`) };\n\n  function collectPreviousToolCalls(msgs: Message[]): Array<{ name: string; input: Record<string, unknown> }> {\n    const calls: Array<{ name: string; input: Record<string, unknown> }> = [];\n    for (const m of msgs) {\n      if (m.role !== \"assistant\") continue;\n      if (typeof m.content === \"string\") continue;\n      for (const block of m.content) {\n        if (block.type === \"tool_use\") {\n          calls.push({ name: block.name, input: block.input });\n        }\n      }\n    }\n    return calls;\n  }\n\n  function* flushInFlight(): Generator<LoopEvent, void, unknown> {\n    if (inFlightText.length > 0) {\n      yield { type: \"text\", text: inFlightText };\n    }\n    if (inFlightReasoning.length > 0) {\n      yield { type: \"thinking\", thinking: inFlightReasoning };\n    }\n    for (const tc of inFlightToolCalls) {\n      yield { type: \"tool_result\", id: tc.id, name: tc.name, output: \"[Tool execution was interrupted]\", isError: true };\n      messages.push({ role: \"assistant\", content: [{ type: \"tool_use\" as const, id: tc.id, name: tc.name, input: tc.input }] });\n      messages.push({ role: \"tool\", tool_use_id: tc.id, content: \"[Tool execution was interrupted]\", is_error: true });\n    }\n  }\n\n  function finalizeLoop(reason: string): LoopEvent {\n    if (totalUsage.inputTokens > 0 || totalUsage.outputTokens > 0) {\n      return {\n        type: \"done\",\n        usage: {\n          inputTokens: totalUsage.inputTokens,\n          outputTokens: totalUsage.outputTokens,\n          cacheReadTokens: totalUsage.cacheReadTokens,\n          cacheWriteTokens: totalUsage.cacheWriteTokens,\n        },\n        messages: [...messages],\n      };\n    }\n    return { type: \"error\", error: new Error(reason) };\n  }\n}\n","import type { Tool, APIToolDefinition } from './tool.js';\n\n/** Registry for managing tool lookup and deduplication. */\nexport class ToolRegistry {\n  private readonly tools = new Map<string, Tool>();\n\n  constructor(tools?: Tool[]) {\n    if (tools) {\n      for (const tool of tools) {\n        this.add(tool);\n      }\n    }\n  }\n\n  /** Add a tool to the registry. Duplicate names are ignored (first one wins). */\n  add(tool: Tool): void {\n    if (this.tools.has(tool.name)) {\n      console.warn(`[ToolRegistry] Duplicate tool \"${tool.name}\" ignored (first one wins)`);\n      return;\n    }\n    this.tools.set(tool.name, tool);\n  }\n\n  /** Get a tool by name. */\n  get(name: string): Tool | undefined {\n    return this.tools.get(name);\n  }\n\n  /** Check if a tool exists by name. */\n  has(name: string): boolean {\n    return this.tools.has(name);\n  }\n\n  /** Find tool by case-insensitive name. Returns undefined if not found. */\n  findCaseInsensitive(name: string): string | undefined {\n    const lower = name.toLowerCase();\n    if (this.tools.has(name)) return name;\n    for (const key of this.tools.keys()) {\n      if (key.toLowerCase() === lower) return key;\n    }\n    return undefined;\n  }\n\n  /** List all registered tool names. */\n  listNames(): string[] {\n    return Array.from(this.tools.keys());\n  }\n\n  /** Get all registered tools. */\n  getAll(): Tool[] {\n    return Array.from(this.tools.values());\n  }\n\n  /** Get all tools in API format, sorted by name for cache stability. */\n  getAPI(): APIToolDefinition[] {\n    return this.getAll()\n      .sort((a, b) => a.name.localeCompare(b.name))\n      .map((t) => t.toAPI());\n  }\n\n  /** Number of registered tools. */\n  get size(): number {\n    return this.tools.size;\n  }\n}\n","import type { ZodSchema } from 'zod';\nimport type { ToolContext } from '../types.js';\n\n/** JSON Schema representation of a tool for LLM function calling APIs. */\nexport interface APIToolDefinition {\n  name: string;\n  description: string;\n  input_schema: Record<string, unknown>;\n}\n\n/** Core tool abstraction that every tool must implement. */\nexport interface Tool<P = unknown> {\n  readonly name: string;\n  readonly description: string;\n  readonly inputSchema: ZodSchema<P>;\n  readonly isReadOnly: boolean;\n  readonly isConcurrencySafe: boolean;\n\n  execute(input: P, context: ToolContext): Promise<string>;\n  toAPI(): APIToolDefinition;\n  toString(input: P): string;\n}\n\n/** Configuration object for defining a tool. */\nexport interface ToolExecuteOptions<P = unknown> {\n  name: string;\n  description: string;\n  inputSchema: ZodSchema<P>;\n  isReadOnly?: boolean;\n  isConcurrencySafe?: boolean;\n  execute: (input: P, context: ToolContext) => Promise<string>;\n}\n\nfunction zodToJsonSchema(schema: unknown): Record<string, unknown> {\n  const s = schema as { _def: Record<string, unknown> };\n  const def = s._def;\n  const typeName = def.typeName as string;\n  const description = def.description as string | undefined;\n\n  const base: Record<string, unknown> = {};\n  if (description) base.description = description;\n\n  switch (typeName) {\n    case 'ZodString':\n      return { ...base, type: 'string' };\n    case 'ZodNumber':\n      return { ...base, type: 'number' };\n    case 'ZodBoolean':\n      return { ...base, type: 'boolean' };\n    case 'ZodNull':\n      return { ...base, type: 'null' };\n    case 'ZodArray': {\n      const items = zodToJsonSchema(def.element);\n      return { ...base, type: 'array', items };\n    }\n    case 'ZodObject': {\n      const shapeFn = def.shape as () => Record<string, unknown>;\n      const shape = shapeFn();\n      const properties: Record<string, unknown> = {};\n      const required: string[] = [];\n      for (const [key, value] of Object.entries(shape)) {\n        properties[key] = zodToJsonSchema(value);\n        const propDef = (value as { _def: Record<string, unknown> })._def;\n        if (\n          propDef.typeName !== 'ZodOptional' &&\n          propDef.typeName !== 'ZodNullish' &&\n          propDef.typeName !== 'ZodDefault'\n        ) {\n          required.push(key);\n        }\n      }\n      const result: Record<string, unknown> = { ...base, type: 'object', properties };\n      if (required.length > 0) result.required = required;\n      return result;\n    }\n    case 'ZodEnum':\n      return { ...base, enum: def.values };\n    case 'ZodLiteral':\n      return { ...base, const: def.value };\n    case 'ZodUnion': {\n      const options = (def.options as unknown[]).map((o) => zodToJsonSchema(o));\n      return { ...base, anyOf: options };\n    }\n    case 'ZodDiscriminatedUnion': {\n      const options = (def.options as unknown[]).map((o) => zodToJsonSchema(o));\n      return { ...base, anyOf: options };\n    }\n    case 'ZodOptional':\n      return zodToJsonSchema(def.innerType);\n    case 'ZodNullable': {\n      const inner = zodToJsonSchema(def.innerType);\n      inner.nullable = true;\n      return inner;\n    }\n    case 'ZodNullish': {\n      const inner = zodToJsonSchema(def.innerType);\n      inner.nullable = true;\n      return inner;\n    }\n    case 'ZodDefault':\n      return zodToJsonSchema(def.innerType);\n    case 'ZodRecord': {\n      const valueSchema = zodToJsonSchema(def.valueType);\n      return { ...base, type: 'object', additionalProperties: valueSchema };\n    }\n    case 'ZodTuple': {\n      const items = (def.items as unknown[]).map((o) => zodToJsonSchema(o));\n      return { ...base, type: 'array', items, minItems: items.length, maxItems: items.length };\n    }\n    case 'ZodEffects': {\n      return zodToJsonSchema(def.innerType);\n    }\n    case 'ZodAny':\n      return {};\n    case 'ZodUnknown':\n      return {};\n    case 'ZodVoid':\n      return { ...base, type: 'null' };\n    case 'ZodNever':\n      return { ...base, not: {} };\n    default:\n      return { ...base, type: 'string' };\n  }\n}\n\n/** Define a tool from a configuration object. */\nexport function defineTool<P = unknown>(config: ToolExecuteOptions<P>): Tool<P> {\n  const tool: Tool<P> = {\n    name: config.name,\n    description: config.description,\n    inputSchema: config.inputSchema,\n    isReadOnly: config.isReadOnly ?? false,\n    isConcurrencySafe: config.isConcurrencySafe ?? false,\n    execute: config.execute,\n    toAPI(): APIToolDefinition {\n      return {\n        name: config.name,\n        description: config.description,\n        input_schema: zodToJsonSchema(config.inputSchema),\n      };\n    },\n    toString(input: P): string {\n      const entries = Object.entries(input as Record<string, unknown>)\n        .map(([k, v]) => {\n          if (typeof v === 'string') return `${k}: \"${v}\"`;\n          if (v === undefined) return `${k}: undefined`;\n          if (v === null) return `${k}: null`;\n          return `${k}: ${String(v)}`;\n        })\n        .join(', ');\n      return `${config.name}({ ${entries} })`;\n    },\n  };\n  return tool;\n}\n\n/** Wrap a class-based tool into the standard Tool interface. */\nexport function defineToolFromClass(ctor: new () => Tool): Tool {\n  const instance = new ctor();\n  return {\n    name: instance.name,\n    description: instance.description,\n    inputSchema: instance.inputSchema,\n    isReadOnly: instance.isReadOnly,\n    isConcurrencySafe: instance.isConcurrencySafe,\n    execute: (input, context) => instance.execute(input, context),\n    toAPI: () => instance.toAPI(),\n    toString: (input) => instance.toString(input),\n  };\n}\n","import type { Message } from \"../types.js\";\n\nexport interface TokenCount {\n  total: number;\n  byRole: Record<string, number>;\n}\n\nconst CONTENT_RATIOS = {\n  code: 3.0,\n  prose: 4.0,\n  json: 3.2,\n  markdown: 3.8,\n} as const;\n\ntype ContentType = keyof typeof CONTENT_RATIOS;\n\nconst MODEL_FAMILY_RATIOS: Record<string, number> = {\n  \"gpt-4\": 3.7,\n  \"gpt-4o\": 3.7,\n  \"claude\": 3.5,\n  \"gemini\": 3.8,\n  \"deepseek\": 3.5,\n  \"llama\": 3.6,\n  \"qwen\": 3.5,\n  \"codestral\": 3.5,\n};\n\nfunction detectContentType(text: string): ContentType {\n  const codeIndicators = /(\\{|\\}|=>|===|!==|function |class |import |export |const |let |var |def |async |await |return |if \\(|for \\(|while \\(|\\->|\\=>|::)/;\n  const jsonIndicators = /^[\\s]*[\\{\\[]|\"[\\w]+\":\\s*[\"\\[\\{\\d]/;\n  const markdownIndicators = /^#|```|\\*{1,2}\\w|\\[.*\\]\\(.*\\)/;\n\n  if (jsonIndicators.test(text) && !codeIndicators.test(text)) return \"json\";\n  if (markdownIndicators.test(text)) return \"markdown\";\n  if (codeIndicators.test(text)) return \"code\";\n  return \"prose\";\n}\n\nfunction detectModelFamily(model: string): string {\n  const lower = model.toLowerCase();\n  if (lower.startsWith(\"gpt-4o\")) return \"gpt-4o\";\n  if (lower.startsWith(\"gpt-4\")) return \"gpt-4\";\n  if (lower.startsWith(\"claude\")) return \"claude\";\n  if (lower.startsWith(\"gemini\")) return \"gemini\";\n  if (lower.startsWith(\"deepseek\")) return \"deepseek\";\n  if (lower.includes(\"llama\")) return \"llama\";\n  if (lower.startsWith(\"qwen\")) return \"qwen\";\n  if (lower.startsWith(\"codestral\")) return \"codestral\";\n  return \"default\";\n}\n\nexport function estimateTokens(text: string, model?: string): number {\n  if (text.length === 0) return 0;\n\n  const contentType = detectContentType(text);\n  const contentRatio = CONTENT_RATIOS[contentType];\n  const family = detectModelFamily(model ?? \"\");\n  const familyRatio = MODEL_FAMILY_RATIOS[family] ?? 3.5;\n\n  const ratio = model ? (familyRatio + contentRatio) / 2 : contentRatio;\n\n  let baseEstimate = Math.ceil(text.length / ratio);\n\n  const cjkCount = (text.match(/[\\u4e00-\\u9fff\\u3040-\\u309f\\u30a0-\\u30ff\\uac00-\\ud7af]/g) ?? []).length;\n  if (cjkCount > 0) {\n    baseEstimate += cjkCount;\n  }\n\n  const specialTokenCount = (text.match(/<\\|[^|]+\\|>|<[^>]+>/g) ?? []).length;\n  baseEstimate += specialTokenCount;\n\n  return Math.max(1, baseEstimate);\n}\n\nexport function estimateMessageTokens(message: Message, model?: string): number {\n  if (message.role === \"user\") {\n    return estimateTokens(message.content, model) + 4;\n  }\n  if (message.role === \"tool\") {\n    return estimateTokens(message.content, model) + 4;\n  }\n  let tokens = 0;\n  for (const block of message.content) {\n    if (block.type === \"text\") {\n      tokens += estimateTokens(block.text, model) + 4;\n    } else if (block.type === \"tool_use\") {\n      tokens += estimateTokens(block.name, model) + estimateTokens(JSON.stringify(block.input), model) + 4;\n    } else if (block.type === \"thinking\") {\n      tokens += estimateTokens(block.thinking, model) + 4;\n    }\n  }\n  return tokens;\n}\n\nexport function estimateConversationTokens(messages: Message[], model?: string): TokenCount {\n  const byRole: Record<string, number> = {};\n  let total = 0;\n  for (const message of messages) {\n    const msgTokens = estimateMessageTokens(message, model) + 10;\n    total += msgTokens;\n    byRole[message.role] = (byRole[message.role] ?? 0) + msgTokens;\n  }\n  return { total, byRole };\n}\n","import type { Message, ContentBlock, ContextConfig, CompactionResult } from \"../types.js\";\nimport { DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_OUTPUT_TOKENS, DEFAULT_COMPACT_THRESHOLD } from \"../types.js\";\nimport { estimateConversationTokens, estimateMessageTokens } from \"./tokenizer.js\";\n\nconst PRUNE_MINIMUM = 20_000;\nconst PRUNE_PROTECT_TOKENS = 40_000;\nconst PROTECTED_TOOL_TYPES = new Set([\"skill\", \"delegate_agent\"]);\nconst RECENT_TURNS_TO_PROTECT = 2;\n\nexport interface ContextCheck {\n  totalTokens: number;\n  availableTokens: number;\n  usagePercent: number;\n  needsCompact: boolean;\n  recommendedMethod: \"snip\" | \"compact\";\n}\n\nexport class ContextManager {\n  readonly maxTokens: number;\n  readonly maxOutputTokens: number;\n  readonly compactThreshold: number;\n\n  constructor(config?: ContextConfig) {\n    this.maxTokens = config?.maxTokens ?? DEFAULT_CONTEXT_WINDOW;\n    this.maxOutputTokens = config?.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS;\n    this.compactThreshold = config?.compactThreshold ?? DEFAULT_COMPACT_THRESHOLD;\n  }\n\n  check(messages: Message[]): ContextCheck {\n    const { total: totalTokens } = estimateConversationTokens(messages);\n    const availableTokens = this.maxTokens - totalTokens - this.maxOutputTokens;\n    const usagePercent = totalTokens / this.maxTokens;\n    const needsCompact = usagePercent >= this.compactThreshold;\n    let recommendedMethod: \"snip\" | \"compact\";\n\n    if (usagePercent > 0.95) {\n      recommendedMethod = \"compact\";\n    } else {\n      recommendedMethod = \"snip\";\n    }\n\n    return { totalTokens, availableTokens, usagePercent, needsCompact, recommendedMethod };\n  }\n\n  async compact(messages: Message[], summaryFn?: (messages: Message[]) => Promise<string>): Promise<CompactionResult> {\n    const contextCheck = this.check(messages);\n\n    if (!contextCheck.needsCompact) {\n      return { messages: [...messages], tokensSaved: 0, method: \"none\" };\n    }\n\n    const originalTokens = contextCheck.totalTokens;\n\n    if (summaryFn && contextCheck.recommendedMethod === \"compact\") {\n      const recentCount = Math.max(Math.ceil(messages.length * 0.2), 1);\n      const cutoffIndex = messages.length - recentCount;\n      const oldMessages = messages.slice(0, cutoffIndex);\n      const recentMessages = messages.slice(cutoffIndex);\n\n      const summary = await summaryFn(oldMessages);\n      const summaryMessage: Message = {\n        role: \"user\",\n        content: `Here is a summary of our previous conversation:\\n${summary}`,\n      };\n\n      const compacted = [summaryMessage, ...recentMessages];\n      const newTokens = estimateConversationTokens(compacted).total;\n\n      return {\n        messages: compacted,\n        tokensSaved: originalTokens - newTokens,\n        method: \"compact\",\n      };\n    }\n\n    const keepFirst = 1;\n    const keepLast = 20;\n    const keepMin = keepFirst + keepLast;\n\n    if (messages.length <= keepMin) {\n      return { messages: [...messages], tokensSaved: 0, method: \"none\" };\n    }\n\n    let result = [...messages];\n    const targetUsage = 0.6;\n\n    while (result.length > keepMin) {\n      const { total } = estimateConversationTokens(result);\n      if (total / this.maxTokens < targetUsage) break;\n\n      const removeCount = Math.max(1, Math.floor((result.length - keepMin) * 0.3));\n      const removeEnd = Math.min(keepFirst + removeCount, result.length - keepLast);\n      result = [result[0], ...result.slice(removeEnd)];\n    }\n\n    const newTokens = estimateConversationTokens(result).total;\n\n    return {\n      messages: result,\n      tokensSaved: originalTokens - newTokens,\n      method: \"snip\",\n    };\n  }\n\n  pruneToolOutputs(messages: Message[]): Message[] {\n    let totalPruned = 0;\n    let turnCount = 0;\n    const result = [...messages];\n\n    for (let i = result.length - 1; i >= 0; i--) {\n      const msg = result[i];\n      if (msg.role === \"user\") {\n        turnCount++;\n        if (turnCount <= RECENT_TURNS_TO_PROTECT) continue;\n      }\n      if (msg.role !== \"assistant\" || !Array.isArray(msg.content)) continue;\n\n      for (const block of msg.content) {\n        if (block.type !== \"tool_use\") continue;\n        if (PROTECTED_TOOL_TYPES.has(block.name)) continue;\n\n        const toolResultIdx = result.findIndex(\n          (m, j) => j > i && m.role === \"tool\" && (m as { tool_use_id?: string }).tool_use_id === block.id,\n        );\n        if (toolResultIdx === -1) continue;\n\n        const toolResult = result[toolResultIdx];\n        const output = (toolResult as { content: string }).content;\n        const estTokens = Math.ceil(output.length / 4);\n\n        if (totalPruned + estTokens >= PRUNE_MINIMUM && totalPruned >= PRUNE_PROTECT_TOKENS) {\n          return result;\n        }\n\n        totalPruned += estTokens;\n        result[toolResultIdx] = {\n          ...(toolResult as unknown as Record<string, unknown>),\n          content: `[Output pruned: ${estTokens} tokens saved]`,\n          is_error: false,\n        } as typeof toolResult;\n      }\n    }\n\n    return result;\n  }\n\n  getAvailableTokens(messages: Message[]): number {\n    return this.maxTokens - estimateConversationTokens(messages).total - this.maxOutputTokens;\n  }\n\n  getUsagePercent(messages: Message[]): number {\n    return estimateConversationTokens(messages).total / this.maxTokens;\n  }\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\n\nexport interface ProjectProfile {\n  rootDir: string;\n  name: string;\n  languages: LanguageInfo[];\n  frameworks: FrameworkInfo[];\n  packageManager: string | null;\n  totalFiles: number;\n  totalLinesOfCode: number;\n  testFramework: string | null;\n  buildTool: string | null;\n  complexity: \"tiny\" | \"small\" | \"medium\" | \"large\" | \"monorepo\";\n  hasTypeScript: boolean;\n  hasTests: boolean;\n  hasCI: boolean;\n  hasDocker: boolean;\n  modelRequirements: ModelRequirements;\n}\n\nexport interface LanguageInfo {\n  language: string;\n  fileCount: number;\n  percentage: number;\n}\n\nexport interface FrameworkInfo {\n  name: string;\n  category: \"frontend\" | \"backend\" | \"fullstack\" | \"mobile\" | \"data\" | \"infra\";\n}\n\nexport interface ModelRequirements {\n  minContextTokens: number;\n  reasoningNeeded: boolean;\n  toolUseNeeded: boolean;\n  codeHeavy: boolean;\n}\n\nconst EXTENSION_MAP: Record<string, string> = {\n  \".ts\": \"TypeScript\",\n  \".tsx\": \"TypeScript\",\n  \".js\": \"JavaScript\",\n  \".jsx\": \"JavaScript\",\n  \".mjs\": \"JavaScript\",\n  \".cjs\": \"JavaScript\",\n  \".py\": \"Python\",\n  \".pyi\": \"Python\",\n  \".rs\": \"Rust\",\n  \".go\": \"Go\",\n  \".java\": \"Java\",\n  \".kt\": \"Kotlin\",\n  \".kts\": \"Kotlin\",\n  \".cpp\": \"C++\",\n  \".cc\": \"C++\",\n  \".cxx\": \"C++\",\n  \".c\": \"C\",\n  \".h\": \"C/C++\",\n  \".hpp\": \"C++\",\n  \".rb\": \"Ruby\",\n  \".swift\": \"Swift\",\n  \".scala\": \"Scala\",\n  \".php\": \"PHP\",\n  \".cs\": \"C#\",\n  \".fs\": \"F#\",\n  \".dart\": \"Dart\",\n  \".lua\": \"Lua\",\n  \".r\": \"R\",\n  \".R\": \"R\",\n  \".sql\": \"SQL\",\n  \".sh\": \"Shell\",\n  \".bash\": \"Shell\",\n  \".zsh\": \"Shell\",\n  \".ps1\": \"PowerShell\",\n  \".html\": \"HTML\",\n  \".css\": \"CSS\",\n  \".scss\": \"SCSS\",\n  \".sass\": \"Sass\",\n  \".less\": \"Less\",\n  \".vue\": \"Vue\",\n  \".svelte\": \"Svelte\",\n  \".xml\": \"XML\",\n  \".json\": \"JSON\",\n  \".yaml\": \"YAML\",\n  \".yml\": \"YAML\",\n  \".toml\": \"TOML\",\n  \".md\": \"Markdown\",\n  \".ex\": \"Elixir\",\n  \".exs\": \"Elixir\",\n  \".erl\": \"Erlang\",\n  \".hs\": \"Haskell\",\n  \".ml\": \"OCaml\",\n  \".zig\": \"Zig\",\n  \".nim\": \"Nim\",\n  \".proto\": \"Protocol Buffers\",\n  \".graphql\": \"GraphQL\",\n  \".gql\": \"GraphQL\",\n};\n\nconst SKIP_DIRS = new Set([\n  \"node_modules\",\n  \".git\",\n  \"dist\",\n  \"build\",\n  \"target\",\n  \"__pycache__\",\n  \".next\",\n  \".venv\",\n  \"venv\",\n  \".env\",\n  \".tox\",\n  \".mypy_cache\",\n  \".pytest_cache\",\n  \"coverage\",\n  \".nuxt\",\n  \".output\",\n  \".svelte-kit\",\n  \"vendor\",\n  \"Pods\",\n  \".gradle\",\n  \".idea\",\n  \".vscode\",\n  \"bin\",\n  \"obj\",\n  \".dart_tool\",\n  \".flutter-plugins\",\n]);\n\nconst CODE_EXTENSIONS = new Set([\n  \".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\",\n  \".py\", \".pyi\",\n  \".rs\",\n  \".go\",\n  \".java\", \".kt\", \".kts\",\n  \".cpp\", \".cc\", \".cxx\", \".c\", \".h\", \".hpp\",\n  \".rb\",\n  \".swift\",\n  \".scala\",\n  \".php\",\n  \".cs\", \".fs\",\n  \".dart\",\n  \".lua\",\n  \".r\", \".R\",\n  \".sh\", \".bash\", \".zsh\", \".ps1\",\n  \".vue\", \".svelte\",\n  \".ex\", \".exs\", \".erl\",\n  \".hs\", \".ml\",\n  \".zig\", \".nim\",\n  \".sql\",\n  \".graphql\", \".gql\",\n  \".proto\",\n  \".scss\", \".sass\", \".less\",\n  \".html\", \".css\",\n]);\n\nconst COMPILED_LANGUAGES = new Set([\"Rust\", \"Go\", \"Java\", \"Kotlin\", \"C++\", \"C\", \"C/C++\", \"Swift\", \"Scala\", \"C#\"]);\n\nconst COMPLEXITY_THRESHOLDS = {\n  tiny: 50,\n  small: 200,\n  medium: 1000,\n  large: 5000,\n} as const;\n\nconst CONTEXT_TOKEN_MAP: Record<string, number> = {\n  tiny: 8192,\n  small: 16384,\n  medium: 32768,\n  large: 65536,\n  monorepo: 131072,\n};\n\nexport class ProjectAnalyzer {\n  analyze(rootDir: string): ProjectProfile {\n    const absoluteRoot = path.resolve(rootDir);\n    const name = path.basename(absoluteRoot);\n\n    const allFiles = this.collectFiles(absoluteRoot);\n    const totalFiles = allFiles.length;\n\n    const languageCounts = this.detectLanguages(allFiles);\n    const languages = this.computeLanguagePercentages(languageCounts, totalFiles);\n\n    const rootFileNames = this.listRootFiles(absoluteRoot);\n    const rootFileContent = this.readRootConfigs(absoluteRoot, rootFileNames);\n\n    const packageManager = this.detectPackageManager(rootFileNames, rootFileContent);\n    const frameworks = this.detectFrameworks(absoluteRoot, rootFileNames, rootFileContent);\n    const testFramework = this.detectTestFramework(absoluteRoot, rootFileNames, rootFileContent);\n    const buildTool = this.detectBuildTool(rootFileNames);\n    const hasCI = this.detectCI(absoluteRoot, rootFileNames);\n    const hasDocker = this.detectDocker(rootFileNames);\n    const hasTests = this.detectHasTests(absoluteRoot, allFiles);\n\n    const hasTypeScript = languageCounts[\"TypeScript\"] !== undefined && languageCounts[\"TypeScript\"] > 0;\n\n    const totalLinesOfCode = this.estimateLinesOfCode(allFiles);\n    const complexity = this.computeComplexity(totalFiles);\n    const modelRequirements = this.computeModelRequirements(\n      complexity,\n      languages,\n      allFiles,\n    );\n\n    return {\n      rootDir: absoluteRoot,\n      name,\n      languages,\n      frameworks,\n      packageManager,\n      totalFiles,\n      totalLinesOfCode,\n      testFramework,\n      buildTool,\n      complexity,\n      hasTypeScript,\n      hasTests,\n      hasCI,\n      hasDocker,\n      modelRequirements,\n    };\n  }\n\n  private collectFiles(rootDir: string): string[] {\n    const files: string[] = [];\n    try {\n      const entries = fs.readdirSync(rootDir, {\n        recursive: true,\n        withFileTypes: false,\n      }) as string[];\n\n      for (const entry of entries) {\n        const fullPath = path.join(rootDir, entry);\n        const relativeParts = entry.split(path.sep);\n        const shouldSkip = relativeParts.some((part) => SKIP_DIRS.has(part));\n        if (shouldSkip) continue;\n\n        try {\n          const stat = fs.statSync(fullPath);\n          if (stat.isFile()) {\n            files.push(fullPath);\n          }\n        } catch {\n          continue;\n        }\n      }\n    } catch {\n      return [];\n    }\n    return files;\n  }\n\n  private listRootFiles(rootDir: string): Set<string> {\n    try {\n      const entries = fs.readdirSync(rootDir, { withFileTypes: true });\n      return new Set(\n        entries.filter((e) => e.isFile() || e.isDirectory()).map((e) => e.name),\n      );\n    } catch {\n      return new Set();\n    }\n  }\n\n  private readRootConfigs(\n    rootDir: string,\n    rootFileNames: Set<string>,\n  ): Map<string, string> {\n    const content = new Map<string, string>();\n\n    const configsToRead = [\n      \"package.json\",\n      \"Cargo.toml\",\n      \"go.mod\",\n      \"requirements.txt\",\n      \"Pipfile\",\n      \"pyproject.toml\",\n      \"Gemfile\",\n    ];\n\n    for (const config of configsToRead) {\n      if (rootFileNames.has(config)) {\n        try {\n          const filePath = path.join(rootDir, config);\n          const data = fs.readFileSync(filePath, \"utf-8\");\n          content.set(config, data);\n        } catch {\n          continue;\n        }\n      }\n    }\n\n    return content;\n  }\n\n  private detectLanguages(\n    files: string[],\n  ): Record<string, number> {\n    const counts: Record<string, number> = {};\n\n    for (const file of files) {\n      const ext = path.extname(file).toLowerCase();\n      const language = EXTENSION_MAP[ext];\n      if (language) {\n        counts[language] = (counts[language] || 0) + 1;\n      }\n    }\n\n    return counts;\n  }\n\n  private computeLanguagePercentages(\n    counts: Record<string, number>,\n    totalFiles: number,\n  ): LanguageInfo[] {\n    if (totalFiles === 0) return [];\n\n    const entries = Object.entries(counts).sort((a, b) => b[1] - a[1]);\n\n    return entries.map(([language, fileCount]) => ({\n      language,\n      fileCount,\n      percentage: Math.round((fileCount / totalFiles) * 10000) / 100,\n    }));\n  }\n\n  private detectPackageManager(\n    rootFileNames: Set<string>,\n    rootFileContent: Map<string, string>,\n  ): string | null {\n    if (rootFileNames.has(\"pnpm-lock.yaml\")) return \"pnpm\";\n    if (rootFileNames.has(\"yarn.lock\")) return \"yarn\";\n    if (rootFileNames.has(\"package-lock.json\")) return \"npm\";\n    if (rootFileNames.has(\"bun.lockb\") || rootFileNames.has(\"bun.lock\")) return \"bun\";\n\n    if (rootFileNames.has(\"package.json\") && !rootFileNames.has(\"package-lock.json\") && !rootFileNames.has(\"yarn.lock\") && !rootFileNames.has(\"pnpm-lock.yaml\")) {\n      return \"npm\";\n    }\n\n    if (rootFileNames.has(\"Cargo.toml\")) return \"cargo\";\n    if (rootFileNames.has(\"go.mod\")) return \"go\";\n    if (rootFileNames.has(\"requirements.txt\") || rootFileNames.has(\"Pipfile\") || rootFileNames.has(\"pyproject.toml\")) {\n      if (rootFileNames.has(\"Pipfile\")) return \"pipenv\";\n      if (rootFileNames.has(\"uv.lock\")) return \"uv\";\n      if (rootFileContent.has(\"pyproject.toml\")) {\n        const content = rootFileContent.get(\"pyproject.toml\")!;\n        if (content.includes(\"poetry\")) return \"poetry\";\n        if (content.includes(\"pdm\")) return \"pdm\";\n      }\n      return \"pip\";\n    }\n    if (rootFileNames.has(\"Gemfile\")) return \"bundler\";\n    if (rootFileNames.has(\"pubspec.yaml\")) return \"pub\";\n    if (rootFileNames.has(\"mix.exs\")) return \"mix\";\n    if (rootFileNames.has(\"composer.json\")) return \"composer\";\n\n    return null;\n  }\n\n  private detectFrameworks(\n    rootDir: string,\n    rootFileNames: Set<string>,\n    rootFileContent: Map<string, string>,\n  ): FrameworkInfo[] {\n    const frameworks: FrameworkInfo[] = [];\n    const seen = new Set<string>();\n\n    const addFramework = (name: string, category: FrameworkInfo[\"category\"]) => {\n      if (!seen.has(name)) {\n        seen.add(name);\n        frameworks.push({ name, category });\n      }\n    };\n\n    if (this.matchesGlob(rootFileNames, \"next.config.\")) {\n      addFramework(\"Next.js\", \"fullstack\");\n    }\n\n    if (this.matchesGlob(rootFileNames, \"nuxt.config.\")) {\n      addFramework(\"Nuxt\", \"fullstack\");\n    }\n\n    if (rootFileNames.has(\"angular.json\")) {\n      addFramework(\"Angular\", \"frontend\");\n    }\n\n    if (this.matchesGlob(rootFileNames, \"vite.config.\")) {\n      if (!seen.has(\"Next.js\")) {\n        addFramework(\"Vite\", \"frontend\");\n      }\n    }\n\n    if (rootFileNames.has(\"svelte.config.js\") || rootFileNames.has(\"svelte.config.ts\")) {\n      addFramework(\"SvelteKit\", \"fullstack\");\n    }\n\n    const pkgJson = rootFileContent.get(\"package.json\");\n    if (pkgJson) {\n      try {\n        const pkg = JSON.parse(pkgJson);\n        const allDeps = {\n          ...(pkg.dependencies || {}),\n          ...(pkg.devDependencies || {}),\n        };\n\n        if (allDeps[\"react\"] || allDeps[\"react-dom\"]) addFramework(\"React\", \"frontend\");\n        if (allDeps[\"vue\"] || allDeps[\"vue2\"]) addFramework(\"Vue\", \"frontend\");\n        if (allDeps[\"svelte\"]) addFramework(\"Svelte\", \"frontend\");\n        if (allDeps[\"@angular/core\"]) addFramework(\"Angular\", \"frontend\");\n        if (allDeps[\"express\"]) addFramework(\"Express\", \"backend\");\n        if (allDeps[\"fastify\"]) addFramework(\"Fastify\", \"backend\");\n        if (allDeps[\"koa\"]) addFramework(\"Koa\", \"backend\");\n        if (allDeps[\"nestjs\"] || allDeps[\"@nestjs/core\"]) addFramework(\"NestJS\", \"backend\");\n        if (allDeps[\"hono\"]) addFramework(\"Hono\", \"backend\");\n        if (allDeps[\"@hono/node-server\"]) addFramework(\"Hono\", \"backend\");\n        if (allDeps[\"hapi\"] || allDeps[\"@hapi/hapi\"]) addFramework(\"Hapi\", \"backend\");\n        if (allDeps[\"electron\"]) addFramework(\"Electron\", \"frontend\");\n        if (allDeps[\"react-native\"] || allDeps[\"expo\"]) addFramework(\"React Native\", \"mobile\");\n        if (allDeps[\"@react-native\"]) addFramework(\"React Native\", \"mobile\");\n        if (allDeps[\"tailwindcss\"]) addFramework(\"Tailwind CSS\", \"frontend\");\n        if (allDeps[\"@trpc/server\"] || allDeps[\"@trpc/client\"]) addFramework(\"tRPC\", \"fullstack\");\n        if (allDeps[\"prisma\"] || allDeps[\"@prisma/client\"]) addFramework(\"Prisma\", \"infra\");\n        if (allDeps[\"drizzle-orm\"]) addFramework(\"Drizzle\", \"infra\");\n        if (allDeps[\"@tanstack/react-query\"]) addFramework(\"TanStack Query\", \"frontend\");\n        if (allDeps[\"redux\"] || allDeps[\"@reduxjs/toolkit\"]) addFramework(\"Redux\", \"frontend\");\n        if (allDeps[\"zustand\"]) addFramework(\"Zustand\", \"frontend\");\n        if (allDeps[\"three\"] || allDeps[\"three.js\"]) addFramework(\"Three.js\", \"frontend\");\n        if (allDeps[\"d3\"] || allDeps[\"d3.js\"]) addFramework(\"D3\", \"data\");\n        if (allDeps[\"@remix-run/react\"] || allDeps[\"remix\"]) addFramework(\"Remix\", \"fullstack\");\n        if (allDeps[\"@astrojs/react\"] || allDeps[\"astro\"]) addFramework(\"Astro\", \"frontend\");\n        if (allDeps[\"gatsby\"]) addFramework(\"Gatsby\", \"frontend\");\n        if (allDeps[\"@storybook/react\"] || allDeps[\"storybook\"]) addFramework(\"Storybook\", \"frontend\");\n        if (allDeps[\"jest\"] || allDeps[\"vitest\"]) { /* handled in test detection */ }\n        if (allDeps[\"express\"] && allDeps[\"react\"]) {\n          // Already added individually\n        }\n      } catch {\n        // Invalid JSON\n      }\n    }\n\n    const cargoToml = rootFileContent.get(\"Cargo.toml\");\n    if (cargoToml) {\n      if (cargoToml.includes(\"actix-web\")) addFramework(\"Actix Web\", \"backend\");\n      if (cargoToml.includes(\"axum\")) addFramework(\"Axum\", \"backend\");\n      if (cargoToml.includes(\"rocket\")) addFramework(\"Rocket\", \"backend\");\n      if (cargoToml.includes(\"warp\")) addFramework(\"Warp\", \"backend\");\n      if (cargoToml.includes(\"tokio\")) addFramework(\"Tokio\", \"backend\");\n      if (cargoToml.includes(\"bevy\")) addFramework(\"Bevy\", \"data\");\n      if (cargoToml.includes(\"leptos\")) addFramework(\"Leptos\", \"fullstack\");\n      if (cargoToml.includes(\"yew\")) addFramework(\"Yew\", \"frontend\");\n      if (cargoToml.includes(\"iced\")) addFramework(\"Iced\", \"frontend\");\n      if (cargoToml.includes(\"diesel\")) addFramework(\"Diesel\", \"infra\");\n      if (cargoToml.includes(\"sqlx\")) addFramework(\"SQLx\", \"infra\");\n      if (cargoToml.includes(\"sea-orm\")) addFramework(\"SeaORM\", \"infra\");\n    }\n\n    const goMod = rootFileContent.get(\"go.mod\");\n    if (goMod) {\n      if (goMod.includes(\"gin-gonic/gin\")) addFramework(\"Gin\", \"backend\");\n      if (goMod.includes(\"labstack/echo\") || goMod.includes(\"echo\")) addFramework(\"Echo\", \"backend\");\n      if (goMod.includes(\"fiber\")) addFramework(\"Fiber\", \"backend\");\n      if (goMod.includes(\"gorilla/mux\")) addFramework(\"Gorilla Mux\", \"backend\");\n      if (goMod.includes(\"chi\")) addFramework(\"Chi\", \"backend\");\n      if (goMod.includes(\"go-kratos\")) addFramework(\"Kratos\", \"backend\");\n      if (goMod.includes(\"gorm.io\")) addFramework(\"GORM\", \"infra\");\n    }\n\n    const requirementsTxt = rootFileContent.get(\"requirements.txt\");\n    const pyprojectToml = rootFileContent.get(\"pyproject.toml\");\n\n    const pythonDeps: string[] = [];\n    if (requirementsTxt) {\n      pythonDeps.push(...requirementsTxt.split(\"\\n\"));\n    }\n    if (pyprojectToml) {\n      pythonDeps.push(...pyprojectToml.split(\"\\n\"));\n    }\n    const pythonDepsStr = pythonDeps.join(\"\\n\").toLowerCase();\n\n    if (pythonDepsStr.includes(\"django\")) addFramework(\"Django\", \"backend\");\n    if (pythonDepsStr.includes(\"flask\")) addFramework(\"Flask\", \"backend\");\n    if (pythonDepsStr.includes(\"fastapi\")) addFramework(\"FastAPI\", \"backend\");\n    if (pythonDepsStr.includes(\"starlette\")) addFramework(\"Starlette\", \"backend\");\n    if (pythonDepsStr.includes(\"pyramid\")) addFramework(\"Pyramid\", \"backend\");\n    if (pythonDepsStr.includes(\"sanic\")) addFramework(\"Sanic\", \"backend\");\n    if (pythonDepsStr.includes(\"celery\")) addFramework(\"Celery\", \"backend\");\n    if (pythonDepsStr.includes(\"scrapy\")) addFramework(\"Scrapy\", \"data\");\n    if (pythonDepsStr.includes(\"pandas\")) addFramework(\"Pandas\", \"data\");\n    if (pythonDepsStr.includes(\"numpy\")) addFramework(\"NumPy\", \"data\");\n    if (pythonDepsStr.includes(\"tensorflow\")) addFramework(\"TensorFlow\", \"data\");\n    if (pythonDepsStr.includes(\"torch\") || pythonDepsStr.includes(\"pytorch\")) addFramework(\"PyTorch\", \"data\");\n    if (pythonDepsStr.includes(\"scikit-learn\") || pythonDepsStr.includes(\"sklearn\")) addFramework(\"scikit-learn\", \"data\");\n    if (pythonDepsStr.includes(\"sqlalchemy\")) addFramework(\"SQLAlchemy\", \"infra\");\n    if (pythonDepsStr.includes(\"flask-restful\") || pythonDepsStr.includes(\"flask-restx\")) addFramework(\"Flask-RESTful\", \"backend\");\n    if (pythonDepsStr.includes(\" Strawberry\")) addFramework(\"Strawberry\", \"backend\");\n\n    const gemfile = rootFileContent.get(\"Gemfile\");\n    if (gemfile) {\n      if (gemfile.includes(\"rails\")) addFramework(\"Ruby on Rails\", \"fullstack\");\n      if (gemfile.includes(\"sinatra\")) addFramework(\"Sinatra\", \"backend\");\n      if (gemfile.includes(\"hanami\")) addFramework(\"Hanami\", \"fullstack\");\n      if (gemfile.includes(\"grape\")) addFramework(\"Grape\", \"backend\");\n      if (gemfile.includes(\"sidekiq\")) addFramework(\"Sidekiq\", \"backend\");\n      if (gemfile.includes(\"rspec\")) { /* test framework */ }\n      if (gemfile.includes(\"activerecord\")) addFramework(\"ActiveRecord\", \"infra\");\n    }\n\n    if (rootFileNames.has(\"pubspec.yaml\")) {\n      addFramework(\"Flutter\", \"mobile\");\n    }\n\n    if (rootFileNames.has(\"mix.exs\")) {\n      addFramework(\"Phoenix\", \"fullstack\");\n    }\n\n    if (rootFileNames.has(\"build.gradle\") || rootFileNames.has(\"build.gradle.kts\") || rootFileNames.has(\"pom.xml\")) {\n      if (rootFileNames.has(\"pom.xml\")) addFramework(\"Maven\", \"infra\");\n      else addFramework(\"Gradle\", \"infra\");\n\n      const springSource = rootFileNames.has(\"pom.xml\")\n        ? this.tryRead(path.join(rootDir, \"pom.xml\"))\n        : this.tryRead(path.join(rootDir, \"build.gradle\")) || this.tryRead(path.join(rootDir, \"build.gradle.kts\"));\n      if (springSource && springSource.includes(\"spring\")) {\n        addFramework(\"Spring\", \"backend\");\n      }\n    }\n\n    if (rootFileNames.has(\"docker-compose.yml\") || rootFileNames.has(\"docker-compose.yaml\")) {\n      addFramework(\"Docker Compose\", \"infra\");\n    }\n\n    if (rootFileNames.has(\"terraform\") || this.hasDir(rootDir, \"terraform\")) {\n      addFramework(\"Terraform\", \"infra\");\n    }\n\n    if (rootFileNames.has(\"serverless.yml\") || rootFileNames.has(\"serverless.yaml\")) {\n      addFramework(\"Serverless\", \"infra\");\n    }\n\n    if (rootFileNames.has(\"sam.yaml\") || rootFileNames.has(\"template.yaml\")) {\n      addFramework(\"AWS SAM\", \"infra\");\n    }\n\n    return frameworks;\n  }\n\n  private detectTestFramework(\n    rootDir: string,\n    rootFileNames: Set<string>,\n    rootFileContent: Map<string, string>,\n  ): string | null {\n    if (this.matchesGlob(rootFileNames, \"vitest.config.\")) return \"Vitest\";\n    if (this.matchesGlob(rootFileNames, \"jest.config.\")) return \"Jest\";\n\n    const pkgJson = rootFileContent.get(\"package.json\");\n    if (pkgJson) {\n      try {\n        const pkg = JSON.parse(pkgJson);\n        const allDeps = {\n          ...(pkg.dependencies || {}),\n          ...(pkg.devDependencies || {}),\n        };\n        if (allDeps[\"vitest\"]) return \"Vitest\";\n        if (allDeps[\"jest\"]) return \"Jest\";\n        if (allDeps[\"mocha\"]) return \"Mocha\";\n        if (allDeps[\"ava\"]) return \"AVA\";\n        if (allDeps[\"cypress\"]) return \"Cypress\";\n        if (allDeps[\"@playwright/test\"]) return \"Playwright\";\n        if (allDeps[\"@testing-library/react\"]) return \"Testing Library\";\n        if (allDeps[\"tap\"]) return \"tap\";\n        if (allDeps[\"uvu\"]) return \"UVU\";\n        if (allDeps[\"buster\"]) return \"Buster\";\n      } catch {\n        // Invalid JSON\n      }\n    }\n\n    if (rootFileNames.has(\"pytest.ini\") || rootFileNames.has(\"conftest.py\")) return \"pytest\";\n    const pyproject = rootFileContent.get(\"pyproject.toml\");\n    if (pyproject && (pyproject.includes(\"pytest\") || pyproject.includes(\"[tool.pytest\"))) return \"pytest\";\n\n    const cargoToml = rootFileContent.get(\"Cargo.toml\");\n    if (cargoToml && cargoToml.includes(\"[dev-dependencies]\")) return \"cargo test\";\n\n    if (rootFileNames.has(\"go.mod\")) {\n      const goTestDir = path.join(rootDir, \"..._test.go\");\n      try {\n        const testFiles = fs.readdirSync(rootDir, { recursive: true }) as string[];\n        if (testFiles.some((f) => typeof f === \"string\" && f.endsWith(\"_test.go\"))) {\n          return \"go test\";\n        }\n      } catch {\n        // ignore\n      }\n    }\n\n    const gemfile = rootFileContent.get(\"Gemfile\");\n    if (gemfile && gemfile.includes(\"rspec\")) return \"RSpec\";\n\n    if (rootFileNames.has(\"Makefile\")) {\n      const makefile = this.tryRead(path.join(rootDir, \"Makefile\"));\n      if (makefile && makefile.includes(\"test\")) return \"make test\";\n    }\n\n    return null;\n  }\n\n  private detectBuildTool(rootFileNames: Set<string>): string | null {\n    if (rootFileNames.has(\"tsconfig.json\")) return \"tsc\";\n    if (this.matchesGlob(rootFileNames, \"webpack.config.\")) return \"webpack\";\n    if (this.matchesGlob(rootFileNames, \"vite.config.\")) return \"vite\";\n    if (this.matchesGlob(rootFileNames, \"rollup.config.\")) return \"rollup\";\n    if (this.matchesGlob(rootFileNames, \"esbuild.\") || rootFileNames.has(\"esbuild.js\") || rootFileNames.has(\"esbuild.ts\") || rootFileNames.has(\"esbuild.mjs\")) return \"esbuild\";\n    if (rootFileNames.has(\"turbo.json\")) return \"Turborepo\";\n    if (this.matchesGlob(rootFileNames, \"parcelrc\") || this.matchesGlob(rootFileNames, \".parcelrc\")) return \"Parcel\";\n    if (rootFileNames.has(\"Gruntfile.js\") || rootFileNames.has(\"Gruntfile.ts\")) return \"Grunt\";\n    if (rootFileNames.has(\"Gulpfile.js\") || rootFileNames.has(\"Gulpfile.ts\") || rootFileNames.has(\"Gulpfile.mjs\")) return \"Gulp\";\n    if (rootFileNames.has(\"Makefile\")) return \"make\";\n    if (rootFileNames.has(\"CMakeLists.txt\")) return \"CMake\";\n    if (rootFileNames.has(\"Cargo.toml\")) return \"cargo\";\n    if (rootFileNames.has(\"build.gradle\") || rootFileNames.has(\"build.gradle.kts\")) return \"Gradle\";\n    if (rootFileNames.has(\"pom.xml\")) return \"Maven\";\n    if (rootFileNames.has(\"build.sbt\")) return \"sbt\";\n    if (rootFileNames.has(\"justfile\") || rootFileNames.has(\"Justfile\")) return \"just\";\n    if (rootFileNames.has(\"Taskfile.yml\") || rootFileNames.has(\"Taskfile.yaml\")) return \"Task\";\n    if (rootFileNames.has(\"bazel\") || rootFileNames.has(\"WORKSPACE\") || rootFileNames.has(\"WORKSPACE.bazel\")) return \"Bazel\";\n    if (rootFileNames.has(\"BUCK\") || rootFileNames.has(\".buckconfig\")) return \"Buck\";\n    if (rootFileNames.has(\"meson.build\")) return \"Meson\";\n    if (rootFileNames.has(\"build.zig\")) return \"Zig Build\";\n\n    return null;\n  }\n\n  private detectCI(rootDir: string, rootFileNames: Set<string>): boolean {\n    if (rootFileNames.has(\".github\")) {\n      const workflowsDir = path.join(rootDir, \".github\", \"workflows\");\n      try {\n        const stat = fs.statSync(workflowsDir);\n        if (stat.isDirectory()) {\n          const files = fs.readdirSync(workflowsDir);\n          if (files.length > 0) return true;\n        }\n      } catch {\n        // .github exists but no workflows\n      }\n    }\n\n    // Re-check by trying to read .github/workflows directly\n    try {\n      const workflowsDir = path.join(rootDir, \".github\", \"workflows\");\n      const files = fs.readdirSync(workflowsDir);\n      if (files.length > 0) return true;\n    } catch {\n      // doesn't exist\n    }\n\n    if (rootFileNames.has(\".gitlab-ci.yml\")) return true;\n    if (rootFileNames.has(\"Jenkinsfile\")) return true;\n    if (rootFileNames.has(\".circleci\") || rootFileNames.has(\".circleci\")) {\n      try {\n        const configPath = path.join(rootDir, \".circleci\", \"config.yml\");\n        if (fs.existsSync(configPath)) return true;\n      } catch {\n        // ignore\n      }\n    }\n    if (rootFileNames.has(\".travis.yml\")) return true;\n    if (rootFileNames.has(\"azure-pipelines.yml\") || rootFileNames.has(\"azure-pipelines.yaml\")) return true;\n    if (rootFileNames.has(\"bitbucket-pipelines.yml\")) return true;\n    if (rootFileNames.has(\"cloudbuild.yaml\") || rootFileNames.has(\"cloudbuild.yml\")) return true;\n    if (rootFileNames.has(\"buildkite.yml\") || rootFileNames.has(\"buildkite.yaml\")) return true;\n\n    return false;\n  }\n\n  private detectDocker(rootFileNames: Set<string>): boolean {\n    if (rootFileNames.has(\"Dockerfile\")) return true;\n    if (this.matchesGlob(rootFileNames, \"docker-compose.\")) return true;\n    if (rootFileNames.has(\"Dockerfile.dev\") || rootFileNames.has(\"Dockerfile.prod\")) return true;\n    if (rootFileNames.has(\".dockerignore\")) return true;\n\n    return false;\n  }\n\n  private detectHasTests(rootDir: string, allFiles: string[]): boolean {\n    for (const file of allFiles) {\n      const base = path.basename(file);\n      if (\n        base.includes(\".test.\") ||\n        base.includes(\".spec.\") ||\n        base.includes(\"_test.\") ||\n        base.includes(\"_spec.\") ||\n        base.includes(\"Test.\") ||\n        base.startsWith(\"test_\") ||\n        base.startsWith(\"tests/\")\n      ) {\n        return true;\n      }\n    }\n\n    const testDirs = [\"test\", \"tests\", \"__tests__\", \"spec\", \"specs\", \"testing\"];\n    try {\n      const rootEntries = fs.readdirSync(rootDir, { withFileTypes: true });\n      for (const entry of rootEntries) {\n        if (entry.isDirectory() && testDirs.includes(entry.name)) {\n          return true;\n        }\n      }\n    } catch {\n      // ignore\n    }\n\n    return false;\n  }\n\n  private estimateLinesOfCode(files: string[]): number {\n    if (files.length === 0) return 0;\n\n    const codeFiles = files.filter((f) => {\n      const ext = path.extname(f).toLowerCase();\n      return CODE_EXTENSIONS.has(ext);\n    });\n\n    if (codeFiles.length === 0) return 0;\n\n    const sortedBySize = codeFiles\n      .map((f) => {\n        try {\n          return { file: f, size: fs.statSync(f).size };\n        } catch {\n          return { file: f, size: 0 };\n        }\n      })\n      .filter((entry) => entry.size > 0)\n      .sort((a, b) => b.size - a.size);\n\n    const sampleSize = Math.min(sortedBySize.length, 100);\n    const sampleFiles = sortedBySize.slice(0, sampleSize);\n\n    let sampledLines = 0;\n    let sampledBytes = 0;\n\n    for (const entry of sampleFiles) {\n      try {\n        const content = fs.readFileSync(entry.file, \"utf-8\");\n        const lines = content.split(\"\\n\").length;\n        sampledLines += lines;\n        sampledBytes += entry.size;\n      } catch {\n        continue;\n      }\n    }\n\n    if (sampledBytes === 0) return 0;\n\n    const avgLinesPerByte = sampledLines / sampledBytes;\n\n    let totalBytes = 0;\n    for (const entry of sortedBySize) {\n      totalBytes += entry.size;\n    }\n\n    return Math.round(avgLinesPerByte * totalBytes);\n  }\n\n  private computeComplexity(totalFiles: number): ProjectProfile[\"complexity\"] {\n    if (totalFiles < COMPLEXITY_THRESHOLDS.tiny) return \"tiny\";\n    if (totalFiles < COMPLEXITY_THRESHOLDS.small) return \"small\";\n    if (totalFiles < COMPLEXITY_THRESHOLDS.medium) return \"medium\";\n    if (totalFiles < COMPLEXITY_THRESHOLDS.large) return \"large\";\n    return \"monorepo\";\n  }\n\n  private computeModelRequirements(\n    complexity: ProjectProfile[\"complexity\"],\n    languages: LanguageInfo[],\n    allFiles: string[],\n  ): ModelRequirements {\n    const minContextTokens = CONTEXT_TOKEN_MAP[complexity];\n\n    const hasCompiledLanguage = languages.some(\n      (l) => COMPILED_LANGUAGES.has(l.language),\n    );\n\n    let codeFileCount = 0;\n    for (const file of allFiles) {\n      const ext = path.extname(file).toLowerCase();\n      if (CODE_EXTENSIONS.has(ext)) codeFileCount++;\n    }\n    const codeRatio = allFiles.length > 0 ? codeFileCount / allFiles.length : 0;\n\n    return {\n      minContextTokens,\n      reasoningNeeded: hasCompiledLanguage,\n      toolUseNeeded: true,\n      codeHeavy: codeRatio > 0.6,\n    };\n  }\n\n  private matchesGlob(fileNames: Set<string>, prefix: string): boolean {\n    for (const name of fileNames) {\n      if (name.startsWith(prefix)) return true;\n    }\n    return false;\n  }\n\n  private tryRead(filePath: string): string | null {\n    try {\n      return fs.readFileSync(filePath, \"utf-8\");\n    } catch {\n      return null;\n    }\n  }\n\n  private hasDir(rootDir: string, name: string): boolean {\n    try {\n      const stat = fs.statSync(path.join(rootDir, name));\n      return stat.isDirectory();\n    } catch {\n      return false;\n    }\n  }\n}\n","import { ProjectAnalyzer, type ProjectProfile } from \"../model/project.js\";\n\nexport class ProjectContext {\n  private rootDir: string;\n  private _profile: ProjectProfile | null = null;\n  private analyzer: ProjectAnalyzer;\n\n  constructor(rootDir: string) {\n    this.rootDir = rootDir;\n    this.analyzer = new ProjectAnalyzer();\n  }\n\n  get profile(): ProjectProfile | null {\n    return this._profile;\n  }\n\n  private ensureProfile(): ProjectProfile {\n    if (!this._profile) {\n      this._profile = this.analyzer.analyze(this.rootDir);\n    }\n    return this._profile;\n  }\n\n  getProjectContextString(): string {\n    const p = this.ensureProfile();\n    const lines: string[] = [];\n\n    lines.push(`Project: ${p.name}`);\n\n    if (p.languages.length > 0) {\n      const langStr = p.languages\n        .slice(0, 5)\n        .map((l) => `${l.language} (${l.percentage}%)`)\n        .join(\", \");\n      lines.push(`Languages: ${langStr}`);\n    }\n\n    if (p.frameworks.length > 0) {\n      const fwStr = p.frameworks.map((f) => f.name).join(\", \");\n      lines.push(`Frameworks: ${fwStr}`);\n    }\n\n    if (p.packageManager) {\n      lines.push(`Package Manager: ${p.packageManager}`);\n    }\n\n    lines.push(`Test: ${this.getTestCommand()}`);\n    lines.push(`Build: ${this.getBuildCommand()}`);\n    lines.push(`Complexity: ${p.complexity} (${p.totalFiles} files)`);\n    lines.push(\n      `Has TypeScript: ${p.hasTypeScript}, Has Tests: ${p.hasTests}, Has CI: ${p.hasCI}, Has Docker: ${p.hasDocker}`,\n    );\n\n    return lines.join(\"\\n\");\n  }\n\n  getTestCommand(): string {\n    const p = this.ensureProfile();\n    if (!p.testFramework) return \"echo 'No test framework detected'\";\n\n    switch (p.testFramework) {\n      case \"Vitest\":\n        return \"vitest run\";\n      case \"Jest\":\n        return \"jest\";\n      case \"Mocha\":\n        return \"mocha\";\n      case \"AVA\":\n        return \"ava\";\n      case \"Cypress\":\n        return \"cypress run\";\n      case \"Playwright\":\n        return \"npx playwright test\";\n      case \"pytest\":\n        return \"pytest\";\n      case \"cargo test\":\n        return \"cargo test\";\n      case \"go test\":\n        return \"go test ./...\";\n      case \"RSpec\":\n        return \"bundle exec rspec\";\n      case \"make test\":\n        return \"make test\";\n      default:\n        return p.testFramework;\n    }\n  }\n\n  getBuildCommand(): string {\n    const p = this.ensureProfile();\n    if (!p.buildTool) return \"echo 'No build tool detected'\";\n\n    switch (p.buildTool) {\n      case \"tsc\":\n        return \"tsc\";\n      case \"webpack\":\n        return \"webpack\";\n      case \"vite\":\n        return \"vite build\";\n      case \"rollup\":\n        return \"rollup -c\";\n      case \"esbuild\":\n        return \"esbuild\";\n      case \"Turborepo\":\n        return \"turbo build\";\n      case \"Parcel\":\n        return \"parcel build\";\n      case \"Grunt\":\n        return \"grunt\";\n      case \"Gulp\":\n        return \"gulp\";\n      case \"make\":\n        return \"make\";\n      case \"CMake\":\n        return \"cmake --build .\";\n      case \"cargo\":\n        return \"cargo build\";\n      case \"Gradle\":\n        return \"gradle build\";\n      case \"Maven\":\n        return \"mvn package\";\n      case \"sbt\":\n        return \"sbt compile\";\n      case \"just\":\n        return \"just build\";\n      case \"Task\":\n        return \"task build\";\n      case \"Bazel\":\n        return \"bazel build //...\";\n      case \"Buck\":\n        return \"buck build //...\";\n      case \"Meson\":\n        return \"meson compile -C builddir\";\n      case \"Zig Build\":\n        return \"zig build\";\n      default:\n        return p.buildTool;\n    }\n  }\n\n  getLintCommand(): string {\n    const p = this.ensureProfile();\n    if (p.hasTypeScript) return \"npx eslint .\";\n    if (p.languages.some((l) => l.language === \"Python\")) return \"ruff check .\";\n    if (p.languages.some((l) => l.language === \"Rust\")) return \"cargo clippy\";\n    if (p.languages.some((l) => l.language === \"Go\")) return \"golint ./...\";\n    if (p.languages.some((l) => l.language === \"Ruby\")) return \"rubocop\";\n    return \"echo 'No linter detected'\";\n  }\n\n  getPackageManager(): string {\n    const p = this.ensureProfile();\n    return p.packageManager ?? \"npm\";\n  }\n}\n","import type { PermissionConfig } from \"../types.js\";\n\nexport interface PermissionResult {\n  allowed: boolean;\n  reason?: string;\n}\n\nfunction matchPattern(pattern: string, toolName: string): boolean {\n  if (!pattern.includes(\"*\")) {\n    return pattern === toolName;\n  }\n  const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n  const regex = new RegExp(`^${escaped}$`);\n  return regex.test(toolName);\n}\n\nexport class PermissionEngine {\n  private allowedPatterns: string[];\n  private deniedPatterns: string[];\n  private askPatterns: string[];\n  private defaultAction: \"allow\" | \"deny\" | \"ask\";\n\n  constructor(config?: PermissionConfig) {\n    this.allowedPatterns = config?.allowedTools ?? [];\n    this.deniedPatterns = config?.deniedTools ?? [];\n    this.askPatterns = config?.askTools ?? [];\n    this.defaultAction = config?.defaultAction ?? \"allow\";\n  }\n\n  check(toolName: string, _input?: Record<string, unknown>): PermissionResult {\n    for (const pattern of this.deniedPatterns) {\n      if (matchPattern(pattern, toolName)) {\n        return { allowed: false, reason: `Tool '${toolName}' matches denied pattern '${pattern}'` };\n      }\n    }\n\n    for (const pattern of this.allowedPatterns) {\n      if (matchPattern(pattern, toolName)) {\n        return { allowed: true };\n      }\n    }\n\n    for (const pattern of this.askPatterns) {\n      if (matchPattern(pattern, toolName)) {\n        return { allowed: false, reason: \"ask\" };\n      }\n    }\n\n    if (this.defaultAction === \"deny\") {\n      return { allowed: false, reason: `Tool '${toolName}' not explicitly allowed` };\n    }\n\n    if (this.defaultAction === \"ask\") {\n      return { allowed: false, reason: \"ask\" };\n    }\n\n    return { allowed: true };\n  }\n\n  addAllowed(pattern: string): void {\n    this.allowedPatterns.push(pattern);\n  }\n\n  addDenied(pattern: string): void {\n    this.deniedPatterns.push(pattern);\n  }\n\n  addAsk(pattern: string): void {\n    this.askPatterns.push(pattern);\n  }\n}\n","export interface CostRecord {\n  model: string;\n  inputTokens: number;\n  outputTokens: number;\n  cacheReadTokens: number;\n  cacheWriteTokens: number;\n  inputCost: number;\n  outputCost: number;\n  timestamp: number;\n  turn: number;\n  toolName?: string;\n}\n\nexport interface ModelPricing {\n  inputCostPer1k: number;\n  outputCostPer1k: number;\n}\n\nexport const DEFAULT_PRICING: Record<string, ModelPricing> = {\n  \"claude-sonnet-4-20250514\": { inputCostPer1k: 0.003, outputCostPer1k: 0.015 },\n  \"claude-3-5-sonnet-20241022\": { inputCostPer1k: 0.003, outputCostPer1k: 0.015 },\n  \"claude-3-5-haiku-20241022\": { inputCostPer1k: 0.0008, outputCostPer1k: 0.004 },\n  \"claude-opus-4-20250514\": { inputCostPer1k: 0.015, outputCostPer1k: 0.075 },\n  \"gpt-4o\": { inputCostPer1k: 0.0025, outputCostPer1k: 0.01 },\n  \"gpt-4o-mini\": { inputCostPer1k: 0.00015, outputCostPer1k: 0.0006 },\n  \"gpt-4-turbo\": { inputCostPer1k: 0.01, outputCostPer1k: 0.03 },\n};\n\nexport class CostTracker {\n  private records: CostRecord[] = [];\n  private pricing: Record<string, ModelPricing>;\n\n  constructor(customPricing?: Record<string, ModelPricing>) {\n    this.pricing = { ...DEFAULT_PRICING, ...customPricing };\n  }\n\n  record(\n    model: string,\n    usage: { inputTokens: number; outputTokens: number; cacheReadTokens?: number; cacheWriteTokens?: number },\n    turn: number,\n    toolName?: string,\n  ): void {\n    const pricing = this.pricing[model] ?? { inputCostPer1k: 0.001, outputCostPer1k: 0.003 };\n    this.records.push({\n      model,\n      inputTokens: usage.inputTokens,\n      outputTokens: usage.outputTokens,\n      cacheReadTokens: usage.cacheReadTokens ?? 0,\n      cacheWriteTokens: usage.cacheWriteTokens ?? 0,\n      inputCost: (usage.inputTokens / 1000) * pricing.inputCostPer1k,\n      outputCost: (usage.outputTokens / 1000) * pricing.outputCostPer1k,\n      timestamp: Date.now(),\n      turn,\n      toolName,\n    });\n  }\n\n  getTotal(): {\n    cost: number;\n    inputTokens: number;\n    outputTokens: number;\n    cacheReadTokens: number;\n    cacheWriteTokens: number;\n  } {\n    let cost = 0;\n    let input = 0;\n    let output = 0;\n    let cacheRead = 0;\n    let cacheWrite = 0;\n    for (const r of this.records) {\n      cost += r.inputCost + r.outputCost;\n      input += r.inputTokens;\n      output += r.outputTokens;\n      cacheRead += r.cacheReadTokens;\n      cacheWrite += r.cacheWriteTokens;\n    }\n    return { cost, inputTokens: input, outputTokens: output, cacheReadTokens: cacheRead, cacheWriteTokens: cacheWrite };\n  }\n\n  getByModel(): Record<string, { cost: number; calls: number }> {\n    const byModel: Record<string, { cost: number; calls: number }> = {};\n    for (const r of this.records) {\n      if (!byModel[r.model]) byModel[r.model] = { cost: 0, calls: 0 };\n      byModel[r.model].cost += r.inputCost + r.outputCost;\n      byModel[r.model].calls++;\n    }\n    return byModel;\n  }\n\n  getByTool(): Record<string, { cost: number; calls: number }> {\n    const byTool: Record<string, { cost: number; calls: number }> = {};\n    for (const r of this.records) {\n      const key = r.toolName ?? \"llm\";\n      if (!byTool[key]) byTool[key] = { cost: 0, calls: 0 };\n      byTool[key].cost += r.inputCost + r.outputCost;\n      byTool[key].calls++;\n    }\n    return byTool;\n  }\n\n  getRecords(): CostRecord[] {\n    return [...this.records];\n  }\n\n  reset(): void {\n    this.records = [];\n  }\n\n  setPricing(model: string, pricing: ModelPricing): void {\n    this.pricing[model] = pricing;\n  }\n}\n","import type { Message, LoopEvent, AgentConfig, PermissionConfig } from \"./types.js\";\nimport { DEFAULT_MAX_TURNS, DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_OUTPUT_TOKENS, DEFAULT_COMPACT_THRESHOLD } from \"./types.js\";\nimport { agentLoop } from \"./loop.js\";\nimport { ToolRegistry } from \"./tools/registry.js\";\nimport { defineTool } from \"./tools/tool.js\";\nimport type { Tool } from \"./tools/tool.js\";\nimport { ToolVerifier } from \"./tools/verifier.js\";\nimport type { DualPathVerifier } from \"./verify/router.js\";\nimport { ContextManager } from \"./context/manager.js\";\nimport { ProjectContext } from \"./context/project-context.js\";\nimport { PermissionEngine } from \"./permissions/engine.js\";\nimport type { Provider } from \"./llm/provider.js\";\nimport type { AgentHooks } from \"./hooks.js\";\nimport { HookRunner } from \"./hooks.js\";\nimport type { MemoryStore } from \"./memory/store.js\";\nimport type { CostTracker } from \"./cost/tracker.js\";\nimport { CostTracker as CostTrackerImpl } from \"./cost/tracker.js\";\n\nexport interface AgentConfigV2 extends AgentConfig {\n  hooks?: AgentHooks;\n  memory?: MemoryStore;\n  threadId?: string;\n  costTracker?: CostTracker;\n  title?: string;\n  disableTitle?: boolean;\n  projectDir?: string;\n}\n\nexport class Agent {\n  private model: Provider;\n  private tools: ToolRegistry;\n  private systemPrompt: string;\n  private maxTurns: number;\n  private contextManager: ContextManager;\n  private permissionEngine: PermissionEngine;\n  private permissionConfig?: PermissionConfig;\n  private verifier?: ToolVerifier;\n  private dualPathVerifier?: DualPathVerifier;\n  private cwd: string;\n  private maxRetries: number;\n  private messages: Message[] = [];\n  private hooks?: AgentHooks;\n  private memory?: MemoryStore;\n  private threadId?: string;\n  private costTracker: CostTracker;\n  private _loaded = false;\n  private _title?: string;\n  private _titleFetched = false;\n  private _disableTitle = false;\n  private projectContext?: ProjectContext;\n\n  constructor(config: AgentConfig | AgentConfigV2) {\n    this.model = config.model;\n    this.tools = new ToolRegistry(config.tools ?? []);\n    this.systemPrompt = config.systemPrompt ?? \"\";\n    this.maxTurns = config.maxTurns ?? DEFAULT_MAX_TURNS;\n    this.contextManager = new ContextManager({\n      maxTokens: config.context?.maxTokens ?? DEFAULT_CONTEXT_WINDOW,\n      maxOutputTokens: config.context?.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS,\n      compactThreshold: config.context?.compactThreshold ?? DEFAULT_COMPACT_THRESHOLD,\n    });\n    this.permissionEngine = new PermissionEngine(config.permissions);\n    this.permissionConfig = config.permissions;\n    this.verifier = config.verifier;\n    this.dualPathVerifier = config.dualPathVerifier;\n    this.cwd = config.cwd ?? process.cwd();\n    this.maxRetries = config.maxRetries ?? 5;\n\n    const v2 = config as AgentConfigV2;\n    this.hooks = v2.hooks;\n    this.memory = v2.memory;\n    this.threadId = v2.threadId;\n    this.costTracker = v2.costTracker ?? new CostTrackerImpl();\n    this._title = v2.title;\n    this._disableTitle = v2.disableTitle ?? false;\n\n    const projectDir = v2.projectDir ?? config.cwd;\n    if (projectDir) {\n      this.projectContext = new ProjectContext(projectDir);\n    }\n  }\n\n  addTool(tool: Tool): void {\n    this.tools.add(tool);\n  }\n\n  addMessage(message: Message): void {\n    this.messages.push(message);\n  }\n\n  reset(): void {\n    this.messages = [];\n    this._titleFetched = false;\n  }\n\n  getMessages(): Message[] {\n    return [...this.messages];\n  }\n\n  getCostTracker(): CostTracker {\n    return this.costTracker;\n  }\n\n  get title(): string | undefined {\n    return this._title;\n  }\n\n  private async loadMemory(): Promise<void> {\n    if (this._loaded || !this.memory || !this.threadId) return;\n    const stored = await this.memory.getThread(this.threadId);\n    if (stored.length > 0) {\n      this.messages = stored;\n    }\n    this._loaded = true;\n  }\n\n  private async saveMemory(): Promise<void> {\n    if (!this.memory || !this.threadId) return;\n    await this.memory.saveThread(this.threadId, this.messages);\n  }\n\n  fork(newThreadId?: string): Agent {\n    const forked = new Agent({\n      model: this.model,\n      tools: this.tools.getAll(),\n      systemPrompt: this.systemPrompt,\n      maxTurns: this.maxTurns,\n      cwd: this.cwd,\n      maxRetries: this.maxRetries,\n      permissions: this.permissionConfig,\n      hooks: this.hooks,\n      memory: this.memory,\n      threadId: newThreadId,\n      costTracker: this.costTracker,\n      title: this._title,\n      context: {\n        maxTokens: this.contextManager.maxTokens,\n        maxOutputTokens: this.contextManager.maxOutputTokens,\n        compactThreshold: this.contextManager.compactThreshold,\n      },\n      dualPathVerifier: this.dualPathVerifier,\n    });\n    forked.messages = [...this.messages];\n    return forked;\n  }\n\n  async *run(prompt: string, options?: { abortSignal?: AbortSignal }): AsyncGenerator<LoopEvent> {\n    await this.loadMemory();\n\n    const isFirstRun = this.messages.length === 0;\n    let effectivePrompt = prompt;\n\n    if (isFirstRun && this.projectContext) {\n      const projectInfo = this.projectContext.getProjectContextString();\n      effectivePrompt = `[Project Context]\\n${projectInfo}\\n\\n[User Request]\\n${prompt}`;\n    }\n\n    const loopMessages = [...this.messages, { role: \"user\" as const, content: effectivePrompt }];\n\n    if (!this._titleFetched && this.messages.length === 0 && !this._disableTitle) {\n      this._titleFetched = true;\n      this.generateTitle(prompt).catch(() => {});\n    }\n\n    const loop = agentLoop({\n      model: this.model,\n      tools: this.tools,\n      messages: loopMessages,\n      systemPrompt: this.systemPrompt || undefined,\n      maxTurns: this.maxTurns,\n      contextManager: this.contextManager,\n      permissionEngine: this.permissionEngine,\n      cwd: this.cwd,\n      abortSignal: options?.abortSignal,\n      maxRetries: this.maxRetries,\n      hooks: this.hooks,\n      costTracker: this.costTracker,\n      verifier: this.verifier,\n      dualPathVerifier: this.dualPathVerifier,\n    });\n\n    const finalMessages: Message[] = [];\n    for await (const event of loop) {\n      yield event;\n      if (event.type === \"done\") {\n        finalMessages.length = 0;\n        finalMessages.push(...event.messages);\n      }\n    }\n\n    if (finalMessages.length > 0) {\n      this.messages = finalMessages;\n      await this.saveMemory();\n    }\n  }\n\n  async chat(prompt: string, options?: { abortSignal?: AbortSignal }): Promise<{\n    text: string;\n    usage: { inputTokens: number; outputTokens: number };\n    messages: Message[];\n    cost: number;\n  }> {\n    let text = \"\";\n    let usage = { inputTokens: 0, outputTokens: 0 };\n\n    for await (const event of this.run(prompt, options)) {\n      if (event.type === \"text\") {\n        text += event.text;\n      }\n      if (event.type === \"done\") {\n        usage = {\n          inputTokens: event.usage.inputTokens,\n          outputTokens: event.usage.outputTokens,\n        };\n      }\n    }\n\n    const total = this.costTracker.getTotal();\n    return { text, usage, messages: this.getMessages(), cost: total.cost };\n  }\n\n  async structured<T>(\n    prompt: string,\n    schema: { safeParse: (data: unknown) => { success: boolean; data?: T; error?: { issues: Array<{ path: (string | number)[]; message: string }> } } },\n    options?: { abortSignal?: AbortSignal; maxRetries?: number },\n  ): Promise<T> {\n    const maxRetries = options?.maxRetries ?? 3;\n\n    for (let attempt = 0; attempt < maxRetries; attempt++) {\n      const currentPrompt = attempt === 0\n        ? prompt\n        : `${prompt}\\n\\nPrevious attempt returned invalid JSON. Please fix and respond with valid JSON only.`;\n\n      const agent = new Agent({\n        model: this.model,\n        tools: [],\n        systemPrompt: \"You must respond with valid JSON matching the requested schema.\",\n        maxTurns: 1,\n        cwd: this.cwd,\n        permissions: this.permissionConfig,\n        context: {\n          maxTokens: this.contextManager.maxTokens,\n          maxOutputTokens: this.contextManager.maxOutputTokens,\n          compactThreshold: this.contextManager.compactThreshold,\n        },\n        costTracker: this.costTracker,\n        disableTitle: true,\n      } as AgentConfigV2);\n\n      const result = await agent.chat(currentPrompt, options);\n      const jsonMatch = result.text.match(/```(?:json)?\\s*([\\s\\S]*?)```/) ?? [null, result.text];\n      const jsonStr = jsonMatch[1] ?? result.text;\n\n      try {\n        const parsed = JSON.parse(jsonStr);\n        const validated = schema.safeParse(parsed);\n        if (validated.success && validated.data !== undefined) {\n          return validated.data as T;\n        }\n      } catch {\n        continue;\n      }\n    }\n\n    throw new Error(`Failed to get valid structured output after ${maxRetries} attempts`);\n  }\n\n  async structuredViaTool<T>(\n    prompt: string,\n    schema: { safeParse: (data: unknown) => { success: boolean; data?: T; error?: { issues: Array<{ path: (string | number)[]; message: string }> } } },\n    options?: { abortSignal?: AbortSignal; maxRetries?: number },\n  ): Promise<T> {\n    const { z } = await import(\"zod\");\n    const maxRetries = options?.maxRetries ?? 3;\n\n    let captured: T | undefined;\n\n    const structTool = defineTool({\n      name: \"structured_output\",\n      description: \"Return your final response in the required structured format.\",\n      inputSchema: z.object({\n        response: z.unknown().describe(\"The structured JSON response\"),\n      }),\n      isReadOnly: true,\n      isConcurrencySafe: true,\n      execute: async (input: Record<string, unknown>) => {\n        captured = input.response as T;\n        return \"Structured output captured.\";\n      },\n    });\n\n    const agent = new Agent({\n      model: this.model,\n      tools: [structTool],\n      systemPrompt: [\n        this.systemPrompt,\n        \"You MUST call the structured_output tool with your response. Do not return plain text.\",\n      ].filter(Boolean).join(\"\\n\\n\"),\n      maxTurns: 1,\n      cwd: this.cwd,\n      permissions: this.permissionConfig,\n      context: {\n        maxTokens: this.contextManager.maxTokens,\n        maxOutputTokens: this.contextManager.maxOutputTokens,\n        compactThreshold: this.contextManager.compactThreshold,\n      },\n      costTracker: this.costTracker,\n      disableTitle: true,\n    } as AgentConfigV2);\n\n    for (let attempt = 0; attempt < maxRetries; attempt++) {\n      captured = undefined;\n      const currentPrompt = attempt === 0\n        ? prompt\n        : `${prompt}\\n\\nPrevious attempt failed validation. Fix your structured output and call the structured_output tool again.`;\n\n      await agent.chat(currentPrompt, options);\n\n      if (captured !== undefined) {\n        const validated = schema.safeParse(captured);\n        if (validated.success && validated.data !== undefined) {\n          return validated.data as T;\n        }\n      }\n    }\n\n    throw new Error(`Failed to get valid structured output via tool after ${maxRetries} attempts`);\n  }\n\n  async asTool(options?: { allowSubAgents?: boolean; name?: string; description?: string }): Promise<Tool> {\n    const { z } = await import(\"zod\");\n    const allowSubAgents = options?.allowSubAgents ?? false;\n    return defineTool({\n      name: options?.name ?? \"delegate_agent\",\n      description: options?.description ?? `Delegate a task to a sub-agent with system prompt: ${this.systemPrompt?.slice(0, 100) ?? \"none\"}`,\n      inputSchema: z.object({\n        prompt: z.string().describe(\"The task to delegate\"),\n      }),\n      isReadOnly: true,\n      isConcurrencySafe: true,\n      execute: async (input: Record<string, unknown>) => {\n        const subAgent = this.fork();\n        if (!allowSubAgents) {\n          const forbiddenTools = [\"delegate_agent\", \"task\", \"todowrite\"];\n          const allowed = this.tools.getAll().filter((t) => !forbiddenTools.includes(t.name));\n          for (const tool of allowed) {\n            subAgent.addTool(tool);\n          }\n        }\n        const result = await subAgent.chat(input.prompt as string);\n        return result.text;\n      },\n    });\n  }\n\n  private async generateTitle(prompt: string): Promise<void> {\n    try {\n      const firstLine = prompt.split(\"\\n\")[0].slice(0, 200);\n      const titleAgent = new Agent({\n        model: this.model,\n        tools: [],\n        systemPrompt: \"Generate a short, descriptive title (max 10 words) for a conversation that starts with this message. Return ONLY the title, nothing else.\",\n        maxTurns: 1,\n        cwd: this.cwd,\n        costTracker: this.costTracker,\n        disableTitle: true,\n      } as AgentConfigV2);\n      const result = await titleAgent.chat(firstLine);\n      const title = result.text.trim().replace(/^[\"']|[\"']$/g, \"\").slice(0, 80);\n      if (title.length > 0) {\n        this._title = title;\n      }\n    } catch {\n      this._title = prompt.slice(0, 50);\n    }\n  }\n}\n","import { exec } from 'node:child_process';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nconst MAX_OUTPUT = 50 * 1024;\nconst TRUNCATE_HALF = 25 * 1024;\n\nfunction truncateOutput(output: string): string {\n  if (output.length <= MAX_OUTPUT) return output;\n  const notice = `\\n\\n... [output truncated: showing first ${TRUNCATE_HALF} and last ${TRUNCATE_HALF} of ${output.length} characters] ...\\n\\n`;\n  return output.slice(0, TRUNCATE_HALF) + notice + output.slice(-TRUNCATE_HALF);\n}\n\nexport const BashTool = defineTool({\n  name: 'bash',\n  description:\n    'Execute a shell command. Returns stdout and stderr. Use for running build commands, git operations, package managers, and other CLI tools.',\n  inputSchema: z.object({\n    command: z.string().describe('The shell command to execute'),\n    timeout: z.number().optional().describe('Timeout in milliseconds (default 120000)'),\n    workdir: z.string().optional().describe('Working directory for the command'),\n  }),\n  isReadOnly: false,\n  isConcurrencySafe: false,\n  execute: async ({ command, timeout = 120000, workdir }, context) => {\n    return new Promise<string>((resolve) => {\n      let settled = false;\n      const done = (result: string) => {\n        if (settled) return;\n        settled = true;\n        resolve(result);\n      };\n\n      if (context.abortSignal?.aborted) {\n        done('Command aborted before execution');\n        return;\n      }\n\n      const child = exec(\n        command,\n        {\n          cwd: workdir ?? context.cwd,\n          timeout,\n          maxBuffer: 10 * 1024 * 1024,\n          killSignal: 'SIGKILL',\n        },\n        (error, stdout, stderr) => {\n          let output = '';\n          if (stdout) output += `STDOUT:\\n${stdout}\\n\\n`;\n          if (stderr) output += `STDERR:\\n${stderr}\\n\\n`;\n          output += `Exit code: ${error?.code ?? 0}`;\n          if (error && error.killed) {\n            output = `Command timed out after ${timeout}ms\\n\\n${output}`;\n          }\n          done(truncateOutput(output));\n        },\n      );\n\n      child.on('error', (err) => {\n        done(`Failed to execute command: ${err.message}`);\n      });\n\n      if (context.abortSignal) {\n        context.abortSignal.addEventListener(\n          'abort',\n          () => {\n            child.kill('SIGKILL');\n            done('Command aborted');\n          },\n          { once: true },\n        );\n      }\n    });\n  },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nconst MAX_LINE_LENGTH = 2000;\n\nexport const FileReadTool = defineTool({\n  name: 'file_read',\n  description:\n    'Read the contents of a file. Returns the file content with line numbers. Use GlobTool to find files first.',\n  inputSchema: z.object({\n    path: z.string().describe('Absolute or relative path to the file'),\n    offset: z.number().optional().describe('Line number to start reading from (1-indexed)'),\n    limit: z.number().optional().describe('Maximum number of lines to read'),\n  }),\n  isReadOnly: true,\n  isConcurrencySafe: true,\n  execute: async ({ path: filePath, offset, limit }, context) => {\n    try {\n      const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(context.cwd, filePath);\n\n      const content = await fs.readFile(resolved, 'utf-8');\n      const lines = content.split('\\n');\n\n      const startLine = offset ? Math.max(1, offset) : 1;\n      const startIndex = startLine - 1;\n      const endIndex = limit != null ? startIndex + limit : lines.length;\n      const selected = lines.slice(startIndex, endIndex);\n\n      const formatted = selected\n        .map((line, i) => {\n          const lineNum = startLine + i;\n          const truncated = line.length > MAX_LINE_LENGTH ? line.slice(0, MAX_LINE_LENGTH) + '...' : line;\n          return `${lineNum}: ${truncated}`;\n        })\n        .join('\\n');\n\n      return formatted;\n    } catch (err: unknown) {\n      if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n        return `Error: File not found: ${filePath}`;\n      }\n      if ((err as NodeJS.ErrnoException).code === 'EISDIR') {\n        return `Error: Path is a directory: ${filePath}`;\n      }\n      return `Error reading file: ${err instanceof Error ? err.message : String(err)}`;\n    }\n  },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nexport const FileWriteTool = defineTool({\n  name: 'file_write',\n  description:\n    \"Write content to a file. Creates the file if it doesn't exist, overwrites if it does. Parent directories are created automatically.\",\n  inputSchema: z.object({\n    path: z.string().describe('Path to the file'),\n    content: z.string().describe('Content to write'),\n  }),\n  isReadOnly: false,\n  isConcurrencySafe: false,\n  execute: async ({ path: filePath, content }, context) => {\n    try {\n      const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(context.cwd, filePath);\n      const dir = path.dirname(resolved);\n\n      await fs.mkdir(dir, { recursive: true });\n      await fs.writeFile(resolved, content, 'utf-8');\n\n      return `Wrote ${content.length} characters to ${filePath}`;\n    } catch (err: unknown) {\n      return `Error writing file: ${err instanceof Error ? err.message : String(err)}`;\n    }\n  },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\nimport { fuzzyReplace } from './fuzzy-edit.js';\n\nexport const FileEditTool = defineTool({\n  name: 'file_edit',\n  description:\n    'Edit an existing file by replacing a string match with new content. Uses 9-strategy fuzzy matching (exact, line-trimmed, block-anchor with Levenshtein, whitespace-normalized, indentation-flexible, escape-normalized, trimmed-boundary, context-aware, multi-occurrence) so the oldString does not need to be a perfect character-for-character match. For multi-line edits, include enough surrounding context to ensure uniqueness.',\n  inputSchema: z.object({\n    path: z.string().describe('Path to the file'),\n    oldString: z.string().describe('The string to find and replace (fuzzy-matched)'),\n    newString: z.string().describe('The replacement string'),\n    replaceAll: z.boolean().optional().describe('Replace all occurrences instead of just the first'),\n  }),\n  isReadOnly: false,\n  isConcurrencySafe: false,\n  execute: async ({ path: filePath, oldString, newString, replaceAll = false }, context) => {\n    try {\n      const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(context.cwd, filePath);\n\n      const content = await fs.readFile(resolved, 'utf-8');\n\n      let newContent: string;\n      let count = 0;\n\n      if (replaceAll) {\n        const occurrences = content.split(oldString).length - 1;\n        if (occurrences === 0) {\n          try {\n            newContent = fuzzyReplace(content, oldString, newString, true);\n            count = 1;\n          } catch {\n            return `Error: oldString not found in ${filePath} (tried 9 fuzzy strategies)`;\n          }\n        } else {\n          newContent = content.split(oldString).join(newString);\n          count = occurrences;\n        }\n      } else {\n        try {\n          newContent = fuzzyReplace(content, oldString, newString, false);\n          count = 1;\n        } catch (err) {\n          const kind = (err as { kind?: string }).kind;\n          if (kind === \"ambiguous\") {\n            return `Error: Multiple matches for oldString in ${filePath}. Provide more surrounding context or set replaceAll to true.`;\n          }\n          return `Error: oldString not found in ${filePath} (tried 9 fuzzy strategies)`;\n        }\n      }\n\n      await fs.writeFile(resolved, newContent, 'utf-8');\n\n      return `Replaced ${count} occurrence(s) in ${filePath}`;\n    } catch (err: unknown) {\n      if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n        return `Error: File not found: ${filePath}`;\n      }\n      return `Error editing file: ${err instanceof Error ? err.message : String(err)}`;\n    }\n  },\n});\n","import type { ToolUseBlock } from \"../types.js\";\n\nexport type ReplacerFn = (content: string, find: string) => Generator<string, void, unknown>;\n\nexport class FuzzyEditError extends Error {\n  constructor(public readonly kind: \"not_found\" | \"ambiguous\", message: string) {\n    super(message);\n    this.name = \"FuzzyEditError\";\n  }\n}\n\nfunction levenshtein(a: string, b: string): number {\n  const m = a.length;\n  const n = b.length;\n  if (m === 0) return n;\n  if (n === 0) return m;\n  if (Math.abs(m - n) > Math.max(m, n) * 0.5) return Math.max(m, n);\n  let prev = new Array(n + 1).fill(0) as number[];\n  let curr = new Array(n + 1).fill(0) as number[];\n  for (let j = 0; j <= n; j++) prev[j] = j;\n  for (let i = 1; i <= m; i++) {\n    curr[0] = i;\n    for (let j = 1; j <= n; j++) {\n      const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n      curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost);\n    }\n    [prev, curr] = [curr, prev];\n  }\n  return prev[n];\n}\n\nfunction similarity(a: string, b: string): number {\n  if (a.length > 1000 || b.length > 1000) return a === b ? 1 : 0;\n  const maxLen = Math.max(a.length, b.length);\n  if (maxLen === 0) return 1;\n  return 1 - levenshtein(a, b) / maxLen;\n}\n\nfunction* simpleReplacer(content: string, find: string): Generator<string, void, unknown> {\n  if (content.includes(find)) yield find;\n}\n\nfunction* lineTrimmedReplacer(content: string, find: string): Generator<string, void, unknown> {\n  const lines = find.split(\"\\n\").map(l => l.trim());\n  const contentLines = content.split(\"\\n\");\n  for (let i = 0; i <= contentLines.length - lines.length; i++) {\n    if (contentLines.slice(i, i + lines.length).every((cl, idx) => cl.trim() === lines[idx])) {\n      yield contentLines.slice(i, i + lines.length).join(\"\\n\");\n    }\n  }\n}\n\nfunction* blockAnchorReplacer(content: string, find: string): Generator<string, void, unknown> {\n  const findLines = find.split(\"\\n\");\n  const contentLines = content.split(\"\\n\");\n\n  if (findLines.length < 2) return;\n\n  const firstLine = findLines[0];\n  const lastLine = findLines[findLines.length - 1];\n  const middleLines = findLines.slice(1, -1);\n\n  for (let i = 0; i <= contentLines.length - findLines.length; i++) {\n    if (contentLines[i] !== firstLine) continue;\n    const endIdx = i + findLines.length - 1;\n    if (contentLines[endIdx] !== lastLine) continue;\n\n    const candidates: { idx: number; score: number }[] = [];\n\n    for (let j = i + 1; j < endIdx; j++) {\n      candidates.push({ idx: j, score: 0 });\n    }\n\n    let totalScore = 0;\n    for (let k = 0; k < middleLines.length; k++) {\n      const contentLine = contentLines[i + 1 + k];\n      const sim = similarity(middleLines[k], contentLine);\n      totalScore += sim;\n      if (candidates[k]) candidates[k].score = sim;\n    }\n\n    const avgScore = totalScore / middleLines.length;\n    const threshold = candidates.length > 1 ? 0.3 : 0.0;\n\n    if (avgScore >= threshold) {\n      yield contentLines.slice(i, i + findLines.length).join(\"\\n\");\n    }\n  }\n}\n\nfunction* whitespaceNormalizedReplacer(content: string, find: string): Generator<string, void, unknown> {\n  const normFind = find.replace(/\\s+/g, \" \").trim();\n  if (!normFind) return;\n  const normContent = content.replace(/\\s+/g, \" \").trim();\n  const idx = normContent.indexOf(normFind);\n  if (idx === -1) return;\n\n  const firstWord = normFind.split(\" \")[0];\n  const lastWord = normFind.split(\" \").filter(Boolean).pop()!;\n  const firstIdx = content.indexOf(firstWord);\n  const lastIdx = content.lastIndexOf(lastWord);\n  if (firstIdx === -1 || lastIdx === -1 || lastIdx < firstIdx) return;\n\n  yield content.substring(firstIdx, lastIdx + lastWord.length);\n}\n\nfunction* indentationFlexibleReplacer(content: string, find: string): Generator<string, void, unknown> {\n  const lines = find.split(\"\\n\");\n  const minIndent = Math.min(...lines.filter(l => l.trim().length > 0).map(l => l.match(/^(\\s*)/)?.[1].length ?? 0));\n  const dedented = lines.map(l => l.substring(minIndent)).join(\"\\n\");\n  if (content.includes(dedented)) yield dedented;\n}\n\nfunction* escapeNormalizedReplacer(content: string, find: string): Generator<string, void, unknown> {\n  const normalized = find\n    .replace(/\\\\n/g, \"\\n\")\n    .replace(/\\\\t/g, \"\\t\")\n    .replace(/\\\\\"/g, '\"')\n    .replace(/\\\\'/g, \"'\");\n  if (content.includes(normalized)) yield normalized;\n}\n\nfunction* trimmedBoundaryReplacer(content: string, find: string): Generator<string, void, unknown> {\n  const trimmed = find.trim();\n  if (content.includes(trimmed)) yield trimmed;\n}\n\nfunction* contextAwareReplacer(content: string, find: string): Generator<string, void, unknown> {\n  const findLines = find.split(\"\\n\");\n  if (findLines.length < 3) return;\n\n  const firstLine = findLines[0].trim();\n  const lastLine = findLines[findLines.length - 1].trim();\n  const contentLines = content.split(\"\\n\");\n\n  for (let i = 0; i <= contentLines.length - 3; i++) {\n    if (contentLines[i].trim() !== firstLine) continue;\n\n    let bestEndIdx = -1;\n    let bestScore = 0;\n\n    for (let j = i + 2; j < contentLines.length; j++) {\n      if (contentLines[j].trim() === lastLine) {\n        const middleCount = j - i - 1;\n        let matchCount = 0;\n        for (let k = 1; k <= middleCount; k++) {\n          const fIdx = Math.floor((k / (middleCount + 1)) * (findLines.length - 2));\n          if (fIdx >= 0 && fIdx < findLines.length - 2) {\n            if (similarity(contentLines[i + k].trim(), findLines[fIdx + 1].trim()) > 0.5) {\n              matchCount++;\n            }\n          }\n        }\n        const score = matchCount / middleCount;\n        if (score > bestScore) {\n          bestScore = score;\n          bestEndIdx = j;\n        }\n      }\n    }\n\n    if (bestEndIdx !== -1 && bestScore > 0.5) {\n      yield contentLines.slice(i, bestEndIdx + 1).join(\"\\n\");\n    }\n  }\n}\n\nconst REPLACERS: ReplacerFn[] = [\n  simpleReplacer,\n  lineTrimmedReplacer,\n  blockAnchorReplacer,\n  whitespaceNormalizedReplacer,\n  indentationFlexibleReplacer,\n  escapeNormalizedReplacer,\n  trimmedBoundaryReplacer,\n  contextAwareReplacer,\n];\n\nexport function fuzzyReplace(\n  content: string,\n  oldString: string,\n  newString: string,\n  replaceAll = false,\n): string {\n  for (const replacer of REPLACERS) {\n    for (const search of replacer(content, oldString)) {\n      const idx = content.indexOf(search);\n      if (idx === -1) continue;\n\n      if (replaceAll) {\n        return content.split(search).join(newString);\n      }\n\n      const firstIdx = content.indexOf(search);\n      const lastIdx = content.lastIndexOf(search);\n      if (firstIdx !== lastIdx) continue;\n\n      return content.substring(0, firstIdx) + newString + content.substring(firstIdx + search.length);\n    }\n  }\n\n  throw new FuzzyEditError(\"not_found\", `Could not find match for replacement (after 8 fuzzy strategies)`);\n}\n\nexport function fuzzyContains(content: string, find: string): boolean {\n  try {\n    fuzzyReplace(content, find, \"PLACEHOLDER_CHECK\");\n    return true;\n  } catch {\n    return false;\n  }\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\nimport { globToRegExp } from '../utils.js';\n\nconst MAX_RESULTS = 200;\n\nasync function walkDir(dir: string): Promise<string[]> {\n  const { walkDir: walk } = await import('../utils.js');\n  const entries = await walk(dir);\n  return entries.map((e) => e.path);\n}\n\nfunction matchInclude(filePath: string, includePattern?: string): boolean {\n  if (!includePattern) return true;\n  const base = path.basename(filePath);\n  const re = globToRegExp(includePattern);\n  return re.test(base);\n}\n\nexport const GlobTool = defineTool({\n  name: 'glob',\n  description:\n    'Find files matching a glob pattern. Returns matching file paths sorted by modification time.',\n  inputSchema: z.object({\n    pattern: z.string().describe('Glob pattern (e.g., \"**/*.ts\", \"src/**/*.tsx\")'),\n    path: z.string().optional().describe('Directory to search in (default: current directory)'),\n    include: z.string().optional().describe('File extension or pattern to include (e.g., \"*.ts\")'),\n  }),\n  isReadOnly: true,\n  isConcurrencySafe: true,\n  execute: async ({ pattern, path: searchPath, include }, context) => {\n    try {\n      const searchDir = searchPath\n        ? path.isAbsolute(searchPath)\n          ? searchPath\n          : path.resolve(context.cwd, searchPath)\n        : context.cwd;\n\n      const allFiles = await walkDir(searchDir);\n      const re = globToRegExp(pattern);\n\n      const matched: Array<{ filePath: string; mtimeMs: number }> = [];\n\n      for (const filePath of allFiles) {\n        const relative = path.relative(searchDir, filePath);\n        if (re.test(relative) && matchInclude(relative, include)) {\n          try {\n            const stat = await fs.stat(filePath);\n            matched.push({ filePath: relative, mtimeMs: stat.mtimeMs });\n          } catch {\n            matched.push({ filePath: relative, mtimeMs: 0 });\n          }\n        }\n      }\n\n      matched.sort((a, b) => b.mtimeMs - a.mtimeMs);\n      const limited = matched.slice(0, MAX_RESULTS);\n      return limited.map((m) => m.filePath).join('\\n');\n    } catch (err: unknown) {\n      return `Error searching files: ${err instanceof Error ? err.message : String(err)}`;\n    }\n  },\n});\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineTool } from './tool.js';\nimport { globToRegExp } from '../utils.js';\n\nconst MAX_MATCHES = 200;\n\nasync function walkDir(dir: string): Promise<string[]> {\n  const { walkDir: walk } = await import('../utils.js');\n  const entries = await walk(dir);\n  return entries.map((e) => e.path);\n}\n\nexport const GrepTool = defineTool({\n  name: 'grep',\n  description:\n    'Search file contents using a regular expression. Returns matching file paths with line numbers.',\n  inputSchema: z.object({\n    pattern: z.string().describe('Regular expression to search for'),\n    path: z.string().optional().describe('Directory to search in'),\n    include: z.string().optional().describe('File pattern to include (e.g., \"*.ts\")'),\n  }),\n  isReadOnly: true,\n  isConcurrencySafe: true,\n  execute: async ({ pattern, path: searchPath, include }, context) => {\n    try {\n      let regex: RegExp;\n      try {\n        regex = new RegExp(pattern);\n      } catch {\n        return `Error: Invalid regular expression: ${pattern}`;\n      }\n\n      const searchDir = searchPath\n        ? path.isAbsolute(searchPath)\n          ? searchPath\n          : path.resolve(context.cwd, searchPath)\n        : context.cwd;\n\n      const includeRe = include ? globToRegExp(include) : null;\n      const allFiles = await walkDir(searchDir);\n      const matches: string[] = [];\n\n      for (const filePath of allFiles) {\n        if (matches.length >= MAX_MATCHES) break;\n\n        if (includeRe) {\n          const base = path.basename(filePath);\n          if (!includeRe.test(base)) continue;\n        }\n\n        let content: string;\n        try {\n          content = await fs.readFile(filePath, 'utf-8');\n        } catch {\n          continue;\n        }\n\n        const lines = content.split('\\n');\n        const relative = path.relative(searchDir, filePath);\n\n        for (let lineIdx = 0; lineIdx < lines.length; lineIdx++) {\n          if (matches.length >= MAX_MATCHES) break;\n          const line = lines[lineIdx];\n          if (regex.test(line)) {\n            matches.push(`${relative}:${lineIdx + 1}: ${line}`);\n            regex.lastIndex = 0;\n          } else {\n            regex.lastIndex = 0;\n          }\n        }\n      }\n\n      if (matches.length === 0) {\n        return 'No matches found.';\n      }\n\n      return matches.join('\\n');\n    } catch (err: unknown) {\n      return `Error searching files: ${err instanceof Error ? err.message : String(err)}`;\n    }\n  },\n});\n","import { z } from 'zod';\nimport { defineTool } from './tool.js';\n\nconst MAX_RESPONSE_SIZE = 100 * 1024;\n\nexport const WebFetchTool = defineTool({\n  name: 'web_fetch',\n  description:\n    'Fetch content from a URL. Returns the response body as text. Supports HTTP and HTTPS.',\n  inputSchema: z.object({\n    url: z.string().url().describe('The URL to fetch'),\n    method: z.enum(['GET', 'POST', 'PUT', 'DELETE']).optional().describe('HTTP method (default: GET)'),\n    headers: z.record(z.string()).optional().describe('Request headers'),\n    body: z.string().optional().describe('Request body (for POST/PUT)'),\n  }),\n  isReadOnly: true,\n  isConcurrencySafe: true,\n  execute: async ({ url, method = 'GET', headers, body }, context) => {\n    try {\n      if (context.abortSignal?.aborted) {\n        return 'Request aborted before execution';\n      }\n\n      const timeoutSignal = AbortSignal.timeout(30_000);\n      let signal: AbortSignal;\n      if (context.abortSignal) {\n        signal = AbortSignal.any([context.abortSignal, timeoutSignal]);\n      } else {\n        signal = timeoutSignal;\n      }\n\n      const fetchOptions: RequestInit = {\n        method,\n        headers,\n        signal,\n        redirect: 'follow',\n      };\n\n      if (body && method !== 'GET') {\n        fetchOptions.body = body;\n      }\n\n      const response = await fetch(url, fetchOptions);\n      const contentType = response.headers.get('content-type') ?? 'unknown';\n      const status = response.status;\n\n      const text = await response.text();\n\n      let result = `Status: ${status}\\nContent-Type: ${contentType}\\n\\n`;\n      if (text.length > MAX_RESPONSE_SIZE) {\n        const half = Math.floor(MAX_RESPONSE_SIZE / 2);\n        const notice = `\\n\\n... [response truncated: showing first ${half} and last ${half} of ${text.length} characters] ...\\n\\n`;\n        result += text.slice(0, half) + notice + text.slice(-half);\n      } else {\n        result += text;\n      }\n\n      return result;\n    } catch (err: unknown) {\n      if (err instanceof Error && err.name === 'AbortError') {\n        return 'Request aborted';\n      }\n      return `Error fetching URL: ${err instanceof Error ? err.message : String(err)}`;\n    }\n  },\n});\n","import * as fs from \"fs\";\nimport * as path from \"path\";\n\nexport interface SymbolEntry {\n  name: string;\n  kind:\n    | \"function\"\n    | \"class\"\n    | \"interface\"\n    | \"type\"\n    | \"variable\"\n    | \"constant\"\n    | \"enum\"\n    | \"method\"\n    | \"property\";\n  filePath: string;\n  line: number;\n  exported: boolean;\n}\n\nexport interface ImportEntry {\n  source: string;\n  symbols: string[];\n  filePath: string;\n  line: number;\n}\n\nexport interface FileEntry {\n  path: string;\n  relativePath: string;\n  lastModified: number;\n  size: number;\n  lineCount: number;\n  language: string;\n  symbols: SymbolEntry[];\n  imports: ImportEntry[];\n}\n\nexport interface CodebaseIndex {\n  rootDir: string;\n  files: Map<string, FileEntry>;\n  symbolIndex: Map<string, SymbolEntry[]>;\n  importGraph: Map<string, Set<string>>;\n  indexedAt: number;\n  fileCount: number;\n  totalSymbols: number;\n}\n\nconst SKIP_DIRS = new Set([\n  \"node_modules\",\n  \".git\",\n  \"dist\",\n  \"build\",\n  \"target\",\n  \"__pycache__\",\n  \".next\",\n  \".venv\",\n  \"venv\",\n  \".env\",\n  \".tox\",\n  \".mypy_cache\",\n  \".pytest_cache\",\n  \"coverage\",\n  \".nuxt\",\n  \".output\",\n  \".svelte-kit\",\n  \"vendor\",\n  \"Pods\",\n  \".gradle\",\n  \".idea\",\n  \".vscode\",\n  \"bin\",\n  \"obj\",\n  \".dart_tool\",\n  \".flutter-plugins\",\n  \".synthcode\",\n]);\n\nconst MAX_FILE_SIZE = 500 * 1024;\n\nconst EXTENSION_LANGUAGE: Record<string, string> = {\n  \".ts\": \"TypeScript\",\n  \".tsx\": \"TypeScript\",\n  \".js\": \"JavaScript\",\n  \".jsx\": \"JavaScript\",\n  \".mjs\": \"JavaScript\",\n  \".cjs\": \"JavaScript\",\n  \".py\": \"Python\",\n  \".pyi\": \"Python\",\n  \".rs\": \"Rust\",\n  \".go\": \"Go\",\n  \".java\": \"Java\",\n  \".kt\": \"Kotlin\",\n  \".swift\": \"Swift\",\n  \".rb\": \"Ruby\",\n  \".css\": \"CSS\",\n  \".scss\": \"SCSS\",\n  \".html\": \"HTML\",\n  \".vue\": \"Vue\",\n  \".svelte\": \"Svelte\",\n};\n\nconst SOURCE_EXTENSIONS = new Set(Object.keys(EXTENSION_LANGUAGE));\n\ninterface SerializedIndex {\n  rootDir: string;\n  indexedAt: number;\n  fileCount: number;\n  totalSymbols: number;\n  files: Array<{\n    path: string;\n    relativePath: string;\n    lastModified: number;\n    size: number;\n    lineCount: number;\n    language: string;\n    symbols: SymbolEntry[];\n    imports: ImportEntry[];\n  }>;\n  symbolIndex: Array<[string, SymbolEntry[]]>;\n  importGraph: Array<[string, string[]]>;\n}\n\nexport class CodebaseIndexer {\n  private index: CodebaseIndex | null = null;\n\n  buildIndex(rootDir: string): CodebaseIndex {\n    const absoluteRoot = path.resolve(rootDir);\n    const files = new Map<string, FileEntry>();\n    const symbolIndex = new Map<string, SymbolEntry[]>();\n    const importGraph = new Map<string, Set<string>>();\n\n    const allFiles = this.collectFiles(absoluteRoot);\n\n    for (const filePath of allFiles) {\n      const ext = path.extname(filePath).toLowerCase();\n      const language = EXTENSION_LANGUAGE[ext];\n      if (!language) continue;\n\n      const relativePath = path.relative(absoluteRoot, filePath);\n\n      try {\n        const stat = fs.statSync(filePath);\n        if (stat.size > MAX_FILE_SIZE) continue;\n\n        const content = fs.readFileSync(filePath, \"utf-8\");\n        const lineCount = content.split(\"\\n\").length;\n\n        const symbols: SymbolEntry[] = [];\n        const imports: ImportEntry[] = [];\n\n        if (\n          language === \"TypeScript\" ||\n          language === \"JavaScript\"\n        ) {\n          this.parseTsJs(content, filePath, symbols, imports);\n        } else if (language === \"Python\") {\n          this.parsePython(content, filePath, symbols, imports);\n        }\n\n        for (const sym of symbols) {\n          const existing = symbolIndex.get(sym.name);\n          if (existing) {\n            existing.push(sym);\n          } else {\n            symbolIndex.set(sym.name, [sym]);\n          }\n        }\n\n        const importedFiles = new Set<string>();\n        for (const imp of imports) {\n          const resolved = this.resolveImport(\n            imp.source,\n            filePath,\n            absoluteRoot,\n          );\n          if (resolved) {\n            importedFiles.add(resolved);\n          }\n        }\n\n        const entry: FileEntry = {\n          path: filePath,\n          relativePath,\n          lastModified: stat.mtimeMs,\n          size: stat.size,\n          lineCount,\n          language,\n          symbols,\n          imports,\n        };\n\n        files.set(filePath, entry);\n        if (importedFiles.size > 0) {\n          importGraph.set(filePath, importedFiles);\n        }\n      } catch {\n        continue;\n      }\n    }\n\n    let totalSymbols = 0;\n    for (const syms of symbolIndex.values()) {\n      totalSymbols += syms.length;\n    }\n\n    this.index = {\n      rootDir: absoluteRoot,\n      files,\n      symbolIndex,\n      importGraph,\n      indexedAt: Date.now(),\n      fileCount: files.size,\n      totalSymbols,\n    };\n\n    return this.index;\n  }\n\n  lookup(name: string): SymbolEntry[] {\n    if (!this.index) return [];\n    return this.index.symbolIndex.get(name) ?? [];\n  }\n\n  getDependencies(filePath: string): string[] {\n    if (!this.index) return [];\n    const deps = new Set<string>();\n    for (const [file, importedFiles] of this.index.importGraph) {\n      if (importedFiles.has(filePath)) {\n        deps.add(file);\n      }\n    }\n    return Array.from(deps);\n  }\n\n  getDependents(filePath: string): string[] {\n    if (!this.index) return [];\n    return Array.from(this.index.importGraph.get(filePath) ?? []);\n  }\n\n  getRelatedFiles(filePath: string): string[] {\n    if (!this.index) return [];\n\n    const direct = new Set<string>();\n\n    const deps = this.getDependents(filePath);\n    for (const d of deps) direct.add(d);\n\n    const depsOf = this.getDependencies(filePath);\n    for (const d of depsOf) direct.add(d);\n\n    const twoHop = new Set<string>(direct);\n\n    for (const f of direct) {\n      for (const d of this.getDependents(f)) twoHop.add(d);\n      for (const d of this.getDependencies(f)) twoHop.add(d);\n    }\n\n    twoHop.delete(filePath);\n    return Array.from(twoHop);\n  }\n\n  invalidate(filePath: string): void {\n    if (!this.index) return;\n\n    const entry = this.index.files.get(filePath);\n    if (!entry) return;\n\n    for (const sym of entry.symbols) {\n      const entries = this.index.symbolIndex.get(sym.name);\n      if (entries) {\n        const filtered = entries.filter(\n          (s) => s.filePath !== filePath,\n        );\n        if (filtered.length === 0) {\n          this.index.symbolIndex.delete(sym.name);\n        } else {\n          this.index.symbolIndex.set(sym.name, filtered);\n        }\n      }\n    }\n\n    this.index.importGraph.delete(filePath);\n\n    this.index.files.delete(filePath);\n\n    this.index.fileCount = this.index.files.size;\n    this.index.totalSymbols = 0;\n    for (const syms of this.index.symbolIndex.values()) {\n      this.index.totalSymbols += syms.length;\n    }\n  }\n\n  save(rootDir: string): void {\n    if (!this.index) return;\n\n    const absoluteRoot = path.resolve(rootDir);\n    const cacheDir = path.join(absoluteRoot, \".synthcode\");\n\n    try {\n      fs.mkdirSync(cacheDir, { recursive: true });\n    } catch {\n      return;\n    }\n\n    const serialized: SerializedIndex = {\n      rootDir: this.index.rootDir,\n      indexedAt: this.index.indexedAt,\n      fileCount: this.index.fileCount,\n      totalSymbols: this.index.totalSymbols,\n      files: Array.from(this.index.files.values()).map((f) => ({\n        path: f.relativePath,\n        relativePath: f.relativePath,\n        lastModified: f.lastModified,\n        size: f.size,\n        lineCount: f.lineCount,\n        language: f.language,\n        symbols: f.symbols,\n        imports: f.imports,\n      })),\n      symbolIndex: Array.from(this.index.symbolIndex.entries()).map(\n        ([name, entries]) => [name, entries],\n      ),\n      importGraph: Array.from(this.index.importGraph.entries()).map(\n        ([file, deps]) => [file, Array.from(deps)],\n      ),\n    };\n\n    try {\n      fs.writeFileSync(\n        path.join(cacheDir, \"index.json\"),\n        JSON.stringify(serialized),\n        \"utf-8\",\n      );\n    } catch {\n      return;\n    }\n  }\n\n  load(rootDir: string): CodebaseIndex | null {\n    const absoluteRoot = path.resolve(rootDir);\n    const indexPath = path.join(absoluteRoot, \".synthcode\", \"index.json\");\n\n    let raw: string;\n    try {\n      raw = fs.readFileSync(indexPath, \"utf-8\");\n    } catch {\n      return null;\n    }\n\n    let serialized: SerializedIndex;\n    try {\n      serialized = JSON.parse(raw);\n    } catch {\n      return null;\n    }\n\n    const files = new Map<string, FileEntry>();\n    for (const f of serialized.files) {\n      const fullPath = path.resolve(absoluteRoot, f.path);\n      const entry: FileEntry = {\n        path: fullPath,\n        relativePath: f.relativePath,\n        lastModified: f.lastModified,\n        size: f.size,\n        lineCount: f.lineCount,\n        language: f.language,\n        symbols: f.symbols.map((s) => ({ ...s, filePath: fullPath })),\n        imports: f.imports.map((imp) => ({ ...imp, filePath: fullPath })),\n      };\n      files.set(fullPath, entry);\n    }\n\n    const symbolIndex = new Map<string, SymbolEntry[]>();\n    for (const [name, entries] of serialized.symbolIndex) {\n      symbolIndex.set(\n        name,\n        entries.map((s) => ({\n          ...s,\n          filePath: path.resolve(absoluteRoot, s.filePath),\n        })),\n      );\n    }\n\n    const importGraph = new Map<string, Set<string>>();\n    for (const [file, deps] of serialized.importGraph) {\n      const resolvedFile = path.resolve(absoluteRoot, file);\n      importGraph.set(\n        resolvedFile,\n        new Set(deps.map((d) => path.resolve(absoluteRoot, d))),\n      );\n    }\n\n    this.index = {\n      rootDir: absoluteRoot,\n      files,\n      symbolIndex,\n      importGraph,\n      indexedAt: serialized.indexedAt,\n      fileCount: serialized.fileCount,\n      totalSymbols: serialized.totalSymbols,\n    };\n\n    return this.index;\n  }\n\n  private collectFiles(rootDir: string): string[] {\n    const result: string[] = [];\n    try {\n      const entries = fs.readdirSync(rootDir, {\n        recursive: true,\n        withFileTypes: false,\n      }) as string[];\n\n      for (const entry of entries) {\n        const fullPath = path.join(rootDir, entry);\n        const relativeParts = entry.split(path.sep);\n        const shouldSkip = relativeParts.some((part) =>\n          SKIP_DIRS.has(part),\n        );\n        if (shouldSkip) continue;\n\n        try {\n          const stat = fs.statSync(fullPath);\n          if (stat.isFile()) {\n            result.push(fullPath);\n          }\n        } catch {\n          continue;\n        }\n      }\n    } catch {\n      return [];\n    }\n    return result;\n  }\n\n  private parseTsJs(\n    content: string,\n    filePath: string,\n    symbols: SymbolEntry[],\n    imports: ImportEntry[],\n  ): void {\n    const lines = content.split(\"\\n\");\n\n    const exportDeclRe =\n      /export\\s+(function|class|interface|type|const|let|var|enum)\\s+(\\w+)/g;\n    const defaultExportRe =\n      /export\\s+default\\s+(function|class)\\s+(\\w+)/g;\n    const namedExportRe = /export\\s*\\{\\s*([^}]+)\\s*\\}/g;\n    const importRe =\n      /import\\s+(?:type\\s+)?(?:\\{([^}]+)\\}|(\\w+))\\s+from\\s+['\"]([^'\"]+)['\"]/g;\n    const sideEffectImportRe = /import\\s+['\"]([^'\"]+)['\"]/g;\n    const methodRe = /(?:public|private|protected)?\\s*(?:async\\s+)?(\\w+)\\s*\\(/g;\n    const propertyRe =\n      /(?:public|private|protected)?\\s+(?:readonly\\s+)?(\\w+)\\s*[=:]|(?:public|private|protected)\\s+(?:readonly\\s+)?(\\w+)/g;\n\n    for (let i = 0; i < lines.length; i++) {\n      const line = lines[i];\n      const lineNum = i + 1;\n\n      let m: RegExpExecArray | null;\n      exportDeclRe.lastIndex = 0;\n      while ((m = exportDeclRe.exec(line)) !== null) {\n        const kind = m[1] as SymbolEntry[\"kind\"];\n        symbols.push({\n          name: m[2],\n          kind,\n          filePath,\n          line: lineNum,\n          exported: true,\n        });\n      }\n\n      defaultExportRe.lastIndex = 0;\n      while ((m = defaultExportRe.exec(line)) !== null) {\n        symbols.push({\n          name: m[2],\n          kind: m[1] as \"function\" | \"class\",\n          filePath,\n          line: lineNum,\n          exported: true,\n        });\n      }\n\n      namedExportRe.lastIndex = 0;\n      while ((m = namedExportRe.exec(line)) !== null) {\n        const names = m[1].split(\",\").map((s) => s.trim().split(/\\s+as\\s+/)[0]);\n        for (const name of names) {\n          if (name) {\n            symbols.push({\n              name,\n              kind: \"variable\",\n              filePath,\n              line: lineNum,\n              exported: true,\n            });\n          }\n        }\n      }\n\n      importRe.lastIndex = 0;\n      while ((m = importRe.exec(line)) !== null) {\n        const named = m[1]\n          ? m[1].split(\",\").map((s) => s.trim())\n          : [];\n        const default_ = m[2] ? [m[2]] : [];\n        imports.push({\n          source: m[3],\n          symbols: [...named, ...default_],\n          filePath,\n          line: lineNum,\n        });\n      }\n\n      sideEffectImportRe.lastIndex = 0;\n      while ((m = sideEffectImportRe.exec(line)) !== null) {\n        imports.push({\n          source: m[1],\n          symbols: [],\n          filePath,\n          line: lineNum,\n        });\n      }\n    }\n  }\n\n  private parsePython(\n    content: string,\n    filePath: string,\n    symbols: SymbolEntry[],\n    imports: ImportEntry[],\n  ): void {\n    const lines = content.split(\"\\n\");\n\n    const defRe = /^def\\s+(\\w+)/gm;\n    const classRe = /^class\\s+(\\w+)/gm;\n    const importRe = /^(?:from\\s+(\\S+)\\s+)?import\\s+(.+)/gm;\n\n    for (let i = 0; i < lines.length; i++) {\n      const line = lines[i];\n      const lineNum = i + 1;\n\n      defRe.lastIndex = 0;\n      const defMatch = defRe.exec(line);\n      if (defMatch) {\n        symbols.push({\n          name: defMatch[1],\n          kind: line.startsWith(\"    \") || line.startsWith(\"\\t\") ? \"method\" : \"function\",\n          filePath,\n          line: lineNum,\n          exported: !line.startsWith(\"    \") && !line.startsWith(\"\\t\") && line.startsWith(\"def \"),\n        });\n      }\n\n      classRe.lastIndex = 0;\n      const classMatch = classRe.exec(line);\n      if (classMatch) {\n        symbols.push({\n          name: classMatch[1].split(\"(\")[0],\n          kind: \"class\",\n          filePath,\n          line: lineNum,\n          exported: !line.startsWith(\"    \") && !line.startsWith(\"\\t\"),\n        });\n      }\n\n      importRe.lastIndex = 0;\n      const importMatch = importRe.exec(line);\n      if (importMatch) {\n        const fromModule = importMatch[1] ?? \"\";\n        const importedNames = importMatch[2]\n          .split(\",\")\n          .map((s) => s.trim().split(/\\s+as\\s+/)[0]);\n        imports.push({\n          source: fromModule,\n          symbols: importedNames,\n          filePath,\n          line: lineNum,\n        });\n      }\n    }\n  }\n\n  private resolveImport(\n    importSource: string,\n    fromFile: string,\n    rootDir: string,\n  ): string | null {\n    if (importSource.startsWith(\".\")) {\n      const dir = path.dirname(fromFile);\n      const extensions = [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\"];\n      for (const ext of extensions) {\n        const candidate = path.resolve(dir, importSource + ext);\n        try {\n          const stat = fs.statSync(candidate);\n          if (stat.isFile()) return candidate;\n        } catch {\n          continue;\n        }\n      }\n      const indexPath = path.resolve(dir, importSource, \"index.ts\");\n      try {\n        const stat = fs.statSync(indexPath);\n        if (stat.isFile()) return indexPath;\n      } catch {\n        const indexJs = path.resolve(dir, importSource, \"index.js\");\n        try {\n          const stat = fs.statSync(indexJs);\n          if (stat.isFile()) return indexJs;\n        } catch {\n          return null;\n        }\n      }\n    }\n    return null;\n  }\n}\n","import type { ModelResponse, ContentBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { APIToolDefinition } from '../tools/tool.js';\nimport type { StreamEvent } from '../stream.js';\n\nexport interface Provider {\n  readonly model: string;\n  chat(request: ChatRequest): Promise<ModelResponse>;\n  chatStream?(request: ChatRequest): AsyncGenerator<StreamEvent>;\n}\n\nexport interface ChatRequest {\n  messages: ChatMessage[];\n  tools?: APIToolDefinition[];\n  systemPrompt?: string;\n  maxOutputTokens?: number;\n  temperature?: number;\n  abortSignal?: AbortSignal;\n}\n\nexport interface ChatMessage {\n  role: \"user\" | \"assistant\" | \"tool\";\n  content: string | ContentBlock[];\n  tool_use_id?: string;\n  is_error?: boolean;\n}\n\nexport type { APIToolDefinition } from '../tools/tool.js';\n\nexport class RetryableError extends Error {\n  readonly cause?: Error;\n\n  constructor(message: string, cause?: Error) {\n    super(message);\n    this.name = 'RetryableError';\n    this.cause = cause;\n  }\n}\n\nexport abstract class BaseProvider implements Provider {\n  readonly model: string;\n  readonly maxOutputTokens?: number;\n  readonly temperature?: number;\n\n  constructor(config: ProviderConfig) {\n    this.model = config.model;\n    this.maxOutputTokens = config.maxOutputTokens;\n    this.temperature = config.temperature;\n  }\n\n  abstract chat(request: ChatRequest): Promise<ModelResponse>;\n\n  protected abstract mapMessages(messages: ChatMessage[]): unknown[];\n\n  protected abstract mapTools(tools?: APIToolDefinition[]): unknown[] | undefined;\n\n  protected abstract mapUsage(providerUsage: unknown): TokenUsage;\n\n  protected mapStopReason(reason: string): ModelResponse[\"stopReason\"] {\n    switch (reason) {\n      case 'end_turn':\n      case 'stop':\n        return 'end_turn';\n      case 'tool_use':\n      case 'tool_calls':\n        return 'tool_use';\n      case 'max_tokens':\n      case 'length':\n        return 'max_tokens';\n      case 'stop_sequence':\n        return 'stop_sequence';\n      default:\n        return 'end_turn';\n    }\n  }\n}\n","import type { ModelResponse, ContentBlock, TextBlock, ToolUseBlock, ThinkingBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { BaseProvider, RetryableError } from './provider.js';\nimport type { StreamEvent } from '../stream.js';\n\nexport interface AnthropicProviderConfig extends ProviderConfig {\n  apiKey: string;\n  baseURL?: string;\n  dangerouslySkipAuth?: boolean;\n  enableCaching?: boolean;\n}\n\ninterface AnthropicClient {\n  messages: {\n    create(body: unknown, options?: unknown): Promise<unknown>;\n    stream(body: unknown, options?: unknown): AsyncIterable<unknown>;\n  };\n}\n\ninterface AnthropicMessageResponse {\n  content: Array<{\n    type: string;\n    text?: string;\n    id?: string;\n    name?: string;\n    input?: Record<string, unknown>;\n    thinking?: string;\n  }>;\n  usage: {\n    input_tokens: number;\n    output_tokens: number;\n    cache_read_input_tokens?: number;\n    cache_creation_input_tokens?: number;\n  };\n  stop_reason: string;\n}\n\nexport class AnthropicProvider extends BaseProvider {\n  private readonly apiKey: string;\n  private readonly baseURL?: string;\n  private readonly dangerouslySkipAuth?: boolean;\n  private readonly enableCaching: boolean;\n  private client: AnthropicClient | null = null;\n\n  constructor(config: AnthropicProviderConfig) {\n    super(config);\n    this.apiKey = config.apiKey;\n    this.baseURL = config.baseURL;\n    this.dangerouslySkipAuth = config.dangerouslySkipAuth;\n    this.enableCaching = config.enableCaching ?? false;\n  }\n\n  async chat(request: ChatRequest): Promise<ModelResponse> {\n    const AnthropicSDK = (await import('@anthropic-ai/sdk')).default;\n\n    if (!this.client) {\n      const opts: Record<string, unknown> = { apiKey: this.apiKey };\n      if (this.baseURL) opts.baseURL = this.baseURL;\n      if (this.dangerouslySkipAuth) opts.dangerouslySkipAuth = true;\n      this.client = new AnthropicSDK(opts);\n    }\n\n    const messages = this.mapMessages(request.messages);\n    const tools = this.mapTools(request.tools);\n    const maxTokens = request.maxOutputTokens ?? this.maxOutputTokens ?? 4096;\n    const temperature = request.temperature ?? this.temperature;\n\n    const body: Record<string, unknown> = {\n      model: this.model,\n      max_tokens: maxTokens,\n      messages,\n    };\n\n    if (request.systemPrompt) {\n      if (this.enableCaching) {\n        body.system = [\n          { type: \"text\", text: request.systemPrompt, cache_control: { type: \"ephemeral\" } },\n        ];\n      } else {\n        body.system = request.systemPrompt;\n      }\n    }\n    if (tools) body.tools = tools;\n    if (temperature !== undefined) body.temperature = temperature;\n\n    const reqOptions: Record<string, unknown> = {};\n    if (request.abortSignal) reqOptions.signal = request.abortSignal;\n\n    let response: AnthropicMessageResponse;\n    try {\n      response = (await this.client.messages.create(body, reqOptions)) as AnthropicMessageResponse;\n    } catch (err: unknown) {\n      const status = (err as any)?.status;\n      const code = (err as any)?.code;\n      const isNetwork =\n        err instanceof TypeError ||\n        (typeof code === 'string' &&\n          ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ETIMEDOUT'].includes(code));\n\n      if (status === 429 || status === 529 || isNetwork) {\n        throw new RetryableError(\n          err instanceof Error ? err.message : String(err),\n          err instanceof Error ? err : undefined,\n        );\n      }\n      throw new Error(\n        `Anthropic API error: ${err instanceof Error ? err.message : String(err)}`,\n        err instanceof Error ? { cause: err } : undefined,\n      );\n    }\n\n    const content: ContentBlock[] = [];\n    for (const block of response.content) {\n      if (block.type === 'text') {\n        content.push({ type: 'text', text: block.text } as TextBlock);\n      } else if (block.type === 'tool_use') {\n        content.push({ type: 'tool_use', id: block.id, name: block.name, input: block.input } as ToolUseBlock);\n      } else if (block.type === 'thinking') {\n        content.push({ type: 'thinking', thinking: block.thinking } as ThinkingBlock);\n      }\n    }\n\n    return {\n      content,\n      usage: this.mapUsage(response.usage),\n      stopReason: this.mapStopReason(response.stop_reason),\n    };\n  }\n\n  async *chatStream(request: ChatRequest): AsyncGenerator<StreamEvent> {\n    const AnthropicSDK = (await import('@anthropic-ai/sdk')).default;\n\n    if (!this.client) {\n      const opts: Record<string, unknown> = { apiKey: this.apiKey };\n      if (this.baseURL) opts.baseURL = this.baseURL;\n      if (this.dangerouslySkipAuth) opts.dangerouslySkipAuth = true;\n      this.client = new AnthropicSDK(opts);\n    }\n\n    const messages = this.mapMessages(request.messages);\n    const tools = this.mapTools(request.tools);\n    const maxTokens = request.maxOutputTokens ?? this.maxOutputTokens ?? 4096;\n    const temperature = request.temperature ?? this.temperature;\n\n    const body: Record<string, unknown> = {\n      model: this.model,\n      max_tokens: maxTokens,\n      messages,\n    };\n\n    if (request.systemPrompt) {\n      if (this.enableCaching) {\n        body.system = [\n          { type: \"text\", text: request.systemPrompt, cache_control: { type: \"ephemeral\" } },\n        ];\n      } else {\n        body.system = request.systemPrompt;\n      }\n    }\n    if (tools) body.tools = tools;\n    if (temperature !== undefined) body.temperature = temperature;\n\n    const reqOptions: Record<string, unknown> = {};\n    if (request.abortSignal) reqOptions.signal = request.abortSignal;\n\n    const toolAccumulators: Map<number, { id: string; name: string; input: string }> = new Map();\n    let usage: TokenUsage | undefined;\n\n    try {\n      const stream = this.client.messages.stream(body, reqOptions) as AsyncIterable<any>;\n\n      for await (const event of stream) {\n        switch (event.type) {\n          case \"message_start\": {\n            const msg = event.message;\n            if (msg?.usage) {\n              usage = {\n                inputTokens: msg.usage.input_tokens ?? 0,\n                outputTokens: 0,\n                cacheReadTokens: msg.usage.cache_read_input_tokens,\n                cacheWriteTokens: msg.usage.cache_creation_input_tokens,\n              };\n            }\n            break;\n          }\n          case \"content_block_start\": {\n            const block = event.content_block;\n            if (block?.type === \"tool_use\") {\n              toolAccumulators.set(event.index, { id: block.id, name: block.name, input: \"\" });\n              yield { type: \"tool_use_start\", id: block.id, name: block.name };\n            }\n            break;\n          }\n          case \"content_block_delta\": {\n            const delta = event.delta;\n            if (delta?.type === \"text_delta\" && delta.text) {\n              yield { type: \"text_delta\", text: delta.text };\n            } else if (delta?.type === \"input_json_delta\" && delta.partial_json != null) {\n              const toolBlock = toolAccumulators.get(event.index);\n              if (toolBlock) {\n                toolBlock.input += delta.partial_json;\n                yield { type: \"tool_use_delta\", id: toolBlock.id, input: delta.partial_json };\n              }\n            }\n            break;\n          }\n          case \"message_delta\": {\n            const eventUsage = event.usage;\n            if (usage && eventUsage) {\n              usage = {\n                ...usage,\n                outputTokens: eventUsage.output_tokens ?? 0,\n              };\n            } else if (eventUsage) {\n              usage = {\n                inputTokens: 0,\n                outputTokens: eventUsage.output_tokens ?? 0,\n              };\n            }\n            yield { type: \"done\", usage };\n            break;\n          }\n        }\n      }\n    } catch (err: unknown) {\n      const status = (err as { status?: number })?.status;\n      const code = (err as { code?: string })?.code;\n      const isNetwork =\n        err instanceof TypeError ||\n        (typeof code === 'string' &&\n          ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ETIMEDOUT'].includes(code));\n\n      if (status === 429 || status === 529 || isNetwork) {\n        throw new RetryableError(\n          err instanceof Error ? err.message : String(err),\n          err instanceof Error ? err : undefined,\n        );\n      }\n      throw new Error(\n        `Anthropic API error: ${err instanceof Error ? err.message : String(err)}`,\n        err instanceof Error ? { cause: err } : undefined,\n      );\n    }\n  }\n\n  protected mapMessages(messages: ChatMessage[]): unknown[] {\n    return messages.map((msg) => {\n      if (msg.role === 'tool') {\n        const textContent =\n          typeof msg.content === 'string'\n            ? msg.content\n            : msg.content\n                .filter((b): b is TextBlock => b.type === 'text')\n                .map((b) => b.text)\n                .join('\\n');\n\n        return {\n          role: 'user',\n          content: [\n            {\n              type: 'tool_result',\n              tool_use_id: msg.tool_use_id ?? '',\n              content: textContent,\n              ...(msg.is_error ? { is_error: true } : {}),\n            },\n          ],\n        };\n      }\n\n      if (msg.role === 'assistant') {\n        const content =\n          typeof msg.content === 'string'\n            ? [{ type: 'text', text: msg.content }]\n            : msg.content.map((block) => this.mapOutgoingBlock(block));\n        return { role: 'assistant', content };\n      }\n\n      if (typeof msg.content === 'string') {\n        return { role: 'user', content: msg.content };\n      }\n\n      return {\n        role: 'user',\n        content: msg.content.map((block) => this.mapOutgoingBlock(block)),\n      };\n    });\n  }\n\n  protected mapTools(tools?: APIToolDefinition[]): unknown[] | undefined {\n    if (!tools || tools.length === 0) return undefined;\n    return tools.map((tool) => ({\n      name: tool.name,\n      description: tool.description,\n      input_schema: tool.input_schema,\n      type: 'tool',\n    }));\n  }\n\n  protected mapUsage(providerUsage: unknown): TokenUsage {\n    const u = providerUsage as {\n      input_tokens: number;\n      output_tokens: number;\n      cache_read_input_tokens?: number;\n      cache_creation_input_tokens?: number;\n    };\n    return {\n      inputTokens: u.input_tokens,\n      outputTokens: u.output_tokens,\n      cacheReadTokens: u.cache_read_input_tokens,\n      cacheWriteTokens: u.cache_creation_input_tokens,\n    };\n  }\n\n  private mapOutgoingBlock(block: ContentBlock): Record<string, unknown> {\n    switch (block.type) {\n      case 'text':\n        return { type: 'text', text: block.text };\n      case 'tool_use':\n        return { type: 'tool_use', id: block.id, name: block.name, input: block.input };\n      case 'thinking':\n        return { type: 'thinking', thinking: block.thinking };\n      default:\n        return { type: 'text', text: '' };\n    }\n  }\n}\n","import type { ModelResponse, ContentBlock, TextBlock, ToolUseBlock, TokenUsage, ProviderConfig } from '../types.js';\nimport type { ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { BaseProvider, RetryableError } from './provider.js';\nimport type { StreamEvent } from '../stream.js';\n\nexport interface OpenAIProviderConfig extends ProviderConfig {\n  apiKey: string;\n  baseURL?: string;\n  organization?: string;\n}\n\ninterface OpenAIChatResponse {\n  choices: Array<{\n    message: {\n      content?: string;\n      tool_calls?: Array<{\n        id: string;\n        function: { name: string; arguments: string };\n      }>;\n    };\n    finish_reason: string;\n  }>;\n  usage: {\n    prompt_tokens: number;\n    completion_tokens: number;\n    prompt_tokens_details?: { cached_tokens?: number };\n  };\n}\n\ninterface OpenAIClient {\n  chat: {\n    completions: {\n      create(body: unknown, options?: unknown): Promise<unknown>;\n    };\n  };\n}\n\nexport class OpenAIProvider extends BaseProvider {\n  private readonly apiKey: string;\n  private readonly baseURL?: string;\n  private readonly organization?: string;\n  private client: OpenAIClient | null = null;\n\n  constructor(config: OpenAIProviderConfig) {\n    super(config);\n    this.apiKey = config.apiKey;\n    this.baseURL = config.baseURL;\n    this.organization = config.organization;\n  }\n\n  async chat(request: ChatRequest): Promise<ModelResponse> {\n    const OpenAI = (await import('openai')).default;\n\n    if (!this.client) {\n      const opts: Record<string, unknown> = { apiKey: this.apiKey };\n      if (this.baseURL) opts.baseURL = this.baseURL;\n      if (this.organization) opts.organization = this.organization;\n      this.client = new OpenAI(opts);\n    }\n\n    const mappedMessages = this.mapMessages(request.messages);\n    const messages: unknown[] = [];\n    if (request.systemPrompt) {\n      messages.push({ role: 'system', content: request.systemPrompt });\n    }\n    messages.push(...mappedMessages);\n\n    const tools = this.mapTools(request.tools);\n    const maxTokens = request.maxOutputTokens ?? this.maxOutputTokens;\n    const temperature = request.temperature ?? this.temperature;\n\n    const body: Record<string, unknown> = {\n      model: this.model,\n      messages,\n      stream: false,\n    };\n\n    if (tools) body.tools = tools;\n    if (maxTokens !== undefined) body.max_tokens = maxTokens;\n    if (temperature !== undefined) body.temperature = temperature;\n\n    const reqOptions: Record<string, unknown> = {};\n    if (request.abortSignal) reqOptions.signal = request.abortSignal;\n\n    try {\n      const response = (await this.client.chat.completions.create(body, reqOptions)) as OpenAIChatResponse;\n\n    const choice = response.choices[0];\n    const content: ContentBlock[] = [];\n\n    if (choice.message.content) {\n      content.push({ type: 'text', text: choice.message.content } as TextBlock);\n    }\n\n    if (choice.message.tool_calls) {\n      for (const tc of choice.message.tool_calls) {\n        let input: Record<string, unknown> = {};\n        try {\n          input = JSON.parse(tc.function.arguments);\n        } catch {\n          console.warn(`Failed to parse tool call arguments for ${tc.function.name}: ${tc.function.arguments?.slice(0, 100)}`);\n        }\n        content.push({\n          type: 'tool_use',\n          id: tc.id,\n          name: tc.function.name,\n          input,\n        } as ToolUseBlock);\n      }\n    }\n\n    return {\n      content,\n      usage: this.mapUsage(response.usage),\n      stopReason: this.mapStopReason(choice.finish_reason),\n    };\n    } catch (err: unknown) {\n      const status = (err as { status?: number })?.status;\n      const code = (err as { code?: string })?.code;\n      const isNetwork =\n        err instanceof TypeError ||\n        (typeof code === 'string' &&\n          ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ETIMEDOUT'].includes(code));\n\n      if (status === 429 || isNetwork) {\n        throw new RetryableError(\n          err instanceof Error ? err.message : String(err),\n          err instanceof Error ? err : undefined,\n        );\n      }\n      throw new Error(\n        `OpenAI API error: ${err instanceof Error ? err.message : String(err)}`,\n        err instanceof Error ? { cause: err } : undefined,\n      );\n    }\n  }\n\n  async *chatStream(request: ChatRequest): AsyncGenerator<StreamEvent> {\n    const OpenAI = (await import('openai')).default;\n\n    if (!this.client) {\n      const opts: Record<string, unknown> = { apiKey: this.apiKey };\n      if (this.baseURL) opts.baseURL = this.baseURL;\n      if (this.organization) opts.organization = this.organization;\n      this.client = new OpenAI(opts);\n    }\n\n    const mappedMessages = this.mapMessages(request.messages);\n    const messages: unknown[] = [];\n    if (request.systemPrompt) {\n      messages.push({ role: 'system', content: request.systemPrompt });\n    }\n    messages.push(...mappedMessages);\n\n    const tools = this.mapTools(request.tools);\n    const maxTokens = request.maxOutputTokens ?? this.maxOutputTokens;\n    const temperature = request.temperature ?? this.temperature;\n\n    const body: Record<string, unknown> = {\n      model: this.model,\n      messages,\n      stream: true,\n    };\n    if (tools) body.tools = tools;\n    if (maxTokens !== undefined) body.max_tokens = maxTokens;\n    if (temperature !== undefined) body.temperature = temperature;\n\n    const reqOptions: Record<string, unknown> = {};\n    if (request.abortSignal) reqOptions.signal = request.abortSignal;\n\n    const toolCallAccumulators: Map<number, { id: string; name: string; arguments: string }> = new Map();\n    let usage: TokenUsage | undefined;\n\n    try {\n      const stream = (this.client as any).chat.completions.create(body, reqOptions) as AsyncIterable<any>;\n\n      for await (const chunk of stream) {\n        const choice = chunk.choices?.[0];\n        if (!choice) continue;\n\n        const delta = choice.delta;\n        if (delta?.content) {\n          yield { type: \"text_delta\", text: delta.content };\n        }\n\n        if (delta?.tool_calls) {\n          for (const tc of delta.tool_calls) {\n            const idx = tc.index as number;\n            if (!toolCallAccumulators.has(idx)) {\n              toolCallAccumulators.set(idx, {\n                id: tc.id ?? \"\",\n                name: tc.function?.name ?? \"\",\n                arguments: \"\",\n              });\n              if (tc.id) {\n                yield { type: \"tool_use_start\", id: tc.id, name: tc.function?.name ?? \"\" };\n              }\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) {\n              acc.arguments += tc.function.arguments;\n              yield { type: \"tool_use_delta\", id: acc.id, input: tc.function.arguments };\n            }\n          }\n        }\n\n        if (choice.finish_reason) {\n          if (chunk.usage) {\n            usage = this.mapUsage(chunk.usage);\n          }\n          yield { type: \"done\", usage };\n        }\n      }\n    } catch (err: unknown) {\n      const status = (err as { status?: number })?.status;\n      const code = (err as { code?: string })?.code;\n      const isNetwork =\n        err instanceof TypeError ||\n        (typeof code === 'string' &&\n          ['ECONNRESET', 'ECONNREFUSED', 'ENOTFOUND', 'ETIMEDOUT'].includes(code));\n\n      if (status === 429 || isNetwork) {\n        throw new RetryableError(\n          err instanceof Error ? err.message : String(err),\n          err instanceof Error ? err : undefined,\n        );\n      }\n      throw new Error(\n        `OpenAI API error: ${err instanceof Error ? err.message : String(err)}`,\n        err instanceof Error ? { cause: err } : undefined,\n      );\n    }\n  }\n\n  protected mapMessages(messages: ChatMessage[]): unknown[] {\n    return messages.map((msg) => {\n      if (msg.role === 'tool') {\n        return {\n          role: 'tool',\n          tool_call_id: msg.tool_use_id ?? '',\n          content:\n            typeof msg.content === 'string'\n              ? msg.content\n              : msg.content\n                  .filter((b): b is TextBlock => b.type === 'text')\n                  .map((b) => b.text)\n                  .join('\\n'),\n        };\n      }\n\n      if (msg.role === 'assistant') {\n        if (typeof msg.content === 'string') {\n          return { role: 'assistant', content: msg.content };\n        }\n\n        const textParts = msg.content\n          .filter((b): b is TextBlock => b.type === 'text')\n          .map((b) => b.text)\n          .join('');\n        const toolCalls = msg.content\n          .filter((b): b is ToolUseBlock => b.type === 'tool_use')\n          .map((b) => ({\n            id: b.id,\n            type: 'function' as const,\n            function: { name: b.name, arguments: JSON.stringify(b.input) },\n          }));\n\n        return {\n          role: 'assistant',\n          content: textParts || null,\n          ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}),\n        };\n      }\n\n      return {\n        role: 'user',\n        content:\n          typeof msg.content === 'string'\n            ? msg.content\n            : msg.content\n                .filter((b): b is TextBlock => b.type === 'text')\n                .map((b) => b.text)\n                .join('\\n'),\n      };\n    });\n  }\n\n  protected mapTools(tools?: APIToolDefinition[]): unknown[] | undefined {\n    if (!tools || tools.length === 0) return undefined;\n    return tools.map((tool) => ({\n      type: 'function',\n      function: {\n        name: tool.name,\n        description: tool.description,\n        parameters: tool.input_schema,\n      },\n    }));\n  }\n\n  protected mapUsage(providerUsage: unknown): TokenUsage {\n    const u = providerUsage as {\n      prompt_tokens: number;\n      completion_tokens: number;\n      prompt_tokens_details?: { cached_tokens?: number };\n    };\n    return {\n      inputTokens: u.prompt_tokens,\n      outputTokens: u.completion_tokens,\n      cacheReadTokens: u.prompt_tokens_details?.cached_tokens,\n    };\n  }\n}\n","import type { Provider, ChatRequest } from \"./provider.js\";\nimport { RetryableError } from \"./provider.js\";\nimport type { ModelResponse, ContentBlock } from \"../types.js\";\nimport type { APIToolDefinition } from \"../tools/tool.js\";\nimport type { StreamEvent } from \"../stream.js\";\n\nexport interface OllamaProviderConfig {\n  model: string;\n  baseURL?: string;\n}\n\nexport class OllamaProvider implements Provider {\n  readonly model: string;\n  private readonly baseURL: string;\n\n  constructor(config: OllamaProviderConfig) {\n    this.model = config.model;\n    this.baseURL = config.baseURL ?? \"http://localhost:11434/v1\";\n  }\n\n  async chat(request: ChatRequest): Promise<ModelResponse> {\n    const messages: Array<Record<string, unknown>> = [];\n\n    if (request.systemPrompt) {\n      messages.push({ role: \"system\", content: request.systemPrompt });\n    }\n\n    for (const m of request.messages) {\n      if (m.role === \"tool\") {\n        messages.push({\n          role: \"tool\" as const,\n          tool_call_id: m.tool_use_id,\n          content: m.content,\n        });\n        continue;\n      }\n      if (m.role === \"assistant\" && Array.isArray(m.content)) {\n        const textParts = (m.content as ContentBlock[]).filter(b => b.type === \"text\");\n        const toolParts = (m.content as ContentBlock[]).filter(b => b.type === \"tool_use\");\n\n        const msg: Record<string, unknown> = {};\n        if (textParts.length > 0) {\n          msg.content = textParts.map(p => (p as { text: string }).text).join(\"\");\n        }\n        if (toolParts.length > 0) {\n          msg.tool_calls = toolParts.map(b => {\n            const tb = b as { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> };\n            return {\n              id: tb.id,\n              type: \"function\",\n              function: { name: tb.name, arguments: JSON.stringify(tb.input) },\n            };\n          });\n        }\n        msg.role = \"assistant\";\n        messages.push(msg);\n        continue;\n      }\n      messages.push({ role: m.role, content: m.content });\n    }\n\n    const body: Record<string, unknown> = {\n      model: this.model,\n      messages,\n      stream: false,\n    };\n\n    if (request.maxOutputTokens) {\n      body.max_tokens = request.maxOutputTokens;\n    }\n\n    if (request.tools?.length) {\n      body.tools = request.tools.map(t => ({\n        type: \"function\",\n        function: {\n          name: t.name,\n          description: t.description,\n          parameters: t.input_schema,\n        },\n      }));\n    }\n\n    let response;\n    try {\n      response = await fetch(`${this.baseURL}/chat/completions`, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify(body),\n        signal: request.abortSignal,\n      });\n    } catch (err) {\n      if (err instanceof RetryableError) throw err;\n      throw new RetryableError(\n        `Ollama connection failed: ${err instanceof Error ? err.message : String(err)}`,\n      );\n    }\n\n    if (!response.ok) {\n      const text = await response.text();\n      if (response.status === 429 || response.status === 503 || response.status === 529) {\n        throw new RetryableError(`Ollama API error ${response.status}: ${text.slice(0, 200)}`);\n      }\n      throw new Error(`Ollama API error ${response.status}: ${text.slice(0, 200)}`);\n    }\n\n    const data = await response.json();\n    const choice = data.choices?.[0];\n    if (!choice) {\n      throw new Error(\"Ollama returned no choices\");\n    }\n\n    const content: ContentBlock[] = [];\n    let stopReason: ModelResponse[\"stopReason\"] = \"end_turn\";\n\n    if (choice.message?.content) {\n      let text = choice.message.content;\n      text = text.replace(/<think[^>]*>[\\s\\S]*?<\\/think>/gi, \"\").trim();\n      text = text.replace(/<thinking>[\\s\\S]*?<\\/thinking>/gi, \"\").trim();\n      text = text.replace(/\\[Thinking[^\\]]*\\]/gi, \"\").trim();\n      if (text.length > 0) {\n        content.push({ type: \"text\" as const, text });\n      }\n    }\n\n    if (choice.message?.tool_calls?.length) {\n      stopReason = \"tool_use\";\n      for (const tc of choice.message.tool_calls) {\n        let input: Record<string, unknown>;\n        try {\n          input = JSON.parse(tc.function.arguments);\n        } catch {\n          console.warn(`Failed to parse tool call arguments for ${tc.function.name}: ${tc.function.arguments?.slice(0, 100)}`);\n          input = {};\n        }\n        content.push({\n          type: \"tool_use\" as const,\n          id: tc.id,\n          name: tc.function.name,\n          input,\n        });\n      }\n    }\n\n    return {\n      content,\n      stopReason,\n      usage: {\n        inputTokens: data.usage?.prompt_tokens ?? 0,\n        outputTokens: data.usage?.completion_tokens ?? 0,\n        cacheReadTokens: 0,\n        cacheWriteTokens: 0,\n      },\n    };\n  }\n\n  async *chatStream(request: ChatRequest): AsyncGenerator<StreamEvent> {\n    const messages: Array<Record<string, unknown>> = [];\n\n    if (request.systemPrompt) {\n      messages.push({ role: \"system\", content: request.systemPrompt });\n    }\n\n    for (const m of request.messages) {\n      if (m.role === \"tool\") {\n        messages.push({\n          role: \"tool\" as const,\n          tool_call_id: m.tool_use_id,\n          content: m.content,\n        });\n        continue;\n      }\n      if (m.role === \"assistant\" && Array.isArray(m.content)) {\n        const textParts = (m.content as ContentBlock[]).filter(b => b.type === \"text\");\n        const toolParts = (m.content as ContentBlock[]).filter(b => b.type === \"tool_use\");\n\n        const msg: Record<string, unknown> = {};\n        if (textParts.length > 0) {\n          msg.content = textParts.map(p => (p as { text: string }).text).join(\"\");\n        }\n        if (toolParts.length > 0) {\n          msg.tool_calls = toolParts.map(b => {\n            const tb = b as { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> };\n            return {\n              id: tb.id,\n              type: \"function\",\n              function: { name: tb.name, arguments: JSON.stringify(tb.input) },\n            };\n          });\n        }\n        msg.role = \"assistant\";\n        messages.push(msg);\n        continue;\n      }\n      messages.push({ role: m.role, content: m.content });\n    }\n\n    const body: Record<string, unknown> = {\n      model: this.model,\n      messages,\n      stream: true,\n    };\n\n    if (request.maxOutputTokens) {\n      body.max_tokens = request.maxOutputTokens;\n    }\n\n    if (request.tools?.length) {\n      body.tools = request.tools.map(t => ({\n        type: \"function\",\n        function: {\n          name: t.name,\n          description: t.description,\n          parameters: t.input_schema,\n        },\n      }));\n    }\n\n    let response: Response;\n    try {\n      response = await fetch(`${this.baseURL}/chat/completions`, {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify(body),\n        signal: request.abortSignal,\n      });\n    } catch (err) {\n      if (err instanceof RetryableError) throw err;\n      throw new RetryableError(\n        `Ollama connection failed: ${err instanceof Error ? err.message : String(err)}`,\n      );\n    }\n\n    if (!response.ok) {\n      const text = await response.text();\n      if (response.status === 429 || response.status === 503 || response.status === 529) {\n        throw new RetryableError(`Ollama API error ${response.status}: ${text.slice(0, 200)}`);\n      }\n      throw new Error(`Ollama API error ${response.status}: ${text.slice(0, 200)}`);\n    }\n\n    const reader = response.body?.getReader();\n    if (!reader) {\n      throw new Error(\"Ollama returned no response body\");\n    }\n\n    const decoder = new TextDecoder();\n    let buffer = \"\";\n    const toolCallAccumulators: Map<number, { id: string; name: string; arguments: string }> = new Map();\n\n    while (true) {\n      const { done, value } = await reader.read();\n      if (done) break;\n      buffer += decoder.decode(value, { stream: true });\n\n      const lines = buffer.split(\"\\n\");\n      buffer = lines.pop()!;\n\n      for (const line of lines) {\n        const trimmed = line.trim();\n        if (!trimmed || !trimmed.startsWith(\"data: \")) continue;\n        const payload = trimmed.slice(6);\n        if (payload === \"[DONE]\") {\n          yield { type: \"done\" };\n          continue;\n        }\n        try {\n          const chunk = JSON.parse(payload);\n          const choice = chunk.choices?.[0];\n          if (!choice) continue;\n\n          if (choice.delta?.content) {\n            yield { type: \"text_delta\", text: choice.delta.content };\n          }\n\n          if (choice.delta?.tool_calls) {\n            for (const tc of choice.delta.tool_calls) {\n              const idx = tc.index as number;\n              if (!toolCallAccumulators.has(idx)) {\n                toolCallAccumulators.set(idx, {\n                  id: tc.id ?? \"\",\n                  name: tc.function?.name ?? \"\",\n                  arguments: \"\",\n                });\n                if (tc.id) {\n                  yield { type: \"tool_use_start\", id: tc.id, name: tc.function?.name ?? \"\" };\n                }\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) {\n                acc.arguments += tc.function.arguments;\n                yield { type: \"tool_use_delta\", id: acc.id, input: tc.function.arguments };\n              }\n            }\n          }\n\n          if (choice.finish_reason) {\n            yield {\n              type: \"done\",\n              usage: {\n                inputTokens: chunk.usage?.prompt_tokens ?? 0,\n                outputTokens: chunk.usage?.completion_tokens ?? 0,\n              },\n            };\n          }\n        } catch {\n          continue;\n        }\n      }\n    }\n  }\n}\n","import type { Provider, ChatRequest, ChatMessage } from \"./provider.js\";\nimport { RetryableError } from \"./provider.js\";\nimport type { ModelResponse, ContentBlock, TokenUsage } from \"../types.js\";\n\nexport interface ClusterSlot {\n  model: string;\n  role: \"planner\" | \"worker\" | \"reviewer\" | \"drafter\";\n  baseURL?: string;\n  maxTokens?: number;\n  temperature?: number;\n}\n\nexport interface ClusterConfig {\n  slots: ClusterSlot[];\n  baseURL?: string;\n  timeoutMs?: number;\n  strategy?: \"auto\" | \"draft-verify\" | \"debate\" | \"majority\" | \"single\";\n  draftCount?: number;\n  debateRounds?: number;\n}\n\ninterface CallResult {\n  content: string;\n  usage: TokenUsage;\n  stopReason: ModelResponse[\"stopReason\"];\n  model: string;\n  durationMs: number;\n}\n\ntype Complexity = \"simple\" | \"medium\" | \"complex\";\n\nconst DEFAULT_BASE = \"http://localhost:11434/v1\";\n\nfunction defaultCluster(baseURL?: string): ClusterSlot[] {\n  const url = baseURL || DEFAULT_BASE;\n  return [\n    { model: \"gemma4:31b\", role: \"planner\", baseURL: url, temperature: 0.3 },\n    { model: \"gemma4:26b\", role: \"worker\", baseURL: url, temperature: 0.3 },\n    { model: \"gemma4:26b\", role: \"worker\", baseURL: url, temperature: 0.35 },\n    { model: \"gemma4:26b\", role: \"reviewer\", baseURL: url, temperature: 0.3 },\n    { model: \"gemma4:e4b\", role: \"drafter\", baseURL: url, temperature: 0.3 },\n  ];\n}\n\nfunction classifyComplexity(messages: ChatMessage[], hasTools: boolean): Complexity {\n  let totalTokens = 0;\n  let turns = messages.length;\n  let hasToolResults = false;\n  let hasCode = false;\n  let hasErrors = false;\n\n  for (const m of messages) {\n    const text = typeof m.content === \"string\" ? m.content : JSON.stringify(m.content);\n    totalTokens += text.length / 4;\n    if (m.role === \"tool\") hasToolResults = true;\n    if (text.includes(\"```\") || text.includes(\"function \") || text.includes(\"class \")) hasCode = true;\n    if (text.includes(\"error\") || text.includes(\"Error\") || text.includes(\"FAIL\")) hasErrors = true;\n  }\n\n  if (totalTokens > 10000 || (hasToolResults && hasErrors)) return \"complex\";\n  if (totalTokens > 2000 || hasTools || hasCode || hasErrors || turns > 4) return \"medium\";\n  return \"simple\";\n}\n\nfunction selectSlots(config: ClusterConfig, complexity: Complexity): { planner?: ClusterSlot; workers: ClusterSlot[]; reviewers: ClusterSlot[]; drafters?: ClusterSlot } {\n  const planners = config.slots.filter(s => s.role === \"planner\");\n  const workers = config.slots.filter(s => s.role === \"worker\");\n  const reviewers = config.slots.filter(s => s.role === \"reviewer\");\n  const drafters = config.slots.filter(s => s.role === \"drafter\");\n\n  switch (complexity) {\n    case \"complex\":\n      return { planner: planners[0], workers, reviewers, drafters: drafters[0] };\n    case \"medium\":\n      return { planner: planners[0], workers: workers.slice(0, 1), reviewers: reviewers.slice(0, 1), drafters: drafters[0] };\n    case \"simple\":\n    default:\n      return { planner: planners[0], workers: workers.slice(0, 1), reviewers: reviewers.slice(0, 1), drafters: drafters[0] };\n  }\n}\n\nasync function callModel(slot: ClusterSlot, request: ChatRequest, baseURL: string, timeoutMs: number, extraOpts?: Record<string, unknown>): Promise<CallResult> {\n  const url = (slot.baseURL || baseURL) + \"/chat/completions\";\n  const messages: Array<Record<string, unknown>> = [];\n\n  if (request.systemPrompt) {\n    messages.push({ role: \"system\", content: request.systemPrompt });\n  }\n\n  for (const m of request.messages) {\n    if (m.role === \"tool\") {\n      messages.push({ role: \"tool\", tool_call_id: m.tool_use_id, content: m.content });\n      continue;\n    }\n    if (m.role === \"assistant\" && Array.isArray(m.content)) {\n      const textParts = (m.content as ContentBlock[]).filter(b => b.type === \"text\");\n      const toolParts = (m.content as ContentBlock[]).filter(b => b.type === \"tool_use\");\n      const msg: Record<string, unknown> = {};\n      if (textParts.length) msg.content = textParts.map(p => (p as { text: string }).text).join(\"\");\n      if (toolParts.length) {\n        msg.tool_calls = toolParts.map(b => {\n          const tb = b as { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> };\n          return { id: tb.id, type: \"function\", function: { name: tb.name, arguments: JSON.stringify(tb.input) } };\n        });\n      }\n      msg.role = \"assistant\";\n      messages.push(msg);\n      continue;\n    }\n    messages.push({ role: m.role, content: m.content });\n  }\n\n  const body: Record<string, unknown> = {\n    model: slot.model,\n    messages,\n    stream: false,\n    options: {\n      num_predict: request.maxOutputTokens || slot.maxTokens || 4096,\n      temperature: request.temperature ?? slot.temperature ?? 0.3,\n      top_p: 0.95,\n      top_k: 64,\n    },\n    ...extraOpts,\n  };\n\n  if (request.tools?.length) {\n    body.tools = request.tools.map(t => ({\n      type: \"function\",\n      function: { name: t.name, description: t.description, parameters: t.input_schema },\n    }));\n  }\n\n  const start = Date.now();\n  let response;\n  try {\n    response = await fetch(url, {\n      method: \"POST\",\n      headers: { \"Content-Type\": \"application/json\" },\n      body: JSON.stringify(body),\n      signal: AbortSignal.timeout(timeoutMs),\n    });\n  } catch (err) {\n    if (err instanceof RetryableError) throw err;\n    throw new RetryableError(`Cluster slot ${slot.model} connection failed: ${err instanceof Error ? err.message : String(err)}`);\n  }\n\n  if (!response.ok) {\n    const text = await response.text();\n    if (response.status === 429 || response.status === 503 || response.status === 529) {\n      throw new RetryableError(`Cluster slot ${slot.model} rate limited: ${response.status}`);\n    }\n    throw new Error(`Cluster slot ${slot.model} error ${response.status}: ${text.slice(0, 200)}`);\n  }\n\n  const data = await response.json();\n  const choice = data.choices?.[0];\n  if (!choice) throw new Error(`Cluster slot ${slot.model} returned no choices`);\n\n  let text = choice.message?.content || \"\";\n  text = text.replace(/<think[^>]*>[\\s\\S]*?<\\/think>/gi, \"\").trim();\n  text = text.replace(/<thinking>[\\s\\S]*?<\\/thinking>/gi, \"\").trim();\n  text = text.replace(/<channel>thought[\\s\\S]*?<channel|>/gi, \"\").trim();\n  text = text.replace(/\\[Thinking[^\\]]*\\]/gi, \"\").trim();\n\n  return {\n    content: text,\n    usage: {\n      inputTokens: data.usage?.prompt_tokens ?? 0,\n      outputTokens: data.usage?.completion_tokens ?? 0,\n      cacheReadTokens: 0,\n      cacheWriteTokens: 0,\n    },\n    stopReason: choice.finish_reason === \"tool_calls\" ? \"tool_use\" : \"end_turn\",\n    model: slot.model,\n    durationMs: Date.now() - start,\n  };\n}\n\nfunction mergeUsage(...usages: TokenUsage[]): TokenUsage {\n  return {\n    inputTokens: usages.reduce((s, u) => s + u.inputTokens, 0),\n    outputTokens: usages.reduce((s, u) => s + u.outputTokens, 0),\n    cacheReadTokens: usages.reduce((s, u) => s + (u.cacheReadTokens || 0), 0),\n    cacheWriteTokens: usages.reduce((s, u) => s + (u.cacheWriteTokens || 0), 0),\n  };\n}\n\nexport class ClusterProvider implements Provider {\n  readonly model: string;\n  private config: ClusterConfig;\n  private stats: { calls: number; tokensIn: number; tokensOut: number; byModel: Record<string, number> };\n\n  constructor(config?: Partial<ClusterConfig>) {\n    this.config = {\n      baseURL: DEFAULT_BASE,\n      timeoutMs: 180_000,\n      strategy: \"auto\",\n      draftCount: 1,\n      debateRounds: 1,\n      slots: defaultCluster(config?.baseURL),\n      ...config,\n    };\n    const models = [...new Set(this.config.slots.map(s => s.model))];\n    this.model = `cluster[${models.join(\",\")}]`;\n    this.stats = { calls: 0, tokensIn: 0, tokensOut: 0, byModel: {} };\n    for (const m of models) this.stats.byModel[m] = 0;\n  }\n\n  getStats() { return { ...this.stats }; }\n\n  async chat(request: ChatRequest): Promise<ModelResponse> {\n    const strategy = this.config.strategy || \"auto\";\n    const complexity = strategy === \"auto\" ? classifyComplexity(request.messages, !!request.tools?.length) : \"medium\";\n\n    let result: CallResult;\n    switch (strategy === \"auto\" ? complexity : \"simple\") {\n      case \"simple\":\n        result = await this.speculative(request);\n        break;\n      case \"complex\":\n        result = await this.debate(request);\n        break;\n      default:\n        result = await this.draftVerify(request);\n        break;\n    }\n\n    const content: ContentBlock[] = [];\n    if (result.content) {\n      content.push({ type: \"text\", text: result.content });\n    }\n\n    return {\n      content,\n      stopReason: result.stopReason,\n      usage: result.usage,\n    };\n  }\n\n  private async speculative(request: ChatRequest): Promise<CallResult> {\n    const slots = selectSlots(this.config, \"simple\");\n    const drafter = slots.drafters;\n    const worker = slots.workers[0];\n\n    if (!drafter || !worker) {\n      return this.fallback(request);\n    }\n\n    const draft = await this.safeCall(drafter, request, { num_predict: (request.maxOutputTokens || 4096) });\n\n    if (!draft || draft.content.length < 20) {\n      const fb = await this.safeCall(worker, request);\n      return fb || this.fallback(request);\n    }\n\n    const verifyMessages: ChatMessage[] = [\n      ...request.messages.slice(0, -1),\n      { role: \"user\" as const, content: `${typeof request.messages[request.messages.length - 1].content === \"string\" ? request.messages[request.messages.length - 1].content : \"\"}\\n\\nHere is a draft response. Review it. If it is correct and complete, return exactly the same text. If it has errors, fix them. Return ONLY the final corrected text, nothing else.\\n\\nDRAFT:\\n${draft.content.slice(0, 8000)}` },\n    ];\n\n    const verifyRequest: ChatRequest = { ...request, messages: verifyMessages };\n    const verified = await this.safeCall(worker, verifyRequest);\n\n    if (!verified) return { ...draft, model: this.model };\n\n    const similarity = jaccardSimilarity(draft.content, verified.content);\n    if (similarity > 0.7) {\n      return { ...draft, usage: mergeUsage(draft.usage) };\n    }\n\n    return { ...verified, usage: mergeUsage(draft.usage, verified.usage) };\n  }\n\n  private async draftVerify(request: ChatRequest): Promise<CallResult> {\n    const slots = selectSlots(this.config, \"medium\");\n    const worker = slots.workers[0];\n    const reviewer = slots.reviewers[0];\n\n    if (!worker) return this.fallback(request);\n\n    const primary = await this.safeCall(worker, request);\n    if (!primary) return this.fallback(request);\n\n    if (!reviewer || primary.content.length < 50) {\n      return primary;\n    }\n\n    const reviewMessages: ChatMessage[] = [\n      { role: \"user\" as const, content: `Review this response for correctness. Fix any errors. Return ONLY the corrected text.\\n\\nORIGINAL REQUEST:\\n${typeof request.messages[request.messages.length - 1].content === \"string\" ? request.messages[request.messages.length - 1].content : \"\"}\\n\\nRESPONSE TO REVIEW:\\n${primary.content.slice(0, 6000)}` },\n    ];\n\n    const reviewed = await this.safeCall(reviewer, { ...request, messages: reviewMessages, maxOutputTokens: request.maxOutputTokens });\n    if (!reviewed) return primary;\n\n    return { ...reviewed, usage: mergeUsage(primary.usage, reviewed.usage) };\n  }\n\n  private async debate(request: ChatRequest): Promise<CallResult> {\n    const slots = selectSlots(this.config, \"complex\");\n    const workers = slots.workers;\n    const planner = slots.planner;\n\n    if (!workers.length) return this.fallback(request);\n\n    const roundRounds = this.config.debateRounds || 1;\n    let currentContent = \"\";\n\n    for (let round = 0; round < roundRounds; round++) {\n      const workerSlot = workers[round % workers.length];\n      const implMessages: ChatMessage[] = round === 0\n        ? request.messages\n        : [\n            ...request.messages.slice(0, -1),\n            {\n              role: \"user\" as const,\n              content: `${typeof request.messages[request.messages.length - 1].content === \"string\" ? request.messages[request.messages.length - 1].content : \"\"}\\n\\nPREVIOUS ATTEMPT (Round ${round}):\\n${currentContent.slice(0, 4000)}\\n\\nImprove this. Fix any issues.`,\n            },\n          ];\n\n      const impl = await this.safeCall(workerSlot, { ...request, messages: implMessages });\n      if (!impl) continue;\n      currentContent = impl.content;\n    }\n\n    if (!currentContent) return this.fallback(request);\n\n    if (planner && workers.length > 1) {\n      const candidates: CallResult[] = [];\n      for (const w of workers) {\n        const c = await this.safeCall(w, request);\n        if (c && c.content.length > 30) candidates.push(c);\n      }\n\n      if (candidates.length > 1) {\n        const best = candidates.sort((a, b) => b.content.length - a.content.length)[0];\n        const arbMessages: ChatMessage[] = [\n          {\n            role: \"user\" as const,\n            content: `Select the best response or synthesize a better one. Return ONLY the final text.\\n\\nTASK:\\n${typeof request.messages[request.messages.length - 1].content === \"string\" ? request.messages[request.messages.length - 1].content : \"\"}\\n\\nCANDIDATES:\\n${candidates.map((c, i) => `--- Candidate ${i + 1} (${c.model}) ---\\n${c.content.slice(0, 3000)}`).join(\"\\n\\n\")}`,\n          },\n        ];\n\n        const arbitrated = await this.safeCall(planner, { ...request, messages: arbMessages, maxOutputTokens: request.maxOutputTokens });\n        if (arbitrated && arbitrated.content.length > 20) {\n          const allUsages = candidates.map(c => c.usage).concat(arbitrated.usage);\n          return { ...arbitrated, usage: mergeUsage(...allUsages) };\n        }\n      }\n    }\n\n    return {\n      content: currentContent,\n      usage: { inputTokens: 0, outputTokens: 0 },\n      stopReason: \"end_turn\",\n      model: this.model,\n      durationMs: 0,\n    };\n  }\n\n  private async safeCall(slot: ClusterSlot, request: ChatRequest, extraOpts?: Record<string, unknown>): Promise<CallResult | null> {\n    try {\n      const result = await callModel(slot, request, this.config.baseURL || DEFAULT_BASE, this.config.timeoutMs || 180_000, extraOpts);\n      this.stats.calls++;\n      this.stats.tokensIn += result.usage.inputTokens;\n      this.stats.tokensOut += result.usage.outputTokens;\n      this.stats.byModel[slot.model] = (this.stats.byModel[slot.model] || 0) + 1;\n      return result;\n    } catch (e) {\n      console.warn(`Cluster safeCall failed for slot ${slot.model}: ${e instanceof Error ? e.message : String(e)}`);\n      return null;\n    }\n  }\n\n  private async fallback(request: ChatRequest): Promise<CallResult> {\n    const anySlot = this.config.slots[0];\n    const result = await callModel(anySlot, request, this.config.baseURL || DEFAULT_BASE, this.config.timeoutMs || 180_000);\n    this.stats.calls++;\n    this.stats.tokensIn += result.usage.inputTokens;\n    this.stats.tokensOut += result.usage.outputTokens;\n    this.stats.byModel[anySlot.model] = (this.stats.byModel[anySlot.model] || 0) + 1;\n    return result;\n  }\n}\n\nfunction jaccardSimilarity(a: string, b: string): number {\n  const aWords = new Set(a.toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n  const bWords = new Set(b.toLowerCase().split(/\\s+/).filter(w => w.length > 2));\n  if (aWords.size === 0 && bWords.size === 0) return 1;\n  const intersection = [...aWords].filter(w => bWords.has(w)).length;\n  const union = new Set([...aWords, ...bWords]).size;\n  return union > 0 ? intersection / union : 0;\n}\n","export interface ModelCost {\n  inputPer1M: number;\n  outputPer1M: number;\n}\n\nexport const MODEL_COSTS: Record<string, ModelCost> = {\n  \"gpt-4o\": { inputPer1M: 2.50, outputPer1M: 10.00 },\n  \"gpt-4o-mini\": { inputPer1M: 0.15, outputPer1M: 0.60 },\n  \"claude-sonnet-4-20250514\": { inputPer1M: 3.00, outputPer1M: 15.00 },\n  \"claude-haiku-3-5-20241022\": { inputPer1M: 0.80, outputPer1M: 4.00 },\n  \"gemini-2.5-flash\": { inputPer1M: 0.15, outputPer1M: 0.60 },\n  \"gemini-2.5-pro\": { inputPer1M: 1.25, outputPer1M: 5.00 },\n  \"deepseek-coder-v2\": { inputPer1M: 0.14, outputPer1M: 0.28 },\n  \"qwen2.5-coder:7b\": { inputPer1M: 0, outputPer1M: 0 },\n};\n\nexport function estimateRequestCost(\n  model: string,\n  inputTokens: number,\n  outputTokens: number,\n): number {\n  const cost = MODEL_COSTS[model];\n  if (!cost) return 0;\n  return (inputTokens / 1_000_000) * cost.inputPer1M + (outputTokens / 1_000_000) * cost.outputPer1M;\n}\n","import type { ModelResponse, ContentBlock } from '../types.js';\nimport type { Provider, ChatRequest } from './provider.js';\nimport { estimateRequestCost } from './cost-table.js';\n\nexport type ModelTier = \"fast\" | \"standard\" | \"powerful\";\n\nexport interface TieredRouterConfig {\n  fast: Provider;\n  standard: Provider;\n  powerful?: Provider;\n}\n\nexport const DEFAULT_TOOL_TIER_MAP: Record<string, ModelTier> = {\n  file_read: \"fast\",\n  glob: \"fast\",\n  grep: \"fast\",\n  web_fetch: \"fast\",\n  file_edit: \"powerful\",\n  file_write: \"powerful\",\n  fuzzy_edit: \"powerful\",\n  bash: \"standard\",\n};\n\nexport interface RouterStats {\n  totalRequests: number;\n  byTier: Record<ModelTier, { requests: number; inputTokens: number; outputTokens: number }>;\n  estimatedCostSaved: number;\n}\n\nconst TIER_ORDER: ModelTier[] = [\"fast\", \"standard\", \"powerful\"];\n\nfunction tierRank(tier: ModelTier): number {\n  return TIER_ORDER.indexOf(tier);\n}\n\nexport class TieredRouter implements Provider {\n  private tiers: Map<ModelTier, Provider>;\n  private toolMap: Map<string, ModelTier>;\n  private currentTier: ModelTier = \"standard\";\n  private stats: RouterStats;\n\n  constructor(config: TieredRouterConfig) {\n    this.tiers = new Map<ModelTier, Provider>();\n    this.tiers.set(\"fast\", config.fast);\n    this.tiers.set(\"standard\", config.standard);\n    if (config.powerful) {\n      this.tiers.set(\"powerful\", config.powerful);\n    }\n\n    this.toolMap = new Map<string, ModelTier>(Object.entries(DEFAULT_TOOL_TIER_MAP));\n\n    this.stats = {\n      totalRequests: 0,\n      byTier: {\n        fast: { requests: 0, inputTokens: 0, outputTokens: 0 },\n        standard: { requests: 0, inputTokens: 0, outputTokens: 0 },\n        powerful: { requests: 0, inputTokens: 0, outputTokens: 0 },\n      },\n      estimatedCostSaved: 0,\n    };\n  }\n\n  get model(): string {\n    return this.resolveTier(this.currentTier).model;\n  }\n\n  chat(request: ChatRequest): Promise<ModelResponse> {\n    const tier = this.determineTier(request);\n    const provider = this.resolveTier(tier);\n    const assumedTier = this.resolveTier(\"powerful\");\n    this.estimateSavings(tier, assumedTier.model);\n\n    return provider.chat(request).then((response) => {\n      this.recordUsage(tier, response.usage.inputTokens, response.usage.outputTokens);\n      return response;\n    });\n  }\n\n  setTier(tier: ModelTier): void {\n    this.currentTier = tier;\n  }\n\n  getTierForTool(toolName: string): ModelTier {\n    return this.toolMap.get(toolName) ?? \"standard\";\n  }\n\n  routeByToolCalls(toolCalls: Array<{ name: string }>): ModelTier {\n    let maxTier: ModelTier = \"fast\";\n    for (const tc of toolCalls) {\n      const tier = this.getTierForTool(tc.name);\n      if (tierRank(tier) > tierRank(maxTier)) {\n        maxTier = tier;\n      }\n    }\n    return maxTier;\n  }\n\n  getStats(): RouterStats {\n    return {\n      totalRequests: this.stats.totalRequests,\n      byTier: {\n        fast: { ...this.stats.byTier.fast },\n        standard: { ...this.stats.byTier.standard },\n        powerful: { ...this.stats.byTier.powerful },\n      },\n      estimatedCostSaved: this.stats.estimatedCostSaved,\n    };\n  }\n\n  private determineTier(request: ChatRequest): ModelTier {\n    const messages = request.messages;\n    for (let i = messages.length - 1; i >= 0; i--) {\n      const msg = messages[i];\n      if (msg.role === \"assistant\") {\n        const toolCalls = this.extractToolCalls(msg.content);\n        if (toolCalls.length > 0) {\n          return this.routeByToolCalls(toolCalls);\n        }\n        break;\n      }\n    }\n    return this.currentTier;\n  }\n\n  private extractToolCalls(content: string | ContentBlock[]): Array<{ name: string }> {\n    if (typeof content === \"string\") return [];\n    const calls: Array<{ name: string }> = [];\n    for (const block of content) {\n      if (block.type === \"tool_use\") {\n        calls.push({ name: block.name });\n      }\n    }\n    return calls;\n  }\n\n  private resolveTier(tier: ModelTier): Provider {\n    const provider = this.tiers.get(tier);\n    if (provider) return provider;\n    const rank = tierRank(tier);\n    for (let i = rank - 1; i >= 0; i--) {\n      const fallback = this.tiers.get(TIER_ORDER[i]);\n      if (fallback) return fallback;\n    }\n    return this.tiers.get(\"fast\")!;\n  }\n\n  private recordUsage(tier: ModelTier, inputTokens: number, outputTokens: number): void {\n    this.stats.totalRequests++;\n    this.stats.byTier[tier].requests++;\n    this.stats.byTier[tier].inputTokens += inputTokens;\n    this.stats.byTier[tier].outputTokens += outputTokens;\n  }\n\n  private estimateSavings(usedTier: ModelTier, baselineModel: string): void {\n    const usedProvider = this.resolveTier(usedTier);\n    const usedCost = estimateRequestCost(usedProvider.model, 1000, 500);\n    const baselineCost = estimateRequestCost(baselineModel, 1000, 500);\n    if (baselineCost > 0) {\n      this.stats.estimatedCostSaved += baselineCost - usedCost;\n    }\n  }\n}\n","import type { ModelResponse } from '../types.js';\nimport { BaseProvider, RetryableError } from './provider.js';\nimport type { Provider, ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nimport { AnthropicProvider } from './anthropic.js';\nimport type { AnthropicProviderConfig } from './anthropic.js';\nimport { OpenAIProvider } from './openai.js';\nimport type { OpenAIProviderConfig } from './openai.js';\nimport { OllamaProvider } from './ollama.js';\nimport type { OllamaProviderConfig } from './ollama.js';\nimport { ClusterProvider } from './cluster.js';\nimport type { ClusterConfig, ClusterSlot } from './cluster.js';\n\nexport { BaseProvider, RetryableError } from './provider.js';\nexport type { Provider, ChatRequest, ChatMessage, APIToolDefinition } from './provider.js';\nexport { AnthropicProvider } from './anthropic.js';\nexport type { AnthropicProviderConfig } from './anthropic.js';\nexport { OpenAIProvider } from './openai.js';\nexport type { OpenAIProviderConfig } from './openai.js';\nexport { OllamaProvider } from './ollama.js';\nexport type { OllamaProviderConfig } from './ollama.js';\nexport { ClusterProvider } from './cluster.js';\nexport type { ClusterConfig, ClusterSlot } from './cluster.js';\n\nexport { TieredRouter, DEFAULT_TOOL_TIER_MAP } from './router.js';\nexport type { TieredRouterConfig, ModelTier, RouterStats } from './router.js';\n\nexport { MODEL_COSTS, estimateRequestCost } from './cost-table.js';\nexport type { ModelCost } from './cost-table.js';\n\nexport function anthropic(config: AnthropicProviderConfig): AnthropicProvider {\n  return new AnthropicProvider(config);\n}\n\nexport function openai(config: OpenAIProviderConfig): OpenAIProvider {\n  return new OpenAIProvider(config);\n}\n\nexport function ollama(config: OllamaProviderConfig): OllamaProvider {\n  return new OllamaProvider(config);\n}\n\nexport function cluster(config?: Partial<ClusterConfig>): ClusterProvider {\n  return new ClusterProvider(config);\n}\n\nexport interface CustomProviderConfig {\n  provider: 'custom';\n  model: string;\n  chat: (request: ChatRequest) => Promise<ModelResponse>;\n}\n\nclass CustomProvider implements Provider {\n  readonly model: string;\n  private readonly chatFn: (request: ChatRequest) => Promise<ModelResponse>;\n\n  constructor(config: CustomProviderConfig) {\n    this.model = config.model;\n    this.chatFn = config.chat;\n  }\n\n  chat(request: ChatRequest): Promise<ModelResponse> {\n    return this.chatFn(request);\n  }\n}\n\nexport type OllamaProviderConfigWithProvider = OllamaProviderConfig & { provider: 'ollama' };\n\nexport function createProvider(\n  config:\n    | (AnthropicProviderConfig & { provider: 'anthropic' })\n    | (OpenAIProviderConfig & { provider: 'openai' })\n    | OllamaProviderConfigWithProvider\n    | CustomProviderConfig,\n): Provider {\n  switch (config.provider) {\n    case 'anthropic':\n      return new AnthropicProvider(config);\n    case 'openai':\n      return new OpenAIProvider(config);\n    case 'ollama':\n      return new OllamaProvider(config);\n    case 'custom':\n      return new CustomProvider(config);\n  }\n}\n","import type { TokenUsage } from \"./types.js\";\n\nexport interface StreamEvent {\n  type: \"text_delta\" | \"tool_use_start\" | \"tool_use_delta\" | \"tool_result\" | \"done\" | \"error\";\n  text?: string;\n  id?: string;\n  name?: string;\n  input?: string;\n  output?: string;\n  usage?: TokenUsage;\n  error?: Error;\n}\n\nexport function createStreamAggregator() {\n  let text = \"\";\n  const toolCalls: Map<string, { id: string; name: string; input: string }> = new Map();\n  let usage: TokenUsage | undefined;\n  let stopReason: \"end_turn\" | \"tool_use\" | \"max_tokens\" = \"end_turn\";\n\n  function push(event: StreamEvent): void {\n    switch (event.type) {\n      case \"text_delta\":\n        text += event.text ?? \"\";\n        break;\n      case \"tool_use_start\":\n        if (event.id) {\n          toolCalls.set(event.id, { id: event.id, name: event.name ?? \"\", input: event.input ?? \"\" });\n        }\n        stopReason = \"tool_use\";\n        break;\n      case \"tool_use_delta\":\n        if (event.id && toolCalls.has(event.id)) {\n          toolCalls.get(event.id)!.input += event.input ?? \"\";\n        }\n        break;\n      case \"done\":\n        usage = event.usage;\n        break;\n      case \"tool_result\":\n        break;\n      case \"error\":\n        break;\n    }\n  }\n\n  function getResponse(): {\n    text: string;\n    toolCalls: { id: string; name: string; input: string }[];\n    usage?: TokenUsage;\n    stopReason: string;\n  } {\n    return { text, toolCalls: Array.from(toolCalls.values()), usage, stopReason };\n  }\n\n  return { push, getResponse };\n}\n","import type { Message } from \"../types.js\";\n\nexport interface MemoryStore {\n  getThread(threadId: string): Promise<Message[]>;\n  saveThread(threadId: string, messages: Message[]): Promise<void>;\n  appendMessage(threadId: string, message: Message): Promise<void>;\n  listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>>;\n  deleteThread(threadId: string): Promise<void>;\n}\n\nexport class InMemoryStore implements MemoryStore {\n  private threads: Map<string, { messages: Message[]; updatedAt: number }> = new Map();\n\n  async getThread(threadId: string): Promise<Message[]> {\n    return this.threads.get(threadId)?.messages ?? [];\n  }\n\n  async saveThread(threadId: string, messages: Message[]): Promise<void> {\n    this.threads.set(threadId, { messages, updatedAt: Date.now() });\n  }\n\n  async appendMessage(threadId: string, message: Message): Promise<void> {\n    const thread = this.threads.get(threadId);\n    if (thread) {\n      thread.messages.push(message);\n      thread.updatedAt = Date.now();\n    } else {\n      this.threads.set(threadId, { messages: [message], updatedAt: Date.now() });\n    }\n  }\n\n  async listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>> {\n    let entries = Array.from(this.threads.entries())\n      .map(([id, data]) => ({ id, updatedAt: data.updatedAt, messageCount: data.messages.length }))\n      .sort((a, b) => b.updatedAt - a.updatedAt);\n    if (opts?.before) entries = entries.filter(e => e.updatedAt < parseInt(opts.before as string, 10));\n    return entries.slice(0, opts?.limit ?? 100);\n  }\n\n  async deleteThread(threadId: string): Promise<void> {\n    this.threads.delete(threadId);\n  }\n}\n","import type { MemoryStore } from \"./store.js\";\nimport type { Message } from \"../types.js\";\nimport { InMemoryStore } from \"./store.js\";\n\nfunction jsonSerialize(messages: Message[]): string {\n  return JSON.stringify(messages, (_, value) => {\n    if (value === undefined) return \"__UNDEFINED__\";\n    return value;\n  });\n}\n\nfunction jsonDeserialize(str: string): Message[] {\n  return JSON.parse(str, (_, value) => {\n    if (value === \"__UNDEFINED__\") return undefined;\n    return value;\n  });\n}\n\nexport class SQLiteStore implements MemoryStore {\n  private store: MemoryStore;\n\n  constructor(dbPath?: string) {\n    try {\n      const Database = require(\"better-sqlite3\");\n      const db = new Database(dbPath ?? \"./synth-memory.db\");\n      db.pragma(\"journal_mode = WAL\");\n      db.exec(`\n        CREATE TABLE IF NOT EXISTS threads (\n          id TEXT PRIMARY KEY,\n          messages TEXT NOT NULL,\n          updated_at INTEGER NOT NULL,\n          message_count INTEGER NOT NULL DEFAULT 0\n        )\n      `);\n      try {\n        db.exec(\"ALTER TABLE threads ADD COLUMN message_count INTEGER NOT NULL DEFAULT 0\");\n      } catch {\n        // column already exists\n      }\n      this.store = {\n        async getThread(threadId: string): Promise<Message[]> {\n          const row = db.prepare(\"SELECT messages FROM threads WHERE id = ?\").get(threadId);\n          if (!row) return [];\n          return jsonDeserialize(row.messages);\n        },\n        async saveThread(threadId: string, messages: Message[]): Promise<void> {\n          const now = Date.now();\n          const json = jsonSerialize(messages);\n          const msgCount = messages.length;\n          const exists = db.prepare(\"SELECT 1 FROM threads WHERE id = ?\").get(threadId);\n          const stmt = exists\n            ? db.prepare(\"UPDATE threads SET messages = ?, updated_at = ?, message_count = ? WHERE id = ?\")\n            : db.prepare(\"INSERT INTO threads (id, messages, updated_at, message_count) VALUES (?, ?, ?, ?)\");\n          stmt.run(json, now, msgCount, threadId);\n        },\n        async appendMessage(threadId: string, message: Message): Promise<void> {\n          const row = db.prepare(\"SELECT messages FROM threads WHERE id = ?\").get(threadId);\n          const messages: Message[] = row ? jsonDeserialize(row.messages) : [];\n          messages.push(message);\n          const json = jsonSerialize(messages);\n          const now = Date.now();\n          db.prepare(\"INSERT INTO threads (id, messages, updated_at, message_count) VALUES (?, ?, ?, ?) ON CONFLICT(id) DO UPDATE SET messages = excluded.messages, updated_at = excluded.updated_at, message_count = excluded.message_count\")\n            .run(threadId, json, now, messages.length);\n        },\n        async listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>> {\n          const rows = db.prepare(\"SELECT id, updated_at, message_count FROM threads ORDER BY updated_at DESC\").all();\n          let results = rows.map((r: any) => ({ id: r.id, updatedAt: r.updated_at, messageCount: r.message_count }));\n          if (opts?.before) results = results.filter((e: { updatedAt: number }) => e.updatedAt < parseInt(opts.before!, 10));\n          return results.slice(0, opts?.limit ?? 100);\n        },\n        async deleteThread(threadId: string): Promise<void> {\n          db.prepare(\"DELETE FROM threads WHERE id = ?\").run(threadId);\n        },\n      };\n    } catch {\n      console.warn(\"[synth] better-sqlite3 not available, falling back to in-memory store. Install it with: npm install better-sqlite3\");\n      this.store = new InMemoryStore();\n    }\n  }\n\n  async getThread(threadId: string): Promise<Message[]> { return this.store.getThread(threadId); }\n  async saveThread(threadId: string, messages: Message[]): Promise<void> { return this.store.saveThread(threadId, messages); }\n  async appendMessage(threadId: string, message: Message): Promise<void> { return this.store.appendMessage(threadId, message); }\n  async listThreads(opts?: { limit?: number; before?: string }): Promise<Array<{ id: string; updatedAt: number; messageCount: number }>> { return this.store.listThreads(opts); }\n  async deleteThread(threadId: string): Promise<void> { return this.store.deleteThread(threadId); }\n}\n","import type { ChildProcess } from \"node:child_process\";\n\nexport interface MCPToolDefinition {\n  name: string;\n  description: string;\n  inputSchema: Record<string, unknown>;\n}\n\nexport interface MCPServerConfig {\n  type: \"stdio\" | \"sse\";\n  command?: string;\n  args?: string[];\n  url?: string;\n  env?: Record<string, string>;\n  headers?: Record<string, string>;\n}\n\nexport class MCPClient {\n  private config: MCPServerConfig;\n  private tools: MCPToolDefinition[] = [];\n  private proc: ChildProcess | null = null;\n  private initialized = false;\n  private nextId = 1;\n  private messageBuffer = \"\";\n  private pendingHandlers: Map<number, (msg: unknown) => void> = new Map();\n  private sseEventSource: EventSource | null = null;\n  private sseMessageEndpoint: string | null = null;\n\n  constructor(config: MCPServerConfig) {\n    this.config = config;\n  }\n\n  private send(proc: ChildProcess, method: string, params: Record<string, unknown>, id?: number): number {\n    const msgId = id ?? this.nextId++;\n    const msg = JSON.stringify({ jsonrpc: \"2.0\", id: msgId, method, params });\n    proc.stdin!.write(msg + \"\\n\");\n    return msgId;\n  }\n\n  private setupMessageHandler(proc: ChildProcess): void {\n    proc.stdout!.on(\"data\", (data: Buffer) => {\n      this.messageBuffer += data.toString();\n      const lines = this.messageBuffer.split(\"\\n\");\n      this.messageBuffer = lines.pop() ?? \"\";\n      for (const line of lines) {\n        if (!line.trim()) continue;\n        try {\n          const msg = JSON.parse(line);\n          if (msg.id !== undefined && this.pendingHandlers.has(msg.id)) {\n            const handler = this.pendingHandlers.get(msg.id)!;\n            this.pendingHandlers.delete(msg.id);\n            handler(msg);\n          } else if (msg.method === \"initialize\" && msg.id) {\n            proc.stdin!.write(JSON.stringify({\n              jsonrpc: \"2.0\",\n              id: msg.id,\n              result: { protocolVersion: \"2024-11-05\", capabilities: {}, serverInfo: { name: \"synthcode-mcp-proxy\", version: \"0.6.0\" } },\n            }) + \"\\n\");\n          }\n        } catch {}\n      }\n    });\n    proc.stderr!.on(\"data\", () => {});\n  }\n\n  async connect(): Promise<void> {\n    if (this.config.type === \"stdio\") {\n      const { spawn } = await import(\"node:child_process\");\n      const proc = spawn(this.config.command!, this.config.args ?? [], {\n        env: { ...process.env, ...this.config.env },\n        stdio: [\"pipe\", \"pipe\", \"pipe\"],\n      });\n      proc.on(\"error\", (err) => { throw err; });\n      proc.on(\"close\", () => { this.initialized = false; });\n      this.proc = proc;\n      this.setupMessageHandler(proc);\n      await new Promise<void>((resolve) => {\n        const handler = (_data: Buffer) => {\n          proc.stdout!.off(\"data\", handler);\n          resolve();\n        };\n        proc.stdout!.on(\"data\", handler);\n        setTimeout(() => {\n          proc.stdout!.off(\"data\", handler);\n          resolve();\n        }, 2000);\n      });\n      this.initialized = true;\n    }\n    if (this.config.type === \"sse\") {\n      if (!this.config.url) throw new Error(\"SSE MCP server requires a url\");\n\n      const baseUrl = this.config.url.replace(/\\/$/, \"\");\n      const sseUrl = baseUrl.includes(\"/sse\") ? baseUrl : `${baseUrl}/sse`;\n      const headers: Record<string, string> = {\n        \"Accept\": \"text/event-stream\",\n        ...this.config.headers,\n      };\n\n      this.sseEventSource = new EventSource(sseUrl, { headers } as ConstructorParameters<typeof EventSource>[1]);\n\n      await new Promise<void>((resolve, reject) => {\n        const timeout = setTimeout(() => {\n          reject(new Error(\"SSE connection timeout\"));\n        }, 10000);\n\n        this.sseEventSource!.addEventListener(\"endpoint\", (event) => {\n          const endpointPath = (event as MessageEvent).data as string;\n          this.sseMessageEndpoint = endpointPath.startsWith(\"http\")\n            ? endpointPath\n            : `${new URL(baseUrl).origin}${endpointPath}`;\n          clearTimeout(timeout);\n          resolve();\n        });\n\n        this.sseEventSource!.addEventListener(\"message\", (event) => {\n          try {\n            const msg = JSON.parse((event as MessageEvent).data as string);\n            if (msg.id !== undefined && this.pendingHandlers.has(msg.id)) {\n              const handler = this.pendingHandlers.get(msg.id)!;\n              this.pendingHandlers.delete(msg.id);\n              handler(msg);\n            }\n          } catch {}\n        });\n\n        this.sseEventSource!.onerror = () => {\n          clearTimeout(timeout);\n          if (!this.sseMessageEndpoint) {\n            reject(new Error(`Failed to connect to SSE endpoint: ${sseUrl}`));\n          }\n        };\n      });\n\n      this.initialized = true;\n    }\n  }\n\n  private async sseSend(method: string, params: Record<string, unknown>, id?: number): Promise<number> {\n    const msgId = id ?? this.nextId++;\n    if (!this.sseMessageEndpoint) throw new Error(\"SSE message endpoint not initialized\");\n\n    const headers: Record<string, string> = {\n      \"Content-Type\": \"application/json\",\n      ...this.config.headers,\n    };\n\n    const response = await fetch(this.sseMessageEndpoint, {\n      method: \"POST\",\n      headers,\n      body: JSON.stringify({ jsonrpc: \"2.0\", id: msgId, method, params }),\n    });\n\n    if (!response.ok) {\n      throw new Error(`SSE send failed: ${response.status} ${response.statusText}`);\n    }\n\n    return msgId;\n  }\n\n  async listTools(): Promise<MCPToolDefinition[]> {\n    if (this.config.type === \"stdio\" && this.proc) {\n      const id = this.nextId++;\n      const tools = await new Promise<MCPToolDefinition[]>((resolve, reject) => {\n        const timeout = setTimeout(() => {\n          this.pendingHandlers.delete(id);\n          reject(new Error(\"MCP listTools timeout\"));\n        }, 10000);\n        this.pendingHandlers.set(id, (msg: unknown) => {\n          clearTimeout(timeout);\n          const m = msg as Record<string, unknown>;\n          if ((m.result as Record<string, unknown>)?.tools) {\n            resolve(\n              ((m.result as Record<string, unknown>).tools as Record<string, unknown>[]).map((t) => ({\n                name: t.name as string,\n                description: (t.description as string) ?? \"\",\n                inputSchema: (t.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n              })),\n            );\n          } else {\n            resolve([]);\n          }\n        });\n      });\n      this.send(this.proc!, \"tools/list\", {}, id);\n      this.tools = tools;\n      return tools;\n    }\n    if (this.config.type === \"sse\" && this.sseEventSource && this.sseMessageEndpoint) {\n      const id = await this.sseSend(\"tools/list\", {});\n      const tools = await new Promise<MCPToolDefinition[]>((resolve, reject) => {\n        const timeout = setTimeout(() => {\n          this.pendingHandlers.delete(id);\n          reject(new Error(\"SSE MCP listTools timeout\"));\n        }, 10000);\n        this.pendingHandlers.set(id, (msg: unknown) => {\n          clearTimeout(timeout);\n          const m = msg as Record<string, unknown>;\n          if ((m.result as Record<string, unknown>)?.tools) {\n            resolve(\n              ((m.result as Record<string, unknown>).tools as Record<string, unknown>[]).map((t) => ({\n                name: t.name as string,\n                description: (t.description as string) ?? \"\",\n                inputSchema: (t.inputSchema as Record<string, unknown>) ?? { type: \"object\", properties: {} },\n              })),\n            );\n          } else {\n            resolve([]);\n          }\n        });\n      });\n      this.tools = tools;\n      return tools;\n    }\n    return [];\n  }\n\n  async callTool(\n    name: string,\n    input: Record<string, unknown>,\n  ): Promise<string> {\n    if (this.config.type === \"stdio\" && this.proc) {\n      const id = this.nextId++;\n      return new Promise((resolve, reject) => {\n        const timeout = setTimeout(() => {\n          this.pendingHandlers.delete(id);\n          reject(new Error(\"MCP callTool timeout\"));\n        }, 30000);\n        this.pendingHandlers.set(id, (msg: unknown) => {\n          clearTimeout(timeout);\n          const m = msg as Record<string, unknown>;\n          if (m.result) {\n            resolve(typeof m.result === \"string\" ? m.result : JSON.stringify(m.result));\n          } else if (m.error) {\n            reject(\n              new Error(\n                ((m.error as Record<string, unknown>).message as string) ?? \"MCP tool error\",\n              ),\n            );\n          }\n        });\n        this.send(this.proc!, \"tools/call\", { name, arguments: input }, id);\n      });\n    }\n    if (this.config.type === \"sse\" && this.sseEventSource && this.sseMessageEndpoint) {\n      const id = await this.sseSend(\"tools/call\", { name, arguments: input });\n      return new Promise((resolve, reject) => {\n        const timeout = setTimeout(() => {\n          this.pendingHandlers.delete(id);\n          reject(new Error(\"SSE MCP callTool timeout\"));\n        }, 30000);\n        this.pendingHandlers.set(id, (msg: unknown) => {\n          clearTimeout(timeout);\n          const m = msg as Record<string, unknown>;\n          if (m.result) {\n            const content = (m.result as Record<string, unknown>).content;\n            if (Array.isArray(content)) {\n              const textParts = content\n                .filter((c: Record<string, unknown>) => c.type === \"text\")\n                .map((c: Record<string, unknown>) => c.text as string);\n              resolve(textParts.join(\"\\n\") || JSON.stringify(m.result));\n            } else {\n              resolve(typeof m.result === \"string\" ? m.result : JSON.stringify(m.result));\n            }\n          } else if (m.error) {\n            reject(\n              new Error(\n                ((m.error as Record<string, unknown>).message as string) ?? \"SSE MCP tool error\",\n              ),\n            );\n          }\n        });\n      });\n    }\n    throw new Error(\"MCP client not connected\");\n  }\n\n  async disconnect(): Promise<void> {\n    if (this.proc) {\n      this.proc.kill();\n      this.proc = null;\n    }\n    if (this.sseEventSource) {\n      this.sseEventSource.close();\n      this.sseEventSource = null;\n      this.sseMessageEndpoint = null;\n    }\n  }\n\n  getTools(): MCPToolDefinition[] {\n    return this.tools;\n  }\n}\n","import { defineTool } from \"../tools/tool.js\";\nimport type { Tool } from \"../tools/tool.js\";\nimport type { ToolContext } from \"../types.js\";\nimport { MCPClient } from \"./client.js\";\nimport type { MCPToolDefinition, MCPServerConfig } from \"./client.js\";\n\nexport async function loadMCPTools(\n  config: MCPServerConfig,\n): Promise<{ tools: Tool[]; client: MCPClient }> {\n  const { z } = await import(\"zod\");\n\n  const client = new MCPClient(config);\n  await client.connect();\n  const definitions = await client.listTools();\n\n  const tools = definitions.map((def: MCPToolDefinition) =>\n    defineTool({\n      name: def.name,\n      description: def.description,\n      inputSchema: z.object({}).passthrough(),\n      isReadOnly: true,\n      isConcurrencySafe: true,\n      execute: async (input: Record<string, unknown>, _context: ToolContext) => {\n        const result = await client.callTool(def.name, input);\n        return result;\n      },\n    }),\n  );\n\n  return { tools, client };\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { execSync } from \"node:child_process\";\n\nexport interface InitOptions {\n  projectName?: string;\n  cwd?: string;\n  skipInstall?: boolean;\n}\n\nconst PACKAGE_JSON = JSON.stringify(\n  {\n    name: \"my-agent\",\n    version: \"1.0.0\",\n    type: \"module\",\n    scripts: {\n      start: \"npx tsx src/index.ts\",\n      test: \"npx vitest run\",\n      typecheck: \"tsc --noEmit\",\n    },\n    dependencies: {\n      \"@avasis-ai/synthcode\": \"^1.0.0\",\n      zod: \"^3.24.0\",\n    },\n    devDependencies: {\n      typescript: \"^5.7.0\",\n      tsx: \"^4.19.0\",\n      vitest: \"^2.1.0\",\n    },\n  },\n  null,\n  2,\n);\n\nconst TSCONFIG_JSON = JSON.stringify(\n  {\n    compilerOptions: {\n      target: \"ES2022\",\n      module: \"ESNext\",\n      moduleResolution: \"bundler\",\n      strict: true,\n      esModuleInterop: true,\n      skipLibCheck: true,\n      outDir: \"./dist\",\n      rootDir: \"./src\",\n      declaration: true,\n    },\n    include: [\"src\"],\n  },\n  null,\n  2,\n);\n\nconst ENV_EXAMPLE = `# Pick one provider and set its key:\n# ANTHROPIC_API_KEY=your-key-here\n# OPENAI_API_KEY=your-key-here\n# For Ollama (local, zero API costs): no key needed\n`;\n\nconst INDEX_TS = `import { Agent, BashTool, FileReadTool, FileWriteTool, FileEditTool, GlobTool, GrepTool, WebFetchTool } from \"@avasis-ai/synthcode\";\nimport { defineTool } from \"@avasis-ai/synthcode/tools\";\nimport { z } from \"zod\";\n\nconst agent = new Agent({\n  model: process.env.OLLAMA_MODEL\n    ? await import(\"@avasis-ai/synthcode/llm\").then(m => new m.OllamaProvider({ model: process.env.OLLAMA_MODEL }))\n    : process.env.OPENAI_API_KEY\n      ? await import(\"@avasis-ai/synthcode/llm\").then(m => new m.OpenAIProvider({ apiKey: process.env.OPENAI_API_KEY }))\n      : await import(\"@avasis-ai/synthcode/llm\").then(m => new m.AnthropicProvider({ apiKey: process.env.ANTHROPIC_API_KEY! })),\n  tools: [\n    BashTool,\n    FileReadTool,\n    FileWriteTool,\n    FileEditTool,\n    GlobTool,\n    GrepTool,\n    WebFetchTool,\n  ],\n  systemPrompt: \"You are a helpful AI coding assistant with shell and file access.\",\n});\n\nconst prompt = process.argv[2] || \"Hello! What can I help you with?\";\n\nfor await (const event of agent.run(prompt)) {\n  if (event.type === \"text\") process.stdout.write(event.text);\n  if (event.type === \"tool_use\") console.log(\\`\\\\n  [\\${event.name}]\\`);\n  if (event.type === \"tool_result\") {\n    if (event.isError) console.log(\\`\\\\n  [\\${event.name}] FAILED\\`);\n  }\n  if (event.type === \"thinking\") process.stderr.write(\\`\\\\x1b[90m\\${event.thinking}\\\\x1b[0m\\`);\n  if (event.type === \"done\") console.log(\\`\\\\n\\\\nTokens: \\${event.usage.inputTokens} in, \\${event.usage.outputTokens} out\\`);\n  if (event.type === \"error\") {\n    console.error(\\`\\\\nError: \\${event.error.message}\\`);\n    process.exit(1);\n  }\n}\n`;\n\nexport async function init(opts?: InitOptions): Promise<void> {\n  const name = opts?.projectName ?? \"my-agent\";\n  const cwd = opts?.cwd ?? process.cwd();\n  const dir = path.join(cwd, name);\n\n  fs.mkdirSync(path.join(dir, \"src\", \"tools\"), { recursive: true });\n  fs.mkdirSync(path.join(dir, \"tests\"), { recursive: true });\n\n  fs.writeFileSync(path.join(dir, \"package.json\"), PACKAGE_JSON, \"utf-8\");\n  fs.writeFileSync(path.join(dir, \"tsconfig.json\"), TSCONFIG_JSON, \"utf-8\");\n  fs.writeFileSync(path.join(dir, \".env.example\"), ENV_EXAMPLE, \"utf-8\");\n  fs.writeFileSync(path.join(dir, \"src\", \"index.ts\"), INDEX_TS, \"utf-8\");\n  fs.writeFileSync(path.join(dir, \"tests\", \"agent.test.ts\"), `import { describe, it, expect } from \"vitest\";\\ndescribe(\"Agent\", () => { it(\"should have tools registered\", () => { expect(true).toBe(true); }); });\\n`, \"utf-8\");\n\n  if (!opts?.skipInstall) {\n    console.log(\"Installing dependencies...\");\n    execSync(\"npm install\", { cwd: dir, stdio: \"inherit\" });\n  }\n\n  console.log(`\\n  Created ${name}/`);\n  console.log(`  cd ${name} && npm start \"your prompt here\"\\n`);\n}\n","import { EventEmitter } from \"events\";\n\ntype CircuitState = \"CLOSED\" | \"OPEN\" | \"HALF_OPEN\";\n\ninterface CircuitBreakerOptions {\n  failureThreshold: number;\n  resetTimeoutMs: number;\n}\n\nexport class CircuitBreaker extends EventEmitter {\n  private state: CircuitState = \"CLOSED\";\n  private failureCount: number = 0;\n  private lastFailureTime: number = 0;\n  private options: CircuitBreakerOptions;\n\n  constructor(options: CircuitBreakerOptions) {\n    super();\n    this.options = options;\n  }\n\n  private isCircuitOpen(currentTime: number): boolean {\n    if (this.state === \"OPEN\") {\n      const timeSinceFailure = currentTime - this.lastFailureTime;\n      if (timeSinceFailure >= this.options.resetTimeoutMs) {\n        this.transitionTo(\"HALF_OPEN\");\n        return false;\n      }\n      return true;\n    }\n    return false;\n  }\n\n  private transitionTo(newState: CircuitState): void {\n    this.state = newState;\n    this.emit(\"stateChange\", newState);\n  }\n\n  public recordSuccess(): void {\n    if (this.state === \"OPEN\") {\n      // Should not happen if checkExecutionState is used correctly, but reset just in case.\n      this.transitionTo(\"CLOSED\");\n    } else if (this.state === \"HALF_OPEN\") {\n      this.transitionTo(\"CLOSED\");\n    }\n    this.failureCount = 0;\n    this.lastFailureTime = 0;\n  }\n\n  public recordFailure(): void {\n    const now = Date.now();\n    this.lastFailureTime = now;\n\n    if (this.state === \"CLOSED\") {\n      this.failureCount++;\n      if (this.failureCount >= this.options.failureThreshold) {\n        this.transitionTo(\"OPEN\");\n      }\n    } else if (this.state === \"HALF_OPEN\") {\n      // Failure in HALF_OPEN immediately trips the circuit back to OPEN\n      this.transitionTo(\"OPEN\");\n    }\n    // If OPEN, we just update the time, but the state remains OPEN until timeout.\n  }\n\n  public checkExecutionState(): { allowed: boolean; reason: string } {\n    const now = Date.now();\n\n    if (this.state === \"OPEN\") {\n      const timeSinceFailure = now - this.lastFailureTime;\n      if (timeSinceFailure >= this.options.resetTimeoutMs) {\n        this.transitionTo(\"HALF_OPEN\");\n        return { allowed: true, reason: \"Circuit is half-open, attempting execution.\" };\n      }\n      const timeRemaining = this.options.resetTimeoutMs - timeSinceFailure;\n      return { allowed: false, reason: `Circuit is open. Try again in ${Math.ceil(timeRemaining / 1000)} seconds.` };\n    }\n\n    if (this.state === \"HALF_OPEN\") {\n      return { allowed: true, reason: \"Circuit is half-open, allowing one test call.\" };\n    }\n\n    return { allowed: true, reason: \"Circuit is closed, execution allowed.\" };\n  }\n\n  public execute<T>(\n    fn: () => Promise<T>\n  ): Promise<T> {\n    const { allowed, reason } = this.checkExecutionState();\n\n    if (!allowed) {\n      return Promise.reject(new Error(`Circuit Breaker Open: ${reason}`));\n    }\n\n    return fn().catch((error) => {\n      this.recordFailure();\n      throw error;\n    }).then((result) => {\n      this.recordSuccess();\n      return result;\n    });\n  }\n}","import type { ProviderAdapter, ModelInfo, BenchmarkResult, BenchmarkConfig } from \"./types.js\";\n\nexport class OpenAICompatAdapter implements ProviderAdapter {\n  readonly name: string;\n  private baseURL: string;\n  private defaultHeaders: Record<string, string>;\n\n  constructor(name: string, baseURL: string, defaultHeaders?: Record<string, string>) {\n    this.name = name;\n    this.baseURL = baseURL.replace(/\\/$/, \"\");\n    this.defaultHeaders = defaultHeaders ?? {};\n  }\n\n  async listModels(): Promise<ModelInfo[]> {\n    try {\n      const res = await fetch(`${this.baseURL}/models`, {\n        headers: { ...this.defaultHeaders },\n      });\n      if (!res.ok) return [];\n      const data = await res.json();\n      const models = data.data ?? data.models ?? [];\n      return models.map((m: Record<string, unknown>) => this.parseModel(m));\n    } catch {\n      return [];\n    }\n  }\n\n  async benchmark(modelId: string, config: BenchmarkConfig, apiKey: string, baseURL?: string): Promise<BenchmarkResult> {\n    const base = baseURL ?? this.baseURL;\n    const headers: Record<string, string> = {\n      \"Content-Type\": \"application/json\",\n      ...this.defaultHeaders,\n    };\n    if (apiKey) headers[\"Authorization\"] = `Bearer ${apiKey}`;\n\n    const results: Array<{latencyMs: number; ttftMs: number; outputTokens: number; promptTokens: number; totalTokens: number}> = [];\n\n    for (let run = -config.warmup; run < config.runs; run++) {\n      const start = performance.now();\n      let ttftMs = 0;\n      let firstToken = true;\n\n      try {\n        if (config.streaming) {\n          const res = await fetch(`${base}/chat/completions`, {\n            method: \"POST\",\n            headers,\n            body: JSON.stringify({\n              model: modelId,\n              messages: [{ role: \"user\", content: config.prompt }],\n              max_tokens: config.maxTokens,\n              stream: true,\n            }),\n          });\n\n          let outputTokens = 0;\n          let totalTokens = 0;\n          let promptTokens = 0;\n          let content = \"\";\n          const reader = res.body!.getReader();\n          const decoder = new TextDecoder();\n          let buffer = \"\";\n\n          while (true) {\n            const { done, value } = await reader.read();\n            if (done) break;\n            buffer += decoder.decode(value, { stream: true });\n            const lines = buffer.split(\"\\n\");\n            buffer = lines.pop() ?? \"\";\n\n            for (const line of lines) {\n              if (!line.startsWith(\"data: \")) continue;\n              const d = line.slice(6).trim();\n              if (d === \"[DONE]\") continue;\n              try {\n                const json = JSON.parse(d);\n                const delta = json.choices?.[0]?.delta?.content;\n                if (delta) {\n                  if (firstToken) { ttftMs = performance.now() - start; firstToken = false; }\n                  content += delta;\n                }\n                if (json.usage) {\n                  outputTokens = json.usage.completion_tokens ?? 0;\n                  promptTokens = json.usage.prompt_tokens ?? 0;\n                  totalTokens = json.usage.total_tokens ?? 0;\n                }\n              } catch {}\n            }\n          }\n\n          const latencyMs = performance.now() - start;\n          if (outputTokens === 0) outputTokens = Math.round(content.length / 4);\n\n          if (run >= 0) {\n            results.push({ latencyMs, ttftMs, outputTokens, promptTokens, totalTokens });\n          }\n        } else {\n          const res = await fetch(`${base}/chat/completions`, {\n            method: \"POST\",\n            headers,\n            body: JSON.stringify({\n              model: modelId,\n              messages: [{ role: \"user\", content: config.prompt }],\n              max_tokens: config.maxTokens,\n            }),\n          });\n          const data = await res.json();\n          const latencyMs = performance.now() - start;\n          const outputTokens = data.usage?.completion_tokens ?? 0;\n          const promptTokens = data.usage?.prompt_tokens ?? 0;\n          const totalTokens = data.usage?.total_tokens ?? 0;\n\n          if (run >= 0) {\n            results.push({ latencyMs, ttftMs: latencyMs, outputTokens, promptTokens, totalTokens });\n          }\n        }\n      } catch (e: any) {\n        if (run >= 0) {\n          return {\n            modelId,\n            provider: this.name,\n            latencyMs: 0,\n            ttftMs: 0,\n            outputTokens: 0,\n            totalTokens: 0,\n            tokPerSec: 0,\n            promptTokens: 0,\n            success: false,\n            error: e.message,\n            timestamp: Date.now(),\n          };\n        }\n      }\n    }\n\n    if (results.length === 0) {\n      return {\n        modelId, provider: this.name,\n        latencyMs: 0, ttftMs: 0, outputTokens: 0, totalTokens: 0,\n        tokPerSec: 0, promptTokens: 0, success: false,\n        error: \"No successful runs\", timestamp: Date.now(),\n      };\n    }\n\n    const avgLatency = results.reduce((s, r) => s + r.latencyMs, 0) / results.length;\n    const avgTtft = results.reduce((s, r) => s + r.ttftMs, 0) / results.length;\n    const avgOutput = results.reduce((s, r) => s + r.outputTokens, 0) / results.length;\n    const avgPrompt = results.reduce((s, r) => s + r.promptTokens, 0) / results.length;\n    const avgTotal = results.reduce((s, r) => s + r.totalTokens, 0) / results.length;\n    const tokPerSec = avgOutput > 0 && avgLatency > 0 ? avgOutput / (avgLatency / 1000) : 0;\n\n    return {\n      modelId,\n      provider: this.name,\n      latencyMs: Math.round(avgLatency),\n      ttftMs: Math.round(avgTtft),\n      outputTokens: Math.round(avgOutput),\n      totalTokens: Math.round(avgTotal),\n      tokPerSec: Math.round(tokPerSec * 10) / 10,\n      promptTokens: Math.round(avgPrompt),\n      success: true,\n      timestamp: Date.now(),\n    };\n  }\n\n  async healthCheck(modelId: string, apiKey: string, baseURL?: string): Promise<boolean> {\n    const base = baseURL ?? this.baseURL;\n    const headers: Record<string, string> = { \"Content-Type\": \"application/json\", ...this.defaultHeaders };\n    if (apiKey) headers[\"Authorization\"] = `Bearer ${apiKey}`;\n    try {\n      const res = await fetch(`${base}/chat/completions`, {\n        method: \"POST\",\n        headers,\n        body: JSON.stringify({\n          model: modelId,\n          messages: [{ role: \"user\", content: \"hi\" }],\n          max_tokens: 5,\n        }),\n      });\n      return res.ok;\n    } catch {\n      return false;\n    }\n  }\n\n  private parseModel(m: Record<string, unknown>): ModelInfo {\n    const id = (m.id ?? m.name ?? m.model ?? \"\") as string;\n    const contextWindow = (m.context_length ?? m.context_window ?? m.max_context_length ?? 4096) as number;\n    const maxOutput = (m.max_output_tokens ?? m.max_tokens ?? 4096) as number;\n\n    return {\n      id,\n      name: (m.name ?? m.id ?? id) as string,\n      provider: this.name,\n      contextWindow,\n      maxOutputTokens: maxOutput,\n      supportsToolUse: (m.supports_tool_use ?? m.tool_use ?? true) as boolean,\n      supportsStreaming: true,\n      supportsVision: (m.supports_vision ?? m.vision ?? false) as boolean,\n      supportsThinking: (m.supports_thinking ?? false) as boolean,\n      tags: this.inferTags(id),\n    };\n  }\n\n  private inferTags(id: string): string[] {\n    const tags: string[] = [];\n    const lower = id.toLowerCase();\n    if (lower.includes(\"fast\") || lower.includes(\"flash\") || lower.includes(\"mini\")) tags.push(\"fast\");\n    if (lower.includes(\"cheap\") || lower.includes(\"lite\")) tags.push(\"cheap\");\n    if (lower.includes(\"code\") || lower.includes(\"coder\") || lower.includes(\"morph\")) tags.push(\"code\");\n    if (lower.includes(\"local\") || lower.includes(\"ollama\")) tags.push(\"local\");\n    if (lower.includes(\"vision\") || lower.includes(\"pro\")) tags.push(\"vision\");\n    if (lower.includes(\"think\") || lower.includes(\"reason\")) tags.push(\"thinking\");\n    return tags;\n  }\n}\n\nexport class AnthropicAdapter implements ProviderAdapter {\n  readonly name = \"anthropic\";\n  private apiKey: string;\n\n  constructor(apiKey: string) {\n    this.apiKey = apiKey;\n  }\n\n  async listModels(): Promise<ModelInfo[]> {\n    return [\n      this.makeModel(\"claude-sonnet-4-20250514\", \"Claude Sonnet 4\", 200000, 16384, 3, 15),\n      this.makeModel(\"claude-opus-4-20250514\", \"Claude Opus 4\", 200000, 16384, 15, 75),\n      this.makeModel(\"claude-3-5-haiku-20241022\", \"Claude 3.5 Haiku\", 200000, 8192, 0.8, 4),\n    ];\n  }\n\n  async benchmark(modelId: string, config: BenchmarkConfig, apiKey?: string): Promise<BenchmarkResult> {\n    const key = apiKey ?? this.apiKey;\n    const results: Array<{latencyMs: number; outputTokens: number; promptTokens: number}> = [];\n\n    for (let run = -config.warmup; run < config.runs; run++) {\n      const start = performance.now();\n      try {\n        const res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application/json\",\n            \"x-api-key\": key,\n            \"anthropic-version\": \"2023-06-01\",\n          },\n          body: JSON.stringify({\n            model: modelId,\n            max_tokens: config.maxTokens,\n            messages: [{ role: \"user\", content: config.prompt }],\n          }),\n        });\n        const data = await res.json();\n        const latencyMs = performance.now() - start;\n        if (run >= 0) {\n          results.push({\n            latencyMs,\n            outputTokens: data.usage?.output_tokens ?? 0,\n            promptTokens: data.usage?.input_tokens ?? 0,\n          });\n        }\n      } catch (e: any) {\n        if (run >= 0) {\n          return { modelId, provider: this.name, latencyMs: 0, ttftMs: 0, outputTokens: 0, totalTokens: 0, tokPerSec: 0, promptTokens: 0, success: false, error: e.message, timestamp: Date.now() };\n        }\n      }\n    }\n\n    const avg = {\n      latencyMs: results.reduce((s, r) => s + r.latencyMs, 0) / results.length,\n      outputTokens: results.reduce((s, r) => s + r.outputTokens, 0) / results.length,\n      promptTokens: results.reduce((s, r) => s + r.promptTokens, 0) / results.length,\n    };\n\n    return {\n      modelId, provider: this.name,\n      latencyMs: Math.round(avg.latencyMs),\n      ttftMs: Math.round(avg.latencyMs),\n      outputTokens: Math.round(avg.outputTokens),\n      totalTokens: Math.round(avg.outputTokens + avg.promptTokens),\n      tokPerSec: Math.round((avg.outputTokens / (avg.latencyMs / 1000)) * 10) / 10,\n      promptTokens: Math.round(avg.promptTokens),\n      success: true,\n      timestamp: Date.now(),\n    };\n  }\n\n  async healthCheck(modelId: string, apiKey?: string): Promise<boolean> {\n    const key = apiKey ?? this.apiKey;\n    try {\n      const res = await fetch(\"https://api.anthropic.com/v1/messages\", {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\", \"x-api-key\": key, \"anthropic-version\": \"2023-06-01\" },\n        body: JSON.stringify({ model: modelId, max_tokens: 5, messages: [{ role: \"user\", content: \"hi\" }] }),\n      });\n      return res.ok;\n    } catch { return false; }\n  }\n\n  private makeModel(id: string, name: string, ctx: number, maxOut: number, inputCost: number, outputCost: number): ModelInfo {\n    return {\n      id, name, provider: this.name, contextWindow: ctx, maxOutputTokens: maxOut,\n      supportsToolUse: true, supportsStreaming: true, supportsVision: true, supportsThinking: false,\n      pricing: { inputPerMillion: inputCost, outputPerMillion: outputCost, currency: \"USD\" },\n      tags: [\"code\", \"tool_use\"],\n    };\n  }\n}\n\nexport class GoogleAIAdapter implements ProviderAdapter {\n  readonly name = \"google\";\n  private apiKey: string;\n\n  constructor(apiKey: string) {\n    this.apiKey = apiKey;\n  }\n\n  async listModels(): Promise<ModelInfo[]> {\n    return [\n      this.makeModel(\"gemini-2.5-flash-preview-05-20\", \"Gemini 2.5 Flash\", 1048576, 65536, 0.15, 0.60, [\"fast\", \"code\", \"vision\"]),\n      this.makeModel(\"gemini-2.5-pro-preview-05-06\", \"Gemini 2.5 Pro\", 1048576, 65536, 1.25, 10.0, [\"code\", \"vision\", \"thinking\"]),\n      this.makeModel(\"gemini-2.0-flash\", \"Gemini 2.0 Flash\", 1048576, 8192, 0.10, 0.40, [\"fast\", \"cheap\"]),\n    ];\n  }\n\n  async benchmark(modelId: string, config: BenchmarkConfig, apiKey?: string): Promise<BenchmarkResult> {\n    const key = apiKey ?? this.apiKey;\n    const base = \"https://generativelanguage.googleapis.com/v1beta/openai\";\n    const adapter = new OpenAICompatAdapter(this.name, base);\n    return adapter.benchmark(modelId, config, key);\n  }\n\n  async healthCheck(modelId: string, apiKey?: string): Promise<boolean> {\n    const key = apiKey ?? this.apiKey;\n    const adapter = new OpenAICompatAdapter(this.name, \"https://generativelanguage.googleapis.com/v1beta/openai\");\n    return adapter.healthCheck(modelId, key);\n  }\n\n  private makeModel(id: string, name: string, ctx: number, maxOut: number, inputCost: number, outputCost: number, tags: string[]): ModelInfo {\n    return {\n      id, name, provider: this.name, contextWindow: ctx, maxOutputTokens: maxOut,\n      supportsToolUse: true, supportsStreaming: true, supportsVision: true, supportsThinking: tags.includes(\"thinking\"),\n      pricing: { inputPerMillion: inputCost, outputPerMillion: outputCost, currency: \"USD\" },\n      tags,\n    };\n  }\n}\n","import type { ModelInfo, BenchmarkResult, BenchmarkConfig, BenchmarkPreset, SelectionCriteria, RankedModel, ProviderAdapter } from \"./types.js\";\nimport { OpenAICompatAdapter } from \"./adapters.js\";\n\nexport const BENCHMARK_PRESETS: Record<BenchmarkPreset, BenchmarkConfig> = {\n  latency: {\n    prompt: \"Say hello in exactly 10 words.\",\n    maxTokens: 30,\n    runs: 5,\n    warmup: 1,\n    streaming: false,\n  },\n  throughput: {\n    prompt: \"Explain the difference between REST and GraphQL in about 200 words.\",\n    maxTokens: 400,\n    runs: 3,\n    warmup: 1,\n    streaming: false,\n  },\n  code_apply: {\n    prompt: 'Fix the bug in this function. Return ONLY the corrected function.\\n\\ndef add(a, b):\\n    return a - b',\n    maxTokens: 100,\n    runs: 5,\n    warmup: 1,\n    streaming: false,\n  },\n  streaming: {\n    prompt: \"Write a short paragraph about artificial intelligence.\",\n    maxTokens: 200,\n    runs: 3,\n    warmup: 1,\n    streaming: true,\n  },\n};\n\nexport class ModelRegistry {\n  private adapters: Map<string, ProviderAdapter> = new Map();\n  private modelCache: Map<string, ModelInfo[]> = new Map();\n  private benchmarkCache: Map<string, BenchmarkResult> = new Map();\n\n  registerAdapter(adapter: ProviderAdapter): void {\n    this.adapters.set(adapter.name, adapter);\n  }\n\n  registerOpenAICompat(name: string, baseURL: string, headers?: Record<string, string>): void {\n    this.adapters.set(name, new OpenAICompatAdapter(name, baseURL, headers));\n  }\n\n  getAdapter(name: string): ProviderAdapter | undefined {\n    return this.adapters.get(name);\n  }\n\n  listAdapters(): string[] {\n    return [...this.adapters.keys()];\n  }\n\n  async listModels(provider?: string): Promise<ModelInfo[]> {\n    if (provider) {\n      if (this.modelCache.has(provider)) return this.modelCache.get(provider)!;\n      const adapter = this.adapters.get(provider);\n      if (!adapter) return [];\n      const models = await adapter.listModels();\n      this.modelCache.set(provider, models);\n      return models;\n    }\n\n    const all: ModelInfo[] = [];\n    for (const [name, adapter] of this.adapters) {\n      if (this.modelCache.has(name)) {\n        all.push(...this.modelCache.get(name)!);\n      } else {\n        const models = await adapter.listModels();\n        this.modelCache.set(name, models);\n        all.push(...models);\n      }\n    }\n    return all;\n  }\n\n  async benchmark(\n    provider: string,\n    modelId: string,\n    presetOrConfig: BenchmarkPreset | BenchmarkConfig = \"latency\",\n    apiKey?: string,\n    baseURL?: string,\n  ): Promise<BenchmarkResult> {\n    const adapter = this.adapters.get(provider);\n    if (!adapter) throw new Error(`Unknown provider: ${provider}`);\n\n    const config = typeof presetOrConfig === \"string\"\n      ? BENCHMARK_PRESETS[presetOrConfig]\n      : presetOrConfig;\n\n    const result = await adapter.benchmark(modelId, config, apiKey ?? \"\", baseURL);\n    const cacheKey = `${provider}:${modelId}:${typeof presetOrConfig === \"string\" ? presetOrConfig : \"custom\"}`;\n    this.benchmarkCache.set(cacheKey, result);\n    return result;\n  }\n\n  async benchmarkAll(\n    preset: BenchmarkPreset = \"latency\",\n    apiKeys?: Record<string, string>,\n  ): Promise<BenchmarkResult[]> {\n    const results: BenchmarkResult[] = [];\n    const models = await this.listModels();\n\n    for (const model of models) {\n      const adapter = this.adapters.get(model.provider);\n      if (!adapter) continue;\n      const key = apiKeys?.[model.provider] ?? \"\";\n      try {\n        const result = await this.benchmark(model.provider, model.id, preset, key);\n        results.push(result);\n      } catch {\n        results.push({\n          modelId: model.id,\n          provider: model.provider,\n          latencyMs: 0, ttftMs: 0, outputTokens: 0, totalTokens: 0,\n          tokPerSec: 0, promptTokens: 0, success: false,\n          error: \"Benchmark failed\",\n          timestamp: Date.now(),\n        });\n      }\n    }\n\n    return results.sort((a, b) => b.tokPerSec - a.tokPerSec);\n  }\n\n  async healthCheck(provider: string, modelId: string, apiKey?: string): Promise<boolean> {\n    const adapter = this.adapters.get(provider);\n    if (!adapter) return false;\n    return adapter.healthCheck(modelId, apiKey ?? \"\");\n  }\n\n  async recommend(criteria: SelectionCriteria = {}): Promise<RankedModel[]> {\n    const models = await this.listModels();\n    const ranked: RankedModel[] = [];\n\n    for (const model of models) {\n      const { score, reasons } = this.scoreModel(model, criteria);\n\n      if (criteria.minTokPerSec !== undefined || criteria.maxLatencyMs !== undefined) {\n        const cached = this.findBenchmark(model.provider, model.id);\n        if (cached && criteria.minTokPerSec !== undefined && cached.tokPerSec < criteria.minTokPerSec) continue;\n        if (cached && criteria.maxLatencyMs !== undefined && cached.latencyMs > criteria.maxLatencyMs) continue;\n        ranked.push({ model, score, benchmark: cached, reasons });\n      } else {\n        ranked.push({ model, score, reasons });\n      }\n    }\n\n    return ranked.sort((a, b) => b.score - a.score);\n  }\n\n  getCachedBenchmark(provider: string, modelId: string): BenchmarkResult | undefined {\n    return this.findBenchmark(provider, modelId);\n  }\n\n  clearCache(): void {\n    this.modelCache.clear();\n    this.benchmarkCache.clear();\n  }\n\n  private scoreModel(model: ModelInfo, criteria: SelectionCriteria): { score: number; reasons: string[] } {\n    let score = 50;\n    const reasons: string[] = [];\n\n    if (criteria.requireCapabilities) {\n      for (const cap of criteria.requireCapabilities) {\n        if (!model.tags.includes(cap)) {\n          if (cap === \"tool_use\" && !model.supportsToolUse) return { score: 0, reasons: [\"Missing required capability: \" + cap] };\n          if (cap === \"vision\" && !model.supportsVision) return { score: 0, reasons: [\"Missing required capability: \" + cap] };\n        }\n      }\n    }\n\n    if (criteria.minContextWindow && model.contextWindow < criteria.minContextWindow) {\n      return { score: 0, reasons: [`Context window too small: ${model.contextWindow} < ${criteria.minContextWindow}`] };\n    }\n\n    if (criteria.maxInputCostPer1M && model.pricing && model.pricing.inputPerMillion > criteria.maxInputCostPer1M) {\n      return { score: 0, reasons: [`Input cost too high: $${model.pricing.inputPerMillion}/1M > $${criteria.maxInputCostPer1M}/1M`] };\n    }\n\n    if (criteria.maxOutputCostPer1M && model.pricing && model.pricing.outputPerMillion > criteria.maxOutputCostPer1M) {\n      return { score: 0, reasons: [`Output cost too high: $${model.pricing.outputPerMillion}/1M`] };\n    }\n\n    if (criteria.preferFast || criteria.task === \"apply\") {\n      if (model.tags.includes(\"fast\")) { score += 20; reasons.push(\"Fast model\"); }\n      if (model.tags.includes(\"code\")) { score += 15; reasons.push(\"Code-optimized\"); }\n    }\n\n    if (criteria.preferCheap) {\n      if (model.pricing) {\n        const totalCost = model.pricing.inputPerMillion + model.pricing.outputPerMillion;\n        if (totalCost < 1) { score += 25; reasons.push(\"Very cheap\"); }\n        else if (totalCost < 5) { score += 15; reasons.push(\"Affordable\"); }\n      }\n      if (model.tags.includes(\"cheap\")) { score += 10; reasons.push(\"Tagged cheap\"); }\n    }\n\n    if (criteria.preferLocal || criteria.task === \"code\") {\n      if (model.tags.includes(\"local\")) { score += 20; reasons.push(\"Local model\"); }\n    }\n\n    if (criteria.task === \"code\" || criteria.task === \"apply\") {\n      if (model.tags.includes(\"code\")) { score += 20; reasons.push(\"Code-specialized\"); }\n    }\n\n    if (model.contextWindow >= 100000) { score += 5; reasons.push(\"Large context\"); }\n    if (model.supportsToolUse) { score += 5; reasons.push(\"Tool use support\"); }\n    if (model.supportsVision) { score += 3; reasons.push(\"Vision support\"); }\n\n    const cached = this.findBenchmark(model.provider, model.id);\n    if (cached && cached.success) {\n      if (cached.tokPerSec > 1000) { score += 15; reasons.push(`${cached.tokPerSec} tok/s`); }\n      else if (cached.tokPerSec > 100) { score += 10; reasons.push(`${cached.tokPerSec} tok/s`); }\n      else if (cached.tokPerSec > 30) { score += 5; reasons.push(`${cached.tokPerSec} tok/s`); }\n    }\n\n    return { score, reasons };\n  }\n\n  private findBenchmark(provider: string, modelId: string): BenchmarkResult | undefined {\n    for (const [key, result] of this.benchmarkCache) {\n      if (key.startsWith(`${provider}:${modelId}:`)) return result;\n    }\n    return undefined;\n  }\n}\n","import * as os from \"os\";\nimport { execSync } from \"child_process\";\n\nexport interface GPUInfo {\n  name: string;\n  vramGB: number;\n  type: \"nvidia\" | \"amd\" | \"apple-silicon\" | \"intel\";\n}\n\nexport interface ProviderAvailability {\n  name: string;\n  available: boolean;\n  version?: string;\n  endpoint?: string;\n  installedModels?: number;\n}\n\nexport interface InstalledModel {\n  name: string;\n  tag: string;\n  provider: string;\n  sizeGB: number;\n  quantization?: string;\n}\n\nexport interface MachineProfile {\n  hostname: string;\n  platform: string;\n  arch: string;\n  cpuCores: number;\n  cpuModel: string;\n  totalRamGB: number;\n  availableRamGB: number;\n  gpus: GPUInfo[];\n  hasMetal: boolean;\n  providers: ProviderAvailability[];\n  installedModels: InstalledModel[];\n  scannedAt: number;\n}\n\ntype HardwareInfo = Pick<\n  MachineProfile,\n  | \"hostname\"\n  | \"platform\"\n  | \"arch\"\n  | \"cpuCores\"\n  | \"cpuModel\"\n  | \"totalRamGB\"\n  | \"availableRamGB\"\n  | \"gpus\"\n  | \"hasMetal\"\n>;\n\nconst GB = 1024 * 1024 * 1024;\n\nfunction safeExecSync(command: string): string | null {\n  try {\n    return execSync(command, {\n      encoding: \"utf-8\",\n      timeout: 10000,\n      stdio: [\"pipe\", \"pipe\", \"pipe\"],\n    })\n      .trim();\n  } catch {\n    return null;\n  }\n}\n\nexport class MachineInspector {\n  private cachedProfile: MachineProfile | null = null;\n\n  async inspect(): Promise<MachineProfile> {\n    const hardware = await this.detectHardware();\n    const providers = await this.detectProviders();\n    const installedModels = await this.detectInstalledModels();\n\n    this.cachedProfile = {\n      ...hardware,\n      providers,\n      installedModels,\n      scannedAt: Date.now(),\n    };\n\n    return this.cachedProfile;\n  }\n\n  async detectHardware(): Promise<HardwareInfo> {\n    const cpus = os.cpus();\n    const cpuModel = cpus.length > 0 ? cpus[0].model : \"unknown\";\n    const isAppleSilicon = cpuModel.toLowerCase().includes(\"apple\");\n\n    const gpus: GPUInfo[] = [];\n\n    if (isAppleSilicon) {\n      gpus.push({\n        name: cpuModel,\n        vramGB: parseFloat((os.totalmem() / GB).toFixed(2)),\n        type: \"apple-silicon\",\n      });\n    }\n\n    const nvidiaGpus = this.detectNvidiaGPUs();\n    if (nvidiaGpus) {\n      gpus.push(...nvidiaGpus);\n    }\n\n    const amdGpus = this.detectAmdGPUs();\n    if (amdGpus) {\n      gpus.push(...amdGpus);\n    }\n\n    const intelGpus = this.detectIntelGPUs();\n    if (intelGpus) {\n      gpus.push(...intelGpus);\n    }\n\n    return {\n      hostname: os.hostname(),\n      platform: os.platform() as MachineProfile[\"platform\"],\n      arch: os.arch() as MachineProfile[\"arch\"],\n      cpuCores: cpus.length,\n      cpuModel,\n      totalRamGB: parseFloat((os.totalmem() / GB).toFixed(2)),\n      availableRamGB: parseFloat((os.freemem() / GB).toFixed(2)),\n      gpus,\n      hasMetal: isAppleSilicon,\n    };\n  }\n\n  private detectNvidiaGPUs(): GPUInfo[] | null {\n    const output = safeExecSync(\n      'nvidia-smi --query-gpu=name,memory.total --format=csv,noheader,nounits'\n    );\n    if (!output) return null;\n\n    const gpus: GPUInfo[] = [];\n    const lines = output.split(\"\\n\").filter((l) => l.trim().length > 0);\n\n    for (const line of lines) {\n      const parts = line.split(\",\").map((s) => s.trim());\n      if (parts.length < 2) continue;\n      const name = parts[0];\n      const vramMiB = parseFloat(parts[1]);\n      if (isNaN(vramMiB)) continue;\n      gpus.push({\n        name,\n        vramGB: parseFloat((vramMiB / 1024).toFixed(2)),\n        type: \"nvidia\",\n      });\n    }\n\n    return gpus.length > 0 ? gpus : null;\n  }\n\n  private detectAmdGPUs(): GPUInfo[] | null {\n    const output = safeExecSync(\n      \"rocm-smi --showproductname --csv\"\n    );\n    if (!output) return null;\n\n    const gpus: GPUInfo[] = [];\n    const lines = output.split(\"\\n\").filter((l) => l.trim().length > 0);\n\n    for (const line of lines.slice(1)) {\n      const parts = line.split(\",\").map((s) => s.trim());\n      if (parts.length < 2) continue;\n      const name = parts[1] || parts[0];\n      gpus.push({\n        name,\n        vramGB: 0,\n        type: \"amd\",\n      });\n    }\n\n    const vramOutput = safeExecSync(\n      \"rocm-smi --showmeminfo vram --csv\"\n    );\n    if (vramOutput && gpus.length > 0) {\n      const vramLines = vramOutput.split(\"\\n\").filter((l) => l.trim().length > 0);\n      let gpuIndex = 0;\n      for (const vramLine of vramLines.slice(1)) {\n        const vramParts = vramLine.split(\",\").map((s) => s.trim());\n        if (vramParts.length >= 2) {\n          const totalBytes = parseInt(vramParts[1], 10);\n          if (!isNaN(totalBytes) && gpuIndex < gpus.length) {\n            gpus[gpuIndex].vramGB = parseFloat((totalBytes / GB).toFixed(2));\n            gpuIndex++;\n          }\n        }\n      }\n    }\n\n    return gpus.length > 0 ? gpus : null;\n  }\n\n  private detectIntelGPUs(): GPUInfo[] | null {\n    if (os.platform() !== \"linux\") return null;\n\n    const output = safeExecSync(\"lspci -nn 2>/dev/null | grep -i vga\");\n    if (!output) return null;\n\n    const gpus: GPUInfo[] = [];\n    const lines = output.split(\"\\n\").filter((l) => l.trim().length > 0);\n\n    for (const line of lines) {\n      if (line.toLowerCase().includes(\"intel\")) {\n        const match = line.match(/:\\s*(.+)/);\n        const name = match ? match[1].trim() : \"Intel GPU\";\n        gpus.push({\n          name,\n          vramGB: 0,\n          type: \"intel\",\n        });\n      }\n    }\n\n    return gpus.length > 0 ? gpus : null;\n  }\n\n  async detectProviders(): Promise<ProviderAvailability[]> {\n    const providers: ProviderAvailability[] = [];\n\n    providers.push(await this.detectOllama());\n    providers.push(await this.detectLmStudio());\n    providers.push(await this.detectLlamacpp());\n    providers.push(await this.detectAnthropic());\n    providers.push(await this.detectOpenAI());\n\n    return providers;\n  }\n\n  private async detectOllama(): Promise<ProviderAvailability> {\n    const versionOutput = safeExecSync(\"ollama --version\");\n    let version: string | undefined;\n    if (versionOutput) {\n      const match = versionOutput.match(/[\\d.]+/);\n      version = match ? match[0] : undefined;\n    }\n\n    const isInstalled = versionOutput !== null;\n\n    let installedModels: number | undefined;\n    if (isInstalled) {\n      const models = await this.fetchOllamaModels();\n      installedModels = models.length;\n    }\n\n    return {\n      name: \"ollama\",\n      available: isInstalled,\n      version,\n      endpoint: \"http://localhost:11434\",\n      installedModels,\n    };\n  }\n\n  private async detectLmStudio(): Promise<ProviderAvailability> {\n    let version: string | undefined;\n    const lmsOutput = safeExecSync(\"lms version 2>/dev/null || lmstudio --version 2>/dev/null\");\n    if (lmsOutput) {\n      const match = lmsOutput.match(/[\\d.]+/);\n      version = match ? match[0] : undefined;\n    }\n\n    const serverCheck = safeExecSync(\"curl -s -o /dev/null -w '%{http_code}' http://localhost:1234/v1/models\");\n    const isRunning = serverCheck !== null && serverCheck.includes(\"200\");\n\n    let installedModels: number | undefined;\n    if (isRunning) {\n      const models = await this.fetchLmStudioModels();\n      installedModels = models.length;\n    }\n\n    return {\n      name: \"lmstudio\",\n      available: isRunning || lmsOutput !== null,\n      version,\n      endpoint: \"http://localhost:1234\",\n      installedModels,\n    };\n  }\n\n  private async detectLlamacpp(): Promise<ProviderAvailability> {\n    const output = safeExecSync(\"which llama-cli 2>/dev/null || which main 2>/dev/null || which llama.cpp 2>/dev/null\");\n    return {\n      name: \"llamacpp\",\n      available: output !== null,\n    };\n  }\n\n  private async detectAnthropic(): Promise<ProviderAvailability> {\n    const hasApiKey = !!(\n      process.env.ANTHROPIC_API_KEY && process.env.ANTHROPIC_API_KEY.length > 0\n    );\n\n    const cliOutput = safeExecSync(\"claude --version 2>/dev/null\");\n    let version: string | undefined;\n    if (cliOutput) {\n      const match = cliOutput.match(/[\\d.]+/);\n      version = match ? match[0] : undefined;\n    }\n\n    return {\n      name: \"anthropic\",\n      available: hasApiKey || cliOutput !== null,\n      version,\n      endpoint: \"https://api.anthropic.com\",\n    };\n  }\n\n  private async detectOpenAI(): Promise<ProviderAvailability> {\n    const hasApiKey = !!(\n      process.env.OPENAI_API_KEY && process.env.OPENAI_API_KEY.length > 0\n    );\n\n    const cliOutput = safeExecSync(\"openai --version 2>/dev/null\");\n    let version: string | undefined;\n    if (cliOutput) {\n      const match = cliOutput.match(/[\\d.]+/);\n      version = match ? match[0] : undefined;\n    }\n\n    return {\n      name: \"openai\",\n      available: hasApiKey || cliOutput !== null,\n      version,\n      endpoint: \"https://api.openai.com\",\n    };\n  }\n\n  async detectInstalledModels(): Promise<InstalledModel[]> {\n    const models: InstalledModel[] = [];\n\n    const ollamaModels = await this.fetchOllamaModels();\n    models.push(...ollamaModels);\n\n    const lmStudioModels = await this.fetchLmStudioModels();\n    models.push(...lmStudioModels);\n\n    return models;\n  }\n\n  private async fetchOllamaModels(): Promise<InstalledModel[]> {\n    const output = safeExecSync(\"curl -s http://localhost:11434/api/tags\");\n    if (!output) return [];\n\n    try {\n      const parsed = JSON.parse(output);\n      const models: InstalledModel[] = [];\n\n      if (parsed && Array.isArray(parsed.models)) {\n        for (const model of parsed.models) {\n          const name: string = model.name || model.model || \"unknown\";\n          const sizeBytes: number = model.size || 0;\n          const quant: string | undefined = model.details?.quantization_level;\n\n          models.push({\n            name,\n            tag: name,\n            provider: \"ollama\",\n            sizeGB: parseFloat((sizeBytes / GB).toFixed(2)),\n            quantization: quant,\n          });\n        }\n      }\n\n      return models;\n    } catch {\n      return [];\n    }\n  }\n\n  private async fetchLmStudioModels(): Promise<InstalledModel[]> {\n    const output = safeExecSync(\"curl -s http://localhost:1234/v1/models\");\n    if (!output) return [];\n\n    try {\n      const parsed = JSON.parse(output);\n      const models: InstalledModel[] = [];\n\n      if (parsed && Array.isArray(parsed.data)) {\n        for (const model of parsed.data) {\n          const name: string = model.id || \"unknown\";\n\n          models.push({\n            name,\n            tag: name,\n            provider: \"lmstudio\",\n            sizeGB: 0,\n          });\n        }\n      }\n\n      return models;\n    } catch {\n      return [];\n    }\n  }\n\n  getEffectiveVramGB(): number {\n    if (!this.cachedProfile) return 0;\n\n    const appleSilicon = this.cachedProfile.gpus.find(\n      (g) => g.type === \"apple-silicon\"\n    );\n    if (appleSilicon) {\n      return this.cachedProfile.totalRamGB;\n    }\n\n    return this.cachedProfile.gpus.reduce((sum, gpu) => sum + gpu.vramGB, 0);\n  }\n\n  getEffectiveRamGB(): number {\n    if (!this.cachedProfile) return 0;\n    return this.cachedProfile.availableRamGB;\n  }\n\n  canRunModel(minVramGB: number, minRamGB: number): boolean {\n    return this.getEffectiveVramGB() >= minVramGB && this.getEffectiveRamGB() >= minRamGB;\n  }\n\n  toJSON(): string {\n    const profile = this.cachedProfile;\n    if (!profile) {\n      return JSON.stringify({ error: \"no profile; call inspect() first\" });\n    }\n    return JSON.stringify(profile, null, 2);\n  }\n}\n","export type SafetyClass = \"read\" | \"write\" | \"destroy\" | \"network\" | \"execute\";\nexport type Verdict = \"pass\" | \"warn\" | \"block\" | \"escalate\";\n\nexport interface FastPathResult {\n  verdict: Verdict;\n  checks: Array<{\n    rule: string;\n    passed: boolean;\n    severity: \"critical\" | \"warning\" | \"info\";\n    message: string;\n  }>;\n  latencyUs: number;\n}\n\nexport interface SlowPathResult {\n  verdict: Verdict;\n  reasoning: string;\n  invariantChecks: Array<{\n    invariant: string;\n    satisfied: boolean;\n    detail: string;\n  }>;\n  latencyMs: number;\n}\n\nexport interface DualPathVerdict {\n  toolName: string;\n  fastPath: FastPathResult;\n  slowPath?: SlowPathResult;\n  finalVerdict: Verdict;\n  reason?: string;\n  totalLatencyMs: number;\n  pathTaken: \"fast\" | \"fast+slow\";\n}\n\nexport interface ToolOperation {\n  name: string;\n  input: Record<string, unknown>;\n  safetyClass: SafetyClass;\n  targetsFiles: string[];\n}\n\nexport interface RoutingPolicy {\n  alwaysSlowPathFor: SafetyClass[];\n  warnEscalatesToSlow: boolean;\n  consecutiveFailuresTriggerSlow: number;\n  maxConsecutiveFailures: number;\n  firstNTurnsFastOnly: number;\n  fileNotInGraphTriggersSlow: boolean;\n  writeWithoutReadTriggersSlow: boolean;\n}\n\nexport const DEFAULT_ROUTING_POLICY: RoutingPolicy = {\n  alwaysSlowPathFor: [\"destroy\"],\n  warnEscalatesToSlow: true,\n  consecutiveFailuresTriggerSlow: 1,\n  maxConsecutiveFailures: 3,\n  firstNTurnsFastOnly: 3,\n  fileNotInGraphTriggersSlow: true,\n  writeWithoutReadTriggersSlow: true,\n};\n","import type { FastPathResult, Verdict } from \"./types.js\";\nimport type { ToolOperation } from \"./types.js\";\nimport { DANGEROUS_PATTERNS, PATH_TRAVERSAL, SECRET_PATTERNS, DESTRUCTIVE_COMMANDS } from \"./patterns.js\";\n\nexport function runFastPath(operation: ToolOperation, turnCount: number, previousCalls: Array<{ name: string; input: Record<string, unknown> }>): FastPathResult {\n  const start = performance.now();\n  const checks: FastPathResult[\"checks\"] = [];\n\n  checks.push(checkDangerousCommand(operation));\n  checks.push(checkPathTraversal(operation));\n  checks.push(checkSecretExposure(operation));\n  checks.push(checkDestructiveSQL(operation));\n  checks.push(checkRepetitiveCall(operation, previousCalls));\n  checks.push(checkWriteBinary(operation));\n\n  const criticals = checks.filter(c => !c.passed && c.severity === \"critical\");\n  const warnings = checks.filter(c => !c.passed && c.severity === \"warning\");\n\n  let verdict: Verdict;\n  if (criticals.length > 0) {\n    verdict = \"block\";\n  } else if (warnings.length > 0) {\n    verdict = \"warn\";\n  } else {\n    verdict = \"pass\";\n  }\n\n  const latencyUs = (performance.now() - start) * 1000;\n\n  return { verdict, checks, latencyUs };\n}\n\nfunction checkDangerousCommand(op: ToolOperation): FastPathResult[\"checks\"][0] {\n  if (op.safetyClass !== \"execute\") {\n    return { rule: \"dangerous_command\", passed: true, severity: \"info\", message: \"Not a shell command\" };\n  }\n  const command = String(op.input.command ?? op.input.cmd ?? \"\");\n  for (const pattern of DANGEROUS_PATTERNS) {\n    if (pattern.test(command)) {\n      return { rule: \"dangerous_command\", passed: false, severity: \"critical\", message: `Dangerous command: ${pattern.source}` };\n    }\n  }\n  return { rule: \"dangerous_command\", passed: true, severity: \"info\", message: \"Clean\" };\n}\n\nfunction checkPathTraversal(op: ToolOperation): FastPathResult[\"checks\"][0] {\n  const paths = [String(op.input.path ?? \"\"), String(op.input.file_path ?? \"\"), String(op.input.filePath ?? \"\")];\n  for (const p of paths) {\n    for (const pattern of PATH_TRAVERSAL) {\n      if (pattern.test(p)) {\n        return { rule: \"path_traversal\", passed: false, severity: \"critical\", message: `Path traversal: ${p}` };\n      }\n    }\n  }\n  return { rule: \"path_traversal\", passed: true, severity: \"info\", message: \"Clean\" };\n}\n\nfunction checkSecretExposure(op: ToolOperation): FastPathResult[\"checks\"][0] {\n  const serialized = JSON.stringify(op.input);\n  for (const pattern of SECRET_PATTERNS) {\n    if (pattern.test(serialized)) {\n      return { rule: \"secret_exposure\", passed: false, severity: \"critical\", message: \"Secret detected in tool input\" };\n    }\n  }\n  return { rule: \"secret_exposure\", passed: true, severity: \"info\", message: \"Clean\" };\n}\n\nfunction checkDestructiveSQL(op: ToolOperation): FastPathResult[\"checks\"][0] {\n  if (op.safetyClass !== \"execute\") {\n    return { rule: \"destructive_sql\", passed: true, severity: \"info\", message: \"N/A\" };\n  }\n  const command = String(op.input.command ?? \"\").toUpperCase();\n  for (const pattern of DESTRUCTIVE_COMMANDS) {\n    if (command.includes(pattern)) {\n      return { rule: \"destructive_sql\", passed: false, severity: \"critical\", message: `Destructive SQL: ${pattern}` };\n    }\n  }\n  return { rule: \"destructive_sql\", passed: true, severity: \"info\", message: \"Clean\" };\n}\n\nfunction checkRepetitiveCall(op: ToolOperation, previousCalls: Array<{ name: string; input: Record<string, unknown> }>): FastPathResult[\"checks\"][0] {\n  const recent = previousCalls.slice(-5);\n  let identicalCount = 0;\n  for (const prev of recent) {\n    if (prev.name === op.name && JSON.stringify(prev.input) === JSON.stringify(op.input)) {\n      identicalCount++;\n    }\n  }\n  if (identicalCount >= 3) {\n    return { rule: \"repetitive_call\", passed: false, severity: \"warning\", message: `${op.name} called ${identicalCount + 1}x identically` };\n  }\n  return { rule: \"repetitive_call\", passed: true, severity: \"info\", message: \"Clean\" };\n}\n\nfunction checkWriteBinary(op: ToolOperation): FastPathResult[\"checks\"][0] {\n  if (op.safetyClass !== \"write\") {\n    return { rule: \"write_binary\", passed: true, severity: \"info\", message: \"N/A\" };\n  }\n  const content = String(op.input.content ?? \"\");\n  const nonPrintable = content.split(\"\").filter(c => {\n    const code = c.charCodeAt(0);\n    return code < 32 && code !== 10 && code !== 13 && code !== 9;\n  });\n  if (nonPrintable.length > content.length * 0.1) {\n    return { rule: \"write_binary\", passed: false, severity: \"warning\", message: \"Binary content detected\" };\n  }\n  return { rule: \"write_binary\", passed: true, severity: \"info\", message: \"Text content\" };\n}\n","import type { SlowPathResult, Verdict } from \"./types.js\";\nimport type { ToolOperation } from \"./types.js\";\nimport type { WorldModel } from \"./world-model.js\";\n\ninterface Invariant {\n  name: string;\n  check: (op: ToolOperation, worldModel: WorldModel) => { satisfied: boolean; detail: string };\n}\n\nconst INVARIANTS: Invariant[] = [\n  {\n    name: \"write_needs_prior_read\",\n    check: (op, wm) => {\n      if (op.safetyClass !== \"write\") return { satisfied: true, detail: \"Not a write\" };\n      const targets = op.targetsFiles;\n      if (targets.length === 0) return { satisfied: true, detail: \"No file targets identified\" };\n      const unread = targets.filter(f => !wm.hasRead(f) && !wm.hasBeenWritten(f));\n      if (unread.length > 0) {\n        return { satisfied: false, detail: `Writing to file(s) never read: ${unread.join(\", \")}` };\n      }\n      return { satisfied: true, detail: \"All targets previously accessed\" };\n    },\n  },\n  {\n    name: \"file_in_dependency_graph\",\n    check: (op, wm) => {\n      const targets = op.targetsFiles;\n      const unknown = targets.filter(f => !wm.isKnownFile(f));\n      if (op.safetyClass === \"write\" || op.safetyClass === \"destroy\") {\n        if (unknown.length > 0) {\n          return { satisfied: false, detail: `Modifying unknown file(s): ${unknown.join(\", \")}` };\n        }\n      }\n      return { satisfied: true, detail: \"Targets known\" };\n    },\n  },\n  {\n    name: \"no_cascade_destroy\",\n    check: (op, wm) => {\n      if (op.safetyClass !== \"destroy\") return { satisfied: true, detail: \"Not destructive\" };\n      const targets = op.targetsFiles;\n      for (const f of targets) {\n        const deps = wm.getDeps(f);\n        if (deps.length > 0) {\n          return { satisfied: false, detail: `Destroying ${f} would orphan dependents: ${deps.slice(0, 5).join(\", \")}` };\n        }\n      }\n      return { satisfied: true, detail: \"No dependents affected\" };\n    },\n  },\n  {\n    name: \"no_rewrite_after_failure\",\n    check: (op, wm) => {\n      if (op.safetyClass !== \"write\") return { satisfied: true, detail: \"Not a write\" };\n      const recent = wm.getRecentOperations(5);\n      const recentWriteFails = recent.filter(r => r.success === false && r.safetyClass === \"write\");\n      if (recentWriteFails.length >= 2) {\n        return { satisfied: false, detail: `${recentWriteFails.length} recent write failures — agent may be corrupting files` };\n      }\n      return { satisfied: true, detail: \"Write history clean\" };\n    },\n  },\n  {\n    name: \"read_before_destroy\",\n    check: (op, wm) => {\n      if (op.safetyClass !== \"destroy\") return { satisfied: true, detail: \"Not destructive\" };\n      const targets = op.targetsFiles;\n      const unread = targets.filter(f => !wm.hasRead(f));\n      if (unread.length > 0) {\n        return { satisfied: false, detail: `Destroying file(s) without prior read: ${unread.join(\", \")}` };\n      }\n      return { satisfied: true, detail: \"All targets read before destroy\" };\n    },\n  },\n  {\n    name: \"consecutive_failure_cap\",\n    check: (op, wm) => {\n      const failures = wm.getConsecutiveFailures();\n      if (failures >= 3) {\n        return { satisfied: false, detail: `${failures} consecutive tool failures — agent may be stuck` };\n      }\n      return { satisfied: true, detail: `Only ${failures} consecutive failures` };\n    },\n  },\n];\n\nexport function runSlowPath(operation: ToolOperation, worldModel: WorldModel): SlowPathResult {\n  const start = performance.now();\n\n  const invariantChecks = INVARIANTS.map(inv => {\n    const result = inv.check(operation, worldModel);\n    return { invariant: inv.name, satisfied: result.satisfied, detail: result.detail };\n  });\n\n  const violations = invariantChecks.filter(c => !c.satisfied);\n\n  let verdict: Verdict;\n  let reasoning: string;\n\n  if (violations.length === 0) {\n    verdict = \"pass\";\n    reasoning = \"All invariants satisfied\";\n  } else if (violations.some(v => v.invariant === \"no_cascade_destroy\" || v.invariant === \"consecutive_failure_cap\")) {\n    verdict = \"block\";\n    reasoning = violations.map(v => v.detail).join(\"; \");\n  } else {\n    verdict = \"warn\";\n    reasoning = `Invariant warnings: ${violations.map(v => v.invariant).join(\", \")}`;\n  }\n\n  const latencyMs = performance.now() - start;\n\n  return { verdict, reasoning, invariantChecks, latencyMs };\n}\n","import type { ToolOperation } from \"./types.js\";\n\ninterface FileNode {\n  path: string;\n  readAt: number[];\n  writtenAt: number[];\n  deps: Set<string>;\n}\n\nconst MAX_HISTORY = 64;\nconst MAX_FILES = 512;\n\nexport class WorldModel {\n  private files: Map<string, FileNode> = new Map();\n  private history: Array<{\n    turn: number;\n    tool: string;\n    safetyClass: string;\n    files: string[];\n    success: boolean;\n  }> = [];\n  private consecutiveFailures = 0;\n\n  recordRead(filePath: string, turn: number): void {\n    const normalized = this.normalizePath(filePath);\n    const node = this.getOrCreate(normalized);\n    node.readAt.push(turn);\n    if (node.readAt.length > 20) node.readAt.shift();\n    this.evictIfNeeded();\n  }\n\n  recordWrite(filePath: string, turn: number): void {\n    const normalized = this.normalizePath(filePath);\n    const node = this.getOrCreate(normalized);\n    node.writtenAt.push(turn);\n    if (node.writtenAt.length > 20) node.writtenAt.shift();\n    this.evictIfNeeded();\n  }\n\n  recordDep(from: string, to: string): void {\n    const fromNorm = this.normalizePath(from);\n    const toNorm = this.normalizePath(to);\n    const node = this.getOrCreate(fromNorm);\n    node.deps.add(toNorm);\n  }\n\n  recordOperation(turn: number, tool: string, safetyClass: string, files: string[], success: boolean): void {\n    this.history.push({ turn, tool, safetyClass, files, success });\n    if (this.history.length > MAX_HISTORY) {\n      this.history = this.history.slice(-MAX_HISTORY);\n    }\n    if (success) {\n      this.consecutiveFailures = 0;\n    } else {\n      this.consecutiveFailures++;\n    }\n  }\n\n  hasRead(filePath: string): boolean {\n    const node = this.files.get(this.normalizePath(filePath));\n    return node !== undefined && node.readAt.length > 0;\n  }\n\n  hasBeenWritten(filePath: string): boolean {\n    const node = this.files.get(this.normalizePath(filePath));\n    return node !== undefined && node.writtenAt.length > 0;\n  }\n\n  isKnownFile(filePath: string): boolean {\n    return this.files.has(this.normalizePath(filePath));\n  }\n\n  getConsecutiveFailures(): number {\n    return this.consecutiveFailures;\n  }\n\n  getRecentOperations(count: number): typeof this.history {\n    return this.history.slice(-count);\n  }\n\n  getFileHistory(filePath: string): { reads: number[]; writes: number[] } | null {\n    const node = this.files.get(this.normalizePath(filePath));\n    if (!node) return null;\n    return { reads: [...node.readAt], writes: [...node.writtenAt] };\n  }\n\n  getDeps(filePath: string): string[] {\n    const node = this.files.get(this.normalizePath(filePath));\n    return node ? [...node.deps] : [];\n  }\n\n  resolveFiles(operation: ToolOperation): string[] {\n    const paths: string[] = [];\n    for (const key of [\"path\", \"filePath\", \"file_path\", \"file\", \"directory\", \"dir\", \"cwd\"]) {\n      const val = operation.input[key];\n      if (typeof val === \"string\" && val.length > 0) paths.push(val);\n    }\n\n    if (operation.name === \"bash\" && typeof operation.input.command === \"string\") {\n      const cmd = operation.input.command as string;\n      const fileMatches = cmd.matchAll(/['\"]?(\\/?[^\\s'\"<>|;&]+\\.[\\w]+)['\"]?/g);\n      for (const m of fileMatches) {\n        if (m[1] && !m[1].startsWith(\"-\")) paths.push(m[1]);\n      }\n    }\n\n    return [...new Set(paths)];\n  }\n\n  memoryEstimateBytes(): number {\n    let bytes = 0;\n    for (const [path, node] of this.files) {\n      bytes += path.length * 2;\n      bytes += node.readAt.length * 8;\n      bytes += node.writtenAt.length * 8;\n      bytes += node.deps.size * 64;\n    }\n    bytes += this.history.length * 128;\n    return bytes;\n  }\n\n  reset(): void {\n    this.files.clear();\n    this.history = [];\n    this.consecutiveFailures = 0;\n  }\n\n  private normalizePath(p: string): string {\n    return p.replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\").replace(/\\/$/, \"\");\n  }\n\n  private getOrCreate(normalized: string): FileNode {\n    let node = this.files.get(normalized);\n    if (!node) {\n      node = { path: normalized, readAt: [], writtenAt: [], deps: new Set() };\n      this.files.set(normalized, node);\n    }\n    return node;\n  }\n\n  private evictIfNeeded(): void {\n    if (this.files.size <= MAX_FILES) return;\n    let oldest: string | null = null;\n    let oldestTurn = Infinity;\n    for (const [path, node] of this.files) {\n      const lastActivity = Math.max(\n        node.readAt[node.readAt.length - 1] ?? 0,\n        node.writtenAt[node.writtenAt.length - 1] ?? 0,\n      );\n      if (lastActivity < oldestTurn) {\n        oldestTurn = lastActivity;\n        oldest = path;\n      }\n    }\n    if (oldest) this.files.delete(oldest);\n  }\n}\n","import type { DualPathVerdict, RoutingPolicy, Verdict, ToolOperation } from \"./types.js\";\nimport { DEFAULT_ROUTING_POLICY } from \"./types.js\";\nimport { runFastPath } from \"./fast-path.js\";\nimport { runSlowPath } from \"./slow-path.js\";\nimport { WorldModel } from \"./world-model.js\";\n\nconst SAFETY_CLASS_MAP: Record<string, import(\"./types.js\").SafetyClass> = {\n  bash: \"execute\",\n  file_read: \"read\",\n  read_file: \"read\",\n  file_write: \"write\",\n  write_file: \"write\",\n  file_edit: \"write\",\n  edit_file: \"write\",\n  glob: \"read\",\n  grep: \"read\",\n  web_fetch: \"network\",\n  web_search: \"network\",\n  delete_file: \"destroy\",\n};\n\nfunction classifyTool(toolName: string, input: Record<string, unknown>): ToolOperation {\n  const safetyClass = SAFETY_CLASS_MAP[toolName] ?? \"read\";\n  const op: ToolOperation = { name: toolName, input, safetyClass, targetsFiles: [] };\n  return op;\n}\n\nfunction extractTargetFiles(op: ToolOperation): string[] {\n  const paths: string[] = [];\n  for (const key of [\"path\", \"filePath\", \"file_path\", \"file\", \"directory\", \"dir\"]) {\n    const val = op.input[key];\n    if (typeof val === \"string\" && val.length > 0) paths.push(val);\n  }\n  if (op.safetyClass === \"execute\" && typeof op.input.command === \"string\") {\n    const cmd = op.input.command as string;\n    for (const m of cmd.matchAll(/['\"]?(\\/?[^\\s'\"<>|;&]+\\.[\\w]+)['\"]?/g)) {\n      if (m[1] && !m[1].startsWith(\"-\")) paths.push(m[1]);\n    }\n  }\n  return [...new Set(paths)];\n}\n\nfunction shouldRouteToSlow(\n  fastResult: import(\"./types.js\").FastPathResult,\n  operation: ToolOperation,\n  turnCount: number,\n  worldModel: WorldModel,\n  policy: RoutingPolicy,\n): boolean {\n  if (turnCount <= policy.firstNTurnsFastOnly) {\n    return false;\n  }\n\n  if (policy.alwaysSlowPathFor.includes(operation.safetyClass)) {\n    return true;\n  }\n\n  if (policy.warnEscalatesToSlow && fastResult.verdict === \"warn\") {\n    return true;\n  }\n\n  if (worldModel.getConsecutiveFailures() >= policy.consecutiveFailuresTriggerSlow) {\n    return true;\n  }\n\n  if (policy.fileNotInGraphTriggersSlow) {\n    for (const f of operation.targetsFiles) {\n      if (!worldModel.isKnownFile(f) && (operation.safetyClass === \"write\" || operation.safetyClass === \"destroy\")) {\n        return true;\n      }\n    }\n  }\n\n  if (policy.writeWithoutReadTriggersSlow && operation.safetyClass === \"write\") {\n    for (const f of operation.targetsFiles) {\n      if (!worldModel.hasRead(f) && !worldModel.hasBeenWritten(f)) {\n        return true;\n      }\n    }\n  }\n\n  return false;\n}\n\nexport class DualPathVerifier {\n  private worldModel: WorldModel;\n  private policy: RoutingPolicy;\n  private previousCalls: Array<{ name: string; input: Record<string, unknown> }> = [];\n\n  constructor(worldModel?: WorldModel, policy?: Partial<RoutingPolicy>) {\n    this.worldModel = worldModel ?? new WorldModel();\n    this.policy = { ...DEFAULT_ROUTING_POLICY, ...policy };\n  }\n\n  verify(\n    toolName: string,\n    input: Record<string, unknown>,\n    turnCount: number,\n  ): DualPathVerdict {\n    const operation = classifyTool(toolName, input);\n    operation.targetsFiles = extractTargetFiles(operation);\n\n    const totalStart = performance.now();\n\n    const fastResult = runFastPath(operation, turnCount, this.previousCalls);\n\n    if (fastResult.verdict === \"block\") {\n      const totalLatencyMs = performance.now() - totalStart;\n      this.previousCalls.push({ name: toolName, input });\n      return {\n        toolName,\n        fastPath: fastResult,\n        finalVerdict: \"block\",\n        reason: fastResult.checks.filter(c => !c.passed && c.severity === \"critical\").map(c => c.message).join(\"; \"),\n        totalLatencyMs,\n        pathTaken: \"fast\",\n      };\n    }\n\n    const needsSlowPath = shouldRouteToSlow(fastResult, operation, turnCount, this.worldModel, this.policy);\n\n    if (needsSlowPath) {\n      const slowResult = runSlowPath(operation, this.worldModel);\n\n      let finalVerdict: Verdict;\n      if (fastResult.verdict === \"warn\" || slowResult.verdict === \"warn\") {\n        finalVerdict = slowResult.verdict === \"block\" ? \"block\" : \"warn\";\n      } else if (slowResult.verdict === \"block\") {\n        finalVerdict = \"block\";\n      } else {\n        finalVerdict = \"pass\";\n      }\n\n      const totalLatencyMs = performance.now() - totalStart;\n      this.previousCalls.push({ name: toolName, input });\n\n      return {\n        toolName,\n        fastPath: fastResult,\n        slowPath: slowResult,\n        finalVerdict,\n        reason: slowResult.reasoning,\n        totalLatencyMs,\n        pathTaken: \"fast+slow\",\n      };\n    }\n\n    const totalLatencyMs = performance.now() - totalStart;\n    this.previousCalls.push({ name: toolName, input });\n    this.recordOperation(operation, turnCount, true);\n\n    return {\n      toolName,\n      fastPath: fastResult,\n      finalVerdict: fastResult.verdict === \"warn\" ? \"warn\" : \"pass\",\n      reason: fastResult.verdict === \"warn\"\n        ? fastResult.checks.filter(c => !c.passed).map(c => c.message).join(\"; \")\n        : undefined,\n      totalLatencyMs,\n      pathTaken: \"fast\",\n    };\n  }\n\n  recordSuccess(toolName: string, input: Record<string, unknown>, turnCount: number): void {\n    const operation = classifyTool(toolName, input);\n    operation.targetsFiles = extractTargetFiles(operation);\n    this.recordOperation(operation, turnCount, true);\n  }\n\n  recordFailure(toolName: string, input: Record<string, unknown>, turnCount: number): void {\n    const operation = classifyTool(toolName, input);\n    operation.targetsFiles = extractTargetFiles(operation);\n    this.recordOperation(operation, turnCount, false);\n  }\n\n  getWorldModel(): WorldModel {\n    return this.worldModel;\n  }\n\n  getPolicy(): RoutingPolicy {\n    return { ...this.policy };\n  }\n\n  reset(): void {\n    this.worldModel.reset();\n    this.previousCalls = [];\n  }\n\n  private recordOperation(op: ToolOperation, turn: number, success: boolean): void {\n    for (const f of op.targetsFiles) {\n      if (op.safetyClass === \"read\") this.worldModel.recordRead(f, turn);\n      if (op.safetyClass === \"write\") this.worldModel.recordWrite(f, turn);\n    }\n    this.worldModel.recordOperation(turn, op.name, op.safetyClass, op.targetsFiles, success);\n  }\n}\n","import { execSync } from \"node:child_process\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport interface FixLoopConfig {\n  cwd: string;\n  maxIterations: number;\n  buildCommand?: string;\n  testCommand?: string;\n  lintCommand?: string;\n  typecheckCommand?: string;\n  autoDetect: boolean;\n}\n\nexport interface VerificationResult {\n  success: boolean;\n  stage: \"build\" | \"test\" | \"lint\" | \"typecheck\";\n  output: string;\n  errors: ParsedError[];\n  durationMs: number;\n}\n\nexport interface ParsedError {\n  filePath: string;\n  line: number;\n  column?: number;\n  message: string;\n  severity: \"error\" | \"warning\";\n  source: \"tsc\" | \"eslint\" | \"vitest\" | \"jest\" | \"cargo\" | \"go\" | \"generic\";\n}\n\nexport interface FixLoopResult {\n  iterations: number;\n  totalDurationMs: number;\n  finalState: \"success\" | \"failed\" | \"timeout\" | \"aborted\";\n  history: FixIteration[];\n}\n\nexport interface FixIteration {\n  iteration: number;\n  edits: string[];\n  verification: VerificationResult[];\n  errorsFound: number;\n  errorsFixed: number;\n}\n\nexport type FixLoopEvent =\n  | { type: \"editing\"; iteration: number; edits: string[] }\n  | { type: \"verifying\"; iteration: number; stage: string }\n  | { type: \"errors_found\"; iteration: number; errors: ParsedError[] }\n  | { type: \"iteration_complete\"; iteration: number; fixed: number; remaining: number }\n  | { type: \"done\"; result: FixLoopResult };\n\nconst COMMAND_TIMEOUT_MS = 60_000;\n\nexport class FixLoop {\n  private commands: { build?: string; test?: string; lint?: string; typecheck?: string } = {};\n\n  constructor(private config: FixLoopConfig) {\n    if (config.autoDetect) {\n      this.commands = detectCommands(config.cwd);\n    }\n    this.commands = {\n      build: config.buildCommand ?? this.commands.build,\n      test: config.testCommand ?? this.commands.test,\n      lint: config.lintCommand ?? this.commands.lint,\n      typecheck: config.typecheckCommand ?? this.commands.typecheck,\n    };\n  }\n\n  async *run(\n    initialEdits: string[],\n    applyEdit: (description: string) => Promise<void>,\n    verify?: () => Promise<VerificationResult[]>,\n  ): AsyncGenerator<FixLoopEvent> {\n    const startTime = Date.now();\n    const history: FixIteration[] = [];\n    let previousErrors: ParsedError[] = [];\n\n    for (let i = 0; i < this.config.maxIterations; i++) {\n      const edits: string[] = i === 0 ? [...initialEdits] : [];\n\n      yield { type: \"editing\", iteration: i + 1, edits };\n\n      if (i === 0) {\n        for (const edit of initialEdits) {\n          await applyEdit(edit);\n        }\n      }\n\n      const commandList = this.getCommandList();\n      for (const cmd of commandList) {\n        yield { type: \"verifying\", iteration: i + 1, stage: this.detectStage(cmd) };\n      }\n\n      let results: VerificationResult[];\n      if (verify) {\n        results = await verify();\n      } else {\n        results = this.runVerification(this.config.cwd, commandList);\n      }\n\n      const allErrors = results.flatMap((r) => r.errors);\n      const errorsFixed = previousErrors.length > 0\n        ? previousErrors.filter(\n            (prev) => !allErrors.some(\n              (curr) =>\n                curr.filePath === prev.filePath &&\n                curr.line === prev.line &&\n                curr.message === prev.message,\n            ),\n          ).length\n        : 0;\n\n      const iteration: FixIteration = {\n        iteration: i + 1,\n        edits,\n        verification: results,\n        errorsFound: allErrors.length,\n        errorsFixed,\n      };\n      history.push(iteration);\n\n      yield {\n        type: \"iteration_complete\",\n        iteration: i + 1,\n        fixed: errorsFixed,\n        remaining: allErrors.length,\n      };\n\n      if (allErrors.length === 0) {\n        const result: FixLoopResult = {\n          iterations: i + 1,\n          totalDurationMs: Date.now() - startTime,\n          finalState: \"success\",\n          history,\n        };\n        yield { type: \"done\", result };\n        return;\n      }\n\n      previousErrors = allErrors;\n      yield { type: \"errors_found\", iteration: i + 1, errors: allErrors };\n\n      if (i < this.config.maxIterations - 1) {\n        const formatted = formatErrorsForAgent(allErrors);\n        await applyEdit(formatted);\n      }\n    }\n\n    const result: FixLoopResult = {\n      iterations: this.config.maxIterations,\n      totalDurationMs: Date.now() - startTime,\n      finalState: \"timeout\",\n      history,\n    };\n    yield { type: \"done\", result };\n  }\n\n  private getCommandList(): string[] {\n    const cmds: string[] = [];\n    if (this.commands.build) cmds.push(this.commands.build);\n    if (this.commands.typecheck) cmds.push(this.commands.typecheck);\n    if (this.commands.lint) cmds.push(this.commands.lint);\n    if (this.commands.test) cmds.push(this.commands.test);\n    return cmds;\n  }\n\n  runVerification(cwd: string, commands: string[]): VerificationResult[] {\n    const results: VerificationResult[] = [];\n\n    for (const cmd of commands) {\n      const stage = this.detectStage(cmd);\n      const start = Date.now();\n      let output = \"\";\n      let success = false;\n\n      try {\n        output = execSync(cmd, {\n          cwd,\n          timeout: COMMAND_TIMEOUT_MS,\n          encoding: \"utf-8\",\n          stdio: [\"pipe\", \"pipe\", \"pipe\"],\n        }).toString();\n        success = true;\n      } catch (err: unknown) {\n        if (err && typeof err === \"object\" && \"stdout\" in err) {\n          const e = err as { stdout?: Buffer | string; stderr?: Buffer | string };\n          output = [\n            typeof e.stdout === \"string\" ? e.stdout : e.stdout?.toString(\"utf-8\") ?? \"\",\n            typeof e.stderr === \"string\" ? e.stderr : e.stderr?.toString(\"utf-8\") ?? \"\",\n          ].join(\"\\n\");\n        } else if (err instanceof Error) {\n          output = err.message;\n        } else {\n          output = String(err);\n        }\n        success = false;\n      }\n\n      const source = this.detectSource(cmd);\n      const errors = parseErrors(output, source);\n\n      results.push({\n        success: success && errors.length === 0,\n        stage,\n        output,\n        errors,\n        durationMs: Date.now() - start,\n      });\n    }\n\n    return results;\n  }\n\n  private detectStage(cmd: string): \"build\" | \"test\" | \"lint\" | \"typecheck\" {\n    if (cmd.includes(\"test\") || cmd.includes(\"vitest\") || cmd.includes(\"jest\") || cmd.includes(\"pytest\")) return \"test\";\n    if (cmd.includes(\"lint\") || cmd.includes(\"eslint\") || cmd.includes(\"clippy\") || cmd.includes(\"ruff\") || cmd.includes(\"biome\")) return \"lint\";\n    if (cmd.includes(\"tsc\") || cmd.includes(\"--noEmit\") || cmd.includes(\"typecheck\")) return \"typecheck\";\n    return \"build\";\n  }\n\n  private detectSource(cmd: string): \"tsc\" | \"eslint\" | \"vitest\" | \"jest\" | \"cargo\" | \"go\" | \"generic\" {\n    if (cmd.includes(\"tsc\")) return \"tsc\";\n    if (cmd.includes(\"eslint\")) return \"eslint\";\n    if (cmd.includes(\"vitest\")) return \"vitest\";\n    if (cmd.includes(\"jest\")) return \"jest\";\n    if (cmd.includes(\"cargo\")) return \"cargo\";\n    if (cmd.includes(\"go \")) return \"go\";\n    return \"generic\";\n  }\n}\n\nexport function detectCommands(cwd: string): {\n  build?: string;\n  test?: string;\n  lint?: string;\n  typecheck?: string;\n} {\n  const result: { build?: string; test?: string; lint?: string; typecheck?: string } = {};\n\n  if (existsSync(join(cwd, \"package.json\"))) {\n    try {\n      const pkg = JSON.parse(readFileSync(join(cwd, \"package.json\"), \"utf-8\"));\n      const scripts = pkg.scripts ?? {};\n\n      if (scripts.build) result.build = \"npm run build\";\n      if (scripts.test) result.test = \"npm test\";\n      if (scripts.typecheck) {\n        result.typecheck = \"npm run typecheck\";\n      } else if (existsSync(join(cwd, \"tsconfig.json\"))) {\n        result.typecheck = \"npx tsc --noEmit\";\n      }\n\n      if (scripts.lint) {\n        result.lint = \"npm run lint\";\n      } else if (\n        existsSync(join(cwd, \".eslintrc\")) ||\n        existsSync(join(cwd, \".eslintrc.js\")) ||\n        existsSync(join(cwd, \".eslintrc.json\")) ||\n        existsSync(join(cwd, \"eslint.config.js\")) ||\n        existsSync(join(cwd, \"eslint.config.mjs\"))\n      ) {\n        result.lint = \"npx eslint .\";\n      } else if (existsSync(join(cwd, \"biome.json\"))) {\n        result.lint = \"npx biome check .\";\n      }\n\n      if (!result.test) {\n        const devDeps = { ...pkg.devDependencies, ...pkg.dependencies };\n        if (devDeps.vitest) result.test = \"npx vitest run\";\n        else if (devDeps.jest) result.test = \"npx jest\";\n      }\n    } catch {\n      // ignore parse errors\n    }\n  }\n\n  if (existsSync(join(cwd, \"Cargo.toml\"))) {\n    result.build = \"cargo build\";\n    result.test = \"cargo test\";\n    result.lint = \"cargo clippy\";\n  }\n\n  if (existsSync(join(cwd, \"go.mod\"))) {\n    result.build = \"go build ./...\";\n    result.test = \"go test ./...\";\n    try {\n      execSync(\"which golangci-lint\", { encoding: \"utf-8\", timeout: 5000 });\n      result.lint = \"golangci-lint run\";\n    } catch {\n      // golangci-lint not available\n    }\n  }\n\n  if (existsSync(join(cwd, \"Makefile\"))) {\n    try {\n      const makefile = readFileSync(join(cwd, \"Makefile\"), \"utf-8\");\n      if (!result.build && /^\\s*build\\s*:/m.test(makefile)) result.build = \"make build\";\n      if (!result.test && /^\\s*test\\s*:/m.test(makefile)) result.test = \"make test\";\n      if (!result.lint && /^\\s*lint\\s*:/m.test(makefile)) result.lint = \"make lint\";\n    } catch {\n      // ignore\n    }\n  }\n\n  if (\n    existsSync(join(cwd, \"pyproject.toml\")) ||\n    existsSync(join(cwd, \"setup.py\")) ||\n    existsSync(join(cwd, \"setup.cfg\"))\n  ) {\n    if (!result.test) {\n      try {\n        execSync(\"which pytest\", { encoding: \"utf-8\", timeout: 5000 });\n        result.test = \"pytest\";\n      } catch {\n        result.test = \"python -m unittest discover\";\n      }\n    }\n    if (!result.lint) {\n      try {\n        execSync(\"which ruff\", { encoding: \"utf-8\", timeout: 5000 });\n        result.lint = \"ruff check .\";\n      } catch {\n        try {\n          execSync(\"which pylint\", { encoding: \"utf-8\", timeout: 5000 });\n          result.lint = \"pylint src\";\n        } catch {\n          // no linter\n        }\n      }\n    }\n  }\n\n  return result;\n}\n\nexport function parseErrors(output: string, source: string): ParsedError[] {\n  const parsers: Record<string, (out: string) => ParsedError[]> = {\n    tsc: parseTypeScriptErrors,\n    eslint: parseESLintErrors,\n    vitest: parseVitestJestErrors,\n    jest: parseVitestJestErrors,\n    cargo: parseCargoErrors,\n    go: parseGoErrors,\n  };\n\n  const parser = parsers[source] ?? parseGenericErrors;\n  return parser(output);\n}\n\nfunction parseTypeScriptErrors(output: string): ParsedError[] {\n  const errors: ParsedError[] = [];\n  const regex = /^(.+?)\\((\\d+),(\\d+)\\):\\s+(error|warning)\\s+(TS\\d+):\\s+(.+)$/gm;\n  let match: RegExpExecArray | null;\n\n  while ((match = regex.exec(output)) !== null) {\n    errors.push({\n      filePath: match[1],\n      line: Number.parseInt(match[2], 10),\n      column: Number.parseInt(match[3], 10),\n      message: `${match[5]}: ${match[6]}`,\n      severity: match[4] as \"error\" | \"warning\",\n      source: \"tsc\",\n    });\n  }\n\n  return errors;\n}\n\nfunction parseESLintErrors(output: string): ParsedError[] {\n  const errors: ParsedError[] = [];\n  const regex = /^(.+?):(\\d+):(\\d+):\\s+(error|warning)\\s+(.+?)(?:\\s+\\[([^\\]]+)\\])?\\s*$/gm;\n  let match: RegExpExecArray | null;\n\n  while ((match = regex.exec(output)) !== null) {\n    errors.push({\n      filePath: match[1],\n      line: Number.parseInt(match[2], 10),\n      column: Number.parseInt(match[3], 10),\n      message: match[5] + (match[6] ? ` [${match[6]}]` : \"\"),\n      severity: match[4] as \"error\" | \"warning\",\n      source: \"eslint\",\n    });\n  }\n\n  return errors;\n}\n\nfunction parseVitestJestErrors(output: string): ParsedError[] {\n  const errors: ParsedError[] = [];\n  const failBlockRegex = /FAIL\\s+(.+)/g;\n  let match: RegExpExecArray | null;\n\n  while ((match = failBlockRegex.exec(output)) !== null) {\n    const filePath = match[1].trim();\n    const lineMatch = output.match(\n      new RegExp(`(?:at\\\\s+.*?\\\\s+)?\\\\(?${escapeRegex(filePath)}:(\\\\d+)(?::(\\\\d+))?\\\\)?`),\n    );\n\n    const errorMsgMatch = output.match(\n      /(?:Error|AssertionError|expect.*?failed):\\s*(.+?)(?:\\n|$)/,\n    );\n\n    errors.push({\n      filePath,\n      line: lineMatch ? Number.parseInt(lineMatch[1], 10) : 0,\n      column: lineMatch?.[2] ? Number.parseInt(lineMatch[2], 10) : undefined,\n      message: errorMsgMatch?.[1] ?? \"Test failed\",\n      severity: \"error\",\n      source: output.includes(\"vitest\") ? \"vitest\" : \"jest\",\n    });\n  }\n\n  return errors;\n}\n\nfunction parseCargoErrors(output: string): ParsedError[] {\n  const errors: ParsedError[] = [];\n  const regex = /error(?:\\[E\\d+\\])?:\\s+(.+?)\\n\\s*-->\\s+(.+?):(\\d+):(\\d+)/g;\n  let match: RegExpExecArray | null;\n\n  while ((match = regex.exec(output)) !== null) {\n    errors.push({\n      filePath: match[2],\n      line: Number.parseInt(match[3], 10),\n      column: Number.parseInt(match[4], 10),\n      message: match[1],\n      severity: \"error\",\n      source: \"cargo\",\n    });\n  }\n\n  const warnRegex = /warning:\\s+(.+?)\\n\\s*-->\\s+(.+?):(\\d+):(\\d+)/g;\n  while ((match = warnRegex.exec(output)) !== null) {\n    errors.push({\n      filePath: match[2],\n      line: Number.parseInt(match[3], 10),\n      column: Number.parseInt(match[4], 10),\n      message: match[1],\n      severity: \"warning\",\n      source: \"cargo\",\n    });\n  }\n\n  return errors;\n}\n\nfunction parseGoErrors(output: string): ParsedError[] {\n  const errors: ParsedError[] = [];\n  const regex = /^(.+?):(\\d+):(\\d+):\\s+(.+)$/gm;\n  let match: RegExpExecArray | null;\n\n  while ((match = regex.exec(output)) !== null) {\n    const msg = match[4].trim();\n    const severity: \"error\" | \"warning\" = msg.startsWith(\"warning\") ? \"warning\" : \"error\";\n    errors.push({\n      filePath: match[1],\n      line: Number.parseInt(match[2], 10),\n      column: Number.parseInt(match[3], 10),\n      message: msg,\n      severity,\n      source: \"go\",\n    });\n  }\n\n  return errors;\n}\n\nfunction parseGenericErrors(output: string): ParsedError[] {\n  const errors: ParsedError[] = [];\n  const regex = /^(.+?):(\\d+)(?::(\\d+))?:\\s+(error|warning)?:?\\s*(.+)$/gm;\n  let match: RegExpExecArray | null;\n\n  while ((match = regex.exec(output)) !== null) {\n    const msg = match[5] || match[4] || \"\";\n    if (!msg.trim()) continue;\n    errors.push({\n      filePath: match[1],\n      line: Number.parseInt(match[2], 10),\n      column: match[3] ? Number.parseInt(match[3], 10) : undefined,\n      message: msg.trim(),\n      severity: match[4] === \"warning\" ? \"warning\" : \"error\",\n      source: \"generic\",\n    });\n  }\n\n  return errors;\n}\n\nfunction escapeRegex(str: string): string {\n  return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport function formatErrorsForAgent(errors: ParsedError[]): string {\n  if (errors.length === 0) return \"No errors found.\";\n\n  const lines = [`Build/Test failed with ${errors.length} error${errors.length === 1 ? \"\" : \"s\"}:\\n`];\n\n  for (let i = 0; i < errors.length; i++) {\n    const e = errors[i];\n    const loc = e.column\n      ? `${e.filePath}:${e.line}:${e.column}`\n      : `${e.filePath}:${e.line}`;\n    const sev = e.severity === \"warning\" ? \"warning\" : \"error\";\n    lines.push(`${i + 1}. ${loc} - ${sev}: ${e.message}`);\n  }\n\n  return lines.join(\"\\n\");\n}\n"],"mappings":"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","names":["fs","path","resolve","promises","newTokens","z","truncateOutput","resolve","import_zod","path","fs","import_promises","import_node_path","import_zod","path","fs","import_promises","import_node_path","import_zod","path","fs","import_promises","import_node_path","import_zod","walkDir","path","relative","fs","import_promises","import_node_path","import_zod","walkDir","path","fs","relative","import_zod","fs","path","SKIP_DIRS","text","similarity","resolve","z","fs","path","import_node_child_process","checkDangerousCommand","checkPathTraversal","checkSecretExposure","checkDestructiveSQL","checkRepetitiveCall","checkWriteBinary","path","totalLatencyMs","import_node_child_process","import_node_path","result"]}