{"version":3,"sources":["../../src/model/index.ts","../../src/model/adapters.ts","../../src/model/registry.ts","../../src/model/catalog.ts","../../src/model/inspector.ts","../../src/model/selector.ts","../../src/model/project.ts"],"sourcesContent":["export { ModelRegistry } from \"./registry.js\";\nexport { OpenAICompatAdapter, AnthropicAdapter, GoogleAIAdapter } from \"./adapters.js\";\nexport { BENCHMARK_PRESETS } from \"./registry.js\";\nexport { MODEL_CATALOG } from \"./catalog.js\";\nexport type { CatalogEntry } from \"./catalog.js\";\nexport { MachineInspector } from \"./inspector.js\";\nexport type { MachineProfile, GPUInfo, ProviderAvailability, InstalledModel } from \"./inspector.js\";\nexport { AutoSelector } from \"./selector.js\";\nexport type { SelectionRequest, SelectionResult, RankedCandidate } from \"./selector.js\";\nexport { ProjectAnalyzer } from \"./project.js\";\nexport type { ProjectProfile, LanguageInfo, FrameworkInfo, ModelRequirements } from \"./project.js\";\nexport type {\n  ModelInfo,\n  ModelPricing,\n  ModelCapability,\n  BenchmarkResult,\n  BenchmarkConfig,\n  BenchmarkPreset,\n  SelectionCriteria,\n  RankedModel,\n  ProviderAdapter,\n} from \"./types.js\";\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 type { ModelInfo } from \"./types.js\";\n\nexport interface CatalogEntry extends ModelInfo {\n  family: string;\n  maker: string;\n  parameterSizes: string[];\n  activeParams?: string;\n  architecture: \"dense\" | \"moe\";\n  quantizations: { name: string; sizeGB: number }[];\n  minVramGB: number;\n  minRamGB: number;\n  benchmarks?: {\n    liveCodeBench?: number;\n    humaneval?: number;\n    mmlu?: number;\n    sweBench?: number;\n    codeforcesElo?: number;\n  };\n  recommendedFor: (\"coding\" | \"reasoning\" | \"chat\" | \"agents\" | \"edge\" | \"fast\" | \"cheap\")[];\n  ollamaTags: string[];\n  ollamaCloud?: boolean;\n  openWeight: boolean;\n  released: string;\n}\n\nexport const MODEL_CATALOG: CatalogEntry[] = [\n  {\n    id: \"gemma4:31b\",\n    name: \"Gemma 4 31B\",\n    family: \"gemma4\",\n    maker: \"Google DeepMind\",\n    provider: \"ollama\",\n    contextWindow: 262144,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: true,\n    supportsThinking: true,\n    parameterSizes: [\"31B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 20 }],\n    minVramGB: 22,\n    minRamGB: 32,\n    benchmarks: { liveCodeBench: 80.0, mmlu: 85.2, sweBench: 52.0, codeforcesElo: 2150 },\n    recommendedFor: [\"coding\", \"reasoning\", \"agents\"],\n    ollamaTags: [\"gemma4:31b\", \"gemma4:latest\"],\n    ollamaCloud: true,\n    openWeight: true,\n    released: \"2026-04\",\n    tags: [\"gemma4\", \"31b\", \"dense\"],\n  },\n  {\n    id: \"gemma4:26b\",\n    name: \"Gemma 4 26B MoE\",\n    family: \"gemma4\",\n    maker: \"Google DeepMind\",\n    provider: \"ollama\",\n    contextWindow: 262144,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: true,\n    supportsThinking: true,\n    parameterSizes: [\"26B\"],\n    activeParams: \"3.8B\",\n    architecture: \"moe\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 18 }],\n    minVramGB: 20,\n    minRamGB: 28,\n    benchmarks: { liveCodeBench: 77.1, mmlu: 82.6, sweBench: 48.0, codeforcesElo: 1718 },\n    recommendedFor: [\"coding\", \"reasoning\", \"agents\", \"fast\"],\n    ollamaTags: [\"gemma4:26b\"],\n    openWeight: true,\n    released: \"2026-04\",\n    tags: [\"gemma4\", \"26b\", \"moe\"],\n  },\n  {\n    id: \"gemma4:e4b\",\n    name: \"Gemma 4 E4B\",\n    family: \"gemma4\",\n    maker: \"Google DeepMind\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: true,\n    supportsThinking: true,\n    parameterSizes: [\"8B\"],\n    activeParams: \"4.5B\",\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 9.6 }],\n    minVramGB: 11,\n    minRamGB: 16,\n    benchmarks: { liveCodeBench: 52.0, mmlu: 69.4, codeforcesElo: 940 },\n    recommendedFor: [\"coding\", \"edge\", \"fast\", \"cheap\"],\n    ollamaTags: [\"gemma4:e4b\"],\n    openWeight: true,\n    released: \"2026-04\",\n    tags: [\"gemma4\", \"e4b\", \"edge\"],\n  },\n  {\n    id: \"gemma4:e2b\",\n    name: \"Gemma 4 E2B\",\n    family: \"gemma4\",\n    maker: \"Google DeepMind\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: true,\n    supportsThinking: true,\n    parameterSizes: [\"5.1B\"],\n    activeParams: \"2.3B\",\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 7.2 }],\n    minVramGB: 8,\n    minRamGB: 12,\n    benchmarks: { liveCodeBench: 44.0, mmlu: 60.0, codeforcesElo: 633 },\n    recommendedFor: [\"edge\", \"fast\", \"cheap\"],\n    ollamaTags: [\"gemma4:e2b\"],\n    openWeight: true,\n    released: \"2026-04\",\n    tags: [\"gemma4\", \"e2b\", \"edge\"],\n  },\n  {\n    id: \"qwen3-coder:30b\",\n    name: \"Qwen3-Coder 30B\",\n    family: \"qwen3-coder\",\n    maker: \"Alibaba\",\n    provider: \"ollama\",\n    contextWindow: 262144,\n    maxOutputTokens: 16384,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: false,\n    parameterSizes: [\"30B\"],\n    activeParams: \"3.3B\",\n    architecture: \"moe\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 19 }],\n    minVramGB: 21,\n    minRamGB: 28,\n    benchmarks: { liveCodeBench: 78.0, humaneval: 90.0, sweBench: 55.0 },\n    recommendedFor: [\"coding\", \"agents\"],\n    ollamaTags: [\"qwen3-coder:30b\", \"qwen3-coder\"],\n    openWeight: true,\n    released: \"2025-10\",\n    tags: [\"qwen3\", \"coder\", \"30b\", \"moe\"],\n  },\n  {\n    id: \"qwen3-coder:480b\",\n    name: \"Qwen3-Coder 480B\",\n    family: \"qwen3-coder\",\n    maker: \"Alibaba\",\n    provider: \"ollama\",\n    contextWindow: 262144,\n    maxOutputTokens: 16384,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: false,\n    parameterSizes: [\"480B\"],\n    architecture: \"moe\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 290 }],\n    minVramGB: 320,\n    minRamGB: 384,\n    recommendedFor: [\"coding\", \"agents\"],\n    ollamaTags: [\"qwen3-coder:480b\"],\n    ollamaCloud: true,\n    openWeight: true,\n    released: \"2025-10\",\n    tags: [\"qwen3\", \"coder\", \"480b\", \"moe\"],\n  },\n  {\n    id: \"qwen3:32b\",\n    name: \"Qwen3 32B\",\n    family: \"qwen3\",\n    maker: \"Alibaba\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"32B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 19 }],\n    minVramGB: 21,\n    minRamGB: 28,\n    benchmarks: { liveCodeBench: 72.0, mmlu: 83.0, sweBench: 45.0 },\n    recommendedFor: [\"coding\", \"reasoning\", \"agents\"],\n    ollamaTags: [\"qwen3:32b\"],\n    openWeight: true,\n    released: \"2025-04\",\n    tags: [\"qwen3\", \"32b\", \"dense\"],\n  },\n  {\n    id: \"qwen3:14b\",\n    name: \"Qwen3 14B\",\n    family: \"qwen3\",\n    maker: \"Alibaba\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"14B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 9 }],\n    minVramGB: 11,\n    minRamGB: 16,\n    benchmarks: { liveCodeBench: 62.0, mmlu: 76.0, sweBench: 35.0 },\n    recommendedFor: [\"coding\", \"reasoning\", \"fast\"],\n    ollamaTags: [\"qwen3:14b\"],\n    openWeight: true,\n    released: \"2025-04\",\n    tags: [\"qwen3\", \"14b\"],\n  },\n  {\n    id: \"qwen3:8b\",\n    name: \"Qwen3 8B\",\n    family: \"qwen3\",\n    maker: \"Alibaba\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"8B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 5 }],\n    minVramGB: 6,\n    minRamGB: 10,\n    benchmarks: { liveCodeBench: 52.0, mmlu: 68.0 },\n    recommendedFor: [\"coding\", \"edge\", \"fast\", \"cheap\"],\n    ollamaTags: [\"qwen3:8b\"],\n    openWeight: true,\n    released: \"2025-04\",\n    tags: [\"qwen3\", \"8b\"],\n  },\n  {\n    id: \"qwen3:4b\",\n    name: \"Qwen3 4B\",\n    family: \"qwen3\",\n    maker: \"Alibaba\",\n    provider: \"ollama\",\n    contextWindow: 32768,\n    maxOutputTokens: 4096,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"4B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 2.5 }],\n    minVramGB: 4,\n    minRamGB: 8,\n    recommendedFor: [\"edge\", \"fast\", \"cheap\"],\n    ollamaTags: [\"qwen3:4b\"],\n    openWeight: true,\n    released: \"2025-04\",\n    tags: [\"qwen3\", \"4b\"],\n  },\n  {\n    id: \"qwen3.5:27b\",\n    name: \"Qwen3.5 27B\",\n    family: \"qwen3.5\",\n    maker: \"Alibaba\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: true,\n    supportsThinking: true,\n    parameterSizes: [\"27B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 16 }],\n    minVramGB: 18,\n    minRamGB: 24,\n    recommendedFor: [\"coding\", \"reasoning\", \"agents\"],\n    ollamaTags: [\"qwen3.5:27b\"],\n    openWeight: true,\n    released: \"2026-03\",\n    tags: [\"qwen3.5\", \"27b\"],\n  },\n  {\n    id: \"deepseek-r1:14b\",\n    name: \"DeepSeek-R1 14B\",\n    family: \"deepseek-r1\",\n    maker: \"DeepSeek\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: false,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"14B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 9 }],\n    minVramGB: 11,\n    minRamGB: 16,\n    benchmarks: { mmlu: 78.0, humaneval: 85.0 },\n    recommendedFor: [\"reasoning\", \"coding\"],\n    ollamaTags: [\"deepseek-r1:14b\"],\n    openWeight: true,\n    released: \"2025-01\",\n    tags: [\"deepseek\", \"r1\", \"14b\"],\n  },\n  {\n    id: \"deepseek-r1:32b\",\n    name: \"DeepSeek-R1 32B\",\n    family: \"deepseek-r1\",\n    maker: \"DeepSeek\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: false,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"32B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 19 }],\n    minVramGB: 21,\n    minRamGB: 28,\n    benchmarks: { mmlu: 84.0, humaneval: 89.0 },\n    recommendedFor: [\"reasoning\", \"coding\"],\n    ollamaTags: [\"deepseek-r1:32b\"],\n    openWeight: true,\n    released: \"2025-01\",\n    tags: [\"deepseek\", \"r1\", \"32b\"],\n  },\n  {\n    id: \"deepseek-r1:70b\",\n    name: \"DeepSeek-R1 70B\",\n    family: \"deepseek-r1\",\n    maker: \"DeepSeek\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: false,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"70B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 40 }],\n    minVramGB: 44,\n    minRamGB: 56,\n    benchmarks: { mmlu: 88.0, humaneval: 92.0 },\n    recommendedFor: [\"reasoning\", \"coding\"],\n    ollamaTags: [\"deepseek-r1:70b\"],\n    openWeight: true,\n    released: \"2025-01\",\n    tags: [\"deepseek\", \"r1\", \"70b\"],\n  },\n  {\n    id: \"devstral-small:24b\",\n    name: \"Devstral Small 2 24B\",\n    family: \"devstral\",\n    maker: \"Mistral AI\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: true,\n    supportsThinking: false,\n    parameterSizes: [\"24B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 14 }],\n    minVramGB: 16,\n    minRamGB: 22,\n    benchmarks: { sweBench: 50.0, liveCodeBench: 70.0 },\n    recommendedFor: [\"coding\", \"agents\"],\n    ollamaTags: [\"devstral-small-2\", \"devstral-small:24b\"],\n    openWeight: true,\n    released: \"2025-06\",\n    tags: [\"devstral\", \"24b\", \"coding\"],\n  },\n  {\n    id: \"glm-4.7-flash\",\n    name: \"GLM-4.7-Flash\",\n    family: \"glm\",\n    maker: \"Z.ai\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"30B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 18 }],\n    minVramGB: 20,\n    minRamGB: 26,\n    benchmarks: { mmlu: 82.0, liveCodeBench: 72.0 },\n    recommendedFor: [\"coding\", \"reasoning\", \"agents\"],\n    ollamaTags: [\"glm-4.7-flash\"],\n    openWeight: true,\n    released: \"2025-08\",\n    tags: [\"glm\", \"30b\"],\n  },\n  {\n    id: \"phi4:14b\",\n    name: \"Phi-4 14B\",\n    family: \"phi\",\n    maker: \"Microsoft\",\n    provider: \"ollama\",\n    contextWindow: 16384,\n    maxOutputTokens: 4096,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: false,\n    parameterSizes: [\"14B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 9 }],\n    minVramGB: 11,\n    minRamGB: 16,\n    benchmarks: { humaneval: 84.0, mmlu: 80.0 },\n    recommendedFor: [\"coding\", \"reasoning\", \"fast\"],\n    ollamaTags: [\"phi4:14b\", \"phi4\"],\n    openWeight: true,\n    released: \"2025-01\",\n    tags: [\"phi\", \"14b\"],\n  },\n  {\n    id: \"phi4-mini:3.8b\",\n    name: \"Phi-4 Mini 3.8B\",\n    family: \"phi\",\n    maker: \"Microsoft\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 4096,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: false,\n    parameterSizes: [\"3.8B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 2.4 }],\n    minVramGB: 4,\n    minRamGB: 8,\n    benchmarks: { humaneval: 72.0, mmlu: 68.0 },\n    recommendedFor: [\"edge\", \"fast\", \"cheap\", \"coding\"],\n    ollamaTags: [\"phi4-mini\"],\n    openWeight: true,\n    released: \"2025-02\",\n    tags: [\"phi\", \"mini\", \"3.8b\"],\n  },\n  {\n    id: \"llama4-scout:17b\",\n    name: \"Llama 4 Scout 17B MoE\",\n    family: \"llama4\",\n    maker: \"Meta\",\n    provider: \"ollama\",\n    contextWindow: 10485760,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: true,\n    supportsThinking: false,\n    parameterSizes: [\"109B\"],\n    activeParams: \"17B\",\n    architecture: \"moe\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 65 }],\n    minVramGB: 72,\n    minRamGB: 88,\n    benchmarks: { mmlu: 84.0, liveCodeBench: 68.0 },\n    recommendedFor: [\"coding\", \"reasoning\", \"agents\"],\n    ollamaTags: [\"llama4-scout\"],\n    openWeight: true,\n    released: \"2025-04\",\n    tags: [\"llama4\", \"scout\", \"moe\"],\n  },\n  {\n    id: \"llama4-maverick:17b\",\n    name: \"Llama 4 Maverick 17B MoE\",\n    family: \"llama4\",\n    maker: \"Meta\",\n    provider: \"ollama\",\n    contextWindow: 1048576,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: true,\n    supportsThinking: false,\n    parameterSizes: [\"400B\"],\n    activeParams: \"17B\",\n    architecture: \"moe\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 240 }],\n    minVramGB: 260,\n    minRamGB: 320,\n    benchmarks: { mmlu: 88.0, liveCodeBench: 75.0 },\n    recommendedFor: [\"reasoning\", \"coding\", \"agents\"],\n    ollamaTags: [\"llama4-maverick\"],\n    openWeight: true,\n    released: \"2025-04\",\n    tags: [\"llama4\", \"maverick\", \"moe\"],\n  },\n  {\n    id: \"mistral-small:24b\",\n    name: \"Mistral Small 24B\",\n    family: \"mistral\",\n    maker: \"Mistral AI\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: false,\n    parameterSizes: [\"24B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 14 }],\n    minVramGB: 16,\n    minRamGB: 22,\n    benchmarks: { mmlu: 78.0, liveCodeBench: 65.0 },\n    recommendedFor: [\"coding\", \"chat\", \"fast\"],\n    ollamaTags: [\"mistral-small:24b\"],\n    openWeight: true,\n    released: \"2025-01\",\n    tags: [\"mistral\", \"24b\"],\n  },\n  {\n    id: \"codestral:22b\",\n    name: \"Codestral 22B\",\n    family: \"codestral\",\n    maker: \"Mistral AI\",\n    provider: \"ollama\",\n    contextWindow: 262144,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: false,\n    parameterSizes: [\"22B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 13 }],\n    minVramGB: 15,\n    minRamGB: 20,\n    benchmarks: { humaneval: 86.0, liveCodeBench: 66.0 },\n    recommendedFor: [\"coding\", \"agents\"],\n    ollamaTags: [\"codestral:22b\", \"codestral\"],\n    openWeight: true,\n    released: \"2025-05\",\n    tags: [\"codestral\", \"22b\", \"coding\"],\n  },\n  {\n    id: \"nemotron-cascade-2:30b\",\n    name: \"Nemotron Cascade 2 30B\",\n    family: \"nemotron\",\n    maker: \"NVIDIA\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"30B\"],\n    activeParams: \"3B\",\n    architecture: \"moe\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 18 }],\n    minVramGB: 20,\n    minRamGB: 26,\n    recommendedFor: [\"reasoning\", \"agents\", \"fast\"],\n    ollamaTags: [\"nemotron-cascade-2\"],\n    openWeight: true,\n    released: \"2026-03\",\n    tags: [\"nemotron\", \"30b\", \"moe\"],\n  },\n  {\n    id: \"lfm2:24b\",\n    name: \"LFM2 24B MoE\",\n    family: \"lfm2\",\n    maker: \"Liquid AI\",\n    provider: \"ollama\",\n    contextWindow: 32768,\n    maxOutputTokens: 4096,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: false,\n    parameterSizes: [\"24B\"],\n    activeParams: \"4B\",\n    architecture: \"moe\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 14 }],\n    minVramGB: 16,\n    minRamGB: 20,\n    recommendedFor: [\"edge\", \"fast\", \"coding\"],\n    ollamaTags: [\"lfm2:24b\", \"lfm2\"],\n    openWeight: true,\n    released: \"2025-09\",\n    tags: [\"lfm2\", \"24b\", \"moe\"],\n  },\n  {\n    id: \"gpt-oss:20b\",\n    name: \"GPT-OSS 20B\",\n    family: \"gpt-oss\",\n    maker: \"OpenAI\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 16384,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"20B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 12 }],\n    minVramGB: 14,\n    minRamGB: 20,\n    recommendedFor: [\"reasoning\", \"coding\", \"agents\"],\n    ollamaTags: [\"gpt-oss:20b\", \"gpt-oss\"],\n    openWeight: true,\n    released: \"2025-08\",\n    tags: [\"gpt-oss\", \"20b\"],\n  },\n  {\n    id: \"gpt-oss:120b\",\n    name: \"GPT-OSS 120B\",\n    family: \"gpt-oss\",\n    maker: \"OpenAI\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 16384,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"120B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 72 }],\n    minVramGB: 80,\n    minRamGB: 96,\n    recommendedFor: [\"reasoning\", \"coding\", \"agents\"],\n    ollamaTags: [\"gpt-oss:120b\"],\n    ollamaCloud: true,\n    openWeight: true,\n    released: \"2025-08\",\n    tags: [\"gpt-oss\", \"120b\"],\n  },\n  {\n    id: \"qwen3:30b-a3b\",\n    name: \"Qwen3 30B-A3B MoE\",\n    family: \"qwen3\",\n    maker: \"Alibaba\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 8192,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: true,\n    parameterSizes: [\"30B\"],\n    activeParams: \"3B\",\n    architecture: \"moe\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 17 }],\n    minVramGB: 19,\n    minRamGB: 24,\n    benchmarks: { liveCodeBench: 65.0, mmlu: 80.0 },\n    recommendedFor: [\"coding\", \"fast\", \"agents\"],\n    ollamaTags: [\"qwen3:30b-a3b\"],\n    openWeight: true,\n    released: \"2025-04\",\n    tags: [\"qwen3\", \"30b\", \"moe\"],\n  },\n  {\n    id: \"ministral-3b\",\n    name: \"Ministral 3B\",\n    family: \"mistral\",\n    maker: \"Mistral AI\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 4096,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: true,\n    supportsThinking: false,\n    parameterSizes: [\"3B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 2 }],\n    minVramGB: 3,\n    minRamGB: 6,\n    recommendedFor: [\"edge\", \"fast\", \"cheap\"],\n    ollamaTags: [\"ministral-3b\"],\n    openWeight: true,\n    released: \"2025-06\",\n    tags: [\"mistral\", \"3b\", \"edge\"],\n  },\n  {\n    id: \"rnj-1:8b\",\n    name: \"Rnj-1 8B\",\n    family: \"rnj\",\n    maker: \"Essential AI\",\n    provider: \"ollama\",\n    contextWindow: 32768,\n    maxOutputTokens: 4096,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: false,\n    parameterSizes: [\"8B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 5 }],\n    minVramGB: 6,\n    minRamGB: 10,\n    recommendedFor: [\"coding\", \"fast\", \"cheap\"],\n    ollamaTags: [\"rnj-1:8b\"],\n    openWeight: true,\n    released: \"2025-09\",\n    tags: [\"rnj\", \"8b\"],\n  },\n  {\n    id: \"olmo-3.1:32b\",\n    name: \"Olmo 3.1 32B\",\n    family: \"olmo\",\n    maker: \"Allen AI\",\n    provider: \"ollama\",\n    contextWindow: 131072,\n    maxOutputTokens: 4096,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: false,\n    supportsThinking: false,\n    parameterSizes: [\"32B\"],\n    architecture: \"dense\",\n    quantizations: [{ name: \"Q4_K_M\", sizeGB: 19 }],\n    minVramGB: 21,\n    minRamGB: 28,\n    recommendedFor: [\"coding\", \"reasoning\"],\n    ollamaTags: [\"olmo-3.1:32b\"],\n    openWeight: true,\n    released: \"2025-10\",\n    tags: [\"olmo\", \"32b\"],\n  },\n  {\n    id: \"claude-sonnet-4-20250514\",\n    name: \"Claude Sonnet 4\",\n    family: \"claude\",\n    maker: \"Anthropic\",\n    provider: \"anthropic\",\n    contextWindow: 200000,\n    maxOutputTokens: 16384,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: true,\n    supportsThinking: true,\n    parameterSizes: [\"proprietary\"],\n    architecture: \"dense\",\n    quantizations: [],\n    minVramGB: 0,\n    minRamGB: 0,\n    benchmarks: { sweBench: 72.0, liveCodeBench: 88.0, mmlu: 90.0 },\n    recommendedFor: [\"coding\", \"reasoning\", \"agents\"],\n    ollamaTags: [],\n    openWeight: false,\n    released: \"2025-05\",\n    tags: [\"claude\", \"sonnet\", \"cloud\"],\n  },\n  {\n    id: \"gpt-4o\",\n    name: \"GPT-4o\",\n    family: \"gpt\",\n    maker: \"OpenAI\",\n    provider: \"openai\",\n    contextWindow: 128000,\n    maxOutputTokens: 16384,\n    supportsToolUse: true,\n    supportsStreaming: true,\n    supportsVision: true,\n    supportsThinking: false,\n    parameterSizes: [\"proprietary\"],\n    architecture: \"dense\",\n    quantizations: [],\n    minVramGB: 0,\n    minRamGB: 0,\n    benchmarks: { sweBench: 65.0, liveCodeBench: 85.0, mmlu: 88.0 },\n    recommendedFor: [\"coding\", \"reasoning\", \"agents\"],\n    ollamaTags: [],\n    openWeight: false,\n    released: \"2024-05\",\n    tags: [\"gpt\", \"4o\", \"cloud\"],\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","import { MODEL_CATALOG, type CatalogEntry } from \"./catalog.js\";\nimport type { MachineProfile, InstalledModel } from \"./inspector.js\";\n\nexport interface SelectionRequest {\n  task: \"coding\" | \"reasoning\" | \"chat\" | \"agents\";\n  projectSize?: \"small\" | \"medium\" | \"large\";\n  preferLocal?: boolean;\n  preferSpeed?: boolean;\n  maxWaitMs?: number;\n}\n\nexport interface SelectionResult {\n  model: string;\n  provider: string;\n  reason: string;\n  confidence: number;\n  alternatives: Array<{ model: string; provider: string; reason: string }>;\n  needsDownload: boolean;\n  estimatedDownloadGB?: number;\n}\n\nexport interface RankedCandidate {\n  model: string;\n  provider: string;\n  score: number;\n  reason: string;\n  needsDownload: boolean;\n  estimatedDownloadGB?: number;\n  installed: boolean;\n  fitsInVram: boolean;\n  fitsInRam: boolean;\n  isMoe: boolean;\n  supportsToolUse: boolean;\n}\n\ninterface Benchmarks {\n  liveCodeBench?: number;\n  sweBench?: number;\n  humaneval?: number;\n  mmlu?: number;\n  codeforcesElo?: number;\n  hasTools?: number;\n  mtBench?: number;\n}\n\nconst CLOUD_PROVIDER_CONFIG: Record<string, () => string | undefined> = {\n  anthropic: () => process.env[\"ANTHROPIC_API_KEY\"],\n  openai: () => process.env[\"OPENAI_API_KEY\"],\n};\n\nconst CLOUD_MODELS: Array<{\n  model: string;\n  provider: string;\n  task: string[];\n  benchmarks: Benchmarks;\n  recommendedFor: string[];\n  supportsToolUse: boolean;\n}> = [\n  {\n    model: \"claude-sonnet-4-20250514\",\n    provider: \"anthropic\",\n    task: [\"coding\", \"reasoning\", \"agents\", \"chat\"],\n    benchmarks: {\n      liveCodeBench: 92,\n      sweBench: 72,\n      humaneval: 96,\n      mmlu: 89,\n      codeforcesElo: 2100,\n      hasTools: 1.0,\n      mtBench: 9.1,\n    },\n    recommendedFor: [\"coding\", \"agents\", \"reasoning\"],\n    supportsToolUse: true,\n  },\n  {\n    model: \"claude-haiku-3-5-20241022\",\n    provider: \"anthropic\",\n    task: [\"coding\", \"chat\"],\n    benchmarks: {\n      liveCodeBench: 78,\n      sweBench: 45,\n      humaneval: 88,\n      mmlu: 84,\n      codeforcesElo: 1500,\n      hasTools: 1.0,\n      mtBench: 8.5,\n    },\n    recommendedFor: [\"chat\", \"coding\"],\n    supportsToolUse: true,\n  },\n  {\n    model: \"gpt-4o\",\n    provider: \"openai\",\n    task: [\"coding\", \"reasoning\", \"agents\", \"chat\"],\n    benchmarks: {\n      liveCodeBench: 86,\n      sweBench: 60,\n      humaneval: 92,\n      mmlu: 88,\n      codeforcesElo: 1900,\n      hasTools: 1.0,\n      mtBench: 9.0,\n    },\n    recommendedFor: [\"coding\", \"reasoning\", \"agents\"],\n    supportsToolUse: true,\n  },\n  {\n    model: \"gpt-4o-mini\",\n    provider: \"openai\",\n    task: [\"coding\", \"chat\"],\n    benchmarks: {\n      liveCodeBench: 72,\n      sweBench: 38,\n      humaneval: 87,\n      mmlu: 82,\n      codeforcesElo: 1400,\n      hasTools: 1.0,\n      mtBench: 8.2,\n    },\n    recommendedFor: [\"chat\"],\n    supportsToolUse: true,\n  },\n];\n\nfunction parseParamSize(sizes: string[]): number {\n  if (sizes.length === 0) return 0;\n  const parsed = sizes\n    .map((s) => {\n      const match = s.match(/([\\d.]+)\\s*(T|B|M|K)?/i);\n      if (!match) return 0;\n      const val = parseFloat(match[1]);\n      const unit = (match[2] ?? \"B\").toUpperCase();\n      if (unit === \"T\") return val * 1000;\n      if (unit === \"B\") return val;\n      if (unit === \"M\") return val / 1000;\n      return val;\n    })\n    .filter((v) => v > 0);\n  return parsed.length > 0 ? Math.max(...parsed) : 0;\n}\n\nexport class AutoSelector {\n  constructor(private profile: MachineProfile) {}\n\n  select(request: SelectionRequest): SelectionResult {\n    const ranked = this.rankAll(request);\n\n    if (ranked.length === 0) {\n      return {\n        model: \"claude-sonnet-4-20250514\",\n        provider: \"anthropic\",\n        reason:\n          \"No local models available or viable. Falling back to Claude Sonnet cloud — ensure ANTHROPIC_API_KEY is set.\",\n        confidence: 0.3,\n        alternatives: [],\n        needsDownload: false,\n      };\n    }\n\n    const top = ranked[0];\n    const alternatives = ranked.slice(1, 4).map((c) => ({\n      model: c.model,\n      provider: c.provider,\n      reason: c.reason,\n    }));\n\n    const confidence = this.computeConfidence(top, ranked);\n\n    return {\n      model: top.model,\n      provider: top.provider,\n      reason: top.reason,\n      confidence,\n      alternatives,\n      needsDownload: top.needsDownload,\n      estimatedDownloadGB: top.estimatedDownloadGB,\n    };\n  }\n\n  rankAll(request: SelectionRequest): RankedCandidate[] {\n    const candidates: RankedCandidate[] = [];\n    const installed = this.profile.installedModels ?? [];\n    const installedTags = new Set(installed.map((m) => m.tag));\n    const effectiveVram = this.resolveEffectiveVram();\n    const availableRam = this.profile.availableRamGB ?? 0;\n\n    for (const entry of MODEL_CATALOG) {\n      for (const tag of entry.ollamaTags) {\n        const isInstalled = installedTags.has(tag);\n        const fitsInVram =\n          entry.minVramGB <= effectiveVram || effectiveVram === 0;\n        const fitsInRam = entry.minRamGB <= availableRam;\n\n        if (!fitsInVram && !fitsInRam) continue;\n\n        const taskScore = this.scoreForTask(entry.benchmarks ?? {}, request.task);\n        const adjustments = this.computeAdjustments(\n          entry,\n          isInstalled,\n          effectiveVram,\n          request\n        );\n        const totalScore = taskScore + adjustments;\n\n        const provider = this.resolveProvider(tag, isInstalled);\n        if (provider === null) continue;\n\n        candidates.push({\n          model: tag,\n          provider,\n          score: totalScore,\n          reason: this.buildReason(entry, request.task, isInstalled, fitsInVram),\n          needsDownload: !isInstalled,\n          estimatedDownloadGB: isInstalled\n            ? undefined\n            : entry.quantizations.length > 0\n            ? entry.quantizations[0].sizeGB\n            : undefined,\n          installed: isInstalled,\n          fitsInVram,\n          fitsInRam,\n          isMoe: entry.architecture === \"moe\",\n          supportsToolUse: entry.supportsToolUse ?? false,\n        });\n      }\n    }\n\n    for (const cloud of CLOUD_MODELS) {\n      if (!cloud.task.includes(request.task)) continue;\n\n      const apiKey = CLOUD_PROVIDER_CONFIG[cloud.provider]?.();\n      if (!apiKey) continue;\n\n      const taskScore = this.scoreForTask(cloud.benchmarks, request.task);\n      const localPenalty = request.preferLocal ? -0.15 : 0;\n      const cloudAdjustment =\n        cloud.supportsToolUse && request.task === \"agents\" ? 0.1 : 0;\n\n      candidates.push({\n        model: cloud.model,\n        provider: cloud.provider,\n        score: taskScore + localPenalty + cloudAdjustment,\n        reason: `Cloud fallback: ${cloud.model} via ${cloud.provider}`,\n        needsDownload: false,\n        installed: false,\n        fitsInVram: false,\n        fitsInRam: false,\n        isMoe: false,\n        supportsToolUse: cloud.supportsToolUse,\n      });\n    }\n\n    candidates.sort((a, b) => b.score - a.score);\n    return candidates;\n  }\n\n  canRunLocally(ollamaTag: string): boolean {\n    const entry = this.findCatalogEntry(ollamaTag);\n    if (!entry) return false;\n\n    const effectiveVram = this.resolveEffectiveVram();\n    return (\n      entry.minVramGB <= effectiveVram ||\n      entry.minRamGB <= (this.profile.availableRamGB ?? 0)\n    );\n  }\n\n  findInstalled(request: SelectionRequest): InstalledModel | null {\n    const installed = this.profile.installedModels ?? [];\n    const taskMap: Record<string, string[]> = {\n      coding: [\"coding\", \"code\", \"programming\"],\n      reasoning: [\"reasoning\", \"math\", \"logic\"],\n      chat: [\"chat\", \"conversation\", \"general\"],\n      agents: [\"agents\", \"tool-use\", \"agentic\", \"coding\"],\n    };\n\n    const keywords = taskMap[request.task] ?? [];\n\n    for (const model of installed) {\n      const entry = this.findCatalogEntry(model.tag);\n      if (!entry) continue;\n\n      const recommended = entry.recommendedFor.map((r) => r.toLowerCase());\n      const matchesTask = recommended.some((r) =>\n        keywords.some((kw) => r.includes(kw))\n      );\n      if (matchesTask) return model;\n    }\n\n    return null;\n  }\n\n  recommendDownload(\n    request: SelectionRequest\n  ): { model: string; sizeGB: number; reason: string } | null {\n    const installed = this.findInstalled(request);\n    if (installed) {\n      return {\n        model: installed.tag,\n        sizeGB: 0,\n        reason: `Already have ${installed.tag} installed for ${request.task}`,\n      };\n    }\n\n    const effectiveVram = this.resolveEffectiveVram();\n    const availableRam = this.profile.availableRamGB ?? 0;\n\n    let best: CatalogEntry | null = null;\n    let bestScore = -Infinity;\n\n    for (const entry of MODEL_CATALOG) {\n      const fitsGpu = entry.minVramGB <= effectiveVram;\n      const fitsCpu = entry.minRamGB <= availableRam;\n      if (!fitsGpu && !fitsCpu) continue;\n\n      if (\n        !entry.recommendedFor.some((r) =>\n          r.toLowerCase().includes(request.task)\n        )\n      )\n        continue;\n\n      const score = this.scoreForTask(entry.benchmarks ?? {}, request.task);\n\n      const downloadSizeGB =\n        entry.quantizations.length > 0 ? entry.quantizations[0].sizeGB : 0;\n      const sizePenalty = downloadSizeGB * 0.02;\n      const adjusted = score - sizePenalty;\n\n      if (adjusted > bestScore) {\n        bestScore = adjusted;\n        best = entry;\n      }\n    }\n\n    if (!best || !best.ollamaTags.length) return null;\n\n    const tag = best.ollamaTags[0];\n    const downloadSize =\n      best.quantizations.length > 0 ? best.quantizations[0].sizeGB : 0;\n    return {\n      model: tag,\n      sizeGB: downloadSize,\n      reason: `Best ${request.task} model that fits your hardware: ${tag} (${best.family}, ${this.summarizeParams(best)})`,\n    };\n  }\n\n  private resolveEffectiveVram(): number {\n    const gpus = this.profile.gpus;\n    if (!gpus || gpus.length === 0) return 0;\n    return gpus.reduce((sum, gpu) => sum + gpu.vramGB, 0);\n  }\n\n  private resolveProvider(\n    ollamaTag: string,\n    isInstalled: boolean\n  ): string | null {\n    const ollamaProvider = this.profile.providers.find(\n      (p) => p.name === \"ollama\" && p.available\n    );\n    if (isInstalled && ollamaProvider) return \"ollama\";\n\n    const lmProvider = this.profile.providers.find(\n      (p) => p.name === \"lmstudio\" && p.available\n    );\n    if (lmProvider) {\n      const lmModels = this.profile.installedModels.filter(\n        (m) => m.provider === \"lmstudio\" && m.tag === ollamaTag\n      );\n      if (lmModels.length > 0) return \"lmstudio\";\n    }\n\n    if (ollamaProvider) return \"ollama\";\n\n    return null;\n  }\n\n  private scoreForTask(benchmarks: Benchmarks, task: string): number {\n    const b = benchmarks;\n    const lc = b.liveCodeBench ?? 0;\n    const swe = b.sweBench ?? 0;\n    const he = b.humaneval ?? 0;\n    const mmlu = b.mmlu ?? 0;\n    const elo = b.codeforcesElo ?? 0;\n    const tools = b.hasTools ?? 0;\n\n    switch (task) {\n      case \"coding\":\n        return lc * 0.5 + swe * 0.3 + he * 0.2;\n      case \"reasoning\":\n        return mmlu * 0.4 + (elo / 2500) * 100 * 0.3 + swe * 0.3;\n      case \"agents\":\n        return swe * 0.5 + lc * 0.3 + tools * 100 * 0.2;\n      case \"chat\":\n        return (\n          (b.mtBench ?? 0) * 10 * 0.5 +\n          mmlu * 0.3 +\n          he * 0.2\n        );\n      default:\n        return lc * 0.4 + swe * 0.3 + mmlu * 0.3;\n    }\n  }\n\n  private computeAdjustments(\n    entry: CatalogEntry,\n    isInstalled: boolean,\n    effectiveVram: number,\n    request: SelectionRequest\n  ): number {\n    let adj = 0;\n\n    if (isInstalled) {\n      adj += 5.0;\n    } else {\n      adj -= 2.0;\n    }\n\n    if (\n      effectiveVram > 0 &&\n      entry.minVramGB > effectiveVram * 0.8\n    ) {\n      const overflow =\n        (entry.minVramGB - effectiveVram * 0.8) / effectiveVram;\n      adj -= overflow * 10;\n    }\n\n    if (entry.architecture === \"moe\" && effectiveVram > 0 && effectiveVram < 16) {\n      const maxParam = parseParamSize(entry.parameterSizes);\n      const activeParam = parseParamSize([entry.activeParams ?? \"0\"]);\n      if (maxParam > 0) {\n        const activeRatio = activeParam / maxParam;\n        adj += (1 - activeRatio) * 3.0;\n      } else {\n        adj += 0.33 * 3.0;\n      }\n    }\n\n    if (request.task === \"agents\" && entry.supportsToolUse) {\n      adj += 4.0;\n    }\n\n    if (request.task === \"agents\" && !entry.supportsToolUse) {\n      adj -= 8.0;\n    }\n\n    if (request.preferSpeed) {\n      const paramCount = parseParamSize(entry.parameterSizes);\n      if (paramCount <= 7) adj += 2.0;\n      else if (paramCount <= 13) adj += 1.0;\n      else if (paramCount >= 70) adj -= 1.5;\n    }\n\n    return adj;\n  }\n\n  private computeConfidence(\n    top: RankedCandidate,\n    ranked: RankedCandidate[]\n  ): number {\n    let conf = 0.5;\n\n    if (top.installed) conf += 0.15;\n    if (top.supportsToolUse) conf += 0.05;\n    if (top.fitsInVram) conf += 0.1;\n\n    if (ranked.length >= 2) {\n      const gap = top.score - ranked[1].score;\n      conf += Math.min(gap / 20, 0.2);\n    }\n\n    if (!top.installed && !top.needsDownload) {\n      conf += 0.05;\n    }\n\n    return Math.max(0, Math.min(1, conf));\n  }\n\n  private buildReason(\n    entry: CatalogEntry,\n    task: string,\n    isInstalled: boolean,\n    fitsInVram: boolean\n  ): string {\n    const parts: string[] = [];\n\n    parts.push(\n      isInstalled\n        ? `Installed ${entry.family}`\n        : `${entry.family} (${this.summarizeParams(entry)})`\n    );\n\n    const b = entry.benchmarks ?? {};\n    const highlights: string[] = [];\n    if (task === \"coding\" && b.liveCodeBench) {\n      highlights.push(`LiveCodeBench ${b.liveCodeBench}`);\n    }\n    if (task === \"reasoning\" && b.mmlu) {\n      highlights.push(`MMLU ${b.mmlu}`);\n    }\n    if ((task === \"coding\" || task === \"agents\") && b.sweBench) {\n      highlights.push(`SWE-bench ${b.sweBench}`);\n    }\n    if (task === \"agents\" && entry.supportsToolUse) {\n      highlights.push(\"tool-use\");\n    }\n    if (entry.architecture === \"moe\") {\n      highlights.push(\"MoE\");\n    }\n\n    if (highlights.length > 0) {\n      parts.push(`[${highlights.join(\", \")}]`);\n    }\n\n    if (!fitsInVram) {\n      parts.push(\"(CPU inference)\");\n    }\n\n    return parts.join(\" \");\n  }\n\n  private summarizeParams(entry: CatalogEntry): string {\n    const sizes = entry.parameterSizes;\n    if (sizes.length === 0) return \"unknown params\";\n    return sizes.join(\"/\");\n  }\n\n  private findCatalogEntry(ollamaTag: string): CatalogEntry | null {\n    for (const entry of MODEL_CATALOG) {\n      if (entry.ollamaTags.includes(ollamaTag)) return entry;\n    }\n    return null;\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"],"mappings":"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","names":["cpus"]}