metrillm-mcp 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +16 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/setup.ts","../src/index.ts","../src/tools.ts","../../src/core/ollama-client.ts","../../src/utils.ts","../../src/core/lm-studio-client.ts","../../src/core/runtime.ts","../../src/commands/bench.ts","../../src/core/hardware.ts","../../src/ui/progress.ts","../../src/ui/terminal.ts","../../src/benchmarks/profile.ts","../../src/benchmarks/performance.ts","../../src/datasets/reasoning.json","../../src/benchmarks/reasoning.ts","../../src/datasets/math.json","../../src/benchmarks/math.ts","../../src/benchmarks/coding.ts","../../src/datasets/coding.json","../../src/datasets/instruction-following.json","../../src/benchmarks/instruction-following.ts","../../src/datasets/structured-output.json","../../src/benchmarks/structured-output.ts","../../src/datasets/multilingual.json","../../src/benchmarks/multilingual.ts","../../src/scoring/performance-scorer.ts","../../src/scoring/quality-scorer.ts","../../src/scoring/fitness.ts","../../src/ui/results-table.ts","../../src/ui/score-color.ts","../../src/ui/verdict.ts","../../src/core/store.ts","../../src/core/submitter.ts","../../src/core/uploader.ts","../../src/ui/share-prompt.ts","../../src/ui/submitter-prompt.ts","../../src/core/telemetry.ts","../../src/ui/thinking-prompt.ts"],"sourcesContent":["// This file MUST be imported before any CLI module to ensure console.log\n// is redirected to stderr before any module-level code runs.\n//\n// MCP uses stdout exclusively for JSON-RPC. The CLI uses console.log for\n// UI output (ora spinners, chalk colors, tables). We redirect console.log\n// to stderr so it doesn't corrupt the JSON-RPC stream.\n\nconsole.log = (...args: unknown[]) => {\n console.error(...args);\n};\n\n// Force disable colors and interactive UI elements\nprocess.env.NO_COLOR = \"1\";\nprocess.env.FORCE_COLOR = \"0\";\n","// IMPORTANT: setup.ts must be imported FIRST — it redirects console.log\n// to stderr before any CLI module can write to stdout at module level.\nimport \"./setup.js\";\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n toolDefinitions,\n listModelsSchema,\n runBenchmarkSchema,\n getResultsSchema,\n shareResultSchema,\n handleListModels,\n handleRunBenchmark,\n handleGetResults,\n handleShareResult,\n} from \"./tools.js\";\n\n// ── MCP Server ──\n\nconst server = new McpServer({\n name: \"metrillm\",\n version: \"0.2.1\",\n});\n\n// Register tools\nfor (const def of toolDefinitions) {\n switch (def.name) {\n case \"list_models\":\n server.tool(\n def.name,\n def.description,\n def.inputSchema.shape,\n async (args) => {\n try {\n const parsed = listModelsSchema.parse(args);\n const result = await handleListModels(parsed);\n return { content: [{ type: \"text\" as const, text: result }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: msg }) }], isError: true };\n }\n }\n );\n break;\n\n case \"run_benchmark\":\n server.tool(\n def.name,\n def.description,\n def.inputSchema.shape,\n async (args) => {\n try {\n const parsed = runBenchmarkSchema.parse(args);\n const result = await handleRunBenchmark(parsed);\n return { content: [{ type: \"text\" as const, text: result }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: msg }) }], isError: true };\n }\n }\n );\n break;\n\n case \"get_results\":\n server.tool(\n def.name,\n def.description,\n def.inputSchema.shape,\n async (args) => {\n try {\n const parsed = getResultsSchema.parse(args);\n const result = await handleGetResults(parsed);\n return { content: [{ type: \"text\" as const, text: result }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: msg }) }], isError: true };\n }\n }\n );\n break;\n\n case \"share_result\":\n server.tool(\n def.name,\n def.description,\n def.inputSchema.shape,\n async (args) => {\n try {\n const parsed = shareResultSchema.parse(args);\n const result = await handleShareResult(parsed);\n return { content: [{ type: \"text\" as const, text: result }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: msg }) }], isError: true };\n }\n }\n );\n break;\n }\n}\n\n// ── Start ──\n\nasync function main(): Promise<void> {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"MetriLLM MCP server running on stdio\");\n}\n\nmain().catch((err) => {\n console.error(\"Fatal error starting MetriLLM MCP server:\", err);\n process.exit(1);\n});\n","import { z } from \"zod\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport {\n listModels,\n getRuntimeDisplayName,\n getRuntimeModelInstallHint,\n setRuntimeByName,\n} from \"../../src/core/runtime.js\";\nimport { benchCommand } from \"../../src/commands/bench.js\";\nimport { uploadBenchResult } from \"../../src/core/uploader.js\";\nimport type { BenchResult } from \"../../src/types.js\";\n\n// ── Schemas ──\n\nconst SUPPORTED_RUNTIMES = [\"ollama\", \"lm-studio\"] as const;\n\nconst runtimeSchema = z\n .enum(SUPPORTED_RUNTIMES)\n .optional()\n .default(\"ollama\")\n .describe(\"Inference runtime to use (ollama | lm-studio).\");\n\nexport const listModelsSchema = z.object({\n runtime: runtimeSchema,\n});\n\nexport const runBenchmarkSchema = z.object({\n model: z.string().describe(\"Model name to benchmark (e.g. 'llama3.2:3b', 'qwen2.5:7b')\"),\n runtime: runtimeSchema,\n perfOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"If true, skip quality benchmarks and only measure speed/memory/TTFT\"),\n});\n\nexport const getResultsSchema = z.object({\n model: z.string().optional().describe(\"Filter results by model name (substring match)\"),\n runtime: runtimeSchema,\n});\n\nexport const shareResultSchema = z.object({\n resultFile: z\n .string()\n .describe(\"Absolute path to a benchmark result JSON file (from ~/.metrillm/results/). Must be inside ~/.metrillm/results/.\"),\n});\n\n// ── Tool definitions for MCP registration ──\n\nexport const toolDefinitions = [\n {\n name: \"list_models\",\n description:\n \"List all LLM models available locally on the inference runtime (e.g. Ollama). \" +\n \"Returns model name, size, parameter count, quantization, and family.\",\n inputSchema: listModelsSchema,\n },\n {\n name: \"run_benchmark\",\n description:\n \"Run an MetriLLM benchmark on a local model. Measures performance (tokens/s, TTFT, memory) \" +\n \"and optionally quality (reasoning, math, coding, instruction following, structured output, multilingual). \" +\n \"Returns a detailed fitness verdict. Warning: benchmarks take 30s to 5+ minutes depending on model size.\",\n inputSchema: runBenchmarkSchema,\n },\n {\n name: \"get_results\",\n description:\n \"Retrieve previously saved benchmark results from ~/.metrillm/results/. \" +\n \"Optionally filter by model name. Returns an array of full benchmark result objects.\",\n inputSchema: getResultsSchema,\n },\n {\n name: \"share_result\",\n description:\n \"Upload a benchmark result to the public MetriLLM leaderboard. \" +\n \"Uses official upload defaults; METRILLM_* environment variables can override for self-hosted deployments. \" +\n \"The resultFile must be an absolute path to a JSON file in ~/.metrillm/results/.\",\n inputSchema: shareResultSchema,\n },\n] as const;\n\n// ── Helpers ──\n\nfunction assertRuntime(runtime: string): void {\n if (!SUPPORTED_RUNTIMES.includes(runtime as (typeof SUPPORTED_RUNTIMES)[number])) {\n throw new Error(\n `Runtime \"${runtime}\" is not yet supported. Currently supported: ${SUPPORTED_RUNTIMES.join(\", \")}. ` +\n \"New runtimes will be added as they become available in the MetriLLM CLI.\"\n );\n }\n}\n\nconst RESULTS_DIR = join(homedir(), \".metrillm\", \"results\");\n\nfunction normalizeResultRuntimeBackend(result: BenchResult): \"ollama\" | \"lm-studio\" {\n const runtimeBackend = result.metadata?.runtimeBackend?.trim().toLowerCase();\n if (runtimeBackend === \"lm-studio\") return \"lm-studio\";\n if (runtimeBackend === \"ollama\") return \"ollama\";\n // Legacy result files (before runtime metadata) are Ollama-only.\n return \"ollama\";\n}\n\n// ── Mutex for benchmark serialization ──\n// The CLI uses a singleton runtime — concurrent benchmarks would corrupt results.\nlet benchLock: Promise<void> = Promise.resolve();\n\nfunction withBenchLock<T>(fn: () => Promise<T>): Promise<T> {\n const prev = benchLock;\n let resolve: () => void;\n benchLock = new Promise<void>((r) => { resolve = r; });\n return prev.then(fn).finally(() => resolve!());\n}\n\n// ── Tool handlers ──\n\nexport async function handleListModels(\n args: z.infer<typeof listModelsSchema>\n): Promise<string> {\n assertRuntime(args.runtime);\n return withBenchLock(async () => {\n setRuntimeByName(args.runtime);\n const runtimeDisplayName = getRuntimeDisplayName(args.runtime);\n const runtimeModelHint = getRuntimeModelInstallHint(args.runtime);\n\n const models = await listModels();\n\n if (models.length === 0) {\n return JSON.stringify({\n models: [],\n message: `No models found on ${runtimeDisplayName}. ${runtimeModelHint}`,\n });\n }\n\n return JSON.stringify({\n models: models.map((m) => ({\n name: m.name,\n size: m.size,\n parameterSize: m.parameterSize ?? null,\n quantization: m.quantization ?? null,\n family: m.family ?? null,\n })),\n count: models.length,\n });\n });\n}\n\nexport async function handleRunBenchmark(\n args: z.infer<typeof runBenchmarkSchema>\n): Promise<string> {\n assertRuntime(args.runtime);\n const runtimeDisplayName = getRuntimeDisplayName(args.runtime);\n\n return withBenchLock(async () => {\n setRuntimeByName(args.runtime);\n const outcome = await benchCommand({\n model: args.model,\n backend: args.runtime,\n perfOnly: args.perfOnly,\n json: true, // suppress all UI output\n share: false, // never auto-share from MCP\n setExitCode: false,\n });\n\n if (outcome.failedModels.length > 0) {\n return JSON.stringify({\n success: false,\n error: `Benchmark failed for: ${outcome.failedModels.join(\", \")}`,\n failedModels: outcome.failedModels,\n });\n }\n\n if (outcome.results.length === 0) {\n return JSON.stringify({\n success: false,\n error: `No results produced. Is ${runtimeDisplayName} running?`,\n });\n }\n\n const result = outcome.results[0];\n return JSON.stringify({\n success: true,\n model: result.model,\n verdict: result.fitness.verdict,\n globalScore: result.fitness.globalScore,\n performance: {\n tokensPerSecond: result.performance.tokensPerSecond,\n ttftMs: result.performance.ttft,\n memoryUsedGB: result.performance.memoryUsedGB,\n memoryPercent: result.performance.memoryPercent,\n },\n performanceScore: result.fitness.performanceScore,\n qualityScore: result.fitness.qualityScore,\n interpretation: result.fitness.interpretation,\n savedLocally: true,\n });\n }); // end withBenchLock\n}\n\nexport async function handleGetResults(\n args: z.infer<typeof getResultsSchema>\n): Promise<string> {\n assertRuntime(args.runtime);\n\n let files: string[];\n try {\n files = await readdir(RESULTS_DIR);\n } catch {\n return JSON.stringify({ results: [], message: \"No results directory found (~/.metrillm/results/)\" });\n }\n\n const jsonFiles = files.filter((f) => f.endsWith(\".json\")).sort();\n\n if (jsonFiles.length === 0) {\n return JSON.stringify({ results: [], message: \"No benchmark results found.\" });\n }\n\n const results: Array<{\n file: string;\n model: string;\n verdict: string;\n globalScore: number | null;\n tokensPerSecond: number;\n timestamp: string;\n }> = [];\n\n for (const file of jsonFiles) {\n try {\n const content = await readFile(join(RESULTS_DIR, file), \"utf8\");\n const result = JSON.parse(content) as BenchResult;\n\n const resultRuntime = normalizeResultRuntimeBackend(result);\n if (resultRuntime !== args.runtime) {\n continue;\n }\n\n if (args.model && !result.model.toLowerCase().includes(args.model.toLowerCase())) {\n continue;\n }\n\n results.push({\n file: join(RESULTS_DIR, file),\n model: result.model,\n verdict: result.fitness.verdict,\n globalScore: result.fitness.globalScore,\n tokensPerSecond: result.performance.tokensPerSecond,\n timestamp: result.timestamp,\n });\n } catch {\n // Skip malformed files\n }\n }\n\n return JSON.stringify({ results, count: results.length });\n}\n\nexport async function handleShareResult(\n args: z.infer<typeof shareResultSchema>\n): Promise<string> {\n // Validate that the file is inside ~/.metrillm/results/ to prevent path traversal\n const { resolve } = await import(\"node:path\");\n const resolvedPath = resolve(args.resultFile);\n const resolvedResultsDir = resolve(RESULTS_DIR);\n if (!resolvedPath.startsWith(resolvedResultsDir + \"/\")) {\n throw new Error(\n `Security: resultFile must be inside ${RESULTS_DIR}/. Got: ${args.resultFile}`\n );\n }\n\n let content: string;\n try {\n content = await readFile(resolvedPath, \"utf8\");\n } catch {\n throw new Error(`Cannot read result file: ${args.resultFile}`);\n }\n\n let result: BenchResult;\n try {\n result = JSON.parse(content) as BenchResult;\n } catch {\n throw new Error(`Invalid JSON in result file: ${args.resultFile}`);\n }\n\n if (!result.model || !result.performance || !result.fitness) {\n throw new Error(\"File does not appear to be a valid MetriLLM benchmark result.\");\n }\n\n const uploaded = await uploadBenchResult(result);\n\n return JSON.stringify({\n success: true,\n id: uploaded.id,\n url: uploaded.url,\n rankGlobalPct: uploaded.rankGlobalPct,\n rankCpuPct: uploaded.rankCpuPct,\n totalCount: uploaded.totalCount,\n });\n}\n","import { Ollama } from \"ollama\";\nimport type { AbortableAsyncIterator, GenerateRequest, GenerateResponse } from \"ollama\";\nimport type { OllamaModel, OllamaRunningModel } from \"../types.js\";\nimport { withTimeout } from \"../utils.js\";\n\nconst client = new Ollama();\nconst DEFAULT_OLLAMA_HOST = \"http://127.0.0.1:11434\";\nconst OLLAMA_INIT_TIMEOUT_MS = 120_000;\nconst DEFAULT_STREAM_STALL_TIMEOUT_MS = 30_000;\nconst SHARED_STREAM_STALL_TIMEOUT_ENV = \"METRILLM_STREAM_STALL_TIMEOUT_MS\";\n\nfunction getOllamaBaseUrl(): string {\n const configured = process.env.OLLAMA_HOST?.trim();\n if (!configured) return DEFAULT_OLLAMA_HOST;\n const candidate = /^https?:\\/\\//i.test(configured) ? configured : `http://${configured}`;\n try {\n return new URL(candidate).toString();\n } catch {\n return DEFAULT_OLLAMA_HOST;\n }\n}\n\nexport async function getOllamaVersion(): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5_000);\n try {\n const baseUrl = getOllamaBaseUrl();\n const url = new URL(\"/api/version\", baseUrl);\n const resp = await fetch(url, { signal: controller.signal });\n if (!resp.ok) return \"unknown\";\n const data = (await resp.json()) as { version?: string };\n return data.version ?? \"unknown\";\n } catch {\n return \"unknown\";\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport async function listModels(): Promise<OllamaModel[]> {\n const resp = await withTimeout(client.list(), OLLAMA_INIT_TIMEOUT_MS, \"Ollama list models\");\n return resp.models.map((m) => ({\n name: m.name,\n size: m.size,\n parameterSize: m.details?.parameter_size,\n quantization: m.details?.quantization_level,\n family: m.details?.family,\n modelFormat: \"gguf\",\n }));\n}\n\nexport async function listRunningModels(): Promise<OllamaRunningModel[]> {\n const resp = await withTimeout(client.ps(), OLLAMA_INIT_TIMEOUT_MS, \"Ollama list running models\");\n return resp.models.map((m) => ({\n name: m.name,\n size: m.size,\n vramUsed: m.size_vram,\n }));\n}\n\nexport interface GenerateResult {\n response: string;\n thinking?: string;\n totalDuration: number; // ns\n loadDuration: number; // ns\n promptEvalCount: number;\n promptEvalDuration: number; // ns\n evalCount: number;\n evalDuration: number; // ns\n evalCountEstimated?: boolean;\n}\n\nexport type KeepAliveValue = string | number;\n\nlet defaultKeepAlive: KeepAliveValue | undefined;\n\nexport function setDefaultKeepAlive(keepAlive?: KeepAliveValue): void {\n defaultKeepAlive = keepAlive;\n}\n\ninterface OllamaRequestOptions {\n temperature?: number;\n top_p?: number;\n seed?: number;\n num_predict?: number;\n keep_alive?: KeepAliveValue;\n think?: boolean;\n stall_timeout_ms?: number;\n}\n\nfunction hasSamplingOverrides(options?: OllamaRequestOptions): boolean {\n return options?.top_p !== undefined || options?.seed !== undefined;\n}\n\nfunction isUnsupportedSamplingOptionError(err: unknown): boolean {\n const message = err instanceof Error ? err.message : String(err);\n const lower = message.toLowerCase();\n const mentionsSampling = /\\b(seed|top_p|topp)\\b/.test(lower);\n if (!mentionsSampling) return false;\n return /unrecognized|unknown|not support|unsupported|invalid|unexpected|additional|extra/.test(lower);\n}\n\nfunction parseNonNegativeInt(value: string): number | null {\n if (!/^\\d+$/.test(value)) return null;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isSafeInteger(parsed) || parsed < 0) return null;\n return parsed;\n}\n\nfunction resolveStreamStallTimeoutMs(override?: number): number | undefined {\n if (override !== undefined) {\n if (!Number.isFinite(override) || override < 0) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n return override === 0 ? undefined : Math.trunc(override);\n }\n\n const configured = process.env[SHARED_STREAM_STALL_TIMEOUT_ENV]?.trim();\n if (!configured) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n const parsed = parseNonNegativeInt(configured);\n if (parsed === null) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n return parsed === 0 ? undefined : parsed;\n}\n\nfunction buildGenerateRequest(\n model: string,\n prompt: string,\n options: OllamaRequestOptions | undefined,\n includeSampling: boolean\n): GenerateRequest & { stream: true } {\n return {\n model,\n prompt,\n stream: true,\n keep_alive: options?.keep_alive ?? defaultKeepAlive,\n ...(options?.think !== undefined ? { think: options.think } : {}),\n options: {\n temperature: options?.temperature ?? 0,\n ...(includeSampling && options?.top_p !== undefined ? { top_p: options.top_p } : {}),\n ...(includeSampling && options?.seed !== undefined ? { seed: options.seed } : {}),\n num_predict: options?.num_predict ?? 512,\n },\n };\n}\n\nexport async function generate(\n model: string,\n prompt: string,\n options?: OllamaRequestOptions\n): Promise<GenerateResult> {\n return generateStream(model, prompt, undefined, options);\n}\n\nexport interface StreamCallbacks {\n onFirstChunk?: () => void;\n onToken?: (token: string) => void;\n onDone?: (result: GenerateResult) => void;\n}\n\nexport async function generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n options?: OllamaRequestOptions\n): Promise<GenerateResult> {\n const stallTimeoutMs = resolveStreamStallTimeoutMs(options?.stall_timeout_ms);\n let abortedByStallTimeout = false;\n const initializeStream = (includeSampling: boolean) =>\n withTimeout(\n client.generate(buildGenerateRequest(model, prompt, options, includeSampling)),\n OLLAMA_INIT_TIMEOUT_MS,\n \"Ollama generate initialization\"\n );\n\n let stream: AbortableAsyncIterator<GenerateResponse>;\n try {\n stream = await initializeStream(true);\n } catch (err) {\n if (hasSamplingOverrides(options) && isUnsupportedSamplingOptionError(err)) {\n stream = await initializeStream(false);\n } else {\n throw err;\n }\n }\n\n let fullResponse = \"\";\n let fullThinking = \"\";\n let result: GenerateResult | null = null;\n let firstChunkSeen = false;\n\n // Stall detection: abort if no chunk arrives within configured timeout.\n let stallTimer: ReturnType<typeof setTimeout> | null = null;\n const resetStallTimer = () => {\n if (stallTimeoutMs === undefined) return;\n if (stallTimer) clearTimeout(stallTimer);\n stallTimer = setTimeout(() => {\n abortedByStallTimeout = true;\n client.abort();\n }, stallTimeoutMs);\n };\n\n try {\n resetStallTimer();\n for await (const chunk of stream) {\n resetStallTimer();\n if (!firstChunkSeen) {\n firstChunkSeen = true;\n callbacks?.onFirstChunk?.();\n }\n const chunkAny = chunk as unknown as Record<string, unknown>;\n if (chunkAny.thinking) {\n fullThinking += String(chunkAny.thinking);\n }\n if (chunk.response) {\n fullResponse += chunk.response;\n callbacks?.onToken?.(chunk.response);\n }\n if (chunk.done) {\n result = {\n response: fullResponse,\n ...(fullThinking ? { thinking: fullThinking } : {}),\n totalDuration: chunk.total_duration ?? 0,\n loadDuration: chunk.load_duration ?? 0,\n promptEvalCount: chunk.prompt_eval_count ?? 0,\n promptEvalDuration: chunk.prompt_eval_duration ?? 0,\n evalCount: chunk.eval_count ?? 0,\n evalDuration: chunk.eval_duration ?? 0,\n };\n }\n }\n } finally {\n if (stallTimer) clearTimeout(stallTimer);\n }\n\n if (!result) {\n if (abortedByStallTimeout && stallTimeoutMs !== undefined) {\n throw new Error(`Ollama stream timed out after ${stallTimeoutMs}ms`);\n }\n throw new Error(\"Stream ended without done signal\");\n }\n\n callbacks?.onDone?.(result);\n return result;\n}\n\nexport async function unloadModel(model: string): Promise<void> {\n await withTimeout(\n client.generate({\n model,\n prompt: \"\",\n stream: false,\n keep_alive: 0,\n options: {\n temperature: 0,\n num_predict: 0,\n },\n }),\n OLLAMA_INIT_TIMEOUT_MS,\n \"Ollama unload model\"\n );\n}\n\nexport function abortOngoingRequests(): void {\n client.abort();\n}\n","import vm from \"node:vm\";\nimport { execFile, spawn } from \"node:child_process\";\n\nexport function openUrl(url: string): void {\n if (process.platform === \"win32\") {\n // `start` is a cmd built-in (not an executable), so we invoke it via cmd.exe.\n const child = spawn(\"cmd\", [\"/c\", \"start\", \"\", url], {\n windowsHide: true,\n stdio: \"ignore\",\n });\n child.on(\"error\", () => {\n // Best-effort only.\n });\n child.unref();\n return;\n }\n\n const cmd = process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\n const child = execFile(cmd, [url]);\n child.on(\"error\", () => {\n // Best-effort only.\n });\n}\n\nexport function avg(nums: number[]): number {\n if (nums.length === 0) return 0;\n return nums.reduce((a, b) => a + b, 0) / nums.length;\n}\n\nexport function stddev(nums: number[]): number {\n if (nums.length < 2) return 0;\n const mean = avg(nums);\n const variance = nums.reduce((sum, v) => sum + (v - mean) ** 2, 0) / nums.length;\n return Math.sqrt(variance);\n}\n\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"0 B\";\n if (bytes === 0) return \"0 B\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.min(\n Math.floor(Math.log(bytes) / Math.log(1024)),\n units.length - 1\n );\n const value = bytes / Math.pow(1024, i);\n return `${value.toFixed(1)} ${units[i]}`;\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n const mins = Math.floor(ms / 60_000);\n const secs = Math.floor((ms % 60_000) / 1000);\n return `${mins}m${secs}s`;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n if (Number.isNaN(value)) return min;\n return Math.min(Math.max(value, min), max);\n}\n\nexport function sanitizeNonNegative(value: number, fallback: number): number {\n if (!Number.isFinite(value) || value < 0) return fallback;\n return value;\n}\n\nexport function lerp(value: number, inMin: number, inMax: number, outMin: number, outMax: number): number {\n if (inMax === inMin) return outMin;\n const t = clamp((value - inMin) / (inMax - inMin), 0, 1);\n return outMin + t * (outMax - outMin);\n}\n\nexport function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n label = \"Operation\",\n onTimeout?: () => void\n): Promise<T> {\n return new Promise((resolve, reject) => {\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n try {\n onTimeout?.();\n } catch {\n // Ignore timeout cleanup errors and preserve timeout as root cause\n }\n reject(new Error(`${label} timed out after ${formatDuration(ms)}`));\n }, ms);\n promise\n .then((v) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(v);\n })\n .catch((e) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n reject(e);\n });\n });\n}\n\nexport function isTimeoutError(err: unknown): boolean {\n return err instanceof Error && /timed out after/i.test(err.message);\n}\n\nexport function toBenchmarkFailureLabel(err: unknown): string {\n if (isTimeoutError(err)) return \"TIMEOUT\";\n const message = err instanceof Error ? err.message : String(err);\n const compact = message.replace(/\\s+/g, \" \").trim();\n if (!compact) return \"ERROR\";\n const maxLen = 120;\n return compact.length > maxLen\n ? `ERROR: ${compact.slice(0, maxLen - 1)}…`\n : `ERROR: ${compact}`;\n}\n\n/**\n * Strip <think>...</think> blocks emitted by reasoning models (e.g. deepseek-r1).\n * Also strips trailing chat-template tokens frequently emitted by local runtimes.\n */\nexport function stripThinkTags(text: string): string {\n // Handle <think>...</think> and <thinking>...</thinking>\n const withoutThinking = text.replace(/<think(?:ing)?[\\s>][\\s\\S]*?<\\/think(?:ing)?>/gi, \"\");\n const withoutTrailingWhitespace = withoutThinking.trimEnd();\n\n // Some backends return chat delimiter tokens in final text; keep only semantic content.\n const withoutTrailingControlTokens = withoutTrailingWhitespace.replace(\n /(?:\\s*(?:<\\|(?:im_end|eot_id|end_of_text|eom_id|end)\\|>|<\\/s>))+$/gi,\n \"\"\n );\n\n return withoutTrailingControlTokens.trim();\n}\n\nexport function hasThinkingContent(response: string, thinkingField?: string): boolean {\n if (thinkingField && thinkingField.trim().length > 0) return true;\n if (/<think(?:ing)?[\\s>]/i.test(response)) return true;\n // Some runtimes emit plain-text reasoning headers instead of dedicated fields/tags.\n return /^\\s*(?:thinking|thought)\\s+process\\s*:/i.test(response);\n}\n\nexport function estimateTokenCount(text: string): number {\n if (!text) return 0;\n return text.split(/\\s+/).filter(Boolean).length;\n}\n\nexport function extractNumber(text: string): number | null {\n const numberPattern = /[-+]?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?(?:e[-+]?\\d+)?/i;\n const numberPatternGlobal = /[-+]?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?(?:e[-+]?\\d+)?/gi;\n const parseNumericToken = (token: string): number | null => {\n const normalized = token.replace(/,/g, \"\");\n const parsed = Number.parseFloat(normalized);\n return Number.isFinite(parsed) ? parsed : null;\n };\n\n // Try common patterns in order of specificity\n\n // \"The answer is X\" pattern\n const answerMatch = text.match(\n new RegExp(`(?:answer|result|total|equals?)\\\\s*(?:is|:)?\\\\s*(${numberPattern.source})`, \"i\")\n );\n if (answerMatch) {\n return parseNumericToken(answerMatch[1]);\n }\n\n // Last number in the text (most likely to be the final answer)\n const allNumbers = text.match(numberPatternGlobal);\n if (allNumbers && allNumbers.length > 0) {\n return parseNumericToken(allNumbers[allNumbers.length - 1]);\n }\n\n return null;\n}\n\nexport function extractChoice(text: string): string | null {\n // Extract a single letter choice (A, B, C, D) from model output\n const cleaned = text.trim();\n\n // Direct single letter\n if (/^[A-D]$/i.test(cleaned)) return cleaned.toUpperCase();\n\n // \"The answer is X\" or \"answer: X\" pattern\n const answerMatch = cleaned.match(/(?:the\\s+)?answer\\s+is\\s+([A-D])\\b/i);\n if (answerMatch) return answerMatch[1].toUpperCase();\n\n // \"Option X\" / \"Choice X\" pattern\n const optionMatch = cleaned.match(/(?:option|choice)\\s*[:\\-]?\\s*([A-D])\\b/i);\n if (optionMatch) return optionMatch[1].toUpperCase();\n\n // \"X)\" or \"X.\" or \"X:\" at start of text (common model response format)\n const prefixMatch = cleaned.match(/^([A-D])[).:](?!\\w)/i);\n if (prefixMatch) return prefixMatch[1].toUpperCase();\n\n // \"I choose B\", \"my answer: C\", \"final answer D\"\n const decisionMatch = cleaned.match(\n /\\b(?:choose|chosen|pick|picked|answer|final answer)\\b[\\s:=\\-]*(?:option|choice)?[\\s:=\\-]*([A-D])\\b/i\n );\n if (decisionMatch) return decisionMatch[1].toUpperCase();\n\n // Last standalone choice at end of response.\n const endMatch = cleaned.match(/\\b([A-D])\\b[\\s.!?]*$/i);\n if (endMatch) return endMatch[1].toUpperCase();\n\n return null;\n}\n\nfunction stripInterfaceDeclarations(code: string): string {\n const interfaceRe = /^\\s*(?:export\\s+)?interface\\s+\\w+(?:<[^>]*>)?\\s*\\{/gm;\n let match: RegExpExecArray | null;\n const ranges: [number, number][] = [];\n while ((match = interfaceRe.exec(code)) !== null) {\n const start = match.index;\n let depth = 0;\n let end = -1;\n for (let i = start + match[0].length - 1; i < code.length; i++) {\n if (code[i] === \"{\") depth++;\n else if (code[i] === \"}\") {\n depth--;\n if (depth === 0) {\n end = i + 1;\n break;\n }\n }\n }\n if (end !== -1) ranges.push([start, end]);\n }\n // Remove ranges in reverse to preserve indices\n let result = code;\n for (let i = ranges.length - 1; i >= 0; i--) {\n const [s, e] = ranges[i];\n result = result.slice(0, s) + result.slice(e);\n }\n return result;\n}\n\n/**\n * Strip TypeScript type annotations from code so it can run in a plain JS vm.Script.\n * Only strips if the code does NOT compile as-is (avoids mangling valid JS).\n */\nexport function stripTypeAnnotations(code: string): string {\n // If it already compiles as JS, leave it alone.\n try {\n new vm.Script(`${code}\\n;`);\n return code;\n } catch {\n // needs stripping\n }\n\n // Strategy 1 (opt-in): Node 22.6+ built-in TS stripping.\n // Disabled by default because Node currently emits an ExperimentalWarning.\n if (process.env.METRILLM_ENABLE_EXPERIMENTAL_TS_STRIP === \"1\") {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require(\"node:module\") as { stripTypeScriptTypes?: (code: string) => string };\n if (typeof mod.stripTypeScriptTypes === \"function\") {\n const stripped = mod.stripTypeScriptTypes(code);\n try {\n new vm.Script(`${stripped}\\n;`);\n return stripped;\n } catch {\n // stripTypeScriptTypes may fail on TS enums etc., fall through\n }\n }\n } catch {\n // node:module API not available, fall through\n }\n }\n\n // Strategy 2: Regex fallback for common LLM-generated TS patterns\n let result = code;\n\n // Remove interface declarations (handles nested braces via balanced counting)\n result = stripInterfaceDeclarations(result);\n // Remove type alias declarations\n result = result.replace(/^\\s*(?:export\\s+)?type\\s+\\w+(?:<[^>]*>)?\\s*=\\s*[^;]+;\\s*$/gm, \"\");\n\n // Strip generic type params on function declarations: function foo<T, U>( → function foo(\n result = result.replace(/(function\\s+\\w+)\\s*<[^>]+>/g, \"$1\");\n\n // Strip generic type params on arrow const: const foo = <T>( → const foo = (\n result = result.replace(/((?:const|let|var)\\s+\\w+\\s*=\\s*)<[^>]+>\\s*\\(/g, \"$1(\");\n\n // Strip return type annotations: ): Type { → ) { and ): Type => → ) =>\n // Supports generic types like Record<string, string[]> by consuming balanced <>\n result = result.replace(/\\)\\s*:\\s*(?:[^=>{,()]|<[^>]*>)+(?=\\s*\\{)/g, \")\");\n result = result.replace(/\\)\\s*:\\s*(?:[^=>{,()]|<[^>]*>)+(?=\\s*=>)/g, \")\");\n\n // Strip parameter type annotations: (a: string, b: number) → (a, b)\n // Only match identifier followed by colon (not destructured objects like {a: 1})\n result = result.replace(/(\\((?:[^()]*\\([^()]*\\))*[^()]*\\))/g, (parenBlock) => {\n return parenBlock.replace(/([A-Za-z_$]\\w*)\\s*:\\s*(?:[^,)=]|<[^>]*>)+/g, (m, name, mOffset) => {\n // Skip if this looks like an object literal key (preceded by { or ,)\n const before = parenBlock.slice(0, mOffset).trimEnd();\n if (before.endsWith(\"{\") || before.endsWith(\",\")) {\n // Could be inside destructured default value — leave it alone\n const afterOpen = parenBlock.lastIndexOf(\"{\", mOffset);\n const afterClose = parenBlock.lastIndexOf(\"}\", mOffset);\n if (afterOpen > afterClose) return m; // inside an object literal\n }\n return name;\n });\n });\n\n // Strip variable type annotations: const x: string = → const x =\n result = result.replace(/((?:const|let|var)\\s+\\w+)\\s*:\\s*(?:[^=;]|<[^>]*>)+(?=\\s*=)/g, \"$1\");\n\n // Strip 'as Type' casts\n result = result.replace(/\\s+as\\s+(?:\\w+(?:<[^>]*>)?(?:\\[\\])*)/g, \"\");\n\n // Strip non-null assertion operator: x!. → x.\n result = result.replace(/(\\w)!\\./g, \"$1.\");\n\n // Check if the stripped version compiles\n try {\n new vm.Script(`${result}\\n;`);\n return result;\n } catch {\n // Regex stripping wasn't enough, return original (will fail in sandbox but\n // that's the same behavior as before this feature)\n return code;\n }\n}\n\nexport function extractCodeBlock(text: string, preferredFunctionName?: string): string {\n const isValidSnippet = (snippet: string): boolean => {\n if (!snippet) return false;\n try {\n new vm.Script(`${snippet}\\n;`);\n return true;\n } catch {\n return false;\n }\n };\n\n function extractBalancedBlock(startIndex: number): string | null {\n const openIndex = text.indexOf(\"{\", startIndex);\n if (openIndex === -1) return null;\n\n let depth = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let inLineComment = false;\n let inBlockComment = false;\n let escaped = false;\n\n for (let i = openIndex; i < text.length; i++) {\n const ch = text[i];\n const next = i + 1 < text.length ? text[i + 1] : \"\";\n\n if (inLineComment) {\n if (ch === \"\\n\") inLineComment = false;\n continue;\n }\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (inSingle) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"'\") inSingle = false;\n continue;\n }\n\n if (inDouble) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"\\\"\") inDouble = false;\n continue;\n }\n\n if (inTemplate) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"`\") inTemplate = false;\n continue;\n }\n\n if (ch === \"/\" && next === \"/\") {\n inLineComment = true;\n i++;\n continue;\n }\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n\n if (ch === \"'\") {\n inSingle = true;\n continue;\n }\n if (ch === \"\\\"\") {\n inDouble = true;\n continue;\n }\n if (ch === \"`\") {\n inTemplate = true;\n continue;\n }\n\n if (ch === \"{\") {\n depth++;\n continue;\n }\n if (ch === \"}\") {\n depth--;\n if (depth === 0) {\n return text.slice(startIndex, i + 1).trim();\n }\n }\n }\n\n return null;\n }\n\n function extractArrowExpression(startIndex: number): string | null {\n const header = /(?:const|let|var)\\s+\\w+\\s*=\\s*(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>\\s*/;\n const head = header.exec(text.slice(startIndex));\n if (!head) return null;\n\n let i = startIndex + head[0].length;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let inLineComment = false;\n let inBlockComment = false;\n let escaped = false;\n\n for (; i < text.length; i++) {\n const ch = text[i];\n const next = i + 1 < text.length ? text[i + 1] : \"\";\n\n if (inLineComment) {\n if (ch === \"\\n\") inLineComment = false;\n continue;\n }\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (inSingle) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"'\") inSingle = false;\n continue;\n }\n\n if (inDouble) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"\\\"\") inDouble = false;\n continue;\n }\n\n if (inTemplate) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"`\") inTemplate = false;\n continue;\n }\n\n if (ch === \"/\" && next === \"/\") {\n inLineComment = true;\n i++;\n continue;\n }\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n\n if (ch === \"'\") {\n inSingle = true;\n continue;\n }\n if (ch === \"\\\"\") {\n inDouble = true;\n continue;\n }\n if (ch === \"`\") {\n inTemplate = true;\n continue;\n }\n\n if (ch === \"(\") parenDepth++;\n else if (ch === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (ch === \"[\") bracketDepth++;\n else if (ch === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (ch === \"{\") braceDepth++;\n else if (ch === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n\n if (parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) {\n if (ch === \";\") {\n const candidate = text.slice(startIndex, i + 1).trim();\n if (isValidSnippet(candidate)) return candidate;\n }\n if (ch === \"\\n\") {\n const candidate = text.slice(startIndex, i).trim();\n if (isValidSnippet(candidate)) return candidate;\n }\n if (ch === \" \" && /[A-Za-z]/.test(next)) {\n // Typical model pattern: \"const f = x => x + 1 and ...\".\n const candidate = text.slice(startIndex, i).trim();\n if (isValidSnippet(candidate)) return candidate;\n }\n }\n }\n\n const tail = text.slice(startIndex).trim();\n return isValidSnippet(tail) ? tail : null;\n }\n\n // Extract code from markdown code block (prefer this, most reliable)\n const match = text.match(/```(?:javascript|js|typescript|ts)?\\s*\\n([\\s\\S]*?)```/);\n if (match) return match[1].trim();\n\n // Generic code block\n const genericMatch = text.match(/```\\s*\\n([\\s\\S]*?)```/);\n if (genericMatch) return genericMatch[1].trim();\n\n const escapeRegex = (value: string): string =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n // When we know the expected function name, prefer extracting that exact symbol.\n if (preferredFunctionName) {\n const fnName = escapeRegex(preferredFunctionName);\n\n const namedFunctionStart = text.search(\n new RegExp(`function\\\\s+${fnName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{`)\n );\n if (namedFunctionStart !== -1) {\n const extracted = extractBalancedBlock(namedFunctionStart);\n if (extracted) return extracted;\n }\n\n const namedArrowBlockStart = text.search(\n new RegExp(\n `(?:const|let|var)\\\\s+${fnName}\\\\s*=\\\\s*(?:\\\\([^)]*\\\\)|[A-Za-z_$][\\\\w$]*)\\\\s*=>\\\\s*\\\\{`\n )\n );\n if (namedArrowBlockStart !== -1) {\n const extracted = extractBalancedBlock(namedArrowBlockStart);\n if (extracted) return extracted;\n }\n\n const namedArrowExprStart = text.search(\n new RegExp(\n `(?:const|let|var)\\\\s+${fnName}\\\\s*=\\\\s*(?:\\\\([^)]*\\\\)|[A-Za-z_$][\\\\w$]*)\\\\s*=>\\\\s*(?!\\\\{)`\n )\n );\n if (namedArrowExprStart !== -1) {\n const extracted = extractArrowExpression(namedArrowExprStart);\n if (extracted) return extracted;\n }\n\n const namedFunctionExprStart = text.search(\n new RegExp(`(?:const|let|var)\\\\s+${fnName}\\\\s*=\\\\s*function\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{`)\n );\n if (namedFunctionExprStart !== -1) {\n const extracted = extractBalancedBlock(namedFunctionExprStart);\n if (extracted) return extracted;\n }\n }\n\n // If no code block, try to find a function declaration with balanced braces.\n const funcStart = text.search(/function\\s+\\w+\\s*\\([^)]*\\)\\s*\\{/);\n if (funcStart !== -1) {\n const extracted = extractBalancedBlock(funcStart);\n if (extracted) return extracted;\n }\n\n // Try arrow function with block body and balanced braces.\n const arrowStart = text.search(/(?:const|let|var)\\s+\\w+\\s*=\\s*(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>\\s*\\{/);\n if (arrowStart !== -1) {\n const extracted = extractBalancedBlock(arrowStart);\n if (extracted) return extracted;\n }\n\n // Try arrow function with expression body.\n const arrowExprStart = text.search(/(?:const|let|var)\\s+\\w+\\s*=\\s*(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>\\s*(?!\\{)/);\n if (arrowExprStart !== -1) {\n const extracted = extractArrowExpression(arrowExprStart);\n if (extracted) return extracted;\n }\n\n // Try function expression assignment: const fn = function(...) { ... }\n const functionExprStart = text.search(/(?:const|let|var)\\s+\\w+\\s*=\\s*function\\s*\\([^)]*\\)\\s*\\{/);\n if (functionExprStart !== -1) {\n const extracted = extractBalancedBlock(functionExprStart);\n if (extracted) return extracted;\n }\n\n return text.trim();\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport { promises as fs } from \"node:fs\";\nimport type { Dirent } from \"node:fs\";\nimport { execFile } from \"node:child_process\";\nimport type { OllamaModel, OllamaRunningModel } from \"../types.js\";\nimport type { GenerateResult, KeepAliveValue, StreamCallbacks } from \"./ollama-client.js\";\nimport { estimateTokenCount } from \"../utils.js\";\n\nconst DEFAULT_LM_STUDIO_BASE_URL = \"http://127.0.0.1:1234\";\nconst LM_STUDIO_INIT_TIMEOUT_MS = 15_000;\nconst LM_STUDIO_METADATA_TIMEOUT_MS = 2_000;\nconst DEFAULT_STREAM_STALL_TIMEOUT_MS = 30_000;\nconst LM_STUDIO_CLI_TIMEOUT_MS = 8_000;\nconst SHARED_STREAM_STALL_TIMEOUT_ENV = \"METRILLM_STREAM_STALL_TIMEOUT_MS\";\nconst DEFAULT_LM_STUDIO_HOME_DIR = path.join(os.homedir(), \".lmstudio\");\nconst DEFAULT_LM_STUDIO_MODELS_DIR = path.join(DEFAULT_LM_STUDIO_HOME_DIR, \"models\");\nconst LM_STUDIO_HOME_DIR_ENV = \"LM_STUDIO_HOME_DIR\";\nconst LM_STUDIO_MODELS_DIR_ENV = \"LM_STUDIO_MODELS_DIR\";\nconst LM_STUDIO_CLI_PATH_ENV = \"LM_STUDIO_CLI_PATH\";\n\nlet defaultKeepAlive: KeepAliveValue | undefined;\nconst activeAbortControllers = new Set<AbortController>();\nconst directorySizeCache = new Map<string, number>();\nconst modelDefinitionCache = new Map<string, LMStudioModelDefinition | null>();\n\ninterface LMStudioModelListResponse {\n data?: Array<{ id?: string }>;\n}\n\ninterface LMStudioApiModel {\n id?: string;\n arch?: string;\n type?: string;\n publisher?: string;\n compatibility_type?: string;\n quantization?: string;\n state?: string;\n size?: number;\n size_bytes?: number;\n model_size_bytes?: number;\n file_size_bytes?: number;\n bytes?: number;\n}\n\ninterface LMStudioApiModelListResponse {\n data?: LMStudioApiModel[];\n}\n\ninterface LMStudioLoadedModelCliEntry {\n modelKey?: string;\n path?: string;\n indexedModelIdentifier?: string;\n identifier?: string;\n contextLength?: number;\n}\n\ninterface LMStudioHistoricalVersionInfo {\n lastRecorderdAppVersion?: unknown;\n lastRecordedAppVersion?: unknown;\n lastRecordedAppBuildVersion?: unknown;\n}\n\ninterface LMStudioModelSource {\n user: string;\n repo: string;\n}\n\ninterface LMStudioModelDefinition {\n parameterSize?: string;\n sources: LMStudioModelSource[];\n}\n\ninterface LMStudioResolvedModelMetadata {\n size: number;\n parameterSize?: string;\n}\n\ninterface LMStudioNativeStats {\n input_tokens?: number;\n total_output_tokens?: number;\n reasoning_output_tokens?: number;\n tokens_per_second?: number;\n time_to_first_token_seconds?: number;\n model_load_time_seconds?: number;\n}\n\ninterface LMStudioNativeOutputItem {\n type?: string;\n content?: unknown;\n text?: unknown;\n}\n\ninterface LMStudioNativeChatResponse {\n output?: LMStudioNativeOutputItem[];\n stats?: LMStudioNativeStats;\n}\n\ninterface LMStudioNativeStreamEvent {\n type?: string;\n delta?: unknown;\n content?: unknown;\n text?: unknown;\n result?: LMStudioNativeChatResponse;\n stats?: LMStudioNativeStats;\n}\n\ninterface LMStudioRequestOptions {\n temperature?: number;\n top_p?: number;\n seed?: number;\n num_predict?: number;\n keep_alive?: KeepAliveValue;\n think?: boolean;\n stall_timeout_ms?: number;\n}\n\nconst NON_THINKING_SYSTEM_PROMPT = [\n \"You are in non-thinking mode for benchmark reproducibility.\",\n \"Return only the final answer.\",\n \"Do not output internal reasoning, chain-of-thought, or scratchpad.\",\n \"Never output tags or sections like <think>, </think>, [THINK], [/THINK], or Thinking Process.\",\n].join(\" \");\n\nfunction hasThinkingLeakText(response: string): boolean {\n return (\n /^\\s*(?:thinking|thought)\\s+process\\s*:/i.test(response)\n || /\\[(?:\\/)?THINK(?:ING)?\\]/i.test(response)\n );\n}\n\nfunction assertThinkingModeRespected(\n model: string,\n think: boolean | undefined,\n response: string,\n reasoning: string\n): void {\n if (think !== false) return;\n if (reasoning.trim().length > 0 || /<think(?:ing)?[\\s>]/i.test(response) || hasThinkingLeakText(response)) {\n throw new Error(\n [\n `LM Studio model \"${model}\" still emitted thinking content while non-thinking mode is requested.`,\n \"In LM Studio, add this at the top of the model chat template: {%- set enable_thinking = false %}.\",\n \"If this model does not expose a Prompt/Chat Template editor in LM Studio (e.g. some GPT-OSS builds), non-thinking mode cannot be enforced from the API.\",\n \"Use --thinking for this model, or benchmark a model/runtime that supports explicit non-thinking control.\",\n \"Then eject/reload the model and run the benchmark again.\",\n ].join(\" \")\n );\n }\n}\n\nfunction buildNativeThinkingOption(think?: boolean): \"high\" | undefined {\n if (think !== true) return undefined;\n return \"high\";\n}\n\nfunction hasSamplingOverrides(options?: LMStudioRequestOptions): boolean {\n return options?.top_p !== undefined || options?.seed !== undefined;\n}\n\nfunction isUnsupportedSamplingMessage(status: number, text: string): boolean {\n if (status !== 400 && status !== 422) return false;\n const lower = text.toLowerCase();\n const mentionsSampling = /\\b(seed|top_p|topp)\\b/.test(lower);\n if (!mentionsSampling) return false;\n return /unrecognized|unknown|not support|unsupported|invalid|unexpected|additional|extra/.test(lower);\n}\n\nfunction extractLMStudioErrorMessage(body: string): string {\n const trimmed = body.trim();\n if (!trimmed) return \"\";\n try {\n const parsed = JSON.parse(trimmed) as {\n error?: {\n message?: unknown;\n };\n };\n const message = parsed.error?.message;\n if (typeof message === \"string\" && message.trim().length > 0) {\n return message.trim();\n }\n } catch {\n // Fall back to raw response body text when payload is not JSON.\n }\n return trimmed;\n}\n\nfunction isModelLoadGuardrailError(message: string): boolean {\n const lower = message.toLowerCase();\n if (!lower.includes(\"failed to load model\")) return false;\n return (\n lower.includes(\"insufficient system resources\")\n || lower.includes(\"overload your system\")\n || lower.includes(\"loading guardrails\")\n );\n}\n\nfunction buildLMStudioRequestError(\n kind: \"generate\" | \"stream\",\n model: string,\n status: number,\n statusText: string,\n body: string\n): Error {\n const backendMessage = extractLMStudioErrorMessage(body);\n if (isModelLoadGuardrailError(backendMessage)) {\n return new Error(\n [\n `LM Studio could not load model \"${model}\" due to insufficient system resources (model loading guardrails).`,\n \"In LM Studio: unload other models, reduce loaded context length, or relax model loading guardrails in Settings.\",\n `Backend error: ${backendMessage}`,\n ].join(\" \")\n );\n }\n const suffix = backendMessage ? ` ${backendMessage}` : \"\";\n return new Error(`LM Studio ${kind} failed (${status} ${statusText})${suffix}`.trim());\n}\n\nfunction buildNativeChatBody(\n model: string,\n prompt: string,\n options: LMStudioRequestOptions | undefined,\n stream: boolean,\n includeSampling: boolean\n): Record<string, unknown> {\n const reasoning = buildNativeThinkingOption(options?.think);\n return {\n model,\n input: prompt,\n temperature: options?.temperature ?? 0,\n ...(includeSampling && options?.top_p !== undefined ? { top_p: options.top_p } : {}),\n ...(includeSampling && options?.seed !== undefined ? { seed: options.seed } : {}),\n max_tokens: options?.num_predict ?? 512,\n stream,\n ...(reasoning !== undefined ? { reasoning } : {}),\n ...(options?.think === false ? { system_prompt: NON_THINKING_SYSTEM_PROMPT } : {}),\n };\n}\n\nfunction getNativeStatNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n return value;\n}\n\nfunction flattenNativeText(value: unknown, depth = 0): string {\n if (depth > 3 || value == null) return \"\";\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) {\n return value.map((item) => flattenNativeText(item, depth + 1)).join(\"\");\n }\n if (typeof value === \"object\") {\n const candidate = value as {\n text?: unknown;\n content?: unknown;\n delta?: unknown;\n value?: unknown;\n };\n return (\n flattenNativeText(candidate.text, depth + 1)\n || flattenNativeText(candidate.content, depth + 1)\n || flattenNativeText(candidate.delta, depth + 1)\n || flattenNativeText(candidate.value, depth + 1)\n );\n }\n return \"\";\n}\n\nfunction collectNativeOutput(\n output: unknown\n): { response: string; reasoning: string } {\n if (!Array.isArray(output)) {\n return { response: \"\", reasoning: \"\" };\n }\n\n let response = \"\";\n let reasoning = \"\";\n for (const item of output) {\n if (typeof item !== \"object\" || item === null) continue;\n const nativeItem = item as LMStudioNativeOutputItem;\n const text = flattenNativeText(nativeItem.text ?? nativeItem.content).trim();\n if (!text) continue;\n const type = asNonEmptyString(nativeItem.type)?.toLowerCase() ?? \"\";\n if (type.includes(\"reason\")) {\n reasoning += text;\n } else {\n response += text;\n }\n }\n\n return { response, reasoning };\n}\n\nfunction extractNativeStats(payload: unknown): LMStudioNativeStats | undefined {\n if (typeof payload !== \"object\" || payload === null) return undefined;\n const direct = (payload as { stats?: LMStudioNativeStats }).stats;\n if (direct) return direct;\n const result = (payload as { result?: { stats?: LMStudioNativeStats } }).result?.stats;\n return result;\n}\n\nfunction extractNativeResponse(payload: unknown): { response: string; reasoning: string } {\n if (typeof payload !== \"object\" || payload === null) {\n return { response: \"\", reasoning: \"\" };\n }\n\n const resultOutput = (payload as { result?: LMStudioNativeChatResponse }).result?.output;\n const directOutput = (payload as LMStudioNativeChatResponse).output;\n const fromResult = collectNativeOutput(resultOutput);\n if (fromResult.response || fromResult.reasoning) return fromResult;\n return collectNativeOutput(directOutput);\n}\n\nfunction extractNativeDelta(payload: LMStudioNativeStreamEvent): { response: string; reasoning: string } {\n if (typeof payload !== \"object\" || payload === null) {\n return { response: \"\", reasoning: \"\" };\n }\n\n const type = asNonEmptyString(payload.type)?.toLowerCase() ?? \"\";\n const directText = flattenNativeText(payload.delta);\n const fallbackText =\n directText\n || flattenNativeText(payload.content)\n || flattenNativeText(payload.text);\n if (!fallbackText) {\n return { response: \"\", reasoning: \"\" };\n }\n\n if (type.includes(\"reason\")) {\n return { response: \"\", reasoning: fallbackText };\n }\n if (type.includes(\"message\") || type.includes(\"text\") || type.includes(\"content\")) {\n return { response: fallbackText, reasoning: \"\" };\n }\n\n return { response: fallbackText, reasoning: \"\" };\n}\n\nfunction parseNonNegativeInt(value: string): number | null {\n if (!/^\\d+$/.test(value)) return null;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isSafeInteger(parsed) || parsed < 0) return null;\n return parsed;\n}\n\nfunction resolveStreamStallTimeoutMs(override?: number): number | undefined {\n if (override !== undefined) {\n if (!Number.isFinite(override) || override < 0) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n return override === 0 ? undefined : Math.trunc(override);\n }\n\n const configured = process.env[SHARED_STREAM_STALL_TIMEOUT_ENV]?.trim();\n if (!configured) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n const parsed = parseNonNegativeInt(configured);\n if (parsed === null) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n return parsed === 0 ? undefined : parsed;\n}\n\nfunction getLMStudioBaseUrl(): string {\n const configured = process.env.LM_STUDIO_BASE_URL?.trim();\n if (!configured) return DEFAULT_LM_STUDIO_BASE_URL;\n const candidate = /^https?:\\/\\//i.test(configured) ? configured : `http://${configured}`;\n try {\n return new URL(candidate).toString();\n } catch {\n return DEFAULT_LM_STUDIO_BASE_URL;\n }\n}\n\nfunction getLMStudioHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n const apiKey = process.env.LM_STUDIO_API_KEY?.trim();\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n return headers;\n}\n\nfunction getUsageTokenCount(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return 0;\n if (value <= 0) return 0;\n return Math.trunc(value);\n}\n\nfunction estimateCompletionTokensFallback(text: string): number {\n const normalized = text.trim();\n if (!normalized) return 0;\n\n // CJK-like scripts often have sparse/no whitespace, so whitespace tokenization\n // underestimates badly. Count those codepoints directly and estimate the rest.\n const cjkMatches = normalized.match(/[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Hangul}]/gu);\n const cjkCount = cjkMatches?.length ?? 0;\n const withoutCjk = normalized.replace(\n /[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Hangul}]/gu,\n \"\"\n );\n const nonCjkChars = withoutCjk.replace(/\\s+/g, \"\").length;\n const nonCjkHeuristic = Math.ceil(nonCjkChars / 4);\n const whitespaceEstimate = estimateTokenCount(normalized);\n\n return Math.max(1, Math.max(whitespaceEstimate, cjkCount + nonCjkHeuristic));\n}\n\nfunction resolveCompletionTokenCount(\n reportedTokenCount: number | undefined,\n response: string,\n reasoning: string\n): number {\n const reported = getUsageTokenCount(reportedTokenCount);\n if (reported > 0) return reported;\n return estimateCompletionTokensFallback(`${reasoning} ${response}`);\n}\n\nfunction asNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction stripOptionalQuotes(value: string): string {\n const trimmed = value.trim();\n return trimmed.replace(/^[\"']|[\"']$/g, \"\").trim();\n}\n\nfunction normalizeToken(value: string | undefined): string {\n return (value ?? \"\").toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction tokenizeModelName(value: string): string[] {\n return value\n .toLowerCase()\n .split(/[^a-z0-9]+/g)\n .map((token) => token.trim())\n .filter((token) => token.length >= 3 && /[a-z]/.test(token));\n}\n\nfunction getLMStudioHomeDir(): string {\n const fromEnv = process.env[LM_STUDIO_HOME_DIR_ENV]?.trim();\n if (!fromEnv) return DEFAULT_LM_STUDIO_HOME_DIR;\n if (fromEnv.startsWith(\"~\")) {\n return path.join(os.homedir(), fromEnv.slice(1));\n }\n return fromEnv;\n}\n\nasync function pathIsDirectory(targetPath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(targetPath);\n return stat.isDirectory();\n } catch (_err: unknown) {\n return false;\n }\n}\n\nasync function loadHubModelDefinition(modelId: string): Promise<LMStudioModelDefinition | null> {\n if (modelDefinitionCache.has(modelId)) {\n return modelDefinitionCache.get(modelId) ?? null;\n }\n\n const [publisher, modelName] = modelId.split(\"/\", 2);\n if (!publisher || !modelName) {\n modelDefinitionCache.set(modelId, null);\n return null;\n }\n\n const yamlPath = path.join(getLMStudioHomeDir(), \"hub\", \"models\", publisher, modelName, \"model.yaml\");\n let content = \"\";\n try {\n content = await fs.readFile(yamlPath, \"utf8\");\n } catch {\n modelDefinitionCache.set(modelId, null);\n return null;\n }\n\n const sourcePattern = /user:\\s*([^\\n#]+?)\\s*(?:\\r?\\n)\\s*repo:\\s*([^\\n#]+?)\\s*(?:\\r?\\n|$)/g;\n const sourceMap = new Map<string, LMStudioModelSource>();\n let sourceMatch: RegExpExecArray | null = null;\n while ((sourceMatch = sourcePattern.exec(content)) !== null) {\n const user = stripOptionalQuotes(sourceMatch[1] ?? \"\");\n const repo = stripOptionalQuotes(sourceMatch[2] ?? \"\");\n if (!user || !repo) continue;\n sourceMap.set(`${user}/${repo}`, { user, repo });\n }\n\n const paramsPattern = /paramsStrings:\\s*(?:\\r?\\n)\\s*-\\s*([^\\n#]+)/;\n const paramsMatch = paramsPattern.exec(content);\n const parameterSize = paramsMatch?.[1] ? stripOptionalQuotes(paramsMatch[1]) : undefined;\n\n const definition: LMStudioModelDefinition = {\n parameterSize: parameterSize || undefined,\n sources: Array.from(sourceMap.values()),\n };\n modelDefinitionCache.set(modelId, definition);\n return definition;\n}\n\nasync function readDirectorySizeBytes(dirPath: string): Promise<number> {\n const cached = directorySizeCache.get(dirPath);\n if (cached !== undefined) return cached;\n\n let total = 0;\n const queue: string[] = [dirPath];\n while (queue.length > 0) {\n const current = queue.pop();\n if (!current) continue;\n\n let entries: Dirent[] = [];\n try {\n entries = await fs.readdir(current, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (entry.isSymbolicLink()) continue;\n const fullPath = path.join(current, entry.name);\n if (entry.isDirectory()) {\n queue.push(fullPath);\n continue;\n }\n if (!entry.isFile()) continue;\n try {\n const stat = await fs.stat(fullPath);\n total += stat.size;\n } catch {\n // Ignore transient file read errors.\n }\n }\n }\n\n directorySizeCache.set(dirPath, total);\n return total;\n}\n\nfunction scoreModelSourceCandidate(\n source: LMStudioModelSource,\n modelId: string,\n apiModel: LMStudioApiModel | undefined\n): number {\n const repoToken = normalizeToken(source.repo);\n let score = 0;\n\n const quantToken = normalizeToken(apiModel?.quantization);\n if (quantToken && repoToken.includes(quantToken)) score += 8;\n\n const compatibilityToken = normalizeToken(apiModel?.compatibility_type);\n if (compatibilityToken && repoToken.includes(compatibilityToken)) score += 4;\n\n const [, shortModelName] = modelId.split(\"/\", 2);\n const modelToken = normalizeToken(shortModelName ?? modelId);\n if (modelToken && repoToken.includes(modelToken)) score += 2;\n\n return score;\n}\n\nasync function resolveModelsRootDir(): Promise<string> {\n const fromEnv = process.env[LM_STUDIO_MODELS_DIR_ENV]?.trim();\n if (fromEnv) {\n if (fromEnv.startsWith(\"~\")) {\n return path.join(os.homedir(), fromEnv.slice(1));\n }\n return fromEnv;\n }\n\n const settingsCandidates = [\n path.join(getLMStudioHomeDir(), \"settings.json\"),\n path.join(os.homedir(), \"Library\", \"Application Support\", \"LM Studio\", \"settings.json\"),\n ];\n for (const settingsPath of settingsCandidates) {\n try {\n const content = await fs.readFile(settingsPath, \"utf8\");\n const parsed = JSON.parse(content) as { downloadsFolder?: unknown };\n const downloadsFolder = asNonEmptyString(parsed.downloadsFolder);\n if (downloadsFolder) {\n return downloadsFolder.startsWith(\"~\")\n ? path.join(os.homedir(), downloadsFolder.slice(1))\n : downloadsFolder;\n }\n } catch {\n // Try next location.\n }\n }\n\n return DEFAULT_LM_STUDIO_MODELS_DIR;\n}\n\nasync function listImmediateSubdirs(dirPath: string): Promise<string[]> {\n let entries: Dirent[] = [];\n try {\n entries = await fs.readdir(dirPath, { withFileTypes: true });\n } catch {\n return [];\n }\n return entries\n .filter((entry) => entry.isDirectory() && !entry.isSymbolicLink())\n .map((entry) => path.join(dirPath, entry.name));\n}\n\nasync function findPublisherDirs(rootDir: string, publisher: string): Promise<string[]> {\n const normalizedPublisher = normalizeToken(publisher);\n if (!normalizedPublisher) return [];\n const dirs = await listImmediateSubdirs(rootDir);\n return dirs.filter((dir) => normalizeToken(path.basename(dir)) === normalizedPublisher);\n}\n\nfunction scorePublisherModelCandidate(\n modelDirName: string,\n modelId: string,\n apiModel: LMStudioApiModel | undefined\n): number {\n const dirToken = normalizeToken(modelDirName);\n if (!dirToken) return 0;\n\n let score = 0;\n const idToken = normalizeToken(modelId);\n if (idToken && dirToken.includes(idToken)) score += 24;\n\n const [, shortModelName] = modelId.split(\"/\", 2);\n const shortToken = normalizeToken(shortModelName ?? modelId);\n if (shortToken && dirToken.includes(shortToken)) score += 16;\n\n for (const token of tokenizeModelName(shortModelName ?? modelId)) {\n if (dirToken.includes(token)) score += 3;\n }\n\n const quantToken = normalizeToken(apiModel?.quantization);\n if (quantToken && dirToken.includes(quantToken)) score += 6;\n\n const compatibilityToken = normalizeToken(apiModel?.compatibility_type);\n if (compatibilityToken && dirToken.includes(compatibilityToken)) score += 4;\n\n return score;\n}\n\nasync function resolvePublisherModelMetadata(\n modelId: string,\n apiModel: LMStudioApiModel | undefined,\n modelsRootDir: string\n): Promise<LMStudioResolvedModelMetadata> {\n const explicitPublisher = asNonEmptyString(apiModel?.publisher);\n const [publisherFromId] = modelId.split(\"/\", 1);\n const publisher = explicitPublisher ?? publisherFromId;\n if (!publisher) {\n return { size: 0, parameterSize: inferParameterSizeFromModelId(modelId) };\n }\n\n const bundledModelsDir = path.join(getLMStudioHomeDir(), \".internal\", \"bundled-models\");\n const roots = Array.from(new Set([modelsRootDir, bundledModelsDir]));\n\n const candidates: Array<{ fullPath: string; score: number }> = [];\n for (const root of roots) {\n const publisherDirs = await findPublisherDirs(root, publisher);\n for (const publisherDir of publisherDirs) {\n const modelDirs = await listImmediateSubdirs(publisherDir);\n if (modelDirs.length === 0) {\n candidates.push({\n fullPath: publisherDir,\n score: scorePublisherModelCandidate(path.basename(publisherDir), modelId, apiModel),\n });\n continue;\n }\n for (const modelDir of modelDirs) {\n candidates.push({\n fullPath: modelDir,\n score: scorePublisherModelCandidate(path.basename(modelDir), modelId, apiModel),\n });\n }\n }\n }\n\n if (candidates.length === 0) {\n return { size: 0, parameterSize: inferParameterSizeFromModelId(modelId) };\n }\n\n candidates.sort((a, b) => {\n const scoreDiff = b.score - a.score;\n if (scoreDiff !== 0) return scoreDiff;\n return a.fullPath.localeCompare(b.fullPath);\n });\n\n let bestSize = 0;\n for (const candidate of candidates) {\n const size = await readDirectorySizeBytes(candidate.fullPath);\n if (size > bestSize) bestSize = size;\n if (size > 0 && candidate.score > 0) {\n return { size, parameterSize: inferParameterSizeFromModelId(modelId) };\n }\n }\n\n return { size: bestSize, parameterSize: inferParameterSizeFromModelId(modelId) };\n}\n\nasync function resolveLocalModelMetadata(\n modelId: string,\n apiModel: LMStudioApiModel | undefined,\n modelsRootDir: string\n): Promise<LMStudioResolvedModelMetadata> {\n const definition = await loadHubModelDefinition(modelId);\n if (!definition) {\n return resolvePublisherModelMetadata(modelId, apiModel, modelsRootDir);\n }\n\n const installedSources: Array<LMStudioModelSource & { fullPath: string }> = [];\n for (const source of definition.sources) {\n const fullPath = path.join(modelsRootDir, source.user, source.repo);\n if (await pathIsDirectory(fullPath)) {\n installedSources.push({ ...source, fullPath });\n }\n }\n\n if (installedSources.length === 0) {\n const fallback = await resolvePublisherModelMetadata(modelId, apiModel, modelsRootDir);\n if (fallback.size > 0) {\n return {\n size: fallback.size,\n parameterSize: definition.parameterSize ?? fallback.parameterSize,\n };\n }\n return { size: 0, parameterSize: definition.parameterSize };\n }\n\n installedSources.sort((a, b) => {\n const diff =\n scoreModelSourceCandidate(b, modelId, apiModel)\n - scoreModelSourceCandidate(a, modelId, apiModel);\n if (diff !== 0) return diff;\n return a.repo.localeCompare(b.repo);\n });\n\n let bestSize = 0;\n for (const source of installedSources) {\n const size = await readDirectorySizeBytes(source.fullPath);\n if (size > bestSize) bestSize = size;\n if (size > 0) {\n return {\n size,\n parameterSize: definition.parameterSize,\n };\n }\n }\n\n if (bestSize > 0) {\n return {\n size: bestSize,\n parameterSize: definition.parameterSize,\n };\n }\n\n const fallback = await resolvePublisherModelMetadata(modelId, apiModel, modelsRootDir);\n if (fallback.size > 0) {\n return {\n size: fallback.size,\n parameterSize: definition.parameterSize ?? fallback.parameterSize,\n };\n }\n\n return {\n size: 0,\n parameterSize: definition.parameterSize ?? fallback.parameterSize,\n };\n}\n\nfunction parseSizeBytes(model: LMStudioApiModel | undefined): number {\n if (!model) return 0;\n const candidates = [\n model.size_bytes,\n model.model_size_bytes,\n model.file_size_bytes,\n model.bytes,\n model.size,\n ];\n for (const candidate of candidates) {\n if (typeof candidate !== \"number\" || !Number.isFinite(candidate)) continue;\n if (candidate > 0) return Math.trunc(candidate);\n }\n return 0;\n}\n\nfunction normalizeModelNumber(value: string): string {\n return value.replace(/\\.0+$/, \"\");\n}\n\nfunction inferParameterSizeFromModelId(modelId: string): string | undefined {\n const id = modelId.toLowerCase();\n\n const mixtureMatch = id.match(/\\b(\\d+(?:\\.\\d+)?)\\s*[x*]\\s*(\\d+(?:\\.\\d+)?)\\s*b\\b/);\n if (mixtureMatch) {\n const experts = normalizeModelNumber(mixtureMatch[1] ?? \"\");\n const perExpert = normalizeModelNumber(mixtureMatch[2] ?? \"\");\n if (experts && perExpert) return `${experts}x${perExpert}B`;\n }\n\n const billionMatch = id.match(/\\b(\\d+(?:\\.\\d+)?)\\s*b\\b/);\n if (billionMatch?.[1]) {\n return `${normalizeModelNumber(billionMatch[1])}B`;\n }\n\n const millionMatch = id.match(/\\b(\\d+(?:\\.\\d+)?)\\s*m\\b/);\n if (millionMatch?.[1]) {\n return `${normalizeModelNumber(millionMatch[1])}M`;\n }\n\n return undefined;\n}\n\nfunction resolveModelFormat(\n apiModel: LMStudioApiModel | undefined,\n _localMetadata: LMStudioResolvedModelMetadata | undefined,\n _modelId: string\n): string | undefined {\n return asNonEmptyString(apiModel?.compatibility_type);\n}\n\nfunction buildModelEntry(\n id: string,\n apiModel: LMStudioApiModel | undefined,\n localMetadata: LMStudioResolvedModelMetadata | undefined\n): OllamaModel {\n const apiSize = parseSizeBytes(apiModel);\n return {\n name: id,\n size: apiSize > 0 ? apiSize : (localMetadata?.size ?? 0),\n parameterSize:\n localMetadata?.parameterSize\n ?? inferParameterSizeFromModelId(id),\n quantization: asNonEmptyString(apiModel?.quantization),\n runtimeStatus: asNonEmptyString(apiModel?.state),\n modelFormat: resolveModelFormat(apiModel, localMetadata, id),\n family:\n asNonEmptyString(apiModel?.arch)\n ?? asNonEmptyString(apiModel?.type)\n ?? asNonEmptyString(apiModel?.publisher),\n };\n}\n\nfunction isLoadedState(state: string | undefined): boolean {\n if (!state) return false;\n const normalized = state.trim().toLowerCase();\n if (!normalized || normalized.includes(\"not-loaded\")) return false;\n if (normalized === \"loaded\" || normalized === \"ready\") return true;\n return normalized.includes(\"loaded\");\n}\n\nfunction execFileText(\n cmd: string,\n args: string[],\n timeoutMs: number\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n execFile(\n cmd,\n args,\n {\n timeout: timeoutMs,\n maxBuffer: 1024 * 1024,\n env: process.env,\n },\n (err, stdout, stderr) => {\n if (err) {\n const error = err as NodeJS.ErrnoException & { stdout?: string; stderr?: string };\n error.stdout = stdout;\n error.stderr = stderr;\n reject(error);\n return;\n }\n resolve({ stdout, stderr });\n }\n );\n });\n}\n\nfunction isCommandMissingError(err: unknown): boolean {\n return err instanceof Error\n && \"code\" in err\n && (err as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nasync function runLmsCli(args: string[]): Promise<{ stdout: string; stderr: string }> {\n const configuredPath = asNonEmptyString(process.env[LM_STUDIO_CLI_PATH_ENV]);\n const fallbackPath = path.join(getLMStudioHomeDir(), \"bin\", \"lms\");\n const candidates = [\n configuredPath,\n \"lms\",\n fallbackPath,\n ].filter((candidate, index, list): candidate is string =>\n Boolean(candidate) && list.indexOf(candidate) === index\n );\n\n let lastError: unknown;\n for (const candidate of candidates) {\n try {\n return await execFileText(candidate, args, LM_STUDIO_CLI_TIMEOUT_MS);\n } catch (err) {\n lastError = err;\n if (isCommandMissingError(err)) continue;\n throw err;\n }\n }\n\n throw lastError ?? new Error(\"LM Studio CLI is not available.\");\n}\n\nfunction normalizeCliToken(value: string | undefined): string {\n return (value ?? \"\").trim().toLowerCase();\n}\n\nfunction matchesLoadedModelCliEntry(entry: LMStudioLoadedModelCliEntry, model: string): boolean {\n const target = normalizeCliToken(model);\n if (!target) return false;\n return [\n entry.identifier,\n entry.indexedModelIdentifier,\n entry.path,\n entry.modelKey,\n ].some((candidate) => normalizeCliToken(candidate) === target);\n}\n\nasync function listLoadedModelsFromCli(): Promise<LMStudioLoadedModelCliEntry[]> {\n const { stdout } = await runLmsCli([\"ps\", \"--json\"]);\n const parsed = JSON.parse(stdout) as unknown;\n return Array.isArray(parsed) ? parsed as LMStudioLoadedModelCliEntry[] : [];\n}\n\nfunction parseEstimatedBytes(output: string): number | null {\n const match = output.match(/Estimated Total Memory:\\s*([0-9]+(?:\\.[0-9]+)?)\\s*(KiB|MiB|GiB|TiB|KB|MB|GB|TB)/i);\n if (!match) return null;\n\n const value = Number.parseFloat(match[1] ?? \"\");\n const unit = (match[2] ?? \"\").toUpperCase();\n if (!Number.isFinite(value) || value <= 0) return null;\n\n const multipliers: Record<string, number> = {\n KIB: 1024,\n MIB: 1024 ** 2,\n GIB: 1024 ** 3,\n TIB: 1024 ** 4,\n KB: 1000,\n MB: 1000 ** 2,\n GB: 1000 ** 3,\n TB: 1000 ** 4,\n };\n const multiplier = multipliers[unit];\n if (!multiplier) return null;\n return Math.round(value * multiplier);\n}\n\nexport async function estimateLoadedModelMemoryBytes(model: string): Promise<number | null> {\n let loadedEntry: LMStudioLoadedModelCliEntry | undefined;\n try {\n const loadedModels = await listLoadedModelsFromCli();\n loadedEntry = loadedModels.find((entry) => matchesLoadedModelCliEntry(entry, model));\n } catch {\n loadedEntry = undefined;\n }\n\n // Only estimate from an exact loaded-model entry reported by `lms ps --json`.\n // Falling back to the raw user-provided model string can trigger the LM Studio\n // interactive selector, which would stall the benchmark process.\n if (!loadedEntry) return null;\n\n const candidateModelKeys = [\n loadedEntry?.path,\n loadedEntry?.indexedModelIdentifier,\n loadedEntry?.modelKey,\n ].filter((candidate, index, list): candidate is string =>\n Boolean(candidate?.trim()) && list.findIndex((item) => item === candidate) === index\n );\n\n for (const candidate of candidateModelKeys) {\n const args = [\"load\", \"--estimate-only\", \"-y\"];\n if (\n typeof loadedEntry?.contextLength === \"number\"\n && Number.isFinite(loadedEntry.contextLength)\n && loadedEntry.contextLength > 0\n ) {\n args.push(\"--context-length\", String(Math.trunc(loadedEntry.contextLength)));\n }\n args.push(candidate);\n\n try {\n const { stdout, stderr } = await runLmsCli(args);\n const estimated = parseEstimatedBytes(`${stdout}\\n${stderr}`);\n if (estimated !== null) return estimated;\n } catch (err) {\n const output = err instanceof Error\n ? `${String((err as NodeJS.ErrnoException & { stdout?: string }).stdout ?? \"\")}\\n${String((err as NodeJS.ErrnoException & { stderr?: string }).stderr ?? \"\")}`\n : \"\";\n const estimated = parseEstimatedBytes(output);\n if (estimated !== null) return estimated;\n }\n }\n\n return null;\n}\n\nasync function fetchApiModels(): Promise<LMStudioApiModel[] | null> {\n try {\n const resp = await fetchWithTimeout(\n \"/api/v0/models\",\n { method: \"GET\", headers: getLMStudioHeaders() },\n LM_STUDIO_METADATA_TIMEOUT_MS,\n \"LM Studio API metadata\"\n );\n if (!resp.ok) return null;\n const payload = (await resp.json()) as LMStudioApiModelListResponse;\n return Array.isArray(payload.data) ? payload.data : [];\n } catch {\n return null;\n }\n}\n\nasync function fetchWithTimeout(\n path: string,\n init: RequestInit,\n timeoutMs: number,\n label: string\n): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n const baseUrl = getLMStudioBaseUrl();\n try {\n const url = new URL(path, baseUrl);\n return await fetch(url, { ...init, signal: controller.signal });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new Error(`${label} timed out after ${timeoutMs}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function resolveLocalLMStudioVersion(): Promise<string | null> {\n const historicalVersionPath = path.join(\n getLMStudioHomeDir(),\n \".internal\",\n \"historical-version-info.json\"\n );\n try {\n const content = await fs.readFile(historicalVersionPath, \"utf8\");\n const parsed = JSON.parse(content) as LMStudioHistoricalVersionInfo;\n const version =\n asNonEmptyString(parsed.lastRecordedAppVersion)\n ?? asNonEmptyString(parsed.lastRecorderdAppVersion);\n if (!version) return null;\n const build = asNonEmptyString(parsed.lastRecordedAppBuildVersion);\n return build ? `${version}+${build}` : version;\n } catch {\n return null;\n }\n}\n\nexport async function getLMStudioVersion(): Promise<string> {\n const localVersion = await resolveLocalLMStudioVersion();\n try {\n const resp = await fetchWithTimeout(\n \"/api/v1/models\",\n { method: \"GET\", headers: getLMStudioHeaders() },\n 5_000,\n \"LM Studio version check\"\n );\n if (!resp.ok) return localVersion ?? \"unknown\";\n const fromHeader = asNonEmptyString(resp.headers.get(\"x-lmstudio-version\"));\n if (fromHeader) return fromHeader;\n return localVersion ?? \"unknown\";\n } catch {\n return localVersion ?? \"unknown\";\n }\n}\n\nexport async function listModels(): Promise<OllamaModel[]> {\n const resp = await fetchWithTimeout(\n \"/api/v1/models\",\n { method: \"GET\", headers: getLMStudioHeaders() },\n LM_STUDIO_INIT_TIMEOUT_MS,\n \"LM Studio list models\"\n );\n if (!resp.ok) {\n throw new Error(`LM Studio list models failed (${resp.status} ${resp.statusText})`);\n }\n const data = (await resp.json()) as LMStudioModelListResponse;\n const ids = (data.data ?? [])\n .map((m) => m.id?.trim())\n .filter((id): id is string => Boolean(id));\n\n const apiModels = await fetchApiModels();\n const apiById = new Map<string, LMStudioApiModel>();\n for (const model of apiModels ?? []) {\n const id = asNonEmptyString(model.id);\n if (!id) continue;\n apiById.set(id, model);\n }\n\n const modelsRootDir = await resolveModelsRootDir();\n const localMetadataEntries = await Promise.all(\n ids.map(async (id) => {\n const localMetadata = await resolveLocalModelMetadata(id, apiById.get(id), modelsRootDir);\n return [id, localMetadata] as const;\n })\n );\n const localMetadataById = new Map<string, LMStudioResolvedModelMetadata>(\n localMetadataEntries\n );\n\n return ids.map((id) => buildModelEntry(id, apiById.get(id), localMetadataById.get(id)));\n}\n\nexport async function resolveModel(modelId: string): Promise<OllamaModel | null> {\n const id = modelId.trim();\n if (!id) return null;\n\n const apiModels = await fetchApiModels();\n const apiModel = apiModels?.find((candidate) => asNonEmptyString(candidate.id) === id);\n const modelsRootDir = await resolveModelsRootDir();\n const localMetadata = await resolveLocalModelMetadata(id, apiModel, modelsRootDir);\n return buildModelEntry(id, apiModel, localMetadata);\n}\n\nexport async function listRunningModels(): Promise<OllamaRunningModel[]> {\n const apiModels = await fetchApiModels();\n if (!apiModels) return [];\n\n return apiModels\n .filter((model) => isLoadedState(model.state))\n .map((model) => ({\n name: model.id ?? \"\",\n size: parseSizeBytes(model),\n vramUsed: 0,\n }))\n .filter((model) => model.name.trim().length > 0);\n}\n\nexport function setDefaultKeepAlive(keepAlive?: KeepAliveValue): void {\n // No-op for LM Studio today (kept for runtime interface parity).\n defaultKeepAlive = keepAlive;\n void defaultKeepAlive;\n}\n\nexport async function generate(\n model: string,\n prompt: string,\n options?: LMStudioRequestOptions\n): Promise<GenerateResult> {\n const start = Date.now();\n const controller = new AbortController();\n activeAbortControllers.add(controller);\n try {\n const baseUrl = getLMStudioBaseUrl();\n const url = new URL(\"/api/v1/chat\", baseUrl);\n const doRequest = (includeSampling: boolean) =>\n fetch(url, {\n method: \"POST\",\n headers: getLMStudioHeaders(),\n body: JSON.stringify(buildNativeChatBody(model, prompt, options, false, includeSampling)),\n signal: controller.signal,\n });\n\n let resp = await doRequest(true);\n if (!resp.ok) {\n const body = await resp.text().catch(() => \"\");\n if (hasSamplingOverrides(options) && isUnsupportedSamplingMessage(resp.status, body)) {\n resp = await doRequest(false);\n } else {\n throw buildLMStudioRequestError(\"generate\", model, resp.status, resp.statusText, body);\n }\n }\n if (!resp.ok) {\n const body = await resp.text().catch(() => \"\");\n throw buildLMStudioRequestError(\"generate\", model, resp.status, resp.statusText, body);\n }\n\n const payload = (await resp.json()) as LMStudioNativeChatResponse;\n const nativeResponse = extractNativeResponse(payload);\n const response = nativeResponse.response;\n const reasoning = nativeResponse.reasoning;\n assertThinkingModeRespected(model, options?.think, response, reasoning);\n const stats = extractNativeStats(payload);\n const totalDuration = Math.max(0, Date.now() - start) * 1e6;\n const outputTokens =\n getUsageTokenCount(stats?.total_output_tokens)\n || resolveCompletionTokenCount(undefined, response, reasoning);\n const throughput = getNativeStatNumber(stats?.tokens_per_second);\n const timeToFirstTokenSeconds = getNativeStatNumber(stats?.time_to_first_token_seconds);\n const modelLoadTimeSeconds = getNativeStatNumber(stats?.model_load_time_seconds);\n const evalCountEstimated = getUsageTokenCount(stats?.total_output_tokens) <= 0;\n const evalDuration =\n throughput !== undefined && throughput > 0 && outputTokens > 0\n ? Math.max(1, Math.round((outputTokens / throughput) * 1e9))\n : totalDuration;\n const promptEvalDuration =\n timeToFirstTokenSeconds !== undefined\n ? Math.max(0, Math.round(timeToFirstTokenSeconds * 1e9))\n : 0;\n const loadDuration = Math.max(\n 0,\n Math.round((modelLoadTimeSeconds ?? 0) * 1e9)\n );\n\n return {\n response,\n ...(reasoning ? { thinking: reasoning } : {}),\n totalDuration,\n loadDuration,\n promptEvalCount: getUsageTokenCount(stats?.input_tokens),\n promptEvalDuration,\n evalCount: outputTokens,\n evalDuration,\n ...(evalCountEstimated ? { evalCountEstimated: true } : {}),\n };\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new Error(\"LM Studio generate request aborted\");\n }\n throw err;\n } finally {\n activeAbortControllers.delete(controller);\n }\n}\n\nexport async function generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n options?: LMStudioRequestOptions\n): Promise<GenerateResult> {\n const start = Date.now();\n const controller = new AbortController();\n activeAbortControllers.add(controller);\n const stallTimeoutMs = resolveStreamStallTimeoutMs(options?.stall_timeout_ms);\n let abortedByStallTimeout = false;\n\n const baseUrl = getLMStudioBaseUrl();\n const url = new URL(\"/api/v1/chat\", baseUrl);\n\n let stallTimer: ReturnType<typeof setTimeout> | null = null;\n const resetStallTimer = () => {\n if (stallTimeoutMs === undefined) return;\n if (stallTimer) clearTimeout(stallTimer);\n stallTimer = setTimeout(() => {\n abortedByStallTimeout = true;\n controller.abort();\n }, stallTimeoutMs);\n };\n\n try {\n resetStallTimer();\n\n const doRequest = (includeSampling: boolean) =>\n fetch(url, {\n method: \"POST\",\n headers: getLMStudioHeaders(),\n body: JSON.stringify(buildNativeChatBody(model, prompt, options, true, includeSampling)),\n signal: controller.signal,\n });\n\n let resp = await doRequest(true);\n if (!resp.ok) {\n const body = await resp.text().catch(() => \"\");\n if (hasSamplingOverrides(options) && isUnsupportedSamplingMessage(resp.status, body)) {\n resp = await doRequest(false);\n } else {\n throw buildLMStudioRequestError(\"stream\", model, resp.status, resp.statusText, body);\n }\n }\n if (!resp.ok) {\n const body = await resp.text().catch(() => \"\");\n throw buildLMStudioRequestError(\"stream\", model, resp.status, resp.statusText, body);\n }\n\n if (!resp.body) {\n throw new Error(\"LM Studio stream response body is empty\");\n }\n\n const reader = resp.body.getReader();\n const decoder = new TextDecoder();\n let buffered = \"\";\n let doneReceived = false;\n let fullResponse = \"\";\n let fullThinking = \"\";\n let stats: LMStudioNativeStats | undefined;\n let firstChunkSeen = false;\n let firstGeneratedTokenTime: number | null = null;\n let lastGeneratedTokenTime: number | null = null;\n\n const processDataLine = (rawLine: string) => {\n const line = rawLine.trim();\n if (!line.startsWith(\"data:\")) return;\n const dataStr = line.slice(5).trim();\n if (!dataStr) return;\n if (dataStr === \"[DONE]\") {\n doneReceived = true;\n return;\n }\n\n let payload: LMStudioNativeStreamEvent;\n try {\n payload = JSON.parse(dataStr) as LMStudioNativeStreamEvent;\n } catch {\n return;\n }\n\n const delta = extractNativeDelta(payload);\n const content = delta.response;\n const reasoning = delta.reasoning;\n const chunkStats = extractNativeStats(payload);\n if (chunkStats) stats = chunkStats;\n const aggregate = extractNativeResponse(payload);\n if (aggregate.response) {\n fullResponse = aggregate.response;\n }\n if (aggregate.reasoning) {\n fullThinking = aggregate.reasoning;\n }\n\n if (reasoning || content) {\n const now = Date.now();\n if (firstGeneratedTokenTime === null) firstGeneratedTokenTime = now;\n lastGeneratedTokenTime = now;\n }\n if (reasoning) {\n fullThinking += reasoning;\n }\n if (content) {\n fullResponse += content;\n callbacks?.onToken?.(content);\n }\n };\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n resetStallTimer();\n if (!firstChunkSeen) {\n firstChunkSeen = true;\n callbacks?.onFirstChunk?.();\n }\n buffered += decoder.decode(value, { stream: true });\n const lines = buffered.split(\"\\n\");\n buffered = lines.pop() ?? \"\";\n for (const rawLine of lines) {\n processDataLine(rawLine);\n }\n }\n\n // Flush any pending decoder state for chunk boundaries / multibyte codepoints.\n buffered += decoder.decode();\n if (buffered.length > 0) {\n const lines = buffered.split(\"\\n\");\n buffered = lines.pop() ?? \"\";\n for (const rawLine of lines) {\n processDataLine(rawLine);\n }\n }\n\n if (buffered.trim().length > 0) {\n processDataLine(buffered);\n }\n\n if (stallTimer) clearTimeout(stallTimer);\n\n if (!doneReceived && !fullResponse && !fullThinking) {\n throw new Error(\"LM Studio stream ended without content\");\n }\n\n const totalDuration = Math.max(0, Date.now() - start) * 1e6;\n const outputTokens =\n getUsageTokenCount(stats?.total_output_tokens)\n || resolveCompletionTokenCount(undefined, fullResponse, fullThinking);\n const throughput = getNativeStatNumber(stats?.tokens_per_second);\n const timeToFirstTokenSeconds = getNativeStatNumber(stats?.time_to_first_token_seconds);\n const modelLoadTimeSeconds = getNativeStatNumber(stats?.model_load_time_seconds);\n const evalCountEstimated = getUsageTokenCount(stats?.total_output_tokens) <= 0;\n // Prefer native throughput stats when available; otherwise fall back to a\n // token window measured from the streamed delta events.\n const evalDurationMs =\n throughput !== undefined && throughput > 0 && outputTokens > 0\n ? (outputTokens / throughput) * 1000\n : firstGeneratedTokenTime !== null\n && lastGeneratedTokenTime !== null\n && lastGeneratedTokenTime > firstGeneratedTokenTime\n ? lastGeneratedTokenTime - firstGeneratedTokenTime\n : Date.now() - start;\n const result: GenerateResult = {\n response: fullResponse,\n ...(fullThinking ? { thinking: fullThinking } : {}),\n totalDuration,\n loadDuration: Math.max(\n 0,\n Math.round((modelLoadTimeSeconds ?? 0) * 1e9)\n ),\n promptEvalCount: getUsageTokenCount(stats?.input_tokens),\n promptEvalDuration:\n timeToFirstTokenSeconds !== undefined\n ? Math.max(0, Math.round(timeToFirstTokenSeconds * 1e9))\n : firstGeneratedTokenTime !== null\n ? (firstGeneratedTokenTime - start) * 1e6\n : 0,\n evalCount: outputTokens,\n evalDuration: Math.max(1, Math.round(evalDurationMs * 1e6)),\n ...(evalCountEstimated ? { evalCountEstimated: true } : {}),\n };\n assertThinkingModeRespected(model, options?.think, fullResponse, fullThinking);\n\n callbacks?.onDone?.(result);\n return result;\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n if (abortedByStallTimeout && stallTimeoutMs !== undefined) {\n throw new Error(`LM Studio stream timed out after ${stallTimeoutMs}ms`);\n }\n throw new Error(\"LM Studio stream request aborted\");\n }\n throw err;\n } finally {\n if (stallTimer) clearTimeout(stallTimer);\n activeAbortControllers.delete(controller);\n }\n}\n\nexport async function unloadModel(_model: string): Promise<void> {\n // No-op for LM Studio today.\n}\n\nexport function abortOngoingRequests(): void {\n for (const controller of activeAbortControllers) {\n controller.abort();\n }\n activeAbortControllers.clear();\n}\n","import type { OllamaModel, OllamaRunningModel } from \"../types.js\";\nimport type { GenerateResult, KeepAliveValue, StreamCallbacks } from \"./ollama-client.js\";\nimport * as ollamaClient from \"./ollama-client.js\";\nimport * as lmStudioClient from \"./lm-studio-client.js\";\n\nexport interface GenerateOptions {\n temperature?: number;\n top_p?: number;\n seed?: number;\n num_predict?: number;\n keep_alive?: KeepAliveValue;\n think?: boolean;\n stall_timeout_ms?: number;\n}\n\nexport interface LLMRuntime {\n name: string;\n modelFormat?: string; // default \"gguf\"\n generate(model: string, prompt: string, opts?: GenerateOptions): Promise<GenerateResult>;\n generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n opts?: GenerateOptions\n ): Promise<GenerateResult>;\n listModels(): Promise<OllamaModel[]>;\n listRunningModels(): Promise<OllamaRunningModel[]>;\n getVersion(): Promise<string>;\n unloadModel(model: string): Promise<void>;\n setKeepAlive(keepAlive?: KeepAliveValue): void;\n abort(): void;\n}\n\nexport const SUPPORTED_RUNTIME_BACKENDS = [\"ollama\", \"lm-studio\"] as const;\nexport type RuntimeBackend = (typeof SUPPORTED_RUNTIME_BACKENDS)[number];\n\nconst RUNTIME_LABELS: Record<RuntimeBackend, string> = {\n ollama: \"Ollama\",\n \"lm-studio\": \"LM Studio\",\n};\n\nclass OllamaRuntime implements LLMRuntime {\n name = \"ollama\";\n modelFormat = \"gguf\";\n\n generate(model: string, prompt: string, opts?: GenerateOptions): Promise<GenerateResult> {\n return ollamaClient.generate(model, prompt, opts);\n }\n\n generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n opts?: GenerateOptions\n ): Promise<GenerateResult> {\n return ollamaClient.generateStream(model, prompt, callbacks, opts);\n }\n\n listModels(): Promise<OllamaModel[]> {\n return ollamaClient.listModels();\n }\n\n listRunningModels(): Promise<OllamaRunningModel[]> {\n return ollamaClient.listRunningModels();\n }\n\n getVersion(): Promise<string> {\n return ollamaClient.getOllamaVersion();\n }\n\n unloadModel(model: string): Promise<void> {\n return ollamaClient.unloadModel(model);\n }\n\n setKeepAlive(keepAlive?: KeepAliveValue): void {\n ollamaClient.setDefaultKeepAlive(keepAlive);\n }\n\n abort(): void {\n ollamaClient.abortOngoingRequests();\n }\n}\n\nclass LMStudioRuntime implements LLMRuntime {\n name: RuntimeBackend = \"lm-studio\";\n modelFormat = \"gguf\";\n\n generate(model: string, prompt: string, opts?: GenerateOptions): Promise<GenerateResult> {\n return lmStudioClient.generate(model, prompt, opts);\n }\n\n generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n opts?: GenerateOptions\n ): Promise<GenerateResult> {\n return lmStudioClient.generateStream(model, prompt, callbacks, opts);\n }\n\n listModels(): Promise<OllamaModel[]> {\n return lmStudioClient.listModels();\n }\n\n listRunningModels(): Promise<OllamaRunningModel[]> {\n return lmStudioClient.listRunningModels();\n }\n\n getVersion(): Promise<string> {\n return lmStudioClient.getLMStudioVersion();\n }\n\n unloadModel(model: string): Promise<void> {\n return lmStudioClient.unloadModel(model);\n }\n\n setKeepAlive(keepAlive?: KeepAliveValue): void {\n lmStudioClient.setDefaultKeepAlive(keepAlive);\n }\n\n abort(): void {\n lmStudioClient.abortOngoingRequests();\n }\n}\n\nlet activeRuntime: LLMRuntime = new OllamaRuntime();\n\nfunction createRuntime(backend: RuntimeBackend): LLMRuntime {\n if (backend === \"lm-studio\") return new LMStudioRuntime();\n return new OllamaRuntime();\n}\n\nexport function normalizeRuntimeBackend(value?: string): RuntimeBackend {\n const candidate = (value ?? \"ollama\").trim().toLowerCase();\n if (candidate === \"ollama\" || candidate === \"lm-studio\") {\n return candidate;\n }\n throw new Error(\n `Unsupported backend \"${value}\". Supported backends: ${SUPPORTED_RUNTIME_BACKENDS.join(\", \")}`\n );\n}\n\nexport function setRuntimeByName(backend?: string): RuntimeBackend {\n const normalized = normalizeRuntimeBackend(backend);\n if (activeRuntime.name === normalized) return normalized;\n activeRuntime = createRuntime(normalized);\n return normalized;\n}\n\nexport function getRuntime(): LLMRuntime {\n return activeRuntime;\n}\n\nexport function setRuntime(runtime: LLMRuntime): void {\n activeRuntime = runtime;\n}\n\nexport function getRuntimeDisplayName(runtimeName: string = activeRuntime.name): string {\n if (runtimeName === \"lm-studio\") return RUNTIME_LABELS[\"lm-studio\"];\n if (runtimeName === \"ollama\") return RUNTIME_LABELS.ollama;\n return runtimeName;\n}\n\nexport function getRuntimeModelInstallHint(runtimeName: string = activeRuntime.name): string {\n if (runtimeName === \"lm-studio\") {\n return \"Download/select a model in LM Studio, then load it in the local server.\";\n }\n if (runtimeName === \"ollama\") {\n return \"Pull one with: ollama pull <model>\";\n }\n return \"Add at least one model in your selected runtime.\";\n}\n\nexport function getRuntimeSetupHints(runtimeName: string = activeRuntime.name): string[] {\n if (runtimeName === \"lm-studio\") {\n return [\n \"Start LM Studio local server (Developer tab -> Local Server).\",\n \"Optionally set LM_STUDIO_BASE_URL if your server is not on http://127.0.0.1:1234.\",\n ];\n }\n if (runtimeName === \"ollama\") {\n return [\n \"Start it with: ollama serve\",\n \"Install it at: https://ollama.com\",\n ];\n }\n return [\"Verify the runtime is reachable and configured correctly.\"];\n}\n\n// ── Proxy exports (drop-in replacements for ollama-client imports) ──\n\nexport function generate(\n model: string,\n prompt: string,\n opts?: GenerateOptions\n): Promise<GenerateResult> {\n return activeRuntime.generate(model, prompt, opts);\n}\n\nexport function generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n opts?: GenerateOptions\n): Promise<GenerateResult> {\n return activeRuntime.generateStream(model, prompt, callbacks, opts);\n}\n\nexport function listModels(): Promise<OllamaModel[]> {\n return activeRuntime.listModels();\n}\n\nexport function listRunningModels(): Promise<OllamaRunningModel[]> {\n return activeRuntime.listRunningModels();\n}\n\nexport function getRuntimeVersion(): Promise<string> {\n return activeRuntime.getVersion();\n}\n\nexport function unloadModel(model: string): Promise<void> {\n return activeRuntime.unloadModel(model);\n}\n\nexport function setRuntimeKeepAlive(keepAlive?: KeepAliveValue): void {\n activeRuntime.setKeepAlive(keepAlive);\n}\n\nexport function abortOngoingRequests(): void {\n activeRuntime.abort();\n}\n\nexport function getRuntimeName(): string {\n return activeRuntime.name;\n}\n\nexport function getRuntimeModelFormat(): string {\n return activeRuntime.modelFormat ?? \"gguf\";\n}\n\nexport async function resolveRuntimeModel(model: string): Promise<OllamaModel | null> {\n if (activeRuntime.name === \"lm-studio\") {\n return lmStudioClient.resolveModel(model);\n }\n\n const knownModels = await activeRuntime.listModels();\n const matchedModel = knownModels.find((candidate) => candidate.name === model);\n if (matchedModel) return matchedModel;\n return {\n name: model,\n size: 0,\n modelFormat: activeRuntime.modelFormat ?? \"gguf\",\n };\n}\n\n// Re-export types from ollama-client for convenience\nexport type { GenerateResult, KeepAliveValue, StreamCallbacks } from \"./ollama-client.js\";\n","import { createHash } from \"node:crypto\";\nimport chalk from \"chalk\";\nimport {\n listModels,\n getRuntimeVersion,\n getRuntimeName,\n getRuntimeModelFormat,\n getRuntimeDisplayName,\n getRuntimeModelInstallHint,\n getRuntimeSetupHints,\n resolveRuntimeModel,\n setRuntimeKeepAlive,\n setRuntimeByName,\n unloadModel,\n} from \"../core/runtime.js\";\nimport { getHardwareInfo } from \"../core/hardware.js\";\nimport { runPerformanceBench } from \"../benchmarks/performance.js\";\nimport { runReasoningBench } from \"../benchmarks/reasoning.js\";\nimport { runMathBench } from \"../benchmarks/math.js\";\nimport { runCodingBench } from \"../benchmarks/coding.js\";\nimport { runInstructionFollowingBench } from \"../benchmarks/instruction-following.js\";\nimport { runStructuredOutputBench } from \"../benchmarks/structured-output.js\";\nimport { runMultilingualBench } from \"../benchmarks/multilingual.js\";\nimport { computeFitness } from \"../scoring/fitness.js\";\nimport { printHardwareTable, printPerformanceTable, printQualityTable, printSummaryTable } from \"../ui/results-table.js\";\nimport { printVerdict } from \"../ui/verdict.js\";\nimport { stepHeader, errorMsg, warnMsg, infoMsg, createSpinner, successMsg } from \"../ui/progress.js\";\nimport { saveResult } from \"../core/store.js\";\nimport { uploadBenchResult } from \"../core/uploader.js\";\nimport { promptShare } from \"../ui/share-prompt.js\";\nimport { resolveSubmitterForShare } from \"../ui/submitter-prompt.js\";\nimport { openUrl } from \"../utils.js\";\nimport { showTelemetryNotice, trackBenchStarted, trackBenchCompleted, trackBenchShared, flushTelemetry } from \"../core/telemetry.js\";\nimport { supportsUnicode } from \"../ui/terminal.js\";\nimport { promptThinkingMode } from \"../ui/thinking-prompt.js\";\nimport type { BenchResult, BenchEnvironment, HardwareInfo, ModelInfo, OllamaModel, QualityMetrics, RunMetadata } from \"../types.js\";\nimport { buildBenchmarkProfileMetadata, BENCHMARK_PROFILE_VERSION } from \"../benchmarks/profile.js\";\n\nconst BENCHMARK_SPEC_VERSION = \"0.2.1\";\nconst PROMPT_PACK_VERSION = \"0.1.0\";\n\nexport interface BenchOptions {\n model?: string;\n perfOnly?: boolean;\n setExitCode?: boolean;\n perfWarmupTimeoutMs?: number;\n perfPromptTimeoutMs?: number;\n perfMinSuccessfulPrompts?: number;\n qualityTimeoutMs?: number;\n codingTimeoutMs?: number;\n streamStallTimeoutMs?: number;\n perfStrict?: boolean;\n share?: boolean; // true = --share, false = --no-share, undefined = prompt\n ciNoMenu?: boolean; // running in CI mode\n json?: boolean; // output JSON only, no UI\n keepAlive?: string | number; // forwarded to runtime keep_alive (if supported)\n unloadAfterBench?: boolean; // unload model after each model benchmark lifecycle\n thinking?: boolean; // undefined = interactive prompt, true/false = CLI override\n backend?: string; // runtime backend (ollama | lm-studio)\n}\n\nexport interface BenchOutcome {\n results: BenchResult[];\n failedModels: string[];\n}\n\nexport async function benchCommand(options: BenchOptions): Promise<BenchOutcome> {\n if (options.backend !== undefined) {\n setRuntimeByName(options.backend);\n }\n const runtimeName = getRuntimeName();\n const runtimeDisplayName = getRuntimeDisplayName(runtimeName);\n const runtimeModelHint = getRuntimeModelInstallHint(runtimeName);\n const runtimeSetupHints = getRuntimeSetupHints(runtimeName);\n\n const shouldSetExitCode = options.setExitCode !== false;\n const silent = options.json === true;\n const shouldUnloadAfterModel =\n options.unloadAfterBench ?? (!options.model || options.ciNoMenu === true);\n\n // Detect hardware\n if (!silent) stepHeader(\"Hardware Detection\");\n const spinner = createSpinner(\"Detecting hardware...\");\n if (!silent) spinner.start();\n let hardware: HardwareInfo;\n try {\n hardware = await getHardwareInfo();\n if (!silent) {\n spinner.succeed(\"Hardware detected\");\n printHardwareTable(hardware);\n if (hardware.powerMode === \"low-power\") {\n infoMsg(\"Low-power mode detected — results will reflect energy-saving performance.\");\n }\n if (\n hardware.cpuCurrentSpeedGHz != null &&\n hardware.cpuFreqGHz != null &&\n hardware.cpuFreqGHz > 0 &&\n hardware.cpuCurrentSpeedGHz / hardware.cpuFreqGHz < 0.8\n ) {\n infoMsg(\n `CPU running at ${hardware.cpuCurrentSpeedGHz.toFixed(1)} GHz / ${hardware.cpuFreqGHz.toFixed(1)} GHz nominal — possible throttling.`\n );\n }\n }\n } catch (err) {\n if (!silent) spinner.fail(\"Hardware detection failed\");\n if (!silent && err instanceof Error) errorMsg(err.message);\n if (shouldSetExitCode) process.exitCode = 1;\n return { results: [], failedModels: [] };\n }\n\n // Detect runtime version\n let runtimeVersion = \"unknown\";\n try {\n runtimeVersion = await getRuntimeVersion();\n } catch (err) {\n if (!silent) {\n warnMsg(`Could not detect ${runtimeDisplayName} version (continuing without it).`);\n if (err instanceof Error) warnMsg(err.message);\n }\n }\n\n // Determine which models to bench\n let modelNames: string[];\n let allModels: OllamaModel[] = [];\n if (options.model) {\n modelNames = [options.model];\n try {\n allModels = await listModels();\n } catch {\n // Non-fatal: model info is optional\n }\n } else {\n if (!silent) stepHeader(\"Discovering Models\");\n const spinnerModels = createSpinner(\"Fetching model list...\");\n if (!silent) spinnerModels.start();\n try {\n allModels = await listModels();\n modelNames = allModels.map((m) => m.name);\n if (!silent) spinnerModels.succeed(`Found ${allModels.length} model(s)`);\n } catch (err) {\n if (!silent) {\n spinnerModels.fail(`Cannot connect to ${runtimeDisplayName}`);\n errorMsg(`Make sure ${runtimeDisplayName} is installed and running.`);\n for (const hint of runtimeSetupHints) {\n errorMsg(` • ${hint}`);\n }\n if (err instanceof Error) errorMsg(err.message);\n }\n if (shouldSetExitCode) process.exitCode = 1;\n return { results: [], failedModels: [] };\n }\n\n if (modelNames.length === 0) {\n if (!silent) errorMsg(`No models found. ${runtimeModelHint}`);\n if (shouldSetExitCode) process.exitCode = 1;\n return { results: [], failedModels: [] };\n }\n }\n\n // Show one-time telemetry notice\n if (!silent) await showTelemetryNotice();\n\n setRuntimeKeepAlive(options.keepAlive);\n\n // Resolve thinking mode\n let thinkEnabled: boolean;\n if (options.thinking !== undefined) {\n thinkEnabled = options.thinking;\n } else if (!silent && !options.ciNoMenu) {\n thinkEnabled = await promptThinkingMode();\n } else {\n thinkEnabled = false;\n }\n if (!silent && thinkEnabled) {\n infoMsg(\"Thinking mode enabled — models that support it will use extended reasoning.\");\n }\n if (!silent) {\n infoMsg(\n `Benchmark profile ${BENCHMARK_PROFILE_VERSION}: temperature=0, top_p=1, seed=42, context=runtime default.`\n );\n }\n\n try {\n // Run benchmarks for each model\n const results: BenchResult[] = [];\n const failedModels: string[] = [];\n\n for (const modelName of modelNames) {\n if (!silent) {\n const label = ` Benchmarking: ${modelName} `;\n const innerWidth = Math.max(label.length, 30);\n const [tl, h, tr, v, bl, br] = supportsUnicode\n ? [\"\\u2554\", \"\\u2550\", \"\\u2557\", \"\\u2551\", \"\\u255A\", \"\\u255D\"]\n : [\"+\", \"=\", \"+\", \"|\", \"+\", \"+\"];\n console.log(chalk.bold.cyan(`\\n${tl}${h.repeat(innerWidth)}${tr}`));\n console.log(chalk.bold.cyan(`${v}${label.padEnd(innerWidth)}${v}`));\n console.log(chalk.bold.cyan(`${bl}${h.repeat(innerWidth)}${br}`));\n }\n\n const benchStartTime = Date.now();\n await trackBenchStarted({\n model: modelName,\n os: hardware.os,\n arch: hardware.arch,\n cpuCores: hardware.cpuCores,\n ramGb: hardware.totalMemoryGB,\n });\n\n try {\n // Performance benchmark\n if (!silent) stepHeader(\"Performance Benchmark\");\n const perfResult = await runPerformanceBench(modelName, {\n warmupTimeoutMs: options.perfWarmupTimeoutMs,\n promptTimeoutMs: options.perfPromptTimeoutMs,\n minSuccessfulPrompts: options.perfMinSuccessfulPrompts,\n failOnPromptError: options.perfStrict,\n think: thinkEnabled,\n streamStallTimeoutMs: options.streamStallTimeoutMs,\n });\n const perf = perfResult.metrics;\n const benchEnvironment: BenchEnvironment | undefined = perfResult.benchEnvironment;\n if (!silent) printPerformanceTable(perf, benchEnvironment);\n\n // Quality benchmarks (unless --perf-only)\n let quality: QualityMetrics | null = null;\n if (!options.perfOnly) {\n const qualityTimeoutMs = options.qualityTimeoutMs;\n const codingTimeoutMs = options.codingTimeoutMs ?? options.qualityTimeoutMs;\n const commonQualityOpts = {\n think: thinkEnabled,\n ...(qualityTimeoutMs !== undefined ? { timeoutMs: qualityTimeoutMs } : {}),\n };\n\n if (!silent) stepHeader(\"Quality Benchmark — Reasoning\");\n const reasoning = await runReasoningBench(modelName, commonQualityOpts);\n\n if (!silent) stepHeader(\"Quality Benchmark — Math\");\n const math = await runMathBench(modelName, commonQualityOpts);\n\n if (!silent) stepHeader(\"Quality Benchmark — Coding\");\n const coding = await runCodingBench(modelName, {\n think: thinkEnabled,\n ...(codingTimeoutMs !== undefined ? { timeoutMs: codingTimeoutMs } : {}),\n });\n\n if (!silent) stepHeader(\"Quality Benchmark — Instruction Following\");\n const instructionFollowing = await runInstructionFollowingBench(modelName, commonQualityOpts);\n\n if (!silent) stepHeader(\"Quality Benchmark — Structured Output\");\n const structuredOutput = await runStructuredOutputBench(modelName, commonQualityOpts);\n\n if (!silent) stepHeader(\"Quality Benchmark — Multilingual\");\n const multilingual = await runMultilingualBench(modelName, commonQualityOpts);\n\n quality = { reasoning, math, coding, instructionFollowing, structuredOutput, multilingual };\n }\n\n // Compute fitness\n const fitness = computeFitness(perf, quality, hardware, benchEnvironment);\n if (!silent) {\n if (quality) {\n printQualityTable(quality, fitness.qualityScore?.timePenalties);\n }\n printVerdict(modelName, fitness);\n }\n\n // Build model info from discovered models\n const matchedModel = allModels.find((m) => m.name === modelName);\n let resolvedModel = matchedModel;\n if (matchedModel?.modelFormat === undefined) {\n try {\n resolvedModel = await resolveRuntimeModel(modelName) ?? matchedModel;\n } catch {\n resolvedModel = matchedModel;\n }\n }\n const modelMetadataSource = resolvedModel ?? matchedModel;\n const modelInfo: ModelInfo = modelMetadataSource\n ? {\n parameterSize: modelMetadataSource.parameterSize,\n quantization: modelMetadataSource.quantization,\n family: modelMetadataSource.family,\n // Persist actual observed thinking behavior from the benchmark run.\n thinkingDetected: perfResult.thinkingDetected,\n }\n : { thinkingDetected: perfResult.thinkingDetected };\n\n // Build result without hash first, then compute hash\n const partialResult: Omit<BenchResult, \"metadata\"> & { metadata: Omit<RunMetadata, \"rawLogHash\"> } = {\n model: modelName,\n modelInfo,\n hardware,\n performance: perf,\n quality,\n fitness,\n benchEnvironment,\n timestamp: new Date().toISOString(),\n metadata: {\n benchmarkSpecVersion: BENCHMARK_SPEC_VERSION,\n promptPackVersion: PROMPT_PACK_VERSION,\n runtimeVersion,\n runtimeBackend: getRuntimeName(),\n modelFormat:\n resolvedModel?.modelFormat\n ?? (getRuntimeName() === \"ollama\" ? getRuntimeModelFormat() : \"unknown\"),\n benchmarkProfile: buildBenchmarkProfileMetadata(thinkEnabled),\n },\n };\n const rawLogHash = createHash(\"sha256\")\n .update(JSON.stringify(partialResult))\n .digest(\"hex\");\n\n const benchResult: BenchResult = {\n ...partialResult,\n metadata: { ...partialResult.metadata, rawLogHash },\n };\n results.push(benchResult);\n\n await trackBenchCompleted({\n model: modelName,\n verdict: fitness.verdict,\n globalScore: fitness.globalScore,\n tps: perf.tokensPerSecond,\n durationMs: Date.now() - benchStartTime,\n });\n\n // Persist result locally\n try {\n const savedPath = await saveResult(benchResult);\n if (!silent) successMsg(`Result saved: ${savedPath}`);\n } catch (err) {\n if (!silent) {\n warnMsg(\"Could not save benchmark result locally.\");\n if (err instanceof Error) {\n warnMsg(err.message);\n }\n }\n }\n\n // Upload immediately after each model (when --share is enabled and quality was run)\n if (!options.perfOnly && !silent && options.share === true) {\n const uploadSpinner = createSpinner(\"Uploading result...\");\n uploadSpinner.start();\n try {\n const uploaded = await uploadBenchResult(benchResult);\n uploadSpinner.succeed(`Shared! ${uploaded.url}`);\n if (uploaded.rankGlobalPct != null) {\n const parts: string[] = [`Top ${uploaded.rankGlobalPct}% globally`];\n if (uploaded.rankCpuPct != null) {\n parts.push(`Top ${uploaded.rankCpuPct}% on ${benchResult.hardware.cpu}`);\n }\n successMsg(` → ${parts.join(\" · \")}`);\n }\n await trackBenchShared({ model: benchResult.model, verdict: benchResult.fitness.verdict });\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Unknown error\";\n uploadSpinner.fail(`Upload failed: ${msg}`);\n }\n }\n } catch (err) {\n failedModels.push(modelName);\n if (!silent) {\n errorMsg(`Failed to benchmark ${modelName}`);\n if (err instanceof Error) errorMsg(err.message);\n }\n } finally {\n if (shouldUnloadAfterModel) {\n try {\n await unloadModel(modelName);\n } catch (err) {\n if (!silent) {\n warnMsg(`Could not unload model ${modelName} after benchmark.`);\n if (err instanceof Error) warnMsg(err.message);\n }\n }\n }\n }\n }\n\n // Summary table if multiple models\n if (!silent && results.length > 1) {\n stepHeader(\"Summary\");\n printSummaryTable(results);\n }\n\n if (failedModels.length > 0) {\n if (!silent) {\n errorMsg(\n `Benchmark finished with ${failedModels.length} failure(s): ${failedModels.join(\", \")}`\n );\n }\n if (shouldSetExitCode) process.exitCode = 1;\n }\n\n // Share prompt (interactive) for results not yet uploaded (i.e. --share was not passed)\n const canShareResults = !options.perfOnly;\n if (!canShareResults) {\n if (!silent && options.share === true) {\n warnMsg(\"Sharing is not available in performance-only mode. Run a full benchmark to upload results.\");\n }\n } else if (!silent && results.length > 0 && options.share !== true && options.share !== false && !options.ciNoMenu) {\n for (const result of results) {\n let decision: \"share\" | \"skip\" = \"skip\";\n try {\n decision = await promptShare(result);\n } catch (err) {\n warnMsg(\"Could not open share prompt; skipping upload.\");\n if (err instanceof Error) {\n warnMsg(err.message);\n }\n decision = \"skip\";\n }\n\n if (decision === \"share\") {\n let uploadPayload: BenchResult = result;\n let submitterEmail: string | undefined;\n\n try {\n const submitter = await resolveSubmitterForShare();\n if (submitter) {\n uploadPayload = {\n ...result,\n submitter: {\n nickname: submitter.nickname,\n emailHash: submitter.emailHash,\n },\n };\n submitterEmail = submitter.email;\n }\n } catch (err) {\n warnMsg(\"Could not collect benchmark profile; continuing without it.\");\n if (err instanceof Error) {\n warnMsg(err.message);\n }\n }\n\n const uploadSpinner = createSpinner(\"Uploading result...\");\n uploadSpinner.start();\n try {\n const uploaded = await uploadBenchResult(uploadPayload, { submitterEmail });\n uploadSpinner.succeed(`Shared! ${uploaded.url}`);\n if (uploaded.rankGlobalPct != null) {\n const parts: string[] = [`Top ${uploaded.rankGlobalPct}% globally`];\n if (uploaded.rankCpuPct != null) {\n parts.push(`Top ${uploaded.rankCpuPct}% on ${result.hardware.cpu}`);\n }\n successMsg(` → ${parts.join(\" · \")}`);\n }\n await trackBenchShared({ model: result.model, verdict: result.fitness.verdict });\n openUrl(uploaded.url);\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Unknown error\";\n uploadSpinner.fail(`Upload failed: ${msg}`);\n }\n }\n }\n }\n\n // JSON mode: output results as JSON to stdout\n if (silent) {\n console.log(JSON.stringify(results, null, 2));\n }\n\n // Fire-and-forget telemetry flush — do NOT await shutdown() as PostHog\n // keeps the event loop alive indefinitely. Give it 2 s then move on.\n flushTelemetry().catch(() => {});\n await new Promise<void>((resolve) => {\n const t = setTimeout(resolve, 2_000);\n if (typeof t === \"object\" && \"unref\" in t) (t as NodeJS.Timeout).unref();\n });\n\n return { results, failedModels };\n } finally {\n // Avoid leaking keep_alive preferences across separate CLI invocations/tests.\n setRuntimeKeepAlive(undefined);\n }\n}\n","import si from \"systeminformation\";\nimport type { HardwareInfo } from \"../types.js\";\nimport os from \"node:os\";\nimport { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\n\ntype PowerMode = \"low-power\" | \"balanced\" | \"performance\" | \"unknown\";\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction looksLikeGpuDescriptor(value: string): boolean {\n return /\\b(radeon|graphics|geforce|rtx|gtx|arc|iris|uhd|quadro|tesla|adreno|mali|powervr)\\b/i.test(value);\n}\n\nfunction splitCpuAndInferredGpu(cpuLabel: string): { cpu: string; inferredGpu: string | null } {\n const normalized = normalizeWhitespace(cpuLabel);\n const withGpuMatch = normalized.match(/\\s+(?:w\\/\\s*|with\\s+)(.+)$/i);\n if (!withGpuMatch?.index) {\n return { cpu: normalized, inferredGpu: null };\n }\n\n const inferredGpu = normalizeWhitespace(withGpuMatch[1] ?? \"\");\n if (!looksLikeGpuDescriptor(inferredGpu)) {\n return { cpu: normalized, inferredGpu: null };\n }\n const cpu = normalizeWhitespace(normalized.slice(0, withGpuMatch.index));\n return {\n cpu: cpu || normalized,\n inferredGpu: inferredGpu || null,\n };\n}\n\nfunction execCommand(cmd: string, args: string[], timeoutMs = 3000): Promise<string> {\n return new Promise((resolve) => {\n const child = execFile(cmd, args, { timeout: timeoutMs }, (err, stdout) => {\n if (err) return resolve(\"\");\n resolve(stdout.trim());\n });\n child.on(\"error\", () => resolve(\"\"));\n });\n}\n\nasync function detectPowerModeMacOS(): Promise<PowerMode> {\n const output = await execCommand(\"pmset\", [\"-g\"]);\n if (!output) return \"unknown\";\n const match = output.match(/lowpowermode\\s+(\\d)/i);\n if (match) return match[1] === \"1\" ? \"low-power\" : \"balanced\";\n return \"balanced\";\n}\n\nasync function detectPowerModeLinux(): Promise<PowerMode> {\n try {\n const governor = await readFile(\n \"/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor\",\n \"utf-8\"\n );\n const g = governor.trim().toLowerCase();\n if (g === \"powersave\") return \"low-power\";\n if (g === \"performance\") return \"performance\";\n return \"balanced\";\n } catch {\n return \"unknown\";\n }\n}\n\nasync function detectPowerModeWindows(): Promise<PowerMode> {\n const output = await execCommand(\"powercfg\", [\"/getactivescheme\"]);\n if (!output) return \"unknown\";\n const match = output.match(/\\(([^)]+)\\)/);\n if (!match) return \"unknown\";\n const name = match[1].toLowerCase();\n if (name.includes(\"power saver\") || name.includes(\"économie\")) return \"low-power\";\n if (name.includes(\"high performance\") || name.includes(\"performances\")) return \"performance\";\n return \"balanced\";\n}\n\nasync function detectMachineModel(): Promise<string | null> {\n try {\n if (process.platform === \"darwin\") {\n // system_profiler gives the marketing name (e.g. \"MacBook Air\", \"Mac mini\")\n const output = await execCommand(\"system_profiler\", [\"SPHardwareDataType\"]);\n const match = output.match(/Model Name:\\s*(.+)/i);\n if (match) return match[1].trim();\n return null;\n }\n // Linux / Windows: si.system() often returns useful model info\n // (e.g. \"ThinkPad X1 Carbon\", \"Dell XPS 15\", \"ASUS ROG Strix\")\n const sys = await si.system();\n const parts = [sys.manufacturer, sys.model].filter(\n (p) => p && p !== \"Unknown\" && p !== \"To Be Filled By O.E.M.\" && p !== \"System Product Name\"\n );\n return parts.length > 0 ? parts.join(\" \") : null;\n } catch {\n return null;\n }\n}\n\nasync function detectPowerMode(): Promise<PowerMode> {\n try {\n switch (process.platform) {\n case \"darwin\":\n return await detectPowerModeMacOS();\n case \"linux\":\n return await detectPowerModeLinux();\n case \"win32\":\n return await detectPowerModeWindows();\n default:\n return \"unknown\";\n }\n } catch {\n return \"unknown\";\n }\n}\n\nexport type ThermalPressure = \"nominal\" | \"moderate\" | \"heavy\" | \"critical\" | \"unknown\";\n\nexport async function detectThermalPressure(): Promise<ThermalPressure> {\n try {\n if (process.platform === \"darwin\") {\n const output = await execCommand(\"pmset\", [\"-g\", \"therm\"]);\n if (!output) return \"unknown\";\n const match = output.match(/CPU_Speed_Limit\\s*=\\s*(\\d+)/i);\n if (!match) return \"unknown\";\n const limit = parseInt(match[1], 10);\n if (limit >= 100) return \"nominal\";\n if (limit >= 80) return \"moderate\";\n if (limit >= 50) return \"heavy\";\n return \"critical\";\n }\n // Other OS: use CPU temperature as proxy\n const temp = await si.cpuTemperature();\n const main = temp.main;\n if (main == null || main <= 0) return \"unknown\";\n if (main < 80) return \"nominal\";\n if (main < 90) return \"moderate\";\n if (main < 100) return \"heavy\";\n return \"critical\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport async function detectBatteryPowered(): Promise<boolean | undefined> {\n try {\n if (process.platform === \"darwin\") {\n const output = await execCommand(\"pmset\", [\"-g\", \"ps\"]);\n if (!output) return undefined;\n if (output.includes(\"Battery Power\")) return true;\n if (output.includes(\"AC Power\")) return false;\n return undefined;\n }\n const battery = await si.battery();\n if (!battery.hasBattery) return undefined;\n if (typeof battery.acConnected === \"boolean\") return !battery.acConnected;\n if (typeof battery.isCharging === \"boolean\") return !battery.isCharging;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function getSwapUsedGB(): Promise<number> {\n try {\n const mem = await si.mem();\n return +(mem.swapused / 1024 / 1024 / 1024).toFixed(2);\n } catch {\n return 0;\n }\n}\n\nexport async function getHardwareInfo(): Promise<HardwareInfo> {\n const [cpu, mem, graphics, osInfo, memLayout, powerMode, cpuSpeed, machineModel] = await Promise.all([\n si.cpu(),\n si.mem(),\n si.graphics(),\n si.osInfo(),\n si.memLayout(),\n detectPowerMode(),\n si.cpuCurrentSpeed().catch(() => null),\n detectMachineModel(),\n ]);\n\n const gpuController = graphics.controllers[0];\n const gpuNames = graphics.controllers\n .map((g) => g.model)\n .filter(Boolean)\n .join(\", \");\n const cpuLabelRaw = normalizeWhitespace(`${cpu.manufacturer} ${cpu.brand}`);\n const { cpu: cpuLabel, inferredGpu } = splitCpuAndInferredGpu(cpuLabelRaw);\n const defaultIntegratedGpu =\n process.platform === \"darwin\" ? \"Integrated / Apple Silicon\" : \"Integrated / Unknown\";\n\n const gpuCoresRaw = gpuController?.cores;\n const gpuCores = gpuCoresRaw ? parseInt(String(gpuCoresRaw), 10) : null;\n\n const memType = memLayout.length > 0 ? memLayout[0].type : null;\n\n return {\n cpu: cpuLabel,\n cpuCores: cpu.cores,\n cpuPCores: cpu.performanceCores || null,\n cpuECores: cpu.efficiencyCores || null,\n cpuFreqGHz: cpu.speed || null,\n totalMemoryGB: +(mem.total / 1024 / 1024 / 1024).toFixed(1),\n freeMemoryGB: +(mem.available / 1024 / 1024 / 1024).toFixed(1),\n memoryType: memType || null,\n swapTotalGB: +(mem.swaptotal / 1024 / 1024 / 1024).toFixed(1),\n swapUsedGB: +(mem.swapused / 1024 / 1024 / 1024).toFixed(1),\n gpu: normalizeWhitespace(gpuNames) || inferredGpu || defaultIntegratedGpu,\n gpuCores: gpuCores && !isNaN(gpuCores) ? gpuCores : null,\n gpuVramMB: gpuController?.vram ?? null,\n os: `${osInfo.distro} ${osInfo.release}`,\n arch: os.arch(),\n machineModel: machineModel || null,\n powerMode,\n cpuCurrentSpeedGHz: cpuSpeed?.avg ?? null,\n };\n}\n\nexport async function getCpuLoad(): Promise<number> {\n try {\n const load = await si.currentLoad();\n return +load.currentLoad.toFixed(1);\n } catch {\n return -1;\n }\n}\n\nexport async function getMemoryUsage(): Promise<{\n usedGB: number;\n totalGB: number;\n percent: number;\n}> {\n const mem = await si.mem();\n const totalGB = mem.total / 1024 / 1024 / 1024;\n const usedGB = (mem.total - mem.available) / 1024 / 1024 / 1024;\n return {\n usedGB: +usedGB.toFixed(1),\n totalGB: +totalGB.toFixed(1),\n percent: +((usedGB / totalGB) * 100).toFixed(1),\n };\n}\n","import ora, { type Ora } from \"ora\";\nimport chalk from \"chalk\";\nimport { supportsUnicode } from \"./terminal.js\";\n\nconst FUN_PHRASES = [\n \"Convincing the model to cooperate...\",\n \"Politely asking for more VRAM...\",\n \"Hallucinating responsibly...\",\n \"Converting caffeine to tokens...\",\n \"Fine-tuning the vibes...\",\n \"Warming up the silicon...\",\n \"Counting parameters one by one...\",\n \"Negotiating with the attention heads...\",\n \"Bribing the GPU scheduler...\",\n \"Tokenizing your patience...\",\n \"Performing gradient ascent on morale...\",\n \"Asking the model to show its work...\",\n \"Softmaxing expectations...\",\n \"Backpropagating through bureaucracy...\",\n \"Sampling from the distribution of outcomes...\",\n \"Applying dropout to your worries...\",\n \"Checking if P equals NP real quick...\",\n \"Loading weights... and lifting them...\",\n \"Running inference at the speed of thought...\",\n \"Embedding this moment in vector space...\",\n \"Quantizing your anticipation to 4 bits...\",\n \"Teaching the model some manners...\",\n \"Reticulating neural splines...\",\n \"Optimizing the loss of your free time...\",\n \"Asking nicely for coherent output...\",\n \"Unrolling loops and rolling eyes...\",\n \"Pruning unnecessary neurons...\",\n \"Feeding the transformer its daily prompts...\",\n \"Computing the meaning of life (in tok/s)...\",\n \"Performing attention — please hold...\",\n \"Cross-referencing with the vibes database...\",\n \"Adjusting temperature for maximum spice...\",\n \"Benchmarking the benchmarker...\",\n \"Consulting the oracle (it's just softmax)...\",\n \"Defragmenting the latent space...\",\n \"Compiling excuses for slow inference...\",\n \"Measuring tokens per existential crisis...\",\n \"Aligning the model with your expectations...\",\n \"Running a vibe check on the weights...\",\n \"Interpolating between hope and reality...\",\n \"Insert disk 2 and press left mouse button...\",\n \"Guru Meditation imminent — stay calm...\",\n \"Running LLM on an Amiga 500 would be faster... maybe...\",\n \"Asking Kickstart ROM for a second opinion...\",\n \"Swapping chip RAM for more tokens...\",\n];\n\nconst ROTATION_INTERVAL_MS = 3500;\n\nconst activeSpinners = new Set<Ora>();\n\nprocess.on(\"exit\", () => {\n for (const s of activeSpinners) {\n try {\n s.stop();\n } catch {\n // ignore\n }\n }\n activeSpinners.clear();\n});\n\nfunction attachFunSuffix(spinner: Ora): Ora {\n let timer: ReturnType<typeof setInterval> | null = null;\n let phraseIndex = Math.floor(Math.random() * FUN_PHRASES.length);\n\n const origStart = spinner.start.bind(spinner);\n const origStop = spinner.stop.bind(spinner);\n const origSucceed = spinner.succeed.bind(spinner);\n const origFail = spinner.fail.bind(spinner);\n\n function clearTimer(): void {\n if (timer !== null) {\n clearInterval(timer);\n timer = null;\n }\n spinner.suffixText = \"\";\n activeSpinners.delete(spinner);\n }\n\n function rotateSuffix(): void {\n phraseIndex = (phraseIndex + 1) % FUN_PHRASES.length;\n spinner.suffixText = chalk.dim(` — ${FUN_PHRASES[phraseIndex]}`);\n }\n\n spinner.start = ((text?: string) => {\n activeSpinners.add(spinner);\n origStart(text);\n spinner.suffixText = chalk.dim(` — ${FUN_PHRASES[phraseIndex]}`);\n timer = setInterval(rotateSuffix, ROTATION_INTERVAL_MS);\n return spinner;\n }) as typeof spinner.start;\n\n spinner.stop = (() => {\n clearTimer();\n return origStop();\n }) as typeof spinner.stop;\n\n spinner.succeed = ((text?: string) => {\n clearTimer();\n return origSucceed(text);\n }) as typeof spinner.succeed;\n\n spinner.fail = ((text?: string) => {\n clearTimer();\n return origFail(text);\n }) as typeof spinner.fail;\n\n return spinner;\n}\n\nexport function createSpinner(text: string): Ora {\n const spinner = ora({\n text,\n color: \"cyan\",\n // Avoid interfering with readline-driven interactive menus.\n discardStdin: false,\n });\n return attachFunSuffix(spinner);\n}\n\nconst STEP_MARKER = supportsUnicode ? \"\\u25B8\" : \">\";\nconst CHECK_MARK = supportsUnicode ? \"\\u2713\" : \"ok\";\nconst CROSS_MARK = supportsUnicode ? \"\\u2717\" : \"!!\";\nconst WARN_MARK = supportsUnicode ? \"\\u26A0\" : \"!!\";\nconst INFO_MARK = supportsUnicode ? \"\\u2139\" : \"i\";\n\nexport function stepHeader(text: string): void {\n console.log(chalk.bold.blue(`\\n${STEP_MARKER} ${text}`));\n}\n\nexport function subStep(text: string): void {\n console.log(chalk.dim(` ${text}`));\n}\n\nexport function successMsg(text: string): void {\n console.log(chalk.green(` ${CHECK_MARK} ${text}`));\n}\n\nexport function infoMsg(text: string): void {\n console.log(chalk.cyan(` ${INFO_MARK} ${text}`));\n}\n\nexport function warnMsg(text: string): void {\n console.log(chalk.yellow(` ${WARN_MARK} ${text}`));\n}\n\nexport function errorMsg(text: string): void {\n console.log(chalk.red(` ${CROSS_MARK} ${text}`));\n}\n","export const supportsUnicode: boolean =\n process.platform !== \"win32\" ||\n Boolean(process.env.WT_SESSION) ||\n Boolean(process.env.TERM_PROGRAM);\n\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*[A-Za-z]/g;\n\nexport function stripAnsi(value: string): string {\n return value.replace(ANSI_RE, \"\");\n}\n","import type { GenerateOptions } from \"../core/runtime.js\";\nimport type { BenchmarkProfileMetadata } from \"../types.js\";\n\nexport const BENCHMARK_PROFILE_VERSION = \"v1\";\nexport const BENCHMARK_PROFILE_SEED = 42;\nexport const BENCHMARK_PROFILE_TOP_P = 1;\nexport const BENCHMARK_PROFILE_TEMPERATURE = 0;\n\nexport function withBenchmarkProfile(\n opts: Omit<GenerateOptions, \"temperature\" | \"top_p\" | \"seed\"> = {}\n): GenerateOptions {\n return {\n temperature: BENCHMARK_PROFILE_TEMPERATURE,\n top_p: BENCHMARK_PROFILE_TOP_P,\n seed: BENCHMARK_PROFILE_SEED,\n ...opts,\n };\n}\n\nexport function buildBenchmarkProfileMetadata(thinkEnabled: boolean): BenchmarkProfileMetadata {\n return {\n version: BENCHMARK_PROFILE_VERSION,\n sampling: {\n temperature: BENCHMARK_PROFILE_TEMPERATURE,\n topP: BENCHMARK_PROFILE_TOP_P,\n seed: BENCHMARK_PROFILE_SEED,\n },\n thinkingMode: thinkEnabled ? \"enabled\" : \"disabled\",\n contextWindowTokens: null,\n contextPolicy: \"runtime-default\",\n };\n}\n","import { abortOngoingRequests, generateStream, listRunningModels, getRuntimeName } from \"../core/runtime.js\";\nimport { getMemoryUsage, detectThermalPressure, detectBatteryPowered, getSwapUsedGB, getCpuLoad } from \"../core/hardware.js\";\nimport { estimateLoadedModelMemoryBytes } from \"../core/lm-studio-client.js\";\nimport type { PerformanceMetrics, BenchEnvironment } from \"../types.js\";\nimport { avg, stddev, withTimeout, hasThinkingContent, estimateTokenCount } from \"../utils.js\";\nimport { createSpinner, subStep } from \"../ui/progress.js\";\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nconst WARMUP_PROMPT = \"Say hello in one word.\";\n\nconst BENCH_PROMPTS = [\n \"Explain the concept of recursion in programming in 3 sentences.\",\n \"What are the main differences between TCP and UDP? Be concise.\",\n \"Describe how a hash table works in 4 sentences.\",\n \"Write a detailed step-by-step explanation of how a compiler transforms source code into machine code, covering lexing, parsing, semantic analysis, optimization, and code generation.\",\n \"Implement a function in pseudocode that checks whether a given string of parentheses, brackets, and braces is balanced. Explain the time and space complexity.\",\n];\n\nexport interface PerformanceBenchResult {\n metrics: PerformanceMetrics;\n thinkingDetected: boolean;\n benchEnvironment?: BenchEnvironment;\n}\n\nexport interface PerformanceBenchOptions {\n warmupTimeoutMs?: number;\n promptTimeoutMs?: number;\n minSuccessfulPrompts?: number;\n failOnPromptError?: boolean;\n think?: boolean;\n streamStallTimeoutMs?: number;\n}\n\nconst DEFAULT_WARMUP_TIMEOUT_MS = 300_000;\nconst DEFAULT_PROMPT_TIMEOUT_MS = 120_000;\n\nasync function optionalProbe<T>(probe: () => Promise<T>, fallback: T): Promise<T> {\n try {\n return await probe();\n } catch {\n return fallback;\n }\n}\n\nasync function optionalProbeWithAvailability<T>(\n probe: () => Promise<T>,\n fallback: T\n): Promise<{ value: T; available: boolean }> {\n try {\n return { value: await probe(), available: true };\n } catch {\n return { value: fallback, available: false };\n }\n}\n\nexport async function runPerformanceBench(\n model: string,\n options: PerformanceBenchOptions = {}\n): Promise<PerformanceBenchResult> {\n const spinner = createSpinner(\"Warming up model...\");\n spinner.start();\n\n try {\n const warmupTimeoutMs = options.warmupTimeoutMs ?? DEFAULT_WARMUP_TIMEOUT_MS;\n const promptTimeoutMs = options.promptTimeoutMs ?? DEFAULT_PROMPT_TIMEOUT_MS;\n const minSuccessfulPrompts = options.minSuccessfulPrompts ?? Math.max(1, Math.ceil(BENCH_PROMPTS.length / 2));\n const failOnPromptError = options.failOnPromptError ?? false;\n\n const [memBefore, thermalBefore, swapBeforeResult, batteryPowered] = await Promise.all([\n getMemoryUsage(),\n optionalProbe(() => detectThermalPressure(), \"unknown\"),\n optionalProbeWithAvailability(() => getSwapUsedGB(), 0),\n optionalProbe(() => detectBatteryPowered(), undefined),\n ]);\n\n // Capture pre-warmup load state so we can qualify memory footprint reliability\n // when runtimes don't expose per-model loaded size.\n const runningModelsBeforeWarmup = await optionalProbe(() => listRunningModels(), []);\n const modelWasAlreadyLoaded = runningModelsBeforeWarmup.some((m) => m.name === model);\n\n // Warmup run (also measures load time)\n const warmup = await withTimeout(\n generateStream(model, WARMUP_PROMPT, undefined, {\n ...withBenchmarkProfile({\n num_predict: 32,\n think: options.think,\n stall_timeout_ms: options.streamStallTimeoutMs,\n }),\n }),\n warmupTimeoutMs,\n \"Model warmup\",\n abortOngoingRequests\n );\n const runtimeName = getRuntimeName();\n const loadTimeAvailable = !(runtimeName === \"lm-studio\" && warmup.loadDuration === 0);\n const loadTime = warmup.loadDuration / 1e6; // ns -> ms\n\n // After warmup, query running models for accurate loaded size.\n const runningModels = await listRunningModels();\n const thisModel = runningModels.find((m) => m.name === model);\n\n spinner.succeed(\"Model loaded\");\n\n // Run benchmark prompts\n const tpsValues: number[] = [];\n const firstChunkValues: number[] = [];\n const ttftValues: number[] = [];\n let totalPromptTokens = 0;\n let totalCompletionTokens = 0;\n let totalEvalCount = 0;\n let totalEvalDurationNs = 0;\n let successfulPrompts = 0;\n let failedPrompts = 0;\n let thinkingDetected = false;\n let totalThinkingTokens = 0;\n const cpuLoadSamples: number[] = [];\n let tokensPerSecondEstimated = false;\n\n for (let i = 0; i < BENCH_PROMPTS.length; i++) {\n spinner.start(`Running performance test ${i + 1}/${BENCH_PROMPTS.length}...`);\n\n let firstChunkTime: number | null = null;\n let firstTokenTime: number | null = null;\n const startTime = Date.now();\n\n try {\n const result = await withTimeout(\n generateStream(\n model,\n BENCH_PROMPTS[i],\n {\n onFirstChunk: () => {\n if (firstChunkTime === null) {\n firstChunkTime = Date.now() - startTime;\n }\n },\n onToken: () => {\n if (firstTokenTime === null) {\n firstTokenTime = Date.now() - startTime;\n }\n },\n },\n withBenchmarkProfile({\n num_predict: 256,\n think: options.think,\n stall_timeout_ms: options.streamStallTimeoutMs,\n })\n ),\n promptTimeoutMs,\n \"Performance benchmark\",\n abortOngoingRequests\n );\n\n // tok/s from runtime-provided generation metrics (evalCount / evalDuration)\n const evalDurationSec = result.evalDuration / 1e9;\n const tps = evalDurationSec > 0 ? result.evalCount / evalDurationSec : 0;\n tpsValues.push(tps);\n totalEvalCount += result.evalCount;\n totalEvalDurationNs += result.evalDuration;\n if (result.evalCountEstimated) {\n tokensPerSecondEstimated = true;\n }\n\n // First chunk latency / TTFT\n if (firstChunkTime !== null) {\n firstChunkValues.push(firstChunkTime);\n }\n if (firstTokenTime !== null) {\n ttftValues.push(firstTokenTime);\n }\n\n // Detect thinking content\n if (hasThinkingContent(result.response, result.thinking)) {\n thinkingDetected = true;\n const thinkingText = result.thinking || \"\";\n totalThinkingTokens += estimateTokenCount(thinkingText);\n }\n\n totalPromptTokens += result.promptEvalCount;\n totalCompletionTokens += result.evalCount;\n successfulPrompts++;\n\n subStep(\n ` Prompt ${i + 1}: ${tps.toFixed(1)} tok/s, first chunk ${firstChunkTime ?? \"?\"}ms, TTFT ${firstTokenTime ?? \"?\"}ms`\n );\n\n // Sample CPU load after each prompt\n const cpuSample = await optionalProbe(() => getCpuLoad(), -1);\n if (cpuSample >= 0) cpuLoadSamples.push(cpuSample);\n } catch (err) {\n failedPrompts++;\n const message = err instanceof Error ? err.message : String(err);\n subStep(` Prompt ${i + 1}: failed (${message})`);\n if (failOnPromptError) {\n throw err;\n }\n }\n }\n\n if (successfulPrompts < minSuccessfulPrompts) {\n throw new Error(\n `Performance benchmark produced too few successful prompts (${successfulPrompts}/${BENCH_PROMPTS.length}, minimum required: ${minSuccessfulPrompts}).`\n );\n }\n\n if (failedPrompts > 0) {\n subStep(\n ` Completed with ${failedPrompts} failed prompt(s); metrics use ${successfulPrompts} successful prompt(s).`\n );\n }\n\n // Measure memory and environment after benchmark (with model loaded)\n const [memAfter, thermalAfter, swapAfterResult] = await Promise.all([\n getMemoryUsage(),\n optionalProbe(() => detectThermalPressure(), thermalBefore),\n optionalProbeWithAvailability(() => getSwapUsedGB(), swapBeforeResult.value),\n ]);\n\n // Prefer runtime-reported loaded model size when available; otherwise fall back\n // to host memory delta, which reflects actual runtime footprint better than\n // static on-disk model size.\n let memoryUsedGB: number;\n let memoryPercent: number;\n let memoryFootprintEstimated = false;\n // Only treat runtime-reported running size as a true loaded-memory footprint\n // when the backend exposes a comparable in-memory value. LM Studio's size can\n // reflect local file/directory metadata rather than resident RAM usage.\n const runtimeReportsComparableLoadedSize = runtimeName !== \"lm-studio\";\n const estimatedLoadedModelSizeBytes =\n runtimeName === \"lm-studio\" && modelWasAlreadyLoaded\n ? await optionalProbe(() => estimateLoadedModelMemoryBytes(model), null)\n : null;\n const loadedModelSizeBytes =\n runtimeReportsComparableLoadedSize && thisModel && thisModel.size > 0\n ? thisModel.size\n : 0;\n const memoryFootprintAvailable =\n runtimeReportsComparableLoadedSize\n ? loadedModelSizeBytes > 0 || !modelWasAlreadyLoaded\n : (estimatedLoadedModelSizeBytes ?? 0) > 0 || !modelWasAlreadyLoaded;\n if (loadedModelSizeBytes > 0) {\n memoryUsedGB = loadedModelSizeBytes / (1024 ** 3);\n memoryPercent = (memoryUsedGB / memAfter.totalGB) * 100;\n } else if ((estimatedLoadedModelSizeBytes ?? 0) > 0) {\n memoryUsedGB = (estimatedLoadedModelSizeBytes ?? 0) / (1024 ** 3);\n memoryPercent = (memoryUsedGB / memAfter.totalGB) * 100;\n memoryFootprintEstimated = true;\n } else {\n memoryUsedGB = Math.max(0, memAfter.usedGB - memBefore.usedGB);\n memoryPercent = Math.max(0, memAfter.percent - memBefore.percent);\n }\n\n spinner.succeed(\"Performance benchmark complete\");\n\n // Use a sentinel value for TTFT if no tokens were received\n const firstChunkMs = firstChunkValues.length > 0 ? avg(firstChunkValues) : undefined;\n const ttft = ttftValues.length > 0 ? avg(ttftValues) : -1;\n\n const swapDeltaGB =\n swapBeforeResult.available && swapAfterResult.available\n ? +(swapAfterResult.value - swapBeforeResult.value).toFixed(2)\n : undefined;\n // CPU load metrics from prompt samples\n const cpuAvgLoad = cpuLoadSamples.length > 0\n ? +(cpuLoadSamples.reduce((a, b) => a + b, 0) / cpuLoadSamples.length).toFixed(1)\n : undefined;\n const cpuPeakLoad = cpuLoadSamples.length > 0\n ? +Math.max(...cpuLoadSamples).toFixed(1)\n : undefined;\n\n const benchEnvironment: BenchEnvironment = {\n thermalPressureBefore: thermalBefore,\n thermalPressureAfter: thermalAfter,\n ...(swapDeltaGB !== undefined && swapDeltaGB > 0 ? { swapDeltaGB } : {}),\n ...(batteryPowered != null ? { batteryPowered } : {}),\n ...(cpuAvgLoad !== undefined ? { cpuAvgLoad } : {}),\n ...(cpuPeakLoad !== undefined ? { cpuPeakLoad } : {}),\n };\n\n return {\n metrics: {\n tokensPerSecond:\n totalEvalDurationNs > 0\n ? totalEvalCount / (totalEvalDurationNs / 1e9)\n : avg(tpsValues),\n ...(tokensPerSecondEstimated ? { tokensPerSecondEstimated: true } : {}),\n ...(firstChunkMs !== undefined ? { firstChunkMs } : {}),\n ttft: ttft >= 0 ? ttft : 30_000, // Fallback: 30s if no TTFT measured\n loadTime,\n loadTimeAvailable,\n totalTokens: totalPromptTokens + totalCompletionTokens,\n promptTokens: totalPromptTokens,\n completionTokens: totalCompletionTokens,\n memoryUsedGB: +memoryUsedGB.toFixed(1),\n memoryPercent: +memoryPercent.toFixed(1),\n memoryFootprintAvailable,\n ...(memoryFootprintEstimated ? { memoryFootprintEstimated: true } : {}),\n memoryHostUsedGB: memAfter.usedGB,\n memoryHostPercent: memAfter.percent,\n tpsStdDev: tpsValues.length >= 2 ? stddev(tpsValues) : undefined,\n ...(totalThinkingTokens > 0 ? { thinkingTokensEstimate: totalThinkingTokens } : {}),\n },\n thinkingDetected,\n benchEnvironment,\n };\n } catch (err) {\n if (spinner.isSpinning) {\n spinner.fail(\"Performance benchmark failed\");\n }\n throw err;\n }\n}\n","[\n {\n \"id\": 1,\n \"question\": \"All W are X. No X are Y. Some Z are W. Which conclusion must be true?\",\n \"choices\": [\"A) Some Z are Y\", \"B) Some Z are not Y\", \"C) All Z are Y\", \"D) No Z are X\"],\n \"answer\": \"B\",\n \"category\": \"logic\"\n },\n {\n \"id\": 2,\n \"question\": \"Find the next number: 2, 6, 12, 20, 30, ?\",\n \"choices\": [\"A) 38\", \"B) 40\", \"C) 42\", \"D) 44\"],\n \"answer\": \"C\",\n \"category\": \"pattern\"\n },\n {\n \"id\": 3,\n \"question\": \"What is the smaller angle between clock hands at 3:15?\",\n \"choices\": [\"A) 0°\", \"B) 7.5°\", \"C) 15°\", \"D) 22.5°\"],\n \"answer\": \"B\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 4,\n \"question\": \"Binary 101101 is what in decimal?\",\n \"choices\": [\"A) 41\", \"B) 43\", \"C) 45\", \"D) 47\"],\n \"answer\": \"C\",\n \"category\": \"computing\"\n },\n {\n \"id\": 5,\n \"question\": \"If server overloaded => latency high. Latency is high. What follows?\",\n \"choices\": [\"A) Server is definitely overloaded\", \"B) Server is definitely not overloaded\", \"C) Network is down\", \"D) Overload cannot be concluded\"],\n \"answer\": \"D\",\n \"category\": \"logic\"\n },\n {\n \"id\": 6,\n \"question\": \"What is the average time complexity of merge sort?\",\n \"choices\": [\"A) O(n)\", \"B) O(n^2)\", \"C) O(n log n)\", \"D) O(log n)\"],\n \"answer\": \"C\",\n \"category\": \"computing\"\n },\n {\n \"id\": 7,\n \"question\": \"Probability of getting sum 9 with two fair dice?\",\n \"choices\": [\"A) 1/6\", \"B) 1/8\", \"C) 1/9\", \"D) 1/12\"],\n \"answer\": \"C\",\n \"category\": \"probability\"\n },\n {\n \"id\": 8,\n \"question\": \"For XOR, when is output true?\",\n \"choices\": [\"A) Inputs differ\", \"B) Inputs are both true\", \"C) Inputs are both false\", \"D) Output is never true\"],\n \"answer\": \"A\",\n \"category\": \"logic\"\n },\n {\n \"id\": 9,\n \"question\": \"Smallest integer n such that 2^n > 1000?\",\n \"choices\": [\"A) 9\", \"B) 10\", \"C) 11\", \"D) 12\"],\n \"answer\": \"B\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 10,\n \"question\": \"A car travels 60 km at 30 km/h and 60 km at 60 km/h. Average speed?\",\n \"choices\": [\"A) 36 km/h\", \"B) 38 km/h\", \"C) 40 km/h\", \"D) 45 km/h\"],\n \"answer\": \"C\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 11,\n \"question\": \"In a line: A before B, C after B, D before A, E after C. Who is first?\",\n \"choices\": [\"A) A\", \"B) B\", \"C) C\", \"D) D\"],\n \"answer\": \"D\",\n \"category\": \"ordering\"\n },\n {\n \"id\": 12,\n \"question\": \"If 3 machines make 3 parts in 3 minutes at same rate, 100 machines make 100 parts in how many minutes?\",\n \"choices\": [\"A) 3\", \"B) 10\", \"C) 33\", \"D) 100\"],\n \"answer\": \"A\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 13,\n \"question\": \"Sum of interior angles of a hexagon is:\",\n \"choices\": [\"A) 540°\", \"B) 600°\", \"C) 720°\", \"D) 900°\"],\n \"answer\": \"C\",\n \"category\": \"geometry\"\n },\n {\n \"id\": 14,\n \"question\": \"Exactly one of A or B is true. A says: 'B is true.' B says: 'A is false.' Which is correct?\",\n \"choices\": [\"A) A true, B false\", \"B) A false, B true\", \"C) Both true\", \"D) Both false\"],\n \"answer\": \"B\",\n \"category\": \"logic\"\n },\n {\n \"id\": 15,\n \"question\": \"Which statement about a Directed Acyclic Graph (DAG) is always true?\",\n \"choices\": [\"A) It has at least one node with indegree 0\", \"B) Every node has indegree > 0\", \"C) It always has a cycle\", \"D) It must be complete\"],\n \"answer\": \"A\",\n \"category\": \"computing\"\n },\n {\n \"id\": 16,\n \"question\": \"The mean of 5 numbers is 12. Four numbers are 8, 10, 12, 14. The fifth is:\",\n \"choices\": [\"A) 14\", \"B) 15\", \"C) 12\", \"D) 16\"],\n \"answer\": \"D\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 17,\n \"question\": \"How many distinct prime factors does 84 have?\",\n \"choices\": [\"A) 2\", \"B) 3\", \"C) 4\", \"D) 5\"],\n \"answer\": \"B\",\n \"category\": \"number_theory\"\n },\n {\n \"id\": 18,\n \"question\": \"The contrapositive of 'If p then q' is:\",\n \"choices\": [\"A) If q then p\", \"B) If not q then not p\", \"C) If not p then not q\", \"D) If p then not q\"],\n \"answer\": \"B\",\n \"category\": \"logic\"\n },\n {\n \"id\": 19,\n \"question\": \"0.125 as a simplified fraction is:\",\n \"choices\": [\"A) 1/8\", \"B) 1/6\", \"C) 1/5\", \"D) 2/15\"],\n \"answer\": \"A\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 20,\n \"question\": \"Binary search is valid only when the input array is:\",\n \"choices\": [\"A) Random\", \"B) Unique\", \"C) Sorted\", \"D) Small\"],\n \"answer\": \"C\",\n \"category\": \"computing\"\n },\n {\n \"id\": 21,\n \"question\": \"Alice is older than Bob. Bob is older than Cara. Dan is older than Alice. Who is oldest?\",\n \"choices\": [\"A) Alice\", \"B) Bob\", \"C) Cara\", \"D) Dan\"],\n \"answer\": \"D\",\n \"category\": \"ordering\"\n },\n {\n \"id\": 22,\n \"question\": \"A tap fills a tank in 6 min, drain empties in 9 min. Both open from empty: fill time?\",\n \"choices\": [\"A) 12 min\", \"B) 15 min\", \"C) 18 min\", \"D) 54 min\"],\n \"answer\": \"C\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 23,\n \"question\": \"Smallest positive integer divisible by 3, 4 and 5 is:\",\n \"choices\": [\"A) 30\", \"B) 60\", \"C) 120\", \"D) 240\"],\n \"answer\": \"B\",\n \"category\": \"number_theory\"\n },\n {\n \"id\": 24,\n \"question\": \"If today is Tuesday, what day will it be in 100 days?\",\n \"choices\": [\"A) Tuesday\", \"B) Wednesday\", \"C) Friday\", \"D) Thursday\"],\n \"answer\": \"D\",\n \"category\": \"logic\"\n },\n {\n \"id\": 25,\n \"question\": \"Among 100 people, 60 like A and 50 like B. Minimum that like both A and B?\",\n \"choices\": [\"A) 10\", \"B) 20\", \"C) 30\", \"D) 0\"],\n \"answer\": \"A\",\n \"category\": \"set_theory\"\n },\n {\n \"id\": 26,\n \"question\": \"Which grows fastest as n becomes large?\",\n \"choices\": [\"A) log n\", \"B) n\", \"C) n log n\", \"D) n^2\"],\n \"answer\": \"D\",\n \"category\": \"computing\"\n },\n {\n \"id\": 27,\n \"question\": \"Maximum value in 8-bit unsigned integer is:\",\n \"choices\": [\"A) 127\", \"B) 128\", \"C) 255\", \"D) 256\"],\n \"answer\": \"C\",\n \"category\": \"computing\"\n },\n {\n \"id\": 28,\n \"question\": \"A price increases by 20% then decreases by 20%. Net change is:\",\n \"choices\": [\"A) No change\", \"B) 4% decrease\", \"C) 4% increase\", \"D) 8% decrease\"],\n \"answer\": \"B\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 29,\n \"question\": \"A right triangle has legs 7 and 24. Its area is:\",\n \"choices\": [\"A) 42\", \"B) 72\", \"C) 96\", \"D) 84\"],\n \"answer\": \"D\",\n \"category\": \"geometry\"\n },\n {\n \"id\": 30,\n \"question\": \"If events A and B are independent, P(A)=0.4 and P(B)=0.5, then P(A and B)=\",\n \"choices\": [\"A) 0.1\", \"B) 0.2\", \"C) 0.4\", \"D) 0.9\"],\n \"answer\": \"B\",\n \"category\": \"probability\"\n },\n {\n \"id\": 31,\n \"question\": \"Premises: All squares are rectangles. Some rectangles are not squares. Which must be true?\",\n \"choices\": [\"A) All rectangles are squares\", \"B) No rectangle is a square\", \"C) At least one rectangle is not a square\", \"D) Some squares are not rectangles\"],\n \"answer\": \"C\",\n \"category\": \"logic\"\n },\n {\n \"id\": 32,\n \"question\": \"x1=1 and x(n+1)=2x(n)+1. What is x4?\",\n \"choices\": [\"A) 7\", \"B) 15\", \"C) 31\", \"D) 63\"],\n \"answer\": \"B\",\n \"category\": \"pattern\"\n },\n {\n \"id\": 33,\n \"question\": \"In hexadecimal, A + 5 equals decimal:\",\n \"choices\": [\"A) 13\", \"B) 14\", \"C) 15\", \"D) 16\"],\n \"answer\": \"C\",\n \"category\": \"computing\"\n },\n {\n \"id\": 34,\n \"question\": \"If f is strictly increasing and f(3)=10, what can be concluded about f(5)?\",\n \"choices\": [\"A) f(5) < 10\", \"B) f(5) = 10\", \"C) f(5) <= 10\", \"D) f(5) > 10\"],\n \"answer\": \"D\",\n \"category\": \"logic\"\n },\n {\n \"id\": 35,\n \"question\": \"Which sorting algorithm is not comparison-based in standard form?\",\n \"choices\": [\"A) Merge sort\", \"B) Quick sort\", \"C) Heap sort\", \"D) Counting sort\"],\n \"answer\": \"D\",\n \"category\": \"computing\"\n },\n {\n \"id\": 36,\n \"question\": \"How many 4-digit PIN codes exist (digits 0-9, repetition allowed)?\",\n \"choices\": [\"A) 10000\", \"B) 9000\", \"C) 5040\", \"D) 4096\"],\n \"answer\": \"A\",\n \"category\": \"combinatorics\"\n },\n {\n \"id\": 37,\n \"question\": \"70 people have cats, 45 have dogs, 30 have both. How many have at least one of cat/dog?\",\n \"choices\": [\"A) 100\", \"B) 95\", \"C) 85\", \"D) 75\"],\n \"answer\": \"C\",\n \"category\": \"set_theory\"\n },\n {\n \"id\": 38,\n \"question\": \"5 workers in 5 days make 100 units. At same rate, 10 workers in 3 days make:\",\n \"choices\": [\"A) 90\", \"B) 120\", \"C) 150\", \"D) 200\"],\n \"answer\": \"B\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 39,\n \"question\": \"For 1 <= x <= 3, maximum of -x^2 + 4x is:\",\n \"choices\": [\"A) 3\", \"B) 3.5\", \"C) 4\", \"D) 5\"],\n \"answer\": \"C\",\n \"category\": \"algebra\"\n },\n {\n \"id\": 40,\n \"question\": \"Which expression is a tautology?\",\n \"choices\": [\"A) p OR (NOT p)\", \"B) p AND (NOT p)\", \"C) p XOR p\", \"D) NOT (p OR (NOT p))\"],\n \"answer\": \"A\",\n \"category\": \"logic\"\n },\n {\n \"id\": 41,\n \"question\": \"No politicians are honest. Some honest people are kind. All kind people are respected. Which conclusion must be true?\",\n \"choices\": [\"A) No politicians are respected\", \"B) Some respected people are not politicians\", \"C) All respected people are honest\", \"D) No kind people are politicians\"],\n \"answer\": \"B\",\n \"category\": \"logic-negation\"\n },\n {\n \"id\": 42,\n \"question\": \"If it is not raining, then the ground is not wet. The ground is wet. Which conclusion follows?\",\n \"choices\": [\"A) It is raining\", \"B) It is not raining\", \"C) The ground might be dry\", \"D) No conclusion can be drawn\"],\n \"answer\": \"A\",\n \"category\": \"logic-negation\"\n },\n {\n \"id\": 43,\n \"question\": \"Alice is taller than Bob. Carol is shorter than David. David is shorter than Bob. Eve is taller than Alice. Who is the third tallest?\",\n \"choices\": [\"A) Alice\", \"B) Bob\", \"C) David\", \"D) Carol\"],\n \"answer\": \"A\",\n \"category\": \"multi-step\"\n },\n {\n \"id\": 44,\n \"question\": \"In a tournament with 5 players (A, B, C, D, E): A beat B, B beat C, C beat D, D beat E, and E beat A. B beat D, and C beat E. A beat C. How many players have exactly 2 wins?\",\n \"choices\": [\"A) 1\", \"B) 2\", \"C) 3\", \"D) 4\"],\n \"answer\": \"C\",\n \"category\": \"multi-step\"\n },\n {\n \"id\": 45,\n \"question\": \"A factory produces items in 3 shifts. Day shift has 2% defect rate, evening shift has 3%, and night shift has 6%. Day shift produces 50% of items, evening 30%, night 20%. If a randomly chosen item is defective, which shift most likely produced it?\",\n \"choices\": [\"A) Day shift\", \"B) Evening shift\", \"C) Night shift\", \"D) Equal probability\"],\n \"answer\": \"C\",\n \"category\": \"multi-step\"\n },\n {\n \"id\": 46,\n \"question\": \"Hand is to glove as foot is to sock. Painter is to canvas as sculptor is to:\",\n \"choices\": [\"A) Brush\", \"B) Clay\", \"C) Gallery\", \"D) Art\"],\n \"answer\": \"B\",\n \"category\": \"analogy\"\n },\n {\n \"id\": 47,\n \"question\": \"Algorithm is to computation as recipe is to cooking. Blueprint is to building as genome is to:\",\n \"choices\": [\"A) DNA\", \"B) Organism\", \"C) Cell\", \"D) Evolution\"],\n \"answer\": \"B\",\n \"category\": \"analogy\"\n },\n {\n \"id\": 48,\n \"question\": \"A barber shaves all those, and only those, who do not shave themselves. Does the barber shave himself? This is known as the barber paradox. Which best describes the logical status?\",\n \"choices\": [\"A) The barber shaves himself\", \"B) The barber does not shave himself\", \"C) The scenario is self-contradictory\", \"D) It depends on additional information\"],\n \"answer\": \"C\",\n \"category\": \"paradox\"\n },\n {\n \"id\": 49,\n \"question\": \"You have two coins. One is fair (50/50). The other is biased and always shows heads. You pick a coin at random and flip it — it shows heads. What is the probability you picked the fair coin?\",\n \"choices\": [\"A) 1/4\", \"B) 1/3\", \"C) 1/2\", \"D) 2/3\"],\n \"answer\": \"B\",\n \"category\": \"probabilistic\"\n },\n {\n \"id\": 50,\n \"question\": \"A test for a disease is 99% accurate (both sensitivity and specificity). The disease affects 1 in 1000 people. If someone tests positive, what is the approximate probability they actually have the disease?\",\n \"choices\": [\"A) About 9%\", \"B) About 50%\", \"C) About 91%\", \"D) About 99%\"],\n \"answer\": \"A\",\n \"category\": \"probabilistic\"\n }\n]\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, ReasoningQuestion, QuestionResult } from \"../types.js\";\nimport { extractChoice, stripThinkTags, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport reasoningData from \"../datasets/reasoning.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nconst questions = reasoningData as ReasoningQuestion[];\nconst DEFAULT_REASONING_TIMEOUT_MS = 120_000;\n\nexport async function runReasoningBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running reasoning benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let correct = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_REASONING_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < questions.length; i++) {\n const q = questions[i];\n spinner.text = `Reasoning ${i + 1}/${questions.length}: ${q.category}`;\n\n const prompt = `Answer the following multiple choice question. Reply with ONLY the letter (A, B, C, or D).\n\nQuestion: ${q.question}\n${q.choices.join(\"\\n\")}\n\nAnswer:`;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, prompt, withBenchmarkProfile({ num_predict: 1024, think: opts?.think })),\n timeoutMs,\n \"Reasoning question\",\n abortOngoingRequests\n );\n\n const answer = stripThinkTags(result.response);\n const actual = extractChoice(answer) ?? answer.trim();\n const isCorrect = actual === q.answer;\n if (isCorrect) correct++;\n\n details.push({\n id: q.id,\n question: q.question,\n expected: q.answer,\n actual,\n correct: isCorrect,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n details.push({\n id: q.id,\n question: q.question,\n expected: q.answer,\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Reasoning: ${correct}/${questions.length} correct`);\n } catch (err) {\n spinner.fail(\"Reasoning benchmark failed\");\n throw err;\n }\n\n return {\n score: questions.length > 0 ? (correct / questions.length) * 100 : 0,\n correct,\n total: questions.length,\n details,\n };\n}\n","[\n {\n \"id\": 1,\n \"question\": \"Compute 18 * (25 - 7).\",\n \"answer\": 324\n },\n {\n \"id\": 2,\n \"question\": \"Compute (3/4) + (5/6). Return decimal.\",\n \"answer\": 1.5833333333,\n \"tolerance\": 0.001\n },\n {\n \"id\": 3,\n \"question\": \"Simple interest: principal 1200, rate 5% per year, time 3 years. Interest amount?\",\n \"answer\": 180\n },\n {\n \"id\": 4,\n \"question\": \"After a 10% increase on 500, what is the new amount?\",\n \"answer\": 550\n },\n {\n \"id\": 5,\n \"question\": \"Solve for x: 2x - 7 = 5x + 8.\",\n \"answer\": -5\n },\n {\n \"id\": 6,\n \"question\": \"Area of a trapezoid with bases 10 and 16, height 7.\",\n \"answer\": 91\n },\n {\n \"id\": 7,\n \"question\": \"Weighted average: score 80 at 40% and score 92 at 60%.\",\n \"answer\": 87.2,\n \"tolerance\": 0.001\n },\n {\n \"id\": 8,\n \"question\": \"How many distinct permutations of the letters in LEVEL?\",\n \"answer\": 30\n },\n {\n \"id\": 9,\n \"question\": \"Probability of drawing an Ace from a standard 52-card deck. Return decimal.\",\n \"answer\": 0.0769230769,\n \"tolerance\": 0.001\n },\n {\n \"id\": 10,\n \"question\": \"For x^2 - 5x + 6 = 0, what is the sum of roots?\",\n \"answer\": 5\n },\n {\n \"id\": 11,\n \"question\": \"Distance between points (2,3) and (10,15). Return decimal.\",\n \"answer\": 14.4222051019,\n \"tolerance\": 0.001\n },\n {\n \"id\": 12,\n \"question\": \"Convert 72 km/h to m/s.\",\n \"answer\": 20\n },\n {\n \"id\": 13,\n \"question\": \"If f(x)=x^2-4x+1, compute f(-3).\",\n \"answer\": 22\n },\n {\n \"id\": 14,\n \"question\": \"15 workers finish a job in 12 days. At same rate, how many days for 20 workers?\",\n \"answer\": 9\n },\n {\n \"id\": 15,\n \"question\": \"Sum the geometric series: 3 + 6 + 12 + 24 + 48.\",\n \"answer\": 93\n },\n {\n \"id\": 16,\n \"question\": \"Find the median of [4, 9, 1, 7, 3, 8, 5].\",\n \"answer\": 5\n },\n {\n \"id\": 17,\n \"question\": \"Solve system: x+y=13 and x-y=5. Return x*y.\",\n \"answer\": 36\n },\n {\n \"id\": 18,\n \"question\": \"Volume of cylinder with radius 3 and height 10. Use pi=3.14.\",\n \"answer\": 282.6,\n \"tolerance\": 0.001\n },\n {\n \"id\": 19,\n \"question\": \"Price rises from 80 to 92. Percent increase?\",\n \"answer\": 15\n },\n {\n \"id\": 20,\n \"question\": \"Compute 7 choose 2.\",\n \"answer\": 21\n },\n {\n \"id\": 21,\n \"question\": \"Arithmetic sequence with first term 5 and difference 3. Find the 20th term.\",\n \"answer\": 62\n },\n {\n \"id\": 22,\n \"question\": \"Compute log10(100000).\",\n \"answer\": 5\n },\n {\n \"id\": 23,\n \"question\": \"Each of two independent machines fails with probability 0.02. Probability both fail?\",\n \"answer\": 0.0004,\n \"tolerance\": 0.0001\n },\n {\n \"id\": 24,\n \"question\": \"In a triangle, two angles are 35 and 65 degrees. Third angle?\",\n \"answer\": 80\n },\n {\n \"id\": 25,\n \"question\": \"Simplify (2^5 * 2^3) / 2^4.\",\n \"answer\": 16\n },\n {\n \"id\": 26,\n \"question\": \"A car worth 30000 depreciates by 20%, then by 10%. Final value?\",\n \"answer\": 21600\n },\n {\n \"id\": 27,\n \"question\": \"A 30-liter solution is 20% salt. How many liters of pure water to add to make it 15% salt?\",\n \"answer\": 10\n },\n {\n \"id\": 28,\n \"question\": \"Volume of rectangular prism 8 x 5 x 3.\",\n \"answer\": 120\n },\n {\n \"id\": 29,\n \"question\": \"Solve |2x-7|=9. Return the product of both solutions.\",\n \"answer\": -8\n },\n {\n \"id\": 30,\n \"question\": \"Least common multiple of 18 and 24.\",\n \"answer\": 72\n },\n {\n \"id\": 31,\n \"question\": \"Average speed for 150 km in 2.5 hours (km/h).\",\n \"answer\": 60\n },\n {\n \"id\": 32,\n \"question\": \"Given P(A)=0.7, P(B)=0.5, P(A and B)=0.4, compute P(A or B).\",\n \"answer\": 0.8,\n \"tolerance\": 0.001\n },\n {\n \"id\": 33,\n \"question\": \"Compound annually: 1000 at 8% for 3 years. Final amount?\",\n \"answer\": 1259.712,\n \"tolerance\": 0.01\n },\n {\n \"id\": 34,\n \"question\": \"Convert binary 110011 to decimal.\",\n \"answer\": 51\n },\n {\n \"id\": 35,\n \"question\": \"Solve for x: 5/(x-1) = 1/2.\",\n \"answer\": 11\n },\n {\n \"id\": 36,\n \"question\": \"Sequence 1,4,9,16,... Find the 15th term.\",\n \"answer\": 225\n },\n {\n \"id\": 37,\n \"question\": \"If 40% of a number is 56, what is the number?\",\n \"answer\": 140\n },\n {\n \"id\": 38,\n \"question\": \"Area of a sector with radius 10 and angle 72 degrees. Use pi=3.14.\",\n \"answer\": 62.8,\n \"tolerance\": 0.01\n },\n {\n \"id\": 39,\n \"question\": \"Population 50000 grows by 2% yearly for 2 years. New population?\",\n \"answer\": 52020\n },\n {\n \"id\": 40,\n \"question\": \"Harmonic mean of 4 and 6.\",\n \"answer\": 4.8,\n \"tolerance\": 0.001\n },\n {\n \"id\": 41,\n \"question\": \"A store offers a 20% discount, then an additional 15% off the discounted price. What is the total percentage discount from the original price?\",\n \"answer\": 32,\n \"tolerance\": 0.01\n },\n {\n \"id\": 42,\n \"question\": \"A train travels 120 km at 60 km/h, then 180 km at 90 km/h. What is the average speed for the entire journey in km/h?\",\n \"answer\": 75,\n \"tolerance\": 0.01\n },\n {\n \"id\": 43,\n \"question\": \"Compute the determinant of the 2x2 matrix [[3, 7], [1, 5]].\",\n \"answer\": 8\n },\n {\n \"id\": 44,\n \"question\": \"What is the sum of the first 100 positive integers?\",\n \"answer\": 5050\n },\n {\n \"id\": 45,\n \"question\": \"What is the 10th term of the geometric sequence that starts with 2 and has common ratio 3?\",\n \"answer\": 39366\n },\n {\n \"id\": 46,\n \"question\": \"A bag contains 5 red, 3 blue, and 2 green balls. If one ball is drawn, what is the probability it is NOT red? Express as a decimal.\",\n \"answer\": 0.5,\n \"tolerance\": 0.001\n },\n {\n \"id\": 47,\n \"question\": \"What is 17 mod 5?\",\n \"answer\": 2\n },\n {\n \"id\": 48,\n \"question\": \"A factory produces 200 units/day at $5 each. Fixed cost is $300/day. Revenue is $8/unit. What is the daily profit?\",\n \"answer\": 300\n },\n {\n \"id\": 49,\n \"question\": \"What is the derivative of f(x) = 3x^2 + 2x - 1 evaluated at x = 4?\",\n \"answer\": 26\n },\n {\n \"id\": 50,\n \"question\": \"What is the integral of 2x from x = 0 to x = 5?\",\n \"answer\": 25\n }\n]\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, MathProblem, QuestionResult } from \"../types.js\";\nimport { extractNumber, stripThinkTags, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport mathData from \"../datasets/math.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nconst problems = mathData as MathProblem[];\nconst DEFAULT_MATH_TIMEOUT_MS = 120_000;\n\nexport async function runMathBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running math benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let correct = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_MATH_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < problems.length; i++) {\n const p = problems[i];\n spinner.text = `Math ${i + 1}/${problems.length}`;\n\n const prompt = `Solve the following math problem. Give ONLY the numerical answer, nothing else.\n\nProblem: ${p.question}\n\nAnswer:`;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, prompt, withBenchmarkProfile({ num_predict: 1024, think: opts?.think })),\n timeoutMs,\n \"Math problem\",\n abortOngoingRequests\n );\n\n const actual = extractNumber(stripThinkTags(result.response));\n // Use absolute tolerance only when explicitly provided by the dataset.\n // Relative tolerance was overly permissive on large values.\n const tolerance = p.tolerance ?? 0;\n const isCorrect =\n actual !== null && Math.abs(actual - p.answer) <= tolerance;\n\n if (isCorrect) correct++;\n\n details.push({\n id: p.id,\n question: p.question,\n expected: String(p.answer),\n actual: actual !== null ? String(actual) : result.response.trim(),\n correct: isCorrect,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n details.push({\n id: p.id,\n question: p.question,\n expected: String(p.answer),\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Math: ${correct}/${problems.length} correct`);\n } catch (err) {\n spinner.fail(\"Math benchmark failed\");\n throw err;\n }\n\n return {\n score: problems.length > 0 ? (correct / problems.length) * 100 : 0,\n correct,\n total: problems.length,\n details,\n };\n}\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, CodingTask, QuestionResult } from \"../types.js\";\nimport { extractCodeBlock, stripThinkTags, stripTypeAnnotations, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport vm from \"node:vm\";\nimport { spawn } from \"node:child_process\";\nimport { Worker } from \"node:worker_threads\";\nimport codingData from \"../datasets/coding.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nconst VALID_IDENTIFIER_RE = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\nconst tasks = codingData as CodingTask[];\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== typeof b) return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((val, i) => deepEqual(val, b[i]));\n }\n\n if (typeof a === \"object\" && typeof b === \"object\") {\n const keysA = Object.keys(a as Record<string, unknown>).sort();\n const keysB = Object.keys(b as Record<string, unknown>).sort();\n if (!deepEqual(keysA, keysB)) return false;\n return keysA.every((key) =>\n deepEqual(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key]\n )\n );\n }\n\n return false;\n}\n\nconst DIFFICULTY_WEIGHT: Record<string, number> = {\n easy: 1,\n medium: 2,\n hard: 3,\n};\n\nconst SANDBOX_TIMEOUT_MS = 5_000;\nconst ISOLATED_WALL_TIMEOUT_MIN_MS = 8_000;\nconst ISOLATED_WALL_TIMEOUT_MAX_MS = 60_000;\nconst DEFAULT_CODING_TIMEOUT_MS = 240_000;\nconst MAX_SANDBOX_STDOUT_BYTES = 64 * 1024;\nconst MAX_SANDBOX_STDERR_BYTES = 64 * 1024;\n\nfunction runTestsInSandbox(\n code: string,\n task: CodingTask,\n sandboxTimeoutMs: number,\n vmModule: typeof vm\n): { passed: number; total: number } {\n let passed = 0;\n const total = task.tests.length;\n\n const VALID_ID = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n if (!VALID_ID.test(task.functionName)) {\n return { passed: 0, total };\n }\n\n try {\n const noop = () => {};\n const sandbox = Object.create(null) as vm.Context & {\n console?: Record<string, () => void>;\n __testFn?: unknown;\n };\n // Prevent untrusted snippets from spamming stdout/stderr in the isolated runner.\n sandbox.console = Object.freeze({\n log: noop,\n info: noop,\n warn: noop,\n error: noop,\n debug: noop,\n trace: noop,\n });\n const context = vmModule.createContext(sandbox, {\n codeGeneration: {\n strings: false,\n wasm: false,\n },\n });\n\n const script = new vmModule.Script(\n `${code}\\nglobalThis.__testFn = typeof ${task.functionName} === 'function' ? ${task.functionName} : undefined;`\n );\n script.runInContext(context, { timeout: sandboxTimeoutMs });\n\n if (typeof sandbox.__testFn !== \"function\") {\n return { passed: 0, total };\n }\n\n for (const test of task.tests) {\n try {\n const testInputJson = JSON.stringify(structuredClone(test.input));\n const testScript = new vmModule.Script(`__testFn(...${testInputJson})`);\n const result = testScript.runInContext(context, { timeout: sandboxTimeoutMs });\n if (deepEqual(result, test.expected)) {\n passed++;\n }\n } catch {\n // test failed or timed out\n }\n }\n } catch {\n // compile/run failed\n }\n\n return { passed, total };\n}\n\nfunction computeIsolatedWallTimeoutMs(task: CodingTask): number {\n const estimated = (task.tests.length + 1) * SANDBOX_TIMEOUT_MS + 1_000;\n return Math.min(\n ISOLATED_WALL_TIMEOUT_MAX_MS,\n Math.max(ISOLATED_WALL_TIMEOUT_MIN_MS, estimated)\n );\n}\n\nconst CODING_ISOLATED_SOURCE = `\nvar __name = (fn, _name) => fn;\nconst deepEqual = ${deepEqual.toString()};\nconst runTestsInSandbox = ${runTestsInSandbox.toString()};\nconst vm = require(\"node:vm\");\n\nlet payload = null;\nlet input = \"\";\nprocess.stdin.setEncoding(\"utf8\");\nprocess.stdin.on(\"data\", (chunk) => {\n input += chunk;\n});\nprocess.stdin.on(\"end\", () => {\n try {\n payload = JSON.parse(input || \"{}\");\n const result = runTestsInSandbox(\n typeof payload.code === \"string\" ? payload.code : \"\",\n payload.task,\n typeof payload.sandboxTimeoutMs === \"number\" ? payload.sandboxTimeoutMs : 5000,\n vm\n );\n process.stdout.write(JSON.stringify(result));\n } catch (err) {\n const total = Array.isArray(payload?.task?.tests) ? payload.task.tests.length : 0;\n process.stdout.write(\n JSON.stringify({\n passed: 0,\n total,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n});\n`;\n\nconst CODING_WORKER_SOURCE = `\nvar __name = (fn, _name) => fn;\nconst deepEqual = ${deepEqual.toString()};\nconst runTestsInSandbox = ${runTestsInSandbox.toString()};\nconst { parentPort, workerData } = require(\"node:worker_threads\");\nconst vm = require(\"node:vm\");\n\ntry {\n const payload = runTestsInSandbox(\n workerData.code,\n workerData.task,\n workerData.sandboxTimeoutMs,\n vm\n );\n parentPort.postMessage(payload);\n} catch (err) {\n const total = Array.isArray(workerData?.task?.tests) ? workerData.task.tests.length : 0;\n parentPort.postMessage({\n passed: 0,\n total,\n error: err instanceof Error ? err.message : String(err),\n });\n}\n`;\n\nexport function runTests(code: string, task: CodingTask): { passed: number; total: number } {\n return runTestsInSandbox(code, task, SANDBOX_TIMEOUT_MS, vm);\n}\n\nfunction parseIsolatedResult(\n raw: string,\n fallbackTotal: number\n): { passed: number; total: number } | null {\n const text = raw.trim();\n if (!text) return null;\n try {\n const parsed = JSON.parse(text) as { passed?: unknown; total?: unknown };\n if (typeof parsed.passed !== \"number\" || !Number.isFinite(parsed.passed)) return null;\n const rawTotal = typeof parsed.total === \"number\" && Number.isFinite(parsed.total)\n ? parsed.total\n : fallbackTotal;\n const total = Math.max(0, Math.trunc(rawTotal));\n const passed = Math.max(0, Math.min(total, Math.trunc(parsed.passed)));\n return { passed, total };\n } catch {\n return null;\n }\n}\n\nfunction sandboxProcessEnv(): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {};\n const passthrough = [\n \"PATH\",\n \"HOME\",\n \"TMPDIR\",\n \"TMP\",\n \"TEMP\",\n \"SystemRoot\",\n \"WINDIR\",\n \"COMSPEC\",\n ] as const;\n for (const key of passthrough) {\n const value = process.env[key];\n if (value) env[key] = value;\n }\n env.NODE_ENV = \"production\";\n return env;\n}\n\nfunction resolveSandboxMode(): \"subprocess\" | \"worker\" {\n const raw = process.env.METRILLM_CODING_SANDBOX?.trim().toLowerCase();\n if (raw === \"worker\") return \"worker\";\n return \"subprocess\";\n}\n\nfunction allowWorkerFallback(): boolean {\n const raw = process.env.METRILLM_CODING_ALLOW_WORKER_FALLBACK?.trim().toLowerCase();\n return raw === \"1\" || raw === \"true\" || raw === \"yes\";\n}\n\nasync function runTestsInSubprocess(\n code: string,\n task: CodingTask\n): Promise<{ passed: number; total: number } | null> {\n const total = task.tests.length;\n\n return new Promise((resolve) => {\n const wallTimeoutMs = computeIsolatedWallTimeoutMs(task);\n const child = spawn(\n process.execPath,\n [\n \"--max-old-space-size=96\",\n \"--input-type=commonjs\",\n \"-e\",\n CODING_ISOLATED_SOURCE,\n ],\n {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: sandboxProcessEnv(),\n }\n );\n\n let settled = false;\n let stdout = \"\";\n let stderr = \"\";\n let stdoutBytes = 0;\n let stderrBytes = 0;\n const finish = (result: { passed: number; total: number } | null) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(result);\n };\n\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk) => {\n stdoutBytes += Buffer.byteLength(chunk, \"utf8\");\n if (stdoutBytes > MAX_SANDBOX_STDOUT_BYTES) {\n child.kill(\"SIGKILL\");\n finish(null);\n return;\n }\n stdout += chunk;\n });\n\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk) => {\n stderrBytes += Buffer.byteLength(chunk, \"utf8\");\n if (stderrBytes > MAX_SANDBOX_STDERR_BYTES) {\n child.kill(\"SIGKILL\");\n finish(null);\n return;\n }\n stderr += chunk;\n });\n\n const timer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n // A timeout is considered a task failure (0/N), not infra failure.\n finish({ passed: 0, total });\n }, wallTimeoutMs);\n\n child.once(\"error\", () => {\n finish(null);\n });\n\n child.once(\"close\", (code) => {\n const parsed = parseIsolatedResult(stdout, total);\n if (parsed) {\n finish(parsed);\n return;\n }\n // Unparseable/missing payload is an infra failure, not a model failure.\n finish(null);\n });\n\n try {\n const payload = JSON.stringify({\n code,\n task,\n sandboxTimeoutMs: SANDBOX_TIMEOUT_MS,\n });\n child.stdin.write(payload);\n child.stdin.end();\n } catch {\n child.kill(\"SIGKILL\");\n finish(null);\n }\n });\n}\n\nasync function runTestsInWorker(\n code: string,\n task: CodingTask\n): Promise<{ passed: number; total: number }> {\n const total = task.tests.length;\n\n return new Promise((resolve) => {\n const wallTimeoutMs = computeIsolatedWallTimeoutMs(task);\n const worker = new Worker(CODING_WORKER_SOURCE, {\n eval: true,\n workerData: {\n code,\n task,\n sandboxTimeoutMs: SANDBOX_TIMEOUT_MS,\n },\n resourceLimits: {\n maxOldGenerationSizeMb: 64,\n maxYoungGenerationSizeMb: 16,\n stackSizeMb: 4,\n },\n });\n\n let settled = false;\n const finish = (result: { passed: number; total: number }) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n worker.removeAllListeners();\n resolve(result);\n };\n\n const timer = setTimeout(() => {\n void worker.terminate().finally(() => {\n finish({ passed: 0, total });\n });\n }, wallTimeoutMs);\n\n worker.once(\"message\", (msg: unknown) => {\n const passed = typeof (msg as { passed?: unknown })?.passed === \"number\"\n ? (msg as { passed: number }).passed\n : 0;\n const reportedTotal = typeof (msg as { total?: unknown })?.total === \"number\"\n ? (msg as { total: number }).total\n : total;\n finish({ passed, total: reportedTotal });\n void worker.terminate();\n });\n\n worker.once(\"error\", () => {\n finish({ passed: 0, total });\n });\n\n worker.once(\"exit\", () => {\n if (!settled) {\n finish({ passed: 0, total });\n }\n });\n });\n}\n\nasync function runTestsIsolated(\n code: string,\n task: CodingTask\n): Promise<{ passed: number; total: number }> {\n const total = task.tests.length;\n if (resolveSandboxMode() === \"worker\") {\n return runTestsInWorker(code, task);\n }\n\n const firstAttempt = await runTestsInSubprocess(code, task);\n if (firstAttempt) return firstAttempt;\n\n // Retry once to reduce random infra flakiness (process bootstrap noise).\n const secondAttempt = await runTestsInSubprocess(code, task);\n if (secondAttempt) return secondAttempt;\n\n // Security-first default: avoid silently downgrading to a weaker isolation model.\n if (allowWorkerFallback()) {\n return runTestsInWorker(code, task);\n }\n throw new Error(\n \"Coding sandbox infrastructure failure (set METRILLM_CODING_ALLOW_WORKER_FALLBACK=true to allow worker fallback)\"\n );\n}\n\nexport async function runCodingBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running coding benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let totalPassed = 0;\n let totalTests = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_CODING_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n if (!VALID_IDENTIFIER_RE.test(task.functionName)) {\n details.push({\n id: task.id,\n question: task.description,\n expected: `${task.tests.length} tests pass`,\n actual: \"ERROR: invalid function name in dataset\",\n correct: false,\n timeMs: 0,\n });\n totalTests += task.tests.length;\n continue;\n }\n spinner.text = `Coding ${i + 1}/${tasks.length}: ${task.functionName}`;\n\n const prompt = `Write a JavaScript function with the following signature:\n${task.signature}\n\n${task.description}\n\nReply with ONLY the function code, no explanation.`;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, prompt, withBenchmarkProfile({ num_predict: 2048, think: opts?.think })),\n timeoutMs,\n \"Coding task\",\n abortOngoingRequests\n );\n\n const rawCode = extractCodeBlock(stripThinkTags(result.response), task.functionName);\n const code = stripTypeAnnotations(rawCode);\n const { passed, total } = await runTestsIsolated(code, task);\n totalPassed += passed;\n totalTests += total;\n\n const allPassed = passed === total;\n\n details.push({\n id: task.id,\n question: task.description,\n expected: `${total} tests pass`,\n actual: `${passed}/${total} tests pass`,\n correct: allPassed,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n totalTests += task.tests.length;\n details.push({\n id: task.id,\n question: task.description,\n expected: `${task.tests.length} tests pass`,\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Coding: ${details.filter((d) => d.correct).length}/${tasks.length} tasks fully passed`);\n } catch (err) {\n spinner.fail(\"Coding benchmark failed\");\n throw err;\n }\n\n // Difficulty-weighted, all-or-nothing scoring: a task scores its weight\n // only when ALL its tests pass. Easy tasks count less than hard ones.\n let weightedPassed = 0;\n let weightedTotal = 0;\n for (let i = 0; i < tasks.length; i++) {\n const w = DIFFICULTY_WEIGHT[tasks[i].difficulty ?? \"medium\"] ?? 2;\n weightedTotal += w;\n if (details[i].correct) {\n weightedPassed += w;\n }\n }\n\n const tasksPassed = details.filter((d) => d.correct).length;\n return {\n score: weightedTotal > 0 ? (weightedPassed / weightedTotal) * 100 : 0,\n correct: tasksPassed,\n total: tasks.length,\n details,\n };\n}\n","[\n {\n \"id\": 1,\n \"description\": \"Write a function that groups an array of strings by their first letter. Return an object where keys are lowercase letters and values are arrays of matching strings (original case preserved).\",\n \"functionName\": \"groupByFirstLetter\",\n \"signature\": \"function groupByFirstLetter(words)\",\n \"tests\": [\n {\n \"input\": [\n [\n \"apple\",\n \"Avocado\",\n \"banana\",\n \"Blueberry\",\n \"cherry\"\n ]\n ],\n \"expected\": {\n \"a\": [\n \"apple\",\n \"Avocado\"\n ],\n \"b\": [\n \"banana\",\n \"Blueberry\"\n ],\n \"c\": [\n \"cherry\"\n ]\n }\n },\n {\n \"input\": [\n []\n ],\n \"expected\": {}\n },\n {\n \"input\": [\n [\n \"hello\"\n ]\n ],\n \"expected\": {\n \"h\": [\n \"hello\"\n ]\n }\n },\n {\n \"input\": [\n [\n \"Abc\",\n \"abc\",\n \"ABc\"\n ]\n ],\n \"expected\": {\n \"a\": [\n \"Abc\",\n \"abc\",\n \"ABc\"\n ]\n }\n },\n {\n \"input\": [\n [\n \"x\",\n \"y\",\n \"z\"\n ]\n ],\n \"expected\": {\n \"x\": [\n \"x\"\n ],\n \"y\": [\n \"y\"\n ],\n \"z\": [\n \"z\"\n ]\n }\n },\n {\n \"input\": [\n [\n \"Dog\",\n \"duck\",\n \"Deer\",\n \"cat\"\n ]\n ],\n \"expected\": {\n \"d\": [\n \"Dog\",\n \"duck\",\n \"Deer\"\n ],\n \"c\": [\n \"cat\"\n ]\n }\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 2,\n \"description\": \"Write a function that implements run-length encoding. Given a string, return an array of [char, count] pairs for consecutive runs.\",\n \"functionName\": \"runLengthEncode\",\n \"signature\": \"function runLengthEncode(s)\",\n \"tests\": [\n {\n \"input\": [\n \"aaabbc\"\n ],\n \"expected\": [\n [\n \"a\",\n 3\n ],\n [\n \"b\",\n 2\n ],\n [\n \"c\",\n 1\n ]\n ]\n },\n {\n \"input\": [\n \"\"\n ],\n \"expected\": []\n },\n {\n \"input\": [\n \"a\"\n ],\n \"expected\": [\n [\n \"a\",\n 1\n ]\n ]\n },\n {\n \"input\": [\n \"aabba\"\n ],\n \"expected\": [\n [\n \"a\",\n 2\n ],\n [\n \"b\",\n 2\n ],\n [\n \"a\",\n 1\n ]\n ]\n },\n {\n \"input\": [\n \"xxxyz\"\n ],\n \"expected\": [\n [\n \"x\",\n 3\n ],\n [\n \"y\",\n 1\n ],\n [\n \"z\",\n 1\n ]\n ]\n },\n {\n \"input\": [\n \"abcde\"\n ],\n \"expected\": [\n [\n \"a\",\n 1\n ],\n [\n \"b\",\n 1\n ],\n [\n \"c\",\n 1\n ],\n [\n \"d\",\n 1\n ],\n [\n \"e\",\n 1\n ]\n ]\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 3,\n \"description\": \"Write a function that deep flattens a nested array. E.g. [1,[2,[3,[4]]],5] => [1,2,3,4,5].\",\n \"functionName\": \"deepFlatten\",\n \"signature\": \"function deepFlatten(arr)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 1,\n [\n 2,\n [\n 3,\n [\n 4\n ]\n ]\n ],\n 5\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3,\n 4,\n 5\n ]\n },\n {\n \"input\": [\n [\n []\n ]\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [\n [\n 1,\n 2,\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n [\n [\n [\n 1\n ]\n ]\n ]\n ]\n ]\n ],\n \"expected\": [\n 1\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n [],\n 2,\n [\n 3,\n []\n ]\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n \"a\",\n [\n \"b\",\n [\n \"c\"\n ]\n ]\n ]\n ]\n ],\n \"expected\": [\n \"a\",\n \"b\",\n \"c\"\n ]\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 4,\n \"description\": \"Write a function that returns all permutations of a string. Return sorted array of unique permutations.\",\n \"functionName\": \"permutations\",\n \"signature\": \"function permutations(s)\",\n \"tests\": [\n {\n \"input\": [\n \"ab\"\n ],\n \"expected\": [\n \"ab\",\n \"ba\"\n ]\n },\n {\n \"input\": [\n \"a\"\n ],\n \"expected\": [\n \"a\"\n ]\n },\n {\n \"input\": [\n \"abc\"\n ],\n \"expected\": [\n \"abc\",\n \"acb\",\n \"bac\",\n \"bca\",\n \"cab\",\n \"cba\"\n ]\n },\n {\n \"input\": [\n \"\"\n ],\n \"expected\": [\n \"\"\n ]\n },\n {\n \"input\": [\n \"aa\"\n ],\n \"expected\": [\n \"aa\"\n ]\n },\n {\n \"input\": [\n \"aba\"\n ],\n \"expected\": [\n \"aab\",\n \"aba\",\n \"baa\"\n ]\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 5,\n \"description\": \"Write a function that converts a Roman numeral string to an integer. Handle values I(1), V(5), X(10), L(50), C(100), D(500), M(1000) with subtractive notation.\",\n \"functionName\": \"romanToInt\",\n \"signature\": \"function romanToInt(s)\",\n \"tests\": [\n {\n \"input\": [\n \"III\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"IV\"\n ],\n \"expected\": 4\n },\n {\n \"input\": [\n \"IX\"\n ],\n \"expected\": 9\n },\n {\n \"input\": [\n \"MCMXCIV\"\n ],\n \"expected\": 1994\n },\n {\n \"input\": [\n \"XLII\"\n ],\n \"expected\": 42\n },\n {\n \"input\": [\n \"DCCCXC\"\n ],\n \"expected\": 890\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 6,\n \"description\": \"Write a function that finds the first non-repeating character in a string and returns its index. Return -1 if none.\",\n \"functionName\": \"firstUniqCharIndex\",\n \"signature\": \"function firstUniqCharIndex(s)\",\n \"tests\": [\n {\n \"input\": [\n \"leetcode\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"loveleetcode\"\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n \"aabb\"\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n \"\"\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n \"a\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"abacabad\"\n ],\n \"expected\": 3\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 7,\n \"description\": \"Write a function that removes duplicate values from an array, preserving order.\",\n \"functionName\": \"removeDuplicates\",\n \"signature\": \"function removeDuplicates(arr)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 2,\n 2,\n 3,\n 3,\n 3\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n \"a\",\n \"b\",\n \"a\"\n ]\n ],\n \"expected\": [\n \"a\",\n \"b\"\n ]\n },\n {\n \"input\": [\n []\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [\n 1,\n 1,\n 1\n ]\n ],\n \"expected\": [\n 1\n ]\n },\n {\n \"input\": [\n [\n true,\n false,\n true,\n true\n ]\n ],\n \"expected\": [\n true,\n false\n ]\n },\n {\n \"input\": [\n [\n 1,\n \"1\",\n 1,\n \"1\"\n ]\n ],\n \"expected\": [\n 1,\n \"1\"\n ]\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 8,\n \"description\": \"Write a function that counts the number of vowels (a, e, i, o, u) in a string (case-insensitive).\",\n \"functionName\": \"countVowels\",\n \"signature\": \"function countVowels(str)\",\n \"tests\": [\n {\n \"input\": [\n \"hello\"\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n \"AEIOU\"\n ],\n \"expected\": 5\n },\n {\n \"input\": [\n \"xyz\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"The quick brown fox\"\n ],\n \"expected\": 5\n },\n {\n \"input\": [\n \"rhythms\"\n ],\n \"expected\": 0\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 9,\n \"description\": \"Write a function that flattens a nested array one level deep.\",\n \"functionName\": \"flatten\",\n \"signature\": \"function flatten(arr)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3,\n 4\n ]\n },\n {\n \"input\": [\n [\n [\n 1\n ],\n [\n 2\n ],\n [\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n []\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [\n [\n 1,\n [\n 2,\n 3\n ]\n ]\n ]\n ],\n \"expected\": [\n 1,\n [\n 2,\n 3\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2\n ],\n [],\n [\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n \"a\"\n ],\n [\n \"b\",\n \"c\"\n ]\n ]\n ],\n \"expected\": [\n \"a\",\n \"b\",\n \"c\"\n ]\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 10,\n \"description\": \"Write a function that converts a string to title case (first letter of each word capitalized).\",\n \"functionName\": \"toTitleCase\",\n \"signature\": \"function toTitleCase(str)\",\n \"tests\": [\n {\n \"input\": [\n \"hello world\"\n ],\n \"expected\": \"Hello World\"\n },\n {\n \"input\": [\n \"javaScript is fun\"\n ],\n \"expected\": \"Javascript Is Fun\"\n },\n {\n \"input\": [\n \"\"\n ],\n \"expected\": \"\"\n },\n {\n \"input\": [\n \"a\"\n ],\n \"expected\": \"A\"\n },\n {\n \"input\": [\n \"hello WORLD\"\n ],\n \"expected\": \"Hello World\"\n },\n {\n \"input\": [\n \"mIXed cAsE tExt\"\n ],\n \"expected\": \"Mixed Case Text\"\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 11,\n \"description\": \"Write a function that checks if a number is prime.\",\n \"functionName\": \"isPrime\",\n \"signature\": \"function isPrime(n)\",\n \"tests\": [\n {\n \"input\": [\n 2\n ],\n \"expected\": true\n },\n {\n \"input\": [\n 17\n ],\n \"expected\": true\n },\n {\n \"input\": [\n 1\n ],\n \"expected\": false\n },\n {\n \"input\": [\n 4\n ],\n \"expected\": false\n },\n {\n \"input\": [\n 0\n ],\n \"expected\": false\n },\n {\n \"input\": [\n 97\n ],\n \"expected\": true\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 12,\n \"description\": \"Write a function that returns the unique intersection of two arrays (common elements), sorted in ascending order for numbers and lexicographical order for strings.\",\n \"functionName\": \"intersection\",\n \"signature\": \"function intersection(a, b)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 2,\n 3\n ],\n [\n 2,\n 3,\n 4\n ]\n ],\n \"expected\": [\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ]\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [],\n [\n 1,\n 2\n ]\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [\n 1,\n 1,\n 2\n ],\n [\n 1,\n 2,\n 2\n ]\n ],\n \"expected\": [\n 1,\n 2\n ]\n },\n {\n \"input\": [\n [\n \"a\",\n \"b\",\n \"c\"\n ],\n [\n \"b\",\n \"d\",\n \"a\"\n ]\n ],\n \"expected\": [\n \"a\",\n \"b\"\n ]\n },\n {\n \"input\": [\n [\n 1,\n 2,\n 3\n ],\n [\n 3,\n 3,\n 3\n ]\n ],\n \"expected\": [\n 3\n ]\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 13,\n \"description\": \"Write a function that groups an array of objects by a given key.\",\n \"functionName\": \"groupBy\",\n \"signature\": \"function groupBy(arr, key)\",\n \"tests\": [\n {\n \"input\": [\n [\n {\n \"name\": \"Alice\",\n \"age\": 30\n },\n {\n \"name\": \"Bob\",\n \"age\": 30\n },\n {\n \"name\": \"Charlie\",\n \"age\": 25\n }\n ],\n \"age\"\n ],\n \"expected\": {\n \"25\": [\n {\n \"name\": \"Charlie\",\n \"age\": 25\n }\n ],\n \"30\": [\n {\n \"name\": \"Alice\",\n \"age\": 30\n },\n {\n \"name\": \"Bob\",\n \"age\": 30\n }\n ]\n }\n },\n {\n \"input\": [\n [],\n \"key\"\n ],\n \"expected\": {}\n },\n {\n \"input\": [\n [\n {\n \"t\": \"x\",\n \"v\": 1\n },\n {\n \"t\": \"y\",\n \"v\": 2\n },\n {\n \"t\": \"x\",\n \"v\": 3\n }\n ],\n \"t\"\n ],\n \"expected\": {\n \"x\": [\n {\n \"t\": \"x\",\n \"v\": 1\n },\n {\n \"t\": \"x\",\n \"v\": 3\n }\n ],\n \"y\": [\n {\n \"t\": \"y\",\n \"v\": 2\n }\n ]\n }\n },\n {\n \"input\": [\n [\n {\n \"name\": \"a\"\n },\n {\n \"name\": \"b\",\n \"age\": 20\n }\n ],\n \"age\"\n ],\n \"expected\": {\n \"20\": [\n {\n \"name\": \"b\",\n \"age\": 20\n }\n ],\n \"undefined\": [\n {\n \"name\": \"a\"\n }\n ]\n }\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 14,\n \"description\": \"Write a function that converts a number to its Roman numeral string representation (1-3999).\",\n \"functionName\": \"toRoman\",\n \"signature\": \"function toRoman(num)\",\n \"tests\": [\n {\n \"input\": [\n 1\n ],\n \"expected\": \"I\"\n },\n {\n \"input\": [\n 4\n ],\n \"expected\": \"IV\"\n },\n {\n \"input\": [\n 9\n ],\n \"expected\": \"IX\"\n },\n {\n \"input\": [\n 2024\n ],\n \"expected\": \"MMXXIV\"\n },\n {\n \"input\": [\n 58\n ],\n \"expected\": \"LVIII\"\n },\n {\n \"input\": [\n 3999\n ],\n \"expected\": \"MMMCMXCIX\"\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 15,\n \"description\": \"Write a function that implements binary search on a sorted array. Return the index if found, -1 otherwise.\",\n \"functionName\": \"binarySearch\",\n \"signature\": \"function binarySearch(arr, target)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 3,\n 5,\n 7,\n 9\n ],\n 5\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n [\n 1,\n 3,\n 5,\n 7,\n 9\n ],\n 4\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n [],\n 1\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n [\n 1\n ],\n 1\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n [\n 1,\n 3,\n 5,\n 7,\n 9\n ],\n 1\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n [\n 1,\n 3,\n 5,\n 7,\n 9\n ],\n 9\n ],\n \"expected\": 4\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 16,\n \"description\": \"Write a function that returns the longest common prefix among an array of strings.\",\n \"functionName\": \"longestCommonPrefix\",\n \"signature\": \"function longestCommonPrefix(words)\",\n \"tests\": [\n {\n \"input\": [\n [\n \"flower\",\n \"flow\",\n \"flight\"\n ]\n ],\n \"expected\": \"fl\"\n },\n {\n \"input\": [\n [\n \"dog\",\n \"racecar\",\n \"car\"\n ]\n ],\n \"expected\": \"\"\n },\n {\n \"input\": [\n [\n \"interspecies\",\n \"interstellar\",\n \"interstate\"\n ]\n ],\n \"expected\": \"inters\"\n },\n {\n \"input\": [\n [\n \"single\"\n ]\n ],\n \"expected\": \"single\"\n },\n {\n \"input\": [\n [\n \"\",\n \"b\"\n ]\n ],\n \"expected\": \"\"\n },\n {\n \"input\": [\n [\n \"throne\",\n \"throne\"\n ]\n ],\n \"expected\": \"throne\"\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 17,\n \"description\": \"Write a function that validates a bracket string containing (), [], and {}.\",\n \"functionName\": \"isValidBrackets\",\n \"signature\": \"function isValidBrackets(s)\",\n \"tests\": [\n {\n \"input\": [\n \"()[]{}\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"(]\"\n ],\n \"expected\": false\n },\n {\n \"input\": [\n \"([{}])\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"(((\"\n ],\n \"expected\": false\n },\n {\n \"input\": [\n \"{[()]}[]\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"([)]\"\n ],\n \"expected\": false\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 18,\n \"description\": \"Write a function that merges overlapping or touching intervals and returns them sorted by start.\",\n \"functionName\": \"mergeIntervals\",\n \"signature\": \"function mergeIntervals(intervals)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 1,\n 3\n ],\n [\n 2,\n 6\n ],\n [\n 8,\n 10\n ],\n [\n 15,\n 18\n ]\n ]\n ],\n \"expected\": [\n [\n 1,\n 6\n ],\n [\n 8,\n 10\n ],\n [\n 15,\n 18\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 4\n ],\n [\n 4,\n 5\n ]\n ]\n ],\n \"expected\": [\n [\n 1,\n 5\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 5,\n 7\n ],\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ]\n ]\n ],\n \"expected\": [\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ],\n [\n 5,\n 7\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 10\n ],\n [\n 2,\n 3\n ],\n [\n 4,\n 8\n ]\n ]\n ],\n \"expected\": [\n [\n 1,\n 10\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2\n ]\n ]\n ],\n \"expected\": [\n [\n 1,\n 2\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 2,\n 3\n ],\n [\n 3,\n 3\n ],\n [\n 5,\n 7\n ],\n [\n 6,\n 8\n ]\n ]\n ],\n \"expected\": [\n [\n 2,\n 3\n ],\n [\n 5,\n 8\n ]\n ]\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 19,\n \"description\": \"Write a function that returns the top-k frequent numbers, sorted by frequency desc then value asc for ties.\",\n \"functionName\": \"topKFrequent\",\n \"signature\": \"function topKFrequent(nums, k)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 1,\n 1,\n 2,\n 2,\n 3\n ],\n 2\n ],\n \"expected\": [\n 1,\n 2\n ]\n },\n {\n \"input\": [\n [\n 4,\n 4,\n 1,\n 1,\n 2,\n 2\n ],\n 2\n ],\n \"expected\": [\n 1,\n 2\n ]\n },\n {\n \"input\": [\n [\n 5\n ],\n 1\n ],\n \"expected\": [\n 5\n ]\n },\n {\n \"input\": [\n [\n 1,\n 2,\n 3,\n 4\n ],\n 3\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n 3,\n 0,\n 1,\n 0\n ],\n 1\n ],\n \"expected\": [\n 0\n ]\n },\n {\n \"input\": [\n [\n 2,\n 2,\n 2,\n 1,\n 1,\n 3,\n 3\n ],\n 2\n ],\n \"expected\": [\n 2,\n 1\n ]\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 20,\n \"description\": \"Write a function that returns the minimum number of coins needed to make a target amount, or -1 if impossible.\",\n \"functionName\": \"coinChangeMin\",\n \"signature\": \"function coinChangeMin(coins, amount)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 2,\n 5\n ],\n 11\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n [\n 2\n ],\n 3\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n [\n 1\n ],\n 0\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n [\n 1,\n 3,\n 4\n ],\n 6\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n [\n 2,\n 5,\n 10,\n 1\n ],\n 27\n ],\n \"expected\": 4\n },\n {\n \"input\": [\n [\n 186,\n 419,\n 83,\n 408\n ],\n 6249\n ],\n \"expected\": 20\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 21,\n \"description\": \"Write a function that computes the Levenshtein edit distance between two strings.\",\n \"functionName\": \"editDistance\",\n \"signature\": \"function editDistance(a, b)\",\n \"tests\": [\n {\n \"input\": [\n \"horse\",\n \"ros\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"intention\",\n \"execution\"\n ],\n \"expected\": 5\n },\n {\n \"input\": [\n \"\",\n \"\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"abc\",\n \"\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"kitten\",\n \"sitting\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"flaw\",\n \"lawn\"\n ],\n \"expected\": 2\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 22,\n \"description\": \"Write a function that normalizes a Unix path (., .., repeated slashes) into canonical form.\",\n \"functionName\": \"simplifyPath\",\n \"signature\": \"function simplifyPath(path)\",\n \"tests\": [\n {\n \"input\": [\n \"/home/\"\n ],\n \"expected\": \"/home\"\n },\n {\n \"input\": [\n \"/../\"\n ],\n \"expected\": \"/\"\n },\n {\n \"input\": [\n \"/home//foo/\"\n ],\n \"expected\": \"/home/foo\"\n },\n {\n \"input\": [\n \"/a/./b/../../c/\"\n ],\n \"expected\": \"/c\"\n },\n {\n \"input\": [\n \"/a/../../b/../c//.//\"\n ],\n \"expected\": \"/c\"\n },\n {\n \"input\": [\n \"/a//b////c/d//././/..\"\n ],\n \"expected\": \"/a/b/c\"\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 23,\n \"description\": \"Write a function that returns all elements of a matrix in spiral order.\",\n \"functionName\": \"spiralOrder\",\n \"signature\": \"function spiralOrder(matrix)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 1,\n 2,\n 3\n ],\n [\n 4,\n 5,\n 6\n ],\n [\n 7,\n 8,\n 9\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3,\n 6,\n 9,\n 8,\n 7,\n 4,\n 5\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2,\n 3,\n 4\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3,\n 4\n ]\n },\n {\n \"input\": [\n [\n [\n 1\n ],\n [\n 2\n ],\n [\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ],\n [\n 5,\n 6\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 4,\n 6,\n 5,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n 1\n ]\n ]\n ],\n \"expected\": [\n 1\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 4,\n 3\n ]\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 24,\n \"description\": \"Write a function that returns the length of the longest strictly increasing subsequence.\",\n \"functionName\": \"longestIncreasingSubsequence\",\n \"signature\": \"function longestIncreasingSubsequence(nums)\",\n \"tests\": [\n {\n \"input\": [\n [\n 10,\n 9,\n 2,\n 5,\n 3,\n 7,\n 101,\n 18\n ]\n ],\n \"expected\": 4\n },\n {\n \"input\": [\n [\n 0,\n 1,\n 0,\n 3,\n 2,\n 3\n ]\n ],\n \"expected\": 4\n },\n {\n \"input\": [\n [\n 7,\n 7,\n 7,\n 7,\n 7\n ]\n ],\n \"expected\": 1\n },\n {\n \"input\": [\n [\n 4,\n 10,\n 4,\n 3,\n 8,\n 9\n ]\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n [\n 1,\n 3,\n 6,\n 7,\n 9,\n 4,\n 10,\n 5,\n 6\n ]\n ],\n \"expected\": 6\n },\n {\n \"input\": [\n []\n ],\n \"expected\": 0\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 25,\n \"description\": \"Write a function that evaluates an expression in Reverse Polish Notation (RPN).\",\n \"functionName\": \"evalRPN\",\n \"signature\": \"function evalRPN(tokens)\",\n \"tests\": [\n {\n \"input\": [\n [\n \"2\",\n \"1\",\n \"+\",\n \"3\",\n \"*\"\n ]\n ],\n \"expected\": 9\n },\n {\n \"input\": [\n [\n \"4\",\n \"13\",\n \"5\",\n \"/\",\n \"+\"\n ]\n ],\n \"expected\": 6\n },\n {\n \"input\": [\n [\n \"10\",\n \"6\",\n \"9\",\n \"3\",\n \"+\",\n \"-11\",\n \"*\",\n \"/\",\n \"*\",\n \"17\",\n \"+\",\n \"5\",\n \"+\"\n ]\n ],\n \"expected\": 22\n },\n {\n \"input\": [\n [\n \"3\",\n \"-4\",\n \"+\"\n ]\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n [\n \"5\",\n \"1\",\n \"2\",\n \"+\",\n \"4\",\n \"*\",\n \"+\",\n \"3\",\n \"-\"\n ]\n ],\n \"expected\": 14\n },\n {\n \"input\": [\n [\n \"7\",\n \"3\",\n \"/\"\n ]\n ],\n \"expected\": 2\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 26,\n \"description\": \"Write a function that finds the shortest path length in an unweighted graph represented as an adjacency list (object). Return -1 if no path exists.\",\n \"functionName\": \"shortestPath\",\n \"signature\": \"function shortestPath(graph, start, end)\",\n \"tests\": [\n {\n \"input\": [\n {\n \"A\": [\n \"B\",\n \"C\"\n ],\n \"B\": [\n \"A\",\n \"D\"\n ],\n \"C\": [\n \"A\",\n \"D\"\n ],\n \"D\": [\n \"B\",\n \"C\"\n ]\n },\n \"A\",\n \"D\"\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\"\n ],\n \"B\": [\n \"A\"\n ],\n \"C\": [\n \"D\"\n ],\n \"D\": [\n \"C\"\n ]\n },\n \"A\",\n \"D\"\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\"\n ],\n \"B\": [\n \"C\"\n ],\n \"C\": [\n \"D\"\n ],\n \"D\": []\n },\n \"A\",\n \"D\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n {\n \"A\": [\n \"A\"\n ]\n },\n \"A\",\n \"A\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\",\n \"C\"\n ],\n \"B\": [\n \"D\"\n ],\n \"C\": [\n \"D\"\n ],\n \"D\": []\n },\n \"A\",\n \"D\"\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n {\n \"X\": [\n \"Y\"\n ],\n \"Y\": [\n \"Z\"\n ],\n \"Z\": []\n },\n \"X\",\n \"Z\"\n ],\n \"expected\": 2\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 27,\n \"description\": \"Write a function that detects if a directed graph (adjacency list object) contains a cycle. Return true if cycle exists, false otherwise.\",\n \"functionName\": \"hasCycle\",\n \"signature\": \"function hasCycle(graph)\",\n \"tests\": [\n {\n \"input\": [\n {\n \"A\": [\n \"B\"\n ],\n \"B\": [\n \"C\"\n ],\n \"C\": [\n \"A\"\n ]\n }\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\"\n ],\n \"B\": [\n \"C\"\n ],\n \"C\": []\n }\n ],\n \"expected\": false\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\",\n \"C\"\n ],\n \"B\": [\n \"D\"\n ],\n \"C\": [\n \"D\"\n ],\n \"D\": []\n }\n ],\n \"expected\": false\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\"\n ],\n \"B\": [\n \"C\"\n ],\n \"C\": [\n \"D\"\n ],\n \"D\": [\n \"B\"\n ]\n }\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"A\": []\n }\n ],\n \"expected\": false\n },\n {\n \"input\": [\n {\n \"A\": [\n \"A\"\n ]\n }\n ],\n \"expected\": true\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 28,\n \"description\": \"Write a function that validates whether a binary tree (given as nested object {val, left, right} or null) is a valid binary search tree.\",\n \"functionName\": \"isValidBST\",\n \"signature\": \"function isValidBST(root)\",\n \"tests\": [\n {\n \"input\": [\n {\n \"val\": 2,\n \"left\": {\n \"val\": 1,\n \"left\": null,\n \"right\": null\n },\n \"right\": {\n \"val\": 3,\n \"left\": null,\n \"right\": null\n }\n }\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"val\": 5,\n \"left\": {\n \"val\": 1,\n \"left\": null,\n \"right\": null\n },\n \"right\": {\n \"val\": 4,\n \"left\": {\n \"val\": 3,\n \"left\": null,\n \"right\": null\n },\n \"right\": {\n \"val\": 6,\n \"left\": null,\n \"right\": null\n }\n }\n }\n ],\n \"expected\": false\n },\n {\n \"input\": [\n null\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"val\": 1,\n \"left\": null,\n \"right\": null\n }\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"val\": 5,\n \"left\": {\n \"val\": 4,\n \"left\": {\n \"val\": 3,\n \"left\": null,\n \"right\": null\n },\n \"right\": null\n },\n \"right\": {\n \"val\": 6,\n \"left\": null,\n \"right\": {\n \"val\": 7,\n \"left\": null,\n \"right\": null\n }\n }\n }\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"val\": 3,\n \"left\": {\n \"val\": 1,\n \"left\": null,\n \"right\": {\n \"val\": 4,\n \"left\": null,\n \"right\": null\n }\n },\n \"right\": {\n \"val\": 5,\n \"left\": null,\n \"right\": null\n }\n }\n ],\n \"expected\": false\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 29,\n \"description\": \"Write a function that checks if a partially filled 9x9 Sudoku board (2D array, 0 for empty) is valid. Only check filled cells for row, column, and 3x3 box conflicts.\",\n \"functionName\": \"isValidSudoku\",\n \"signature\": \"function isValidSudoku(board)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 5,\n 3,\n 0,\n 0,\n 7,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 6,\n 0,\n 0,\n 1,\n 9,\n 5,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 9,\n 8,\n 0,\n 0,\n 0,\n 0,\n 6,\n 0\n ],\n [\n 8,\n 0,\n 0,\n 0,\n 6,\n 0,\n 0,\n 0,\n 3\n ],\n [\n 4,\n 0,\n 0,\n 8,\n 0,\n 3,\n 0,\n 0,\n 1\n ],\n [\n 7,\n 0,\n 0,\n 0,\n 2,\n 0,\n 0,\n 0,\n 6\n ],\n [\n 0,\n 6,\n 0,\n 0,\n 0,\n 0,\n 2,\n 8,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 4,\n 1,\n 9,\n 0,\n 0,\n 5\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 8,\n 0,\n 0,\n 7,\n 9\n ]\n ]\n ],\n \"expected\": true\n },\n {\n \"input\": [\n [\n [\n 5,\n 3,\n 0,\n 0,\n 7,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 6,\n 0,\n 0,\n 1,\n 9,\n 5,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 9,\n 8,\n 0,\n 0,\n 0,\n 0,\n 6,\n 0\n ],\n [\n 8,\n 0,\n 0,\n 0,\n 6,\n 0,\n 0,\n 0,\n 3\n ],\n [\n 4,\n 0,\n 0,\n 8,\n 0,\n 3,\n 0,\n 0,\n 1\n ],\n [\n 7,\n 0,\n 0,\n 0,\n 2,\n 0,\n 0,\n 0,\n 6\n ],\n [\n 0,\n 6,\n 0,\n 0,\n 0,\n 0,\n 2,\n 8,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 4,\n 1,\n 9,\n 0,\n 0,\n 5\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 8,\n 0,\n 0,\n 7,\n 5\n ]\n ]\n ],\n \"expected\": false\n },\n {\n \"input\": [\n [\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ]\n ],\n \"expected\": true\n },\n {\n \"input\": [\n [\n [\n 1,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ]\n ],\n \"expected\": false\n },\n {\n \"input\": [\n [\n [\n 1,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ]\n ],\n \"expected\": true\n },\n {\n \"input\": [\n [\n [\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ]\n ],\n \"expected\": true\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 30,\n \"description\": \"Write a function that returns the maximum sum of a contiguous subarray of size k.\",\n \"functionName\": \"maxSubarraySum\",\n \"signature\": \"function maxSubarraySum(arr, k)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 4,\n 2,\n 10,\n 23,\n 3,\n 1,\n 0,\n 20\n ],\n 4\n ],\n \"expected\": 39\n },\n {\n \"input\": [\n [\n 2,\n 3\n ],\n 3\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n [\n 100,\n 200,\n 300,\n 400\n ],\n 2\n ],\n \"expected\": 700\n },\n {\n \"input\": [\n [\n 1,\n 1,\n 1,\n 1,\n 1\n ],\n 1\n ],\n \"expected\": 1\n },\n {\n \"input\": [\n [\n -1,\n -2,\n -3,\n -4\n ],\n 2\n ],\n \"expected\": -3\n },\n {\n \"input\": [\n [\n 5\n ],\n 1\n ],\n \"expected\": 5\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 31,\n \"description\": \"Write a function that implements a simple Trie and returns all words matching a given prefix. The function takes an array of words and a prefix, and returns matching words sorted alphabetically.\",\n \"functionName\": \"autocomplete\",\n \"signature\": \"function autocomplete(words, prefix)\",\n \"tests\": [\n {\n \"input\": [\n [\n \"apple\",\n \"app\",\n \"application\",\n \"banana\",\n \"band\"\n ],\n \"app\"\n ],\n \"expected\": [\n \"app\",\n \"apple\",\n \"application\"\n ]\n },\n {\n \"input\": [\n [\n \"hello\",\n \"help\",\n \"hero\",\n \"hex\"\n ],\n \"he\"\n ],\n \"expected\": [\n \"hello\",\n \"help\",\n \"hero\",\n \"hex\"\n ]\n },\n {\n \"input\": [\n [\n \"cat\",\n \"car\",\n \"card\"\n ],\n \"car\"\n ],\n \"expected\": [\n \"car\",\n \"card\"\n ]\n },\n {\n \"input\": [\n [\n \"dog\",\n \"cat\",\n \"bird\"\n ],\n \"z\"\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [\n \"test\"\n ],\n \"test\"\n ],\n \"expected\": [\n \"test\"\n ]\n },\n {\n \"input\": [\n [\n \"abc\",\n \"abd\",\n \"abe\",\n \"xyz\"\n ],\n \"ab\"\n ],\n \"expected\": [\n \"abc\",\n \"abd\",\n \"abe\"\n ]\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 32,\n \"description\": \"Write a function that merges k sorted arrays into one sorted array.\",\n \"functionName\": \"mergeKSorted\",\n \"signature\": \"function mergeKSorted(arrays)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 1,\n 4,\n 7\n ],\n [\n 2,\n 5,\n 8\n ],\n [\n 3,\n 6,\n 9\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2,\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n 5\n ],\n [\n 1\n ],\n [\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 3,\n 5\n ]\n },\n {\n \"input\": [\n [\n [],\n [\n 1,\n 2\n ],\n []\n ]\n ],\n \"expected\": [\n 1,\n 2\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 1,\n 1\n ],\n [\n 1,\n 1\n ],\n [\n 1\n ]\n ]\n ],\n \"expected\": [\n 1,\n 1,\n 1,\n 1,\n 1,\n 1\n ]\n },\n {\n \"input\": [\n [\n [\n 10,\n 20\n ],\n [\n 5,\n 15,\n 25\n ],\n [\n 1,\n 30\n ]\n ]\n ],\n \"expected\": [\n 1,\n 5,\n 10,\n 15,\n 20,\n 25,\n 30\n ]\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 33,\n \"description\": \"Write a function that returns the length of the longest common subsequence of two strings.\",\n \"functionName\": \"longestCommonSubsequence\",\n \"signature\": \"function longestCommonSubsequence(s1, s2)\",\n \"tests\": [\n {\n \"input\": [\n \"abcde\",\n \"ace\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"abc\",\n \"abc\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"abc\",\n \"def\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"\",\n \"abc\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"abcba\",\n \"abcbcba\"\n ],\n \"expected\": 5\n },\n {\n \"input\": [\n \"AGGTAB\",\n \"GXTXAYB\"\n ],\n \"expected\": 4\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 34,\n \"description\": \"Write a function that evaluates a simple mathematical expression string containing non-negative integers, +, -, *, / (integer division), and spaces. Respect operator precedence.\",\n \"functionName\": \"calculate\",\n \"signature\": \"function calculate(expression)\",\n \"tests\": [\n {\n \"input\": [\n \"3+2*2\"\n ],\n \"expected\": 7\n },\n {\n \"input\": [\n \" 3/2 \"\n ],\n \"expected\": 1\n },\n {\n \"input\": [\n \" 3+5 / 2 \"\n ],\n \"expected\": 5\n },\n {\n \"input\": [\n \"14-3/2\"\n ],\n \"expected\": 13\n },\n {\n \"input\": [\n \"0+0\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"42\"\n ],\n \"expected\": 42\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 35,\n \"description\": \"Write a function that implements simplified regex matching supporting '.' (any single char) and '*' (zero or more of the preceding element). Return true if the pattern matches the entire string.\",\n \"functionName\": \"isMatch\",\n \"signature\": \"function isMatch(s, p)\",\n \"tests\": [\n {\n \"input\": [\n \"aa\",\n \"a\"\n ],\n \"expected\": false\n },\n {\n \"input\": [\n \"aa\",\n \"a*\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"ab\",\n \".*\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"aab\",\n \"c*a*b\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"mississippi\",\n \"mis*is*p*.\"\n ],\n \"expected\": false\n },\n {\n \"input\": [\n \"\",\n \".*\"\n ],\n \"expected\": true\n }\n ],\n \"difficulty\": \"hard\"\n }\n]\n","[\n {\n \"id\": 1,\n \"category\": \"format\",\n \"prompt\": \"List exactly 3 benefits of exercise. Use a numbered list (1. 2. 3.).\",\n \"validation\": \"numberedList\",\n \"params\": { \"expectedCount\": 3 }\n },\n {\n \"id\": 2,\n \"category\": \"format\",\n \"prompt\": \"Explain what a CPU does in exactly one sentence.\",\n \"validation\": \"sentenceCount\",\n \"params\": { \"expectedCount\": 1 }\n },\n {\n \"id\": 3,\n \"category\": \"format\",\n \"prompt\": \"Name 5 European countries, separated by commas, nothing else.\",\n \"validation\": \"commaSeparated\",\n \"params\": { \"expectedCount\": 5 }\n },\n {\n \"id\": 4,\n \"category\": \"format\",\n \"prompt\": \"Give a one-word answer: what color is the sky on a clear day?\",\n \"validation\": \"wordCount\",\n \"params\": { \"expectedCount\": 1 }\n },\n {\n \"id\": 5,\n \"category\": \"format\",\n \"prompt\": \"Write exactly 2 paragraphs about the internet.\",\n \"validation\": \"paragraphCount\",\n \"params\": { \"expectedCount\": 2 }\n },\n {\n \"id\": 6,\n \"category\": \"negative\",\n \"prompt\": \"Explain what a computer does without using the words 'machine', 'device', or 'computer'.\",\n \"validation\": \"forbiddenWords\",\n \"params\": { \"forbidden\": [\"machine\", \"device\", \"computer\"] }\n },\n {\n \"id\": 7,\n \"category\": \"negative\",\n \"prompt\": \"Describe the ocean without using the letter 'e'.\",\n \"validation\": \"forbiddenLetters\",\n \"params\": { \"forbidden\": [\"e\"] }\n },\n {\n \"id\": 8,\n \"category\": \"negative\",\n \"prompt\": \"Tell me about France without mentioning Paris.\",\n \"validation\": \"forbiddenWords\",\n \"params\": { \"forbidden\": [\"Paris\", \"paris\"] }\n },\n {\n \"id\": 9,\n \"category\": \"negative\",\n \"prompt\": \"Explain addition without using any digits (0-9).\",\n \"validation\": \"forbiddenPattern\",\n \"params\": { \"pattern\": \"[0-9]\" }\n },\n {\n \"id\": 10,\n \"category\": \"negative\",\n \"prompt\": \"Describe a cat without using the words 'pet', 'animal', or 'fur'.\",\n \"validation\": \"forbiddenWords\",\n \"params\": { \"forbidden\": [\"pet\", \"animal\", \"fur\"] }\n },\n {\n \"id\": 11,\n \"category\": \"structural\",\n \"prompt\": \"First list 2 pros, then 2 cons of remote work. Label them clearly with 'Pros:' and 'Cons:'.\",\n \"validation\": \"prosConsStructure\",\n \"params\": { \"prosCount\": 2, \"consCount\": 2 }\n },\n {\n \"id\": 12,\n \"category\": \"structural\",\n \"prompt\": \"Start your response with the word 'Indeed' and end with the word 'Goodbye'.\",\n \"validation\": \"startEnd\",\n \"params\": { \"start\": \"Indeed\", \"end\": \"Goodbye\" }\n },\n {\n \"id\": 13,\n \"category\": \"structural\",\n \"prompt\": \"Respond to this question using only questions: What is the meaning of life?\",\n \"validation\": \"allQuestions\",\n \"params\": {}\n },\n {\n \"id\": 14,\n \"category\": \"structural\",\n \"prompt\": \"Reply in the format 'ANSWER: <value>' — What is 7 times 8?\",\n \"validation\": \"answerFormat\",\n \"params\": { \"expectedValue\": \"56\" }\n },\n {\n \"id\": 15,\n \"category\": \"structural\",\n \"prompt\": \"Write your answer as a bullet list with exactly 4 items, each starting with a dash (-).\",\n \"validation\": \"dashList\",\n \"params\": { \"expectedCount\": 4 }\n },\n {\n \"id\": 16,\n \"category\": \"content\",\n \"prompt\": \"Name a fruit that starts with 'B' and has more than 5 letters.\",\n \"validation\": \"fruitStartLength\",\n \"params\": { \"startLetter\": \"B\", \"minLength\": 6 }\n },\n {\n \"id\": 17,\n \"category\": \"content\",\n \"prompt\": \"Give me a 4-letter English word that rhymes with 'light'.\",\n \"validation\": \"wordLength\",\n \"params\": { \"expectedLength\": 4 }\n },\n {\n \"id\": 18,\n \"category\": \"content\",\n \"prompt\": \"Write a sentence that contains exactly 8 words.\",\n \"validation\": \"wordCount\",\n \"params\": { \"expectedCount\": 8 }\n },\n {\n \"id\": 19,\n \"category\": \"content\",\n \"prompt\": \"List 3 programming languages created before the year 2000.\",\n \"validation\": \"listCount\",\n \"params\": { \"expectedCount\": 3 }\n },\n {\n \"id\": 20,\n \"category\": \"content\",\n \"prompt\": \"Name the 3 largest planets in our solar system in order from largest to smallest.\",\n \"validation\": \"planetOrder\",\n \"params\": {}\n }\n]\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, QuestionResult } from \"../types.js\";\nimport { stripThinkTags, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport ifData from \"../datasets/instruction-following.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nexport interface IFQuestion {\n id: number;\n category: string;\n prompt: string;\n validation: string;\n params: Record<string, unknown>;\n}\n\nconst questions = ifData as IFQuestion[];\nconst DEFAULT_INSTRUCTION_FOLLOWING_TIMEOUT_MS = 120_000;\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction containsStandaloneToken(text: string, token: string): boolean {\n const source = escapeRegex(token.toLowerCase());\n const re = new RegExp(`(?:^|[^\\\\p{L}\\\\p{N}_])${source}(?:$|[^\\\\p{L}\\\\p{N}_])`, \"u\");\n return re.test(text);\n}\n\nfunction normalizeExpectedValue(value: string): string {\n return value\n .trim()\n .replace(/^[\\s\"'`“”‘’()[\\]{}]+|[\\s\"'`“”‘’()[\\]{}]+$/g, \"\")\n .replace(/[.,;:!?]+$/g, \"\")\n .toLowerCase();\n}\n\nexport function validateInstructionFollowingResponse(response: string, q: IFQuestion): boolean {\n const text = response.trim();\n const p = q.params;\n\n switch (q.validation) {\n case \"numberedList\": {\n const count = p.expectedCount as number;\n const matches = text.match(/^\\d+[.)]\\s/gm);\n return matches !== null && matches.length === count;\n }\n\n case \"sentenceCount\": {\n const count = p.expectedCount as number;\n // Count sentence-ending punctuation\n const sentences = text.split(/[.!?]+/).filter((s) => s.trim().length > 0);\n return sentences.length === count;\n }\n\n case \"commaSeparated\": {\n const count = p.expectedCount as number;\n const items = text.split(\",\").map((s) => s.trim()).filter((s) => s.length > 0);\n return items.length === count;\n }\n\n case \"wordCount\": {\n const count = p.expectedCount as number;\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n return words.length === count;\n }\n\n case \"paragraphCount\": {\n const count = p.expectedCount as number;\n const paragraphs = text.split(/\\n\\s*\\n/).filter((p) => p.trim().length > 0);\n return paragraphs.length === count;\n }\n\n case \"forbiddenWords\": {\n const forbidden = p.forbidden as string[];\n const lower = text.toLowerCase();\n return forbidden.every((w) => !containsStandaloneToken(lower, w));\n }\n\n case \"forbiddenLetters\": {\n const forbidden = p.forbidden as string[];\n const lower = text.toLowerCase();\n return forbidden.every((letter) => !lower.includes(letter.toLowerCase()));\n }\n\n case \"forbiddenPattern\": {\n try {\n const pattern = new RegExp(p.pattern as string);\n return !pattern.test(text);\n } catch {\n return false;\n }\n }\n\n case \"prosConsStructure\": {\n const prosCount = p.prosCount as number | undefined;\n const consCount = p.consCount as number | undefined;\n\n const prosMatch = text.match(/(?:^|\\n)\\s*Pros\\s*:\\s*([\\s\\S]*?)(?=(?:\\n\\s*Cons\\s*:)|$)/i);\n const consMatch = text.match(/(?:^|\\n)\\s*Cons\\s*:\\s*([\\s\\S]*)$/i);\n if (!prosMatch || !consMatch) return false;\n if ((prosMatch.index ?? 0) >= (consMatch.index ?? Number.MAX_SAFE_INTEGER)) return false;\n\n const countItems = (block: string): number => {\n const lines = block\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n const bulletLines = lines.filter((l) => /^([-*]|\\d+[.)])\\s+/.test(l));\n if (bulletLines.length > 0) return bulletLines.length;\n return lines.length;\n };\n\n const prosItems = countItems(prosMatch[1] ?? \"\");\n const consItems = countItems(consMatch[1] ?? \"\");\n\n if (prosCount !== undefined && prosItems !== prosCount) return false;\n if (consCount !== undefined && consItems !== consCount) return false;\n return prosItems > 0 && consItems > 0;\n }\n\n case \"startEnd\": {\n const start = (p.start as string).toLowerCase();\n const end = (p.end as string).toLowerCase();\n const lower = text.toLowerCase();\n return lower.startsWith(start) && lower.endsWith(end);\n }\n\n case \"allQuestions\": {\n const sentences = text.split(/[.!?]\\s*/).filter((s) => s.trim().length > 0);\n if (sentences.length === 0) return false;\n // At least 80% should end with ? or be in the form of questions\n const questionCount = (text.match(/\\?/g) ?? []).length;\n return questionCount >= sentences.length * 0.8;\n }\n\n case \"answerFormat\": {\n const expected = p.expectedValue as string;\n const match = text.match(/^\\s*ANSWER:\\s*(.+)\\s*$/im);\n if (!match) return false;\n return normalizeExpectedValue(match[1]) === normalizeExpectedValue(expected);\n }\n\n case \"dashList\": {\n const count = p.expectedCount as number;\n const dashes = text.match(/^-\\s/gm);\n return dashes !== null && dashes.length === count;\n }\n\n case \"fruitStartLength\": {\n const startLetter = (p.startLetter as string).toLowerCase();\n const minLength = p.minLength as number;\n // Extract the first word or main answer\n const words = text.split(/[\\s,.:;!?]+/).filter((w) => /^[a-zA-Z]+$/.test(w));\n return words.some(\n (w) => w.toLowerCase().startsWith(startLetter) && w.length >= minLength\n );\n }\n\n case \"wordLength\": {\n const expected = p.expectedLength as number;\n const words = text.split(/\\s+/).filter((w) => /^[a-zA-Z]+$/.test(w));\n return words.some((w) => w.length === expected);\n }\n\n case \"listCount\": {\n const count = p.expectedCount as number;\n // Count items: numbered, dashed, or comma-separated\n const numbered = text.match(/^\\d+[.)]\\s/gm);\n const dashed = text.match(/^-\\s/gm);\n const commaItems = text.split(\",\").filter((s) => s.trim().length > 0);\n if (numbered && numbered.length === count) return true;\n if (dashed && dashed.length === count) return true;\n if (commaItems.length === count) return true;\n // Also check line-based items\n const lines = text.split(\"\\n\").filter((l) => l.trim().length > 0);\n return lines.length === count;\n }\n\n case \"planetOrder\": {\n const lower = text.toLowerCase();\n const jupiterIdx = lower.indexOf(\"jupiter\");\n const saturnIdx = lower.indexOf(\"saturn\");\n // Accept either Uranus or Neptune as 3rd\n const uranusIdx = lower.indexOf(\"uranus\");\n const neptuneIdx = lower.indexOf(\"neptune\");\n if (jupiterIdx === -1 || saturnIdx === -1) return false;\n if (jupiterIdx >= saturnIdx) return false;\n const thirdIdx = uranusIdx !== -1 ? uranusIdx : neptuneIdx;\n if (thirdIdx === -1) return false;\n return saturnIdx < thirdIdx;\n }\n\n default:\n return false;\n }\n}\n\nexport async function runInstructionFollowingBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running instruction following benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let correct = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_INSTRUCTION_FOLLOWING_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < questions.length; i++) {\n const q = questions[i];\n spinner.text = `Instruction Following ${i + 1}/${questions.length}: ${q.category}`;\n\n const prompt = q.prompt;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, prompt, withBenchmarkProfile({ num_predict: 1024, think: opts?.think })),\n timeoutMs,\n \"Instruction following task\",\n abortOngoingRequests\n );\n\n const answer = stripThinkTags(result.response);\n const isCorrect = validateInstructionFollowingResponse(answer, q);\n if (isCorrect) correct++;\n\n details.push({\n id: q.id,\n question: q.prompt,\n expected: q.validation,\n actual: answer.slice(0, 200),\n correct: isCorrect,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n details.push({\n id: q.id,\n question: q.prompt,\n expected: q.validation,\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Instruction Following: ${correct}/${questions.length} correct`);\n } catch (err) {\n spinner.fail(\"Instruction following benchmark failed\");\n throw err;\n }\n\n return {\n score: questions.length > 0 ? (correct / questions.length) * 100 : 0,\n correct,\n total: questions.length,\n details,\n };\n}\n","[\n {\n \"id\": 1,\n \"category\": \"json-validity\",\n \"prompt\": \"Output a JSON object with keys: name (string), age (number), city (string). Use realistic values. Output ONLY the JSON, no explanation.\",\n \"validation\": \"jsonKeys\",\n \"params\": { \"keys\": [\"name\", \"age\", \"city\"], \"types\": { \"name\": \"string\", \"age\": \"number\", \"city\": \"string\" } }\n },\n {\n \"id\": 2,\n \"category\": \"json-validity\",\n \"prompt\": \"Generate a JSON array of exactly 3 objects, each with 'id' (number) and 'label' (string). Output ONLY the JSON.\",\n \"validation\": \"jsonArray\",\n \"params\": { \"length\": 3, \"keys\": [\"id\", \"label\"], \"types\": { \"id\": \"number\", \"label\": \"string\" } }\n },\n {\n \"id\": 3,\n \"category\": \"json-validity\",\n \"prompt\": \"Create a JSON object representing a book with: title (string), author (string), year (number), genres (array of strings). Output ONLY the JSON.\",\n \"validation\": \"jsonKeys\",\n \"params\": { \"keys\": [\"title\", \"author\", \"year\", \"genres\"], \"types\": { \"title\": \"string\", \"author\": \"string\", \"year\": \"number\", \"genres\": \"array\" } }\n },\n {\n \"id\": 4,\n \"category\": \"json-validity\",\n \"prompt\": \"Output a nested JSON: {\\\"user\\\": {\\\"name\\\": string, \\\"email\\\": string}, \\\"preferences\\\": {\\\"theme\\\": string, \\\"language\\\": string}}. Output ONLY the JSON.\",\n \"validation\": \"jsonNested\",\n \"params\": { \"path1\": [\"user\", \"name\"], \"path2\": [\"user\", \"email\"], \"path3\": [\"preferences\", \"theme\"], \"path4\": [\"preferences\", \"language\"] }\n },\n {\n \"id\": 5,\n \"category\": \"json-validity\",\n \"prompt\": \"Generate a JSON array of exactly 5 numbers between 1 and 100. Output ONLY the JSON array.\",\n \"validation\": \"jsonNumberArray\",\n \"params\": { \"length\": 5, \"min\": 1, \"max\": 100 }\n },\n {\n \"id\": 6,\n \"category\": \"schema-compliance\",\n \"prompt\": \"Generate a valid JSON matching this TypeScript type: {success: boolean, data: {items: string[]}, count: number}. Output ONLY the JSON.\",\n \"validation\": \"jsonSchema\",\n \"params\": { \"schema\": { \"success\": \"boolean\", \"data\": \"object\", \"count\": \"number\" }, \"nestedKey\": \"data\", \"nestedSchema\": { \"items\": \"array\" } }\n },\n {\n \"id\": 7,\n \"category\": \"schema-compliance\",\n \"prompt\": \"Output a JSON tool call: {\\\"function\\\": string, \\\"arguments\\\": object}. Call a function named 'get_weather' with argument 'city' set to 'London'. Output ONLY the JSON.\",\n \"validation\": \"jsonToolCall\",\n \"params\": { \"functionName\": \"get_weather\", \"argKey\": \"city\", \"argValue\": \"London\" }\n },\n {\n \"id\": 8,\n \"category\": \"schema-compliance\",\n \"prompt\": \"Create a JSON response for an API: {\\\"status\\\": 200, \\\"message\\\": string, \\\"data\\\": null}. Output ONLY the JSON.\",\n \"validation\": \"jsonApiResponse\",\n \"params\": { \"status\": 200 }\n },\n {\n \"id\": 9,\n \"category\": \"schema-compliance\",\n \"prompt\": \"Generate a JSON array where each object has keys 'key' (string) and 'value' (number), with exactly 4 items. Output ONLY the JSON.\",\n \"validation\": \"jsonArray\",\n \"params\": { \"length\": 4, \"keys\": [\"key\", \"value\"], \"types\": { \"key\": \"string\", \"value\": \"number\" } }\n },\n {\n \"id\": 10,\n \"category\": \"schema-compliance\",\n \"prompt\": \"Output a JSON matching: {\\\"type\\\": \\\"event\\\", \\\"name\\\": string, \\\"date\\\": string (YYYY-MM-DD format), \\\"attendees\\\": number}. Output ONLY the JSON.\",\n \"validation\": \"jsonEvent\",\n \"params\": {}\n },\n {\n \"id\": 11,\n \"category\": \"structured-text\",\n \"prompt\": \"Output exactly 3 lines in the format 'KEY: VALUE' for name, role, and experience. Output ONLY the 3 lines.\",\n \"validation\": \"keyValueLines\",\n \"params\": { \"expectedCount\": 3, \"expectedKeys\": [\"name\", \"role\", \"experience\"] }\n },\n {\n \"id\": 12,\n \"category\": \"structured-text\",\n \"prompt\": \"Generate a CSV with header 'name,email,age' and exactly 2 data rows. Output ONLY the CSV.\",\n \"validation\": \"csvFormat\",\n \"params\": { \"headerColumns\": 3, \"dataRows\": 2 }\n },\n {\n \"id\": 13,\n \"category\": \"structured-text\",\n \"prompt\": \"Output a Markdown table with 2 columns (Language, Year) and 3 rows of programming languages. Output ONLY the table.\",\n \"validation\": \"markdownTable\",\n \"params\": { \"columns\": 2, \"dataRows\": 3 }\n },\n {\n \"id\": 14,\n \"category\": \"structured-text\",\n \"prompt\": \"Write a numbered list where each item follows the format: 'N. TERM — definition'. Write exactly 3 items. Output ONLY the list.\",\n \"validation\": \"numberedDefinitions\",\n \"params\": { \"expectedCount\": 3 }\n },\n {\n \"id\": 15,\n \"category\": \"structured-text\",\n \"prompt\": \"Output a valid HTML unordered list (<ul>) with exactly 3 list items (<li>). Output ONLY the HTML.\",\n \"validation\": \"htmlList\",\n \"params\": { \"expectedCount\": 3 }\n }\n]\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, QuestionResult } from \"../types.js\";\nimport { stripThinkTags, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport soData from \"../datasets/structured-output.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nexport interface SOQuestion {\n id: number;\n category: string;\n prompt: string;\n validation: string;\n params: Record<string, unknown>;\n}\n\nconst questions = soData as SOQuestion[];\nconst DEFAULT_STRUCTURED_OUTPUT_TIMEOUT_MS = 120_000;\n\ninterface JsonParseResult {\n ok: boolean;\n value: unknown;\n}\n\nfunction tryParseJson(text: string): JsonParseResult {\n try {\n return { ok: true, value: JSON.parse(text) };\n } catch {\n return { ok: false, value: null };\n }\n}\n\nfunction safeParse(text: string): unknown | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n\n const fencedOnly = trimmed.match(/^```(?:json|javascript|js|typescript|ts)?\\s*([\\s\\S]*?)\\s*```$/i);\n if (fencedOnly) {\n const parsed = tryParseJson((fencedOnly[1] ?? \"\").trim());\n return parsed.ok ? parsed.value : null;\n }\n\n const direct = tryParseJson(trimmed);\n return direct.ok ? direct.value : null;\n}\n\nfunction hasKeys(obj: unknown, keys: string[]): boolean {\n if (typeof obj !== \"object\" || obj === null) return false;\n const o = obj as Record<string, unknown>;\n return keys.every((k) => k in o);\n}\n\nfunction checkType(value: unknown, expectedType: string): boolean {\n if (expectedType === \"array\") return Array.isArray(value);\n if (expectedType === \"object\") return typeof value === \"object\" && value !== null && !Array.isArray(value);\n return typeof value === expectedType;\n}\n\nfunction getNestedValue(obj: unknown, path: string[]): unknown {\n let current = obj;\n for (const key of path) {\n if (typeof current !== \"object\" || current === null) return undefined;\n current = (current as Record<string, unknown>)[key];\n }\n return current;\n}\n\nfunction parseCsvLine(line: string): string[] | null {\n const cells: string[] = [];\n let current = \"\";\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const next = i + 1 < line.length ? line[i + 1] : \"\";\n\n if (ch === \"\\\"\") {\n if (inQuotes && next === \"\\\"\") {\n current += \"\\\"\";\n i++;\n continue;\n }\n inQuotes = !inQuotes;\n continue;\n }\n\n if (ch === \",\" && !inQuotes) {\n cells.push(current.trim());\n current = \"\";\n continue;\n }\n\n current += ch;\n }\n\n if (inQuotes) return null;\n cells.push(current.trim());\n return cells;\n}\n\nfunction parseMarkdownRow(line: string): string[] {\n const trimmed = line.trim();\n if (!trimmed.includes(\"|\")) return [];\n const normalized = `${trimmed.startsWith(\"|\") ? \"\" : \"|\"}${trimmed}${trimmed.endsWith(\"|\") ? \"\" : \"|\"}`;\n return normalized\n .split(\"|\")\n .slice(1, -1)\n .map((cell) => cell.trim());\n}\n\nfunction isMarkdownSeparatorCell(cell: string): boolean {\n const compact = cell.replace(/\\s+/g, \"\");\n return /^:?-{3,}:?$/.test(compact);\n}\n\nexport function validateStructuredOutputResponse(response: string, q: SOQuestion): boolean {\n const p = q.params;\n\n switch (q.validation) {\n case \"jsonKeys\": {\n const parsed = safeParse(response);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return false;\n const keys = p.keys as string[];\n if (!hasKeys(parsed, keys)) return false;\n const types = p.types as Record<string, string> | undefined;\n if (types) {\n const obj = parsed as Record<string, unknown>;\n return keys.every((k) => checkType(obj[k], types[k]));\n }\n return true;\n }\n\n case \"jsonArray\": {\n const parsed = safeParse(response);\n if (!Array.isArray(parsed)) return false;\n const length = p.length as number;\n if (parsed.length !== length) return false;\n const keys = p.keys as string[];\n const types = p.types as Record<string, string> | undefined;\n return parsed.every((item) => {\n if (!hasKeys(item, keys)) return false;\n if (!types) return true;\n const obj = item as Record<string, unknown>;\n return keys.every((k) => !types[k] || checkType(obj[k], types[k]));\n });\n }\n\n case \"jsonNested\": {\n const parsed = safeParse(response);\n if (!parsed) return false;\n const paths = [\"path1\", \"path2\", \"path3\", \"path4\"]\n .filter((k) => k in p)\n .map((k) => p[k] as string[]);\n return paths.every((path) => {\n const val = getNestedValue(parsed, path);\n return val !== undefined && val !== null;\n });\n }\n\n case \"jsonNumberArray\": {\n const parsed = safeParse(response);\n if (!Array.isArray(parsed)) return false;\n const length = p.length as number;\n const min = p.min as number;\n const max = p.max as number;\n if (parsed.length !== length) return false;\n return parsed.every((v) => typeof v === \"number\" && v >= min && v <= max);\n }\n\n case \"jsonSchema\": {\n const parsed = safeParse(response);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return false;\n const schema = p.schema as Record<string, string>;\n const obj = parsed as Record<string, unknown>;\n for (const [key, type] of Object.entries(schema)) {\n if (!(key in obj) || !checkType(obj[key], type)) return false;\n }\n const nestedKey = p.nestedKey as string | undefined;\n if (nestedKey && p.nestedSchema) {\n const nested = obj[nestedKey] as Record<string, unknown>;\n if (!nested) return false;\n const nestedSchema = p.nestedSchema as Record<string, string>;\n for (const [key, type] of Object.entries(nestedSchema)) {\n if (!(key in nested) || !checkType(nested[key], type)) return false;\n }\n }\n return true;\n }\n\n case \"jsonToolCall\": {\n const parsed = safeParse(response);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return false;\n const obj = parsed as Record<string, unknown>;\n const fnName = p.functionName as string;\n const argKey = p.argKey as string;\n const argValue = p.argValue as string;\n if (obj.function !== fnName && obj.name !== fnName) return false;\n const args = (obj.arguments ?? obj.params ?? obj.parameters) as Record<string, unknown> | undefined;\n if (!args || typeof args !== \"object\") return false;\n return String(args[argKey]).toLowerCase() === argValue.toLowerCase();\n }\n\n case \"jsonApiResponse\": {\n const parsed = safeParse(response);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return false;\n const obj = parsed as Record<string, unknown>;\n const expectedStatus = p.status as number;\n return (\n obj.status === expectedStatus &&\n typeof obj.message === \"string\" &&\n obj.data === null\n );\n }\n\n case \"jsonEvent\": {\n const parsed = safeParse(response);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return false;\n const obj = parsed as Record<string, unknown>;\n if (obj.type !== \"event\") return false;\n if (typeof obj.name !== \"string\") return false;\n if (typeof obj.date !== \"string\" || !/^\\d{4}-\\d{2}-\\d{2}$/.test(obj.date as string)) return false;\n if (typeof obj.attendees !== \"number\") return false;\n return true;\n }\n\n case \"keyValueLines\": {\n const count = p.expectedCount as number;\n const lines = response\n .trim()\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n if (lines.length !== count) return false;\n\n const pairs = lines.map((line) => line.match(/^([A-Za-z][A-Za-z\\s_-]*):\\s*(.+)$/));\n if (pairs.some((pair) => pair === null)) return false;\n if (pairs.some((pair) => (pair?.[2] ?? \"\").trim().length === 0)) return false;\n\n const expectedKeys = (p.expectedKeys as string[] | undefined)?.map((k) => k.trim().toLowerCase());\n if (!expectedKeys || expectedKeys.length === 0) return true;\n if (expectedKeys.length !== lines.length) return false;\n\n const actualKeys = pairs\n .map((pair) => (pair?.[1] ?? \"\").trim().toLowerCase())\n .sort();\n const expectedSorted = [...expectedKeys].sort();\n return expectedSorted.every((key, index) => key === actualKeys[index]);\n }\n\n case \"csvFormat\": {\n const headerColumns = p.headerColumns as number;\n const dataRows = p.dataRows as number;\n const lines = response\n .trim()\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n if (lines.length !== 1 + dataRows) return false;\n\n const parsedRows = lines.map(parseCsvLine);\n if (parsedRows.some((row) => row === null || row.length !== headerColumns)) return false;\n if (parsedRows[0]?.some((cell) => cell.length === 0)) return false;\n return parsedRows\n .slice(1)\n .every((row) => row !== null && row.every((cell) => cell.length > 0));\n }\n\n case \"markdownTable\": {\n const columns = p.columns as number;\n const dataRows = p.dataRows as number;\n const lines = response\n .trim()\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n if (lines.length !== 2 + dataRows) return false;\n\n const header = parseMarkdownRow(lines[0]);\n if (header.length !== columns || header.some((cell) => cell.length === 0)) return false;\n\n const separator = parseMarkdownRow(lines[1]);\n if (separator.length !== columns || !separator.every(isMarkdownSeparatorCell)) return false;\n\n return lines\n .slice(2)\n .every((line) => {\n const row = parseMarkdownRow(line);\n return row.length === columns && row.every((cell) => cell.length > 0);\n });\n }\n\n case \"numberedDefinitions\": {\n const count = p.expectedCount as number;\n const matches = response.match(/^\\d+\\.\\s+.+\\s*[—–-]\\s*.+/gm);\n return matches !== null && matches.length === count;\n }\n\n case \"htmlList\": {\n const count = p.expectedCount as number;\n const hasUl = /<ul[\\s>]/i.test(response) && /<\\/ul>/i.test(response);\n const liCount = (response.match(/<li[\\s>]/gi) ?? []).length;\n return hasUl && liCount === count;\n }\n\n default:\n return false;\n }\n}\n\nexport async function runStructuredOutputBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running structured output benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let correct = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_STRUCTURED_OUTPUT_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < questions.length; i++) {\n const q = questions[i];\n spinner.text = `Structured Output ${i + 1}/${questions.length}: ${q.category}`;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, q.prompt, withBenchmarkProfile({ num_predict: 1024, think: opts?.think })),\n timeoutMs,\n \"Structured output task\",\n abortOngoingRequests\n );\n\n const answer = stripThinkTags(result.response);\n const isCorrect = validateStructuredOutputResponse(answer, q);\n if (isCorrect) correct++;\n\n details.push({\n id: q.id,\n question: q.prompt,\n expected: q.validation,\n actual: answer.slice(0, 200),\n correct: isCorrect,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n details.push({\n id: q.id,\n question: q.prompt,\n expected: q.validation,\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Structured Output: ${correct}/${questions.length} correct`);\n } catch (err) {\n spinner.fail(\"Structured output benchmark failed\");\n throw err;\n }\n\n return {\n score: questions.length > 0 ? (correct / questions.length) * 100 : 0,\n correct,\n total: questions.length,\n details,\n };\n}\n","[\n {\n \"id\": 1,\n \"language\": \"fr\",\n \"prompt\": \"Répondez uniquement par le nom de la ville : quelle est la capitale de l'Australie ?\",\n \"validation\": \"stringMatch\",\n \"acceptedAnswers\": [\"Canberra\"]\n },\n {\n \"id\": 2,\n \"language\": \"fr\",\n \"prompt\": \"Répondez uniquement par le nombre : combien de jours dans une année bissextile ?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 366\n },\n {\n \"id\": 3,\n \"language\": \"fr\",\n \"prompt\": \"Répondez en français en une phrase : quel est le plus grand océan du monde ?\",\n \"validation\": \"containsKeyword\",\n \"keywords\": [\"Pacifique\"]\n },\n {\n \"id\": 4,\n \"language\": \"fr\",\n \"prompt\": \"Répondez uniquement par le nombre : combien font 17 × 6 ?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 102\n },\n {\n \"id\": 5,\n \"language\": \"es\",\n \"prompt\": \"Responde solo con el nombre de la ciudad: ¿cuál es la capital de Japón?\",\n \"validation\": \"stringMatch\",\n \"acceptedAnswers\": [\"Tokio\", \"Tokyo\"]\n },\n {\n \"id\": 6,\n \"language\": \"es\",\n \"prompt\": \"Responde solo con el número: ¿cuántos continentes hay?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 7\n },\n {\n \"id\": 7,\n \"language\": \"es\",\n \"prompt\": \"Responde en español en una frase: ¿cuál es el planeta más grande del sistema solar?\",\n \"validation\": \"containsKeyword\",\n \"keywords\": [\"Júpiter\", \"Jupiter\"]\n },\n {\n \"id\": 8,\n \"language\": \"es\",\n \"prompt\": \"Responde solo con el número: ¿cuánto es 25 + 37?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 62\n },\n {\n \"id\": 9,\n \"language\": \"de\",\n \"prompt\": \"Antworten Sie nur mit dem Stadtnamen: Was ist die Hauptstadt von Brasilien?\",\n \"validation\": \"stringMatch\",\n \"acceptedAnswers\": [\"Brasília\", \"Brasilia\"]\n },\n {\n \"id\": 10,\n \"language\": \"de\",\n \"prompt\": \"Antworten Sie nur mit der Zahl: Wie viele Seiten hat ein Würfel?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 6\n },\n {\n \"id\": 11,\n \"language\": \"de\",\n \"prompt\": \"Antworten Sie auf Deutsch in einem Satz: Welches ist das größte Säugetier?\",\n \"validation\": \"containsKeyword\",\n \"keywords\": [\"Blauwal\", \"Wal\"]\n },\n {\n \"id\": 12,\n \"language\": \"de\",\n \"prompt\": \"Antworten Sie nur mit der Zahl: Was ist 144 geteilt durch 12?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 12\n },\n {\n \"id\": 13,\n \"language\": \"zh\",\n \"prompt\": \"请只回答城市名:法国的首都是哪里?\",\n \"validation\": \"stringMatch\",\n \"acceptedAnswers\": [\"巴黎\", \"Paris\"]\n },\n {\n \"id\": 14,\n \"language\": \"zh\",\n \"prompt\": \"请只回答数字:一年有多少个月?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 12\n },\n {\n \"id\": 15,\n \"language\": \"zh\",\n \"prompt\": \"请用中文一句话回答:地球上最大的沙漠是什么?\",\n \"validation\": \"containsKeyword\",\n \"keywords\": [\"撒哈拉\"]\n },\n {\n \"id\": 16,\n \"language\": \"zh\",\n \"prompt\": \"请只回答数字:7乘以8等于多少?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 56\n },\n {\n \"id\": 17,\n \"language\": \"ja\",\n \"prompt\": \"都市名だけで答えてください:イタリアの首都はどこですか?\",\n \"validation\": \"stringMatch\",\n \"acceptedAnswers\": [\"ローマ\", \"Roma\", \"Rome\"]\n },\n {\n \"id\": 18,\n \"language\": \"ja\",\n \"prompt\": \"数字だけで答えてください:一週間は何日ですか?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 7\n },\n {\n \"id\": 19,\n \"language\": \"ja\",\n \"prompt\": \"日本語で一文で答えてください:世界で一番高い山は何ですか?\",\n \"validation\": \"containsKeyword\",\n \"keywords\": [\"エベレスト\", \"Everest\"]\n },\n {\n \"id\": 20,\n \"language\": \"ja\",\n \"prompt\": \"数字だけで答えてください:100から37を引くと?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 63\n }\n]\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, QuestionResult } from \"../types.js\";\nimport { extractNumber, stripThinkTags, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport mlData from \"../datasets/multilingual.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\ninterface MLQuestion {\n id: number;\n language: string;\n prompt: string;\n validation: string;\n acceptedAnswers?: string[];\n expectedNumber?: number;\n keywords?: string[];\n}\n\nconst questions = mlData as MLQuestion[];\nconst DEFAULT_MULTILINGUAL_TIMEOUT_MS = 120_000;\n\nconst NEGATION_PATTERNS: RegExp[] = [\n /\\b(?:not|never|no|non|pas|nicht|kein|keine|ningun|ninguna|nunca|jamas)\\b/u,\n /\\bn'?est\\s+pas\\b/u,\n /(?:不是|并非|沒有|没有)/u,\n /(?:ではない|じゃない|ではありません)/u,\n];\n\nfunction normalizeForCompare(value: string): string {\n return value\n .normalize(\"NFKD\")\n .replace(/\\p{M}/gu, \"\")\n .toLowerCase()\n .trim();\n}\n\nfunction canonicalizeResponse(value: string): string {\n const firstLine = value.trim().split(/\\r?\\n/)[0] ?? \"\";\n return firstLine\n .replace(/^(?:answer|réponse|respuesta|antwort|回答|答え)\\s*[::-]\\s*/i, \"\")\n .replace(/^[\\s\"'`“”‘’()[\\]{}]+|[\\s\"'`“”‘’()[\\]{}]+$/g, \"\")\n .replace(/[.,;:!?。!?、]+$/u, \"\")\n .trim();\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction containsStandaloneMatch(text: string, target: string): boolean {\n if (text === target) return true;\n if (!target) return false;\n // CJK answers often have no word boundaries; use direct containment there.\n if (/[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}]/u.test(target)) {\n return text.includes(target);\n }\n const re = new RegExp(\n `(?:^|[^\\\\p{L}\\\\p{N}])${escapeRegex(target)}(?:$|[^\\\\p{L}\\\\p{N}])`,\n \"u\"\n );\n return re.test(text);\n}\n\nfunction hasNegation(text: string): boolean {\n return NEGATION_PATTERNS.some((re) => re.test(text));\n}\n\nexport function validateMultilingualResponse(response: string, q: MLQuestion): boolean {\n const canonical = canonicalizeResponse(response);\n const normalized = normalizeForCompare(canonical);\n if (!normalized) return false;\n if (hasNegation(normalized)) return false;\n\n switch (q.validation) {\n case \"stringMatch\": {\n const answers = q.acceptedAnswers ?? [];\n return answers.some((a) =>\n containsStandaloneMatch(normalized, normalizeForCompare(a))\n );\n }\n\n case \"numberMatch\": {\n const expected = q.expectedNumber;\n if (expected === undefined) return false;\n const actual = extractNumber(canonical);\n return actual !== null && actual === expected;\n }\n\n case \"containsKeyword\": {\n const keywords = q.keywords ?? [];\n return keywords.some((k) =>\n containsStandaloneMatch(normalized, normalizeForCompare(k))\n );\n }\n\n default:\n return false;\n }\n}\n\nexport async function runMultilingualBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running multilingual benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let correct = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_MULTILINGUAL_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < questions.length; i++) {\n const q = questions[i];\n spinner.text = `Multilingual ${i + 1}/${questions.length}: ${q.language}`;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, q.prompt, withBenchmarkProfile({ num_predict: 1024, think: opts?.think })),\n timeoutMs,\n \"Multilingual task\",\n abortOngoingRequests\n );\n\n const answer = stripThinkTags(result.response);\n const isCorrect = validateMultilingualResponse(answer, q);\n if (isCorrect) correct++;\n\n const expectedStr = q.expectedNumber !== undefined\n ? String(q.expectedNumber)\n : (q.acceptedAnswers ?? q.keywords ?? []).join(\"|\");\n\n details.push({\n id: q.id,\n question: q.prompt,\n expected: expectedStr,\n actual: answer.slice(0, 200),\n correct: isCorrect,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n const expectedStr = q.expectedNumber !== undefined\n ? String(q.expectedNumber)\n : (q.acceptedAnswers ?? q.keywords ?? []).join(\"|\");\n\n details.push({\n id: q.id,\n question: q.prompt,\n expected: expectedStr,\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Multilingual: ${correct}/${questions.length} correct`);\n } catch (err) {\n spinner.fail(\"Multilingual benchmark failed\");\n throw err;\n }\n\n return {\n score: questions.length > 0 ? (correct / questions.length) * 100 : 0,\n correct,\n total: questions.length,\n details,\n };\n}\n","import type {\n HardwareFitTuning,\n HardwareInfo,\n PerformanceMetrics,\n PerformanceScore,\n} from \"../types.js\";\nimport { clamp, lerp, sanitizeNonNegative } from \"../utils.js\";\n\n// Anchor points for continuous interpolation.\n// Low end: ~4 cores, ~8 GB. High end: ~24+ cores, ~96+ GB.\nconst TUNING_LOW = {\n speed: { excellent: 15, good: 8, marginal: 3, hardMin: 2 },\n ttft: { excellentMs: 2000, goodMs: 4000, marginalMs: 8000, hardMaxMs: 25000 },\n loadTimeHardMaxMs: 300000,\n};\n\nconst TUNING_HIGH = {\n speed: { excellent: 55, good: 30, marginal: 14, hardMin: 8 },\n ttft: { excellentMs: 500, goodMs: 1200, marginalMs: 2800, hardMaxMs: 10000 },\n loadTimeHardMaxMs: 90000,\n};\n\nfunction lerpNum(t: number, low: number, high: number): number {\n return low + t * (high - low);\n}\n\nfunction computeHardwareCapacity(hardware: HardwareInfo): number {\n // Core score: 4 cores = 0, 24+ cores = 1\n const coreScore = clamp((hardware.cpuCores - 4) / (24 - 4), 0, 1);\n // RAM score: 8 GB = 0, 96+ GB = 1\n const ramScore = clamp((hardware.totalMemoryGB - 8) / (96 - 8), 0, 1);\n // Weighted average — cores and RAM contribute equally\n return (coreScore + ramScore) / 2;\n}\n\nfunction deriveProfile(capacity: number): \"ENTRY\" | \"BALANCED\" | \"HIGH-END\" {\n if (capacity >= 0.55) return \"HIGH-END\";\n if (capacity >= 0.25) return \"BALANCED\";\n return \"ENTRY\";\n}\n\nexport function deriveHardwareFitTuning(hardware?: HardwareInfo): HardwareFitTuning {\n if (!hardware) {\n // Default to mid-range when hardware is unknown\n const t = 0.35;\n return {\n profile: \"BALANCED\",\n speed: {\n excellent: Math.round(lerpNum(t, TUNING_LOW.speed.excellent, TUNING_HIGH.speed.excellent)),\n good: Math.round(lerpNum(t, TUNING_LOW.speed.good, TUNING_HIGH.speed.good)),\n marginal: Math.round(lerpNum(t, TUNING_LOW.speed.marginal, TUNING_HIGH.speed.marginal)),\n hardMin: Math.round(lerpNum(t, TUNING_LOW.speed.hardMin, TUNING_HIGH.speed.hardMin)),\n },\n ttft: {\n excellentMs: Math.round(lerpNum(t, TUNING_LOW.ttft.excellentMs, TUNING_HIGH.ttft.excellentMs)),\n goodMs: Math.round(lerpNum(t, TUNING_LOW.ttft.goodMs, TUNING_HIGH.ttft.goodMs)),\n marginalMs: Math.round(lerpNum(t, TUNING_LOW.ttft.marginalMs, TUNING_HIGH.ttft.marginalMs)),\n hardMaxMs: Math.round(lerpNum(t, TUNING_LOW.ttft.hardMaxMs, TUNING_HIGH.ttft.hardMaxMs)),\n },\n loadTimeHardMaxMs: Math.round(lerpNum(t, TUNING_LOW.loadTimeHardMaxMs, TUNING_HIGH.loadTimeHardMaxMs)),\n };\n }\n\n const t = computeHardwareCapacity(hardware);\n const profile = deriveProfile(t);\n\n return {\n profile,\n speed: {\n excellent: Math.round(lerpNum(t, TUNING_LOW.speed.excellent, TUNING_HIGH.speed.excellent)),\n good: Math.round(lerpNum(t, TUNING_LOW.speed.good, TUNING_HIGH.speed.good)),\n marginal: Math.round(lerpNum(t, TUNING_LOW.speed.marginal, TUNING_HIGH.speed.marginal)),\n hardMin: Math.round(lerpNum(t, TUNING_LOW.speed.hardMin, TUNING_HIGH.speed.hardMin)),\n },\n ttft: {\n excellentMs: Math.round(lerpNum(t, TUNING_LOW.ttft.excellentMs, TUNING_HIGH.ttft.excellentMs)),\n goodMs: Math.round(lerpNum(t, TUNING_LOW.ttft.goodMs, TUNING_HIGH.ttft.goodMs)),\n marginalMs: Math.round(lerpNum(t, TUNING_LOW.ttft.marginalMs, TUNING_HIGH.ttft.marginalMs)),\n hardMaxMs: Math.round(lerpNum(t, TUNING_LOW.ttft.hardMaxMs, TUNING_HIGH.ttft.hardMaxMs)),\n },\n loadTimeHardMaxMs: Math.round(lerpNum(t, TUNING_LOW.loadTimeHardMaxMs, TUNING_HIGH.loadTimeHardMaxMs)),\n };\n}\n\nfunction scoreSpeed(tps: number, tuning: HardwareFitTuning): number {\n if (tps >= tuning.speed.excellent) return 50;\n if (tps >= tuning.speed.good) {\n return lerp(tps, tuning.speed.good, tuning.speed.excellent, 30, 50);\n }\n if (tps >= tuning.speed.marginal) {\n return lerp(tps, tuning.speed.marginal, tuning.speed.good, 12, 30);\n }\n return lerp(tps, 0, tuning.speed.marginal, 0, 12);\n}\n\n// For TTFT: lower is better, so score decreases as TTFT increases\nfunction scoreTTFT(ttft: number, tuning: HardwareFitTuning): number {\n if (ttft <= tuning.ttft.excellentMs) return 20;\n if (ttft <= tuning.ttft.goodMs) {\n return lerp(ttft, tuning.ttft.excellentMs, tuning.ttft.goodMs, 20, 13);\n }\n if (ttft <= tuning.ttft.marginalMs) {\n return lerp(ttft, tuning.ttft.goodMs, tuning.ttft.marginalMs, 13, 6);\n }\n return lerp(ttft, tuning.ttft.marginalMs, tuning.ttft.hardMaxMs, 6, 0);\n}\n\n// For memory: lower usage is better, so score decreases as usage increases\nfunction scoreMemory(memPercent: number): number {\n if (memPercent <= 30) return 30;\n if (memPercent <= 50) return lerp(memPercent, 30, 50, 30, 25);\n if (memPercent <= 70) return lerp(memPercent, 50, 70, 25, 15);\n if (memPercent <= 90) return lerp(memPercent, 70, 90, 15, 5);\n return lerp(memPercent, 90, 100, 5, 0);\n}\n\nexport function computePerformanceScore(\n perf: PerformanceMetrics,\n hardware?: HardwareInfo\n): PerformanceScore {\n const tuning = deriveHardwareFitTuning(hardware);\n const safeTokensPerSecond = sanitizeNonNegative(perf.tokensPerSecond, 0);\n const safeTtft = sanitizeNonNegative(perf.ttft, tuning.ttft.hardMaxMs * 2);\n const speed = Math.round(scoreSpeed(safeTokensPerSecond, tuning));\n const ttft = Math.round(scoreTTFT(safeTtft, tuning));\n const memory = perf.memoryFootprintAvailable === false\n ? Math.round(((speed + ttft) / (50 + 20)) * 30)\n : Math.round(\n scoreMemory(\n // Score memory from the model's measured footprint/delta rather than\n // unrelated host RAM usage from other running workloads.\n sanitizeNonNegative(perf.memoryPercent, 100)\n )\n );\n\n return {\n total: clamp(speed + ttft + memory, 0, 100),\n speed,\n ttft,\n memory,\n };\n}\n","import type { CategoryResult, QualityMetrics, QualityScore } from \"../types.js\";\nimport { clamp } from \"../utils.js\";\n\nexport const RESPONSE_TIME_LIMITS_MS: Record<string, number> = {\n reasoning: 30_000,\n math: 30_000,\n coding: 90_000,\n instructionFollowing: 30_000,\n structuredOutput: 30_000,\n multilingual: 30_000,\n};\n\nfunction safePercent(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return clamp(value, 0, 100);\n}\n\nfunction weightedScore(raw: number, max: number): number {\n return clamp(Math.round((safePercent(raw) / 100) * max), 0, max);\n}\n\nexport function effectiveScore(result: CategoryResult, limitMs: number): number {\n if (result.total === 0) return 0;\n // When details are unavailable (legacy data/tests), derive from correct/total.\n if (result.details.length === 0) {\n const boundedCorrect = clamp(result.correct, 0, result.total);\n return (boundedCorrect / result.total) * 100;\n }\n const effectiveCorrect = result.details.filter(\n (d) => d.correct && d.timeMs <= limitMs\n ).length;\n return (effectiveCorrect / result.total) * 100;\n}\n\nfunction countPenalties(result: CategoryResult, limitMs: number): number {\n return result.details.filter((d) => d.correct && d.timeMs > limitMs).length;\n}\n\nexport function computeQualityScore(quality: QualityMetrics): QualityScore {\n const categories = [\n { key: \"reasoning\", result: quality.reasoning, weight: 20 },\n { key: \"coding\", result: quality.coding, weight: 20 },\n { key: \"instructionFollowing\", result: quality.instructionFollowing, weight: 20 },\n { key: \"structuredOutput\", result: quality.structuredOutput, weight: 15 },\n { key: \"math\", result: quality.math, weight: 15 },\n { key: \"multilingual\", result: quality.multilingual, weight: 10 },\n ] as const;\n\n const scores: Record<string, number> = {};\n const timePenalties: Record<string, number> = {};\n let hasPenalties = false;\n\n for (const cat of categories) {\n const limitMs = RESPONSE_TIME_LIMITS_MS[cat.key];\n const raw = effectiveScore(cat.result, limitMs);\n scores[cat.key] = weightedScore(raw, cat.weight);\n\n const penalties = countPenalties(cat.result, limitMs);\n if (penalties > 0) {\n timePenalties[cat.key] = penalties;\n hasPenalties = true;\n }\n }\n\n const total = clamp(\n scores.reasoning + scores.coding + scores.instructionFollowing +\n scores.structuredOutput + scores.math + scores.multilingual,\n 0,\n 100\n );\n\n return {\n total,\n reasoning: scores.reasoning,\n coding: scores.coding,\n instructionFollowing: scores.instructionFollowing,\n structuredOutput: scores.structuredOutput,\n math: scores.math,\n multilingual: scores.multilingual,\n ...(hasPenalties ? { timePenalties } : {}),\n };\n}\n","import type {\n HardwareInfo,\n PerformanceMetrics,\n QualityMetrics,\n BenchEnvironment,\n FitnessResult,\n FitnessVerdict,\n CategoryLabel,\n CategoryLevel,\n} from \"../types.js\";\nimport {\n computePerformanceScore,\n deriveHardwareFitTuning,\n} from \"./performance-scorer.js\";\nimport { computeQualityScore, effectiveScore, RESPONSE_TIME_LIMITS_MS } from \"./quality-scorer.js\";\nimport { clamp, sanitizeNonNegative } from \"../utils.js\";\n\nfunction getCategoryLevel(rawScore: number): CategoryLevel {\n if (rawScore >= 75) return \"Strong\";\n if (rawScore >= 50) return \"Adequate\";\n if (rawScore >= 25) return \"Weak\";\n return \"Poor\";\n}\n\nfunction normalizeRawScore(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return clamp(value, 0, 100);\n}\n\nexport function computeFitness(\n perf: PerformanceMetrics,\n quality: QualityMetrics | null,\n hardware?: HardwareInfo,\n benchEnv?: BenchEnvironment\n): FitnessResult {\n const tuning = deriveHardwareFitTuning(hardware);\n const performanceScore = computePerformanceScore(perf, hardware);\n const qualityScore = quality ? computeQualityScore(quality) : null;\n\n const hardwareFitScore = Math.round(performanceScore.total);\n\n // Global score: 30% HW + 70% Quality (null if quality absent)\n const globalScore = qualityScore\n ? clamp(Math.round(0.3 * hardwareFitScore + 0.7 * qualityScore.total), 0, 100)\n : null;\n\n // Category labels from effective scores (with time penalties applied)\n const categoryLabels: CategoryLabel[] | null = quality\n ? ([\n { category: \"Reasoning\", key: \"reasoning\", result: quality.reasoning },\n { category: \"Coding\", key: \"coding\", result: quality.coding },\n { category: \"Instruction Following\", key: \"instructionFollowing\", result: quality.instructionFollowing },\n { category: \"Structured Output\", key: \"structuredOutput\", result: quality.structuredOutput },\n { category: \"Math\", key: \"math\", result: quality.math },\n { category: \"Multilingual\", key: \"multilingual\", result: quality.multilingual },\n ] as const).map(({ category, key, result }) => {\n const score = normalizeRawScore(effectiveScore(result, RESPONSE_TIME_LIMITS_MS[key]));\n return { category, rawScore: score, level: getCategoryLevel(score) };\n })\n : null;\n\n const safeTokensPerSecond = sanitizeNonNegative(perf.tokensPerSecond, 0);\n const safeTtft = sanitizeNonNegative(perf.ttft, tuning.ttft.hardMaxMs * 10);\n const safeLoadTime = sanitizeNonNegative(perf.loadTime, tuning.loadTimeHardMaxMs * 10);\n const modelMemoryFootprintAvailable = perf.memoryFootprintAvailable !== false;\n const modelMemoryDeltaPercent = modelMemoryFootprintAvailable\n ? sanitizeNonNegative(perf.memoryPercent, 100)\n : undefined;\n const hostMemoryPercent =\n perf.memoryHostPercent !== undefined\n && Number.isFinite(perf.memoryHostPercent)\n && perf.memoryHostPercent >= 0\n ? perf.memoryHostPercent\n : undefined;\n\n // Disqualifiers\n const disqualifiers: string[] = [];\n if (safeTokensPerSecond < tuning.speed.hardMin) {\n disqualifiers.push(\n `Token speed too low: ${safeTokensPerSecond.toFixed(1)} tok/s (minimum: ${tuning.speed.hardMin} tok/s for ${tuning.profile} profile)`\n );\n }\n if (safeTtft > tuning.ttft.hardMaxMs) {\n disqualifiers.push(\n `Time to first token too high: ${Math.round(safeTtft)}ms (maximum: ${tuning.ttft.hardMaxMs}ms for ${tuning.profile} profile)`\n );\n }\n if (safeLoadTime > tuning.loadTimeHardMaxMs) {\n disqualifiers.push(\n `Model load time too high: ${Math.round(safeLoadTime)}ms (maximum: ${tuning.loadTimeHardMaxMs}ms for ${tuning.profile} profile)`\n );\n }\n const hostCritical = hostMemoryPercent !== undefined && hostMemoryPercent > 95;\n const modelDeltaCritical = modelMemoryDeltaPercent !== undefined && modelMemoryDeltaPercent > 90;\n const modelDeltaSignificant = modelMemoryDeltaPercent !== undefined && modelMemoryDeltaPercent >= 10;\n if (modelDeltaCritical) {\n disqualifiers.push(\n `Memory usage critical: model delta +${modelMemoryDeltaPercent.toFixed(0)}%`\n );\n }\n\n // Determine verdict based on globalScore (or hardwareFitScore if null)\n const verdictScore = globalScore ?? hardwareFitScore;\n let verdict: FitnessVerdict;\n if (disqualifiers.length > 0) {\n verdict = \"NOT RECOMMENDED\";\n } else if (verdictScore >= 80) {\n verdict = \"EXCELLENT\";\n } else if (verdictScore >= 60) {\n verdict = \"GOOD\";\n } else if (verdictScore >= 40) {\n verdict = \"MARGINAL\";\n } else {\n verdict = \"NOT RECOMMENDED\";\n }\n\n // Interpretation\n let interpretation: string;\n if (categoryLabels) {\n const labelParts = categoryLabels.map((l) => `${l.category}: ${l.level}`).join(\", \");\n interpretation = `Hardware fit: ${hardwareFitScore}/100. Overall suitability: ${verdict}${globalScore !== null ? ` (Global ${globalScore}/100)` : \"\"}. Category profile: ${labelParts}.`;\n } else {\n interpretation = `Hardware fit: ${hardwareFitScore}/100. Overall suitability: ${verdict}. Run full benchmarks for quality assessment.`;\n }\n\n // Warnings\n const warnings: string[] = [];\n\n if (qualityScore !== null && qualityScore.total < 15) {\n interpretation +=\n \" Warning: model produced very low accuracy on quality tasks — results may be unusable despite good hardware performance.\";\n warnings.push(\n \"Model produced very low accuracy on quality tasks — results may be unusable despite good hardware performance.\"\n );\n }\n\n if (\n perf.tpsStdDev !== undefined &&\n Number.isFinite(perf.tpsStdDev) &&\n safeTokensPerSecond > 0 &&\n perf.tpsStdDev / safeTokensPerSecond > 0.3\n ) {\n warnings.push(\n `Token speed is unstable (stddev ${perf.tpsStdDev.toFixed(1)} tok/s, mean ${safeTokensPerSecond.toFixed(1)} tok/s) — may indicate thermal throttling or memory pressure.`\n );\n }\n\n if (perf.tokensPerSecondEstimated) {\n warnings.push(\n \"Token throughput is estimated from LM Studio output because native token stats were unavailable. Compare tok/s across backends cautiously.\"\n );\n }\n\n if (perf.memoryFootprintEstimated) {\n warnings.push(\n \"Model memory footprint is estimated via LM Studio CLI rather than measured from a fresh load.\"\n );\n }\n\n if (!modelMemoryFootprintAvailable) {\n warnings.push(\n \"Model memory footprint was unavailable for this run, so RAM fit scoring was normalized from speed and TTFT only.\"\n );\n }\n\n if (hostCritical && !modelMemoryFootprintAvailable) {\n warnings.push(\n `Host memory is already high (${hostMemoryPercent.toFixed(0)}%) and model footprint was unavailable. Results may be influenced by other running workloads.`\n );\n } else if (hostCritical && modelMemoryDeltaPercent !== undefined && !modelDeltaSignificant) {\n warnings.push(\n `Host memory is already high (${hostMemoryPercent.toFixed(0)}%) but model delta is limited (+${modelMemoryDeltaPercent.toFixed(0)}%). Results may be influenced by other running workloads.`\n );\n }\n\n if (hardware?.powerMode === \"low-power\") {\n warnings.push(\n \"System was in low-power mode during this benchmark.\"\n );\n }\n\n if (\n hardware?.cpuCurrentSpeedGHz != null &&\n hardware?.cpuFreqGHz != null &&\n hardware.cpuFreqGHz > 0 &&\n hardware.cpuCurrentSpeedGHz / hardware.cpuFreqGHz < 0.8\n ) {\n const ratio = ((hardware.cpuCurrentSpeedGHz / hardware.cpuFreqGHz) * 100).toFixed(0);\n warnings.push(\n `CPU appears throttled (${hardware.cpuCurrentSpeedGHz.toFixed(1)} GHz current vs ${hardware.cpuFreqGHz.toFixed(1)} GHz nominal, ${ratio}%).`\n );\n }\n\n // Bench environment warnings\n if (benchEnv?.thermalPressureAfter === \"heavy\" || benchEnv?.thermalPressureAfter === \"critical\") {\n warnings.push(\n `Thermal throttling detected after benchmark (${benchEnv.thermalPressureAfter}). Results may be degraded — consider cooling or shorter runs.`\n );\n }\n\n if (benchEnv?.swapDeltaGB != null && benchEnv.swapDeltaGB > 0.5) {\n warnings.push(\n `Significant swap activity during benchmark (+${benchEnv.swapDeltaGB.toFixed(1)} GB). Model may exceed available RAM — results are severely degraded.`\n );\n }\n\n if (benchEnv?.batteryPowered) {\n warnings.push(\n `Running on battery power — performance may be reduced.`\n );\n }\n\n if (benchEnv?.cpuAvgLoad != null && benchEnv.cpuAvgLoad > 90) {\n warnings.push(\n `High CPU load during inference (avg ${benchEnv.cpuAvgLoad.toFixed(0)}%). System may feel unresponsive — GPU-accelerated runtimes (MLX) can reduce CPU pressure.`\n );\n }\n\n return {\n verdict,\n globalScore,\n hardwareFitScore,\n performanceScore,\n qualityScore,\n categoryLabels,\n disqualifiers,\n warnings,\n interpretation,\n tuning,\n };\n}\n","import Table from \"cli-table3\";\nimport chalk from \"chalk\";\nimport type {\n BenchEnvironment,\n BenchResult,\n HardwareInfo,\n PerformanceMetrics,\n QualityMetrics,\n CategoryLevel,\n} from \"../types.js\";\nimport { formatDuration } from \"../utils.js\";\nimport { scoreColor } from \"./score-color.js\";\nimport { effectiveScore, RESPONSE_TIME_LIMITS_MS } from \"../scoring/quality-scorer.js\";\nimport { supportsUnicode } from \"./terminal.js\";\n\nconst BAR_FILLED = supportsUnicode ? \"\\u2588\" : \"#\";\nconst BAR_EMPTY = supportsUnicode ? \"\\u2591\" : \"-\";\n\nfunction compactBar(value: number, max = 100, width = 10): string {\n if (max <= 0) return BAR_EMPTY.repeat(width);\n const ratio = Math.max(0, Math.min(1, value / max));\n const filled = Math.round(ratio * width);\n return BAR_FILLED.repeat(filled) + BAR_EMPTY.repeat(width - filled);\n}\n\nfunction levelColor(level: CategoryLevel) {\n switch (level) {\n case \"Strong\": return chalk.green;\n case \"Adequate\": return chalk.yellow;\n case \"Weak\": return chalk.hex(\"#FF8C00\");\n case \"Poor\": return chalk.red;\n }\n}\n\nfunction getLevel(score: number): CategoryLevel {\n if (score >= 75) return \"Strong\";\n if (score >= 50) return \"Adequate\";\n if (score >= 25) return \"Weak\";\n return \"Poor\";\n}\n\nfunction formatCpuCoresLabel(hw: HardwareInfo): string {\n if (hw.cpuPCores !== null && hw.cpuECores !== null) {\n return `${hw.cpuCores} total (${hw.cpuPCores} performance + ${hw.cpuECores} efficiency)`;\n }\n if (hw.cpuPCores !== null && hw.cpuCores > hw.cpuPCores) {\n return `${hw.cpuCores} threads (${hw.cpuPCores} cores)`;\n }\n if (hw.cpuPCores !== null) {\n return `${hw.cpuCores} total (${hw.cpuPCores} performance)`;\n }\n if (hw.cpuECores !== null) {\n return `${hw.cpuCores} total (${hw.cpuECores} efficiency)`;\n }\n return String(hw.cpuCores);\n}\n\ninterface CategoryIssueSummary {\n name: string;\n crashes: number;\n timeouts: number;\n errors: number;\n}\n\nfunction summarizeCategoryIssues(name: string, details: QualityMetrics[\"reasoning\"][\"details\"]): CategoryIssueSummary {\n let crashes = 0;\n let timeouts = 0;\n let errors = 0;\n\n for (const detail of details) {\n const actual = detail.actual ?? \"\";\n if (/^TIMEOUT\\b/i.test(actual)) {\n timeouts++;\n continue;\n }\n if (/^ERROR:/i.test(actual)) {\n errors++;\n if (/model has crashed|has crashed without additional information|model crashed/i.test(actual)) {\n crashes++;\n }\n }\n }\n\n return { name, crashes, timeouts, errors };\n}\n\nexport function printHardwareTable(hw: HardwareInfo): void {\n const table = new Table({\n head: [chalk.bold(\"Hardware\"), chalk.bold(\"Value\")],\n style: { head: [], border: [] },\n });\n\n const coresDetail = formatCpuCoresLabel(hw);\n\n const cpuLine = hw.cpuFreqGHz\n ? `${hw.cpu} @ ${hw.cpuFreqGHz} GHz`\n : hw.cpu;\n\n const ramLine = hw.memoryType\n ? `${hw.totalMemoryGB} GB ${hw.memoryType} (${hw.freeMemoryGB} GB free)`\n : `${hw.totalMemoryGB} GB (${hw.freeMemoryGB} GB free)`;\n\n const swapColor = hw.swapUsedGB > hw.swapTotalGB * 0.5\n ? chalk.yellow\n : chalk.green;\n const swapLine = hw.swapTotalGB > 0\n ? swapColor(`${hw.swapUsedGB} GB / ${hw.swapTotalGB} GB`)\n : \"None\";\n\n const gpuLine = hw.gpuCores\n ? `${hw.gpu} (${hw.gpuCores} cores)`\n : hw.gpu;\n\n const powerModeColor =\n hw.powerMode === \"low-power\"\n ? chalk.red\n : hw.powerMode === \"performance\"\n ? chalk.green\n : hw.powerMode === \"balanced\"\n ? chalk.yellow\n : chalk.dim;\n const powerModeLabel = hw.powerMode ?? \"unknown\";\n\n if (hw.machineModel) {\n table.push([\"Machine\", chalk.bold(hw.machineModel)]);\n }\n table.push(\n [\"CPU\", cpuLine],\n [\"Cores\", coresDetail],\n [\"RAM\", ramLine],\n [\"Swap\", swapLine],\n [\"GPU\", gpuLine],\n [\"OS\", hw.os],\n [\"Arch\", hw.arch],\n [\"Power Mode\", powerModeColor(powerModeLabel)]\n );\n\n if (hw.cpuCurrentSpeedGHz != null) {\n const freqRatio =\n hw.cpuFreqGHz && hw.cpuFreqGHz > 0\n ? ` (${((hw.cpuCurrentSpeedGHz / hw.cpuFreqGHz) * 100).toFixed(0)}% of nominal)`\n : \"\";\n table.push([\"CPU Current Freq\", `${hw.cpuCurrentSpeedGHz.toFixed(1)} GHz${freqRatio}`]);\n }\n\n console.log(table.toString());\n}\n\nexport function printPerformanceTable(perf: PerformanceMetrics, benchEnvironment?: BenchEnvironment): void {\n const table = new Table({\n head: [chalk.bold(\"Metric\"), chalk.bold(\"Value\")],\n style: { head: [], border: [] },\n });\n\n const tpsColor =\n perf.tokensPerSecond >= 30\n ? chalk.green\n : perf.tokensPerSecond >= 15\n ? chalk.yellow\n : chalk.red;\n\n const ttftColor =\n perf.ttft < 1000\n ? chalk.green\n : perf.ttft < 3000\n ? chalk.yellow\n : chalk.red;\n\n const memColor =\n perf.memoryPercent < 50\n ? chalk.green\n : perf.memoryPercent < 80\n ? chalk.yellow\n : chalk.red;\n\n table.push(\n [\n \"Tokens/sec\",\n perf.tokensPerSecondEstimated\n ? chalk.yellow(`${perf.tokensPerSecond.toFixed(1)} tok/s (estimated)`)\n : tpsColor(`${perf.tokensPerSecond.toFixed(1)} tok/s`),\n ],\n [\n \"First Chunk Latency\",\n perf.firstChunkMs !== undefined\n ? formatDuration(perf.firstChunkMs)\n : chalk.dim(\"N/A (stream metric unavailable)\"),\n ],\n [\"Time to First Token\", ttftColor(formatDuration(perf.ttft))],\n [\n \"Model Load Time\",\n perf.loadTimeAvailable === false\n ? chalk.dim(\"N/A (runtime metric unavailable)\")\n : formatDuration(perf.loadTime),\n ],\n [\"Total Tokens\", String(perf.totalTokens)],\n [\"Prompt Tokens\", String(perf.promptTokens)],\n [\"Completion Tokens\", String(perf.completionTokens)],\n [\n \"Model Memory Footprint\",\n perf.memoryFootprintAvailable === false\n ? chalk.dim(\"N/A (model already loaded; runtime metric unavailable)\")\n : memColor(\n `${perf.memoryUsedGB.toFixed(1)} GB (+${perf.memoryPercent.toFixed(0)}%)${perf.memoryFootprintEstimated ? \" (estimated)\" : \"\"}`\n ),\n ],\n [\n \"Host RAM Pressure\",\n perf.memoryHostPercent !== undefined && perf.memoryHostUsedGB !== undefined\n ? `${perf.memoryHostUsedGB.toFixed(1)} GB (${perf.memoryHostPercent.toFixed(0)}%)`\n : chalk.dim(\"N/A (host metric unavailable)\"),\n ],\n );\n\n if (perf.thinkingTokensEstimate && perf.thinkingTokensEstimate > 0) {\n table.push([\n chalk.magenta(\"Thinking Tokens (est.)\"),\n chalk.magenta(`~${perf.thinkingTokensEstimate} tokens`),\n ]);\n }\n\n if (benchEnvironment?.cpuAvgLoad != null && benchEnvironment.cpuAvgLoad >= 0) {\n const cpuColor = benchEnvironment.cpuAvgLoad < 50 ? chalk.green\n : benchEnvironment.cpuAvgLoad < 80 ? chalk.yellow\n : chalk.red;\n table.push([\n \"CPU Load During Bench\",\n cpuColor(`avg ${benchEnvironment.cpuAvgLoad.toFixed(0)}%` +\n (benchEnvironment.cpuPeakLoad != null ? ` (peak ${benchEnvironment.cpuPeakLoad.toFixed(0)}%)` : \"\")),\n ]);\n }\n\n console.log(table.toString());\n}\n\nexport function printQualityTable(quality: QualityMetrics, timePenalties?: Record<string, number>): void {\n console.log(\n chalk.dim(\n \"Quality scores are based on an internal mixed-difficulty dataset; interpret as directional, not absolute.\"\n )\n );\n\n const table = new Table({\n head: [\n chalk.bold(\"Category\"),\n chalk.bold(\"Score\"),\n chalk.bold(\"Accuracy\"),\n chalk.bold(\"Level\"),\n ],\n style: { head: [], border: [] },\n });\n\n const categories: { name: string; key: string; result: typeof quality.reasoning; label: string }[] = [\n { name: \"Reasoning\", key: \"reasoning\", result: quality.reasoning, label: \"questions\" },\n { name: \"Coding\", key: \"coding\", result: quality.coding, label: \"tasks\" },\n { name: \"Instruction Following\", key: \"instructionFollowing\", result: quality.instructionFollowing, label: \"tasks\" },\n { name: \"Structured Output\", key: \"structuredOutput\", result: quality.structuredOutput, label: \"tasks\" },\n { name: \"Math\", key: \"math\", result: quality.math, label: \"problems\" },\n { name: \"Multilingual\", key: \"multilingual\", result: quality.multilingual, label: \"questions\" },\n ];\n\n for (const cat of categories) {\n const effective = effectiveScore(cat.result, RESPONSE_TIME_LIMITS_MS[cat.key]);\n const raw = cat.result.score;\n const level = getLevel(effective);\n const penaltyCount = timePenalties?.[cat.key] ?? 0;\n const accuracyText = penaltyCount > 0\n ? `${cat.result.correct}/${cat.result.total} ${cat.label} ${chalk.yellow(`(${penaltyCount} slow)`)}`\n : `${cat.result.correct}/${cat.result.total} ${cat.label}`;\n const scoreText = Math.round(effective) !== Math.round(raw)\n ? `${effective.toFixed(0)}% ${chalk.dim(`(raw ${raw.toFixed(0)}%)`)}`\n : `${effective.toFixed(0)}%`;\n table.push([\n cat.name,\n scoreColor(effective)(scoreText),\n accuracyText,\n levelColor(level)(level),\n ]);\n }\n console.log(table.toString());\n\n const issueSummaries = categories\n .map((cat) => summarizeCategoryIssues(cat.name, cat.result.details))\n .filter((summary) => summary.errors > 0 || summary.timeouts > 0);\n\n if (issueSummaries.length > 0) {\n console.log(chalk.yellow(\"Execution issues detected during quality benchmark:\"));\n for (const summary of issueSummaries) {\n const parts: string[] = [];\n if (summary.crashes > 0) parts.push(`${summary.crashes} crash${summary.crashes > 1 ? \"es\" : \"\"}`);\n const nonCrashErrors = summary.errors - summary.crashes;\n if (nonCrashErrors > 0) parts.push(`${nonCrashErrors} error${nonCrashErrors > 1 ? \"s\" : \"\"}`);\n if (summary.timeouts > 0) parts.push(`${summary.timeouts} timeout${summary.timeouts > 1 ? \"s\" : \"\"}`);\n console.log(chalk.yellow(` • ${summary.name}: ${parts.join(\", \")} (scored as incorrect)`));\n }\n }\n}\n\nexport function printSummaryTable(results: BenchResult[]): void {\n const termWidth = process.stdout.columns || 80;\n const compact = termWidth < 100;\n\n console.log(\n chalk.dim(\n \"Global = 30% Hardware Fit + 70% Quality. Hardware Fit = host compatibility. Quality = model capability.\"\n )\n );\n\n const head = [\n chalk.bold(\"Model\"),\n chalk.bold(\"tok/s\"),\n chalk.bold(\"TTFT\"),\n chalk.bold(\"Model RAM%\"),\n chalk.bold(\"Profile\"),\n chalk.bold(\"HW Fit\"),\n chalk.bold(\"Quality\"),\n chalk.bold(\"Global\"),\n ...(compact ? [] : [chalk.bold(\"DQ\"), chalk.bold(\"Flags\")]),\n chalk.bold(\"Verdict\"),\n ];\n\n const table = new Table({\n head,\n style: { head: [], border: [] },\n wordWrap: true,\n });\n\n const formatSummaryModelMemory = (result: BenchResult): string => {\n if (result.performance.memoryFootprintAvailable === false) return \"N/A\";\n const value = `${result.performance.memoryPercent.toFixed(0)}%`;\n return result.performance.memoryFootprintEstimated ? `${value}~` : value;\n };\n\n for (const r of results) {\n const vColor =\n r.fitness.verdict === \"EXCELLENT\"\n ? chalk.green.bold\n : r.fitness.verdict === \"GOOD\"\n ? chalk.blue.bold\n : r.fitness.verdict === \"MARGINAL\"\n ? chalk.yellow.bold\n : chalk.red.bold;\n\n const flags: string[] = [];\n if (r.hardware.powerMode === \"low-power\") flags.push(chalk.red(\"ECO\"));\n if (r.modelInfo?.thinkingDetected) flags.push(chalk.magenta(\"THINK\"));\n\n const modelName = compact && r.model.length > 20\n ? r.model.slice(0, 18) + \"..\"\n : r.model;\n const throughputLabel = r.performance.tokensPerSecondEstimated\n ? `~${r.performance.tokensPerSecond.toFixed(1)}`\n : `${r.performance.tokensPerSecond.toFixed(1)}`;\n\n const row = [\n modelName,\n throughputLabel,\n formatDuration(r.performance.ttft),\n formatSummaryModelMemory(r),\n r.fitness.tuning.profile,\n scoreColor(r.fitness.hardwareFitScore)(\n `${compactBar(r.fitness.hardwareFitScore)} ${r.fitness.hardwareFitScore}%`\n ),\n r.fitness.qualityScore\n ? scoreColor(r.fitness.qualityScore.total)(\n `${compactBar(r.fitness.qualityScore.total)} ${r.fitness.qualityScore.total}%`\n )\n : \"\\u2014\",\n r.fitness.globalScore !== null\n ? scoreColor(r.fitness.globalScore)(\n `${compactBar(r.fitness.globalScore)} ${r.fitness.globalScore}%`\n )\n : \"\\u2014\",\n ...(compact\n ? []\n : [\n String(r.fitness.disqualifiers.length),\n flags.length > 0 ? flags.join(\" \") : \"\\u2014\",\n ]),\n vColor(r.fitness.verdict),\n ];\n\n table.push(row);\n }\n console.log(table.toString());\n}\n","import chalk from \"chalk\";\n\nexport type ColorFn = (text: string) => string;\n\nexport function scoreColor(score: number): ColorFn {\n if (score >= 80) return chalk.green;\n if (score >= 60) return chalk.blue;\n if (score >= 40) return chalk.yellow;\n return chalk.red;\n}\n","import chalk from \"chalk\";\nimport type { FitnessResult } from \"../types.js\";\nimport { scoreColor, type ColorFn } from \"./score-color.js\";\nimport { stripAnsi, supportsUnicode } from \"./terminal.js\";\n\nconst BOX_INNER = 60;\n\nfunction visibleLength(str: string): number {\n return stripAnsi(str).length;\n}\n\nfunction wrapText(text: string, maxWidth: number): string[] {\n if (visibleLength(text) <= maxWidth) return [text];\n const words = text.split(\" \");\n const lines: string[] = [];\n let current = \"\";\n for (const word of words) {\n if (visibleLength(current) === 0) {\n current = word;\n } else if (visibleLength(current) + 1 + visibleLength(word) <= maxWidth) {\n current += \" \" + word;\n } else {\n lines.push(current);\n current = word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\nconst BAR_FILLED = supportsUnicode ? \"\\u2588\" : \"#\";\nconst BAR_EMPTY = supportsUnicode ? \"\\u2591\" : \"-\";\n\nfunction progressBar(value: number, max: number, width = 26): string {\n if (max <= 0) return BAR_EMPTY.repeat(width);\n const ratio = Math.max(0, Math.min(1, value / max));\n const filled = Math.round(ratio * width);\n const empty = width - filled;\n return BAR_FILLED.repeat(filled) + BAR_EMPTY.repeat(empty);\n}\n\nfunction levelColor(level: string): ColorFn {\n switch (level) {\n case \"Strong\": return chalk.green;\n case \"Adequate\": return chalk.yellow;\n case \"Weak\": return chalk.hex(\"#FF8C00\"); // orange\n case \"Poor\": return chalk.red;\n default: return chalk.dim;\n }\n}\n\nconst BOX_TL = supportsUnicode ? \"\\u250C\" : \"+\";\nconst BOX_TR = supportsUnicode ? \"\\u2510\" : \"+\";\nconst BOX_BL = supportsUnicode ? \"\\u2514\" : \"+\";\nconst BOX_BR = supportsUnicode ? \"\\u2518\" : \"+\";\nconst BOX_H = supportsUnicode ? \"\\u2500\" : \"-\";\nconst BOX_V = supportsUnicode ? \"\\u2502\" : \"|\";\n\nfunction sectionStart(title: string, borderColor: ColorFn): void {\n const pad = Math.max(1, BOX_INNER - title.length);\n console.log(borderColor(`${BOX_TL} ${title} ${BOX_H.repeat(pad)}${BOX_TR}`));\n}\n\nfunction sectionEnd(borderColor: ColorFn): void {\n console.log(borderColor(`${BOX_BL}${BOX_H.repeat(BOX_INNER + 2)}${BOX_BR}`));\n}\n\nfunction sectionText(\n text: string,\n borderColor: ColorFn,\n textColor: ColorFn = chalk.dim\n): void {\n const contentWidth = BOX_INNER;\n const lines = text.length === 0 ? [\"\"] : wrapText(text, contentWidth);\n for (const line of lines) {\n const pad = Math.max(0, contentWidth - visibleLength(line));\n console.log(`${borderColor(BOX_V)} ${textColor(line)}${\" \".repeat(pad)} ${borderColor(BOX_V)}`);\n }\n}\n\nfunction scoreRow(\n label: string,\n score: number,\n borderColor: ColorFn,\n max = 100\n): void {\n const color = scoreColor(score);\n const meter = progressBar(score, max);\n const content = `${label.padEnd(16)} ${color(`[${meter}] ${score.toFixed(0)}/${max}`)}`;\n const visible = visibleLength(content);\n const pad = Math.max(0, BOX_INNER - visible);\n console.log(\n `${borderColor(BOX_V)} ${content}${\" \".repeat(pad)} ${borderColor(BOX_V)}`\n );\n}\n\nfunction verdictIcon(verdict: string): string {\n if (supportsUnicode) {\n switch (verdict) {\n case \"EXCELLENT\": return \"\\u25A0\";\n case \"GOOD\": return \"\\u25CF\";\n case \"MARGINAL\": return \"\\u25B2\";\n default: return \"\\u2717\";\n }\n }\n switch (verdict) {\n case \"EXCELLENT\": return \"*\";\n case \"GOOD\": return \"o\";\n case \"MARGINAL\": return \"!\";\n default: return \"x\";\n }\n}\n\nfunction verdictColor(verdict: string): ColorFn {\n switch (verdict) {\n case \"EXCELLENT\": return chalk.green.bold;\n case \"GOOD\": return chalk.blue.bold;\n case \"MARGINAL\": return chalk.yellow.bold;\n default: return chalk.red.bold;\n }\n}\n\nexport function printVerdict(model: string, fitness: FitnessResult): void {\n console.log(chalk.bold(\"\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"));\n console.log(chalk.bold(` VERDICT for ${model}`));\n console.log(chalk.bold(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\"));\n\n const fitBorder = chalk.cyan;\n const qualityBorder = chalk.green;\n const globalBorder = chalk.magenta;\n\n // ── Section A: Hardware Fit ──\n sectionStart(\"A) Hardware Fit\", fitBorder);\n sectionText(\n \"Method: thresholds are adjusted to your host hardware profile.\",\n fitBorder,\n chalk.white\n );\n sectionText(`Active profile: ${fitness.tuning.profile}`, fitBorder, chalk.white);\n sectionText(\n \"Formula: Speed (/50) + TTFT (/20) + Memory (/30) = Hardware Fit (/100).\",\n fitBorder\n );\n sectionText(\n `Targets speed (tok/s): Excellent >= ${fitness.tuning.speed.excellent}, Good >= ${fitness.tuning.speed.good}, Marginal >= ${fitness.tuning.speed.marginal}`,\n fitBorder\n );\n sectionText(\n `Targets TTFT (ms): Excellent <= ${fitness.tuning.ttft.excellentMs}, Good <= ${fitness.tuning.ttft.goodMs}, Marginal <= ${fitness.tuning.ttft.marginalMs}`,\n fitBorder\n );\n sectionText(\n `Hard limits: speed >= ${fitness.tuning.speed.hardMin} tok/s, TTFT <= ${fitness.tuning.ttft.hardMaxMs}ms, load <= ${fitness.tuning.loadTimeHardMaxMs}ms`,\n fitBorder\n );\n sectionText(\"\", fitBorder);\n scoreRow(\"Performance\", fitness.performanceScore.total, fitBorder);\n sectionText(\n ` Breakdown: Speed ${fitness.performanceScore.speed}/50 TTFT ${fitness.performanceScore.ttft}/20 Memory ${fitness.performanceScore.memory}/30`,\n fitBorder\n );\n scoreRow(\"Hardware Fit\", fitness.hardwareFitScore, fitBorder);\n\n if (fitness.disqualifiers.length > 0) {\n sectionText(\"Disqualifiers:\", fitBorder, chalk.red);\n for (const d of fitness.disqualifiers) {\n sectionText(` • ${d}`, fitBorder, chalk.red);\n }\n }\n if (fitness.warnings.length > 0) {\n sectionText(\"Warnings:\", fitBorder, chalk.yellow);\n for (const w of fitness.warnings) {\n sectionText(` ${supportsUnicode ? \"\\u26A0\" : \"!!\"} ${w}`, fitBorder, chalk.yellow);\n }\n }\n sectionEnd(fitBorder);\n\n // ── Section B: Task Quality ──\n sectionStart(\"B) Task Quality\", qualityBorder);\n if (fitness.qualityScore && fitness.categoryLabels) {\n sectionText(\n \"Quality assessment based on 6 dimensions across diverse task types.\",\n qualityBorder,\n chalk.white\n );\n sectionText(\"\", qualityBorder);\n scoreRow(\"Quality Total\", fitness.qualityScore.total, qualityBorder);\n sectionText(\"\", qualityBorder);\n\n for (const label of fitness.categoryLabels) {\n const color = levelColor(label.level);\n sectionText(\n ` ${label.category.padEnd(24)} ${color(`${label.rawScore.toFixed(0)}%`.padEnd(6))} ${color(label.level)}`,\n qualityBorder,\n chalk.white\n );\n }\n\n // Time penalty summary\n if (fitness.qualityScore.timePenalties) {\n const parts: string[] = [];\n const limitLabels: Record<string, string> = {\n reasoning: \"reasoning\",\n math: \"math\",\n coding: \"coding\",\n instructionFollowing: \"instruction-following\",\n structuredOutput: \"structured-output\",\n multilingual: \"multilingual\",\n };\n for (const [key, count] of Object.entries(fitness.qualityScore.timePenalties)) {\n parts.push(`${count} ${limitLabels[key] ?? key}`);\n }\n sectionText(\"\", qualityBorder);\n sectionText(\n `Time penalties: ${parts.join(\" + \")} answers penalized (response too slow)`,\n qualityBorder,\n chalk.yellow\n );\n }\n\n sectionText(\"\", qualityBorder);\n sectionText(\n \"Based on an internal mixed-difficulty dataset; interpret as directional, not absolute.\",\n qualityBorder\n );\n } else {\n sectionText(\"\", qualityBorder);\n sectionText(\"Quality not computed (performance-only run).\", qualityBorder);\n sectionText(\"Run a full benchmark to get quality assessment.\", qualityBorder);\n }\n sectionEnd(qualityBorder);\n\n // ── Section C: Global Score ──\n sectionStart(\"C) Global Score\", globalBorder);\n if (fitness.globalScore !== null) {\n sectionText(\n \"Formula: Global = 30% Hardware Fit + 70% Quality.\",\n globalBorder,\n chalk.white\n );\n sectionText(\"\", globalBorder);\n scoreRow(\"Global Score\", fitness.globalScore, globalBorder);\n } else {\n sectionText(\"\", globalBorder);\n sectionText(\"Global score unavailable (performance-only run).\", globalBorder);\n }\n\n const vColor = verdictColor(fitness.verdict);\n const icon = verdictIcon(fitness.verdict);\n sectionText(\"\", globalBorder);\n sectionText(`Verdict: ${icon} ${fitness.verdict}`, globalBorder, vColor);\n sectionText(`Interpretation: ${fitness.interpretation}`, globalBorder);\n sectionEnd(globalBorder);\n\n console.log(chalk.bold(\"\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\"));\n}\n","import { mkdir, writeFile, readFile, readdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { BenchResult } from \"../types.js\";\nimport { normalizeEmail, normalizeNickname, isValidEmail, isValidNickname } from \"./submitter.js\";\n\nconst BASE_DIR = join(homedir(), \".metrillm\");\nconst RESULTS_DIR = join(BASE_DIR, \"results\");\nconst CONFIG_PATH = join(BASE_DIR, \"config.json\");\n\nexport interface MetriLLMConfig {\n autoShare: true | \"ask\"; // true = always share, \"ask\" = prompt every run\n telemetry?: boolean; // true = opt-in, false = opt-out, undefined = not yet decided\n submitterNickname?: string;\n submitterEmail?: string;\n runtimeBackend?: \"ollama\" | \"lm-studio\";\n}\n\nconst DEFAULT_CONFIG: MetriLLMConfig = {\n autoShare: \"ask\",\n};\n\nasync function ensureDirs(): Promise<void> {\n await mkdir(RESULTS_DIR, { recursive: true });\n}\n\nfunction parseRuntimeBackend(value: unknown): MetriLLMConfig[\"runtimeBackend\"] | undefined {\n if (value === \"ollama\" || value === \"lm-studio\") {\n return value;\n }\n return undefined;\n}\n\nfunction resultFilename(result: BenchResult): string {\n const ts = result.timestamp\n .replace(/[:.]/g, \"-\")\n .replace(\"T\", \"_\")\n .replace(/[^0-9_-]/g, \"\");\n const model = result.model.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n const hashSuffix = result.metadata.rawLogHash\n ? result.metadata.rawLogHash.slice(0, 8)\n : `${Date.now()}`;\n return `${ts}_${model}_${hashSuffix}.json`;\n}\n\nexport async function saveResult(result: BenchResult): Promise<string> {\n await ensureDirs();\n const filename = resultFilename(result);\n const filepath = join(RESULTS_DIR, filename);\n await writeFile(filepath, JSON.stringify(result, null, 2), \"utf8\");\n return filepath;\n}\n\nexport async function loadResults(): Promise<BenchResult[]> {\n await ensureDirs();\n try {\n const files = await readdir(RESULTS_DIR);\n const jsonFiles = files.filter((f) => f.endsWith(\".json\")).sort();\n const results: BenchResult[] = [];\n for (const file of jsonFiles) {\n try {\n const content = await readFile(join(RESULTS_DIR, file), \"utf8\");\n results.push(JSON.parse(content) as BenchResult);\n } catch {\n // Skip malformed files\n }\n }\n return results;\n } catch {\n return [];\n }\n}\n\nexport async function loadConfig(): Promise<MetriLLMConfig> {\n try {\n const content = await readFile(CONFIG_PATH, \"utf8\");\n const parsed = JSON.parse(content) as Record<string, unknown>;\n const autoShare = parsed.autoShare === true ? true : \"ask\";\n const telemetry = typeof parsed.telemetry === \"boolean\" ? parsed.telemetry : undefined;\n const submitterNickname = typeof parsed.submitterNickname === \"string\"\n && isValidNickname(parsed.submitterNickname)\n ? normalizeNickname(parsed.submitterNickname)\n : undefined;\n const submitterEmail = typeof parsed.submitterEmail === \"string\"\n && isValidEmail(parsed.submitterEmail)\n ? normalizeEmail(parsed.submitterEmail)\n : undefined;\n const runtimeBackend = parseRuntimeBackend(parsed.runtimeBackend);\n return {\n ...DEFAULT_CONFIG,\n autoShare,\n telemetry,\n submitterNickname,\n submitterEmail,\n runtimeBackend,\n };\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport async function saveConfig(config: MetriLLMConfig): Promise<void> {\n await ensureDirs();\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), \"utf8\");\n}\n\nexport function getResultsDir(): string {\n return RESULTS_DIR;\n}\n","import { createHash } from \"node:crypto\";\nimport type { SubmitterIdentity } from \"../types.js\";\n\nconst NICKNAME_MIN_LEN = 2;\nconst NICKNAME_MAX_LEN = 40;\nconst EMAIL_MAX_LEN = 254;\n\nexport interface SubmitterProfile {\n nickname: string;\n email: string;\n}\n\nexport function normalizeNickname(value: string): string {\n return value.trim().replace(/\\s+/g, \" \");\n}\n\nexport function normalizeEmail(value: string): string {\n return value.trim().toLowerCase();\n}\n\nexport function isValidNickname(value: string): boolean {\n const nickname = normalizeNickname(value);\n return nickname.length >= NICKNAME_MIN_LEN && nickname.length <= NICKNAME_MAX_LEN;\n}\n\nexport function isValidEmail(value: string): boolean {\n const email = normalizeEmail(value);\n if (email.length === 0 || email.length > EMAIL_MAX_LEN) return false;\n // Simple pragmatic check for CLI collection.\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n}\n\nexport function hashEmail(value: string): string {\n return createHash(\"sha256\").update(normalizeEmail(value)).digest(\"hex\");\n}\n\nexport function toSubmitterProfile(value: { nickname: string; email: string }): SubmitterProfile {\n return {\n nickname: normalizeNickname(value.nickname),\n email: normalizeEmail(value.email),\n };\n}\n\nexport function toSubmitterIdentity(profile: SubmitterProfile): SubmitterIdentity {\n return {\n nickname: profile.nickname,\n emailHash: hashEmail(profile.email),\n };\n}\n","import { createClient, type SupabaseClient } from \"@supabase/supabase-js\";\nimport type { BenchResult } from \"../types.js\";\n\nconst SUPABASE_URL_DEFAULT = \"https://phvvzbgasxobjzjnkewf.supabase.co\";\n// Public anon key for the official read/insert-only leaderboard project (RLS enforced).\nconst SUPABASE_ANON_KEY_DEFAULT =\n \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InBodnZ6Ymdhc3hvYmp6am5rZXdmIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzIyOTMxNTksImV4cCI6MjA4Nzg2OTE1OX0.-Wn0V8f-Uv_x_krNUnjmFRcqfAOPQEVc_Qx1kZ2ppgk\";\nconst SUPABASE_URL_PLACEHOLDER = \"https://YOUR_SUPABASE_PROJECT.supabase.co\";\nconst SUPABASE_URL_PLACEHOLDER_ALT = \"https://your-project.supabase.co\";\nconst SUPABASE_ANON_KEY_PLACEHOLDER = \"YOUR_SUPABASE_ANON_KEY\";\nconst SUPABASE_ANON_KEY_PLACEHOLDER_ALT = \"your-supabase-anon-key\";\nconst PUBLIC_RESULT_BASE_URL_DEFAULT = \"https://metrillm.dev\";\nconst PUBLIC_RESULT_BASE_URL_PLACEHOLDER = \"https://YOUR_DASHBOARD_DOMAIN\";\nconst PUBLIC_RESULT_BASE_URL_PLACEHOLDER_ALT = \"https://your-dashboard-domain\";\n\nfunction resolveUploaderConfig(): {\n supabaseUrl: string;\n supabaseAnonKey: string;\n publicResultBaseUrl: string;\n} {\n const configuredPublicBaseUrl = process.env.METRILLM_PUBLIC_RESULT_BASE_URL?.trim();\n const publicResultBaseUrl =\n !configuredPublicBaseUrl || hasPlaceholder(configuredPublicBaseUrl)\n ? PUBLIC_RESULT_BASE_URL_DEFAULT\n : configuredPublicBaseUrl;\n\n return {\n supabaseUrl:\n !process.env.METRILLM_SUPABASE_URL || hasPlaceholder(process.env.METRILLM_SUPABASE_URL)\n ? SUPABASE_URL_DEFAULT\n : process.env.METRILLM_SUPABASE_URL,\n supabaseAnonKey:\n !process.env.METRILLM_SUPABASE_ANON_KEY || hasPlaceholder(process.env.METRILLM_SUPABASE_ANON_KEY)\n ? SUPABASE_ANON_KEY_DEFAULT\n : process.env.METRILLM_SUPABASE_ANON_KEY,\n publicResultBaseUrl,\n };\n}\n\nfunction hasPlaceholder(value: string): boolean {\n const normalized = value.trim();\n if (normalized.length === 0) return true;\n return [\n SUPABASE_URL_PLACEHOLDER,\n SUPABASE_URL_PLACEHOLDER_ALT,\n SUPABASE_ANON_KEY_PLACEHOLDER,\n SUPABASE_ANON_KEY_PLACEHOLDER_ALT,\n PUBLIC_RESULT_BASE_URL_PLACEHOLDER,\n PUBLIC_RESULT_BASE_URL_PLACEHOLDER_ALT,\n ].some((placeholder) => placeholder.toLowerCase() === normalized.toLowerCase());\n}\n\nfunction assertUploaderConfig(config: {\n supabaseUrl: string;\n supabaseAnonKey: string;\n}): void {\n const missing: string[] = [];\n if (!config.supabaseUrl.trim()) missing.push(\"METRILLM_SUPABASE_URL\");\n if (!config.supabaseAnonKey.trim()) missing.push(\"METRILLM_SUPABASE_ANON_KEY\");\n if (missing.length > 0) {\n throw new Error(\n `Upload is not configured. Set these variables first: ${missing.join(\", \")}`\n );\n }\n}\n\nexport interface UploadResult {\n id: string;\n url: string;\n rankGlobalPct: number | null; // e.g. 15 = top 15%\n rankCpuPct: number | null; // e.g. 8 = top 8% on same CPU\n totalCount: number;\n}\n\nexport interface UploadBenchOptions {\n submitterEmail?: string;\n}\n\nfunction resolveUploadedMemoryPercent(result: BenchResult): number | null {\n return result.performance.memoryFootprintAvailable === false\n ? null\n : result.performance.memoryPercent;\n}\n\nfunction resolveUploadedModelFormat(result: BenchResult): string {\n if (result.metadata.modelFormat?.trim()) return result.metadata.modelFormat;\n\n const runtimeBackend = result.metadata.runtimeBackend ?? \"ollama\";\n if (runtimeBackend === \"ollama\") return \"gguf\";\n return \"unknown\";\n}\n\nexport async function uploadBenchResult(\n result: BenchResult,\n options: UploadBenchOptions = {}\n): Promise<UploadResult> {\n const config = resolveUploaderConfig();\n assertUploaderConfig(config);\n const supabase = createClient(config.supabaseUrl, config.supabaseAnonKey);\n\n const row = {\n model: result.model,\n parameter_size: result.modelInfo?.parameterSize ?? null,\n quantization: result.modelInfo?.quantization ?? null,\n family: result.modelInfo?.family ?? null,\n thinking_detected: result.modelInfo?.thinkingDetected ?? null,\n tokens_per_second: result.performance.tokensPerSecond,\n ttft_ms: result.performance.ttft,\n memory_percent: resolveUploadedMemoryPercent(result),\n thinking_tokens_estimate: result.performance.thinkingTokensEstimate ?? null,\n verdict: result.fitness.verdict,\n global_score: result.fitness.globalScore,\n hardware_fit_score: result.fitness.hardwareFitScore,\n quality_score: result.fitness.qualityScore?.total ?? null,\n cpu: result.hardware.cpu,\n cpu_cores: result.hardware.cpuCores,\n total_memory_gb: result.hardware.totalMemoryGB,\n gpu: result.hardware.gpu || null,\n os: result.hardware.os,\n arch: result.hardware.arch,\n machine_model: result.hardware.machineModel ?? null,\n power_mode: result.hardware.powerMode ?? null,\n benchmark_spec_version: result.metadata.benchmarkSpecVersion,\n runtime_version: result.metadata.runtimeVersion,\n runtime_backend: result.metadata.runtimeBackend ?? \"ollama\",\n model_format: resolveUploadedModelFormat(result),\n raw_log_hash: result.metadata.rawLogHash,\n result: result,\n };\n\n const { data, error } = await supabase\n .from(\"benchmarks\")\n .insert(row)\n .select(\"id\")\n .single();\n\n if (error) {\n if (error.code === \"23505\") {\n // Unique constraint violation on raw_log_hash = duplicate upload\n throw new Error(\"This benchmark result has already been uploaded.\");\n }\n throw new Error(`Upload failed: ${error.message}`);\n }\n\n const id = data.id as string;\n const url = `${config.publicResultBaseUrl.replace(/\\/+$/, \"\")}/result/${id}`;\n\n await upsertLeadBestEffort(\n supabase,\n options.submitterEmail,\n result.submitter?.nickname ?? null,\n result.submitter?.emailHash ?? null\n );\n\n const rank = await getRank(\n supabase,\n result.fitness.globalScore,\n result.hardware.cpu\n );\n return { id, url, ...rank };\n}\n\nasync function upsertLeadBestEffort(\n supabase: SupabaseClient,\n email: string | undefined,\n nickname: string | null,\n emailHash: string | null\n): Promise<void> {\n if (!email || !emailHash) return;\n\n try {\n const { error } = await supabase\n .from(\"benchmark_leads\")\n .upsert(\n {\n email,\n email_hash: emailHash,\n nickname,\n source: \"cli\",\n last_seen_at: new Date().toISOString(),\n },\n { onConflict: \"email_hash\" }\n );\n\n if (error) {\n throw error;\n }\n } catch {\n // Lead collection is best-effort and must not block benchmark uploads.\n }\n}\n\nasync function getRank(\n supabase: SupabaseClient,\n globalScore: number | null,\n cpu: string\n): Promise<{ rankGlobalPct: number | null; rankCpuPct: number | null; totalCount: number }> {\n if (globalScore == null) {\n return { rankGlobalPct: null, rankCpuPct: null, totalCount: 0 };\n }\n\n try {\n const { data, error } = await supabase.rpc(\"get_rank\", {\n p_global_score: globalScore,\n p_cpu: cpu,\n });\n\n if (error || !data) {\n return { rankGlobalPct: null, rankCpuPct: null, totalCount: 0 };\n }\n\n const { total_count, better_count, cpu_total, cpu_better } = data;\n const rankGlobalPct =\n total_count > 0 ? Math.max(1, Math.round((better_count + 1) / total_count * 100)) : null;\n const rankCpuPct =\n cpu_total > 0 ? Math.max(1, Math.round((cpu_better + 1) / cpu_total * 100)) : null;\n\n return { rankGlobalPct, rankCpuPct, totalCount: total_count };\n } catch {\n return { rankGlobalPct: null, rankCpuPct: null, totalCount: 0 };\n }\n}\n","import chalk from \"chalk\";\nimport * as readline from \"node:readline\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport type { BenchResult } from \"../types.js\";\nimport { loadConfig, saveConfig } from \"../core/store.js\";\nimport { supportsUnicode } from \"./terminal.js\";\n\nexport type ShareDecision = \"share\" | \"skip\";\ntype ShareChoice = \"share\" | \"skip\" | \"always\";\n\ninterface SharePromptDeps {\n selectChoice?: (result: BenchResult) => Promise<ShareChoice>;\n}\n\ninterface ShareOption {\n label: string;\n hint: string;\n value: ShareChoice;\n}\n\nconst SHARE_OPTIONS: ShareOption[] = [\n { label: \"Yes, share now\", hint: \"Upload this benchmark result to the public leaderboard.\", value: \"share\" },\n { label: \"No (this run only)\", hint: \"Skip upload for this benchmark run only.\", value: \"skip\" },\n { label: \"Always share\", hint: \"Save preference and automatically share future results.\", value: \"always\" },\n];\n\nfunction isEnterKey(str: string, keyName?: string): boolean {\n return (\n keyName === \"return\"\n || keyName === \"enter\"\n || keyName === \"numenter\"\n || keyName === \"kpenter\"\n || str === \"\\r\"\n || str === \"\\n\"\n );\n}\n\nfunction renderShareMenu(result: BenchResult, selectedIndex: number, lastRenderedLines = 0): number {\n const score = result.fitness.globalScore ?? result.fitness.hardwareFitScore;\n const verdict = result.fitness.verdict;\n const tps = result.performance.tokensPerSecond.toFixed(1);\n const ram = `${result.hardware.totalMemoryGB.toFixed(0)} GB`;\n\n const lines: string[] = [];\n lines.push(chalk.bold.cyan(\"Share Result\"));\n lines.push(chalk.dim(\"Use Up/Down arrows then Enter, or press 1-3 on keyboard/numpad.\"));\n lines.push(chalk.dim(\"Shortcuts: y = share, n = skip, a = always. Esc = skip.\"));\n lines.push(\"\");\n const checkMark = supportsUnicode ? \"\\u2713\" : \"ok\";\n lines.push(chalk.bold.green(` ${checkMark} Benchmark complete!`));\n lines.push(chalk.dim(` Score: ${score}/100 — ${verdict}`));\n lines.push(chalk.dim(` ${result.model} @ ${tps} tok/s (${ram} RAM)`));\n lines.push(\"\");\n lines.push(chalk.bold(\" Share your result on the public leaderboard?\"));\n lines.push(chalk.dim(\" Your hardware specs and scores will be published (no personal data).\"));\n lines.push(\"\");\n\n for (let i = 0; i < SHARE_OPTIONS.length; i++) {\n const option = SHARE_OPTIONS[i];\n const marker = i === selectedIndex ? chalk.cyan(\">\") : \" \";\n const label = i === selectedIndex ? chalk.bold(option.label) : option.label;\n const ordinal = `${i + 1}.`.padStart(3);\n lines.push(` ${marker} ${chalk.dim(ordinal)} ${label}`);\n lines.push(chalk.dim(` ${option.hint}`));\n }\n\n if (lastRenderedLines > 0) {\n output.write(`\\x1b[${lastRenderedLines}A`);\n }\n\n for (const line of lines) {\n output.write(line + \"\\x1b[K\\n\");\n }\n\n return lines.length;\n}\n\nfunction parseChoiceFromKey(str: string, keyName?: string): ShareChoice | null {\n const value = (keyName ?? str).toLowerCase();\n const directMap: Record<string, ShareChoice> = {\n \"1\": \"share\",\n \"2\": \"skip\",\n \"3\": \"always\",\n y: \"share\",\n n: \"skip\",\n a: \"always\",\n };\n\n if (value in directMap) {\n return directMap[value];\n }\n\n if (value === \"numpad1\" || value === \"kp1\") return \"share\";\n if (value === \"numpad2\" || value === \"kp2\") return \"skip\";\n if (value === \"numpad3\" || value === \"kp3\") return \"always\";\n return null;\n}\n\nasync function selectShareChoice(result: BenchResult): Promise<ShareChoice> {\n return new Promise((resolve) => {\n let index = 0;\n let lastRenderedLines = 0;\n const previousRawMode = input.isTTY ? input.isRaw : false;\n\n const cleanup = () => {\n input.off(\"keypress\", onKeypress);\n if (input.isTTY) {\n input.setRawMode(previousRawMode);\n }\n output.write(\"\\x1b[?25h\");\n };\n\n const finish = (choice: ShareChoice) => {\n cleanup();\n resolve(choice);\n };\n\n const onKeypress = (str: string, key: { name?: string; ctrl?: boolean }) => {\n if (key.ctrl && key.name === \"c\") {\n cleanup();\n process.exit(130);\n }\n\n const quickChoice = parseChoiceFromKey(str, key.name);\n if (quickChoice) {\n finish(quickChoice);\n return;\n }\n\n if (key.name === \"up\" || key.name === \"k\") {\n index = (index - 1 + SHARE_OPTIONS.length) % SHARE_OPTIONS.length;\n lastRenderedLines = renderShareMenu(result, index, lastRenderedLines);\n return;\n }\n\n if (key.name === \"down\" || key.name === \"j\") {\n index = (index + 1) % SHARE_OPTIONS.length;\n lastRenderedLines = renderShareMenu(result, index, lastRenderedLines);\n return;\n }\n\n if (isEnterKey(str, key.name)) {\n finish(SHARE_OPTIONS[index]!.value);\n return;\n }\n\n if (key.name === \"escape\") {\n finish(\"skip\");\n }\n };\n\n readline.emitKeypressEvents(input);\n input.resume();\n if (input.isTTY) {\n input.setRawMode(true);\n }\n\n output.write(\"\\x1b[?25l\");\n lastRenderedLines = renderShareMenu(result, index, lastRenderedLines);\n input.on(\"keypress\", onKeypress);\n });\n}\n\nexport async function promptShare(\n result: BenchResult,\n deps: SharePromptDeps = {}\n): Promise<ShareDecision> {\n const config = await loadConfig();\n\n // If user has a saved preference, use it\n if (config.autoShare === true) return \"share\";\n\n // Interactive prompt (autoShare === \"ask\")\n if (!input.isTTY || !output.isTTY) return \"skip\";\n\n const choice = await (deps.selectChoice ?? selectShareChoice)(result);\n\n if (choice === \"always\") {\n await saveConfig({ ...config, autoShare: true });\n return \"share\";\n }\n if (choice === \"skip\") {\n return \"skip\";\n }\n return \"share\";\n}\n","import chalk from \"chalk\";\nimport * as readline from \"node:readline\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport { loadConfig, saveConfig, type MetriLLMConfig } from \"../core/store.js\";\nimport {\n isValidEmail,\n isValidNickname,\n normalizeEmail,\n normalizeNickname,\n toSubmitterIdentity,\n toSubmitterProfile,\n type SubmitterProfile,\n} from \"../core/submitter.js\";\n\nexport interface ShareSubmitter {\n nickname: string;\n email: string;\n emailHash: string;\n}\n\ninterface SubmitterPromptDeps {\n askLine?: (prompt: string) => Promise<string | null>;\n loadUserConfig?: () => Promise<MetriLLMConfig>;\n saveUserConfig?: (config: MetriLLMConfig) => Promise<void>;\n}\n\nfunction canPromptInteractively(): boolean {\n return Boolean(input.isTTY && output.isTTY && input.readable && !input.readableEnded);\n}\n\nasync function askLine(prompt: string): Promise<string | null> {\n if (!input.readable || input.readableEnded) {\n return null;\n }\n\n const previousRawMode = input.isTTY ? input.isRaw : false;\n if (input.isTTY && previousRawMode) {\n input.setRawMode(false);\n }\n\n const rl = readline.createInterface({ input, output });\n\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (value: string | null) => {\n if (settled) return;\n settled = true;\n input.off(\"end\", onEnd);\n rl.off(\"close\", onClose);\n try {\n rl.close();\n } catch {\n // Ignore close failures.\n }\n if (input.isTTY && previousRawMode) {\n input.setRawMode(true);\n }\n resolve(value);\n };\n\n const onEnd = () => finish(null);\n const onClose = () => finish(null);\n\n input.once(\"end\", onEnd);\n rl.once(\"close\", onClose);\n\n rl.question(prompt, (answer) => {\n finish(answer);\n });\n });\n}\n\nasync function promptSubmitterProfile(\n deps: SubmitterPromptDeps,\n defaults: { nickname?: string; email?: string } = {}\n): Promise<SubmitterProfile | null> {\n const ask = deps.askLine ?? askLine;\n\n let nicknameCandidate = defaults.nickname ?? \"\";\n while (true) {\n const nicknameHint = defaults.nickname ? ` [${defaults.nickname}]` : \"\";\n const nicknameAnswer = await ask(`Nickname${nicknameHint} > `);\n if (nicknameAnswer === null) return null;\n\n nicknameCandidate = nicknameAnswer.trim().length > 0\n ? nicknameAnswer\n : (defaults.nickname ?? \"\");\n\n if (isValidNickname(nicknameCandidate)) {\n break;\n }\n console.log(chalk.yellow(\"Nickname must be between 2 and 40 characters.\"));\n }\n\n console.log(chalk.dim(\"Your email is never stored — only a SHA-256 hash is saved to match your leaderboard entries.\"));\n while (true) {\n const emailHint = defaults.email ? ` [${defaults.email}]` : \"\";\n const emailAnswer = await ask(`Email${emailHint} > `);\n if (emailAnswer === null) return null;\n\n const emailCandidate = emailAnswer.trim().length > 0\n ? emailAnswer\n : (defaults.email ?? \"\");\n\n if (!isValidEmail(emailCandidate)) {\n console.log(chalk.yellow(\"Please enter a valid email address.\"));\n continue;\n }\n\n return toSubmitterProfile({\n nickname: normalizeNickname(nicknameCandidate),\n email: normalizeEmail(emailCandidate),\n });\n }\n}\n\nexport async function resolveSubmitterForShare(\n deps: SubmitterPromptDeps = {}\n): Promise<ShareSubmitter | null> {\n const loadUserConfig = deps.loadUserConfig ?? loadConfig;\n const saveUserConfig = deps.saveUserConfig ?? saveConfig;\n const ask = deps.askLine ?? askLine;\n\n const config = await loadUserConfig();\n\n if (isValidNickname(config.submitterNickname ?? \"\") && isValidEmail(config.submitterEmail ?? \"\")) {\n const profile = toSubmitterProfile({\n nickname: config.submitterNickname!,\n email: config.submitterEmail!,\n });\n const identity = toSubmitterIdentity(profile);\n return { ...profile, emailHash: identity.emailHash };\n }\n\n if (!canPromptInteractively() && !deps.askLine) {\n return null;\n }\n\n console.log(\"\");\n console.log(chalk.bold.cyan(\"Link Your Benchmark History (optional)\"));\n console.log(chalk.dim(\"Add a nickname and email to find your future benchmark dashboard.\"));\n console.log(chalk.dim(\"Email stays private; only a hash is attached to the public benchmark record.\"));\n\n const consent = (await ask(\"Add nickname + email now? [Y/n] > \"))?.trim().toLowerCase();\n if (consent === \"n\" || consent === \"no\") {\n return null;\n }\n\n const profile = await promptSubmitterProfile(deps, {\n nickname: config.submitterNickname,\n email: config.submitterEmail,\n });\n\n if (!profile) {\n return null;\n }\n\n await saveUserConfig({\n ...config,\n submitterNickname: profile.nickname,\n submitterEmail: profile.email,\n });\n\n const identity = toSubmitterIdentity(profile);\n return { ...profile, emailHash: identity.emailHash };\n}\n\nexport async function promptAndSaveSubmitterProfile(\n deps: SubmitterPromptDeps = {}\n): Promise<SubmitterProfile | null> {\n const loadUserConfig = deps.loadUserConfig ?? loadConfig;\n const saveUserConfig = deps.saveUserConfig ?? saveConfig;\n\n if (!canPromptInteractively() && !deps.askLine) {\n return null;\n }\n\n const config = await loadUserConfig();\n const profile = await promptSubmitterProfile(deps, {\n nickname: config.submitterNickname,\n email: config.submitterEmail,\n });\n\n if (!profile) {\n return null;\n }\n\n await saveUserConfig({\n ...config,\n submitterNickname: profile.nickname,\n submitterEmail: profile.email,\n });\n\n return profile;\n}\n","import { createHash } from \"node:crypto\";\nimport { arch, cpus, platform, totalmem } from \"node:os\";\nimport { PostHog } from \"posthog-node\";\nimport { loadConfig, saveConfig } from \"./store.js\";\n\nconst POSTHOG_API_KEY = process.env.METRILLM_POSTHOG_KEY ?? \"\";\nconst POSTHOG_HOST = \"https://eu.i.posthog.com\";\n\nlet client: PostHog | null = null;\nlet consent: boolean | undefined;\nlet distinctId: string | null = null;\n\nfunction getDistinctId(): string {\n if (distinctId) return distinctId;\n const cpu = cpus()[0]?.model ?? \"unknown\";\n const raw = `${cpu}|${platform()}|${arch()}`;\n distinctId = createHash(\"sha256\").update(raw).digest(\"hex\").slice(0, 16);\n return distinctId;\n}\n\nasync function isEnabled(): Promise<boolean> {\n if (!POSTHOG_API_KEY) return false;\n if (consent !== undefined) return consent;\n const config = await loadConfig();\n consent = config.telemetry !== false;\n return consent;\n}\n\nfunction getClient(): PostHog {\n if (!client) {\n client = new PostHog(POSTHOG_API_KEY, {\n host: POSTHOG_HOST,\n flushAt: 5,\n flushInterval: 10_000,\n });\n }\n return client;\n}\n\nexport async function saveTelemetryConsent(value: boolean): Promise<void> {\n const config = await loadConfig();\n config.telemetry = value;\n await saveConfig(config);\n consent = value;\n}\n\nexport async function trackEvent(\n event: string,\n properties: Record<string, unknown> = {}\n): Promise<void> {\n if (!(await isEnabled())) return;\n try {\n getClient().capture({\n distinctId: getDistinctId(),\n event,\n properties: {\n source: \"metrillm-cli\",\n ...properties,\n },\n });\n } catch {\n // Non-fatal: telemetry should never break the CLI\n }\n}\n\nexport async function trackBenchStarted(props: {\n model: string;\n os: string;\n arch: string;\n cpuCores: number;\n ramGb: number;\n}): Promise<void> {\n await trackEvent(\"bench_started\", props);\n}\n\nexport async function trackBenchCompleted(props: {\n model: string;\n verdict: string;\n globalScore: number | null;\n tps: number;\n durationMs: number;\n}): Promise<void> {\n await trackEvent(\"bench_completed\", props);\n}\n\nexport async function trackBenchShared(props: {\n model: string;\n verdict: string;\n}): Promise<void> {\n await trackEvent(\"bench_shared\", props);\n}\n\nexport async function trackBenchExported(props: {\n format: string;\n}): Promise<void> {\n await trackEvent(\"bench_exported\", props);\n}\n\nexport async function flushTelemetry(): Promise<void> {\n if (!client) return;\n try {\n await client.shutdown();\n } catch {\n // Non-fatal\n }\n client = null;\n}\n\nexport async function showTelemetryNotice(): Promise<void> {\n const config = await loadConfig();\n if (config.telemetry !== undefined) return;\n console.log(\n \"Anonymous usage stats are enabled by default to help improve MetriLLM. Opt-out anytime: metrillm bench --no-telemetry\"\n );\n}\n","import chalk from \"chalk\";\nimport * as readline from \"node:readline\";\nimport { stdin as input, stdout as output } from \"node:process\";\n\n/**\n * Prompt the user to enable thinking mode (y/N).\n * Returns `true` if the user opted in, `false` otherwise.\n */\nexport async function promptThinkingMode(): Promise<boolean> {\n if (!input.isTTY || !output.isTTY) return false;\n\n const previousRawMode = input.isTTY ? input.isRaw : false;\n if (input.isTTY && previousRawMode) {\n input.setRawMode(false);\n }\n\n const rl = readline.createInterface({ input, output });\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n\n const finish = (value: boolean) => {\n if (settled) return;\n settled = true;\n rl.close();\n if (input.isTTY && previousRawMode) {\n input.setRawMode(previousRawMode);\n }\n resolve(value);\n };\n\n rl.on(\"close\", () => finish(false));\n\n rl.question(\n chalk.cyan(\"?\") + chalk.bold(\" Enable thinking mode?\") + chalk.dim(\" (y/N) \"),\n (answer) => {\n finish(answer.trim().toLowerCase() === \"y\");\n }\n );\n });\n}\n"],"mappings":"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A,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY,CAAC;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,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ACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,QACF;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AAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;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YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY,CAAC;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE,CAAC;AAAA,YACD;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA,CAAC;AAAA,UACH;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAA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","names":["readFile","readdir","join","homedir","child","escapeRegex","execFile","DEFAULT_STREAM_STALL_TIMEOUT_MS","SHARED_STREAM_STALL_TIMEOUT_ENV","defaultKeepAlive","hasSamplingOverrides","output","parseNonNegativeInt","resolveStreamStallTimeoutMs","fallback","execFile","path","listModels","listRunningModels","setDefaultKeepAlive","generate","generateStream","unloadModel","abortOngoingRequests","generate","generateStream","listModels","listRunningModels","unloadModel","setDefaultKeepAlive","abortOngoingRequests","generate","generateStream","listModels","listRunningModels","unloadModel","abortOngoingRequests","createHash","chalk","os","execFile","output","main","listRunningModels","generateStream","abortOngoingRequests","generate","abortOngoingRequests","generate","abortOngoingRequests","vm","spawn","spawn","code","generate","abortOngoingRequests","questions","p","generate","abortOngoingRequests","questions","path","generate","abortOngoingRequests","questions","escapeRegex","generate","abortOngoingRequests","t","chalk","chalk","chalk","chalk","BAR_FILLED","BAR_EMPTY","levelColor","chalk","readFile","readFile","chalk","chalk","chalk","readline","input","output","input","output","chalk","profile","identity","consent","createHash","client","createHash","client","chalk","readline","input","output","listModels","chalk","createHash","unloadModel","RESULTS_DIR","join","homedir","listModels","readdir","readFile"]}
|
|
1
|
+
{"version":3,"sources":["../src/setup.ts","../src/index.ts","../src/tools.ts","../../src/core/ollama-client.ts","../../src/utils.ts","../../src/core/lm-studio-client.ts","../../src/core/runtime.ts","../../src/commands/bench.ts","../../src/core/hardware.ts","../../src/ui/progress.ts","../../src/ui/terminal.ts","../../src/benchmarks/profile.ts","../../src/benchmarks/performance.ts","../../src/datasets/reasoning.json","../../src/benchmarks/reasoning.ts","../../src/datasets/math.json","../../src/benchmarks/math.ts","../../src/benchmarks/coding.ts","../../src/datasets/coding.json","../../src/datasets/instruction-following.json","../../src/benchmarks/instruction-following.ts","../../src/datasets/structured-output.json","../../src/benchmarks/structured-output.ts","../../src/datasets/multilingual.json","../../src/benchmarks/multilingual.ts","../../src/scoring/performance-scorer.ts","../../src/scoring/quality-scorer.ts","../../src/scoring/fitness.ts","../../src/ui/results-table.ts","../../src/ui/score-color.ts","../../src/ui/verdict.ts","../../src/core/store.ts","../../src/core/submitter.ts","../../src/core/uploader.ts","../../src/ui/share-prompt.ts","../../src/ui/submitter-prompt.ts","../../src/core/telemetry.ts","../../src/ui/thinking-prompt.ts","../../src/core/runtime-unavailable.ts"],"sourcesContent":["// This file MUST be imported before any CLI module to ensure console.log\n// is redirected to stderr before any module-level code runs.\n//\n// MCP uses stdout exclusively for JSON-RPC. The CLI uses console.log for\n// UI output (ora spinners, chalk colors, tables). We redirect console.log\n// to stderr so it doesn't corrupt the JSON-RPC stream.\n\nconsole.log = (...args: unknown[]) => {\n console.error(...args);\n};\n\n// Force disable colors and interactive UI elements\nprocess.env.NO_COLOR = \"1\";\nprocess.env.FORCE_COLOR = \"0\";\n","// IMPORTANT: setup.ts must be imported FIRST — it redirects console.log\n// to stderr before any CLI module can write to stdout at module level.\nimport \"./setup.js\";\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n toolDefinitions,\n listModelsSchema,\n runBenchmarkSchema,\n getResultsSchema,\n shareResultSchema,\n handleListModels,\n handleRunBenchmark,\n handleGetResults,\n handleShareResult,\n} from \"./tools.js\";\n\n// ── MCP Server ──\n\nconst server = new McpServer({\n name: \"metrillm\",\n version: \"0.2.1\",\n});\n\n// Register tools\nfor (const def of toolDefinitions) {\n switch (def.name) {\n case \"list_models\":\n server.tool(\n def.name,\n def.description,\n def.inputSchema.shape,\n async (args) => {\n try {\n const parsed = listModelsSchema.parse(args);\n const result = await handleListModels(parsed);\n return { content: [{ type: \"text\" as const, text: result }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: msg }) }], isError: true };\n }\n }\n );\n break;\n\n case \"run_benchmark\":\n server.tool(\n def.name,\n def.description,\n def.inputSchema.shape,\n async (args) => {\n try {\n const parsed = runBenchmarkSchema.parse(args);\n const result = await handleRunBenchmark(parsed);\n return { content: [{ type: \"text\" as const, text: result }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: msg }) }], isError: true };\n }\n }\n );\n break;\n\n case \"get_results\":\n server.tool(\n def.name,\n def.description,\n def.inputSchema.shape,\n async (args) => {\n try {\n const parsed = getResultsSchema.parse(args);\n const result = await handleGetResults(parsed);\n return { content: [{ type: \"text\" as const, text: result }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: msg }) }], isError: true };\n }\n }\n );\n break;\n\n case \"share_result\":\n server.tool(\n def.name,\n def.description,\n def.inputSchema.shape,\n async (args) => {\n try {\n const parsed = shareResultSchema.parse(args);\n const result = await handleShareResult(parsed);\n return { content: [{ type: \"text\" as const, text: result }] };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\" as const, text: JSON.stringify({ error: msg }) }], isError: true };\n }\n }\n );\n break;\n }\n}\n\n// ── Start ──\n\nasync function main(): Promise<void> {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error(\"MetriLLM MCP server running on stdio\");\n}\n\nmain().catch((err) => {\n console.error(\"Fatal error starting MetriLLM MCP server:\", err);\n process.exit(1);\n});\n","import { z } from \"zod\";\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport {\n listModels,\n getRuntimeDisplayName,\n getRuntimeModelInstallHint,\n setRuntimeByName,\n} from \"../../src/core/runtime.js\";\nimport { benchCommand } from \"../../src/commands/bench.js\";\nimport { uploadBenchResult } from \"../../src/core/uploader.js\";\nimport type { BenchResult } from \"../../src/types.js\";\n\n// ── Schemas ──\n\nconst SUPPORTED_RUNTIMES = [\"ollama\", \"lm-studio\"] as const;\n\nconst runtimeSchema = z\n .enum(SUPPORTED_RUNTIMES)\n .optional()\n .default(\"ollama\")\n .describe(\"Inference runtime to use (ollama | lm-studio).\");\n\nexport const listModelsSchema = z.object({\n runtime: runtimeSchema,\n});\n\nexport const runBenchmarkSchema = z.object({\n model: z.string().describe(\"Model name to benchmark (e.g. 'llama3.2:3b', 'qwen2.5:7b')\"),\n runtime: runtimeSchema,\n perfOnly: z\n .boolean()\n .optional()\n .default(false)\n .describe(\"If true, skip quality benchmarks and only measure speed/memory/TTFT\"),\n});\n\nexport const getResultsSchema = z.object({\n model: z.string().optional().describe(\"Filter results by model name (substring match)\"),\n runtime: runtimeSchema,\n});\n\nexport const shareResultSchema = z.object({\n resultFile: z\n .string()\n .describe(\"Absolute path to a benchmark result JSON file (from ~/.metrillm/results/). Must be inside ~/.metrillm/results/.\"),\n});\n\n// ── Tool definitions for MCP registration ──\n\nexport const toolDefinitions = [\n {\n name: \"list_models\",\n description:\n \"List all LLM models available locally on the inference runtime (e.g. Ollama). \" +\n \"Returns model name, size, parameter count, quantization, and family.\",\n inputSchema: listModelsSchema,\n },\n {\n name: \"run_benchmark\",\n description:\n \"Run an MetriLLM benchmark on a local model. Measures performance (tokens/s, TTFT, memory) \" +\n \"and optionally quality (reasoning, math, coding, instruction following, structured output, multilingual). \" +\n \"Returns a detailed fitness verdict. Warning: benchmarks take 30s to 5+ minutes depending on model size.\",\n inputSchema: runBenchmarkSchema,\n },\n {\n name: \"get_results\",\n description:\n \"Retrieve previously saved benchmark results from ~/.metrillm/results/. \" +\n \"Optionally filter by model name. Returns an array of full benchmark result objects.\",\n inputSchema: getResultsSchema,\n },\n {\n name: \"share_result\",\n description:\n \"Upload a benchmark result to the public MetriLLM leaderboard. \" +\n \"Uses official upload defaults; METRILLM_* environment variables can override for self-hosted deployments. \" +\n \"The resultFile must be an absolute path to a JSON file in ~/.metrillm/results/.\",\n inputSchema: shareResultSchema,\n },\n] as const;\n\n// ── Helpers ──\n\nfunction assertRuntime(runtime: string): void {\n if (!SUPPORTED_RUNTIMES.includes(runtime as (typeof SUPPORTED_RUNTIMES)[number])) {\n throw new Error(\n `Runtime \"${runtime}\" is not yet supported. Currently supported: ${SUPPORTED_RUNTIMES.join(\", \")}. ` +\n \"New runtimes will be added as they become available in the MetriLLM CLI.\"\n );\n }\n}\n\nconst RESULTS_DIR = join(homedir(), \".metrillm\", \"results\");\n\nfunction normalizeResultRuntimeBackend(result: BenchResult): \"ollama\" | \"lm-studio\" {\n const runtimeBackend = result.metadata?.runtimeBackend?.trim().toLowerCase();\n if (runtimeBackend === \"lm-studio\") return \"lm-studio\";\n if (runtimeBackend === \"ollama\") return \"ollama\";\n // Legacy result files (before runtime metadata) are Ollama-only.\n return \"ollama\";\n}\n\n// ── Mutex for benchmark serialization ──\n// The CLI uses a singleton runtime — concurrent benchmarks would corrupt results.\nlet benchLock: Promise<void> = Promise.resolve();\n\nfunction withBenchLock<T>(fn: () => Promise<T>): Promise<T> {\n const prev = benchLock;\n let resolve: () => void;\n benchLock = new Promise<void>((r) => { resolve = r; });\n return prev.then(fn).finally(() => resolve!());\n}\n\n// ── Tool handlers ──\n\nexport async function handleListModels(\n args: z.infer<typeof listModelsSchema>\n): Promise<string> {\n assertRuntime(args.runtime);\n return withBenchLock(async () => {\n setRuntimeByName(args.runtime);\n const runtimeDisplayName = getRuntimeDisplayName(args.runtime);\n const runtimeModelHint = getRuntimeModelInstallHint(args.runtime);\n\n const models = await listModels();\n\n if (models.length === 0) {\n return JSON.stringify({\n models: [],\n message: `No models found on ${runtimeDisplayName}. ${runtimeModelHint}`,\n });\n }\n\n return JSON.stringify({\n models: models.map((m) => ({\n name: m.name,\n size: m.size,\n parameterSize: m.parameterSize ?? null,\n quantization: m.quantization ?? null,\n family: m.family ?? null,\n })),\n count: models.length,\n });\n });\n}\n\nexport async function handleRunBenchmark(\n args: z.infer<typeof runBenchmarkSchema>\n): Promise<string> {\n assertRuntime(args.runtime);\n const runtimeDisplayName = getRuntimeDisplayName(args.runtime);\n\n return withBenchLock(async () => {\n setRuntimeByName(args.runtime);\n const outcome = await benchCommand({\n model: args.model,\n backend: args.runtime,\n perfOnly: args.perfOnly,\n json: true, // suppress all UI output\n share: false, // never auto-share from MCP\n setExitCode: false,\n });\n\n if (outcome.failedModels.length > 0) {\n return JSON.stringify({\n success: false,\n error: `Benchmark failed for: ${outcome.failedModels.join(\", \")}`,\n failedModels: outcome.failedModels,\n });\n }\n\n if (outcome.results.length === 0) {\n return JSON.stringify({\n success: false,\n error: `No results produced. Is ${runtimeDisplayName} running?`,\n });\n }\n\n const result = outcome.results[0];\n return JSON.stringify({\n success: true,\n model: result.model,\n verdict: result.fitness.verdict,\n globalScore: result.fitness.globalScore,\n performance: {\n tokensPerSecond: result.performance.tokensPerSecond,\n ttftMs: result.performance.ttft,\n memoryUsedGB: result.performance.memoryUsedGB,\n memoryPercent: result.performance.memoryPercent,\n },\n performanceScore: result.fitness.performanceScore,\n qualityScore: result.fitness.qualityScore,\n interpretation: result.fitness.interpretation,\n savedLocally: true,\n });\n }); // end withBenchLock\n}\n\nexport async function handleGetResults(\n args: z.infer<typeof getResultsSchema>\n): Promise<string> {\n assertRuntime(args.runtime);\n\n let files: string[];\n try {\n files = await readdir(RESULTS_DIR);\n } catch {\n return JSON.stringify({ results: [], message: \"No results directory found (~/.metrillm/results/)\" });\n }\n\n const jsonFiles = files.filter((f) => f.endsWith(\".json\")).sort();\n\n if (jsonFiles.length === 0) {\n return JSON.stringify({ results: [], message: \"No benchmark results found.\" });\n }\n\n const results: Array<{\n file: string;\n model: string;\n verdict: string;\n globalScore: number | null;\n tokensPerSecond: number;\n timestamp: string;\n }> = [];\n\n for (const file of jsonFiles) {\n try {\n const content = await readFile(join(RESULTS_DIR, file), \"utf8\");\n const result = JSON.parse(content) as BenchResult;\n\n const resultRuntime = normalizeResultRuntimeBackend(result);\n if (resultRuntime !== args.runtime) {\n continue;\n }\n\n if (args.model && !result.model.toLowerCase().includes(args.model.toLowerCase())) {\n continue;\n }\n\n results.push({\n file: join(RESULTS_DIR, file),\n model: result.model,\n verdict: result.fitness.verdict,\n globalScore: result.fitness.globalScore,\n tokensPerSecond: result.performance.tokensPerSecond,\n timestamp: result.timestamp,\n });\n } catch {\n // Skip malformed files\n }\n }\n\n return JSON.stringify({ results, count: results.length });\n}\n\nexport async function handleShareResult(\n args: z.infer<typeof shareResultSchema>\n): Promise<string> {\n // Validate that the file is inside ~/.metrillm/results/ to prevent path traversal\n const { resolve } = await import(\"node:path\");\n const resolvedPath = resolve(args.resultFile);\n const resolvedResultsDir = resolve(RESULTS_DIR);\n if (!resolvedPath.startsWith(resolvedResultsDir + \"/\")) {\n throw new Error(\n `Security: resultFile must be inside ${RESULTS_DIR}/. Got: ${args.resultFile}`\n );\n }\n\n let content: string;\n try {\n content = await readFile(resolvedPath, \"utf8\");\n } catch {\n throw new Error(`Cannot read result file: ${args.resultFile}`);\n }\n\n let result: BenchResult;\n try {\n result = JSON.parse(content) as BenchResult;\n } catch {\n throw new Error(`Invalid JSON in result file: ${args.resultFile}`);\n }\n\n if (!result.model || !result.performance || !result.fitness) {\n throw new Error(\"File does not appear to be a valid MetriLLM benchmark result.\");\n }\n\n const uploaded = await uploadBenchResult(result);\n\n return JSON.stringify({\n success: true,\n id: uploaded.id,\n url: uploaded.url,\n rankGlobalPct: uploaded.rankGlobalPct,\n rankCpuPct: uploaded.rankCpuPct,\n totalCount: uploaded.totalCount,\n });\n}\n","import { Ollama } from \"ollama\";\nimport type { AbortableAsyncIterator, GenerateRequest, GenerateResponse } from \"ollama\";\nimport type { OllamaModel, OllamaRunningModel } from \"../types.js\";\nimport { withTimeout } from \"../utils.js\";\n\nconst client = new Ollama();\nconst DEFAULT_OLLAMA_HOST = \"http://127.0.0.1:11434\";\nconst OLLAMA_INIT_TIMEOUT_MS = 120_000;\nconst DEFAULT_STREAM_STALL_TIMEOUT_MS = 30_000;\nconst SHARED_STREAM_STALL_TIMEOUT_ENV = \"METRILLM_STREAM_STALL_TIMEOUT_MS\";\n\nfunction getOllamaBaseUrl(): string {\n const configured = process.env.OLLAMA_HOST?.trim();\n if (!configured) return DEFAULT_OLLAMA_HOST;\n const candidate = /^https?:\\/\\//i.test(configured) ? configured : `http://${configured}`;\n try {\n return new URL(candidate).toString();\n } catch {\n return DEFAULT_OLLAMA_HOST;\n }\n}\n\nexport async function getOllamaVersion(): Promise<string> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 5_000);\n try {\n const baseUrl = getOllamaBaseUrl();\n const url = new URL(\"/api/version\", baseUrl);\n const resp = await fetch(url, { signal: controller.signal });\n if (!resp.ok) return \"unknown\";\n const data = (await resp.json()) as { version?: string };\n return data.version ?? \"unknown\";\n } catch {\n return \"unknown\";\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport async function listModels(): Promise<OllamaModel[]> {\n const resp = await withTimeout(client.list(), OLLAMA_INIT_TIMEOUT_MS, \"Ollama list models\");\n return resp.models.map((m) => ({\n name: m.name,\n size: m.size,\n parameterSize: m.details?.parameter_size,\n quantization: m.details?.quantization_level,\n family: m.details?.family,\n modelFormat: \"gguf\",\n }));\n}\n\nexport async function listRunningModels(): Promise<OllamaRunningModel[]> {\n const resp = await withTimeout(client.ps(), OLLAMA_INIT_TIMEOUT_MS, \"Ollama list running models\");\n return resp.models.map((m) => ({\n name: m.name,\n size: m.size,\n vramUsed: m.size_vram,\n }));\n}\n\nexport interface GenerateResult {\n response: string;\n thinking?: string;\n totalDuration: number; // ns\n loadDuration: number; // ns\n promptEvalCount: number;\n promptEvalDuration: number; // ns\n evalCount: number;\n evalDuration: number; // ns\n evalCountEstimated?: boolean;\n}\n\nexport type KeepAliveValue = string | number;\n\nlet defaultKeepAlive: KeepAliveValue | undefined;\n\nexport function setDefaultKeepAlive(keepAlive?: KeepAliveValue): void {\n defaultKeepAlive = keepAlive;\n}\n\ninterface OllamaRequestOptions {\n temperature?: number;\n top_p?: number;\n seed?: number;\n num_predict?: number;\n keep_alive?: KeepAliveValue;\n think?: boolean;\n stall_timeout_ms?: number;\n}\n\nfunction hasSamplingOverrides(options?: OllamaRequestOptions): boolean {\n return options?.top_p !== undefined || options?.seed !== undefined;\n}\n\nfunction isUnsupportedSamplingOptionError(err: unknown): boolean {\n const message = err instanceof Error ? err.message : String(err);\n const lower = message.toLowerCase();\n const mentionsSampling = /\\b(seed|top_p|topp)\\b/.test(lower);\n if (!mentionsSampling) return false;\n return /unrecognized|unknown|not support|unsupported|invalid|unexpected|additional|extra/.test(lower);\n}\n\nfunction parseNonNegativeInt(value: string): number | null {\n if (!/^\\d+$/.test(value)) return null;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isSafeInteger(parsed) || parsed < 0) return null;\n return parsed;\n}\n\nfunction resolveStreamStallTimeoutMs(override?: number): number | undefined {\n if (override !== undefined) {\n if (!Number.isFinite(override) || override < 0) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n return override === 0 ? undefined : Math.trunc(override);\n }\n\n const configured = process.env[SHARED_STREAM_STALL_TIMEOUT_ENV]?.trim();\n if (!configured) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n const parsed = parseNonNegativeInt(configured);\n if (parsed === null) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n return parsed === 0 ? undefined : parsed;\n}\n\nfunction buildGenerateRequest(\n model: string,\n prompt: string,\n options: OllamaRequestOptions | undefined,\n includeSampling: boolean\n): GenerateRequest & { stream: true } {\n return {\n model,\n prompt,\n stream: true,\n keep_alive: options?.keep_alive ?? defaultKeepAlive,\n ...(options?.think !== undefined ? { think: options.think } : {}),\n options: {\n temperature: options?.temperature ?? 0,\n ...(includeSampling && options?.top_p !== undefined ? { top_p: options.top_p } : {}),\n ...(includeSampling && options?.seed !== undefined ? { seed: options.seed } : {}),\n num_predict: options?.num_predict ?? 512,\n },\n };\n}\n\nexport async function generate(\n model: string,\n prompt: string,\n options?: OllamaRequestOptions\n): Promise<GenerateResult> {\n return generateStream(model, prompt, undefined, options);\n}\n\nexport interface StreamCallbacks {\n onFirstChunk?: () => void;\n onToken?: (token: string) => void;\n onDone?: (result: GenerateResult) => void;\n}\n\nexport async function generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n options?: OllamaRequestOptions\n): Promise<GenerateResult> {\n const stallTimeoutMs = resolveStreamStallTimeoutMs(options?.stall_timeout_ms);\n let abortedByStallTimeout = false;\n const initializeStream = (includeSampling: boolean) =>\n withTimeout(\n client.generate(buildGenerateRequest(model, prompt, options, includeSampling)),\n OLLAMA_INIT_TIMEOUT_MS,\n \"Ollama generate initialization\"\n );\n\n let stream: AbortableAsyncIterator<GenerateResponse>;\n try {\n stream = await initializeStream(true);\n } catch (err) {\n if (hasSamplingOverrides(options) && isUnsupportedSamplingOptionError(err)) {\n stream = await initializeStream(false);\n } else {\n throw err;\n }\n }\n\n let fullResponse = \"\";\n let fullThinking = \"\";\n let result: GenerateResult | null = null;\n let firstChunkSeen = false;\n\n // Stall detection: abort if no chunk arrives within configured timeout.\n let stallTimer: ReturnType<typeof setTimeout> | null = null;\n const resetStallTimer = () => {\n if (stallTimeoutMs === undefined) return;\n if (stallTimer) clearTimeout(stallTimer);\n stallTimer = setTimeout(() => {\n abortedByStallTimeout = true;\n client.abort();\n }, stallTimeoutMs);\n };\n\n try {\n resetStallTimer();\n for await (const chunk of stream) {\n resetStallTimer();\n if (!firstChunkSeen) {\n firstChunkSeen = true;\n callbacks?.onFirstChunk?.();\n }\n const chunkAny = chunk as unknown as Record<string, unknown>;\n if (chunkAny.thinking) {\n fullThinking += String(chunkAny.thinking);\n }\n if (chunk.response) {\n fullResponse += chunk.response;\n callbacks?.onToken?.(chunk.response);\n }\n if (chunk.done) {\n result = {\n response: fullResponse,\n ...(fullThinking ? { thinking: fullThinking } : {}),\n totalDuration: chunk.total_duration ?? 0,\n loadDuration: chunk.load_duration ?? 0,\n promptEvalCount: chunk.prompt_eval_count ?? 0,\n promptEvalDuration: chunk.prompt_eval_duration ?? 0,\n evalCount: chunk.eval_count ?? 0,\n evalDuration: chunk.eval_duration ?? 0,\n };\n }\n }\n } finally {\n if (stallTimer) clearTimeout(stallTimer);\n }\n\n if (!result) {\n if (abortedByStallTimeout && stallTimeoutMs !== undefined) {\n throw new Error(`Ollama stream timed out after ${stallTimeoutMs}ms`);\n }\n throw new Error(\"Stream ended without done signal\");\n }\n\n callbacks?.onDone?.(result);\n return result;\n}\n\nexport async function unloadModel(model: string): Promise<void> {\n await withTimeout(\n client.generate({\n model,\n prompt: \"\",\n stream: false,\n keep_alive: 0,\n options: {\n temperature: 0,\n num_predict: 0,\n },\n }),\n OLLAMA_INIT_TIMEOUT_MS,\n \"Ollama unload model\"\n );\n}\n\nexport function abortOngoingRequests(): void {\n client.abort();\n}\n","import vm from \"node:vm\";\nimport { execFile, spawn } from \"node:child_process\";\n\nexport function openUrl(url: string): void {\n if (process.platform === \"win32\") {\n // `start` is a cmd built-in (not an executable), so we invoke it via cmd.exe.\n const child = spawn(\"cmd\", [\"/c\", \"start\", \"\", url], {\n windowsHide: true,\n stdio: \"ignore\",\n });\n child.on(\"error\", () => {\n // Best-effort only.\n });\n child.unref();\n return;\n }\n\n const cmd = process.platform === \"darwin\" ? \"open\" : \"xdg-open\";\n const child = execFile(cmd, [url]);\n child.on(\"error\", () => {\n // Best-effort only.\n });\n}\n\nexport function avg(nums: number[]): number {\n if (nums.length === 0) return 0;\n return nums.reduce((a, b) => a + b, 0) / nums.length;\n}\n\nexport function stddev(nums: number[]): number {\n if (nums.length < 2) return 0;\n const mean = avg(nums);\n const variance = nums.reduce((sum, v) => sum + (v - mean) ** 2, 0) / nums.length;\n return Math.sqrt(variance);\n}\n\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return \"0 B\";\n if (bytes === 0) return \"0 B\";\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\"];\n const i = Math.min(\n Math.floor(Math.log(bytes) / Math.log(1024)),\n units.length - 1\n );\n const value = bytes / Math.pow(1024, i);\n return `${value.toFixed(1)} ${units[i]}`;\n}\n\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${Math.round(ms)}ms`;\n if (ms < 60_000) return `${(ms / 1000).toFixed(1)}s`;\n const mins = Math.floor(ms / 60_000);\n const secs = Math.floor((ms % 60_000) / 1000);\n return `${mins}m${secs}s`;\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n if (Number.isNaN(value)) return min;\n return Math.min(Math.max(value, min), max);\n}\n\nexport function sanitizeNonNegative(value: number, fallback: number): number {\n if (!Number.isFinite(value) || value < 0) return fallback;\n return value;\n}\n\nexport function lerp(value: number, inMin: number, inMax: number, outMin: number, outMax: number): number {\n if (inMax === inMin) return outMin;\n const t = clamp((value - inMin) / (inMax - inMin), 0, 1);\n return outMin + t * (outMax - outMin);\n}\n\nexport function withTimeout<T>(\n promise: Promise<T>,\n ms: number,\n label = \"Operation\",\n onTimeout?: () => void\n): Promise<T> {\n return new Promise((resolve, reject) => {\n let settled = false;\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n try {\n onTimeout?.();\n } catch {\n // Ignore timeout cleanup errors and preserve timeout as root cause\n }\n reject(new Error(`${label} timed out after ${formatDuration(ms)}`));\n }, ms);\n promise\n .then((v) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(v);\n })\n .catch((e) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n reject(e);\n });\n });\n}\n\nexport function isTimeoutError(err: unknown): boolean {\n return err instanceof Error && /timed out after/i.test(err.message);\n}\n\nexport function toBenchmarkFailureLabel(err: unknown): string {\n if (isTimeoutError(err)) return \"TIMEOUT\";\n const message = err instanceof Error ? err.message : String(err);\n const compact = message.replace(/\\s+/g, \" \").trim();\n if (!compact) return \"ERROR\";\n const maxLen = 120;\n return compact.length > maxLen\n ? `ERROR: ${compact.slice(0, maxLen - 1)}…`\n : `ERROR: ${compact}`;\n}\n\n/**\n * Strip <think>...</think> blocks emitted by reasoning models (e.g. deepseek-r1).\n * Also strips trailing chat-template tokens frequently emitted by local runtimes.\n */\nexport function stripThinkTags(text: string): string {\n // Handle <think>...</think> and <thinking>...</thinking>\n const withoutThinking = text.replace(/<think(?:ing)?[\\s>][\\s\\S]*?<\\/think(?:ing)?>/gi, \"\");\n const withoutTrailingWhitespace = withoutThinking.trimEnd();\n\n // Some backends return chat delimiter tokens in final text; keep only semantic content.\n const withoutTrailingControlTokens = withoutTrailingWhitespace.replace(\n /(?:\\s*(?:<\\|(?:im_end|eot_id|end_of_text|eom_id|end)\\|>|<\\/s>))+$/gi,\n \"\"\n );\n\n return withoutTrailingControlTokens.trim();\n}\n\nexport function hasThinkingContent(response: string, thinkingField?: string): boolean {\n if (thinkingField && thinkingField.trim().length > 0) return true;\n if (/<think(?:ing)?[\\s>]/i.test(response)) return true;\n // Some runtimes emit plain-text reasoning headers instead of dedicated fields/tags.\n return /^\\s*(?:thinking|thought)\\s+process\\s*:/i.test(response);\n}\n\nexport function estimateTokenCount(text: string): number {\n if (!text) return 0;\n return text.split(/\\s+/).filter(Boolean).length;\n}\n\nexport function extractNumber(text: string): number | null {\n const numberPattern = /[-+]?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?(?:e[-+]?\\d+)?/i;\n const numberPatternGlobal = /[-+]?(?:\\d{1,3}(?:,\\d{3})+|\\d+)(?:\\.\\d+)?(?:e[-+]?\\d+)?/gi;\n const parseNumericToken = (token: string): number | null => {\n const normalized = token.replace(/,/g, \"\");\n const parsed = Number.parseFloat(normalized);\n return Number.isFinite(parsed) ? parsed : null;\n };\n\n // Try common patterns in order of specificity\n\n // \"The answer is X\" pattern\n const answerMatch = text.match(\n new RegExp(`(?:answer|result|total|equals?)\\\\s*(?:is|:)?\\\\s*(${numberPattern.source})`, \"i\")\n );\n if (answerMatch) {\n return parseNumericToken(answerMatch[1]);\n }\n\n // Last number in the text (most likely to be the final answer)\n const allNumbers = text.match(numberPatternGlobal);\n if (allNumbers && allNumbers.length > 0) {\n return parseNumericToken(allNumbers[allNumbers.length - 1]);\n }\n\n return null;\n}\n\nexport function extractChoice(text: string): string | null {\n // Extract a single letter choice (A, B, C, D) from model output\n const cleaned = text.trim();\n\n // Direct single letter\n if (/^[A-D]$/i.test(cleaned)) return cleaned.toUpperCase();\n\n // \"The answer is X\" or \"answer: X\" pattern\n const answerMatch = cleaned.match(/(?:the\\s+)?answer\\s+is\\s+([A-D])\\b/i);\n if (answerMatch) return answerMatch[1].toUpperCase();\n\n // \"Option X\" / \"Choice X\" pattern\n const optionMatch = cleaned.match(/(?:option|choice)\\s*[:\\-]?\\s*([A-D])\\b/i);\n if (optionMatch) return optionMatch[1].toUpperCase();\n\n // \"X)\" or \"X.\" or \"X:\" at start of text (common model response format)\n const prefixMatch = cleaned.match(/^([A-D])[).:](?!\\w)/i);\n if (prefixMatch) return prefixMatch[1].toUpperCase();\n\n // \"I choose B\", \"my answer: C\", \"final answer D\"\n const decisionMatch = cleaned.match(\n /\\b(?:choose|chosen|pick|picked|answer|final answer)\\b[\\s:=\\-]*(?:option|choice)?[\\s:=\\-]*([A-D])\\b/i\n );\n if (decisionMatch) return decisionMatch[1].toUpperCase();\n\n // Last standalone choice at end of response.\n const endMatch = cleaned.match(/\\b([A-D])\\b[\\s.!?]*$/i);\n if (endMatch) return endMatch[1].toUpperCase();\n\n return null;\n}\n\nfunction stripInterfaceDeclarations(code: string): string {\n const interfaceRe = /^\\s*(?:export\\s+)?interface\\s+\\w+(?:<[^>]*>)?\\s*\\{/gm;\n let match: RegExpExecArray | null;\n const ranges: [number, number][] = [];\n while ((match = interfaceRe.exec(code)) !== null) {\n const start = match.index;\n let depth = 0;\n let end = -1;\n for (let i = start + match[0].length - 1; i < code.length; i++) {\n if (code[i] === \"{\") depth++;\n else if (code[i] === \"}\") {\n depth--;\n if (depth === 0) {\n end = i + 1;\n break;\n }\n }\n }\n if (end !== -1) ranges.push([start, end]);\n }\n // Remove ranges in reverse to preserve indices\n let result = code;\n for (let i = ranges.length - 1; i >= 0; i--) {\n const [s, e] = ranges[i];\n result = result.slice(0, s) + result.slice(e);\n }\n return result;\n}\n\n/**\n * Strip TypeScript type annotations from code so it can run in a plain JS vm.Script.\n * Only strips if the code does NOT compile as-is (avoids mangling valid JS).\n */\nexport function stripTypeAnnotations(code: string): string {\n // If it already compiles as JS, leave it alone.\n try {\n new vm.Script(`${code}\\n;`);\n return code;\n } catch {\n // needs stripping\n }\n\n // Strategy 1 (opt-in): Node 22.6+ built-in TS stripping.\n // Disabled by default because Node currently emits an ExperimentalWarning.\n if (process.env.METRILLM_ENABLE_EXPERIMENTAL_TS_STRIP === \"1\") {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const mod = require(\"node:module\") as { stripTypeScriptTypes?: (code: string) => string };\n if (typeof mod.stripTypeScriptTypes === \"function\") {\n const stripped = mod.stripTypeScriptTypes(code);\n try {\n new vm.Script(`${stripped}\\n;`);\n return stripped;\n } catch {\n // stripTypeScriptTypes may fail on TS enums etc., fall through\n }\n }\n } catch {\n // node:module API not available, fall through\n }\n }\n\n // Strategy 2: Regex fallback for common LLM-generated TS patterns\n let result = code;\n\n // Remove interface declarations (handles nested braces via balanced counting)\n result = stripInterfaceDeclarations(result);\n // Remove type alias declarations\n result = result.replace(/^\\s*(?:export\\s+)?type\\s+\\w+(?:<[^>]*>)?\\s*=\\s*[^;]+;\\s*$/gm, \"\");\n\n // Strip generic type params on function declarations: function foo<T, U>( → function foo(\n result = result.replace(/(function\\s+\\w+)\\s*<[^>]+>/g, \"$1\");\n\n // Strip generic type params on arrow const: const foo = <T>( → const foo = (\n result = result.replace(/((?:const|let|var)\\s+\\w+\\s*=\\s*)<[^>]+>\\s*\\(/g, \"$1(\");\n\n // Strip return type annotations: ): Type { → ) { and ): Type => → ) =>\n // Supports generic types like Record<string, string[]> by consuming balanced <>\n result = result.replace(/\\)\\s*:\\s*(?:[^=>{,()]|<[^>]*>)+(?=\\s*\\{)/g, \")\");\n result = result.replace(/\\)\\s*:\\s*(?:[^=>{,()]|<[^>]*>)+(?=\\s*=>)/g, \")\");\n\n // Strip parameter type annotations: (a: string, b: number) → (a, b)\n // Only match identifier followed by colon (not destructured objects like {a: 1})\n result = result.replace(/(\\((?:[^()]*\\([^()]*\\))*[^()]*\\))/g, (parenBlock) => {\n return parenBlock.replace(/([A-Za-z_$]\\w*)\\s*:\\s*(?:[^,)=]|<[^>]*>)+/g, (m, name, mOffset) => {\n // Skip if this looks like an object literal key (preceded by { or ,)\n const before = parenBlock.slice(0, mOffset).trimEnd();\n if (before.endsWith(\"{\") || before.endsWith(\",\")) {\n // Could be inside destructured default value — leave it alone\n const afterOpen = parenBlock.lastIndexOf(\"{\", mOffset);\n const afterClose = parenBlock.lastIndexOf(\"}\", mOffset);\n if (afterOpen > afterClose) return m; // inside an object literal\n }\n return name;\n });\n });\n\n // Strip variable type annotations: const x: string = → const x =\n result = result.replace(/((?:const|let|var)\\s+\\w+)\\s*:\\s*(?:[^=;]|<[^>]*>)+(?=\\s*=)/g, \"$1\");\n\n // Strip 'as Type' casts\n result = result.replace(/\\s+as\\s+(?:\\w+(?:<[^>]*>)?(?:\\[\\])*)/g, \"\");\n\n // Strip non-null assertion operator: x!. → x.\n result = result.replace(/(\\w)!\\./g, \"$1.\");\n\n // Check if the stripped version compiles\n try {\n new vm.Script(`${result}\\n;`);\n return result;\n } catch {\n // Regex stripping wasn't enough, return original (will fail in sandbox but\n // that's the same behavior as before this feature)\n return code;\n }\n}\n\nexport function extractCodeBlock(text: string, preferredFunctionName?: string): string {\n const isValidSnippet = (snippet: string): boolean => {\n if (!snippet) return false;\n try {\n new vm.Script(`${snippet}\\n;`);\n return true;\n } catch {\n return false;\n }\n };\n\n function extractBalancedBlock(startIndex: number): string | null {\n const openIndex = text.indexOf(\"{\", startIndex);\n if (openIndex === -1) return null;\n\n let depth = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let inLineComment = false;\n let inBlockComment = false;\n let escaped = false;\n\n for (let i = openIndex; i < text.length; i++) {\n const ch = text[i];\n const next = i + 1 < text.length ? text[i + 1] : \"\";\n\n if (inLineComment) {\n if (ch === \"\\n\") inLineComment = false;\n continue;\n }\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (inSingle) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"'\") inSingle = false;\n continue;\n }\n\n if (inDouble) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"\\\"\") inDouble = false;\n continue;\n }\n\n if (inTemplate) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"`\") inTemplate = false;\n continue;\n }\n\n if (ch === \"/\" && next === \"/\") {\n inLineComment = true;\n i++;\n continue;\n }\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n\n if (ch === \"'\") {\n inSingle = true;\n continue;\n }\n if (ch === \"\\\"\") {\n inDouble = true;\n continue;\n }\n if (ch === \"`\") {\n inTemplate = true;\n continue;\n }\n\n if (ch === \"{\") {\n depth++;\n continue;\n }\n if (ch === \"}\") {\n depth--;\n if (depth === 0) {\n return text.slice(startIndex, i + 1).trim();\n }\n }\n }\n\n return null;\n }\n\n function extractArrowExpression(startIndex: number): string | null {\n const header = /(?:const|let|var)\\s+\\w+\\s*=\\s*(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>\\s*/;\n const head = header.exec(text.slice(startIndex));\n if (!head) return null;\n\n let i = startIndex + head[0].length;\n let parenDepth = 0;\n let bracketDepth = 0;\n let braceDepth = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let inLineComment = false;\n let inBlockComment = false;\n let escaped = false;\n\n for (; i < text.length; i++) {\n const ch = text[i];\n const next = i + 1 < text.length ? text[i + 1] : \"\";\n\n if (inLineComment) {\n if (ch === \"\\n\") inLineComment = false;\n continue;\n }\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (inSingle) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"'\") inSingle = false;\n continue;\n }\n\n if (inDouble) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"\\\"\") inDouble = false;\n continue;\n }\n\n if (inTemplate) {\n if (escaped) {\n escaped = false;\n continue;\n }\n if (ch === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (ch === \"`\") inTemplate = false;\n continue;\n }\n\n if (ch === \"/\" && next === \"/\") {\n inLineComment = true;\n i++;\n continue;\n }\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n\n if (ch === \"'\") {\n inSingle = true;\n continue;\n }\n if (ch === \"\\\"\") {\n inDouble = true;\n continue;\n }\n if (ch === \"`\") {\n inTemplate = true;\n continue;\n }\n\n if (ch === \"(\") parenDepth++;\n else if (ch === \")\") parenDepth = Math.max(0, parenDepth - 1);\n else if (ch === \"[\") bracketDepth++;\n else if (ch === \"]\") bracketDepth = Math.max(0, bracketDepth - 1);\n else if (ch === \"{\") braceDepth++;\n else if (ch === \"}\") braceDepth = Math.max(0, braceDepth - 1);\n\n if (parenDepth === 0 && bracketDepth === 0 && braceDepth === 0) {\n if (ch === \";\") {\n const candidate = text.slice(startIndex, i + 1).trim();\n if (isValidSnippet(candidate)) return candidate;\n }\n if (ch === \"\\n\") {\n const candidate = text.slice(startIndex, i).trim();\n if (isValidSnippet(candidate)) return candidate;\n }\n if (ch === \" \" && /[A-Za-z]/.test(next)) {\n // Typical model pattern: \"const f = x => x + 1 and ...\".\n const candidate = text.slice(startIndex, i).trim();\n if (isValidSnippet(candidate)) return candidate;\n }\n }\n }\n\n const tail = text.slice(startIndex).trim();\n return isValidSnippet(tail) ? tail : null;\n }\n\n // Extract code from markdown code block (prefer this, most reliable)\n const match = text.match(/```(?:javascript|js|typescript|ts)?\\s*\\n([\\s\\S]*?)```/);\n if (match) return match[1].trim();\n\n // Generic code block\n const genericMatch = text.match(/```\\s*\\n([\\s\\S]*?)```/);\n if (genericMatch) return genericMatch[1].trim();\n\n const escapeRegex = (value: string): string =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n // When we know the expected function name, prefer extracting that exact symbol.\n if (preferredFunctionName) {\n const fnName = escapeRegex(preferredFunctionName);\n\n const namedFunctionStart = text.search(\n new RegExp(`function\\\\s+${fnName}\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{`)\n );\n if (namedFunctionStart !== -1) {\n const extracted = extractBalancedBlock(namedFunctionStart);\n if (extracted) return extracted;\n }\n\n const namedArrowBlockStart = text.search(\n new RegExp(\n `(?:const|let|var)\\\\s+${fnName}\\\\s*=\\\\s*(?:\\\\([^)]*\\\\)|[A-Za-z_$][\\\\w$]*)\\\\s*=>\\\\s*\\\\{`\n )\n );\n if (namedArrowBlockStart !== -1) {\n const extracted = extractBalancedBlock(namedArrowBlockStart);\n if (extracted) return extracted;\n }\n\n const namedArrowExprStart = text.search(\n new RegExp(\n `(?:const|let|var)\\\\s+${fnName}\\\\s*=\\\\s*(?:\\\\([^)]*\\\\)|[A-Za-z_$][\\\\w$]*)\\\\s*=>\\\\s*(?!\\\\{)`\n )\n );\n if (namedArrowExprStart !== -1) {\n const extracted = extractArrowExpression(namedArrowExprStart);\n if (extracted) return extracted;\n }\n\n const namedFunctionExprStart = text.search(\n new RegExp(`(?:const|let|var)\\\\s+${fnName}\\\\s*=\\\\s*function\\\\s*\\\\([^)]*\\\\)\\\\s*\\\\{`)\n );\n if (namedFunctionExprStart !== -1) {\n const extracted = extractBalancedBlock(namedFunctionExprStart);\n if (extracted) return extracted;\n }\n }\n\n // If no code block, try to find a function declaration with balanced braces.\n const funcStart = text.search(/function\\s+\\w+\\s*\\([^)]*\\)\\s*\\{/);\n if (funcStart !== -1) {\n const extracted = extractBalancedBlock(funcStart);\n if (extracted) return extracted;\n }\n\n // Try arrow function with block body and balanced braces.\n const arrowStart = text.search(/(?:const|let|var)\\s+\\w+\\s*=\\s*(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>\\s*\\{/);\n if (arrowStart !== -1) {\n const extracted = extractBalancedBlock(arrowStart);\n if (extracted) return extracted;\n }\n\n // Try arrow function with expression body.\n const arrowExprStart = text.search(/(?:const|let|var)\\s+\\w+\\s*=\\s*(?:\\([^)]*\\)|[A-Za-z_$][\\w$]*)\\s*=>\\s*(?!\\{)/);\n if (arrowExprStart !== -1) {\n const extracted = extractArrowExpression(arrowExprStart);\n if (extracted) return extracted;\n }\n\n // Try function expression assignment: const fn = function(...) { ... }\n const functionExprStart = text.search(/(?:const|let|var)\\s+\\w+\\s*=\\s*function\\s*\\([^)]*\\)\\s*\\{/);\n if (functionExprStart !== -1) {\n const extracted = extractBalancedBlock(functionExprStart);\n if (extracted) return extracted;\n }\n\n return text.trim();\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport { promises as fs } from \"node:fs\";\nimport type { Dirent } from \"node:fs\";\nimport { execFile } from \"node:child_process\";\nimport type { OllamaModel, OllamaRunningModel } from \"../types.js\";\nimport type { GenerateResult, KeepAliveValue, StreamCallbacks } from \"./ollama-client.js\";\nimport { estimateTokenCount } from \"../utils.js\";\n\nconst DEFAULT_LM_STUDIO_BASE_URL = \"http://127.0.0.1:1234\";\nconst LM_STUDIO_INIT_TIMEOUT_MS = 15_000;\nconst LM_STUDIO_METADATA_TIMEOUT_MS = 2_000;\nconst DEFAULT_STREAM_STALL_TIMEOUT_MS = 30_000;\nconst LM_STUDIO_CLI_TIMEOUT_MS = 8_000;\nconst SHARED_STREAM_STALL_TIMEOUT_ENV = \"METRILLM_STREAM_STALL_TIMEOUT_MS\";\nconst DEFAULT_LM_STUDIO_HOME_DIR = path.join(os.homedir(), \".lmstudio\");\nconst DEFAULT_LM_STUDIO_MODELS_DIR = path.join(DEFAULT_LM_STUDIO_HOME_DIR, \"models\");\nconst LM_STUDIO_HOME_DIR_ENV = \"LM_STUDIO_HOME_DIR\";\nconst LM_STUDIO_MODELS_DIR_ENV = \"LM_STUDIO_MODELS_DIR\";\nconst LM_STUDIO_CLI_PATH_ENV = \"LM_STUDIO_CLI_PATH\";\n\nlet defaultKeepAlive: KeepAliveValue | undefined;\nconst activeAbortControllers = new Set<AbortController>();\nconst directorySizeCache = new Map<string, number>();\nconst modelDefinitionCache = new Map<string, LMStudioModelDefinition | null>();\n\ninterface LMStudioModelListResponse {\n data?: Array<{ id?: string }>;\n}\n\ninterface LMStudioApiModel {\n id?: string;\n arch?: string;\n type?: string;\n publisher?: string;\n compatibility_type?: string;\n quantization?: string;\n state?: string;\n size?: number;\n size_bytes?: number;\n model_size_bytes?: number;\n file_size_bytes?: number;\n bytes?: number;\n}\n\ninterface LMStudioApiModelListResponse {\n data?: LMStudioApiModel[];\n}\n\ninterface LMStudioLoadedModelCliEntry {\n modelKey?: string;\n path?: string;\n indexedModelIdentifier?: string;\n identifier?: string;\n contextLength?: number;\n}\n\ninterface LMStudioHistoricalVersionInfo {\n lastRecorderdAppVersion?: unknown;\n lastRecordedAppVersion?: unknown;\n lastRecordedAppBuildVersion?: unknown;\n}\n\ninterface LMStudioModelSource {\n user: string;\n repo: string;\n}\n\ninterface LMStudioModelDefinition {\n parameterSize?: string;\n sources: LMStudioModelSource[];\n}\n\ninterface LMStudioResolvedModelMetadata {\n size: number;\n parameterSize?: string;\n}\n\ninterface LMStudioNativeStats {\n input_tokens?: number;\n total_output_tokens?: number;\n reasoning_output_tokens?: number;\n tokens_per_second?: number;\n time_to_first_token_seconds?: number;\n model_load_time_seconds?: number;\n}\n\ninterface LMStudioNativeOutputItem {\n type?: string;\n content?: unknown;\n text?: unknown;\n}\n\ninterface LMStudioNativeChatResponse {\n output?: LMStudioNativeOutputItem[];\n stats?: LMStudioNativeStats;\n}\n\ninterface LMStudioNativeStreamEvent {\n type?: string;\n delta?: unknown;\n content?: unknown;\n text?: unknown;\n result?: LMStudioNativeChatResponse;\n stats?: LMStudioNativeStats;\n}\n\ninterface LMStudioRequestOptions {\n temperature?: number;\n top_p?: number;\n seed?: number;\n num_predict?: number;\n keep_alive?: KeepAliveValue;\n think?: boolean;\n stall_timeout_ms?: number;\n}\n\nconst NON_THINKING_SYSTEM_PROMPT = [\n \"You are in non-thinking mode for benchmark reproducibility.\",\n \"Return only the final answer.\",\n \"Do not output internal reasoning, chain-of-thought, or scratchpad.\",\n \"Never output tags or sections like <think>, </think>, [THINK], [/THINK], or Thinking Process.\",\n].join(\" \");\n\nfunction hasThinkingLeakText(response: string): boolean {\n return (\n /^\\s*(?:thinking|thought)\\s+process\\s*:/i.test(response)\n || /\\[(?:\\/)?THINK(?:ING)?\\]/i.test(response)\n );\n}\n\nfunction assertThinkingModeRespected(\n model: string,\n think: boolean | undefined,\n response: string,\n reasoning: string\n): void {\n if (think !== false) return;\n if (reasoning.trim().length > 0 || /<think(?:ing)?[\\s>]/i.test(response) || hasThinkingLeakText(response)) {\n throw new Error(\n [\n `LM Studio model \"${model}\" still emitted thinking content while non-thinking mode is requested.`,\n \"In LM Studio, add this at the top of the model chat template: {%- set enable_thinking = false %}.\",\n \"If this model does not expose a Prompt/Chat Template editor in LM Studio (e.g. some GPT-OSS builds), non-thinking mode cannot be enforced from the API.\",\n \"Use --thinking for this model, or benchmark a model/runtime that supports explicit non-thinking control.\",\n \"Then eject/reload the model and run the benchmark again.\",\n ].join(\" \")\n );\n }\n}\n\nfunction buildNativeThinkingOption(think?: boolean): \"high\" | undefined {\n if (think !== true) return undefined;\n return \"high\";\n}\n\nfunction hasSamplingOverrides(options?: LMStudioRequestOptions): boolean {\n return options?.top_p !== undefined || options?.seed !== undefined;\n}\n\nfunction isUnsupportedSamplingMessage(status: number, text: string): boolean {\n if (status !== 400 && status !== 422) return false;\n const lower = text.toLowerCase();\n const mentionsSampling = /\\b(seed|top_p|topp)\\b/.test(lower);\n if (!mentionsSampling) return false;\n return /unrecognized|unknown|not support|unsupported|invalid|unexpected|additional|extra/.test(lower);\n}\n\nfunction extractLMStudioErrorMessage(body: string): string {\n const trimmed = body.trim();\n if (!trimmed) return \"\";\n try {\n const parsed = JSON.parse(trimmed) as {\n error?: {\n message?: unknown;\n };\n };\n const message = parsed.error?.message;\n if (typeof message === \"string\" && message.trim().length > 0) {\n return message.trim();\n }\n } catch {\n // Fall back to raw response body text when payload is not JSON.\n }\n return trimmed;\n}\n\nfunction isModelLoadGuardrailError(message: string): boolean {\n const lower = message.toLowerCase();\n if (!lower.includes(\"failed to load model\")) return false;\n return (\n lower.includes(\"insufficient system resources\")\n || lower.includes(\"overload your system\")\n || lower.includes(\"loading guardrails\")\n );\n}\n\nfunction buildLMStudioRequestError(\n kind: \"generate\" | \"stream\",\n model: string,\n status: number,\n statusText: string,\n body: string\n): Error {\n const backendMessage = extractLMStudioErrorMessage(body);\n if (isModelLoadGuardrailError(backendMessage)) {\n return new Error(\n [\n `LM Studio could not load model \"${model}\" due to insufficient system resources (model loading guardrails).`,\n \"In LM Studio: unload other models, reduce loaded context length, or relax model loading guardrails in Settings.\",\n `Backend error: ${backendMessage}`,\n ].join(\" \")\n );\n }\n const suffix = backendMessage ? ` ${backendMessage}` : \"\";\n return new Error(`LM Studio ${kind} failed (${status} ${statusText})${suffix}`.trim());\n}\n\nfunction buildNativeChatBody(\n model: string,\n prompt: string,\n options: LMStudioRequestOptions | undefined,\n stream: boolean,\n includeSampling: boolean\n): Record<string, unknown> {\n const reasoning = buildNativeThinkingOption(options?.think);\n return {\n model,\n input: prompt,\n temperature: options?.temperature ?? 0,\n ...(includeSampling && options?.top_p !== undefined ? { top_p: options.top_p } : {}),\n ...(includeSampling && options?.seed !== undefined ? { seed: options.seed } : {}),\n max_tokens: options?.num_predict ?? 512,\n stream,\n ...(reasoning !== undefined ? { reasoning } : {}),\n ...(options?.think === false ? { system_prompt: NON_THINKING_SYSTEM_PROMPT } : {}),\n };\n}\n\nfunction getNativeStatNumber(value: unknown): number | undefined {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n return value;\n}\n\nfunction flattenNativeText(value: unknown, depth = 0): string {\n if (depth > 3 || value == null) return \"\";\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) {\n return value.map((item) => flattenNativeText(item, depth + 1)).join(\"\");\n }\n if (typeof value === \"object\") {\n const candidate = value as {\n text?: unknown;\n content?: unknown;\n delta?: unknown;\n value?: unknown;\n };\n return (\n flattenNativeText(candidate.text, depth + 1)\n || flattenNativeText(candidate.content, depth + 1)\n || flattenNativeText(candidate.delta, depth + 1)\n || flattenNativeText(candidate.value, depth + 1)\n );\n }\n return \"\";\n}\n\nfunction collectNativeOutput(\n output: unknown\n): { response: string; reasoning: string } {\n if (!Array.isArray(output)) {\n return { response: \"\", reasoning: \"\" };\n }\n\n let response = \"\";\n let reasoning = \"\";\n for (const item of output) {\n if (typeof item !== \"object\" || item === null) continue;\n const nativeItem = item as LMStudioNativeOutputItem;\n const text = flattenNativeText(nativeItem.text ?? nativeItem.content).trim();\n if (!text) continue;\n const type = asNonEmptyString(nativeItem.type)?.toLowerCase() ?? \"\";\n if (type.includes(\"reason\")) {\n reasoning += text;\n } else {\n response += text;\n }\n }\n\n return { response, reasoning };\n}\n\nfunction extractNativeStats(payload: unknown): LMStudioNativeStats | undefined {\n if (typeof payload !== \"object\" || payload === null) return undefined;\n const direct = (payload as { stats?: LMStudioNativeStats }).stats;\n if (direct) return direct;\n const result = (payload as { result?: { stats?: LMStudioNativeStats } }).result?.stats;\n return result;\n}\n\nfunction extractNativeResponse(payload: unknown): { response: string; reasoning: string } {\n if (typeof payload !== \"object\" || payload === null) {\n return { response: \"\", reasoning: \"\" };\n }\n\n const resultOutput = (payload as { result?: LMStudioNativeChatResponse }).result?.output;\n const directOutput = (payload as LMStudioNativeChatResponse).output;\n const fromResult = collectNativeOutput(resultOutput);\n if (fromResult.response || fromResult.reasoning) return fromResult;\n return collectNativeOutput(directOutput);\n}\n\nfunction extractNativeDelta(payload: LMStudioNativeStreamEvent): { response: string; reasoning: string } {\n if (typeof payload !== \"object\" || payload === null) {\n return { response: \"\", reasoning: \"\" };\n }\n\n const type = asNonEmptyString(payload.type)?.toLowerCase() ?? \"\";\n const directText = flattenNativeText(payload.delta);\n const fallbackText =\n directText\n || flattenNativeText(payload.content)\n || flattenNativeText(payload.text);\n if (!fallbackText) {\n return { response: \"\", reasoning: \"\" };\n }\n\n if (type.includes(\"reason\")) {\n return { response: \"\", reasoning: fallbackText };\n }\n if (type.includes(\"message\") || type.includes(\"text\") || type.includes(\"content\")) {\n return { response: fallbackText, reasoning: \"\" };\n }\n\n return { response: fallbackText, reasoning: \"\" };\n}\n\nfunction parseNonNegativeInt(value: string): number | null {\n if (!/^\\d+$/.test(value)) return null;\n const parsed = Number.parseInt(value, 10);\n if (!Number.isSafeInteger(parsed) || parsed < 0) return null;\n return parsed;\n}\n\nfunction resolveStreamStallTimeoutMs(override?: number): number | undefined {\n if (override !== undefined) {\n if (!Number.isFinite(override) || override < 0) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n return override === 0 ? undefined : Math.trunc(override);\n }\n\n const configured = process.env[SHARED_STREAM_STALL_TIMEOUT_ENV]?.trim();\n if (!configured) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n const parsed = parseNonNegativeInt(configured);\n if (parsed === null) return DEFAULT_STREAM_STALL_TIMEOUT_MS;\n return parsed === 0 ? undefined : parsed;\n}\n\nfunction getLMStudioBaseUrl(): string {\n const configured = process.env.LM_STUDIO_BASE_URL?.trim();\n if (!configured) return DEFAULT_LM_STUDIO_BASE_URL;\n const candidate = /^https?:\\/\\//i.test(configured) ? configured : `http://${configured}`;\n try {\n return new URL(candidate).toString();\n } catch {\n return DEFAULT_LM_STUDIO_BASE_URL;\n }\n}\n\nfunction getLMStudioHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n const apiKey = process.env.LM_STUDIO_API_KEY?.trim();\n if (apiKey) {\n headers.Authorization = `Bearer ${apiKey}`;\n }\n return headers;\n}\n\nfunction getUsageTokenCount(value: unknown): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return 0;\n if (value <= 0) return 0;\n return Math.trunc(value);\n}\n\nfunction estimateCompletionTokensFallback(text: string): number {\n const normalized = text.trim();\n if (!normalized) return 0;\n\n // CJK-like scripts often have sparse/no whitespace, so whitespace tokenization\n // underestimates badly. Count those codepoints directly and estimate the rest.\n const cjkMatches = normalized.match(/[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Hangul}]/gu);\n const cjkCount = cjkMatches?.length ?? 0;\n const withoutCjk = normalized.replace(\n /[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Hangul}]/gu,\n \"\"\n );\n const nonCjkChars = withoutCjk.replace(/\\s+/g, \"\").length;\n const nonCjkHeuristic = Math.ceil(nonCjkChars / 4);\n const whitespaceEstimate = estimateTokenCount(normalized);\n\n return Math.max(1, Math.max(whitespaceEstimate, cjkCount + nonCjkHeuristic));\n}\n\nfunction resolveCompletionTokenCount(\n reportedTokenCount: number | undefined,\n response: string,\n reasoning: string\n): number {\n const reported = getUsageTokenCount(reportedTokenCount);\n if (reported > 0) return reported;\n return estimateCompletionTokensFallback(`${reasoning} ${response}`);\n}\n\nfunction asNonEmptyString(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction stripOptionalQuotes(value: string): string {\n const trimmed = value.trim();\n return trimmed.replace(/^[\"']|[\"']$/g, \"\").trim();\n}\n\nfunction normalizeToken(value: string | undefined): string {\n return (value ?? \"\").toLowerCase().replace(/[^a-z0-9]+/g, \"\");\n}\n\nfunction tokenizeModelName(value: string): string[] {\n return value\n .toLowerCase()\n .split(/[^a-z0-9]+/g)\n .map((token) => token.trim())\n .filter((token) => token.length >= 3 && /[a-z]/.test(token));\n}\n\nfunction getLMStudioHomeDir(): string {\n const fromEnv = process.env[LM_STUDIO_HOME_DIR_ENV]?.trim();\n if (!fromEnv) return DEFAULT_LM_STUDIO_HOME_DIR;\n if (fromEnv.startsWith(\"~\")) {\n return path.join(os.homedir(), fromEnv.slice(1));\n }\n return fromEnv;\n}\n\nasync function pathIsDirectory(targetPath: string): Promise<boolean> {\n try {\n const stat = await fs.stat(targetPath);\n return stat.isDirectory();\n } catch (_err: unknown) {\n return false;\n }\n}\n\nasync function loadHubModelDefinition(modelId: string): Promise<LMStudioModelDefinition | null> {\n if (modelDefinitionCache.has(modelId)) {\n return modelDefinitionCache.get(modelId) ?? null;\n }\n\n const [publisher, modelName] = modelId.split(\"/\", 2);\n if (!publisher || !modelName) {\n modelDefinitionCache.set(modelId, null);\n return null;\n }\n\n const yamlPath = path.join(getLMStudioHomeDir(), \"hub\", \"models\", publisher, modelName, \"model.yaml\");\n let content = \"\";\n try {\n content = await fs.readFile(yamlPath, \"utf8\");\n } catch {\n modelDefinitionCache.set(modelId, null);\n return null;\n }\n\n const sourcePattern = /user:\\s*([^\\n#]+?)\\s*(?:\\r?\\n)\\s*repo:\\s*([^\\n#]+?)\\s*(?:\\r?\\n|$)/g;\n const sourceMap = new Map<string, LMStudioModelSource>();\n let sourceMatch: RegExpExecArray | null = null;\n while ((sourceMatch = sourcePattern.exec(content)) !== null) {\n const user = stripOptionalQuotes(sourceMatch[1] ?? \"\");\n const repo = stripOptionalQuotes(sourceMatch[2] ?? \"\");\n if (!user || !repo) continue;\n sourceMap.set(`${user}/${repo}`, { user, repo });\n }\n\n const paramsPattern = /paramsStrings:\\s*(?:\\r?\\n)\\s*-\\s*([^\\n#]+)/;\n const paramsMatch = paramsPattern.exec(content);\n const parameterSize = paramsMatch?.[1] ? stripOptionalQuotes(paramsMatch[1]) : undefined;\n\n const definition: LMStudioModelDefinition = {\n parameterSize: parameterSize || undefined,\n sources: Array.from(sourceMap.values()),\n };\n modelDefinitionCache.set(modelId, definition);\n return definition;\n}\n\nasync function readDirectorySizeBytes(dirPath: string): Promise<number> {\n const cached = directorySizeCache.get(dirPath);\n if (cached !== undefined) return cached;\n\n let total = 0;\n const queue: string[] = [dirPath];\n while (queue.length > 0) {\n const current = queue.pop();\n if (!current) continue;\n\n let entries: Dirent[] = [];\n try {\n entries = await fs.readdir(current, { withFileTypes: true });\n } catch {\n continue;\n }\n\n for (const entry of entries) {\n if (entry.isSymbolicLink()) continue;\n const fullPath = path.join(current, entry.name);\n if (entry.isDirectory()) {\n queue.push(fullPath);\n continue;\n }\n if (!entry.isFile()) continue;\n try {\n const stat = await fs.stat(fullPath);\n total += stat.size;\n } catch {\n // Ignore transient file read errors.\n }\n }\n }\n\n directorySizeCache.set(dirPath, total);\n return total;\n}\n\nfunction scoreModelSourceCandidate(\n source: LMStudioModelSource,\n modelId: string,\n apiModel: LMStudioApiModel | undefined\n): number {\n const repoToken = normalizeToken(source.repo);\n let score = 0;\n\n const quantToken = normalizeToken(apiModel?.quantization);\n if (quantToken && repoToken.includes(quantToken)) score += 8;\n\n const compatibilityToken = normalizeToken(apiModel?.compatibility_type);\n if (compatibilityToken && repoToken.includes(compatibilityToken)) score += 4;\n\n const [, shortModelName] = modelId.split(\"/\", 2);\n const modelToken = normalizeToken(shortModelName ?? modelId);\n if (modelToken && repoToken.includes(modelToken)) score += 2;\n\n return score;\n}\n\nasync function resolveModelsRootDir(): Promise<string> {\n const fromEnv = process.env[LM_STUDIO_MODELS_DIR_ENV]?.trim();\n if (fromEnv) {\n if (fromEnv.startsWith(\"~\")) {\n return path.join(os.homedir(), fromEnv.slice(1));\n }\n return fromEnv;\n }\n\n const settingsCandidates = [\n path.join(getLMStudioHomeDir(), \"settings.json\"),\n path.join(os.homedir(), \"Library\", \"Application Support\", \"LM Studio\", \"settings.json\"),\n ];\n for (const settingsPath of settingsCandidates) {\n try {\n const content = await fs.readFile(settingsPath, \"utf8\");\n const parsed = JSON.parse(content) as { downloadsFolder?: unknown };\n const downloadsFolder = asNonEmptyString(parsed.downloadsFolder);\n if (downloadsFolder) {\n return downloadsFolder.startsWith(\"~\")\n ? path.join(os.homedir(), downloadsFolder.slice(1))\n : downloadsFolder;\n }\n } catch {\n // Try next location.\n }\n }\n\n return DEFAULT_LM_STUDIO_MODELS_DIR;\n}\n\nasync function listImmediateSubdirs(dirPath: string): Promise<string[]> {\n let entries: Dirent[] = [];\n try {\n entries = await fs.readdir(dirPath, { withFileTypes: true });\n } catch {\n return [];\n }\n return entries\n .filter((entry) => entry.isDirectory() && !entry.isSymbolicLink())\n .map((entry) => path.join(dirPath, entry.name));\n}\n\nasync function findPublisherDirs(rootDir: string, publisher: string): Promise<string[]> {\n const normalizedPublisher = normalizeToken(publisher);\n if (!normalizedPublisher) return [];\n const dirs = await listImmediateSubdirs(rootDir);\n return dirs.filter((dir) => normalizeToken(path.basename(dir)) === normalizedPublisher);\n}\n\nfunction scorePublisherModelCandidate(\n modelDirName: string,\n modelId: string,\n apiModel: LMStudioApiModel | undefined\n): number {\n const dirToken = normalizeToken(modelDirName);\n if (!dirToken) return 0;\n\n let score = 0;\n const idToken = normalizeToken(modelId);\n if (idToken && dirToken.includes(idToken)) score += 24;\n\n const [, shortModelName] = modelId.split(\"/\", 2);\n const shortToken = normalizeToken(shortModelName ?? modelId);\n if (shortToken && dirToken.includes(shortToken)) score += 16;\n\n for (const token of tokenizeModelName(shortModelName ?? modelId)) {\n if (dirToken.includes(token)) score += 3;\n }\n\n const quantToken = normalizeToken(apiModel?.quantization);\n if (quantToken && dirToken.includes(quantToken)) score += 6;\n\n const compatibilityToken = normalizeToken(apiModel?.compatibility_type);\n if (compatibilityToken && dirToken.includes(compatibilityToken)) score += 4;\n\n return score;\n}\n\nasync function resolvePublisherModelMetadata(\n modelId: string,\n apiModel: LMStudioApiModel | undefined,\n modelsRootDir: string\n): Promise<LMStudioResolvedModelMetadata> {\n const explicitPublisher = asNonEmptyString(apiModel?.publisher);\n const [publisherFromId] = modelId.split(\"/\", 1);\n const publisher = explicitPublisher ?? publisherFromId;\n if (!publisher) {\n return { size: 0, parameterSize: inferParameterSizeFromModelId(modelId) };\n }\n\n const bundledModelsDir = path.join(getLMStudioHomeDir(), \".internal\", \"bundled-models\");\n const roots = Array.from(new Set([modelsRootDir, bundledModelsDir]));\n\n const candidates: Array<{ fullPath: string; score: number }> = [];\n for (const root of roots) {\n const publisherDirs = await findPublisherDirs(root, publisher);\n for (const publisherDir of publisherDirs) {\n const modelDirs = await listImmediateSubdirs(publisherDir);\n if (modelDirs.length === 0) {\n candidates.push({\n fullPath: publisherDir,\n score: scorePublisherModelCandidate(path.basename(publisherDir), modelId, apiModel),\n });\n continue;\n }\n for (const modelDir of modelDirs) {\n candidates.push({\n fullPath: modelDir,\n score: scorePublisherModelCandidate(path.basename(modelDir), modelId, apiModel),\n });\n }\n }\n }\n\n if (candidates.length === 0) {\n return { size: 0, parameterSize: inferParameterSizeFromModelId(modelId) };\n }\n\n candidates.sort((a, b) => {\n const scoreDiff = b.score - a.score;\n if (scoreDiff !== 0) return scoreDiff;\n return a.fullPath.localeCompare(b.fullPath);\n });\n\n let bestSize = 0;\n for (const candidate of candidates) {\n const size = await readDirectorySizeBytes(candidate.fullPath);\n if (size > bestSize) bestSize = size;\n if (size > 0 && candidate.score > 0) {\n return { size, parameterSize: inferParameterSizeFromModelId(modelId) };\n }\n }\n\n return { size: bestSize, parameterSize: inferParameterSizeFromModelId(modelId) };\n}\n\nasync function resolveLocalModelMetadata(\n modelId: string,\n apiModel: LMStudioApiModel | undefined,\n modelsRootDir: string\n): Promise<LMStudioResolvedModelMetadata> {\n const definition = await loadHubModelDefinition(modelId);\n if (!definition) {\n return resolvePublisherModelMetadata(modelId, apiModel, modelsRootDir);\n }\n\n const installedSources: Array<LMStudioModelSource & { fullPath: string }> = [];\n for (const source of definition.sources) {\n const fullPath = path.join(modelsRootDir, source.user, source.repo);\n if (await pathIsDirectory(fullPath)) {\n installedSources.push({ ...source, fullPath });\n }\n }\n\n if (installedSources.length === 0) {\n const fallback = await resolvePublisherModelMetadata(modelId, apiModel, modelsRootDir);\n if (fallback.size > 0) {\n return {\n size: fallback.size,\n parameterSize: definition.parameterSize ?? fallback.parameterSize,\n };\n }\n return { size: 0, parameterSize: definition.parameterSize };\n }\n\n installedSources.sort((a, b) => {\n const diff =\n scoreModelSourceCandidate(b, modelId, apiModel)\n - scoreModelSourceCandidate(a, modelId, apiModel);\n if (diff !== 0) return diff;\n return a.repo.localeCompare(b.repo);\n });\n\n let bestSize = 0;\n for (const source of installedSources) {\n const size = await readDirectorySizeBytes(source.fullPath);\n if (size > bestSize) bestSize = size;\n if (size > 0) {\n return {\n size,\n parameterSize: definition.parameterSize,\n };\n }\n }\n\n if (bestSize > 0) {\n return {\n size: bestSize,\n parameterSize: definition.parameterSize,\n };\n }\n\n const fallback = await resolvePublisherModelMetadata(modelId, apiModel, modelsRootDir);\n if (fallback.size > 0) {\n return {\n size: fallback.size,\n parameterSize: definition.parameterSize ?? fallback.parameterSize,\n };\n }\n\n return {\n size: 0,\n parameterSize: definition.parameterSize ?? fallback.parameterSize,\n };\n}\n\nfunction parseSizeBytes(model: LMStudioApiModel | undefined): number {\n if (!model) return 0;\n const candidates = [\n model.size_bytes,\n model.model_size_bytes,\n model.file_size_bytes,\n model.bytes,\n model.size,\n ];\n for (const candidate of candidates) {\n if (typeof candidate !== \"number\" || !Number.isFinite(candidate)) continue;\n if (candidate > 0) return Math.trunc(candidate);\n }\n return 0;\n}\n\nfunction normalizeModelNumber(value: string): string {\n return value.replace(/\\.0+$/, \"\");\n}\n\nfunction inferParameterSizeFromModelId(modelId: string): string | undefined {\n const id = modelId.toLowerCase();\n\n const mixtureMatch = id.match(/\\b(\\d+(?:\\.\\d+)?)\\s*[x*]\\s*(\\d+(?:\\.\\d+)?)\\s*b\\b/);\n if (mixtureMatch) {\n const experts = normalizeModelNumber(mixtureMatch[1] ?? \"\");\n const perExpert = normalizeModelNumber(mixtureMatch[2] ?? \"\");\n if (experts && perExpert) return `${experts}x${perExpert}B`;\n }\n\n const billionMatch = id.match(/\\b(\\d+(?:\\.\\d+)?)\\s*b\\b/);\n if (billionMatch?.[1]) {\n return `${normalizeModelNumber(billionMatch[1])}B`;\n }\n\n const millionMatch = id.match(/\\b(\\d+(?:\\.\\d+)?)\\s*m\\b/);\n if (millionMatch?.[1]) {\n return `${normalizeModelNumber(millionMatch[1])}M`;\n }\n\n return undefined;\n}\n\nfunction resolveModelFormat(\n apiModel: LMStudioApiModel | undefined,\n _localMetadata: LMStudioResolvedModelMetadata | undefined,\n _modelId: string\n): string | undefined {\n return asNonEmptyString(apiModel?.compatibility_type);\n}\n\nfunction buildModelEntry(\n id: string,\n apiModel: LMStudioApiModel | undefined,\n localMetadata: LMStudioResolvedModelMetadata | undefined\n): OllamaModel {\n const apiSize = parseSizeBytes(apiModel);\n return {\n name: id,\n size: apiSize > 0 ? apiSize : (localMetadata?.size ?? 0),\n parameterSize:\n localMetadata?.parameterSize\n ?? inferParameterSizeFromModelId(id),\n quantization: asNonEmptyString(apiModel?.quantization),\n runtimeStatus: asNonEmptyString(apiModel?.state),\n modelFormat: resolveModelFormat(apiModel, localMetadata, id),\n family:\n asNonEmptyString(apiModel?.arch)\n ?? asNonEmptyString(apiModel?.type)\n ?? asNonEmptyString(apiModel?.publisher),\n };\n}\n\nfunction isLoadedState(state: string | undefined): boolean {\n if (!state) return false;\n const normalized = state.trim().toLowerCase();\n if (!normalized || normalized.includes(\"not-loaded\")) return false;\n if (normalized === \"loaded\" || normalized === \"ready\") return true;\n return normalized.includes(\"loaded\");\n}\n\nfunction execFileText(\n cmd: string,\n args: string[],\n timeoutMs: number\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n execFile(\n cmd,\n args,\n {\n timeout: timeoutMs,\n maxBuffer: 1024 * 1024,\n env: process.env,\n },\n (err, stdout, stderr) => {\n if (err) {\n const error = err as NodeJS.ErrnoException & { stdout?: string; stderr?: string };\n error.stdout = stdout;\n error.stderr = stderr;\n reject(error);\n return;\n }\n resolve({ stdout, stderr });\n }\n );\n });\n}\n\nfunction isCommandMissingError(err: unknown): boolean {\n return err instanceof Error\n && \"code\" in err\n && (err as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n\nasync function runLmsCli(args: string[]): Promise<{ stdout: string; stderr: string }> {\n const configuredPath = asNonEmptyString(process.env[LM_STUDIO_CLI_PATH_ENV]);\n const fallbackPath = path.join(getLMStudioHomeDir(), \"bin\", \"lms\");\n const candidates = [\n configuredPath,\n \"lms\",\n fallbackPath,\n ].filter((candidate, index, list): candidate is string =>\n Boolean(candidate) && list.indexOf(candidate) === index\n );\n\n let lastError: unknown;\n for (const candidate of candidates) {\n try {\n return await execFileText(candidate, args, LM_STUDIO_CLI_TIMEOUT_MS);\n } catch (err) {\n lastError = err;\n if (isCommandMissingError(err)) continue;\n throw err;\n }\n }\n\n throw lastError ?? new Error(\"LM Studio CLI is not available.\");\n}\n\nfunction normalizeCliToken(value: string | undefined): string {\n return (value ?? \"\").trim().toLowerCase();\n}\n\nfunction matchesLoadedModelCliEntry(entry: LMStudioLoadedModelCliEntry, model: string): boolean {\n const target = normalizeCliToken(model);\n if (!target) return false;\n return [\n entry.identifier,\n entry.indexedModelIdentifier,\n entry.path,\n entry.modelKey,\n ].some((candidate) => normalizeCliToken(candidate) === target);\n}\n\nasync function listLoadedModelsFromCli(): Promise<LMStudioLoadedModelCliEntry[]> {\n const { stdout } = await runLmsCli([\"ps\", \"--json\"]);\n const parsed = JSON.parse(stdout) as unknown;\n return Array.isArray(parsed) ? parsed as LMStudioLoadedModelCliEntry[] : [];\n}\n\nfunction parseEstimatedBytes(output: string): number | null {\n const match = output.match(/Estimated Total Memory:\\s*([0-9]+(?:\\.[0-9]+)?)\\s*(KiB|MiB|GiB|TiB|KB|MB|GB|TB)/i);\n if (!match) return null;\n\n const value = Number.parseFloat(match[1] ?? \"\");\n const unit = (match[2] ?? \"\").toUpperCase();\n if (!Number.isFinite(value) || value <= 0) return null;\n\n const multipliers: Record<string, number> = {\n KIB: 1024,\n MIB: 1024 ** 2,\n GIB: 1024 ** 3,\n TIB: 1024 ** 4,\n KB: 1000,\n MB: 1000 ** 2,\n GB: 1000 ** 3,\n TB: 1000 ** 4,\n };\n const multiplier = multipliers[unit];\n if (!multiplier) return null;\n return Math.round(value * multiplier);\n}\n\nexport async function estimateLoadedModelMemoryBytes(model: string): Promise<number | null> {\n let loadedEntry: LMStudioLoadedModelCliEntry | undefined;\n try {\n const loadedModels = await listLoadedModelsFromCli();\n loadedEntry = loadedModels.find((entry) => matchesLoadedModelCliEntry(entry, model));\n } catch {\n loadedEntry = undefined;\n }\n\n // Only estimate from an exact loaded-model entry reported by `lms ps --json`.\n // Falling back to the raw user-provided model string can trigger the LM Studio\n // interactive selector, which would stall the benchmark process.\n if (!loadedEntry) return null;\n\n const candidateModelKeys = [\n loadedEntry?.path,\n loadedEntry?.indexedModelIdentifier,\n loadedEntry?.modelKey,\n ].filter((candidate, index, list): candidate is string =>\n Boolean(candidate?.trim()) && list.findIndex((item) => item === candidate) === index\n );\n\n for (const candidate of candidateModelKeys) {\n const args = [\"load\", \"--estimate-only\", \"-y\"];\n if (\n typeof loadedEntry?.contextLength === \"number\"\n && Number.isFinite(loadedEntry.contextLength)\n && loadedEntry.contextLength > 0\n ) {\n args.push(\"--context-length\", String(Math.trunc(loadedEntry.contextLength)));\n }\n args.push(candidate);\n\n try {\n const { stdout, stderr } = await runLmsCli(args);\n const estimated = parseEstimatedBytes(`${stdout}\\n${stderr}`);\n if (estimated !== null) return estimated;\n } catch (err) {\n const output = err instanceof Error\n ? `${String((err as NodeJS.ErrnoException & { stdout?: string }).stdout ?? \"\")}\\n${String((err as NodeJS.ErrnoException & { stderr?: string }).stderr ?? \"\")}`\n : \"\";\n const estimated = parseEstimatedBytes(output);\n if (estimated !== null) return estimated;\n }\n }\n\n return null;\n}\n\nasync function fetchApiModels(): Promise<LMStudioApiModel[] | null> {\n try {\n const resp = await fetchWithTimeout(\n \"/api/v0/models\",\n { method: \"GET\", headers: getLMStudioHeaders() },\n LM_STUDIO_METADATA_TIMEOUT_MS,\n \"LM Studio API metadata\"\n );\n if (!resp.ok) return null;\n const payload = (await resp.json()) as LMStudioApiModelListResponse;\n return Array.isArray(payload.data) ? payload.data : [];\n } catch {\n return null;\n }\n}\n\nasync function fetchWithTimeout(\n path: string,\n init: RequestInit,\n timeoutMs: number,\n label: string\n): Promise<Response> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n const baseUrl = getLMStudioBaseUrl();\n try {\n const url = new URL(path, baseUrl);\n return await fetch(url, { ...init, signal: controller.signal });\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new Error(`${label} timed out after ${timeoutMs}ms`);\n }\n throw err;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nasync function resolveLocalLMStudioVersion(): Promise<string | null> {\n const historicalVersionPath = path.join(\n getLMStudioHomeDir(),\n \".internal\",\n \"historical-version-info.json\"\n );\n try {\n const content = await fs.readFile(historicalVersionPath, \"utf8\");\n const parsed = JSON.parse(content) as LMStudioHistoricalVersionInfo;\n const version =\n asNonEmptyString(parsed.lastRecordedAppVersion)\n ?? asNonEmptyString(parsed.lastRecorderdAppVersion);\n if (!version) return null;\n const build = asNonEmptyString(parsed.lastRecordedAppBuildVersion);\n return build ? `${version}+${build}` : version;\n } catch {\n return null;\n }\n}\n\nexport async function getLMStudioVersion(): Promise<string> {\n const localVersion = await resolveLocalLMStudioVersion();\n try {\n const resp = await fetchWithTimeout(\n \"/api/v1/models\",\n { method: \"GET\", headers: getLMStudioHeaders() },\n 5_000,\n \"LM Studio version check\"\n );\n if (!resp.ok) return localVersion ?? \"unknown\";\n const fromHeader = asNonEmptyString(resp.headers.get(\"x-lmstudio-version\"));\n if (fromHeader) return fromHeader;\n return localVersion ?? \"unknown\";\n } catch {\n return localVersion ?? \"unknown\";\n }\n}\n\nexport async function listModels(): Promise<OllamaModel[]> {\n const resp = await fetchWithTimeout(\n \"/api/v1/models\",\n { method: \"GET\", headers: getLMStudioHeaders() },\n LM_STUDIO_INIT_TIMEOUT_MS,\n \"LM Studio list models\"\n );\n if (!resp.ok) {\n throw new Error(`LM Studio list models failed (${resp.status} ${resp.statusText})`);\n }\n const data = (await resp.json()) as LMStudioModelListResponse;\n const ids = (data.data ?? [])\n .map((m) => m.id?.trim())\n .filter((id): id is string => Boolean(id));\n\n const apiModels = await fetchApiModels();\n const apiById = new Map<string, LMStudioApiModel>();\n for (const model of apiModels ?? []) {\n const id = asNonEmptyString(model.id);\n if (!id) continue;\n apiById.set(id, model);\n }\n\n const modelsRootDir = await resolveModelsRootDir();\n const localMetadataEntries = await Promise.all(\n ids.map(async (id) => {\n const localMetadata = await resolveLocalModelMetadata(id, apiById.get(id), modelsRootDir);\n return [id, localMetadata] as const;\n })\n );\n const localMetadataById = new Map<string, LMStudioResolvedModelMetadata>(\n localMetadataEntries\n );\n\n return ids.map((id) => buildModelEntry(id, apiById.get(id), localMetadataById.get(id)));\n}\n\nexport async function resolveModel(modelId: string): Promise<OllamaModel | null> {\n const id = modelId.trim();\n if (!id) return null;\n\n const apiModels = await fetchApiModels();\n const apiModel = apiModels?.find((candidate) => asNonEmptyString(candidate.id) === id);\n const modelsRootDir = await resolveModelsRootDir();\n const localMetadata = await resolveLocalModelMetadata(id, apiModel, modelsRootDir);\n return buildModelEntry(id, apiModel, localMetadata);\n}\n\nexport async function listRunningModels(): Promise<OllamaRunningModel[]> {\n const apiModels = await fetchApiModels();\n if (!apiModels) return [];\n\n return apiModels\n .filter((model) => isLoadedState(model.state))\n .map((model) => ({\n name: model.id ?? \"\",\n size: parseSizeBytes(model),\n vramUsed: 0,\n }))\n .filter((model) => model.name.trim().length > 0);\n}\n\nexport function setDefaultKeepAlive(keepAlive?: KeepAliveValue): void {\n // No-op for LM Studio today (kept for runtime interface parity).\n defaultKeepAlive = keepAlive;\n void defaultKeepAlive;\n}\n\nexport async function generate(\n model: string,\n prompt: string,\n options?: LMStudioRequestOptions\n): Promise<GenerateResult> {\n const start = Date.now();\n const controller = new AbortController();\n activeAbortControllers.add(controller);\n try {\n const baseUrl = getLMStudioBaseUrl();\n const url = new URL(\"/api/v1/chat\", baseUrl);\n const doRequest = (includeSampling: boolean) =>\n fetch(url, {\n method: \"POST\",\n headers: getLMStudioHeaders(),\n body: JSON.stringify(buildNativeChatBody(model, prompt, options, false, includeSampling)),\n signal: controller.signal,\n });\n\n let resp = await doRequest(true);\n if (!resp.ok) {\n const body = await resp.text().catch(() => \"\");\n if (hasSamplingOverrides(options) && isUnsupportedSamplingMessage(resp.status, body)) {\n resp = await doRequest(false);\n } else {\n throw buildLMStudioRequestError(\"generate\", model, resp.status, resp.statusText, body);\n }\n }\n if (!resp.ok) {\n const body = await resp.text().catch(() => \"\");\n throw buildLMStudioRequestError(\"generate\", model, resp.status, resp.statusText, body);\n }\n\n const payload = (await resp.json()) as LMStudioNativeChatResponse;\n const nativeResponse = extractNativeResponse(payload);\n const response = nativeResponse.response;\n const reasoning = nativeResponse.reasoning;\n assertThinkingModeRespected(model, options?.think, response, reasoning);\n const stats = extractNativeStats(payload);\n const totalDuration = Math.max(0, Date.now() - start) * 1e6;\n const outputTokens =\n getUsageTokenCount(stats?.total_output_tokens)\n || resolveCompletionTokenCount(undefined, response, reasoning);\n const throughput = getNativeStatNumber(stats?.tokens_per_second);\n const timeToFirstTokenSeconds = getNativeStatNumber(stats?.time_to_first_token_seconds);\n const modelLoadTimeSeconds = getNativeStatNumber(stats?.model_load_time_seconds);\n const evalCountEstimated = getUsageTokenCount(stats?.total_output_tokens) <= 0;\n const evalDuration =\n throughput !== undefined && throughput > 0 && outputTokens > 0\n ? Math.max(1, Math.round((outputTokens / throughput) * 1e9))\n : totalDuration;\n const promptEvalDuration =\n timeToFirstTokenSeconds !== undefined\n ? Math.max(0, Math.round(timeToFirstTokenSeconds * 1e9))\n : 0;\n const loadDuration = Math.max(\n 0,\n Math.round((modelLoadTimeSeconds ?? 0) * 1e9)\n );\n\n return {\n response,\n ...(reasoning ? { thinking: reasoning } : {}),\n totalDuration,\n loadDuration,\n promptEvalCount: getUsageTokenCount(stats?.input_tokens),\n promptEvalDuration,\n evalCount: outputTokens,\n evalDuration,\n ...(evalCountEstimated ? { evalCountEstimated: true } : {}),\n };\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new Error(\"LM Studio generate request aborted\");\n }\n throw err;\n } finally {\n activeAbortControllers.delete(controller);\n }\n}\n\nexport async function generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n options?: LMStudioRequestOptions\n): Promise<GenerateResult> {\n const start = Date.now();\n const controller = new AbortController();\n activeAbortControllers.add(controller);\n const stallTimeoutMs = resolveStreamStallTimeoutMs(options?.stall_timeout_ms);\n let abortedByStallTimeout = false;\n\n const baseUrl = getLMStudioBaseUrl();\n const url = new URL(\"/api/v1/chat\", baseUrl);\n\n let stallTimer: ReturnType<typeof setTimeout> | null = null;\n const resetStallTimer = () => {\n if (stallTimeoutMs === undefined) return;\n if (stallTimer) clearTimeout(stallTimer);\n stallTimer = setTimeout(() => {\n abortedByStallTimeout = true;\n controller.abort();\n }, stallTimeoutMs);\n };\n\n try {\n resetStallTimer();\n\n const doRequest = (includeSampling: boolean) =>\n fetch(url, {\n method: \"POST\",\n headers: getLMStudioHeaders(),\n body: JSON.stringify(buildNativeChatBody(model, prompt, options, true, includeSampling)),\n signal: controller.signal,\n });\n\n let resp = await doRequest(true);\n if (!resp.ok) {\n const body = await resp.text().catch(() => \"\");\n if (hasSamplingOverrides(options) && isUnsupportedSamplingMessage(resp.status, body)) {\n resp = await doRequest(false);\n } else {\n throw buildLMStudioRequestError(\"stream\", model, resp.status, resp.statusText, body);\n }\n }\n if (!resp.ok) {\n const body = await resp.text().catch(() => \"\");\n throw buildLMStudioRequestError(\"stream\", model, resp.status, resp.statusText, body);\n }\n\n if (!resp.body) {\n throw new Error(\"LM Studio stream response body is empty\");\n }\n\n const reader = resp.body.getReader();\n const decoder = new TextDecoder();\n let buffered = \"\";\n let doneReceived = false;\n let fullResponse = \"\";\n let fullThinking = \"\";\n let stats: LMStudioNativeStats | undefined;\n let firstChunkSeen = false;\n let firstGeneratedTokenTime: number | null = null;\n let lastGeneratedTokenTime: number | null = null;\n\n const processDataLine = (rawLine: string) => {\n const line = rawLine.trim();\n if (!line.startsWith(\"data:\")) return;\n const dataStr = line.slice(5).trim();\n if (!dataStr) return;\n if (dataStr === \"[DONE]\") {\n doneReceived = true;\n return;\n }\n\n let payload: LMStudioNativeStreamEvent;\n try {\n payload = JSON.parse(dataStr) as LMStudioNativeStreamEvent;\n } catch {\n return;\n }\n\n const delta = extractNativeDelta(payload);\n const content = delta.response;\n const reasoning = delta.reasoning;\n const chunkStats = extractNativeStats(payload);\n if (chunkStats) stats = chunkStats;\n const aggregate = extractNativeResponse(payload);\n if (aggregate.response) {\n fullResponse = aggregate.response;\n }\n if (aggregate.reasoning) {\n fullThinking = aggregate.reasoning;\n }\n\n if (reasoning || content) {\n const now = Date.now();\n if (firstGeneratedTokenTime === null) firstGeneratedTokenTime = now;\n lastGeneratedTokenTime = now;\n }\n if (reasoning) {\n fullThinking += reasoning;\n }\n if (content) {\n fullResponse += content;\n callbacks?.onToken?.(content);\n }\n };\n\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n resetStallTimer();\n if (!firstChunkSeen) {\n firstChunkSeen = true;\n callbacks?.onFirstChunk?.();\n }\n buffered += decoder.decode(value, { stream: true });\n const lines = buffered.split(\"\\n\");\n buffered = lines.pop() ?? \"\";\n for (const rawLine of lines) {\n processDataLine(rawLine);\n }\n }\n\n // Flush any pending decoder state for chunk boundaries / multibyte codepoints.\n buffered += decoder.decode();\n if (buffered.length > 0) {\n const lines = buffered.split(\"\\n\");\n buffered = lines.pop() ?? \"\";\n for (const rawLine of lines) {\n processDataLine(rawLine);\n }\n }\n\n if (buffered.trim().length > 0) {\n processDataLine(buffered);\n }\n\n if (stallTimer) clearTimeout(stallTimer);\n\n if (!doneReceived && !fullResponse && !fullThinking) {\n throw new Error(\"LM Studio stream ended without content\");\n }\n\n const totalDuration = Math.max(0, Date.now() - start) * 1e6;\n const outputTokens =\n getUsageTokenCount(stats?.total_output_tokens)\n || resolveCompletionTokenCount(undefined, fullResponse, fullThinking);\n const throughput = getNativeStatNumber(stats?.tokens_per_second);\n const timeToFirstTokenSeconds = getNativeStatNumber(stats?.time_to_first_token_seconds);\n const modelLoadTimeSeconds = getNativeStatNumber(stats?.model_load_time_seconds);\n const evalCountEstimated = getUsageTokenCount(stats?.total_output_tokens) <= 0;\n // Prefer native throughput stats when available; otherwise fall back to a\n // token window measured from the streamed delta events.\n const evalDurationMs =\n throughput !== undefined && throughput > 0 && outputTokens > 0\n ? (outputTokens / throughput) * 1000\n : firstGeneratedTokenTime !== null\n && lastGeneratedTokenTime !== null\n && lastGeneratedTokenTime > firstGeneratedTokenTime\n ? lastGeneratedTokenTime - firstGeneratedTokenTime\n : Date.now() - start;\n const result: GenerateResult = {\n response: fullResponse,\n ...(fullThinking ? { thinking: fullThinking } : {}),\n totalDuration,\n loadDuration: Math.max(\n 0,\n Math.round((modelLoadTimeSeconds ?? 0) * 1e9)\n ),\n promptEvalCount: getUsageTokenCount(stats?.input_tokens),\n promptEvalDuration:\n timeToFirstTokenSeconds !== undefined\n ? Math.max(0, Math.round(timeToFirstTokenSeconds * 1e9))\n : firstGeneratedTokenTime !== null\n ? (firstGeneratedTokenTime - start) * 1e6\n : 0,\n evalCount: outputTokens,\n evalDuration: Math.max(1, Math.round(evalDurationMs * 1e6)),\n ...(evalCountEstimated ? { evalCountEstimated: true } : {}),\n };\n assertThinkingModeRespected(model, options?.think, fullResponse, fullThinking);\n\n callbacks?.onDone?.(result);\n return result;\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n if (abortedByStallTimeout && stallTimeoutMs !== undefined) {\n throw new Error(`LM Studio stream timed out after ${stallTimeoutMs}ms`);\n }\n throw new Error(\"LM Studio stream request aborted\");\n }\n throw err;\n } finally {\n if (stallTimer) clearTimeout(stallTimer);\n activeAbortControllers.delete(controller);\n }\n}\n\nexport async function unloadModel(_model: string): Promise<void> {\n // No-op for LM Studio today.\n}\n\nexport function abortOngoingRequests(): void {\n for (const controller of activeAbortControllers) {\n controller.abort();\n }\n activeAbortControllers.clear();\n}\n","import type { OllamaModel, OllamaRunningModel } from \"../types.js\";\nimport type { GenerateResult, KeepAliveValue, StreamCallbacks } from \"./ollama-client.js\";\nimport * as ollamaClient from \"./ollama-client.js\";\nimport * as lmStudioClient from \"./lm-studio-client.js\";\n\nexport interface GenerateOptions {\n temperature?: number;\n top_p?: number;\n seed?: number;\n num_predict?: number;\n keep_alive?: KeepAliveValue;\n think?: boolean;\n stall_timeout_ms?: number;\n}\n\nexport interface LLMRuntime {\n name: string;\n modelFormat?: string; // default \"gguf\"\n generate(model: string, prompt: string, opts?: GenerateOptions): Promise<GenerateResult>;\n generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n opts?: GenerateOptions\n ): Promise<GenerateResult>;\n listModels(): Promise<OllamaModel[]>;\n listRunningModels(): Promise<OllamaRunningModel[]>;\n getVersion(): Promise<string>;\n unloadModel(model: string): Promise<void>;\n setKeepAlive(keepAlive?: KeepAliveValue): void;\n abort(): void;\n}\n\nexport const SUPPORTED_RUNTIME_BACKENDS = [\"ollama\", \"lm-studio\"] as const;\nexport type RuntimeBackend = (typeof SUPPORTED_RUNTIME_BACKENDS)[number];\n\nconst RUNTIME_LABELS: Record<RuntimeBackend, string> = {\n ollama: \"Ollama\",\n \"lm-studio\": \"LM Studio\",\n};\n\nclass OllamaRuntime implements LLMRuntime {\n name = \"ollama\";\n modelFormat = \"gguf\";\n\n generate(model: string, prompt: string, opts?: GenerateOptions): Promise<GenerateResult> {\n return ollamaClient.generate(model, prompt, opts);\n }\n\n generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n opts?: GenerateOptions\n ): Promise<GenerateResult> {\n return ollamaClient.generateStream(model, prompt, callbacks, opts);\n }\n\n listModels(): Promise<OllamaModel[]> {\n return ollamaClient.listModels();\n }\n\n listRunningModels(): Promise<OllamaRunningModel[]> {\n return ollamaClient.listRunningModels();\n }\n\n getVersion(): Promise<string> {\n return ollamaClient.getOllamaVersion();\n }\n\n unloadModel(model: string): Promise<void> {\n return ollamaClient.unloadModel(model);\n }\n\n setKeepAlive(keepAlive?: KeepAliveValue): void {\n ollamaClient.setDefaultKeepAlive(keepAlive);\n }\n\n abort(): void {\n ollamaClient.abortOngoingRequests();\n }\n}\n\nclass LMStudioRuntime implements LLMRuntime {\n name: RuntimeBackend = \"lm-studio\";\n modelFormat = \"gguf\";\n\n generate(model: string, prompt: string, opts?: GenerateOptions): Promise<GenerateResult> {\n return lmStudioClient.generate(model, prompt, opts);\n }\n\n generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n opts?: GenerateOptions\n ): Promise<GenerateResult> {\n return lmStudioClient.generateStream(model, prompt, callbacks, opts);\n }\n\n listModels(): Promise<OllamaModel[]> {\n return lmStudioClient.listModels();\n }\n\n listRunningModels(): Promise<OllamaRunningModel[]> {\n return lmStudioClient.listRunningModels();\n }\n\n getVersion(): Promise<string> {\n return lmStudioClient.getLMStudioVersion();\n }\n\n unloadModel(model: string): Promise<void> {\n return lmStudioClient.unloadModel(model);\n }\n\n setKeepAlive(keepAlive?: KeepAliveValue): void {\n lmStudioClient.setDefaultKeepAlive(keepAlive);\n }\n\n abort(): void {\n lmStudioClient.abortOngoingRequests();\n }\n}\n\nlet activeRuntime: LLMRuntime = new OllamaRuntime();\n\nfunction createRuntime(backend: RuntimeBackend): LLMRuntime {\n if (backend === \"lm-studio\") return new LMStudioRuntime();\n return new OllamaRuntime();\n}\n\nexport function normalizeRuntimeBackend(value?: string): RuntimeBackend {\n const candidate = (value ?? \"ollama\").trim().toLowerCase();\n if (candidate === \"ollama\" || candidate === \"lm-studio\") {\n return candidate;\n }\n throw new Error(\n `Unsupported backend \"${value}\". Supported backends: ${SUPPORTED_RUNTIME_BACKENDS.join(\", \")}`\n );\n}\n\nexport function setRuntimeByName(backend?: string): RuntimeBackend {\n const normalized = normalizeRuntimeBackend(backend);\n if (activeRuntime.name === normalized) return normalized;\n activeRuntime = createRuntime(normalized);\n return normalized;\n}\n\nexport function getRuntime(): LLMRuntime {\n return activeRuntime;\n}\n\nexport function setRuntime(runtime: LLMRuntime): void {\n activeRuntime = runtime;\n}\n\nexport function getRuntimeDisplayName(runtimeName: string = activeRuntime.name): string {\n if (runtimeName === \"lm-studio\") return RUNTIME_LABELS[\"lm-studio\"];\n if (runtimeName === \"ollama\") return RUNTIME_LABELS.ollama;\n return runtimeName;\n}\n\nexport function getRuntimeModelInstallHint(runtimeName: string = activeRuntime.name): string {\n if (runtimeName === \"lm-studio\") {\n return \"Download/select a model in LM Studio, then load it in the local server.\";\n }\n if (runtimeName === \"ollama\") {\n return \"Pull one with: ollama pull <model>\";\n }\n return \"Add at least one model in your selected runtime.\";\n}\n\nexport function getRuntimeSetupHints(runtimeName: string = activeRuntime.name): string[] {\n if (runtimeName === \"lm-studio\") {\n return [\n \"Start LM Studio local server (Developer tab -> Local Server).\",\n \"Optionally set LM_STUDIO_BASE_URL if your server is not on http://127.0.0.1:1234.\",\n ];\n }\n if (runtimeName === \"ollama\") {\n return [\n \"Start it with: ollama serve\",\n \"Install it at: https://ollama.com\",\n ];\n }\n return [\"Verify the runtime is reachable and configured correctly.\"];\n}\n\n// ── Proxy exports (drop-in replacements for ollama-client imports) ──\n\nexport function generate(\n model: string,\n prompt: string,\n opts?: GenerateOptions\n): Promise<GenerateResult> {\n return activeRuntime.generate(model, prompt, opts);\n}\n\nexport function generateStream(\n model: string,\n prompt: string,\n callbacks?: StreamCallbacks,\n opts?: GenerateOptions\n): Promise<GenerateResult> {\n return activeRuntime.generateStream(model, prompt, callbacks, opts);\n}\n\nexport function listModels(): Promise<OllamaModel[]> {\n return activeRuntime.listModels();\n}\n\nexport function listRunningModels(): Promise<OllamaRunningModel[]> {\n return activeRuntime.listRunningModels();\n}\n\nexport function getRuntimeVersion(): Promise<string> {\n return activeRuntime.getVersion();\n}\n\nexport function unloadModel(model: string): Promise<void> {\n return activeRuntime.unloadModel(model);\n}\n\nexport function setRuntimeKeepAlive(keepAlive?: KeepAliveValue): void {\n activeRuntime.setKeepAlive(keepAlive);\n}\n\nexport function abortOngoingRequests(): void {\n activeRuntime.abort();\n}\n\nexport function getRuntimeName(): string {\n return activeRuntime.name;\n}\n\nexport function getRuntimeModelFormat(): string {\n return activeRuntime.modelFormat ?? \"gguf\";\n}\n\nexport async function resolveRuntimeModel(model: string): Promise<OllamaModel | null> {\n if (activeRuntime.name === \"lm-studio\") {\n return lmStudioClient.resolveModel(model);\n }\n\n const knownModels = await activeRuntime.listModels();\n const matchedModel = knownModels.find((candidate) => candidate.name === model);\n if (matchedModel) return matchedModel;\n return {\n name: model,\n size: 0,\n modelFormat: activeRuntime.modelFormat ?? \"gguf\",\n };\n}\n\n// Re-export types from ollama-client for convenience\nexport type { GenerateResult, KeepAliveValue, StreamCallbacks } from \"./ollama-client.js\";\n","import { createHash } from \"node:crypto\";\nimport chalk from \"chalk\";\nimport {\n listModels,\n getRuntimeVersion,\n getRuntimeName,\n getRuntimeModelFormat,\n getRuntimeDisplayName,\n getRuntimeModelInstallHint,\n getRuntimeSetupHints,\n resolveRuntimeModel,\n setRuntimeKeepAlive,\n setRuntimeByName,\n unloadModel,\n} from \"../core/runtime.js\";\nimport { getHardwareInfo } from \"../core/hardware.js\";\nimport { runPerformanceBench } from \"../benchmarks/performance.js\";\nimport { runReasoningBench } from \"../benchmarks/reasoning.js\";\nimport { runMathBench } from \"../benchmarks/math.js\";\nimport { runCodingBench } from \"../benchmarks/coding.js\";\nimport { runInstructionFollowingBench } from \"../benchmarks/instruction-following.js\";\nimport { runStructuredOutputBench } from \"../benchmarks/structured-output.js\";\nimport { runMultilingualBench } from \"../benchmarks/multilingual.js\";\nimport { computeFitness } from \"../scoring/fitness.js\";\nimport { printHardwareTable, printPerformanceTable, printQualityTable, printSummaryTable } from \"../ui/results-table.js\";\nimport { printVerdict } from \"../ui/verdict.js\";\nimport { stepHeader, errorMsg, warnMsg, infoMsg, createSpinner, successMsg } from \"../ui/progress.js\";\nimport { saveResult } from \"../core/store.js\";\nimport { uploadBenchResult } from \"../core/uploader.js\";\nimport { promptShare } from \"../ui/share-prompt.js\";\nimport { resolveSubmitterForShare } from \"../ui/submitter-prompt.js\";\nimport { openUrl } from \"../utils.js\";\nimport { showTelemetryNotice, trackBenchStarted, trackBenchCompleted, trackBenchShared, flushTelemetry } from \"../core/telemetry.js\";\nimport { supportsUnicode } from \"../ui/terminal.js\";\nimport { promptThinkingMode } from \"../ui/thinking-prompt.js\";\nimport type { BenchResult, BenchEnvironment, HardwareInfo, ModelInfo, OllamaModel, QualityMetrics, RunMetadata } from \"../types.js\";\nimport { buildBenchmarkProfileMetadata, BENCHMARK_PROFILE_VERSION } from \"../benchmarks/profile.js\";\nimport { getRuntimeUnavailableHelp } from \"../core/runtime-unavailable.js\";\n\nconst BENCHMARK_SPEC_VERSION = \"0.2.1\";\nconst PROMPT_PACK_VERSION = \"0.1.0\";\n\nexport interface BenchOptions {\n model?: string;\n perfOnly?: boolean;\n setExitCode?: boolean;\n perfWarmupTimeoutMs?: number;\n perfPromptTimeoutMs?: number;\n perfMinSuccessfulPrompts?: number;\n qualityTimeoutMs?: number;\n codingTimeoutMs?: number;\n streamStallTimeoutMs?: number;\n perfStrict?: boolean;\n share?: boolean; // true = --share, false = --no-share, undefined = prompt\n ciNoMenu?: boolean; // running in CI mode\n json?: boolean; // output JSON only, no UI\n keepAlive?: string | number; // forwarded to runtime keep_alive (if supported)\n unloadAfterBench?: boolean; // unload model after each model benchmark lifecycle\n thinking?: boolean; // undefined = interactive prompt, true/false = CLI override\n backend?: string; // runtime backend (ollama | lm-studio)\n}\n\nexport interface BenchOutcome {\n results: BenchResult[];\n failedModels: string[];\n}\n\nexport async function benchCommand(options: BenchOptions): Promise<BenchOutcome> {\n if (options.backend !== undefined) {\n setRuntimeByName(options.backend);\n }\n const runtimeName = getRuntimeName();\n const runtimeDisplayName = getRuntimeDisplayName(runtimeName);\n const runtimeModelHint = getRuntimeModelInstallHint(runtimeName);\n const runtimeSetupHints = getRuntimeSetupHints(runtimeName);\n\n const shouldSetExitCode = options.setExitCode !== false;\n const silent = options.json === true;\n const shouldUnloadAfterModel =\n options.unloadAfterBench ?? (!options.model || options.ciNoMenu === true);\n\n // Detect hardware\n if (!silent) stepHeader(\"Hardware Detection\");\n const spinner = createSpinner(\"Detecting hardware...\");\n if (!silent) spinner.start();\n let hardware: HardwareInfo;\n try {\n hardware = await getHardwareInfo();\n if (!silent) {\n spinner.succeed(\"Hardware detected\");\n printHardwareTable(hardware);\n if (hardware.powerMode === \"low-power\") {\n infoMsg(\"Low-power mode detected — results will reflect energy-saving performance.\");\n }\n if (\n hardware.cpuCurrentSpeedGHz != null &&\n hardware.cpuFreqGHz != null &&\n hardware.cpuFreqGHz > 0 &&\n hardware.cpuCurrentSpeedGHz / hardware.cpuFreqGHz < 0.8\n ) {\n infoMsg(\n `CPU running at ${hardware.cpuCurrentSpeedGHz.toFixed(1)} GHz / ${hardware.cpuFreqGHz.toFixed(1)} GHz nominal — possible throttling.`\n );\n }\n }\n } catch (err) {\n if (!silent) spinner.fail(\"Hardware detection failed\");\n if (!silent && err instanceof Error) errorMsg(err.message);\n if (shouldSetExitCode) process.exitCode = 1;\n return { results: [], failedModels: [] };\n }\n\n // Detect runtime version\n let runtimeVersion = \"unknown\";\n try {\n runtimeVersion = await getRuntimeVersion();\n } catch (err) {\n if (!silent) {\n warnMsg(`Could not detect ${runtimeDisplayName} version (continuing without it).`);\n if (err instanceof Error) warnMsg(err.message);\n }\n }\n\n // Determine which models to bench\n let modelNames: string[];\n let allModels: OllamaModel[] = [];\n if (options.model) {\n modelNames = [options.model];\n try {\n allModels = await listModels();\n } catch {\n // Non-fatal: model info is optional\n }\n } else {\n if (!silent) stepHeader(\"Discovering Models\");\n const spinnerModels = createSpinner(\"Fetching model list...\");\n if (!silent) spinnerModels.start();\n try {\n allModels = await listModels();\n modelNames = allModels.map((m) => m.name);\n if (!silent) spinnerModels.succeed(`Found ${allModels.length} model(s)`);\n } catch (err) {\n if (!silent) {\n spinnerModels.fail(`Cannot connect to ${runtimeDisplayName}`);\n for (const line of getRuntimeUnavailableHelp(runtimeName, runtimeSetupHints)) {\n errorMsg(line);\n }\n if (err instanceof Error) errorMsg(err.message);\n }\n if (shouldSetExitCode) process.exitCode = 1;\n return { results: [], failedModels: [] };\n }\n\n if (modelNames.length === 0) {\n if (!silent) errorMsg(`No models found. ${runtimeModelHint}`);\n if (shouldSetExitCode) process.exitCode = 1;\n return { results: [], failedModels: [] };\n }\n }\n\n // Show one-time telemetry notice\n if (!silent) await showTelemetryNotice();\n\n setRuntimeKeepAlive(options.keepAlive);\n\n // Resolve thinking mode\n let thinkEnabled: boolean;\n if (options.thinking !== undefined) {\n thinkEnabled = options.thinking;\n } else if (!silent && !options.ciNoMenu) {\n thinkEnabled = await promptThinkingMode();\n } else {\n thinkEnabled = false;\n }\n if (!silent && thinkEnabled) {\n infoMsg(\"Thinking mode enabled — models that support it will use extended reasoning.\");\n }\n if (!silent) {\n infoMsg(\n `Benchmark profile ${BENCHMARK_PROFILE_VERSION}: temperature=0, top_p=1, seed=42, context=runtime default.`\n );\n }\n\n try {\n // Run benchmarks for each model\n const results: BenchResult[] = [];\n const failedModels: string[] = [];\n\n for (const modelName of modelNames) {\n if (!silent) {\n const label = ` Benchmarking: ${modelName} `;\n const innerWidth = Math.max(label.length, 30);\n const [tl, h, tr, v, bl, br] = supportsUnicode\n ? [\"\\u2554\", \"\\u2550\", \"\\u2557\", \"\\u2551\", \"\\u255A\", \"\\u255D\"]\n : [\"+\", \"=\", \"+\", \"|\", \"+\", \"+\"];\n console.log(chalk.bold.cyan(`\\n${tl}${h.repeat(innerWidth)}${tr}`));\n console.log(chalk.bold.cyan(`${v}${label.padEnd(innerWidth)}${v}`));\n console.log(chalk.bold.cyan(`${bl}${h.repeat(innerWidth)}${br}`));\n }\n\n const benchStartTime = Date.now();\n await trackBenchStarted({\n model: modelName,\n os: hardware.os,\n arch: hardware.arch,\n cpuCores: hardware.cpuCores,\n ramGb: hardware.totalMemoryGB,\n });\n\n try {\n // Performance benchmark\n if (!silent) stepHeader(\"Performance Benchmark\");\n const perfResult = await runPerformanceBench(modelName, {\n warmupTimeoutMs: options.perfWarmupTimeoutMs,\n promptTimeoutMs: options.perfPromptTimeoutMs,\n minSuccessfulPrompts: options.perfMinSuccessfulPrompts,\n failOnPromptError: options.perfStrict,\n think: thinkEnabled,\n streamStallTimeoutMs: options.streamStallTimeoutMs,\n });\n const perf = perfResult.metrics;\n const benchEnvironment: BenchEnvironment | undefined = perfResult.benchEnvironment;\n if (!silent) printPerformanceTable(perf, benchEnvironment);\n\n // Quality benchmarks (unless --perf-only)\n let quality: QualityMetrics | null = null;\n if (!options.perfOnly) {\n const qualityTimeoutMs = options.qualityTimeoutMs;\n const codingTimeoutMs = options.codingTimeoutMs ?? options.qualityTimeoutMs;\n const commonQualityOpts = {\n think: thinkEnabled,\n ...(qualityTimeoutMs !== undefined ? { timeoutMs: qualityTimeoutMs } : {}),\n };\n\n if (!silent) stepHeader(\"Quality Benchmark — Reasoning\");\n const reasoning = await runReasoningBench(modelName, commonQualityOpts);\n\n if (!silent) stepHeader(\"Quality Benchmark — Math\");\n const math = await runMathBench(modelName, commonQualityOpts);\n\n if (!silent) stepHeader(\"Quality Benchmark — Coding\");\n const coding = await runCodingBench(modelName, {\n think: thinkEnabled,\n ...(codingTimeoutMs !== undefined ? { timeoutMs: codingTimeoutMs } : {}),\n });\n\n if (!silent) stepHeader(\"Quality Benchmark — Instruction Following\");\n const instructionFollowing = await runInstructionFollowingBench(modelName, commonQualityOpts);\n\n if (!silent) stepHeader(\"Quality Benchmark — Structured Output\");\n const structuredOutput = await runStructuredOutputBench(modelName, commonQualityOpts);\n\n if (!silent) stepHeader(\"Quality Benchmark — Multilingual\");\n const multilingual = await runMultilingualBench(modelName, commonQualityOpts);\n\n quality = { reasoning, math, coding, instructionFollowing, structuredOutput, multilingual };\n }\n\n // Compute fitness\n const fitness = computeFitness(perf, quality, hardware, benchEnvironment);\n if (!silent) {\n if (quality) {\n printQualityTable(quality, fitness.qualityScore?.timePenalties);\n }\n printVerdict(modelName, fitness);\n }\n\n // Build model info from discovered models\n const matchedModel = allModels.find((m) => m.name === modelName);\n let resolvedModel = matchedModel;\n if (matchedModel?.modelFormat === undefined) {\n try {\n resolvedModel = await resolveRuntimeModel(modelName) ?? matchedModel;\n } catch {\n resolvedModel = matchedModel;\n }\n }\n const modelMetadataSource = resolvedModel ?? matchedModel;\n const modelInfo: ModelInfo = modelMetadataSource\n ? {\n parameterSize: modelMetadataSource.parameterSize,\n quantization: modelMetadataSource.quantization,\n family: modelMetadataSource.family,\n // Persist actual observed thinking behavior from the benchmark run.\n thinkingDetected: perfResult.thinkingDetected,\n }\n : { thinkingDetected: perfResult.thinkingDetected };\n\n // Build result without hash first, then compute hash\n const partialResult: Omit<BenchResult, \"metadata\"> & { metadata: Omit<RunMetadata, \"rawLogHash\"> } = {\n model: modelName,\n modelInfo,\n hardware,\n performance: perf,\n quality,\n fitness,\n benchEnvironment,\n timestamp: new Date().toISOString(),\n metadata: {\n benchmarkSpecVersion: BENCHMARK_SPEC_VERSION,\n promptPackVersion: PROMPT_PACK_VERSION,\n runtimeVersion,\n runtimeBackend: getRuntimeName(),\n modelFormat:\n resolvedModel?.modelFormat\n ?? (getRuntimeName() === \"ollama\" ? getRuntimeModelFormat() : \"unknown\"),\n benchmarkProfile: buildBenchmarkProfileMetadata(thinkEnabled),\n },\n };\n const rawLogHash = createHash(\"sha256\")\n .update(JSON.stringify(partialResult))\n .digest(\"hex\");\n\n const benchResult: BenchResult = {\n ...partialResult,\n metadata: { ...partialResult.metadata, rawLogHash },\n };\n results.push(benchResult);\n\n await trackBenchCompleted({\n model: modelName,\n verdict: fitness.verdict,\n globalScore: fitness.globalScore,\n tps: perf.tokensPerSecond,\n durationMs: Date.now() - benchStartTime,\n });\n\n // Persist result locally\n try {\n const savedPath = await saveResult(benchResult);\n if (!silent) successMsg(`Result saved: ${savedPath}`);\n } catch (err) {\n if (!silent) {\n warnMsg(\"Could not save benchmark result locally.\");\n if (err instanceof Error) {\n warnMsg(err.message);\n }\n }\n }\n\n // Upload immediately after each model (when --share is enabled and quality was run)\n if (!options.perfOnly && !silent && options.share === true) {\n const uploadSpinner = createSpinner(\"Uploading result...\");\n uploadSpinner.start();\n try {\n const uploaded = await uploadBenchResult(benchResult);\n uploadSpinner.succeed(`Shared! ${uploaded.url}`);\n if (uploaded.rankGlobalPct != null) {\n const parts: string[] = [`Top ${uploaded.rankGlobalPct}% globally`];\n if (uploaded.rankCpuPct != null) {\n parts.push(`Top ${uploaded.rankCpuPct}% on ${benchResult.hardware.cpu}`);\n }\n successMsg(` → ${parts.join(\" · \")}`);\n }\n await trackBenchShared({ model: benchResult.model, verdict: benchResult.fitness.verdict });\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Unknown error\";\n uploadSpinner.fail(`Upload failed: ${msg}`);\n }\n }\n } catch (err) {\n failedModels.push(modelName);\n if (!silent) {\n errorMsg(`Failed to benchmark ${modelName}`);\n if (err instanceof Error) errorMsg(err.message);\n }\n } finally {\n if (shouldUnloadAfterModel) {\n try {\n await unloadModel(modelName);\n } catch (err) {\n if (!silent) {\n warnMsg(`Could not unload model ${modelName} after benchmark.`);\n if (err instanceof Error) warnMsg(err.message);\n }\n }\n }\n }\n }\n\n // Summary table if multiple models\n if (!silent && results.length > 1) {\n stepHeader(\"Summary\");\n printSummaryTable(results);\n }\n\n if (failedModels.length > 0) {\n if (!silent) {\n errorMsg(\n `Benchmark finished with ${failedModels.length} failure(s): ${failedModels.join(\", \")}`\n );\n }\n if (shouldSetExitCode) process.exitCode = 1;\n }\n\n // Share prompt (interactive) for results not yet uploaded (i.e. --share was not passed)\n const canShareResults = !options.perfOnly;\n if (!canShareResults) {\n if (!silent && options.share === true) {\n warnMsg(\"Sharing is not available in performance-only mode. Run a full benchmark to upload results.\");\n }\n } else if (!silent && results.length > 0 && options.share !== true && options.share !== false && !options.ciNoMenu) {\n for (const result of results) {\n let decision: \"share\" | \"skip\" = \"skip\";\n try {\n decision = await promptShare(result);\n } catch (err) {\n warnMsg(\"Could not open share prompt; skipping upload.\");\n if (err instanceof Error) {\n warnMsg(err.message);\n }\n decision = \"skip\";\n }\n\n if (decision === \"share\") {\n let uploadPayload: BenchResult = result;\n let submitterEmail: string | undefined;\n\n try {\n const submitter = await resolveSubmitterForShare();\n if (submitter) {\n uploadPayload = {\n ...result,\n submitter: {\n nickname: submitter.nickname,\n emailHash: submitter.emailHash,\n },\n };\n submitterEmail = submitter.email;\n }\n } catch (err) {\n warnMsg(\"Could not collect benchmark profile; continuing without it.\");\n if (err instanceof Error) {\n warnMsg(err.message);\n }\n }\n\n const uploadSpinner = createSpinner(\"Uploading result...\");\n uploadSpinner.start();\n try {\n const uploaded = await uploadBenchResult(uploadPayload, { submitterEmail });\n uploadSpinner.succeed(`Shared! ${uploaded.url}`);\n if (uploaded.rankGlobalPct != null) {\n const parts: string[] = [`Top ${uploaded.rankGlobalPct}% globally`];\n if (uploaded.rankCpuPct != null) {\n parts.push(`Top ${uploaded.rankCpuPct}% on ${result.hardware.cpu}`);\n }\n successMsg(` → ${parts.join(\" · \")}`);\n }\n await trackBenchShared({ model: result.model, verdict: result.fitness.verdict });\n openUrl(uploaded.url);\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"Unknown error\";\n uploadSpinner.fail(`Upload failed: ${msg}`);\n }\n }\n }\n }\n\n // JSON mode: output results as JSON to stdout\n if (silent) {\n console.log(JSON.stringify(results, null, 2));\n }\n\n // Fire-and-forget telemetry flush — do NOT await shutdown() as PostHog\n // keeps the event loop alive indefinitely. Give it 2 s then move on.\n flushTelemetry().catch(() => {});\n await new Promise<void>((resolve) => {\n const t = setTimeout(resolve, 2_000);\n if (typeof t === \"object\" && \"unref\" in t) (t as NodeJS.Timeout).unref();\n });\n\n return { results, failedModels };\n } finally {\n // Avoid leaking keep_alive preferences across separate CLI invocations/tests.\n setRuntimeKeepAlive(undefined);\n }\n}\n","import si from \"systeminformation\";\nimport type { HardwareInfo } from \"../types.js\";\nimport os from \"node:os\";\nimport { execFile } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\n\ntype PowerMode = \"low-power\" | \"balanced\" | \"performance\" | \"unknown\";\n\nfunction normalizeWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction looksLikeGpuDescriptor(value: string): boolean {\n return /\\b(radeon|graphics|geforce|rtx|gtx|arc|iris|uhd|quadro|tesla|adreno|mali|powervr)\\b/i.test(value);\n}\n\nfunction splitCpuAndInferredGpu(cpuLabel: string): { cpu: string; inferredGpu: string | null } {\n const normalized = normalizeWhitespace(cpuLabel);\n const withGpuMatch = normalized.match(/\\s+(?:w\\/\\s*|with\\s+)(.+)$/i);\n if (!withGpuMatch?.index) {\n return { cpu: normalized, inferredGpu: null };\n }\n\n const inferredGpu = normalizeWhitespace(withGpuMatch[1] ?? \"\");\n if (!looksLikeGpuDescriptor(inferredGpu)) {\n return { cpu: normalized, inferredGpu: null };\n }\n const cpu = normalizeWhitespace(normalized.slice(0, withGpuMatch.index));\n return {\n cpu: cpu || normalized,\n inferredGpu: inferredGpu || null,\n };\n}\n\nfunction execCommand(cmd: string, args: string[], timeoutMs = 3000): Promise<string> {\n return new Promise((resolve) => {\n const child = execFile(cmd, args, { timeout: timeoutMs }, (err, stdout) => {\n if (err) return resolve(\"\");\n resolve(stdout.trim());\n });\n child.on(\"error\", () => resolve(\"\"));\n });\n}\n\nasync function detectPowerModeMacOS(): Promise<PowerMode> {\n const output = await execCommand(\"pmset\", [\"-g\"]);\n if (!output) return \"unknown\";\n const match = output.match(/lowpowermode\\s+(\\d)/i);\n if (match) return match[1] === \"1\" ? \"low-power\" : \"balanced\";\n return \"balanced\";\n}\n\nasync function detectPowerModeLinux(): Promise<PowerMode> {\n try {\n const governor = await readFile(\n \"/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor\",\n \"utf-8\"\n );\n const g = governor.trim().toLowerCase();\n if (g === \"powersave\") return \"low-power\";\n if (g === \"performance\") return \"performance\";\n return \"balanced\";\n } catch {\n return \"unknown\";\n }\n}\n\nasync function detectPowerModeWindows(): Promise<PowerMode> {\n const output = await execCommand(\"powercfg\", [\"/getactivescheme\"]);\n if (!output) return \"unknown\";\n const match = output.match(/\\(([^)]+)\\)/);\n if (!match) return \"unknown\";\n const name = match[1].toLowerCase();\n if (name.includes(\"power saver\") || name.includes(\"économie\")) return \"low-power\";\n if (name.includes(\"high performance\") || name.includes(\"performances\")) return \"performance\";\n return \"balanced\";\n}\n\nasync function detectMachineModel(): Promise<string | null> {\n try {\n if (process.platform === \"darwin\") {\n // system_profiler gives the marketing name (e.g. \"MacBook Air\", \"Mac mini\")\n const output = await execCommand(\"system_profiler\", [\"SPHardwareDataType\"]);\n const match = output.match(/Model Name:\\s*(.+)/i);\n if (match) return match[1].trim();\n return null;\n }\n // Linux / Windows: si.system() often returns useful model info\n // (e.g. \"ThinkPad X1 Carbon\", \"Dell XPS 15\", \"ASUS ROG Strix\")\n const sys = await si.system();\n const parts = [sys.manufacturer, sys.model].filter(\n (p) => p && p !== \"Unknown\" && p !== \"To Be Filled By O.E.M.\" && p !== \"System Product Name\"\n );\n return parts.length > 0 ? parts.join(\" \") : null;\n } catch {\n return null;\n }\n}\n\nasync function detectPowerMode(): Promise<PowerMode> {\n try {\n switch (process.platform) {\n case \"darwin\":\n return await detectPowerModeMacOS();\n case \"linux\":\n return await detectPowerModeLinux();\n case \"win32\":\n return await detectPowerModeWindows();\n default:\n return \"unknown\";\n }\n } catch {\n return \"unknown\";\n }\n}\n\nexport type ThermalPressure = \"nominal\" | \"moderate\" | \"heavy\" | \"critical\" | \"unknown\";\n\nexport async function detectThermalPressure(): Promise<ThermalPressure> {\n try {\n if (process.platform === \"darwin\") {\n const output = await execCommand(\"pmset\", [\"-g\", \"therm\"]);\n if (!output) return \"unknown\";\n const match = output.match(/CPU_Speed_Limit\\s*=\\s*(\\d+)/i);\n if (!match) return \"unknown\";\n const limit = parseInt(match[1], 10);\n if (limit >= 100) return \"nominal\";\n if (limit >= 80) return \"moderate\";\n if (limit >= 50) return \"heavy\";\n return \"critical\";\n }\n // Other OS: use CPU temperature as proxy\n const temp = await si.cpuTemperature();\n const main = temp.main;\n if (main == null || main <= 0) return \"unknown\";\n if (main < 80) return \"nominal\";\n if (main < 90) return \"moderate\";\n if (main < 100) return \"heavy\";\n return \"critical\";\n } catch {\n return \"unknown\";\n }\n}\n\nexport async function detectBatteryPowered(): Promise<boolean | undefined> {\n try {\n if (process.platform === \"darwin\") {\n const output = await execCommand(\"pmset\", [\"-g\", \"ps\"]);\n if (!output) return undefined;\n if (output.includes(\"Battery Power\")) return true;\n if (output.includes(\"AC Power\")) return false;\n return undefined;\n }\n const battery = await si.battery();\n if (!battery.hasBattery) return undefined;\n if (typeof battery.acConnected === \"boolean\") return !battery.acConnected;\n if (typeof battery.isCharging === \"boolean\") return !battery.isCharging;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function getSwapUsedGB(): Promise<number> {\n try {\n const mem = await si.mem();\n return +(mem.swapused / 1024 / 1024 / 1024).toFixed(2);\n } catch {\n return 0;\n }\n}\n\nexport async function getHardwareInfo(): Promise<HardwareInfo> {\n const [cpu, mem, graphics, osInfo, memLayout, powerMode, cpuSpeed, machineModel] = await Promise.all([\n si.cpu(),\n si.mem(),\n si.graphics(),\n si.osInfo(),\n si.memLayout(),\n detectPowerMode(),\n si.cpuCurrentSpeed().catch(() => null),\n detectMachineModel(),\n ]);\n\n const gpuController = graphics.controllers[0];\n const gpuNames = graphics.controllers\n .map((g) => g.model)\n .filter(Boolean)\n .join(\", \");\n const cpuLabelRaw = normalizeWhitespace(`${cpu.manufacturer} ${cpu.brand}`);\n const { cpu: cpuLabel, inferredGpu } = splitCpuAndInferredGpu(cpuLabelRaw);\n const defaultIntegratedGpu =\n process.platform === \"darwin\" ? \"Integrated / Apple Silicon\" : \"Integrated / Unknown\";\n\n const gpuCoresRaw = gpuController?.cores;\n const gpuCores = gpuCoresRaw ? parseInt(String(gpuCoresRaw), 10) : null;\n\n const memType = memLayout.length > 0 ? memLayout[0].type : null;\n\n return {\n cpu: cpuLabel,\n cpuCores: cpu.cores,\n cpuPCores: cpu.performanceCores || null,\n cpuECores: cpu.efficiencyCores || null,\n cpuFreqGHz: cpu.speed || null,\n totalMemoryGB: +(mem.total / 1024 / 1024 / 1024).toFixed(1),\n freeMemoryGB: +(mem.available / 1024 / 1024 / 1024).toFixed(1),\n memoryType: memType || null,\n swapTotalGB: +(mem.swaptotal / 1024 / 1024 / 1024).toFixed(1),\n swapUsedGB: +(mem.swapused / 1024 / 1024 / 1024).toFixed(1),\n gpu: normalizeWhitespace(gpuNames) || inferredGpu || defaultIntegratedGpu,\n gpuCores: gpuCores && !isNaN(gpuCores) ? gpuCores : null,\n gpuVramMB: gpuController?.vram ?? null,\n os: `${osInfo.distro} ${osInfo.release}`,\n arch: os.arch(),\n machineModel: machineModel || null,\n powerMode,\n cpuCurrentSpeedGHz: cpuSpeed?.avg ?? null,\n };\n}\n\nexport async function getCpuLoad(): Promise<number> {\n try {\n const load = await si.currentLoad();\n return +load.currentLoad.toFixed(1);\n } catch {\n return -1;\n }\n}\n\nexport async function getMemoryUsage(): Promise<{\n usedGB: number;\n totalGB: number;\n percent: number;\n}> {\n const mem = await si.mem();\n const totalGB = mem.total / 1024 / 1024 / 1024;\n const usedGB = (mem.total - mem.available) / 1024 / 1024 / 1024;\n return {\n usedGB: +usedGB.toFixed(1),\n totalGB: +totalGB.toFixed(1),\n percent: +((usedGB / totalGB) * 100).toFixed(1),\n };\n}\n","import ora, { type Ora } from \"ora\";\nimport chalk from \"chalk\";\nimport { supportsUnicode } from \"./terminal.js\";\n\nconst FUN_PHRASES = [\n \"Convincing the model to cooperate...\",\n \"Politely asking for more VRAM...\",\n \"Hallucinating responsibly...\",\n \"Converting caffeine to tokens...\",\n \"Fine-tuning the vibes...\",\n \"Warming up the silicon...\",\n \"Counting parameters one by one...\",\n \"Negotiating with the attention heads...\",\n \"Bribing the GPU scheduler...\",\n \"Tokenizing your patience...\",\n \"Performing gradient ascent on morale...\",\n \"Asking the model to show its work...\",\n \"Softmaxing expectations...\",\n \"Backpropagating through bureaucracy...\",\n \"Sampling from the distribution of outcomes...\",\n \"Applying dropout to your worries...\",\n \"Checking if P equals NP real quick...\",\n \"Loading weights... and lifting them...\",\n \"Running inference at the speed of thought...\",\n \"Embedding this moment in vector space...\",\n \"Quantizing your anticipation to 4 bits...\",\n \"Teaching the model some manners...\",\n \"Reticulating neural splines...\",\n \"Optimizing the loss of your free time...\",\n \"Asking nicely for coherent output...\",\n \"Unrolling loops and rolling eyes...\",\n \"Pruning unnecessary neurons...\",\n \"Feeding the transformer its daily prompts...\",\n \"Computing the meaning of life (in tok/s)...\",\n \"Performing attention — please hold...\",\n \"Cross-referencing with the vibes database...\",\n \"Adjusting temperature for maximum spice...\",\n \"Benchmarking the benchmarker...\",\n \"Consulting the oracle (it's just softmax)...\",\n \"Defragmenting the latent space...\",\n \"Compiling excuses for slow inference...\",\n \"Measuring tokens per existential crisis...\",\n \"Aligning the model with your expectations...\",\n \"Running a vibe check on the weights...\",\n \"Interpolating between hope and reality...\",\n \"Insert disk 2 and press left mouse button...\",\n \"Guru Meditation imminent — stay calm...\",\n \"Running LLM on an Amiga 500 would be faster... maybe...\",\n \"Asking Kickstart ROM for a second opinion...\",\n \"Swapping chip RAM for more tokens...\",\n];\n\nconst ROTATION_INTERVAL_MS = 3500;\n\nconst activeSpinners = new Set<Ora>();\n\nprocess.on(\"exit\", () => {\n for (const s of activeSpinners) {\n try {\n s.stop();\n } catch {\n // ignore\n }\n }\n activeSpinners.clear();\n});\n\nfunction attachFunSuffix(spinner: Ora): Ora {\n let timer: ReturnType<typeof setInterval> | null = null;\n let phraseIndex = Math.floor(Math.random() * FUN_PHRASES.length);\n\n const origStart = spinner.start.bind(spinner);\n const origStop = spinner.stop.bind(spinner);\n const origSucceed = spinner.succeed.bind(spinner);\n const origFail = spinner.fail.bind(spinner);\n\n function clearTimer(): void {\n if (timer !== null) {\n clearInterval(timer);\n timer = null;\n }\n spinner.suffixText = \"\";\n activeSpinners.delete(spinner);\n }\n\n function rotateSuffix(): void {\n phraseIndex = (phraseIndex + 1) % FUN_PHRASES.length;\n spinner.suffixText = chalk.dim(` — ${FUN_PHRASES[phraseIndex]}`);\n }\n\n spinner.start = ((text?: string) => {\n activeSpinners.add(spinner);\n origStart(text);\n spinner.suffixText = chalk.dim(` — ${FUN_PHRASES[phraseIndex]}`);\n timer = setInterval(rotateSuffix, ROTATION_INTERVAL_MS);\n return spinner;\n }) as typeof spinner.start;\n\n spinner.stop = (() => {\n clearTimer();\n return origStop();\n }) as typeof spinner.stop;\n\n spinner.succeed = ((text?: string) => {\n clearTimer();\n return origSucceed(text);\n }) as typeof spinner.succeed;\n\n spinner.fail = ((text?: string) => {\n clearTimer();\n return origFail(text);\n }) as typeof spinner.fail;\n\n return spinner;\n}\n\nexport function createSpinner(text: string): Ora {\n const spinner = ora({\n text,\n color: \"cyan\",\n // Avoid interfering with readline-driven interactive menus.\n discardStdin: false,\n });\n return attachFunSuffix(spinner);\n}\n\nconst STEP_MARKER = supportsUnicode ? \"\\u25B8\" : \">\";\nconst CHECK_MARK = supportsUnicode ? \"\\u2713\" : \"ok\";\nconst CROSS_MARK = supportsUnicode ? \"\\u2717\" : \"!!\";\nconst WARN_MARK = supportsUnicode ? \"\\u26A0\" : \"!!\";\nconst INFO_MARK = supportsUnicode ? \"\\u2139\" : \"i\";\n\nexport function stepHeader(text: string): void {\n console.log(chalk.bold.blue(`\\n${STEP_MARKER} ${text}`));\n}\n\nexport function subStep(text: string): void {\n console.log(chalk.dim(` ${text}`));\n}\n\nexport function successMsg(text: string): void {\n console.log(chalk.green(` ${CHECK_MARK} ${text}`));\n}\n\nexport function infoMsg(text: string): void {\n console.log(chalk.cyan(` ${INFO_MARK} ${text}`));\n}\n\nexport function warnMsg(text: string): void {\n console.log(chalk.yellow(` ${WARN_MARK} ${text}`));\n}\n\nexport function errorMsg(text: string): void {\n console.log(chalk.red(` ${CROSS_MARK} ${text}`));\n}\n","export const supportsUnicode: boolean =\n process.platform !== \"win32\" ||\n Boolean(process.env.WT_SESSION) ||\n Boolean(process.env.TERM_PROGRAM);\n\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE = /\\x1b\\[[0-9;]*[A-Za-z]/g;\n\nexport function stripAnsi(value: string): string {\n return value.replace(ANSI_RE, \"\");\n}\n","import type { GenerateOptions } from \"../core/runtime.js\";\nimport type { BenchmarkProfileMetadata } from \"../types.js\";\n\nexport const BENCHMARK_PROFILE_VERSION = \"v1\";\nexport const BENCHMARK_PROFILE_SEED = 42;\nexport const BENCHMARK_PROFILE_TOP_P = 1;\nexport const BENCHMARK_PROFILE_TEMPERATURE = 0;\n\nexport function withBenchmarkProfile(\n opts: Omit<GenerateOptions, \"temperature\" | \"top_p\" | \"seed\"> = {}\n): GenerateOptions {\n return {\n temperature: BENCHMARK_PROFILE_TEMPERATURE,\n top_p: BENCHMARK_PROFILE_TOP_P,\n seed: BENCHMARK_PROFILE_SEED,\n ...opts,\n };\n}\n\nexport function buildBenchmarkProfileMetadata(thinkEnabled: boolean): BenchmarkProfileMetadata {\n return {\n version: BENCHMARK_PROFILE_VERSION,\n sampling: {\n temperature: BENCHMARK_PROFILE_TEMPERATURE,\n topP: BENCHMARK_PROFILE_TOP_P,\n seed: BENCHMARK_PROFILE_SEED,\n },\n thinkingMode: thinkEnabled ? \"enabled\" : \"disabled\",\n contextWindowTokens: null,\n contextPolicy: \"runtime-default\",\n };\n}\n","import { abortOngoingRequests, generateStream, listRunningModels, getRuntimeName } from \"../core/runtime.js\";\nimport { getMemoryUsage, detectThermalPressure, detectBatteryPowered, getSwapUsedGB, getCpuLoad } from \"../core/hardware.js\";\nimport { estimateLoadedModelMemoryBytes } from \"../core/lm-studio-client.js\";\nimport type { PerformanceMetrics, BenchEnvironment } from \"../types.js\";\nimport { avg, stddev, withTimeout, hasThinkingContent, estimateTokenCount } from \"../utils.js\";\nimport { createSpinner, subStep } from \"../ui/progress.js\";\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nconst WARMUP_PROMPT = \"Say hello in one word.\";\n\nconst BENCH_PROMPTS = [\n \"Explain the concept of recursion in programming in 3 sentences.\",\n \"What are the main differences between TCP and UDP? Be concise.\",\n \"Describe how a hash table works in 4 sentences.\",\n \"Write a detailed step-by-step explanation of how a compiler transforms source code into machine code, covering lexing, parsing, semantic analysis, optimization, and code generation.\",\n \"Implement a function in pseudocode that checks whether a given string of parentheses, brackets, and braces is balanced. Explain the time and space complexity.\",\n];\n\nexport interface PerformanceBenchResult {\n metrics: PerformanceMetrics;\n thinkingDetected: boolean;\n benchEnvironment?: BenchEnvironment;\n}\n\nexport interface PerformanceBenchOptions {\n warmupTimeoutMs?: number;\n promptTimeoutMs?: number;\n minSuccessfulPrompts?: number;\n failOnPromptError?: boolean;\n think?: boolean;\n streamStallTimeoutMs?: number;\n}\n\nconst DEFAULT_WARMUP_TIMEOUT_MS = 300_000;\nconst DEFAULT_PROMPT_TIMEOUT_MS = 120_000;\n\nasync function optionalProbe<T>(probe: () => Promise<T>, fallback: T): Promise<T> {\n try {\n return await probe();\n } catch {\n return fallback;\n }\n}\n\nasync function optionalProbeWithAvailability<T>(\n probe: () => Promise<T>,\n fallback: T\n): Promise<{ value: T; available: boolean }> {\n try {\n return { value: await probe(), available: true };\n } catch {\n return { value: fallback, available: false };\n }\n}\n\nexport async function runPerformanceBench(\n model: string,\n options: PerformanceBenchOptions = {}\n): Promise<PerformanceBenchResult> {\n const spinner = createSpinner(\"Warming up model...\");\n spinner.start();\n\n try {\n const warmupTimeoutMs = options.warmupTimeoutMs ?? DEFAULT_WARMUP_TIMEOUT_MS;\n const promptTimeoutMs = options.promptTimeoutMs ?? DEFAULT_PROMPT_TIMEOUT_MS;\n const minSuccessfulPrompts = options.minSuccessfulPrompts ?? Math.max(1, Math.ceil(BENCH_PROMPTS.length / 2));\n const failOnPromptError = options.failOnPromptError ?? false;\n\n const [memBefore, thermalBefore, swapBeforeResult, batteryPowered] = await Promise.all([\n getMemoryUsage(),\n optionalProbe(() => detectThermalPressure(), \"unknown\"),\n optionalProbeWithAvailability(() => getSwapUsedGB(), 0),\n optionalProbe(() => detectBatteryPowered(), undefined),\n ]);\n\n // Capture pre-warmup load state so we can qualify memory footprint reliability\n // when runtimes don't expose per-model loaded size.\n const runningModelsBeforeWarmup = await optionalProbe(() => listRunningModels(), []);\n const modelWasAlreadyLoaded = runningModelsBeforeWarmup.some((m) => m.name === model);\n\n // Warmup run (also measures load time)\n const warmup = await withTimeout(\n generateStream(model, WARMUP_PROMPT, undefined, {\n ...withBenchmarkProfile({\n num_predict: 32,\n think: options.think,\n stall_timeout_ms: options.streamStallTimeoutMs,\n }),\n }),\n warmupTimeoutMs,\n \"Model warmup\",\n abortOngoingRequests\n );\n const runtimeName = getRuntimeName();\n const loadTimeAvailable = !(runtimeName === \"lm-studio\" && warmup.loadDuration === 0);\n const loadTime = warmup.loadDuration / 1e6; // ns -> ms\n\n // After warmup, query running models for accurate loaded size.\n const runningModels = await listRunningModels();\n const thisModel = runningModels.find((m) => m.name === model);\n\n spinner.succeed(\"Model loaded\");\n\n // Run benchmark prompts\n const tpsValues: number[] = [];\n const firstChunkValues: number[] = [];\n const ttftValues: number[] = [];\n let totalPromptTokens = 0;\n let totalCompletionTokens = 0;\n let totalEvalCount = 0;\n let totalEvalDurationNs = 0;\n let successfulPrompts = 0;\n let failedPrompts = 0;\n let thinkingDetected = false;\n let totalThinkingTokens = 0;\n const cpuLoadSamples: number[] = [];\n let tokensPerSecondEstimated = false;\n\n for (let i = 0; i < BENCH_PROMPTS.length; i++) {\n spinner.start(`Running performance test ${i + 1}/${BENCH_PROMPTS.length}...`);\n\n let firstChunkTime: number | null = null;\n let firstTokenTime: number | null = null;\n const startTime = Date.now();\n\n try {\n const result = await withTimeout(\n generateStream(\n model,\n BENCH_PROMPTS[i],\n {\n onFirstChunk: () => {\n if (firstChunkTime === null) {\n firstChunkTime = Date.now() - startTime;\n }\n },\n onToken: () => {\n if (firstTokenTime === null) {\n firstTokenTime = Date.now() - startTime;\n }\n },\n },\n withBenchmarkProfile({\n num_predict: 256,\n think: options.think,\n stall_timeout_ms: options.streamStallTimeoutMs,\n })\n ),\n promptTimeoutMs,\n \"Performance benchmark\",\n abortOngoingRequests\n );\n\n // tok/s from runtime-provided generation metrics (evalCount / evalDuration)\n const evalDurationSec = result.evalDuration / 1e9;\n const tps = evalDurationSec > 0 ? result.evalCount / evalDurationSec : 0;\n tpsValues.push(tps);\n totalEvalCount += result.evalCount;\n totalEvalDurationNs += result.evalDuration;\n if (result.evalCountEstimated) {\n tokensPerSecondEstimated = true;\n }\n\n // First chunk latency / TTFT\n if (firstChunkTime !== null) {\n firstChunkValues.push(firstChunkTime);\n }\n if (firstTokenTime !== null) {\n ttftValues.push(firstTokenTime);\n }\n\n // Detect thinking content\n if (hasThinkingContent(result.response, result.thinking)) {\n thinkingDetected = true;\n const thinkingText = result.thinking || \"\";\n totalThinkingTokens += estimateTokenCount(thinkingText);\n }\n\n totalPromptTokens += result.promptEvalCount;\n totalCompletionTokens += result.evalCount;\n successfulPrompts++;\n\n subStep(\n ` Prompt ${i + 1}: ${tps.toFixed(1)} tok/s, first chunk ${firstChunkTime ?? \"?\"}ms, TTFT ${firstTokenTime ?? \"?\"}ms`\n );\n\n // Sample CPU load after each prompt\n const cpuSample = await optionalProbe(() => getCpuLoad(), -1);\n if (cpuSample >= 0) cpuLoadSamples.push(cpuSample);\n } catch (err) {\n failedPrompts++;\n const message = err instanceof Error ? err.message : String(err);\n subStep(` Prompt ${i + 1}: failed (${message})`);\n if (failOnPromptError) {\n throw err;\n }\n }\n }\n\n if (successfulPrompts < minSuccessfulPrompts) {\n throw new Error(\n `Performance benchmark produced too few successful prompts (${successfulPrompts}/${BENCH_PROMPTS.length}, minimum required: ${minSuccessfulPrompts}).`\n );\n }\n\n if (failedPrompts > 0) {\n subStep(\n ` Completed with ${failedPrompts} failed prompt(s); metrics use ${successfulPrompts} successful prompt(s).`\n );\n }\n\n // Measure memory and environment after benchmark (with model loaded)\n const [memAfter, thermalAfter, swapAfterResult] = await Promise.all([\n getMemoryUsage(),\n optionalProbe(() => detectThermalPressure(), thermalBefore),\n optionalProbeWithAvailability(() => getSwapUsedGB(), swapBeforeResult.value),\n ]);\n\n // Prefer runtime-reported loaded model size when available; otherwise fall back\n // to host memory delta, which reflects actual runtime footprint better than\n // static on-disk model size.\n let memoryUsedGB: number;\n let memoryPercent: number;\n let memoryFootprintEstimated = false;\n // Only treat runtime-reported running size as a true loaded-memory footprint\n // when the backend exposes a comparable in-memory value. LM Studio's size can\n // reflect local file/directory metadata rather than resident RAM usage.\n const runtimeReportsComparableLoadedSize = runtimeName !== \"lm-studio\";\n const estimatedLoadedModelSizeBytes =\n runtimeName === \"lm-studio\" && modelWasAlreadyLoaded\n ? await optionalProbe(() => estimateLoadedModelMemoryBytes(model), null)\n : null;\n const loadedModelSizeBytes =\n runtimeReportsComparableLoadedSize && thisModel && thisModel.size > 0\n ? thisModel.size\n : 0;\n const memoryFootprintAvailable =\n runtimeReportsComparableLoadedSize\n ? loadedModelSizeBytes > 0 || !modelWasAlreadyLoaded\n : (estimatedLoadedModelSizeBytes ?? 0) > 0 || !modelWasAlreadyLoaded;\n if (loadedModelSizeBytes > 0) {\n memoryUsedGB = loadedModelSizeBytes / (1024 ** 3);\n memoryPercent = (memoryUsedGB / memAfter.totalGB) * 100;\n } else if ((estimatedLoadedModelSizeBytes ?? 0) > 0) {\n memoryUsedGB = (estimatedLoadedModelSizeBytes ?? 0) / (1024 ** 3);\n memoryPercent = (memoryUsedGB / memAfter.totalGB) * 100;\n memoryFootprintEstimated = true;\n } else {\n memoryUsedGB = Math.max(0, memAfter.usedGB - memBefore.usedGB);\n memoryPercent = Math.max(0, memAfter.percent - memBefore.percent);\n }\n\n spinner.succeed(\"Performance benchmark complete\");\n\n // Use a sentinel value for TTFT if no tokens were received\n const firstChunkMs = firstChunkValues.length > 0 ? avg(firstChunkValues) : undefined;\n const ttft = ttftValues.length > 0 ? avg(ttftValues) : -1;\n\n const swapDeltaGB =\n swapBeforeResult.available && swapAfterResult.available\n ? +(swapAfterResult.value - swapBeforeResult.value).toFixed(2)\n : undefined;\n // CPU load metrics from prompt samples\n const cpuAvgLoad = cpuLoadSamples.length > 0\n ? +(cpuLoadSamples.reduce((a, b) => a + b, 0) / cpuLoadSamples.length).toFixed(1)\n : undefined;\n const cpuPeakLoad = cpuLoadSamples.length > 0\n ? +Math.max(...cpuLoadSamples).toFixed(1)\n : undefined;\n\n const benchEnvironment: BenchEnvironment = {\n thermalPressureBefore: thermalBefore,\n thermalPressureAfter: thermalAfter,\n ...(swapDeltaGB !== undefined && swapDeltaGB > 0 ? { swapDeltaGB } : {}),\n ...(batteryPowered != null ? { batteryPowered } : {}),\n ...(cpuAvgLoad !== undefined ? { cpuAvgLoad } : {}),\n ...(cpuPeakLoad !== undefined ? { cpuPeakLoad } : {}),\n };\n\n return {\n metrics: {\n tokensPerSecond:\n totalEvalDurationNs > 0\n ? totalEvalCount / (totalEvalDurationNs / 1e9)\n : avg(tpsValues),\n ...(tokensPerSecondEstimated ? { tokensPerSecondEstimated: true } : {}),\n ...(firstChunkMs !== undefined ? { firstChunkMs } : {}),\n ttft: ttft >= 0 ? ttft : 30_000, // Fallback: 30s if no TTFT measured\n loadTime,\n loadTimeAvailable,\n totalTokens: totalPromptTokens + totalCompletionTokens,\n promptTokens: totalPromptTokens,\n completionTokens: totalCompletionTokens,\n memoryUsedGB: +memoryUsedGB.toFixed(1),\n memoryPercent: +memoryPercent.toFixed(1),\n memoryFootprintAvailable,\n ...(memoryFootprintEstimated ? { memoryFootprintEstimated: true } : {}),\n memoryHostUsedGB: memAfter.usedGB,\n memoryHostPercent: memAfter.percent,\n tpsStdDev: tpsValues.length >= 2 ? stddev(tpsValues) : undefined,\n ...(totalThinkingTokens > 0 ? { thinkingTokensEstimate: totalThinkingTokens } : {}),\n },\n thinkingDetected,\n benchEnvironment,\n };\n } catch (err) {\n if (spinner.isSpinning) {\n spinner.fail(\"Performance benchmark failed\");\n }\n throw err;\n }\n}\n","[\n {\n \"id\": 1,\n \"question\": \"All W are X. No X are Y. Some Z are W. Which conclusion must be true?\",\n \"choices\": [\"A) Some Z are Y\", \"B) Some Z are not Y\", \"C) All Z are Y\", \"D) No Z are X\"],\n \"answer\": \"B\",\n \"category\": \"logic\"\n },\n {\n \"id\": 2,\n \"question\": \"Find the next number: 2, 6, 12, 20, 30, ?\",\n \"choices\": [\"A) 38\", \"B) 40\", \"C) 42\", \"D) 44\"],\n \"answer\": \"C\",\n \"category\": \"pattern\"\n },\n {\n \"id\": 3,\n \"question\": \"What is the smaller angle between clock hands at 3:15?\",\n \"choices\": [\"A) 0°\", \"B) 7.5°\", \"C) 15°\", \"D) 22.5°\"],\n \"answer\": \"B\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 4,\n \"question\": \"Binary 101101 is what in decimal?\",\n \"choices\": [\"A) 41\", \"B) 43\", \"C) 45\", \"D) 47\"],\n \"answer\": \"C\",\n \"category\": \"computing\"\n },\n {\n \"id\": 5,\n \"question\": \"If server overloaded => latency high. Latency is high. What follows?\",\n \"choices\": [\"A) Server is definitely overloaded\", \"B) Server is definitely not overloaded\", \"C) Network is down\", \"D) Overload cannot be concluded\"],\n \"answer\": \"D\",\n \"category\": \"logic\"\n },\n {\n \"id\": 6,\n \"question\": \"What is the average time complexity of merge sort?\",\n \"choices\": [\"A) O(n)\", \"B) O(n^2)\", \"C) O(n log n)\", \"D) O(log n)\"],\n \"answer\": \"C\",\n \"category\": \"computing\"\n },\n {\n \"id\": 7,\n \"question\": \"Probability of getting sum 9 with two fair dice?\",\n \"choices\": [\"A) 1/6\", \"B) 1/8\", \"C) 1/9\", \"D) 1/12\"],\n \"answer\": \"C\",\n \"category\": \"probability\"\n },\n {\n \"id\": 8,\n \"question\": \"For XOR, when is output true?\",\n \"choices\": [\"A) Inputs differ\", \"B) Inputs are both true\", \"C) Inputs are both false\", \"D) Output is never true\"],\n \"answer\": \"A\",\n \"category\": \"logic\"\n },\n {\n \"id\": 9,\n \"question\": \"Smallest integer n such that 2^n > 1000?\",\n \"choices\": [\"A) 9\", \"B) 10\", \"C) 11\", \"D) 12\"],\n \"answer\": \"B\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 10,\n \"question\": \"A car travels 60 km at 30 km/h and 60 km at 60 km/h. Average speed?\",\n \"choices\": [\"A) 36 km/h\", \"B) 38 km/h\", \"C) 40 km/h\", \"D) 45 km/h\"],\n \"answer\": \"C\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 11,\n \"question\": \"In a line: A before B, C after B, D before A, E after C. Who is first?\",\n \"choices\": [\"A) A\", \"B) B\", \"C) C\", \"D) D\"],\n \"answer\": \"D\",\n \"category\": \"ordering\"\n },\n {\n \"id\": 12,\n \"question\": \"If 3 machines make 3 parts in 3 minutes at same rate, 100 machines make 100 parts in how many minutes?\",\n \"choices\": [\"A) 3\", \"B) 10\", \"C) 33\", \"D) 100\"],\n \"answer\": \"A\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 13,\n \"question\": \"Sum of interior angles of a hexagon is:\",\n \"choices\": [\"A) 540°\", \"B) 600°\", \"C) 720°\", \"D) 900°\"],\n \"answer\": \"C\",\n \"category\": \"geometry\"\n },\n {\n \"id\": 14,\n \"question\": \"Exactly one of A or B is true. A says: 'B is true.' B says: 'A is false.' Which is correct?\",\n \"choices\": [\"A) A true, B false\", \"B) A false, B true\", \"C) Both true\", \"D) Both false\"],\n \"answer\": \"B\",\n \"category\": \"logic\"\n },\n {\n \"id\": 15,\n \"question\": \"Which statement about a Directed Acyclic Graph (DAG) is always true?\",\n \"choices\": [\"A) It has at least one node with indegree 0\", \"B) Every node has indegree > 0\", \"C) It always has a cycle\", \"D) It must be complete\"],\n \"answer\": \"A\",\n \"category\": \"computing\"\n },\n {\n \"id\": 16,\n \"question\": \"The mean of 5 numbers is 12. Four numbers are 8, 10, 12, 14. The fifth is:\",\n \"choices\": [\"A) 14\", \"B) 15\", \"C) 12\", \"D) 16\"],\n \"answer\": \"D\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 17,\n \"question\": \"How many distinct prime factors does 84 have?\",\n \"choices\": [\"A) 2\", \"B) 3\", \"C) 4\", \"D) 5\"],\n \"answer\": \"B\",\n \"category\": \"number_theory\"\n },\n {\n \"id\": 18,\n \"question\": \"The contrapositive of 'If p then q' is:\",\n \"choices\": [\"A) If q then p\", \"B) If not q then not p\", \"C) If not p then not q\", \"D) If p then not q\"],\n \"answer\": \"B\",\n \"category\": \"logic\"\n },\n {\n \"id\": 19,\n \"question\": \"0.125 as a simplified fraction is:\",\n \"choices\": [\"A) 1/8\", \"B) 1/6\", \"C) 1/5\", \"D) 2/15\"],\n \"answer\": \"A\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 20,\n \"question\": \"Binary search is valid only when the input array is:\",\n \"choices\": [\"A) Random\", \"B) Unique\", \"C) Sorted\", \"D) Small\"],\n \"answer\": \"C\",\n \"category\": \"computing\"\n },\n {\n \"id\": 21,\n \"question\": \"Alice is older than Bob. Bob is older than Cara. Dan is older than Alice. Who is oldest?\",\n \"choices\": [\"A) Alice\", \"B) Bob\", \"C) Cara\", \"D) Dan\"],\n \"answer\": \"D\",\n \"category\": \"ordering\"\n },\n {\n \"id\": 22,\n \"question\": \"A tap fills a tank in 6 min, drain empties in 9 min. Both open from empty: fill time?\",\n \"choices\": [\"A) 12 min\", \"B) 15 min\", \"C) 18 min\", \"D) 54 min\"],\n \"answer\": \"C\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 23,\n \"question\": \"Smallest positive integer divisible by 3, 4 and 5 is:\",\n \"choices\": [\"A) 30\", \"B) 60\", \"C) 120\", \"D) 240\"],\n \"answer\": \"B\",\n \"category\": \"number_theory\"\n },\n {\n \"id\": 24,\n \"question\": \"If today is Tuesday, what day will it be in 100 days?\",\n \"choices\": [\"A) Tuesday\", \"B) Wednesday\", \"C) Friday\", \"D) Thursday\"],\n \"answer\": \"D\",\n \"category\": \"logic\"\n },\n {\n \"id\": 25,\n \"question\": \"Among 100 people, 60 like A and 50 like B. Minimum that like both A and B?\",\n \"choices\": [\"A) 10\", \"B) 20\", \"C) 30\", \"D) 0\"],\n \"answer\": \"A\",\n \"category\": \"set_theory\"\n },\n {\n \"id\": 26,\n \"question\": \"Which grows fastest as n becomes large?\",\n \"choices\": [\"A) log n\", \"B) n\", \"C) n log n\", \"D) n^2\"],\n \"answer\": \"D\",\n \"category\": \"computing\"\n },\n {\n \"id\": 27,\n \"question\": \"Maximum value in 8-bit unsigned integer is:\",\n \"choices\": [\"A) 127\", \"B) 128\", \"C) 255\", \"D) 256\"],\n \"answer\": \"C\",\n \"category\": \"computing\"\n },\n {\n \"id\": 28,\n \"question\": \"A price increases by 20% then decreases by 20%. Net change is:\",\n \"choices\": [\"A) No change\", \"B) 4% decrease\", \"C) 4% increase\", \"D) 8% decrease\"],\n \"answer\": \"B\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 29,\n \"question\": \"A right triangle has legs 7 and 24. Its area is:\",\n \"choices\": [\"A) 42\", \"B) 72\", \"C) 96\", \"D) 84\"],\n \"answer\": \"D\",\n \"category\": \"geometry\"\n },\n {\n \"id\": 30,\n \"question\": \"If events A and B are independent, P(A)=0.4 and P(B)=0.5, then P(A and B)=\",\n \"choices\": [\"A) 0.1\", \"B) 0.2\", \"C) 0.4\", \"D) 0.9\"],\n \"answer\": \"B\",\n \"category\": \"probability\"\n },\n {\n \"id\": 31,\n \"question\": \"Premises: All squares are rectangles. Some rectangles are not squares. Which must be true?\",\n \"choices\": [\"A) All rectangles are squares\", \"B) No rectangle is a square\", \"C) At least one rectangle is not a square\", \"D) Some squares are not rectangles\"],\n \"answer\": \"C\",\n \"category\": \"logic\"\n },\n {\n \"id\": 32,\n \"question\": \"x1=1 and x(n+1)=2x(n)+1. What is x4?\",\n \"choices\": [\"A) 7\", \"B) 15\", \"C) 31\", \"D) 63\"],\n \"answer\": \"B\",\n \"category\": \"pattern\"\n },\n {\n \"id\": 33,\n \"question\": \"In hexadecimal, A + 5 equals decimal:\",\n \"choices\": [\"A) 13\", \"B) 14\", \"C) 15\", \"D) 16\"],\n \"answer\": \"C\",\n \"category\": \"computing\"\n },\n {\n \"id\": 34,\n \"question\": \"If f is strictly increasing and f(3)=10, what can be concluded about f(5)?\",\n \"choices\": [\"A) f(5) < 10\", \"B) f(5) = 10\", \"C) f(5) <= 10\", \"D) f(5) > 10\"],\n \"answer\": \"D\",\n \"category\": \"logic\"\n },\n {\n \"id\": 35,\n \"question\": \"Which sorting algorithm is not comparison-based in standard form?\",\n \"choices\": [\"A) Merge sort\", \"B) Quick sort\", \"C) Heap sort\", \"D) Counting sort\"],\n \"answer\": \"D\",\n \"category\": \"computing\"\n },\n {\n \"id\": 36,\n \"question\": \"How many 4-digit PIN codes exist (digits 0-9, repetition allowed)?\",\n \"choices\": [\"A) 10000\", \"B) 9000\", \"C) 5040\", \"D) 4096\"],\n \"answer\": \"A\",\n \"category\": \"combinatorics\"\n },\n {\n \"id\": 37,\n \"question\": \"70 people have cats, 45 have dogs, 30 have both. How many have at least one of cat/dog?\",\n \"choices\": [\"A) 100\", \"B) 95\", \"C) 85\", \"D) 75\"],\n \"answer\": \"C\",\n \"category\": \"set_theory\"\n },\n {\n \"id\": 38,\n \"question\": \"5 workers in 5 days make 100 units. At same rate, 10 workers in 3 days make:\",\n \"choices\": [\"A) 90\", \"B) 120\", \"C) 150\", \"D) 200\"],\n \"answer\": \"B\",\n \"category\": \"quantitative\"\n },\n {\n \"id\": 39,\n \"question\": \"For 1 <= x <= 3, maximum of -x^2 + 4x is:\",\n \"choices\": [\"A) 3\", \"B) 3.5\", \"C) 4\", \"D) 5\"],\n \"answer\": \"C\",\n \"category\": \"algebra\"\n },\n {\n \"id\": 40,\n \"question\": \"Which expression is a tautology?\",\n \"choices\": [\"A) p OR (NOT p)\", \"B) p AND (NOT p)\", \"C) p XOR p\", \"D) NOT (p OR (NOT p))\"],\n \"answer\": \"A\",\n \"category\": \"logic\"\n },\n {\n \"id\": 41,\n \"question\": \"No politicians are honest. Some honest people are kind. All kind people are respected. Which conclusion must be true?\",\n \"choices\": [\"A) No politicians are respected\", \"B) Some respected people are not politicians\", \"C) All respected people are honest\", \"D) No kind people are politicians\"],\n \"answer\": \"B\",\n \"category\": \"logic-negation\"\n },\n {\n \"id\": 42,\n \"question\": \"If it is not raining, then the ground is not wet. The ground is wet. Which conclusion follows?\",\n \"choices\": [\"A) It is raining\", \"B) It is not raining\", \"C) The ground might be dry\", \"D) No conclusion can be drawn\"],\n \"answer\": \"A\",\n \"category\": \"logic-negation\"\n },\n {\n \"id\": 43,\n \"question\": \"Alice is taller than Bob. Carol is shorter than David. David is shorter than Bob. Eve is taller than Alice. Who is the third tallest?\",\n \"choices\": [\"A) Alice\", \"B) Bob\", \"C) David\", \"D) Carol\"],\n \"answer\": \"A\",\n \"category\": \"multi-step\"\n },\n {\n \"id\": 44,\n \"question\": \"In a tournament with 5 players (A, B, C, D, E): A beat B, B beat C, C beat D, D beat E, and E beat A. B beat D, and C beat E. A beat C. How many players have exactly 2 wins?\",\n \"choices\": [\"A) 1\", \"B) 2\", \"C) 3\", \"D) 4\"],\n \"answer\": \"C\",\n \"category\": \"multi-step\"\n },\n {\n \"id\": 45,\n \"question\": \"A factory produces items in 3 shifts. Day shift has 2% defect rate, evening shift has 3%, and night shift has 6%. Day shift produces 50% of items, evening 30%, night 20%. If a randomly chosen item is defective, which shift most likely produced it?\",\n \"choices\": [\"A) Day shift\", \"B) Evening shift\", \"C) Night shift\", \"D) Equal probability\"],\n \"answer\": \"C\",\n \"category\": \"multi-step\"\n },\n {\n \"id\": 46,\n \"question\": \"Hand is to glove as foot is to sock. Painter is to canvas as sculptor is to:\",\n \"choices\": [\"A) Brush\", \"B) Clay\", \"C) Gallery\", \"D) Art\"],\n \"answer\": \"B\",\n \"category\": \"analogy\"\n },\n {\n \"id\": 47,\n \"question\": \"Algorithm is to computation as recipe is to cooking. Blueprint is to building as genome is to:\",\n \"choices\": [\"A) DNA\", \"B) Organism\", \"C) Cell\", \"D) Evolution\"],\n \"answer\": \"B\",\n \"category\": \"analogy\"\n },\n {\n \"id\": 48,\n \"question\": \"A barber shaves all those, and only those, who do not shave themselves. Does the barber shave himself? This is known as the barber paradox. Which best describes the logical status?\",\n \"choices\": [\"A) The barber shaves himself\", \"B) The barber does not shave himself\", \"C) The scenario is self-contradictory\", \"D) It depends on additional information\"],\n \"answer\": \"C\",\n \"category\": \"paradox\"\n },\n {\n \"id\": 49,\n \"question\": \"You have two coins. One is fair (50/50). The other is biased and always shows heads. You pick a coin at random and flip it — it shows heads. What is the probability you picked the fair coin?\",\n \"choices\": [\"A) 1/4\", \"B) 1/3\", \"C) 1/2\", \"D) 2/3\"],\n \"answer\": \"B\",\n \"category\": \"probabilistic\"\n },\n {\n \"id\": 50,\n \"question\": \"A test for a disease is 99% accurate (both sensitivity and specificity). The disease affects 1 in 1000 people. If someone tests positive, what is the approximate probability they actually have the disease?\",\n \"choices\": [\"A) About 9%\", \"B) About 50%\", \"C) About 91%\", \"D) About 99%\"],\n \"answer\": \"A\",\n \"category\": \"probabilistic\"\n }\n]\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, ReasoningQuestion, QuestionResult } from \"../types.js\";\nimport { extractChoice, stripThinkTags, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport reasoningData from \"../datasets/reasoning.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nconst questions = reasoningData as ReasoningQuestion[];\nconst DEFAULT_REASONING_TIMEOUT_MS = 120_000;\n\nexport async function runReasoningBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running reasoning benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let correct = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_REASONING_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < questions.length; i++) {\n const q = questions[i];\n spinner.text = `Reasoning ${i + 1}/${questions.length}: ${q.category}`;\n\n const prompt = `Answer the following multiple choice question. Reply with ONLY the letter (A, B, C, or D).\n\nQuestion: ${q.question}\n${q.choices.join(\"\\n\")}\n\nAnswer:`;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, prompt, withBenchmarkProfile({ num_predict: 1024, think: opts?.think })),\n timeoutMs,\n \"Reasoning question\",\n abortOngoingRequests\n );\n\n const answer = stripThinkTags(result.response);\n const actual = extractChoice(answer) ?? answer.trim();\n const isCorrect = actual === q.answer;\n if (isCorrect) correct++;\n\n details.push({\n id: q.id,\n question: q.question,\n expected: q.answer,\n actual,\n correct: isCorrect,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n details.push({\n id: q.id,\n question: q.question,\n expected: q.answer,\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Reasoning: ${correct}/${questions.length} correct`);\n } catch (err) {\n spinner.fail(\"Reasoning benchmark failed\");\n throw err;\n }\n\n return {\n score: questions.length > 0 ? (correct / questions.length) * 100 : 0,\n correct,\n total: questions.length,\n details,\n };\n}\n","[\n {\n \"id\": 1,\n \"question\": \"Compute 18 * (25 - 7).\",\n \"answer\": 324\n },\n {\n \"id\": 2,\n \"question\": \"Compute (3/4) + (5/6). Return decimal.\",\n \"answer\": 1.5833333333,\n \"tolerance\": 0.001\n },\n {\n \"id\": 3,\n \"question\": \"Simple interest: principal 1200, rate 5% per year, time 3 years. Interest amount?\",\n \"answer\": 180\n },\n {\n \"id\": 4,\n \"question\": \"After a 10% increase on 500, what is the new amount?\",\n \"answer\": 550\n },\n {\n \"id\": 5,\n \"question\": \"Solve for x: 2x - 7 = 5x + 8.\",\n \"answer\": -5\n },\n {\n \"id\": 6,\n \"question\": \"Area of a trapezoid with bases 10 and 16, height 7.\",\n \"answer\": 91\n },\n {\n \"id\": 7,\n \"question\": \"Weighted average: score 80 at 40% and score 92 at 60%.\",\n \"answer\": 87.2,\n \"tolerance\": 0.001\n },\n {\n \"id\": 8,\n \"question\": \"How many distinct permutations of the letters in LEVEL?\",\n \"answer\": 30\n },\n {\n \"id\": 9,\n \"question\": \"Probability of drawing an Ace from a standard 52-card deck. Return decimal.\",\n \"answer\": 0.0769230769,\n \"tolerance\": 0.001\n },\n {\n \"id\": 10,\n \"question\": \"For x^2 - 5x + 6 = 0, what is the sum of roots?\",\n \"answer\": 5\n },\n {\n \"id\": 11,\n \"question\": \"Distance between points (2,3) and (10,15). Return decimal.\",\n \"answer\": 14.4222051019,\n \"tolerance\": 0.001\n },\n {\n \"id\": 12,\n \"question\": \"Convert 72 km/h to m/s.\",\n \"answer\": 20\n },\n {\n \"id\": 13,\n \"question\": \"If f(x)=x^2-4x+1, compute f(-3).\",\n \"answer\": 22\n },\n {\n \"id\": 14,\n \"question\": \"15 workers finish a job in 12 days. At same rate, how many days for 20 workers?\",\n \"answer\": 9\n },\n {\n \"id\": 15,\n \"question\": \"Sum the geometric series: 3 + 6 + 12 + 24 + 48.\",\n \"answer\": 93\n },\n {\n \"id\": 16,\n \"question\": \"Find the median of [4, 9, 1, 7, 3, 8, 5].\",\n \"answer\": 5\n },\n {\n \"id\": 17,\n \"question\": \"Solve system: x+y=13 and x-y=5. Return x*y.\",\n \"answer\": 36\n },\n {\n \"id\": 18,\n \"question\": \"Volume of cylinder with radius 3 and height 10. Use pi=3.14.\",\n \"answer\": 282.6,\n \"tolerance\": 0.001\n },\n {\n \"id\": 19,\n \"question\": \"Price rises from 80 to 92. Percent increase?\",\n \"answer\": 15\n },\n {\n \"id\": 20,\n \"question\": \"Compute 7 choose 2.\",\n \"answer\": 21\n },\n {\n \"id\": 21,\n \"question\": \"Arithmetic sequence with first term 5 and difference 3. Find the 20th term.\",\n \"answer\": 62\n },\n {\n \"id\": 22,\n \"question\": \"Compute log10(100000).\",\n \"answer\": 5\n },\n {\n \"id\": 23,\n \"question\": \"Each of two independent machines fails with probability 0.02. Probability both fail?\",\n \"answer\": 0.0004,\n \"tolerance\": 0.0001\n },\n {\n \"id\": 24,\n \"question\": \"In a triangle, two angles are 35 and 65 degrees. Third angle?\",\n \"answer\": 80\n },\n {\n \"id\": 25,\n \"question\": \"Simplify (2^5 * 2^3) / 2^4.\",\n \"answer\": 16\n },\n {\n \"id\": 26,\n \"question\": \"A car worth 30000 depreciates by 20%, then by 10%. Final value?\",\n \"answer\": 21600\n },\n {\n \"id\": 27,\n \"question\": \"A 30-liter solution is 20% salt. How many liters of pure water to add to make it 15% salt?\",\n \"answer\": 10\n },\n {\n \"id\": 28,\n \"question\": \"Volume of rectangular prism 8 x 5 x 3.\",\n \"answer\": 120\n },\n {\n \"id\": 29,\n \"question\": \"Solve |2x-7|=9. Return the product of both solutions.\",\n \"answer\": -8\n },\n {\n \"id\": 30,\n \"question\": \"Least common multiple of 18 and 24.\",\n \"answer\": 72\n },\n {\n \"id\": 31,\n \"question\": \"Average speed for 150 km in 2.5 hours (km/h).\",\n \"answer\": 60\n },\n {\n \"id\": 32,\n \"question\": \"Given P(A)=0.7, P(B)=0.5, P(A and B)=0.4, compute P(A or B).\",\n \"answer\": 0.8,\n \"tolerance\": 0.001\n },\n {\n \"id\": 33,\n \"question\": \"Compound annually: 1000 at 8% for 3 years. Final amount?\",\n \"answer\": 1259.712,\n \"tolerance\": 0.01\n },\n {\n \"id\": 34,\n \"question\": \"Convert binary 110011 to decimal.\",\n \"answer\": 51\n },\n {\n \"id\": 35,\n \"question\": \"Solve for x: 5/(x-1) = 1/2.\",\n \"answer\": 11\n },\n {\n \"id\": 36,\n \"question\": \"Sequence 1,4,9,16,... Find the 15th term.\",\n \"answer\": 225\n },\n {\n \"id\": 37,\n \"question\": \"If 40% of a number is 56, what is the number?\",\n \"answer\": 140\n },\n {\n \"id\": 38,\n \"question\": \"Area of a sector with radius 10 and angle 72 degrees. Use pi=3.14.\",\n \"answer\": 62.8,\n \"tolerance\": 0.01\n },\n {\n \"id\": 39,\n \"question\": \"Population 50000 grows by 2% yearly for 2 years. New population?\",\n \"answer\": 52020\n },\n {\n \"id\": 40,\n \"question\": \"Harmonic mean of 4 and 6.\",\n \"answer\": 4.8,\n \"tolerance\": 0.001\n },\n {\n \"id\": 41,\n \"question\": \"A store offers a 20% discount, then an additional 15% off the discounted price. What is the total percentage discount from the original price?\",\n \"answer\": 32,\n \"tolerance\": 0.01\n },\n {\n \"id\": 42,\n \"question\": \"A train travels 120 km at 60 km/h, then 180 km at 90 km/h. What is the average speed for the entire journey in km/h?\",\n \"answer\": 75,\n \"tolerance\": 0.01\n },\n {\n \"id\": 43,\n \"question\": \"Compute the determinant of the 2x2 matrix [[3, 7], [1, 5]].\",\n \"answer\": 8\n },\n {\n \"id\": 44,\n \"question\": \"What is the sum of the first 100 positive integers?\",\n \"answer\": 5050\n },\n {\n \"id\": 45,\n \"question\": \"What is the 10th term of the geometric sequence that starts with 2 and has common ratio 3?\",\n \"answer\": 39366\n },\n {\n \"id\": 46,\n \"question\": \"A bag contains 5 red, 3 blue, and 2 green balls. If one ball is drawn, what is the probability it is NOT red? Express as a decimal.\",\n \"answer\": 0.5,\n \"tolerance\": 0.001\n },\n {\n \"id\": 47,\n \"question\": \"What is 17 mod 5?\",\n \"answer\": 2\n },\n {\n \"id\": 48,\n \"question\": \"A factory produces 200 units/day at $5 each. Fixed cost is $300/day. Revenue is $8/unit. What is the daily profit?\",\n \"answer\": 300\n },\n {\n \"id\": 49,\n \"question\": \"What is the derivative of f(x) = 3x^2 + 2x - 1 evaluated at x = 4?\",\n \"answer\": 26\n },\n {\n \"id\": 50,\n \"question\": \"What is the integral of 2x from x = 0 to x = 5?\",\n \"answer\": 25\n }\n]\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, MathProblem, QuestionResult } from \"../types.js\";\nimport { extractNumber, stripThinkTags, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport mathData from \"../datasets/math.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nconst problems = mathData as MathProblem[];\nconst DEFAULT_MATH_TIMEOUT_MS = 120_000;\n\nexport async function runMathBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running math benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let correct = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_MATH_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < problems.length; i++) {\n const p = problems[i];\n spinner.text = `Math ${i + 1}/${problems.length}`;\n\n const prompt = `Solve the following math problem. Give ONLY the numerical answer, nothing else.\n\nProblem: ${p.question}\n\nAnswer:`;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, prompt, withBenchmarkProfile({ num_predict: 1024, think: opts?.think })),\n timeoutMs,\n \"Math problem\",\n abortOngoingRequests\n );\n\n const actual = extractNumber(stripThinkTags(result.response));\n // Use absolute tolerance only when explicitly provided by the dataset.\n // Relative tolerance was overly permissive on large values.\n const tolerance = p.tolerance ?? 0;\n const isCorrect =\n actual !== null && Math.abs(actual - p.answer) <= tolerance;\n\n if (isCorrect) correct++;\n\n details.push({\n id: p.id,\n question: p.question,\n expected: String(p.answer),\n actual: actual !== null ? String(actual) : result.response.trim(),\n correct: isCorrect,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n details.push({\n id: p.id,\n question: p.question,\n expected: String(p.answer),\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Math: ${correct}/${problems.length} correct`);\n } catch (err) {\n spinner.fail(\"Math benchmark failed\");\n throw err;\n }\n\n return {\n score: problems.length > 0 ? (correct / problems.length) * 100 : 0,\n correct,\n total: problems.length,\n details,\n };\n}\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, CodingTask, QuestionResult } from \"../types.js\";\nimport { extractCodeBlock, stripThinkTags, stripTypeAnnotations, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport vm from \"node:vm\";\nimport { spawn } from \"node:child_process\";\nimport { Worker } from \"node:worker_threads\";\nimport codingData from \"../datasets/coding.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nconst VALID_IDENTIFIER_RE = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\nconst tasks = codingData as CodingTask[];\n\nfunction deepEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== typeof b) return false;\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((val, i) => deepEqual(val, b[i]));\n }\n\n if (typeof a === \"object\" && typeof b === \"object\") {\n const keysA = Object.keys(a as Record<string, unknown>).sort();\n const keysB = Object.keys(b as Record<string, unknown>).sort();\n if (!deepEqual(keysA, keysB)) return false;\n return keysA.every((key) =>\n deepEqual(\n (a as Record<string, unknown>)[key],\n (b as Record<string, unknown>)[key]\n )\n );\n }\n\n return false;\n}\n\nconst DIFFICULTY_WEIGHT: Record<string, number> = {\n easy: 1,\n medium: 2,\n hard: 3,\n};\n\nconst SANDBOX_TIMEOUT_MS = 5_000;\nconst ISOLATED_WALL_TIMEOUT_MIN_MS = 8_000;\nconst ISOLATED_WALL_TIMEOUT_MAX_MS = 60_000;\nconst DEFAULT_CODING_TIMEOUT_MS = 240_000;\nconst MAX_SANDBOX_STDOUT_BYTES = 64 * 1024;\nconst MAX_SANDBOX_STDERR_BYTES = 64 * 1024;\n\nfunction runTestsInSandbox(\n code: string,\n task: CodingTask,\n sandboxTimeoutMs: number,\n vmModule: typeof vm\n): { passed: number; total: number } {\n let passed = 0;\n const total = task.tests.length;\n\n const VALID_ID = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n if (!VALID_ID.test(task.functionName)) {\n return { passed: 0, total };\n }\n\n try {\n const noop = () => {};\n const sandbox = Object.create(null) as vm.Context & {\n console?: Record<string, () => void>;\n __testFn?: unknown;\n };\n // Prevent untrusted snippets from spamming stdout/stderr in the isolated runner.\n sandbox.console = Object.freeze({\n log: noop,\n info: noop,\n warn: noop,\n error: noop,\n debug: noop,\n trace: noop,\n });\n const context = vmModule.createContext(sandbox, {\n codeGeneration: {\n strings: false,\n wasm: false,\n },\n });\n\n const script = new vmModule.Script(\n `${code}\\nglobalThis.__testFn = typeof ${task.functionName} === 'function' ? ${task.functionName} : undefined;`\n );\n script.runInContext(context, { timeout: sandboxTimeoutMs });\n\n if (typeof sandbox.__testFn !== \"function\") {\n return { passed: 0, total };\n }\n\n for (const test of task.tests) {\n try {\n const testInputJson = JSON.stringify(structuredClone(test.input));\n const testScript = new vmModule.Script(`__testFn(...${testInputJson})`);\n const result = testScript.runInContext(context, { timeout: sandboxTimeoutMs });\n if (deepEqual(result, test.expected)) {\n passed++;\n }\n } catch {\n // test failed or timed out\n }\n }\n } catch {\n // compile/run failed\n }\n\n return { passed, total };\n}\n\nfunction computeIsolatedWallTimeoutMs(task: CodingTask): number {\n const estimated = (task.tests.length + 1) * SANDBOX_TIMEOUT_MS + 1_000;\n return Math.min(\n ISOLATED_WALL_TIMEOUT_MAX_MS,\n Math.max(ISOLATED_WALL_TIMEOUT_MIN_MS, estimated)\n );\n}\n\nconst CODING_ISOLATED_SOURCE = `\nvar __name = (fn, _name) => fn;\nconst deepEqual = ${deepEqual.toString()};\nconst runTestsInSandbox = ${runTestsInSandbox.toString()};\nconst vm = require(\"node:vm\");\n\nlet payload = null;\nlet input = \"\";\nprocess.stdin.setEncoding(\"utf8\");\nprocess.stdin.on(\"data\", (chunk) => {\n input += chunk;\n});\nprocess.stdin.on(\"end\", () => {\n try {\n payload = JSON.parse(input || \"{}\");\n const result = runTestsInSandbox(\n typeof payload.code === \"string\" ? payload.code : \"\",\n payload.task,\n typeof payload.sandboxTimeoutMs === \"number\" ? payload.sandboxTimeoutMs : 5000,\n vm\n );\n process.stdout.write(JSON.stringify(result));\n } catch (err) {\n const total = Array.isArray(payload?.task?.tests) ? payload.task.tests.length : 0;\n process.stdout.write(\n JSON.stringify({\n passed: 0,\n total,\n error: err instanceof Error ? err.message : String(err),\n })\n );\n }\n});\n`;\n\nconst CODING_WORKER_SOURCE = `\nvar __name = (fn, _name) => fn;\nconst deepEqual = ${deepEqual.toString()};\nconst runTestsInSandbox = ${runTestsInSandbox.toString()};\nconst { parentPort, workerData } = require(\"node:worker_threads\");\nconst vm = require(\"node:vm\");\n\ntry {\n const payload = runTestsInSandbox(\n workerData.code,\n workerData.task,\n workerData.sandboxTimeoutMs,\n vm\n );\n parentPort.postMessage(payload);\n} catch (err) {\n const total = Array.isArray(workerData?.task?.tests) ? workerData.task.tests.length : 0;\n parentPort.postMessage({\n passed: 0,\n total,\n error: err instanceof Error ? err.message : String(err),\n });\n}\n`;\n\nexport function runTests(code: string, task: CodingTask): { passed: number; total: number } {\n return runTestsInSandbox(code, task, SANDBOX_TIMEOUT_MS, vm);\n}\n\nfunction parseIsolatedResult(\n raw: string,\n fallbackTotal: number\n): { passed: number; total: number } | null {\n const text = raw.trim();\n if (!text) return null;\n try {\n const parsed = JSON.parse(text) as { passed?: unknown; total?: unknown };\n if (typeof parsed.passed !== \"number\" || !Number.isFinite(parsed.passed)) return null;\n const rawTotal = typeof parsed.total === \"number\" && Number.isFinite(parsed.total)\n ? parsed.total\n : fallbackTotal;\n const total = Math.max(0, Math.trunc(rawTotal));\n const passed = Math.max(0, Math.min(total, Math.trunc(parsed.passed)));\n return { passed, total };\n } catch {\n return null;\n }\n}\n\nfunction sandboxProcessEnv(): NodeJS.ProcessEnv {\n const env: NodeJS.ProcessEnv = {};\n const passthrough = [\n \"PATH\",\n \"HOME\",\n \"TMPDIR\",\n \"TMP\",\n \"TEMP\",\n \"SystemRoot\",\n \"WINDIR\",\n \"COMSPEC\",\n ] as const;\n for (const key of passthrough) {\n const value = process.env[key];\n if (value) env[key] = value;\n }\n env.NODE_ENV = \"production\";\n return env;\n}\n\nfunction resolveSandboxMode(): \"subprocess\" | \"worker\" {\n const raw = process.env.METRILLM_CODING_SANDBOX?.trim().toLowerCase();\n if (raw === \"worker\") return \"worker\";\n return \"subprocess\";\n}\n\nfunction allowWorkerFallback(): boolean {\n const raw = process.env.METRILLM_CODING_ALLOW_WORKER_FALLBACK?.trim().toLowerCase();\n return raw === \"1\" || raw === \"true\" || raw === \"yes\";\n}\n\nasync function runTestsInSubprocess(\n code: string,\n task: CodingTask\n): Promise<{ passed: number; total: number } | null> {\n const total = task.tests.length;\n\n return new Promise((resolve) => {\n const wallTimeoutMs = computeIsolatedWallTimeoutMs(task);\n const child = spawn(\n process.execPath,\n [\n \"--max-old-space-size=96\",\n \"--input-type=commonjs\",\n \"-e\",\n CODING_ISOLATED_SOURCE,\n ],\n {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: sandboxProcessEnv(),\n }\n );\n\n let settled = false;\n let stdout = \"\";\n let stderr = \"\";\n let stdoutBytes = 0;\n let stderrBytes = 0;\n const finish = (result: { passed: number; total: number } | null) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve(result);\n };\n\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk) => {\n stdoutBytes += Buffer.byteLength(chunk, \"utf8\");\n if (stdoutBytes > MAX_SANDBOX_STDOUT_BYTES) {\n child.kill(\"SIGKILL\");\n finish(null);\n return;\n }\n stdout += chunk;\n });\n\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk) => {\n stderrBytes += Buffer.byteLength(chunk, \"utf8\");\n if (stderrBytes > MAX_SANDBOX_STDERR_BYTES) {\n child.kill(\"SIGKILL\");\n finish(null);\n return;\n }\n stderr += chunk;\n });\n\n const timer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n // A timeout is considered a task failure (0/N), not infra failure.\n finish({ passed: 0, total });\n }, wallTimeoutMs);\n\n child.once(\"error\", () => {\n finish(null);\n });\n\n child.once(\"close\", (code) => {\n const parsed = parseIsolatedResult(stdout, total);\n if (parsed) {\n finish(parsed);\n return;\n }\n // Unparseable/missing payload is an infra failure, not a model failure.\n finish(null);\n });\n\n try {\n const payload = JSON.stringify({\n code,\n task,\n sandboxTimeoutMs: SANDBOX_TIMEOUT_MS,\n });\n child.stdin.write(payload);\n child.stdin.end();\n } catch {\n child.kill(\"SIGKILL\");\n finish(null);\n }\n });\n}\n\nasync function runTestsInWorker(\n code: string,\n task: CodingTask\n): Promise<{ passed: number; total: number }> {\n const total = task.tests.length;\n\n return new Promise((resolve) => {\n const wallTimeoutMs = computeIsolatedWallTimeoutMs(task);\n const worker = new Worker(CODING_WORKER_SOURCE, {\n eval: true,\n workerData: {\n code,\n task,\n sandboxTimeoutMs: SANDBOX_TIMEOUT_MS,\n },\n resourceLimits: {\n maxOldGenerationSizeMb: 64,\n maxYoungGenerationSizeMb: 16,\n stackSizeMb: 4,\n },\n });\n\n let settled = false;\n const finish = (result: { passed: number; total: number }) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n worker.removeAllListeners();\n resolve(result);\n };\n\n const timer = setTimeout(() => {\n void worker.terminate().finally(() => {\n finish({ passed: 0, total });\n });\n }, wallTimeoutMs);\n\n worker.once(\"message\", (msg: unknown) => {\n const passed = typeof (msg as { passed?: unknown })?.passed === \"number\"\n ? (msg as { passed: number }).passed\n : 0;\n const reportedTotal = typeof (msg as { total?: unknown })?.total === \"number\"\n ? (msg as { total: number }).total\n : total;\n finish({ passed, total: reportedTotal });\n void worker.terminate();\n });\n\n worker.once(\"error\", () => {\n finish({ passed: 0, total });\n });\n\n worker.once(\"exit\", () => {\n if (!settled) {\n finish({ passed: 0, total });\n }\n });\n });\n}\n\nasync function runTestsIsolated(\n code: string,\n task: CodingTask\n): Promise<{ passed: number; total: number }> {\n const total = task.tests.length;\n if (resolveSandboxMode() === \"worker\") {\n return runTestsInWorker(code, task);\n }\n\n const firstAttempt = await runTestsInSubprocess(code, task);\n if (firstAttempt) return firstAttempt;\n\n // Retry once to reduce random infra flakiness (process bootstrap noise).\n const secondAttempt = await runTestsInSubprocess(code, task);\n if (secondAttempt) return secondAttempt;\n\n // Security-first default: avoid silently downgrading to a weaker isolation model.\n if (allowWorkerFallback()) {\n return runTestsInWorker(code, task);\n }\n throw new Error(\n \"Coding sandbox infrastructure failure (set METRILLM_CODING_ALLOW_WORKER_FALLBACK=true to allow worker fallback)\"\n );\n}\n\nexport async function runCodingBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running coding benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let totalPassed = 0;\n let totalTests = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_CODING_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n if (!VALID_IDENTIFIER_RE.test(task.functionName)) {\n details.push({\n id: task.id,\n question: task.description,\n expected: `${task.tests.length} tests pass`,\n actual: \"ERROR: invalid function name in dataset\",\n correct: false,\n timeMs: 0,\n });\n totalTests += task.tests.length;\n continue;\n }\n spinner.text = `Coding ${i + 1}/${tasks.length}: ${task.functionName}`;\n\n const prompt = `Write a JavaScript function with the following signature:\n${task.signature}\n\n${task.description}\n\nReply with ONLY the function code, no explanation.`;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, prompt, withBenchmarkProfile({ num_predict: 2048, think: opts?.think })),\n timeoutMs,\n \"Coding task\",\n abortOngoingRequests\n );\n\n const rawCode = extractCodeBlock(stripThinkTags(result.response), task.functionName);\n const code = stripTypeAnnotations(rawCode);\n const { passed, total } = await runTestsIsolated(code, task);\n totalPassed += passed;\n totalTests += total;\n\n const allPassed = passed === total;\n\n details.push({\n id: task.id,\n question: task.description,\n expected: `${total} tests pass`,\n actual: `${passed}/${total} tests pass`,\n correct: allPassed,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n totalTests += task.tests.length;\n details.push({\n id: task.id,\n question: task.description,\n expected: `${task.tests.length} tests pass`,\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Coding: ${details.filter((d) => d.correct).length}/${tasks.length} tasks fully passed`);\n } catch (err) {\n spinner.fail(\"Coding benchmark failed\");\n throw err;\n }\n\n // Difficulty-weighted, all-or-nothing scoring: a task scores its weight\n // only when ALL its tests pass. Easy tasks count less than hard ones.\n let weightedPassed = 0;\n let weightedTotal = 0;\n for (let i = 0; i < tasks.length; i++) {\n const w = DIFFICULTY_WEIGHT[tasks[i].difficulty ?? \"medium\"] ?? 2;\n weightedTotal += w;\n if (details[i].correct) {\n weightedPassed += w;\n }\n }\n\n const tasksPassed = details.filter((d) => d.correct).length;\n return {\n score: weightedTotal > 0 ? (weightedPassed / weightedTotal) * 100 : 0,\n correct: tasksPassed,\n total: tasks.length,\n details,\n };\n}\n","[\n {\n \"id\": 1,\n \"description\": \"Write a function that groups an array of strings by their first letter. Return an object where keys are lowercase letters and values are arrays of matching strings (original case preserved).\",\n \"functionName\": \"groupByFirstLetter\",\n \"signature\": \"function groupByFirstLetter(words)\",\n \"tests\": [\n {\n \"input\": [\n [\n \"apple\",\n \"Avocado\",\n \"banana\",\n \"Blueberry\",\n \"cherry\"\n ]\n ],\n \"expected\": {\n \"a\": [\n \"apple\",\n \"Avocado\"\n ],\n \"b\": [\n \"banana\",\n \"Blueberry\"\n ],\n \"c\": [\n \"cherry\"\n ]\n }\n },\n {\n \"input\": [\n []\n ],\n \"expected\": {}\n },\n {\n \"input\": [\n [\n \"hello\"\n ]\n ],\n \"expected\": {\n \"h\": [\n \"hello\"\n ]\n }\n },\n {\n \"input\": [\n [\n \"Abc\",\n \"abc\",\n \"ABc\"\n ]\n ],\n \"expected\": {\n \"a\": [\n \"Abc\",\n \"abc\",\n \"ABc\"\n ]\n }\n },\n {\n \"input\": [\n [\n \"x\",\n \"y\",\n \"z\"\n ]\n ],\n \"expected\": {\n \"x\": [\n \"x\"\n ],\n \"y\": [\n \"y\"\n ],\n \"z\": [\n \"z\"\n ]\n }\n },\n {\n \"input\": [\n [\n \"Dog\",\n \"duck\",\n \"Deer\",\n \"cat\"\n ]\n ],\n \"expected\": {\n \"d\": [\n \"Dog\",\n \"duck\",\n \"Deer\"\n ],\n \"c\": [\n \"cat\"\n ]\n }\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 2,\n \"description\": \"Write a function that implements run-length encoding. Given a string, return an array of [char, count] pairs for consecutive runs.\",\n \"functionName\": \"runLengthEncode\",\n \"signature\": \"function runLengthEncode(s)\",\n \"tests\": [\n {\n \"input\": [\n \"aaabbc\"\n ],\n \"expected\": [\n [\n \"a\",\n 3\n ],\n [\n \"b\",\n 2\n ],\n [\n \"c\",\n 1\n ]\n ]\n },\n {\n \"input\": [\n \"\"\n ],\n \"expected\": []\n },\n {\n \"input\": [\n \"a\"\n ],\n \"expected\": [\n [\n \"a\",\n 1\n ]\n ]\n },\n {\n \"input\": [\n \"aabba\"\n ],\n \"expected\": [\n [\n \"a\",\n 2\n ],\n [\n \"b\",\n 2\n ],\n [\n \"a\",\n 1\n ]\n ]\n },\n {\n \"input\": [\n \"xxxyz\"\n ],\n \"expected\": [\n [\n \"x\",\n 3\n ],\n [\n \"y\",\n 1\n ],\n [\n \"z\",\n 1\n ]\n ]\n },\n {\n \"input\": [\n \"abcde\"\n ],\n \"expected\": [\n [\n \"a\",\n 1\n ],\n [\n \"b\",\n 1\n ],\n [\n \"c\",\n 1\n ],\n [\n \"d\",\n 1\n ],\n [\n \"e\",\n 1\n ]\n ]\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 3,\n \"description\": \"Write a function that deep flattens a nested array. E.g. [1,[2,[3,[4]]],5] => [1,2,3,4,5].\",\n \"functionName\": \"deepFlatten\",\n \"signature\": \"function deepFlatten(arr)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 1,\n [\n 2,\n [\n 3,\n [\n 4\n ]\n ]\n ],\n 5\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3,\n 4,\n 5\n ]\n },\n {\n \"input\": [\n [\n []\n ]\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [\n [\n 1,\n 2,\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n [\n [\n [\n 1\n ]\n ]\n ]\n ]\n ]\n ],\n \"expected\": [\n 1\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n [],\n 2,\n [\n 3,\n []\n ]\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n \"a\",\n [\n \"b\",\n [\n \"c\"\n ]\n ]\n ]\n ]\n ],\n \"expected\": [\n \"a\",\n \"b\",\n \"c\"\n ]\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 4,\n \"description\": \"Write a function that returns all permutations of a string. Return sorted array of unique permutations.\",\n \"functionName\": \"permutations\",\n \"signature\": \"function permutations(s)\",\n \"tests\": [\n {\n \"input\": [\n \"ab\"\n ],\n \"expected\": [\n \"ab\",\n \"ba\"\n ]\n },\n {\n \"input\": [\n \"a\"\n ],\n \"expected\": [\n \"a\"\n ]\n },\n {\n \"input\": [\n \"abc\"\n ],\n \"expected\": [\n \"abc\",\n \"acb\",\n \"bac\",\n \"bca\",\n \"cab\",\n \"cba\"\n ]\n },\n {\n \"input\": [\n \"\"\n ],\n \"expected\": [\n \"\"\n ]\n },\n {\n \"input\": [\n \"aa\"\n ],\n \"expected\": [\n \"aa\"\n ]\n },\n {\n \"input\": [\n \"aba\"\n ],\n \"expected\": [\n \"aab\",\n \"aba\",\n \"baa\"\n ]\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 5,\n \"description\": \"Write a function that converts a Roman numeral string to an integer. Handle values I(1), V(5), X(10), L(50), C(100), D(500), M(1000) with subtractive notation.\",\n \"functionName\": \"romanToInt\",\n \"signature\": \"function romanToInt(s)\",\n \"tests\": [\n {\n \"input\": [\n \"III\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"IV\"\n ],\n \"expected\": 4\n },\n {\n \"input\": [\n \"IX\"\n ],\n \"expected\": 9\n },\n {\n \"input\": [\n \"MCMXCIV\"\n ],\n \"expected\": 1994\n },\n {\n \"input\": [\n \"XLII\"\n ],\n \"expected\": 42\n },\n {\n \"input\": [\n \"DCCCXC\"\n ],\n \"expected\": 890\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 6,\n \"description\": \"Write a function that finds the first non-repeating character in a string and returns its index. Return -1 if none.\",\n \"functionName\": \"firstUniqCharIndex\",\n \"signature\": \"function firstUniqCharIndex(s)\",\n \"tests\": [\n {\n \"input\": [\n \"leetcode\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"loveleetcode\"\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n \"aabb\"\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n \"\"\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n \"a\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"abacabad\"\n ],\n \"expected\": 3\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 7,\n \"description\": \"Write a function that removes duplicate values from an array, preserving order.\",\n \"functionName\": \"removeDuplicates\",\n \"signature\": \"function removeDuplicates(arr)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 2,\n 2,\n 3,\n 3,\n 3\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n \"a\",\n \"b\",\n \"a\"\n ]\n ],\n \"expected\": [\n \"a\",\n \"b\"\n ]\n },\n {\n \"input\": [\n []\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [\n 1,\n 1,\n 1\n ]\n ],\n \"expected\": [\n 1\n ]\n },\n {\n \"input\": [\n [\n true,\n false,\n true,\n true\n ]\n ],\n \"expected\": [\n true,\n false\n ]\n },\n {\n \"input\": [\n [\n 1,\n \"1\",\n 1,\n \"1\"\n ]\n ],\n \"expected\": [\n 1,\n \"1\"\n ]\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 8,\n \"description\": \"Write a function that counts the number of vowels (a, e, i, o, u) in a string (case-insensitive).\",\n \"functionName\": \"countVowels\",\n \"signature\": \"function countVowels(str)\",\n \"tests\": [\n {\n \"input\": [\n \"hello\"\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n \"AEIOU\"\n ],\n \"expected\": 5\n },\n {\n \"input\": [\n \"xyz\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"The quick brown fox\"\n ],\n \"expected\": 5\n },\n {\n \"input\": [\n \"rhythms\"\n ],\n \"expected\": 0\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 9,\n \"description\": \"Write a function that flattens a nested array one level deep.\",\n \"functionName\": \"flatten\",\n \"signature\": \"function flatten(arr)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3,\n 4\n ]\n },\n {\n \"input\": [\n [\n [\n 1\n ],\n [\n 2\n ],\n [\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n []\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [\n [\n 1,\n [\n 2,\n 3\n ]\n ]\n ]\n ],\n \"expected\": [\n 1,\n [\n 2,\n 3\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2\n ],\n [],\n [\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n \"a\"\n ],\n [\n \"b\",\n \"c\"\n ]\n ]\n ],\n \"expected\": [\n \"a\",\n \"b\",\n \"c\"\n ]\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 10,\n \"description\": \"Write a function that converts a string to title case (first letter of each word capitalized).\",\n \"functionName\": \"toTitleCase\",\n \"signature\": \"function toTitleCase(str)\",\n \"tests\": [\n {\n \"input\": [\n \"hello world\"\n ],\n \"expected\": \"Hello World\"\n },\n {\n \"input\": [\n \"javaScript is fun\"\n ],\n \"expected\": \"Javascript Is Fun\"\n },\n {\n \"input\": [\n \"\"\n ],\n \"expected\": \"\"\n },\n {\n \"input\": [\n \"a\"\n ],\n \"expected\": \"A\"\n },\n {\n \"input\": [\n \"hello WORLD\"\n ],\n \"expected\": \"Hello World\"\n },\n {\n \"input\": [\n \"mIXed cAsE tExt\"\n ],\n \"expected\": \"Mixed Case Text\"\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 11,\n \"description\": \"Write a function that checks if a number is prime.\",\n \"functionName\": \"isPrime\",\n \"signature\": \"function isPrime(n)\",\n \"tests\": [\n {\n \"input\": [\n 2\n ],\n \"expected\": true\n },\n {\n \"input\": [\n 17\n ],\n \"expected\": true\n },\n {\n \"input\": [\n 1\n ],\n \"expected\": false\n },\n {\n \"input\": [\n 4\n ],\n \"expected\": false\n },\n {\n \"input\": [\n 0\n ],\n \"expected\": false\n },\n {\n \"input\": [\n 97\n ],\n \"expected\": true\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 12,\n \"description\": \"Write a function that returns the unique intersection of two arrays (common elements), sorted in ascending order for numbers and lexicographical order for strings.\",\n \"functionName\": \"intersection\",\n \"signature\": \"function intersection(a, b)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 2,\n 3\n ],\n [\n 2,\n 3,\n 4\n ]\n ],\n \"expected\": [\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ]\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [],\n [\n 1,\n 2\n ]\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [\n 1,\n 1,\n 2\n ],\n [\n 1,\n 2,\n 2\n ]\n ],\n \"expected\": [\n 1,\n 2\n ]\n },\n {\n \"input\": [\n [\n \"a\",\n \"b\",\n \"c\"\n ],\n [\n \"b\",\n \"d\",\n \"a\"\n ]\n ],\n \"expected\": [\n \"a\",\n \"b\"\n ]\n },\n {\n \"input\": [\n [\n 1,\n 2,\n 3\n ],\n [\n 3,\n 3,\n 3\n ]\n ],\n \"expected\": [\n 3\n ]\n }\n ],\n \"difficulty\": \"easy\"\n },\n {\n \"id\": 13,\n \"description\": \"Write a function that groups an array of objects by a given key.\",\n \"functionName\": \"groupBy\",\n \"signature\": \"function groupBy(arr, key)\",\n \"tests\": [\n {\n \"input\": [\n [\n {\n \"name\": \"Alice\",\n \"age\": 30\n },\n {\n \"name\": \"Bob\",\n \"age\": 30\n },\n {\n \"name\": \"Charlie\",\n \"age\": 25\n }\n ],\n \"age\"\n ],\n \"expected\": {\n \"25\": [\n {\n \"name\": \"Charlie\",\n \"age\": 25\n }\n ],\n \"30\": [\n {\n \"name\": \"Alice\",\n \"age\": 30\n },\n {\n \"name\": \"Bob\",\n \"age\": 30\n }\n ]\n }\n },\n {\n \"input\": [\n [],\n \"key\"\n ],\n \"expected\": {}\n },\n {\n \"input\": [\n [\n {\n \"t\": \"x\",\n \"v\": 1\n },\n {\n \"t\": \"y\",\n \"v\": 2\n },\n {\n \"t\": \"x\",\n \"v\": 3\n }\n ],\n \"t\"\n ],\n \"expected\": {\n \"x\": [\n {\n \"t\": \"x\",\n \"v\": 1\n },\n {\n \"t\": \"x\",\n \"v\": 3\n }\n ],\n \"y\": [\n {\n \"t\": \"y\",\n \"v\": 2\n }\n ]\n }\n },\n {\n \"input\": [\n [\n {\n \"name\": \"a\"\n },\n {\n \"name\": \"b\",\n \"age\": 20\n }\n ],\n \"age\"\n ],\n \"expected\": {\n \"20\": [\n {\n \"name\": \"b\",\n \"age\": 20\n }\n ],\n \"undefined\": [\n {\n \"name\": \"a\"\n }\n ]\n }\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 14,\n \"description\": \"Write a function that converts a number to its Roman numeral string representation (1-3999).\",\n \"functionName\": \"toRoman\",\n \"signature\": \"function toRoman(num)\",\n \"tests\": [\n {\n \"input\": [\n 1\n ],\n \"expected\": \"I\"\n },\n {\n \"input\": [\n 4\n ],\n \"expected\": \"IV\"\n },\n {\n \"input\": [\n 9\n ],\n \"expected\": \"IX\"\n },\n {\n \"input\": [\n 2024\n ],\n \"expected\": \"MMXXIV\"\n },\n {\n \"input\": [\n 58\n ],\n \"expected\": \"LVIII\"\n },\n {\n \"input\": [\n 3999\n ],\n \"expected\": \"MMMCMXCIX\"\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 15,\n \"description\": \"Write a function that implements binary search on a sorted array. Return the index if found, -1 otherwise.\",\n \"functionName\": \"binarySearch\",\n \"signature\": \"function binarySearch(arr, target)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 3,\n 5,\n 7,\n 9\n ],\n 5\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n [\n 1,\n 3,\n 5,\n 7,\n 9\n ],\n 4\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n [],\n 1\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n [\n 1\n ],\n 1\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n [\n 1,\n 3,\n 5,\n 7,\n 9\n ],\n 1\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n [\n 1,\n 3,\n 5,\n 7,\n 9\n ],\n 9\n ],\n \"expected\": 4\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 16,\n \"description\": \"Write a function that returns the longest common prefix among an array of strings.\",\n \"functionName\": \"longestCommonPrefix\",\n \"signature\": \"function longestCommonPrefix(words)\",\n \"tests\": [\n {\n \"input\": [\n [\n \"flower\",\n \"flow\",\n \"flight\"\n ]\n ],\n \"expected\": \"fl\"\n },\n {\n \"input\": [\n [\n \"dog\",\n \"racecar\",\n \"car\"\n ]\n ],\n \"expected\": \"\"\n },\n {\n \"input\": [\n [\n \"interspecies\",\n \"interstellar\",\n \"interstate\"\n ]\n ],\n \"expected\": \"inters\"\n },\n {\n \"input\": [\n [\n \"single\"\n ]\n ],\n \"expected\": \"single\"\n },\n {\n \"input\": [\n [\n \"\",\n \"b\"\n ]\n ],\n \"expected\": \"\"\n },\n {\n \"input\": [\n [\n \"throne\",\n \"throne\"\n ]\n ],\n \"expected\": \"throne\"\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 17,\n \"description\": \"Write a function that validates a bracket string containing (), [], and {}.\",\n \"functionName\": \"isValidBrackets\",\n \"signature\": \"function isValidBrackets(s)\",\n \"tests\": [\n {\n \"input\": [\n \"()[]{}\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"(]\"\n ],\n \"expected\": false\n },\n {\n \"input\": [\n \"([{}])\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"(((\"\n ],\n \"expected\": false\n },\n {\n \"input\": [\n \"{[()]}[]\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"([)]\"\n ],\n \"expected\": false\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 18,\n \"description\": \"Write a function that merges overlapping or touching intervals and returns them sorted by start.\",\n \"functionName\": \"mergeIntervals\",\n \"signature\": \"function mergeIntervals(intervals)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 1,\n 3\n ],\n [\n 2,\n 6\n ],\n [\n 8,\n 10\n ],\n [\n 15,\n 18\n ]\n ]\n ],\n \"expected\": [\n [\n 1,\n 6\n ],\n [\n 8,\n 10\n ],\n [\n 15,\n 18\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 4\n ],\n [\n 4,\n 5\n ]\n ]\n ],\n \"expected\": [\n [\n 1,\n 5\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 5,\n 7\n ],\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ]\n ]\n ],\n \"expected\": [\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ],\n [\n 5,\n 7\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 10\n ],\n [\n 2,\n 3\n ],\n [\n 4,\n 8\n ]\n ]\n ],\n \"expected\": [\n [\n 1,\n 10\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2\n ]\n ]\n ],\n \"expected\": [\n [\n 1,\n 2\n ]\n ]\n },\n {\n \"input\": [\n [\n [\n 2,\n 3\n ],\n [\n 3,\n 3\n ],\n [\n 5,\n 7\n ],\n [\n 6,\n 8\n ]\n ]\n ],\n \"expected\": [\n [\n 2,\n 3\n ],\n [\n 5,\n 8\n ]\n ]\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 19,\n \"description\": \"Write a function that returns the top-k frequent numbers, sorted by frequency desc then value asc for ties.\",\n \"functionName\": \"topKFrequent\",\n \"signature\": \"function topKFrequent(nums, k)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 1,\n 1,\n 2,\n 2,\n 3\n ],\n 2\n ],\n \"expected\": [\n 1,\n 2\n ]\n },\n {\n \"input\": [\n [\n 4,\n 4,\n 1,\n 1,\n 2,\n 2\n ],\n 2\n ],\n \"expected\": [\n 1,\n 2\n ]\n },\n {\n \"input\": [\n [\n 5\n ],\n 1\n ],\n \"expected\": [\n 5\n ]\n },\n {\n \"input\": [\n [\n 1,\n 2,\n 3,\n 4\n ],\n 3\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n 3,\n 0,\n 1,\n 0\n ],\n 1\n ],\n \"expected\": [\n 0\n ]\n },\n {\n \"input\": [\n [\n 2,\n 2,\n 2,\n 1,\n 1,\n 3,\n 3\n ],\n 2\n ],\n \"expected\": [\n 2,\n 1\n ]\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 20,\n \"description\": \"Write a function that returns the minimum number of coins needed to make a target amount, or -1 if impossible.\",\n \"functionName\": \"coinChangeMin\",\n \"signature\": \"function coinChangeMin(coins, amount)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 2,\n 5\n ],\n 11\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n [\n 2\n ],\n 3\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n [\n 1\n ],\n 0\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n [\n 1,\n 3,\n 4\n ],\n 6\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n [\n 2,\n 5,\n 10,\n 1\n ],\n 27\n ],\n \"expected\": 4\n },\n {\n \"input\": [\n [\n 186,\n 419,\n 83,\n 408\n ],\n 6249\n ],\n \"expected\": 20\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 21,\n \"description\": \"Write a function that computes the Levenshtein edit distance between two strings.\",\n \"functionName\": \"editDistance\",\n \"signature\": \"function editDistance(a, b)\",\n \"tests\": [\n {\n \"input\": [\n \"horse\",\n \"ros\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"intention\",\n \"execution\"\n ],\n \"expected\": 5\n },\n {\n \"input\": [\n \"\",\n \"\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"abc\",\n \"\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"kitten\",\n \"sitting\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"flaw\",\n \"lawn\"\n ],\n \"expected\": 2\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 22,\n \"description\": \"Write a function that normalizes a Unix path (., .., repeated slashes) into canonical form.\",\n \"functionName\": \"simplifyPath\",\n \"signature\": \"function simplifyPath(path)\",\n \"tests\": [\n {\n \"input\": [\n \"/home/\"\n ],\n \"expected\": \"/home\"\n },\n {\n \"input\": [\n \"/../\"\n ],\n \"expected\": \"/\"\n },\n {\n \"input\": [\n \"/home//foo/\"\n ],\n \"expected\": \"/home/foo\"\n },\n {\n \"input\": [\n \"/a/./b/../../c/\"\n ],\n \"expected\": \"/c\"\n },\n {\n \"input\": [\n \"/a/../../b/../c//.//\"\n ],\n \"expected\": \"/c\"\n },\n {\n \"input\": [\n \"/a//b////c/d//././/..\"\n ],\n \"expected\": \"/a/b/c\"\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 23,\n \"description\": \"Write a function that returns all elements of a matrix in spiral order.\",\n \"functionName\": \"spiralOrder\",\n \"signature\": \"function spiralOrder(matrix)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 1,\n 2,\n 3\n ],\n [\n 4,\n 5,\n 6\n ],\n [\n 7,\n 8,\n 9\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3,\n 6,\n 9,\n 8,\n 7,\n 4,\n 5\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2,\n 3,\n 4\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3,\n 4\n ]\n },\n {\n \"input\": [\n [\n [\n 1\n ],\n [\n 2\n ],\n [\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ],\n [\n 5,\n 6\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 4,\n 6,\n 5,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n 1\n ]\n ]\n ],\n \"expected\": [\n 1\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2\n ],\n [\n 3,\n 4\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 4,\n 3\n ]\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 24,\n \"description\": \"Write a function that returns the length of the longest strictly increasing subsequence.\",\n \"functionName\": \"longestIncreasingSubsequence\",\n \"signature\": \"function longestIncreasingSubsequence(nums)\",\n \"tests\": [\n {\n \"input\": [\n [\n 10,\n 9,\n 2,\n 5,\n 3,\n 7,\n 101,\n 18\n ]\n ],\n \"expected\": 4\n },\n {\n \"input\": [\n [\n 0,\n 1,\n 0,\n 3,\n 2,\n 3\n ]\n ],\n \"expected\": 4\n },\n {\n \"input\": [\n [\n 7,\n 7,\n 7,\n 7,\n 7\n ]\n ],\n \"expected\": 1\n },\n {\n \"input\": [\n [\n 4,\n 10,\n 4,\n 3,\n 8,\n 9\n ]\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n [\n 1,\n 3,\n 6,\n 7,\n 9,\n 4,\n 10,\n 5,\n 6\n ]\n ],\n \"expected\": 6\n },\n {\n \"input\": [\n []\n ],\n \"expected\": 0\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 25,\n \"description\": \"Write a function that evaluates an expression in Reverse Polish Notation (RPN).\",\n \"functionName\": \"evalRPN\",\n \"signature\": \"function evalRPN(tokens)\",\n \"tests\": [\n {\n \"input\": [\n [\n \"2\",\n \"1\",\n \"+\",\n \"3\",\n \"*\"\n ]\n ],\n \"expected\": 9\n },\n {\n \"input\": [\n [\n \"4\",\n \"13\",\n \"5\",\n \"/\",\n \"+\"\n ]\n ],\n \"expected\": 6\n },\n {\n \"input\": [\n [\n \"10\",\n \"6\",\n \"9\",\n \"3\",\n \"+\",\n \"-11\",\n \"*\",\n \"/\",\n \"*\",\n \"17\",\n \"+\",\n \"5\",\n \"+\"\n ]\n ],\n \"expected\": 22\n },\n {\n \"input\": [\n [\n \"3\",\n \"-4\",\n \"+\"\n ]\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n [\n \"5\",\n \"1\",\n \"2\",\n \"+\",\n \"4\",\n \"*\",\n \"+\",\n \"3\",\n \"-\"\n ]\n ],\n \"expected\": 14\n },\n {\n \"input\": [\n [\n \"7\",\n \"3\",\n \"/\"\n ]\n ],\n \"expected\": 2\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 26,\n \"description\": \"Write a function that finds the shortest path length in an unweighted graph represented as an adjacency list (object). Return -1 if no path exists.\",\n \"functionName\": \"shortestPath\",\n \"signature\": \"function shortestPath(graph, start, end)\",\n \"tests\": [\n {\n \"input\": [\n {\n \"A\": [\n \"B\",\n \"C\"\n ],\n \"B\": [\n \"A\",\n \"D\"\n ],\n \"C\": [\n \"A\",\n \"D\"\n ],\n \"D\": [\n \"B\",\n \"C\"\n ]\n },\n \"A\",\n \"D\"\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\"\n ],\n \"B\": [\n \"A\"\n ],\n \"C\": [\n \"D\"\n ],\n \"D\": [\n \"C\"\n ]\n },\n \"A\",\n \"D\"\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\"\n ],\n \"B\": [\n \"C\"\n ],\n \"C\": [\n \"D\"\n ],\n \"D\": []\n },\n \"A\",\n \"D\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n {\n \"A\": [\n \"A\"\n ]\n },\n \"A\",\n \"A\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\",\n \"C\"\n ],\n \"B\": [\n \"D\"\n ],\n \"C\": [\n \"D\"\n ],\n \"D\": []\n },\n \"A\",\n \"D\"\n ],\n \"expected\": 2\n },\n {\n \"input\": [\n {\n \"X\": [\n \"Y\"\n ],\n \"Y\": [\n \"Z\"\n ],\n \"Z\": []\n },\n \"X\",\n \"Z\"\n ],\n \"expected\": 2\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 27,\n \"description\": \"Write a function that detects if a directed graph (adjacency list object) contains a cycle. Return true if cycle exists, false otherwise.\",\n \"functionName\": \"hasCycle\",\n \"signature\": \"function hasCycle(graph)\",\n \"tests\": [\n {\n \"input\": [\n {\n \"A\": [\n \"B\"\n ],\n \"B\": [\n \"C\"\n ],\n \"C\": [\n \"A\"\n ]\n }\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\"\n ],\n \"B\": [\n \"C\"\n ],\n \"C\": []\n }\n ],\n \"expected\": false\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\",\n \"C\"\n ],\n \"B\": [\n \"D\"\n ],\n \"C\": [\n \"D\"\n ],\n \"D\": []\n }\n ],\n \"expected\": false\n },\n {\n \"input\": [\n {\n \"A\": [\n \"B\"\n ],\n \"B\": [\n \"C\"\n ],\n \"C\": [\n \"D\"\n ],\n \"D\": [\n \"B\"\n ]\n }\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"A\": []\n }\n ],\n \"expected\": false\n },\n {\n \"input\": [\n {\n \"A\": [\n \"A\"\n ]\n }\n ],\n \"expected\": true\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 28,\n \"description\": \"Write a function that validates whether a binary tree (given as nested object {val, left, right} or null) is a valid binary search tree.\",\n \"functionName\": \"isValidBST\",\n \"signature\": \"function isValidBST(root)\",\n \"tests\": [\n {\n \"input\": [\n {\n \"val\": 2,\n \"left\": {\n \"val\": 1,\n \"left\": null,\n \"right\": null\n },\n \"right\": {\n \"val\": 3,\n \"left\": null,\n \"right\": null\n }\n }\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"val\": 5,\n \"left\": {\n \"val\": 1,\n \"left\": null,\n \"right\": null\n },\n \"right\": {\n \"val\": 4,\n \"left\": {\n \"val\": 3,\n \"left\": null,\n \"right\": null\n },\n \"right\": {\n \"val\": 6,\n \"left\": null,\n \"right\": null\n }\n }\n }\n ],\n \"expected\": false\n },\n {\n \"input\": [\n null\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"val\": 1,\n \"left\": null,\n \"right\": null\n }\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"val\": 5,\n \"left\": {\n \"val\": 4,\n \"left\": {\n \"val\": 3,\n \"left\": null,\n \"right\": null\n },\n \"right\": null\n },\n \"right\": {\n \"val\": 6,\n \"left\": null,\n \"right\": {\n \"val\": 7,\n \"left\": null,\n \"right\": null\n }\n }\n }\n ],\n \"expected\": true\n },\n {\n \"input\": [\n {\n \"val\": 3,\n \"left\": {\n \"val\": 1,\n \"left\": null,\n \"right\": {\n \"val\": 4,\n \"left\": null,\n \"right\": null\n }\n },\n \"right\": {\n \"val\": 5,\n \"left\": null,\n \"right\": null\n }\n }\n ],\n \"expected\": false\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 29,\n \"description\": \"Write a function that checks if a partially filled 9x9 Sudoku board (2D array, 0 for empty) is valid. Only check filled cells for row, column, and 3x3 box conflicts.\",\n \"functionName\": \"isValidSudoku\",\n \"signature\": \"function isValidSudoku(board)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 5,\n 3,\n 0,\n 0,\n 7,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 6,\n 0,\n 0,\n 1,\n 9,\n 5,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 9,\n 8,\n 0,\n 0,\n 0,\n 0,\n 6,\n 0\n ],\n [\n 8,\n 0,\n 0,\n 0,\n 6,\n 0,\n 0,\n 0,\n 3\n ],\n [\n 4,\n 0,\n 0,\n 8,\n 0,\n 3,\n 0,\n 0,\n 1\n ],\n [\n 7,\n 0,\n 0,\n 0,\n 2,\n 0,\n 0,\n 0,\n 6\n ],\n [\n 0,\n 6,\n 0,\n 0,\n 0,\n 0,\n 2,\n 8,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 4,\n 1,\n 9,\n 0,\n 0,\n 5\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 8,\n 0,\n 0,\n 7,\n 9\n ]\n ]\n ],\n \"expected\": true\n },\n {\n \"input\": [\n [\n [\n 5,\n 3,\n 0,\n 0,\n 7,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 6,\n 0,\n 0,\n 1,\n 9,\n 5,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 9,\n 8,\n 0,\n 0,\n 0,\n 0,\n 6,\n 0\n ],\n [\n 8,\n 0,\n 0,\n 0,\n 6,\n 0,\n 0,\n 0,\n 3\n ],\n [\n 4,\n 0,\n 0,\n 8,\n 0,\n 3,\n 0,\n 0,\n 1\n ],\n [\n 7,\n 0,\n 0,\n 0,\n 2,\n 0,\n 0,\n 0,\n 6\n ],\n [\n 0,\n 6,\n 0,\n 0,\n 0,\n 0,\n 2,\n 8,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 4,\n 1,\n 9,\n 0,\n 0,\n 5\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 8,\n 0,\n 0,\n 7,\n 5\n ]\n ]\n ],\n \"expected\": false\n },\n {\n \"input\": [\n [\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ]\n ],\n \"expected\": true\n },\n {\n \"input\": [\n [\n [\n 1,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 1\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ]\n ],\n \"expected\": false\n },\n {\n \"input\": [\n [\n [\n 1,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ]\n ],\n \"expected\": true\n },\n {\n \"input\": [\n [\n [\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ],\n [\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0,\n 0\n ]\n ]\n ],\n \"expected\": true\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 30,\n \"description\": \"Write a function that returns the maximum sum of a contiguous subarray of size k.\",\n \"functionName\": \"maxSubarraySum\",\n \"signature\": \"function maxSubarraySum(arr, k)\",\n \"tests\": [\n {\n \"input\": [\n [\n 1,\n 4,\n 2,\n 10,\n 23,\n 3,\n 1,\n 0,\n 20\n ],\n 4\n ],\n \"expected\": 39\n },\n {\n \"input\": [\n [\n 2,\n 3\n ],\n 3\n ],\n \"expected\": -1\n },\n {\n \"input\": [\n [\n 100,\n 200,\n 300,\n 400\n ],\n 2\n ],\n \"expected\": 700\n },\n {\n \"input\": [\n [\n 1,\n 1,\n 1,\n 1,\n 1\n ],\n 1\n ],\n \"expected\": 1\n },\n {\n \"input\": [\n [\n -1,\n -2,\n -3,\n -4\n ],\n 2\n ],\n \"expected\": -3\n },\n {\n \"input\": [\n [\n 5\n ],\n 1\n ],\n \"expected\": 5\n }\n ],\n \"difficulty\": \"medium\"\n },\n {\n \"id\": 31,\n \"description\": \"Write a function that implements a simple Trie and returns all words matching a given prefix. The function takes an array of words and a prefix, and returns matching words sorted alphabetically.\",\n \"functionName\": \"autocomplete\",\n \"signature\": \"function autocomplete(words, prefix)\",\n \"tests\": [\n {\n \"input\": [\n [\n \"apple\",\n \"app\",\n \"application\",\n \"banana\",\n \"band\"\n ],\n \"app\"\n ],\n \"expected\": [\n \"app\",\n \"apple\",\n \"application\"\n ]\n },\n {\n \"input\": [\n [\n \"hello\",\n \"help\",\n \"hero\",\n \"hex\"\n ],\n \"he\"\n ],\n \"expected\": [\n \"hello\",\n \"help\",\n \"hero\",\n \"hex\"\n ]\n },\n {\n \"input\": [\n [\n \"cat\",\n \"car\",\n \"card\"\n ],\n \"car\"\n ],\n \"expected\": [\n \"car\",\n \"card\"\n ]\n },\n {\n \"input\": [\n [\n \"dog\",\n \"cat\",\n \"bird\"\n ],\n \"z\"\n ],\n \"expected\": []\n },\n {\n \"input\": [\n [\n \"test\"\n ],\n \"test\"\n ],\n \"expected\": [\n \"test\"\n ]\n },\n {\n \"input\": [\n [\n \"abc\",\n \"abd\",\n \"abe\",\n \"xyz\"\n ],\n \"ab\"\n ],\n \"expected\": [\n \"abc\",\n \"abd\",\n \"abe\"\n ]\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 32,\n \"description\": \"Write a function that merges k sorted arrays into one sorted array.\",\n \"functionName\": \"mergeKSorted\",\n \"signature\": \"function mergeKSorted(arrays)\",\n \"tests\": [\n {\n \"input\": [\n [\n [\n 1,\n 4,\n 7\n ],\n [\n 2,\n 5,\n 8\n ],\n [\n 3,\n 6,\n 9\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3,\n 4,\n 5,\n 6,\n 7,\n 8,\n 9\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 2,\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 2,\n 3\n ]\n },\n {\n \"input\": [\n [\n [\n 5\n ],\n [\n 1\n ],\n [\n 3\n ]\n ]\n ],\n \"expected\": [\n 1,\n 3,\n 5\n ]\n },\n {\n \"input\": [\n [\n [],\n [\n 1,\n 2\n ],\n []\n ]\n ],\n \"expected\": [\n 1,\n 2\n ]\n },\n {\n \"input\": [\n [\n [\n 1,\n 1,\n 1\n ],\n [\n 1,\n 1\n ],\n [\n 1\n ]\n ]\n ],\n \"expected\": [\n 1,\n 1,\n 1,\n 1,\n 1,\n 1\n ]\n },\n {\n \"input\": [\n [\n [\n 10,\n 20\n ],\n [\n 5,\n 15,\n 25\n ],\n [\n 1,\n 30\n ]\n ]\n ],\n \"expected\": [\n 1,\n 5,\n 10,\n 15,\n 20,\n 25,\n 30\n ]\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 33,\n \"description\": \"Write a function that returns the length of the longest common subsequence of two strings.\",\n \"functionName\": \"longestCommonSubsequence\",\n \"signature\": \"function longestCommonSubsequence(s1, s2)\",\n \"tests\": [\n {\n \"input\": [\n \"abcde\",\n \"ace\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"abc\",\n \"abc\"\n ],\n \"expected\": 3\n },\n {\n \"input\": [\n \"abc\",\n \"def\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"\",\n \"abc\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"abcba\",\n \"abcbcba\"\n ],\n \"expected\": 5\n },\n {\n \"input\": [\n \"AGGTAB\",\n \"GXTXAYB\"\n ],\n \"expected\": 4\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 34,\n \"description\": \"Write a function that evaluates a simple mathematical expression string containing non-negative integers, +, -, *, / (integer division), and spaces. Respect operator precedence.\",\n \"functionName\": \"calculate\",\n \"signature\": \"function calculate(expression)\",\n \"tests\": [\n {\n \"input\": [\n \"3+2*2\"\n ],\n \"expected\": 7\n },\n {\n \"input\": [\n \" 3/2 \"\n ],\n \"expected\": 1\n },\n {\n \"input\": [\n \" 3+5 / 2 \"\n ],\n \"expected\": 5\n },\n {\n \"input\": [\n \"14-3/2\"\n ],\n \"expected\": 13\n },\n {\n \"input\": [\n \"0+0\"\n ],\n \"expected\": 0\n },\n {\n \"input\": [\n \"42\"\n ],\n \"expected\": 42\n }\n ],\n \"difficulty\": \"hard\"\n },\n {\n \"id\": 35,\n \"description\": \"Write a function that implements simplified regex matching supporting '.' (any single char) and '*' (zero or more of the preceding element). Return true if the pattern matches the entire string.\",\n \"functionName\": \"isMatch\",\n \"signature\": \"function isMatch(s, p)\",\n \"tests\": [\n {\n \"input\": [\n \"aa\",\n \"a\"\n ],\n \"expected\": false\n },\n {\n \"input\": [\n \"aa\",\n \"a*\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"ab\",\n \".*\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"aab\",\n \"c*a*b\"\n ],\n \"expected\": true\n },\n {\n \"input\": [\n \"mississippi\",\n \"mis*is*p*.\"\n ],\n \"expected\": false\n },\n {\n \"input\": [\n \"\",\n \".*\"\n ],\n \"expected\": true\n }\n ],\n \"difficulty\": \"hard\"\n }\n]\n","[\n {\n \"id\": 1,\n \"category\": \"format\",\n \"prompt\": \"List exactly 3 benefits of exercise. Use a numbered list (1. 2. 3.).\",\n \"validation\": \"numberedList\",\n \"params\": { \"expectedCount\": 3 }\n },\n {\n \"id\": 2,\n \"category\": \"format\",\n \"prompt\": \"Explain what a CPU does in exactly one sentence.\",\n \"validation\": \"sentenceCount\",\n \"params\": { \"expectedCount\": 1 }\n },\n {\n \"id\": 3,\n \"category\": \"format\",\n \"prompt\": \"Name 5 European countries, separated by commas, nothing else.\",\n \"validation\": \"commaSeparated\",\n \"params\": { \"expectedCount\": 5 }\n },\n {\n \"id\": 4,\n \"category\": \"format\",\n \"prompt\": \"Give a one-word answer: what color is the sky on a clear day?\",\n \"validation\": \"wordCount\",\n \"params\": { \"expectedCount\": 1 }\n },\n {\n \"id\": 5,\n \"category\": \"format\",\n \"prompt\": \"Write exactly 2 paragraphs about the internet.\",\n \"validation\": \"paragraphCount\",\n \"params\": { \"expectedCount\": 2 }\n },\n {\n \"id\": 6,\n \"category\": \"negative\",\n \"prompt\": \"Explain what a computer does without using the words 'machine', 'device', or 'computer'.\",\n \"validation\": \"forbiddenWords\",\n \"params\": { \"forbidden\": [\"machine\", \"device\", \"computer\"] }\n },\n {\n \"id\": 7,\n \"category\": \"negative\",\n \"prompt\": \"Describe the ocean without using the letter 'e'.\",\n \"validation\": \"forbiddenLetters\",\n \"params\": { \"forbidden\": [\"e\"] }\n },\n {\n \"id\": 8,\n \"category\": \"negative\",\n \"prompt\": \"Tell me about France without mentioning Paris.\",\n \"validation\": \"forbiddenWords\",\n \"params\": { \"forbidden\": [\"Paris\", \"paris\"] }\n },\n {\n \"id\": 9,\n \"category\": \"negative\",\n \"prompt\": \"Explain addition without using any digits (0-9).\",\n \"validation\": \"forbiddenPattern\",\n \"params\": { \"pattern\": \"[0-9]\" }\n },\n {\n \"id\": 10,\n \"category\": \"negative\",\n \"prompt\": \"Describe a cat without using the words 'pet', 'animal', or 'fur'.\",\n \"validation\": \"forbiddenWords\",\n \"params\": { \"forbidden\": [\"pet\", \"animal\", \"fur\"] }\n },\n {\n \"id\": 11,\n \"category\": \"structural\",\n \"prompt\": \"First list 2 pros, then 2 cons of remote work. Label them clearly with 'Pros:' and 'Cons:'.\",\n \"validation\": \"prosConsStructure\",\n \"params\": { \"prosCount\": 2, \"consCount\": 2 }\n },\n {\n \"id\": 12,\n \"category\": \"structural\",\n \"prompt\": \"Start your response with the word 'Indeed' and end with the word 'Goodbye'.\",\n \"validation\": \"startEnd\",\n \"params\": { \"start\": \"Indeed\", \"end\": \"Goodbye\" }\n },\n {\n \"id\": 13,\n \"category\": \"structural\",\n \"prompt\": \"Respond to this question using only questions: What is the meaning of life?\",\n \"validation\": \"allQuestions\",\n \"params\": {}\n },\n {\n \"id\": 14,\n \"category\": \"structural\",\n \"prompt\": \"Reply in the format 'ANSWER: <value>' — What is 7 times 8?\",\n \"validation\": \"answerFormat\",\n \"params\": { \"expectedValue\": \"56\" }\n },\n {\n \"id\": 15,\n \"category\": \"structural\",\n \"prompt\": \"Write your answer as a bullet list with exactly 4 items, each starting with a dash (-).\",\n \"validation\": \"dashList\",\n \"params\": { \"expectedCount\": 4 }\n },\n {\n \"id\": 16,\n \"category\": \"content\",\n \"prompt\": \"Name a fruit that starts with 'B' and has more than 5 letters.\",\n \"validation\": \"fruitStartLength\",\n \"params\": { \"startLetter\": \"B\", \"minLength\": 6 }\n },\n {\n \"id\": 17,\n \"category\": \"content\",\n \"prompt\": \"Give me a 4-letter English word that rhymes with 'light'.\",\n \"validation\": \"wordLength\",\n \"params\": { \"expectedLength\": 4 }\n },\n {\n \"id\": 18,\n \"category\": \"content\",\n \"prompt\": \"Write a sentence that contains exactly 8 words.\",\n \"validation\": \"wordCount\",\n \"params\": { \"expectedCount\": 8 }\n },\n {\n \"id\": 19,\n \"category\": \"content\",\n \"prompt\": \"List 3 programming languages created before the year 2000.\",\n \"validation\": \"listCount\",\n \"params\": { \"expectedCount\": 3 }\n },\n {\n \"id\": 20,\n \"category\": \"content\",\n \"prompt\": \"Name the 3 largest planets in our solar system in order from largest to smallest.\",\n \"validation\": \"planetOrder\",\n \"params\": {}\n }\n]\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, QuestionResult } from \"../types.js\";\nimport { stripThinkTags, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport ifData from \"../datasets/instruction-following.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nexport interface IFQuestion {\n id: number;\n category: string;\n prompt: string;\n validation: string;\n params: Record<string, unknown>;\n}\n\nconst questions = ifData as IFQuestion[];\nconst DEFAULT_INSTRUCTION_FOLLOWING_TIMEOUT_MS = 120_000;\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction containsStandaloneToken(text: string, token: string): boolean {\n const source = escapeRegex(token.toLowerCase());\n const re = new RegExp(`(?:^|[^\\\\p{L}\\\\p{N}_])${source}(?:$|[^\\\\p{L}\\\\p{N}_])`, \"u\");\n return re.test(text);\n}\n\nfunction normalizeExpectedValue(value: string): string {\n return value\n .trim()\n .replace(/^[\\s\"'`“”‘’()[\\]{}]+|[\\s\"'`“”‘’()[\\]{}]+$/g, \"\")\n .replace(/[.,;:!?]+$/g, \"\")\n .toLowerCase();\n}\n\nexport function validateInstructionFollowingResponse(response: string, q: IFQuestion): boolean {\n const text = response.trim();\n const p = q.params;\n\n switch (q.validation) {\n case \"numberedList\": {\n const count = p.expectedCount as number;\n const matches = text.match(/^\\d+[.)]\\s/gm);\n return matches !== null && matches.length === count;\n }\n\n case \"sentenceCount\": {\n const count = p.expectedCount as number;\n // Count sentence-ending punctuation\n const sentences = text.split(/[.!?]+/).filter((s) => s.trim().length > 0);\n return sentences.length === count;\n }\n\n case \"commaSeparated\": {\n const count = p.expectedCount as number;\n const items = text.split(\",\").map((s) => s.trim()).filter((s) => s.length > 0);\n return items.length === count;\n }\n\n case \"wordCount\": {\n const count = p.expectedCount as number;\n const words = text.split(/\\s+/).filter((w) => w.length > 0);\n return words.length === count;\n }\n\n case \"paragraphCount\": {\n const count = p.expectedCount as number;\n const paragraphs = text.split(/\\n\\s*\\n/).filter((p) => p.trim().length > 0);\n return paragraphs.length === count;\n }\n\n case \"forbiddenWords\": {\n const forbidden = p.forbidden as string[];\n const lower = text.toLowerCase();\n return forbidden.every((w) => !containsStandaloneToken(lower, w));\n }\n\n case \"forbiddenLetters\": {\n const forbidden = p.forbidden as string[];\n const lower = text.toLowerCase();\n return forbidden.every((letter) => !lower.includes(letter.toLowerCase()));\n }\n\n case \"forbiddenPattern\": {\n try {\n const pattern = new RegExp(p.pattern as string);\n return !pattern.test(text);\n } catch {\n return false;\n }\n }\n\n case \"prosConsStructure\": {\n const prosCount = p.prosCount as number | undefined;\n const consCount = p.consCount as number | undefined;\n\n const prosMatch = text.match(/(?:^|\\n)\\s*Pros\\s*:\\s*([\\s\\S]*?)(?=(?:\\n\\s*Cons\\s*:)|$)/i);\n const consMatch = text.match(/(?:^|\\n)\\s*Cons\\s*:\\s*([\\s\\S]*)$/i);\n if (!prosMatch || !consMatch) return false;\n if ((prosMatch.index ?? 0) >= (consMatch.index ?? Number.MAX_SAFE_INTEGER)) return false;\n\n const countItems = (block: string): number => {\n const lines = block\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n const bulletLines = lines.filter((l) => /^([-*]|\\d+[.)])\\s+/.test(l));\n if (bulletLines.length > 0) return bulletLines.length;\n return lines.length;\n };\n\n const prosItems = countItems(prosMatch[1] ?? \"\");\n const consItems = countItems(consMatch[1] ?? \"\");\n\n if (prosCount !== undefined && prosItems !== prosCount) return false;\n if (consCount !== undefined && consItems !== consCount) return false;\n return prosItems > 0 && consItems > 0;\n }\n\n case \"startEnd\": {\n const start = (p.start as string).toLowerCase();\n const end = (p.end as string).toLowerCase();\n const lower = text.toLowerCase();\n return lower.startsWith(start) && lower.endsWith(end);\n }\n\n case \"allQuestions\": {\n const sentences = text.split(/[.!?]\\s*/).filter((s) => s.trim().length > 0);\n if (sentences.length === 0) return false;\n // At least 80% should end with ? or be in the form of questions\n const questionCount = (text.match(/\\?/g) ?? []).length;\n return questionCount >= sentences.length * 0.8;\n }\n\n case \"answerFormat\": {\n const expected = p.expectedValue as string;\n const match = text.match(/^\\s*ANSWER:\\s*(.+)\\s*$/im);\n if (!match) return false;\n return normalizeExpectedValue(match[1]) === normalizeExpectedValue(expected);\n }\n\n case \"dashList\": {\n const count = p.expectedCount as number;\n const dashes = text.match(/^-\\s/gm);\n return dashes !== null && dashes.length === count;\n }\n\n case \"fruitStartLength\": {\n const startLetter = (p.startLetter as string).toLowerCase();\n const minLength = p.minLength as number;\n // Extract the first word or main answer\n const words = text.split(/[\\s,.:;!?]+/).filter((w) => /^[a-zA-Z]+$/.test(w));\n return words.some(\n (w) => w.toLowerCase().startsWith(startLetter) && w.length >= minLength\n );\n }\n\n case \"wordLength\": {\n const expected = p.expectedLength as number;\n const words = text.split(/\\s+/).filter((w) => /^[a-zA-Z]+$/.test(w));\n return words.some((w) => w.length === expected);\n }\n\n case \"listCount\": {\n const count = p.expectedCount as number;\n // Count items: numbered, dashed, or comma-separated\n const numbered = text.match(/^\\d+[.)]\\s/gm);\n const dashed = text.match(/^-\\s/gm);\n const commaItems = text.split(\",\").filter((s) => s.trim().length > 0);\n if (numbered && numbered.length === count) return true;\n if (dashed && dashed.length === count) return true;\n if (commaItems.length === count) return true;\n // Also check line-based items\n const lines = text.split(\"\\n\").filter((l) => l.trim().length > 0);\n return lines.length === count;\n }\n\n case \"planetOrder\": {\n const lower = text.toLowerCase();\n const jupiterIdx = lower.indexOf(\"jupiter\");\n const saturnIdx = lower.indexOf(\"saturn\");\n // Accept either Uranus or Neptune as 3rd\n const uranusIdx = lower.indexOf(\"uranus\");\n const neptuneIdx = lower.indexOf(\"neptune\");\n if (jupiterIdx === -1 || saturnIdx === -1) return false;\n if (jupiterIdx >= saturnIdx) return false;\n const thirdIdx = uranusIdx !== -1 ? uranusIdx : neptuneIdx;\n if (thirdIdx === -1) return false;\n return saturnIdx < thirdIdx;\n }\n\n default:\n return false;\n }\n}\n\nexport async function runInstructionFollowingBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running instruction following benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let correct = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_INSTRUCTION_FOLLOWING_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < questions.length; i++) {\n const q = questions[i];\n spinner.text = `Instruction Following ${i + 1}/${questions.length}: ${q.category}`;\n\n const prompt = q.prompt;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, prompt, withBenchmarkProfile({ num_predict: 1024, think: opts?.think })),\n timeoutMs,\n \"Instruction following task\",\n abortOngoingRequests\n );\n\n const answer = stripThinkTags(result.response);\n const isCorrect = validateInstructionFollowingResponse(answer, q);\n if (isCorrect) correct++;\n\n details.push({\n id: q.id,\n question: q.prompt,\n expected: q.validation,\n actual: answer.slice(0, 200),\n correct: isCorrect,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n details.push({\n id: q.id,\n question: q.prompt,\n expected: q.validation,\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Instruction Following: ${correct}/${questions.length} correct`);\n } catch (err) {\n spinner.fail(\"Instruction following benchmark failed\");\n throw err;\n }\n\n return {\n score: questions.length > 0 ? (correct / questions.length) * 100 : 0,\n correct,\n total: questions.length,\n details,\n };\n}\n","[\n {\n \"id\": 1,\n \"category\": \"json-validity\",\n \"prompt\": \"Output a JSON object with keys: name (string), age (number), city (string). Use realistic values. Output ONLY the JSON, no explanation.\",\n \"validation\": \"jsonKeys\",\n \"params\": { \"keys\": [\"name\", \"age\", \"city\"], \"types\": { \"name\": \"string\", \"age\": \"number\", \"city\": \"string\" } }\n },\n {\n \"id\": 2,\n \"category\": \"json-validity\",\n \"prompt\": \"Generate a JSON array of exactly 3 objects, each with 'id' (number) and 'label' (string). Output ONLY the JSON.\",\n \"validation\": \"jsonArray\",\n \"params\": { \"length\": 3, \"keys\": [\"id\", \"label\"], \"types\": { \"id\": \"number\", \"label\": \"string\" } }\n },\n {\n \"id\": 3,\n \"category\": \"json-validity\",\n \"prompt\": \"Create a JSON object representing a book with: title (string), author (string), year (number), genres (array of strings). Output ONLY the JSON.\",\n \"validation\": \"jsonKeys\",\n \"params\": { \"keys\": [\"title\", \"author\", \"year\", \"genres\"], \"types\": { \"title\": \"string\", \"author\": \"string\", \"year\": \"number\", \"genres\": \"array\" } }\n },\n {\n \"id\": 4,\n \"category\": \"json-validity\",\n \"prompt\": \"Output a nested JSON: {\\\"user\\\": {\\\"name\\\": string, \\\"email\\\": string}, \\\"preferences\\\": {\\\"theme\\\": string, \\\"language\\\": string}}. Output ONLY the JSON.\",\n \"validation\": \"jsonNested\",\n \"params\": { \"path1\": [\"user\", \"name\"], \"path2\": [\"user\", \"email\"], \"path3\": [\"preferences\", \"theme\"], \"path4\": [\"preferences\", \"language\"] }\n },\n {\n \"id\": 5,\n \"category\": \"json-validity\",\n \"prompt\": \"Generate a JSON array of exactly 5 numbers between 1 and 100. Output ONLY the JSON array.\",\n \"validation\": \"jsonNumberArray\",\n \"params\": { \"length\": 5, \"min\": 1, \"max\": 100 }\n },\n {\n \"id\": 6,\n \"category\": \"schema-compliance\",\n \"prompt\": \"Generate a valid JSON matching this TypeScript type: {success: boolean, data: {items: string[]}, count: number}. Output ONLY the JSON.\",\n \"validation\": \"jsonSchema\",\n \"params\": { \"schema\": { \"success\": \"boolean\", \"data\": \"object\", \"count\": \"number\" }, \"nestedKey\": \"data\", \"nestedSchema\": { \"items\": \"array\" } }\n },\n {\n \"id\": 7,\n \"category\": \"schema-compliance\",\n \"prompt\": \"Output a JSON tool call: {\\\"function\\\": string, \\\"arguments\\\": object}. Call a function named 'get_weather' with argument 'city' set to 'London'. Output ONLY the JSON.\",\n \"validation\": \"jsonToolCall\",\n \"params\": { \"functionName\": \"get_weather\", \"argKey\": \"city\", \"argValue\": \"London\" }\n },\n {\n \"id\": 8,\n \"category\": \"schema-compliance\",\n \"prompt\": \"Create a JSON response for an API: {\\\"status\\\": 200, \\\"message\\\": string, \\\"data\\\": null}. Output ONLY the JSON.\",\n \"validation\": \"jsonApiResponse\",\n \"params\": { \"status\": 200 }\n },\n {\n \"id\": 9,\n \"category\": \"schema-compliance\",\n \"prompt\": \"Generate a JSON array where each object has keys 'key' (string) and 'value' (number), with exactly 4 items. Output ONLY the JSON.\",\n \"validation\": \"jsonArray\",\n \"params\": { \"length\": 4, \"keys\": [\"key\", \"value\"], \"types\": { \"key\": \"string\", \"value\": \"number\" } }\n },\n {\n \"id\": 10,\n \"category\": \"schema-compliance\",\n \"prompt\": \"Output a JSON matching: {\\\"type\\\": \\\"event\\\", \\\"name\\\": string, \\\"date\\\": string (YYYY-MM-DD format), \\\"attendees\\\": number}. Output ONLY the JSON.\",\n \"validation\": \"jsonEvent\",\n \"params\": {}\n },\n {\n \"id\": 11,\n \"category\": \"structured-text\",\n \"prompt\": \"Output exactly 3 lines in the format 'KEY: VALUE' for name, role, and experience. Output ONLY the 3 lines.\",\n \"validation\": \"keyValueLines\",\n \"params\": { \"expectedCount\": 3, \"expectedKeys\": [\"name\", \"role\", \"experience\"] }\n },\n {\n \"id\": 12,\n \"category\": \"structured-text\",\n \"prompt\": \"Generate a CSV with header 'name,email,age' and exactly 2 data rows. Output ONLY the CSV.\",\n \"validation\": \"csvFormat\",\n \"params\": { \"headerColumns\": 3, \"dataRows\": 2 }\n },\n {\n \"id\": 13,\n \"category\": \"structured-text\",\n \"prompt\": \"Output a Markdown table with 2 columns (Language, Year) and 3 rows of programming languages. Output ONLY the table.\",\n \"validation\": \"markdownTable\",\n \"params\": { \"columns\": 2, \"dataRows\": 3 }\n },\n {\n \"id\": 14,\n \"category\": \"structured-text\",\n \"prompt\": \"Write a numbered list where each item follows the format: 'N. TERM — definition'. Write exactly 3 items. Output ONLY the list.\",\n \"validation\": \"numberedDefinitions\",\n \"params\": { \"expectedCount\": 3 }\n },\n {\n \"id\": 15,\n \"category\": \"structured-text\",\n \"prompt\": \"Output a valid HTML unordered list (<ul>) with exactly 3 list items (<li>). Output ONLY the HTML.\",\n \"validation\": \"htmlList\",\n \"params\": { \"expectedCount\": 3 }\n }\n]\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, QuestionResult } from \"../types.js\";\nimport { stripThinkTags, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport soData from \"../datasets/structured-output.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\nexport interface SOQuestion {\n id: number;\n category: string;\n prompt: string;\n validation: string;\n params: Record<string, unknown>;\n}\n\nconst questions = soData as SOQuestion[];\nconst DEFAULT_STRUCTURED_OUTPUT_TIMEOUT_MS = 120_000;\n\ninterface JsonParseResult {\n ok: boolean;\n value: unknown;\n}\n\nfunction tryParseJson(text: string): JsonParseResult {\n try {\n return { ok: true, value: JSON.parse(text) };\n } catch {\n return { ok: false, value: null };\n }\n}\n\nfunction safeParse(text: string): unknown | null {\n const trimmed = text.trim();\n if (!trimmed) return null;\n\n const fencedOnly = trimmed.match(/^```(?:json|javascript|js|typescript|ts)?\\s*([\\s\\S]*?)\\s*```$/i);\n if (fencedOnly) {\n const parsed = tryParseJson((fencedOnly[1] ?? \"\").trim());\n return parsed.ok ? parsed.value : null;\n }\n\n const direct = tryParseJson(trimmed);\n return direct.ok ? direct.value : null;\n}\n\nfunction hasKeys(obj: unknown, keys: string[]): boolean {\n if (typeof obj !== \"object\" || obj === null) return false;\n const o = obj as Record<string, unknown>;\n return keys.every((k) => k in o);\n}\n\nfunction checkType(value: unknown, expectedType: string): boolean {\n if (expectedType === \"array\") return Array.isArray(value);\n if (expectedType === \"object\") return typeof value === \"object\" && value !== null && !Array.isArray(value);\n return typeof value === expectedType;\n}\n\nfunction getNestedValue(obj: unknown, path: string[]): unknown {\n let current = obj;\n for (const key of path) {\n if (typeof current !== \"object\" || current === null) return undefined;\n current = (current as Record<string, unknown>)[key];\n }\n return current;\n}\n\nfunction parseCsvLine(line: string): string[] | null {\n const cells: string[] = [];\n let current = \"\";\n let inQuotes = false;\n\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n const next = i + 1 < line.length ? line[i + 1] : \"\";\n\n if (ch === \"\\\"\") {\n if (inQuotes && next === \"\\\"\") {\n current += \"\\\"\";\n i++;\n continue;\n }\n inQuotes = !inQuotes;\n continue;\n }\n\n if (ch === \",\" && !inQuotes) {\n cells.push(current.trim());\n current = \"\";\n continue;\n }\n\n current += ch;\n }\n\n if (inQuotes) return null;\n cells.push(current.trim());\n return cells;\n}\n\nfunction parseMarkdownRow(line: string): string[] {\n const trimmed = line.trim();\n if (!trimmed.includes(\"|\")) return [];\n const normalized = `${trimmed.startsWith(\"|\") ? \"\" : \"|\"}${trimmed}${trimmed.endsWith(\"|\") ? \"\" : \"|\"}`;\n return normalized\n .split(\"|\")\n .slice(1, -1)\n .map((cell) => cell.trim());\n}\n\nfunction isMarkdownSeparatorCell(cell: string): boolean {\n const compact = cell.replace(/\\s+/g, \"\");\n return /^:?-{3,}:?$/.test(compact);\n}\n\nexport function validateStructuredOutputResponse(response: string, q: SOQuestion): boolean {\n const p = q.params;\n\n switch (q.validation) {\n case \"jsonKeys\": {\n const parsed = safeParse(response);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return false;\n const keys = p.keys as string[];\n if (!hasKeys(parsed, keys)) return false;\n const types = p.types as Record<string, string> | undefined;\n if (types) {\n const obj = parsed as Record<string, unknown>;\n return keys.every((k) => checkType(obj[k], types[k]));\n }\n return true;\n }\n\n case \"jsonArray\": {\n const parsed = safeParse(response);\n if (!Array.isArray(parsed)) return false;\n const length = p.length as number;\n if (parsed.length !== length) return false;\n const keys = p.keys as string[];\n const types = p.types as Record<string, string> | undefined;\n return parsed.every((item) => {\n if (!hasKeys(item, keys)) return false;\n if (!types) return true;\n const obj = item as Record<string, unknown>;\n return keys.every((k) => !types[k] || checkType(obj[k], types[k]));\n });\n }\n\n case \"jsonNested\": {\n const parsed = safeParse(response);\n if (!parsed) return false;\n const paths = [\"path1\", \"path2\", \"path3\", \"path4\"]\n .filter((k) => k in p)\n .map((k) => p[k] as string[]);\n return paths.every((path) => {\n const val = getNestedValue(parsed, path);\n return val !== undefined && val !== null;\n });\n }\n\n case \"jsonNumberArray\": {\n const parsed = safeParse(response);\n if (!Array.isArray(parsed)) return false;\n const length = p.length as number;\n const min = p.min as number;\n const max = p.max as number;\n if (parsed.length !== length) return false;\n return parsed.every((v) => typeof v === \"number\" && v >= min && v <= max);\n }\n\n case \"jsonSchema\": {\n const parsed = safeParse(response);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return false;\n const schema = p.schema as Record<string, string>;\n const obj = parsed as Record<string, unknown>;\n for (const [key, type] of Object.entries(schema)) {\n if (!(key in obj) || !checkType(obj[key], type)) return false;\n }\n const nestedKey = p.nestedKey as string | undefined;\n if (nestedKey && p.nestedSchema) {\n const nested = obj[nestedKey] as Record<string, unknown>;\n if (!nested) return false;\n const nestedSchema = p.nestedSchema as Record<string, string>;\n for (const [key, type] of Object.entries(nestedSchema)) {\n if (!(key in nested) || !checkType(nested[key], type)) return false;\n }\n }\n return true;\n }\n\n case \"jsonToolCall\": {\n const parsed = safeParse(response);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return false;\n const obj = parsed as Record<string, unknown>;\n const fnName = p.functionName as string;\n const argKey = p.argKey as string;\n const argValue = p.argValue as string;\n if (obj.function !== fnName && obj.name !== fnName) return false;\n const args = (obj.arguments ?? obj.params ?? obj.parameters) as Record<string, unknown> | undefined;\n if (!args || typeof args !== \"object\") return false;\n return String(args[argKey]).toLowerCase() === argValue.toLowerCase();\n }\n\n case \"jsonApiResponse\": {\n const parsed = safeParse(response);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return false;\n const obj = parsed as Record<string, unknown>;\n const expectedStatus = p.status as number;\n return (\n obj.status === expectedStatus &&\n typeof obj.message === \"string\" &&\n obj.data === null\n );\n }\n\n case \"jsonEvent\": {\n const parsed = safeParse(response);\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return false;\n const obj = parsed as Record<string, unknown>;\n if (obj.type !== \"event\") return false;\n if (typeof obj.name !== \"string\") return false;\n if (typeof obj.date !== \"string\" || !/^\\d{4}-\\d{2}-\\d{2}$/.test(obj.date as string)) return false;\n if (typeof obj.attendees !== \"number\") return false;\n return true;\n }\n\n case \"keyValueLines\": {\n const count = p.expectedCount as number;\n const lines = response\n .trim()\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n if (lines.length !== count) return false;\n\n const pairs = lines.map((line) => line.match(/^([A-Za-z][A-Za-z\\s_-]*):\\s*(.+)$/));\n if (pairs.some((pair) => pair === null)) return false;\n if (pairs.some((pair) => (pair?.[2] ?? \"\").trim().length === 0)) return false;\n\n const expectedKeys = (p.expectedKeys as string[] | undefined)?.map((k) => k.trim().toLowerCase());\n if (!expectedKeys || expectedKeys.length === 0) return true;\n if (expectedKeys.length !== lines.length) return false;\n\n const actualKeys = pairs\n .map((pair) => (pair?.[1] ?? \"\").trim().toLowerCase())\n .sort();\n const expectedSorted = [...expectedKeys].sort();\n return expectedSorted.every((key, index) => key === actualKeys[index]);\n }\n\n case \"csvFormat\": {\n const headerColumns = p.headerColumns as number;\n const dataRows = p.dataRows as number;\n const lines = response\n .trim()\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n if (lines.length !== 1 + dataRows) return false;\n\n const parsedRows = lines.map(parseCsvLine);\n if (parsedRows.some((row) => row === null || row.length !== headerColumns)) return false;\n if (parsedRows[0]?.some((cell) => cell.length === 0)) return false;\n return parsedRows\n .slice(1)\n .every((row) => row !== null && row.every((cell) => cell.length > 0));\n }\n\n case \"markdownTable\": {\n const columns = p.columns as number;\n const dataRows = p.dataRows as number;\n const lines = response\n .trim()\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter((l) => l.length > 0);\n\n if (lines.length !== 2 + dataRows) return false;\n\n const header = parseMarkdownRow(lines[0]);\n if (header.length !== columns || header.some((cell) => cell.length === 0)) return false;\n\n const separator = parseMarkdownRow(lines[1]);\n if (separator.length !== columns || !separator.every(isMarkdownSeparatorCell)) return false;\n\n return lines\n .slice(2)\n .every((line) => {\n const row = parseMarkdownRow(line);\n return row.length === columns && row.every((cell) => cell.length > 0);\n });\n }\n\n case \"numberedDefinitions\": {\n const count = p.expectedCount as number;\n const matches = response.match(/^\\d+\\.\\s+.+\\s*[—–-]\\s*.+/gm);\n return matches !== null && matches.length === count;\n }\n\n case \"htmlList\": {\n const count = p.expectedCount as number;\n const hasUl = /<ul[\\s>]/i.test(response) && /<\\/ul>/i.test(response);\n const liCount = (response.match(/<li[\\s>]/gi) ?? []).length;\n return hasUl && liCount === count;\n }\n\n default:\n return false;\n }\n}\n\nexport async function runStructuredOutputBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running structured output benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let correct = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_STRUCTURED_OUTPUT_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < questions.length; i++) {\n const q = questions[i];\n spinner.text = `Structured Output ${i + 1}/${questions.length}: ${q.category}`;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, q.prompt, withBenchmarkProfile({ num_predict: 1024, think: opts?.think })),\n timeoutMs,\n \"Structured output task\",\n abortOngoingRequests\n );\n\n const answer = stripThinkTags(result.response);\n const isCorrect = validateStructuredOutputResponse(answer, q);\n if (isCorrect) correct++;\n\n details.push({\n id: q.id,\n question: q.prompt,\n expected: q.validation,\n actual: answer.slice(0, 200),\n correct: isCorrect,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n details.push({\n id: q.id,\n question: q.prompt,\n expected: q.validation,\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Structured Output: ${correct}/${questions.length} correct`);\n } catch (err) {\n spinner.fail(\"Structured output benchmark failed\");\n throw err;\n }\n\n return {\n score: questions.length > 0 ? (correct / questions.length) * 100 : 0,\n correct,\n total: questions.length,\n details,\n };\n}\n","[\n {\n \"id\": 1,\n \"language\": \"fr\",\n \"prompt\": \"Répondez uniquement par le nom de la ville : quelle est la capitale de l'Australie ?\",\n \"validation\": \"stringMatch\",\n \"acceptedAnswers\": [\"Canberra\"]\n },\n {\n \"id\": 2,\n \"language\": \"fr\",\n \"prompt\": \"Répondez uniquement par le nombre : combien de jours dans une année bissextile ?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 366\n },\n {\n \"id\": 3,\n \"language\": \"fr\",\n \"prompt\": \"Répondez en français en une phrase : quel est le plus grand océan du monde ?\",\n \"validation\": \"containsKeyword\",\n \"keywords\": [\"Pacifique\"]\n },\n {\n \"id\": 4,\n \"language\": \"fr\",\n \"prompt\": \"Répondez uniquement par le nombre : combien font 17 × 6 ?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 102\n },\n {\n \"id\": 5,\n \"language\": \"es\",\n \"prompt\": \"Responde solo con el nombre de la ciudad: ¿cuál es la capital de Japón?\",\n \"validation\": \"stringMatch\",\n \"acceptedAnswers\": [\"Tokio\", \"Tokyo\"]\n },\n {\n \"id\": 6,\n \"language\": \"es\",\n \"prompt\": \"Responde solo con el número: ¿cuántos continentes hay?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 7\n },\n {\n \"id\": 7,\n \"language\": \"es\",\n \"prompt\": \"Responde en español en una frase: ¿cuál es el planeta más grande del sistema solar?\",\n \"validation\": \"containsKeyword\",\n \"keywords\": [\"Júpiter\", \"Jupiter\"]\n },\n {\n \"id\": 8,\n \"language\": \"es\",\n \"prompt\": \"Responde solo con el número: ¿cuánto es 25 + 37?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 62\n },\n {\n \"id\": 9,\n \"language\": \"de\",\n \"prompt\": \"Antworten Sie nur mit dem Stadtnamen: Was ist die Hauptstadt von Brasilien?\",\n \"validation\": \"stringMatch\",\n \"acceptedAnswers\": [\"Brasília\", \"Brasilia\"]\n },\n {\n \"id\": 10,\n \"language\": \"de\",\n \"prompt\": \"Antworten Sie nur mit der Zahl: Wie viele Seiten hat ein Würfel?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 6\n },\n {\n \"id\": 11,\n \"language\": \"de\",\n \"prompt\": \"Antworten Sie auf Deutsch in einem Satz: Welches ist das größte Säugetier?\",\n \"validation\": \"containsKeyword\",\n \"keywords\": [\"Blauwal\", \"Wal\"]\n },\n {\n \"id\": 12,\n \"language\": \"de\",\n \"prompt\": \"Antworten Sie nur mit der Zahl: Was ist 144 geteilt durch 12?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 12\n },\n {\n \"id\": 13,\n \"language\": \"zh\",\n \"prompt\": \"请只回答城市名:法国的首都是哪里?\",\n \"validation\": \"stringMatch\",\n \"acceptedAnswers\": [\"巴黎\", \"Paris\"]\n },\n {\n \"id\": 14,\n \"language\": \"zh\",\n \"prompt\": \"请只回答数字:一年有多少个月?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 12\n },\n {\n \"id\": 15,\n \"language\": \"zh\",\n \"prompt\": \"请用中文一句话回答:地球上最大的沙漠是什么?\",\n \"validation\": \"containsKeyword\",\n \"keywords\": [\"撒哈拉\"]\n },\n {\n \"id\": 16,\n \"language\": \"zh\",\n \"prompt\": \"请只回答数字:7乘以8等于多少?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 56\n },\n {\n \"id\": 17,\n \"language\": \"ja\",\n \"prompt\": \"都市名だけで答えてください:イタリアの首都はどこですか?\",\n \"validation\": \"stringMatch\",\n \"acceptedAnswers\": [\"ローマ\", \"Roma\", \"Rome\"]\n },\n {\n \"id\": 18,\n \"language\": \"ja\",\n \"prompt\": \"数字だけで答えてください:一週間は何日ですか?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 7\n },\n {\n \"id\": 19,\n \"language\": \"ja\",\n \"prompt\": \"日本語で一文で答えてください:世界で一番高い山は何ですか?\",\n \"validation\": \"containsKeyword\",\n \"keywords\": [\"エベレスト\", \"Everest\"]\n },\n {\n \"id\": 20,\n \"language\": \"ja\",\n \"prompt\": \"数字だけで答えてください:100から37を引くと?\",\n \"validation\": \"numberMatch\",\n \"expectedNumber\": 63\n }\n]\n","import { abortOngoingRequests, generate } from \"../core/runtime.js\";\nimport type { CategoryResult, QuestionResult } from \"../types.js\";\nimport { extractNumber, stripThinkTags, toBenchmarkFailureLabel, withTimeout } from \"../utils.js\";\nimport { createSpinner } from \"../ui/progress.js\";\nimport mlData from \"../datasets/multilingual.json\" with { type: \"json\" };\nimport { withBenchmarkProfile } from \"./profile.js\";\n\ninterface MLQuestion {\n id: number;\n language: string;\n prompt: string;\n validation: string;\n acceptedAnswers?: string[];\n expectedNumber?: number;\n keywords?: string[];\n}\n\nconst questions = mlData as MLQuestion[];\nconst DEFAULT_MULTILINGUAL_TIMEOUT_MS = 120_000;\n\nconst NEGATION_PATTERNS: RegExp[] = [\n /\\b(?:not|never|no|non|pas|nicht|kein|keine|ningun|ninguna|nunca|jamas)\\b/u,\n /\\bn'?est\\s+pas\\b/u,\n /(?:不是|并非|沒有|没有)/u,\n /(?:ではない|じゃない|ではありません)/u,\n];\n\nfunction normalizeForCompare(value: string): string {\n return value\n .normalize(\"NFKD\")\n .replace(/\\p{M}/gu, \"\")\n .toLowerCase()\n .trim();\n}\n\nfunction canonicalizeResponse(value: string): string {\n const firstLine = value.trim().split(/\\r?\\n/)[0] ?? \"\";\n return firstLine\n .replace(/^(?:answer|réponse|respuesta|antwort|回答|答え)\\s*[::-]\\s*/i, \"\")\n .replace(/^[\\s\"'`“”‘’()[\\]{}]+|[\\s\"'`“”‘’()[\\]{}]+$/g, \"\")\n .replace(/[.,;:!?。!?、]+$/u, \"\")\n .trim();\n}\n\nfunction escapeRegex(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction containsStandaloneMatch(text: string, target: string): boolean {\n if (text === target) return true;\n if (!target) return false;\n // CJK answers often have no word boundaries; use direct containment there.\n if (/[\\p{Script=Han}\\p{Script=Hiragana}\\p{Script=Katakana}]/u.test(target)) {\n return text.includes(target);\n }\n const re = new RegExp(\n `(?:^|[^\\\\p{L}\\\\p{N}])${escapeRegex(target)}(?:$|[^\\\\p{L}\\\\p{N}])`,\n \"u\"\n );\n return re.test(text);\n}\n\nfunction hasNegation(text: string): boolean {\n return NEGATION_PATTERNS.some((re) => re.test(text));\n}\n\nexport function validateMultilingualResponse(response: string, q: MLQuestion): boolean {\n const canonical = canonicalizeResponse(response);\n const normalized = normalizeForCompare(canonical);\n if (!normalized) return false;\n if (hasNegation(normalized)) return false;\n\n switch (q.validation) {\n case \"stringMatch\": {\n const answers = q.acceptedAnswers ?? [];\n return answers.some((a) =>\n containsStandaloneMatch(normalized, normalizeForCompare(a))\n );\n }\n\n case \"numberMatch\": {\n const expected = q.expectedNumber;\n if (expected === undefined) return false;\n const actual = extractNumber(canonical);\n return actual !== null && actual === expected;\n }\n\n case \"containsKeyword\": {\n const keywords = q.keywords ?? [];\n return keywords.some((k) =>\n containsStandaloneMatch(normalized, normalizeForCompare(k))\n );\n }\n\n default:\n return false;\n }\n}\n\nexport async function runMultilingualBench(\n model: string,\n opts?: { think?: boolean; timeoutMs?: number }\n): Promise<CategoryResult> {\n const spinner = createSpinner(\"Running multilingual benchmark...\");\n spinner.start();\n\n const details: QuestionResult[] = [];\n let correct = 0;\n const timeoutMs = opts?.timeoutMs ?? DEFAULT_MULTILINGUAL_TIMEOUT_MS;\n\n try {\n for (let i = 0; i < questions.length; i++) {\n const q = questions[i];\n spinner.text = `Multilingual ${i + 1}/${questions.length}: ${q.language}`;\n\n const startTime = Date.now();\n try {\n const result = await withTimeout(\n generate(model, q.prompt, withBenchmarkProfile({ num_predict: 1024, think: opts?.think })),\n timeoutMs,\n \"Multilingual task\",\n abortOngoingRequests\n );\n\n const answer = stripThinkTags(result.response);\n const isCorrect = validateMultilingualResponse(answer, q);\n if (isCorrect) correct++;\n\n const expectedStr = q.expectedNumber !== undefined\n ? String(q.expectedNumber)\n : (q.acceptedAnswers ?? q.keywords ?? []).join(\"|\");\n\n details.push({\n id: q.id,\n question: q.prompt,\n expected: expectedStr,\n actual: answer.slice(0, 200),\n correct: isCorrect,\n timeMs: Date.now() - startTime,\n });\n } catch (err) {\n const expectedStr = q.expectedNumber !== undefined\n ? String(q.expectedNumber)\n : (q.acceptedAnswers ?? q.keywords ?? []).join(\"|\");\n\n details.push({\n id: q.id,\n question: q.prompt,\n expected: expectedStr,\n actual: toBenchmarkFailureLabel(err),\n correct: false,\n timeMs: Date.now() - startTime,\n });\n }\n }\n\n spinner.succeed(`Multilingual: ${correct}/${questions.length} correct`);\n } catch (err) {\n spinner.fail(\"Multilingual benchmark failed\");\n throw err;\n }\n\n return {\n score: questions.length > 0 ? (correct / questions.length) * 100 : 0,\n correct,\n total: questions.length,\n details,\n };\n}\n","import type {\n HardwareFitTuning,\n HardwareInfo,\n PerformanceMetrics,\n PerformanceScore,\n} from \"../types.js\";\nimport { clamp, lerp, sanitizeNonNegative } from \"../utils.js\";\n\n// Anchor points for continuous interpolation.\n// Low end: ~4 cores, ~8 GB. High end: ~24+ cores, ~96+ GB.\nconst TUNING_LOW = {\n speed: { excellent: 15, good: 8, marginal: 3, hardMin: 2 },\n ttft: { excellentMs: 2000, goodMs: 4000, marginalMs: 8000, hardMaxMs: 25000 },\n loadTimeHardMaxMs: 300000,\n};\n\nconst TUNING_HIGH = {\n speed: { excellent: 55, good: 30, marginal: 14, hardMin: 8 },\n ttft: { excellentMs: 500, goodMs: 1200, marginalMs: 2800, hardMaxMs: 10000 },\n loadTimeHardMaxMs: 90000,\n};\n\nfunction lerpNum(t: number, low: number, high: number): number {\n return low + t * (high - low);\n}\n\nfunction computeHardwareCapacity(hardware: HardwareInfo): number {\n // Core score: 4 cores = 0, 24+ cores = 1\n const coreScore = clamp((hardware.cpuCores - 4) / (24 - 4), 0, 1);\n // RAM score: 8 GB = 0, 96+ GB = 1\n const ramScore = clamp((hardware.totalMemoryGB - 8) / (96 - 8), 0, 1);\n // Weighted average — cores and RAM contribute equally\n return (coreScore + ramScore) / 2;\n}\n\nfunction deriveProfile(capacity: number): \"ENTRY\" | \"BALANCED\" | \"HIGH-END\" {\n if (capacity >= 0.55) return \"HIGH-END\";\n if (capacity >= 0.25) return \"BALANCED\";\n return \"ENTRY\";\n}\n\nexport function deriveHardwareFitTuning(hardware?: HardwareInfo): HardwareFitTuning {\n if (!hardware) {\n // Default to mid-range when hardware is unknown\n const t = 0.35;\n return {\n profile: \"BALANCED\",\n speed: {\n excellent: Math.round(lerpNum(t, TUNING_LOW.speed.excellent, TUNING_HIGH.speed.excellent)),\n good: Math.round(lerpNum(t, TUNING_LOW.speed.good, TUNING_HIGH.speed.good)),\n marginal: Math.round(lerpNum(t, TUNING_LOW.speed.marginal, TUNING_HIGH.speed.marginal)),\n hardMin: Math.round(lerpNum(t, TUNING_LOW.speed.hardMin, TUNING_HIGH.speed.hardMin)),\n },\n ttft: {\n excellentMs: Math.round(lerpNum(t, TUNING_LOW.ttft.excellentMs, TUNING_HIGH.ttft.excellentMs)),\n goodMs: Math.round(lerpNum(t, TUNING_LOW.ttft.goodMs, TUNING_HIGH.ttft.goodMs)),\n marginalMs: Math.round(lerpNum(t, TUNING_LOW.ttft.marginalMs, TUNING_HIGH.ttft.marginalMs)),\n hardMaxMs: Math.round(lerpNum(t, TUNING_LOW.ttft.hardMaxMs, TUNING_HIGH.ttft.hardMaxMs)),\n },\n loadTimeHardMaxMs: Math.round(lerpNum(t, TUNING_LOW.loadTimeHardMaxMs, TUNING_HIGH.loadTimeHardMaxMs)),\n };\n }\n\n const t = computeHardwareCapacity(hardware);\n const profile = deriveProfile(t);\n\n return {\n profile,\n speed: {\n excellent: Math.round(lerpNum(t, TUNING_LOW.speed.excellent, TUNING_HIGH.speed.excellent)),\n good: Math.round(lerpNum(t, TUNING_LOW.speed.good, TUNING_HIGH.speed.good)),\n marginal: Math.round(lerpNum(t, TUNING_LOW.speed.marginal, TUNING_HIGH.speed.marginal)),\n hardMin: Math.round(lerpNum(t, TUNING_LOW.speed.hardMin, TUNING_HIGH.speed.hardMin)),\n },\n ttft: {\n excellentMs: Math.round(lerpNum(t, TUNING_LOW.ttft.excellentMs, TUNING_HIGH.ttft.excellentMs)),\n goodMs: Math.round(lerpNum(t, TUNING_LOW.ttft.goodMs, TUNING_HIGH.ttft.goodMs)),\n marginalMs: Math.round(lerpNum(t, TUNING_LOW.ttft.marginalMs, TUNING_HIGH.ttft.marginalMs)),\n hardMaxMs: Math.round(lerpNum(t, TUNING_LOW.ttft.hardMaxMs, TUNING_HIGH.ttft.hardMaxMs)),\n },\n loadTimeHardMaxMs: Math.round(lerpNum(t, TUNING_LOW.loadTimeHardMaxMs, TUNING_HIGH.loadTimeHardMaxMs)),\n };\n}\n\nfunction scoreSpeed(tps: number, tuning: HardwareFitTuning): number {\n if (tps >= tuning.speed.excellent) return 50;\n if (tps >= tuning.speed.good) {\n return lerp(tps, tuning.speed.good, tuning.speed.excellent, 30, 50);\n }\n if (tps >= tuning.speed.marginal) {\n return lerp(tps, tuning.speed.marginal, tuning.speed.good, 12, 30);\n }\n return lerp(tps, 0, tuning.speed.marginal, 0, 12);\n}\n\n// For TTFT: lower is better, so score decreases as TTFT increases\nfunction scoreTTFT(ttft: number, tuning: HardwareFitTuning): number {\n if (ttft <= tuning.ttft.excellentMs) return 20;\n if (ttft <= tuning.ttft.goodMs) {\n return lerp(ttft, tuning.ttft.excellentMs, tuning.ttft.goodMs, 20, 13);\n }\n if (ttft <= tuning.ttft.marginalMs) {\n return lerp(ttft, tuning.ttft.goodMs, tuning.ttft.marginalMs, 13, 6);\n }\n return lerp(ttft, tuning.ttft.marginalMs, tuning.ttft.hardMaxMs, 6, 0);\n}\n\n// For memory: lower usage is better, so score decreases as usage increases\nfunction scoreMemory(memPercent: number): number {\n if (memPercent <= 30) return 30;\n if (memPercent <= 50) return lerp(memPercent, 30, 50, 30, 25);\n if (memPercent <= 70) return lerp(memPercent, 50, 70, 25, 15);\n if (memPercent <= 90) return lerp(memPercent, 70, 90, 15, 5);\n return lerp(memPercent, 90, 100, 5, 0);\n}\n\nexport function computePerformanceScore(\n perf: PerformanceMetrics,\n hardware?: HardwareInfo\n): PerformanceScore {\n const tuning = deriveHardwareFitTuning(hardware);\n const safeTokensPerSecond = sanitizeNonNegative(perf.tokensPerSecond, 0);\n const safeTtft = sanitizeNonNegative(perf.ttft, tuning.ttft.hardMaxMs * 2);\n const speed = Math.round(scoreSpeed(safeTokensPerSecond, tuning));\n const ttft = Math.round(scoreTTFT(safeTtft, tuning));\n const memory = perf.memoryFootprintAvailable === false\n ? Math.round(((speed + ttft) / (50 + 20)) * 30)\n : Math.round(\n scoreMemory(\n // Score memory from the model's measured footprint/delta rather than\n // unrelated host RAM usage from other running workloads.\n sanitizeNonNegative(perf.memoryPercent, 100)\n )\n );\n\n return {\n total: clamp(speed + ttft + memory, 0, 100),\n speed,\n ttft,\n memory,\n };\n}\n","import type { CategoryResult, QualityMetrics, QualityScore } from \"../types.js\";\nimport { clamp } from \"../utils.js\";\n\nexport const RESPONSE_TIME_LIMITS_MS: Record<string, number> = {\n reasoning: 30_000,\n math: 30_000,\n coding: 90_000,\n instructionFollowing: 30_000,\n structuredOutput: 30_000,\n multilingual: 30_000,\n};\n\nfunction safePercent(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return clamp(value, 0, 100);\n}\n\nfunction weightedScore(raw: number, max: number): number {\n return clamp(Math.round((safePercent(raw) / 100) * max), 0, max);\n}\n\nexport function effectiveScore(result: CategoryResult, limitMs: number): number {\n if (result.total === 0) return 0;\n // When details are unavailable (legacy data/tests), derive from correct/total.\n if (result.details.length === 0) {\n const boundedCorrect = clamp(result.correct, 0, result.total);\n return (boundedCorrect / result.total) * 100;\n }\n const effectiveCorrect = result.details.filter(\n (d) => d.correct && d.timeMs <= limitMs\n ).length;\n return (effectiveCorrect / result.total) * 100;\n}\n\nfunction countPenalties(result: CategoryResult, limitMs: number): number {\n return result.details.filter((d) => d.correct && d.timeMs > limitMs).length;\n}\n\nexport function computeQualityScore(quality: QualityMetrics): QualityScore {\n const categories = [\n { key: \"reasoning\", result: quality.reasoning, weight: 20 },\n { key: \"coding\", result: quality.coding, weight: 20 },\n { key: \"instructionFollowing\", result: quality.instructionFollowing, weight: 20 },\n { key: \"structuredOutput\", result: quality.structuredOutput, weight: 15 },\n { key: \"math\", result: quality.math, weight: 15 },\n { key: \"multilingual\", result: quality.multilingual, weight: 10 },\n ] as const;\n\n const scores: Record<string, number> = {};\n const timePenalties: Record<string, number> = {};\n let hasPenalties = false;\n\n for (const cat of categories) {\n const limitMs = RESPONSE_TIME_LIMITS_MS[cat.key];\n const raw = effectiveScore(cat.result, limitMs);\n scores[cat.key] = weightedScore(raw, cat.weight);\n\n const penalties = countPenalties(cat.result, limitMs);\n if (penalties > 0) {\n timePenalties[cat.key] = penalties;\n hasPenalties = true;\n }\n }\n\n const total = clamp(\n scores.reasoning + scores.coding + scores.instructionFollowing +\n scores.structuredOutput + scores.math + scores.multilingual,\n 0,\n 100\n );\n\n return {\n total,\n reasoning: scores.reasoning,\n coding: scores.coding,\n instructionFollowing: scores.instructionFollowing,\n structuredOutput: scores.structuredOutput,\n math: scores.math,\n multilingual: scores.multilingual,\n ...(hasPenalties ? { timePenalties } : {}),\n };\n}\n","import type {\n HardwareInfo,\n PerformanceMetrics,\n QualityMetrics,\n BenchEnvironment,\n FitnessResult,\n FitnessVerdict,\n CategoryLabel,\n CategoryLevel,\n} from \"../types.js\";\nimport {\n computePerformanceScore,\n deriveHardwareFitTuning,\n} from \"./performance-scorer.js\";\nimport { computeQualityScore, effectiveScore, RESPONSE_TIME_LIMITS_MS } from \"./quality-scorer.js\";\nimport { clamp, sanitizeNonNegative } from \"../utils.js\";\n\nfunction getCategoryLevel(rawScore: number): CategoryLevel {\n if (rawScore >= 75) return \"Strong\";\n if (rawScore >= 50) return \"Adequate\";\n if (rawScore >= 25) return \"Weak\";\n return \"Poor\";\n}\n\nfunction normalizeRawScore(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return clamp(value, 0, 100);\n}\n\nexport function computeFitness(\n perf: PerformanceMetrics,\n quality: QualityMetrics | null,\n hardware?: HardwareInfo,\n benchEnv?: BenchEnvironment\n): FitnessResult {\n const tuning = deriveHardwareFitTuning(hardware);\n const performanceScore = computePerformanceScore(perf, hardware);\n const qualityScore = quality ? computeQualityScore(quality) : null;\n\n const hardwareFitScore = Math.round(performanceScore.total);\n\n // Global score: 30% HW + 70% Quality (null if quality absent)\n const globalScore = qualityScore\n ? clamp(Math.round(0.3 * hardwareFitScore + 0.7 * qualityScore.total), 0, 100)\n : null;\n\n // Category labels from effective scores (with time penalties applied)\n const categoryLabels: CategoryLabel[] | null = quality\n ? ([\n { category: \"Reasoning\", key: \"reasoning\", result: quality.reasoning },\n { category: \"Coding\", key: \"coding\", result: quality.coding },\n { category: \"Instruction Following\", key: \"instructionFollowing\", result: quality.instructionFollowing },\n { category: \"Structured Output\", key: \"structuredOutput\", result: quality.structuredOutput },\n { category: \"Math\", key: \"math\", result: quality.math },\n { category: \"Multilingual\", key: \"multilingual\", result: quality.multilingual },\n ] as const).map(({ category, key, result }) => {\n const score = normalizeRawScore(effectiveScore(result, RESPONSE_TIME_LIMITS_MS[key]));\n return { category, rawScore: score, level: getCategoryLevel(score) };\n })\n : null;\n\n const safeTokensPerSecond = sanitizeNonNegative(perf.tokensPerSecond, 0);\n const safeTtft = sanitizeNonNegative(perf.ttft, tuning.ttft.hardMaxMs * 10);\n const safeLoadTime = sanitizeNonNegative(perf.loadTime, tuning.loadTimeHardMaxMs * 10);\n const modelMemoryFootprintAvailable = perf.memoryFootprintAvailable !== false;\n const modelMemoryDeltaPercent = modelMemoryFootprintAvailable\n ? sanitizeNonNegative(perf.memoryPercent, 100)\n : undefined;\n const hostMemoryPercent =\n perf.memoryHostPercent !== undefined\n && Number.isFinite(perf.memoryHostPercent)\n && perf.memoryHostPercent >= 0\n ? perf.memoryHostPercent\n : undefined;\n\n // Disqualifiers\n const disqualifiers: string[] = [];\n if (safeTokensPerSecond < tuning.speed.hardMin) {\n disqualifiers.push(\n `Token speed too low: ${safeTokensPerSecond.toFixed(1)} tok/s (minimum: ${tuning.speed.hardMin} tok/s for ${tuning.profile} profile)`\n );\n }\n if (safeTtft > tuning.ttft.hardMaxMs) {\n disqualifiers.push(\n `Time to first token too high: ${Math.round(safeTtft)}ms (maximum: ${tuning.ttft.hardMaxMs}ms for ${tuning.profile} profile)`\n );\n }\n if (safeLoadTime > tuning.loadTimeHardMaxMs) {\n disqualifiers.push(\n `Model load time too high: ${Math.round(safeLoadTime)}ms (maximum: ${tuning.loadTimeHardMaxMs}ms for ${tuning.profile} profile)`\n );\n }\n const hostCritical = hostMemoryPercent !== undefined && hostMemoryPercent > 95;\n const modelDeltaCritical = modelMemoryDeltaPercent !== undefined && modelMemoryDeltaPercent > 90;\n const modelDeltaSignificant = modelMemoryDeltaPercent !== undefined && modelMemoryDeltaPercent >= 10;\n if (modelDeltaCritical) {\n disqualifiers.push(\n `Memory usage critical: model delta +${modelMemoryDeltaPercent.toFixed(0)}%`\n );\n }\n\n // Determine verdict based on globalScore (or hardwareFitScore if null)\n const verdictScore = globalScore ?? hardwareFitScore;\n let verdict: FitnessVerdict;\n if (disqualifiers.length > 0) {\n verdict = \"NOT RECOMMENDED\";\n } else if (verdictScore >= 80) {\n verdict = \"EXCELLENT\";\n } else if (verdictScore >= 60) {\n verdict = \"GOOD\";\n } else if (verdictScore >= 40) {\n verdict = \"MARGINAL\";\n } else {\n verdict = \"NOT RECOMMENDED\";\n }\n\n // Interpretation\n let interpretation: string;\n if (categoryLabels) {\n const labelParts = categoryLabels.map((l) => `${l.category}: ${l.level}`).join(\", \");\n interpretation = `Hardware fit: ${hardwareFitScore}/100. Overall suitability: ${verdict}${globalScore !== null ? ` (Global ${globalScore}/100)` : \"\"}. Category profile: ${labelParts}.`;\n } else {\n interpretation = `Hardware fit: ${hardwareFitScore}/100. Overall suitability: ${verdict}. Run full benchmarks for quality assessment.`;\n }\n\n // Warnings\n const warnings: string[] = [];\n\n if (qualityScore !== null && qualityScore.total < 15) {\n interpretation +=\n \" Warning: model produced very low accuracy on quality tasks — results may be unusable despite good hardware performance.\";\n warnings.push(\n \"Model produced very low accuracy on quality tasks — results may be unusable despite good hardware performance.\"\n );\n }\n\n if (\n perf.tpsStdDev !== undefined &&\n Number.isFinite(perf.tpsStdDev) &&\n safeTokensPerSecond > 0 &&\n perf.tpsStdDev / safeTokensPerSecond > 0.3\n ) {\n warnings.push(\n `Token speed is unstable (stddev ${perf.tpsStdDev.toFixed(1)} tok/s, mean ${safeTokensPerSecond.toFixed(1)} tok/s) — may indicate thermal throttling or memory pressure.`\n );\n }\n\n if (perf.tokensPerSecondEstimated) {\n warnings.push(\n \"Token throughput is estimated from LM Studio output because native token stats were unavailable. Compare tok/s across backends cautiously.\"\n );\n }\n\n if (perf.memoryFootprintEstimated) {\n warnings.push(\n \"Model memory footprint is estimated via LM Studio CLI rather than measured from a fresh load.\"\n );\n }\n\n if (!modelMemoryFootprintAvailable) {\n warnings.push(\n \"Model memory footprint was unavailable for this run, so RAM fit scoring was normalized from speed and TTFT only.\"\n );\n }\n\n if (hostCritical && !modelMemoryFootprintAvailable) {\n warnings.push(\n `Host memory is already high (${hostMemoryPercent.toFixed(0)}%) and model footprint was unavailable. Results may be influenced by other running workloads.`\n );\n } else if (hostCritical && modelMemoryDeltaPercent !== undefined && !modelDeltaSignificant) {\n warnings.push(\n `Host memory is already high (${hostMemoryPercent.toFixed(0)}%) but model delta is limited (+${modelMemoryDeltaPercent.toFixed(0)}%). Results may be influenced by other running workloads.`\n );\n }\n\n if (hardware?.powerMode === \"low-power\") {\n warnings.push(\n \"System was in low-power mode during this benchmark.\"\n );\n }\n\n if (\n hardware?.cpuCurrentSpeedGHz != null &&\n hardware?.cpuFreqGHz != null &&\n hardware.cpuFreqGHz > 0 &&\n hardware.cpuCurrentSpeedGHz / hardware.cpuFreqGHz < 0.8\n ) {\n const ratio = ((hardware.cpuCurrentSpeedGHz / hardware.cpuFreqGHz) * 100).toFixed(0);\n warnings.push(\n `CPU appears throttled (${hardware.cpuCurrentSpeedGHz.toFixed(1)} GHz current vs ${hardware.cpuFreqGHz.toFixed(1)} GHz nominal, ${ratio}%).`\n );\n }\n\n // Bench environment warnings\n if (benchEnv?.thermalPressureAfter === \"heavy\" || benchEnv?.thermalPressureAfter === \"critical\") {\n warnings.push(\n `Thermal throttling detected after benchmark (${benchEnv.thermalPressureAfter}). Results may be degraded — consider cooling or shorter runs.`\n );\n }\n\n if (benchEnv?.swapDeltaGB != null && benchEnv.swapDeltaGB > 0.5) {\n warnings.push(\n `Significant swap activity during benchmark (+${benchEnv.swapDeltaGB.toFixed(1)} GB). Model may exceed available RAM — results are severely degraded.`\n );\n }\n\n if (benchEnv?.batteryPowered) {\n warnings.push(\n `Running on battery power — performance may be reduced.`\n );\n }\n\n if (benchEnv?.cpuAvgLoad != null && benchEnv.cpuAvgLoad > 90) {\n warnings.push(\n `High CPU load during inference (avg ${benchEnv.cpuAvgLoad.toFixed(0)}%). System may feel unresponsive — GPU-accelerated runtimes (MLX) can reduce CPU pressure.`\n );\n }\n\n return {\n verdict,\n globalScore,\n hardwareFitScore,\n performanceScore,\n qualityScore,\n categoryLabels,\n disqualifiers,\n warnings,\n interpretation,\n tuning,\n };\n}\n","import Table from \"cli-table3\";\nimport chalk from \"chalk\";\nimport type {\n BenchEnvironment,\n BenchResult,\n HardwareInfo,\n PerformanceMetrics,\n QualityMetrics,\n CategoryLevel,\n} from \"../types.js\";\nimport { formatDuration } from \"../utils.js\";\nimport { scoreColor } from \"./score-color.js\";\nimport { effectiveScore, RESPONSE_TIME_LIMITS_MS } from \"../scoring/quality-scorer.js\";\nimport { supportsUnicode } from \"./terminal.js\";\n\nconst BAR_FILLED = supportsUnicode ? \"\\u2588\" : \"#\";\nconst BAR_EMPTY = supportsUnicode ? \"\\u2591\" : \"-\";\n\nfunction compactBar(value: number, max = 100, width = 10): string {\n if (max <= 0) return BAR_EMPTY.repeat(width);\n const ratio = Math.max(0, Math.min(1, value / max));\n const filled = Math.round(ratio * width);\n return BAR_FILLED.repeat(filled) + BAR_EMPTY.repeat(width - filled);\n}\n\nfunction levelColor(level: CategoryLevel) {\n switch (level) {\n case \"Strong\": return chalk.green;\n case \"Adequate\": return chalk.yellow;\n case \"Weak\": return chalk.hex(\"#FF8C00\");\n case \"Poor\": return chalk.red;\n }\n}\n\nfunction getLevel(score: number): CategoryLevel {\n if (score >= 75) return \"Strong\";\n if (score >= 50) return \"Adequate\";\n if (score >= 25) return \"Weak\";\n return \"Poor\";\n}\n\nfunction formatCpuCoresLabel(hw: HardwareInfo): string {\n if (hw.cpuPCores !== null && hw.cpuECores !== null) {\n return `${hw.cpuCores} total (${hw.cpuPCores} performance + ${hw.cpuECores} efficiency)`;\n }\n if (hw.cpuPCores !== null && hw.cpuCores > hw.cpuPCores) {\n return `${hw.cpuCores} threads (${hw.cpuPCores} cores)`;\n }\n if (hw.cpuPCores !== null) {\n return `${hw.cpuCores} total (${hw.cpuPCores} performance)`;\n }\n if (hw.cpuECores !== null) {\n return `${hw.cpuCores} total (${hw.cpuECores} efficiency)`;\n }\n return String(hw.cpuCores);\n}\n\ninterface CategoryIssueSummary {\n name: string;\n crashes: number;\n timeouts: number;\n errors: number;\n}\n\nfunction summarizeCategoryIssues(name: string, details: QualityMetrics[\"reasoning\"][\"details\"]): CategoryIssueSummary {\n let crashes = 0;\n let timeouts = 0;\n let errors = 0;\n\n for (const detail of details) {\n const actual = detail.actual ?? \"\";\n if (/^TIMEOUT\\b/i.test(actual)) {\n timeouts++;\n continue;\n }\n if (/^ERROR:/i.test(actual)) {\n errors++;\n if (/model has crashed|has crashed without additional information|model crashed/i.test(actual)) {\n crashes++;\n }\n }\n }\n\n return { name, crashes, timeouts, errors };\n}\n\nexport function printHardwareTable(hw: HardwareInfo): void {\n const table = new Table({\n head: [chalk.bold(\"Hardware\"), chalk.bold(\"Value\")],\n style: { head: [], border: [] },\n });\n\n const coresDetail = formatCpuCoresLabel(hw);\n\n const cpuLine = hw.cpuFreqGHz\n ? `${hw.cpu} @ ${hw.cpuFreqGHz} GHz`\n : hw.cpu;\n\n const ramLine = hw.memoryType\n ? `${hw.totalMemoryGB} GB ${hw.memoryType} (${hw.freeMemoryGB} GB free)`\n : `${hw.totalMemoryGB} GB (${hw.freeMemoryGB} GB free)`;\n\n const swapColor = hw.swapUsedGB > hw.swapTotalGB * 0.5\n ? chalk.yellow\n : chalk.green;\n const swapLine = hw.swapTotalGB > 0\n ? swapColor(`${hw.swapUsedGB} GB / ${hw.swapTotalGB} GB`)\n : \"None\";\n\n const gpuLine = hw.gpuCores\n ? `${hw.gpu} (${hw.gpuCores} cores)`\n : hw.gpu;\n\n const powerModeColor =\n hw.powerMode === \"low-power\"\n ? chalk.red\n : hw.powerMode === \"performance\"\n ? chalk.green\n : hw.powerMode === \"balanced\"\n ? chalk.yellow\n : chalk.dim;\n const powerModeLabel = hw.powerMode ?? \"unknown\";\n\n if (hw.machineModel) {\n table.push([\"Machine\", chalk.bold(hw.machineModel)]);\n }\n table.push(\n [\"CPU\", cpuLine],\n [\"Cores\", coresDetail],\n [\"RAM\", ramLine],\n [\"Swap\", swapLine],\n [\"GPU\", gpuLine],\n [\"OS\", hw.os],\n [\"Arch\", hw.arch],\n [\"Power Mode\", powerModeColor(powerModeLabel)]\n );\n\n if (hw.cpuCurrentSpeedGHz != null) {\n const freqRatio =\n hw.cpuFreqGHz && hw.cpuFreqGHz > 0\n ? ` (${((hw.cpuCurrentSpeedGHz / hw.cpuFreqGHz) * 100).toFixed(0)}% of nominal)`\n : \"\";\n table.push([\"CPU Current Freq\", `${hw.cpuCurrentSpeedGHz.toFixed(1)} GHz${freqRatio}`]);\n }\n\n console.log(table.toString());\n}\n\nexport function printPerformanceTable(perf: PerformanceMetrics, benchEnvironment?: BenchEnvironment): void {\n const table = new Table({\n head: [chalk.bold(\"Metric\"), chalk.bold(\"Value\")],\n style: { head: [], border: [] },\n });\n\n const tpsColor =\n perf.tokensPerSecond >= 30\n ? chalk.green\n : perf.tokensPerSecond >= 15\n ? chalk.yellow\n : chalk.red;\n\n const ttftColor =\n perf.ttft < 1000\n ? chalk.green\n : perf.ttft < 3000\n ? chalk.yellow\n : chalk.red;\n\n const memColor =\n perf.memoryPercent < 50\n ? chalk.green\n : perf.memoryPercent < 80\n ? chalk.yellow\n : chalk.red;\n\n table.push(\n [\n \"Tokens/sec\",\n perf.tokensPerSecondEstimated\n ? chalk.yellow(`${perf.tokensPerSecond.toFixed(1)} tok/s (estimated)`)\n : tpsColor(`${perf.tokensPerSecond.toFixed(1)} tok/s`),\n ],\n [\n \"First Chunk Latency\",\n perf.firstChunkMs !== undefined\n ? formatDuration(perf.firstChunkMs)\n : chalk.dim(\"N/A (stream metric unavailable)\"),\n ],\n [\"Time to First Token\", ttftColor(formatDuration(perf.ttft))],\n [\n \"Model Load Time\",\n perf.loadTimeAvailable === false\n ? chalk.dim(\"N/A (runtime metric unavailable)\")\n : formatDuration(perf.loadTime),\n ],\n [\"Total Tokens\", String(perf.totalTokens)],\n [\"Prompt Tokens\", String(perf.promptTokens)],\n [\"Completion Tokens\", String(perf.completionTokens)],\n [\n \"Model Memory Footprint\",\n perf.memoryFootprintAvailable === false\n ? chalk.dim(\"N/A (model already loaded; runtime metric unavailable)\")\n : memColor(\n `${perf.memoryUsedGB.toFixed(1)} GB (+${perf.memoryPercent.toFixed(0)}%)${perf.memoryFootprintEstimated ? \" (estimated)\" : \"\"}`\n ),\n ],\n [\n \"Host RAM Pressure\",\n perf.memoryHostPercent !== undefined && perf.memoryHostUsedGB !== undefined\n ? `${perf.memoryHostUsedGB.toFixed(1)} GB (${perf.memoryHostPercent.toFixed(0)}%)`\n : chalk.dim(\"N/A (host metric unavailable)\"),\n ],\n );\n\n if (perf.thinkingTokensEstimate && perf.thinkingTokensEstimate > 0) {\n table.push([\n chalk.magenta(\"Thinking Tokens (est.)\"),\n chalk.magenta(`~${perf.thinkingTokensEstimate} tokens`),\n ]);\n }\n\n if (benchEnvironment?.cpuAvgLoad != null && benchEnvironment.cpuAvgLoad >= 0) {\n const cpuColor = benchEnvironment.cpuAvgLoad < 50 ? chalk.green\n : benchEnvironment.cpuAvgLoad < 80 ? chalk.yellow\n : chalk.red;\n table.push([\n \"CPU Load During Bench\",\n cpuColor(`avg ${benchEnvironment.cpuAvgLoad.toFixed(0)}%` +\n (benchEnvironment.cpuPeakLoad != null ? ` (peak ${benchEnvironment.cpuPeakLoad.toFixed(0)}%)` : \"\")),\n ]);\n }\n\n console.log(table.toString());\n}\n\nexport function printQualityTable(quality: QualityMetrics, timePenalties?: Record<string, number>): void {\n console.log(\n chalk.dim(\n \"Quality scores are based on an internal mixed-difficulty dataset; interpret as directional, not absolute.\"\n )\n );\n\n const table = new Table({\n head: [\n chalk.bold(\"Category\"),\n chalk.bold(\"Score\"),\n chalk.bold(\"Accuracy\"),\n chalk.bold(\"Level\"),\n ],\n style: { head: [], border: [] },\n });\n\n const categories: { name: string; key: string; result: typeof quality.reasoning; label: string }[] = [\n { name: \"Reasoning\", key: \"reasoning\", result: quality.reasoning, label: \"questions\" },\n { name: \"Coding\", key: \"coding\", result: quality.coding, label: \"tasks\" },\n { name: \"Instruction Following\", key: \"instructionFollowing\", result: quality.instructionFollowing, label: \"tasks\" },\n { name: \"Structured Output\", key: \"structuredOutput\", result: quality.structuredOutput, label: \"tasks\" },\n { name: \"Math\", key: \"math\", result: quality.math, label: \"problems\" },\n { name: \"Multilingual\", key: \"multilingual\", result: quality.multilingual, label: \"questions\" },\n ];\n\n for (const cat of categories) {\n const effective = effectiveScore(cat.result, RESPONSE_TIME_LIMITS_MS[cat.key]);\n const raw = cat.result.score;\n const level = getLevel(effective);\n const penaltyCount = timePenalties?.[cat.key] ?? 0;\n const accuracyText = penaltyCount > 0\n ? `${cat.result.correct}/${cat.result.total} ${cat.label} ${chalk.yellow(`(${penaltyCount} slow)`)}`\n : `${cat.result.correct}/${cat.result.total} ${cat.label}`;\n const scoreText = Math.round(effective) !== Math.round(raw)\n ? `${effective.toFixed(0)}% ${chalk.dim(`(raw ${raw.toFixed(0)}%)`)}`\n : `${effective.toFixed(0)}%`;\n table.push([\n cat.name,\n scoreColor(effective)(scoreText),\n accuracyText,\n levelColor(level)(level),\n ]);\n }\n console.log(table.toString());\n\n const issueSummaries = categories\n .map((cat) => summarizeCategoryIssues(cat.name, cat.result.details))\n .filter((summary) => summary.errors > 0 || summary.timeouts > 0);\n\n if (issueSummaries.length > 0) {\n console.log(chalk.yellow(\"Execution issues detected during quality benchmark:\"));\n for (const summary of issueSummaries) {\n const parts: string[] = [];\n if (summary.crashes > 0) parts.push(`${summary.crashes} crash${summary.crashes > 1 ? \"es\" : \"\"}`);\n const nonCrashErrors = summary.errors - summary.crashes;\n if (nonCrashErrors > 0) parts.push(`${nonCrashErrors} error${nonCrashErrors > 1 ? \"s\" : \"\"}`);\n if (summary.timeouts > 0) parts.push(`${summary.timeouts} timeout${summary.timeouts > 1 ? \"s\" : \"\"}`);\n console.log(chalk.yellow(` • ${summary.name}: ${parts.join(\", \")} (scored as incorrect)`));\n }\n }\n}\n\nexport function printSummaryTable(results: BenchResult[]): void {\n const termWidth = process.stdout.columns || 80;\n const compact = termWidth < 100;\n\n console.log(\n chalk.dim(\n \"Global = 30% Hardware Fit + 70% Quality. Hardware Fit = host compatibility. Quality = model capability.\"\n )\n );\n\n const head = [\n chalk.bold(\"Model\"),\n chalk.bold(\"tok/s\"),\n chalk.bold(\"TTFT\"),\n chalk.bold(\"Model RAM%\"),\n chalk.bold(\"Profile\"),\n chalk.bold(\"HW Fit\"),\n chalk.bold(\"Quality\"),\n chalk.bold(\"Global\"),\n ...(compact ? [] : [chalk.bold(\"DQ\"), chalk.bold(\"Flags\")]),\n chalk.bold(\"Verdict\"),\n ];\n\n const table = new Table({\n head,\n style: { head: [], border: [] },\n wordWrap: true,\n });\n\n const formatSummaryModelMemory = (result: BenchResult): string => {\n if (result.performance.memoryFootprintAvailable === false) return \"N/A\";\n const value = `${result.performance.memoryPercent.toFixed(0)}%`;\n return result.performance.memoryFootprintEstimated ? `${value}~` : value;\n };\n\n for (const r of results) {\n const vColor =\n r.fitness.verdict === \"EXCELLENT\"\n ? chalk.green.bold\n : r.fitness.verdict === \"GOOD\"\n ? chalk.blue.bold\n : r.fitness.verdict === \"MARGINAL\"\n ? chalk.yellow.bold\n : chalk.red.bold;\n\n const flags: string[] = [];\n if (r.hardware.powerMode === \"low-power\") flags.push(chalk.red(\"ECO\"));\n if (r.modelInfo?.thinkingDetected) flags.push(chalk.magenta(\"THINK\"));\n\n const modelName = compact && r.model.length > 20\n ? r.model.slice(0, 18) + \"..\"\n : r.model;\n const throughputLabel = r.performance.tokensPerSecondEstimated\n ? `~${r.performance.tokensPerSecond.toFixed(1)}`\n : `${r.performance.tokensPerSecond.toFixed(1)}`;\n\n const row = [\n modelName,\n throughputLabel,\n formatDuration(r.performance.ttft),\n formatSummaryModelMemory(r),\n r.fitness.tuning.profile,\n scoreColor(r.fitness.hardwareFitScore)(\n `${compactBar(r.fitness.hardwareFitScore)} ${r.fitness.hardwareFitScore}%`\n ),\n r.fitness.qualityScore\n ? scoreColor(r.fitness.qualityScore.total)(\n `${compactBar(r.fitness.qualityScore.total)} ${r.fitness.qualityScore.total}%`\n )\n : \"\\u2014\",\n r.fitness.globalScore !== null\n ? scoreColor(r.fitness.globalScore)(\n `${compactBar(r.fitness.globalScore)} ${r.fitness.globalScore}%`\n )\n : \"\\u2014\",\n ...(compact\n ? []\n : [\n String(r.fitness.disqualifiers.length),\n flags.length > 0 ? flags.join(\" \") : \"\\u2014\",\n ]),\n vColor(r.fitness.verdict),\n ];\n\n table.push(row);\n }\n console.log(table.toString());\n}\n","import chalk from \"chalk\";\n\nexport type ColorFn = (text: string) => string;\n\nexport function scoreColor(score: number): ColorFn {\n if (score >= 80) return chalk.green;\n if (score >= 60) return chalk.blue;\n if (score >= 40) return chalk.yellow;\n return chalk.red;\n}\n","import chalk from \"chalk\";\nimport type { FitnessResult } from \"../types.js\";\nimport { scoreColor, type ColorFn } from \"./score-color.js\";\nimport { stripAnsi, supportsUnicode } from \"./terminal.js\";\n\nconst BOX_INNER = 60;\n\nfunction visibleLength(str: string): number {\n return stripAnsi(str).length;\n}\n\nfunction wrapText(text: string, maxWidth: number): string[] {\n if (visibleLength(text) <= maxWidth) return [text];\n const words = text.split(\" \");\n const lines: string[] = [];\n let current = \"\";\n for (const word of words) {\n if (visibleLength(current) === 0) {\n current = word;\n } else if (visibleLength(current) + 1 + visibleLength(word) <= maxWidth) {\n current += \" \" + word;\n } else {\n lines.push(current);\n current = word;\n }\n }\n if (current.length > 0) lines.push(current);\n return lines;\n}\n\nconst BAR_FILLED = supportsUnicode ? \"\\u2588\" : \"#\";\nconst BAR_EMPTY = supportsUnicode ? \"\\u2591\" : \"-\";\n\nfunction progressBar(value: number, max: number, width = 26): string {\n if (max <= 0) return BAR_EMPTY.repeat(width);\n const ratio = Math.max(0, Math.min(1, value / max));\n const filled = Math.round(ratio * width);\n const empty = width - filled;\n return BAR_FILLED.repeat(filled) + BAR_EMPTY.repeat(empty);\n}\n\nfunction levelColor(level: string): ColorFn {\n switch (level) {\n case \"Strong\": return chalk.green;\n case \"Adequate\": return chalk.yellow;\n case \"Weak\": return chalk.hex(\"#FF8C00\"); // orange\n case \"Poor\": return chalk.red;\n default: return chalk.dim;\n }\n}\n\nconst BOX_TL = supportsUnicode ? \"\\u250C\" : \"+\";\nconst BOX_TR = supportsUnicode ? \"\\u2510\" : \"+\";\nconst BOX_BL = supportsUnicode ? \"\\u2514\" : \"+\";\nconst BOX_BR = supportsUnicode ? \"\\u2518\" : \"+\";\nconst BOX_H = supportsUnicode ? \"\\u2500\" : \"-\";\nconst BOX_V = supportsUnicode ? \"\\u2502\" : \"|\";\n\nfunction sectionStart(title: string, borderColor: ColorFn): void {\n const pad = Math.max(1, BOX_INNER - title.length);\n console.log(borderColor(`${BOX_TL} ${title} ${BOX_H.repeat(pad)}${BOX_TR}`));\n}\n\nfunction sectionEnd(borderColor: ColorFn): void {\n console.log(borderColor(`${BOX_BL}${BOX_H.repeat(BOX_INNER + 2)}${BOX_BR}`));\n}\n\nfunction sectionText(\n text: string,\n borderColor: ColorFn,\n textColor: ColorFn = chalk.dim\n): void {\n const contentWidth = BOX_INNER;\n const lines = text.length === 0 ? [\"\"] : wrapText(text, contentWidth);\n for (const line of lines) {\n const pad = Math.max(0, contentWidth - visibleLength(line));\n console.log(`${borderColor(BOX_V)} ${textColor(line)}${\" \".repeat(pad)} ${borderColor(BOX_V)}`);\n }\n}\n\nfunction scoreRow(\n label: string,\n score: number,\n borderColor: ColorFn,\n max = 100\n): void {\n const color = scoreColor(score);\n const meter = progressBar(score, max);\n const content = `${label.padEnd(16)} ${color(`[${meter}] ${score.toFixed(0)}/${max}`)}`;\n const visible = visibleLength(content);\n const pad = Math.max(0, BOX_INNER - visible);\n console.log(\n `${borderColor(BOX_V)} ${content}${\" \".repeat(pad)} ${borderColor(BOX_V)}`\n );\n}\n\nfunction verdictIcon(verdict: string): string {\n if (supportsUnicode) {\n switch (verdict) {\n case \"EXCELLENT\": return \"\\u25A0\";\n case \"GOOD\": return \"\\u25CF\";\n case \"MARGINAL\": return \"\\u25B2\";\n default: return \"\\u2717\";\n }\n }\n switch (verdict) {\n case \"EXCELLENT\": return \"*\";\n case \"GOOD\": return \"o\";\n case \"MARGINAL\": return \"!\";\n default: return \"x\";\n }\n}\n\nfunction verdictColor(verdict: string): ColorFn {\n switch (verdict) {\n case \"EXCELLENT\": return chalk.green.bold;\n case \"GOOD\": return chalk.blue.bold;\n case \"MARGINAL\": return chalk.yellow.bold;\n default: return chalk.red.bold;\n }\n}\n\nexport function printVerdict(model: string, fitness: FitnessResult): void {\n console.log(chalk.bold(\"\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\"));\n console.log(chalk.bold(` VERDICT for ${model}`));\n console.log(chalk.bold(\"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\"));\n\n const fitBorder = chalk.cyan;\n const qualityBorder = chalk.green;\n const globalBorder = chalk.magenta;\n\n // ── Section A: Hardware Fit ──\n sectionStart(\"A) Hardware Fit\", fitBorder);\n sectionText(\n \"Method: thresholds are adjusted to your host hardware profile.\",\n fitBorder,\n chalk.white\n );\n sectionText(`Active profile: ${fitness.tuning.profile}`, fitBorder, chalk.white);\n sectionText(\n \"Formula: Speed (/50) + TTFT (/20) + Memory (/30) = Hardware Fit (/100).\",\n fitBorder\n );\n sectionText(\n `Targets speed (tok/s): Excellent >= ${fitness.tuning.speed.excellent}, Good >= ${fitness.tuning.speed.good}, Marginal >= ${fitness.tuning.speed.marginal}`,\n fitBorder\n );\n sectionText(\n `Targets TTFT (ms): Excellent <= ${fitness.tuning.ttft.excellentMs}, Good <= ${fitness.tuning.ttft.goodMs}, Marginal <= ${fitness.tuning.ttft.marginalMs}`,\n fitBorder\n );\n sectionText(\n `Hard limits: speed >= ${fitness.tuning.speed.hardMin} tok/s, TTFT <= ${fitness.tuning.ttft.hardMaxMs}ms, load <= ${fitness.tuning.loadTimeHardMaxMs}ms`,\n fitBorder\n );\n sectionText(\"\", fitBorder);\n scoreRow(\"Performance\", fitness.performanceScore.total, fitBorder);\n sectionText(\n ` Breakdown: Speed ${fitness.performanceScore.speed}/50 TTFT ${fitness.performanceScore.ttft}/20 Memory ${fitness.performanceScore.memory}/30`,\n fitBorder\n );\n scoreRow(\"Hardware Fit\", fitness.hardwareFitScore, fitBorder);\n\n if (fitness.disqualifiers.length > 0) {\n sectionText(\"Disqualifiers:\", fitBorder, chalk.red);\n for (const d of fitness.disqualifiers) {\n sectionText(` • ${d}`, fitBorder, chalk.red);\n }\n }\n if (fitness.warnings.length > 0) {\n sectionText(\"Warnings:\", fitBorder, chalk.yellow);\n for (const w of fitness.warnings) {\n sectionText(` ${supportsUnicode ? \"\\u26A0\" : \"!!\"} ${w}`, fitBorder, chalk.yellow);\n }\n }\n sectionEnd(fitBorder);\n\n // ── Section B: Task Quality ──\n sectionStart(\"B) Task Quality\", qualityBorder);\n if (fitness.qualityScore && fitness.categoryLabels) {\n sectionText(\n \"Quality assessment based on 6 dimensions across diverse task types.\",\n qualityBorder,\n chalk.white\n );\n sectionText(\"\", qualityBorder);\n scoreRow(\"Quality Total\", fitness.qualityScore.total, qualityBorder);\n sectionText(\"\", qualityBorder);\n\n for (const label of fitness.categoryLabels) {\n const color = levelColor(label.level);\n sectionText(\n ` ${label.category.padEnd(24)} ${color(`${label.rawScore.toFixed(0)}%`.padEnd(6))} ${color(label.level)}`,\n qualityBorder,\n chalk.white\n );\n }\n\n // Time penalty summary\n if (fitness.qualityScore.timePenalties) {\n const parts: string[] = [];\n const limitLabels: Record<string, string> = {\n reasoning: \"reasoning\",\n math: \"math\",\n coding: \"coding\",\n instructionFollowing: \"instruction-following\",\n structuredOutput: \"structured-output\",\n multilingual: \"multilingual\",\n };\n for (const [key, count] of Object.entries(fitness.qualityScore.timePenalties)) {\n parts.push(`${count} ${limitLabels[key] ?? key}`);\n }\n sectionText(\"\", qualityBorder);\n sectionText(\n `Time penalties: ${parts.join(\" + \")} answers penalized (response too slow)`,\n qualityBorder,\n chalk.yellow\n );\n }\n\n sectionText(\"\", qualityBorder);\n sectionText(\n \"Based on an internal mixed-difficulty dataset; interpret as directional, not absolute.\",\n qualityBorder\n );\n } else {\n sectionText(\"\", qualityBorder);\n sectionText(\"Quality not computed (performance-only run).\", qualityBorder);\n sectionText(\"Run a full benchmark to get quality assessment.\", qualityBorder);\n }\n sectionEnd(qualityBorder);\n\n // ── Section C: Global Score ──\n sectionStart(\"C) Global Score\", globalBorder);\n if (fitness.globalScore !== null) {\n sectionText(\n \"Formula: Global = 30% Hardware Fit + 70% Quality.\",\n globalBorder,\n chalk.white\n );\n sectionText(\"\", globalBorder);\n scoreRow(\"Global Score\", fitness.globalScore, globalBorder);\n } else {\n sectionText(\"\", globalBorder);\n sectionText(\"Global score unavailable (performance-only run).\", globalBorder);\n }\n\n const vColor = verdictColor(fitness.verdict);\n const icon = verdictIcon(fitness.verdict);\n sectionText(\"\", globalBorder);\n sectionText(`Verdict: ${icon} ${fitness.verdict}`, globalBorder, vColor);\n sectionText(`Interpretation: ${fitness.interpretation}`, globalBorder);\n sectionEnd(globalBorder);\n\n console.log(chalk.bold(\"\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\"));\n}\n","import { mkdir, writeFile, readFile, readdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { BenchResult } from \"../types.js\";\nimport { normalizeEmail, normalizeNickname, isValidEmail, isValidNickname } from \"./submitter.js\";\n\nconst BASE_DIR = join(homedir(), \".metrillm\");\nconst RESULTS_DIR = join(BASE_DIR, \"results\");\nconst CONFIG_PATH = join(BASE_DIR, \"config.json\");\n\nexport interface MetriLLMConfig {\n autoShare: true | \"ask\"; // true = always share, \"ask\" = prompt every run\n telemetry?: boolean; // true = opt-in, false = opt-out, undefined = not yet decided\n submitterNickname?: string;\n submitterEmail?: string;\n runtimeBackend?: \"ollama\" | \"lm-studio\";\n}\n\nconst DEFAULT_CONFIG: MetriLLMConfig = {\n autoShare: \"ask\",\n};\n\nasync function ensureDirs(): Promise<void> {\n await mkdir(RESULTS_DIR, { recursive: true });\n}\n\nfunction parseRuntimeBackend(value: unknown): MetriLLMConfig[\"runtimeBackend\"] | undefined {\n if (value === \"ollama\" || value === \"lm-studio\") {\n return value;\n }\n return undefined;\n}\n\nfunction resultFilename(result: BenchResult): string {\n const ts = result.timestamp\n .replace(/[:.]/g, \"-\")\n .replace(\"T\", \"_\")\n .replace(/[^0-9_-]/g, \"\");\n const model = result.model.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n const hashSuffix = result.metadata.rawLogHash\n ? result.metadata.rawLogHash.slice(0, 8)\n : `${Date.now()}`;\n return `${ts}_${model}_${hashSuffix}.json`;\n}\n\nexport async function saveResult(result: BenchResult): Promise<string> {\n await ensureDirs();\n const filename = resultFilename(result);\n const filepath = join(RESULTS_DIR, filename);\n await writeFile(filepath, JSON.stringify(result, null, 2), \"utf8\");\n return filepath;\n}\n\nexport async function loadResults(): Promise<BenchResult[]> {\n await ensureDirs();\n try {\n const files = await readdir(RESULTS_DIR);\n const jsonFiles = files.filter((f) => f.endsWith(\".json\")).sort();\n const results: BenchResult[] = [];\n for (const file of jsonFiles) {\n try {\n const content = await readFile(join(RESULTS_DIR, file), \"utf8\");\n results.push(JSON.parse(content) as BenchResult);\n } catch {\n // Skip malformed files\n }\n }\n return results;\n } catch {\n return [];\n }\n}\n\nexport async function loadConfig(): Promise<MetriLLMConfig> {\n try {\n const content = await readFile(CONFIG_PATH, \"utf8\");\n const parsed = JSON.parse(content) as Record<string, unknown>;\n const autoShare = parsed.autoShare === true ? true : \"ask\";\n const telemetry = typeof parsed.telemetry === \"boolean\" ? parsed.telemetry : undefined;\n const submitterNickname = typeof parsed.submitterNickname === \"string\"\n && isValidNickname(parsed.submitterNickname)\n ? normalizeNickname(parsed.submitterNickname)\n : undefined;\n const submitterEmail = typeof parsed.submitterEmail === \"string\"\n && isValidEmail(parsed.submitterEmail)\n ? normalizeEmail(parsed.submitterEmail)\n : undefined;\n const runtimeBackend = parseRuntimeBackend(parsed.runtimeBackend);\n return {\n ...DEFAULT_CONFIG,\n autoShare,\n telemetry,\n submitterNickname,\n submitterEmail,\n runtimeBackend,\n };\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport async function saveConfig(config: MetriLLMConfig): Promise<void> {\n await ensureDirs();\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), \"utf8\");\n}\n\nexport function getResultsDir(): string {\n return RESULTS_DIR;\n}\n","import { createHash } from \"node:crypto\";\nimport type { SubmitterIdentity } from \"../types.js\";\n\nconst NICKNAME_MIN_LEN = 2;\nconst NICKNAME_MAX_LEN = 40;\nconst EMAIL_MAX_LEN = 254;\n\nexport interface SubmitterProfile {\n nickname: string;\n email: string;\n}\n\nexport function normalizeNickname(value: string): string {\n return value.trim().replace(/\\s+/g, \" \");\n}\n\nexport function normalizeEmail(value: string): string {\n return value.trim().toLowerCase();\n}\n\nexport function isValidNickname(value: string): boolean {\n const nickname = normalizeNickname(value);\n return nickname.length >= NICKNAME_MIN_LEN && nickname.length <= NICKNAME_MAX_LEN;\n}\n\nexport function isValidEmail(value: string): boolean {\n const email = normalizeEmail(value);\n if (email.length === 0 || email.length > EMAIL_MAX_LEN) return false;\n // Simple pragmatic check for CLI collection.\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email);\n}\n\nexport function hashEmail(value: string): string {\n return createHash(\"sha256\").update(normalizeEmail(value)).digest(\"hex\");\n}\n\nexport function toSubmitterProfile(value: { nickname: string; email: string }): SubmitterProfile {\n return {\n nickname: normalizeNickname(value.nickname),\n email: normalizeEmail(value.email),\n };\n}\n\nexport function toSubmitterIdentity(profile: SubmitterProfile): SubmitterIdentity {\n return {\n nickname: profile.nickname,\n emailHash: hashEmail(profile.email),\n };\n}\n","import { createClient, type SupabaseClient } from \"@supabase/supabase-js\";\nimport type { BenchResult } from \"../types.js\";\n\nconst SUPABASE_URL_DEFAULT = \"https://phvvzbgasxobjzjnkewf.supabase.co\";\n// Public anon key for the official read/insert-only leaderboard project (RLS enforced).\nconst SUPABASE_ANON_KEY_DEFAULT =\n \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InBodnZ6Ymdhc3hvYmp6am5rZXdmIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzIyOTMxNTksImV4cCI6MjA4Nzg2OTE1OX0.-Wn0V8f-Uv_x_krNUnjmFRcqfAOPQEVc_Qx1kZ2ppgk\";\nconst SUPABASE_URL_PLACEHOLDER = \"https://YOUR_SUPABASE_PROJECT.supabase.co\";\nconst SUPABASE_URL_PLACEHOLDER_ALT = \"https://your-project.supabase.co\";\nconst SUPABASE_ANON_KEY_PLACEHOLDER = \"YOUR_SUPABASE_ANON_KEY\";\nconst SUPABASE_ANON_KEY_PLACEHOLDER_ALT = \"your-supabase-anon-key\";\nconst PUBLIC_RESULT_BASE_URL_DEFAULT = \"https://metrillm.dev\";\nconst PUBLIC_RESULT_BASE_URL_PLACEHOLDER = \"https://YOUR_DASHBOARD_DOMAIN\";\nconst PUBLIC_RESULT_BASE_URL_PLACEHOLDER_ALT = \"https://your-dashboard-domain\";\n\nfunction resolveUploaderConfig(): {\n supabaseUrl: string;\n supabaseAnonKey: string;\n publicResultBaseUrl: string;\n} {\n const configuredPublicBaseUrl = process.env.METRILLM_PUBLIC_RESULT_BASE_URL?.trim();\n const publicResultBaseUrl =\n !configuredPublicBaseUrl || hasPlaceholder(configuredPublicBaseUrl)\n ? PUBLIC_RESULT_BASE_URL_DEFAULT\n : configuredPublicBaseUrl;\n\n return {\n supabaseUrl:\n !process.env.METRILLM_SUPABASE_URL || hasPlaceholder(process.env.METRILLM_SUPABASE_URL)\n ? SUPABASE_URL_DEFAULT\n : process.env.METRILLM_SUPABASE_URL,\n supabaseAnonKey:\n !process.env.METRILLM_SUPABASE_ANON_KEY || hasPlaceholder(process.env.METRILLM_SUPABASE_ANON_KEY)\n ? SUPABASE_ANON_KEY_DEFAULT\n : process.env.METRILLM_SUPABASE_ANON_KEY,\n publicResultBaseUrl,\n };\n}\n\nfunction hasPlaceholder(value: string): boolean {\n const normalized = value.trim();\n if (normalized.length === 0) return true;\n return [\n SUPABASE_URL_PLACEHOLDER,\n SUPABASE_URL_PLACEHOLDER_ALT,\n SUPABASE_ANON_KEY_PLACEHOLDER,\n SUPABASE_ANON_KEY_PLACEHOLDER_ALT,\n PUBLIC_RESULT_BASE_URL_PLACEHOLDER,\n PUBLIC_RESULT_BASE_URL_PLACEHOLDER_ALT,\n ].some((placeholder) => placeholder.toLowerCase() === normalized.toLowerCase());\n}\n\nfunction assertUploaderConfig(config: {\n supabaseUrl: string;\n supabaseAnonKey: string;\n}): void {\n const missing: string[] = [];\n if (!config.supabaseUrl.trim()) missing.push(\"METRILLM_SUPABASE_URL\");\n if (!config.supabaseAnonKey.trim()) missing.push(\"METRILLM_SUPABASE_ANON_KEY\");\n if (missing.length > 0) {\n throw new Error(\n `Upload is not configured. Set these variables first: ${missing.join(\", \")}`\n );\n }\n}\n\nexport interface UploadResult {\n id: string;\n url: string;\n rankGlobalPct: number | null; // e.g. 15 = top 15%\n rankCpuPct: number | null; // e.g. 8 = top 8% on same CPU\n totalCount: number;\n}\n\nexport interface UploadBenchOptions {\n submitterEmail?: string;\n}\n\nfunction resolveUploadedMemoryPercent(result: BenchResult): number | null {\n return result.performance.memoryFootprintAvailable === false\n ? null\n : result.performance.memoryPercent;\n}\n\nfunction resolveUploadedModelFormat(result: BenchResult): string {\n if (result.metadata.modelFormat?.trim()) return result.metadata.modelFormat;\n\n const runtimeBackend = result.metadata.runtimeBackend ?? \"ollama\";\n if (runtimeBackend === \"ollama\") return \"gguf\";\n return \"unknown\";\n}\n\nexport async function uploadBenchResult(\n result: BenchResult,\n options: UploadBenchOptions = {}\n): Promise<UploadResult> {\n const config = resolveUploaderConfig();\n assertUploaderConfig(config);\n const supabase = createClient(config.supabaseUrl, config.supabaseAnonKey);\n\n const row = {\n model: result.model,\n parameter_size: result.modelInfo?.parameterSize ?? null,\n quantization: result.modelInfo?.quantization ?? null,\n family: result.modelInfo?.family ?? null,\n thinking_detected: result.modelInfo?.thinkingDetected ?? null,\n tokens_per_second: result.performance.tokensPerSecond,\n ttft_ms: result.performance.ttft,\n memory_percent: resolveUploadedMemoryPercent(result),\n thinking_tokens_estimate: result.performance.thinkingTokensEstimate ?? null,\n verdict: result.fitness.verdict,\n global_score: result.fitness.globalScore,\n hardware_fit_score: result.fitness.hardwareFitScore,\n quality_score: result.fitness.qualityScore?.total ?? null,\n cpu: result.hardware.cpu,\n cpu_cores: result.hardware.cpuCores,\n total_memory_gb: result.hardware.totalMemoryGB,\n gpu: result.hardware.gpu || null,\n os: result.hardware.os,\n arch: result.hardware.arch,\n machine_model: result.hardware.machineModel ?? null,\n power_mode: result.hardware.powerMode ?? null,\n benchmark_spec_version: result.metadata.benchmarkSpecVersion,\n runtime_version: result.metadata.runtimeVersion,\n runtime_backend: result.metadata.runtimeBackend ?? \"ollama\",\n model_format: resolveUploadedModelFormat(result),\n raw_log_hash: result.metadata.rawLogHash,\n result: result,\n };\n\n const { data, error } = await supabase\n .from(\"benchmarks\")\n .insert(row)\n .select(\"id\")\n .single();\n\n if (error) {\n if (error.code === \"23505\") {\n // Unique constraint violation on raw_log_hash = duplicate upload\n throw new Error(\"This benchmark result has already been uploaded.\");\n }\n throw new Error(`Upload failed: ${error.message}`);\n }\n\n const id = data.id as string;\n const url = `${config.publicResultBaseUrl.replace(/\\/+$/, \"\")}/result/${id}`;\n\n await upsertLeadBestEffort(\n supabase,\n options.submitterEmail,\n result.submitter?.nickname ?? null,\n result.submitter?.emailHash ?? null\n );\n\n const rank = await getRank(\n supabase,\n result.fitness.globalScore,\n result.hardware.cpu\n );\n return { id, url, ...rank };\n}\n\nasync function upsertLeadBestEffort(\n supabase: SupabaseClient,\n email: string | undefined,\n nickname: string | null,\n emailHash: string | null\n): Promise<void> {\n if (!email || !emailHash) return;\n\n try {\n const { error } = await supabase\n .from(\"benchmark_leads\")\n .upsert(\n {\n email,\n email_hash: emailHash,\n nickname,\n source: \"cli\",\n last_seen_at: new Date().toISOString(),\n },\n { onConflict: \"email_hash\" }\n );\n\n if (error) {\n throw error;\n }\n } catch {\n // Lead collection is best-effort and must not block benchmark uploads.\n }\n}\n\nasync function getRank(\n supabase: SupabaseClient,\n globalScore: number | null,\n cpu: string\n): Promise<{ rankGlobalPct: number | null; rankCpuPct: number | null; totalCount: number }> {\n if (globalScore == null) {\n return { rankGlobalPct: null, rankCpuPct: null, totalCount: 0 };\n }\n\n try {\n const { data, error } = await supabase.rpc(\"get_rank\", {\n p_global_score: globalScore,\n p_cpu: cpu,\n });\n\n if (error || !data) {\n return { rankGlobalPct: null, rankCpuPct: null, totalCount: 0 };\n }\n\n const { total_count, better_count, cpu_total, cpu_better } = data;\n const rankGlobalPct =\n total_count > 0 ? Math.max(1, Math.round((better_count + 1) / total_count * 100)) : null;\n const rankCpuPct =\n cpu_total > 0 ? Math.max(1, Math.round((cpu_better + 1) / cpu_total * 100)) : null;\n\n return { rankGlobalPct, rankCpuPct, totalCount: total_count };\n } catch {\n return { rankGlobalPct: null, rankCpuPct: null, totalCount: 0 };\n }\n}\n","import chalk from \"chalk\";\nimport * as readline from \"node:readline\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport type { BenchResult } from \"../types.js\";\nimport { loadConfig, saveConfig } from \"../core/store.js\";\nimport { supportsUnicode } from \"./terminal.js\";\n\nexport type ShareDecision = \"share\" | \"skip\";\ntype ShareChoice = \"share\" | \"skip\" | \"always\";\n\ninterface SharePromptDeps {\n selectChoice?: (result: BenchResult) => Promise<ShareChoice>;\n}\n\ninterface ShareOption {\n label: string;\n hint: string;\n value: ShareChoice;\n}\n\nconst SHARE_OPTIONS: ShareOption[] = [\n { label: \"Yes, share now\", hint: \"Upload this benchmark result to the public leaderboard.\", value: \"share\" },\n { label: \"No (this run only)\", hint: \"Skip upload for this benchmark run only.\", value: \"skip\" },\n { label: \"Always share\", hint: \"Save preference and automatically share future results.\", value: \"always\" },\n];\n\nfunction isEnterKey(str: string, keyName?: string): boolean {\n return (\n keyName === \"return\"\n || keyName === \"enter\"\n || keyName === \"numenter\"\n || keyName === \"kpenter\"\n || str === \"\\r\"\n || str === \"\\n\"\n );\n}\n\nfunction renderShareMenu(result: BenchResult, selectedIndex: number, lastRenderedLines = 0): number {\n const score = result.fitness.globalScore ?? result.fitness.hardwareFitScore;\n const verdict = result.fitness.verdict;\n const tps = result.performance.tokensPerSecond.toFixed(1);\n const ram = `${result.hardware.totalMemoryGB.toFixed(0)} GB`;\n\n const lines: string[] = [];\n lines.push(chalk.bold.cyan(\"Share Result\"));\n lines.push(chalk.dim(\"Use Up/Down arrows then Enter, or press 1-3 on keyboard/numpad.\"));\n lines.push(chalk.dim(\"Shortcuts: y = share, n = skip, a = always. Esc = skip.\"));\n lines.push(\"\");\n const checkMark = supportsUnicode ? \"\\u2713\" : \"ok\";\n lines.push(chalk.bold.green(` ${checkMark} Benchmark complete!`));\n lines.push(chalk.dim(` Score: ${score}/100 — ${verdict}`));\n lines.push(chalk.dim(` ${result.model} @ ${tps} tok/s (${ram} RAM)`));\n lines.push(\"\");\n lines.push(chalk.bold(\" Share your result on the public leaderboard?\"));\n lines.push(chalk.dim(\" Your hardware specs and scores will be published (no personal data).\"));\n lines.push(\"\");\n\n for (let i = 0; i < SHARE_OPTIONS.length; i++) {\n const option = SHARE_OPTIONS[i];\n const marker = i === selectedIndex ? chalk.cyan(\">\") : \" \";\n const label = i === selectedIndex ? chalk.bold(option.label) : option.label;\n const ordinal = `${i + 1}.`.padStart(3);\n lines.push(` ${marker} ${chalk.dim(ordinal)} ${label}`);\n lines.push(chalk.dim(` ${option.hint}`));\n }\n\n if (lastRenderedLines > 0) {\n output.write(`\\x1b[${lastRenderedLines}A`);\n }\n\n for (const line of lines) {\n output.write(line + \"\\x1b[K\\n\");\n }\n\n return lines.length;\n}\n\nfunction parseChoiceFromKey(str: string, keyName?: string): ShareChoice | null {\n const value = (keyName ?? str).toLowerCase();\n const directMap: Record<string, ShareChoice> = {\n \"1\": \"share\",\n \"2\": \"skip\",\n \"3\": \"always\",\n y: \"share\",\n n: \"skip\",\n a: \"always\",\n };\n\n if (value in directMap) {\n return directMap[value];\n }\n\n if (value === \"numpad1\" || value === \"kp1\") return \"share\";\n if (value === \"numpad2\" || value === \"kp2\") return \"skip\";\n if (value === \"numpad3\" || value === \"kp3\") return \"always\";\n return null;\n}\n\nasync function selectShareChoice(result: BenchResult): Promise<ShareChoice> {\n return new Promise((resolve) => {\n let index = 0;\n let lastRenderedLines = 0;\n const previousRawMode = input.isTTY ? input.isRaw : false;\n\n const cleanup = () => {\n input.off(\"keypress\", onKeypress);\n if (input.isTTY) {\n input.setRawMode(previousRawMode);\n }\n output.write(\"\\x1b[?25h\");\n };\n\n const finish = (choice: ShareChoice) => {\n cleanup();\n resolve(choice);\n };\n\n const onKeypress = (str: string, key: { name?: string; ctrl?: boolean }) => {\n if (key.ctrl && key.name === \"c\") {\n cleanup();\n process.exit(130);\n }\n\n const quickChoice = parseChoiceFromKey(str, key.name);\n if (quickChoice) {\n finish(quickChoice);\n return;\n }\n\n if (key.name === \"up\" || key.name === \"k\") {\n index = (index - 1 + SHARE_OPTIONS.length) % SHARE_OPTIONS.length;\n lastRenderedLines = renderShareMenu(result, index, lastRenderedLines);\n return;\n }\n\n if (key.name === \"down\" || key.name === \"j\") {\n index = (index + 1) % SHARE_OPTIONS.length;\n lastRenderedLines = renderShareMenu(result, index, lastRenderedLines);\n return;\n }\n\n if (isEnterKey(str, key.name)) {\n finish(SHARE_OPTIONS[index]!.value);\n return;\n }\n\n if (key.name === \"escape\") {\n finish(\"skip\");\n }\n };\n\n readline.emitKeypressEvents(input);\n input.resume();\n if (input.isTTY) {\n input.setRawMode(true);\n }\n\n output.write(\"\\x1b[?25l\");\n lastRenderedLines = renderShareMenu(result, index, lastRenderedLines);\n input.on(\"keypress\", onKeypress);\n });\n}\n\nexport async function promptShare(\n result: BenchResult,\n deps: SharePromptDeps = {}\n): Promise<ShareDecision> {\n const config = await loadConfig();\n\n // If user has a saved preference, use it\n if (config.autoShare === true) return \"share\";\n\n // Interactive prompt (autoShare === \"ask\")\n if (!input.isTTY || !output.isTTY) return \"skip\";\n\n const choice = await (deps.selectChoice ?? selectShareChoice)(result);\n\n if (choice === \"always\") {\n await saveConfig({ ...config, autoShare: true });\n return \"share\";\n }\n if (choice === \"skip\") {\n return \"skip\";\n }\n return \"share\";\n}\n","import chalk from \"chalk\";\nimport * as readline from \"node:readline\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport { loadConfig, saveConfig, type MetriLLMConfig } from \"../core/store.js\";\nimport {\n isValidEmail,\n isValidNickname,\n normalizeEmail,\n normalizeNickname,\n toSubmitterIdentity,\n toSubmitterProfile,\n type SubmitterProfile,\n} from \"../core/submitter.js\";\n\nexport interface ShareSubmitter {\n nickname: string;\n email: string;\n emailHash: string;\n}\n\ninterface SubmitterPromptDeps {\n askLine?: (prompt: string) => Promise<string | null>;\n loadUserConfig?: () => Promise<MetriLLMConfig>;\n saveUserConfig?: (config: MetriLLMConfig) => Promise<void>;\n}\n\nfunction canPromptInteractively(): boolean {\n return Boolean(input.isTTY && output.isTTY && input.readable && !input.readableEnded);\n}\n\nasync function askLine(prompt: string): Promise<string | null> {\n if (!input.readable || input.readableEnded) {\n return null;\n }\n\n const previousRawMode = input.isTTY ? input.isRaw : false;\n if (input.isTTY && previousRawMode) {\n input.setRawMode(false);\n }\n\n const rl = readline.createInterface({ input, output });\n\n return new Promise((resolve) => {\n let settled = false;\n\n const finish = (value: string | null) => {\n if (settled) return;\n settled = true;\n input.off(\"end\", onEnd);\n rl.off(\"close\", onClose);\n try {\n rl.close();\n } catch {\n // Ignore close failures.\n }\n if (input.isTTY && previousRawMode) {\n input.setRawMode(true);\n }\n resolve(value);\n };\n\n const onEnd = () => finish(null);\n const onClose = () => finish(null);\n\n input.once(\"end\", onEnd);\n rl.once(\"close\", onClose);\n\n rl.question(prompt, (answer) => {\n finish(answer);\n });\n });\n}\n\nasync function promptSubmitterProfile(\n deps: SubmitterPromptDeps,\n defaults: { nickname?: string; email?: string } = {}\n): Promise<SubmitterProfile | null> {\n const ask = deps.askLine ?? askLine;\n\n let nicknameCandidate = defaults.nickname ?? \"\";\n while (true) {\n const nicknameHint = defaults.nickname ? ` [${defaults.nickname}]` : \"\";\n const nicknameAnswer = await ask(`Nickname${nicknameHint} > `);\n if (nicknameAnswer === null) return null;\n\n nicknameCandidate = nicknameAnswer.trim().length > 0\n ? nicknameAnswer\n : (defaults.nickname ?? \"\");\n\n if (isValidNickname(nicknameCandidate)) {\n break;\n }\n console.log(chalk.yellow(\"Nickname must be between 2 and 40 characters.\"));\n }\n\n console.log(chalk.dim(\"Your email is never stored — only a SHA-256 hash is saved to match your leaderboard entries.\"));\n while (true) {\n const emailHint = defaults.email ? ` [${defaults.email}]` : \"\";\n const emailAnswer = await ask(`Email${emailHint} > `);\n if (emailAnswer === null) return null;\n\n const emailCandidate = emailAnswer.trim().length > 0\n ? emailAnswer\n : (defaults.email ?? \"\");\n\n if (!isValidEmail(emailCandidate)) {\n console.log(chalk.yellow(\"Please enter a valid email address.\"));\n continue;\n }\n\n return toSubmitterProfile({\n nickname: normalizeNickname(nicknameCandidate),\n email: normalizeEmail(emailCandidate),\n });\n }\n}\n\nexport async function resolveSubmitterForShare(\n deps: SubmitterPromptDeps = {}\n): Promise<ShareSubmitter | null> {\n const loadUserConfig = deps.loadUserConfig ?? loadConfig;\n const saveUserConfig = deps.saveUserConfig ?? saveConfig;\n const ask = deps.askLine ?? askLine;\n\n const config = await loadUserConfig();\n\n if (isValidNickname(config.submitterNickname ?? \"\") && isValidEmail(config.submitterEmail ?? \"\")) {\n const profile = toSubmitterProfile({\n nickname: config.submitterNickname!,\n email: config.submitterEmail!,\n });\n const identity = toSubmitterIdentity(profile);\n return { ...profile, emailHash: identity.emailHash };\n }\n\n if (!canPromptInteractively() && !deps.askLine) {\n return null;\n }\n\n console.log(\"\");\n console.log(chalk.bold.cyan(\"Link Your Benchmark History (optional)\"));\n console.log(chalk.dim(\"Add a nickname and email to find your future benchmark dashboard.\"));\n console.log(chalk.dim(\"Email stays private; only a hash is attached to the public benchmark record.\"));\n\n const consent = (await ask(\"Add nickname + email now? [Y/n] > \"))?.trim().toLowerCase();\n if (consent === \"n\" || consent === \"no\") {\n return null;\n }\n\n const profile = await promptSubmitterProfile(deps, {\n nickname: config.submitterNickname,\n email: config.submitterEmail,\n });\n\n if (!profile) {\n return null;\n }\n\n await saveUserConfig({\n ...config,\n submitterNickname: profile.nickname,\n submitterEmail: profile.email,\n });\n\n const identity = toSubmitterIdentity(profile);\n return { ...profile, emailHash: identity.emailHash };\n}\n\nexport async function promptAndSaveSubmitterProfile(\n deps: SubmitterPromptDeps = {}\n): Promise<SubmitterProfile | null> {\n const loadUserConfig = deps.loadUserConfig ?? loadConfig;\n const saveUserConfig = deps.saveUserConfig ?? saveConfig;\n\n if (!canPromptInteractively() && !deps.askLine) {\n return null;\n }\n\n const config = await loadUserConfig();\n const profile = await promptSubmitterProfile(deps, {\n nickname: config.submitterNickname,\n email: config.submitterEmail,\n });\n\n if (!profile) {\n return null;\n }\n\n await saveUserConfig({\n ...config,\n submitterNickname: profile.nickname,\n submitterEmail: profile.email,\n });\n\n return profile;\n}\n","import { createHash } from \"node:crypto\";\nimport { arch, cpus, platform, totalmem } from \"node:os\";\nimport { PostHog } from \"posthog-node\";\nimport { loadConfig, saveConfig } from \"./store.js\";\n\nconst POSTHOG_API_KEY = process.env.METRILLM_POSTHOG_KEY ?? \"\";\nconst POSTHOG_HOST = \"https://eu.i.posthog.com\";\n\nlet client: PostHog | null = null;\nlet consent: boolean | undefined;\nlet distinctId: string | null = null;\n\nfunction getDistinctId(): string {\n if (distinctId) return distinctId;\n const cpu = cpus()[0]?.model ?? \"unknown\";\n const raw = `${cpu}|${platform()}|${arch()}`;\n distinctId = createHash(\"sha256\").update(raw).digest(\"hex\").slice(0, 16);\n return distinctId;\n}\n\nasync function isEnabled(): Promise<boolean> {\n if (!POSTHOG_API_KEY) return false;\n if (consent !== undefined) return consent;\n const config = await loadConfig();\n consent = config.telemetry !== false;\n return consent;\n}\n\nfunction getClient(): PostHog {\n if (!client) {\n client = new PostHog(POSTHOG_API_KEY, {\n host: POSTHOG_HOST,\n flushAt: 5,\n flushInterval: 10_000,\n });\n }\n return client;\n}\n\nexport async function saveTelemetryConsent(value: boolean): Promise<void> {\n const config = await loadConfig();\n config.telemetry = value;\n await saveConfig(config);\n consent = value;\n}\n\nexport async function trackEvent(\n event: string,\n properties: Record<string, unknown> = {}\n): Promise<void> {\n if (!(await isEnabled())) return;\n try {\n getClient().capture({\n distinctId: getDistinctId(),\n event,\n properties: {\n source: \"metrillm-cli\",\n ...properties,\n },\n });\n } catch {\n // Non-fatal: telemetry should never break the CLI\n }\n}\n\nexport async function trackBenchStarted(props: {\n model: string;\n os: string;\n arch: string;\n cpuCores: number;\n ramGb: number;\n}): Promise<void> {\n await trackEvent(\"bench_started\", props);\n}\n\nexport async function trackBenchCompleted(props: {\n model: string;\n verdict: string;\n globalScore: number | null;\n tps: number;\n durationMs: number;\n}): Promise<void> {\n await trackEvent(\"bench_completed\", props);\n}\n\nexport async function trackBenchShared(props: {\n model: string;\n verdict: string;\n}): Promise<void> {\n await trackEvent(\"bench_shared\", props);\n}\n\nexport async function trackBenchExported(props: {\n format: string;\n}): Promise<void> {\n await trackEvent(\"bench_exported\", props);\n}\n\nexport async function flushTelemetry(): Promise<void> {\n if (!client) return;\n try {\n await client.shutdown();\n } catch {\n // Non-fatal\n }\n client = null;\n}\n\nexport async function showTelemetryNotice(): Promise<void> {\n const config = await loadConfig();\n if (config.telemetry !== undefined) return;\n console.log(\n \"Anonymous usage stats are enabled by default to help improve MetriLLM. Opt-out anytime: metrillm bench --no-telemetry\"\n );\n}\n","import chalk from \"chalk\";\nimport * as readline from \"node:readline\";\nimport { stdin as input, stdout as output } from \"node:process\";\n\n/**\n * Prompt the user to enable thinking mode (y/N).\n * Returns `true` if the user opted in, `false` otherwise.\n */\nexport async function promptThinkingMode(): Promise<boolean> {\n if (!input.isTTY || !output.isTTY) return false;\n\n const previousRawMode = input.isTTY ? input.isRaw : false;\n if (input.isTTY && previousRawMode) {\n input.setRawMode(false);\n }\n\n const rl = readline.createInterface({ input, output });\n\n return new Promise<boolean>((resolve) => {\n let settled = false;\n\n const finish = (value: boolean) => {\n if (settled) return;\n settled = true;\n rl.close();\n if (input.isTTY && previousRawMode) {\n input.setRawMode(previousRawMode);\n }\n resolve(value);\n };\n\n rl.on(\"close\", () => finish(false));\n\n rl.question(\n chalk.cyan(\"?\") + chalk.bold(\" Enable thinking mode?\") + chalk.dim(\" (y/N) \"),\n (answer) => {\n finish(answer.trim().toLowerCase() === \"y\");\n }\n );\n });\n}\n","import { getRuntimeDisplayName } from \"./runtime.js\";\n\nexport function getRuntimeUnavailableHelp(runtimeName: string, setupHints: string[]): string[] {\n const runtimeDisplayName = getRuntimeDisplayName(runtimeName);\n const lines = [\n `MetriLLM is currently set to use ${runtimeDisplayName}.`,\n `Either start ${runtimeDisplayName}, or switch to another backend in Settings.`,\n ];\n\n for (const hint of setupHints) {\n lines.push(` • ${hint}`);\n }\n\n lines.push(\" • To change backend: Main Menu -> Settings -> Runtime backend\");\n return lines;\n}\n"],"mappings":"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A,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY,CAAC;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,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ACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,QACF;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AAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;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YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY,CAAC;AAAA,MACf;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE,CAAC;AAAA,YACD;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA,CAAC;AAAA,UACH;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAS;AAAA,UACP;AAAA,YACE;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,UAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAc;AAAA,EAChB;AAAA,EACA;AAAA,IACE,IAAM;AAAA,IACN,aAAe;AAAA,IACf,cAAgB;AAAA,IAChB,WAAa;AAAA,IACb,OAAS;AAAA,MACP;AAAA,QACE,OAAS;AAAA,UACP;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,OAA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","names":["readFile","readdir","join","homedir","child","escapeRegex","execFile","DEFAULT_STREAM_STALL_TIMEOUT_MS","SHARED_STREAM_STALL_TIMEOUT_ENV","defaultKeepAlive","hasSamplingOverrides","output","parseNonNegativeInt","resolveStreamStallTimeoutMs","fallback","execFile","path","listModels","listRunningModels","setDefaultKeepAlive","generate","generateStream","unloadModel","abortOngoingRequests","generate","generateStream","listModels","listRunningModels","unloadModel","setDefaultKeepAlive","abortOngoingRequests","generate","generateStream","listModels","listRunningModels","unloadModel","abortOngoingRequests","createHash","chalk","os","execFile","output","main","listRunningModels","generateStream","abortOngoingRequests","generate","abortOngoingRequests","generate","abortOngoingRequests","vm","spawn","spawn","code","generate","abortOngoingRequests","questions","p","generate","abortOngoingRequests","questions","path","generate","abortOngoingRequests","questions","escapeRegex","generate","abortOngoingRequests","t","chalk","chalk","chalk","chalk","BAR_FILLED","BAR_EMPTY","levelColor","chalk","readFile","readFile","chalk","chalk","chalk","readline","input","output","input","output","chalk","profile","identity","consent","createHash","client","createHash","client","chalk","readline","input","output","listModels","chalk","createHash","unloadModel","RESULTS_DIR","join","homedir","listModels","readdir","readFile"]}
|