@vibgrate/cli 2026.721.3 → 2026.722.2
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/DOCS.md +185 -0
- package/README.md +2 -1
- package/dist/baseline-BD3A7EXD.js +7 -0
- package/dist/{baseline-37G4TINM.js.map → baseline-BD3A7EXD.js.map} +1 -1
- package/dist/chunk-2O5YZVZV.js +417 -0
- package/dist/chunk-2O5YZVZV.js.map +1 -0
- package/dist/{chunk-ELUFCQDR.js → chunk-3MXNNBLI.js} +240 -2519
- package/dist/chunk-3MXNNBLI.js.map +1 -0
- package/dist/{chunk-JLRF5TFA.js → chunk-5BDHQ7DD.js} +42 -71
- package/dist/chunk-5BDHQ7DD.js.map +1 -0
- package/dist/chunk-6CXTPC74.js +234 -0
- package/dist/chunk-6CXTPC74.js.map +1 -0
- package/dist/chunk-CRAMOEBE.js +675 -0
- package/dist/chunk-CRAMOEBE.js.map +1 -0
- package/dist/chunk-CS37OBE3.js +861 -0
- package/dist/chunk-CS37OBE3.js.map +1 -0
- package/dist/chunk-CT5BS56U.js +23 -0
- package/dist/chunk-CT5BS56U.js.map +1 -0
- package/dist/chunk-GGJZA3Q6.js +961 -0
- package/dist/chunk-GGJZA3Q6.js.map +1 -0
- package/dist/chunk-I7GY7MVN.js +833 -0
- package/dist/chunk-I7GY7MVN.js.map +1 -0
- package/dist/chunk-JBXNQCGE.js +484 -0
- package/dist/chunk-JBXNQCGE.js.map +1 -0
- package/dist/chunk-JFGYT6BI.js +32 -0
- package/dist/chunk-JFGYT6BI.js.map +1 -0
- package/dist/chunk-JYS4OBN2.js +148 -0
- package/dist/chunk-JYS4OBN2.js.map +1 -0
- package/dist/chunk-K3SLGULW.js +50 -0
- package/dist/chunk-K3SLGULW.js.map +1 -0
- package/dist/chunk-LEPTUB4H.js +108 -0
- package/dist/chunk-LEPTUB4H.js.map +1 -0
- package/dist/{chunk-5PLKADD6.js → chunk-NONYJLOJ.js} +4 -3
- package/dist/chunk-NONYJLOJ.js.map +1 -0
- package/dist/{chunk-IKJBELUV.js → chunk-PY3DNX5H.js} +4 -29
- package/dist/chunk-PY3DNX5H.js.map +1 -0
- package/dist/chunk-WNIIKCNF.js +972 -0
- package/dist/chunk-WNIIKCNF.js.map +1 -0
- package/dist/cli.js +2512 -1224
- package/dist/cli.js.map +1 -1
- package/dist/fs-KCABDURV.js +3 -0
- package/dist/fs-KCABDURV.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/interactive-A4DISSIW.js +681 -0
- package/dist/interactive-A4DISSIW.js.map +1 -0
- package/dist/mcp-tools-I6PME3AV.js +3 -0
- package/dist/mcp-tools-I6PME3AV.js.map +1 -0
- package/dist/parse-worker.js +2 -1
- package/dist/parse-worker.js.map +1 -1
- package/dist/session-POJUDFPH.js +6 -0
- package/dist/session-POJUDFPH.js.map +1 -0
- package/dist/session-store-W5RZZHA3.js +3 -0
- package/dist/session-store-W5RZZHA3.js.map +1 -0
- package/dist/stream-json-Q2JGWPHB.js +65 -0
- package/dist/stream-json-Q2JGWPHB.js.map +1 -0
- package/dist/ui-HOVOPWMX.js +4 -0
- package/dist/ui-HOVOPWMX.js.map +1 -0
- package/package.json +1 -1
- package/dist/baseline-37G4TINM.js +0 -6
- package/dist/chunk-5PLKADD6.js.map +0 -1
- package/dist/chunk-ELUFCQDR.js.map +0 -1
- package/dist/chunk-IKJBELUV.js.map +0 -1
- package/dist/chunk-JLRF5TFA.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/code/wizard.ts","../src/code/capability.ts","../src/code/local-runtime.ts","../src/code/cost.ts","../src/code/graph-process.ts","../src/code/interactive.ts"],"names":["group","model","out","nodeSpawn","sp","spawnSync"],"mappings":"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","file":"interactive-A4DISSIW.js","sourcesContent":["/**\n * The `vg code` guided provider/model wizard (VG-CLI-CODE §8).\n *\n * Walks the developer from \"I want to code\" to a concrete (provider, model)\n * choice: run locally, or pick one of the current top hosted providers\n * (Claude / GPT / Grok / Gemini / …) surfaced live from the model catalog — with\n * an \"enter a slug myself\" escape hatch at every step. Pure over an injected\n * {@link Prompter} + catalog + local fleet, so the whole decision tree is\n * unit-tested with a scripted prompter and no network or TTY.\n */\n\nimport type { Prompter } from './ui.js';\nimport type { Catalog } from './catalog.js';\nimport { topProviders } from './catalog.js';\nimport type { LocalModel } from '../engine/models.js';\n\nexport interface WizardResult {\n kind: 'hosted' | 'local';\n /** The router `--provider` value: `openrouter` for hosted picks, `ollama` for local. */\n provider: 'openrouter' | 'ollama';\n /** The concrete model slug/tag to run. */\n model: string;\n /** The display provider for per-model savings attribution (e.g. `anthropic`, `ollama`). */\n providerSlug: string;\n /** For a local model not yet present on the machine → pull it first. */\n needsPull?: boolean;\n}\n\nconst ENTER_SLUG = '__enter_slug__';\nconst LOCAL = '__local__';\nconst BROWSE = '__browse__';\n\nexport interface WizardDeps {\n catalog: Catalog;\n localModels: LocalModel[];\n topN?: number;\n}\n\n/** Run the guided selection and return the resolved provider + model. */\nexport async function runProviderWizard(prompter: Prompter, deps: WizardDeps): Promise<WizardResult> {\n const providers = topProviders(deps.catalog, deps.topN ?? 6);\n\n // Screen 1 — where should the model run?\n const choice = await prompter.select<string>('Where should the model run?', [\n { label: 'Local model (on your machine)', value: LOCAL, hint: deps.localModels.length ? `${deps.localModels.length} found` : 'nothing installed yet' },\n ...providers.map((p) => ({ label: p.label, value: p.id, hint: 'via OpenRouter' })),\n { label: 'Enter a provider or model slug myself', value: ENTER_SLUG },\n ]);\n\n if (choice === LOCAL) return pickLocal(prompter, deps);\n if (choice === ENTER_SLUG) {\n const slug = (await prompter.input('Model slug (e.g. anthropic/claude-3.5-sonnet, or a provider like openai)')).trim();\n // A full `provider/model` slug is a hosted pick; a bare provider name → show its models.\n if (slug.includes('/')) return { kind: 'hosted', provider: 'openrouter', model: slug, providerSlug: slug.split('/')[0] };\n const group = deps.catalog.providers.find((p) => p.id === slug);\n if (group && group.models.length) return pickHostedModel(prompter, group.id, group.models);\n // Unknown provider → let them type the full model slug.\n const model = (await prompter.input(`Model id for \"${slug}\"`)).trim();\n return { kind: 'hosted', provider: 'openrouter', model: model || slug, providerSlug: slug };\n }\n\n // A hosted provider was chosen → pick one of its models.\n const group = providers.find((p) => p.id === choice)!;\n return pickHostedModel(prompter, group.id, group.models);\n}\n\nasync function pickHostedModel(prompter: Prompter, providerSlug: string, models: Catalog['providers'][number]['models']) {\n if (models.length === 0) {\n const model = (await prompter.input(`Enter a ${providerSlug} model id`)).trim();\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model, providerSlug };\n }\n const model = await prompter.select<string>('Choose a model', [\n ...models.slice(0, 12).map((m) => ({ label: m.name, value: m.id, hint: modelHint(m.contextLength, m.promptPricePerM) })),\n { label: 'Enter a model slug myself', value: ENTER_SLUG },\n ]);\n if (model === ENTER_SLUG) {\n const typed = (await prompter.input(`Enter a ${providerSlug} model id`)).trim();\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model: typed, providerSlug };\n }\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model, providerSlug };\n}\n\nasync function pickLocal(prompter: Prompter, deps: WizardDeps): Promise<WizardResult> {\n const installed = deps.localModels.filter((m) => m.runtime === 'ollama');\n const choices = [\n ...installed.map((m) => ({ label: m.name, value: m.name, hint: 'installed' })),\n { label: 'Browse coding models to pull (Ollama)', value: BROWSE },\n { label: 'Enter a model name to pull', value: ENTER_SLUG },\n ];\n const picked = await prompter.select<string>('Local model', choices);\n\n if (picked === ENTER_SLUG) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n if (picked === BROWSE) {\n // Suggest coding models from the catalog, mapped to a likely Ollama tag.\n const coding = deps.catalog.providers\n .flatMap((p) => p.models)\n .filter((m) => /cod(e|er|ing)/i.test(m.id))\n .slice(0, 10);\n if (coding.length === 0) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n const slug = await prompter.select<string>('Coding model to pull', [\n ...coding.map((m) => ({ label: m.name, value: toOllamaTag(m.id), hint: m.id })),\n { label: 'Enter a model name myself', value: ENTER_SLUG },\n ]);\n if (slug === ENTER_SLUG) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n return { kind: 'local', provider: 'ollama', model: slug, providerSlug: 'ollama', needsPull: true };\n }\n // An already-installed model — no pull needed.\n return { kind: 'local', provider: 'ollama', model: picked, providerSlug: 'ollama', needsPull: false };\n}\n\n/** Best-effort map an OpenRouter slug to a likely Ollama tag (`qwen/qwen-2.5-coder-7b` → `qwen2.5-coder:7b`). */\nexport function toOllamaTag(slug: string): string {\n const tail = slug.split('/').pop() ?? slug;\n const size = tail.match(/(\\d+(?:\\.\\d+)?)b\\b/i);\n const base = tail\n .replace(/-instruct\\b/i, '')\n .replace(/(\\d+(?:\\.\\d+)?)b\\b/i, '')\n .replace(/[-.]+$/g, '')\n .replace(/\\s+/g, '-');\n return size ? `${base}:${size[1]}b` : base;\n}\n\nfunction modelHint(contextLength?: number, pricePerM?: number): string {\n const parts: string[] = [];\n if (contextLength) parts.push(`${Math.round(contextLength / 1000)}k ctx`);\n if (typeof pricePerM === 'number') parts.push(pricePerM === 0 ? 'free' : `$${pricePerM}/M in`);\n return parts.join(' · ');\n}\n","/**\n * Local capability + memory pre-flight for `vg code` (VG-CLI-CODE §10).\n *\n * Before we ever pull or run a local model we check the machine can actually\n * hold it: estimate the model's memory footprint from its parameter count and\n * quantization, read available system memory (and GPU VRAM where we can see\n * it), account for models already loaded, and produce a clear go / no-go with\n * actionable suggestions — free memory by unloading a model, pick a smaller\n * quant, or don't install. We never download a model the machine can't run.\n *\n * The estimators and parsers here are pure and unit-tested; the command layer\n * feeds them real `os` memory, `ollama ps`, and (best-effort) `nvidia-smi`\n * output.\n */\n\nconst GiB = 1024 ** 3;\n\n/** Approximate bytes-per-weight for common gguf quantizations. */\nconst QUANT_BYTES_PER_PARAM: Record<string, number> = {\n f16: 2.0, fp16: 2.0, f32: 4.0,\n q8: 1.06, q8_0: 1.06,\n q6: 0.82, q6_k: 0.82,\n q5: 0.7, q5_k_m: 0.72, q5_k_s: 0.68, q5_0: 0.71, q5_1: 0.77,\n q4: 0.58, q4_k_m: 0.6, q4_k_s: 0.56, q4_0: 0.56, q4_1: 0.63,\n q3: 0.46, q3_k_m: 0.48, q3_k_s: 0.44,\n q2: 0.36, q2_k: 0.4,\n};\nconst DEFAULT_QUANT = 'q4_k_m';\n/** Runtime overhead over raw weights: KV cache, context, activations. */\nconst RUNTIME_OVERHEAD = 1.2;\n\nexport interface ModelSizeEstimate {\n /** Parsed parameter count in billions (e.g. 7, 13, 70), or undefined if unknown. */\n paramsB?: number;\n quant: string;\n /** Estimated resident bytes to run the model (weights × quant × overhead). */\n bytes: number;\n /** True when we had to guess the size because the slug didn't state params. */\n guessed: boolean;\n}\n\n/**\n * Estimate a model's memory footprint from its slug/name/tag, e.g.\n * `qwen2.5-coder:7b-instruct-q4_K_M` → ~5 GiB. Falls back to a conservative\n * default size when the parameter count isn't stated.\n */\nexport function estimateModelBytes(slug: string, defaultParamsB = 7): ModelSizeEstimate {\n const lower = slug.toLowerCase();\n const paramMatch = lower.match(/(\\d+(?:\\.\\d+)?)\\s*b\\b/);\n const paramsB = paramMatch ? Number(paramMatch[1]) : undefined;\n const quant = detectQuant(lower);\n const bytesPerParam = QUANT_BYTES_PER_PARAM[quant] ?? QUANT_BYTES_PER_PARAM[DEFAULT_QUANT];\n const effectiveParams = (paramsB ?? defaultParamsB) * 1e9;\n const bytes = Math.round(effectiveParams * bytesPerParam * RUNTIME_OVERHEAD);\n return { paramsB, quant, bytes, guessed: paramsB === undefined };\n}\n\nfunction detectQuant(lower: string): string {\n // Longest key match first so `q4_k_m` beats `q4`.\n const keys = Object.keys(QUANT_BYTES_PER_PARAM).sort((a, b) => b.length - a.length);\n for (const k of keys) if (lower.includes(k)) return k;\n return DEFAULT_QUANT;\n}\n\nexport interface LoadedModel {\n name: string;\n bytes: number;\n}\n\n/**\n * Parse `ollama ps` output into currently-loaded models and their sizes. The\n * table looks like: `NAME ID SIZE PROCESSOR UNTIL` with SIZE like `5.5 GB`.\n */\nexport function parseOllamaPs(stdout: string): LoadedModel[] {\n const lines = stdout.split('\\n').map((l) => l.trim()).filter(Boolean);\n const out: LoadedModel[] = [];\n for (const line of lines) {\n if (/^NAME\\b/i.test(line)) continue; // header\n const sizeMatch = line.match(/(\\d+(?:\\.\\d+)?)\\s*(GB|GiB|MB|MiB|TB)/i);\n const name = line.split(/\\s+/)[0];\n if (!name || !sizeMatch) continue;\n out.push({ name, bytes: toBytes(Number(sizeMatch[1]), sizeMatch[2]) });\n }\n return out;\n}\n\n/** Parse `nvidia-smi --query-gpu=memory.total,memory.used --format=csv,noheader,nounits` (MiB). */\nexport function parseNvidiaSmi(stdout: string): { totalBytes: number; usedBytes: number } | null {\n const line = stdout.split('\\n').map((l) => l.trim()).find(Boolean);\n if (!line) return null;\n const parts = line.split(',').map((p) => Number(p.trim()));\n if (parts.length < 2 || !Number.isFinite(parts[0]) || !Number.isFinite(parts[1])) return null;\n return { totalBytes: parts[0] * 1024 * 1024, usedBytes: parts[1] * 1024 * 1024 };\n}\n\nexport interface SystemMemory {\n totalRamBytes: number;\n freeRamBytes: number;\n /** GPU total/free if a discrete GPU was detected (else undefined → CPU/unified). */\n vramTotalBytes?: number;\n vramFreeBytes?: number;\n loaded: LoadedModel[];\n}\n\nexport interface CapabilityReport {\n model: ModelSizeEstimate;\n /** Bytes available to a new model right now (the larger of free VRAM or free RAM). */\n availableBytes: number;\n /** Bytes available if every currently-loaded model were unloaded. */\n availableIfUnloadedBytes: number;\n canRun: boolean;\n /** True only after unloading currently-loaded models. */\n needsUnload: boolean;\n suggestions: string[];\n loaded: LoadedModel[];\n}\n\n/**\n * Decide whether `model` can run on `sys`, and if not, what to do about it.\n * Prefers GPU memory when a discrete GPU is present, else system RAM (covers\n * Apple-silicon unified memory too). Leaves a safety margin so we don't wedge\n * the machine at 100% memory.\n */\nexport function assessCapability(model: ModelSizeEstimate, sys: SystemMemory): CapabilityReport {\n const useVram = typeof sys.vramTotalBytes === 'number' && sys.vramTotalBytes > 0;\n const free = useVram ? (sys.vramFreeBytes ?? 0) : sys.freeRamBytes;\n const loadedBytes = sys.loaded.reduce((n, m) => n + m.bytes, 0);\n // A margin so we never fill memory completely.\n const margin = Math.min(2 * GiB, (useVram ? sys.vramTotalBytes! : sys.totalRamBytes) * 0.1);\n const available = Math.max(0, free - margin);\n const availableIfUnloaded = Math.max(0, free + loadedBytes - margin);\n\n const need = model.bytes;\n const canRunNow = available >= need;\n const canRunUnloaded = availableIfUnloaded >= need;\n\n const suggestions: string[] = [];\n if (!canRunNow && canRunUnloaded && sys.loaded.length) {\n const biggest = [...sys.loaded].sort((a, b) => b.bytes - a.bytes);\n suggestions.push(`unload a loaded model to free memory (e.g. \\`ollama stop ${biggest[0].name}\\` frees ~${fmt(biggest[0].bytes)})`);\n }\n if (!canRunUnloaded) {\n suggestions.push(`this model needs ~${fmt(need)} but only ~${fmt(availableIfUnloaded)} is available — choose a smaller model or a lower quant (e.g. q4_K_M)`);\n }\n if (model.guessed) {\n suggestions.push(`couldn't read the parameter count from the name — this estimate assumes a ~${(model.bytes / GiB).toFixed(1)} GiB model; verify before pulling`);\n }\n\n return {\n model,\n availableBytes: available,\n availableIfUnloadedBytes: availableIfUnloaded,\n canRun: canRunNow || canRunUnloaded,\n needsUnload: !canRunNow && canRunUnloaded,\n suggestions,\n loaded: sys.loaded,\n };\n}\n\n/** Human-readable byte size. */\nexport function fmt(bytes: number): string {\n if (bytes >= GiB) return `${(bytes / GiB).toFixed(1)} GiB`;\n return `${(bytes / (1024 * 1024)).toFixed(0)} MiB`;\n}\n\nfunction toBytes(n: number, unit: string): number {\n const u = unit.toLowerCase();\n if (u.startsWith('t')) return n * 1000 ** 4;\n if (u.startsWith('g')) return n * (u.includes('i') ? GiB : 1e9);\n if (u.startsWith('m')) return n * (u.includes('i') ? 1024 * 1024 : 1e6);\n return n;\n}\n","/**\n * Thin I/O wrappers around the local model runtime (Ollama / GPU) for the\n * `vg code` guided flow (VG-CLI-CODE §10). The pure parsing/estimation these\n * feed lives in capability.ts and is unit-tested; this file just gathers real\n * system state and wraps the noisy `ollama pull` behind a single clean status\n * line (no raw progress spam), per the \"clean UI for devs\" requirement.\n */\n\nimport * as os from 'node:os';\nimport { spawn, spawnSync } from 'node:child_process';\nimport { parseOllamaPs, parseNvidiaSmi, type SystemMemory } from './capability.js';\nimport type { Spinner } from './ui.js';\n\n/** Gather current system memory, loaded models, and (best-effort) GPU VRAM. */\nexport function gatherSystemMemory(): SystemMemory {\n const loaded = safeRun('ollama', ['ps']).map(parseOllamaPs).flat();\n const smi = safeRun('nvidia-smi', ['--query-gpu=memory.total,memory.used', '--format=csv,noheader,nounits'])\n .map(parseNvidiaSmi)\n .find(Boolean);\n const sys: SystemMemory = {\n totalRamBytes: os.totalmem(),\n freeRamBytes: os.freemem(),\n loaded,\n };\n if (smi) {\n sys.vramTotalBytes = smi.totalBytes;\n sys.vramFreeBytes = Math.max(0, smi.totalBytes - smi.usedBytes);\n }\n return sys;\n}\n\n/** True if the `ollama` binary is on PATH. */\nexport function hasOllama(): boolean {\n return spawnSync(process.platform === 'win32' ? 'where' : 'which', ['ollama'], { stdio: 'ignore' }).status === 0;\n}\n\n/** Unload a running model to free memory. Returns true on success. */\nexport function stopModel(name: string): boolean {\n return spawnSync('ollama', ['stop', name], { stdio: 'ignore' }).status === 0;\n}\n\n/**\n * Pull a model, wrapping Ollama's chatty progress in one clean spinner line.\n * We read its stderr, keep only the latest human-meaningful status (e.g.\n * \"pulling manifest\", \"downloading … 42%\"), and never echo the raw stream.\n */\nexport function pullModelClean(name: string, spinner: Spinner): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn('ollama', ['pull', name]);\n const onData = (buf: Buffer): void => {\n const line = lastMeaningfulLine(buf.toString());\n if (line) spinner.update(`pulling ${name} — ${line}`);\n };\n child.stdout?.on('data', onData);\n child.stderr?.on('data', onData);\n child.on('error', () => resolve(false));\n child.on('close', (code) => resolve(code === 0));\n });\n}\n\n/** The last non-empty, de-noised status token from an ollama progress chunk. */\nfunction lastMeaningfulLine(chunk: string): string {\n const lines = chunk\n .split(/[\\r\\n]+/)\n .map((l) => l.trim())\n // ollama redraws a progress bar with escape codes; strip them and bar glyphs.\n .map((l) => l.replace(/\\x1b\\[[0-9;]*[A-Za-z]/g, '').replace(/[▏▎▍▌▋▊▉█░▒▓⣀-⣿]/g, '').trim())\n .filter(Boolean);\n const last = lines[lines.length - 1] ?? '';\n // Keep a short, meaningful summary (status + any percentage).\n const pct = last.match(/(\\d+)\\s*%/);\n const status = last.replace(/\\s{2,}.*$/, '').slice(0, 48);\n return pct ? `${status} ${pct[1]}%`.trim() : status;\n}\n\n/** Run a command and return its stdout lines (or [] if the binary is missing/fails). */\nfunction safeRun(bin: string, args: string[]): string[] {\n try {\n const res = spawnSync(bin, args, { encoding: 'utf8', timeout: 5000 });\n if (res.status !== 0 || typeof res.stdout !== 'string') return [];\n return [res.stdout];\n } catch {\n return [];\n }\n}\n","/**\n * Live cost / token metering for VG Code (VG-CLI-CODE §15).\n *\n * A session meter accumulates the prompt/completion tokens providers report and\n * turns them into a running dollar estimate from the model's published price\n * (per-million, from the catalog). Local models are free, so cost is 0 and only\n * tokens are shown. Pure and unit-tested; the estimate is labelled as such.\n */\n\nexport interface TokenUsage {\n promptTokens?: number;\n completionTokens?: number;\n}\n\n/** USD per 1M tokens for the active model (from the catalog); absent for local/free. */\nexport interface ModelPricing {\n promptPerM?: number;\n completionPerM?: number;\n}\n\n/** Dollar cost of one usage sample under a pricing table (0 when unpriced/free). */\nexport function costOf(usage: TokenUsage, pricing: ModelPricing): number {\n const inCost = ((usage.promptTokens ?? 0) / 1e6) * (pricing.promptPerM ?? 0);\n const outCost = ((usage.completionTokens ?? 0) / 1e6) * (pricing.completionPerM ?? 0);\n return round4(inCost + outCost);\n}\n\n/** Accumulates usage + cost across a coding session. */\nexport class SessionMeter {\n private prompt = 0;\n private completion = 0;\n private cost = 0;\n private turns = 0;\n\n constructor(private pricing: ModelPricing = {}) {}\n\n /** Update the pricing (e.g. after `/model` switches model mid-session). */\n setPricing(pricing: ModelPricing): void {\n this.pricing = pricing;\n }\n\n /** Record one model turn; returns the incremental cost of just this turn. */\n add(usage: TokenUsage): number {\n this.prompt += usage.promptTokens ?? 0;\n this.completion += usage.completionTokens ?? 0;\n this.turns += 1;\n const delta = costOf(usage, this.pricing);\n this.cost = round4(this.cost + delta);\n return delta;\n }\n\n get totals(): { promptTokens: number; completionTokens: number; totalTokens: number; cost: number; turns: number } {\n return { promptTokens: this.prompt, completionTokens: this.completion, totalTokens: this.prompt + this.completion, cost: this.cost, turns: this.turns };\n }\n\n /** A compact one-line summary, e.g. `3.1k tok · ~$0.0042` (cost only when priced). */\n summary(): string {\n const t = this.totals;\n const tok = `${fmtTokens(t.totalTokens)} tok`;\n const priced = this.pricing.promptPerM || this.pricing.completionPerM;\n return priced ? `${tok} · ~$${t.cost.toFixed(4)}` : tok;\n }\n}\n\nexport function fmtTokens(n: number): string {\n if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;\n if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;\n return String(n);\n}\n\nfunction round4(x: number): number {\n return Math.round(x * 1e4) / 1e4;\n}\n","/**\n * The VG Code ⇄ Vibgrate Graph process boundary (VG-CLI-CODE §11).\n *\n * When VG Code enters coding mode it spawns Vibgrate Graph (`vg serve`, the\n * local-first AI-context MCP server) as a **separate child process** and kills\n * it when the session ends — so the code map is served for the life of the\n * session and never outlives it. The child is launched with `--client vg-code`\n * so anything it records is attributed to VG Code.\n *\n * Per-model savings themselves are recorded in-process by the session (it is the\n * only side that knows which model made the call; see session.ts + savings.ts),\n * into the same local ledger `vg serve --savings` and `vg savings` use — so the\n * subprocess and the in-process recording never double-count.\n *\n * The spawner is injectable, so the lifecycle (spawn args, kill-on-dispose,\n * idempotent dispose, spawn-failure handling) is unit-tested without launching a\n * real process.\n */\n\nimport { spawn as nodeSpawn, type ChildProcess } from 'node:child_process';\nimport { detectServeLaunch } from '../install/registry.js';\n\nexport type SpawnLike = (command: string, args: string[], options: { cwd: string; stdio: 'ignore'; detached: boolean }) => ChildProcess;\n\nexport interface GraphProcessOptions {\n root: string;\n /** Client label the child attributes its activity to (default `vg-code`). */\n client?: string;\n /** Injectable spawn (defaults to node:child_process spawn). */\n spawnImpl?: SpawnLike;\n /** Injectable launch resolution (defaults to detectServeLaunch()). */\n launch?: { command: string; args: string[] };\n}\n\n/**\n * A managed `vg serve` child. `start` returns null (never throws) if the process\n * can't be spawned — VG Code degrades to using the in-process graph only, so a\n * spawn failure never breaks a coding session.\n */\nexport class GraphProcess {\n private child: ChildProcess | null;\n private disposed = false;\n readonly command: string;\n readonly args: string[];\n\n private constructor(child: ChildProcess, command: string, args: string[]) {\n this.child = child;\n this.command = command;\n this.args = args;\n // If the child dies on its own, forget it so dispose is a no-op.\n child.once('exit', () => {\n this.child = null;\n });\n }\n\n static start(options: GraphProcessOptions): GraphProcess | null {\n const launch = options.launch ?? detectServeLaunch();\n const client = options.client ?? 'vg-code';\n // `vg serve --client vg-code`: the map is served for the session, attributed\n // to VG Code. (No `--savings` here — the session records per-model savings\n // in-process, so enabling it on the child would double-count.)\n const args = [...launch.args, '--client', client];\n const spawnImpl = options.spawnImpl ?? (nodeSpawn as unknown as SpawnLike);\n try {\n const child = spawnImpl(launch.command, args, { cwd: options.root, stdio: 'ignore', detached: false });\n if (!child || typeof child.pid !== 'number') return null;\n child.on('error', () => {\n /* never let a child spawn/runtime error surface as an unhandled event */\n });\n return new GraphProcess(child, launch.command, args);\n } catch {\n return null;\n }\n }\n\n get pid(): number | undefined {\n return this.child?.pid;\n }\n\n /** True while the child is believed to be running. */\n get running(): boolean {\n return this.child !== null && !this.disposed;\n }\n\n /** Kill the child. Idempotent and safe to call after the child already exited. */\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n const child = this.child;\n this.child = null;\n if (!child || child.killed) return;\n try {\n child.kill('SIGTERM');\n } catch {\n /* already gone */\n }\n }\n}\n","/**\n * The `vg code` guided, interactive mode (VG-CLI-CODE §8–§11).\n *\n * Running bare `vg code` at a terminal enters this flow: show the VG Code\n * banner, make sure the code map is built (behind a spinner, no map banner),\n * walk the developer through choosing a provider + model (local or a top hosted\n * provider), run a memory pre-flight before pulling any local model, then drop\n * into a coding REPL that proposes a diff per instruction and writes only what\n * the developer approves.\n *\n * The decision logic (catalog grouping, wizard tree, capability assessment) is\n * pure and unit-tested elsewhere; this module is the I/O shell that wires those\n * pieces to the terminal, the graph build, and the model runtime.\n */\n\nimport { loadGraph } from '../engine/load.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { discoverModels } from '../engine/models.js';\nimport { runBuild } from '../commands/build.js';\nimport { printCodeLogo } from '../util/logo.js';\nimport { c, info, out } from '../util/output.js';\nimport type { GlobalOpts } from '../cli-options.js';\nimport { fetchCatalog } from './catalog.js';\nimport { runProviderWizard, type WizardResult } from './wizard.js';\nimport { TtyPrompter, PromptCancelled, type Prompter } from './ui.js';\nimport { estimateModelBytes, assessCapability, fmt } from './capability.js';\nimport { gatherSystemMemory, hasOllama, stopModel, pullModelClean } from './local-runtime.js';\nimport { spawnSync } from 'node:child_process';\nimport { resolveProviders } from './router.js';\nimport { nodeCodeFs, undoChanges } from './session.js';\nimport { runAgent, type AgentEvent, type AgentOptions, type AgentResult } from './agent.js';\nimport { readModelSavings } from '../engine/savings.js';\nimport { SessionMeter } from './cost.js';\nimport { McpToolset, defaultMcpConnect, type McpConnect } from './mcp-tools.js';\nimport { loadLatestSession, saveSession, summarizeSession, newSession, recordTask, type StoredSession } from './session-store.js';\nimport type { McpServerConfig } from './config.js';\nimport type { MutatingAction, ShellResult } from './tools.js';\nimport type { FileChange, Provider } from './types.js';\nimport { GraphProcess } from './graph-process.js';\nimport { summarizeDiffs } from './diff.js';\n\nexport interface InteractiveOptions {\n provider?: string;\n model?: string;\n modelPath?: string;\n budget?: string;\n file?: string[];\n /** Auto-approve edits and commands (autonomous). */\n auto?: boolean;\n /** Cap on agent steps per instruction. */\n maxSteps?: number;\n /** Extra command-denylist rules for autonomous mode (from config). */\n denyCommands?: string[];\n /** Project test/verify command surfaced to the agent (from config). */\n testCommand?: string;\n /** Transcript compaction budget in tokens (from config / model window). */\n contextBudget?: number;\n /** Stream assistant tokens live. */\n stream?: boolean;\n /** Auto-verify: run the test command after the agent finishes and fix failures. */\n verify?: { command: string; maxRounds?: number };\n /** External MCP servers whose tools the agent may call. */\n mcpServers?: Record<string, McpServerConfig>;\n /** Which config files the MCP servers came from (for a transparent note). */\n mcpSources?: string[];\n /** Resume the most recent session (inject a recap, restore /undo). */\n continueSession?: boolean;\n /** Injectable MCP connect (tests). */\n mcpConnect?: McpConnect;\n}\n\n/** Entry point for guided `vg code` (no instruction, at a TTY). */\nexport async function runInteractive(root: string, global: GlobalOpts, opts: InteractiveOptions, prompter: Prompter = new TtyPrompter()): Promise<void> {\n printCodeLogo(root);\n try {\n await ensureMap(root, global, prompter);\n const selection = await chooseModel(root, global, opts, prompter);\n if (!selection) return; // aborted (e.g. can't run a local model)\n await codingRepl(root, global, opts, selection, prompter);\n } catch (e) {\n if (e instanceof PromptCancelled) {\n info(c.dim('\\n cancelled — no changes were made'));\n return;\n }\n throw e;\n }\n}\n\n/** Build the code map if missing, or refresh it if the tree drifted — behind a spinner, no map banner. */\nasync function ensureMap(root: string, global: GlobalOpts, prompter: Prompter): Promise<void> {\n const existing = loadGraph(root, global.graph);\n if (!existing) {\n const sp = prompter.spinner('Building the code map…');\n try {\n // quiet:true suppresses the map's own banner/progress so our UI stays clean.\n await runBuild([root], {}, { ...global, quiet: true });\n sp.stop('Code map built');\n } catch (e) {\n sp.fail(`couldn't build the code map: ${(e as Error).message}`);\n throw e;\n }\n return;\n }\n const sp = prompter.spinner('Checking the code map is up to date…');\n const refreshed = await refreshIfStale(root).catch(() => null);\n if (refreshed?.status === 'refreshed') sp.stop('Code map refreshed');\n else sp.stop('Code map ready');\n}\n\n/** Resolve the provider/model — from flags if given, else via the guided wizard. */\nasync function chooseModel(root: string, global: GlobalOpts, opts: InteractiveOptions, prompter: Prompter): Promise<WizardResult | null> {\n // Explicit flags skip the wizard entirely.\n if (opts.provider && (opts.model || opts.modelPath)) {\n const local = opts.provider === 'ollama' || opts.provider === 'lmstudio' || opts.provider === 'llama-cpp' || !!global.local;\n return { kind: local ? 'local' : 'hosted', provider: opts.provider === 'ollama' ? 'ollama' : 'openrouter', model: opts.model ?? opts.modelPath ?? '', providerSlug: opts.provider, needsPull: false };\n }\n\n const sp = prompter.spinner('Loading the model catalog…');\n const catalog = await fetchCatalog({ offline: global.local });\n sp.stop(catalog.source === 'network' ? 'Model catalog loaded' : catalog.source === 'cache' ? 'Model catalog (cached)' : 'Model catalog (offline list)');\n const localModels = discoverModels();\n\n const selection = await runProviderWizard(prompter, { catalog, localModels });\n\n if (selection.kind === 'local' && selection.needsPull) {\n const ok = await preflightAndPull(selection, prompter);\n if (!ok) return null;\n }\n if (selection.kind === 'hosted' && !process.env.OPENROUTER_API_KEY) {\n prompter.note(c.yellow('Set OPENROUTER_API_KEY in your environment to use this hosted model (keys are never passed as flags).'));\n }\n return selection;\n}\n\n/** Memory pre-flight, then a clean, wrapped `ollama pull`. Returns false if we shouldn't proceed. */\nasync function preflightAndPull(selection: WizardResult, prompter: Prompter): Promise<boolean> {\n if (!hasOllama()) {\n prompter.note(c.yellow('Ollama isn’t installed — get it from https://ollama.com, then re-run. (We never install a runtime for you.)'));\n return false;\n }\n const estimate = estimateModelBytes(selection.model);\n const report = assessCapability(estimate, gatherSystemMemory());\n\n prompter.note(`${c.bold(selection.model)} — estimated ${fmt(estimate.bytes)}${estimate.guessed ? c.dim(' (size guessed)') : ''}; ~${fmt(report.availableBytes)} free now`);\n for (const s of report.suggestions) prompter.note(c.dim(`· ${s}`));\n\n if (!report.canRun) {\n prompter.note(c.red('This machine doesn’t have enough memory for that model — not pulling it. Pick a smaller model or a lower quant.'));\n return false;\n }\n if (report.needsUnload) {\n const biggest = [...report.loaded].sort((a, b) => b.bytes - a.bytes)[0];\n if (biggest && (await prompter.confirm(`Unload ${biggest.name} to free ~${fmt(biggest.bytes)}?`, true))) {\n stopModel(biggest.name);\n }\n }\n if (!(await prompter.confirm(`Pull ${selection.model} (~${fmt(estimate.bytes)})?`, true))) return false;\n\n const sp = prompter.spinner(`Pulling ${selection.model}…`);\n const ok = await pullModelClean(selection.model, sp);\n if (ok) sp.stop(`Pulled ${selection.model}`);\n else sp.fail(`couldn’t pull ${selection.model}`);\n return ok;\n}\n\n/** The coding REPL: a graph-grounded agent per task, plus slash-commands (/help, /undo, …). */\nasync function codingRepl(root: string, global: GlobalOpts, opts: InteractiveOptions, selection: WizardResult, prompter: Prompter): Promise<void> {\n let sel = selection;\n let route = resolveProviders({ provider: sel.provider, model: sel.model, local: sel.kind === 'local' || global.local });\n const fsImpl = nodeCodeFs(root);\n const meter = new SessionMeter();\n let lastChanges: FileChange[] = [];\n\n // Resume the most recent session (recap for the model + restore /undo).\n let store: StoredSession = newSession(sessionId(), sel.providerSlug, sel.model, Date.now());\n let priorSummary: string | undefined;\n if (opts.continueSession) {\n const prev = loadLatestSession(root);\n if (prev) {\n store = prev;\n lastChanges = prev.lastChanges ?? [];\n priorSummary = summarizeSession(prev);\n prompter.note(c.dim(`resumed session — ${prev.tasks.length} earlier task(s); /undo restores the last change`));\n } else prompter.note(c.dim('no previous session to continue'));\n }\n\n // Connect external MCP tools (from config), if any.\n let mcp: McpToolset | undefined;\n if (opts.mcpServers && Object.keys(opts.mcpServers).length) {\n const sp = prompter.spinner('Connecting MCP tools…');\n const { toolset, warnings } = await McpToolset.connect(opts.mcpServers, opts.mcpConnect ?? defaultMcpConnect);\n mcp = toolset;\n const from = opts.mcpSources?.length ? ` (from ${opts.mcpSources.join(', ')})` : '';\n sp.stop(`MCP tools: ${toolset.specs().length} from ${Object.keys(opts.mcpServers).length} server(s)${from}`);\n for (const w of warnings) prompter.note(c.yellow(` ${w}`));\n }\n\n const graphProc = GraphProcess.start({ root });\n const cleanup = (): void => {\n graphProc?.dispose();\n void mcp?.dispose();\n };\n process.once('SIGINT', cleanup);\n\n const autoNote = opts.auto ? c.yellow(' · auto-approve ON') : '';\n prompter.intro(`Ready — ${sel.providerSlug}/${sel.model}${graphProc ? c.dim(' · graph ' + graphProc.pid) : ''}${autoNote}. Describe a task, or /help. Empty line to exit.`);\n\n try {\n for (;;) {\n const line = (await prompter.input('code ›')).trim();\n if (!line || /^(exit|quit)$/i.test(line) || line === '/exit' || line === '/quit') break;\n\n if (line.startsWith('/')) {\n const [cmd] = line.slice(1).split(/\\s+/);\n if (cmd === 'help') {\n prompter.note('commands: /undo /diff /model /cost /clear /exit');\n } else if (cmd === 'undo') {\n if (lastChanges.length === 0) prompter.note(c.dim('nothing to undo'));\n else {\n const restored = undoChanges(lastChanges, fsImpl);\n prompter.note(c.green(`↩ reverted ${restored.length} file(s): ${restored.join(', ')}`));\n lastChanges = [];\n store = { ...store, lastChanges: [] };\n saveSession(root, store);\n }\n } else if (cmd === 'diff') {\n if (lastChanges.length === 0) prompter.note(c.dim('no recent change'));\n else for (const ch of lastChanges) if (ch.diff) out(ch.diff);\n } else if (cmd === 'model') {\n const swapped = await reselectModel(root, global, prompter);\n if (swapped) {\n sel = swapped;\n route = resolveProviders({ provider: sel.provider, model: sel.model, local: sel.kind === 'local' || global.local });\n prompter.note(c.green(`now using ${sel.providerSlug}/${sel.model}`));\n }\n } else if (cmd === 'cost') {\n prompter.note(`this session: ${meter.summary()}`);\n printCost(root);\n } else if (cmd === 'clear') {\n prompter.note(c.dim('each task already starts fresh — nothing to clear'));\n } else {\n prompter.note(c.yellow(`unknown command /${cmd} — try /help`));\n }\n continue;\n }\n\n const graph = loadGraph(root, global.graph);\n if (!graph) {\n prompter.note(c.red('the code map disappeared — run `vg` to rebuild'));\n break;\n }\n const result = await agentTask({\n root,\n graph,\n instruction: line,\n providers: route.providers,\n fsImpl,\n attribution: { client: 'vg-code', provider: sel.providerSlug, model: sel.model },\n auto: !!opts.auto,\n maxSteps: opts.maxSteps,\n denyCommands: opts.denyCommands,\n testCommand: opts.testCommand,\n contextBudget: opts.contextBudget,\n stream: opts.stream,\n verify: opts.verify,\n priorSummary,\n externalTools: mcp ? mcpExternalTools(mcp, agentApprove(opts, prompter)) : undefined,\n meter,\n prompter,\n });\n priorSummary = undefined; // recap only seeds the first task after --continue\n if (result.changes.length) {\n lastChanges = result.changes;\n prompter.note(c.dim(' /undo to revert · /diff to review'));\n }\n // Persist the session after each task so --continue and /undo survive a restart.\n store = recordTask(store, { instruction: line, summary: result.finalText, changes: result.changes, stopped: result.stopped }, Date.now());\n saveSession(root, store);\n }\n } finally {\n cleanup();\n process.removeListener('SIGINT', cleanup);\n }\n prompter.outro('Done.');\n}\n\n/** Approval gate closure for MCP tools (mirrors agentTask's gate). */\nfunction agentApprove(opts: InteractiveOptions, prompter: Prompter): (a: MutatingAction) => Promise<boolean> {\n return async (action) => {\n if (opts.auto) return true;\n if (action.kind === 'tool') return prompter.confirm(`Call ${action.name}?`, false);\n return true;\n };\n}\n\n/** Bind an McpToolset to the agent's externalTools shape. */\nfunction mcpExternalTools(mcp: McpToolset, approve: (a: MutatingAction) => Promise<boolean>): AgentOptions['externalTools'] {\n return { specs: mcp.specs(), owns: (name) => mcp.owns(name), execute: (call) => mcp.execute(call, approve) };\n}\n\n/** A time-free-ish session id (runtime randomness is fine — not a graph artifact). */\nfunction sessionId(): string {\n let s = '';\n const alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789';\n for (let i = 0; i < 10; i++) s += alphabet[Math.floor(Math.random() * alphabet.length)];\n return s;\n}\n\n/** Re-run the provider/model wizard mid-session (the `/model` command). */\nasync function reselectModel(root: string, global: GlobalOpts, prompter: Prompter): Promise<WizardResult | null> {\n try {\n const sp = prompter.spinner('Loading the model catalog…');\n const catalog = await fetchCatalog({ offline: global.local });\n sp.stop('Model catalog loaded');\n const selection = await runProviderWizard(prompter, { catalog, localModels: discoverModels() });\n if (selection.kind === 'local' && selection.needsPull) {\n const ok = await preflightAndPull(selection, prompter);\n if (!ok) return null;\n }\n return selection;\n } catch (e) {\n if (e instanceof PromptCancelled) return null;\n prompter.note(c.yellow(`couldn't switch model: ${(e as Error).message}`));\n return null;\n }\n}\n\n/** Print the local per-model savings for `/cost`. */\nfunction printCost(root: string): void {\n const now = Date.now();\n const models = readModelSavings(root, 30, now);\n if (models.length === 0) {\n info(c.dim(' no usage recorded yet this session'));\n return;\n }\n info(c.bold(' savings by model (last 30 days, local)'));\n for (const m of models) info(` ${m.key.padEnd(32)} ${m.queries} call(s) · ~${m.vgTokens} tokens · saved ≈ $${m.saved}`);\n}\n\n/**\n * Run one agentic task and render it to the terminal. Shared by the guided REPL\n * and the one-shot command. Read-only tools stream as dim status lines; each\n * mutating tool (edit / create / delete / run) is gated — auto-approved under\n * `--auto`, otherwise confirmed by the developer (with the diff or command shown).\n */\nexport async function agentTask(params: {\n root: string;\n graph: import('../schema.js').VgGraph;\n instruction: string;\n providers: Provider[];\n fsImpl: ReturnType<typeof nodeCodeFs>;\n attribution: { client: string; provider?: string; model?: string };\n auto: boolean;\n maxSteps?: number;\n budget?: number;\n contextBudget?: number;\n denyCommands?: string[];\n testCommand?: string;\n stream?: boolean;\n verify?: { command: string; maxRounds?: number };\n priorSummary?: string;\n externalTools?: AgentOptions['externalTools'];\n meter?: SessionMeter;\n prompter?: Prompter;\n}): Promise<AgentResult> {\n const { prompter } = params;\n const approve = async (action: MutatingAction): Promise<boolean> => {\n if (params.auto) return true;\n if (!prompter) return false; // non-interactive without --auto: refuse mutations\n switch (action.kind) {\n case 'edit':\n out(action.diff);\n return prompter.confirm(`Apply edit to ${action.file}?`, true);\n case 'create':\n return prompter.confirm(`Create ${action.file} (${action.bytes} bytes)?`, true);\n case 'delete':\n return prompter.confirm(`Delete ${action.file}?`, false);\n case 'run':\n return prompter.confirm(`Run \\`${action.command}\\`?`, false);\n case 'tool':\n return prompter.confirm(`Call ${action.name}(${briefArgs(action.args)})?`, false);\n }\n };\n\n // Event rendering, with live token streaming: raw tokens print inline; any\n // other event first closes the streamed line so the layout stays clean.\n let streaming = false;\n const closeStream = (): void => {\n if (streaming) {\n process.stderr.write('\\n');\n streaming = false;\n }\n };\n const onEvent = (e: AgentEvent): void => {\n if (e.type === 'token') {\n process.stderr.write(e.text);\n streaming = true;\n return;\n }\n closeStream();\n if (e.type === 'assistant') {\n if (e.text.trim()) info(e.text.trim());\n } else if (e.type === 'tool-call') {\n info(c.dim(` → ${e.name}(${briefArgs(e.args)})`));\n } else if (e.type === 'tool-result') {\n info(c.dim(` ${e.mutated ? c.green('✔ ') : ''}${e.content.split('\\n')[0].slice(0, 100)}`));\n } else if (e.type === 'compact') {\n info(c.dim(` · compacted context (${e.droppedRounds} earlier round(s) summarized)`));\n } else if (e.type === 'verify') {\n info(e.passed ? c.green(` ✔ ${e.command} passed`) : c.yellow(` ✗ ${e.command} failed — asking the model to fix it`));\n }\n };\n\n const result = await runAgent({\n graph: params.graph,\n root: params.root,\n instruction: params.instruction,\n providers: params.providers,\n fsImpl: params.fsImpl,\n run: shellRunner(params.root),\n approve,\n onEvent,\n attribution: params.attribution,\n maxSteps: params.maxSteps,\n budget: params.budget,\n contextBudget: params.contextBudget,\n auto: params.auto,\n denyCommands: params.denyCommands,\n testCommand: params.testCommand,\n stream: params.stream,\n verify: params.verify,\n priorSummary: params.priorSummary,\n externalTools: params.externalTools,\n now: () => Date.now(),\n });\n closeStream();\n\n const perTask = params.meter?.add(result.usage);\n const summary = summarizeDiffs(result.changes.map((ch) => ({ file: ch.file, diff: ch.diff })));\n info('');\n info(\n result.stopped === 'finished'\n ? c.green(`✔ ${result.finalText}`)\n : result.stopped === 'max-steps'\n ? c.yellow(`stopped at the step limit — ${result.changes.length} change(s) so far`)\n : c.dim(result.finalText),\n );\n const meterNote = perTask !== undefined ? ` · ${params.meter!.summary()}` : '';\n if (result.changes.length || perTask) info(c.dim(` ${summary} · via ${result.provider.id}/${result.provider.model}${result.provider.fellBack ? ' (fell back)' : ''}${meterNote}`));\n return result;\n}\n\nfunction briefArgs(args: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [k, v] of Object.entries(args)) {\n const s = typeof v === 'string' ? v : JSON.stringify(v);\n parts.push(`${k}: ${s.length > 40 ? s.slice(0, 40) + '…' : s}`);\n if (parts.length >= 2) break;\n }\n return parts.join(', ');\n}\n\n/** A shell runner for the agent's run_command tool, scoped to the repo root. */\nfunction shellRunner(root: string): (command: string) => ShellResult {\n return (command: string) => {\n const res = spawnSync(command, { cwd: root, shell: true, encoding: 'utf8', timeout: 120_000, maxBuffer: 10 * 1024 * 1024 });\n const stdout = (res.stdout ?? '') + (res.stderr ? `\\n${res.stderr}` : '');\n return { stdout, exitCode: res.status ?? 1 };\n };\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"mcp-tools-I6PME3AV.js"}
|
package/dist/parse-worker.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { setGrammarsOverride, parseSource } from './chunk-
|
|
1
|
+
import { setGrammarsOverride, parseSource } from './chunk-PY3DNX5H.js';
|
|
2
2
|
import './chunk-RXP66R2E.js';
|
|
3
|
+
import './chunk-JFGYT6BI.js';
|
|
3
4
|
import * as fs from 'fs';
|
|
4
5
|
|
|
5
6
|
async function run(payload) {
|
package/dist/parse-worker.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/parse-worker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/engine/parse-worker.ts"],"names":[],"mappings":";;;;;AA0BA,eAAO,IAA2B,OAAA,EAA6C;AAC7E,EAAA,mBAAA,CAAoB,QAAQ,WAAW,CAAA;AACvC,EAAA,MAAM,MAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,KAAA,EAAO;AAChC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAY,EAAA,CAAA,YAAA,CAAa,IAAA,CAAK,GAAA,EAAK,MAAM,CAAA;AAC/C,MAAA,GAAA,CAAI,IAAA,CAAK,MAAM,WAAA,CAAY,IAAA,CAAK,KAAK,IAAA,CAAK,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,IACzD,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,IAAA,CAAK;AAAA,QACP,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,IAAA,EAAM,EAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,MAAM,EAAC;AAAA,QACP,OAAO,EAAC;AAAA,QACR,SAAS,EAAC;AAAA,QACV,UAAU,EAAC;AAAA,QACX,UAAU,EAAC;AAAA,QACX,QAAQ,EAAC;AAAA,QACT,QAAA,EAAU,CAAC,CAAA,cAAA,EAAkB,GAAA,CAAc,OAAO,CAAA,CAAE;AAAA,OACrD,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT","file":"parse-worker.js","sourcesContent":["import * as fs from 'node:fs';\nimport { parseSource } from './parse.js';\nimport { setGrammarsOverride } from './grammars.js';\nimport type { FileParse } from './types.js';\n\n/**\n * tinypool worker entry. Receives a chunk of files, reads and parses each, and\n * returns the FileParse table. Each worker owns its own web-tree-sitter instance\n * (initialized lazily inside parseSource/grammars). Results are plain data, so\n * they serialize cleanly back to the main thread.\n *\n * The `--grammars <dir>` override is passed in the payload (env vars don't cross\n * into worker threads in a controlled way) and applied per worker before parsing.\n */\n\nexport interface ParseTask {\n rel: string;\n abs: string;\n lang: string;\n}\n\nexport interface ParsePayload {\n tasks: ParseTask[];\n grammarsDir?: string;\n}\n\nexport default async function run(payload: ParsePayload): Promise<FileParse[]> {\n setGrammarsOverride(payload.grammarsDir);\n const out: FileParse[] = [];\n for (const task of payload.tasks) {\n try {\n const source = fs.readFileSync(task.abs, 'utf8');\n out.push(await parseSource(task.rel, task.lang, source));\n } catch (err) {\n out.push({\n rel: task.rel,\n lang: task.lang,\n hash: '',\n bytes: 0,\n defs: [],\n calls: [],\n imports: [],\n heritage: [],\n typeRefs: [],\n guards: [],\n warnings: [`parse failed: ${(err as Error).message}`],\n });\n }\n }\n return out;\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { commitChanges, nodeCodeFs, runCodeSession, undoChanges } from './chunk-6CXTPC74.js';
|
|
2
|
+
import './chunk-CS37OBE3.js';
|
|
3
|
+
import './chunk-WNIIKCNF.js';
|
|
4
|
+
import './chunk-JFGYT6BI.js';
|
|
5
|
+
//# sourceMappingURL=session-POJUDFPH.js.map
|
|
6
|
+
//# sourceMappingURL=session-POJUDFPH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"session-POJUDFPH.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"session-store-W5RZZHA3.js"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { runAgent } from './chunk-JBXNQCGE.js';
|
|
2
|
+
import './chunk-GGJZA3Q6.js';
|
|
3
|
+
import './chunk-CS37OBE3.js';
|
|
4
|
+
import './chunk-WNIIKCNF.js';
|
|
5
|
+
import './chunk-JFGYT6BI.js';
|
|
6
|
+
|
|
7
|
+
// src/code/stream-json.ts
|
|
8
|
+
var StreamJsonSession = class {
|
|
9
|
+
constructor(emit, auto = false) {
|
|
10
|
+
this.emit = emit;
|
|
11
|
+
this.auto = auto;
|
|
12
|
+
}
|
|
13
|
+
emit;
|
|
14
|
+
auto;
|
|
15
|
+
nextId = 1;
|
|
16
|
+
pending = /* @__PURE__ */ new Map();
|
|
17
|
+
/** The agent's onEvent → one NDJSON line per event. */
|
|
18
|
+
onEvent = (e) => {
|
|
19
|
+
this.emit({ event: "event", ...e });
|
|
20
|
+
};
|
|
21
|
+
/** The agent's approval gate → an approve-request the host answers. */
|
|
22
|
+
approve = (action) => {
|
|
23
|
+
const id = this.nextId++;
|
|
24
|
+
if (this.auto) {
|
|
25
|
+
this.emit({ event: "approve-request", id, action });
|
|
26
|
+
return Promise.resolve(true);
|
|
27
|
+
}
|
|
28
|
+
return new Promise((resolve) => {
|
|
29
|
+
this.pending.set(id, resolve);
|
|
30
|
+
this.emit({ event: "approve-request", id, action });
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
/** Host → agent: resolve a pending approval. Unknown ids are ignored. */
|
|
34
|
+
submitDecision(id, approve) {
|
|
35
|
+
const resolve = this.pending.get(id);
|
|
36
|
+
if (resolve) {
|
|
37
|
+
this.pending.delete(id);
|
|
38
|
+
resolve(approve);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Reject any still-pending approvals (e.g. the host disconnected). */
|
|
42
|
+
cancelPending() {
|
|
43
|
+
for (const resolve of this.pending.values()) resolve(false);
|
|
44
|
+
this.pending.clear();
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
async function runCodeStreamJson(options) {
|
|
48
|
+
const { emit, bindDecisions, auto, ...agentOptions } = options;
|
|
49
|
+
const session = new StreamJsonSession(emit, !!auto);
|
|
50
|
+
bindDecisions?.(session);
|
|
51
|
+
try {
|
|
52
|
+
const result = await runAgent({ ...agentOptions, auto, approve: session.approve, onEvent: session.onEvent });
|
|
53
|
+
emit({ event: "done", result });
|
|
54
|
+
return result;
|
|
55
|
+
} catch (e) {
|
|
56
|
+
emit({ event: "error", message: e.message });
|
|
57
|
+
return null;
|
|
58
|
+
} finally {
|
|
59
|
+
session.cancelPending();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export { StreamJsonSession, runCodeStreamJson };
|
|
64
|
+
//# sourceMappingURL=stream-json-Q2JGWPHB.js.map
|
|
65
|
+
//# sourceMappingURL=stream-json-Q2JGWPHB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/code/stream-json.ts"],"names":[],"mappings":";;;;;;;AA8BO,IAAM,oBAAN,MAAwB;AAAA,EAI7B,WAAA,CACmB,IAAA,EACA,IAAA,GAAO,KAAA,EACxB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAChB;AAAA,EAFgB,IAAA;AAAA,EACA,IAAA;AAAA,EALX,MAAA,GAAS,CAAA;AAAA,EACA,OAAA,uBAAc,GAAA,EAAwC;AAAA;AAAA,EAQ9D,OAAA,GAAU,CAAC,CAAA,KAAwB;AAC1C,IAAA,IAAA,CAAK,KAAK,EAAE,KAAA,EAAO,OAAA,EAAS,GAAG,GAAG,CAAA;AAAA,EACpC,CAAA;AAAA;AAAA,EAGS,OAAA,GAAU,CAAC,MAAA,KAA6C;AAC/D,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,IAAA,CAAK,KAAK,EAAE,KAAA,EAAO,iBAAA,EAAmB,EAAA,EAAI,QAAQ,CAAA;AAClD,MAAA,OAAO,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,IAC7B;AAGA,IAAA,OAAO,IAAI,OAAA,CAAiB,CAAC,OAAA,KAAY;AACvC,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAC5B,MAAA,IAAA,CAAK,KAAK,EAAE,KAAA,EAAO,iBAAA,EAAmB,EAAA,EAAI,QAAQ,CAAA;AAAA,IACpD,CAAC,CAAA;AAAA,EACH,CAAA;AAAA;AAAA,EAGA,cAAA,CAAe,IAAY,OAAA,EAAwB;AACjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,MAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,IACjB;AAAA,EACF;AAAA;AAAA,EAGA,aAAA,GAAsB;AACpB,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAO,UAAW,KAAK,CAAA;AAC1D,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF;AASA,eAAsB,kBAAkB,OAAA,EAAyD;AAC/F,EAAA,MAAM,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,GAAG,cAAa,GAAI,OAAA;AACvD,EAAA,MAAM,UAAU,IAAI,iBAAA,CAAkB,IAAA,EAAM,CAAC,CAAC,IAAI,CAAA;AAClD,EAAA,aAAA,GAAgB,OAAO,CAAA;AACvB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,EAAE,GAAG,YAAA,EAAc,IAAA,EAAM,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAA;AAC3G,IAAA,IAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,CAAA,EAAG;AACV,IAAA,IAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAU,CAAA,CAAY,SAAS,CAAA;AACtD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,aAAA,EAAc;AAAA,EACxB;AACF","file":"stream-json-Q2JGWPHB.js","sourcesContent":["/**\n * Machine-readable event protocol for `vg code --stream-json` (VG-CLI-CODE §18).\n *\n * A host UI (the VS Code VG Code panel) can't drive the agent through the human\n * TTY renderer, so this exposes the agent as a line protocol: every\n * {@link AgentEvent} is emitted as one NDJSON object on stdout, and each\n * approval is a round-trip — an `approve-request` event out, a decision line in.\n * This keeps the governance gate intact across the process boundary (the host's\n * Approve/Reject button fulfils the same `approve` contract the CLI's prompt\n * does — no quick-apply back-door), while the host stays a pure relay.\n *\n * Pure over an injected `emit` + the decision channel, so the protocol is\n * unit-tested without a process, model, or socket.\n */\n\nimport { runAgent, type AgentEvent, type AgentOptions, type AgentResult } from './agent.js';\nimport type { MutatingAction } from './tools.js';\n\n/** A single line written to the host. Discriminated by `event`. */\nexport type StreamJsonOut =\n | ({ event: 'event' } & AgentEvent)\n | { event: 'approve-request'; id: number; action: MutatingAction }\n | { event: 'done'; result: AgentResult }\n | { event: 'error'; message: string };\n\n/**\n * Owns the NDJSON protocol for one run: serializes agent events, and turns each\n * approval into an `approve-request` the host answers via {@link submitDecision}.\n * Under `auto`, approvals resolve true immediately (still announced, for the log).\n */\nexport class StreamJsonSession {\n private nextId = 1;\n private readonly pending = new Map<number, (approve: boolean) => void>();\n\n constructor(\n private readonly emit: (line: StreamJsonOut) => void,\n private readonly auto = false,\n ) {}\n\n /** The agent's onEvent → one NDJSON line per event. */\n readonly onEvent = (e: AgentEvent): void => {\n this.emit({ event: 'event', ...e });\n };\n\n /** The agent's approval gate → an approve-request the host answers. */\n readonly approve = (action: MutatingAction): Promise<boolean> => {\n const id = this.nextId++;\n if (this.auto) {\n this.emit({ event: 'approve-request', id, action });\n return Promise.resolve(true);\n }\n // Register the resolver BEFORE emitting, so a host that answers synchronously\n // (or very fast) can't have its decision arrive before we're listening.\n return new Promise<boolean>((resolve) => {\n this.pending.set(id, resolve);\n this.emit({ event: 'approve-request', id, action });\n });\n };\n\n /** Host → agent: resolve a pending approval. Unknown ids are ignored. */\n submitDecision(id: number, approve: boolean): void {\n const resolve = this.pending.get(id);\n if (resolve) {\n this.pending.delete(id);\n resolve(approve);\n }\n }\n\n /** Reject any still-pending approvals (e.g. the host disconnected). */\n cancelPending(): void {\n for (const resolve of this.pending.values()) resolve(false);\n this.pending.clear();\n }\n}\n\nexport interface StreamJsonOptions extends Omit<AgentOptions, 'approve' | 'onEvent'> {\n emit: (line: StreamJsonOut) => void;\n /** Register the stdin decision reader; the returned session accepts decisions. */\n bindDecisions?: (session: StreamJsonSession) => void;\n}\n\n/** Run the agent under the NDJSON protocol; always emits a terminal `done`/`error`. */\nexport async function runCodeStreamJson(options: StreamJsonOptions): Promise<AgentResult | null> {\n const { emit, bindDecisions, auto, ...agentOptions } = options;\n const session = new StreamJsonSession(emit, !!auto);\n bindDecisions?.(session);\n try {\n const result = await runAgent({ ...agentOptions, auto, approve: session.approve, onEvent: session.onEvent });\n emit({ event: 'done', result });\n return result;\n } catch (e) {\n emit({ event: 'error', message: (e as Error).message });\n return null;\n } finally {\n session.cancelPending();\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"ui-HOVOPWMX.js"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibgrate/cli",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.722.2",
|
|
4
4
|
"description": "vg — local codebase intelligence CLI + MCP server for AI coding agents: deterministic code graph, drift reporting, and version-correct library docs (Apache-2.0)",
|
|
5
5
|
"//mcpName": "Official MCP registry ownership proof: the registry fetches the published npm package and requires this field to match the com.vibgrate/ai-context server entry (see docs/marketing/mcp-registry/README.md). Must ship in the published @vibgrate/cli package.json.",
|
|
6
6
|
"mcpName": "com.vibgrate/ai-context",
|