@clutor/cli 0.1.0 → 0.2.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/c/Makefile +85 -0
- package/c/src/cache.c +232 -0
- package/c/src/cache.h +48 -0
- package/c/src/forward.c +354 -0
- package/c/src/forward.h +69 -0
- package/c/src/gguf.c +242 -0
- package/c/src/gguf.h +48 -0
- package/c/src/kernel.c +125 -0
- package/c/src/kernel.h +45 -0
- package/c/src/main.c +476 -0
- package/c/src/meta.c +118 -0
- package/c/src/meta.h +22 -0
- package/c/src/quant.c +360 -0
- package/c/src/quant.h +43 -0
- package/c/src/route.c +52 -0
- package/c/src/route.h +27 -0
- package/c/src/stream.c +399 -0
- package/c/src/stream.h +68 -0
- package/c/src/tokenizer.c +287 -0
- package/c/src/tokenizer.h +25 -0
- package/c/src/xs.c +215 -0
- package/c/src/xs.h +39 -0
- package/dist/bin.js +2 -1
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-6WAEQCCP.js → chunk-2FBPYNHP.js} +249 -40
- package/dist/chunk-2FBPYNHP.js.map +1 -0
- package/dist/{chunk-RBSFKJ6L.js → chunk-BZZUO7XX.js} +35 -6
- package/dist/chunk-BZZUO7XX.js.map +1 -0
- package/dist/index.d.ts +27 -8
- package/dist/index.js +8 -2
- package/dist/{repl-OVODHQI5.js → repl-DOWMDXFR.js} +2 -2
- package/package.json +4 -4
- package/dist/chunk-6WAEQCCP.js.map +0 -1
- package/dist/chunk-RBSFKJ6L.js.map +0 -1
- /package/dist/{repl-OVODHQI5.js.map → repl-DOWMDXFR.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/args.ts","../src/decide.ts","../src/backend.ts","../src/models.ts","../src/sse.ts","../src/ollama.ts","../src/agentllm.ts","../src/mcp.ts","../src/sessions.ts","../src/server.ts","../src/engine.ts","../src/cli.ts"],"sourcesContent":["export interface ParsedArgs {\n positional: string[];\n flags: Map<string, string | true>;\n}\n\n/** Tiny `--flag value` / `--flag=value` / `--bool` parser. `booleans` lists flags that never take a value. */\nexport function parseArgs(argv: string[], booleans: readonly string[] = []): ParsedArgs {\n const flags = new Map<string, string | true>();\n const positional: string[] = [];\n for (let i = 0; i < argv.length; i++) {\n const a = argv[i] as string;\n if (a === \"--\") {\n positional.push(...argv.slice(i + 1));\n break;\n }\n if (a.startsWith(\"--\")) {\n const eq = a.indexOf(\"=\");\n const name = eq === -1 ? a.slice(2) : a.slice(2, eq);\n if (eq !== -1) flags.set(name, a.slice(eq + 1));\n else if (booleans.includes(name) || i + 1 >= argv.length || (argv[i + 1] as string).startsWith(\"--\")) flags.set(name, true);\n else flags.set(name, argv[++i] as string);\n } else positional.push(a);\n }\n return { positional, flags };\n}\n\nexport const flagString = (a: ParsedArgs, name: string): string | undefined => {\n const v = a.flags.get(name);\n return typeof v === \"string\" ? v : undefined;\n};\n\nexport const flagBool = (a: ParsedArgs, name: string): boolean => a.flags.has(name) && a.flags.get(name) !== \"false\";\n\nexport function flagInt(a: ParsedArgs, name: string, min: number, max: number): number | undefined {\n const v = flagString(a, name);\n if (v === undefined) return undefined;\n const n = Number(v);\n if (!Number.isInteger(n) || n < min || n > max) throw new UsageError(`--${name} must be an integer from ${min} to ${max}`);\n return n;\n}\n\nexport class UsageError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UsageError\";\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { sealReceipt, type Receipt } from \"@clutor/core\";\nimport { appendReceipt, lastReceiptTag, loadOrCreateReceiptSigner } from \"@clutor/core/node\";\n\nexport interface DecideEndpoint { baseUrl: string; model: string; apiKey?: string }\n\nexport interface DecideResult {\n choice: string;\n probabilities: Record<string, number>;\n probabilityMassOnChoices: number;\n latencyMs: number;\n}\n\n/** The request was wrong (400) or the model server could not answer it (502). */\nexport class DecideError extends Error {\n constructor(readonly status: 400 | 502, message: string) {\n super(message);\n }\n}\n\n/**\n * One forward pass, one token: the model's own probability for each choice's letter, read from the first-token log-probabilities.\n * Not calibrated. Shared by `clutor decide` and `POST /v1/decide`.\n */\nexport async function runDecide(e: DecideEndpoint, prompt: string, choices: string[], f: typeof fetch = globalThis.fetch): Promise<DecideResult> {\n if (!prompt || choices.length < 2 || choices.length > 26) throw new DecideError(400, \"a prompt and 2 to 26 choices are required\");\n if (new Set(choices).size !== choices.length) throw new DecideError(400, \"choices must be different from each other\");\n const letters = choices.map((_, i) => String.fromCharCode(65 + i));\n const content = `${prompt}\\n\\nChoose exactly one option and answer with its letter only.\\n${choices.map((c, i) => `${letters[i]}) ${c}`).join(\"\\n\")}\\nAnswer:`;\n const t0 = Date.now();\n const res = await f(`${e.baseUrl.replace(/\\/$/, \"\")}/chat/completions`, {\n method: \"POST\", headers: { \"content-type\": \"application/json\", ...(e.apiKey ? { authorization: `Bearer ${e.apiKey}` } : {}) },\n body: JSON.stringify({ model: e.model, messages: [{ role: \"user\", content }], max_tokens: 1, temperature: 0, logprobs: true, top_logprobs: 20 }),\n });\n if (!res.ok) throw new DecideError(502, `the model server answered ${res.status}: ${(await res.text().catch(() => \"\")).slice(0, 300)}`);\n const body = (await res.json()) as { choices?: Array<{ logprobs?: { content?: Array<{ top_logprobs?: Array<{ token: string; logprob: number }> }> } }> };\n const top = body.choices?.[0]?.logprobs?.content?.[0]?.top_logprobs;\n if (!top) throw new DecideError(502, \"the model server returned no log-probabilities; decide needs a server that supports logprobs (llama-server does)\");\n const mass = letters.map((l) => top.filter((t) => t.token.trim() === l).reduce((a, t) => a + Math.exp(t.logprob), 0));\n const total = mass.reduce((a, b) => a + b, 0);\n if (total === 0) throw new DecideError(502, \"the model did not put any probability on the choice letters; try rephrasing the prompt\");\n const probs = mass.map((m) => m / total);\n const best = probs.indexOf(Math.max(...probs));\n return { choice: choices[best] as string, probabilities: Object.fromEntries(choices.map((c, i) => [c, probs[i] as number])), probabilityMassOnChoices: total, latencyMs: Date.now() - t0 };\n}\n\n/**\n * Signs a decision into the project's receipt log, so it chains with the agent's receipts. The receipt records a SHA-256 of the prompt, not the\n * prompt itself, because the log is meant to be shared for verification.\n */\nexport async function sealDecision(root: string, model: string, prompt: string, choices: string[], r: DecideResult, startedAt: string): Promise<Receipt> {\n const signer = await loadOrCreateReceiptSigner(root);\n const promptSha = createHash(\"sha256\").update(prompt).digest(\"hex\");\n const receipt = await sealReceipt(signer, {\n v: 2, id: `dec_${Date.now().toString(36)}`, task: `decide sha256:${promptSha} among [${choices.join(\"|\")}] -> ${r.choice}`, model, startedAt,\n finishedAt: new Date().toISOString(), status: \"finished\", files: [], commands: [], steps: 1, previous: await lastReceiptTag(root),\n });\n await appendReceipt(root, receipt);\n return receipt;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { accessSync, constants } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { delimiter, join } from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { TASK_MARKER, type LlmClient, type MemoryPlan } from \"@clutor/core\";\n\n/**\n * Clutor does not contain a transformer. Running a model is llama.cpp's job (its mmap loading is what actually lets a model larger\n * than RAM run from an SSD); this module finds `llama-server`, works out which flags that particular build supports, starts it with\n * settings derived from the memory plan, and supervises it.\n */\n\nconst exe = process.platform === \"win32\" ? \"llama-server.exe\" : \"llama-server\";\n\nexport function findLlamaServer(env: NodeJS.ProcessEnv = process.env, extraDirs: string[] = []): string | null {\n const dirs = [...extraDirs, ...(env[\"PATH\"] ?? \"\").split(delimiter), \"/opt/homebrew/bin\", \"/usr/local/bin\", join(homedir(), \".clutor\", \"bin\")];\n for (const d of dirs) {\n if (!d) continue;\n const p = join(d, exe);\n try { accessSync(p, constants.X_OK); return p; } catch { /* keep looking */ }\n }\n return null;\n}\n\nexport interface LlamaCapabilities {\n flags: Set<string>;\n /** `--flash-attn on|off|auto` (newer builds) rather than a bare `--flash-attn` switch. */\n flashAttnTakesValue: boolean;\n helpText: string;\n}\n\n/** Runs `llama-server --help` and records which options this build knows, so unsupported flags are never passed. */\nexport function probeLlamaServer(binary: string, timeoutMs = 15_000): Promise<LlamaCapabilities> {\n return new Promise((resolve, reject) => {\n const child = spawn(binary, [\"--help\"], { stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let out = \"\";\n const timer = setTimeout(() => { child.kill(\"SIGKILL\"); reject(new Error(`${binary} --help did not finish in ${timeoutMs / 1000}s`)); }, timeoutMs);\n child.stdout?.on(\"data\", (b: Buffer) => (out += b.toString()));\n child.stderr?.on(\"data\", (b: Buffer) => (out += b.toString()));\n child.on(\"error\", (e) => { clearTimeout(timer); reject(e); });\n child.on(\"close\", () => {\n clearTimeout(timer);\n resolve({ flags: new Set(out.match(/--[a-z0-9][a-z0-9-]*/g) ?? []), flashAttnTakesValue: /--flash-attn[^\\n]*\\[on\\|off\\|auto\\]|--flash-attn\\s+\\[?on/.test(out), helpText: out });\n });\n });\n}\n\nexport interface LlamaArgsInput {\n modelPath: string;\n port: number;\n contextTokens: number;\n kvBits: 16 | 8 | 4;\n threads?: number;\n plan?: Pick<MemoryPlan, \"strategy\">;\n caps: LlamaCapabilities;\n extraArgs?: string[];\n /** Where llama-server may save and restore KV-cache snapshots. */\n slotSavePath?: string;\n}\n\nexport function buildLlamaArgs(i: LlamaArgsInput): { args: string[]; notes: string[] } {\n const notes: string[] = [];\n const args = [\"-m\", i.modelPath, \"--host\", \"127.0.0.1\", \"--port\", String(i.port), \"-c\", String(i.contextTokens)];\n if (i.threads) args.push(\"-t\", String(i.threads));\n if (i.caps.flags.has(\"--jinja\")) args.push(\"--jinja\");\n else notes.push(\"this llama-server has no --jinja, so native tool calling may not work; use agent.toolMode \\\"json\\\"\");\n if (i.kvBits < 16) {\n const t = i.kvBits === 8 ? \"q8_0\" : \"q4_0\";\n if (i.caps.flags.has(\"--cache-type-k\") && i.caps.flags.has(\"--cache-type-v\")) {\n args.push(\"--cache-type-k\", t, \"--cache-type-v\", t);\n // A quantised V cache needs flash attention in llama.cpp.\n if (i.caps.flags.has(\"--flash-attn\")) args.push(...(i.caps.flashAttnTakesValue ? [\"--flash-attn\", \"on\"] : [\"--flash-attn\"]));\n else notes.push(\"quantised KV cache needs flash attention, which this build lacks; the server may refuse to start\");\n } else notes.push(\"this llama-server cannot quantise the KV cache; the plan's KV size is too small\");\n }\n // When the model fits, pinning it avoids page-ins. When it does not, the operating system's page cache IS the expert cache: leave mmap alone.\n if (i.plan?.strategy === \"fully-resident\" && i.caps.flags.has(\"--mlock\")) args.push(\"--mlock\");\n if (i.plan && i.plan.strategy !== \"fully-resident\") notes.push(\"the model is larger than the memory budget, so it will be paged in from disk by the operating system (mmap): speed depends on your SSD and on how often the same experts are reused\");\n if (i.slotSavePath) {\n if (i.caps.flags.has(\"--slot-save-path\")) args.push(\"--slot-save-path\", i.slotSavePath);\n else notes.push(\"this llama-server has no --slot-save-path, so the project prefix cannot be saved between runs\");\n }\n args.push(...(i.extraArgs ?? []));\n return { args, notes };\n}\n\nexport type BackendState = \"stopped\" | \"starting\" | \"ready\" | \"failed\";\n\nexport class BackendManager {\n state: BackendState = \"stopped\";\n error: string | null = null;\n private child: ChildProcess | null = null;\n private readonly log: string[] = [];\n private readonly listeners = new Set<(s: BackendState) => void>();\n\n constructor(readonly port: number, private readonly fetchFn: typeof globalThis.fetch = globalThis.fetch) {}\n\n get baseUrl(): string { return `http://127.0.0.1:${this.port}/v1`; }\n get recentLog(): string[] { return this.log.slice(-200); }\n onState(f: (s: BackendState) => void): () => void { this.listeners.add(f); return () => this.listeners.delete(f); }\n private set(s: BackendState, err?: string): void { this.state = s; this.error = err ?? null; for (const l of this.listeners) l(s); }\n\n async start(binary: string, args: string[], opts: { readyTimeoutMs?: number; env?: NodeJS.ProcessEnv } = {}): Promise<void> {\n if (this.child) throw new Error(\"the backend is already running\");\n this.log.length = 0;\n this.set(\"starting\");\n const child = spawn(binary, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"], env: opts.env ?? process.env });\n this.child = child;\n const take = (b: Buffer): void => { for (const l of b.toString().split(\"\\n\")) if (l.trim()) { this.log.push(l); if (this.log.length > 1000) this.log.shift(); } };\n child.stdout?.on(\"data\", take);\n child.stderr?.on(\"data\", take);\n child.on(\"error\", (e) => { this.child = null; this.set(\"failed\", `could not start ${binary}: ${e.message}`); });\n child.on(\"exit\", (code, sig) => {\n this.child = null;\n if (this.state !== \"stopped\") this.set(\"failed\", `llama-server exited (${sig ?? `code ${code}`}); last output: ${this.log.slice(-3).join(\" | \")}`);\n });\n const deadline = Date.now() + (opts.readyTimeoutMs ?? 600_000);\n while (Date.now() < deadline) {\n if (this.state === \"failed\") throw new Error(this.error ?? \"the backend failed to start\");\n try {\n const r = await this.fetchFn(`http://127.0.0.1:${this.port}/health`);\n if (r.ok) { this.set(\"ready\"); return; }\n } catch { /* not listening yet */ }\n await new Promise((r) => setTimeout(r, 250));\n }\n await this.stop();\n this.set(\"failed\", \"the model did not finish loading in time\");\n throw new Error(this.error ?? \"timeout\");\n }\n\n async stop(): Promise<void> {\n const c = this.child;\n this.set(\"stopped\");\n if (!c) return;\n await new Promise<void>((resolve) => {\n const kill = setTimeout(() => c.kill(\"SIGKILL\"), 5000);\n c.once(\"exit\", () => { clearTimeout(kill); resolve(); });\n c.kill(\"SIGTERM\");\n });\n this.child = null;\n }\n}\n\n\n/**\n * Saves and restores a llama-server slot's KV cache (POST /slots/<id>?action=save|restore). Used so the project map and instructions,\n * which every agent step starts with, are not recomputed on the next run. Every call is best effort: a refusal just means a slower first step.\n */\nexport class SlotSnapshots {\n readonly stats = { restored: 0, saved: 0, restoreMisses: 0, failures: 0 };\n constructor(private readonly baseUrl: string, private readonly slot = 0, private readonly fetchFn: typeof globalThis.fetch = globalThis.fetch) {}\n private url(action: string): string { return `${this.baseUrl.replace(/\\/v1\\/?$/, \"\")}/slots/${this.slot}?action=${action}`; }\n private async post(action: \"save\" | \"restore\", filename: string): Promise<Response | undefined> {\n try {\n return await this.fetchFn(this.url(action), { method: \"POST\", headers: { \"content-type\": \"application/json\" }, body: JSON.stringify({ filename }), signal: AbortSignal.timeout(60_000) });\n } catch { this.stats.failures++; return undefined; }\n }\n async restore(name: string): Promise<boolean> {\n const r = await this.post(\"restore\", `${name}.bin`);\n if (r?.ok) { this.stats.restored++; return true; }\n if (r) { r.body?.cancel().catch(() => undefined); this.stats.restoreMisses++; }\n return false;\n }\n async save(name: string): Promise<boolean> {\n const r = await this.post(\"save\", `${name}.bin`);\n if (r?.ok) { this.stats.saved++; return true; }\n if (r) { this.stats.failures++; r.body?.cancel().catch(() => undefined); }\n return false;\n }\n}\n\n/** Wraps a model client so the shared prefix (instructions + project map) is restored before the first call and saved after it. */\nexport function withPrefixSnapshots(inner: LlmClient, snaps: SlotSnapshots): LlmClient & { snapshots: SlotSnapshots } {\n let done = false;\n const wrapped: LlmClient & { snapshots: SlotSnapshots } = {\n snapshots: snaps,\n model: inner.model,\n toolMode: inner.toolMode,\n async chat(messages, opts) {\n if (done) return inner.chat(messages, opts);\n done = true;\n const head = messages.map((m) => m.content ?? \"\").join(\"\\n\\n\");\n const cut = head.lastIndexOf(TASK_MARKER);\n const prefix = cut >= 0 ? head.slice(0, cut) : head;\n const key = `clt-${createHash(\"sha256\").update(inner.model).update(\"\\0\").update(prefix).digest(\"hex\").slice(0, 32)}`;\n const had = await snaps.restore(key);\n const out = await inner.chat(messages, opts);\n if (!had) await snaps.save(key);\n return out;\n },\n };\n return wrapped;\n}\n","import { createWriteStream } from \"node:fs\";\nimport { mkdir, readdir, rename, rm, stat, statfs } from \"node:fs/promises\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport { basename, extname, isAbsolute, join, resolve, sep } from \"node:path\";\nimport { CATALOG, QUANTS, approximateLayout, buildModelLayout, parseGguf, type GgufFile, type ModelLayout } from \"@clutor/core\";\nimport { fileReader } from \"@clutor/core/node\";\n\nexport interface ResolvedModel {\n id: string;\n name: string;\n source: \"catalog\" | \"file\";\n path?: string;\n layout: ModelLayout;\n gguf?: GgufFile;\n quant?: string;\n}\n\nexport class ModelError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ModelError\";\n }\n}\n\n/** `deepseek-v3`, `deepseek-v3@Q4_K_M`, or the path of a .gguf file. */\nexport async function resolveModel(ref: string, opts: { modelsDir?: string; allowFiles?: boolean } = {}): Promise<ResolvedModel> {\n const [idPart, quantPart] = ref.split(\"@\");\n const spec = CATALOG.find((s) => s.id === idPart);\n if (spec && !ref.toLowerCase().endsWith(\".gguf\")) {\n const quant = quantPart ?? \"Q4_K_M\";\n const bpw = QUANTS[quant];\n if (bpw === undefined) throw new ModelError(`unknown quantisation \"${quant}\"; choose one of ${Object.keys(QUANTS).join(\", \")}`);\n return { id: `${spec.id}@${quant}`, name: spec.name, source: \"catalog\", layout: approximateLayout(spec, bpw), quant };\n }\n if (!ref.toLowerCase().endsWith(\".gguf\")) throw new ModelError(`unknown model \"${ref}\"; use one of ${CATALOG.map((s) => s.id).join(\", \")}, or the path of a .gguf file`);\n if (opts.allowFiles === false) throw new ModelError(\"reading a model file needs the access token\");\n const path = isAbsolute(ref) ? ref : resolve(opts.modelsDir ?? \".\", ref);\n try { await stat(path); } catch { throw new ModelError(`${path} does not exist`); }\n const r = await fileReader(path);\n try {\n const gguf = await parseGguf(r);\n const layout = buildModelLayout(gguf);\n const dominant = Object.entries(layout.quantisations).sort((a, b) => b[1] - a[1])[0]?.[0];\n return { id: basename(path), name: layout.name || basename(path), source: \"file\", path, layout, gguf, ...(dominant ? { quant: dominant } : {}) };\n } finally { await r.close(); }\n}\n\nexport interface LocalModel { file: string; path: string; bytes: number }\n\nexport async function listLocalModels(dir: string): Promise<LocalModel[]> {\n const out: LocalModel[] = [];\n const walk = async (d: string, depth: number): Promise<void> => {\n let entries;\n try { entries = await readdir(d, { withFileTypes: true }); } catch { return; }\n for (const e of entries) {\n const p = join(d, e.name);\n if (e.isDirectory() && depth < 3) await walk(p, depth + 1);\n else if (e.isFile() && extname(e.name).toLowerCase() === \".gguf\") out.push({ file: p.slice(resolve(dir).length + 1).split(sep).join(\"/\"), path: p, bytes: (await stat(p)).size });\n }\n };\n await walk(resolve(dir), 0);\n return out.sort((a, b) => a.file.localeCompare(b.file));\n}\n\n/**\n * Real models small enough to download and test with. Sizes are the file sizes Hugging Face reported on 2026-10-30; the download\n * is checked against the size the server announces, and nothing is fetched unless you run `clutor pull`.\n */\nexport interface Download { id: string; catalogId: string; repo: string; file: string; bytes: number; note: string }\nconst GiB_ = 2 ** 30;\nexport const DOWNLOADS: Download[] = [\n { id: \"olmoe-1b-7b-q4_k_m\", catalogId: \"olmoe-1b-7b\", repo: \"bartowski/OLMoE-1B-7B-0924-Instruct-GGUF\", file: \"OLMoE-1B-7B-0924-Instruct-Q4_K_M.gguf\", bytes: Math.round(3.92 * GiB_), note: \"a real mixture-of-experts model (64 experts, 8 used): the one to test expert streaming with\" },\n { id: \"qwen2.5-coder-7b-q4_k_m\", catalogId: \"qwen2.5-coder-7b\", repo: \"Qwen/Qwen2.5-Coder-7B-Instruct-GGUF\", file: \"qwen2.5-coder-7b-instruct-q4_k_m.gguf\", bytes: Math.round(4.36 * GiB_), note: \"a dense coding model for the agent (not a mixture of experts)\" },\n];\nexport const downloadUrl = (d: Download): string => `https://huggingface.co/${d.repo}/resolve/main/${d.file}`;\n\nexport class DownloadError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"DownloadError\";\n }\n}\n\n/** Downloads `url` to `dest` through a `.part` file, refusing to start without room for it and refusing a size the server did not announce. */\nexport async function downloadFile(url: string, dest: string, opts: { fetch?: typeof fetch; expectedBytes?: number; onProgress?: (done: number, total: number) => void } = {}): Promise<number> {\n const f = opts.fetch ?? globalThis.fetch;\n await mkdir(resolve(dest, \"..\"), { recursive: true });\n const res = await f(url, { redirect: \"follow\" });\n if (!res.ok || !res.body) throw new DownloadError(`the server answered ${res.status} for ${url}`);\n const total = Number(res.headers.get(\"content-length\") ?? 0);\n if (!total) throw new DownloadError(\"the server did not say how large the file is, so it cannot be checked\");\n if (opts.expectedBytes && Math.abs(total - opts.expectedBytes) / opts.expectedBytes > 0.05) throw new DownloadError(`expected about ${opts.expectedBytes} bytes but the server offers ${total}; not downloading`);\n const fs = await statfs(resolve(dest, \"..\"));\n const free = Number(fs.bavail) * Number(fs.bsize);\n if (free < total * 1.1) throw new DownloadError(`not enough free disk: need ${(total / GiB_).toFixed(2)} GiB, have ${(free / GiB_).toFixed(2)} GiB`);\n const part = `${dest}.part`;\n let done = 0;\n const body = Readable.fromWeb(res.body as never);\n body.on(\"data\", (c: Buffer) => { done += c.length; opts.onProgress?.(done, total); });\n try {\n await pipeline(body, createWriteStream(part));\n if (done !== total) throw new DownloadError(`the download stopped at ${done} of ${total} bytes`);\n await rename(part, dest);\n } catch (e) {\n await rm(part, { force: true });\n throw e;\n }\n return total;\n}\n","/** Parses a text/event-stream body into the `data:` payloads, in order. */\nexport async function* parseSse(body: ReadableStream<Uint8Array>): AsyncGenerator<string> {\n const reader = body.getReader();\n const dec = new TextDecoder();\n let buf = \"\";\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n buf += dec.decode(value, { stream: true });\n let i: number;\n while ((i = buf.search(/\\r?\\n\\r?\\n/)) >= 0) {\n const block = buf.slice(0, i);\n buf = buf.slice(i).replace(/^\\r?\\n\\r?\\n/, \"\");\n const data = block.split(/\\r?\\n/).filter((l) => l.startsWith(\"data:\")).map((l) => l.slice(5).replace(/^ /, \"\")).join(\"\\n\");\n if (data) yield data;\n }\n }\n const rest = buf.split(/\\r?\\n/).filter((l) => l.startsWith(\"data:\")).map((l) => l.slice(5).replace(/^ /, \"\")).join(\"\\n\");\n if (rest) yield rest;\n } finally { reader.releaseLock(); }\n}\n","import { parseSse } from \"./sse\";\n\n/** Translation between the Ollama HTTP API and an OpenAI-compatible backend, so tools that speak Ollama can use whatever Clutor fronts. */\n\nexport interface OllamaMessage { role: string; content: string }\n\nexport interface OllamaChatRequest { model?: string; messages?: OllamaMessage[]; prompt?: string; system?: string; stream?: boolean; options?: { temperature?: number; num_predict?: number; top_p?: number; stop?: string[] } }\n\nexport function toOpenAiBody(req: OllamaChatRequest, model: string, kind: \"chat\" | \"generate\"): Record<string, unknown> {\n const messages: OllamaMessage[] = kind === \"generate\" ? [...(req.system ? [{ role: \"system\", content: req.system }] : []), { role: \"user\", content: req.prompt ?? \"\" }] : (req.messages ?? []);\n const o = req.options ?? {};\n return {\n model, messages, stream: req.stream !== false,\n ...(o.temperature !== undefined ? { temperature: o.temperature } : {}), ...(o.top_p !== undefined ? { top_p: o.top_p } : {}),\n ...(o.num_predict !== undefined && o.num_predict > 0 ? { max_tokens: o.num_predict } : {}), ...(o.stop ? { stop: o.stop } : {}),\n };\n}\n\nconst now = (): string => new Date().toISOString();\nconst piece = (kind: \"chat\" | \"generate\", model: string, text: string, done: boolean, extra: Record<string, unknown> = {}): Record<string, unknown> =>\n kind === \"chat\" ? { model, created_at: now(), message: { role: \"assistant\", content: text }, done, ...extra } : { model, created_at: now(), response: text, done, ...extra };\n\n/** Converts one non-streaming OpenAI reply into one Ollama reply. */\nexport function fromOpenAiReply(kind: \"chat\" | \"generate\", model: string, body: { choices?: Array<{ message?: { content?: string | null }; finish_reason?: string }>; usage?: { prompt_tokens?: number; completion_tokens?: number } }): Record<string, unknown> {\n const text = body.choices?.[0]?.message?.content ?? \"\";\n return piece(kind, model, text, true, { done_reason: body.choices?.[0]?.finish_reason ?? \"stop\", prompt_eval_count: body.usage?.prompt_tokens ?? 0, eval_count: body.usage?.completion_tokens ?? 0 });\n}\n\n/** Converts an OpenAI event stream into Ollama's newline-delimited JSON. */\nexport async function* streamToOllama(kind: \"chat\" | \"generate\", model: string, body: ReadableStream<Uint8Array>): AsyncGenerator<string> {\n let usage: { prompt_tokens?: number; completion_tokens?: number } | undefined;\n let reason = \"stop\";\n for await (const data of parseSse(body)) {\n if (data.trim() === \"[DONE]\") break;\n let j: { choices?: Array<{ delta?: { content?: string | null }; finish_reason?: string | null }>; usage?: typeof usage };\n try { j = JSON.parse(data); } catch { continue; }\n if (j.usage) usage = j.usage;\n const c = j.choices?.[0];\n if (c?.finish_reason) reason = c.finish_reason;\n const text = c?.delta?.content;\n if (text) yield `${JSON.stringify(piece(kind, model, text, false))}\\n`;\n }\n yield `${JSON.stringify(piece(kind, model, \"\", true, { done_reason: reason, prompt_eval_count: usage?.prompt_tokens ?? 0, eval_count: usage?.completion_tokens ?? 0 }))}\\n`;\n}\n","import { mkdirSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { OpenAiCompatibleClient, toolCallJsonSchema, type LlmClient } from \"@clutor/core\";\nimport { SlotSnapshots, withPrefixSnapshots } from \"./backend\";\nimport type { ClutorConfig } from \"./config\";\n\n/** Where llama-server saves KV-cache snapshots. They contain the project map the model read, so they stay in the user's own home folder. */\nexport const slotDir = (): string => join(homedir(), \".clutor\", \"slots\");\n\n/** llama-server refuses `--slot-save-path` for a folder that does not exist, so make it before starting. */\nexport function ensureSlotDir(): string {\n const dir = slotDir();\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n return dir;\n}\n\n/**\n * The model client the agent uses. Against a local llama-server it (1) constrains decoding to the tool-call JSON Schema, (2) keeps the\n * conversation in one slot so the server reuses its cached prefix between steps, and (3) saves and restores that prefix between runs.\n * Against any other OpenAI-compatible server only (1) is attempted, and dropped automatically if the server refuses it.\n */\nexport function agentLlm(config: ClutorConfig, ep: { baseUrl: string; model: string; apiKey?: string; local: boolean }, fetchFn?: typeof globalThis.fetch): LlmClient {\n const json = config.agent.toolMode === \"json\";\n const client = new OpenAiCompatibleClient({\n baseUrl: ep.baseUrl, model: ep.model, ...(ep.apiKey ? { apiKey: ep.apiKey } : {}), toolMode: config.agent.toolMode,\n ...(json && config.agent.constrainToolCalls ? { jsonSchema: toolCallJsonSchema() } : {}),\n ...(ep.local ? { slot: 0 } : {}),\n ...(fetchFn ? { fetch: fetchFn } : {}),\n });\n if (ep.local && config.agent.prefixSnapshots) return withPrefixSnapshots(client, new SlotSnapshots(ep.baseUrl, 0, fetchFn));\n return client;\n}\n","import { CATALOG, GiB, QUANTS, ShadowWorkspace, buildRepoMap, fmtGiB, planMemory, TOOLS, executeTool, validateToolCall } from \"@clutor/core\";\nimport { NodeProject, hostInfo } from \"@clutor/core/node\";\nimport { resolveModel } from \"./models\";\n\n/**\n * A Model Context Protocol server (JSON-RPC 2.0 over HTTP) with read-only tools, so an editor or agent that speaks MCP can ask Clutor\n * about a project and about whether a model fits. It cannot change files or run commands.\n */\n\ninterface Rpc { jsonrpc?: string; id?: string | number | null; method?: string; params?: Record<string, unknown> }\n\nconst READ_TOOLS = [\"list_files\", \"read_file\", \"search\", \"repo_map\"] as const;\n\nfunction tools(): unknown[] {\n const fromAgent = TOOLS.filter((t) => (READ_TOOLS as readonly string[]).includes(t.name)).map((t) => ({\n name: t.name, description: t.description,\n inputSchema: {\n type: \"object\", additionalProperties: false,\n properties: { dir: { type: \"string\", description: \"Project folder (must be one Clutor has been given access to).\" }, ...Object.fromEntries(Object.entries(t.fields).filter(([k]) => !(t.name === \"list_files\" && k === \"dir\") && !(t.name === \"search\" && k === \"dir\")).map(([k, f]) => [k, { type: f.type, description: f.description }])), ...(t.name === \"list_files\" || t.name === \"search\" ? { subdir: { type: \"string\", description: \"Only look under this folder.\" } } : {}) },\n required: [\"dir\", ...Object.entries(t.fields).filter(([, f]) => f.required).map(([k]) => k)],\n },\n }));\n return [\n ...fromAgent,\n { name: \"plan_memory\", description: \"Would a model fit in this much RAM, and how fast could it possibly run from disk? Models: \" + CATALOG.map((c) => c.id).join(\", \"), inputSchema: { type: \"object\", additionalProperties: false, properties: { model: { type: \"string\" }, ram_gib: { type: \"number\" }, quant: { type: \"string\", enum: Object.keys(QUANTS) }, context_tokens: { type: \"integer\" } }, required: [\"model\", \"ram_gib\"] } },\n ];\n}\n\nexport async function handleMcp(req: Rpc, ctx: { isRoot(dir: string): Promise<string | null> }): Promise<{ status: number; body: unknown }> {\n const id = req.id ?? null;\n const ok = (result: unknown): { status: number; body: unknown } => ({ status: 200, body: { jsonrpc: \"2.0\", id, result } });\n const err = (code: number, message: string): { status: number; body: unknown } => ({ status: 200, body: { jsonrpc: \"2.0\", id, error: { code, message } } });\n if (req.jsonrpc !== \"2.0\" || typeof req.method !== \"string\") return err(-32600, \"not a JSON-RPC 2.0 request\");\n switch (req.method) {\n case \"initialize\": return ok({ protocolVersion: \"2025-03-26\", capabilities: { tools: {} }, serverInfo: { name: \"clutor\", version: \"0.1.0\" } });\n case \"notifications/initialized\": return { status: 202, body: \"\" };\n case \"ping\": return ok({});\n case \"tools/list\": return ok({ tools: tools() });\n case \"tools/call\": {\n const name = req.params?.[\"name\"], args = (req.params?.[\"arguments\"] ?? {}) as Record<string, unknown>;\n const text = (t: string, isError = false): { status: number; body: unknown } => ok({ content: [{ type: \"text\", text: t }], isError });\n if (name === \"plan_memory\") {\n try {\n const m = await resolveModel(`${String(args[\"model\"])}${args[\"quant\"] ? `@${String(args[\"quant\"])}` : \"\"}`, { allowFiles: false });\n const h = hostInfo();\n const p = planMemory(m.layout, { hostRamBytes: Math.max(1, Number(args[\"ram_gib\"])) * GiB, ...(args[\"context_tokens\"] ? { contextTokens: Number(args[\"context_tokens\"]) } : {}) });\n return text([`${m.name} (${m.quant}) on ${fmtGiB(p.ceilingBytes)}: ${p.strategy}`, ...p.components.map((c) => `- ${c.label}: ${fmtGiB(c.bytes)}`), ...p.speed.map((s) => `at ${(s.hitRate * 100).toFixed(0)}% cache hits: at most ${s.maxTokensPerSec === Infinity ? \"unlimited\" : s.maxTokensPerSec.toFixed(2)} tokens/s (disk bound)`), ...p.warnings.map((w) => `! ${w}`), `(this machine has ${fmtGiB(h.totalRamBytes)})`].join(\"\\n\"));\n } catch (e) { return text(e instanceof Error ? e.message : String(e), true); }\n }\n if (typeof name === \"string\" && (READ_TOOLS as readonly string[]).includes(name)) {\n const dir = typeof args[\"dir\"] === \"string\" ? await ctx.isRoot(args[\"dir\"]) : null;\n if (!dir) return text(\"that folder has not been opened in Clutor; open it in the app or run `clutor serve --dir <folder>`\", true);\n const { dir: _d, subdir, ...rest } = args;\n void _d;\n const call = name === \"list_files\" || name === \"search\" ? { ...rest, ...(typeof subdir === \"string\" ? { dir: subdir } : {}) } : rest;\n const v = validateToolCall(name, call);\n if (!v.ok) return text(v.error, true);\n const r = await executeTool({ ws: new ShadowWorkspace(new NodeProject(dir)) }, v.call.name, v.call.args);\n return text(r.output, !r.ok);\n }\n return err(-32602, `unknown tool ${JSON.stringify(name)}`);\n }\n default: return err(-32601, `method not found: ${req.method}`);\n }\n}\nexport { buildRepoMap };\n","import { randomBytes } from \"node:crypto\";\nimport { realpath, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ShadowWorkspace, evaluateGates, runAgent, type AgentEvent, type AgentResult, type FileDiff, type GateResult, type LlmClient } from \"@clutor/core\";\nimport { ConflictError, type NodeProject, appendReceipt, applyChanges, lastReceiptTag, loadOrCreateReceiptSigner, rollbackCheckpoint, scratchRunner, verifyReceiptLog } from \"@clutor/core/node\";\nimport type { ClutorConfig } from \"./config\";\n\n/**\n * One agent task, held in memory so a UI can watch it (events are kept and replayed to late subscribers), approve commands it wants to\n * run, and then apply or discard what it did. Nothing reaches the project folder until `apply`.\n */\n\nexport type SessionEvent = AgentEvent | { type: \"approval\"; requestId: string; command: string; network: boolean } | { type: \"approval_resolved\"; requestId: string; allowed: boolean } | { type: \"applied\"; checkpointId: string; files: number } | { type: \"rolled_back\"; checkpointId: string };\n\nexport interface SessionInfo {\n id: string;\n dir: string;\n task: string;\n status: \"running\" | \"finished\" | \"max_steps\" | \"aborted\" | \"stuck\" | \"error\";\n startedAt: string;\n result?: AgentResult;\n diffs: FileDiff[];\n pendingApprovals: Array<{ requestId: string; command: string; network: boolean }>;\n checkpointId?: string;\n gates: GateResult[];\n}\n\nexport class AgentSession {\n readonly id = `task_${randomBytes(6).toString(\"hex\")}`;\n readonly events: SessionEvent[] = [];\n readonly startedAt = new Date().toISOString();\n status: SessionInfo[\"status\"] = \"running\";\n result?: AgentResult;\n checkpointId?: string;\n private readonly subs = new Set<(e: SessionEvent | null) => void>();\n private readonly pending = new Map<string, { command: string; network: boolean; resolve: (b: boolean) => void; timer: NodeJS.Timeout }>();\n private readonly abort = new AbortController();\n private lastDiffs: FileDiff[] = [];\n private done: Promise<void> = Promise.resolve();\n\n constructor(\n readonly dir: string,\n readonly task: string,\n readonly project: NodeProject,\n readonly ws: ShadowWorkspace,\n private readonly cfg: ClutorConfig,\n private readonly hostRamBytes: number,\n ) {}\n\n private push(e: SessionEvent): void {\n this.events.push(e);\n if (e.type === \"diff\") this.lastDiffs = e.diffs;\n for (const s of this.subs) s(e);\n }\n\n /** Replays everything so far, then streams new events until the task ends. Returns a function that stops listening. */\n subscribe(from: number, send: (e: SessionEvent) => void, onEnd: () => void): () => void {\n for (const e of this.events.slice(from)) send(e);\n if (this.status !== \"running\" && this.pending.size === 0) { onEnd(); return () => undefined; }\n const f = (e: SessionEvent | null): void => { if (e === null) onEnd(); else send(e); };\n this.subs.add(f);\n return () => this.subs.delete(f);\n }\n\n start(llm: LlmClient): void {\n const root = this.dir;\n this.done = (async () => {\n const key = await loadOrCreateReceiptSigner(root);\n const previous = await lastReceiptTag(root);\n const result = await runAgent({\n task: this.task, llm, ws: this.ws, signal: this.abort.signal,\n maxSteps: this.cfg.agent.maxSteps, contextChars: Math.floor(this.cfg.memory.contextTokens * 2.5), ...(this.cfg.agent.verifyCommand ? { verifyCommand: this.cfg.agent.verifyCommand } : {}),\n runCommand: scratchRunner(this.project, this.ws, { timeoutMs: this.cfg.agent.commandTimeoutSeconds * 1000 }),\n approve: (info) => this.askApproval(info.command, info.network),\n onEvent: (e) => { if (e.type !== \"done\") this.push(e); },\n receipt: { signer: key, previous },\n });\n this.result = result;\n this.status = result.status;\n if (result.receipt) await appendReceipt(root, result.receipt);\n this.push({ type: \"done\", result });\n for (const s of this.subs) s(null);\n })().catch((e: unknown) => {\n this.status = \"error\";\n this.push({ type: \"done\", result: { status: \"error\", summary: e instanceof Error ? e.message : String(e), error: e instanceof Error ? e.message : String(e), steps: 0, toolCalls: 0, invalidReplies: 0, violations: 0, diffs: [], commands: [], usage: { promptTokens: 0, completionTokens: 0 } } });\n for (const s of this.subs) s(null);\n });\n }\n\n wait(): Promise<void> { return this.done; }\n\n private askApproval(command: string, network: boolean): Promise<boolean> {\n if (this.cfg.agent.autoApproveProjectCommands) return Promise.resolve(true);\n const requestId = `appr_${randomBytes(4).toString(\"hex\")}`;\n return new Promise<boolean>((resolve) => {\n const timer = setTimeout(() => this.resolveApproval(requestId, false), 10 * 60_000);\n this.pending.set(requestId, { command, network, resolve, timer });\n this.push({ type: \"approval\", requestId, command, network });\n });\n }\n\n resolveApproval(requestId: string, allow: boolean): boolean {\n const p = this.pending.get(requestId);\n if (!p) return false;\n clearTimeout(p.timer);\n this.pending.delete(requestId);\n this.push({ type: \"approval_resolved\", requestId, allowed: allow });\n p.resolve(allow);\n return true;\n }\n\n stop(): void {\n this.abort.abort();\n for (const id of [...this.pending.keys()]) this.resolveApproval(id, false);\n }\n\n /** Writes the agent's changes to the project (after checking nothing changed under it), with a checkpoint to roll back to. */\n async apply(force = false): Promise<{ checkpointId: string; files: number }> {\n if (this.status === \"running\") throw new Error(\"the task is still running\");\n const changes = await this.ws.changeSet();\n if (changes.length === 0) throw new Error(\"there is nothing to apply\");\n const r = await applyChanges(this.project, changes, { force });\n this.checkpointId = r.id;\n this.push({ type: \"applied\", checkpointId: r.id, files: r.applied.length });\n return { checkpointId: r.id, files: r.applied.length };\n }\n\n async rollback(force = false): Promise<void> {\n if (!this.checkpointId) throw new Error(\"nothing has been applied by this task\");\n await rollbackCheckpoint(this.project, this.checkpointId, { force });\n this.push({ type: \"rolled_back\", checkpointId: this.checkpointId });\n delete this.checkpointId;\n }\n\n async info(): Promise<SessionInfo> {\n const receipts = await verifyReceiptLog(this.dir);\n const gates = evaluateGates({\n hostRamBytes: this.hostRamBytes,\n agent: this.result ? { toolCalls: this.result.toolCalls, invalidReplies: this.result.invalidReplies, violations: this.result.violations, commandApproval: this.cfg.agent.autoApproveProjectCommands ? \"never-asked\" : \"project-code\" } : { toolCalls: 0, invalidReplies: 0, violations: this.ws.violations, commandApproval: \"project-code\" },\n receiptsOk: receipts.ok ? { ok: true } : { ok: false, detail: `entry ${receipts.index}: ${receipts.reason}` },\n });\n return {\n id: this.id, dir: this.dir, task: this.task, status: this.status, startedAt: this.startedAt, diffs: this.lastDiffs,\n pendingApprovals: [...this.pending].map(([requestId, p]) => ({ requestId, command: p.command, network: p.network })),\n ...(this.result ? { result: this.result } : {}), ...(this.checkpointId ? { checkpointId: this.checkpointId } : {}), gates,\n };\n }\n}\n\nexport { ConflictError };\n\n/** A project directory the server may work in: it must exist, be a directory, and is stored by its real path (links resolved). */\nexport async function normaliseRoot(dir: string): Promise<string> {\n const real = await realpath(dir);\n if (!(await stat(real)).isDirectory()) throw new Error(`${dir} is not a directory`);\n if (real === \"/\" || /^[A-Za-z]:\\\\?$/.test(real)) throw new Error(\"the root of a drive cannot be used as a project\");\n return real;\n}\nexport const isInside = (root: string, p: string): boolean => p === root || p.startsWith(join(root, \"/\"));\n","import { agentLlm } from \"./agentllm\";\nimport { randomBytes, timingSafeEqual } from \"node:crypto\";\nimport { createServer as createHttpServer, type IncomingMessage, type Server, type ServerResponse } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\nimport { Readable } from \"node:stream\";\nimport {\n BASELINE, CATALOG, CLUTOR_DEFAULTS, GgufError, GiB, buildModelLayout, parseGguf, QUANTS, ShadowWorkspace, approximateLayout, evaluateGates, expertSizeBytes, generateRoutingTrace, planMemory, simulateStreaming, type LlmClient, type MemoryPlan,\n} from \"@clutor/core\";\nimport { DecideError, runDecide, sealDecision } from \"./decide\";\nimport { NodeProject, hostInfo, listCheckpoints, ConflictError, fileReader, measureExpertReads, readReceipts, verifyReceiptLog, writeSyntheticGguf } from \"@clutor/core/node\";\nimport { z } from \"zod\";\nimport type { BackendManager } from \"./backend\";\nimport type { ClutorConfig } from \"./config\";\nimport { handleMcp } from \"./mcp\";\nimport { ModelError, listLocalModels, resolveModel } from \"./models\";\nimport { fromOpenAiReply, streamToOllama, toOpenAiBody, type OllamaChatRequest } from \"./ollama\";\nimport { AgentSession, isInside, normaliseRoot } from \"./sessions\";\n\nexport interface ServerOptions {\n root: string;\n config: ClutorConfig;\n version: string;\n backend?: BackendManager;\n /** Starts the model (llama-server) on request. Provided by whoever owns the configuration. */\n startBackend?: () => Promise<void>;\n /** Folders the server may work in from the start (the CLI passes the current folder). */\n roots?: string[];\n /** Fixed token for tests; otherwise random. */\n token?: string;\n fetch?: typeof globalThis.fetch;\n log?: (line: string) => void;\n}\n\nexport interface ClutorServer {\n readonly http: Server;\n readonly token: string;\n listen(): Promise<{ host: string; port: number }>;\n close(): Promise<void>;\n addRoot(dir: string): Promise<string>;\n readonly sessions: Map<string, AgentSession>;\n}\n\nclass HttpError extends Error {\n constructor(readonly status: number, message: string, readonly extra: Record<string, unknown> = {}) {\n super(message);\n }\n}\n\nconst MAX_BODY = 8 * 1024 * 1024;\n/** The desktop app's renderer. */\nconst APP_ORIGINS = [\"app://clutor\", \"clutor://app\"];\nconst LOCAL_HOST = /^(localhost|127\\.0\\.0\\.1|\\[::1\\])(:\\d+)?$/i;\n\nexport function createClutorServer(o: ServerOptions): ClutorServer {\n const cfg = o.config;\n const token = o.token ?? randomBytes(24).toString(\"hex\");\n const f = o.fetch ?? globalThis.fetch;\n const roots = new Set<string>();\n const sessions = new Map<string, AgentSession>();\n const host = hostInfo();\n let boundPort = cfg.port;\n const ready = (o.roots ?? []).map((r) => normaliseRoot(r).then((x) => roots.add(x)));\n\n const send = (res: ServerResponse, status: number, body: unknown, headers: Record<string, string> = {}): void => {\n const text = typeof body === \"string\" ? body : JSON.stringify(body);\n res.writeHead(status, { \"content-type\": typeof body === \"string\" ? \"text/plain; charset=utf-8\" : \"application/json; charset=utf-8\", \"cache-control\": \"no-store\", \"x-content-type-options\": \"nosniff\", ...headers });\n res.end(text);\n };\n\n const allowedOrigin = (origin: string): boolean => APP_ORIGINS.includes(origin) || cfg.corsOrigins.includes(origin) || origin === `http://localhost:${boundPort}` || origin === `http://127.0.0.1:${boundPort}`;\n\n const readBody = async (req: IncomingMessage): Promise<unknown> => {\n const chunks: Buffer[] = [];\n let n = 0;\n for await (const c of req) {\n n += (c as Buffer).length;\n if (n > MAX_BODY) throw new HttpError(413, \"request body is too large\");\n chunks.push(c as Buffer);\n }\n if (n === 0) return {};\n try { return JSON.parse(Buffer.concat(chunks).toString(\"utf8\")); } catch { throw new HttpError(400, \"the body is not valid JSON\"); }\n };\n const parse = <T extends z.ZodType>(schema: T, v: unknown): z.infer<T> => {\n const r = schema.safeParse(v);\n if (!r.success) throw new HttpError(400, r.error.issues.map((i) => `${i.path.join(\".\") || \"body\"}: ${i.message}`).join(\"; \"));\n return r.data;\n };\n\n const authed = (req: IncomingMessage): boolean => {\n const h = req.headers[\"authorization\"];\n const t = typeof h === \"string\" && h.startsWith(\"Bearer \") ? h.slice(7) : (req.headers[\"x-clutor-token\"] as string | undefined) ?? \"\";\n const a = Buffer.from(t), b = Buffer.from(token);\n return a.length === b.length && timingSafeEqual(a, b);\n };\n const needAuth = (req: IncomingMessage): void => { if (!authed(req)) throw new HttpError(401, \"this needs the access token (Authorization: Bearer <token>)\"); };\n\n const llm = (): LlmClient => {\n const b = cfg.backend;\n if (b.kind === \"openai\") {\n if (!b.baseUrl) throw new HttpError(409, \"backend.baseUrl is not set\");\n return agentLlm(cfg, { baseUrl: b.baseUrl, model: b.model ?? \"default\", ...(b.apiKeyEnv && process.env[b.apiKeyEnv] ? { apiKey: process.env[b.apiKeyEnv] as string } : {}), local: false }, f);\n }\n if (b.kind === \"llama-server\") {\n if (o.backend?.state !== \"ready\") throw new HttpError(409, \"the model is not loaded; start it first (POST /api/backend/start)\");\n return agentLlm(cfg, { baseUrl: o.backend.baseUrl, model: \"local\", local: true }, f);\n }\n throw new HttpError(409, \"no model backend is configured: set backend.kind to \\\"openai\\\" or \\\"llama-server\\\" in clutor.config.json\");\n };\n const upstream = (): { url: string; headers: Record<string, string>; model: string } => {\n const b = cfg.backend;\n if (b.kind === \"openai\" && b.baseUrl) return { url: b.baseUrl.replace(/\\/$/, \"\"), headers: b.apiKeyEnv && process.env[b.apiKeyEnv] ? { authorization: `Bearer ${process.env[b.apiKeyEnv]}` } : {}, model: b.model ?? \"default\" };\n if (b.kind === \"llama-server\" && o.backend?.state === \"ready\") return { url: o.backend.baseUrl, headers: {}, model: \"local\" };\n throw new HttpError(503, \"no model is available to answer: configure a backend and start it\", { error: { message: \"no model backend is ready\", type: \"unavailable\" } });\n };\n\n const rootFor = async (dir: unknown): Promise<string> => {\n if (typeof dir !== \"string\" || dir === \"\") throw new HttpError(400, \"dir is required\");\n await Promise.all(ready);\n let real: string;\n try { real = await normaliseRoot(dir); } catch (e) { throw new HttpError(400, e instanceof Error ? e.message : String(e)); }\n for (const r of roots) if (isInside(r, real)) return real;\n throw new HttpError(403, `${real} has not been opened in Clutor. Open it in the app, or start the server with --dir.`);\n };\n\n const planFor = (m: Awaited<ReturnType<typeof resolveModel>>, b: z.infer<typeof PlanBody>): MemoryPlan =>\n planMemory(m.layout, {\n hostRamBytes: (b.hostRamGiB ?? host.totalRamBytes / GiB) * GiB,\n ...(b.ramCeilingGiB ?? cfg.memory.ramCeilingGiB ? { ramCeilingBytes: (b.ramCeilingGiB ?? (cfg.memory.ramCeilingGiB as number)) * GiB } : {}),\n ...(cfg.memory.osHeadroomGiB !== undefined ? { osHeadroomBytes: cfg.memory.osHeadroomGiB * GiB } : {}),\n contextTokens: b.contextTokens ?? cfg.memory.contextTokens, kvBits: b.kvBits ?? cfg.memory.kvBits,\n ...((b.diskGBps ?? cfg.memory.diskGBps) ? { diskBytesPerSec: (b.diskGBps ?? (cfg.memory.diskGBps as number)) * GiB, diskMeasured: b.diskMeasured ?? cfg.memory.diskGBps !== undefined } : {}),\n });\n\n const DecideBody = z.object({\n prompt: z.string().min(1).max(200_000), choices: z.array(z.string().min(1).max(200)).min(2).max(26), model: z.string().max(200).optional(),\n }).strict();\n\n const PlanBody = z.object({\n model: z.string().max(1000), hostRamGiB: z.number().min(1).max(4096).optional(), ramCeilingGiB: z.number().min(1).max(4096).optional(),\n contextTokens: z.number().int().min(256).max(2_000_000).optional(), kvBits: z.union([z.literal(16), z.literal(8), z.literal(4)]).optional(),\n diskGBps: z.number().min(0.01).max(100).optional(), diskMeasured: z.boolean().optional(),\n }).strict();\n\n async function route(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const url = new URL(req.url ?? \"/\", \"http://localhost\");\n const path = url.pathname;\n const method = req.method ?? \"GET\";\n // A web page on another site must not be able to talk to this server through the user's browser, even by DNS rebinding.\n if (!LOCAL_HOST.test(req.headers.host ?? \"\")) throw new HttpError(421, \"this server only answers on localhost\");\n const origin = req.headers.origin;\n const cors: Record<string, string> = {};\n if (origin) {\n if (!allowedOrigin(origin)) throw new HttpError(403, `the origin ${origin} is not allowed; add it to corsOrigins in clutor.config.json`);\n Object.assign(cors, { \"access-control-allow-origin\": origin, vary: \"Origin\", \"access-control-allow-headers\": \"authorization, content-type, x-clutor-token\", \"access-control-allow-methods\": \"GET, POST, DELETE, OPTIONS\" });\n }\n if (method === \"OPTIONS\") { res.writeHead(204, cors); return void res.end(); }\n const reply = (status: number, body: unknown): void => send(res, status, body, cors);\n\n /* ── public ── */\n if (method === \"GET\" && path === \"/api/health\") return reply(200, { ok: true, version: o.version, backend: { kind: cfg.backend.kind, state: o.backend?.state ?? (cfg.backend.kind === \"openai\" ? \"external\" : \"none\") } });\n if (method === \"GET\" && path === \"/api/hardware\") return reply(200, host);\n if (method === \"GET\" && path === \"/api/catalog\") return reply(200, { models: CATALOG.map((c) => ({ id: c.id, name: c.name, experts: c.experts, expertsUsed: c.expertsUsed, layers: c.layers, publishedParamsB: c.publishedParamsB, source: c.source })), quants: QUANTS });\n\n if (method === \"POST\" && path === \"/api/plan\") {\n const b = parse(PlanBody, await readBody(req));\n const isFile = b.model.toLowerCase().endsWith(\".gguf\");\n if (isFile) needAuth(req);\n let m;\n try { m = await resolveModel(b.model, { modelsDir: resolveModelsDir(), allowFiles: isFile }); } catch (e) { throw new HttpError(e instanceof ModelError || e instanceof GgufError ? 400 : 500, e instanceof Error ? e.message : String(e)); }\n const plan = planFor(m, b);\n const gates = evaluateGates({ hostRamBytes: (b.hostRamGiB ?? host.totalRamBytes / GiB) * GiB, plan, cache: { policy: cfg.cache.policy }, smartRoute: { enabled: cfg.cache.smartRoute.enabled, maxDeltaP: cfg.cache.smartRoute.maxDeltaP }, ...(m.gguf ? { gguf: m.gguf } : {}) });\n return reply(200, { model: { id: m.id, name: m.name, source: m.source, quant: m.quant, approximate: m.layout.approximate, totalBytes: m.layout.totalBytes, layers: m.layout.layerCount, experts: m.layout.expertCount, expertsUsed: m.layout.expertsUsed }, plan, gates });\n }\n\n if (method === \"POST\" && path === \"/api/simulate\") {\n const b = parse(z.object({ model: z.string().max(100), quant: z.string().max(20).optional(), cacheGiB: z.number().min(0).max(4096), tokens: z.number().int().min(20).max(1500).default(300), locality: z.number().min(0).max(0.99).default(0.9), diskGBps: z.number().min(0.01).max(100).default(3), computeMsPerLayer: z.number().min(0).max(1000).default(0.5), seed: z.number().int().default(1), smartRoute: z.boolean().default(false) }).strict(), await readBody(req));\n const spec = CATALOG.find((c) => c.id === b.model);\n if (!spec || spec.experts === 0) throw new HttpError(400, \"pick a mixture-of-experts model from the catalog\");\n const bpw = QUANTS[b.quant ?? \"Q4_K_M\"];\n if (bpw === undefined) throw new HttpError(400, \"unknown quantisation\");\n const layout = approximateLayout(spec, bpw);\n const moe = layout.layers.filter((l) => l.experts.length).map((l) => l.index);\n const trace = generateRoutingTrace({ moeLayers: moe, experts: spec.experts, used: spec.expertsUsed, tokens: b.tokens, seed: b.seed, locality: b.locality });\n const base = { cacheBytes: b.cacheGiB * GiB, disk: { bytesPerSec: b.diskGBps * GiB, requestLatencySec: 100e-6 }, computePerLayerSec: b.computeMsPerLayer / 1000 };\n const baseline = simulateStreaming(layout, trace, { ...BASELINE, ...base });\n const clutor = simulateStreaming(layout, trace, { ...CLUTOR_DEFAULTS, smartRoute: { ...CLUTOR_DEFAULTS.smartRoute, enabled: b.smartRoute }, ...base });\n return reply(200, { synthetic: true, note: \"A synthetic routing trace: it shows how each policy behaves on a workload with this locality, not how any real model routes.\", expertBytes: expertSizeBytes(layout), baseline, clutor });\n }\n\n /* ── model API: OpenAI and Ollama compatible ── */\n if (method === \"GET\" && path === \"/v1/models\") {\n const u = upstream();\n return reply(200, { object: \"list\", data: [{ id: u.model, object: \"model\", created: 0, owned_by: \"clutor\" }] });\n }\n if (method === \"POST\" && path === \"/v1/decide\") {\n // It signs a receipt into the project's log, so unlike the model passthrough it needs the access token.\n needAuth(req);\n const b = parse(DecideBody, await readBody(req));\n const u = upstream();\n const model = u.model === \"local\" ? \"local\" : b.model ?? u.model;\n const authorization = u.headers[\"authorization\"];\n const startedAt = new Date().toISOString();\n let result;\n try { result = await runDecide({ baseUrl: u.url, model, ...(authorization ? { apiKey: authorization.replace(/^Bearer /, \"\") } : {}) }, b.prompt, b.choices, f); }\n catch (e) { if (e instanceof DecideError) throw new HttpError(e.status, e.message); throw e; }\n const root = roots.values().next().value as string | undefined;\n const receipt = root ? await sealDecision(root, model, b.prompt, b.choices, result, startedAt) : null;\n return reply(200, { choice: result.choice, probabilities: result.probabilities, probabilityMassOnChoices: result.probabilityMassOnChoices, latencyMs: result.latencyMs, receipt });\n }\n if (method === \"POST\" && path === \"/v1/chat/completions\") {\n const u = upstream();\n const body = (await readBody(req)) as Record<string, unknown>;\n const r = await f(`${u.url}/chat/completions`, { method: \"POST\", headers: { \"content-type\": \"application/json\", ...u.headers }, body: JSON.stringify({ ...body, model: u.model === \"local\" ? (body[\"model\"] ?? \"local\") : u.model }) });\n res.writeHead(r.status, { \"content-type\": r.headers.get(\"content-type\") ?? \"application/json\", \"cache-control\": \"no-store\", ...cors });\n if (!r.body) return void res.end();\n const stream = Readable.fromWeb(r.body as never);\n req.on(\"close\", () => stream.destroy());\n stream.pipe(res);\n return;\n }\n if (method === \"GET\" && path === \"/api/tags\") {\n const u = (() => { try { return upstream(); } catch { return null; } })();\n const local = await listLocalModels(resolveModelsDir()).catch(() => []);\n return reply(200, { models: [...(u ? [{ name: u.model, model: u.model, modified_at: new Date().toISOString(), size: 0, digest: \"\", details: { format: \"gguf\" } }] : []), ...local.map((m) => ({ name: m.file, model: m.file, modified_at: new Date().toISOString(), size: m.bytes, digest: \"\", details: { format: \"gguf\" } }))] });\n }\n if (method === \"POST\" && (path === \"/api/chat\" || path === \"/api/generate\")) {\n const kind = path === \"/api/chat\" ? \"chat\" : \"generate\";\n const req0 = (await readBody(req)) as OllamaChatRequest;\n const u = upstream();\n const model = req0.model ?? u.model;\n const stream = req0.stream !== false;\n const r = await f(`${u.url}/chat/completions`, { method: \"POST\", headers: { \"content-type\": \"application/json\", ...u.headers }, body: JSON.stringify({ ...toOpenAiBody(req0, u.model === \"local\" ? model : u.model, kind), ...(stream ? { stream_options: { include_usage: true } } : {}) }) });\n if (!r.ok) throw new HttpError(r.status === 404 ? 404 : 502, `the model server answered ${r.status}: ${(await r.text()).slice(0, 200)}`);\n if (!stream) return reply(200, fromOpenAiReply(kind, model, (await r.json()) as never));\n res.writeHead(200, { \"content-type\": \"application/x-ndjson\", \"cache-control\": \"no-store\", ...cors });\n for await (const line of streamToOllama(kind, model, r.body as ReadableStream<Uint8Array>)) { if (!res.write(line)) await new Promise((x) => res.once(\"drain\", x)); }\n return void res.end();\n }\n\n /* ── everything below touches files, processes or the model's lifecycle: token required ── */\n if (path.startsWith(\"/api/\")) needAuth(req);\n\n if (method === \"GET\" && path === \"/api/models\") return reply(200, { local: await listLocalModels(resolveModelsDir()), catalog: CATALOG.map((c) => c.id) });\n if (method === \"GET\" && path === \"/api/roots\") return reply(200, { roots: [...roots] });\n if (method === \"POST\" && path === \"/api/roots\") {\n const b = parse(z.object({ dir: z.string().min(1).max(2000) }).strict(), await readBody(req));\n try { return reply(200, { root: await addRoot(b.dir) }); } catch (e) { throw new HttpError(400, e instanceof Error ? e.message : String(e)); }\n }\n if (method === \"GET\" && path === \"/api/backend\") return reply(200, { kind: cfg.backend.kind, state: o.backend?.state ?? \"n/a\", error: o.backend?.error ?? null, log: o.backend?.recentLog.slice(-40) ?? [] });\n if (method === \"POST\" && path === \"/api/backend/stop\") { await o.backend?.stop(); return reply(200, { state: o.backend?.state ?? \"n/a\" }); }\n if (method === \"POST\" && path === \"/api/backend/start\") {\n if (!o.startBackend || !o.backend) throw new HttpError(409, \"this server was not set up to start a model: set backend.kind to llama-server and give it a model file\");\n if (o.backend.state === \"ready\" || o.backend.state === \"starting\") return reply(200, { state: o.backend.state });\n // Loading a large model takes minutes: answer now and let the client poll /api/backend.\n void o.startBackend().catch((e: unknown) => o.log?.(`backend: ${e instanceof Error ? e.message : String(e)}`));\n return reply(202, { state: \"starting\" });\n }\n if (method === \"POST\" && path === \"/api/bench\") {\n const b = parse(z.object({ model: z.string().max(2000).optional() }).strict(), await readBody(req));\n let file = b.model;\n let cleanup: (() => Promise<void>) | undefined;\n if (file) { try { file = (await resolveModel(file, { modelsDir: resolveModelsDir() })).path; } catch (e) { throw new HttpError(400, e instanceof Error ? e.message : String(e)); } }\n else {\n const { mkdtemp, rm } = await import(\"node:fs/promises\");\n const { tmpdir } = await import(\"node:os\");\n const dir = await mkdtemp(`${tmpdir()}/clutor-bench-`);\n cleanup = () => rm(dir, { recursive: true, force: true });\n file = `${dir}/bench.gguf`;\n await writeSyntheticGguf(file, { arch: \"qwen2moe\", name: \"bench-moe\", layers: 8, embedding: 1024, heads: 16, kvHeads: 4, contextLength: 4096, expertCount: 32, expertsUsed: 4, expertFfn: 1024, denseFfn: 0, vocab: 4096, sharedExperts: 0 });\n }\n try {\n const r = await fileReader(file as string);\n let layout;\n try { layout = buildModelLayout(await parseGguf(r)); } finally { await r.close(); }\n if (!layout.expertCount) throw new HttpError(400, \"this model has no experts to read\");\n const m = await measureExpertReads(file as string, layout, host.totalRamBytes, 96);\n return reply(200, { measurement: m, synthetic: b.model === undefined });\n } finally { await cleanup?.(); }\n }\n\n if (method === \"POST\" && path === \"/api/mcp\") {\n const r = await handleMcp((await readBody(req)) as never, { isRoot: (d) => rootFor(d).catch(() => null) });\n return r.status === 202 ? (res.writeHead(202, cors), void res.end()) : reply(r.status, r.body);\n }\n\n if (method === \"POST\" && path === \"/api/agent/run\") {\n const b = parse(z.object({ dir: z.string().min(1), task: z.string().min(1).max(20_000) }).strict(), await readBody(req));\n const dir = await rootFor(b.dir);\n const client = llm();\n const project = new NodeProject(dir);\n const s = new AgentSession(dir, b.task, project, new ShadowWorkspace(project), cfg, host.totalRamBytes);\n sessions.set(s.id, s);\n if (sessions.size > 50) for (const [k, v] of sessions) { if (v.status !== \"running\") { sessions.delete(k); break; } }\n s.start(client);\n return reply(202, { id: s.id });\n }\n const m = /^\\/api\\/agent\\/(task_[a-f0-9]+)(?:\\/([a-z]+))?$/.exec(path);\n if (m) {\n const s = sessions.get(m[1] as string);\n if (!s) throw new HttpError(404, \"no such task\");\n const action = m[2];\n if (method === \"GET\" && !action) return reply(200, await s.info());\n if (method === \"GET\" && action === \"events\") {\n res.writeHead(200, { \"content-type\": \"text/event-stream\", \"cache-control\": \"no-store\", connection: \"keep-alive\", ...cors });\n const from = Number(url.searchParams.get(\"from\") ?? 0) || 0;\n const stop = s.subscribe(from, (e) => res.write(`data: ${JSON.stringify(e)}\\n\\n`), () => res.end());\n req.on(\"close\", stop);\n return;\n }\n if (method === \"POST\" && action === \"approve\") {\n const b = parse(z.object({ requestId: z.string(), allow: z.boolean() }).strict(), await readBody(req));\n return s.resolveApproval(b.requestId, b.allow) ? reply(200, { ok: true }) : reply(404, { error: \"no such approval request\" });\n }\n if (method === \"POST\" && action === \"stop\") { s.stop(); return reply(200, { ok: true }); }\n if (method === \"POST\" && action === \"apply\") {\n const b = parse(z.object({ force: z.boolean().default(false) }).strict(), await readBody(req));\n try { return reply(200, await s.apply(b.force)); } catch (e) {\n if (e instanceof ConflictError) return reply(409, { error: e.message, conflicts: e.conflicts });\n throw new HttpError(400, e instanceof Error ? e.message : String(e));\n }\n }\n if (method === \"POST\" && action === \"rollback\") {\n const b = parse(z.object({ force: z.boolean().default(false) }).strict(), await readBody(req));\n try { await s.rollback(b.force); return reply(200, { ok: true }); } catch (e) {\n if (e instanceof ConflictError) return reply(409, { error: e.message, conflicts: e.conflicts });\n throw new HttpError(400, e instanceof Error ? e.message : String(e));\n }\n }\n }\n if (method === \"GET\" && path === \"/api/receipts\") {\n const dir = await rootFor(url.searchParams.get(\"dir\"));\n return reply(200, { receipts: (await readReceipts(dir)).slice(-100), verification: await verifyReceiptLog(dir), checkpoints: await listCheckpoints(new NodeProject(dir)) });\n }\n throw new HttpError(404, \"no such endpoint\");\n }\n\n function resolveModelsDir(): string {\n return cfg.models.startsWith(\"/\") || /^[A-Za-z]:/.test(cfg.models) ? cfg.models : `${o.root}/${cfg.models}`;\n }\n async function addRoot(dir: string): Promise<string> {\n const real = await normaliseRoot(dir);\n roots.add(real);\n return real;\n }\n\n const http = createHttpServer((req, res) => {\n route(req, res).catch((e: unknown) => {\n const status = e instanceof HttpError ? e.status : 500;\n if (status === 500) o.log?.(`error: ${e instanceof Error ? e.stack ?? e.message : String(e)}`);\n if (res.headersSent) return void res.destroy();\n send(res, status, { error: e instanceof HttpError ? e.message : \"internal error\", ...(e instanceof HttpError ? e.extra : {}) });\n });\n });\n http.headersTimeout = 15_000;\n http.requestTimeout = 0; // chat and event streams are long-lived\n\n return {\n http, token, sessions, addRoot,\n listen: () => new Promise((resolve, reject) => {\n http.once(\"error\", reject);\n http.listen(cfg.port, cfg.host, () => { const a = http.address() as AddressInfo; boundPort = a.port; resolve({ host: a.address, port: a.port }); });\n }),\n close: async () => {\n for (const s of sessions.values()) s.stop();\n await new Promise<void>((r) => { http.close(() => r()); http.closeAllConnections(); });\n await o.backend?.stop();\n },\n };\n}\n","import { spawn } from \"node:child_process\";\nimport { accessSync, constants } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { delimiter, dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * The native engine (c/): a C program that reads a GGUF file directly and streams its experts from disk through Clutor's cache.\n * It does not run a transformer yet. What it measures is real (bytes read, time spent waiting for them, cache and prefetch behaviour);\n * what it routes with is a synthetic router, and every report says so.\n */\n\nexport class EngineError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"EngineError\";\n }\n}\n\nconst EXE = process.platform === \"win32\" ? \"clutor-engine.exe\" : \"clutor-engine\";\nconst executable = (p: string): boolean => { try { accessSync(p, constants.X_OK); return true; } catch { return false; } };\n\n/** The `c/` folder of a source checkout (absent in an installed package). */\nexport function engineSourceDir(): string {\n return join(dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"..\", \"c\");\n}\n\nexport function findEngine(env: NodeJS.ProcessEnv = process.env): string | undefined {\n const candidates = [env[\"CLUTOR_ENGINE\"], join(engineSourceDir(), \"build\", EXE), join(homedir(), \".clutor\", \"bin\", EXE), ...(env[\"PATH\"] ?? \"\").split(delimiter).map((d) => join(d, EXE))];\n return candidates.find((c): c is string => !!c && executable(c));\n}\n\nexport function run(bin: string, args: string[], opts: { timeoutMs?: number; cwd?: string } = {}): Promise<{ code: number; stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const child = spawn(bin, args, { stdio: [\"ignore\", \"pipe\", \"pipe\"], ...(opts.cwd ? { cwd: opts.cwd } : {}) });\n let stdout = \"\", stderr = \"\";\n const timer = setTimeout(() => { child.kill(\"SIGKILL\"); reject(new EngineError(`${bin} did not finish within ${(opts.timeoutMs ?? 600_000) / 1000} seconds`)); }, opts.timeoutMs ?? 600_000);\n child.stdout.on(\"data\", (b: Buffer) => { stdout += b.toString(); });\n child.stderr.on(\"data\", (b: Buffer) => { stderr += b.toString(); });\n child.on(\"error\", (e) => { clearTimeout(timer); reject(new EngineError(`could not start ${bin}: ${e.message}`)); });\n child.on(\"close\", (code) => { clearTimeout(timer); resolve({ code: code ?? 1, stdout, stderr }); });\n });\n}\n\n/** Compiles the engine from source with `make` (needs a C compiler). Returns the path of the binary. */\nexport async function buildEngine(): Promise<string> {\n const dir = engineSourceDir();\n const r = await run(\"make\", [\"-C\", dir], { timeoutMs: 300_000 }).catch((e: unknown) => { throw new EngineError(`could not run make: ${e instanceof Error ? e.message : String(e)}`); });\n if (r.code !== 0) throw new EngineError(`the engine did not compile:\\n${(r.stderr || r.stdout).split(\"\\n\").slice(-15).join(\"\\n\")}`);\n const bin = join(dir, \"build\", EXE);\n if (!executable(bin)) throw new EngineError(`make finished but ${bin} is missing`);\n return bin;\n}\n\nexport interface EngineInfo {\n arch: string; name: string; layers: number; experts: number; expertsUsed: number; moeLayers: number;\n residentBytes: number; maxDenseBytes: number; maxExpertBytes: number; totalBytes: number; unsizedTensors: number;\n layerTable: Array<{ denseBytes: number; expertBytes: number; routerBytes: number }>;\n}\n\nexport interface StreamOptions {\n tokens?: number; warmup?: number; cacheMb?: number; stage?: number;\n policy?: \"lru\" | \"wtinylfu\" | \"adaptive\";\n smart?: string; prefetch?: boolean; ioThreads?: number; seed?: number; locality?: number; predictCorr?: number; computeUs?: number; windowPct?: number;\n noOsCache?: boolean;\n /** auto: keep the dense weights in RAM when they fit in a quarter of it; ring: re-read two layers at a time every token. */\n dense?: \"auto\" | \"resident\" | \"ring\";\n /** kernel: a Q4_0 x Q8_0 dot-product kernel over every loaded byte (default); checksum: a cheap hash, so the run measures I/O alone. */\n compute?: \"kernel\" | \"checksum\";\n /** Scenario: measured tokens [at, at+len) route uniformly at random (scan noise); all others use one fixed tight topic. */\n shift?: { at: number; len: number };\n /** Record hits and peak RSS every N measured tokens. */\n window?: number;\n}\n\nexport interface StreamReport {\n provenance: { routing: string; disk: string; compute: string };\n model: { name: string; arch: string; layers: number; experts: number; expertsUsed: number; expertBytes: number };\n config: { policy: string; cacheSlots: number; stageSlots: number; smartRoute: boolean; J: number; M: number; tau: number; denseMode: \"resident\" | \"ring\"; densePreloadBytes: number; computeMode: \"kernel\" | \"checksum\"; computeKernel: string; prefetch: boolean; ioThreads: number; osCacheBypass: boolean; tokens: number; warmup: number; seed: number; locality: number; predictCorr: number };\n totals: {\n accesses: number; hits: number; stageHits: number; misses: number; bypass: number; hitRate: number; substituted: number; droppedMass: number; maxDeltaP: number; admitRejects: number; evictions: number;\n prefetchIssued: number; prefetchLate: number; prefetchWasted: number; demandBytes: number; prefetchBytes: number; denseBytes: number;\n wallSeconds: number; ioWaitSeconds: number; computeSeconds: number; readSecondsTotal: number; overlap: number; tokensPerSecond: number; gbPerToken: number; missesPerToken: number; checksum: string;\n };\n /** ru_maxrss of the engine process, bytes: before it allocated anything, and at the end of the run. */\n rss: { startBytes: number; peakBytes: number; /** Process baseline plus every buffer and table the run allocates, all pages touched. */ predictedBytes: number };\n scenario: { shiftAt: number; shiftLen: number };\n windows: Array<{ tokEnd: number; accesses: number; hits: number; peakRssBytes: number }>;\n layers: Array<{ layer: number; accesses: number; hits: number; misses: number; substituted: number; ioWaitSeconds: number }>;\n}\n\nfunction streamArgs(file: string, o: StreamOptions): string[] {\n const a = [\"stream\", file, \"--json\"];\n const add = (k: string, v: string | number | undefined): void => { if (v !== undefined) a.push(k, String(v)); };\n add(\"--tokens\", o.tokens); add(\"--warmup\", o.warmup); add(\"--cache-mb\", o.cacheMb); add(\"--stage\", o.stage); add(\"--policy\", o.policy);\n add(\"--smart\", o.smart); if (o.prefetch !== undefined) add(\"--prefetch\", o.prefetch ? \"on\" : \"off\");\n add(\"--io-threads\", o.ioThreads); add(\"--seed\", o.seed); add(\"--locality\", o.locality); add(\"--predict-corr\", o.predictCorr); add(\"--compute-us\", o.computeUs); add(\"--window-pct\", o.windowPct);\n add(\"--dense\", o.dense); add(\"--compute\", o.compute); add(\"--window\", o.window);\n if (o.shift) add(\"--shift\", `${o.shift.at},${o.shift.len}`);\n if (o.noOsCache) a.push(\"--no-os-cache\");\n return a;\n}\n\nexport async function engineInfo(bin: string, file: string): Promise<EngineInfo> {\n const r = await run(bin, [\"info\", file, \"--json\"], { timeoutMs: 60_000 });\n if (r.code !== 0) throw new EngineError(r.stderr.trim() || `engine exited with ${r.code}`);\n return JSON.parse(r.stdout) as EngineInfo;\n}\n\nexport async function engineStream(bin: string, file: string, o: StreamOptions = {}, timeoutMs = 900_000): Promise<StreamReport> {\n const r = await run(bin, streamArgs(file, o), { timeoutMs });\n if (r.code !== 0) throw new EngineError(r.stderr.trim() || `engine exited with ${r.code}`);\n try { return JSON.parse(r.stdout) as StreamReport; } catch { throw new EngineError(\"the engine printed something that is not a report\"); }\n}\n","import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n BASELINE, CATALOG, CLUTOR_DEFAULTS, GiB, QUANTS, ShadowWorkspace, OpenAiCompatibleClient, buildModelLayout, evaluateGates, expertSizeBytes, fmtGiB, generateRoutingTrace, parseGguf, planMemory, runAgent, simulateStreaming, validateBounds, approximateLayout, fmtBytes,\n keyThumbprint, sealReceipt, verifyReceiptChain, type AgentEvent, type LlmClient, type PublicJwk, type Receipt,\n} from \"@clutor/core\";\nimport { NodeProject, applyChanges, diskModelFrom, fileReader, hostInfo, lastReceiptTag, listCheckpoints, loadOrCreateReceiptSigner, measureExpertReads, appendReceipt, readReceipts, rollbackCheckpoint, scratchRunner, verifyReceiptLog, writeSyntheticGguf, ConflictError } from \"@clutor/core/node\";\nimport { UsageError, flagBool, flagInt, flagString, parseArgs } from \"./args\";\nimport { agentLlm, ensureSlotDir } from \"./agentllm\";\nimport { runDecide } from \"./decide\";\nimport { BackendManager, buildLlamaArgs, findLlamaServer, probeLlamaServer } from \"./backend\";\nimport { CONFIG_FILE, ConfigError, DEFAULT_PORT, loadConfig, type ClutorConfig } from \"./config\";\nimport { formatGates, formatPlan, formatSimulation, pct, table, tps } from \"./format\";\nimport { EngineError, buildEngine, engineInfo, engineStream, findEngine, type StreamOptions, type StreamReport } from \"./engine\";\nimport { DOWNLOADS, downloadFile, downloadUrl, listLocalModels, resolveModel } from \"./models\";\nimport { createClutorServer } from \"./server\";\n\nexport interface Io {\n out(line: string): void;\n err(line: string): void;\n cwd: string;\n /** Asks the user a question and returns the answer. Absent when there is no terminal. */\n prompt?(question: string): Promise<string>;\n}\n\n/** State that survives from one task to the next inside an interactive session (see repl.ts). One-shot commands run without it. */\nexport interface SessionState {\n /** The model server, started on the first task and kept for the rest of the session. */\n backend?: BackendManager;\n /** Check to run after each task; set with /verify. It is the user's own command, so it runs without asking. */\n verify?: string;\n /** Run commands without asking (/yes). */\n auto: boolean;\n /** Checkpoint of the last applied task, for /undo. */\n lastCheckpoint?: { id: string; dir: string };\n /** One line per finished task, given to the next task so the agent knows what already happened. */\n notes: string[];\n /** Tokens the model server reported, summed over the session (measured, not estimated). */\n usage: { promptTokens: number; completionTokens: number };\n}\n\nexport const version = (): string => {\n try {\n const here = dirname(fileURLToPath(import.meta.url));\n return (JSON.parse(readFileSync(join(here, \"..\", \"package.json\"), \"utf8\")) as { version: string }).version;\n } catch { return \"0.0.0\"; }\n};\n\nconst HELP = `clutor: run very large models from disk on small machines, and a coding agent that works on your project\n\nUsage: clutor <command> [options]\n clutor In a terminal: an interactive session. Type a task, or /help for commands.\n\n init [dir] Create clutor.config.json and a models folder\n models [dir] List the model catalog and the .gguf files in your models folder\n pull [id] [--yes] List the small test models you can download, or download one into your models folder\n inspect <file.gguf> Read a model file's header: architecture, layers, experts, sizes\n plan <model> [--ram GiB] [--ctx N] [--kv 16|8|4] [--disk GiB/s] [--quant Q4_K_M] [--json]\n Will it fit? Where does the memory go? How fast could it possibly run?\n simulate <model> [--cache GiB] [--tokens N] [--locality 0.9] [--disk GiB/s] [--compute-ms N] [--smart-route] [--json]\n Replay a routing trace through the expert cache: baseline LRU against clutor\n bench [--file model.gguf] [--engine] [--cache-mb N] [--tokens N] [--compute kernel|checksum]\n Measure real disk reads on this machine; with the native engine, also compare cache and prefetch strategies\n stream <model.gguf> [--tokens N] [--cache-mb N] [--policy lru|wtinylfu|adaptive] [--smart J,M,TAU|off] [--prefetch on|off] [--dense auto|resident|ring] [--compute kernel|checksum] [--json]\n Stream a model's experts from disk through the native engine (synthetic routing; measured I/O and cache)\n engine build|where Compile the native engine from c/ (needs a C compiler), or show which one is used\n code \"<task>\" [--dir folder] [--apply] [--yes] [--verify \"npm test\"] [--max-steps N]\n Run the coding agent on a folder; review the diff before anything is written\n serve [dir] [--port ${DEFAULT_PORT}] [--folder dir]... Start the local server: OpenAI and Ollama compatible API, agent, MCP\n backend [--model file.gguf] Find llama-server, see which flags it supports and how clutor would start it\n status [dir] One screen: machine, model backend, memory plan, receipts\n chat [--prompt \"<text>\"] [--system \"<text>\"] Talk to the configured model in the terminal (one-shot with --prompt, else a REPL)\n decide --prompt \"<text>\" --choices \"a,b,c\" [--json] One forward pass, no chat loop: probability of each choice's first token\n receipts [dir] Verify the agent's receipt log and list checkpoints (also: ledger verify|list)\n receipt verify <clt_token|file> [dir] [--key-id id|--pubkey file] Check a receipt log offline; receipt key shows your key id\n rollback <checkpoint> [--dir folder] [--force] Undo an applied task\n doctor [dir] Check this machine and the configuration\n\nModels are catalog ids (${CATALOG.map((c) => c.id).join(\", \")}) or the path of a .gguf file.\nCommon options: --config <file> --json -h, --help -v, --version\n`;\n\nconst BOOLEANS = [\"json\", \"help\", \"version\", \"apply\", \"yes\", \"force\", \"smart-route\", \"no-start\", \"engine\", \"no-os-cache\"] as const;\n\nfunction cfgFor(args: ReturnType<typeof parseArgs>, io: Io, dirArg?: string) {\n return loadConfig(dirArg ? resolve(io.cwd, dirArg) : io.cwd, flagString(args, \"config\"));\n}\n\nexport async function main(argv: string[], io: Io, session?: SessionState): Promise<number> {\n const args = parseArgs(argv, BOOLEANS);\n const [command, ...rest] = args.positional;\n const json = flagBool(args, \"json\");\n try {\n if (flagBool(args, \"version\") || command === \"version\" || argv.includes(\"-v\")) return io.out(version()), 0;\n if (!command && !flagBool(args, \"help\") && !argv.includes(\"-h\") && io.prompt && !session) return await (await import(\"./repl\")).runRepl(io, (a, s) => main(a, io, s), (cfg, what) => engineSlashCommand(io, cfg, what));\n if (!command || flagBool(args, \"help\") || command === \"help\" || argv.includes(\"-h\")) return io.out(HELP), 0;\n\n switch (command) {\n case \"init\": return await init(io, rest[0]);\n case \"models\": return await models(io, args, rest[0], json);\n case \"stream\": return await streamCmd(io, args, rest[0], json);\n case \"engine\": return await engineCmd(io, rest[0]);\n case \"pull\": return await pull(io, args, rest[0]);\n case \"inspect\": return await inspect(io, rest[0], json);\n case \"plan\": return await plan(io, args, rest[0], json);\n case \"simulate\": return await simulate(io, args, rest[0], json);\n case \"bench\": return await bench(io, args, json);\n case \"code\": return await code(io, args, rest.join(\" \"), session);\n case \"serve\": return await serve(io, args, rest[0]);\n case \"backend\": return await backendCmd(io, args);\n case \"receipts\": return await receipts(io, args, rest[0], json);\n case \"ledger\": return await receipts(io, args, rest[1], json);\n case \"receipt\": return await receiptVerify(io, args, rest[0], rest[1], rest[2]);\n case \"status\": return await status(io, args, rest[0], json);\n case \"chat\": return await chat(io, args);\n case \"decide\": return await decide(io, args, json);\n case \"rollback\": return await rollback(io, args, rest[0]);\n case \"doctor\": return await doctor(io, args, rest[0], json);\n default: throw new UsageError(`unknown command \"${command}\"; run clutor --help`);\n }\n } catch (e) {\n if (e instanceof UsageError || e instanceof ConfigError) { io.err(e.message); return 2; }\n io.err(e instanceof Error ? e.message : String(e));\n return 1;\n }\n}\n\n/* ───────────── commands ───────────── */\n\nfunction init(io: Io, dirArg?: string): number {\n const dir = resolve(io.cwd, dirArg ?? \".\");\n mkdirSync(join(dir, \"models\"), { recursive: true });\n const path = join(dir, CONFIG_FILE);\n if (existsSync(path)) { io.err(`${path} already exists; leaving it alone`); return 1; }\n writeFileSync(path, `${JSON.stringify({ port: DEFAULT_PORT, models: \"models\", backend: { kind: \"none\" }, memory: { contextTokens: 8192, kvBits: 16 }, cache: { policy: \"adaptive\" }, agent: { toolMode: \"json\", maxSteps: 30 } }, null, 2)}\\n`);\n const h = hostInfo();\n io.out(`Created ${path} and ${join(dir, \"models\")}.`);\n io.out(`This machine: ${h.platformName} ${h.arch}, ${h.cpuModel}, ${fmtGiB(h.totalRamBytes)} RAM.`);\n io.out(\"\");\n io.out(\"Next: put a .gguf file in the models folder, then\");\n io.out(\" clutor plan <file.gguf> to see whether and how it fits\");\n io.out(\" clutor backend --model <file> to see how llama-server would be started for it\");\n return 0;\n}\n\nasync function models(io: Io, args: ReturnType<typeof parseArgs>, dirArg: string | undefined, json: boolean): Promise<number> {\n const { config, root } = cfgFor(args, io, dirArg);\n const local = await listLocalModels(resolve(root, config.models));\n if (json) { io.out(JSON.stringify({ local, catalog: CATALOG.map((c) => c.id) }, null, 2)); return 0; }\n io.out(\"Catalog (architectures you can plan for before downloading anything):\");\n io.out(table(CATALOG.map((c) => [c.id, c.name, `${c.publishedParamsB}B`, c.experts ? `${c.experts} experts, ${c.expertsUsed} used` : \"dense\"])));\n io.out(\"\");\n io.out(local.length ? `In ${resolve(root, config.models)}:\\n${table(local.map((m) => [m.file, fmtBytes(m.bytes)]))}` : `No .gguf files in ${resolve(root, config.models)}.`);\n return 0;\n}\n\nasync function inspect(io: Io, file: string | undefined, json: boolean): Promise<number> {\n if (!file) throw new UsageError(\"usage: clutor inspect <file.gguf>\");\n const path = resolve(io.cwd, file);\n const r = await fileReader(path);\n try {\n const g = await parseGguf(r);\n const l = buildModelLayout(g);\n validateBounds(g);\n if (json) { io.out(JSON.stringify({ version: g.version, tensors: g.tensorCount, arch: l.arch, name: l.name, layers: l.layerCount, experts: l.expertCount, expertsUsed: l.expertsUsed, bytes: l.totalBytes, quantisations: l.quantisations, residentBytes: l.residentBytes, fileBytes: g.fileSize }, null, 2)); return 0; }\n io.out(`${l.name} (${l.arch}), GGUF v${g.version}, ${g.tensorCount} tensors, ${fmtBytes(g.fileSize)}`);\n io.out(`${l.layerCount} layers${l.expertCount ? `, ${l.expertCount} experts per layer (${l.expertsUsed} used per token${l.sharedExperts ? `, ${l.sharedExperts} shared` : \"\"})` : \", dense\"}`);\n io.out(`Always needed in RAM: ${fmtBytes(l.residentBytes)} Per-layer dense weights: ${fmtBytes(l.layers.reduce((s, x) => s + x.denseBytes, 0))} Experts: ${fmtBytes(l.layers.reduce((s, x) => s + x.experts.length * x.expertBytes, 0))}`);\n io.out(`Quantisations: ${Object.entries(l.quantisations).sort((a, b) => b[1] - a[1]).map(([k, v]) => `${k} ${fmtBytes(v)}`).join(\", \")}`);\n io.out(`KV cache: ${l.kv.kvHeads} KV heads x ${l.kv.headDim} dims, up to ${l.kv.maxContext.toLocaleString(\"en-US\")} tokens`);\n if (l.unsizedTensors) io.out(`! ${l.unsizedTensors} tensors use a quantisation this reader cannot size.`);\n io.out(\"All tensors lie inside the file.\");\n return 0;\n } finally { await r.close(); }\n}\n\nfunction numFlag(args: ReturnType<typeof parseArgs>, name: string, min: number, max: number): number | undefined {\n const v = flagString(args, name);\n if (v === undefined) return undefined;\n const n = Number(v);\n if (!Number.isFinite(n) || n < min || n > max) throw new UsageError(`--${name} must be a number from ${min} to ${max}`);\n return n;\n}\n\nasync function plan(io: Io, args: ReturnType<typeof parseArgs>, ref: string | undefined, json: boolean): Promise<number> {\n if (!ref) throw new UsageError(\"usage: clutor plan <model> [--ram GiB]\");\n const { config, root } = cfgFor(args, io);\n const quant = flagString(args, \"quant\");\n const m = await resolveModel(ref.toLowerCase().endsWith(\".gguf\") ? resolve(io.cwd, ref) : quant ? `${ref}@${quant}` : ref, { modelsDir: resolve(root, config.models) });\n const h = hostInfo();\n const ram = numFlag(args, \"ram\", 1, 4096) ?? config.memory.ramCeilingGiB;\n const disk = numFlag(args, \"disk\", 0.01, 100) ?? config.memory.diskGBps;\n const kv = flagInt(args, \"kv\", 4, 16);\n if (kv !== undefined && ![4, 8, 16].includes(kv)) throw new UsageError(\"--kv must be 16, 8 or 4\");\n // --ram describes the machine to plan for (an 8 GiB laptop, say): the operating system's share comes out of it. The config's ramCeilingGiB stays a ceiling on this machine.\n const ramFlag = numFlag(args, \"ram\", 1, 4096);\n const hostRam = ramFlag !== undefined ? ramFlag * GiB : h.totalRamBytes;\n const p = planMemory(m.layout, {\n hostRamBytes: hostRam,\n ...(ramFlag === undefined && ram ? { ramCeilingBytes: ram * GiB } : {}), ...(config.memory.osHeadroomGiB !== undefined ? { osHeadroomBytes: config.memory.osHeadroomGiB * GiB } : {}),\n contextTokens: flagInt(args, \"ctx\", 256, 2_000_000) ?? config.memory.contextTokens, kvBits: (kv as 16 | 8 | 4 | undefined) ?? config.memory.kvBits,\n ...(disk ? { diskBytesPerSec: disk * GiB, diskMeasured: flagString(args, \"disk\") !== undefined || config.memory.diskGBps !== undefined } : {}),\n });\n const gates = evaluateGates({ hostRamBytes: hostRam, plan: p, cache: { policy: config.cache.policy }, smartRoute: { enabled: config.cache.smartRoute.enabled, maxDeltaP: config.cache.smartRoute.maxDeltaP }, ...(m.gguf ? { gguf: m.gguf } : {}) });\n if (json) { io.out(JSON.stringify({ model: { id: m.id, name: m.name, approximate: m.layout.approximate }, plan: p, gates }, null, 2)); return p.fits ? 0 : 1; }\n io.out(formatPlan(m.name, m.quant, p));\n io.out(\"\");\n io.out(formatGates(gates));\n return p.fits ? 0 : 1;\n}\n\nasync function simulate(io: Io, args: ReturnType<typeof parseArgs>, id: string | undefined, json: boolean): Promise<number> {\n if (!id) throw new UsageError(\"usage: clutor simulate <model> --cache <GiB>\");\n const spec = CATALOG.find((c) => c.id === id);\n if (!spec || spec.experts === 0) throw new UsageError(`pick a mixture-of-experts model: ${CATALOG.filter((c) => c.experts).map((c) => c.id).join(\", \")}`);\n const quant = flagString(args, \"quant\") ?? \"Q4_K_M\";\n const bpw = QUANTS[quant];\n if (bpw === undefined) throw new UsageError(`unknown quantisation ${quant}`);\n const layout = approximateLayout(spec, bpw);\n const cacheGiB = numFlag(args, \"cache\", 0, 4096) ?? 4;\n const tokens = flagInt(args, \"tokens\", 20, 3000) ?? 300;\n const moe = layout.layers.filter((l) => l.experts.length).map((l) => l.index);\n const trace = generateRoutingTrace({ moeLayers: moe, experts: spec.experts, used: spec.expertsUsed, tokens, seed: flagInt(args, \"seed\", 0, 2 ** 31) ?? 1, locality: numFlag(args, \"locality\", 0, 0.99) ?? 0.9 });\n const base = { cacheBytes: cacheGiB * GiB, disk: { bytesPerSec: (numFlag(args, \"disk\", 0.01, 100) ?? 3) * GiB, requestLatencySec: 100e-6 }, computePerLayerSec: (numFlag(args, \"compute-ms\", 0, 1000) ?? 0.5) / 1000 };\n const b = simulateStreaming(layout, trace, { ...BASELINE, ...base });\n const c = simulateStreaming(layout, trace, { ...CLUTOR_DEFAULTS, smartRoute: { ...CLUTOR_DEFAULTS.smartRoute, enabled: flagBool(args, \"smart-route\") }, ...base });\n if (json) { io.out(JSON.stringify({ synthetic: true, baseline: b, clutor: c }, null, 2)); return 0; }\n io.out(`${spec.name} (${quant}), ${cacheGiB} GiB expert cache, ${tokens} tokens, expert size ${(expertSizeBytes(layout) / 2 ** 20).toFixed(1)} MiB`);\n io.out(formatSimulation(b, c));\n io.out(\"\");\n io.out(\"This replays a SYNTHETIC routing trace (skewed expert popularity, neighbouring tokens that pick similar experts). It shows how each policy\");\n io.out(\"behaves on a workload like that; it is not a measurement of any real model, and speed is modelled from the disk speed you give it.\");\n return 0;\n}\n\nasync function bench(io: Io, args: ReturnType<typeof parseArgs>, json: boolean): Promise<number> {\n const h = hostInfo();\n const file = flagString(args, \"file\");\n let path: string;\n let cleanup: (() => void) | undefined;\n if (file) path = resolve(io.cwd, file);\n else {\n const dir = mkdtempSync(join(tmpdir(), \"clutor-bench-\"));\n cleanup = () => rmSync(dir, { recursive: true, force: true });\n path = join(dir, \"bench.gguf\");\n io.err(\"No --file given: writing a test model of about 1 GiB to the temp folder (it will be deleted).\");\n await writeSyntheticGguf(path, { arch: \"qwen2moe\", name: \"bench-moe\", layers: 8, embedding: 1024, heads: 16, kvHeads: 4, contextLength: 4096, expertCount: 32, expertsUsed: 4, expertFfn: 1024, denseFfn: 0, vocab: 4096, sharedExperts: 0 });\n }\n try {\n const r = await fileReader(path);\n const layout = buildModelLayout(await parseGguf(r));\n await r.close();\n if (!layout.expertCount) throw new UsageError(\"this model has no experts; bench measures expert-sized reads\");\n const m = await measureExpertReads(path, layout, h.totalRamBytes, 96);\n const dm = diskModelFrom(m, expertSizeBytes(layout), layout.layers.find((l) => l.experts.length)?.experts[0]?.length ?? 1);\n const bin = findEngine();\n if (flagBool(args, \"engine\") && !bin) throw new UsageError(\"the native engine is not built: run `clutor engine build` (needs a C compiler)\");\n const startedAt = new Date().toISOString();\n const cmp = bin ? await compareStrategies(bin, path, flagInt(args, \"cache-mb\", 1, 1_000_000) ?? Math.max(64, Math.floor(h.totalRamBytes / 2 ** 20 / 16)), flagInt(args, \"tokens\", 10, 100_000) ?? 300, (flagString(args, \"dense\") as StreamOptions[\"dense\"] | undefined), computeFlag(args)) : undefined;\n if (json) { io.out(JSON.stringify({ measurement: m, diskModel: dm, ...(cmp ? { engine: cmp } : {}) }, null, 2)); return 0; }\n io.out(`${m.samples} random expert reads from ${path} (${fmtBytes(m.fileBytes)}):`);\n io.out(table([[\"throughput\", `${(m.bytesPerSec / 2 ** 30).toFixed(2)} GiB/s`], [\"mean per expert\", `${(m.meanReadSec * 1000).toFixed(2)} ms`], [\"95th percentile\", `${(m.p95ReadSec * 1000).toFixed(2)} ms`], [\"modelled request overhead\", `${(dm.requestLatencySec * 1e6).toFixed(0)} us`]]));\n io.out(\"\");\n io.out(m.likelyCold ? \"The file is larger than 1.5x your RAM, so most reads came from the SSD.\" : `! The file (${fmtBytes(m.fileBytes)}) is not much bigger than your RAM (${fmtGiB(h.totalRamBytes)}), so the operating system's cache probably served many of these reads. Treat this as an upper bound; run it on your real model file for a true figure.`);\n io.out(`Use it: clutor plan <model> --disk ${(m.bytesPerSec / 2 ** 30).toFixed(1)}`);\n if (cmp) io.out(`\\n${formatComparison(cmp)}`);\n if (cmp && flagBool(args, \"receipt\")) {\n const dir = resolve(io.cwd, flagString(args, \"dir\") ?? \".\");\n const signer = await loadOrCreateReceiptSigner(dir);\n const finishedAt = new Date().toISOString();\n const brief = cmp.map((x) => `${x.name}: hit ${(x.report.totals.hitRate * 100).toFixed(1)}%, ${x.report.totals.missesPerToken.toFixed(1)} misses/token, ${x.report.totals.tokensPerSecond.toFixed(2)} passes/s`).join(\" | \");\n const first = cmp[0]!.report;\n const rc = await sealReceipt(signer, { v: 2, id: `bench_${Date.now().toString(36)}`, task: `bench ${path.split(\"/\").pop()} (${first.model.layers} layers x ${first.model.experts} experts, top-${first.model.expertsUsed}, ${first.config.cacheSlots} cached, ${first.config.tokens} tokens, synthetic routing, peak RSS ${(Math.max(...cmp.map((x) => x.report.rss.peakBytes)) / 2 ** 20).toFixed(0)} MiB) -> ${brief}`, model: first.model.name, startedAt, finishedAt, status: \"finished\", files: [], commands: [], steps: cmp.length, previous: await lastReceiptTag(dir) });\n await appendReceipt(dir, rc);\n io.out(`\\nSigned receipt ${rc.tag}\\nVerify it with: clutor receipt verify ${rc.tag} ${dir}`);\n }\n if (!cmp) io.out(\"\\nThe native engine is not built, so cache and prefetch strategies were not compared. Build it with: clutor engine build\");\n return 0;\n } finally { cleanup?.(); }\n}\n\n/** Starts llama-server if the configuration asks for it, and returns the manager. */\nexport async function startBackendIfConfigured(config: ClutorConfig, io: Io, existing?: BackendManager): Promise<BackendManager | undefined> {\n if (config.backend.kind !== \"llama-server\") return undefined;\n const ls = config.backend.llamaServer;\n if (!ls.model) { io.err(\"backend.llamaServer.model is not set, so no model is loaded.\"); return undefined; }\n const binary = ls.binary ?? findLlamaServer();\n if (!binary) throw new ConfigError(\"llama-server was not found. Install llama.cpp (for example `brew install llama.cpp`) or set backend.llamaServer.binary.\");\n const caps = await probeLlamaServer(binary);\n const r = await fileReader(ls.model);\n let layout;\n try { layout = buildModelLayout(await parseGguf(r)); } finally { await r.close(); }\n const h = hostInfo();\n const p = planMemory(layout, { hostRamBytes: h.totalRamBytes, contextTokens: config.memory.contextTokens, kvBits: config.memory.kvBits });\n const { args, notes } = buildLlamaArgs({ modelPath: ls.model, port: ls.port, contextTokens: config.memory.contextTokens, kvBits: config.memory.kvBits, ...(ls.threads ? { threads: ls.threads } : {}), plan: p, caps, extraArgs: ls.extraArgs, ...(config.agent.prefixSnapshots ? { slotSavePath: ensureSlotDir() } : {}) });\n for (const n of notes) io.err(`note: ${n}`);\n io.err(`Loading ${ls.model} (this can take minutes for a large model)...`);\n const b = existing ?? new BackendManager(ls.port);\n await b.start(binary, args);\n io.err(\"Model ready.\");\n return b;\n}\n\nasync function serve(io: Io, args: ReturnType<typeof parseArgs>, dirArg?: string): Promise<number> {\n const { config, root } = cfgFor(args, io, dirArg);\n const port = flagInt(args, \"port\", 0, 65535);\n const folders = [...new Set([root, ...(flagString(args, \"folder\") ? [resolve(io.cwd, flagString(args, \"folder\") as string)] : [])])];\n const backend = config.backend.kind === \"llama-server\" ? new BackendManager(config.backend.llamaServer.port) : undefined;\n if (backend && !flagBool(args, \"no-start\")) await startBackendIfConfigured(config, io, backend);\n const server = createClutorServer({\n root, config: { ...config, ...(port !== undefined ? { port } : {}) }, version: version(), ...(backend ? { backend, startBackend: async () => void (await startBackendIfConfigured(config, { ...io, out: () => undefined }, backend)) } : {}), roots: folders, log: (l) => io.err(l),\n });\n const a = await server.listen();\n const base = `http://${a.host === \"::\" ? \"localhost\" : a.host}:${a.port}`;\n io.out(`Clutor ${version()} listening on ${base}`);\n io.out(` OpenAI API ${base}/v1 Ollama API ${base}`);\n io.out(` Agent, MCP ${base}/api/agent/run ${base}/api/mcp (need the token below)`);\n io.out(` Token ${server.token}`);\n io.out(` Folders ${folders.join(\", \")}`);\n io.out(` Backend ${config.backend.kind}${backend?.state === \"ready\" ? \" (loaded)\" : \"\"}`);\n await new Promise<void>((res) => { const stop = (): void => res(); process.once(\"SIGINT\", stop); process.once(\"SIGTERM\", stop); });\n await server.close();\n return 0;\n}\n\nasync function backendCmd(io: Io, args: ReturnType<typeof parseArgs>): Promise<number> {\n const { config } = cfgFor(args, io);\n const binary = config.backend.llamaServer.binary ?? findLlamaServer();\n if (!binary) { io.err(\"llama-server was not found on PATH. Install llama.cpp (for example `brew install llama.cpp`), or set backend.llamaServer.binary.\"); return 1; }\n const caps = await probeLlamaServer(binary);\n io.out(`llama-server: ${binary}`);\n io.out(`Supports: ${[\"--jinja\", \"--cache-type-k\", \"--flash-attn\", \"--mlock\", \"--no-mmap\"].map((f) => `${f} ${caps.flags.has(f) ? \"yes\" : \"no\"}`).join(\", \")}`);\n const model = flagString(args, \"model\") ?? config.backend.llamaServer.model;\n if (!model) { io.out(\"Pass --model <file.gguf> to see the command clutor would run.\"); return 0; }\n const r = await fileReader(resolve(io.cwd, model));\n let layout;\n try { layout = buildModelLayout(await parseGguf(r)); } finally { await r.close(); }\n const p = planMemory(layout, { hostRamBytes: hostInfo().totalRamBytes, contextTokens: config.memory.contextTokens, kvBits: config.memory.kvBits });\n const { args: a, notes } = buildLlamaArgs({ modelPath: resolve(io.cwd, model), port: config.backend.llamaServer.port, contextTokens: config.memory.contextTokens, kvBits: config.memory.kvBits, plan: p, caps, extraArgs: config.backend.llamaServer.extraArgs });\n io.out(`\\n${binary} ${a.map((x) => (/\\s/.test(x) ? JSON.stringify(x) : x)).join(\" \")}`);\n for (const n of notes) io.out(`note: ${n}`);\n return 0;\n}\n\n/** The conversation has to fit the model's context window, not a fixed 60,000 characters: about 2.5 characters per token leaves room for the reply. */\nfunction contextCharsFor(contextTokens: number): number { return Math.floor(contextTokens * 2.5); }\n\nasync function code(io: Io, args: ReturnType<typeof parseArgs>, task: string, session?: SessionState): Promise<number> {\n if (!task.trim()) throw new UsageError('usage: clutor code \"<what to do>\" [--dir folder]');\n const { config, root } = cfgFor(args, io);\n const dir = resolve(io.cwd, flagString(args, \"dir\") ?? \".\");\n if (!existsSync(dir)) throw new UsageError(`${dir} does not exist`);\n const backend = session ? (session.backend ??= await startBackendIfConfigured(config, io)) : await startBackendIfConfigured(config, io);\n try {\n const llm = llmFrom(config, backend);\n const project = new NodeProject(dir);\n const ws = new ShadowWorkspace(project);\n const auto = flagBool(args, \"yes\") || config.agent.autoApproveProjectCommands || session?.auto === true;\n if (auto) io.err(\"note: commands that run project code will run without asking (--yes). Only do this for projects you trust.\");\n const key = await loadOrCreateReceiptSigner(dir);\n const verifyFlag = flagString(args, \"verify\") ?? session?.verify;\n const verify = verifyFlag ?? config.agent.verifyCommand;\n const show = (e: AgentEvent): void => {\n if (e.type === \"thought\") io.out(` ${e.text.split(\"\\n\")[0]?.slice(0, 200)}`);\n else if (e.type === \"tool_call\") io.out(`> ${e.name} ${JSON.stringify(e.args).slice(0, 160)}`);\n else if (e.type === \"tool_result\") io.out(` ${e.ok ? \"ok\" : \"failed\"}: ${e.output.split(\"\\n\")[0]?.slice(0, 200)}`);\n else if (e.type === \"invalid\") io.out(` (invalid reply: ${e.error})`);\n else if (e.type === \"verify\") io.out(` verify ${!e.ran ? \"NOT RUN\" : e.ok ? \"passed\" : \"FAILED\"}${e.attempt > 0 ? ` (after ${e.attempt} retr${e.attempt === 1 ? \"y\" : \"ies\"})` : \"\"}: ${e.command}${!e.ran ? ` (${e.output.split(\"\\n\")[0]})` : \"\"}`);\n };\n const result = await runAgent({\n task, llm, ws, maxSteps: flagInt(args, \"max-steps\", 1, 200) ?? config.agent.maxSteps, contextChars: contextCharsFor(config.memory.contextTokens), ...(verify ? { verifyCommand: verify } : {}), ...(session?.notes.length ? { systemExtra: `Earlier in this session (for context only):\\n${session.notes.slice(-6).map((n) => `- ${n}`).join(\"\\n\")}` } : {}), onEvent: show,\n runCommand: scratchRunner(project, ws, { timeoutMs: config.agent.commandTimeoutSeconds * 1000 }),\n approve: async ({ command, network }) => {\n if (auto) return true;\n // The command typed after --verify is the user's own choice, so that exact command line runs (in the scratch copy) without a prompt. A verify command that only came from the config file is not pre-approved.\n if (verifyFlag !== undefined && command === verifyFlag) return true;\n if (!io.prompt) return false;\n const a = await io.prompt(`Run \\`${command}\\`${network ? \" (uses the network)\" : \"\"} in a scratch copy of the project? [y/N] `);\n return /^y(es)?$/i.test(a.trim());\n },\n receipt: { signer: key, previous: await lastReceiptTag(dir) },\n });\n if (result.receipt) await appendReceipt(dir, result.receipt);\n if (session) {\n session.usage.promptTokens += result.usage.promptTokens;\n session.usage.completionTokens += result.usage.completionTokens;\n session.notes.push(`\"${task.slice(0, 120)}\" -> ${result.status}: ${result.summary.slice(0, 200)}`);\n }\n io.out(\"\");\n io.out(`${result.status}: ${result.summary}`);\n for (const d of result.diffs) io.out(`\\n${d.patch || `${d.status} ${d.path}`}`);\n io.out(`\\n${result.diffs.length} file${result.diffs.length === 1 ? \"\" : \"s\"} changed, ${result.steps} steps, ${result.invalidReplies} invalid replies, ${result.violations} blocked attempts.`);\n if (result.verification) io.out(`Final check \\`${result.verification.command}\\`: ${!result.verification.ran ? \"NOT RUN\" : result.verification.ok ? \"passed\" : \"FAILED\"}${result.verification.retries ? ` (${result.verification.retries} self-heal ${result.verification.retries === 1 ? \"turn\" : \"turns\"})` : \"\"}`);\n if (result.diffs.length === 0) return result.status === \"finished\" ? 0 : 1;\n // With a check requested, nothing is written unless the check passed on the final state.\n if (verifyFlag !== undefined && !(result.verification?.ok === true)) {\n io.out(`Nothing was written: the check \\`${verifyFlag}\\` ${result.verification && !result.verification.ran ? \"was not run\" : \"did not pass\"}. The diff above is what the agent proposed.`);\n return 1;\n }\n let apply = flagBool(args, \"apply\");\n if (!apply && io.prompt) apply = /^y(es)?$/i.test((await io.prompt(\"Apply these changes to the folder? [y/N] \")).trim());\n if (!apply) { io.out(\"Nothing was written. Run again with --apply to write the changes.\"); return result.status === \"finished\" ? 0 : 1; }\n try {\n const r = await applyChanges(project, await ws.changeSet());\n if (session) session.lastCheckpoint = { id: r.id, dir };\n io.out(`Applied ${r.applied.length} files. Undo with: ${session ? \"/undo\" : `clutor rollback ${r.id} --dir ${dir}`}`);\n } catch (e) {\n if (e instanceof ConflictError) { io.err(`${e.message}\\nNothing was written.`); return 1; }\n throw e;\n }\n return result.status === \"finished\" ? 0 : 1;\n } finally { if (!session) await backend?.stop(); void root; }\n}\n\nasync function receipts(io: Io, args: ReturnType<typeof parseArgs>, dirArg: string | undefined, json: boolean): Promise<number> {\n const dir = resolve(io.cwd, dirArg ?? flagString(args, \"dir\") ?? \".\");\n const v = await verifyReceiptLog(dir);\n const all = await readReceipts(dir);\n const cps = await listCheckpoints(new NodeProject(dir));\n if (json) { io.out(JSON.stringify({ verification: v, receipts: all, checkpoints: cps }, null, 2)); return v.ok ? 0 : 1; }\n io.out(v.ok ? `Receipt chain intact: ${v.count} receipt${v.count === 1 ? \"\" : \"s\"}, hash chain and ECDSA signatures verified${v.keyIds.length ? ` (key id ${v.keyIds.join(\", \")})` : \"\"}.` : `Receipt chain BROKEN at entry ${v.index}: ${v.reason}`);\n if (all.length) io.out(table(all.slice(-15).map((r) => [r.finishedAt.slice(0, 19), r.status, `${r.files.length} files`, r.task.slice(0, 50)]), [\"finished\", \"status\", \"changed\", \"task\"]));\n if (cps.length) io.out(`\\nCheckpoints:\\n${table(cps.slice(0, 10).map((c) => [c.id, c.createdAt.slice(0, 19), `${c.files} files`]))}`);\n return v.ok ? 0 : 1;\n}\n\nasync function rollback(io: Io, args: ReturnType<typeof parseArgs>, id: string | undefined): Promise<number> {\n if (!id) throw new UsageError(\"usage: clutor rollback <checkpoint id> [--dir folder]\");\n const project = new NodeProject(resolve(io.cwd, flagString(args, \"dir\") ?? \".\"));\n try {\n const r = await rollbackCheckpoint(project, id, { force: flagBool(args, \"force\") });\n io.out(`Restored ${r.length} files.`);\n return 0;\n } catch (e) {\n if (e instanceof ConflictError) { io.err(`${e.message}\\nUse --force to restore anyway.`); return 1; }\n throw e;\n }\n}\n\nasync function doctor(io: Io, args: ReturnType<typeof parseArgs>, dirArg: string | undefined, json: boolean): Promise<number> {\n const h = hostInfo();\n const checks: Array<{ level: \"ok\" | \"info\" | \"warn\" | \"fail\"; text: string }> = [];\n const add = (level: \"ok\" | \"info\" | \"warn\" | \"fail\", text: string): void => void checks.push({ level, text });\n add(Number(h.nodeVersion.split(\".\")[0]) >= 20 ? \"ok\" : \"fail\", `Node.js ${h.nodeVersion}`);\n add(\"ok\", `${h.platformName} ${h.arch}, ${h.cpuModel}, ${h.logicalCores} cores, ${fmtGiB(h.totalRamBytes)} RAM`);\n if (h.totalRamBytes < 8 * GiB) add(\"warn\", \"Under 8 GiB of RAM: only small models will run comfortably, and large mixture-of-experts models will be very slow.\");\n let cfg: ClutorConfig | undefined;\n let root = resolve(io.cwd, dirArg ?? \".\");\n try { const l = cfgFor(args, io, dirArg); cfg = l.config; root = l.root; add(l.path ? \"ok\" : \"info\", l.path ? `Configuration ${l.path}` : `No ${CONFIG_FILE}: using defaults (run clutor init)`); } catch (e) { add(\"fail\", e instanceof Error ? e.message : String(e)); }\n const ls = findLlamaServer(process.env, cfg?.backend.llamaServer.binary ? [dirname(cfg.backend.llamaServer.binary)] : []);\n add(ls ? \"ok\" : \"warn\", ls ? `llama-server at ${ls}` : \"llama-server not found (install llama.cpp to run models; the planner, simulator and agent tools still work)\");\n const eng = findEngine();\n add(eng ? \"ok\" : \"info\", eng ? `Native engine at ${eng}` : \"Native engine not built (clutor engine build): cache and prefetch strategies cannot be measured without it\");\n if (cfg) {\n const local = await listLocalModels(resolve(root, cfg.models));\n add(local.length ? \"ok\" : \"info\", `${local.length} .gguf file${local.length === 1 ? \"\" : \"s\"} in ${resolve(root, cfg.models)}`);\n if (cfg.backend.kind === \"none\") add(\"info\", \"No model backend configured: chat and the agent need one (backend.kind in the configuration).\");\n if (cfg.backend.kind === \"openai\" && !cfg.backend.baseUrl) add(\"fail\", \"backend.kind is openai but backend.baseUrl is missing\");\n if (cfg.backend.kind === \"llama-server\" && !cfg.backend.llamaServer.model) add(\"fail\", \"backend.kind is llama-server but backend.llamaServer.model is missing\");\n if (cfg.agent.autoApproveProjectCommands) add(\"warn\", \"agent.autoApproveProjectCommands is on: commands that run project code run without asking.\");\n if (cfg.host !== \"127.0.0.1\" && cfg.host !== \"localhost\") add(\"warn\", `The server listens on ${cfg.host}: anyone who can reach it and learns the token can have the agent edit files.`);\n }\n if (json) { io.out(JSON.stringify(checks, null, 2)); return checks.some((c) => c.level === \"fail\") ? 1 : 0; }\n const tag = { ok: \"ok \", info: \"info\", warn: \"warn\", fail: \"FAIL\" } as const;\n for (const c of checks) (c.level === \"fail\" ? io.err : io.out)(`${tag[c.level]} ${c.text}`);\n return checks.some((c) => c.level === \"fail\") ? 1 : 0;\n}\n\nexport { pct, tps };\n\nfunction modelEndpoint(config: ClutorConfig, backend?: BackendManager): { baseUrl: string; model: string; apiKey?: string } {\n const b = config.backend;\n if (b.kind === \"openai\" && b.baseUrl) return { baseUrl: b.baseUrl, model: b.model ?? \"default\", ...(b.apiKeyEnv && process.env[b.apiKeyEnv] ? { apiKey: process.env[b.apiKeyEnv] as string } : {}) };\n if (backend) return { baseUrl: backend.baseUrl, model: \"local\" };\n throw new ConfigError('no model is configured. In clutor.config.json set backend.kind to \"openai\" (with baseUrl) or \"llama-server\" (with llamaServer.model).');\n}\nfunction llmFrom(config: ClutorConfig, backend?: BackendManager): LlmClient {\n const e = modelEndpoint(config, backend);\n return agentLlm(config, { ...e, local: config.backend.kind === \"llama-server\" });\n}\n\nasync function chat(io: Io, args: ReturnType<typeof parseArgs>): Promise<number> {\n const { config } = cfgFor(args, io);\n const backend = await startBackendIfConfigured(config, io);\n try {\n const llm = new OpenAiCompatibleClient({ ...modelEndpoint(config, backend), toolMode: \"json\" });\n const history: Array<{ role: \"system\" | \"user\" | \"assistant\"; content: string }> = [];\n const system = flagString(args, \"system\");\n if (system) history.push({ role: \"system\", content: system });\n const turn = async (text: string): Promise<void> => {\n history.push({ role: \"user\", content: text });\n const t0 = Date.now();\n const r = await llm.chat(history);\n const reply = r.content ?? \"\";\n history.push({ role: \"assistant\", content: reply });\n io.out(reply);\n const secs = (Date.now() - t0) / 1000;\n const gen = (r as { usage?: { completionTokens?: number } }).usage?.completionTokens;\n io.err(`[${secs.toFixed(1)} s${gen ? `, ${gen} tokens, ${(gen / secs).toFixed(2)} tok/s measured end to end` : \"\"}]`);\n };\n const one = flagString(args, \"prompt\");\n if (one !== undefined) { await turn(one); return 0; }\n if (!io.prompt) throw new UsageError(\"chat needs a terminal, or --prompt \\\"<text>\\\"\");\n io.out(\"clutor chat. /help lists the commands, /exit leaves.\");\n for (;;) {\n const line = (await io.prompt(\"clt> \")).trim();\n if (!line) continue;\n if (line === \"/exit\" || line === \"/quit\") return 0;\n if (line === \"/layers\" || line === \"/cache\") { try { await engineSlashCommand(io, config, line.slice(1) as \"layers\" | \"cache\"); } catch (e) { io.err(e instanceof Error ? e.message : String(e)); } continue; }\n if (line === \"/help\") { io.out(\"/layers where the model file's bytes are, per layer\\n/cache a streaming pass over the model file: cache, prefetch and disk waits (native engine)\\n/reset clear the conversation\\n/exit leave\"); continue; }\n if (line === \"/reset\") { history.length = system ? 1 : 0; io.out(\"(conversation cleared)\"); continue; }\n try { await turn(line); } catch (e) { io.err(e instanceof Error ? e.message : String(e)); }\n }\n } finally { await backend?.stop(); }\n}\n\n/** One forward pass, one token: the model's probability for each choice's letter. Not calibrated; it is the model's own first-token distribution. */\nasync function decide(io: Io, args: ReturnType<typeof parseArgs>, json: boolean): Promise<number> {\n const prompt = flagString(args, \"prompt\");\n const choices = (flagString(args, \"choices\") ?? \"\").split(\",\").map((c) => c.trim()).filter(Boolean);\n if (!prompt || choices.length < 2 || choices.length > 26) throw new UsageError('usage: clutor decide --prompt \"<text>\" --choices \"approve,reject,escalate\" (2 to 26 choices)');\n const { config } = cfgFor(args, io);\n const backend = await startBackendIfConfigured(config, io);\n try {\n const out = await runDecide(modelEndpoint(config, backend), prompt, choices);\n if (json) io.out(JSON.stringify(out, null, 2));\n else {\n io.out(`Decision: ${out.choice}`);\n choices.forEach((c) => io.out(` ${c.padEnd(Math.max(...choices.map((x) => x.length)))} ${\"#\".repeat(Math.round((out.probabilities[c] as number) * 30)).padEnd(30)} ${pct(out.probabilities[c] as number)}`));\n io.out(`(the model put ${pct(out.probabilityMassOnChoices)} of its first-token probability on these letters; not a calibrated confidence; ${out.latencyMs} ms)`);\n }\n return 0;\n } finally { await backend?.stop(); }\n}\n\nasync function status(io: Io, args: ReturnType<typeof parseArgs>, dirArg: string | undefined, json: boolean): Promise<number> {\n const h = hostInfo();\n const { config, root, path } = cfgFor(args, io, dirArg);\n const local = await listLocalModels(resolve(root, config.models));\n const ls = findLlamaServer(process.env, config.backend.llamaServer.binary ? [dirname(config.backend.llamaServer.binary)] : []);\n const v = await verifyReceiptLog(root);\n const s = { host: `${h.platformName} ${h.arch}, ${h.cpuModel}, ${h.logicalCores} cores`, ramBytes: h.totalRamBytes, configuration: path ?? null, backend: config.backend.kind, llamaServer: ls ?? null, models: local.length, receipts: v };\n if (json) { io.out(JSON.stringify(s, null, 2)); return 0; }\n io.out(`Host ${s.host}, ${fmtGiB(h.totalRamBytes)} RAM`);\n io.out(`Config ${path ?? \"none (defaults)\"}`);\n io.out(`Backend ${config.backend.kind}${ls ? `, llama-server at ${ls}` : \", llama-server not found\"}`);\n io.out(`Models ${local.length} .gguf file${local.length === 1 ? \"\" : \"s\"} in ${resolve(root, config.models)}`);\n io.out(`Receipts ${v.ok ? `intact (${v.count})` : `BROKEN at entry ${v.index}`}`);\n return 0;\n}\n\nasync function receiptVerify(io: Io, args: ReturnType<typeof parseArgs>, sub: string | undefined, target: string | undefined, dirArg: string | undefined): Promise<number> {\n if (sub === \"key\") {\n const dir = resolve(io.cwd, target ?? flagString(args, \"dir\") ?? \".\");\n const signer = await loadOrCreateReceiptSigner(dir);\n io.out(`Key id ${await keyThumbprint(signer.publicJwk)}`);\n io.out(`Public key (share this; keep ${join(\".clutor\", \"keys\")} private):\\n${JSON.stringify(signer.publicJwk, null, 2)}`);\n return 0;\n }\n if (sub !== \"verify\" || !target) throw new UsageError(\"usage: clutor receipt verify <clt_token | receipts.jsonl> [dir] [--key-id <id> | --pubkey <file.json>] or clutor receipt key [dir]\");\n // Trust: a key id you recorded earlier, or a public key file. Without either, the log is only checked for internal consistency.\n let trusted: string[] | undefined;\n const keyId = flagString(args, \"key-id\");\n const pubkey = flagString(args, \"pubkey\");\n if (keyId) trusted = [keyId];\n if (pubkey) trusted = [...(trusted ?? []), await keyThumbprint(JSON.parse(readFileSync(resolve(io.cwd, pubkey), \"utf8\")) as PublicJwk)];\n const isToken = target.startsWith(\"clt_\");\n let all: Receipt[];\n if (isToken) all = await readReceipts(resolve(io.cwd, dirArg ?? flagString(args, \"dir\") ?? \".\"));\n else all = readFileSync(resolve(io.cwd, target), \"utf8\").split(\"\\n\").filter(Boolean).map((l) => JSON.parse(l) as Receipt);\n const v = await verifyReceiptChain(all, trusted ? { trustedKeyIds: trusted } : {});\n if (!v.ok) { io.err(`INVALID at entry ${v.index}: ${v.reason}`); return 1; }\n const found = isToken ? all.find((r) => r.tag === target) : undefined;\n if (isToken && !found) { io.err(\"That receipt is not in this log.\"); return 1; }\n io.out(isToken && found ? `Valid: ${found.status} \"${found.task.slice(0, 60)}\" at ${found.finishedAt}, ${found.files.length} files, signed by ${found.keyId}.` : `Valid: ${all.length} receipt${all.length === 1 ? \"\" : \"s\"}, chain and ECDSA signatures check out.`);\n if (isToken && found) { const { tag, ...body } = found; io.out(`Decoded payload (this is exactly what the signature covers):\\n${JSON.stringify(body, null, 2)}\\nSignature tag: ${tag}`); }\n io.out(`Signed by key${v.keyIds.length === 1 ? \"\" : \"s\"}: ${v.keyIds.join(\", \") || \"none\"}`);\n io.out(trusted ? \"The signing key is one you trust.\" : \"No --key-id or --pubkey given: this shows the log is consistent and unedited, not whose key signed it.\");\n return 0;\n}\n\nasync function pull(io: Io, args: ReturnType<typeof parseArgs>, id: string | undefined): Promise<number> {\n const { config, root } = cfgFor(args, io);\n const dir = resolve(root, config.models);\n if (!id) {\n io.out(table(DOWNLOADS.map((d) => [d.id, fmtBytes(d.bytes), d.repo, d.note]), [\"id\", \"size\", \"from\", \"what it is\"]));\n io.out(\"\\nDownload one with: clutor pull <id>\");\n return 0;\n }\n const d = DOWNLOADS.find((x) => x.id === id);\n if (!d) throw new UsageError(`unknown download \"${id}\"; run clutor pull to see the list`);\n const dest = join(dir, d.file);\n if (existsSync(dest)) { io.out(`${dest} is already there.`); return 0; }\n if (!flagBool(args, \"yes\")) {\n if (!io.prompt) throw new UsageError(`this downloads ${fmtBytes(d.bytes)} from huggingface.co; run again with --yes to confirm`);\n if (!/^y(es)?$/i.test((await io.prompt(`Download ${d.file} (${fmtBytes(d.bytes)}) from huggingface.co to ${dir}? [y/N] `)).trim())) { io.out(\"Nothing downloaded.\"); return 0; }\n }\n let last = 0;\n const bytes = await downloadFile(downloadUrl(d), dest, { expectedBytes: d.bytes, onProgress: (done, total) => { const p = Math.floor((done / total) * 10); if (p > last) { last = p; io.err(` ${p * 10}%`); } } });\n io.out(`Saved ${dest} (${fmtBytes(bytes)}).`);\n return 0;\n}\n\n/** The same synthetic routing trace and the same cache memory, run under three strategies. */\nfunction shiftFlag(args: ReturnType<typeof parseArgs>): { shift?: { at: number; len: number } } {\n const v = flagString(args, \"shift\");\n if (v === undefined) return {};\n const m = /^(\\d+),(\\d+)$/.exec(v);\n if (!m || Number(m[2]) < 1) throw new UsageError(\"--shift wants AT,LEN, for example 80,10: measured tokens AT..AT+LEN-1 are uniform scan noise\");\n return { shift: { at: Number(m[1]), len: Number(m[2]) } };\n}\n\nfunction computeFlag(args: ReturnType<typeof parseArgs>): StreamOptions[\"compute\"] | undefined {\n const c = flagString(args, \"compute\");\n if (c !== undefined && c !== \"kernel\" && c !== \"checksum\") throw new UsageError(\"--compute must be kernel or checksum\");\n return c;\n}\n\nasync function compareStrategies(bin: string, file: string, cacheMb: number, tokens: number, dense?: StreamOptions[\"dense\"], compute?: StreamOptions[\"compute\"]): Promise<Array<{ name: string; report: StreamReport }>> {\n const common: StreamOptions = { dense: dense ?? \"auto\", ...(compute ? { compute } : {}), tokens, warmup: Math.min(50, Math.floor(tokens / 5)), cacheMb, seed: 1, noOsCache: true };\n const runs: Array<[string, StreamOptions]> = [\n [\"LRU, no prefetch\", { ...common, policy: \"lru\", prefetch: false, ioThreads: 1 }],\n [\"adaptive cache + prefetch\", { ...common, policy: \"adaptive\", prefetch: true, ioThreads: 2 }],\n [\"+ smart-route (2,12,0.015)\", { ...common, policy: \"adaptive\", prefetch: true, ioThreads: 2, smart: \"2,12,0.015\" }],\n ];\n const out: Array<{ name: string; report: StreamReport }> = [];\n for (const [name, o] of runs) out.push({ name, report: await engineStream(bin, file, o) });\n return out;\n}\n\nfunction formatComparison(c: Array<{ name: string; report: StreamReport }>): string {\n const r0 = c[0]?.report;\n if (!r0) return \"\";\n const gb = (x: StreamReport): string => `${x.totals.gbPerToken.toFixed(3)}`;\n const rows: string[][] = [\n [\"hit rate\", ...c.map((x) => pct(x.report.totals.hitRate))],\n [\"misses per token\", ...c.map((x) => x.report.totals.missesPerToken.toFixed(1))],\n [\"GB read per token\", ...c.map((x) => gb(x.report))],\n [\"time waiting for disk (s)\", ...c.map((x) => x.report.totals.ioWaitSeconds.toFixed(2))],\n [\"wall time (s)\", ...c.map((x) => x.report.totals.wallSeconds.toFixed(2))],\n [\"passes per second\", ...c.map((x) => x.report.totals.tokensPerSecond.toFixed(1))],\n [\"scan-pollution rejects (admission filter)\", ...c.map((x) => String(x.report.totals.admitRejects))],\n [\"prefetch issued / late / unused\", ...c.map((x) => `${x.report.totals.prefetchIssued} / ${x.report.totals.prefetchLate} / ${x.report.totals.prefetchWasted}`)],\n [\"prefetch hit / late (hits served by prefetch)\", ...c.map((x) => `${x.report.totals.stageHits} / ${x.report.totals.prefetchLate}`)],\n [\"lookahead overlap (read time hidden)\", ...c.map((x) => pct(x.report.totals.overlap))],\n [\"disk wait / compute time (s)\", ...c.map((x) => `${x.report.totals.ioWaitSeconds.toFixed(2)} / ${x.report.totals.computeSeconds.toFixed(2)}`)],\n [\"substitutions per token\", ...c.map((x) => (x.report.totals.substituted / Math.max(1, x.report.config.tokens)).toFixed(2))],\n [\"peak RSS of the engine (MiB, ru_maxrss)\", ...c.map((x) => (x.report.rss.peakBytes / 2 ** 20).toFixed(0))],\n [\"substitutions (largest probability moved)\", ...c.map((x) => `${x.report.totals.substituted} (${x.report.totals.maxDeltaP.toFixed(4)})`)],\n ];\n return [\n `MEASURED by the native engine on this machine: ${r0.model.name}, ${r0.config.cacheSlots} experts cached (${((r0.config.cacheSlots * r0.model.expertBytes) / 2 ** 20).toFixed(0)} MiB), ${r0.config.tokens} tokens after ${r0.config.warmup} warm-up; dense weights ${r0.config.denseMode === \"resident\" ? \"resident\" : \"re-read every token\"}.`,\n `Disk reads, waits and cache behaviour are real. The routing is SYNTHETIC (a skewed random router with drifting topics), so hit rates here are not what a real model would see. ${r0.config.computeMode === \"kernel\" ? `The compute is a real Q4_0 x Q8_0 kernel (${r0.config.computeKernel}) run over every loaded byte, read as Q4_0 whatever its true type: genuine CPU work, not this model's maths.` : \"The compute is a checksum, so this run measures I/O alone.\"}`,\n table(rows, [\"\", ...c.map((x) => x.name)]),\n ].join(\"\\n\");\n}\n\nasync function streamCmd(io: Io, args: ReturnType<typeof parseArgs>, file: string | undefined, json: boolean): Promise<number> {\n if (!file) throw new UsageError(\"usage: clutor stream <model.gguf> [--tokens N] [--cache-mb N] [--policy lru|wtinylfu|adaptive] [--smart J,M,TAU|off] [--prefetch on|off]\");\n const bin = findEngine();\n if (!bin) throw new UsageError(\"the native engine is not built: run `clutor engine build` (needs a C compiler)\");\n const num = (n: string, lo: number, hi: number): number | undefined => flagInt(args, n, lo, hi);\n const pol = flagString(args, \"policy\");\n if (pol && ![\"lru\", \"wtinylfu\", \"adaptive\"].includes(pol)) throw new UsageError(\"--policy must be lru, wtinylfu or adaptive\");\n const dn = flagString(args, \"dense\");\n if (dn && ![\"auto\", \"resident\", \"ring\"].includes(dn)) throw new UsageError(\"--dense must be auto, resident or ring\");\n const pf = flagString(args, \"prefetch\");\n if (pf && ![\"on\", \"off\"].includes(pf)) throw new UsageError(\"--prefetch must be on or off\");\n const o: StreamOptions = {\n ...(num(\"tokens\", 1, 1_000_000) !== undefined ? { tokens: num(\"tokens\", 1, 1_000_000) as number } : {}),\n ...(num(\"warmup\", 0, 1_000_000) !== undefined ? { warmup: num(\"warmup\", 0, 1_000_000) as number } : {}),\n ...(num(\"cache-mb\", 1, 10_000_000) !== undefined ? { cacheMb: num(\"cache-mb\", 1, 10_000_000) as number } : {}),\n ...(num(\"io-threads\", 1, 16) !== undefined ? { ioThreads: num(\"io-threads\", 1, 16) as number } : {}),\n ...(num(\"seed\", 0, 2 ** 31) !== undefined ? { seed: num(\"seed\", 0, 2 ** 31) as number } : {}),\n ...(pol ? { policy: pol as StreamOptions[\"policy\"] } : {}),\n ...(flagString(args, \"smart\") ? { smart: flagString(args, \"smart\") as string } : {}),\n ...(pf ? { prefetch: pf === \"on\" } : {}),\n ...(dn ? { dense: dn as StreamOptions[\"dense\"] } : {}),\n ...(computeFlag(args) ? { compute: computeFlag(args) as StreamOptions[\"compute\"] } : {}),\n ...(flagBool(args, \"no-os-cache\") ? { noOsCache: true } : {}),\n ...(num(\"window\", 1, 100_000) !== undefined ? { window: num(\"window\", 1, 100_000) as number } : {}),\n ...shiftFlag(args),\n };\n const path = resolve(io.cwd, file);\n if (!existsSync(path)) throw new UsageError(`${path} does not exist`);\n const r = await engineStream(bin, path, o);\n if (json) { io.out(JSON.stringify(r, null, 2)); return 0; }\n io.out(describeStream(r));\n return 0;\n}\n\nfunction describeStream(r: StreamReport): string {\n const t = r.totals;\n const lines = [\n `${r.model.name} (${r.model.arch}): ${r.model.layers} layers, ${r.model.experts} experts (${r.model.expertsUsed} used), ${(r.model.expertBytes / 2 ** 20).toFixed(2)} MiB each`,\n `policy ${r.config.policy}, ${r.config.cacheSlots} cached + ${r.config.stageSlots} staged experts, smart-route ${r.config.smartRoute ? `on (J=${r.config.J}, M=${r.config.M}, tau=${r.config.tau})` : \"off\"}, prefetch ${r.config.prefetch ? \"on\" : \"off\"}, dense weights ${r.config.denseMode === \"resident\" ? `resident (${(r.config.densePreloadBytes / 2 ** 20).toFixed(0)} MiB read once)` : \"re-read every token\"}`,\n `MEASURED ${((t.demandBytes + t.prefetchBytes + t.denseBytes) / 1e9).toFixed(2)} GB read; waited ${t.ioWaitSeconds.toFixed(2)} s of ${t.wallSeconds.toFixed(2)} s; ${pct(t.overlap)} of read time overlapped with other work`,\n `MEASURED cache ${pct(t.hitRate)} hits (${t.stageHits} served by prefetch), ${t.missesPerToken.toFixed(1)} misses per token, ${t.admitRejects} admission rejects`,\n `MEASURED prefetch ${t.prefetchIssued} issued, ${t.prefetchLate} late, ${t.prefetchWasted} never used`,\n ];\n if (r.config.smartRoute) lines.push(`MEASURED smart-route ${t.substituted} substitutions; the largest probability moved was ${t.maxDeltaP.toFixed(4)} (limit ${r.config.tau})`);\n lines.push(`MEASURED peak resident memory of the engine process (ru_maxrss): ${(r.rss.peakBytes / 2 ** 20).toFixed(1)} MiB; COMPUTED from the buffers and tables it allocates: ${(r.rss.predictedBytes / 2 ** 20).toFixed(1)} MiB (${(r.rss.startBytes / 2 ** 20).toFixed(1)} MiB of that was there before the run)`);\n if (r.windows.length) {\n const note = r.scenario.shiftLen > 0 ? `; tokens ${r.scenario.shiftAt + 1}-${r.scenario.shiftAt + r.scenario.shiftLen} are uniform scan noise, the rest one tight topic` : \"\";\n lines.push(`MEASURED hit rate and peak RSS per window of tokens${note}:\\n${table(r.windows.map((w, i) => [`${i ? r.windows[i - 1]!.tokEnd + 1 : 1}-${w.tokEnd}`, pct(w.accesses ? w.hits / w.accesses : 0), `${(w.peakRssBytes / 2 ** 20).toFixed(0)} MiB`]), [\"tokens\", \"hit rate\", \"peak RSS\"])}`);\n }\n lines.push(`${t.tokensPerSecond.toFixed(1)} passes per second over SYNTHETIC routing; the compute is ${r.config.computeMode === \"kernel\" ? `a Q4_0 x Q8_0 kernel (${r.config.computeKernel}) over the loaded bytes (${t.computeSeconds.toFixed(2)} s in total), not this model's maths` : \"a checksum\"}: this is not model tokens per second.`);\n return lines.join(\"\\n\");\n}\n\nasync function engineCmd(io: Io, sub: string | undefined): Promise<number> {\n if (sub === \"where\") {\n const bin = findEngine();\n io.out(bin ?? \"not built (run: clutor engine build)\");\n return bin ? 0 : 1;\n }\n if (sub === \"build\") {\n io.err(\"Compiling the native engine...\");\n try { io.out(`Built ${await buildEngine()}`); return 0; } catch (e) { if (e instanceof EngineError) { io.err(e.message); return 1; } throw e; }\n }\n throw new UsageError(\"usage: clutor engine build | where\");\n}\n\n/** `/layers` and `/cache` in the chat REPL. They describe the model FILE and a streaming pass over it; the chat itself runs in llama-server. */\nasync function engineSlashCommand(io: Io, config: ClutorConfig, what: \"layers\" | \"cache\"): Promise<void> {\n const file = config.backend.llamaServer.model;\n const bin = findEngine();\n if (!file) { io.out(\"No model file is configured (backend.llamaServer.model), so there is nothing to describe.\"); return; }\n if (!bin) { io.out(\"The native engine is not built: run `clutor engine build`.\"); return; }\n if (what === \"layers\") {\n const info = await engineInfo(bin, file);\n io.out(`${info.name} (${info.arch}): ${info.layers} layers, ${info.experts} experts (${info.expertsUsed} used)`);\n const rows = info.layerTable.map((l, i) => [String(i), `${(l.denseBytes / 2 ** 20).toFixed(1)} MiB`, `${(l.expertBytes / 2 ** 20).toFixed(2)} MiB`, `${(l.routerBytes / 2 ** 10).toFixed(0)} KiB`]);\n io.out(table(rows.length > 24 ? [...rows.slice(0, 12), [\"...\", \"\", \"\", \"\"], ...rows.slice(-6)] : rows, [\"layer\", \"dense (read every token)\", \"one expert\", \"router (resident)\"]));\n return;\n }\n io.out(\"Running a short streaming pass over this model's file (synthetic routing; the chat itself is served by llama-server, which reports no cache data)...\");\n const r = await engineStream(bin, file, { tokens: 30, warmup: 5, cacheMb: 256, policy: \"adaptive\", prefetch: true, ioThreads: 2, noOsCache: true });\n io.out(describeStream(r));\n const worst = [...r.layers].filter((l) => l.accesses > 0).sort((a, b) => b.ioWaitSeconds - a.ioWaitSeconds).slice(0, 5);\n io.out(`Layers that waited longest: ${worst.map((l) => `${l.layer} (${l.ioWaitSeconds.toFixed(2)} s, ${pct(l.hits / l.accesses)} hits)`).join(\", \")}`);\n}\n"],"mappings":"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","names":["status","createHash","resolve","code","join","homedir","join","join","homedir","CATALOG","QUANTS","CATALOG","QUANTS","code","stat","join","appendReceipt","lastReceiptTag","loadOrCreateReceiptSigner","resolve","receipts","stat","join","randomBytes","Readable","CATALOG","GiB","buildModelLayout","parseGguf","QUANTS","ShadowWorkspace","approximateLayout","evaluateGates","planMemory","NodeProject","hostInfo","ConflictError","fileReader","verifyReceiptLog","status","randomBytes","hostInfo","planMemory","GiB","CATALOG","QUANTS","m","plan","evaluateGates","approximateLayout","Readable","rm","tmpdir","fileReader","buildModelLayout","parseGguf","NodeProject","ShadowWorkspace","ConflictError","verifyReceiptLog","resolve","spawn","accessSync","constants","homedir","delimiter","join","resolve","code","mkdirSync","dirname","join","resolve","fileURLToPath","BASELINE","CATALOG","CLUTOR_DEFAULTS","GiB","QUANTS","ShadowWorkspace","OpenAiCompatibleClient","buildModelLayout","evaluateGates","expertSizeBytes","fmtGiB","generateRoutingTrace","parseGguf","planMemory","runAgent","simulateStreaming","approximateLayout","sealReceipt","NodeProject","applyChanges","fileReader","hostInfo","lastReceiptTag","listCheckpoints","loadOrCreateReceiptSigner","measureExpertReads","appendReceipt","readReceipts","rollbackCheckpoint","scratchRunner","verifyReceiptLog","writeSyntheticGguf","ConflictError","dirname","fileURLToPath","join","CATALOG","resolve","mkdirSync","hostInfo","fmtGiB","fileReader","parseGguf","buildModelLayout","GiB","planMemory","evaluateGates","c","QUANTS","approximateLayout","generateRoutingTrace","simulateStreaming","BASELINE","CLUTOR_DEFAULTS","expertSizeBytes","writeSyntheticGguf","measureExpertReads","loadOrCreateReceiptSigner","sealReceipt","lastReceiptTag","appendReceipt","NodeProject","ShadowWorkspace","runAgent","scratchRunner","applyChanges","ConflictError","verifyReceiptLog","readReceipts","listCheckpoints","rollbackCheckpoint","OpenAiCompatibleClient","hostInfo","resolve","dirname","verifyReceiptLog","fmtGiB","loadOrCreateReceiptSigner","join","readReceipts","d"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/repl.ts"],"sourcesContent":["import { TOOLS } from \"@clutor/core\";\nimport { loadConfig, ConfigError, type ClutorConfig } from \"./config\";\nimport { table } from \"./format\";\nimport type { Io, SessionState } from \"./cli\";\n\n/**\n * The interactive session that `clutor` opens when it is started with no command in a terminal. Text you type is a task for the coding\n * agent (its changes are held aside until you approve them); a line starting with `/` is a command. Most commands are the ordinary\n * clutor commands, so they behave exactly as they do outside the session.\n */\n\ntype Run = (argv: string[], session: SessionState) => Promise<number>;\ntype EngineView = (config: ClutorConfig, what: \"layers\" | \"cache\") => Promise<void>;\n\ninterface Slash { usage: string; help: string }\n\n/** Commands that are forwarded unchanged to the normal CLI. */\nconst FORWARD: Record<string, Slash> = {\n status: { usage: \"/status\", help: \"machine, model backend, memory plan, receipts\" },\n doctor: { usage: \"/doctor\", help: \"check this machine and the configuration\" },\n models: { usage: \"/models\", help: \"model catalog and the .gguf files in your models folder\" },\n plan: { usage: \"/plan <model> [--ram GiB]\", help: \"will it fit, where the memory goes, how fast it could possibly run\" },\n simulate: { usage: \"/simulate <model> [--cache GiB]\", help: \"replay a routing trace through the expert cache (synthetic)\" },\n inspect: { usage: \"/inspect <file.gguf>\", help: \"read a model file's header\" },\n bench: { usage: \"/bench [--file model.gguf]\", help: \"measure real disk reads; with the engine, compare cache strategies\" },\n stream: { usage: \"/stream <model.gguf>\", help: \"stream a model's experts through the native engine (synthetic routing)\" },\n pull: { usage: \"/pull [id]\", help: \"list or download a small test model\" },\n init: { usage: \"/init\", help: \"create clutor.config.json and a models folder here\" },\n backend: { usage: \"/backend\", help: \"show how llama-server would be started\" },\n ledger: { usage: \"/ledger\", help: \"verify the receipt log and list recent tasks and checkpoints\" },\n decide: { usage: '/decide --prompt \"<text>\" --choices \"a,b\"', help: \"one forward pass: probability of each choice\" },\n};\n\nconst OWN: Record<string, Slash> = {\n help: { usage: \"/help\", help: \"this list\" },\n model: { usage: \"/model\", help: \"which model this session talks to\" },\n verify: { usage: \"/verify [command|off]\", help: \"run this check after every task and only offer changes that pass it\" },\n yes: { usage: \"/yes\", help: \"toggle: run project commands without asking (only for projects you trust)\" },\n undo: { usage: \"/undo\", help: \"restore the files changed by the last applied task\" },\n tools: { usage: \"/tools\", help: \"what the agent can do\" },\n cost: { usage: \"/cost\", help: \"tokens used this session, as reported by the model server\" },\n history: { usage: \"/history\", help: \"tasks done in this session\" },\n clear: { usage: \"/clear\", help: \"forget this session's task history\" },\n layers: { usage: \"/layers\", help: \"where the model file's bytes are, per layer (native engine)\" },\n cache: { usage: \"/cache\", help: \"a streaming pass over the model file: cache, prefetch, disk waits\" },\n exit: { usage: \"/exit\", help: \"leave (also /quit, Ctrl-D)\" },\n};\n\n/** Splits a line into words, honouring single and double quotes. */\nexport function splitWords(line: string): string[] {\n const out: string[] = [];\n let cur = \"\", quote: string | undefined, has = false;\n for (const ch of line) {\n if (quote) { if (ch === quote) quote = undefined; else cur += ch; }\n else if (ch === '\"' || ch === \"'\") { quote = ch; has = true; }\n else if (/\\s/.test(ch)) { if (cur || has) out.push(cur); cur = \"\"; has = false; }\n else cur += ch;\n }\n if (cur || has) out.push(cur);\n return out;\n}\n\nfunction helpText(): string {\n const rows = [...Object.values(OWN), ...Object.values(FORWARD)].map((c) => [c.usage, c.help]);\n return `Type a task in plain words and the agent works on this folder. Its changes are held aside; you see the diff and approve before anything is written.\\n\\n${table(rows)}`;\n}\n\nexport async function runRepl(io: Io, run: Run, engine: EngineView): Promise<number> {\n const ask = io.prompt as NonNullable<Io[\"prompt\"]>;\n const session: SessionState = { auto: false, notes: [], usage: { promptTokens: 0, completionTokens: 0 } };\n const load = (): ClutorConfig | undefined => {\n try { return loadConfig(io.cwd).config; } catch (e) { io.err(e instanceof ConfigError || e instanceof Error ? e.message : String(e)); return undefined; }\n };\n const cfg = load();\n const model = (c: ClutorConfig | undefined): string => !c ? \"not configured\" : c.backend.kind === \"openai\" ? `${c.backend.model ?? \"default\"} at ${c.backend.baseUrl}` : c.backend.llamaServer.model ?? \"not configured (set backend.llamaServer.model)\";\n io.out(`clutor interactive session\\n folder ${io.cwd}\\n model ${model(cfg)}\\n Type a task, or /help for commands. Nothing is written to your files without your approval.`);\n\n try {\n for (;;) {\n const line = (await ask(\"clt> \")).trim();\n if (!line) continue;\n if (!line.startsWith(\"/\")) { await guarded(io, () => run([\"code\", line, \"--dir\", io.cwd], session)); continue; }\n\n const [word = \"\", ...rest] = splitWords(line.slice(1));\n const name = word.toLowerCase();\n if (name === \"exit\" || name === \"quit\") return 0;\n if (name === \"help\" || name === \"?\") { io.out(helpText()); continue; }\n if (name === \"model\") { io.out(`model: ${model(load())}${session.backend ? \" (running)\" : \"\"}\\nverify: ${session.verify ?? \"none\"} auto-approve: ${session.auto ? \"on\" : \"off\"}`); continue; }\n if (name === \"verify\") {\n const v = rest.join(\" \").trim();\n if (!v) io.out(session.verify ? `verify: ${session.verify}` : \"verify: none. Set one with /verify npm test\");\n else if (v === \"off\") { delete session.verify; io.out(\"verify: off\"); }\n else { session.verify = v; io.out(`verify: ${v}. It runs in a scratch copy after each task; changes are only offered when it passes.`); }\n continue;\n }\n if (name === \"yes\") { session.auto = !session.auto; io.out(session.auto ? \"auto-approve ON: commands from the agent run without asking.\" : \"auto-approve off.\"); continue; }\n if (name === \"undo\") {\n if (!session.lastCheckpoint) { io.out(\"Nothing to undo in this session.\"); continue; }\n const { id, dir } = session.lastCheckpoint;\n if (await guarded(io, () => run([\"rollback\", id, \"--dir\", dir], session)) === 0) delete session.lastCheckpoint;\n continue;\n }\n if (name === \"tools\") { io.out(table(TOOLS.map((t) => [t.name, t.description.split(\". \")[0] ?? \"\"]))); continue; }\n if (name === \"cost\") {\n const u = session.usage;\n io.out(`${u.promptTokens} prompt + ${u.completionTokens} generated tokens this session (reported by the model server; local models cost no money).`);\n continue;\n }\n if (name === \"history\") { io.out(session.notes.length ? session.notes.map((n, i) => `${i + 1}. ${n}`).join(\"\\n\") : \"No tasks yet.\"); continue; }\n if (name === \"clear\") { session.notes.length = 0; io.out(\"(session history cleared)\"); continue; }\n if (name === \"layers\" || name === \"cache\") {\n const c = load();\n if (c) await guarded(io, async () => { await engine(c, name); return 0; });\n continue;\n }\n if (FORWARD[name]) { await guarded(io, () => run([name, ...rest], session)); continue; }\n io.err(`unknown command /${word}. /help lists them.`);\n }\n } finally {\n try { await session.backend?.stop(); } catch { /* the server may already be gone */ }\n }\n}\n\nasync function guarded(io: Io, f: () => Promise<number>): Promise<number | undefined> {\n try { return await f(); } catch (e) { io.err(e instanceof Error ? e.message : String(e)); return undefined; }\n}\n"],"mappings":"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","names":[]}
|
|
File without changes
|