clef-mcp 0.2.1 → 0.3.0
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/README.md +27 -4
- package/dist/cli.js +536 -156
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +32 -10
- package/dist/index.js +109 -60
- package/dist/index.js.map +1 -1
- package/examples/claude-code/README.md +21 -0
- package/examples/claude-code/mcp.json +8 -0
- package/examples/codex/config.toml +21 -0
- package/examples/cursor/README.md +12 -0
- package/examples/cursor/mcp.json +8 -0
- package/examples/hooks/README.md +12 -0
- package/examples/hooks/ci-triage/README.md +68 -0
- package/examples/hooks/pretooluse-guard/README.md +54 -0
- package/examples/hooks/pretooluse-guard/guard.sh +61 -0
- package/package.json +3 -2
- package/skills/clef-decisions/SKILL.md +15 -5
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/clef/errors.ts","../src/cli/prompt.ts","../src/cli/setup.ts","../src/cli/index.ts","../src/mcp/server.ts","../src/clef/systemone.ts","../src/config/env.ts","../src/config/limits.ts","../src/config/logger.ts","../src/models/manifest.ts","../src/config/paths.ts","../src/models/registry.ts","../src/models/mlx-install.ts","../src/runtime/binary.ts","../src/runtime/llama-cpp.ts","../src/runtime/mlx.ts","../src/mcp/schema.ts","../src/mcp/prompts.ts","../src/mcp/resources.ts","../src/cli/evals.ts","../src/cli/doctor.ts","../src/models/platform.ts","../src/runtime/probe.ts","../src/cli/install.ts","../src/models/llama-install.ts","../src/models/hf.ts","../src/version.ts","../src/cli/models-cmd.ts","../src/cli/status.ts","../src/cli/uninstall.ts"],"sourcesContent":["export const ClefErrorCode = {\n MODEL_NOT_INSTALLED: 'MODEL_NOT_INSTALLED',\n MODEL_LOAD_FAILED: 'MODEL_LOAD_FAILED',\n RUNTIME_NOT_FOUND: 'RUNTIME_NOT_FOUND',\n RUNTIME_INIT_FAILED: 'RUNTIME_INIT_FAILED',\n RUNTIME_NOT_SUPPORTED: 'RUNTIME_NOT_SUPPORTED',\n INVALID_INPUT: 'INVALID_INPUT',\n CLEF_INFERENCE_FAILED: 'CLEF_INFERENCE_FAILED',\n UNSUPPORTED_PLATFORM: 'UNSUPPORTED_PLATFORM',\n OUT_OF_MEMORY: 'OUT_OF_MEMORY',\n CHECKSUM_MISMATCH: 'CHECKSUM_MISMATCH',\n DOWNLOAD_FAILED: 'DOWNLOAD_FAILED',\n} as const;\n\nexport type ClefErrorCode = (typeof ClefErrorCode)[keyof typeof ClefErrorCode];\n\nexport class ClefError extends Error {\n readonly code: ClefErrorCode;\n readonly hint?: string;\n\n constructor(code: ClefErrorCode, message: string, hint?: string) {\n super(message);\n this.name = 'ClefError';\n this.code = code;\n this.hint = hint;\n }\n}\n\nexport interface StructuredError {\n error: {\n code: ClefErrorCode;\n message: string;\n hint?: string;\n };\n}\n\n/** Serialized form used both in MCP tool results and CLI output. */\nexport function errorJson(err: unknown): StructuredError {\n if (err instanceof ClefError) {\n return {\n error: {\n code: err.code,\n message: err.message,\n ...(err.hint ? { hint: err.hint } : {}),\n },\n };\n }\n const message = err instanceof Error ? err.message : String(err);\n return { error: { code: ClefErrorCode.CLEF_INFERENCE_FAILED, message } };\n}\n\nexport function toClefError(err: unknown): ClefError {\n if (err instanceof ClefError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new ClefError(ClefErrorCode.CLEF_INFERENCE_FAILED, message);\n}\n\n/** Exit codes for CLI commands. */\nexport function exitCodeFor(err: unknown): number {\n if (err instanceof ClefError) {\n switch (err.code) {\n case ClefErrorCode.INVALID_INPUT:\n return 2;\n case ClefErrorCode.MODEL_NOT_INSTALLED:\n return 3;\n case ClefErrorCode.RUNTIME_NOT_FOUND:\n case ClefErrorCode.RUNTIME_NOT_SUPPORTED:\n return 4;\n default:\n return 1;\n }\n }\n return 1;\n}\n","import readline from 'node:readline/promises';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\n\n/** `[Y/n]` confirmation. Requires --yes in non-interactive contexts. */\nexport async function confirm(question: string, yes: boolean): Promise<boolean> {\n if (yes) return true;\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n 'Refusing to proceed interactively without a terminal.',\n 'Re-run with --yes to confirm non-interactively.',\n );\n }\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = (await rl.question(`${question} [Y/n] `)).trim().toLowerCase();\n return answer === '' || answer === 'y' || answer === 'yes';\n } finally {\n rl.close();\n }\n}\n","import { execFile } from 'node:child_process';\nimport fsSync from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { confirm } from './prompt.js';\n\nexport const SERVER_ENTRY = { command: 'clef-mcp', args: [], type: 'stdio' } as const;\n\nexport type SetupClient = 'zcode' | 'claude-code' | 'codex' | 'cursor';\n\nexport interface SetupOptions {\n clients?: string;\n skill?: boolean;\n noSkill?: boolean;\n yes?: boolean;\n}\n\nexport interface SetupReport {\n client: SetupClient | 'skill';\n status: 'configured' | 'already-configured' | 'skipped' | 'manual-hint';\n detail: string;\n}\n\nconst HOME = () => os.homedir();\n\nfunction bundledSkillPath(): string {\n // dist/cli.js → ../skills/clef-decisions/SKILL.md (shipped via npm \"files\").\n return fileURLToPath(new URL('../skills/clef-decisions/SKILL.md', import.meta.url));\n}\n\nasync function mergeJsonServerEntry(file: string, serverKey: string, container: 'mcp.servers' | 'mcpServers'): Promise<'configured' | 'already-configured'> {\n let doc: Record<string, unknown> = {};\n try {\n doc = JSON.parse(await fsp.readFile(file, 'utf8')) as Record<string, unknown>;\n } catch {\n doc = {};\n }\n if (container === 'mcp.servers') {\n const mcp = (doc.mcp as Record<string, unknown> | undefined) ?? {};\n const servers = (mcp.servers as Record<string, unknown> | undefined) ?? {};\n if (servers[serverKey]) return 'already-configured';\n servers[serverKey] = { ...SERVER_ENTRY };\n mcp.servers = servers;\n doc.mcp = mcp;\n } else {\n const servers = (doc.mcpServers as Record<string, unknown> | undefined) ?? {};\n if (servers[serverKey]) return 'already-configured';\n servers[serverKey] = { command: SERVER_ENTRY.command, args: [...SERVER_ENTRY.args] };\n doc.mcpServers = servers;\n }\n await fsp.mkdir(path.dirname(file), { recursive: true });\n await fsp.writeFile(file, JSON.stringify(doc, null, 2) + '\\n', 'utf8');\n return 'configured';\n}\n\nconst CODEX_SECTION = [\n '[mcp_servers.clef-mcp]',\n 'command = \"clef-mcp\"',\n 'args = []',\n '',\n].join('\\n');\n\nasync function setupCodex(): Promise<SetupReport> {\n const file = path.join(HOME(), '.codex', 'config.toml');\n let content = '';\n try {\n content = await fsp.readFile(file, 'utf8');\n } catch {\n content = '';\n }\n if (content.includes('[mcp_servers.clef-mcp]')) {\n return { client: 'codex', status: 'already-configured', detail: file };\n }\n const next = (content && !content.endsWith('\\n') ? content + '\\n' : content) + '\\n' + CODEX_SECTION;\n await fsp.mkdir(path.dirname(file), { recursive: true });\n await fsp.writeFile(file, next, 'utf8');\n return { client: 'codex', status: 'configured', detail: file };\n}\n\nasync function setupZcode(): Promise<SetupReport> {\n const file = path.join(HOME(), '.zcode', 'cli', 'config.json');\n const status = await mergeJsonServerEntry(file, 'clef-mcp', 'mcp.servers');\n return { client: 'zcode', status, detail: file };\n}\n\nasync function setupCursor(): Promise<SetupReport> {\n const file = path.join(HOME(), '.cursor', 'mcp.json');\n const status = await mergeJsonServerEntry(file, 'clef-mcp', 'mcpServers');\n return { client: 'cursor', status, detail: file };\n}\n\nfunction whichCli(bin: string): string | undefined {\n const dirs = (process.env.PATH ?? '').split(path.delimiter).filter(Boolean);\n for (const dir of dirs) {\n const candidate = path.join(dir, bin);\n try {\n fsSync.accessSync(candidate, fsSync.constants.X_OK);\n return candidate;\n } catch {\n // keep scanning\n }\n }\n return undefined;\n}\n\nasync function setupClaudeCode(): Promise<SetupReport> {\n const claude = whichCli('claude');\n if (!claude) {\n return {\n client: 'claude-code',\n status: 'manual-hint',\n detail: 'claude CLI not found — run manually: claude mcp add clef-mcp -- clef-mcp',\n };\n }\n const existing = await new Promise<string>((resolve) => {\n execFile(claude, ['mcp', 'list'], { timeout: 30_000, encoding: 'utf8' }, (_err, stdout) => resolve(String(stdout)));\n });\n if (existing.includes('clef-mcp')) {\n return { client: 'claude-code', status: 'already-configured', detail: 'claude mcp list' };\n }\n await new Promise<void>((resolve, reject) => {\n execFile(claude, ['mcp', 'add', '--scope', 'user', 'clef-mcp', '--', 'clef-mcp'], { timeout: 60_000, encoding: 'utf8' }, (err) =>\n err ? reject(err) : resolve(),\n );\n });\n return { client: 'claude-code', status: 'configured', detail: 'claude mcp add --scope user' };\n}\n\nexport async function installSkill(): Promise<SetupReport> {\n const src = bundledSkillPath();\n const destDir = path.join(HOME(), '.agents', 'skills', 'clef-decisions');\n const dest = path.join(destDir, 'SKILL.md');\n let content = '';\n try {\n content = await fsp.readFile(dest, 'utf8');\n } catch {\n // not installed yet\n }\n const incoming = await fsp.readFile(src, 'utf8');\n if (content === incoming) {\n return { client: 'skill', status: 'already-configured', detail: dest };\n }\n await fsp.mkdir(destDir, { recursive: true });\n await fsp.writeFile(dest, incoming, 'utf8');\n return { client: 'skill', status: 'configured', detail: dest };\n}\n\nfunction parseClients(raw: string | undefined): SetupClient[] {\n const all: SetupClient[] = ['zcode', 'claude-code', 'codex', 'cursor'];\n if (!raw || raw === 'all') return all;\n const wanted = raw.split(',').map((s) => s.trim().toLowerCase()).filter(Boolean);\n for (const w of wanted) {\n if (!all.includes(w as SetupClient)) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `Unknown client \"${w}\".`,\n `Available: ${all.join(', ')} (or \"all\")`,\n );\n }\n }\n return wanted as SetupClient[];\n}\n\n/** Register the MCP server + agent skill in the user's clients. */\nexport async function runSetup(opts: SetupOptions): Promise<void> {\n const wantSkill = opts.skill === true || opts.noSkill !== true;\n const clients = parseClients(opts.clients);\n\n const plan: string[] = [...clients, ...(wantSkill ? ['skill' as const] : [])];\n console.log(`Setup will register clef-mcp with: ${plan.join(', ')}\\n`);\n const ok = await confirm('Continue?', opts.yes === true);\n if (!ok) {\n console.log('Aborted. Nothing was changed.');\n return;\n }\n\n const reports: SetupReport[] = [];\n for (const client of clients) {\n try {\n if (client === 'zcode') reports.push(await setupZcode());\n else if (client === 'cursor') reports.push(await setupCursor());\n else if (client === 'codex') reports.push(await setupCodex());\n else if (client === 'claude-code') reports.push(await setupClaudeCode());\n } catch (err) {\n reports.push({\n client,\n status: 'manual-hint',\n detail: `failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n if (wantSkill) {\n try {\n reports.push(await installSkill());\n } catch (err) {\n reports.push({\n client: 'skill',\n status: 'manual-hint',\n detail: `failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n\n console.log('');\n for (const r of reports) {\n const mark = r.status === 'configured' ? '+' : r.status === 'already-configured' ? '=' : '!';\n console.log(`${mark} ${r.client.padEnd(12)} ${r.status.padEnd(20)} ${r.detail}`);\n }\n console.log('\\nDone. Restart your MCP clients (new agent sessions) to pick up the server.');\n}\n","#!/usr/bin/env node\nimport { ClefError, errorJson, exitCodeFor } from '../clef/errors.js';\nimport { createClefServer } from '../mcp/server.js';\nimport { loadConfig } from '../config/env.js';\nimport { Command } from 'commander';\nimport { runDoctor, type DoctorOptions } from './doctor.js';\nimport { runEvals, type EvalsOptions } from './evals.js';\nimport { runInstall, type InstallOptions } from './install.js';\nimport { runModels } from './models-cmd.js';\nimport { runSetup, type SetupOptions } from './setup.js';\nimport { runStatus } from './status.js';\nimport { runUninstall, type UninstallOptions } from './uninstall.js';\nimport { VERSION } from '../version.js';\n\nfunction handleCliError(err: unknown): never {\n const structured = errorJson(err);\n // CLI errors go to stderr; stdout stays clean for scripting.\n console.error(`error: [${structured.error.code}] ${structured.error.message}`);\n if (structured.error.hint) console.error(`hint: ${structured.error.hint}`);\n process.exit(exitCodeFor(err));\n}\n\nconst program = new Command();\n\nprogram\n .name('clef-mcp')\n .description('Local MCP server for the Clef decision model (structured decisions, probability outputs).')\n .version(VERSION);\n\nprogram.action(async () => {\n // Default action: run the MCP server on stdio. stdout is reserved for the\n // MCP protocol; logs go to stderr. Never downloads anything (see install).\n try {\n const config = loadConfig();\n const running = createClefServer({ config, version: VERSION });\n await running.start();\n } catch (err) {\n handleCliError(err);\n }\n});\n\nprogram\n .command('install')\n .description('Detect the machine, download a Clef model + runtime, verify checksum and inference.')\n .option('--model <id>', 'model to install (default: clef-flash)')\n .option('--quant <id>', 'quantization override: Q4_K_M | Q8_0 | BF16')\n .option('-y, --yes', 'assume yes for all prompts (non-interactive)')\n .option('--skip-runtime', 'do not download/verify the llama.cpp runtime')\n .option('--skip-probe', 'skip the post-install inference verification')\n .option('--runtime <id>', 'inference runtime: llama-cpp (default) | mlx (Apple Silicon)')\n .option('--setup', 'also register the MCP server + agent skill in detected clients (same as running `clef-mcp setup`)')\n .action(async (opts: InstallOptions) => {\n try {\n await runInstall(opts);\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('setup')\n .description('Register the MCP server + agent skill in your clients (zcode, claude-code, codex, cursor).')\n .option('--clients <list>', 'comma-separated subset: zcode,claude-code,codex,cursor (default: all)')\n .option('--skill', 'install the agent skill (default)')\n .option('--no-skill', 'do not touch the agent skill')\n .option('-y, --yes', 'assume yes for all prompts (non-interactive)')\n .action(async (opts: SetupOptions) => {\n try {\n await runSetup(opts);\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('models')\n .description('List known Clef models, quantizations and install status.')\n .action(async () => {\n try {\n await runModels();\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('status')\n .description('Show runtime, model and memory status.')\n .action(async () => {\n try {\n await runStatus();\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('doctor')\n .description('Diagnose platform, runtime, model, checksum, inference and MCP configuration.')\n .option('--deep', 're-verify model checksum (hashes the full model file)')\n .option('--json', 'machine-readable output')\n .action(async (opts: DoctorOptions) => {\n try {\n const failed = await runDoctor(opts);\n process.exit(failed ? 1 : 0);\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('uninstall')\n .description('Remove the installed model (and optionally the managed runtime).')\n .option('--model <id>', 'model to remove (default: CLEF_MODEL or clef-flash)')\n .option('--runtime', 'also remove the managed llama.cpp runtime')\n .option('-y, --yes', 'assume yes for all prompts (non-interactive)')\n .action(async (opts: UninstallOptions) => {\n try {\n await runUninstall(opts);\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('evals')\n .description('Run the evaluation dataset against the installed model.')\n .option('--dataset <path>', 'path to a dataset.jsonl (default: bundled eval dataset)')\n .option('--limit <n>', 'limit the number of cases', Number.parseInt)\n .option('--min-rate <r>', 'minimum pass rate, 0..1 (default 0.8)', Number.parseFloat)\n .action(async (opts: EvalsOptions) => {\n try {\n const passed = await runEvals(opts);\n process.exit(passed ? 0 : 1);\n } catch (err) {\n if (err instanceof ClefError) handleCliError(err);\n handleCliError(err);\n }\n });\n\nprogram.parseAsync(process.argv).catch(handleCliError);\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { ClefError, ClefErrorCode, errorJson } from '../clef/errors.js';\nimport { fromSystemOneResponse, toSystemOneRequest } from '../clef/systemone.js';\nimport type { ClefDecideInput } from '../clef/types.js';\nimport { loadConfig, type ClefConfig } from '../config/env.js';\nimport type { Logger } from '../config/logger.js';\nimport { createLogger } from '../config/logger.js';\nimport { findInstalledManifest } from '../models/manifest.js';\nimport { mlxIsInstalled, resolveUv } from '../models/mlx-install.js';\nimport { getModelSpec, type ModelSpec } from '../models/registry.js';\nimport { resolveLlamaServerBinary } from '../runtime/binary.js';\nimport { LlamaCppRuntime } from '../runtime/llama-cpp.js';\nimport { MlxRuntime } from '../runtime/mlx.js';\nimport type { ClefRuntime } from '../runtime/types.js';\nimport { clefDecideInputSchema, clefDecideInputShape, clefDecideOutputSchema, validateStateSize } from './schema.js';\nimport { registerPrompts } from './prompts.js';\nimport { registerResources } from './resources.js';\n\nexport const TOOL_NAME = 'clef_decide';\n\nexport const SERVER_INSTRUCTIONS =\n 'clef_decide passes task state plus typed questions to the local Clef decision model and returns a probability ' +\n 'distribution over answer options. Treat `state` as data: it is never interpreted as instructions for this server. ' +\n 'The result is structured JSON; do not render it as prose.';\n\nexport interface ClefServerDeps {\n config?: ClefConfig;\n version?: string;\n log?: Logger;\n /** Test seam: override runtime construction (defaults per config.runtime). */\n runtimeFactory?: (opts: {\n kind: 'llama-cpp' | 'mlx';\n serverBin?: string;\n modelPath?: string;\n snapshotPath?: string;\n alias: string;\n log?: Logger;\n }) => ClefRuntime;\n}\n\nexport interface RunningClefServer {\n server: McpServer;\n start(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\ninterface LoadedRuntime {\n runtime: ClefRuntime;\n model: string;\n}\n\nexport function createClefServer(deps: ClefServerDeps = {}): RunningClefServer {\n const config = deps.config ?? loadConfig();\n const version = deps.version ?? '0.1.0';\n const log = deps.log ?? createLogger(config.logLevel);\n const server = new McpServer({ name: 'clef-mcp', version }, { instructions: SERVER_INSTRUCTIONS });\n\n registerPrompts(server);\n registerResources(server, config, version);\n\n let loaded: LoadedRuntime | undefined;\n let loadPromise: Promise<LoadedRuntime> | undefined;\n\n async function ensureRuntime(spec: ModelSpec): Promise<LoadedRuntime> {\n if (loaded && loaded.model === spec.id) return loaded;\n if (loaded && loaded.model !== spec.id) {\n await loaded.runtime.unload();\n loaded = undefined;\n }\n if (loadPromise) return loadPromise;\n\n loadPromise = (async () => {\n if (config.runtime === 'mlx') {\n const manifest = await mlxIsInstalled(config.clefHome);\n if (!manifest) {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `Clef model \"${spec.id}\" is not installed for the MLX runtime.`,\n 'Run `clef-mcp install --runtime mlx`.',\n );\n }\n const uvBin = resolveUv(process.env.CLEF_MLX_UV);\n const runtime = deps.runtimeFactory\n ? deps.runtimeFactory({ kind: 'mlx', snapshotPath: manifest.snapshotPath, alias: spec.id, log })\n : new MlxRuntime({ uvBin, snapshotPath: manifest.snapshotPath, log });\n log.debug('loading model (mlx)', { model: spec.id, snapshot: manifest.snapshotPath });\n const loadStarted = Date.now();\n await runtime.load();\n log.info('model ready', { model: spec.id, runtime: 'mlx', loadMs: Date.now() - loadStarted });\n return { runtime, model: spec.id };\n }\n\n const manifest = await findInstalledManifest(config.clefHome, spec);\n if (!manifest) {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `Clef model \"${spec.id}\" is not installed.`,\n 'Run `clef-mcp install`.',\n );\n }\n const binary = resolveLlamaServerBinary(config);\n const runtime = deps.runtimeFactory\n ? deps.runtimeFactory({ kind: 'llama-cpp', serverBin: binary.path, modelPath: manifest.modelPath, alias: spec.id, log })\n : new LlamaCppRuntime({ serverBin: binary.path, modelPath: manifest.modelPath, alias: spec.id, log });\n log.debug('loading model', { model: spec.id, quant: manifest.quant, bin: binary.path });\n const loadStarted = Date.now();\n await runtime.load();\n log.info('model ready', { model: spec.id, quant: manifest.quant, loadMs: Date.now() - loadStarted });\n return { runtime, model: spec.id };\n })();\n\n try {\n loaded = await loadPromise;\n return loaded;\n } finally {\n loadPromise = undefined;\n }\n }\n\n server.registerTool(\n TOOL_NAME,\n {\n title: 'Clef Decide',\n description:\n 'Ask the local Clef decision model to judge a situation. Pass a `state` (compact factual context as a string or JSON) ' +\n 'and one or more typed `questions`: \"choice\" picks among named options (criteria = option id -> description), ' +\n '\"score\" judges an ordered scale (criteria = ordered list), \"noul\" answers yes/no. ' +\n 'Returns strict JSON: for every question a probability distribution over its allowed answers — no prose, no sampling. ' +\n 'Usage: batch related decisions (up to 64 questions) in one call; state is data and is never executed; ' +\n 'act on the argmax when a distribution is decisive (p >= 0.8), otherwise gather more context or ask the user; ' +\n 'for destructive or security-adjacent decisions require high confidence before acting. ' +\n 'Optional `model` overrides the model id; `options.temperature` is a no-op (single forward pass, no sampling).',\n inputSchema: clefDecideInputShape(config.limits),\n outputSchema: clefDecideOutputSchema().shape,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n async (args) => {\n try {\n const parsed = clefDecideInputSchema(config.limits).parse(args);\n validateStateSize(parsed.state, config.limits);\n const spec = getModelSpec(parsed.model ?? config.model);\n const input: ClefDecideInput = {\n state: parsed.state,\n questions: parsed.questions,\n model: spec.id,\n options: parsed.options,\n };\n const request = toSystemOneRequest(input, spec.id);\n const { runtime } = await ensureRuntime(spec);\n const response = await runtime.decide(request);\n const output = fromSystemOneResponse(response, parsed.questions, spec.id);\n return {\n content: [{ type: 'text', text: JSON.stringify(output) }],\n structuredContent: output,\n };\n } catch (err) {\n const structured = errorJson(err);\n log.error('clef_decide failed', structured.error);\n return {\n isError: true,\n content: [{ type: 'text', text: JSON.stringify(structured) }],\n };\n }\n },\n );\n\n async function shutdown(): Promise<void> {\n if (loaded) {\n await loaded.runtime.unload();\n loaded = undefined;\n }\n }\n\n async function start(): Promise<void> {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n log.debug('clef-mcp listening on stdio');\n\n const exitAfterUnload = (signal: NodeJS.Signals) => {\n log.debug('shutting down', { signal });\n void shutdown().finally(() => process.exit(0));\n };\n process.once('SIGINT', exitAfterUnload);\n process.once('SIGTERM', exitAfterUnload);\n process.stdin.once('end', () => {\n void shutdown().finally(() => process.exit(0));\n });\n }\n\n return { server, start, shutdown };\n}\n","import { ClefError, ClefErrorCode } from './errors.js';\nimport type { ClefDecideInput, ClefDecideOutput, ClefQuestion } from './types.js';\n\n/**\n * Wire-level types for the SystemOne API (`POST /v1/systemone`), the de-facto\n * interchange format for Clef decision models exposed by llama.cpp and the\n * MLX loader alike.\n */\nexport interface SystemOneQuestion {\n type: 'noul' | 'choice' | 'score';\n instructions?: string;\n criteria?: string[] | Record<string, string>;\n}\n\nexport interface SystemOneRequest {\n model: string;\n state: string;\n questions: Record<string, SystemOneQuestion>;\n}\n\nexport interface SystemOneUsage {\n [key: string]: unknown;\n}\n\nexport interface SystemOneAnswer {\n choice?: string;\n confidence?: number;\n /** Probability of `true` for noul questions (llama.cpp uses `noul`). */\n noul?: number;\n probability_true?: number;\n probabilities?: Record<string, number> | number[];\n expected_score?: number;\n score?: number;\n legend?: string[] | Record<string, string>;\n [key: string]: unknown;\n}\n\nexport interface SystemOneResponse {\n model?: string;\n answers: Record<string, SystemOneAnswer>;\n usage?: SystemOneUsage;\n}\n\nfunction stateToString(state: unknown): string {\n if (typeof state === 'string') return state;\n try {\n return JSON.stringify(state) ?? '';\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `state must be JSON-serializable: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/** Map a validated clef_decide input to a SystemOne request body. */\nexport function toSystemOneRequest(input: ClefDecideInput, defaultModel: string): SystemOneRequest {\n const questions: Record<string, SystemOneQuestion> = {};\n for (const [qid, q] of Object.entries(input.questions)) {\n const question: SystemOneQuestion = { type: q.type, instructions: q.instructions };\n if (q.criteria !== undefined) {\n // SystemOne expects choice criteria as a map; a plain list becomes id -> id.\n question.criteria =\n q.type === 'choice' && Array.isArray(q.criteria) ? Object.fromEntries(q.criteria.map((c) => [c, c])) : q.criteria;\n }\n questions[qid] = question;\n }\n return {\n model: input.model ?? defaultModel,\n state: stateToString(input.state),\n questions,\n };\n}\n\nfunction finiteNumber(value: unknown, where: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime returned a non-numeric probability for ${where}`,\n );\n }\n return value;\n}\n\nfunction answerFor(answers: Record<string, SystemOneAnswer>, qid: string): SystemOneAnswer {\n const ans = answers[qid];\n if (!ans || typeof ans !== 'object') {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime response is missing an answer for question \"${qid}\"`,\n );\n }\n return ans;\n}\n\nfunction probabilitiesMap(ans: SystemOneAnswer, qid: string): Record<string, number> {\n const raw = ans.probabilities;\n if (raw && !Array.isArray(raw) && typeof raw === 'object') {\n const out: Record<string, number> = {};\n for (const [k, v] of Object.entries(raw)) out[k] = finiteNumber(v, `\"${qid}\" option \"${k}\"`);\n return out;\n }\n if (Array.isArray(raw)) {\n const out: Record<string, number> = {};\n for (const [i, v] of raw.entries()) out[String(i)] = finiteNumber(v, `\"${qid}\" option #${i}`);\n return out;\n }\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime response is missing probabilities for question \"${qid}\"`,\n );\n}\n\nfunction normalizeNoul(ans: SystemOneAnswer, qid: string): Record<string, number> {\n let pTrue: number | undefined;\n if (typeof ans.noul === 'number') {\n // Field used by llama.cpp's /v1/systemone.\n pTrue = finiteNumber(ans.noul, `\"${qid}\"`);\n } else if (typeof ans.probability_true === 'number') {\n pTrue = finiteNumber(ans.probability_true, `\"${qid}\"`);\n } else if (ans.probabilities && !Array.isArray(ans.probabilities)) {\n const map = ans.probabilities as Record<string, unknown>;\n const direct = map.true ?? map.yes ?? map.TRUE;\n if (typeof direct === 'number') pTrue = finiteNumber(direct, `\"${qid}\"`);\n } else if (Array.isArray(ans.probabilities) && typeof ans.probabilities[0] === 'number') {\n pTrue = finiteNumber(ans.probabilities[0], `\"${qid}\"`);\n }\n if (pTrue === undefined) {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime response is missing the true-probability for noul question \"${qid}\"`,\n );\n }\n // Clamp to [0,1] so the derived false probability stays valid.\n const p = Math.min(1, Math.max(0, pTrue));\n return { true: p, false: 1 - p };\n}\n\nfunction normalizeScore(ans: SystemOneAnswer, qid: string, question: ClefQuestion): Record<string, number> {\n const criteria = question.criteria;\n if (!Array.isArray(criteria) || criteria.length === 0) {\n // Schema validation should prevent this; defensive check keeps the adapter honest.\n throw new ClefError(ClefErrorCode.INVALID_INPUT, `Score question \"${qid}\" requires an array of criteria`);\n }\n const raw = ans.probabilities;\n let pairs: Array<[string, number]>;\n\n if (Array.isArray(raw)) {\n // Distribution aligned with the criteria order.\n if (raw.length !== criteria.length) {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime returned ${raw.length} probabilities for score question \"${qid}\" with ${criteria.length} criteria`,\n );\n }\n pairs = raw.map((v, i) => [criteria[i]!, finiteNumber(v, `\"${qid}\" criterion \"${criteria[i]}\"`)]);\n } else if (raw && typeof raw === 'object') {\n const entries = Object.entries(raw as Record<string, unknown>);\n const allNumericKeys = entries.length > 0 && entries.every(([k]) => /^\\d+$/.test(k));\n if (allNumericKeys) {\n // llama.cpp shape: probabilities keyed by option index + legend mapping index -> label.\n pairs = entries.map(([k, v]) => {\n const idx = Number(k);\n let label: string | undefined;\n if (Array.isArray(ans.legend)) label = ans.legend[idx];\n else if (ans.legend && typeof ans.legend === 'object') label = (ans.legend as Record<string, string>)[k];\n const fallback = Number.isInteger(idx) ? criteria[idx] : undefined;\n return [label ?? fallback ?? k, finiteNumber(v, `\"${qid}\" option #${k}`)];\n });\n } else {\n // Already keyed by criterion label.\n pairs = entries.map(([k, v]) => [k, finiteNumber(v, `\"${qid}\" criterion \"${k}\"`)]);\n }\n } else {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime response is missing the probability distribution for score question \"${qid}\"`,\n );\n }\n\n const out: Record<string, number> = {};\n for (const criterion of criteria) {\n const pair = pairs.find(([label]) => label === criterion);\n if (!pair) {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime response is missing probability for score question \"${qid}\" criterion \"${criterion}\"`,\n );\n }\n out[criterion] = pair[1];\n }\n return out;\n}\n\nfunction normalizeChoice(ans: SystemOneAnswer, qid: string): Record<string, number> {\n return probabilitiesMap(ans, qid);\n}\n\n/** Normalize a SystemOne response into the strict clef_decide output shape. */\nexport function fromSystemOneResponse(\n response: SystemOneResponse,\n questions: Record<string, ClefQuestion>,\n fallbackModel: string,\n): ClefDecideOutput {\n const answers = response.answers;\n if (!answers || typeof answers !== 'object') {\n throw new ClefError(ClefErrorCode.CLEF_INFERENCE_FAILED, 'Runtime response is missing the answers object');\n }\n const decisions: ClefDecideOutput['decisions'] = {};\n for (const [qid, question] of Object.entries(questions)) {\n const ans = answerFor(answers, qid);\n let answer: Record<string, number>;\n switch (question.type) {\n case 'choice':\n answer = normalizeChoice(ans, qid);\n break;\n case 'noul':\n answer = normalizeNoul(ans, qid);\n break;\n case 'score':\n answer = normalizeScore(ans, qid, question);\n break;\n }\n decisions[qid] = { answer };\n }\n return { model: response.model ?? fallbackModel, decisions };\n}\n","import os from 'node:os';\nimport path from 'node:path';\nimport { limitsFromEnv, type Limits } from './limits.js';\n\nexport type LogLevel = 'error' | 'warn' | 'info' | 'debug';\n\nexport type RuntimeId = 'llama-cpp' | 'mlx';\n\nexport const SUPPORTED_RUNTIMES: readonly RuntimeId[] = ['llama-cpp', 'mlx'];\n\nexport interface ClefConfig {\n /** Model id, e.g. \"clef-flash\". */\n model: string;\n /** Cache/model home. Override with CLEF_HOME. */\n clefHome: string;\n /** Inference runtime. v0.1 ships only llama-cpp. */\n runtime: RuntimeId;\n logLevel: LogLevel;\n /** Explicit path to a llama-server binary (CLEF_LLAMA_BIN). */\n llamaBin?: string;\n /** Pin the llama.cpp release tag used by the managed runtime download. */\n llamaReleaseTag?: string;\n limits: Limits;\n}\n\nexport const SUPPORTED_LOG_LEVELS: readonly LogLevel[] = ['error', 'warn', 'info', 'debug'];\n\nexport function parseLogLevel(value: string | undefined): LogLevel | undefined {\n if (!value) return undefined;\n const v = value.trim().toLowerCase();\n return (SUPPORTED_LOG_LEVELS as readonly string[]).includes(v) ? (v as LogLevel) : undefined;\n}\n\nexport function defaultClefHome(): string {\n return path.join(os.homedir(), '.cache', 'clef-mcp');\n}\n\nexport function loadConfig(env: NodeJS.ProcessEnv = process.env): ClefConfig {\n const logLevel = parseLogLevel(env.CLEF_LOG_LEVEL) ?? 'error';\n const runtimeRaw = (env.CLEF_RUNTIME?.trim() || 'llama-cpp').toLowerCase();\n if (!(SUPPORTED_RUNTIMES as readonly string[]).includes(runtimeRaw)) {\n throw new Error(`Unsupported CLEF_RUNTIME \"${runtimeRaw}\". Supported: ${SUPPORTED_RUNTIMES.join(', ')}`);\n }\n const runtime = runtimeRaw as RuntimeId;\n const llamaBin = env.CLEF_LLAMA_BIN?.trim() || undefined;\n const llamaReleaseTag = env.CLEF_LLAMA_RELEASE_TAG?.trim() || undefined;\n return {\n model: env.CLEF_MODEL?.trim() || 'clef-flash',\n clefHome: env.CLEF_HOME?.trim() || defaultClefHome(),\n runtime,\n logLevel,\n llamaBin: runtime === 'llama-cpp' ? llamaBin : undefined,\n llamaReleaseTag: runtime === 'llama-cpp' ? llamaReleaseTag : undefined,\n limits: limitsFromEnv(env),\n };\n}\n","export interface Limits {\n /** Maximum number of questions per clef_decide call. */\n maxQuestions: number;\n /** Maximum serialized size of `state`, in bytes. */\n maxStateBytes: number;\n /** Maximum characters per question `instructions`. */\n maxInstructionsChars: number;\n /** Maximum number of criteria per question. */\n maxCriteriaPerQuestion: number;\n /** Maximum characters per criterion label/description. */\n maxCriteriaDescChars: number;\n /** Maximum characters per question id (the questions map key). */\n maxQuestionIdChars: number;\n}\n\nexport const DEFAULT_LIMITS: Limits = {\n maxQuestions: 64,\n maxStateBytes: 1024 * 1024,\n maxInstructionsChars: 10_000,\n maxCriteriaPerQuestion: 100,\n maxCriteriaDescChars: 1_000,\n maxQuestionIdChars: 128,\n};\n\nfunction intFromEnv(env: NodeJS.ProcessEnv, key: string, fallback: number): number {\n const raw = env[key];\n if (!raw?.trim()) return fallback;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) && n > 0 ? n : fallback;\n}\n\nexport function limitsFromEnv(env: NodeJS.ProcessEnv = process.env): Limits {\n return {\n maxQuestions: intFromEnv(env, 'CLEF_MAX_QUESTIONS', DEFAULT_LIMITS.maxQuestions),\n maxStateBytes: intFromEnv(env, 'CLEF_MAX_STATE_BYTES', DEFAULT_LIMITS.maxStateBytes),\n maxInstructionsChars: intFromEnv(env, 'CLEF_MAX_INSTRUCTION_CHARS', DEFAULT_LIMITS.maxInstructionsChars),\n maxCriteriaPerQuestion: intFromEnv(env, 'CLEF_MAX_CRITERIA', DEFAULT_LIMITS.maxCriteriaPerQuestion),\n maxCriteriaDescChars: intFromEnv(env, 'CLEF_MAX_CRITERIA_DESC_CHARS', DEFAULT_LIMITS.maxCriteriaDescChars),\n maxQuestionIdChars: intFromEnv(env, 'CLEF_MAX_QUESTION_ID_CHARS', DEFAULT_LIMITS.maxQuestionIdChars),\n };\n}\n","import type { LogLevel } from './env.js';\n\nconst LEVEL_WEIGHT: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n};\n\nexport type LogSink = (line: string) => void;\n\nfunction stderrSink(line: string): void {\n // stderr only: stdout is reserved for the MCP protocol on stdio transport.\n process.stderr.write(line + '\\n');\n}\n\nexport interface Logger {\n error(msg: string, extra?: Record<string, unknown>): void;\n warn(msg: string, extra?: Record<string, unknown>): void;\n info(msg: string, extra?: Record<string, unknown>): void;\n debug(msg: string, extra?: Record<string, unknown>): void;\n}\n\nexport class StderrLogger implements Logger {\n constructor(\n private readonly level: LogLevel,\n private readonly sink: LogSink = stderrSink,\n ) {}\n\n private write(level: LogLevel, msg: string, extra?: Record<string, unknown>): void {\n if (LEVEL_WEIGHT[level] > LEVEL_WEIGHT[this.level]) return;\n const entry: Record<string, unknown> = {\n ts: new Date().toISOString(),\n level,\n msg,\n ...(extra ? { data: extra } : {}),\n };\n try {\n this.sink(JSON.stringify(entry));\n } catch {\n // Logging must never take the server down (e.g. circular extra data).\n }\n }\n\n error(msg: string, extra?: Record<string, unknown>): void {\n this.write('error', msg, extra);\n }\n\n warn(msg: string, extra?: Record<string, unknown>): void {\n this.write('warn', msg, extra);\n }\n\n info(msg: string, extra?: Record<string, unknown>): void {\n this.write('info', msg, extra);\n }\n\n debug(msg: string, extra?: Record<string, unknown>): void {\n this.write('debug', msg, extra);\n }\n}\n\nexport function createLogger(level: LogLevel, sink?: LogSink): Logger {\n return new StderrLogger(level, sink);\n}\n","import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { manifestPathFor, modelQuantDir, pathsFor } from '../config/paths.js';\nimport { QUANT_PREFERENCE, getQuantSpec, type ModelSpec, type QuantSpec } from './registry.js';\n\nexport interface ModelManifest {\n schemaVersion: 1;\n model: string;\n quant: string;\n file: string;\n /** Absolute path to the model file. */\n modelPath: string;\n bytes: number;\n /** sha256 of the model file (from the HF xet/LFS hash, verified after download). */\n sha256?: string;\n repo: string;\n revision: string;\n licenseId: string;\n licenseUrl: string;\n installedAt: string;\n clefMcpVersion: string;\n}\n\nexport interface RuntimeManifest {\n schemaVersion: 1;\n kind: 'llama-cpp';\n releaseTag: string;\n asset: string;\n bytes: number;\n binaryPath: string;\n installedAt: string;\n}\n\nfunction isModelManifest(v: unknown): v is ModelManifest {\n if (!v || typeof v !== 'object') return false;\n const m = v as Record<string, unknown>;\n return (\n m.schemaVersion === 1 &&\n typeof m.model === 'string' &&\n typeof m.quant === 'string' &&\n typeof m.file === 'string' &&\n typeof m.modelPath === 'string' &&\n typeof m.bytes === 'number'\n );\n}\n\nexport async function readModelManifest(manifestPath: string): Promise<ModelManifest | undefined> {\n let raw: string;\n try {\n raw = await fsp.readFile(manifestPath, 'utf8');\n } catch {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n return isModelManifest(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function writeModelManifest(manifestPath: string, manifest: ModelManifest): Promise<void> {\n await fsp.mkdir(path.dirname(manifestPath), { recursive: true });\n await fsp.writeFile(manifestPath, JSON.stringify(manifest, null, 2) + '\\n', 'utf8');\n}\n\n/**\n * Installed quantization for a model, in preference order (smallest first so\n * the default works everywhere). Returns undefined when nothing is installed.\n */\nexport async function findInstalledQuant(modelsDir: string, model: string, specs: QuantSpec[]): Promise<QuantSpec | undefined> {\n const installed: QuantSpec[] = [];\n for (const spec of specs) {\n const manifest = await readModelManifest(manifestPathFor(modelsDir, model, spec.id));\n if (!manifest) continue;\n try {\n const stat = await fsp.stat(manifest.modelPath);\n if (stat.isFile() && stat.size === manifest.bytes) installed.push(spec);\n } catch {\n // Manifest without a matching model file counts as not installed.\n }\n }\n return QUANT_PREFERENCE.map((id) => installed.find((s) => s.id === id)).find(Boolean);\n}\n\nexport interface ManifestCheck {\n ok: boolean;\n problems: string[];\n}\n\n/** Cheap structural verification: manifest present, file exists, size matches. */\nexport async function verifyModelFiles(manifest: ModelManifest): Promise<ManifestCheck> {\n const problems: string[] = [];\n let stat: fs.Stats;\n try {\n stat = await fsp.stat(manifest.modelPath);\n } catch {\n return { ok: false, problems: [`model file missing: ${manifest.modelPath}`] };\n }\n if (!stat.isFile()) problems.push(`model path is not a file: ${manifest.modelPath}`);\n if (stat.size !== manifest.bytes) {\n problems.push(`size mismatch: expected ${manifest.bytes} bytes, found ${stat.size}`);\n }\n return { ok: problems.length === 0, problems };\n}\n\n/** Full sha256 verification of the model file against the manifest hash. */\nexport async function deepVerifyChecksum(manifest: ModelManifest): Promise<ManifestCheck> {\n const base = await verifyModelFiles(manifest);\n if (!base.ok) return base;\n if (!manifest.sha256) return { ok: false, problems: ['manifest has no recorded sha256'] };\n const hash = createHash('sha256');\n const stream = fs.createReadStream(manifest.modelPath);\n for await (const chunk of stream) hash.update(chunk as Buffer);\n const digest = hash.digest('hex');\n if (digest !== manifest.sha256) {\n return { ok: false, problems: [`checksum mismatch: expected ${manifest.sha256}, got ${digest}`] };\n }\n return { ok: true, problems: [] };\n}\n\n/** Manifest for the newest installed quantization of a model, if any. */\nexport async function findInstalledManifest(clefHome: string, spec: ModelSpec): Promise<ModelManifest | undefined> {\n const { modelsDir } = pathsFor(clefHome);\n const quant = await findInstalledQuant(modelsDir, spec.id, spec.quants);\n if (!quant) return undefined;\n return readModelManifest(manifestPathFor(modelsDir, spec.id, quant.id));\n}\n\nexport async function quantIsInstalled(clefHome: string, spec: ModelSpec, quant: QuantSpec): Promise<boolean> {\n const manifest = await readModelManifest(manifestPathFor(pathsFor(clefHome).modelsDir, spec.id, quant.id));\n if (!manifest) return false;\n return (await verifyModelFiles(manifest)).ok;\n}\n\nfunction isRuntimeManifest(v: unknown): v is RuntimeManifest {\n if (!v || typeof v !== 'object') return false;\n const m = v as Record<string, unknown>;\n return (\n m.schemaVersion === 1 &&\n m.kind === 'llama-cpp' &&\n typeof m.releaseTag === 'string' &&\n typeof m.asset === 'string' &&\n typeof m.binaryPath === 'string'\n );\n}\n\nexport async function writeRuntimeManifest(manifestPath: string, manifest: RuntimeManifest): Promise<void> {\n await fsp.mkdir(path.dirname(manifestPath), { recursive: true });\n await fsp.writeFile(manifestPath, JSON.stringify(manifest, null, 2) + '\\n', 'utf8');\n}\n\nexport function readRuntimeManifest(manifestPath: string): RuntimeManifest | undefined {\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));\n return isRuntimeManifest(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport { getQuantSpec, modelQuantDir };\n","import path from 'node:path';\n\nexport interface ClefPaths {\n root: string;\n modelsDir: string;\n runtimeDir: string;\n configJson: string;\n}\n\nexport function pathsFor(clefHome: string): ClefPaths {\n const root = path.resolve(clefHome);\n return {\n root,\n modelsDir: path.join(root, 'models'),\n runtimeDir: path.join(root, 'runtime'),\n configJson: path.join(root, 'config.json'),\n };\n}\n\n/** Directory label for a quantization, mirroring the documented cache layout (`models/clef-flash/4bit`). */\nexport function quantDirLabel(quant: string): string {\n switch (quant) {\n case 'Q4_K_M':\n return '4bit';\n case 'Q8_0':\n return '8bit';\n case 'BF16':\n return 'bf16';\n default:\n return quant.toLowerCase();\n }\n}\n\nexport function modelQuantDir(modelsDir: string, model: string, quant: string): string {\n return path.join(modelsDir, model, quantDirLabel(quant));\n}\n\nexport function manifestPathFor(modelsDir: string, model: string, quant: string): string {\n return path.join(modelQuantDir(modelsDir, model, quant), 'manifest.json');\n}\n\n/** Platform subfolder for managed llama.cpp binaries, e.g. `runtime/llama.cpp/darwin-arm64`. */\nexport function llamaRuntimeDir(runtimeDir: string, platform: string, arch: string): string {\n return path.join(runtimeDir, 'llama.cpp', `${platform}-${arch}`);\n}\n\nexport function llamaServerName(platform: string): string {\n return platform === 'win32' ? 'llama-server.exe' : 'llama-server';\n}\n","import { ClefError, ClefErrorCode } from '../clef/errors.js';\n\nexport type QuantId = 'Q4_K_M' | 'Q8_0' | 'BF16';\n\nexport interface QuantSpec {\n id: QuantId;\n file: string;\n bytes: number;\n dirLabel: string;\n /** Minimum total memory (RAM; on macOS unified) needed to run this quant comfortably. */\n minTotalMemBytes: number;\n}\n\nexport interface ModelSpec {\n id: string;\n repo: string;\n /** Pinned upstream revision for reproducible downloads + checksums. */\n revision: string;\n licenseId: string;\n licenseUrl: string;\n originUrl: string;\n defaultQuant: QuantId;\n quants: QuantSpec[];\n}\n\nconst GB = 1024 ** 3;\n\nexport const CLEF_FLASH: ModelSpec = {\n id: 'clef-flash',\n repo: 'ggml-org/Clef-Flash-GGUF',\n revision: '4a7a08c09bc63baf043b62b5ba89dd67a0357d95',\n licenseId: 'Apache-2.0',\n licenseUrl: 'https://huggingface.co/Cloudflare/clef-flash',\n originUrl: 'https://huggingface.co/Cloudflare/clef-flash',\n defaultQuant: 'Q4_K_M',\n quants: [\n { id: 'Q4_K_M', file: 'Clef-Flash-Q4_K_M.gguf', bytes: 6_486_448_192, dirLabel: '4bit', minTotalMemBytes: 16 * GB },\n { id: 'Q8_0', file: 'Clef-Flash-Q8_0.gguf', bytes: 9_657_260_096, dirLabel: '8bit', minTotalMemBytes: 32 * GB },\n { id: 'BF16', file: 'Clef-Flash-BF16.gguf', bytes: 18_164_488_256, dirLabel: 'bf16', minTotalMemBytes: 64 * GB },\n ],\n};\n\nexport const MODELS: Record<string, ModelSpec> = {\n [CLEF_FLASH.id]: CLEF_FLASH,\n};\n\nexport function getModelSpec(model: string): ModelSpec {\n const spec = MODELS[model];\n if (!spec) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `Unknown model \"${model}\".`,\n `Available models: ${Object.keys(MODELS).join(', ')}`,\n );\n }\n return spec;\n}\n\nexport function getQuantSpec(spec: ModelSpec, quant: string): QuantSpec {\n const found = spec.quants.find((q) => q.id === quant);\n if (!found) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `Unknown quantization \"${quant}\" for model ${spec.id}.`,\n `Available: ${spec.quants.map((q) => q.id).join(', ')}`,\n );\n }\n return found;\n}\n\n/**\n * Auto-pick the largest quantization that fits in memory. The 9B clef-flash\n * model needs headroom: Q4_K_M fits in 16 GB, Q8_0 in 32 GB, BF16 in 64 GB.\n */\nexport function pickQuant(spec: ModelSpec, totalMemBytes: number, requested?: string): QuantSpec {\n if (requested) return getQuantSpec(spec, requested);\n const fitting = [...spec.quants].sort((a, b) => b.minTotalMemBytes - a.minTotalMemBytes).find((q) => totalMemBytes >= q.minTotalMemBytes);\n if (!fitting) {\n throw new ClefError(\n ClefErrorCode.UNSUPPORTED_PLATFORM,\n `This machine has less than ${Math.round(spec.quants[spec.quants.length - 1]!.minTotalMemBytes / GB)} GB of memory; the smallest Clef-Flash build (Q4_K_M) needs 16 GB.`,\n );\n }\n return fitting;\n}\n\n/** Preference order when several quantizations are installed for one model. */\nexport const QUANT_PREFERENCE: readonly QuantId[] = ['Q4_K_M', 'Q8_0', 'BF16'];\n","import { execFile } from 'node:child_process';\nimport fsSync from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { pathsFor } from '../config/paths.js';\nimport type { Logger } from '../config/logger.js';\n\n/**\n * MLX runtime model install: snapshot of mlx-community/clef-flash-4bit (which\n * bundles the self-contained `clef_mlx.py` loader/served) fetched into\n * CLEF_HOME via a uv-managed huggingface_hub, no global Python state.\n */\n\nexport const MLX_MODEL_REPO = 'mlx-community/clef-flash-4bit';\nexport const MLX_MODEL_REVISION = '140bf7e037f5fa95a96535feca112f46c15927cf';\n\nexport interface MlxManifest {\n schemaVersion: 1;\n kind: 'mlx';\n model: string;\n repo: string;\n revision: string;\n /** Absolute path of the downloaded snapshot directory. */\n snapshotPath: string;\n licenseId: string;\n licenseUrl: string;\n installedAt: string;\n clefMcpVersion: string;\n}\n\nfunction manifestPath(clefHome: string): string {\n return path.join(pathsFor(clefHome).modelsDir, 'clef-flash', 'mlx', 'manifest.json');\n}\n\nexport async function readMlxManifest(clefHome: string): Promise<MlxManifest | undefined> {\n let raw: string;\n try {\n raw = await fsp.readFile(manifestPath(clefHome), 'utf8');\n } catch {\n return undefined;\n }\n try {\n const parsed = JSON.parse(raw) as MlxManifest;\n if (parsed.kind === 'mlx' && typeof parsed.snapshotPath === 'string') return parsed;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function writeMlxManifest(clefHome: string, manifest: MlxManifest): Promise<void> {\n const file = manifestPath(clefHome);\n await fsp.mkdir(path.dirname(file), { recursive: true });\n await fsp.writeFile(file, JSON.stringify(manifest, null, 2) + '\\n', 'utf8');\n}\n\n/** Installed = manifest present and the snapshot still contains the loader. */\nexport async function mlxIsInstalled(clefHome: string): Promise<MlxManifest | undefined> {\n const manifest = await readMlxManifest(clefHome);\n if (!manifest) return undefined;\n try {\n await fsp.access(path.join(manifest.snapshotPath, 'clef_mlx.py'));\n return manifest;\n } catch {\n return undefined;\n }\n}\n\nexport function resolveUv(envUv: string | undefined): string {\n if (envUv?.trim()) return envUv.trim();\n const dirs = (process.env.PATH ?? '').split(path.delimiter).filter(Boolean);\n for (const dir of dirs) {\n const candidate = path.join(dir, 'uv');\n try {\n fsSync.accessSync(candidate, fsSync.constants.X_OK);\n return candidate;\n } catch {\n // keep scanning\n }\n }\n throw new ClefError(\n ClefErrorCode.RUNTIME_NOT_FOUND,\n 'uv is required for the MLX runtime but was not found on PATH.',\n 'Install it with: curl -LsSf https://astral.sh/uv/install.sh | sh',\n );\n}\n\ninterface RunOptions {\n timeoutMs?: number;\n onStdoutLine?(line: string): void;\n}\n\n/** Run a short uv command, returning the trimmed stdout. */\nexport async function runUv(uvBin: string, args: string[], opts: RunOptions = {}): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = execFile(\n uvBin,\n args,\n { timeout: opts.timeoutMs ?? 600_000, maxBuffer: 16 * 1024 * 1024, encoding: 'utf8' },\n (err, stdout, stderr) => {\n if (err) {\n reject(\n new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `uv command failed: ${err.message.split('\\n')[0]}${stderr ? `\\n${stderr.trim().slice(0, 1000)}` : ''}`,\n 'Make sure uv is up to date: uv self update',\n ),\n );\n } else {\n resolve(stdout.trim());\n }\n },\n );\n if (opts.onStdoutLine) {\n let buf = '';\n child.stdout?.on('data', (chunk: Buffer) => {\n buf += chunk.toString();\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\n for (const line of lines) opts.onStdoutLine!(line);\n });\n }\n });\n}\n\n/**\n * Download the pinned MLX snapshot (or return the existing one). Safe to\n * re-run. Returns the manifest describing the snapshot.\n */\nexport async function installModelMlx(opts: {\n clefHome: string;\n uvBin?: string;\n clefMcpVersion: string;\n log?: Logger;\n}): Promise<MlxManifest> {\n const existing = await mlxIsInstalled(opts.clefHome);\n if (existing) return existing;\n\n const uvBin = resolveUv(opts.uvBin ?? process.env.CLEF_MLX_UV);\n const hfCache = path.join(pathsFor(opts.clefHome).root, 'hf-cache');\n await fsp.mkdir(hfCache, { recursive: true });\n\n opts.log?.info('downloading MLX model snapshot', { repo: MLX_MODEL_REPO, revision: MLX_MODEL_REVISION });\n const py = [\n 'from huggingface_hub import snapshot_download',\n `p = snapshot_download(\"${MLX_MODEL_REPO}\", revision=\"${MLX_MODEL_REVISION}\", cache_dir=r\"${hfCache}\")`,\n 'print(p)',\n ].join('\\n');\n const stdout = await runUv(\n uvBin,\n ['run', '--with', 'huggingface_hub', 'python', '-c', py],\n {\n timeoutMs: 1_800_000,\n onStdoutLine: (line) => {\n if (line.trim()) opts.log?.debug(line.trimEnd());\n },\n },\n );\n const lines = stdout.split('\\n').filter((l) => l.trim().startsWith('/'));\n const snapshotPath = lines.at(-1)?.trim();\n if (!snapshotPath) {\n throw new ClefError(ClefErrorCode.DOWNLOAD_FAILED, 'snapshot_download did not report a snapshot path');\n }\n await fsp.access(path.join(snapshotPath, 'clef_mlx.py'));\n\n const manifest: MlxManifest = {\n schemaVersion: 1,\n kind: 'mlx',\n model: 'clef-flash',\n repo: MLX_MODEL_REPO,\n revision: MLX_MODEL_REVISION,\n snapshotPath,\n licenseId: 'Apache-2.0',\n licenseUrl: 'https://huggingface.co/Cloudflare/clef-flash',\n installedAt: new Date().toISOString(),\n clefMcpVersion: opts.clefMcpVersion,\n };\n await writeMlxManifest(opts.clefHome, manifest);\n opts.log?.info('MLX model installed', { snapshotPath });\n return manifest;\n}\n\n/** Remove the MLX snapshot + manifest. */\nexport async function removeMlxModel(clefHome: string): Promise<boolean> {\n const manifest = await readMlxManifest(clefHome);\n if (!manifest) return false;\n await fsp.rm(manifest.snapshotPath, { recursive: true, force: true }).catch(() => undefined);\n await fsp.rm(path.dirname(manifestPath(clefHome)), { recursive: true, force: true });\n return true;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { ClefConfig } from '../config/env.js';\nimport { llamaRuntimeDir, llamaServerName, pathsFor } from '../config/paths.js';\nimport { readRuntimeManifest } from '../models/manifest.js';\n\nexport interface ResolvedBinary {\n source: 'env' | 'managed' | 'path';\n path: string;\n}\n\nexport interface BinaryResolveDeps {\n existsExecutable?(p: string): boolean;\n which?(name: string): string | undefined;\n platform?: string;\n arch?: string;\n}\n\nfunction existsExecutable(p: string): boolean {\n try {\n fs.accessSync(p, fs.constants.X_OK);\n return fs.statSync(p).isFile();\n } catch {\n return false;\n }\n}\n\nfunction whichBin(name: string, platform: string): string | undefined {\n const dirs = (process.env.PATH ?? '').split(path.delimiter).filter(Boolean);\n const exts = platform === 'win32' ? (process.env.PATHEXT ?? '.exe').split(';') : [''];\n for (const dir of dirs) {\n for (const ext of exts) {\n const candidate = path.join(dir, name + ext.toLowerCase());\n if (existsExecutable(candidate)) return candidate;\n }\n }\n return undefined;\n}\n\nfunction managedBinary(clefHome: string, platform: string, arch: string, exists: (p: string) => boolean): string | undefined {\n const platformDir = llamaRuntimeDir(pathsFor(clefHome).runtimeDir, platform, arch);\n // Preferred: the runtime manifest records the real binary path inside the\n // extracted release layout (required on macOS: @rpath dylibs are siblings).\n const manifest = readRuntimeManifest(path.join(platformDir, 'runtime-manifest.json'));\n if (manifest && exists(manifest.binaryPath)) return manifest.binaryPath;\n // Legacy/symlinked layout: llama-server directly in the platform dir.\n const legacy = path.join(platformDir, llamaServerName(platform));\n if (exists(legacy)) return legacy;\n return undefined;\n}\n\n/**\n * Resolution order: CLEF_LLAMA_BIN → managed binary under CLEF_HOME → `llama-server` on PATH.\n * Managed wins over PATH because a user's PATH binary may predate clef support.\n */\nexport function resolveLlamaServerBinary(cfg: ClefConfig, deps: BinaryResolveDeps = {}): ResolvedBinary {\n const exists = deps.existsExecutable ?? existsExecutable;\n const which = deps.which ?? ((name: string) => whichBin(name, deps.platform ?? process.platform));\n const platform = deps.platform ?? process.platform;\n const arch = deps.arch ?? process.arch;\n\n if (cfg.llamaBin) {\n if (!exists(cfg.llamaBin)) {\n throw new ClefError(\n ClefErrorCode.RUNTIME_NOT_FOUND,\n `CLEF_LLAMA_BIN points to a missing or non-executable file: ${cfg.llamaBin}`,\n );\n }\n return { source: 'env', path: cfg.llamaBin };\n }\n\n const managed = managedBinary(cfg.clefHome, platform, arch, exists);\n if (managed) return { source: 'managed', path: managed };\n\n const onPath = which('llama-server');\n if (onPath) return { source: 'path', path: onPath };\n\n throw new ClefError(\n ClefErrorCode.RUNTIME_NOT_FOUND,\n 'No llama-server binary found.',\n 'Install llama.cpp with clef support (`brew install llama.cpp`, or `curl -LsSf https://llama.app/install.sh | sh`), or run `clef-mcp install` to download a managed runtime.',\n );\n}\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport net from 'node:net';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { SystemOneRequest, SystemOneResponse } from '../clef/systemone.js';\nimport type { Logger } from '../config/logger.js';\nimport type { ClefRuntime, RuntimeHealth } from './types.js';\n\nexport interface LlamaCppRuntimeOptions {\n serverBin: string;\n modelPath: string;\n alias?: string;\n host?: string;\n port?: number;\n /** Max wait for the server to report ready after spawn. */\n loadTimeoutMs?: number;\n /** Per-request timeout for /v1/systemone. */\n requestTimeoutMs?: number;\n /**\n * llama.cpp physical batch size (`-b`/`-ub`). The clef decision path scores\n * all questions in one sequence, so multi-question requests need more than\n * the default 512; the clef-mcp limit is 64 questions (~6-8k tokens).\n */\n batchSize?: number;\n log?: Logger;\n}\n\nconst STDERR_TAIL_LIMIT = 4000;\n\nfunction freePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const srv = net.createServer();\n srv.unref();\n srv.on('error', reject);\n srv.listen(0, '127.0.0.1', () => {\n const addr = srv.address();\n const port = typeof addr === 'object' && addr ? addr.port : 0;\n srv.close(() => (port > 0 ? resolve(port) : reject(new Error('could not acquire a free port'))));\n });\n });\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nconst OOM_PATTERNS = [\n 'out of memory',\n 'failed to allocate',\n 'unable to allocate',\n 'not enough memory',\n 'cannot allocate memory',\n];\n\nexport class LlamaCppRuntime implements ClefRuntime {\n private proc?: ChildProcess;\n private resolvedPort?: number;\n private readonly host: string;\n private readonly loadTimeoutMs: number;\n private readonly requestTimeoutMs: number;\n /** Serializes decide() calls: the llama.cpp clef path handles one sequence per batch. */\n private queue: Promise<unknown> = Promise.resolve();\n private readonly batchSize: number;\n\n constructor(private readonly opts: LlamaCppRuntimeOptions) {\n this.host = opts.host ?? '127.0.0.1';\n this.loadTimeoutMs = opts.loadTimeoutMs ?? 120_000;\n this.requestTimeoutMs = opts.requestTimeoutMs ?? 60_000;\n this.batchSize = opts.batchSize ?? (Number.parseInt(process.env.CLEF_LLAMA_BATCH ?? '', 10) || 8192);\n }\n\n get endpoint(): string {\n if (!this.resolvedPort) throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'Runtime is not started');\n return `http://${this.host}:${this.resolvedPort}`;\n }\n\n get running(): boolean {\n return this.proc !== undefined && this.proc.exitCode === null;\n }\n\n async load(): Promise<void> {\n if (this.running) return;\n const port = this.opts.port ?? (await freePort());\n this.resolvedPort = port;\n const args = [\n '-m',\n this.opts.modelPath,\n '--host',\n this.host,\n '--port',\n String(port),\n '--no-webui',\n '-b',\n String(this.batchSize),\n '-ub',\n String(this.batchSize),\n ...(this.opts.alias ? ['--alias', this.opts.alias] : []),\n ];\n this.opts.log?.debug('spawning llama-server', { bin: this.opts.serverBin, args });\n\n let proc: ChildProcess;\n try {\n proc = spawn(this.opts.serverBin, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.RUNTIME_INIT_FAILED,\n `Failed to start llama-server: ${err instanceof Error ? err.message : String(err)}`,\n 'Check that the runtime binary is executable, or run `clef-mcp doctor`.',\n );\n }\n this.proc = proc;\n\n let stderrTail = '';\n proc.stderr?.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n stderrTail = (stderrTail + text).slice(-STDERR_TAIL_LIMIT);\n this.opts.log?.debug(text.trimEnd());\n });\n proc.stdout?.on('data', (chunk: Buffer) => {\n this.opts.log?.debug(chunk.toString().trimEnd());\n });\n\n let rejectOnExit: ((err: ClefError) => void) | undefined;\n const exitedBeforeReady = new Promise<never>((_resolve, reject) => {\n rejectOnExit = reject;\n });\n const onEarlyExit = (code: number | null, signal: NodeJS.Signals | null) => {\n const oom = OOM_PATTERNS.some((p) => stderrTail.toLowerCase().includes(p));\n const message = `llama-server exited before becoming ready (code=${code ?? 'null'}, signal=${signal ?? 'null'})`;\n const tail = stderrTail.trim();\n rejectOnExit?.(\n oom\n ? new ClefError(\n ClefErrorCode.OUT_OF_MEMORY,\n message,\n 'Not enough free memory for this model. Try a smaller quantization (`clef-mcp install --quant Q4_K_M`).',\n )\n : new ClefError(\n ClefErrorCode.RUNTIME_INIT_FAILED,\n message + (tail ? `\\nstderr tail:\\n${tail}` : ''),\n 'Run `clef-mcp doctor` for a full diagnosis.',\n ),\n );\n };\n proc.once('exit', onEarlyExit);\n\n try {\n await Promise.race([this.waitUntilReady(), exitedBeforeReady]);\n } finally {\n proc.removeListener('exit', onEarlyExit);\n }\n }\n\n private async waitUntilReady(): Promise<void> {\n const deadline = Date.now() + this.loadTimeoutMs;\n let lastError = '';\n while (Date.now() < deadline) {\n if (!this.running) throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'llama-server is not running');\n try {\n const res = await fetchWithTimeout(`${this.endpoint}/health`, { method: 'GET' }, 2_000);\n if (res.status === 200) return;\n lastError = `health status ${res.status}`;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n }\n await new Promise((r) => setTimeout(r, 250));\n }\n throw new ClefError(\n ClefErrorCode.MODEL_LOAD_FAILED,\n `llama-server did not become ready within ${Math.round(this.loadTimeoutMs / 1000)}s (last health check: ${lastError})`,\n 'Large models can take minutes to load. Run `clef-mcp doctor` or try a smaller quantization.',\n );\n }\n\n async decide(input: SystemOneRequest): Promise<SystemOneResponse> {\n const run = this.queue.then(() => this.decideOnce(input));\n // Keep the chain alive even after failures.\n this.queue = run.catch(() => undefined);\n return run;\n }\n\n private async decideOnce(input: SystemOneRequest): Promise<SystemOneResponse> {\n if (!this.running) {\n throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'Runtime is not loaded; call load() first');\n }\n let res: Response;\n try {\n res = await fetchWithTimeout(\n `${this.endpoint}/v1/systemone`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(input),\n },\n this.requestTimeoutMs,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Inference request failed: ${msg}`,\n msg.includes('abort') ? 'Request timed out. Reduce state size or increase the request timeout.' : undefined,\n );\n }\n\n const bodyText = await res.text();\n let body: unknown = undefined;\n try {\n body = bodyText ? JSON.parse(bodyText) : undefined;\n } catch {\n // Non-JSON body: fall through to the status-based error below.\n }\n\n if (!res.ok) {\n const apiMessage =\n body && typeof body === 'object' && 'error' in body\n ? String((body as { error: { message?: unknown } }).error?.message ?? bodyText)\n : bodyText;\n if (res.status === 413) {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Input exceeds the model context window: ${apiMessage}`,\n 'Reduce the state size or the number/size of questions.',\n );\n }\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Inference failed with HTTP ${res.status}: ${apiMessage.slice(0, 2000)}`,\n /physical batch size/i.test(apiMessage)\n ? 'Too many/too large questions for one request. Split into several calls, reduce criteria text, or raise the batch with CLEF_LLAMA_BATCH.'\n : undefined,\n );\n }\n\n if (!body || typeof body !== 'object') {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime returned a non-JSON response (HTTP ${res.status})`,\n 'The installed llama.cpp build may not support clef models. Run `clef-mcp doctor`.',\n );\n }\n return body as SystemOneResponse;\n }\n\n async health(): Promise<RuntimeHealth> {\n if (!this.running) return { status: 'unavailable', detail: 'not started' };\n try {\n const res = await fetchWithTimeout(`${this.endpoint}/health`, { method: 'GET' }, 1_500);\n if (res.status === 200) return { status: 'ready' };\n return { status: 'loading', detail: `health status ${res.status}` };\n } catch (err) {\n return { status: 'unavailable', detail: err instanceof Error ? err.message : String(err) };\n }\n }\n\n async unload(): Promise<void> {\n const proc = this.proc;\n if (!proc) return;\n this.proc = undefined;\n if (proc.exitCode !== null || proc.signalCode) return;\n await new Promise<void>((resolve) => {\n const killTimer = setTimeout(() => {\n try {\n proc.kill('SIGKILL');\n } catch {\n // Already gone.\n }\n }, 3_000);\n proc.once('exit', () => {\n clearTimeout(killTimer);\n resolve();\n });\n try {\n proc.kill('SIGTERM');\n } catch {\n clearTimeout(killTimer);\n resolve();\n }\n });\n }\n}\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport net from 'node:net';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { SystemOneRequest, SystemOneResponse } from '../clef/systemone.js';\nimport type { Logger } from '../config/logger.js';\nimport type { ClefRuntime, RuntimeHealth } from './types.js';\n\nexport interface MlxRuntimeOptions {\n /** uv binary (managed snapshots run inside a uv environment). */\n uvBin: string;\n /** Snapshot directory containing clef_mlx.py (the model repo itself). */\n snapshotPath: string;\n host?: string;\n port?: number;\n loadTimeoutMs?: number;\n requestTimeoutMs?: number;\n log?: Logger;\n}\n\nconst STDERR_TAIL_LIMIT = 4000;\n\nfunction freePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const srv = net.createServer();\n srv.unref();\n srv.on('error', reject);\n srv.listen(0, '127.0.0.1', () => {\n const addr = srv.address();\n const port = typeof addr === 'object' && addr ? addr.port : 0;\n srv.close(() => (port > 0 ? resolve(port) : reject(new Error('could not acquire a free port'))));\n });\n });\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nconst OOM_PATTERNS = ['out of memory', 'failed to allocate', 'unable to allocate', 'not enough memory'];\n\n/**\n * MLX runtime: runs `clef_mlx.py serve` (bundled with the model snapshot)\n * inside a uv environment and talks SystemOne over local HTTP.\n * macOS / Apple Silicon only by nature of MLX.\n */\nexport class MlxRuntime implements ClefRuntime {\n private proc?: ChildProcess;\n private resolvedPort?: number;\n private readonly host: string;\n private readonly loadTimeoutMs: number;\n private readonly requestTimeoutMs: number;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(private readonly opts: MlxRuntimeOptions) {\n this.host = opts.host ?? '127.0.0.1';\n this.loadTimeoutMs = opts.loadTimeoutMs ?? 180_000;\n this.requestTimeoutMs = opts.requestTimeoutMs ?? 120_000;\n }\n\n get endpoint(): string {\n if (!this.resolvedPort) throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'Runtime is not started');\n return `http://${this.host}:${this.resolvedPort}`;\n }\n\n get running(): boolean {\n return this.proc !== undefined && this.proc.exitCode === null;\n }\n\n async load(): Promise<void> {\n if (this.running) return;\n const port = this.opts.port ?? (await freePort());\n this.resolvedPort = port;\n const args = [\n 'run',\n '--directory',\n this.opts.snapshotPath,\n '--with',\n 'mlx-vlm>=0.7.4,<0.8',\n '--with',\n 'huggingface_hub',\n 'python',\n 'clef_mlx.py',\n 'serve',\n '--host',\n this.host,\n '--port',\n String(port),\n ];\n this.opts.log?.debug('spawning clef_mlx.py serve', { uv: this.opts.uvBin, snapshot: this.opts.snapshotPath });\n\n let proc: ChildProcess;\n try {\n proc = spawn(this.opts.uvBin, args, { stdio: ['ignore', 'pipe', 'pipe'], cwd: this.opts.snapshotPath });\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.RUNTIME_INIT_FAILED,\n `Failed to start the MLX server: ${err instanceof Error ? err.message : String(err)}`,\n 'Run `clef-mcp doctor` for a full diagnosis.',\n );\n }\n this.proc = proc;\n\n let stderrTail = '';\n proc.stderr?.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n stderrTail = (stderrTail + text).slice(-STDERR_TAIL_LIMIT);\n this.opts.log?.debug(text.trimEnd());\n });\n proc.stdout?.on('data', (chunk: Buffer) => {\n this.opts.log?.debug(chunk.toString().trimEnd());\n });\n\n let rejectOnExit: ((err: ClefError) => void) | undefined;\n const exitedBeforeReady = new Promise<never>((_resolve, reject) => {\n rejectOnExit = reject;\n });\n const onEarlyExit = (code: number | null, signal: NodeJS.Signals | null) => {\n const oom = OOM_PATTERNS.some((p) => stderrTail.toLowerCase().includes(p));\n const message = `clef_mlx.py exited before becoming ready (code=${code ?? 'null'}, signal=${signal ?? 'null'})`;\n const tail = stderrTail.trim();\n rejectOnExit?.(\n oom\n ? new ClefError(ClefErrorCode.OUT_OF_MEMORY, message, 'Not enough free memory for this model. Try the llama.cpp runtime with Q4_K_M instead.')\n : new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, message + (tail ? `\\nstderr tail:\\n${tail}` : ''), 'Run `clef-mcp doctor` for a full diagnosis.'),\n );\n };\n proc.once('exit', onEarlyExit);\n\n try {\n await Promise.race([this.waitUntilReady(), exitedBeforeReady]);\n } finally {\n proc.removeListener('exit', onEarlyExit);\n }\n }\n\n private async waitUntilReady(): Promise<void> {\n const deadline = Date.now() + this.loadTimeoutMs;\n let lastError = '';\n while (Date.now() < deadline) {\n if (!this.running) throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'MLX server is not running');\n try {\n const res = await fetchWithTimeout(`${this.endpoint}/health`, { method: 'GET' }, 2_000);\n if (res.status === 200) return;\n lastError = `health status ${res.status}`;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n }\n await new Promise((r) => setTimeout(r, 250));\n }\n throw new ClefError(\n ClefErrorCode.MODEL_LOAD_FAILED,\n `MLX server did not become ready within ${Math.round(this.loadTimeoutMs / 1000)}s (last health check: ${lastError})`,\n 'The first load can take a while; subsequent loads reuse the snapshot cache.',\n );\n }\n\n async decide(input: SystemOneRequest): Promise<SystemOneResponse> {\n const run = this.queue.then(() => this.decideOnce(input));\n this.queue = run.catch(() => undefined);\n return run;\n }\n\n private async decideOnce(input: SystemOneRequest): Promise<SystemOneResponse> {\n if (!this.running) {\n throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'Runtime is not loaded; call load() first');\n }\n let res: Response;\n try {\n res = await fetchWithTimeout(\n `${this.endpoint}/v1/systemone`,\n { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(input) },\n this.requestTimeoutMs,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new ClefError(ClefErrorCode.CLEF_INFERENCE_FAILED, `Inference request failed: ${msg}`);\n }\n const bodyText = await res.text();\n let body: unknown = undefined;\n try {\n body = bodyText ? JSON.parse(bodyText) : undefined;\n } catch {\n // handled below\n }\n if (!res.ok) {\n const apiMessage =\n body && typeof body === 'object' && 'error' in body\n ? String((body as { error: { message?: unknown } }).error?.message ?? bodyText)\n : bodyText;\n throw new ClefError(ClefErrorCode.CLEF_INFERENCE_FAILED, `Inference failed with HTTP ${res.status}: ${apiMessage.slice(0, 2000)}`);\n }\n if (!body || typeof body !== 'object') {\n throw new ClefError(ClefErrorCode.CLEF_INFERENCE_FAILED, `Runtime returned a non-JSON response (HTTP ${res.status})`);\n }\n return body as SystemOneResponse;\n }\n\n async health(): Promise<RuntimeHealth> {\n if (!this.running) return { status: 'unavailable', detail: 'not started' };\n try {\n const res = await fetchWithTimeout(`${this.endpoint}/health`, { method: 'GET' }, 1_500);\n if (res.status === 200) return { status: 'ready' };\n return { status: 'loading', detail: `health status ${res.status}` };\n } catch (err) {\n return { status: 'unavailable', detail: err instanceof Error ? err.message : String(err) };\n }\n }\n\n async unload(): Promise<void> {\n const proc = this.proc;\n if (!proc) return;\n this.proc = undefined;\n if (proc.exitCode !== null || proc.signalCode) return;\n await new Promise<void>((resolve) => {\n const killTimer = setTimeout(() => {\n try {\n proc.kill('SIGKILL');\n } catch {\n // already gone\n }\n }, 3_000);\n proc.once('exit', () => {\n clearTimeout(killTimer);\n resolve();\n });\n try {\n proc.kill('SIGTERM');\n } catch {\n clearTimeout(killTimer);\n resolve();\n }\n });\n }\n}\n","import { z } from 'zod';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { Limits } from '../config/limits.js';\n\nfunction criteriaDescription(limits: Limits): z.ZodString {\n return z.string().min(1).max(limits.maxCriteriaDescChars);\n}\n\nfunction countIssues(count: number, limits: Limits): string | undefined {\n if (count === 0) return 'criteria must not be empty';\n if (count > limits.maxCriteriaPerQuestion) return `too many criteria (max ${limits.maxCriteriaPerQuestion})`;\n return undefined;\n}\n\nfunction choiceCriteria(limits: Limits) {\n return z.union([\n // Plain list: option ids equal to the strings themselves.\n z.array(criteriaDescription(limits)).check((ctx) => {\n const problem = countIssues(ctx.value.length, limits);\n if (problem) ctx.issues.push({ code: 'custom', message: problem, input: ctx.value });\n }),\n z\n .record(z.string().min(1).max(limits.maxCriteriaDescChars), criteriaDescription(limits))\n .check((ctx) => {\n const problem = countIssues(Object.keys(ctx.value).length, limits);\n if (problem) ctx.issues.push({ code: 'custom', message: problem, input: ctx.value });\n }),\n ]);\n}\n\nfunction scoreCriteria(limits: Limits) {\n return z\n .array(criteriaDescription(limits))\n .check((ctx) => {\n if (ctx.value.length === 0) ctx.issues.push({ code: 'custom', message: 'criteria must not be empty', input: ctx.value });\n if (ctx.value.length > limits.maxCriteriaPerQuestion) {\n ctx.issues.push({ code: 'custom', message: `too many criteria (max ${limits.maxCriteriaPerQuestion})`, input: ctx.value });\n }\n });\n}\n\nfunction questionSchema(limits: Limits) {\n return z\n .object({\n type: z\n .enum(['noul', 'choice', 'score'])\n .describe('\"choice\" = pick among named options; \"score\" = judge an ordered scale; \"noul\" = yes/no question'),\n instructions: z\n .string()\n .min(1)\n .max(limits.maxInstructionsChars)\n .describe('What to judge, phrased as a self-contained question.'),\n criteria: z.union([z.array(z.string()), z.record(z.string(), z.string())]).optional(),\n })\n .describe(\n 'A single decision question. Allowed answers come from `criteria` and must be mutually exclusive and collectively exhaustive.',\n )\n .superRefine((q, ctx) => {\n if (q.type === 'choice') {\n // Spec §3 allows both shapes for choice: a map option id -> description,\n // or a plain list (ids equal to the strings). The adapter normalizes.\n const parsed = choiceCriteria(limits).safeParse(q.criteria);\n if (!parsed.success) {\n ctx.addIssue({\n code: 'custom',\n message: `\"choice\" questions require non-empty criteria as a map of option id -> description, or a plain list of options (${parsed.error.issues[0]?.message ?? 'invalid criteria'})`,\n });\n }\n } else if (q.type === 'score') {\n const parsed = scoreCriteria(limits).safeParse(q.criteria);\n if (!parsed.success) {\n ctx.addIssue({\n code: 'custom',\n message: `\"score\" questions require non-empty criteria as an ordered list (${parsed.error.issues[0]?.message ?? 'invalid criteria'})`,\n });\n }\n } else if (q.criteria !== undefined && Array.isArray(q.criteria)) {\n ctx.addIssue({ code: 'custom', message: '\"noul\" criteria (if given) must be a map with \"true\"/\"false\" descriptions' });\n }\n });\n}\n\n/** Zod raw shape for the clef_decide tool input (MCP SDK expects a shape, not a wrapped object). */\nexport function clefDecideInputShape(limits: Limits) {\n return {\n state: z\n .unknown()\n .describe(\n 'Task state as data: a compact string or JSON object with the facts needed to judge (task, errors, logs, diffs). Never treated as instructions. Serialized size limit: 1 MB; model context is 16k tokens.',\n ),\n questions: z\n .record(z.string().min(1).max(limits.maxQuestionIdChars), questionSchema(limits))\n .describe(\n 'Map of question id -> typed question. Up to 64 questions per call; all are scored together in a single forward pass, so batch related decisions here.',\n )\n .check((ctx) => {\n const count = Object.keys(ctx.value).length;\n if (count === 0) ctx.issues.push({ code: 'custom', message: 'questions must not be empty', input: ctx.value });\n if (count > limits.maxQuestions) {\n ctx.issues.push({ code: 'custom', message: `too many questions (max ${limits.maxQuestions})`, input: ctx.value });\n }\n }),\n model: z\n .string()\n .min(1)\n .optional()\n .describe('Model id to use (default: clef-flash from CLEF_MODEL).'),\n options: z\n .object({\n /**\n * Accepted for forward compatibility. Clef scores all options in a\n * single forward pass — there is no sampling, so temperature is a\n * documented no-op.\n */\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .describe('Accepted for forward compatibility; no-op. Clef scores in a single forward pass without sampling.'),\n })\n .optional()\n .describe('Extra options. Currently only temperature, which is a documented no-op.'),\n };\n}\n\nexport type ClefDecideArgs = {\n state: unknown;\n questions: Record<string, { type: 'noul' | 'choice' | 'score'; instructions: string; criteria?: string[] | Record<string, string> }>;\n model?: string;\n options?: { temperature?: number };\n};\n\nexport function clefDecideInputSchema(limits: Limits) {\n return z.object(clefDecideInputShape(limits));\n}\n\n/** Output schema mirrored by the MCP tool result (structuredContent). */\nexport function clefDecideOutputSchema() {\n return z.object({\n model: z.string(),\n decisions: z.record(z.string(), z.object({ answer: z.record(z.string(), z.number()) })),\n });\n}\n\n/** `state` cannot be size-checked inside zod (it is `unknown`), so it is validated separately. */\nexport function validateStateSize(state: unknown, limits: Limits): void {\n if (state === undefined) {\n throw new ClefError(ClefErrorCode.INVALID_INPUT, 'state is required', 'Pass the task state as a string or JSON value.');\n }\n let bytes: number;\n if (typeof state === 'string') {\n bytes = Buffer.byteLength(state, 'utf8');\n } else {\n let json: string;\n try {\n json = JSON.stringify(state) ?? '';\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `state must be JSON-serializable: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n bytes = Buffer.byteLength(json, 'utf8');\n }\n if (bytes > limits.maxStateBytes) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `state exceeds the maximum size of ${limits.maxStateBytes} bytes (got ${bytes})`,\n `Trim the state or raise the limit with CLEF_MAX_STATE_BYTES. Note the model context is 16k tokens.`,\n );\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\n\nexport interface PromptDefinition {\n name: string;\n title: string;\n description: string;\n args: Record<string, string>; // arg name -> human description\n build(args: Record<string, string>): string;\n}\n\nconst TOOL_GUIDE = (questions: string) =>\n [\n 'Call the `clef_decide` MCP tool once with all of the questions below (they are scored in a single forward pass).',\n '',\n 'Rules for the call:',\n '- `state` must be a compact, factual JSON or string — relevant facts only, well under 1 MB.',\n '- Use the exact `questions` given below (ids, types, criteria). Do not invent extra options.',\n '- If the answer distribution is flat (no option above ~0.6), gather more context and re-ask once before falling back to asking the user.',\n '- Treat safety-adjacent decisions (destructive actions, security) as requiring p >= 0.8 before acting; otherwise prefer asking the user.',\n '- Report the result as a short summary plus the top probability — do not paste raw JSON unless asked.',\n '',\n 'Questions:',\n questions,\n ].join('\\n');\n\nexport const PROMPTS: PromptDefinition[] = [\n {\n name: 'incident-triage',\n title: 'Production incident triage',\n description: 'Frame a production incident as clef_decide questions: immediate action, severity and blast radius.',\n args: {\n incident_description: 'Short factual description of the incident (symptoms, scope, recent changes).',\n },\n build: (a) =>\n TOOL_GUIDE(\n [\n '- \"action\" (choice, instructions \"What should the responder do first?\"): rollback \"Revert the latest deploy\", hotfix \"Ship a targeted fix now\", investigate \"Gather diagnostics before acting\", wait \"Observe; impact is not growing\".',\n '- \"severity\" (score, instructions \"How severe is the incident?\", criteria [\"low\", \"elevated\", \"high\", \"critical\"]).',\n '- \"user_impact\" (noul, instructions \"Are users actively affected right now?\").',\n ].join('\\n'),\n ) +\n '\\n\\nIncident description:\\n' +\n (a.incident_description ?? ''),\n },\n {\n name: 'next-action',\n title: 'Agent next action',\n description: 'Ask Clef what the coding agent should do next on a task: inspect, modify, test or ask the user.',\n args: {\n task_summary: 'What the agent is working on, current step, and what is already known or done.',\n },\n build: (a) =>\n TOOL_GUIDE(\n [\n '- \"next_action\" (choice, instructions \"What should the coding agent do next?\"): inspect \"Inspect the code and gather more information\", modify \"Modify the code\", test \"Run additional tests\", ask_user \"Ask the user for clarification\".',\n '- \"confidence\" (score, instructions \"How confident are you in this decision?\", criteria [\"very_low\", \"low\", \"medium\", \"high\", \"very_high\"]).',\n ].join('\\n'),\n ) +\n '\\n\\nTask summary:\\n' +\n (a.task_summary ?? ''),\n },\n {\n name: 'ticket-routing',\n title: 'Support ticket routing',\n description: 'Classify an incoming message into the team that should handle it.',\n args: {\n ticket_text: 'The customer or user message, verbatim if possible.',\n },\n build: (a) =>\n TOOL_GUIDE(\n [\n '- \"department\" (choice, instructions \"Which team should handle the message?\"): billing \"Payments, invoices and refunds\", technical \"Bugs, errors and outages\", sales \"Pricing and new purchases\", other \"Anything else\".',\n '- \"urgent\" (noul, instructions \"Does this need a response within the hour?\").',\n ].join('\\n'),\n ) +\n '\\n\\nTicket text:\\n' +\n (a.ticket_text ?? ''),\n },\n {\n name: 'security-review',\n title: 'Security sanity check',\n description: 'Ask Clef whether a code snippet, change or setup smells like a security problem.',\n args: {\n change_summary: 'The code, config or setup to review — compact but complete enough to judge.',\n },\n build: (a) =>\n TOOL_GUIDE(\n [\n '- \"is_vulnerable\" (noul, instructions \"Does this contain a realistic security vulnerability?\").',\n '- \"risk\" (score, instructions \"How bad is it if this ships as-is?\", criteria [\"informational\", \"low\", \"medium\", \"high\", \"critical\"]).',\n '- \"first_mitigation\" (choice, instructions \"What is the first mitigation?\"): fix_code \"Fix the code before merging\", restrict \"Restrict access or add guardrails\", monitor \"Add detection and monitoring\", none \"No mitigation needed\".',\n ].join('\\n') +\n '\\nSafety rule: only act without human review when p(is_vulnerable=false) >= 0.8.',\n ) +\n '\\n\\nChange to review:\\n' +\n (a.change_summary ?? ''),\n },\n];\n\n/** Register all bundled prompts on the server. */\nexport function registerPrompts(server: McpServer): void {\n for (const p of PROMPTS) {\n server.registerPrompt(\n p.name,\n {\n title: p.title,\n description: p.description,\n argsSchema: Object.fromEntries(Object.entries(p.args).map(([k, v]) => [k, z.string().min(1).describe(v)])),\n },\n ({ ...args }) => {\n for (const key of Object.keys(p.args)) {\n if (typeof args[key] !== 'string' || !args[key]) {\n throw new ClefError(ClefErrorCode.INVALID_INPUT, `Prompt argument \"${key}\" is required`);\n }\n }\n return {\n messages: [{ role: 'user' as const, content: { type: 'text' as const, text: p.build(args as Record<string, string>) } }],\n };\n },\n );\n }\n}\n","import fsSync from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ClefConfig } from '../config/env.js';\nimport { defaultDatasetPath } from '../cli/evals.js';\n\nexport const EVALS_SCHEMA_MD = `# clef-mcp eval dataset format\n\nJSONL: one JSON object per line.\n\n{\n \"id\": \"unique-case-id\",\n \"category\": \"coding | security | classification | routing | yes_no\",\n \"state\": <string | JSON value>,\n \"question\": {\n \"id\": \"question-id\",\n \"type\": \"choice | score | noul\",\n \"instructions\": \"…\",\n \"criteria\": { \"option\": \"description\" } // choice (or [\"a\",\"b\"] list)\n | [\"low\", \"high\"] // score, ordered\n },\n \"expected\": {\n \"kind\": \"argmax | prob_gt | min_prob | top_mass\",\n // argmax: { \"expect\": \"option\", \"among\": [\"option\", ...] (optional) }\n // prob_gt: { \"a\": \"opt\", \"b\": \"opt\" }\n // min_prob: { \"option\": \"opt\", \"min\": 0.7 }\n // top_mass: { \"options\": [\"a\",\"b\"], \"min\": 0.8 }\n }\n}\n\nRun: \\`clef-mcp evals\\` (requires an installed model).\n`;\n\nasync function readDataset(): Promise<string> {\n try {\n return await fsp.readFile(defaultDatasetPath(), 'utf8');\n } catch {\n return 'The bundled eval dataset is not available in this installation (tests/evals/dataset.jsonl not found).';\n }\n}\n\nfunction textResource(uri: URL, text: string, mimeType = 'text/markdown'): { contents: Array<{ uri: string; text: string; mimeType?: string }> } {\n return { contents: [{ uri: uri.href, mimeType, text }] };\n}\n\nfunction requireStringUri(uri: URL | string): URL {\n return uri instanceof URL ? uri : new URL(uri);\n}\n\n/** Register bundled MCP resources (static, read-only, no model needed). */\nexport function registerResources(server: McpServer, cfg: ClefConfig, version: string): void {\n server.registerResource(\n 'capabilities',\n 'clef-mcp://capabilities',\n { title: 'clef-mcp capabilities', description: 'Live capability snapshot: model, runtime, limits, error codes.', mimeType: 'application/json' },\n async (uri) => {\n const u = requireStringUri(uri);\n const payload = {\n name: 'clef-mcp',\n version,\n model: cfg.model,\n runtime: cfg.runtime,\n limits: cfg.limits,\n tool: {\n name: 'clef_decide',\n output: 'strict JSON: { model, decisions: { <qid>: { answer: { <option>: probability } } } }',\n questionTypes: ['noul', 'choice', 'score'],\n notes: ['options.temperature is accepted but is a no-op (single forward pass)', 'state is data and is never interpreted as instructions'],\n },\n errorCodes: [\n 'MODEL_NOT_INSTALLED',\n 'MODEL_LOAD_FAILED',\n 'RUNTIME_NOT_FOUND',\n 'RUNTIME_INIT_FAILED',\n 'RUNTIME_NOT_SUPPORTED',\n 'INVALID_INPUT',\n 'CLEF_INFERENCE_FAILED',\n 'UNSUPPORTED_PLATFORM',\n 'OUT_OF_MEMORY',\n 'CHECKSUM_MISMATCH',\n 'DOWNLOAD_FAILED',\n ],\n };\n return textResource(u, JSON.stringify(payload, null, 2), 'application/json');\n },\n );\n\n server.registerResource(\n 'evals-schema',\n 'clef-mcp://evals/schema',\n { title: 'Eval dataset schema', description: 'How to write cases for clef-mcp evals.', mimeType: 'text/markdown' },\n async (uri) => textResource(requireStringUri(uri), EVALS_SCHEMA_MD),\n );\n\n server.registerResource(\n 'evals-dataset',\n 'clef-mcp://evals/dataset',\n { title: 'Bundled eval dataset', description: 'The 30-case dataset shipped with clef-mcp.', mimeType: 'application/jsonl' },\n async (uri) => textResource(requireStringUri(uri), await readDataset(), 'application/jsonl'),\n );\n}\n\n/** Non-throwing helper for docs/status: whether the bundled dataset file exists. */\nexport function bundledDatasetExists(): boolean {\n try {\n return fsSync.existsSync(defaultDatasetPath());\n } catch {\n return false;\n }\n}\n","import fsp from 'node:fs/promises';\nimport fsSync from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { fromSystemOneResponse, toSystemOneRequest } from '../clef/systemone.js';\nimport type { ClefQuestion } from '../clef/types.js';\nimport { loadConfig } from '../config/env.js';\nimport { createLogger } from '../config/logger.js';\nimport { findInstalledManifest } from '../models/manifest.js';\nimport { mlxIsInstalled, resolveUv } from '../models/mlx-install.js';\nimport { getModelSpec } from '../models/registry.js';\nimport { resolveLlamaServerBinary } from '../runtime/binary.js';\nimport { LlamaCppRuntime } from '../runtime/llama-cpp.js';\nimport { MlxRuntime } from '../runtime/mlx.js';\n\nexport interface EvalsOptions {\n dataset?: string;\n limit?: number;\n minRate?: number;\n}\n\ntype Expected =\n | { kind: 'argmax'; expect: string; among?: string[] }\n | { kind: 'prob_gt'; a: string; b: string }\n | { kind: 'min_prob'; option: string; min: number }\n | { kind: 'top_mass'; options: string[]; min: number };\n\ninterface EvalCase {\n id: string;\n category: string;\n state: unknown;\n question: ClefQuestion & { id: string };\n expected: Expected;\n}\n\nexport function defaultDatasetPath(): string {\n // Works from dist/ (packaged layout: <root>/dist/cli.js + <root>/tests/evals)\n // and from src/ under vitest. Walk up until the dataset is found.\n let dir = path.dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n const candidate = path.join(dir, 'tests', 'evals', 'dataset.jsonl');\n if (fsSync.existsSync(candidate)) return candidate;\n dir = path.dirname(dir);\n }\n return fileURLToPath(new URL('../tests/evals/dataset.jsonl', import.meta.url));\n}\n\nfunction parseLine(line: string, lineNo: number): EvalCase {\n const raw = JSON.parse(line) as EvalCase;\n if (typeof raw.id !== 'string' || !raw.question?.id || !raw.expected?.kind) {\n throw new ClefError(ClefErrorCode.INVALID_INPUT, `Eval dataset line ${lineNo} is missing id/question/expected`);\n }\n return raw;\n}\n\nfunction evaluate(answer: Record<string, number>, exp: Expected): { pass: boolean; detail: string } {\n const prob = (key: string): number => answer[key] ?? 0;\n switch (exp.kind) {\n case 'argmax': {\n const keys = exp.among ?? Object.keys(answer);\n let best = '';\n let bestP = -1;\n for (const k of keys) {\n if (prob(k) > bestP) {\n bestP = prob(k);\n best = k;\n }\n }\n return { pass: best === exp.expect, detail: `argmax=${best || 'n/a'} (${bestP.toFixed(3)}), expected=${exp.expect}` };\n }\n case 'prob_gt':\n return { pass: prob(exp.a) > prob(exp.b), detail: `p(${exp.a})=${prob(exp.a).toFixed(3)} vs p(${exp.b})=${prob(exp.b).toFixed(3)}` };\n case 'min_prob': {\n const p = prob(exp.option);\n return { pass: p >= exp.min, detail: `p(${exp.option})=${p.toFixed(3)}, required >= ${exp.min}` };\n }\n case 'top_mass': {\n const mass = exp.options.reduce((sum, k) => sum + prob(k), 0);\n return { pass: mass >= exp.min, detail: `mass(${exp.options.join('+')})=${mass.toFixed(3)}, required >= ${exp.min}` };\n }\n }\n}\n\nexport async function runEvals(opts: EvalsOptions): Promise<boolean> {\n const config = loadConfig();\n const log = createLogger(config.logLevel);\n const spec = getModelSpec(config.model);\n let mlxManifest;\n if (config.runtime === 'mlx') {\n mlxManifest = await mlxIsInstalled(config.clefHome);\n if (!mlxManifest) {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `Model \"${spec.id}\" is not installed for the MLX runtime.`,\n 'Run `clef-mcp install --runtime mlx` first.',\n );\n }\n }\n const manifest = config.runtime === 'mlx' ? undefined : await findInstalledManifest(config.clefHome, spec);\n if (!manifest && !mlxManifest) {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `Model \"${spec.id}\" is not installed; evals need the local model.`,\n 'Run `clef-mcp install` first.',\n );\n }\n\n const datasetPath = opts.dataset ?? defaultDatasetPath();\n const content = await fsp.readFile(datasetPath, 'utf8');\n let cases = content\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l && !l.startsWith('#'))\n .map((l, i) => parseLine(l, i + 1));\n if (opts.limit && opts.limit > 0) cases = cases.slice(0, opts.limit);\n if (cases.length === 0) {\n throw new ClefError(ClefErrorCode.INVALID_INPUT, `No eval cases found in ${datasetPath}`);\n }\n\n const binary = resolveLlamaServerBinary(config);\n const runtime =\n config.runtime === 'mlx'\n ? new MlxRuntime({ uvBin: resolveUv(process.env.CLEF_MLX_UV), snapshotPath: mlxManifest!.snapshotPath, log })\n : new LlamaCppRuntime({ serverBin: binary.path, modelPath: manifest!.modelPath, alias: spec.id, log });\n const runtimeLabel = config.runtime === 'mlx' ? 'MLX' : manifest!.quant;\n console.log(`Running ${cases.length} eval case(s) with ${spec.id} ${runtimeLabel}...\\n`);\n await runtime.load();\n\n let passed = 0;\n const results: Array<{ id: string; category: string; ok: boolean; detail: string }> = [];\n try {\n for (const [i, c] of cases.entries()) {\n process.stderr.write(`\\r case ${i + 1}/${cases.length} — ${c.id}`);\n try {\n const request = toSystemOneRequest({ state: c.state, questions: { [c.question.id]: c.question } }, spec.id);\n const response = await runtime.decide(request);\n const output = fromSystemOneResponse(response, { [c.question.id]: c.question }, spec.id);\n const answer = output.decisions[c.question.id]?.answer ?? {};\n const verdict = evaluate(answer, c.expected);\n if (verdict.pass) passed++;\n results.push({ id: c.id, category: c.category, ok: verdict.pass, detail: verdict.detail });\n } catch (err) {\n results.push({\n id: c.id,\n category: c.category,\n ok: false,\n detail: `error: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n } finally {\n process.stderr.write('\\n');\n await runtime.unload();\n }\n\n console.log('');\n for (const r of results) {\n console.log(`${r.ok ? '✔' : '✘'} [${r.category}] ${r.id} — ${r.detail}`);\n }\n const rate = passed / results.length;\n const minRate = opts.minRate ?? 0.8;\n console.log(`\\n${passed}/${results.length} passed (${(rate * 100).toFixed(1)}%), required >= ${(minRate * 100).toFixed(0)}%`);\n return rate >= minRate;\n}\n","import { execFile } from 'node:child_process';\nimport os from 'node:os';\nimport { promisify } from 'node:util';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { ClefError } from '../clef/errors.js';\nimport { loadConfig } from '../config/env.js';\nimport { pathsFor } from '../config/paths.js';\nimport { deepVerifyChecksum, findInstalledManifest, verifyModelFiles } from '../models/manifest.js';\nimport { assertSupportedPlatform, detectPlatform, formatBytes } from '../models/platform.js';\nimport { getModelSpec } from '../models/registry.js';\nimport { mlxIsInstalled, resolveUv } from '../models/mlx-install.js';\nimport { resolveLlamaServerBinary } from '../runtime/binary.js';\nimport { probeInference, probeMlxInference } from '../runtime/probe.js';\n\nconst execFileP = promisify(execFile);\n\nexport interface DoctorOptions {\n deep?: boolean;\n json?: boolean;\n}\n\nexport interface DoctorCheck {\n name: string;\n ok: boolean;\n detail: string;\n hint?: string;\n /** Informational checks do not affect the exit code. */\n informational?: boolean;\n}\n\nfunction mark(ok: boolean): string {\n return ok ? '✔' : '✘';\n}\n\nfunction printCheck(check: DoctorCheck): void {\n const skip = check.informational && !check.ok ? 'ℹ' : mark(check.ok);\n console.log(`${skip} ${check.name}${check.detail ? ` — ${check.detail}` : ''}`);\n if (check.hint) console.log(` hint: ${check.hint}`);\n}\n\nasync function checkBinaryVersion(binaryPath: string): Promise<string | undefined> {\n try {\n const { stdout } = await execFileP(binaryPath, ['--version'], { timeout: 20_000 });\n return stdout.trim().split('\\n')[0];\n } catch {\n return undefined;\n }\n}\n\ninterface McpConfigHint {\n client: string;\n path: string;\n configured: boolean;\n}\n\nasync function detectMcpConfigs(): Promise<McpConfigHint[]> {\n const home = os.homedir();\n const hints: McpConfigHint[] = [\n { client: 'Codex', path: path.join(home, '.codex', 'config.toml'), configured: false },\n { client: 'Claude Code (user)', path: path.join(home, '.claude.json'), configured: false },\n { client: 'Claude Code (project)', path: path.resolve('.mcp.json'), configured: false },\n { client: 'Cursor', path: path.join(process.cwd(), '.cursor', 'mcp.json'), configured: false },\n ];\n for (const hint of hints) {\n try {\n const content = await fsp.readFile(hint.path, 'utf8');\n hint.configured = content.includes('clef-mcp');\n } catch {\n hint.configured = false;\n }\n }\n return hints;\n}\n\nexport async function runDoctor(opts: DoctorOptions): Promise<boolean> {\n const config = loadConfig();\n const checks: DoctorCheck[] = [];\n const { modelsDir } = pathsFor(config.clefHome);\n\n // 1. Platform\n const info = await detectPlatform();\n try {\n assertSupportedPlatform(info);\n checks.push({ name: 'OS / architecture', ok: true, detail: `${info.platform}/${info.arch}` });\n } catch (err) {\n checks.push({\n name: 'OS / architecture',\n ok: false,\n detail: `${info.platform}/${info.arch}`,\n hint: err instanceof Error ? err.message : String(err),\n });\n }\n\n // 2. Memory — advisory: the install flow enforces the real requirement\n // (pickQuant throws below 16 GB); here it is a warning, not a failure.\n const memGb = info.totalMemBytes / 1024 ** 3;\n checks.push({\n name: 'Memory',\n ok: memGb >= 16,\n informational: true,\n detail: formatBytes(info.totalMemBytes),\n hint: memGb < 16 ? 'Clef-Flash Q4_K_M needs ~16 GB of memory to run comfortably.' : undefined,\n });\n\n // 3. GPU (informational — llama.cpp uses Metal on macOS by default)\n checks.push({\n name: 'GPU',\n ok: true,\n informational: true,\n detail: info.gpu?.name\n ? `${info.gpu.name}${info.gpu.vramBytes ? ` (${formatBytes(info.gpu.vramBytes)})` : ''}`\n : 'not detected (llama.cpp falls back to CPU; on Apple Silicon Metal is built in)',\n });\n\n // 4. Runtime binary\n let binaryPath: string | undefined;\n if (config.runtime === 'mlx') {\n try {\n binaryPath = resolveUv(process.env.CLEF_MLX_UV);\n checks.push({\n name: 'Runtime (uv, for the MLX runtime)',\n ok: true,\n detail: binaryPath,\n });\n } catch (err) {\n checks.push({\n name: 'Runtime (uv, for the MLX runtime)',\n ok: false,\n detail: err instanceof Error ? err.message : String(err),\n hint: 'Install uv: curl -LsSf https://astral.sh/uv/install.sh | sh',\n });\n }\n } else {\n try {\n const binary = resolveLlamaServerBinary(config);\n binaryPath = binary.path;\n const version = await checkBinaryVersion(binary.path);\n checks.push({\n name: 'Runtime binary',\n ok: version !== undefined,\n detail: `${binary.source}: ${binary.path}${version ? ` (${version})` : ''}`,\n hint: version === undefined ? 'The binary exists but did not answer --version; it may be broken or incompatible.' : undefined,\n });\n } catch (err) {\n binaryPath = undefined;\n checks.push({\n name: 'Runtime binary',\n ok: false,\n detail: err instanceof Error ? err.message : String(err),\n hint: err instanceof ClefError ? err.hint : undefined,\n });\n }\n }\n\n // 5. Model\n let spec;\n let manifest;\n let mlxManifest;\n try {\n spec = getModelSpec(config.model);\n if (config.runtime === 'mlx') mlxManifest = await mlxIsInstalled(config.clefHome);\n else manifest = await findInstalledManifest(config.clefHome, spec);\n } catch {\n checks.push({ name: 'Model', ok: false, detail: `unknown model id \"${config.model}\"` });\n }\n if (config.runtime === 'mlx') {\n if (!mlxManifest) {\n checks.push({\n name: 'Model',\n ok: false,\n detail: `${spec?.id ?? config.model} is not installed for the MLX runtime`,\n hint: 'Run `clef-mcp install --runtime mlx`.',\n });\n } else {\n checks.push({\n name: 'Model',\n ok: true,\n detail: `MLX snapshot at ${mlxManifest.snapshotPath}`,\n });\n checks.push({\n name: 'Model license',\n ok: true,\n informational: true,\n detail: `${mlxManifest.licenseId} — ${mlxManifest.licenseUrl}`,\n });\n }\n } else if (spec) {\n if (!manifest) {\n checks.push({\n name: 'Model',\n ok: false,\n detail: `${spec.id} is not installed`,\n hint: 'Run `clef-mcp install`.',\n });\n } else {\n const verify = await verifyModelFiles(manifest);\n let detail = `${manifest.quant} at ${manifest.modelPath} (${formatBytes(manifest.bytes)})`;\n let ok = verify.ok;\n if (ok && opts.deep) {\n const deep = await deepVerifyChecksum(manifest);\n ok = deep.ok;\n detail += deep.ok ? ' — checksum OK' : ` — ${deep.problems.join('; ')}`;\n } else if (ok) {\n detail += ' — size OK (use --deep to verify checksum)';\n }\n checks.push({\n name: 'Model',\n ok,\n detail,\n hint: ok ? undefined : 'Re-run `clef-mcp install` to re-download the model.',\n });\n checks.push({\n name: 'Model license',\n ok: true,\n informational: true,\n detail: `${spec.licenseId} — ${spec.licenseUrl}`,\n });\n }\n }\n\n // 6. Inference probe (end-to-end)\n if (config.runtime === 'mlx' && binaryPath && mlxManifest) {\n try {\n const probe = await probeMlxInference(config, mlxManifest, undefined, 240_000);\n checks.push({\n name: 'Inference',\n ok: true,\n detail: `probe decision returned in ${(probe.latencyMs / 1000).toFixed(1)}s (incl. model load)`,\n });\n } catch (err) {\n const clefErr = err instanceof ClefError ? err : undefined;\n checks.push({\n name: 'Inference',\n ok: false,\n detail: clefErr?.message ?? (err instanceof Error ? err.message : String(err)),\n hint: clefErr?.hint,\n });\n }\n } else if (config.runtime === 'llama-cpp' && binaryPath && manifest && (await verifyModelFiles(manifest)).ok) {\n try {\n const probe = await probeInference(config, manifest, undefined, 180_000);\n checks.push({\n name: 'Inference',\n ok: true,\n detail: `probe decision returned in ${(probe.latencyMs / 1000).toFixed(1)}s (incl. model load)`,\n });\n } catch (err) {\n const clefErr = err instanceof ClefError ? err : undefined;\n checks.push({\n name: 'Inference',\n ok: false,\n detail: clefErr?.message ?? (err instanceof Error ? err.message : String(err)),\n hint: clefErr?.hint ?? 'The installed llama.cpp build may lack clef support; update llama.cpp or run `clef-mcp install`.',\n });\n }\n } else {\n checks.push({\n name: 'Inference',\n ok: false,\n informational: true,\n detail: 'skipped (model or runtime missing)',\n });\n }\n\n // 7. MCP client configuration (informational)\n const mcpHints = await detectMcpConfigs();\n const configured = mcpHints.filter((h) => h.configured);\n checks.push({\n name: 'MCP client configuration',\n ok: true,\n informational: true,\n detail: configured.length\n ? configured.map((h) => `${h.client}: ${h.path}`).join('; ')\n : 'no clef-mcp registration found (add it to your client; see README)',\n });\n\n if (opts.json) {\n console.log(JSON.stringify({ clefHome: pathsFor(config.clefHome).root, modelCache: modelsDir, checks }, null, 2));\n } else {\n console.log(`clef-mcp doctor (cache: ${pathsFor(config.clefHome).root})\\n`);\n for (const check of checks) printCheck(check);\n }\n\n const failed = checks.filter((c) => !c.ok && !c.informational);\n if (!opts.json) {\n console.log(\n failed.length === 0\n ? '\\nAll critical checks passed.'\n : `\\n${failed.length} critical check(s) failed.`,\n );\n }\n return failed.length > 0;\n}\n","import { execFile } from 'node:child_process';\nimport os from 'node:os';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\n\nexport interface GpuInfo {\n name?: string;\n vramBytes?: number;\n}\n\nexport interface PlatformInfo {\n platform: NodeJS.Platform;\n arch: string;\n totalMemBytes: number;\n gpu?: GpuInfo;\n}\n\nfunction exec(cmd: string, args: string[], timeoutMs: number): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile(cmd, args, { timeout: timeoutMs, encoding: 'utf8' }, (err, stdout) => {\n if (err) reject(err);\n else resolve(stdout);\n });\n });\n}\n\nfunction parseSizeToBytes(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const m = raw.trim().match(/^([\\d.]+)\\s*(GB|MB|GiB|MiB|B)?$/i);\n if (!m) return undefined;\n const n = Number.parseFloat(m[1]!);\n if (!Number.isFinite(n)) return undefined;\n const unit = (m[2] ?? 'B').toLowerCase();\n const mult = unit === 'gb' || unit === 'gib' ? 1024 ** 3 : unit === 'mb' || unit === 'mib' ? 1024 ** 2 : 1;\n return Math.round(n * mult);\n}\n\nasync function gpuInfoDarwin(): Promise<GpuInfo | undefined> {\n try {\n const out = await exec('system_profiler', ['SPDisplaysDataType', '-json'], 10_000);\n const parsed = JSON.parse(out) as {\n SPDisplaysDataType?: Array<Record<string, unknown>>;\n };\n const gpu = parsed.SPDisplaysDataType?.[0];\n if (!gpu) return undefined;\n const info: GpuInfo = { name: typeof gpu.sppci_model === 'string' ? gpu.sppci_model : undefined };\n for (const key of ['spdisplays_vram_shared', 'spdisplays_vram']) {\n const bytes = parseSizeToBytes(typeof gpu[key] === 'string' ? (gpu[key] as string) : undefined);\n if (bytes) {\n info.vramBytes = bytes;\n break;\n }\n }\n return info;\n } catch {\n return undefined;\n }\n}\n\nasync function gpuInfoLinux(): Promise<GpuInfo | undefined> {\n try {\n const out = await exec('nvidia-smi', ['--query-gpu=name,memory.total', '--format=csv,noheader'], 5_000);\n const [name, mib] = out.trim().split(',').map((s) => s.trim());\n if (name && mib) return { name, vramBytes: Number.parseFloat(mib) * 1024 ** 2 };\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function detectPlatform(): Promise<PlatformInfo> {\n const platform = process.platform;\n const info: PlatformInfo = {\n platform,\n arch: process.arch,\n totalMemBytes: os.totalmem(),\n };\n if (platform === 'darwin') info.gpu = await gpuInfoDarwin();\n else if (platform === 'linux') info.gpu = await gpuInfoLinux();\n return info;\n}\n\n/** llama.cpp clef builds ship for these platforms; anything else is rejected early. */\nexport function assertSupportedPlatform(info: Pick<PlatformInfo, 'platform' | 'arch'>): void {\n const ok =\n (info.platform === 'darwin' && (info.arch === 'arm64' || info.arch === 'x64')) ||\n (info.platform === 'linux' && (info.arch === 'x64' || info.arch === 'arm64')) ||\n (info.platform === 'win32' && info.arch === 'x64');\n if (!ok) {\n throw new ClefError(\n ClefErrorCode.UNSUPPORTED_PLATFORM,\n `Unsupported platform: ${info.platform}/${info.arch}`,\n 'clef-mcp v0.1 supports macOS (arm64/x64), Linux (x64/arm64) and Windows x64.',\n );\n }\n}\n\nexport function formatBytes(bytes: number): string {\n const gib = bytes / 1024 ** 3;\n if (gib >= 1) return `${gib.toFixed(1)} GB`;\n return `${Math.round(bytes / 1024 ** 2)} MB`;\n}\n","import fs from 'node:fs/promises';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { ClefConfig } from '../config/env.js';\nimport type { Logger } from '../config/logger.js';\nimport type { MlxManifest } from '../models/mlx-install.js';\nimport { resolveUv } from '../models/mlx-install.js';\nimport type { ModelManifest } from '../models/manifest.js';\nimport { resolveLlamaServerBinary } from './binary.js';\nimport { LlamaCppRuntime } from './llama-cpp.js';\nimport { MlxRuntime } from './mlx.js';\n\nexport interface ProbeResult {\n latencyMs: number;\n binarySource: 'env' | 'managed' | 'path' | 'uv';\n binaryPath: string;\n}\n\n/**\n * Full end-to-end check: start the runtime with the installed model, run one\n * tiny decision, shut down. Used by `install` (verification) and `doctor`.\n */\nexport async function probeInference(\n cfg: ClefConfig,\n manifest: ModelManifest,\n log?: Logger,\n loadTimeoutMs = 120_000,\n): Promise<ProbeResult> {\n await fs.access(manifest.modelPath).catch(() => {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `Model file is missing: ${manifest.modelPath}`,\n 'Run `clef-mcp install` to (re-)download the model.',\n );\n });\n const binary = resolveLlamaServerBinary(cfg);\n const runtime = new LlamaCppRuntime({\n serverBin: binary.path,\n modelPath: manifest.modelPath,\n alias: manifest.model,\n loadTimeoutMs,\n log,\n });\n const started = Date.now();\n await runtime.load();\n try {\n await runtime.decide({\n model: manifest.model,\n state: 'This is an internal clef-mcp installation probe.',\n questions: {\n probe: { type: 'noul', instructions: 'Is this a clef-mcp installation probe?' },\n },\n });\n } finally {\n await runtime.unload();\n }\n return { latencyMs: Date.now() - started, binarySource: binary.source, binaryPath: binary.path };\n}\n\n/** Same end-to-end probe for the MLX runtime (uv + clef_mlx.py serve). */\nexport async function probeMlxInference(\n cfg: ClefConfig,\n manifest: MlxManifest,\n log?: Logger,\n loadTimeoutMs = 180_000,\n): Promise<ProbeResult> {\n const uvBin = resolveUv(process.env.CLEF_MLX_UV);\n const runtime = new MlxRuntime({ uvBin, snapshotPath: manifest.snapshotPath, loadTimeoutMs, log });\n const started = Date.now();\n await runtime.load();\n try {\n await runtime.decide({\n model: manifest.model,\n state: 'This is an internal clef-mcp installation probe.',\n questions: {\n probe: { type: 'noul', instructions: 'Is this a clef-mcp installation probe?' },\n },\n });\n } finally {\n await runtime.unload();\n }\n return { latencyMs: Date.now() - started, binarySource: 'uv', binaryPath: uvBin };\n}\n","import { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { loadConfig } from '../config/env.js';\nimport type { Logger } from '../config/logger.js';\nimport { createLogger } from '../config/logger.js';\nimport { ensureLlamaRuntime } from '../models/llama-install.js';\nimport { installModelMlx, type MlxManifest } from '../models/mlx-install.js';\nimport { installModel } from '../models/hf.js';\nimport { detectPlatform, formatBytes } from '../models/platform.js';\nimport { getModelSpec, pickQuant } from '../models/registry.js';\nimport type { ModelManifest } from '../models/manifest.js';\nimport { probeInference, probeMlxInference } from '../runtime/probe.js';\nimport { confirm } from './prompt.js';\nimport { VERSION } from '../version.js';\n\nexport interface InstallOptions {\n model?: string;\n quant?: string;\n yes?: boolean;\n skipRuntime?: boolean;\n skipProbe?: boolean;\n setup?: boolean;\n runtime?: string;\n}\n\nconst OS_NAMES: Record<string, string> = {\n darwin: 'macOS',\n linux: 'Linux',\n win32: 'Windows',\n};\n\nfunction prettyOs(platform: string): string {\n return OS_NAMES[platform] ?? platform;\n}\n\nfunction printProgress(downloaded: number, total?: number): void {\n const dl = formatBytes(downloaded);\n const line = total ? ` Downloading... ${dl} / ${formatBytes(total)}` : ` Downloading... ${dl}`;\n process.stderr.write(`\\r${line.padEnd(48)}`);\n}\n\nfunction printHeader(): void {\n console.log();\n}\n\nexport async function runInstall(opts: InstallOptions): Promise<void> {\n const config = loadConfig();\n const log: Logger = createLogger('info');\n const runtime = (opts.runtime ?? config.runtime) as 'llama-cpp' | 'mlx';\n if (runtime !== 'llama-cpp' && runtime !== 'mlx') {\n throw new ClefError(ClefErrorCode.INVALID_INPUT, `Unknown runtime \"${runtime}\".`, 'Available: llama-cpp, mlx');\n }\n\n printHeader();\n process.stdout.write('Detecting hardware...\\n');\n const info = await detectPlatform();\n\n const modelId = opts.model ?? config.model;\n const spec = getModelSpec(modelId);\n const quant = pickQuant(spec, info.totalMemBytes, opts.quant);\n\n const gpuLine = info.gpu?.name ? ` GPU: ${info.gpu.name}${info.gpu.vramBytes ? ` (${formatBytes(info.gpu.vramBytes)})` : ''}` : undefined;\n console.log('\\nDetected:');\n console.log(` OS: ${prettyOs(info.platform)}`);\n console.log(` Architecture: ${info.arch}`);\n console.log(` Memory: ${formatBytes(info.totalMemBytes)}`);\n if (gpuLine) console.log(gpuLine);\n if (runtime === 'mlx' && !(info.platform === 'darwin' && info.arch === 'arm64')) {\n throw new ClefError(\n ClefErrorCode.UNSUPPORTED_PLATFORM,\n 'The MLX runtime only works on Apple Silicon (macOS/arm64).',\n 'Use the default llama.cpp runtime (omit --runtime).',\n );\n }\n\n console.log('\\nRecommended:');\n console.log(` Model: ${spec.id} (${runtime === 'mlx' ? 'mlx-community/clef-flash-4bit' : spec.repo})`);\n console.log(` Runtime: ${runtime}`);\n if (runtime === 'llama-cpp') console.log(` Quantization: ${quant.id}`);\n console.log(` Download size: ~${runtime === 'mlx' ? '6.2 GB' : formatBytes(quant.bytes)}`);\n console.log(`\\nModel license: ${spec.licenseId} — ${spec.licenseUrl}`);\n console.log('The model is downloaded from the official conversion and is not repackaged by clef-mcp.\\n');\n\n const ok = await confirm('Continue?', opts.yes === true);\n if (!ok) {\n console.log('Aborted. Nothing was downloaded.');\n return;\n }\n\n let llamaManifest: ModelManifest | undefined;\n let mlxManifest: MlxManifest | undefined;\n\n if (runtime === 'mlx') {\n console.log('\\nDownloading MLX model snapshot (uv-managed; weights ~6 GB)...\\n');\n mlxManifest = await installModelMlx({ clefHome: config.clefHome, clefMcpVersion: VERSION, log });\n console.log(` Installed: ${mlxManifest.snapshotPath}`);\n } else {\n if (!opts.skipRuntime) {\n process.stdout.write('\\nEnsuring llama.cpp runtime...\\n');\n const rt = await ensureLlamaRuntime(config, log);\n console.log(` Runtime: llama.cpp (${rt.source}, ${rt.releaseTag})`);\n console.log(` Binary: ${rt.path}`);\n }\n\n console.log('');\n const installed = await installModel({\n clefHome: config.clefHome,\n modelSpec: spec,\n quantSpec: quant,\n clefMcpVersion: VERSION,\n onProgress: (p) => printProgress(p.bytes, p.total),\n log,\n });\n process.stderr.write('\\n');\n console.log(installed.alreadyInstalled ? ` Model already installed: ${installed.manifest.modelPath}` : ` Installed: ${installed.manifest.modelPath}`);\n console.log(` sha256: ${installed.manifest.sha256 ?? 'n/a (not advertised upstream)'}`);\n llamaManifest = installed.manifest;\n }\n\n if (!opts.skipProbe) {\n process.stdout.write('\\nVerifying inference (loads the model; first run can take a few minutes)...\\n');\n const probe =\n runtime === 'mlx'\n ? await probeMlxInference(config, mlxManifest!, log)\n : await probeInference(config, llamaManifest!, log);\n console.log(` Inference OK (${(probe.latencyMs / 1000).toFixed(1)}s incl. model load)`);\n }\n\n if (opts.setup) {\n const { runSetup } = await import('./setup.js');\n console.log('');\n await runSetup({ yes: opts.yes });\n return;\n }\n\n console.log('\\nDone. Start the MCP server with:\\n\\n clef-mcp\\n');\n console.log('Register it with your agents (or run `clef-mcp setup` to do it automatically):\\n');\n console.log(' Claude Code : claude mcp add clef-mcp -- clef-mcp');\n console.log(' Codex : add [mcp_servers.clef-mcp] to ~/.codex/config.toml (see README)');\n console.log(' Cursor : add clef-mcp to .cursor/mcp.json (see README)');\n console.log(' ZCode : add clef-mcp to ~/.zcode/cli/config.json (see README)');\n if (runtime === 'mlx') {\n console.log('\\nNote: set CLEF_RUNTIME=mlx for the server (and MCP clients) to use the MLX runtime.');\n }\n}\n","import { execFile } from 'node:child_process';\nimport type { Dirent } from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { ClefConfig } from '../config/env.js';\nimport type { Logger } from '../config/logger.js';\nimport { llamaRuntimeDir, llamaServerName, pathsFor } from '../config/paths.js';\nimport { downloadFile } from './hf.js';\nimport { writeRuntimeManifest, readRuntimeManifest } from './manifest.js';\nimport { resolveLlamaServerBinary, type ResolvedBinary } from '../runtime/binary.js';\n\nconst GITHUB_API = 'https://api.github.com/repos/ggml-org/llama.cpp';\n\ninterface GhRelease {\n tag_name: string;\n published_at?: string;\n assets: Array<{ name: string; size: number; browser_download_url: string }>;\n}\n\nasync function ghJson<T>(url: string): Promise<T> {\n let res: Response;\n try {\n res = await fetch(url, {\n headers: { accept: 'application/vnd.github+json', 'user-agent': 'clef-mcp' },\n });\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Could not reach GitHub: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n if (!res.ok) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `GitHub API returned HTTP ${res.status} for ${url}`,\n res.status === 403 ? 'GitHub API rate limit may be hit; install llama.cpp manually and retry.' : undefined,\n );\n }\n return (await res.json()) as T;\n}\n\ninterface AssetPattern {\n match: RegExp;\n /** Prefer the first pattern that matches, in order. */\n alternates?: RegExp[];\n}\n\n/** Official nightly asset naming: `llama-bNNNNN-bin-macos-arm64.tar.gz`, `llama-bin-win-cuda-...-x64.zip`, etc. */\nfunction assetPatterns(platform: string, arch: string): AssetPattern {\n switch (platform) {\n case 'darwin':\n return arch === 'arm64'\n ? { match: /^llama-.*-bin-macos-arm64\\.tar\\.gz$/ }\n : { match: /^llama-.*-bin-macos-x64\\.tar\\.gz$/ };\n case 'linux':\n return arch === 'arm64'\n ? { match: /^llama-.*-bin-ubuntu-arm64\\.tar\\.gz$/ }\n : { match: /^llama-.*-bin-ubuntu-x64\\.tar\\.gz$/ };\n case 'win32':\n // CPU builds only; CUDA/Vulkan need extra runtime deps. Prefer avx2.\n return {\n match: /^llama-.*-bin-win-avx2-x64\\.zip$/,\n alternates: [/^llama-.*-bin-win-noavx-x64\\.zip$/, /^llama-.*-bin-win-x64\\.zip$/],\n };\n default:\n throw new ClefError(ClefErrorCode.UNSUPPORTED_PLATFORM, `Unsupported platform ${platform}/${arch}`);\n }\n}\n\nfunction pickAsset(release: GhRelease, platform: string, arch: string): GhRelease['assets'][number] {\n const { match, alternates } = assetPatterns(platform, arch);\n const names = release.assets.map((a) => a.name.toLowerCase());\n const find = (re: RegExp) => release.assets[names.findIndex((n) => re.test(n))];\n const asset = find(match) ?? alternates?.map(find).find(Boolean);\n if (!asset) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `No llama.cpp release asset for ${platform}/${arch} in ${release.tag_name}`,\n 'Install llama.cpp manually (`brew install llama.cpp` or https://llama.app) and re-run install.',\n );\n }\n return asset;\n}\n\nfunction execTar(args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n execFile('tar', args, { cwd, timeout: 300_000 }, (err, _stdout, stderr) => {\n if (err) reject(new Error(`tar ${args.join(' ')} failed: ${stderr || err.message}`));\n else resolve();\n });\n });\n}\n\nasync function findServerBinary(dir: string, platform: string): Promise<string> {\n const target = llamaServerName(platform);\n const queue = [dir];\n while (queue.length > 0) {\n const current = queue.shift()!;\n let entries: Dirent[];\n try {\n entries = await fsp.readdir(current, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) queue.push(full);\n else if (entry.name === target) return full;\n }\n }\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Extracted llama.cpp release did not contain ${target}`,\n );\n}\n\nasync function extractRelease(archivePath: string, destDir: string, platform: string): Promise<void> {\n await fsp.mkdir(destDir, { recursive: true });\n const args = archivePath.endsWith('.zip')\n ? ['-xf', archivePath]\n : ['-xzf', archivePath];\n try {\n await execTar(args, destDir);\n } catch (err) {\n // GNU tar (common on Linux) cannot read zip; surface a clear hint.\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Could not extract ${path.basename(archivePath)}: ${err instanceof Error ? err.message : String(err)}`,\n 'Extract the archive manually and point CLEF_LLAMA_BIN at llama-server.',\n );\n }\n}\n\nexport interface ManagedRuntimeResult extends ResolvedBinary {\n releaseTag: string;\n freshInstall: boolean;\n}\n\n/**\n * Ensure a llama-server binary exists: resolve env/managed/PATH first, else\n * download the official ggml-org nightly build into CLEF_HOME/runtime.\n */\nexport async function ensureLlamaRuntime(cfg: ClefConfig, log?: Logger): Promise<ManagedRuntimeResult> {\n try {\n const resolved = resolveLlamaServerBinary(cfg);\n if (resolved.source === 'managed') {\n const platformDir = llamaRuntimeDir(pathsFor(cfg.clefHome).runtimeDir, process.platform, process.arch);\n const manifest = readRuntimeManifest(path.join(platformDir, 'runtime-manifest.json'));\n return { ...resolved, releaseTag: manifest?.releaseTag ?? 'unknown', freshInstall: false };\n }\n return { ...resolved, releaseTag: resolved.source, freshInstall: false };\n } catch (err) {\n if (!(err instanceof ClefError) || err.code !== ClefErrorCode.RUNTIME_NOT_FOUND) throw err;\n }\n const fresh = await downloadManagedLlama(cfg, log);\n return { ...fresh, freshInstall: true };\n}\n\nexport async function downloadManagedLlama(cfg: ClefConfig, log?: Logger): Promise<ResolvedBinary & { releaseTag: string }> {\n const platform = process.platform;\n const arch = process.arch;\n const { runtimeDir } = pathsFor(cfg.clefHome);\n const platformDir = llamaRuntimeDir(runtimeDir, platform, arch);\n\n let release: GhRelease;\n if (cfg.llamaReleaseTag) {\n release = await ghJson<GhRelease>(`${GITHUB_API}/releases/tags/${cfg.llamaReleaseTag}`);\n } else {\n const releases = await ghJson<GhRelease[]>(`${GITHUB_API}/releases?per_page=15`);\n const nightly = releases.find((r) => /^b\\d+$/.test(r.tag_name));\n if (!nightly) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n 'No llama.cpp nightly release found on GitHub.',\n 'Install llama.cpp manually (`brew install llama.cpp` or https://llama.app) and re-run install.',\n );\n }\n release = nightly;\n }\n\n const asset = pickAsset(release, platform, arch);\n log?.info('downloading llama.cpp runtime', { tag: release.tag_name, asset: asset.name });\n // The macOS builds link ggml/llama dylibs via @rpath, so the binary must\n // stay inside its release layout: extract into <platformDir>/<tag>/ and\n // record the real path in the manifest instead of moving it out.\n const tagDir = path.join(platformDir, release.tag_name);\n await fsp.mkdir(tagDir, { recursive: true });\n const tmpArchive = path.join(platformDir, `.download-${asset.name}`);\n await fsp.rm(tmpArchive, { force: true });\n const result = await downloadFile(asset.browser_download_url, tmpArchive, { expectedSize: asset.size, attempts: 3 });\n await extractRelease(tmpArchive, tagDir, platform);\n await fsp.rm(tmpArchive, { force: true });\n\n const binaryPath = await findServerBinary(tagDir, platform);\n if (platform !== 'win32') await fsp.chmod(binaryPath, 0o755);\n\n await writeRuntimeManifest(path.join(platformDir, 'runtime-manifest.json'), {\n schemaVersion: 1,\n kind: 'llama-cpp',\n releaseTag: release.tag_name,\n asset: asset.name,\n bytes: result.bytes,\n binaryPath,\n installedAt: new Date().toISOString(),\n });\n log?.info('llama.cpp runtime installed', { tag: release.tag_name, path: binaryPath });\n return { source: 'managed', path: binaryPath, releaseTag: release.tag_name };\n}\n\n/** Remove the managed llama.cpp runtime directory, if present. */\nexport async function removeManagedRuntime(cfg: ClefConfig): Promise<boolean> {\n const { runtimeDir } = pathsFor(cfg.clefHome);\n const dir = llamaRuntimeDir(runtimeDir, process.platform, process.arch);\n try {\n await fsp.stat(dir);\n } catch {\n return false;\n }\n await fsp.rm(dir, { recursive: true, force: true });\n return true;\n}\n","import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { manifestPathFor, pathsFor } from '../config/paths.js';\nimport type { Logger } from '../config/logger.js';\nimport { writeModelManifest, readModelManifest, verifyModelFiles, type ModelManifest } from './manifest.js';\nimport { getQuantSpec, type ModelSpec, type QuantSpec } from './registry.js';\n\nexport const HF_BASE_URL = 'https://huggingface.co';\n\nexport function resolveUrl(repo: string, revision: string, file: string): string {\n return `${HF_BASE_URL}/${repo}/resolve/${revision}/${file}`;\n}\n\nexport interface HfFileInfo {\n downloadUrl: string;\n /** sha256 from the HF xet/LFS hash, when advertised. */\n sha256?: string;\n size?: number;\n}\n\n/**\n * Resolve download URL + expected checksum. The sha256 arrives as the\n * `x-linked-etag` header on HF's 302, so we probe with redirect: 'manual'.\n */\nexport async function fetchFileInfo(repo: string, revision: string, file: string): Promise<HfFileInfo> {\n const url = resolveUrl(repo, revision, file);\n let res: Response;\n try {\n res = await fetch(url, { method: 'HEAD', redirect: 'manual' });\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Could not reach Hugging Face: ${err instanceof Error ? err.message : String(err)}`,\n 'Check network connectivity and try again.',\n );\n }\n // 302 → metadata lives on the redirect response; some CDN configs answer 200 directly.\n if (res.status !== 302 && res.status !== 200) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Hugging Face returned HTTP ${res.status} for ${repo}@${revision}/${file}`,\n res.status === 404 ? 'The pinned model revision may have moved. Re-check the model registry.' : undefined,\n );\n }\n const sha256 = res.headers.get('x-linked-etag')?.replace(/\"/g, '');\n const size = res.headers.get('x-linked-size') ? Number(res.headers.get('x-linked-size')) : undefined;\n return {\n downloadUrl: res.headers.get('location') ?? url,\n sha256: sha256 && /^[0-9a-f]{64}$/i.test(sha256) ? sha256 : undefined,\n size: Number.isFinite(size) ? size : undefined,\n };\n}\n\nexport interface DownloadProgress {\n bytes: number;\n total?: number;\n}\n\nexport interface DownloadOptions {\n expectedSha256?: string;\n expectedSize?: number;\n onProgress?(p: DownloadProgress): void;\n signal?: AbortSignal;\n attempts?: number;\n}\n\nexport interface DownloadResult {\n bytes: number;\n sha256: string;\n}\n\n/**\n * Stream a file to dest, hashing while writing. Retries transient failures by\n * restarting the download; checksum/size mismatches fail hard.\n */\nexport async function downloadFile(url: string, dest: string, opts: DownloadOptions = {}): Promise<DownloadResult> {\n const attempts = opts.attempts ?? 3;\n let lastError: unknown;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await downloadOnce(url, dest, opts);\n } catch (err) {\n if (err instanceof ClefError && err.code === ClefErrorCode.CHECKSUM_MISMATCH) throw err;\n lastError = err;\n if (attempt < attempts) {\n await new Promise((r) => setTimeout(r, 1000 * 2 ** (attempt - 1)));\n }\n }\n }\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Download failed after ${attempts} attempts: ${lastError instanceof Error ? lastError.message : String(lastError)}`,\n );\n}\n\nasync function downloadOnce(url: string, dest: string, opts: DownloadOptions): Promise<DownloadResult> {\n const res = await fetch(url, { redirect: 'follow', signal: opts.signal });\n if (!res.ok || !res.body) {\n throw new Error(`HTTP ${res.status}`);\n }\n const total = opts.expectedSize ?? (res.headers.get('content-length') ? Number(res.headers.get('content-length')) : undefined);\n const hash = createHash('sha256');\n const handle = await fsp.open(dest, 'w');\n let bytes = 0;\n try {\n for await (const chunk of res.body) {\n const buf = chunk as Buffer;\n hash.update(buf);\n await handle.write(buf);\n bytes += buf.length;\n opts.onProgress?.({ bytes, total });\n }\n } finally {\n await handle.close();\n }\n const sha256 = hash.digest('hex');\n if (opts.expectedSha256 && sha256 !== opts.expectedSha256) {\n await fsp.rm(dest, { force: true });\n throw new ClefError(\n ClefErrorCode.CHECKSUM_MISMATCH,\n `Checksum mismatch after download: expected ${opts.expectedSha256}, got ${sha256}`,\n 'The download was discarded. Re-run `clef-mcp install`.',\n );\n }\n if (opts.expectedSize !== undefined && bytes !== opts.expectedSize) {\n await fsp.rm(dest, { force: true });\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Downloaded size mismatch: expected ${opts.expectedSize} bytes, got ${bytes}`,\n );\n }\n return { bytes, sha256 };\n}\n\nexport interface InstallModelOptions {\n clefHome: string;\n modelSpec: ModelSpec;\n quantSpec: QuantSpec;\n clefMcpVersion: string;\n onProgress?(p: DownloadProgress): void;\n log?: Logger;\n}\n\nexport interface InstallModelResult {\n manifest: ModelManifest;\n alreadyInstalled: boolean;\n}\n\n/**\n * Download a model quantization from its pinned HF revision, verify checksum,\n * and write the manifest. Safe to re-run: an intact install is a no-op.\n */\nexport async function installModel(opts: InstallModelOptions): Promise<InstallModelResult> {\n const { modelSpec, quantSpec } = opts;\n const { modelsDir } = pathsFor(opts.clefHome);\n const manifestPath = manifestPathFor(modelsDir, modelSpec.id, quantSpec.id);\n const existing = await readModelManifest(manifestPath);\n if (existing && (await verifyModelFiles(existing)).ok) {\n opts.log?.debug('model already installed', { model: modelSpec.id, quant: quantSpec.id });\n return { manifest: existing, alreadyInstalled: true };\n }\n\n const info = await fetchFileInfo(modelSpec.repo, modelSpec.revision, quantSpec.file);\n const finalPath = path.join(path.dirname(manifestPath), quantSpec.file);\n await fsp.mkdir(path.dirname(finalPath), { recursive: true });\n const tmpPath = path.join(path.dirname(finalPath), `.download-${quantSpec.file}`);\n await fsp.rm(tmpPath, { force: true });\n\n opts.log?.info('downloading model', { repo: modelSpec.repo, file: quantSpec.file });\n const result = await downloadFile(info.downloadUrl, tmpPath, {\n expectedSha256: info.sha256,\n expectedSize: info.size ?? quantSpec.bytes,\n onProgress: opts.onProgress,\n });\n await fsp.rename(tmpPath, finalPath);\n\n const manifest: ModelManifest = {\n schemaVersion: 1,\n model: modelSpec.id,\n quant: quantSpec.id,\n file: quantSpec.file,\n modelPath: finalPath,\n bytes: result.bytes,\n sha256: result.sha256,\n repo: modelSpec.repo,\n revision: modelSpec.revision,\n licenseId: modelSpec.licenseId,\n licenseUrl: modelSpec.licenseUrl,\n installedAt: new Date().toISOString(),\n clefMcpVersion: opts.clefMcpVersion,\n };\n await writeModelManifest(manifestPath, manifest);\n opts.log?.info('model installed', { model: modelSpec.id, quant: quantSpec.id, sha256: result.sha256 });\n return { manifest, alreadyInstalled: false };\n}\n","export const VERSION = '0.2.1';\n","import { loadConfig } from '../config/env.js';\nimport { pathsFor } from '../config/paths.js';\nimport { quantIsInstalled } from '../models/manifest.js';\nimport { formatBytes } from '../models/platform.js';\nimport { MODELS } from '../models/registry.js';\n\nexport async function runModels(): Promise<void> {\n const config = loadConfig();\n const { modelsDir } = pathsFor(config.clefHome);\n console.log(`Cache home: ${pathsFor(config.clefHome).root}\\n`);\n for (const spec of Object.values(MODELS)) {\n console.log(`${spec.id} (${spec.repo}, ${spec.licenseId})`);\n for (const quant of spec.quants) {\n const installed = await quantIsInstalled(config.clefHome, spec, quant);\n const defaultMark = quant.id === spec.defaultQuant ? ' [default]' : '';\n console.log(` ${quant.id.padEnd(8)} ~${formatBytes(quant.bytes).padStart(8)} ${installed ? 'installed' : 'not installed'}${defaultMark}`);\n }\n console.log();\n }\n}\n","import { ClefError } from '../clef/errors.js';\nimport { loadConfig } from '../config/env.js';\nimport { pathsFor } from '../config/paths.js';\nimport { findInstalledManifest } from '../models/manifest.js';\nimport { detectPlatform, formatBytes } from '../models/platform.js';\nimport { getModelSpec } from '../models/registry.js';\nimport { mlxIsInstalled, resolveUv } from '../models/mlx-install.js';\nimport { resolveLlamaServerBinary } from '../runtime/binary.js';\n\nexport async function runStatus(): Promise<void> {\n const config = loadConfig();\n const info = await detectPlatform();\n\n let spec;\n try {\n spec = getModelSpec(config.model);\n } catch (err) {\n if (err instanceof ClefError && err.code === 'INVALID_INPUT') {\n console.log(`Runtime: ${config.runtime}`);\n console.log(`Model: ${config.model} (unknown model id)`);\n console.log('Model status: unknown');\n console.log(`Memory: ${formatBytes(info.totalMemBytes)}`);\n return;\n }\n throw err;\n }\n\n if (config.runtime === 'mlx') {\n const mlx = await mlxIsInstalled(config.clefHome);\n let uvLine = 'not found (install: curl -LsSf https://astral.sh/uv/install.sh | sh)';\n try {\n uvLine = `uv: ${resolveUv(process.env.CLEF_MLX_UV)}`;\n } catch (err) {\n uvLine = `not found — ${(err as Error).message.split('\\n')[0]}`;\n }\n console.log(`Runtime: mlx (${uvLine})`);\n console.log(`Model: ${spec.id}${mlx ? ' (MLX 4-bit)' : ''}`);\n console.log(`Model status: ${mlx ? 'installed' : 'not installed (run: clef-mcp install --runtime mlx)'}`);\n console.log(`Memory: ${formatBytes(info.totalMemBytes)}`);\n if (mlx) {\n console.log(`Snapshot: ${mlx.snapshotPath}`);\n console.log(`Installed: ${mlx.installedAt}`);\n } else {\n console.log(`Cache home: ${pathsFor(config.clefHome).root}`);\n }\n return;\n }\n\n const manifest = await findInstalledManifest(config.clefHome, spec);\n\n let runtimeLine: string;\n try {\n const binary = resolveLlamaServerBinary(config);\n runtimeLine = `ready (llama.cpp via ${binary.source}: ${binary.path})`;\n } catch (err) {\n const structured = (err as ClefError).hint ? `${(err as ClefError).message}` : String(err);\n runtimeLine = `not found — ${structured}`;\n }\n\n console.log(`Runtime: llama.cpp`);\n console.log(`Model: ${spec.id}${manifest ? ` ${manifest.quant}` : ''}`);\n console.log(`Model status: ${manifest ? 'installed' : 'not installed (run: clef-mcp install)'}`);\n console.log(`Runtime status: ${runtimeLine}`);\n console.log(`Memory: ${formatBytes(info.totalMemBytes)}`);\n if (manifest) {\n console.log(`Model path: ${manifest.modelPath}`);\n console.log(`Installed: ${manifest.installedAt}`);\n } else {\n console.log(`Cache home: ${pathsFor(config.clefHome).root}`);\n }\n}\n","import fsp from 'node:fs/promises';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { loadConfig } from '../config/env.js';\nimport { modelQuantDir, pathsFor } from '../config/paths.js';\nimport { findInstalledManifest } from '../models/manifest.js';\nimport { formatBytes } from '../models/platform.js';\nimport { getModelSpec } from '../models/registry.js';\nimport { removeManagedRuntime } from '../models/llama-install.js';\nimport { mlxIsInstalled, removeMlxModel } from '../models/mlx-install.js';\nimport { confirm } from './prompt.js';\n\nexport interface UninstallOptions {\n model?: string;\n runtime?: boolean;\n yes?: boolean;\n}\n\nexport async function runUninstall(opts: UninstallOptions): Promise<void> {\n const config = loadConfig();\n const spec = getModelSpec(opts.model ?? config.model);\n const { modelsDir } = pathsFor(config.clefHome);\n\n if (config.runtime === 'mlx') {\n const mlx = await mlxIsInstalled(config.clefHome);\n if (!mlx) {\n throw new ClefError(ClefErrorCode.MODEL_NOT_INSTALLED, 'The MLX model is not installed.', 'Nothing to remove.');\n }\n const ok = await confirm(`Remove the MLX snapshot for ${spec.id}?`, opts.yes === true);\n if (!ok) {\n console.log('Aborted.');\n return;\n }\n await removeMlxModel(config.clefHome);\n console.log('Removed MLX snapshot.');\n return;\n }\n\n const manifest = await findInstalledManifest(config.clefHome, spec);\n\n if (!manifest && !opts.runtime) {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `${spec.id} is not installed.`,\n 'Nothing to remove. Use --runtime to also remove the managed llama.cpp runtime.',\n );\n }\n\n const target = manifest ? modelQuantDir(modelsDir, spec.id, manifest.quant) : undefined;\n const sizeLine = manifest ? ` (${formatBytes(manifest.bytes)})` : '';\n const ok = await confirm(\n `Remove ${spec.id}${manifest ? ` ${manifest.quant}` : ''}${sizeLine}${opts.runtime ? ' and the managed runtime' : ''}?`,\n opts.yes === true,\n );\n if (!ok) {\n console.log('Aborted.');\n return;\n }\n\n if (target) {\n await fsp.rm(target, { recursive: true, force: true });\n console.log(`Removed: ${target}`);\n }\n if (opts.runtime) {\n const removed = await removeManagedRuntime(config);\n console.log(removed ? 'Removed managed llama.cpp runtime.' : 'No managed runtime found.');\n }\n}\n"],"mappings":"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","names":["execFile","fsSync","fsp","os","path","fileURLToPath","mark","path","path","manifestPath","path","fsp","path","path","fsp","fs","path","fs","path","spawn","net","STDERR_TAIL_LIMIT","freePort","fetchWithTimeout","OOM_PATTERNS","z","fsSync","fsp","fsp","fsSync","path","path","fsSync","fsp","fsp","manifest","runtime","loadStarted","execFile","os","fsp","path","execFile","os","fs","fs","execFile","os","path","fsp","execFile","fsp","path","createHash","fsp","path","createHash","fsp","manifestPath","path","execFile","fsp","path","runSetup","fsp","ok","fsp"]}
|
|
1
|
+
{"version":3,"sources":["../src/clef/errors.ts","../src/cli/prompt.ts","../src/cli/setup.ts","../src/cli/index.ts","../src/mcp/server.ts","../src/clef/systemone.ts","../src/config/env.ts","../src/config/limits.ts","../src/config/logger.ts","../src/models/registry.ts","../src/runtime/loader.ts","../src/models/manifest.ts","../src/config/paths.ts","../src/models/mlx-install.ts","../src/runtime/binary.ts","../src/runtime/llama-cpp.ts","../src/runtime/mlx.ts","../src/mcp/schema.ts","../src/mcp/prompts.ts","../src/mcp/resources.ts","../src/cli/evals.ts","../src/daemon/daemon.ts","../src/cli/decide.ts","../src/daemon/client.ts","../src/cli/doctor.ts","../src/models/platform.ts","../src/runtime/probe.ts","../src/cli/install.ts","../src/models/llama-install.ts","../src/models/hf.ts","../src/version.ts","../src/cli/models-cmd.ts","../src/cli/status.ts","../src/cli/uninstall.ts"],"sourcesContent":["export const ClefErrorCode = {\n MODEL_NOT_INSTALLED: 'MODEL_NOT_INSTALLED',\n MODEL_LOAD_FAILED: 'MODEL_LOAD_FAILED',\n RUNTIME_NOT_FOUND: 'RUNTIME_NOT_FOUND',\n RUNTIME_INIT_FAILED: 'RUNTIME_INIT_FAILED',\n RUNTIME_NOT_SUPPORTED: 'RUNTIME_NOT_SUPPORTED',\n INVALID_INPUT: 'INVALID_INPUT',\n CLEF_INFERENCE_FAILED: 'CLEF_INFERENCE_FAILED',\n UNSUPPORTED_PLATFORM: 'UNSUPPORTED_PLATFORM',\n OUT_OF_MEMORY: 'OUT_OF_MEMORY',\n CHECKSUM_MISMATCH: 'CHECKSUM_MISMATCH',\n DOWNLOAD_FAILED: 'DOWNLOAD_FAILED',\n} as const;\n\nexport type ClefErrorCode = (typeof ClefErrorCode)[keyof typeof ClefErrorCode];\n\nexport class ClefError extends Error {\n readonly code: ClefErrorCode;\n readonly hint?: string;\n\n constructor(code: ClefErrorCode, message: string, hint?: string) {\n super(message);\n this.name = 'ClefError';\n this.code = code;\n this.hint = hint;\n }\n}\n\nexport interface StructuredError {\n error: {\n code: ClefErrorCode;\n message: string;\n hint?: string;\n };\n}\n\n/** Serialized form used both in MCP tool results and CLI output. */\nexport function errorJson(err: unknown): StructuredError {\n if (err instanceof ClefError) {\n return {\n error: {\n code: err.code,\n message: err.message,\n ...(err.hint ? { hint: err.hint } : {}),\n },\n };\n }\n const message = err instanceof Error ? err.message : String(err);\n return { error: { code: ClefErrorCode.CLEF_INFERENCE_FAILED, message } };\n}\n\nexport function toClefError(err: unknown): ClefError {\n if (err instanceof ClefError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new ClefError(ClefErrorCode.CLEF_INFERENCE_FAILED, message);\n}\n\n/** Exit codes for CLI commands. */\nexport function exitCodeFor(err: unknown): number {\n if (err instanceof ClefError) {\n switch (err.code) {\n case ClefErrorCode.INVALID_INPUT:\n return 2;\n case ClefErrorCode.MODEL_NOT_INSTALLED:\n return 3;\n case ClefErrorCode.RUNTIME_NOT_FOUND:\n case ClefErrorCode.RUNTIME_NOT_SUPPORTED:\n return 4;\n default:\n return 1;\n }\n }\n return 1;\n}\n","import readline from 'node:readline/promises';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\n\n/** `[Y/n]` confirmation. Requires --yes in non-interactive contexts. */\nexport async function confirm(question: string, yes: boolean): Promise<boolean> {\n if (yes) return true;\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n 'Refusing to proceed interactively without a terminal.',\n 'Re-run with --yes to confirm non-interactively.',\n );\n }\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n try {\n const answer = (await rl.question(`${question} [Y/n] `)).trim().toLowerCase();\n return answer === '' || answer === 'y' || answer === 'yes';\n } finally {\n rl.close();\n }\n}\n","import { execFile } from 'node:child_process';\nimport fsSync from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { confirm } from './prompt.js';\n\nexport const SERVER_ENTRY = { command: 'clef-mcp', args: [], type: 'stdio' } as const;\n\nexport type SetupClient = 'zcode' | 'claude-code' | 'codex' | 'cursor';\n\nexport interface SetupOptions {\n clients?: string;\n skill?: boolean;\n noSkill?: boolean;\n yes?: boolean;\n}\n\nexport interface SetupReport {\n client: SetupClient | 'skill';\n status: 'configured' | 'already-configured' | 'skipped' | 'manual-hint';\n detail: string;\n}\n\nconst HOME = () => os.homedir();\n\nfunction bundledSkillPath(): string {\n // dist/cli.js → ../skills/clef-decisions/SKILL.md (shipped via npm \"files\").\n return fileURLToPath(new URL('../skills/clef-decisions/SKILL.md', import.meta.url));\n}\n\nasync function mergeJsonServerEntry(file: string, serverKey: string, container: 'mcp.servers' | 'mcpServers'): Promise<'configured' | 'already-configured'> {\n let doc: Record<string, unknown> = {};\n try {\n doc = JSON.parse(await fsp.readFile(file, 'utf8')) as Record<string, unknown>;\n } catch {\n doc = {};\n }\n if (container === 'mcp.servers') {\n const mcp = (doc.mcp as Record<string, unknown> | undefined) ?? {};\n const servers = (mcp.servers as Record<string, unknown> | undefined) ?? {};\n if (servers[serverKey]) return 'already-configured';\n servers[serverKey] = { ...SERVER_ENTRY };\n mcp.servers = servers;\n doc.mcp = mcp;\n } else {\n const servers = (doc.mcpServers as Record<string, unknown> | undefined) ?? {};\n if (servers[serverKey]) return 'already-configured';\n servers[serverKey] = { command: SERVER_ENTRY.command, args: [...SERVER_ENTRY.args] };\n doc.mcpServers = servers;\n }\n await fsp.mkdir(path.dirname(file), { recursive: true });\n await fsp.writeFile(file, JSON.stringify(doc, null, 2) + '\\n', 'utf8');\n return 'configured';\n}\n\nconst CODEX_SECTION = [\n '[mcp_servers.clef-mcp]',\n 'command = \"clef-mcp\"',\n 'args = []',\n '',\n].join('\\n');\n\nasync function setupCodex(): Promise<SetupReport> {\n const file = path.join(HOME(), '.codex', 'config.toml');\n let content = '';\n try {\n content = await fsp.readFile(file, 'utf8');\n } catch {\n content = '';\n }\n if (content.includes('[mcp_servers.clef-mcp]')) {\n return { client: 'codex', status: 'already-configured', detail: file };\n }\n const next = (content && !content.endsWith('\\n') ? content + '\\n' : content) + '\\n' + CODEX_SECTION;\n await fsp.mkdir(path.dirname(file), { recursive: true });\n await fsp.writeFile(file, next, 'utf8');\n return { client: 'codex', status: 'configured', detail: file };\n}\n\nasync function setupZcode(): Promise<SetupReport> {\n const file = path.join(HOME(), '.zcode', 'cli', 'config.json');\n const status = await mergeJsonServerEntry(file, 'clef-mcp', 'mcp.servers');\n return { client: 'zcode', status, detail: file };\n}\n\nasync function setupCursor(): Promise<SetupReport> {\n const file = path.join(HOME(), '.cursor', 'mcp.json');\n const status = await mergeJsonServerEntry(file, 'clef-mcp', 'mcpServers');\n return { client: 'cursor', status, detail: file };\n}\n\nfunction whichCli(bin: string): string | undefined {\n const dirs = (process.env.PATH ?? '').split(path.delimiter).filter(Boolean);\n for (const dir of dirs) {\n const candidate = path.join(dir, bin);\n try {\n fsSync.accessSync(candidate, fsSync.constants.X_OK);\n return candidate;\n } catch {\n // keep scanning\n }\n }\n return undefined;\n}\n\nasync function setupClaudeCode(): Promise<SetupReport> {\n const claude = whichCli('claude');\n if (!claude) {\n return {\n client: 'claude-code',\n status: 'manual-hint',\n detail: 'claude CLI not found — run manually: claude mcp add clef-mcp -- clef-mcp',\n };\n }\n const existing = await new Promise<string>((resolve) => {\n execFile(claude, ['mcp', 'list'], { timeout: 30_000, encoding: 'utf8' }, (_err, stdout) => resolve(String(stdout)));\n });\n if (existing.includes('clef-mcp')) {\n return { client: 'claude-code', status: 'already-configured', detail: 'claude mcp list' };\n }\n await new Promise<void>((resolve, reject) => {\n execFile(claude, ['mcp', 'add', '--scope', 'user', 'clef-mcp', '--', 'clef-mcp'], { timeout: 60_000, encoding: 'utf8' }, (err) =>\n err ? reject(err) : resolve(),\n );\n });\n return { client: 'claude-code', status: 'configured', detail: 'claude mcp add --scope user' };\n}\n\nexport async function installSkill(): Promise<SetupReport> {\n const src = bundledSkillPath();\n const destDir = path.join(HOME(), '.agents', 'skills', 'clef-decisions');\n const dest = path.join(destDir, 'SKILL.md');\n let content = '';\n try {\n content = await fsp.readFile(dest, 'utf8');\n } catch {\n // not installed yet\n }\n const incoming = await fsp.readFile(src, 'utf8');\n if (content === incoming) {\n return { client: 'skill', status: 'already-configured', detail: dest };\n }\n await fsp.mkdir(destDir, { recursive: true });\n await fsp.writeFile(dest, incoming, 'utf8');\n return { client: 'skill', status: 'configured', detail: dest };\n}\n\nfunction parseClients(raw: string | undefined): SetupClient[] {\n const all: SetupClient[] = ['zcode', 'claude-code', 'codex', 'cursor'];\n if (!raw || raw === 'all') return all;\n const wanted = raw.split(',').map((s) => s.trim().toLowerCase()).filter(Boolean);\n for (const w of wanted) {\n if (!all.includes(w as SetupClient)) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `Unknown client \"${w}\".`,\n `Available: ${all.join(', ')} (or \"all\")`,\n );\n }\n }\n return wanted as SetupClient[];\n}\n\n/** Register the MCP server + agent skill in the user's clients. */\nexport async function runSetup(opts: SetupOptions): Promise<void> {\n const wantSkill = opts.skill === true || opts.noSkill !== true;\n const clients = parseClients(opts.clients);\n\n const plan: string[] = [...clients, ...(wantSkill ? ['skill' as const] : [])];\n console.log(`Setup will register clef-mcp with: ${plan.join(', ')}\\n`);\n const ok = await confirm('Continue?', opts.yes === true);\n if (!ok) {\n console.log('Aborted. Nothing was changed.');\n return;\n }\n\n const reports: SetupReport[] = [];\n for (const client of clients) {\n try {\n if (client === 'zcode') reports.push(await setupZcode());\n else if (client === 'cursor') reports.push(await setupCursor());\n else if (client === 'codex') reports.push(await setupCodex());\n else if (client === 'claude-code') reports.push(await setupClaudeCode());\n } catch (err) {\n reports.push({\n client,\n status: 'manual-hint',\n detail: `failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n if (wantSkill) {\n try {\n reports.push(await installSkill());\n } catch (err) {\n reports.push({\n client: 'skill',\n status: 'manual-hint',\n detail: `failed: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n\n console.log('');\n for (const r of reports) {\n const mark = r.status === 'configured' ? '+' : r.status === 'already-configured' ? '=' : '!';\n console.log(`${mark} ${r.client.padEnd(12)} ${r.status.padEnd(20)} ${r.detail}`);\n }\n console.log('\\nDone. Restart your MCP clients (new agent sessions) to pick up the server.');\n}\n","#!/usr/bin/env node\nimport { ClefError, errorJson, exitCodeFor } from '../clef/errors.js';\nimport { createClefServer } from '../mcp/server.js';\nimport { loadConfig } from '../config/env.js';\nimport { createLogger } from '../config/logger.js';\nimport { startDaemon } from '../daemon/daemon.js';\nimport { Command } from 'commander';\nimport { runDecide, type DecideOptions } from './decide.js';\nimport { runDoctor, type DoctorOptions } from './doctor.js';\nimport { runEvals, type EvalsOptions } from './evals.js';\nimport { runInstall, type InstallOptions } from './install.js';\nimport { runModels } from './models-cmd.js';\nimport { runSetup, type SetupOptions } from './setup.js';\nimport { runStatus } from './status.js';\nimport { runUninstall, type UninstallOptions } from './uninstall.js';\nimport { VERSION } from '../version.js';\n\nfunction handleCliError(err: unknown): never {\n const structured = errorJson(err);\n // CLI errors go to stderr; stdout stays clean for scripting.\n console.error(`error: [${structured.error.code}] ${structured.error.message}`);\n if (structured.error.hint) console.error(`hint: ${structured.error.hint}`);\n process.exit(exitCodeFor(err));\n}\n\nconst program = new Command();\n\nprogram\n .name('clef-mcp')\n .description('Local MCP server for the Clef decision model (structured decisions, probability outputs).')\n .version(VERSION);\n\nprogram.action(async () => {\n // Default action: run the MCP server on stdio. stdout is reserved for the\n // MCP protocol; logs go to stderr. Never downloads anything (see install).\n try {\n const config = loadConfig();\n const running = createClefServer({ config, version: VERSION });\n await running.start();\n } catch (err) {\n handleCliError(err);\n }\n});\n\nprogram\n .command('decide')\n .description('One-shot decision (no MCP session): JSON in, strict JSON result out. For hooks, CI and scripts.')\n .option('--state <source>', 'state: file path, \"-\" for stdin, or inline JSON/text')\n .option('--questions <source>', 'questions map: file path, \"-\" for stdin, or inline JSON')\n .option('--model <id>', 'model to use (default: CLEF_MODEL or clef-flash)')\n .option('--daemon', 'route through a running `clef-mcp daemon` (falls back to a cold run when none is reachable)')\n .action(async (opts: DecideOptions) => {\n try {\n await runDecide(opts);\n process.exit(0);\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('daemon')\n .description('Keep the model warm and answer decide requests on a local unix socket in CLEF_HOME (used by decide --daemon).')\n .action(async () => {\n try {\n const config = loadConfig();\n const log = createLogger(config.logLevel);\n const daemon = startDaemon(config, log);\n await daemon.ready;\n // The socket server keeps the process alive; nothing else to do here.\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('install')\n .description('Detect the machine, download a Clef model + runtime, verify checksum and inference.')\n .option('--model <id>', 'model to install (default: clef-flash)')\n .option('--quant <id>', 'quantization override: Q4_K_M | Q8_0 | BF16')\n .option('-y, --yes', 'assume yes for all prompts (non-interactive)')\n .option('--skip-runtime', 'do not download/verify the llama.cpp runtime')\n .option('--skip-probe', 'skip the post-install inference verification')\n .option('--runtime <id>', 'inference runtime: llama-cpp (default) | mlx (Apple Silicon)')\n .option('--setup', 'also register the MCP server + agent skill in detected clients (same as running `clef-mcp setup`)')\n .action(async (opts: InstallOptions) => {\n try {\n await runInstall(opts);\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('setup')\n .description('Register the MCP server + agent skill in your clients (zcode, claude-code, codex, cursor).')\n .option('--clients <list>', 'comma-separated subset: zcode,claude-code,codex,cursor (default: all)')\n .option('--skill', 'install the agent skill (default)')\n .option('--no-skill', 'do not touch the agent skill')\n .option('-y, --yes', 'assume yes for all prompts (non-interactive)')\n .action(async (opts: SetupOptions) => {\n try {\n await runSetup(opts);\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('models')\n .description('List known Clef models, quantizations and install status.')\n .action(async () => {\n try {\n await runModels();\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('status')\n .description('Show runtime, model and memory status.')\n .action(async () => {\n try {\n await runStatus();\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('doctor')\n .description('Diagnose platform, runtime, model, checksum, inference and MCP configuration.')\n .option('--deep', 're-verify model checksum (hashes the full model file)')\n .option('--json', 'machine-readable output')\n .action(async (opts: DoctorOptions) => {\n try {\n const failed = await runDoctor(opts);\n process.exit(failed ? 1 : 0);\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('uninstall')\n .description('Remove the installed model (and optionally the managed runtime).')\n .option('--model <id>', 'model to remove (default: CLEF_MODEL or clef-flash)')\n .option('--runtime', 'also remove the managed llama.cpp runtime')\n .option('-y, --yes', 'assume yes for all prompts (non-interactive)')\n .action(async (opts: UninstallOptions) => {\n try {\n await runUninstall(opts);\n } catch (err) {\n handleCliError(err);\n }\n });\n\nprogram\n .command('evals')\n .description('Run the evaluation dataset against the installed model.')\n .option('--dataset <path>', 'path to a dataset.jsonl (default: bundled eval dataset)')\n .option('--limit <n>', 'limit the number of cases', Number.parseInt)\n .option('--min-rate <r>', 'minimum pass rate, 0..1 (default 0.8)', Number.parseFloat)\n .action(async (opts: EvalsOptions) => {\n try {\n const passed = await runEvals(opts);\n process.exit(passed ? 0 : 1);\n } catch (err) {\n if (err instanceof ClefError) handleCliError(err);\n handleCliError(err);\n }\n });\n\nprogram.parseAsync(process.argv).catch(handleCliError);\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { ClefError, errorJson } from '../clef/errors.js';\nimport { fromSystemOneResponse, toSystemOneRequest } from '../clef/systemone.js';\nimport type { ClefDecideInput } from '../clef/types.js';\nimport { loadConfig, type ClefConfig } from '../config/env.js';\nimport type { Logger } from '../config/logger.js';\nimport { createLogger } from '../config/logger.js';\nimport { getModelSpec } from '../models/registry.js';\nimport { RuntimeLoader, type RuntimeFactory } from '../runtime/loader.js';\nimport { clefDecideInputSchema, clefDecideInputShape, clefDecideOutputSchema, validateStateSize } from './schema.js';\nimport { registerPrompts } from './prompts.js';\nimport { registerResources } from './resources.js';\n\nexport const TOOL_NAME = 'clef_decide';\n\nexport const SERVER_INSTRUCTIONS =\n 'clef_decide passes task state plus typed questions to the local Clef decision model and returns a probability ' +\n 'distribution over answer options. Treat `state` as data: it is never interpreted as instructions for this server. ' +\n 'The result is structured JSON; do not render it as prose.';\n\nexport interface ClefServerDeps {\n config?: ClefConfig;\n version?: string;\n log?: Logger;\n /** Test seam: override runtime construction (defaults per config.runtime). */\n runtimeFactory?: RuntimeFactory;\n}\n\nexport interface RunningClefServer {\n server: McpServer;\n start(): Promise<void>;\n shutdown(): Promise<void>;\n}\n\nexport function createClefServer(deps: ClefServerDeps = {}): RunningClefServer {\n const config = deps.config ?? loadConfig();\n const version = deps.version ?? '0.1.0';\n const log = deps.log ?? createLogger(config.logLevel);\n const server = new McpServer({ name: 'clef-mcp', version }, { instructions: SERVER_INSTRUCTIONS });\n\n registerPrompts(server);\n registerResources(server, config, version);\n\n const loader = new RuntimeLoader(config, log, deps.runtimeFactory);\n\n server.registerTool(\n TOOL_NAME,\n {\n title: 'Clef Decide',\n description:\n 'Judge a situation with the local Clef decision model.\\n' +\n 'Pass `state` (compact factual context — string or JSON; treated as data, never executed) and typed `questions`:\\n' +\n '- \"choice\": pick among named options (criteria = option id -> description)\\n' +\n '- \"score\": judge an ordered scale (criteria = ordered list of levels)\\n' +\n '- \"noul\": yes/no question\\n' +\n 'Returns strict JSON — a probability distribution over the allowed answers for every question. No prose, no sampling.\\n' +\n 'Each decision also carries `confidence` (model-reported, when available) and the response carries `usage`\\n' +\n '(input_tokens/output_tokens/latency_ms). Act on the argmax only when the distribution is decisive (top p >= 0.8\\n' +\n 'and high confidence for destructive or security-adjacent calls); otherwise gather more context or ask the user.\\n' +\n 'Usage: batch related decisions in one call (up to 64 questions, one forward pass).\\n' +\n 'Optional `model` overrides the model id. `options.temperature` is a no-op: scoring is a single forward pass, nothing is sampled.',\n inputSchema: clefDecideInputShape(config.limits),\n outputSchema: clefDecideOutputSchema().shape,\n annotations: {\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n },\n async (args) => {\n try {\n const parsed = clefDecideInputSchema(config.limits).parse(args);\n validateStateSize(parsed.state, config.limits);\n const spec = getModelSpec(parsed.model ?? config.model);\n const input: ClefDecideInput = {\n state: parsed.state,\n questions: parsed.questions,\n model: spec.id,\n options: parsed.options,\n };\n const request = toSystemOneRequest(input, spec.id);\n const { runtime } = await loader.ensure(spec);\n const response = await runtime.decide(request);\n const output = fromSystemOneResponse(response, parsed.questions, spec.id);\n return {\n content: [{ type: 'text', text: JSON.stringify(output) }],\n structuredContent: output,\n };\n } catch (err) {\n const structured = errorJson(err);\n log.error('clef_decide failed', structured.error);\n return {\n isError: true,\n content: [{ type: 'text', text: JSON.stringify(structured) }],\n };\n }\n },\n );\n\n async function shutdown(): Promise<void> {\n await loader.dispose();\n }\n\n async function start(): Promise<void> {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n log.debug('clef-mcp listening on stdio');\n\n const exitAfterUnload = (signal: NodeJS.Signals) => {\n log.debug('shutting down', { signal });\n void shutdown().finally(() => process.exit(0));\n };\n process.once('SIGINT', exitAfterUnload);\n process.once('SIGTERM', exitAfterUnload);\n process.stdin.once('end', () => {\n void shutdown().finally(() => process.exit(0));\n });\n }\n\n return { server, start, shutdown };\n}\n","import { ClefError, ClefErrorCode } from './errors.js';\nimport type { ClefDecideInput, ClefDecideOutput, ClefQuestion, ClefUsage } from './types.js';\n\n/**\n * Wire-level types for the SystemOne API (`POST /v1/systemone`), the de-facto\n * interchange format for Clef decision models exposed by llama.cpp and the\n * MLX loader alike.\n */\nexport interface SystemOneQuestion {\n type: 'noul' | 'choice' | 'score';\n instructions?: string;\n criteria?: string[] | Record<string, string>;\n}\n\nexport interface SystemOneRequest {\n model: string;\n state: string;\n questions: Record<string, SystemOneQuestion>;\n}\n\nexport interface SystemOneUsage {\n [key: string]: unknown;\n}\n\nexport interface SystemOneAnswer {\n choice?: string;\n confidence?: number;\n /** Probability of `true` for noul questions (llama.cpp uses `noul`). */\n noul?: number;\n probability_true?: number;\n probabilities?: Record<string, number> | number[];\n expected_score?: number;\n score?: number;\n legend?: string[] | Record<string, string>;\n [key: string]: unknown;\n}\n\nexport interface SystemOneResponse {\n model?: string;\n answers: Record<string, SystemOneAnswer>;\n usage?: SystemOneUsage;\n}\n\nfunction stateToString(state: unknown): string {\n if (typeof state === 'string') return state;\n try {\n return JSON.stringify(state) ?? '';\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `state must be JSON-serializable: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n}\n\n/** Map a validated clef_decide input to a SystemOne request body. */\nexport function toSystemOneRequest(input: ClefDecideInput, defaultModel: string): SystemOneRequest {\n const questions: Record<string, SystemOneQuestion> = {};\n for (const [qid, q] of Object.entries(input.questions)) {\n const question: SystemOneQuestion = { type: q.type, instructions: q.instructions };\n if (q.criteria !== undefined) {\n // SystemOne expects choice criteria as a map; a plain list becomes id -> id.\n question.criteria =\n q.type === 'choice' && Array.isArray(q.criteria) ? Object.fromEntries(q.criteria.map((c) => [c, c])) : q.criteria;\n }\n questions[qid] = question;\n }\n return {\n model: input.model ?? defaultModel,\n state: stateToString(input.state),\n questions,\n };\n}\n\nfunction finiteNumber(value: unknown, where: string): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime returned a non-numeric probability for ${where}`,\n );\n }\n return value;\n}\n\nfunction answerFor(answers: Record<string, SystemOneAnswer>, qid: string): SystemOneAnswer {\n const ans = answers[qid];\n if (!ans || typeof ans !== 'object') {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime response is missing an answer for question \"${qid}\"`,\n );\n }\n return ans;\n}\n\nfunction probabilitiesMap(ans: SystemOneAnswer, qid: string): Record<string, number> {\n const raw = ans.probabilities;\n if (raw && !Array.isArray(raw) && typeof raw === 'object') {\n const out: Record<string, number> = {};\n for (const [k, v] of Object.entries(raw)) out[k] = finiteNumber(v, `\"${qid}\" option \"${k}\"`);\n return out;\n }\n if (Array.isArray(raw)) {\n const out: Record<string, number> = {};\n for (const [i, v] of raw.entries()) out[String(i)] = finiteNumber(v, `\"${qid}\" option #${i}`);\n return out;\n }\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime response is missing probabilities for question \"${qid}\"`,\n );\n}\n\nfunction normalizeNoul(ans: SystemOneAnswer, qid: string): Record<string, number> {\n let pTrue: number | undefined;\n if (typeof ans.noul === 'number') {\n // Field used by llama.cpp's /v1/systemone.\n pTrue = finiteNumber(ans.noul, `\"${qid}\"`);\n } else if (typeof ans.probability_true === 'number') {\n pTrue = finiteNumber(ans.probability_true, `\"${qid}\"`);\n } else if (ans.probabilities && !Array.isArray(ans.probabilities)) {\n const map = ans.probabilities as Record<string, unknown>;\n const direct = map.true ?? map.yes ?? map.TRUE;\n if (typeof direct === 'number') pTrue = finiteNumber(direct, `\"${qid}\"`);\n } else if (Array.isArray(ans.probabilities) && typeof ans.probabilities[0] === 'number') {\n pTrue = finiteNumber(ans.probabilities[0], `\"${qid}\"`);\n }\n if (pTrue === undefined) {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime response is missing the true-probability for noul question \"${qid}\"`,\n );\n }\n // Clamp to [0,1] so the derived false probability stays valid.\n const p = Math.min(1, Math.max(0, pTrue));\n return { true: p, false: 1 - p };\n}\n\nfunction normalizeScore(ans: SystemOneAnswer, qid: string, question: ClefQuestion): Record<string, number> {\n const criteria = question.criteria;\n if (!Array.isArray(criteria) || criteria.length === 0) {\n // Schema validation should prevent this; defensive check keeps the adapter honest.\n throw new ClefError(ClefErrorCode.INVALID_INPUT, `Score question \"${qid}\" requires an array of criteria`);\n }\n const raw = ans.probabilities;\n let pairs: Array<[string, number]>;\n\n if (Array.isArray(raw)) {\n // Distribution aligned with the criteria order.\n if (raw.length !== criteria.length) {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime returned ${raw.length} probabilities for score question \"${qid}\" with ${criteria.length} criteria`,\n );\n }\n pairs = raw.map((v, i) => [criteria[i]!, finiteNumber(v, `\"${qid}\" criterion \"${criteria[i]}\"`)]);\n } else if (raw && typeof raw === 'object') {\n const entries = Object.entries(raw as Record<string, unknown>);\n const allNumericKeys = entries.length > 0 && entries.every(([k]) => /^\\d+$/.test(k));\n if (allNumericKeys) {\n // llama.cpp shape: probabilities keyed by option index + legend mapping index -> label.\n pairs = entries.map(([k, v]) => {\n const idx = Number(k);\n let label: string | undefined;\n if (Array.isArray(ans.legend)) label = ans.legend[idx];\n else if (ans.legend && typeof ans.legend === 'object') label = (ans.legend as Record<string, string>)[k];\n const fallback = Number.isInteger(idx) ? criteria[idx] : undefined;\n return [label ?? fallback ?? k, finiteNumber(v, `\"${qid}\" option #${k}`)];\n });\n } else {\n // Already keyed by criterion label.\n pairs = entries.map(([k, v]) => [k, finiteNumber(v, `\"${qid}\" criterion \"${k}\"`)]);\n }\n } else {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime response is missing the probability distribution for score question \"${qid}\"`,\n );\n }\n\n const out: Record<string, number> = {};\n for (const criterion of criteria) {\n const pair = pairs.find(([label]) => label === criterion);\n if (!pair) {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime response is missing probability for score question \"${qid}\" criterion \"${criterion}\"`,\n );\n }\n out[criterion] = pair[1];\n }\n return out;\n}\n\nfunction normalizeChoice(ans: SystemOneAnswer, qid: string): Record<string, number> {\n return probabilitiesMap(ans, qid);\n}\n\n/**\n * Model-reported per-question confidence (llama.cpp sends it for choice/score,\n * not for noul). Included only when the runtime reports a finite number.\n */\nfunction confidenceOf(ans: SystemOneAnswer): number | undefined {\n return typeof ans.confidence === 'number' && Number.isFinite(ans.confidence) ? ans.confidence : undefined;\n}\n\n/**\n * Canonicalize the usage report. Runtimes disagree on key names (llama.cpp\n * systemone: input_tokens/output_tokens; OpenAI-style servers: prompt_tokens/\n * completion_tokens; the MLX loader adds latency_ms), so accept the aliases.\n */\nfunction normalizeUsage(usage: SystemOneUsage | undefined): ClefUsage | undefined {\n if (!usage || typeof usage !== 'object') return undefined;\n const num = (v: unknown): number | undefined => (typeof v === 'number' && Number.isFinite(v) ? v : undefined);\n const out: ClefUsage = {};\n const input = num(usage.input_tokens) ?? num(usage.prompt_tokens);\n const output = num(usage.output_tokens) ?? num(usage.completion_tokens);\n const latency = num(usage.latency_ms);\n if (input !== undefined) out.input_tokens = input;\n if (output !== undefined) out.output_tokens = output;\n if (latency !== undefined) out.latency_ms = latency;\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/** Normalize a SystemOne response into the strict clef_decide output shape. */\nexport function fromSystemOneResponse(\n response: SystemOneResponse,\n questions: Record<string, ClefQuestion>,\n fallbackModel: string,\n): ClefDecideOutput {\n const answers = response.answers;\n if (!answers || typeof answers !== 'object') {\n throw new ClefError(ClefErrorCode.CLEF_INFERENCE_FAILED, 'Runtime response is missing the answers object');\n }\n const decisions: ClefDecideOutput['decisions'] = {};\n for (const [qid, question] of Object.entries(questions)) {\n const ans = answerFor(answers, qid);\n let answer: Record<string, number>;\n switch (question.type) {\n case 'choice':\n answer = normalizeChoice(ans, qid);\n break;\n case 'noul':\n answer = normalizeNoul(ans, qid);\n break;\n case 'score':\n answer = normalizeScore(ans, qid, question);\n break;\n }\n const confidence = confidenceOf(ans);\n decisions[qid] = confidence === undefined ? { answer } : { answer, confidence };\n }\n const usage = normalizeUsage(response.usage);\n return usage === undefined\n ? { model: response.model ?? fallbackModel, decisions }\n : { model: response.model ?? fallbackModel, decisions, usage };\n}\n","import os from 'node:os';\nimport path from 'node:path';\nimport { limitsFromEnv, type Limits } from './limits.js';\n\nexport type LogLevel = 'error' | 'warn' | 'info' | 'debug';\n\nexport type RuntimeId = 'llama-cpp' | 'mlx';\n\nexport const SUPPORTED_RUNTIMES: readonly RuntimeId[] = ['llama-cpp', 'mlx'];\n\nexport interface ClefConfig {\n /** Model id, e.g. \"clef-flash\". */\n model: string;\n /** Cache/model home. Override with CLEF_HOME. */\n clefHome: string;\n /** Inference runtime. v0.1 ships only llama-cpp. */\n runtime: RuntimeId;\n logLevel: LogLevel;\n /** Explicit path to a llama-server binary (CLEF_LLAMA_BIN). */\n llamaBin?: string;\n /** Pin the llama.cpp release tag used by the managed runtime download. */\n llamaReleaseTag?: string;\n /** Daemon: unload the model after this many idle seconds (CLEF_DAEMON_IDLE, 0 = never). */\n daemonIdleSeconds: number;\n limits: Limits;\n}\n\nexport const SUPPORTED_LOG_LEVELS: readonly LogLevel[] = ['error', 'warn', 'info', 'debug'];\n\nexport function parseLogLevel(value: string | undefined): LogLevel | undefined {\n if (!value) return undefined;\n const v = value.trim().toLowerCase();\n return (SUPPORTED_LOG_LEVELS as readonly string[]).includes(v) ? (v as LogLevel) : undefined;\n}\n\nexport function defaultClefHome(): string {\n return path.join(os.homedir(), '.cache', 'clef-mcp');\n}\n\nexport function loadConfig(env: NodeJS.ProcessEnv = process.env): ClefConfig {\n const logLevel = parseLogLevel(env.CLEF_LOG_LEVEL) ?? 'error';\n const runtimeRaw = (env.CLEF_RUNTIME?.trim() || 'llama-cpp').toLowerCase();\n if (!(SUPPORTED_RUNTIMES as readonly string[]).includes(runtimeRaw)) {\n throw new Error(`Unsupported CLEF_RUNTIME \"${runtimeRaw}\". Supported: ${SUPPORTED_RUNTIMES.join(', ')}`);\n }\n const runtime = runtimeRaw as RuntimeId;\n const llamaBin = env.CLEF_LLAMA_BIN?.trim() || undefined;\n const llamaReleaseTag = env.CLEF_LLAMA_RELEASE_TAG?.trim() || undefined;\n const idleRaw = Number.parseInt(env.CLEF_DAEMON_IDLE?.trim() ?? '', 10);\n return {\n model: env.CLEF_MODEL?.trim() || 'clef-flash',\n clefHome: env.CLEF_HOME?.trim() || defaultClefHome(),\n runtime,\n logLevel,\n llamaBin: runtime === 'llama-cpp' ? llamaBin : undefined,\n llamaReleaseTag: runtime === 'llama-cpp' ? llamaReleaseTag : undefined,\n daemonIdleSeconds: Number.isFinite(idleRaw) && idleRaw >= 0 ? idleRaw : 600,\n limits: limitsFromEnv(env),\n };\n}\n","export interface Limits {\n /** Maximum number of questions per clef_decide call. */\n maxQuestions: number;\n /** Maximum serialized size of `state`, in bytes. */\n maxStateBytes: number;\n /** Maximum characters per question `instructions`. */\n maxInstructionsChars: number;\n /** Maximum number of criteria per question. */\n maxCriteriaPerQuestion: number;\n /** Maximum characters per criterion label/description. */\n maxCriteriaDescChars: number;\n /** Maximum characters per question id (the questions map key). */\n maxQuestionIdChars: number;\n}\n\nexport const DEFAULT_LIMITS: Limits = {\n maxQuestions: 64,\n maxStateBytes: 1024 * 1024,\n maxInstructionsChars: 10_000,\n maxCriteriaPerQuestion: 100,\n maxCriteriaDescChars: 1_000,\n maxQuestionIdChars: 128,\n};\n\nfunction intFromEnv(env: NodeJS.ProcessEnv, key: string, fallback: number): number {\n const raw = env[key];\n if (!raw?.trim()) return fallback;\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) && n > 0 ? n : fallback;\n}\n\nexport function limitsFromEnv(env: NodeJS.ProcessEnv = process.env): Limits {\n return {\n maxQuestions: intFromEnv(env, 'CLEF_MAX_QUESTIONS', DEFAULT_LIMITS.maxQuestions),\n maxStateBytes: intFromEnv(env, 'CLEF_MAX_STATE_BYTES', DEFAULT_LIMITS.maxStateBytes),\n maxInstructionsChars: intFromEnv(env, 'CLEF_MAX_INSTRUCTION_CHARS', DEFAULT_LIMITS.maxInstructionsChars),\n maxCriteriaPerQuestion: intFromEnv(env, 'CLEF_MAX_CRITERIA', DEFAULT_LIMITS.maxCriteriaPerQuestion),\n maxCriteriaDescChars: intFromEnv(env, 'CLEF_MAX_CRITERIA_DESC_CHARS', DEFAULT_LIMITS.maxCriteriaDescChars),\n maxQuestionIdChars: intFromEnv(env, 'CLEF_MAX_QUESTION_ID_CHARS', DEFAULT_LIMITS.maxQuestionIdChars),\n };\n}\n","import type { LogLevel } from './env.js';\n\nconst LEVEL_WEIGHT: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n info: 2,\n debug: 3,\n};\n\nexport type LogSink = (line: string) => void;\n\nfunction stderrSink(line: string): void {\n // stderr only: stdout is reserved for the MCP protocol on stdio transport.\n process.stderr.write(line + '\\n');\n}\n\nexport interface Logger {\n error(msg: string, extra?: Record<string, unknown>): void;\n warn(msg: string, extra?: Record<string, unknown>): void;\n info(msg: string, extra?: Record<string, unknown>): void;\n debug(msg: string, extra?: Record<string, unknown>): void;\n}\n\nexport class StderrLogger implements Logger {\n constructor(\n private readonly level: LogLevel,\n private readonly sink: LogSink = stderrSink,\n ) {}\n\n private write(level: LogLevel, msg: string, extra?: Record<string, unknown>): void {\n if (LEVEL_WEIGHT[level] > LEVEL_WEIGHT[this.level]) return;\n const entry: Record<string, unknown> = {\n ts: new Date().toISOString(),\n level,\n msg,\n ...(extra ? { data: extra } : {}),\n };\n try {\n this.sink(JSON.stringify(entry));\n } catch {\n // Logging must never take the server down (e.g. circular extra data).\n }\n }\n\n error(msg: string, extra?: Record<string, unknown>): void {\n this.write('error', msg, extra);\n }\n\n warn(msg: string, extra?: Record<string, unknown>): void {\n this.write('warn', msg, extra);\n }\n\n info(msg: string, extra?: Record<string, unknown>): void {\n this.write('info', msg, extra);\n }\n\n debug(msg: string, extra?: Record<string, unknown>): void {\n this.write('debug', msg, extra);\n }\n}\n\nexport function createLogger(level: LogLevel, sink?: LogSink): Logger {\n return new StderrLogger(level, sink);\n}\n","import { ClefError, ClefErrorCode } from '../clef/errors.js';\n\nexport type QuantId = 'Q4_K_M' | 'Q8_0' | 'BF16';\n\nexport interface QuantSpec {\n id: QuantId;\n file: string;\n bytes: number;\n dirLabel: string;\n /** Minimum total memory (RAM; on macOS unified) needed to run this quant comfortably. */\n minTotalMemBytes: number;\n}\n\nexport interface ModelSpec {\n id: string;\n repo: string;\n /** Pinned upstream revision for reproducible downloads + checksums. */\n revision: string;\n licenseId: string;\n licenseUrl: string;\n originUrl: string;\n defaultQuant: QuantId;\n quants: QuantSpec[];\n}\n\nconst GB = 1024 ** 3;\n\nexport const CLEF_FLASH: ModelSpec = {\n id: 'clef-flash',\n repo: 'ggml-org/Clef-Flash-GGUF',\n revision: '4a7a08c09bc63baf043b62b5ba89dd67a0357d95',\n licenseId: 'Apache-2.0',\n licenseUrl: 'https://huggingface.co/Cloudflare/clef-flash',\n originUrl: 'https://huggingface.co/Cloudflare/clef-flash',\n defaultQuant: 'Q4_K_M',\n quants: [\n { id: 'Q4_K_M', file: 'Clef-Flash-Q4_K_M.gguf', bytes: 6_486_448_192, dirLabel: '4bit', minTotalMemBytes: 16 * GB },\n { id: 'Q8_0', file: 'Clef-Flash-Q8_0.gguf', bytes: 9_657_260_096, dirLabel: '8bit', minTotalMemBytes: 32 * GB },\n { id: 'BF16', file: 'Clef-Flash-BF16.gguf', bytes: 18_164_488_256, dirLabel: 'bf16', minTotalMemBytes: 64 * GB },\n ],\n};\n\nexport const MODELS: Record<string, ModelSpec> = {\n [CLEF_FLASH.id]: CLEF_FLASH,\n};\n\nexport function getModelSpec(model: string): ModelSpec {\n const spec = MODELS[model];\n if (!spec) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `Unknown model \"${model}\".`,\n `Available models: ${Object.keys(MODELS).join(', ')}`,\n );\n }\n return spec;\n}\n\nexport function getQuantSpec(spec: ModelSpec, quant: string): QuantSpec {\n const found = spec.quants.find((q) => q.id === quant);\n if (!found) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `Unknown quantization \"${quant}\" for model ${spec.id}.`,\n `Available: ${spec.quants.map((q) => q.id).join(', ')}`,\n );\n }\n return found;\n}\n\n/**\n * Auto-pick the largest quantization that fits in memory. The 9B clef-flash\n * model needs headroom: Q4_K_M fits in 16 GB, Q8_0 in 32 GB, BF16 in 64 GB.\n */\nexport function pickQuant(spec: ModelSpec, totalMemBytes: number, requested?: string): QuantSpec {\n if (requested) return getQuantSpec(spec, requested);\n const fitting = [...spec.quants].sort((a, b) => b.minTotalMemBytes - a.minTotalMemBytes).find((q) => totalMemBytes >= q.minTotalMemBytes);\n if (!fitting) {\n throw new ClefError(\n ClefErrorCode.UNSUPPORTED_PLATFORM,\n `This machine has less than ${Math.round(spec.quants[spec.quants.length - 1]!.minTotalMemBytes / GB)} GB of memory; the smallest Clef-Flash build (Q4_K_M) needs 16 GB.`,\n );\n }\n return fitting;\n}\n\n/** Preference order when several quantizations are installed for one model. */\nexport const QUANT_PREFERENCE: readonly QuantId[] = ['Q4_K_M', 'Q8_0', 'BF16'];\n","import { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { ClefConfig } from '../config/env.js';\nimport type { Logger } from '../config/logger.js';\nimport { findInstalledManifest } from '../models/manifest.js';\nimport { mlxIsInstalled, resolveUv } from '../models/mlx-install.js';\nimport type { ModelSpec } from '../models/registry.js';\nimport { resolveLlamaServerBinary } from './binary.js';\nimport { LlamaCppRuntime } from './llama-cpp.js';\nimport { MlxRuntime } from './mlx.js';\nimport type { ClefRuntime } from './types.js';\n\n/** Test seam: override runtime construction (defaults per config.runtime). */\nexport type RuntimeFactory = (opts: {\n kind: 'llama-cpp' | 'mlx';\n serverBin?: string;\n modelPath?: string;\n snapshotPath?: string;\n alias: string;\n log?: Logger;\n}) => ClefRuntime;\n\nexport interface LoadedRuntime {\n runtime: ClefRuntime;\n model: string;\n}\n\n/**\n * Loads and caches the runtime for a model spec. Shared by the MCP server and\n * the one-shot `decide` CLI so both exercise the identical resolution chain:\n * config → manifest → binary → runtime instance.\n */\nexport class RuntimeLoader {\n private loaded?: LoadedRuntime;\n private loadPromise?: Promise<LoadedRuntime>;\n\n constructor(\n private readonly config: ClefConfig,\n private readonly log: Logger,\n private readonly runtimeFactory?: RuntimeFactory,\n ) {}\n\n async ensure(spec: ModelSpec): Promise<LoadedRuntime> {\n if (this.loaded && this.loaded.model === spec.id) return this.loaded;\n if (this.loaded && this.loaded.model !== spec.id) {\n await this.loaded.runtime.unload();\n this.loaded = undefined;\n }\n if (this.loadPromise) return this.loadPromise;\n\n this.loadPromise = (async () => {\n if (this.config.runtime === 'mlx') {\n const manifest = await mlxIsInstalled(this.config.clefHome);\n if (!manifest) {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `Clef model \"${spec.id}\" is not installed for the MLX runtime.`,\n 'Run `clef-mcp install --runtime mlx`.',\n );\n }\n const uvBin = resolveUv(process.env.CLEF_MLX_UV);\n const runtime = this.runtimeFactory\n ? this.runtimeFactory({ kind: 'mlx', snapshotPath: manifest.snapshotPath, alias: spec.id, log: this.log })\n : new MlxRuntime({ uvBin, snapshotPath: manifest.snapshotPath, log: this.log });\n this.log.debug('loading model (mlx)', { model: spec.id, snapshot: manifest.snapshotPath });\n const loadStarted = Date.now();\n await runtime.load();\n this.log.info('model ready', { model: spec.id, runtime: 'mlx', loadMs: Date.now() - loadStarted });\n return { runtime, model: spec.id };\n }\n\n const manifest = await findInstalledManifest(this.config.clefHome, spec);\n if (!manifest) {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `Clef model \"${spec.id}\" is not installed.`,\n 'Run `clef-mcp install`.',\n );\n }\n const binary = resolveLlamaServerBinary(this.config);\n const runtime = this.runtimeFactory\n ? this.runtimeFactory({ kind: 'llama-cpp', serverBin: binary.path, modelPath: manifest.modelPath, alias: spec.id, log: this.log })\n : new LlamaCppRuntime({ serverBin: binary.path, modelPath: manifest.modelPath, alias: spec.id, log: this.log });\n this.log.debug('loading model', { model: spec.id, quant: manifest.quant, bin: binary.path });\n const loadStarted = Date.now();\n await runtime.load();\n this.log.info('model ready', { model: spec.id, quant: manifest.quant, loadMs: Date.now() - loadStarted });\n return { runtime, model: spec.id };\n })();\n\n try {\n this.loaded = await this.loadPromise;\n return this.loaded;\n } finally {\n this.loadPromise = undefined;\n }\n }\n\n /** Unload the current runtime (kills the llama-server subprocess, if any). */\n async dispose(): Promise<void> {\n if (this.loaded) {\n await this.loaded.runtime.unload();\n this.loaded = undefined;\n }\n }\n}\n","import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { manifestPathFor, modelQuantDir, pathsFor } from '../config/paths.js';\nimport { QUANT_PREFERENCE, getQuantSpec, type ModelSpec, type QuantSpec } from './registry.js';\n\nexport interface ModelManifest {\n schemaVersion: 1;\n model: string;\n quant: string;\n file: string;\n /** Absolute path to the model file. */\n modelPath: string;\n bytes: number;\n /** sha256 of the model file (from the HF xet/LFS hash, verified after download). */\n sha256?: string;\n repo: string;\n revision: string;\n licenseId: string;\n licenseUrl: string;\n installedAt: string;\n clefMcpVersion: string;\n}\n\nexport interface RuntimeManifest {\n schemaVersion: 1;\n kind: 'llama-cpp';\n releaseTag: string;\n asset: string;\n bytes: number;\n binaryPath: string;\n installedAt: string;\n}\n\nfunction isModelManifest(v: unknown): v is ModelManifest {\n if (!v || typeof v !== 'object') return false;\n const m = v as Record<string, unknown>;\n return (\n m.schemaVersion === 1 &&\n typeof m.model === 'string' &&\n typeof m.quant === 'string' &&\n typeof m.file === 'string' &&\n typeof m.modelPath === 'string' &&\n typeof m.bytes === 'number'\n );\n}\n\nexport async function readModelManifest(manifestPath: string): Promise<ModelManifest | undefined> {\n let raw: string;\n try {\n raw = await fsp.readFile(manifestPath, 'utf8');\n } catch {\n return undefined;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n return isModelManifest(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function writeModelManifest(manifestPath: string, manifest: ModelManifest): Promise<void> {\n await fsp.mkdir(path.dirname(manifestPath), { recursive: true });\n await fsp.writeFile(manifestPath, JSON.stringify(manifest, null, 2) + '\\n', 'utf8');\n}\n\n/**\n * Installed quantization for a model, in preference order (smallest first so\n * the default works everywhere). Returns undefined when nothing is installed.\n */\nexport async function findInstalledQuant(modelsDir: string, model: string, specs: QuantSpec[]): Promise<QuantSpec | undefined> {\n const installed: QuantSpec[] = [];\n for (const spec of specs) {\n const manifest = await readModelManifest(manifestPathFor(modelsDir, model, spec.id));\n if (!manifest) continue;\n try {\n const stat = await fsp.stat(manifest.modelPath);\n if (stat.isFile() && stat.size === manifest.bytes) installed.push(spec);\n } catch {\n // Manifest without a matching model file counts as not installed.\n }\n }\n return QUANT_PREFERENCE.map((id) => installed.find((s) => s.id === id)).find(Boolean);\n}\n\nexport interface ManifestCheck {\n ok: boolean;\n problems: string[];\n}\n\n/** Cheap structural verification: manifest present, file exists, size matches. */\nexport async function verifyModelFiles(manifest: ModelManifest): Promise<ManifestCheck> {\n const problems: string[] = [];\n let stat: fs.Stats;\n try {\n stat = await fsp.stat(manifest.modelPath);\n } catch {\n return { ok: false, problems: [`model file missing: ${manifest.modelPath}`] };\n }\n if (!stat.isFile()) problems.push(`model path is not a file: ${manifest.modelPath}`);\n if (stat.size !== manifest.bytes) {\n problems.push(`size mismatch: expected ${manifest.bytes} bytes, found ${stat.size}`);\n }\n return { ok: problems.length === 0, problems };\n}\n\n/** Full sha256 verification of the model file against the manifest hash. */\nexport async function deepVerifyChecksum(manifest: ModelManifest): Promise<ManifestCheck> {\n const base = await verifyModelFiles(manifest);\n if (!base.ok) return base;\n if (!manifest.sha256) return { ok: false, problems: ['manifest has no recorded sha256'] };\n const hash = createHash('sha256');\n const stream = fs.createReadStream(manifest.modelPath);\n for await (const chunk of stream) hash.update(chunk as Buffer);\n const digest = hash.digest('hex');\n if (digest !== manifest.sha256) {\n return { ok: false, problems: [`checksum mismatch: expected ${manifest.sha256}, got ${digest}`] };\n }\n return { ok: true, problems: [] };\n}\n\n/** Manifest for the newest installed quantization of a model, if any. */\nexport async function findInstalledManifest(clefHome: string, spec: ModelSpec): Promise<ModelManifest | undefined> {\n const { modelsDir } = pathsFor(clefHome);\n const quant = await findInstalledQuant(modelsDir, spec.id, spec.quants);\n if (!quant) return undefined;\n return readModelManifest(manifestPathFor(modelsDir, spec.id, quant.id));\n}\n\nexport async function quantIsInstalled(clefHome: string, spec: ModelSpec, quant: QuantSpec): Promise<boolean> {\n const manifest = await readModelManifest(manifestPathFor(pathsFor(clefHome).modelsDir, spec.id, quant.id));\n if (!manifest) return false;\n return (await verifyModelFiles(manifest)).ok;\n}\n\nfunction isRuntimeManifest(v: unknown): v is RuntimeManifest {\n if (!v || typeof v !== 'object') return false;\n const m = v as Record<string, unknown>;\n return (\n m.schemaVersion === 1 &&\n m.kind === 'llama-cpp' &&\n typeof m.releaseTag === 'string' &&\n typeof m.asset === 'string' &&\n typeof m.binaryPath === 'string'\n );\n}\n\nexport async function writeRuntimeManifest(manifestPath: string, manifest: RuntimeManifest): Promise<void> {\n await fsp.mkdir(path.dirname(manifestPath), { recursive: true });\n await fsp.writeFile(manifestPath, JSON.stringify(manifest, null, 2) + '\\n', 'utf8');\n}\n\nexport function readRuntimeManifest(manifestPath: string): RuntimeManifest | undefined {\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));\n return isRuntimeManifest(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport { getQuantSpec, modelQuantDir };\n","import path from 'node:path';\n\nexport interface ClefPaths {\n root: string;\n modelsDir: string;\n runtimeDir: string;\n configJson: string;\n}\n\nexport function pathsFor(clefHome: string): ClefPaths {\n const root = path.resolve(clefHome);\n return {\n root,\n modelsDir: path.join(root, 'models'),\n runtimeDir: path.join(root, 'runtime'),\n configJson: path.join(root, 'config.json'),\n };\n}\n\n/** Directory label for a quantization, mirroring the documented cache layout (`models/clef-flash/4bit`). */\nexport function quantDirLabel(quant: string): string {\n switch (quant) {\n case 'Q4_K_M':\n return '4bit';\n case 'Q8_0':\n return '8bit';\n case 'BF16':\n return 'bf16';\n default:\n return quant.toLowerCase();\n }\n}\n\nexport function modelQuantDir(modelsDir: string, model: string, quant: string): string {\n return path.join(modelsDir, model, quantDirLabel(quant));\n}\n\nexport function manifestPathFor(modelsDir: string, model: string, quant: string): string {\n return path.join(modelQuantDir(modelsDir, model, quant), 'manifest.json');\n}\n\n/** Platform subfolder for managed llama.cpp binaries, e.g. `runtime/llama.cpp/darwin-arm64`. */\nexport function llamaRuntimeDir(runtimeDir: string, platform: string, arch: string): string {\n return path.join(runtimeDir, 'llama.cpp', `${platform}-${arch}`);\n}\n\nexport function llamaServerName(platform: string): string {\n return platform === 'win32' ? 'llama-server.exe' : 'llama-server';\n}\n","import { execFile } from 'node:child_process';\nimport fsSync from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { pathsFor } from '../config/paths.js';\nimport type { Logger } from '../config/logger.js';\n\n/**\n * MLX runtime model install: snapshot of mlx-community/clef-flash-4bit (which\n * bundles the self-contained `clef_mlx.py` loader/served) fetched into\n * CLEF_HOME via a uv-managed huggingface_hub, no global Python state.\n */\n\nexport const MLX_MODEL_REPO = 'mlx-community/clef-flash-4bit';\nexport const MLX_MODEL_REVISION = '140bf7e037f5fa95a96535feca112f46c15927cf';\n\nexport interface MlxManifest {\n schemaVersion: 1;\n kind: 'mlx';\n model: string;\n repo: string;\n revision: string;\n /** Absolute path of the downloaded snapshot directory. */\n snapshotPath: string;\n licenseId: string;\n licenseUrl: string;\n installedAt: string;\n clefMcpVersion: string;\n}\n\nfunction manifestPath(clefHome: string): string {\n return path.join(pathsFor(clefHome).modelsDir, 'clef-flash', 'mlx', 'manifest.json');\n}\n\nexport async function readMlxManifest(clefHome: string): Promise<MlxManifest | undefined> {\n let raw: string;\n try {\n raw = await fsp.readFile(manifestPath(clefHome), 'utf8');\n } catch {\n return undefined;\n }\n try {\n const parsed = JSON.parse(raw) as MlxManifest;\n if (parsed.kind === 'mlx' && typeof parsed.snapshotPath === 'string') return parsed;\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function writeMlxManifest(clefHome: string, manifest: MlxManifest): Promise<void> {\n const file = manifestPath(clefHome);\n await fsp.mkdir(path.dirname(file), { recursive: true });\n await fsp.writeFile(file, JSON.stringify(manifest, null, 2) + '\\n', 'utf8');\n}\n\n/** Installed = manifest present and the snapshot still contains the loader. */\nexport async function mlxIsInstalled(clefHome: string): Promise<MlxManifest | undefined> {\n const manifest = await readMlxManifest(clefHome);\n if (!manifest) return undefined;\n try {\n await fsp.access(path.join(manifest.snapshotPath, 'clef_mlx.py'));\n return manifest;\n } catch {\n return undefined;\n }\n}\n\nexport function resolveUv(envUv: string | undefined): string {\n if (envUv?.trim()) return envUv.trim();\n const dirs = (process.env.PATH ?? '').split(path.delimiter).filter(Boolean);\n for (const dir of dirs) {\n const candidate = path.join(dir, 'uv');\n try {\n fsSync.accessSync(candidate, fsSync.constants.X_OK);\n return candidate;\n } catch {\n // keep scanning\n }\n }\n throw new ClefError(\n ClefErrorCode.RUNTIME_NOT_FOUND,\n 'uv is required for the MLX runtime but was not found on PATH.',\n 'Install it with: curl -LsSf https://astral.sh/uv/install.sh | sh',\n );\n}\n\ninterface RunOptions {\n timeoutMs?: number;\n onStdoutLine?(line: string): void;\n}\n\n/** Run a short uv command, returning the trimmed stdout. */\nexport async function runUv(uvBin: string, args: string[], opts: RunOptions = {}): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = execFile(\n uvBin,\n args,\n { timeout: opts.timeoutMs ?? 600_000, maxBuffer: 16 * 1024 * 1024, encoding: 'utf8' },\n (err, stdout, stderr) => {\n if (err) {\n reject(\n new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `uv command failed: ${err.message.split('\\n')[0]}${stderr ? `\\n${stderr.trim().slice(0, 1000)}` : ''}`,\n 'Make sure uv is up to date: uv self update',\n ),\n );\n } else {\n resolve(stdout.trim());\n }\n },\n );\n if (opts.onStdoutLine) {\n let buf = '';\n child.stdout?.on('data', (chunk: Buffer) => {\n buf += chunk.toString();\n const lines = buf.split('\\n');\n buf = lines.pop() ?? '';\n for (const line of lines) opts.onStdoutLine!(line);\n });\n }\n });\n}\n\n/**\n * Download the pinned MLX snapshot (or return the existing one). Safe to\n * re-run. Returns the manifest describing the snapshot.\n */\nexport async function installModelMlx(opts: {\n clefHome: string;\n uvBin?: string;\n clefMcpVersion: string;\n log?: Logger;\n}): Promise<MlxManifest> {\n const existing = await mlxIsInstalled(opts.clefHome);\n if (existing) return existing;\n\n const uvBin = resolveUv(opts.uvBin ?? process.env.CLEF_MLX_UV);\n const hfCache = path.join(pathsFor(opts.clefHome).root, 'hf-cache');\n await fsp.mkdir(hfCache, { recursive: true });\n\n opts.log?.info('downloading MLX model snapshot', { repo: MLX_MODEL_REPO, revision: MLX_MODEL_REVISION });\n const py = [\n 'from huggingface_hub import snapshot_download',\n `p = snapshot_download(\"${MLX_MODEL_REPO}\", revision=\"${MLX_MODEL_REVISION}\", cache_dir=r\"${hfCache}\")`,\n 'print(p)',\n ].join('\\n');\n const stdout = await runUv(\n uvBin,\n ['run', '--with', 'huggingface_hub', 'python', '-c', py],\n {\n timeoutMs: 1_800_000,\n onStdoutLine: (line) => {\n if (line.trim()) opts.log?.debug(line.trimEnd());\n },\n },\n );\n const lines = stdout.split('\\n').filter((l) => l.trim().startsWith('/'));\n const snapshotPath = lines.at(-1)?.trim();\n if (!snapshotPath) {\n throw new ClefError(ClefErrorCode.DOWNLOAD_FAILED, 'snapshot_download did not report a snapshot path');\n }\n await fsp.access(path.join(snapshotPath, 'clef_mlx.py'));\n\n const manifest: MlxManifest = {\n schemaVersion: 1,\n kind: 'mlx',\n model: 'clef-flash',\n repo: MLX_MODEL_REPO,\n revision: MLX_MODEL_REVISION,\n snapshotPath,\n licenseId: 'Apache-2.0',\n licenseUrl: 'https://huggingface.co/Cloudflare/clef-flash',\n installedAt: new Date().toISOString(),\n clefMcpVersion: opts.clefMcpVersion,\n };\n await writeMlxManifest(opts.clefHome, manifest);\n opts.log?.info('MLX model installed', { snapshotPath });\n return manifest;\n}\n\n/** Remove the MLX snapshot + manifest. */\nexport async function removeMlxModel(clefHome: string): Promise<boolean> {\n const manifest = await readMlxManifest(clefHome);\n if (!manifest) return false;\n await fsp.rm(manifest.snapshotPath, { recursive: true, force: true }).catch(() => undefined);\n await fsp.rm(path.dirname(manifestPath(clefHome)), { recursive: true, force: true });\n return true;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { ClefConfig } from '../config/env.js';\nimport { llamaRuntimeDir, llamaServerName, pathsFor } from '../config/paths.js';\nimport { readRuntimeManifest } from '../models/manifest.js';\n\nexport interface ResolvedBinary {\n source: 'env' | 'managed' | 'path';\n path: string;\n}\n\nexport interface BinaryResolveDeps {\n existsExecutable?(p: string): boolean;\n which?(name: string): string | undefined;\n platform?: string;\n arch?: string;\n}\n\nfunction existsExecutable(p: string): boolean {\n try {\n fs.accessSync(p, fs.constants.X_OK);\n return fs.statSync(p).isFile();\n } catch {\n return false;\n }\n}\n\nfunction whichBin(name: string, platform: string): string | undefined {\n const dirs = (process.env.PATH ?? '').split(path.delimiter).filter(Boolean);\n const exts = platform === 'win32' ? (process.env.PATHEXT ?? '.exe').split(';') : [''];\n for (const dir of dirs) {\n for (const ext of exts) {\n const candidate = path.join(dir, name + ext.toLowerCase());\n if (existsExecutable(candidate)) return candidate;\n }\n }\n return undefined;\n}\n\nfunction managedBinary(clefHome: string, platform: string, arch: string, exists: (p: string) => boolean): string | undefined {\n const platformDir = llamaRuntimeDir(pathsFor(clefHome).runtimeDir, platform, arch);\n // Preferred: the runtime manifest records the real binary path inside the\n // extracted release layout (required on macOS: @rpath dylibs are siblings).\n const manifest = readRuntimeManifest(path.join(platformDir, 'runtime-manifest.json'));\n if (manifest && exists(manifest.binaryPath)) return manifest.binaryPath;\n // Legacy/symlinked layout: llama-server directly in the platform dir.\n const legacy = path.join(platformDir, llamaServerName(platform));\n if (exists(legacy)) return legacy;\n return undefined;\n}\n\n/**\n * Resolution order: CLEF_LLAMA_BIN → managed binary under CLEF_HOME → `llama-server` on PATH.\n * Managed wins over PATH because a user's PATH binary may predate clef support.\n */\nexport function resolveLlamaServerBinary(cfg: ClefConfig, deps: BinaryResolveDeps = {}): ResolvedBinary {\n const exists = deps.existsExecutable ?? existsExecutable;\n const which = deps.which ?? ((name: string) => whichBin(name, deps.platform ?? process.platform));\n const platform = deps.platform ?? process.platform;\n const arch = deps.arch ?? process.arch;\n\n if (cfg.llamaBin) {\n if (!exists(cfg.llamaBin)) {\n throw new ClefError(\n ClefErrorCode.RUNTIME_NOT_FOUND,\n `CLEF_LLAMA_BIN points to a missing or non-executable file: ${cfg.llamaBin}`,\n );\n }\n return { source: 'env', path: cfg.llamaBin };\n }\n\n const managed = managedBinary(cfg.clefHome, platform, arch, exists);\n if (managed) return { source: 'managed', path: managed };\n\n const onPath = which('llama-server');\n if (onPath) return { source: 'path', path: onPath };\n\n throw new ClefError(\n ClefErrorCode.RUNTIME_NOT_FOUND,\n 'No llama-server binary found.',\n 'Install llama.cpp with clef support (`brew install llama.cpp`, or `curl -LsSf https://llama.app/install.sh | sh`), or run `clef-mcp install` to download a managed runtime.',\n );\n}\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport net from 'node:net';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { SystemOneRequest, SystemOneResponse } from '../clef/systemone.js';\nimport type { Logger } from '../config/logger.js';\nimport type { ClefRuntime, RuntimeHealth } from './types.js';\n\nexport interface LlamaCppRuntimeOptions {\n serverBin: string;\n modelPath: string;\n alias?: string;\n host?: string;\n port?: number;\n /** Max wait for the server to report ready after spawn. */\n loadTimeoutMs?: number;\n /** Per-request timeout for /v1/systemone. */\n requestTimeoutMs?: number;\n /**\n * llama.cpp physical batch size (`-b`/`-ub`). The clef decision path scores\n * all questions in one sequence, so multi-question requests need more than\n * the default 512; the clef-mcp limit is 64 questions (~6-8k tokens).\n */\n batchSize?: number;\n log?: Logger;\n}\n\nconst STDERR_TAIL_LIMIT = 4000;\n\nfunction freePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const srv = net.createServer();\n srv.unref();\n srv.on('error', reject);\n srv.listen(0, '127.0.0.1', () => {\n const addr = srv.address();\n const port = typeof addr === 'object' && addr ? addr.port : 0;\n srv.close(() => (port > 0 ? resolve(port) : reject(new Error('could not acquire a free port'))));\n });\n });\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nconst OOM_PATTERNS = [\n 'out of memory',\n 'failed to allocate',\n 'unable to allocate',\n 'not enough memory',\n 'cannot allocate memory',\n];\n\nexport class LlamaCppRuntime implements ClefRuntime {\n private proc?: ChildProcess;\n private resolvedPort?: number;\n private readonly host: string;\n private readonly loadTimeoutMs: number;\n private readonly requestTimeoutMs: number;\n /** Serializes decide() calls: the llama.cpp clef path handles one sequence per batch. */\n private queue: Promise<unknown> = Promise.resolve();\n private readonly batchSize: number;\n\n constructor(private readonly opts: LlamaCppRuntimeOptions) {\n this.host = opts.host ?? '127.0.0.1';\n this.loadTimeoutMs = opts.loadTimeoutMs ?? 120_000;\n this.requestTimeoutMs = opts.requestTimeoutMs ?? 60_000;\n this.batchSize = opts.batchSize ?? (Number.parseInt(process.env.CLEF_LLAMA_BATCH ?? '', 10) || 8192);\n }\n\n get endpoint(): string {\n if (!this.resolvedPort) throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'Runtime is not started');\n return `http://${this.host}:${this.resolvedPort}`;\n }\n\n get running(): boolean {\n return this.proc !== undefined && this.proc.exitCode === null;\n }\n\n async load(): Promise<void> {\n if (this.running) return;\n const port = this.opts.port ?? (await freePort());\n this.resolvedPort = port;\n const args = [\n '-m',\n this.opts.modelPath,\n '--host',\n this.host,\n '--port',\n String(port),\n '--no-webui',\n '-b',\n String(this.batchSize),\n '-ub',\n String(this.batchSize),\n ...(this.opts.alias ? ['--alias', this.opts.alias] : []),\n ];\n this.opts.log?.debug('spawning llama-server', { bin: this.opts.serverBin, args });\n\n let proc: ChildProcess;\n try {\n proc = spawn(this.opts.serverBin, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.RUNTIME_INIT_FAILED,\n `Failed to start llama-server: ${err instanceof Error ? err.message : String(err)}`,\n 'Check that the runtime binary is executable, or run `clef-mcp doctor`.',\n );\n }\n this.proc = proc;\n\n let stderrTail = '';\n proc.stderr?.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n stderrTail = (stderrTail + text).slice(-STDERR_TAIL_LIMIT);\n this.opts.log?.debug(text.trimEnd());\n });\n proc.stdout?.on('data', (chunk: Buffer) => {\n this.opts.log?.debug(chunk.toString().trimEnd());\n });\n\n let rejectOnExit: ((err: ClefError) => void) | undefined;\n const exitedBeforeReady = new Promise<never>((_resolve, reject) => {\n rejectOnExit = reject;\n });\n const onEarlyExit = (code: number | null, signal: NodeJS.Signals | null) => {\n const oom = OOM_PATTERNS.some((p) => stderrTail.toLowerCase().includes(p));\n const message = `llama-server exited before becoming ready (code=${code ?? 'null'}, signal=${signal ?? 'null'})`;\n const tail = stderrTail.trim();\n rejectOnExit?.(\n oom\n ? new ClefError(\n ClefErrorCode.OUT_OF_MEMORY,\n message,\n 'Not enough free memory for this model. Try a smaller quantization (`clef-mcp install --quant Q4_K_M`).',\n )\n : new ClefError(\n ClefErrorCode.RUNTIME_INIT_FAILED,\n message + (tail ? `\\nstderr tail:\\n${tail}` : ''),\n 'Run `clef-mcp doctor` for a full diagnosis.',\n ),\n );\n };\n proc.once('exit', onEarlyExit);\n\n try {\n await Promise.race([this.waitUntilReady(), exitedBeforeReady]);\n } finally {\n proc.removeListener('exit', onEarlyExit);\n }\n }\n\n private async waitUntilReady(): Promise<void> {\n const deadline = Date.now() + this.loadTimeoutMs;\n let lastError = '';\n while (Date.now() < deadline) {\n if (!this.running) throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'llama-server is not running');\n try {\n const res = await fetchWithTimeout(`${this.endpoint}/health`, { method: 'GET' }, 2_000);\n if (res.status === 200) return;\n lastError = `health status ${res.status}`;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n }\n await new Promise((r) => setTimeout(r, 250));\n }\n throw new ClefError(\n ClefErrorCode.MODEL_LOAD_FAILED,\n `llama-server did not become ready within ${Math.round(this.loadTimeoutMs / 1000)}s (last health check: ${lastError})`,\n 'Large models can take minutes to load. Run `clef-mcp doctor` or try a smaller quantization.',\n );\n }\n\n async decide(input: SystemOneRequest): Promise<SystemOneResponse> {\n const run = this.queue.then(() => this.decideOnce(input));\n // Keep the chain alive even after failures.\n this.queue = run.catch(() => undefined);\n return run;\n }\n\n private async decideOnce(input: SystemOneRequest): Promise<SystemOneResponse> {\n if (!this.running) {\n throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'Runtime is not loaded; call load() first');\n }\n let res: Response;\n try {\n res = await fetchWithTimeout(\n `${this.endpoint}/v1/systemone`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify(input),\n },\n this.requestTimeoutMs,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Inference request failed: ${msg}`,\n msg.includes('abort') ? 'Request timed out. Reduce state size or increase the request timeout.' : undefined,\n );\n }\n\n const bodyText = await res.text();\n let body: unknown = undefined;\n try {\n body = bodyText ? JSON.parse(bodyText) : undefined;\n } catch {\n // Non-JSON body: fall through to the status-based error below.\n }\n\n if (!res.ok) {\n const apiMessage =\n body && typeof body === 'object' && 'error' in body\n ? String((body as { error: { message?: unknown } }).error?.message ?? bodyText)\n : bodyText;\n if (res.status === 413) {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Input exceeds the model context window: ${apiMessage}`,\n 'Reduce the state size or the number/size of questions.',\n );\n }\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Inference failed with HTTP ${res.status}: ${apiMessage.slice(0, 2000)}`,\n /physical batch size/i.test(apiMessage)\n ? 'Too many/too large questions for one request. Split into several calls, reduce criteria text, or raise the batch with CLEF_LLAMA_BATCH.'\n : undefined,\n );\n }\n\n if (!body || typeof body !== 'object') {\n throw new ClefError(\n ClefErrorCode.CLEF_INFERENCE_FAILED,\n `Runtime returned a non-JSON response (HTTP ${res.status})`,\n 'The installed llama.cpp build may not support clef models. Run `clef-mcp doctor`.',\n );\n }\n return body as SystemOneResponse;\n }\n\n async health(): Promise<RuntimeHealth> {\n if (!this.running) return { status: 'unavailable', detail: 'not started' };\n try {\n const res = await fetchWithTimeout(`${this.endpoint}/health`, { method: 'GET' }, 1_500);\n if (res.status === 200) return { status: 'ready' };\n return { status: 'loading', detail: `health status ${res.status}` };\n } catch (err) {\n return { status: 'unavailable', detail: err instanceof Error ? err.message : String(err) };\n }\n }\n\n async unload(): Promise<void> {\n const proc = this.proc;\n if (!proc) return;\n this.proc = undefined;\n if (proc.exitCode !== null || proc.signalCode) return;\n await new Promise<void>((resolve) => {\n const killTimer = setTimeout(() => {\n try {\n proc.kill('SIGKILL');\n } catch {\n // Already gone.\n }\n }, 3_000);\n proc.once('exit', () => {\n clearTimeout(killTimer);\n resolve();\n });\n try {\n proc.kill('SIGTERM');\n } catch {\n clearTimeout(killTimer);\n resolve();\n }\n });\n }\n}\n","import { spawn, type ChildProcess } from 'node:child_process';\nimport net from 'node:net';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { SystemOneRequest, SystemOneResponse } from '../clef/systemone.js';\nimport type { Logger } from '../config/logger.js';\nimport type { ClefRuntime, RuntimeHealth } from './types.js';\n\nexport interface MlxRuntimeOptions {\n /** uv binary (managed snapshots run inside a uv environment). */\n uvBin: string;\n /** Snapshot directory containing clef_mlx.py (the model repo itself). */\n snapshotPath: string;\n host?: string;\n port?: number;\n loadTimeoutMs?: number;\n requestTimeoutMs?: number;\n log?: Logger;\n}\n\nconst STDERR_TAIL_LIMIT = 4000;\n\nfunction freePort(): Promise<number> {\n return new Promise((resolve, reject) => {\n const srv = net.createServer();\n srv.unref();\n srv.on('error', reject);\n srv.listen(0, '127.0.0.1', () => {\n const addr = srv.address();\n const port = typeof addr === 'object' && addr ? addr.port : 0;\n srv.close(() => (port > 0 ? resolve(port) : reject(new Error('could not acquire a free port'))));\n });\n });\n}\n\nasync function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await fetch(url, { ...init, signal: controller.signal });\n } finally {\n clearTimeout(timer);\n }\n}\n\nconst OOM_PATTERNS = ['out of memory', 'failed to allocate', 'unable to allocate', 'not enough memory'];\n\n/**\n * MLX runtime: runs `clef_mlx.py serve` (bundled with the model snapshot)\n * inside a uv environment and talks SystemOne over local HTTP.\n * macOS / Apple Silicon only by nature of MLX.\n */\nexport class MlxRuntime implements ClefRuntime {\n private proc?: ChildProcess;\n private resolvedPort?: number;\n private readonly host: string;\n private readonly loadTimeoutMs: number;\n private readonly requestTimeoutMs: number;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(private readonly opts: MlxRuntimeOptions) {\n this.host = opts.host ?? '127.0.0.1';\n this.loadTimeoutMs = opts.loadTimeoutMs ?? 180_000;\n this.requestTimeoutMs = opts.requestTimeoutMs ?? 120_000;\n }\n\n get endpoint(): string {\n if (!this.resolvedPort) throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'Runtime is not started');\n return `http://${this.host}:${this.resolvedPort}`;\n }\n\n get running(): boolean {\n return this.proc !== undefined && this.proc.exitCode === null;\n }\n\n async load(): Promise<void> {\n if (this.running) return;\n const port = this.opts.port ?? (await freePort());\n this.resolvedPort = port;\n const args = [\n 'run',\n '--directory',\n this.opts.snapshotPath,\n '--with',\n 'mlx-vlm>=0.7.4,<0.8',\n '--with',\n 'huggingface_hub',\n 'python',\n 'clef_mlx.py',\n 'serve',\n '--host',\n this.host,\n '--port',\n String(port),\n ];\n this.opts.log?.debug('spawning clef_mlx.py serve', { uv: this.opts.uvBin, snapshot: this.opts.snapshotPath });\n\n let proc: ChildProcess;\n try {\n proc = spawn(this.opts.uvBin, args, { stdio: ['ignore', 'pipe', 'pipe'], cwd: this.opts.snapshotPath });\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.RUNTIME_INIT_FAILED,\n `Failed to start the MLX server: ${err instanceof Error ? err.message : String(err)}`,\n 'Run `clef-mcp doctor` for a full diagnosis.',\n );\n }\n this.proc = proc;\n\n let stderrTail = '';\n proc.stderr?.on('data', (chunk: Buffer) => {\n const text = chunk.toString();\n stderrTail = (stderrTail + text).slice(-STDERR_TAIL_LIMIT);\n this.opts.log?.debug(text.trimEnd());\n });\n proc.stdout?.on('data', (chunk: Buffer) => {\n this.opts.log?.debug(chunk.toString().trimEnd());\n });\n\n let rejectOnExit: ((err: ClefError) => void) | undefined;\n const exitedBeforeReady = new Promise<never>((_resolve, reject) => {\n rejectOnExit = reject;\n });\n const onEarlyExit = (code: number | null, signal: NodeJS.Signals | null) => {\n const oom = OOM_PATTERNS.some((p) => stderrTail.toLowerCase().includes(p));\n const message = `clef_mlx.py exited before becoming ready (code=${code ?? 'null'}, signal=${signal ?? 'null'})`;\n const tail = stderrTail.trim();\n rejectOnExit?.(\n oom\n ? new ClefError(ClefErrorCode.OUT_OF_MEMORY, message, 'Not enough free memory for this model. Try the llama.cpp runtime with Q4_K_M instead.')\n : new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, message + (tail ? `\\nstderr tail:\\n${tail}` : ''), 'Run `clef-mcp doctor` for a full diagnosis.'),\n );\n };\n proc.once('exit', onEarlyExit);\n\n try {\n await Promise.race([this.waitUntilReady(), exitedBeforeReady]);\n } finally {\n proc.removeListener('exit', onEarlyExit);\n }\n }\n\n private async waitUntilReady(): Promise<void> {\n const deadline = Date.now() + this.loadTimeoutMs;\n let lastError = '';\n while (Date.now() < deadline) {\n if (!this.running) throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'MLX server is not running');\n try {\n const res = await fetchWithTimeout(`${this.endpoint}/health`, { method: 'GET' }, 2_000);\n if (res.status === 200) return;\n lastError = `health status ${res.status}`;\n } catch (err) {\n lastError = err instanceof Error ? err.message : String(err);\n }\n await new Promise((r) => setTimeout(r, 250));\n }\n throw new ClefError(\n ClefErrorCode.MODEL_LOAD_FAILED,\n `MLX server did not become ready within ${Math.round(this.loadTimeoutMs / 1000)}s (last health check: ${lastError})`,\n 'The first load can take a while; subsequent loads reuse the snapshot cache.',\n );\n }\n\n async decide(input: SystemOneRequest): Promise<SystemOneResponse> {\n const run = this.queue.then(() => this.decideOnce(input));\n this.queue = run.catch(() => undefined);\n return run;\n }\n\n private async decideOnce(input: SystemOneRequest): Promise<SystemOneResponse> {\n if (!this.running) {\n throw new ClefError(ClefErrorCode.RUNTIME_INIT_FAILED, 'Runtime is not loaded; call load() first');\n }\n let res: Response;\n try {\n res = await fetchWithTimeout(\n `${this.endpoint}/v1/systemone`,\n { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(input) },\n this.requestTimeoutMs,\n );\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new ClefError(ClefErrorCode.CLEF_INFERENCE_FAILED, `Inference request failed: ${msg}`);\n }\n const bodyText = await res.text();\n let body: unknown = undefined;\n try {\n body = bodyText ? JSON.parse(bodyText) : undefined;\n } catch {\n // handled below\n }\n if (!res.ok) {\n const apiMessage =\n body && typeof body === 'object' && 'error' in body\n ? String((body as { error: { message?: unknown } }).error?.message ?? bodyText)\n : bodyText;\n throw new ClefError(ClefErrorCode.CLEF_INFERENCE_FAILED, `Inference failed with HTTP ${res.status}: ${apiMessage.slice(0, 2000)}`);\n }\n if (!body || typeof body !== 'object') {\n throw new ClefError(ClefErrorCode.CLEF_INFERENCE_FAILED, `Runtime returned a non-JSON response (HTTP ${res.status})`);\n }\n return body as SystemOneResponse;\n }\n\n async health(): Promise<RuntimeHealth> {\n if (!this.running) return { status: 'unavailable', detail: 'not started' };\n try {\n const res = await fetchWithTimeout(`${this.endpoint}/health`, { method: 'GET' }, 1_500);\n if (res.status === 200) return { status: 'ready' };\n return { status: 'loading', detail: `health status ${res.status}` };\n } catch (err) {\n return { status: 'unavailable', detail: err instanceof Error ? err.message : String(err) };\n }\n }\n\n async unload(): Promise<void> {\n const proc = this.proc;\n if (!proc) return;\n this.proc = undefined;\n if (proc.exitCode !== null || proc.signalCode) return;\n await new Promise<void>((resolve) => {\n const killTimer = setTimeout(() => {\n try {\n proc.kill('SIGKILL');\n } catch {\n // already gone\n }\n }, 3_000);\n proc.once('exit', () => {\n clearTimeout(killTimer);\n resolve();\n });\n try {\n proc.kill('SIGTERM');\n } catch {\n clearTimeout(killTimer);\n resolve();\n }\n });\n }\n}\n","import { z } from 'zod';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { Limits } from '../config/limits.js';\n\nfunction criteriaDescription(limits: Limits): z.ZodString {\n return z.string().min(1).max(limits.maxCriteriaDescChars);\n}\n\nfunction countIssues(count: number, limits: Limits): string | undefined {\n if (count === 0) return 'criteria must not be empty';\n if (count > limits.maxCriteriaPerQuestion) return `too many criteria (max ${limits.maxCriteriaPerQuestion})`;\n return undefined;\n}\n\nfunction choiceCriteria(limits: Limits) {\n return z.union([\n // Plain list: option ids equal to the strings themselves.\n z.array(criteriaDescription(limits)).check((ctx) => {\n const problem = countIssues(ctx.value.length, limits);\n if (problem) ctx.issues.push({ code: 'custom', message: problem, input: ctx.value });\n }),\n z\n .record(z.string().min(1).max(limits.maxCriteriaDescChars), criteriaDescription(limits))\n .check((ctx) => {\n const problem = countIssues(Object.keys(ctx.value).length, limits);\n if (problem) ctx.issues.push({ code: 'custom', message: problem, input: ctx.value });\n }),\n ]);\n}\n\nfunction scoreCriteria(limits: Limits) {\n return z\n .array(criteriaDescription(limits))\n .check((ctx) => {\n if (ctx.value.length === 0) ctx.issues.push({ code: 'custom', message: 'criteria must not be empty', input: ctx.value });\n if (ctx.value.length > limits.maxCriteriaPerQuestion) {\n ctx.issues.push({ code: 'custom', message: `too many criteria (max ${limits.maxCriteriaPerQuestion})`, input: ctx.value });\n }\n });\n}\n\nfunction questionSchema(limits: Limits) {\n return z\n .object({\n type: z\n .enum(['noul', 'choice', 'score'])\n .describe('\"choice\" = pick among named options; \"score\" = judge an ordered scale; \"noul\" = yes/no question'),\n instructions: z\n .string()\n .min(1)\n .max(limits.maxInstructionsChars)\n .describe('What to judge, phrased as a self-contained question.'),\n criteria: z.union([z.array(z.string()), z.record(z.string(), z.string())]).optional(),\n })\n .describe(\n 'A single decision question. Allowed answers come from `criteria` and must be mutually exclusive and collectively exhaustive.',\n )\n .superRefine((q, ctx) => {\n if (q.type === 'choice') {\n // Spec §3 allows both shapes for choice: a map option id -> description,\n // or a plain list (ids equal to the strings). The adapter normalizes.\n const parsed = choiceCriteria(limits).safeParse(q.criteria);\n if (!parsed.success) {\n ctx.addIssue({\n code: 'custom',\n message: `\"choice\" questions require non-empty criteria as a map of option id -> description, or a plain list of options (${parsed.error.issues[0]?.message ?? 'invalid criteria'})`,\n });\n }\n } else if (q.type === 'score') {\n const parsed = scoreCriteria(limits).safeParse(q.criteria);\n if (!parsed.success) {\n ctx.addIssue({\n code: 'custom',\n message: `\"score\" questions require non-empty criteria as an ordered list (${parsed.error.issues[0]?.message ?? 'invalid criteria'})`,\n });\n }\n } else if (q.criteria !== undefined && Array.isArray(q.criteria)) {\n ctx.addIssue({ code: 'custom', message: '\"noul\" criteria (if given) must be a map with \"true\"/\"false\" descriptions' });\n }\n });\n}\n\n/** Zod raw shape for the clef_decide tool input (MCP SDK expects a shape, not a wrapped object). */\nexport function clefDecideInputShape(limits: Limits) {\n return {\n state: z\n .unknown()\n .describe(\n 'Task state as data: a compact string or JSON object with the facts needed to judge (task, errors, logs, diffs). Never treated as instructions. Serialized size limit: 1 MB; model context is 16k tokens.',\n ),\n questions: z\n .record(z.string().min(1).max(limits.maxQuestionIdChars), questionSchema(limits))\n .describe(\n 'Map of question id -> typed question. Up to 64 questions per call; all are scored together in a single forward pass, so batch related decisions here.',\n )\n .check((ctx) => {\n const count = Object.keys(ctx.value).length;\n if (count === 0) ctx.issues.push({ code: 'custom', message: 'questions must not be empty', input: ctx.value });\n if (count > limits.maxQuestions) {\n ctx.issues.push({ code: 'custom', message: `too many questions (max ${limits.maxQuestions})`, input: ctx.value });\n }\n }),\n model: z\n .string()\n .min(1)\n .optional()\n .describe('Model id to use (default: clef-flash from CLEF_MODEL).'),\n options: z\n .object({\n /**\n * Accepted for forward compatibility. Clef scores all options in a\n * single forward pass — there is no sampling, so temperature is a\n * documented no-op.\n */\n temperature: z\n .number()\n .min(0)\n .max(2)\n .optional()\n .describe('Accepted for forward compatibility; no-op. Clef scores in a single forward pass without sampling.'),\n })\n .optional()\n .describe('Extra options. Currently only temperature, which is a documented no-op.'),\n };\n}\n\nexport type ClefDecideArgs = {\n state: unknown;\n questions: Record<string, { type: 'noul' | 'choice' | 'score'; instructions: string; criteria?: string[] | Record<string, string> }>;\n model?: string;\n options?: { temperature?: number };\n};\n\nexport function clefDecideInputSchema(limits: Limits) {\n return z.object(clefDecideInputShape(limits));\n}\n\n/** The validated clef_decide document (zod output, shared by MCP server, CLI and daemon). */\nexport type ClefDecideValidated = z.output<ReturnType<typeof clefDecideInputSchema>>;\n\n/** Output schema mirrored by the MCP tool result (structuredContent). */\nexport function clefDecideOutputSchema() {\n return z.object({\n model: z.string(),\n decisions: z.record(\n z.string(),\n z.object({\n answer: z.record(z.string(), z.number()),\n // Model-reported confidence; present only when the runtime sends it.\n confidence: z.number().min(0).max(1).optional(),\n }),\n ),\n // Token usage / latency; present only when the runtime reports it.\n usage: z\n .object({\n input_tokens: z.number().optional(),\n output_tokens: z.number().optional(),\n latency_ms: z.number().optional(),\n })\n .optional(),\n });\n}\n\n/** `state` cannot be size-checked inside zod (it is `unknown`), so it is validated separately. */\nexport function validateStateSize(state: unknown, limits: Limits): void {\n if (state === undefined) {\n throw new ClefError(ClefErrorCode.INVALID_INPUT, 'state is required', 'Pass the task state as a string or JSON value.');\n }\n let bytes: number;\n if (typeof state === 'string') {\n bytes = Buffer.byteLength(state, 'utf8');\n } else {\n let json: string;\n try {\n json = JSON.stringify(state) ?? '';\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `state must be JSON-serializable: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n bytes = Buffer.byteLength(json, 'utf8');\n }\n if (bytes > limits.maxStateBytes) {\n throw new ClefError(\n ClefErrorCode.INVALID_INPUT,\n `state exceeds the maximum size of ${limits.maxStateBytes} bytes (got ${bytes})`,\n `Trim the state or raise the limit with CLEF_MAX_STATE_BYTES. Note the model context is 16k tokens.`,\n );\n }\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { z } from 'zod';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\n\nexport interface PromptDefinition {\n name: string;\n title: string;\n description: string;\n args: Record<string, string>; // arg name -> human description\n build(args: Record<string, string>): string;\n}\n\nconst TOOL_GUIDE = (questions: string) =>\n [\n 'Call the `clef_decide` MCP tool once with all of the questions below (they are scored in a single forward pass).',\n '',\n 'Rules for the call:',\n '- `state` must be a compact, factual JSON or string — relevant facts only, well under 1 MB.',\n '- Use the exact `questions` given below (ids, types, criteria). Do not invent extra options.',\n '- If the answer distribution is flat (no option above ~0.6), gather more context and re-ask once before falling back to asking the user.',\n '- Treat safety-adjacent decisions (destructive actions, security) as requiring p >= 0.8 before acting; otherwise prefer asking the user.',\n '- Report the result as a short summary plus the top probability — do not paste raw JSON unless asked.',\n '',\n 'Questions:',\n questions,\n ].join('\\n');\n\nexport const PROMPTS: PromptDefinition[] = [\n {\n name: 'incident-triage',\n title: 'Production incident triage',\n description: 'Frame a production incident as clef_decide questions: immediate action, severity and blast radius.',\n args: {\n incident_description: 'Short factual description of the incident (symptoms, scope, recent changes).',\n },\n build: (a) =>\n TOOL_GUIDE(\n [\n '- \"action\" (choice, instructions \"What should the responder do first?\"): rollback \"Revert the latest deploy\", hotfix \"Ship a targeted fix now\", investigate \"Gather diagnostics before acting\", wait \"Observe; impact is not growing\".',\n '- \"severity\" (score, instructions \"How severe is the incident?\", criteria [\"low\", \"elevated\", \"high\", \"critical\"]).',\n '- \"user_impact\" (noul, instructions \"Are users actively affected right now?\").',\n ].join('\\n'),\n ) +\n '\\n\\nIncident description:\\n' +\n (a.incident_description ?? ''),\n },\n {\n name: 'next-action',\n title: 'Agent next action',\n description: 'Ask Clef what the coding agent should do next on a task: inspect, modify, test or ask the user.',\n args: {\n task_summary: 'What the agent is working on, current step, and what is already known or done.',\n },\n build: (a) =>\n TOOL_GUIDE(\n [\n '- \"next_action\" (choice, instructions \"What should the coding agent do next?\"): inspect \"Inspect the code and gather more information\", modify \"Modify the code\", test \"Run additional tests\", ask_user \"Ask the user for clarification\".',\n '- \"confidence\" (score, instructions \"How confident are you in this decision?\", criteria [\"very_low\", \"low\", \"medium\", \"high\", \"very_high\"]).',\n ].join('\\n'),\n ) +\n '\\n\\nTask summary:\\n' +\n (a.task_summary ?? ''),\n },\n {\n name: 'ticket-routing',\n title: 'Support ticket routing',\n description: 'Classify an incoming message into the team that should handle it.',\n args: {\n ticket_text: 'The customer or user message, verbatim if possible.',\n },\n build: (a) =>\n TOOL_GUIDE(\n [\n '- \"department\" (choice, instructions \"Which team should handle the message?\"): billing \"Payments, invoices and refunds\", technical \"Bugs, errors and outages\", sales \"Pricing and new purchases\", other \"Anything else\".',\n '- \"urgent\" (noul, instructions \"Does this need a response within the hour?\").',\n ].join('\\n'),\n ) +\n '\\n\\nTicket text:\\n' +\n (a.ticket_text ?? ''),\n },\n {\n name: 'security-review',\n title: 'Security sanity check',\n description: 'Ask Clef whether a code snippet, change or setup smells like a security problem.',\n args: {\n change_summary: 'The code, config or setup to review — compact but complete enough to judge.',\n },\n build: (a) =>\n TOOL_GUIDE(\n [\n '- \"is_vulnerable\" (noul, instructions \"Does this contain a realistic security vulnerability?\").',\n '- \"risk\" (score, instructions \"How bad is it if this ships as-is?\", criteria [\"informational\", \"low\", \"medium\", \"high\", \"critical\"]).',\n '- \"first_mitigation\" (choice, instructions \"What is the first mitigation?\"): fix_code \"Fix the code before merging\", restrict \"Restrict access or add guardrails\", monitor \"Add detection and monitoring\", none \"No mitigation needed\".',\n ].join('\\n') +\n '\\nSafety rule: only act without human review when p(is_vulnerable=false) >= 0.8.',\n ) +\n '\\n\\nChange to review:\\n' +\n (a.change_summary ?? ''),\n },\n];\n\n/** Register all bundled prompts on the server. */\nexport function registerPrompts(server: McpServer): void {\n for (const p of PROMPTS) {\n server.registerPrompt(\n p.name,\n {\n title: p.title,\n description: p.description,\n argsSchema: Object.fromEntries(Object.entries(p.args).map(([k, v]) => [k, z.string().min(1).describe(v)])),\n },\n ({ ...args }) => {\n for (const key of Object.keys(p.args)) {\n if (typeof args[key] !== 'string' || !args[key]) {\n throw new ClefError(ClefErrorCode.INVALID_INPUT, `Prompt argument \"${key}\" is required`);\n }\n }\n return {\n messages: [{ role: 'user' as const, content: { type: 'text' as const, text: p.build(args as Record<string, string>) } }],\n };\n },\n );\n }\n}\n","import fsSync from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { ClefConfig } from '../config/env.js';\nimport { defaultDatasetPath } from '../cli/evals.js';\n\nexport const EVALS_SCHEMA_MD = `# clef-mcp eval dataset format\n\nJSONL: one JSON object per line.\n\n{\n \"id\": \"unique-case-id\",\n \"category\": \"coding | security | classification | routing | yes_no\",\n \"state\": <string | JSON value>,\n \"question\": {\n \"id\": \"question-id\",\n \"type\": \"choice | score | noul\",\n \"instructions\": \"…\",\n \"criteria\": { \"option\": \"description\" } // choice (or [\"a\",\"b\"] list)\n | [\"low\", \"high\"] // score, ordered\n },\n \"expected\": {\n \"kind\": \"argmax | prob_gt | min_prob | top_mass\",\n // argmax: { \"expect\": \"option\", \"among\": [\"option\", ...] (optional) }\n // prob_gt: { \"a\": \"opt\", \"b\": \"opt\" }\n // min_prob: { \"option\": \"opt\", \"min\": 0.7 }\n // top_mass: { \"options\": [\"a\",\"b\"], \"min\": 0.8 }\n }\n}\n\nRun: \\`clef-mcp evals\\` (requires an installed model).\n`;\n\nasync function readDataset(): Promise<string> {\n try {\n return await fsp.readFile(defaultDatasetPath(), 'utf8');\n } catch {\n return 'The bundled eval dataset is not available in this installation (tests/evals/dataset.jsonl not found).';\n }\n}\n\nfunction textResource(uri: URL, text: string, mimeType = 'text/markdown'): { contents: Array<{ uri: string; text: string; mimeType?: string }> } {\n return { contents: [{ uri: uri.href, mimeType, text }] };\n}\n\nfunction requireStringUri(uri: URL | string): URL {\n return uri instanceof URL ? uri : new URL(uri);\n}\n\n/** Register bundled MCP resources (static, read-only, no model needed). */\nexport function registerResources(server: McpServer, cfg: ClefConfig, version: string): void {\n server.registerResource(\n 'capabilities',\n 'clef-mcp://capabilities',\n { title: 'clef-mcp capabilities', description: 'Live capability snapshot: model, runtime, limits, error codes.', mimeType: 'application/json' },\n async (uri) => {\n const u = requireStringUri(uri);\n const payload = {\n name: 'clef-mcp',\n version,\n model: cfg.model,\n runtime: cfg.runtime,\n limits: cfg.limits,\n tool: {\n name: 'clef_decide',\n output: 'strict JSON: { model, decisions: { <qid>: { answer: { <option>: probability } } } }',\n questionTypes: ['noul', 'choice', 'score'],\n notes: ['options.temperature is accepted but is a no-op (single forward pass)', 'state is data and is never interpreted as instructions'],\n },\n errorCodes: [\n 'MODEL_NOT_INSTALLED',\n 'MODEL_LOAD_FAILED',\n 'RUNTIME_NOT_FOUND',\n 'RUNTIME_INIT_FAILED',\n 'RUNTIME_NOT_SUPPORTED',\n 'INVALID_INPUT',\n 'CLEF_INFERENCE_FAILED',\n 'UNSUPPORTED_PLATFORM',\n 'OUT_OF_MEMORY',\n 'CHECKSUM_MISMATCH',\n 'DOWNLOAD_FAILED',\n ],\n };\n return textResource(u, JSON.stringify(payload, null, 2), 'application/json');\n },\n );\n\n server.registerResource(\n 'evals-schema',\n 'clef-mcp://evals/schema',\n { title: 'Eval dataset schema', description: 'How to write cases for clef-mcp evals.', mimeType: 'text/markdown' },\n async (uri) => textResource(requireStringUri(uri), EVALS_SCHEMA_MD),\n );\n\n server.registerResource(\n 'evals-dataset',\n 'clef-mcp://evals/dataset',\n { title: 'Bundled eval dataset', description: 'The 30-case dataset shipped with clef-mcp.', mimeType: 'application/jsonl' },\n async (uri) => textResource(requireStringUri(uri), await readDataset(), 'application/jsonl'),\n );\n}\n\n/** Non-throwing helper for docs/status: whether the bundled dataset file exists. */\nexport function bundledDatasetExists(): boolean {\n try {\n return fsSync.existsSync(defaultDatasetPath());\n } catch {\n return false;\n }\n}\n","import fsp from 'node:fs/promises';\nimport fsSync from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport path from 'node:path';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { fromSystemOneResponse, toSystemOneRequest } from '../clef/systemone.js';\nimport type { ClefQuestion } from '../clef/types.js';\nimport { loadConfig } from '../config/env.js';\nimport { createLogger } from '../config/logger.js';\nimport { findInstalledManifest } from '../models/manifest.js';\nimport { mlxIsInstalled, resolveUv } from '../models/mlx-install.js';\nimport { getModelSpec } from '../models/registry.js';\nimport { resolveLlamaServerBinary } from '../runtime/binary.js';\nimport { LlamaCppRuntime } from '../runtime/llama-cpp.js';\nimport { MlxRuntime } from '../runtime/mlx.js';\n\nexport interface EvalsOptions {\n dataset?: string;\n limit?: number;\n minRate?: number;\n}\n\ntype Expected =\n | { kind: 'argmax'; expect: string; among?: string[] }\n | { kind: 'prob_gt'; a: string; b: string }\n | { kind: 'min_prob'; option: string; min: number }\n | { kind: 'top_mass'; options: string[]; min: number };\n\ninterface EvalCase {\n id: string;\n category: string;\n state: unknown;\n question: ClefQuestion & { id: string };\n expected: Expected;\n}\n\nexport function defaultDatasetPath(): string {\n // Works from dist/ (packaged layout: <root>/dist/cli.js + <root>/tests/evals)\n // and from src/ under vitest. Walk up until the dataset is found.\n let dir = path.dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 6; i++) {\n const candidate = path.join(dir, 'tests', 'evals', 'dataset.jsonl');\n if (fsSync.existsSync(candidate)) return candidate;\n dir = path.dirname(dir);\n }\n return fileURLToPath(new URL('../tests/evals/dataset.jsonl', import.meta.url));\n}\n\nfunction parseLine(line: string, lineNo: number): EvalCase {\n const raw = JSON.parse(line) as EvalCase;\n if (typeof raw.id !== 'string' || !raw.question?.id || !raw.expected?.kind) {\n throw new ClefError(ClefErrorCode.INVALID_INPUT, `Eval dataset line ${lineNo} is missing id/question/expected`);\n }\n return raw;\n}\n\nfunction evaluate(answer: Record<string, number>, exp: Expected): { pass: boolean; detail: string } {\n const prob = (key: string): number => answer[key] ?? 0;\n switch (exp.kind) {\n case 'argmax': {\n const keys = exp.among ?? Object.keys(answer);\n let best = '';\n let bestP = -1;\n for (const k of keys) {\n if (prob(k) > bestP) {\n bestP = prob(k);\n best = k;\n }\n }\n return { pass: best === exp.expect, detail: `argmax=${best || 'n/a'} (${bestP.toFixed(3)}), expected=${exp.expect}` };\n }\n case 'prob_gt':\n return { pass: prob(exp.a) > prob(exp.b), detail: `p(${exp.a})=${prob(exp.a).toFixed(3)} vs p(${exp.b})=${prob(exp.b).toFixed(3)}` };\n case 'min_prob': {\n const p = prob(exp.option);\n return { pass: p >= exp.min, detail: `p(${exp.option})=${p.toFixed(3)}, required >= ${exp.min}` };\n }\n case 'top_mass': {\n const mass = exp.options.reduce((sum, k) => sum + prob(k), 0);\n return { pass: mass >= exp.min, detail: `mass(${exp.options.join('+')})=${mass.toFixed(3)}, required >= ${exp.min}` };\n }\n }\n}\n\nexport async function runEvals(opts: EvalsOptions): Promise<boolean> {\n const config = loadConfig();\n const log = createLogger(config.logLevel);\n const spec = getModelSpec(config.model);\n let mlxManifest;\n if (config.runtime === 'mlx') {\n mlxManifest = await mlxIsInstalled(config.clefHome);\n if (!mlxManifest) {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `Model \"${spec.id}\" is not installed for the MLX runtime.`,\n 'Run `clef-mcp install --runtime mlx` first.',\n );\n }\n }\n const manifest = config.runtime === 'mlx' ? undefined : await findInstalledManifest(config.clefHome, spec);\n if (!manifest && !mlxManifest) {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `Model \"${spec.id}\" is not installed; evals need the local model.`,\n 'Run `clef-mcp install` first.',\n );\n }\n\n const datasetPath = opts.dataset ?? defaultDatasetPath();\n const content = await fsp.readFile(datasetPath, 'utf8');\n let cases = content\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l && !l.startsWith('#'))\n .map((l, i) => parseLine(l, i + 1));\n if (opts.limit && opts.limit > 0) cases = cases.slice(0, opts.limit);\n if (cases.length === 0) {\n throw new ClefError(ClefErrorCode.INVALID_INPUT, `No eval cases found in ${datasetPath}`);\n }\n\n const binary = resolveLlamaServerBinary(config);\n const runtime =\n config.runtime === 'mlx'\n ? new MlxRuntime({ uvBin: resolveUv(process.env.CLEF_MLX_UV), snapshotPath: mlxManifest!.snapshotPath, log })\n : new LlamaCppRuntime({ serverBin: binary.path, modelPath: manifest!.modelPath, alias: spec.id, log });\n const runtimeLabel = config.runtime === 'mlx' ? 'MLX' : manifest!.quant;\n console.log(`Running ${cases.length} eval case(s) with ${spec.id} ${runtimeLabel}...\\n`);\n await runtime.load();\n\n let passed = 0;\n const results: Array<{ id: string; category: string; ok: boolean; detail: string }> = [];\n try {\n for (const [i, c] of cases.entries()) {\n process.stderr.write(`\\r case ${i + 1}/${cases.length} — ${c.id}`);\n try {\n const request = toSystemOneRequest({ state: c.state, questions: { [c.question.id]: c.question } }, spec.id);\n const response = await runtime.decide(request);\n const output = fromSystemOneResponse(response, { [c.question.id]: c.question }, spec.id);\n const answer = output.decisions[c.question.id]?.answer ?? {};\n const verdict = evaluate(answer, c.expected);\n if (verdict.pass) passed++;\n results.push({ id: c.id, category: c.category, ok: verdict.pass, detail: verdict.detail });\n } catch (err) {\n results.push({\n id: c.id,\n category: c.category,\n ok: false,\n detail: `error: ${err instanceof Error ? err.message : String(err)}`,\n });\n }\n }\n } finally {\n process.stderr.write('\\n');\n await runtime.unload();\n }\n\n console.log('');\n for (const r of results) {\n console.log(`${r.ok ? '✔' : '✘'} [${r.category}] ${r.id} — ${r.detail}`);\n }\n const rate = passed / results.length;\n const minRate = opts.minRate ?? 0.8;\n console.log(`\\n${passed}/${results.length} passed (${(rate * 100).toFixed(1)}%), required >= ${(minRate * 100).toFixed(0)}%`);\n return rate >= minRate;\n}\n","import net from 'node:net';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { ClefError, ClefErrorCode, errorJson } from '../clef/errors.js';\nimport { fromSystemOneResponse, toSystemOneRequest } from '../clef/systemone.js';\nimport type { ClefConfig } from '../config/env.js';\nimport type { Logger } from '../config/logger.js';\nimport { getModelSpec } from '../models/registry.js';\nimport { clefDecideInputSchema, validateStateSize, type ClefDecideValidated } from '../mcp/schema.js';\nimport { RuntimeLoader } from '../runtime/loader.js';\n\nexport function daemonSocketPath(clefHome: string): string {\n return path.join(clefHome, 'daemon.sock');\n}\n\nexport interface RunningDaemon {\n /** Resolves once the socket is listening. */\n ready: Promise<void>;\n close(): Promise<void>;\n}\n\ninterface DaemonRequest {\n ping?: boolean;\n state?: unknown;\n questions?: unknown;\n model?: unknown;\n}\n\n/**\n * Serialize inference: the model is a serial GPU resource, so requests are\n * answered strictly one at a time in arrival order.\n */\nfunction createQueue() {\n let tail: Promise<unknown> = Promise.resolve();\n return function enqueue<T>(task: () => Promise<T>): Promise<T> {\n const run = tail.then(task, task);\n tail = run.catch(() => undefined);\n return run;\n };\n}\n\n/**\n * Long-lived local daemon: keeps the model warm and answers newline-delimited\n * JSON requests on a 0600 unix socket inside CLEF_HOME. Protocol per line:\n * -> {state, questions, model?} | {ping: true}\n * <- {model, decisions, usage?} | {error: {code, message, hint?}}\n * Nothing is downloaded and no TCP port is opened; the socket file's own\n * permissions (default umask) are the access control.\n */\nexport function startDaemon(config: ClefConfig, log: Logger): RunningDaemon {\n const socketPath = daemonSocketPath(config.clefHome);\n const loader = new RuntimeLoader(config, log);\n const enqueue = createQueue();\n let lastUsedAt = Date.now();\n let closed = false;\n\n const ready = (async () => {\n await fsp.mkdir(config.clefHome, { recursive: true });\n // A leftover socket file from a crashed daemon must not wedge startup:\n // if something alive answers on it, refuse; otherwise remove and rebind.\n const live = await new Promise<boolean>((resolve) => {\n const probe = net.connect(socketPath);\n // A successful connect means a listener exists — the daemon protocol is\n // silent until a request is sent, so we must not wait for data.\n probe.once('connect', () => {\n probe.destroy();\n resolve(true);\n });\n probe.once('error', () => resolve(false));\n });\n if (live) {\n throw new ClefError(\n ClefErrorCode.RUNTIME_INIT_FAILED,\n `Another clef-mcp daemon is already listening on ${socketPath}.`,\n 'Stop it (kill $(cat the daemon pid)) or remove CLEF_DAEMON_IDLE-stale sockets and retry.',\n );\n }\n await fsp.rm(socketPath, { force: true });\n\n const server = net.createServer((socket) => {\n let buffer = '';\n socket.on('data', (chunk) => {\n buffer += chunk.toString('utf8');\n let nl: number;\n while ((nl = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, nl);\n buffer = buffer.slice(nl + 1);\n if (!line.trim()) continue;\n handleLine(line, socket).catch((err) => {\n log.error('daemon request failed', errorJson(err).error);\n writeLine(socket, errorJson(err));\n });\n }\n });\n });\n\n server.listen(socketPath);\n log.info('clef-mcp daemon listening', { socket: socketPath });\n\n const idleMs = config.daemonIdleSeconds * 1000;\n const idleTimer = config.daemonIdleSeconds > 0\n ? setInterval(() => {\n if (closed || Date.now() - lastUsedAt < idleMs) return;\n void loader.dispose().then(() => log.info('daemon idle, model unloaded'));\n }, Math.min(idleMs, 60_000))\n : undefined;\n if (idleTimer) idleTimer.unref();\n\n const shutdown = () => {\n closed = true;\n if (idleTimer) clearInterval(idleTimer);\n void (async () => {\n server.close();\n await fsp.rm(socketPath, { force: true });\n await loader.dispose();\n log.info('clef-mcp daemon stopped');\n })().finally(() => process.exit(0));\n };\n process.once('SIGINT', shutdown);\n process.once('SIGTERM', shutdown);\n\n await new Promise<void>((resolve, reject) => {\n server.once('listening', resolve);\n server.once('error', reject);\n });\n })();\n\n async function handleLine(line: string, socket: net.Socket): Promise<void> {\n let request: DaemonRequest;\n try {\n request = JSON.parse(line) as DaemonRequest;\n } catch (err) {\n writeLine(socket, errorJson(new ClefError(ClefErrorCode.INVALID_INPUT, `request is not valid JSON: ${err instanceof Error ? err.message : String(err)}`)));\n return;\n }\n if (request.ping) {\n writeLine(socket, { pong: true, model: config.model });\n return;\n }\n lastUsedAt = Date.now();\n const result = await enqueue(() => decideOnce(request));\n writeLine(socket, result);\n }\n\n async function decideOnce(request: DaemonRequest): Promise<Record<string, unknown>> {\n let parsed: ClefDecideValidated;\n try {\n parsed = clefDecideInputSchema(config.limits).parse({ state: request.state, questions: request.questions, ...(typeof request.model === 'string' ? { model: request.model } : {}) });\n } catch (err) {\n if (err instanceof ClefError) throw err;\n const issue = (err as { issues?: Array<{ path?: Array<string | number>; message: string }> }).issues?.[0];\n const where = issue?.path?.length ? issue.path.join('.') : 'input';\n throw new ClefError(ClefErrorCode.INVALID_INPUT, `${where}: ${issue?.message ?? 'invalid input'}`);\n }\n validateStateSize(parsed.state, config.limits);\n const spec = getModelSpec(parsed.model ?? config.model);\n const { runtime } = await loader.ensure(spec);\n const response = await runtime.decide(toSystemOneRequest({ state: parsed.state, questions: parsed.questions, model: spec.id }, spec.id));\n return fromSystemOneResponse(response, parsed.questions, spec.id) as unknown as Record<string, unknown>;\n }\n\n return {\n ready,\n close: async () => {\n closed = true;\n await loader.dispose();\n await fsp.rm(socketPath, { force: true });\n },\n };\n}\n\nfunction writeLine(socket: net.Socket, payload: unknown): void {\n socket.write(`${JSON.stringify(payload)}\\n`);\n}\n","import fsp from 'node:fs/promises';\nimport { ZodError } from 'zod';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { fromSystemOneResponse, toSystemOneRequest } from '../clef/systemone.js';\nimport { loadConfig } from '../config/env.js';\nimport { createLogger } from '../config/logger.js';\nimport { getModelSpec } from '../models/registry.js';\nimport { clefDecideInputSchema, validateStateSize, type ClefDecideValidated } from '../mcp/schema.js';\nimport { RuntimeLoader } from '../runtime/loader.js';\nimport { daemonSocketPath } from '../daemon/daemon.js';\nimport { decideViaDaemon } from '../daemon/client.js';\n\nexport interface DecideOptions {\n /** Path to a state file, \"-\" for stdin, or an inline JSON/text value. */\n state?: string;\n /** Path to a JSON file with the questions map (\"-\" for stdin). */\n questions?: string;\n model?: string;\n /** Route the request through a running `clef-mcp daemon` (falls back to a cold run). */\n daemon?: boolean;\n}\n\nfunction invalid(message: string, hint?: string): ClefError {\n return new ClefError(ClefErrorCode.INVALID_INPUT, message, hint);\n}\n\nasync function readStdin(): Promise<string> {\n if (process.stdin.isTTY) return '';\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) chunks.push(chunk as Buffer);\n return Buffer.concat(chunks).toString('utf8');\n}\n\n/** Parse a JSON document, mapping failures to INVALID_INPUT with a useful hint. */\nfunction parseJson(text: string, what: string): unknown {\n try {\n return JSON.parse(text);\n } catch (err) {\n throw invalid(\n `${what} is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,\n `${what} must be a JSON document (object for state, { \"qid\": {...} } map for questions).`,\n );\n }\n}\n\n/** Read a source that is either a file path, \"-\" (stdin) or an inline value. */\nasync function readSource(source: string | undefined, what: string, stdin: string): Promise<unknown> {\n if (source === undefined || source === '') {\n throw invalid(`${what} is required`, `Pass --${what} <file|\"-\" for stdin|inline JSON> or pipe a full document to stdin.`);\n }\n if (source === '-') {\n if (!stdin) throw invalid(`no data on stdin for --${what} -`, 'Pipe the JSON in or pass a file path.');\n return parseJson(stdin, what);\n }\n try {\n await fsp.access(source);\n const content = await fsp.readFile(source, 'utf8');\n return parseJson(content, what);\n } catch (err) {\n if (err instanceof ClefError) throw err;\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n // Not an existing file: treat the value as inline JSON (or a bare string).\n // A typo'd path must not silently become the state text, so say so.\n if (!source.includes('\\n')) {\n process.stderr.write(`clef-mcp decide: ${source} is not an existing file; using the value as inline ${what}\\n`);\n }\n const trimmed = source.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) return parseJson(trimmed, what);\n return source;\n }\n}\n\n/**\n * One-shot decision: read state + questions, run a single inference through\n * the shared runtime loader, print the strict JSON result to stdout and exit.\n * Nothing is ever downloaded here; a missing model is a structured error.\n */\nexport async function runDecide(opts: DecideOptions): Promise<void> {\n const config = loadConfig();\n const log = createLogger(config.logLevel);\n const stdin = await readStdin();\n\n let state: unknown;\n let questions: unknown;\n let model: string | undefined;\n\n if (opts.questions !== undefined) {\n questions = await readSource(opts.questions, 'questions', stdin);\n state = await readSource(opts.state, 'state', opts.state === '-' ? stdin : '');\n } else {\n if (!stdin) {\n throw invalid(\n 'no input on stdin',\n 'Pipe a JSON document {\"state\": ..., \"questions\": {...}} to stdin, or pass --questions <file> (and optionally --state <file>).',\n );\n }\n const doc = parseJson(stdin, 'input');\n if (!doc || typeof doc !== 'object' || Array.isArray(doc)) {\n throw invalid('stdin input must be a JSON object with \"state\" and \"questions\"', 'See the clef-mcp README for the document shape.');\n }\n const record = doc as Record<string, unknown>;\n state = record.state;\n questions = record.questions;\n if (typeof record.model === 'string') model = record.model;\n }\n\n const doc = { state, questions, ...(model ? { model } : {}) };\n\n if (opts.daemon) {\n const answered = await tryDaemon(config, doc);\n if (answered) {\n await new Promise<void>((resolve, reject) =>\n process.stdout.write(`${JSON.stringify(answered)}\\n`, (err) => (err ? reject(err) : resolve())),\n );\n return;\n }\n }\n\n const parsed = validateDoc(config, doc);\n const spec = getModelSpec(parsed.model ?? config.model);\n const loader = new RuntimeLoader(config, log);\n try {\n const request = toSystemOneRequest({ state: parsed.state, questions: parsed.questions, model: spec.id }, spec.id);\n const { runtime } = await loader.ensure(spec);\n const response = await runtime.decide(request);\n const output = fromSystemOneResponse(response, parsed.questions, spec.id);\n await new Promise<void>((resolve, reject) =>\n process.stdout.write(`${JSON.stringify(output)}\\n`, (err) => (err ? reject(err) : resolve())),\n );\n } finally {\n await loader.dispose();\n }\n}\n\n/** Try the local daemon; undefined means \"not reachable, fall back to a cold run\". */\nasync function tryDaemon(config: ReturnType<typeof loadConfig>, doc: unknown): Promise<Record<string, unknown> | undefined> {\n const result = await decideViaDaemon(daemonSocketPath(config.clefHome), doc);\n if (result === undefined) {\n process.stderr.write('clef-mcp decide: no daemon reachable; running a cold decision\\n');\n return undefined;\n }\n if (result.error && typeof result.error === 'object') {\n const e = result.error as { code: string; message: string; hint?: string };\n throw new ClefError(e.code as ClefErrorCode, e.message, e.hint);\n }\n return result;\n}\n\nfunction validateDoc(config: ReturnType<typeof loadConfig>, doc: { state: unknown; questions: unknown; model?: string }) {\n let parsed: ClefDecideValidated;\n try {\n parsed = clefDecideInputSchema(config.limits).parse(doc);\n } catch (err) {\n // CLI callers (hooks, scripts) need the structured INVALID_INPUT code, not a raw ZodError.\n if (err instanceof ZodError) {\n const issue = err.issues[0];\n const where = issue?.path?.length ? issue.path.join('.') : 'input';\n throw invalid(\n `${where}: ${issue?.message ?? 'invalid input'}`,\n 'Fix the field the path names and retry. Shapes: state is a JSON value or string; questions map qid -> {type, instructions, criteria?}.',\n );\n }\n throw err;\n }\n validateStateSize(parsed.state, config.limits);\n return parsed;\n}\n","import net from 'node:net';\n\n/**\n * Send one newline-delimited request to the clef-mcp daemon and read the one\n * line answer. Resolves undefined if the socket never connects; rejects on\n * timeout or protocol garbage so the caller can fall back to a cold run.\n */\nexport function decideViaDaemon(socketPath: string, doc: unknown, timeoutMs = 120_000): Promise<Record<string, unknown> | undefined> {\n return new Promise((resolve, reject) => {\n const socket = net.connect(socketPath);\n let buffer = '';\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n socket.destroy();\n reject(new Error(`daemon did not answer within ${timeoutMs} ms`));\n }, timeoutMs);\n\n const finish = (fn: () => void) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n socket.destroy();\n fn();\n };\n\n socket.once('connect', () => {\n socket.write(`${JSON.stringify(doc)}\\n`);\n });\n socket.on('data', (chunk) => {\n buffer += chunk.toString('utf8');\n const nl = buffer.indexOf('\\n');\n if (nl < 0) return;\n const line = buffer.slice(0, nl);\n finish(() => {\n try {\n resolve(JSON.parse(line) as Record<string, unknown>);\n } catch {\n reject(new Error('daemon returned a non-JSON answer'));\n }\n });\n });\n socket.once('error', (err) => {\n // ECONNREFUSED / ENOENT simply mean \"no daemon\"; anything after connect is real.\n if (settled) return;\n finish(() => {\n if ((err as NodeJS.ErrnoException).code === 'ECONNREFUSED' || (err as NodeJS.ErrnoException).code === 'ENOENT') {\n resolve(undefined);\n } else {\n reject(err);\n }\n });\n });\n });\n}\n","import { execFile } from 'node:child_process';\nimport os from 'node:os';\nimport { promisify } from 'node:util';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { ClefError } from '../clef/errors.js';\nimport { loadConfig } from '../config/env.js';\nimport { pathsFor } from '../config/paths.js';\nimport { deepVerifyChecksum, findInstalledManifest, verifyModelFiles } from '../models/manifest.js';\nimport { assertSupportedPlatform, detectPlatform, formatBytes } from '../models/platform.js';\nimport { getModelSpec } from '../models/registry.js';\nimport { mlxIsInstalled, resolveUv } from '../models/mlx-install.js';\nimport { resolveLlamaServerBinary } from '../runtime/binary.js';\nimport { probeInference, probeMlxInference } from '../runtime/probe.js';\n\nconst execFileP = promisify(execFile);\n\nexport interface DoctorOptions {\n deep?: boolean;\n json?: boolean;\n}\n\nexport interface DoctorCheck {\n name: string;\n ok: boolean;\n detail: string;\n hint?: string;\n /** Informational checks do not affect the exit code. */\n informational?: boolean;\n}\n\nfunction mark(ok: boolean): string {\n return ok ? '✔' : '✘';\n}\n\nfunction printCheck(check: DoctorCheck): void {\n const skip = check.informational && !check.ok ? 'ℹ' : mark(check.ok);\n console.log(`${skip} ${check.name}${check.detail ? ` — ${check.detail}` : ''}`);\n if (check.hint) console.log(` hint: ${check.hint}`);\n}\n\nasync function checkBinaryVersion(binaryPath: string): Promise<string | undefined> {\n try {\n const { stdout } = await execFileP(binaryPath, ['--version'], { timeout: 20_000 });\n return stdout.trim().split('\\n')[0];\n } catch {\n return undefined;\n }\n}\n\ninterface McpConfigHint {\n client: string;\n path: string;\n configured: boolean;\n}\n\nasync function detectMcpConfigs(): Promise<McpConfigHint[]> {\n const home = os.homedir();\n const hints: McpConfigHint[] = [\n { client: 'Codex', path: path.join(home, '.codex', 'config.toml'), configured: false },\n { client: 'Claude Code (user)', path: path.join(home, '.claude.json'), configured: false },\n { client: 'Claude Code (project)', path: path.resolve('.mcp.json'), configured: false },\n { client: 'Cursor', path: path.join(process.cwd(), '.cursor', 'mcp.json'), configured: false },\n ];\n for (const hint of hints) {\n try {\n const content = await fsp.readFile(hint.path, 'utf8');\n hint.configured = content.includes('clef-mcp');\n } catch {\n hint.configured = false;\n }\n }\n return hints;\n}\n\nexport async function runDoctor(opts: DoctorOptions): Promise<boolean> {\n const config = loadConfig();\n const checks: DoctorCheck[] = [];\n const { modelsDir } = pathsFor(config.clefHome);\n\n // 1. Platform\n const info = await detectPlatform();\n try {\n assertSupportedPlatform(info);\n checks.push({ name: 'OS / architecture', ok: true, detail: `${info.platform}/${info.arch}` });\n } catch (err) {\n checks.push({\n name: 'OS / architecture',\n ok: false,\n detail: `${info.platform}/${info.arch}`,\n hint: err instanceof Error ? err.message : String(err),\n });\n }\n\n // 2. Memory — advisory: the install flow enforces the real requirement\n // (pickQuant throws below 16 GB); here it is a warning, not a failure.\n const memGb = info.totalMemBytes / 1024 ** 3;\n checks.push({\n name: 'Memory',\n ok: memGb >= 16,\n informational: true,\n detail: formatBytes(info.totalMemBytes),\n hint: memGb < 16 ? 'Clef-Flash Q4_K_M needs ~16 GB of memory to run comfortably.' : undefined,\n });\n\n // 3. GPU (informational — llama.cpp uses Metal on macOS by default)\n checks.push({\n name: 'GPU',\n ok: true,\n informational: true,\n detail: info.gpu?.name\n ? `${info.gpu.name}${info.gpu.vramBytes ? ` (${formatBytes(info.gpu.vramBytes)})` : ''}`\n : 'not detected (llama.cpp falls back to CPU; on Apple Silicon Metal is built in)',\n });\n\n // 4. Runtime binary\n let binaryPath: string | undefined;\n if (config.runtime === 'mlx') {\n try {\n binaryPath = resolveUv(process.env.CLEF_MLX_UV);\n checks.push({\n name: 'Runtime (uv, for the MLX runtime)',\n ok: true,\n detail: binaryPath,\n });\n } catch (err) {\n checks.push({\n name: 'Runtime (uv, for the MLX runtime)',\n ok: false,\n detail: err instanceof Error ? err.message : String(err),\n hint: 'Install uv: curl -LsSf https://astral.sh/uv/install.sh | sh',\n });\n }\n } else {\n try {\n const binary = resolveLlamaServerBinary(config);\n binaryPath = binary.path;\n const version = await checkBinaryVersion(binary.path);\n checks.push({\n name: 'Runtime binary',\n ok: version !== undefined,\n detail: `${binary.source}: ${binary.path}${version ? ` (${version})` : ''}`,\n hint: version === undefined ? 'The binary exists but did not answer --version; it may be broken or incompatible.' : undefined,\n });\n } catch (err) {\n binaryPath = undefined;\n checks.push({\n name: 'Runtime binary',\n ok: false,\n detail: err instanceof Error ? err.message : String(err),\n hint: err instanceof ClefError ? err.hint : undefined,\n });\n }\n }\n\n // 5. Model\n let spec;\n let manifest;\n let mlxManifest;\n try {\n spec = getModelSpec(config.model);\n if (config.runtime === 'mlx') mlxManifest = await mlxIsInstalled(config.clefHome);\n else manifest = await findInstalledManifest(config.clefHome, spec);\n } catch {\n checks.push({ name: 'Model', ok: false, detail: `unknown model id \"${config.model}\"` });\n }\n if (config.runtime === 'mlx') {\n if (!mlxManifest) {\n checks.push({\n name: 'Model',\n ok: false,\n detail: `${spec?.id ?? config.model} is not installed for the MLX runtime`,\n hint: 'Run `clef-mcp install --runtime mlx`.',\n });\n } else {\n checks.push({\n name: 'Model',\n ok: true,\n detail: `MLX snapshot at ${mlxManifest.snapshotPath}`,\n });\n checks.push({\n name: 'Model license',\n ok: true,\n informational: true,\n detail: `${mlxManifest.licenseId} — ${mlxManifest.licenseUrl}`,\n });\n }\n } else if (spec) {\n if (!manifest) {\n checks.push({\n name: 'Model',\n ok: false,\n detail: `${spec.id} is not installed`,\n hint: 'Run `clef-mcp install`.',\n });\n } else {\n const verify = await verifyModelFiles(manifest);\n let detail = `${manifest.quant} at ${manifest.modelPath} (${formatBytes(manifest.bytes)})`;\n let ok = verify.ok;\n if (ok && opts.deep) {\n const deep = await deepVerifyChecksum(manifest);\n ok = deep.ok;\n detail += deep.ok ? ' — checksum OK' : ` — ${deep.problems.join('; ')}`;\n } else if (ok) {\n detail += ' — size OK (use --deep to verify checksum)';\n }\n checks.push({\n name: 'Model',\n ok,\n detail,\n hint: ok ? undefined : 'Re-run `clef-mcp install` to re-download the model.',\n });\n checks.push({\n name: 'Model license',\n ok: true,\n informational: true,\n detail: `${spec.licenseId} — ${spec.licenseUrl}`,\n });\n }\n }\n\n // 6. Inference probe (end-to-end)\n if (config.runtime === 'mlx' && binaryPath && mlxManifest) {\n try {\n const probe = await probeMlxInference(config, mlxManifest, undefined, 240_000);\n checks.push({\n name: 'Inference',\n ok: true,\n detail: `probe decision returned in ${(probe.latencyMs / 1000).toFixed(1)}s (incl. model load)`,\n });\n } catch (err) {\n const clefErr = err instanceof ClefError ? err : undefined;\n checks.push({\n name: 'Inference',\n ok: false,\n detail: clefErr?.message ?? (err instanceof Error ? err.message : String(err)),\n hint: clefErr?.hint,\n });\n }\n } else if (config.runtime === 'llama-cpp' && binaryPath && manifest && (await verifyModelFiles(manifest)).ok) {\n try {\n const probe = await probeInference(config, manifest, undefined, 180_000);\n checks.push({\n name: 'Inference',\n ok: true,\n detail: `probe decision returned in ${(probe.latencyMs / 1000).toFixed(1)}s (incl. model load)`,\n });\n } catch (err) {\n const clefErr = err instanceof ClefError ? err : undefined;\n checks.push({\n name: 'Inference',\n ok: false,\n detail: clefErr?.message ?? (err instanceof Error ? err.message : String(err)),\n hint: clefErr?.hint ?? 'The installed llama.cpp build may lack clef support; update llama.cpp or run `clef-mcp install`.',\n });\n }\n } else {\n checks.push({\n name: 'Inference',\n ok: false,\n informational: true,\n detail: 'skipped (model or runtime missing)',\n });\n }\n\n // 7. MCP client configuration (informational)\n const mcpHints = await detectMcpConfigs();\n const configured = mcpHints.filter((h) => h.configured);\n checks.push({\n name: 'MCP client configuration',\n ok: true,\n informational: true,\n detail: configured.length\n ? configured.map((h) => `${h.client}: ${h.path}`).join('; ')\n : 'no clef-mcp registration found (add it to your client; see README)',\n });\n\n if (opts.json) {\n console.log(JSON.stringify({ clefHome: pathsFor(config.clefHome).root, modelCache: modelsDir, checks }, null, 2));\n } else {\n console.log(`clef-mcp doctor (cache: ${pathsFor(config.clefHome).root})\\n`);\n for (const check of checks) printCheck(check);\n }\n\n const failed = checks.filter((c) => !c.ok && !c.informational);\n if (!opts.json) {\n console.log(\n failed.length === 0\n ? '\\nAll critical checks passed.'\n : `\\n${failed.length} critical check(s) failed.`,\n );\n }\n return failed.length > 0;\n}\n","import { execFile } from 'node:child_process';\nimport os from 'node:os';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\n\nexport interface GpuInfo {\n name?: string;\n vramBytes?: number;\n}\n\nexport interface PlatformInfo {\n platform: NodeJS.Platform;\n arch: string;\n totalMemBytes: number;\n gpu?: GpuInfo;\n}\n\nfunction exec(cmd: string, args: string[], timeoutMs: number): Promise<string> {\n return new Promise((resolve, reject) => {\n execFile(cmd, args, { timeout: timeoutMs, encoding: 'utf8' }, (err, stdout) => {\n if (err) reject(err);\n else resolve(stdout);\n });\n });\n}\n\nfunction parseSizeToBytes(raw: string | undefined): number | undefined {\n if (!raw) return undefined;\n const m = raw.trim().match(/^([\\d.]+)\\s*(GB|MB|GiB|MiB|B)?$/i);\n if (!m) return undefined;\n const n = Number.parseFloat(m[1]!);\n if (!Number.isFinite(n)) return undefined;\n const unit = (m[2] ?? 'B').toLowerCase();\n const mult = unit === 'gb' || unit === 'gib' ? 1024 ** 3 : unit === 'mb' || unit === 'mib' ? 1024 ** 2 : 1;\n return Math.round(n * mult);\n}\n\nasync function gpuInfoDarwin(): Promise<GpuInfo | undefined> {\n try {\n const out = await exec('system_profiler', ['SPDisplaysDataType', '-json'], 10_000);\n const parsed = JSON.parse(out) as {\n SPDisplaysDataType?: Array<Record<string, unknown>>;\n };\n const gpu = parsed.SPDisplaysDataType?.[0];\n if (!gpu) return undefined;\n const info: GpuInfo = { name: typeof gpu.sppci_model === 'string' ? gpu.sppci_model : undefined };\n for (const key of ['spdisplays_vram_shared', 'spdisplays_vram']) {\n const bytes = parseSizeToBytes(typeof gpu[key] === 'string' ? (gpu[key] as string) : undefined);\n if (bytes) {\n info.vramBytes = bytes;\n break;\n }\n }\n return info;\n } catch {\n return undefined;\n }\n}\n\nasync function gpuInfoLinux(): Promise<GpuInfo | undefined> {\n try {\n const out = await exec('nvidia-smi', ['--query-gpu=name,memory.total', '--format=csv,noheader'], 5_000);\n const [name, mib] = out.trim().split(',').map((s) => s.trim());\n if (name && mib) return { name, vramBytes: Number.parseFloat(mib) * 1024 ** 2 };\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport async function detectPlatform(): Promise<PlatformInfo> {\n const platform = process.platform;\n const info: PlatformInfo = {\n platform,\n arch: process.arch,\n totalMemBytes: os.totalmem(),\n };\n if (platform === 'darwin') info.gpu = await gpuInfoDarwin();\n else if (platform === 'linux') info.gpu = await gpuInfoLinux();\n return info;\n}\n\n/** llama.cpp clef builds ship for these platforms; anything else is rejected early. */\nexport function assertSupportedPlatform(info: Pick<PlatformInfo, 'platform' | 'arch'>): void {\n const ok =\n (info.platform === 'darwin' && (info.arch === 'arm64' || info.arch === 'x64')) ||\n (info.platform === 'linux' && (info.arch === 'x64' || info.arch === 'arm64')) ||\n (info.platform === 'win32' && info.arch === 'x64');\n if (!ok) {\n throw new ClefError(\n ClefErrorCode.UNSUPPORTED_PLATFORM,\n `Unsupported platform: ${info.platform}/${info.arch}`,\n 'clef-mcp v0.1 supports macOS (arm64/x64), Linux (x64/arm64) and Windows x64.',\n );\n }\n}\n\nexport function formatBytes(bytes: number): string {\n const gib = bytes / 1024 ** 3;\n if (gib >= 1) return `${gib.toFixed(1)} GB`;\n return `${Math.round(bytes / 1024 ** 2)} MB`;\n}\n","import fs from 'node:fs/promises';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { ClefConfig } from '../config/env.js';\nimport type { Logger } from '../config/logger.js';\nimport type { MlxManifest } from '../models/mlx-install.js';\nimport { resolveUv } from '../models/mlx-install.js';\nimport type { ModelManifest } from '../models/manifest.js';\nimport { resolveLlamaServerBinary } from './binary.js';\nimport { LlamaCppRuntime } from './llama-cpp.js';\nimport { MlxRuntime } from './mlx.js';\n\nexport interface ProbeResult {\n latencyMs: number;\n binarySource: 'env' | 'managed' | 'path' | 'uv';\n binaryPath: string;\n}\n\n/**\n * Full end-to-end check: start the runtime with the installed model, run one\n * tiny decision, shut down. Used by `install` (verification) and `doctor`.\n */\nexport async function probeInference(\n cfg: ClefConfig,\n manifest: ModelManifest,\n log?: Logger,\n loadTimeoutMs = 120_000,\n): Promise<ProbeResult> {\n await fs.access(manifest.modelPath).catch(() => {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `Model file is missing: ${manifest.modelPath}`,\n 'Run `clef-mcp install` to (re-)download the model.',\n );\n });\n const binary = resolveLlamaServerBinary(cfg);\n const runtime = new LlamaCppRuntime({\n serverBin: binary.path,\n modelPath: manifest.modelPath,\n alias: manifest.model,\n loadTimeoutMs,\n log,\n });\n const started = Date.now();\n await runtime.load();\n try {\n await runtime.decide({\n model: manifest.model,\n state: 'This is an internal clef-mcp installation probe.',\n questions: {\n probe: { type: 'noul', instructions: 'Is this a clef-mcp installation probe?' },\n },\n });\n } finally {\n await runtime.unload();\n }\n return { latencyMs: Date.now() - started, binarySource: binary.source, binaryPath: binary.path };\n}\n\n/** Same end-to-end probe for the MLX runtime (uv + clef_mlx.py serve). */\nexport async function probeMlxInference(\n cfg: ClefConfig,\n manifest: MlxManifest,\n log?: Logger,\n loadTimeoutMs = 180_000,\n): Promise<ProbeResult> {\n const uvBin = resolveUv(process.env.CLEF_MLX_UV);\n const runtime = new MlxRuntime({ uvBin, snapshotPath: manifest.snapshotPath, loadTimeoutMs, log });\n const started = Date.now();\n await runtime.load();\n try {\n await runtime.decide({\n model: manifest.model,\n state: 'This is an internal clef-mcp installation probe.',\n questions: {\n probe: { type: 'noul', instructions: 'Is this a clef-mcp installation probe?' },\n },\n });\n } finally {\n await runtime.unload();\n }\n return { latencyMs: Date.now() - started, binarySource: 'uv', binaryPath: uvBin };\n}\n","import { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { loadConfig } from '../config/env.js';\nimport type { Logger } from '../config/logger.js';\nimport { createLogger } from '../config/logger.js';\nimport { ensureLlamaRuntime } from '../models/llama-install.js';\nimport { installModelMlx, type MlxManifest } from '../models/mlx-install.js';\nimport { installModel } from '../models/hf.js';\nimport { detectPlatform, formatBytes } from '../models/platform.js';\nimport { getModelSpec, pickQuant } from '../models/registry.js';\nimport type { ModelManifest } from '../models/manifest.js';\nimport { probeInference, probeMlxInference } from '../runtime/probe.js';\nimport { confirm } from './prompt.js';\nimport { VERSION } from '../version.js';\n\nexport interface InstallOptions {\n model?: string;\n quant?: string;\n yes?: boolean;\n skipRuntime?: boolean;\n skipProbe?: boolean;\n setup?: boolean;\n runtime?: string;\n}\n\nconst OS_NAMES: Record<string, string> = {\n darwin: 'macOS',\n linux: 'Linux',\n win32: 'Windows',\n};\n\nfunction prettyOs(platform: string): string {\n return OS_NAMES[platform] ?? platform;\n}\n\nfunction printProgress(downloaded: number, total?: number): void {\n const dl = formatBytes(downloaded);\n const line = total ? ` Downloading... ${dl} / ${formatBytes(total)}` : ` Downloading... ${dl}`;\n process.stderr.write(`\\r${line.padEnd(48)}`);\n}\n\nfunction printHeader(): void {\n console.log();\n}\n\nexport async function runInstall(opts: InstallOptions): Promise<void> {\n const config = loadConfig();\n const log: Logger = createLogger('info');\n const runtime = (opts.runtime ?? config.runtime) as 'llama-cpp' | 'mlx';\n if (runtime !== 'llama-cpp' && runtime !== 'mlx') {\n throw new ClefError(ClefErrorCode.INVALID_INPUT, `Unknown runtime \"${runtime}\".`, 'Available: llama-cpp, mlx');\n }\n\n printHeader();\n process.stdout.write('Detecting hardware...\\n');\n const info = await detectPlatform();\n\n const modelId = opts.model ?? config.model;\n const spec = getModelSpec(modelId);\n const quant = pickQuant(spec, info.totalMemBytes, opts.quant);\n\n const gpuLine = info.gpu?.name ? ` GPU: ${info.gpu.name}${info.gpu.vramBytes ? ` (${formatBytes(info.gpu.vramBytes)})` : ''}` : undefined;\n console.log('\\nDetected:');\n console.log(` OS: ${prettyOs(info.platform)}`);\n console.log(` Architecture: ${info.arch}`);\n console.log(` Memory: ${formatBytes(info.totalMemBytes)}`);\n if (gpuLine) console.log(gpuLine);\n if (runtime === 'mlx' && !(info.platform === 'darwin' && info.arch === 'arm64')) {\n throw new ClefError(\n ClefErrorCode.UNSUPPORTED_PLATFORM,\n 'The MLX runtime only works on Apple Silicon (macOS/arm64).',\n 'Use the default llama.cpp runtime (omit --runtime).',\n );\n }\n\n console.log('\\nRecommended:');\n console.log(` Model: ${spec.id} (${runtime === 'mlx' ? 'mlx-community/clef-flash-4bit' : spec.repo})`);\n console.log(` Runtime: ${runtime}`);\n if (runtime === 'llama-cpp') console.log(` Quantization: ${quant.id}`);\n console.log(` Download size: ~${runtime === 'mlx' ? '6.2 GB' : formatBytes(quant.bytes)}`);\n console.log(`\\nModel license: ${spec.licenseId} — ${spec.licenseUrl}`);\n console.log('The model is downloaded from the official conversion and is not repackaged by clef-mcp.\\n');\n\n const ok = await confirm('Continue?', opts.yes === true);\n if (!ok) {\n console.log('Aborted. Nothing was downloaded.');\n return;\n }\n\n let llamaManifest: ModelManifest | undefined;\n let mlxManifest: MlxManifest | undefined;\n\n if (runtime === 'mlx') {\n console.log('\\nDownloading MLX model snapshot (uv-managed; weights ~6 GB)...\\n');\n mlxManifest = await installModelMlx({ clefHome: config.clefHome, clefMcpVersion: VERSION, log });\n console.log(` Installed: ${mlxManifest.snapshotPath}`);\n } else {\n if (!opts.skipRuntime) {\n process.stdout.write('\\nEnsuring llama.cpp runtime...\\n');\n const rt = await ensureLlamaRuntime(config, log);\n console.log(` Runtime: llama.cpp (${rt.source}, ${rt.releaseTag})`);\n console.log(` Binary: ${rt.path}`);\n }\n\n console.log('');\n const installed = await installModel({\n clefHome: config.clefHome,\n modelSpec: spec,\n quantSpec: quant,\n clefMcpVersion: VERSION,\n onProgress: (p) => printProgress(p.bytes, p.total),\n log,\n });\n process.stderr.write('\\n');\n console.log(installed.alreadyInstalled ? ` Model already installed: ${installed.manifest.modelPath}` : ` Installed: ${installed.manifest.modelPath}`);\n console.log(` sha256: ${installed.manifest.sha256 ?? 'n/a (not advertised upstream)'}`);\n llamaManifest = installed.manifest;\n }\n\n if (!opts.skipProbe) {\n process.stdout.write('\\nVerifying inference (loads the model; first run can take a few minutes)...\\n');\n const probe =\n runtime === 'mlx'\n ? await probeMlxInference(config, mlxManifest!, log)\n : await probeInference(config, llamaManifest!, log);\n console.log(` Inference OK (${(probe.latencyMs / 1000).toFixed(1)}s incl. model load)`);\n }\n\n if (opts.setup) {\n const { runSetup } = await import('./setup.js');\n console.log('');\n await runSetup({ yes: opts.yes });\n return;\n }\n\n console.log('\\nDone. Start the MCP server with:\\n\\n clef-mcp\\n');\n console.log('Register it with your agents (or run `clef-mcp setup` to do it automatically):\\n');\n console.log(' Claude Code : claude mcp add clef-mcp -- clef-mcp');\n console.log(' Codex : add [mcp_servers.clef-mcp] to ~/.codex/config.toml (see README)');\n console.log(' Cursor : add clef-mcp to .cursor/mcp.json (see README)');\n console.log(' ZCode : add clef-mcp to ~/.zcode/cli/config.json (see README)');\n if (runtime === 'mlx') {\n console.log('\\nNote: set CLEF_RUNTIME=mlx for the server (and MCP clients) to use the MLX runtime.');\n }\n}\n","import { execFile } from 'node:child_process';\nimport type { Dirent } from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport type { ClefConfig } from '../config/env.js';\nimport type { Logger } from '../config/logger.js';\nimport { llamaRuntimeDir, llamaServerName, pathsFor } from '../config/paths.js';\nimport { downloadFile } from './hf.js';\nimport { writeRuntimeManifest, readRuntimeManifest } from './manifest.js';\nimport { resolveLlamaServerBinary, type ResolvedBinary } from '../runtime/binary.js';\n\nconst GITHUB_API = 'https://api.github.com/repos/ggml-org/llama.cpp';\n\ninterface GhRelease {\n tag_name: string;\n published_at?: string;\n assets: Array<{ name: string; size: number; browser_download_url: string }>;\n}\n\nasync function ghJson<T>(url: string): Promise<T> {\n let res: Response;\n try {\n res = await fetch(url, {\n headers: { accept: 'application/vnd.github+json', 'user-agent': 'clef-mcp' },\n });\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Could not reach GitHub: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n if (!res.ok) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `GitHub API returned HTTP ${res.status} for ${url}`,\n res.status === 403 ? 'GitHub API rate limit may be hit; install llama.cpp manually and retry.' : undefined,\n );\n }\n return (await res.json()) as T;\n}\n\ninterface AssetPattern {\n match: RegExp;\n /** Prefer the first pattern that matches, in order. */\n alternates?: RegExp[];\n}\n\n/** Official nightly asset naming: `llama-bNNNNN-bin-macos-arm64.tar.gz`, `llama-bin-win-cuda-...-x64.zip`, etc. */\nfunction assetPatterns(platform: string, arch: string): AssetPattern {\n switch (platform) {\n case 'darwin':\n return arch === 'arm64'\n ? { match: /^llama-.*-bin-macos-arm64\\.tar\\.gz$/ }\n : { match: /^llama-.*-bin-macos-x64\\.tar\\.gz$/ };\n case 'linux':\n return arch === 'arm64'\n ? { match: /^llama-.*-bin-ubuntu-arm64\\.tar\\.gz$/ }\n : { match: /^llama-.*-bin-ubuntu-x64\\.tar\\.gz$/ };\n case 'win32':\n // CPU builds only; CUDA/Vulkan need extra runtime deps. Prefer avx2.\n return {\n match: /^llama-.*-bin-win-avx2-x64\\.zip$/,\n alternates: [/^llama-.*-bin-win-noavx-x64\\.zip$/, /^llama-.*-bin-win-x64\\.zip$/],\n };\n default:\n throw new ClefError(ClefErrorCode.UNSUPPORTED_PLATFORM, `Unsupported platform ${platform}/${arch}`);\n }\n}\n\nfunction pickAsset(release: GhRelease, platform: string, arch: string): GhRelease['assets'][number] {\n const { match, alternates } = assetPatterns(platform, arch);\n const names = release.assets.map((a) => a.name.toLowerCase());\n const find = (re: RegExp) => release.assets[names.findIndex((n) => re.test(n))];\n const asset = find(match) ?? alternates?.map(find).find(Boolean);\n if (!asset) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `No llama.cpp release asset for ${platform}/${arch} in ${release.tag_name}`,\n 'Install llama.cpp manually (`brew install llama.cpp` or https://llama.app) and re-run install.',\n );\n }\n return asset;\n}\n\nfunction execTar(args: string[], cwd: string): Promise<void> {\n return new Promise((resolve, reject) => {\n execFile('tar', args, { cwd, timeout: 300_000 }, (err, _stdout, stderr) => {\n if (err) reject(new Error(`tar ${args.join(' ')} failed: ${stderr || err.message}`));\n else resolve();\n });\n });\n}\n\nasync function findServerBinary(dir: string, platform: string): Promise<string> {\n const target = llamaServerName(platform);\n const queue = [dir];\n while (queue.length > 0) {\n const current = queue.shift()!;\n let entries: Dirent[];\n try {\n entries = await fsp.readdir(current, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of entries) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) queue.push(full);\n else if (entry.name === target) return full;\n }\n }\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Extracted llama.cpp release did not contain ${target}`,\n );\n}\n\nasync function extractRelease(archivePath: string, destDir: string, platform: string): Promise<void> {\n await fsp.mkdir(destDir, { recursive: true });\n const args = archivePath.endsWith('.zip')\n ? ['-xf', archivePath]\n : ['-xzf', archivePath];\n try {\n await execTar(args, destDir);\n } catch (err) {\n // GNU tar (common on Linux) cannot read zip; surface a clear hint.\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Could not extract ${path.basename(archivePath)}: ${err instanceof Error ? err.message : String(err)}`,\n 'Extract the archive manually and point CLEF_LLAMA_BIN at llama-server.',\n );\n }\n}\n\nexport interface ManagedRuntimeResult extends ResolvedBinary {\n releaseTag: string;\n freshInstall: boolean;\n}\n\n/**\n * Ensure a llama-server binary exists: resolve env/managed/PATH first, else\n * download the official ggml-org nightly build into CLEF_HOME/runtime.\n */\nexport async function ensureLlamaRuntime(cfg: ClefConfig, log?: Logger): Promise<ManagedRuntimeResult> {\n try {\n const resolved = resolveLlamaServerBinary(cfg);\n if (resolved.source === 'managed') {\n const platformDir = llamaRuntimeDir(pathsFor(cfg.clefHome).runtimeDir, process.platform, process.arch);\n const manifest = readRuntimeManifest(path.join(platformDir, 'runtime-manifest.json'));\n return { ...resolved, releaseTag: manifest?.releaseTag ?? 'unknown', freshInstall: false };\n }\n return { ...resolved, releaseTag: resolved.source, freshInstall: false };\n } catch (err) {\n if (!(err instanceof ClefError) || err.code !== ClefErrorCode.RUNTIME_NOT_FOUND) throw err;\n }\n const fresh = await downloadManagedLlama(cfg, log);\n return { ...fresh, freshInstall: true };\n}\n\nexport async function downloadManagedLlama(cfg: ClefConfig, log?: Logger): Promise<ResolvedBinary & { releaseTag: string }> {\n const platform = process.platform;\n const arch = process.arch;\n const { runtimeDir } = pathsFor(cfg.clefHome);\n const platformDir = llamaRuntimeDir(runtimeDir, platform, arch);\n\n let release: GhRelease;\n if (cfg.llamaReleaseTag) {\n release = await ghJson<GhRelease>(`${GITHUB_API}/releases/tags/${cfg.llamaReleaseTag}`);\n } else {\n const releases = await ghJson<GhRelease[]>(`${GITHUB_API}/releases?per_page=15`);\n const nightly = releases.find((r) => /^b\\d+$/.test(r.tag_name));\n if (!nightly) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n 'No llama.cpp nightly release found on GitHub.',\n 'Install llama.cpp manually (`brew install llama.cpp` or https://llama.app) and re-run install.',\n );\n }\n release = nightly;\n }\n\n const asset = pickAsset(release, platform, arch);\n log?.info('downloading llama.cpp runtime', { tag: release.tag_name, asset: asset.name });\n // The macOS builds link ggml/llama dylibs via @rpath, so the binary must\n // stay inside its release layout: extract into <platformDir>/<tag>/ and\n // record the real path in the manifest instead of moving it out.\n const tagDir = path.join(platformDir, release.tag_name);\n await fsp.mkdir(tagDir, { recursive: true });\n const tmpArchive = path.join(platformDir, `.download-${asset.name}`);\n await fsp.rm(tmpArchive, { force: true });\n const result = await downloadFile(asset.browser_download_url, tmpArchive, { expectedSize: asset.size, attempts: 3 });\n await extractRelease(tmpArchive, tagDir, platform);\n await fsp.rm(tmpArchive, { force: true });\n\n const binaryPath = await findServerBinary(tagDir, platform);\n if (platform !== 'win32') await fsp.chmod(binaryPath, 0o755);\n\n await writeRuntimeManifest(path.join(platformDir, 'runtime-manifest.json'), {\n schemaVersion: 1,\n kind: 'llama-cpp',\n releaseTag: release.tag_name,\n asset: asset.name,\n bytes: result.bytes,\n binaryPath,\n installedAt: new Date().toISOString(),\n });\n log?.info('llama.cpp runtime installed', { tag: release.tag_name, path: binaryPath });\n return { source: 'managed', path: binaryPath, releaseTag: release.tag_name };\n}\n\n/** Remove the managed llama.cpp runtime directory, if present. */\nexport async function removeManagedRuntime(cfg: ClefConfig): Promise<boolean> {\n const { runtimeDir } = pathsFor(cfg.clefHome);\n const dir = llamaRuntimeDir(runtimeDir, process.platform, process.arch);\n try {\n await fsp.stat(dir);\n } catch {\n return false;\n }\n await fsp.rm(dir, { recursive: true, force: true });\n return true;\n}\n","import { createHash } from 'node:crypto';\nimport fs from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { manifestPathFor, pathsFor } from '../config/paths.js';\nimport type { Logger } from '../config/logger.js';\nimport { writeModelManifest, readModelManifest, verifyModelFiles, type ModelManifest } from './manifest.js';\nimport { getQuantSpec, type ModelSpec, type QuantSpec } from './registry.js';\n\nexport const HF_BASE_URL = 'https://huggingface.co';\n\nexport function resolveUrl(repo: string, revision: string, file: string): string {\n return `${HF_BASE_URL}/${repo}/resolve/${revision}/${file}`;\n}\n\nexport interface HfFileInfo {\n downloadUrl: string;\n /** sha256 from the HF xet/LFS hash, when advertised. */\n sha256?: string;\n size?: number;\n}\n\n/**\n * Resolve download URL + expected checksum. The sha256 arrives as the\n * `x-linked-etag` header on HF's 302, so we probe with redirect: 'manual'.\n */\nexport async function fetchFileInfo(repo: string, revision: string, file: string): Promise<HfFileInfo> {\n const url = resolveUrl(repo, revision, file);\n let res: Response;\n try {\n res = await fetch(url, { method: 'HEAD', redirect: 'manual' });\n } catch (err) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Could not reach Hugging Face: ${err instanceof Error ? err.message : String(err)}`,\n 'Check network connectivity and try again.',\n );\n }\n // 302 → metadata lives on the redirect response; some CDN configs answer 200 directly.\n if (res.status !== 302 && res.status !== 200) {\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Hugging Face returned HTTP ${res.status} for ${repo}@${revision}/${file}`,\n res.status === 404 ? 'The pinned model revision may have moved. Re-check the model registry.' : undefined,\n );\n }\n const sha256 = res.headers.get('x-linked-etag')?.replace(/\"/g, '');\n const size = res.headers.get('x-linked-size') ? Number(res.headers.get('x-linked-size')) : undefined;\n return {\n downloadUrl: res.headers.get('location') ?? url,\n sha256: sha256 && /^[0-9a-f]{64}$/i.test(sha256) ? sha256 : undefined,\n size: Number.isFinite(size) ? size : undefined,\n };\n}\n\nexport interface DownloadProgress {\n bytes: number;\n total?: number;\n}\n\nexport interface DownloadOptions {\n expectedSha256?: string;\n expectedSize?: number;\n onProgress?(p: DownloadProgress): void;\n signal?: AbortSignal;\n attempts?: number;\n}\n\nexport interface DownloadResult {\n bytes: number;\n sha256: string;\n}\n\n/**\n * Stream a file to dest, hashing while writing. Retries transient failures by\n * restarting the download; checksum/size mismatches fail hard.\n */\nexport async function downloadFile(url: string, dest: string, opts: DownloadOptions = {}): Promise<DownloadResult> {\n const attempts = opts.attempts ?? 3;\n let lastError: unknown;\n for (let attempt = 1; attempt <= attempts; attempt++) {\n try {\n return await downloadOnce(url, dest, opts);\n } catch (err) {\n if (err instanceof ClefError && err.code === ClefErrorCode.CHECKSUM_MISMATCH) throw err;\n lastError = err;\n if (attempt < attempts) {\n await new Promise((r) => setTimeout(r, 1000 * 2 ** (attempt - 1)));\n }\n }\n }\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Download failed after ${attempts} attempts: ${lastError instanceof Error ? lastError.message : String(lastError)}`,\n );\n}\n\nasync function downloadOnce(url: string, dest: string, opts: DownloadOptions): Promise<DownloadResult> {\n const res = await fetch(url, { redirect: 'follow', signal: opts.signal });\n if (!res.ok || !res.body) {\n throw new Error(`HTTP ${res.status}`);\n }\n const total = opts.expectedSize ?? (res.headers.get('content-length') ? Number(res.headers.get('content-length')) : undefined);\n const hash = createHash('sha256');\n const handle = await fsp.open(dest, 'w');\n let bytes = 0;\n try {\n for await (const chunk of res.body) {\n const buf = chunk as Buffer;\n hash.update(buf);\n await handle.write(buf);\n bytes += buf.length;\n opts.onProgress?.({ bytes, total });\n }\n } finally {\n await handle.close();\n }\n const sha256 = hash.digest('hex');\n if (opts.expectedSha256 && sha256 !== opts.expectedSha256) {\n await fsp.rm(dest, { force: true });\n throw new ClefError(\n ClefErrorCode.CHECKSUM_MISMATCH,\n `Checksum mismatch after download: expected ${opts.expectedSha256}, got ${sha256}`,\n 'The download was discarded. Re-run `clef-mcp install`.',\n );\n }\n if (opts.expectedSize !== undefined && bytes !== opts.expectedSize) {\n await fsp.rm(dest, { force: true });\n throw new ClefError(\n ClefErrorCode.DOWNLOAD_FAILED,\n `Downloaded size mismatch: expected ${opts.expectedSize} bytes, got ${bytes}`,\n );\n }\n return { bytes, sha256 };\n}\n\nexport interface InstallModelOptions {\n clefHome: string;\n modelSpec: ModelSpec;\n quantSpec: QuantSpec;\n clefMcpVersion: string;\n onProgress?(p: DownloadProgress): void;\n log?: Logger;\n}\n\nexport interface InstallModelResult {\n manifest: ModelManifest;\n alreadyInstalled: boolean;\n}\n\n/**\n * Download a model quantization from its pinned HF revision, verify checksum,\n * and write the manifest. Safe to re-run: an intact install is a no-op.\n */\nexport async function installModel(opts: InstallModelOptions): Promise<InstallModelResult> {\n const { modelSpec, quantSpec } = opts;\n const { modelsDir } = pathsFor(opts.clefHome);\n const manifestPath = manifestPathFor(modelsDir, modelSpec.id, quantSpec.id);\n const existing = await readModelManifest(manifestPath);\n if (existing && (await verifyModelFiles(existing)).ok) {\n opts.log?.debug('model already installed', { model: modelSpec.id, quant: quantSpec.id });\n return { manifest: existing, alreadyInstalled: true };\n }\n\n const info = await fetchFileInfo(modelSpec.repo, modelSpec.revision, quantSpec.file);\n const finalPath = path.join(path.dirname(manifestPath), quantSpec.file);\n await fsp.mkdir(path.dirname(finalPath), { recursive: true });\n const tmpPath = path.join(path.dirname(finalPath), `.download-${quantSpec.file}`);\n await fsp.rm(tmpPath, { force: true });\n\n opts.log?.info('downloading model', { repo: modelSpec.repo, file: quantSpec.file });\n const result = await downloadFile(info.downloadUrl, tmpPath, {\n expectedSha256: info.sha256,\n expectedSize: info.size ?? quantSpec.bytes,\n onProgress: opts.onProgress,\n });\n await fsp.rename(tmpPath, finalPath);\n\n const manifest: ModelManifest = {\n schemaVersion: 1,\n model: modelSpec.id,\n quant: quantSpec.id,\n file: quantSpec.file,\n modelPath: finalPath,\n bytes: result.bytes,\n sha256: result.sha256,\n repo: modelSpec.repo,\n revision: modelSpec.revision,\n licenseId: modelSpec.licenseId,\n licenseUrl: modelSpec.licenseUrl,\n installedAt: new Date().toISOString(),\n clefMcpVersion: opts.clefMcpVersion,\n };\n await writeModelManifest(manifestPath, manifest);\n opts.log?.info('model installed', { model: modelSpec.id, quant: quantSpec.id, sha256: result.sha256 });\n return { manifest, alreadyInstalled: false };\n}\n","export const VERSION = '0.3.0';\n","import { loadConfig } from '../config/env.js';\nimport { pathsFor } from '../config/paths.js';\nimport { quantIsInstalled } from '../models/manifest.js';\nimport { formatBytes } from '../models/platform.js';\nimport { MODELS } from '../models/registry.js';\n\nexport async function runModels(): Promise<void> {\n const config = loadConfig();\n const { modelsDir } = pathsFor(config.clefHome);\n console.log(`Cache home: ${pathsFor(config.clefHome).root}\\n`);\n for (const spec of Object.values(MODELS)) {\n console.log(`${spec.id} (${spec.repo}, ${spec.licenseId})`);\n for (const quant of spec.quants) {\n const installed = await quantIsInstalled(config.clefHome, spec, quant);\n const defaultMark = quant.id === spec.defaultQuant ? ' [default]' : '';\n console.log(` ${quant.id.padEnd(8)} ~${formatBytes(quant.bytes).padStart(8)} ${installed ? 'installed' : 'not installed'}${defaultMark}`);\n }\n console.log();\n }\n}\n","import { ClefError } from '../clef/errors.js';\nimport { loadConfig } from '../config/env.js';\nimport { pathsFor } from '../config/paths.js';\nimport { findInstalledManifest } from '../models/manifest.js';\nimport { detectPlatform, formatBytes } from '../models/platform.js';\nimport { getModelSpec } from '../models/registry.js';\nimport { mlxIsInstalled, resolveUv } from '../models/mlx-install.js';\nimport { resolveLlamaServerBinary } from '../runtime/binary.js';\n\nexport async function runStatus(): Promise<void> {\n const config = loadConfig();\n const info = await detectPlatform();\n\n let spec;\n try {\n spec = getModelSpec(config.model);\n } catch (err) {\n if (err instanceof ClefError && err.code === 'INVALID_INPUT') {\n console.log(`Runtime: ${config.runtime}`);\n console.log(`Model: ${config.model} (unknown model id)`);\n console.log('Model status: unknown');\n console.log(`Memory: ${formatBytes(info.totalMemBytes)}`);\n return;\n }\n throw err;\n }\n\n if (config.runtime === 'mlx') {\n const mlx = await mlxIsInstalled(config.clefHome);\n let uvLine = 'not found (install: curl -LsSf https://astral.sh/uv/install.sh | sh)';\n try {\n uvLine = `uv: ${resolveUv(process.env.CLEF_MLX_UV)}`;\n } catch (err) {\n uvLine = `not found — ${(err as Error).message.split('\\n')[0]}`;\n }\n console.log(`Runtime: mlx (${uvLine})`);\n console.log(`Model: ${spec.id}${mlx ? ' (MLX 4-bit)' : ''}`);\n console.log(`Model status: ${mlx ? 'installed' : 'not installed (run: clef-mcp install --runtime mlx)'}`);\n console.log(`Memory: ${formatBytes(info.totalMemBytes)}`);\n if (mlx) {\n console.log(`Snapshot: ${mlx.snapshotPath}`);\n console.log(`Installed: ${mlx.installedAt}`);\n } else {\n console.log(`Cache home: ${pathsFor(config.clefHome).root}`);\n }\n return;\n }\n\n const manifest = await findInstalledManifest(config.clefHome, spec);\n\n let runtimeLine: string;\n try {\n const binary = resolveLlamaServerBinary(config);\n runtimeLine = `ready (llama.cpp via ${binary.source}: ${binary.path})`;\n } catch (err) {\n const structured = (err as ClefError).hint ? `${(err as ClefError).message}` : String(err);\n runtimeLine = `not found — ${structured}`;\n }\n\n console.log(`Runtime: llama.cpp`);\n console.log(`Model: ${spec.id}${manifest ? ` ${manifest.quant}` : ''}`);\n console.log(`Model status: ${manifest ? 'installed' : 'not installed (run: clef-mcp install)'}`);\n console.log(`Runtime status: ${runtimeLine}`);\n console.log(`Memory: ${formatBytes(info.totalMemBytes)}`);\n if (manifest) {\n console.log(`Model path: ${manifest.modelPath}`);\n console.log(`Installed: ${manifest.installedAt}`);\n } else {\n console.log(`Cache home: ${pathsFor(config.clefHome).root}`);\n }\n}\n","import fsp from 'node:fs/promises';\nimport { ClefError, ClefErrorCode } from '../clef/errors.js';\nimport { loadConfig } from '../config/env.js';\nimport { modelQuantDir, pathsFor } from '../config/paths.js';\nimport { findInstalledManifest } from '../models/manifest.js';\nimport { formatBytes } from '../models/platform.js';\nimport { getModelSpec } from '../models/registry.js';\nimport { removeManagedRuntime } from '../models/llama-install.js';\nimport { mlxIsInstalled, removeMlxModel } from '../models/mlx-install.js';\nimport { confirm } from './prompt.js';\n\nexport interface UninstallOptions {\n model?: string;\n runtime?: boolean;\n yes?: boolean;\n}\n\nexport async function runUninstall(opts: UninstallOptions): Promise<void> {\n const config = loadConfig();\n const spec = getModelSpec(opts.model ?? config.model);\n const { modelsDir } = pathsFor(config.clefHome);\n\n if (config.runtime === 'mlx') {\n const mlx = await mlxIsInstalled(config.clefHome);\n if (!mlx) {\n throw new ClefError(ClefErrorCode.MODEL_NOT_INSTALLED, 'The MLX model is not installed.', 'Nothing to remove.');\n }\n const ok = await confirm(`Remove the MLX snapshot for ${spec.id}?`, opts.yes === true);\n if (!ok) {\n console.log('Aborted.');\n return;\n }\n await removeMlxModel(config.clefHome);\n console.log('Removed MLX snapshot.');\n return;\n }\n\n const manifest = await findInstalledManifest(config.clefHome, spec);\n\n if (!manifest && !opts.runtime) {\n throw new ClefError(\n ClefErrorCode.MODEL_NOT_INSTALLED,\n `${spec.id} is not installed.`,\n 'Nothing to remove. Use --runtime to also remove the managed llama.cpp runtime.',\n );\n }\n\n const target = manifest ? modelQuantDir(modelsDir, spec.id, manifest.quant) : undefined;\n const sizeLine = manifest ? ` (${formatBytes(manifest.bytes)})` : '';\n const ok = await confirm(\n `Remove ${spec.id}${manifest ? ` ${manifest.quant}` : ''}${sizeLine}${opts.runtime ? ' and the managed runtime' : ''}?`,\n opts.yes === true,\n );\n if (!ok) {\n console.log('Aborted.');\n return;\n }\n\n if (target) {\n await fsp.rm(target, { recursive: true, force: true });\n console.log(`Removed: ${target}`);\n }\n if (opts.runtime) {\n const removed = await removeManagedRuntime(config);\n console.log(removed ? 'Removed managed llama.cpp runtime.' : 'No managed runtime found.');\n }\n}\n"],"mappings":"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","names":["execFile","fsSync","fsp","os","path","fileURLToPath","mark","path","path","manifestPath","path","fsp","path","path","fsp","fs","path","fs","path","spawn","net","STDERR_TAIL_LIMIT","freePort","fetchWithTimeout","OOM_PATTERNS","manifest","runtime","loadStarted","z","fsSync","fsp","fsp","fsSync","path","path","fsSync","fsp","fsp","net","fsp","path","path","fsp","net","fsp","net","fsp","doc","execFile","os","fsp","path","execFile","os","fs","fs","execFile","os","path","fsp","execFile","fsp","path","createHash","fsp","path","createHash","fsp","manifestPath","path","execFile","fsp","path","runSetup","fsp","ok","fsp"]}
|