@vibgrate/cli 2026.819.1 → 2026.819.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 +3 -3
- package/dist/agent-ZJRWCMR6.js +30 -0
- package/dist/{agent-3CKNTCRX.js.map → agent-ZJRWCMR6.js.map} +1 -1
- package/dist/{approvals-DHTG3HI4.js → approvals-YTUXBZWQ.js} +7 -7
- package/dist/{approvals-DHTG3HI4.js.map → approvals-YTUXBZWQ.js.map} +1 -1
- package/dist/attach-WOA25VNH.js +10 -0
- package/dist/{attach-OCQ3I76L.js.map → attach-WOA25VNH.js.map} +1 -1
- package/dist/baseline-TVRRUZGA.js +9 -0
- package/dist/{baseline-QDC6OQ2X.js.map → baseline-TVRRUZGA.js.map} +1 -1
- package/dist/{chunk-NWWLUFN5.js → chunk-24HKTTFV.js} +5 -5
- package/dist/{chunk-NWWLUFN5.js.map → chunk-24HKTTFV.js.map} +1 -1
- package/dist/{chunk-FFY6NW7P.js → chunk-2C4QT5D7.js} +5 -5
- package/dist/{chunk-FFY6NW7P.js.map → chunk-2C4QT5D7.js.map} +1 -1
- package/dist/{chunk-WJYJCDNY.js → chunk-2ZBLZ2S3.js} +13 -13
- package/dist/{chunk-WJYJCDNY.js.map → chunk-2ZBLZ2S3.js.map} +1 -1
- package/dist/{chunk-OV4KGXPD.js → chunk-57ZRSCHY.js} +3 -3
- package/dist/{chunk-OV4KGXPD.js.map → chunk-57ZRSCHY.js.map} +1 -1
- package/dist/{chunk-NDNNOAS6.js → chunk-6H2QV5DR.js} +3 -3
- package/dist/{chunk-NDNNOAS6.js.map → chunk-6H2QV5DR.js.map} +1 -1
- package/dist/{chunk-QMRSCJUN.js → chunk-7BSUPHX6.js} +3 -3
- package/dist/{chunk-QMRSCJUN.js.map → chunk-7BSUPHX6.js.map} +1 -1
- package/dist/{chunk-LJSJX6U4.js → chunk-A3WWRW7U.js} +3 -3
- package/dist/{chunk-LJSJX6U4.js.map → chunk-A3WWRW7U.js.map} +1 -1
- package/dist/{chunk-D44PGMH7.js → chunk-AP3JN33O.js} +12 -12
- package/dist/{chunk-D44PGMH7.js.map → chunk-AP3JN33O.js.map} +1 -1
- package/dist/{chunk-VYSDR2QE.js → chunk-AQZYDFEK.js} +4 -4
- package/dist/{chunk-VYSDR2QE.js.map → chunk-AQZYDFEK.js.map} +1 -1
- package/dist/{chunk-F46Q3AEI.js → chunk-BQ6NTRRK.js} +44 -15
- package/dist/chunk-BQ6NTRRK.js.map +1 -0
- package/dist/{chunk-YIEP5GK5.js → chunk-C2EZIAA3.js} +15 -11
- package/dist/chunk-C2EZIAA3.js.map +1 -0
- package/dist/{chunk-6F52QR6F.js → chunk-CA4YQBA7.js} +4 -4
- package/dist/{chunk-6F52QR6F.js.map → chunk-CA4YQBA7.js.map} +1 -1
- package/dist/{chunk-5O6O7DJH.js → chunk-CBL3VY7J.js} +3 -3
- package/dist/{chunk-5O6O7DJH.js.map → chunk-CBL3VY7J.js.map} +1 -1
- package/dist/{chunk-FQVAQVJV.js → chunk-FCMWHSQ6.js} +3 -3
- package/dist/{chunk-FQVAQVJV.js.map → chunk-FCMWHSQ6.js.map} +1 -1
- package/dist/{chunk-OQT3JBWW.js → chunk-GBXOAO5V.js} +167 -28
- package/dist/chunk-GBXOAO5V.js.map +1 -0
- package/dist/{chunk-JFE7XCAE.js → chunk-IASO2HCI.js} +3 -3
- package/dist/{chunk-JFE7XCAE.js.map → chunk-IASO2HCI.js.map} +1 -1
- package/dist/{chunk-D33M2ARL.js → chunk-IMI2VHHZ.js} +3 -3
- package/dist/{chunk-D33M2ARL.js.map → chunk-IMI2VHHZ.js.map} +1 -1
- package/dist/{chunk-QSLVOVNZ.js → chunk-JPOYXG7Z.js} +10 -10
- package/dist/{chunk-QSLVOVNZ.js.map → chunk-JPOYXG7Z.js.map} +1 -1
- package/dist/{chunk-KFEM6FWP.js → chunk-MMJFHEZ4.js} +4 -4
- package/dist/{chunk-KFEM6FWP.js.map → chunk-MMJFHEZ4.js.map} +1 -1
- package/dist/{chunk-JGBOYZAF.js → chunk-NKKOGJ63.js} +35 -17
- package/dist/chunk-NKKOGJ63.js.map +1 -0
- package/dist/{chunk-7AVYKZEM.js → chunk-NV7XNBX4.js} +4 -4
- package/dist/{chunk-7AVYKZEM.js.map → chunk-NV7XNBX4.js.map} +1 -1
- package/dist/{chunk-4VAA2XSM.js → chunk-OGFOJG4H.js} +6 -6
- package/dist/{chunk-4VAA2XSM.js.map → chunk-OGFOJG4H.js.map} +1 -1
- package/dist/{chunk-NZELMYT4.js → chunk-OLIMW4PQ.js} +8 -56
- package/dist/chunk-OLIMW4PQ.js.map +1 -0
- package/dist/{chunk-EMEMHNE3.js → chunk-PJRPSYFQ.js} +6 -6
- package/dist/{chunk-EMEMHNE3.js.map → chunk-PJRPSYFQ.js.map} +1 -1
- package/dist/{chunk-EI5AKDSC.js → chunk-QE6F62FR.js} +3 -3
- package/dist/{chunk-EI5AKDSC.js.map → chunk-QE6F62FR.js.map} +1 -1
- package/dist/{chunk-5XY4EFR7.js → chunk-R5TQBIR6.js} +3 -3
- package/dist/{chunk-5XY4EFR7.js.map → chunk-R5TQBIR6.js.map} +1 -1
- package/dist/{chunk-TS7STRMI.js → chunk-RTURQXQL.js} +4 -4
- package/dist/{chunk-TS7STRMI.js.map → chunk-RTURQXQL.js.map} +1 -1
- package/dist/{chunk-74UBGF4P.js → chunk-SHD5TCZ5.js} +3 -3
- package/dist/{chunk-74UBGF4P.js.map → chunk-SHD5TCZ5.js.map} +1 -1
- package/dist/{chunk-O5ASXWKF.js → chunk-USPMMVNH.js} +3 -3
- package/dist/{chunk-O5ASXWKF.js.map → chunk-USPMMVNH.js.map} +1 -1
- package/dist/{chunk-E53WBVUQ.js → chunk-VHRSG6CF.js} +3 -3
- package/dist/{chunk-E53WBVUQ.js.map → chunk-VHRSG6CF.js.map} +1 -1
- package/dist/{chunk-I5LP55B6.js → chunk-W44THEXF.js} +3 -3
- package/dist/{chunk-I5LP55B6.js.map → chunk-W44THEXF.js.map} +1 -1
- package/dist/{chunk-EIESBKLW.js → chunk-W6ASIMG5.js} +7 -7
- package/dist/{chunk-EIESBKLW.js.map → chunk-W6ASIMG5.js.map} +1 -1
- package/dist/{chunk-CQDUBAQY.js → chunk-WNKGRXUA.js} +3 -3
- package/dist/{chunk-CQDUBAQY.js.map → chunk-WNKGRXUA.js.map} +1 -1
- package/dist/{chunk-KKQX3F5F.js → chunk-WPLOEFZU.js} +7 -5
- package/dist/chunk-WPLOEFZU.js.map +1 -0
- package/dist/{chunk-FJG5AXKZ.js → chunk-WUFIXAEJ.js} +22 -6
- package/dist/chunk-WUFIXAEJ.js.map +1 -0
- package/dist/{chunk-TS25WFAT.js → chunk-XLQ4YHS3.js} +9 -9
- package/dist/{chunk-TS25WFAT.js.map → chunk-XLQ4YHS3.js.map} +1 -1
- package/dist/{chunk-BWPBB45M.js → chunk-XP6UUCZZ.js} +3 -3
- package/dist/{chunk-BWPBB45M.js.map → chunk-XP6UUCZZ.js.map} +1 -1
- package/dist/{chunk-BPF3YX2U.js → chunk-XQNKCA2J.js} +6 -3
- package/dist/chunk-XQNKCA2J.js.map +1 -0
- package/dist/{chunk-U7A7D2HP.js → chunk-XW2XQM3C.js} +7 -7
- package/dist/{chunk-U7A7D2HP.js.map → chunk-XW2XQM3C.js.map} +1 -1
- package/dist/{chunk-7N4Y3E47.js → chunk-YJYEPYB2.js} +13 -18
- package/dist/chunk-YJYEPYB2.js.map +1 -0
- package/dist/chunk-ZUZHYAJK.js +6 -0
- package/dist/{chunk-DHU3OOEI.js.map → chunk-ZUZHYAJK.js.map} +1 -1
- package/dist/cli.js +104 -94
- package/dist/cli.js.map +1 -1
- package/dist/client-P5XSRFV4.js +8 -0
- package/dist/{client-UQIELEEZ.js.map → client-P5XSRFV4.js.map} +1 -1
- package/dist/{daemon-UNL65PTP.js → daemon-YKOEP3XA.js} +14 -14
- package/dist/{daemon-UNL65PTP.js.map → daemon-YKOEP3XA.js.map} +1 -1
- package/dist/embed-worker-main.js +5 -5
- package/dist/ensure-map-BLRJDO2Y.js +40 -0
- package/dist/{ensure-map-4D2HJ6MA.js.map → ensure-map-BLRJDO2Y.js.map} +1 -1
- package/dist/{federation-SZYVHYB2.js → federation-M4ZNXOPX.js} +5 -5
- package/dist/{federation-SZYVHYB2.js.map → federation-M4ZNXOPX.js.map} +1 -1
- package/dist/git-ref-LMT3EXYY.js +4 -0
- package/dist/{git-ref-RSRAN4OH.js.map → git-ref-LMT3EXYY.js.map} +1 -1
- package/dist/graph-backend-NTYONTWW.js +16 -0
- package/dist/{graph-backend-36EIAAPQ.js.map → graph-backend-NTYONTWW.js.map} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +23 -23
- package/dist/{interactive-ZZMHSZ3W.js → interactive-B3WTC7LB.js} +40 -40
- package/dist/{interactive-ZZMHSZ3W.js.map → interactive-B3WTC7LB.js.map} +1 -1
- package/dist/{llm-host-XFYFOAAX.js → llm-host-QVTJJVER.js} +5 -5
- package/dist/{llm-host-XFYFOAAX.js.map → llm-host-QVTJJVER.js.map} +1 -1
- package/dist/load-AJROS77R.js +11 -0
- package/dist/{load-6CYLMUT5.js.map → load-AJROS77R.js.map} +1 -1
- package/dist/local-runtime-GA43KYS5.js +6 -0
- package/dist/{local-runtime-6SNWKSA7.js.map → local-runtime-GA43KYS5.js.map} +1 -1
- package/dist/model-manager-6H3TMZKK.js +10 -0
- package/dist/{model-manager-SXHZ5VD4.js.map → model-manager-6H3TMZKK.js.map} +1 -1
- package/dist/{model-orchestrator-LHYPJBFH.js → model-orchestrator-X3NE3Y2G.js} +6 -6
- package/dist/{model-orchestrator-LHYPJBFH.js.map → model-orchestrator-X3NE3Y2G.js.map} +1 -1
- package/dist/parse-worker.js +2 -2
- package/dist/{paths-62AKTFSR.js → paths-RVK6FKRN.js} +4 -4
- package/dist/{paths-62AKTFSR.js.map → paths-RVK6FKRN.js.map} +1 -1
- package/dist/publish-27S66NOW.js +9 -0
- package/dist/{publish-7YHRTBRA.js.map → publish-27S66NOW.js.map} +1 -1
- package/dist/resolve-gguf-WVKVDN45.js +9 -0
- package/dist/{resolve-gguf-SDIYGGI6.js.map → resolve-gguf-WVKVDN45.js.map} +1 -1
- package/dist/{run-outcome-ADEAKXHH.js → run-outcome-SBBSTSH3.js} +7 -7
- package/dist/{run-outcome-ADEAKXHH.js.map → run-outcome-SBBSTSH3.js.map} +1 -1
- package/dist/runtime-session-JYYKQVDX.js +26 -0
- package/dist/{runtime-session-VNSXQAEO.js.map → runtime-session-JYYKQVDX.js.map} +1 -1
- package/dist/session-2ZMHZ2O6.js +17 -0
- package/dist/{session-3A6LKJHD.js.map → session-2ZMHZ2O6.js.map} +1 -1
- package/dist/{slot-subscription-25GOARW5.js → slot-subscription-C2ZUJED6.js} +5 -5
- package/dist/{slot-subscription-25GOARW5.js.map → slot-subscription-C2ZUJED6.js.map} +1 -1
- package/dist/{stream-json-S2TP2VPU.js → stream-json-ZWGB4C47.js} +17 -17
- package/dist/{stream-json-S2TP2VPU.js.map → stream-json-ZWGB4C47.js.map} +1 -1
- package/dist/version-5QIEUXU6.js +4 -0
- package/dist/{version-SZI6I3A2.js.map → version-5QIEUXU6.js.map} +1 -1
- package/dist/{vg-mcp-bridge-IIBEAOEB.js → vg-mcp-bridge-4FETMJ6M.js} +14 -14
- package/dist/{vg-mcp-bridge-IIBEAOEB.js.map → vg-mcp-bridge-4FETMJ6M.js.map} +1 -1
- package/dist/{vgd-KGXIKGOS.js → vgd-R524P5BJ.js} +13 -13
- package/dist/vgd-R524P5BJ.js.map +1 -0
- package/package.json +1 -1
- package/dist/agent-3CKNTCRX.js +0 -30
- package/dist/attach-OCQ3I76L.js +0 -10
- package/dist/baseline-QDC6OQ2X.js +0 -9
- package/dist/chunk-7N4Y3E47.js.map +0 -1
- package/dist/chunk-BPF3YX2U.js.map +0 -1
- package/dist/chunk-DHU3OOEI.js +0 -6
- package/dist/chunk-F46Q3AEI.js.map +0 -1
- package/dist/chunk-FJG5AXKZ.js.map +0 -1
- package/dist/chunk-JGBOYZAF.js.map +0 -1
- package/dist/chunk-KKQX3F5F.js.map +0 -1
- package/dist/chunk-NZELMYT4.js.map +0 -1
- package/dist/chunk-OQT3JBWW.js.map +0 -1
- package/dist/chunk-YIEP5GK5.js.map +0 -1
- package/dist/client-UQIELEEZ.js +0 -8
- package/dist/ensure-map-4D2HJ6MA.js +0 -40
- package/dist/git-ref-RSRAN4OH.js +0 -4
- package/dist/graph-backend-36EIAAPQ.js +0 -16
- package/dist/load-6CYLMUT5.js +0 -11
- package/dist/local-runtime-6SNWKSA7.js +0 -6
- package/dist/model-manager-SXHZ5VD4.js +0 -10
- package/dist/publish-7YHRTBRA.js +0 -9
- package/dist/resolve-gguf-SDIYGGI6.js +0 -9
- package/dist/runtime-session-VNSXQAEO.js +0 -26
- package/dist/session-3A6LKJHD.js +0 -17
- package/dist/version-SZI6I3A2.js +0 -4
- package/dist/vgd-KGXIKGOS.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/util.ts","../src/commands/daemon.ts"],"names":["path","loadGraph","c","pid"],"mappings":"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","file":"chunk-JGBOYZAF.js","sourcesContent":["import * as path from 'node:path';\nimport { loadGraph } from '../engine/load.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport type { GlobalOpts } from '../cli-options.js';\nimport type { VgGraph } from '../schema.js';\n\nexport function rootOf(global: GlobalOpts): string {\n return path.resolve(global.cwd ?? '.');\n}\n\n/** Load the committed graph, or fail with an actionable NOT_FOUND error. */\nexport function requireGraph(global: GlobalOpts): { root: string; graph: VgGraph } {\n const root = rootOf(global);\n const graph = loadGraph(root, global.graph);\n if (!graph) {\n throw new CliError(\n `no map found — run \\`vg\\` to build one first` +\n (global.graph ? ` (looked at ${global.graph})` : ''),\n ExitCode.NOT_FOUND,\n );\n }\n return { root, graph };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { Command } from 'commander';\nimport * as semver from 'semver';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { VERSION } from '../version.js';\nimport { startVgdServer, vgdIsRunning, vgdPidPath, vgdRequest, vgdSocketPath, VGD_PROTOCOL_VERSION } from '../runtime/vgd/index.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { reinvokeCli } from '../util/cli-invocation.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg daemon` — lightweight local Fusion Runtime daemon (`vgd`) prototype.\n *\n * Phase 2 slice: local socket + workspace registry. Interactive `vg code`\n * attaches via `startCodeRuntimeSession` (ensures this standalone daemon).\n * No overlays yet. Safe to start/stop; does not mutate repos.\n */\nexport function registerDaemon(program: Command): void {\n const cmd = program\n .command('daemon')\n .description('local Fusion Runtime daemon (vgd) — workspace registry prototype')\n .option('--socket <path>', 'override the daemon socket path');\n\n const status = cmd\n .command('status')\n .description('show whether vgd is running and how many workspaces it tracks')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const running = await vgdIsRunning({ socketPath });\n if (!running) {\n if (global.json) {\n json({ running: false, socketPath, version: VGD_PROTOCOL_VERSION });\n } else {\n info(c.dim(`vgd · not running (${socketPath})`));\n }\n process.exitCode = ExitCode.NOT_FOUND;\n return;\n }\n const res = await vgdRequest({ op: 'status' }, { socketPath });\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n // \"Warm\" used to mean the code map only, while every client still loaded\n // its own embedder — so the semantic state is reported next to the graph\n // slots rather than left to be inferred.\n const semantic = await vgdRequest({ op: 'embed-status' }, { socketPath }).catch(() => null);\n const semanticPayload = semantic && semantic.ok && 'semantic' in semantic ? semantic.semantic : undefined;\n const skew = await vgdVersionSkew(socketPath);\n if (global.json) json({ running: true, ...res, semantic: semanticPayload, skew });\n else if ('pid' in res) {\n const slots = typeof res.graphSlots === 'number' ? ` · ${res.graphSlots} graph slot(s)` : '';\n // Always print the build, even when the daemon is too old to report one\n // — a blank where the version should be is what made this skew\n // invisible in the first place.\n const cli = ` · cli ${describeVersion(res.cliVersion ?? null)}`;\n info(\n `vgd · running pid ${res.pid}${cli} · ${res.workspaces} workspace(s)${slots} · ${res.uptimeMs}ms up · ${c.dim(res.socketPath)}`,\n );\n if (skew.running && skew.state !== 'match') {\n const verb = skew.state === 'older' ? 'older than' : 'newer than';\n info(\n c.dim(\n ` ⚠ this daemon is ${verb} the CLI you just ran (${VERSION})` +\n (skew.state === 'older' ? ' — run \"vg daemon restart --force\" to bring it up to date' : ''),\n ),\n );\n }\n const fresh = 'freshness' in res && Array.isArray(res.freshness) ? res.freshness : [];\n if (fresh.length) {\n const watching = fresh.filter((f) => f.watching).length;\n const building = fresh.filter((f) => f.building);\n const pending = fresh.reduce((n, f) => n + f.pending, 0);\n const detail = [\n `${watching}/${fresh.length} watched`,\n building.length ? `${building.length} rebuilding` : '',\n pending ? `${pending} change(s) pending` : '',\n ]\n .filter(Boolean)\n .join(' · ');\n info(` freshness · ${detail}`);\n for (const f of fresh) {\n if (f.watching && !f.building && !f.pending) continue;\n const state = f.building ? 'rebuilding' : f.watching ? `${f.pending} pending` : 'not watched (no recursive fs.watch here)';\n info(c.dim(` ${f.repositoryId}@${f.gitRef} · ${state}`));\n }\n }\n if (semanticPayload) {\n const ready = semanticPayload.slots.filter((sl) => sl.state === 'ready');\n const vectors = ready.reduce((n, sl) => n + sl.vectors, 0);\n // \"worker stopped · 0/0 index(es)\" reads like a broken daemon when\n // it usually means nobody has published a map yet — the index is\n // slot-scoped, so no graph slot means there is nothing to index.\n const detail =\n semanticPayload.worker === 'unavailable'\n ? c.dim(semanticPayload.reason ?? 'semantic off — lexical only')\n : semanticPayload.slots.length === 0\n ? c.dim('no map published yet — run `vg build` in a repo (the index follows the graph slot)')\n : `${ready.length}/${semanticPayload.slots.length} index(es) ready · ${vectors} vector(s)` +\n (semanticPayload.model ? ` · ${semanticPayload.model}` : '');\n info(` semantic · worker ${semanticPayload.worker} · ${detail}`);\n for (const sl of semanticPayload.slots) {\n if (sl.state === 'ready') continue;\n const pending = typeof sl.pending === 'number' && sl.pending > 0 ? ` · ${sl.pending} pending` : '';\n info(\n c.dim(` ${sl.repositoryId}@${sl.gitRef} · ${sl.state}${pending}${sl.error ? ` — ${sl.error}` : ''}`),\n );\n }\n }\n }\n });\n applyGlobalOptions(status);\n\n const start = cmd\n .command('start')\n .description('run vgd in the foreground (Ctrl-C to stop)')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n if (await vgdIsRunning({ socketPath })) {\n throw new CliError(`vgd is already running at ${socketPath}`, ExitCode.ERROR);\n }\n // The shutdown closure needs the server; the server needs the hook.\n // Bridge with a mutable ref so `vg daemon stop` can reach us.\n let requestShutdown: () => void = () => {};\n const server = await startVgdServer({\n socketPath,\n onShutdownRequest: () => requestShutdown(),\n // Show the daemon working: graph publishes, branch switches, new repos,\n // and every semantic index build. Silent under --quiet/--json.\n log: global.quiet || global.json ? undefined : (message) => info(c.dim(`vgd · ${message}`)),\n });\n if (!global.quiet) {\n info(`vgd · listening on ${c.dim(server.socketPath)} (${VGD_PROTOCOL_VERSION})`);\n info(c.dim(' register a workspace: vg daemon register'));\n info(c.dim(' status: vg daemon status'));\n }\n\n const shutdown = async (): Promise<void> => {\n await server.close();\n if (!global.quiet) info(c.dim('vgd · stopped'));\n process.exit(0);\n };\n requestShutdown = () => void shutdown();\n process.on('SIGINT', () => void shutdown());\n process.on('SIGTERM', () => void shutdown());\n // Keep the event loop alive until signal.\n await new Promise(() => {});\n });\n applyGlobalOptions(start);\n\n /**\n * Idempotent start for host UIs (VS Code) and agents: if vgd is already\n * listening, exit 0; otherwise spawn a detached background `daemon start`.\n */\n const ensure = cmd\n .command('ensure')\n .description('ensure vgd is running on this build (start or replace in background if needed)')\n .option('--allow-version-mismatch', 'attach to an older running vgd instead of replacing it')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const opts = this.opts() as { allowVersionMismatch?: boolean };\n const ensured = await ensureVgd(socketPath, { allowVersionMismatch: opts.allowVersionMismatch });\n const res = await vgdRequest({ op: 'status' }, { socketPath });\n if (!res.ok) {\n throw new CliError(\n ensured.started\n ? `vgd started (pid ${ensured.pid ?? '?'}) but status failed: ${res.error} (${socketPath})`\n : `vgd is running but status failed: ${res.error} (${socketPath})`,\n ExitCode.ERROR,\n );\n }\n if (global.json) {\n json({ running: true, ensured: ensured.started, replaced: ensured.replaced ?? null, ...res });\n } else if (!global.quiet) {\n const pid = 'pid' in res ? res.pid : ensured.pid;\n if (ensured.replaced) {\n info(\n `vgd · replaced ${describeVersion(ensured.replaced.version)} daemon with ${VERSION} · pid ${pid} · ${c.dim(socketPath)}`,\n );\n } else {\n info(\n ensured.started\n ? `vgd · started in background pid ${pid} · ${c.dim(socketPath)}`\n : `vgd · already running pid ${pid} · ${c.dim(socketPath)}`,\n );\n }\n }\n });\n applyGlobalOptions(ensure);\n\n const stop = cmd\n .command('stop')\n .description('stop the running vgd (idempotent — succeeds if none is running)')\n .option('--force', 'escalate to SIGTERM/SIGKILL if it will not stop politely')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const force = Boolean((this.opts() as { force?: boolean }).force);\n const result = await stopVgd(socketPath, { force });\n if (global.json) {\n json({ stopped: result === 'stopped', result, socketPath });\n } else if (!global.quiet) {\n if (result === 'stopped') info(`vgd · stopped ${c.dim(socketPath)}`);\n else if (result === 'not-running') info(c.dim(`vgd · not running (${socketPath})`));\n }\n if (result === 'refused') {\n throw new CliError(\n 'this vgd cannot be stopped remotely — it is running inside another process; stop that process instead',\n ExitCode.ERROR,\n );\n }\n if (result === 'failed') {\n throw new CliError(\n `vgd did not stop within 5s (${socketPath}) — retry with \\`vg daemon stop --force\\` to escalate to a signal`,\n ExitCode.ERROR,\n );\n }\n });\n applyGlobalOptions(stop);\n\n const restart = cmd\n .command('restart')\n .description('restart vgd (stop if running, then start in the background)')\n .option('--force', 'escalate to SIGTERM/SIGKILL if it will not stop politely')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const force = Boolean((this.opts() as { force?: boolean }).force);\n const stopResult = await stopVgd(socketPath, { force });\n if (stopResult === 'refused') {\n throw new CliError(\n 'this vgd cannot be stopped remotely — it is running inside another process; stop that process instead',\n ExitCode.ERROR,\n );\n }\n if (stopResult === 'failed') {\n throw new CliError(\n `vgd did not stop within 5s (${socketPath}) — retry with \\`vg daemon restart --force\\` to escalate to a signal`,\n ExitCode.ERROR,\n );\n }\n await startDetachedVgd(socketPath);\n const res = await vgdRequest({ op: 'status' }, { socketPath });\n if (global.json) {\n json({ running: true, restarted: true, ...(res.ok ? res : { socketPath }) });\n } else if (!global.quiet) {\n const pid = res.ok && 'pid' in res ? res.pid : '?';\n info(`vgd · restarted pid ${pid} · ${c.dim(socketPath)}`);\n }\n });\n applyGlobalOptions(restart);\n\n const register = cmd\n .command('register')\n .description('register the current repository with a running vgd')\n .argument('[root]', 'repository root (default: cwd)')\n .action(async function (this: Command, rootArg?: string) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const root = path.resolve(rootArg ?? rootOf(global));\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running — start it with \\`vg daemon start\\` (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const res = await vgdRequest({ op: 'register', root }, { socketPath });\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('workspace' in res) {\n info(`vgd · registered ${res.workspace.root}`);\n info(c.dim(` id ${res.workspace.id}`));\n info(c.dim(` graph ${res.workspace.graphPath}`));\n }\n });\n applyGlobalOptions(register);\n\n const list = cmd\n .command('list')\n .description('list workspaces registered with the running vgd')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const res = await vgdRequest({ op: 'list' }, { socketPath });\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('workspaces' in res && Array.isArray(res.workspaces)) {\n if (res.workspaces.length === 0) info(c.dim('vgd · no workspaces registered'));\n for (const w of res.workspaces) {\n const tag = w.label ? ` (${w.label}${w.role ? `/${w.role}` : ''})` : '';\n info(`${w.root}${tag}`);\n info(c.dim(` id ${w.id} · graph ${w.graphPath}`));\n }\n }\n });\n applyGlobalOptions(list);\n\n const federation = cmd\n .command('federation')\n .description('register a multi-root federation from .vibgrate/federation.json (or primary cwd)')\n .argument('[root]', 'primary repository root (default: cwd)')\n .action(async function (this: Command, rootArg?: string) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const primary = path.resolve(rootArg ?? rootOf(global));\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running — start it with \\`vg daemon start\\` (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const { loadFederation } = await import('../runtime/federation.js');\n const fed = loadFederation(primary);\n if (!fed) throw new CliError(`could not load federation for ${primary}`, ExitCode.ERROR);\n const res = await vgdRequest(\n {\n op: 'register-federation',\n primaryRoot: fed.primaryRoot,\n members: fed.members.map((m) => ({ root: m.root, label: m.label, role: m.role })),\n },\n { socketPath },\n );\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('workspaces' in res && Array.isArray(res.workspaces)) {\n info(`vgd · federation registered (${res.workspaces.length} workspace(s))`);\n for (const w of res.workspaces) {\n info(c.dim(` ${w.label ?? w.root}${w.role ? ` [${w.role}]` : ''}`));\n }\n }\n });\n applyGlobalOptions(federation);\n\n /**\n * Load the on-disk code map for a workspace into vgd's ActiveGraph cache so\n * query/impact work without an agent put-graph first (VS Code / IDE path).\n */\n const publish = cmd\n .command('publish')\n .description('load the workspace code map into vgd ActiveGraph (from global/legacy store)')\n .argument('[root]', 'repository root (default: cwd)')\n .option('--git-ref <ref>', 'branch or SHA (default: detect HEAD)')\n .action(async function (this: Command, rootArg?: string) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const root = path.resolve(rootArg ?? rootOf(global));\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running — start it with \\`vg daemon ensure\\` (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const opts = this.opts() as { gitRef?: string };\n // Fast path: the daemon loads the map from disk itself (binary snapshot\n // first) — nothing heavy crosses the socket.\n const loaded = await vgdRequest(\n { op: 'load-graph', root, gitRef: opts.gitRef?.trim() || undefined, graphPath: global.graph },\n { socketPath },\n );\n let put = loaded;\n if (!loaded.ok && loaded.code === 'no_map') {\n throw new CliError(loaded.error, ExitCode.NOT_FOUND);\n }\n if (!loaded.ok) {\n // Older daemon without load-graph — legacy path: load locally and ship\n // the graph over the socket with put-graph.\n const { loadGraph } = await import('../engine/load.js');\n const { detectGitRef } = await import('../runtime/git-ref.js');\n const { repositoryIdFromRoot } = await import('../runtime/paths.js');\n const graph = loadGraph(root, global.graph);\n if (!graph) {\n throw new CliError(\n `no code map found for ${root} — run \\`vg build\\` (or bare \\`vg\\`) first`,\n ExitCode.NOT_FOUND,\n );\n }\n // Ensure workspace is registered so list shows the root.\n const reg = await vgdRequest({ op: 'register', root }, { socketPath });\n if (!reg.ok) throw new CliError(reg.error, ExitCode.ERROR);\n const git = opts.gitRef?.trim() || detectGitRef(root).ref || 'HEAD';\n const repositoryId =\n reg.ok && 'workspace' in reg ? reg.workspace.id : repositoryIdFromRoot(root);\n put = await vgdRequest(\n { op: 'put-graph', repositoryId, gitRef: git, graph },\n { socketPath },\n );\n if (!put.ok) throw new CliError(put.error, ExitCode.ERROR);\n }\n if (global.json) json(put);\n else if (put.ok && 'stored' in put) {\n info(`vgd · published graph · ${put.nodeCount} node(s) · ref ${put.gitRef}`);\n info(c.dim(` repositoryId ${put.repositoryId}`));\n }\n });\n applyGlobalOptions(publish);\n\n const query = cmd\n .command('query')\n .description('query the ActiveGraph held by vgd (lexical/structural)')\n .option('--repository-id <id>', 'repository id from `vg daemon list` (default: cwd workspace)')\n .argument('<query...>', 'what to find')\n .option('--limit <n>', 'max matches', '12')\n .option('--git-ref <ref>', 'branch or SHA (default: current slot)')\n .action(async function (this: Command, queryParts: string[]) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const opts = this.opts() as { repositoryId?: string; limit?: string; gitRef?: string };\n const q = (queryParts ?? []).join(' ').trim();\n if (!q) throw new CliError('say what to find', ExitCode.USAGE_ERROR);\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const repositoryId = opts.repositoryId?.trim() || (await repositoryIdForCwd(socketPath, rootOf(global)));\n const res = await vgdRequest(\n {\n op: 'query-graph',\n repositoryId,\n query: q,\n limit: opts.limit ? Number(opts.limit) : 12,\n gitRef: opts.gitRef,\n },\n { socketPath },\n );\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('matches' in res) {\n info(`vgd query · ${res.matches.length} match(es) · ref ${res.gitRef}`);\n for (const m of res.matches) {\n info(`${m.qualifiedName} (${m.kind}) ${m.file}:${m.line}`);\n info(c.dim(` score ${m.score} · ${m.why}`));\n }\n }\n });\n applyGlobalOptions(query);\n\n const impact = cmd\n .command('impact')\n .description('blast radius for a symbol in the vgd ActiveGraph')\n .option('--repository-id <id>', 'repository id (default: cwd workspace)')\n .argument('<symbol>', 'symbol id or qualified name')\n .option('--depth <n>', 'max dependency depth', '4')\n .option('--git-ref <ref>', 'branch or SHA')\n .action(async function (this: Command, symbol: string) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const opts = this.opts() as { repositoryId?: string; depth?: string; gitRef?: string };\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const repositoryId = opts.repositoryId?.trim() || (await repositoryIdForCwd(socketPath, rootOf(global)));\n const res = await vgdRequest(\n {\n op: 'impact-of',\n repositoryId,\n symbol: symbol.trim(),\n depth: opts.depth ? Number(opts.depth) : 4,\n gitRef: opts.gitRef,\n },\n { socketPath },\n );\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('affected' in res) {\n info(`vgd impact · ${res.root.name} · depth ${res.depth} · ${res.affected.length} affected`);\n for (const a of res.affected.slice(0, 30)) {\n info(`- ${a.name} (${a.file}:${a.line}) d=${a.depth}`);\n }\n }\n });\n applyGlobalOptions(impact);\n\n const graphs = cmd\n .command('graphs')\n .description('list multi-branch ActiveGraph slots resident in the running vgd (Fusion §4.1.1)')\n .option('--repository-id <id>', 'filter slots to one repository id')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const opts = this.opts() as { repositoryId?: string };\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const res = await vgdRequest(\n { op: 'list-graph-slots', repositoryId: opts.repositoryId },\n { socketPath },\n );\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('slots' in res) {\n if (!res.slots.length) info(c.dim('vgd · no graph slots resident'));\n for (const s of res.slots) {\n const cur = s.current ? c.green(' current') : '';\n const idle = s.evictable ? c.yellow(' idle') : '';\n info(`${s.repositoryId.slice(0, 8)}… ${s.gitRef}${cur}${idle}`);\n info(c.dim(` nodes ${s.nodeCount} · idle ${Math.round(s.idleMs / 1000)}s · loaded ${new Date(s.loadedAt).toISOString()}`));\n }\n }\n });\n applyGlobalOptions(graphs);\n\n applyGlobalOptions(cmd);\n}\n\nfunction socketOf(cmd: Command): string {\n // Walk parents for --socket on the daemon parent or the leaf.\n let c: Command | null = cmd;\n while (c) {\n const opts = c.opts() as { socket?: string };\n if (opts.socket) return path.resolve(opts.socket);\n c = c.parent;\n }\n return vgdSocketPath();\n}\n\n/**\n * Re-invoke this CLI as a detached background `daemon start`.\n * Handles `node dist/cli.js …`, a global `vg` symlink (npm bin), and a\n * packaged `vg` binary. The symlink case must realpath to cli.js — see\n * {@link reinvokeCli}.\n */\nfunction spawnDetachedDaemonStart(socketPath: string): ReturnType<typeof spawn> {\n // windowsHide: on Windows a detached console can flash and (with some AV /\n // job-object setups) keep the child tied to the parent session. Hide it.\n const opts = {\n detached: true,\n stdio: 'ignore' as const,\n env: process.env,\n windowsHide: true,\n };\n const { command, argv } = reinvokeCli(['daemon', 'start', '--socket', socketPath]);\n return spawn(command, argv, opts);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\n/**\n * Start vgd in the background without making the caller wait for it.\n *\n * `ensureVgd` waits up to 30s and throws — right for `vg daemon ensure` and for\n * `vg code`, which cannot proceed without a runtime, and wrong for every\n * ordinary command. An auto-start must never put a cold-start on the front of\n * `vg ask`: we spawn, give the socket a short window in case it binds quickly,\n * and otherwise leave the child coming up on its own. The command runs its\n * in-process path this time and finds a warm daemon the next.\n *\n * Never throws — the caller has a working fallback by construction.\n */\nexport async function ensureVgdSoft(\n socketPath: string = vgdSocketPath(),\n readyBudgetMs = 1500,\n): Promise<{ running: boolean; started: boolean }> {\n try {\n if (await vgdIsRunning({ socketPath })) return { running: true, started: false };\n const child = spawnDetachedDaemonStart(socketPath);\n child.unref();\n const deadline = Date.now() + Math.max(0, readyBudgetMs);\n while (Date.now() < deadline) {\n await sleep(100);\n if (await vgdIsRunning({ socketPath })) return { running: true, started: true };\n if (child.exitCode != null && child.exitCode !== 0) break;\n }\n return { running: false, started: true };\n } catch {\n return { running: false, started: false };\n }\n}\n\n/**\n * Spawn a detached background `daemon start` and wait for it to answer ping.\n * Returns the child pid; throws when the socket never becomes ready.\n *\n * Ready budget is long because the detached child pays a full Node + CLI cold\n * start of its own (often >8s under Windows AV). The previous 8s window made\n * `vg daemon ensure` report success only when ping raced ahead of the child\n * exiting, or fail right as the child was about to listen.\n */\nasync function startDetachedVgd(socketPath: string): Promise<number | undefined> {\n const child = spawnDetachedDaemonStart(socketPath);\n child.unref();\n const readyMs = 30_000;\n const deadline = Date.now() + readyMs;\n while (Date.now() < deadline) {\n await sleep(150);\n if (await vgdIsRunning({ socketPath })) return child.pid;\n // If the child already exited without ever answering, fail fast rather\n // than waiting out the full budget for a dead process. Another client\n // (the VS Code extension's `daemon ensure`) may have bound in this\n // tick — treat that as ready rather than reporting a false failure.\n if (child.exitCode != null && child.exitCode !== 0) {\n if (await vgdIsRunning({ socketPath })) return child.pid;\n throw new CliError(\n `vgd child exited ${child.exitCode} before becoming ready at ${socketPath} — run \"vg daemon start\" in the foreground to see the error`,\n ExitCode.ERROR,\n );\n }\n }\n throw new CliError(\n `vgd failed to become ready within ${Math.round(readyMs / 1000)}s at ${socketPath}`,\n ExitCode.ERROR,\n );\n}\n\n/**\n * The build version of the daemon currently on the socket, or `null` when it\n * does not report one.\n *\n * `null` is not \"unknown, leave it alone\": `cliVersion` landed in the status\n * response in 2026.817.x, so its absence dates the process to a build older\n * than that just as surely as a version string would.\n */\nexport async function vgdCliVersion(socketPath: string = vgdSocketPath()): Promise<string | null> {\n try {\n const res = await vgdRequest({ op: 'status' }, { socketPath });\n if (!res.ok || !('cliVersion' in res)) return null;\n return typeof res.cliVersion === 'string' && res.cliVersion ? res.cliVersion : null;\n } catch {\n return null;\n }\n}\n\nexport type VgdSkew =\n | { running: false }\n | { running: true; version: string | null; state: 'match' | 'older' | 'newer' };\n\n/**\n * Compare the daemon holding the socket against this build.\n *\n * vgd owns one machine-wide socket, so whichever process binds it first serves\n * every client — the CLI, `vg serve`, and a VS Code extension running its own\n * bundled engine. Version skew is therefore the normal case, not an edge case,\n * and it is invisible: an old daemon answers every request happily, just with\n * old code.\n */\nexport async function vgdVersionSkew(socketPath: string = vgdSocketPath(), self: string = VERSION): Promise<VgdSkew> {\n if (!(await vgdIsRunning({ socketPath }))) return { running: false };\n const version = await vgdCliVersion(socketPath);\n return { running: true, version, state: compareDaemonVersion(version, self) };\n}\n\n/**\n * Resolution is deliberately monotonic — only a strictly newer daemon survives\n * a mismatch. Two clients on different builds both ensuring the socket would\n * otherwise restart each other forever; with \"newest wins\" they converge on the\n * highest version present and stay there.\n */\nexport function compareDaemonVersion(version: string | null, self: string): 'match' | 'older' | 'newer' {\n if (version === self) return 'match';\n // We cannot judge from an unparseable version of our own — never pick a fight\n // we have no way to win.\n if (!semver.valid(self)) return 'match';\n if (version === null || !semver.valid(version)) return 'older';\n return semver.gt(version, self) ? 'newer' : 'older';\n}\n\n/** Human label for a daemon build, including the pre-2026.817 \"no version\" case. */\nfunction describeVersion(version: string | null): string {\n return version ?? 'unknown (pre-2026.817)';\n}\n\nexport interface EnsureVgdResult {\n started: boolean;\n pid?: number;\n /** Set when an older daemon was retired to make room for this build. */\n replaced?: { version: string | null };\n}\n\nexport interface EnsureVgdOptions {\n /** Attach to whatever is on the socket, even on an older build. */\n allowVersionMismatch?: boolean;\n}\n\n/**\n * Idempotent start used by `vg daemon ensure` and `vg code`: if vgd is already\n * listening on this build, do nothing; otherwise spawn a detached standalone\n * `daemon start`.\n *\n * An older daemon is replaced rather than attached to. Attaching is the quiet\n * failure this exists to prevent: the client reports success, then serves stale\n * answers from a process nobody remembers starting.\n */\nexport async function ensureVgd(\n socketPath: string = vgdSocketPath(),\n opts: EnsureVgdOptions = {},\n): Promise<EnsureVgdResult> {\n const skew = await vgdVersionSkew(socketPath);\n if (!skew.running) return { started: true, pid: await startDetachedVgd(socketPath) };\n if (opts.allowVersionMismatch || skew.state !== 'older') return { started: false };\n await stopVgd(socketPath, { force: true });\n return { started: true, pid: await startDetachedVgd(socketPath), replaced: { version: skew.version } };\n}\n\nexport interface StopVgdOptions {\n /**\n * Escalate past a daemon that will not leave politely: SIGTERM, then SIGKILL.\n *\n * Used wherever a surviving daemon is worse than a killed one — `vg update`\n * above all, where every client on the socket would otherwise keep being\n * served by the build that was just replaced. Safe to escalate because\n * `daemon start` is the only thing that ever hosts a vgd listener, so the pid\n * belongs to a daemon process and not to somebody's editor.\n */\n force?: boolean;\n}\n\n/**\n * Stop a running vgd: polite `shutdown` op first, SIGTERM via the pid for\n * daemons that predate the op, then wait (≤5s) for the socket to go quiet.\n *\n * `refused` means the daemon declined remote shutdown (a listener started\n * without a shutdown hook). Without `force` that is where it ends — the pid\n * file belongs to the owning process and is not ours to kill.\n */\nexport async function stopVgd(\n socketPath: string,\n opts: StopVgdOptions = {},\n): Promise<'stopped' | 'not-running' | 'refused' | 'failed'> {\n if (!(await vgdIsRunning({ socketPath }))) return 'not-running';\n // Ask who is on the socket before shutting it down. The pid the daemon\n // reports is authoritative; the pid file can be left over from an earlier\n // process, and signalling that would kill a stranger.\n const livePid = opts.force ? await vgdReportedPid(socketPath) : null;\n let acknowledged = false;\n try {\n const res = await vgdRequest({ op: 'shutdown' }, { socketPath });\n if (res.ok) acknowledged = true;\n else if (res.code === 'shutdown_unsupported' && !opts.force) return 'refused';\n // Any other refusal (an older daemon answers `unknown op`) → pid fallback.\n } catch {\n /* connection dropped mid-shutdown or slow daemon — fall through to pid */\n }\n if (!acknowledged) {\n const pid = signalTarget(livePid);\n if (pid == null) return 'failed';\n if (!signalPid(pid, 'SIGTERM')) return 'failed';\n }\n if (await waitForVgdStop(socketPath, 5_000)) return 'stopped';\n if (!opts.force) return 'failed';\n\n // Wedged: it acknowledged, or took SIGTERM, and is still holding the socket.\n const pid = signalTarget(livePid);\n if (pid == null) return 'failed';\n if (!signalPid(pid, 'SIGKILL')) return 'failed';\n // A SIGKILLed daemon cannot unlink its own socket, but the next `daemon\n // start` clears a stale path before binding, so nothing is left to clean up.\n return (await waitForVgdStop(socketPath, 3_000)) ? 'stopped' : 'failed';\n}\n\n/**\n * The pid to signal, or null when there is nothing safe to signal.\n *\n * Never our own: a daemon hosted in *this* process (an in-process test server,\n * a future embedded listener) would otherwise be \"stopped\" by killing the\n * caller. Such a daemon has to be shut down through its own handle, so report\n * failure and let the caller say so.\n */\nfunction signalTarget(livePid: number | null): number | null {\n const pid = livePid ?? readVgdPid();\n if (pid == null || pid === process.pid) return null;\n return pid;\n}\n\nfunction signalPid(pid: number, signal: NodeJS.Signals): boolean {\n try {\n process.kill(pid, signal);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function waitForVgdStop(socketPath: string, budgetMs: number): Promise<boolean> {\n const deadline = Date.now() + budgetMs;\n while (Date.now() < deadline) {\n await sleep(100);\n if (!(await vgdIsRunning({ socketPath }))) return true;\n }\n return false;\n}\n\n/** The pid the live daemon reports for itself — trusted over the pid file. */\nasync function vgdReportedPid(socketPath: string): Promise<number | null> {\n try {\n const res = await vgdRequest({ op: 'status' }, { socketPath });\n if (!res.ok || !('pid' in res)) return null;\n return Number.isInteger(res.pid) && res.pid > 0 ? res.pid : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Restart the local vgd if (and only if) one is running — used by `vg update`\n * so a freshly installed CLI does not keep serving from a daemon still running\n * the old build. Best-effort: never throws.\n */\nexport async function restartVgdIfRunning(\n socketPath: string = vgdSocketPath(),\n opts: StopVgdOptions = {},\n): Promise<'restarted' | 'not-running' | 'refused' | 'failed'> {\n try {\n const stopResult = await stopVgd(socketPath, opts);\n if (stopResult === 'not-running') return 'not-running';\n if (stopResult === 'refused') return 'refused';\n if (stopResult === 'failed') return 'failed';\n await startDetachedVgd(socketPath);\n return 'restarted';\n } catch {\n return 'failed';\n }\n}\n\nfunction readVgdPid(): number | null {\n try {\n const raw = fs.readFileSync(vgdPidPath(), 'utf8').trim();\n const pid = Number.parseInt(raw, 10);\n return Number.isInteger(pid) && pid > 0 ? pid : null;\n } catch {\n return null;\n }\n}\n\n/** Resolve repository id for cwd: register if needed, return workspace id. */\nasync function repositoryIdForCwd(socketPath: string, root: string): Promise<string> {\n const { repositoryIdFromRoot } = await import('../runtime/paths.js');\n const reg = await vgdRequest({ op: 'register', root }, { socketPath });\n if (reg.ok && 'workspace' in reg) return reg.workspace.id;\n return repositoryIdFromRoot(root);\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/lockfile.ts","../src/engine/lib.ts","../src/engine/literal-scan.ts","../src/engine/search.ts"],"names":["fs","path","fs3","path3","os2","resolve","path4","fs4","sep"],"mappings":"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","file":"chunk-KKQX3F5F.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { DepRecord } from './drift.js';\n\n/**\n * Lockfile-pinned version resolution (VG-LIB-SUPERSET-PLAN A.2 / D13).\n *\n * The version we serve docs for should be the one your **lockfile** pins, not\n * whatever happens to be unpacked in `node_modules` (which is empty in CI / a\n * fresh clone). This reads the pin deterministically and offline. Where a lockfile\n * isn't present or parseable we return `undefined` and the caller falls back to the\n * installed tree, then the declared range — we never fabricate a version.\n *\n * npm covers `package-lock.json` (v1/v2/v3), `pnpm-lock.yaml` (v6/v9) and\n * `yarn.lock`. Other ecosystems follow the same shape and return `undefined`\n * until their parser lands — honest degradation, no false mismatch.\n */\nexport function lockfileVersion(root: string, ecosystem: DepRecord['ecosystem'], name: string): string | undefined {\n if (ecosystem === 'npm') return packageLockVersion(root, name) ?? pnpmLockVersion(root, name) ?? yarnLockVersion(root, name);\n if (ecosystem === 'pypi') return pypiLockVersion(root, name);\n if (ecosystem === 'rust') return tomlPackageLock(root, 'Cargo.lock', name, rustName);\n if (ecosystem === 'ruby') return gemfileLock(root, name);\n if (ecosystem === 'php') return composerLock(root, name);\n if (ecosystem === 'dotnet') return packagesLock(root, name);\n if (ecosystem === 'swift') return packageResolved(root, name);\n if (ecosystem === 'dart') return pubspecLock(root, name);\n if (ecosystem === 'java') return gradleLock(root, name);\n return undefined;\n}\n\n/** Gradle `gradle.lockfile` — lines `group:artifact:version=configurations…`. */\nfunction gradleLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'gradle.lockfile'), 'utf8');\n } catch {\n return undefined;\n }\n const m = new RegExp(`^${escapeRegExp(name)}:([^=\\\\s]+)=`, 'm').exec(text);\n return m ? m[1] : undefined;\n}\n\n/** Swift `Package.resolved` — JSON pins (v2/v3 `pins[]`, v1 `object.pins[]`); match `identity`. */\nfunction packageResolved(root: string, name: string): string | undefined {\n let data: {\n pins?: Array<{ identity?: string; package?: string; state?: { version?: string } }>;\n object?: { pins?: Array<{ identity?: string; package?: string; state?: { version?: string } }> };\n };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'Package.resolved'), 'utf8'));\n } catch {\n return undefined;\n }\n const pins = data.pins ?? data.object?.pins;\n if (!Array.isArray(pins)) return undefined;\n const target = name.toLowerCase();\n for (const p of pins) {\n const id = (p.identity ?? p.package ?? '').toLowerCase();\n if (id === target && p.state?.version) return p.state.version;\n }\n return undefined;\n}\n\n/** Dart `pubspec.lock` — YAML; each ` <name>:` block carries `version: \"x.y.z\"`. */\nfunction pubspecLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'pubspec.lock'), 'utf8');\n } catch {\n return undefined;\n }\n let inPkg = false;\n for (const line of text.split('\\n')) {\n const key = /^ ([A-Za-z0-9_.]+):\\s*$/.exec(line);\n if (key) {\n inPkg = key[1] === name;\n continue;\n }\n if (inPkg) {\n const vm = /^\\s+version:\\s*\"?([^\"\\s]+)\"?/.exec(line);\n if (vm) return vm[1];\n }\n }\n return undefined;\n}\n\nfunction escapeRegExp(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** Ruby `Gemfile.lock` — the `specs:` block lists ` name (1.2.3)` (4-space indent). */\nfunction gemfileLock(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'Gemfile.lock'), 'utf8');\n } catch {\n return undefined;\n }\n // Spec definitions are 4-space-indented with a concrete (digit-leading) version;\n // nested dep constraints (6-space) and the DEPENDENCIES list (2-space) don't match.\n const m = new RegExp(`^ ${escapeRegExp(name)} \\\\((\\\\d[^)]*)\\\\)`, 'm').exec(text);\n return m ? m[1] : undefined;\n}\n\n/** PHP `composer.lock` — JSON `packages` / `packages-dev` arrays of `{ name, version }`. */\nfunction composerLock(root: string, name: string): string | undefined {\n let data: Record<string, Array<{ name?: string; version?: string }>>;\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'composer.lock'), 'utf8'));\n } catch {\n return undefined;\n }\n for (const section of ['packages', 'packages-dev']) {\n const arr = data[section];\n if (!Array.isArray(arr)) continue;\n const p = arr.find((x) => x && x.name === name);\n if (p && typeof p.version === 'string') return p.version.replace(/^v/, '');\n }\n return undefined;\n}\n\n/** .NET `packages.lock.json` — `dependencies.<framework>.<id>.resolved` (ids case-insensitive). */\nfunction packagesLock(root: string, name: string): string | undefined {\n let data: { dependencies?: Record<string, Record<string, { resolved?: string }>> };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'packages.lock.json'), 'utf8'));\n } catch {\n return undefined;\n }\n const target = name.toLowerCase();\n for (const fw of Object.values(data.dependencies ?? {})) {\n if (!fw || typeof fw !== 'object') continue;\n for (const [id, v] of Object.entries(fw)) {\n if (id.toLowerCase() === target && v && typeof v.resolved === 'string') return v.resolved;\n }\n }\n return undefined;\n}\n\n/** PEP 503 name normalisation — names are case-insensitive and -/_/. are equivalent. */\nfunction pep503(name: string): string {\n return name.trim().toLowerCase().replace(/[-_.]+/g, '-');\n}\n\n/** Crate names: case-insensitive on crates.io; published name used verbatim otherwise. */\nfunction rustName(name: string): string {\n return name.trim().toLowerCase();\n}\n\n/** Python: `poetry.lock` / `uv.lock` (TOML `[[package]]`), then `Pipfile.lock` (JSON). */\nfunction pypiLockVersion(root: string, name: string): string | undefined {\n return (\n tomlPackageLock(root, 'poetry.lock', name, pep503) ??\n tomlPackageLock(root, 'uv.lock', name, pep503) ??\n pipfileLock(root, name)\n );\n}\n\n/**\n * Parse a TOML lockfile of `[[package]]` tables (poetry, uv, and Cargo.lock share this shape) for\n * the pinned version, without a TOML dependency: split on the array-of-tables\n * header and match `name`/`version` string keys within a block.\n */\nfunction tomlPackageLock(root: string, file: string, name: string, normalize: (s: string) => string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, file), 'utf8');\n } catch {\n return undefined;\n }\n const target = normalize(name);\n for (const block of text.split(/\\[\\[package\\]\\]/)) {\n const nm = /(?:^|\\n)\\s*name\\s*=\\s*\"([^\"]+)\"/.exec(block);\n if (nm && normalize(nm[1]) === target) {\n const ver = /(?:^|\\n)\\s*version\\s*=\\s*\"([^\"]+)\"/.exec(block);\n if (ver) return ver[1];\n }\n }\n return undefined;\n}\n\n/** Pipenv `Pipfile.lock` — JSON; versions look like `\"==1.2.3\"`. */\nfunction pipfileLock(root: string, name: string): string | undefined {\n let data: Record<string, Record<string, { version?: string }>>;\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'Pipfile.lock'), 'utf8'));\n } catch {\n return undefined;\n }\n const target = pep503(name);\n for (const section of ['default', 'develop']) {\n const deps = data[section];\n if (!deps || typeof deps !== 'object') continue;\n for (const [k, v] of Object.entries(deps)) {\n if (pep503(k) === target && v && typeof v.version === 'string') {\n return v.version.replace(/^==/, '');\n }\n }\n }\n return undefined;\n}\n\n/** npm `package-lock.json` — JSON, deterministic, no dependency. */\nfunction packageLockVersion(root: string, name: string): string | undefined {\n let data: { packages?: Record<string, { version?: string }>; dependencies?: Record<string, { version?: string }> };\n try {\n data = JSON.parse(fs.readFileSync(path.join(root, 'package-lock.json'), 'utf8'));\n } catch {\n return undefined;\n }\n // v2/v3: packages keyed by install path; the top-level dep is \"node_modules/<name>\".\n const top = data.packages?.[`node_modules/${name}`]?.version;\n if (typeof top === 'string') return top;\n // v1: flat dependencies map.\n const v1 = data.dependencies?.[name]?.version;\n return typeof v1 === 'string' ? v1 : undefined;\n}\n\n/**\n * `pnpm-lock.yaml` (v6 and v9) — the direct dependency's resolved version.\n *\n * pnpm is not a niche case: this repository is itself pnpm-only, so until this\n * existed every `resolveVersion` here reported no lockfile pin and fell through\n * to the installed tree — precisely the fallback this module exists to avoid,\n * because `node_modules` is empty in CI and on a fresh clone.\n *\n * Read from `importers`, not `packages`: the importer block records what this\n * project actually depends on, while `packages` lists the whole transitive\n * graph and can hold several versions of one name. Parsed by hand, like every\n * other reader here — a lockfile is megabytes and only one line is wanted.\n */\nfunction pnpmLockVersion(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'pnpm-lock.yaml'), 'utf8');\n } catch {\n return undefined;\n }\n const importers = sectionOf(text, 'importers');\n if (!importers) return undefined;\n // Entries look like:\n // commander:\n // specifier: ^15.0.0\n // version: 15.0.0(peer@1.2.3)\n // The name may be quoted when scoped ('@scope/pkg':).\n const key = escapeRegExp(name);\n const re = new RegExp(`^\\\\s+'?${key}'?:\\\\s*$\\\\n\\\\s+specifier:.*$\\\\n\\\\s+version:\\\\s*(\\\\S+)\\\\s*$`, 'm');\n const m = re.exec(importers);\n if (!m?.[1]) return undefined;\n // Strip pnpm's peer-suffix — `15.0.0(zod@4.4.3)` is still version 15.0.0.\n const version = m[1].replace(/\\(.*$/, '').trim();\n return version || undefined;\n}\n\n/** The body of a top-level YAML block, up to the next column-0 key. */\nfunction sectionOf(text: string, key: string): string | undefined {\n const start = new RegExp(`^${key}:\\\\s*$`, 'm').exec(text);\n if (!start) return undefined;\n const from = start.index + start[0].length;\n const next = /^\\S[^\\n]*:\\s*$/m.exec(text.slice(from));\n return next ? text.slice(from, from + next.index) : text.slice(from);\n}\n\n/**\n * `yarn.lock` — a custom text format. Each block opens with one or more\n * comma-separated `name@range` specifiers (possibly quoted) and ends with an\n * indented `version \"x.y.z\"`. We find the block whose header names our package and\n * return its version. Scoped names (`@scope/pkg@range`) are handled via lastIndexOf.\n */\nfunction yarnLockVersion(root: string, name: string): string | undefined {\n let text: string;\n try {\n text = fs.readFileSync(path.join(root, 'yarn.lock'), 'utf8');\n } catch {\n return undefined;\n }\n let inBlock = false;\n for (const line of text.split('\\n')) {\n if (line && !/^\\s/.test(line) && !line.startsWith('#')) {\n inBlock = headerNamesPackage(line, name);\n } else if (inBlock) {\n const m = /^\\s+version:?\\s+\"?([^\"\\s]+)\"?/.exec(line);\n if (m) return m[1];\n }\n }\n return undefined;\n}\n\nfunction headerNamesPackage(header: string, name: string): boolean {\n return header\n .replace(/:\\s*$/, '')\n .split(',')\n .some((spec) => {\n const s = spec.trim().replace(/^\"|\"$/g, '');\n const at = s.lastIndexOf('@');\n if (at <= 0) return false; // <=0 keeps scoped leading '@' from matching empty name\n const specName = s.slice(0, at);\n return specName === name;\n });\n}\n","import * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { execFileSync } from 'node:child_process';\nimport { stableStringify } from './serialize.js';\nimport { hashString } from './hash.js';\nimport { inventory, installedTreeVersion, type DriftInventory } from './drift.js';\nimport { lockfileVersion } from './lockfile.js';\n\n/**\n * `vg lib` — a deterministic, on-disk library-currency catalog: version-correct\n * usage docs for the **exact version in your lockfile**, drift-annotated, from\n * on-disk sources (no key).\n *\n * The catalog (`vibgrate.lib.json`) is small and committable; doc bodies live in\n * `.vibgrate/lib/<id>.md` so the team shares them on pull. Ingestion is\n * deterministic from local sources; URL/llms.txt ingestion is opt-in network.\n */\n\nexport const LIB_SCHEMA = 'vg-lib/1.0' as const;\n\nexport interface LibSource {\n type: 'local' | 'llms.txt' | 'website' | 'openapi' | 'git';\n location: string;\n}\n\nexport interface LibEntry {\n id: string;\n name: string;\n version: string; // cataloged doc version ('*' if unknown)\n source: LibSource;\n docFile: string; // relative to root (.vibgrate/lib/<id>.md)\n docHash: string;\n bytes: number;\n}\n\nexport interface LibCatalog {\n schemaVersion: typeof LIB_SCHEMA;\n libraries: Record<string, LibEntry>;\n}\n\nexport function catalogPath(root: string): string {\n return path.join(root, 'vibgrate.lib.json');\n}\nexport function libDir(root: string): string {\n return path.join(root, '.vibgrate', 'lib');\n}\n\nexport function libId(name: string): string {\n return name.trim().toLowerCase().replace(/^@/, '').replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');\n}\n\nexport function loadCatalog(root: string): LibCatalog {\n const file = catalogPath(root);\n if (fs.existsSync(file)) {\n try {\n const data = JSON.parse(fs.readFileSync(file, 'utf8')) as LibCatalog;\n if (data.schemaVersion === LIB_SCHEMA && data.libraries) return data;\n } catch {\n /* fall through to empty */\n }\n }\n return { schemaVersion: LIB_SCHEMA, libraries: {} };\n}\n\nexport function saveCatalog(root: string, catalog: LibCatalog): void {\n fs.writeFileSync(catalogPath(root), `${stableStringify(catalog, 2)}\\n`);\n}\n\n/** Resolve a fuzzy name to a catalog entry (exact id, name, or substring). */\nexport function resolveLib(catalog: LibCatalog, name: string): LibEntry | undefined {\n const id = libId(name);\n if (catalog.libraries[id]) return catalog.libraries[id];\n const lower = name.toLowerCase();\n const all = Object.values(catalog.libraries);\n return (\n all.find((e) => e.name.toLowerCase() === lower) ??\n all.find((e) => e.id.includes(id) || e.name.toLowerCase().includes(lower))\n );\n}\n\n/**\n * The lockfile/manifest version of a dependency, for drift annotation.\n *\n * `inv` lets a caller that resolves many names hand in one inventory instead of\n * rebuilding it per name. Building it walks the manifest tree and probes\n * `node_modules` for every declared dependency, so `vg lib`'s catalog listing —\n * a `driftFor` per entry — was paying that whole cost once per library.\n */\nexport function installedVersion(root: string, name: string, inv?: DriftInventory): string | undefined {\n const rec = (inv ?? inventory(root)).records.find((r) => r.name === name);\n return rec?.installed ?? rec?.declared;\n}\n\nexport interface VersionResolution {\n /** The version we serve docs for: lockfile pin → installed tree → declared range. */\n served?: string;\n source: 'lockfile' | 'installed' | 'declared' | 'unknown';\n lockfile?: string;\n installed?: string;\n declared?: string;\n /** Set when the lockfile pin and the installed tree disagree (the dev should fix). */\n mismatch?: { lockfile: string; installed: string; note: string };\n}\n\nconst stripRange = (v?: string): string | undefined => v?.replace(/^[v^~>=<\\s]+/, '');\n\n/**\n * Resolve the version to serve docs for, **lockfile-first**, and detect a\n * lockfile↔installed disagreement (VG-LIB-SUPERSET-PLAN D13 / G8). Precedence:\n * lockfile pin → installed tree → declared range. When both a lockfile pin and an\n * installed version are readable and differ, surface a mismatch the dev should fix —\n * a signal a hosted docs service can't produce (it has no view of your installed tree).\n */\nexport function resolveVersion(root: string, name: string): VersionResolution {\n const rec = inventory(root).records.find((r) => r.name === name);\n const declared = rec?.declared;\n // npm installed comes from node_modules (via inventory); other ecosystems read their\n // installed tree (Python .dist-info, PHP installed.json) so the mismatch alert applies too.\n const installed = rec?.installed ?? (rec ? installedTreeVersion(root, rec.ecosystem, name) : undefined);\n const lockfile = rec ? lockfileVersion(root, rec.ecosystem, name) : undefined;\n\n let mismatch: VersionResolution['mismatch'];\n if (lockfile && installed && stripRange(lockfile) !== stripRange(installed)) {\n mismatch = {\n lockfile,\n installed,\n note: `lockfile pins ${lockfile} but the installed tree has ${installed} — your install is out of sync with the lockfile (re-install or commit the lock)`,\n };\n }\n\n const served = lockfile ?? installed ?? declared;\n const source: VersionResolution['source'] = lockfile\n ? 'lockfile'\n : installed\n ? 'installed'\n : declared\n ? 'declared'\n : 'unknown';\n return { served, source, lockfile, installed, declared, mismatch };\n}\n\nexport interface DriftNote {\n cataloged: string;\n installed?: string;\n drift: 'current' | 'behind' | 'ahead' | 'unknown';\n}\n\nexport function driftFor(root: string, entry: LibEntry, inv?: DriftInventory): DriftNote {\n const installed = installedVersion(root, entry.name, inv);\n if (!installed || entry.version === '*') return { cataloged: entry.version, installed, drift: 'unknown' };\n const norm = (v: string) => v.replace(/^[v^~>=<\\s]+/, '');\n const a = norm(entry.version);\n const b = norm(installed);\n if (a === b) return { cataloged: entry.version, installed, drift: 'current' };\n return { cataloged: entry.version, installed, drift: cmp(a, b) < 0 ? 'behind' : 'ahead' };\n}\n\nfunction cmp(a: string, b: string): number {\n const pa = a.split('.').map(Number);\n const pb = b.split('.').map(Number);\n for (let i = 0; i < 3; i++) {\n const d = (pa[i] || 0) - (pb[i] || 0);\n if (d) return d;\n }\n return 0;\n}\n\nexport interface AddOptions {\n root: string;\n name?: string;\n version?: string;\n /** Allow network for URL/llms.txt sources. */\n allowNetwork?: boolean;\n fetchImpl?: typeof globalThis.fetch;\n}\n\n/**\n * Recognise a git source. We treat a source as git when it is unambiguously\n * one: a `git+` scheme prefix, an `scp`-style `git@host:org/repo`, or a URL\n * ending in `.git`. A plain `https://…/docs` stays a website (no `.git`), so the\n * classification is deterministic and never surprises a URL ingest.\n * Returns the clone URL (with any `git+` prefix stripped), or null.\n */\nexport function parseGitSource(source: string): string | null {\n if (source.startsWith('git+')) return source.slice(4);\n if (/^git@[^:]+:/.test(source)) return source;\n if (/\\.git\\/?$/.test(source)) return source;\n return null;\n}\n\n/** Ingest docs for a library from a local path, a git repo, or (opt-in) a URL. */\nexport async function addLibrary(source: string, opts: AddOptions): Promise<LibEntry> {\n const { root } = opts;\n let content: string;\n let type: LibSource['type'] = 'local';\n\n const gitUrl = parseGitSource(source);\n if (gitUrl) {\n if (!opts.allowNetwork) {\n throw new Error(`refusing to clone ${source} without --online (offline by default)`);\n }\n content = cloneAndReadGit(gitUrl);\n type = 'git';\n } else if (/^https?:\\/\\//.test(source)) {\n if (!opts.allowNetwork) {\n throw new Error(`refusing to fetch ${source} without --online (offline by default)`);\n }\n const res = await (opts.fetchImpl ?? globalThis.fetch)(source);\n if (!res.ok) throw new Error(`fetch failed (${res.status}) for ${source}`);\n content = await res.text();\n type = source.endsWith('llms.txt') ? 'llms.txt' : source.endsWith('.json') ? 'openapi' : 'website';\n } else {\n const abs = path.resolve(root, source);\n if (!fs.existsSync(abs)) throw new Error(`source not found: ${source}`);\n content = readLocal(abs);\n type = 'local';\n }\n\n const name = opts.name ?? inferName(source);\n const id = libId(name);\n const version = opts.version ?? installedVersion(root, name) ?? '*';\n\n fs.mkdirSync(libDir(root), { recursive: true });\n const docFileAbs = path.join(libDir(root), `${id}.md`);\n fs.writeFileSync(docFileAbs, content);\n\n const entry: LibEntry = {\n id,\n name,\n version,\n source: { type, location: source },\n docFile: path.relative(root, docFileAbs).split(path.sep).join('/'),\n docHash: hashString(content),\n bytes: Buffer.byteLength(content, 'utf8'),\n };\n\n const catalog = loadCatalog(root);\n catalog.libraries[id] = entry;\n saveCatalog(root, catalog);\n return entry;\n}\n\nexport function readDoc(root: string, entry: LibEntry): string {\n const abs = path.resolve(root, entry.docFile);\n return fs.existsSync(abs) ? fs.readFileSync(abs, 'utf8') : '';\n}\n\nexport interface LocalDocs {\n docs: string;\n version?: string;\n /** Cited on-disk source, relative to root (e.g. `node_modules/react/README.md`). */\n source: string;\n /**\n * True when the payload is only a package README / description — no package\n * `docs/` markdown was merged in. Used by the quality gate to refuse\n * overconfident answers on focused API queries.\n */\n readmeOnly?: boolean;\n}\n\n/** Find an installed npm package directory, walking up for hoisted `node_modules`. */\nfunction npmPackageDir(root: string, name: string): string | undefined {\n let cur = root;\n for (let i = 0; i < 12; i++) {\n const dir = path.join(cur, 'node_modules', name);\n if (fs.existsSync(path.join(dir, 'package.json'))) return dir;\n const parent = path.dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n return undefined;\n}\n\nconst README_CANDIDATES = ['llms.txt', 'README.md', 'README.mdx', 'README', 'readme.md'] as const;\n\n/** Collect package `docs/` markdown files, optionally filtered by query terms. */\nfunction packageDocsMarkdown(dir: string, query?: string): { text: string; files: string[] } | undefined {\n const docsDir = path.join(dir, 'docs');\n if (!fs.existsSync(docsDir) || !fs.statSync(docsDir).isDirectory()) return undefined;\n const files: string[] = [];\n const walk = (d: string, depth: number): void => {\n if (depth > 3 || files.length >= 40) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(d, { withFileTypes: true });\n } catch {\n return;\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const e of entries) {\n if (files.length >= 40) return;\n const full = path.join(d, e.name);\n if (e.isDirectory()) {\n if (e.name.startsWith('.') || e.name === 'node_modules') continue;\n walk(full, depth + 1);\n } else if (e.isFile() && /\\.(md|mdx)$/i.test(e.name)) {\n files.push(full);\n }\n }\n };\n walk(docsDir, 0);\n if (!files.length) return undefined;\n\n const terms = (query ?? '')\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter((w) => w.length > 2);\n const scored = files.map((f) => {\n let body = '';\n try {\n body = fs.readFileSync(f, 'utf8');\n } catch {\n return { f, body: '', score: -1 };\n }\n const lc = `${path.basename(f)}\\n${body}`.toLowerCase();\n const score = terms.length ? terms.filter((t) => lc.includes(t)).length : 1;\n return { f, body, score };\n });\n // Prefer query-relevant docs; when no query, take a deterministic head of the tree.\n const picked = (terms.length ? scored.filter((s) => s.score > 0).sort((a, b) => b.score - a.score || a.f.localeCompare(b.f)) : scored)\n .filter((s) => s.body.trim())\n .slice(0, terms.length ? 8 : 5);\n if (!picked.length) return undefined;\n const text = picked\n .map((s) => `<!-- ${path.relative(dir, s.f).split(path.sep).join('/')} -->\\n${s.body.trim()}`)\n .join('\\n\\n');\n return {\n text,\n files: picked.map((s) => path.relative(dir, s.f).split(path.sep).join('/')),\n };\n}\n\n/**\n * Local-first resolution ladder (VG-LIB-SUPERSET-PLAN A.2.3): when a library isn't\n * in the committed catalog, read its docs **from the\n * installed package on disk**, version-correct by construction and offline. Prefers\n * `llms.txt`, then the README, then package `docs/` markdown (query-filtered when\n * provided), then the package.json description. First slice: npm (`node_modules`).\n */\nexport function localPackageDocs(root: string, name: string, opts?: { query?: string }): LocalDocs | undefined {\n const dir = npmPackageDir(root, name);\n if (!dir) return undefined;\n const version = resolveVersion(root, name).served;\n let primary: { docs: string; source: string } | undefined;\n for (const f of README_CANDIDATES) {\n const p = path.join(dir, f);\n try {\n const docs = fs.readFileSync(p, 'utf8');\n if (docs.trim()) {\n primary = { docs, source: path.relative(root, p).split(path.sep).join('/') };\n break;\n }\n } catch {\n /* next candidate */\n }\n }\n\n const extra = packageDocsMarkdown(dir, opts?.query);\n if (primary && extra) {\n return {\n docs: `${primary.docs.trim()}\\n\\n## Package docs\\n\\n${extra.text}`,\n version,\n source: `${primary.source}+docs/`,\n readmeOnly: false,\n };\n }\n if (primary) {\n return { ...primary, version, readmeOnly: true };\n }\n if (extra) {\n return {\n docs: extra.text,\n version,\n source: path.relative(root, path.join(dir, 'docs')).split(path.sep).join('/') + '/',\n readmeOnly: false,\n };\n }\n\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8')) as {\n description?: string;\n version?: string;\n };\n if (pkg.description?.trim()) {\n return {\n docs: `# ${name}\\n\\n${pkg.description}`,\n version: version ?? pkg.version,\n source: path.relative(root, path.join(dir, 'package.json')).split(path.sep).join('/'),\n readmeOnly: true,\n };\n }\n } catch {\n /* ignore */\n }\n return undefined;\n}\n\ntype PkgJson = {\n types?: string;\n typings?: string;\n exports?: unknown;\n};\n\n/** Resolve a relative types path from package.json (including exports map). */\nfunction typesFromPkg(dir: string, pkg: PkgJson): string | undefined {\n const tryRel = (rel: unknown): string | undefined => {\n if (typeof rel !== 'string') return undefined;\n const p = path.join(dir, rel);\n return fs.existsSync(p) ? p : undefined;\n };\n const top = tryRel(pkg.types) ?? tryRel(pkg.typings);\n if (top) return top;\n const exp = pkg.exports;\n if (!exp || typeof exp !== 'object') return undefined;\n // Prefer the \".\" export; fall back to any types condition we can find.\n const roots: unknown[] = [];\n if ('.' in (exp as Record<string, unknown>)) roots.push((exp as Record<string, unknown>)['.']);\n else roots.push(...Object.values(exp as Record<string, unknown>));\n for (const entry of roots) {\n if (typeof entry === 'string') {\n const hit = tryRel(entry.endsWith('.d.ts') ? entry : undefined);\n if (hit) return hit;\n continue;\n }\n if (entry && typeof entry === 'object') {\n const o = entry as Record<string, unknown>;\n for (const key of ['types', 'typings', 'import', 'require', 'default']) {\n const v = o[key];\n if (typeof v === 'string') {\n const hit = tryRel(v.endsWith('.ts') || v.endsWith('.d.ts') || v.endsWith('.mts') || v.endsWith('.cts') ? v : undefined);\n if (hit) return hit;\n } else if (v && typeof v === 'object' && typeof (v as { types?: string }).types === 'string') {\n const hit = tryRel((v as { types: string }).types);\n if (hit) return hit;\n }\n }\n }\n }\n return undefined;\n}\n\n/** Locate a package's TypeScript declaration entry (`types`/`typings`/exports, else conventional paths). */\nfunction dtsEntry(dir: string): string | undefined {\n try {\n const pkg = JSON.parse(fs.readFileSync(path.join(dir, 'package.json'), 'utf8')) as PkgJson;\n const fromPkg = typesFromPkg(dir, pkg);\n if (fromPkg) return fromPkg;\n } catch {\n /* fall through to conventional paths */\n }\n for (const c of [\n 'index.d.ts',\n 'dist/index.d.ts',\n 'dist/types/index.d.ts',\n 'lib/index.d.ts',\n 'types/index.d.ts',\n 'build/index.d.ts',\n ]) {\n const p = path.join(dir, c);\n if (fs.existsSync(p)) return p;\n }\n return undefined;\n}\n\nconst MAX_DTS_FILES = 30;\nconst MAX_DTS_BYTES = 512_000;\n\n/** Bounded walk for `.d.ts` files under a package (for query-focused symbol lookup). */\nfunction collectDtsFiles(dir: string): string[] {\n const out: string[] = [];\n const walk = (d: string, depth: number): void => {\n if (depth > 4 || out.length >= MAX_DTS_FILES) return;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(d, { withFileTypes: true });\n } catch {\n return;\n }\n entries.sort((a, b) => a.name.localeCompare(b.name));\n for (const e of entries) {\n if (out.length >= MAX_DTS_FILES) return;\n if (e.name === 'node_modules' || e.name.startsWith('.')) continue;\n const full = path.join(d, e.name);\n if (e.isDirectory()) walk(full, depth + 1);\n else if (e.isFile() && /\\.d\\.(ts|mts|cts)$/.test(e.name)) out.push(full);\n }\n };\n walk(dir, 0);\n return out;\n}\n\n/**\n * Extract exported declaration signatures from a `.d.ts` source. Declaration files\n * are body-less, so a brace-depth scanner is deterministic and robust: capture each\n * top-level `export …` statement from the keyword through its terminating `;` or\n * matching `}`. Also keeps named re-export lines (`export { foo } from '…'`) so\n * modern barrel packages still surface API names.\n */\nexport function extractDtsApi(src: string, maxDecls = 200): string[] {\n const out: string[] = [];\n let depth = 0;\n let capture: string[] | null = null;\n for (const raw of src.split('\\n')) {\n const line = raw.trim();\n // Named re-exports: keep the line so symbols like createMiddleware appear.\n if (capture === null && depth === 0 && /^export\\s+\\{[^}]+\\}/.test(line)) {\n out.push(raw.trim());\n if (out.length >= maxDecls) break;\n continue;\n }\n if (\n capture === null &&\n depth === 0 &&\n /^export\\b/.test(line) &&\n !/^export\\s+(\\{|\\*|default\\b|type\\s+\\{)/.test(line)\n ) {\n capture = [];\n }\n if (capture) capture.push(raw);\n for (const ch of raw) {\n if (ch === '{') depth++;\n else if (ch === '}') depth = Math.max(0, depth - 1);\n }\n if (capture && depth === 0 && /[;}]\\s*$/.test(line)) {\n out.push(capture.join('\\n').trim());\n capture = null;\n if (out.length >= maxDecls) break;\n }\n }\n return out;\n}\n\n/** Names mentioned in `export { a, b as c }` lines. */\nfunction reExportNames(decl: string): string[] {\n const m = /^export\\s*\\{([^}]+)\\}/.exec(decl.trim());\n if (!m) return [];\n const names: string[] = [];\n for (const part of m[1].split(',')) {\n const n = part.trim().split(/\\s+as\\s+/i).pop()?.trim();\n if (n && /^[A-Za-z_$][\\w$]*$/.test(n)) names.push(n);\n }\n return names;\n}\n\n/**\n * Version-correct typed API surface from a package's `.d.ts` files.\n * When `query` is set, prefer declarations that mention query terms (so\n * `library_docs({ query: \"createMiddleware\" })` returns the matching signature,\n * not only a truncated README).\n */\nexport function localApiSurface(root: string, name: string, query?: string): string | undefined {\n const dir = npmPackageDir(root, name);\n if (!dir) return undefined;\n\n const entry = dtsEntry(dir);\n const files = entry ? [entry, ...collectDtsFiles(dir).filter((f) => f !== entry)] : collectDtsFiles(dir);\n if (!files.length) return undefined;\n\n const allDecls: string[] = [];\n const seen = new Set<string>();\n for (const f of files) {\n let src: string;\n try {\n const st = fs.statSync(f);\n if (st.size > MAX_DTS_BYTES) continue;\n src = fs.readFileSync(f, 'utf8');\n } catch {\n continue;\n }\n for (const d of extractDtsApi(src)) {\n if (seen.has(d)) continue;\n seen.add(d);\n allDecls.push(d);\n if (allDecls.length >= 400) break;\n }\n if (allDecls.length >= 400) break;\n }\n if (!allDecls.length) return undefined;\n\n const terms = (query ?? '')\n .split(/[^A-Za-z0-9_$]+/)\n .filter((w) => w.length > 2);\n if (terms.length) {\n const lcTerms = terms.map((t) => t.toLowerCase());\n const matched = allDecls.filter((d) => {\n const lc = d.toLowerCase();\n return lcTerms.some((t) => lc.includes(t));\n });\n // Expand bare re-export lines to fuller decls of the same name when possible.\n const expanded: string[] = [];\n const expandedSeen = new Set<string>();\n for (const d of matched) {\n const names = reExportNames(d);\n if (names.length) {\n for (const n of names) {\n const fuller = allDecls.find(\n (x) => !/^export\\s*\\{/.test(x) && new RegExp(`\\\\b${n}\\\\b`).test(x),\n );\n const pick = fuller ?? d;\n if (!expandedSeen.has(pick)) {\n expandedSeen.add(pick);\n expanded.push(pick);\n }\n }\n } else if (!expandedSeen.has(d)) {\n expandedSeen.add(d);\n expanded.push(d);\n }\n }\n if (expanded.length) return expanded.slice(0, 40).join('\\n\\n');\n }\n\n // No query (or no match): return entry-file decls first, then a capped head.\n return allDecls.slice(0, 80).join('\\n\\n');\n}\n\n/** Append the typed API surface (if any) as a fenced section — composed into served docs. */\nexport function withApiSurface(root: string, name: string, docs: string, query?: string): string {\n const api = localApiSurface(root, name, query);\n return api ? `${docs}\\n\\n## API (types)\\n\\n\\`\\`\\`ts\\n${api}\\n\\`\\`\\`\\n` : docs;\n}\n\n/**\n * Shallow-clone a git repo to a temp dir, read its docs, then remove the clone.\n * Network-touching, so it only runs under `--online` (gated by the caller). The\n * clone is `--depth 1` (no history) and the temp dir is always cleaned up.\n */\nfunction cloneAndReadGit(url: string): string {\n const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'vg-lib-git-'));\n try {\n execFileSync('git', ['clone', '--depth', '1', '--quiet', url, dir], {\n stdio: ['ignore', 'ignore', 'pipe'],\n });\n } catch (err) {\n fs.rmSync(dir, { recursive: true, force: true });\n const detail = err instanceof Error && err.message ? `: ${err.message.split('\\n')[0]}` : '';\n throw new Error(`git clone failed for ${url}${detail}`);\n }\n try {\n return readGitDocs(dir);\n } finally {\n fs.rmSync(dir, { recursive: true, force: true });\n }\n}\n\n/**\n * Read the documentation out of a cloned repo, deterministically: prefer a\n * top-level `docs/` directory, else the root README, else any top-level prose.\n */\nfunction readGitDocs(dir: string): string {\n const docsDir = path.join(dir, 'docs');\n if (fs.existsSync(docsDir) && fs.statSync(docsDir).isDirectory()) return readLocal(docsDir);\n const readme = ['README.md', 'README.mdx', 'README.txt', 'README.rst', 'readme.md']\n .map((f) => path.join(dir, f))\n .find((p) => fs.existsSync(p));\n if (readme) return fs.readFileSync(readme, 'utf8');\n return readLocal(dir);\n}\n\nfunction readLocal(abs: string): string {\n const stat = fs.statSync(abs);\n if (stat.isFile()) return fs.readFileSync(abs, 'utf8');\n // Directory: concatenate markdown/text files deterministically.\n const parts: string[] = [];\n const files = fs\n .readdirSync(abs, { withFileTypes: true })\n .filter((e) => e.isFile() && /\\.(md|mdx|txt|rst)$/i.test(e.name))\n .map((e) => e.name)\n .sort();\n for (const f of files) parts.push(`<!-- ${f} -->\\n${fs.readFileSync(path.join(abs, f), 'utf8')}`);\n return parts.join('\\n\\n');\n}\n\nfunction inferName(source: string): string {\n const cleaned = source.replace(/^git\\+/, '').replace(/\\.git\\/?$/i, '');\n const base = cleaned.replace(/\\/+$/, '').split(/[/:]/).pop() ?? cleaned;\n return base.replace(/\\.(md|mdx|txt|rst|json)$/i, '').replace(/^llms$/, 'docs');\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport * as os from 'node:os';\nimport { Worker } from 'node:worker_threads';\n\n/**\n * The uniform literal-search core for `search_symbols` (VG-LITERAL-INDEX-DESIGN.md\n * Stage 1). Reads a set of candidate files and returns every matching line,\n * case-insensitive, deterministically ordered by (file, line).\n *\n * Performance is delivered WITHOUT any external binary or persisted index, so it\n * is identical on Linux, macOS and Windows and needs nothing installed:\n * - small file sets scan inline (worker startup would cost more than it saves);\n * - large sets fan out across `worker_threads` — a proven, Node-native way to\n * use every core. ripgrep, when present, prunes the candidate set upstream so\n * this scans only a handful of files; when it's absent this is the whole\n * engine, and the parallel path keeps it fast on big repos.\n *\n * The per-file matcher is one tiny function shared by the inline path and the\n * worker (as a source string) so the two can't drift; a parity test asserts they\n * agree. It leans on V8's native `toLowerCase`/`includes` rather than a\n * hand-rolled byte scan — simpler, and faster than interpreted JS byte loops.\n */\n\nconst MAX_FILE_BYTES = 1_000_000;\nconst PREVIEW_CHARS = 120;\nconst NUL = '\\u0000'; // a NUL byte marks a binary file — skipped, same as ripgrep does\n/**\n * Fan out to workers only above this many candidate BYTES. Benchmarking showed\n * that gating on file *count* is wrong: a few thousand small files (≈8 MB) scan\n * ~2× faster inline than across workers, because worker startup + result IPC\n * dwarfs the actual matching. Parallelism only pays once there is real byte\n * volume to amortise it (big monorepos, generated trees). Below the threshold\n * the improved single-thread scan — one lowercase per file, no per-line\n * re-lowercase — is the fastest and has zero worker overhead.\n */\nconst PARALLEL_MIN_BYTES = 64_000_000;\n/**\n * Don't even measure bytes below this file count: a repo with few files can't\n * hold enough work to beat worker startup, and skipping the stat pass keeps\n * typical small repos overhead-free. Above it, `measure` decides by bytes.\n */\nconst PARALLEL_MIN_FILES = 2000;\n/** Hard cap on collected rows so a pathologically common phrase can't blow memory;\n * the true match count is still tallied exactly and `truncated` is set. */\nconst ROW_CAP = 10_000;\n\nexport interface LiteralHit {\n file: string;\n line: number;\n preview: string;\n}\n\nexport interface ScanOutcome {\n /** Matching lines, deterministically ordered by (file, line), capped at ROW_CAP. */\n hits: LiteralHit[];\n /** Exact count of all matching lines (counts past ROW_CAP / past `budget`). */\n total: number;\n /** True when rows were capped (ROW_CAP or, in bounded mode, `budget`). */\n truncated: boolean;\n}\n\nexport interface ScanOptions {\n /** Collect and count every match (a \"find every occurrence\" sweep). When false,\n * stop once `budget` rows are collected (a cheap bounded fallthrough). */\n collectAll: boolean;\n /** Row budget for the bounded (`collectAll: false`) mode. */\n budget: number;\n}\n\n/**\n * Scan `files` (repo-relative paths under `root`) for `needle`, case-insensitive.\n * Chooses inline vs. parallel by set size; both produce identical output.\n */\nexport async function scanCandidates(root: string, files: string[], needle: string, opts: ScanOptions): Promise<ScanOutcome> {\n const needleLower = needle.toLowerCase();\n if (!needleLower || files.length === 0) return { hits: [], total: 0, truncated: false };\n // Few files can't out-earn worker startup — inline directly, no stat pass.\n // (Bounded mode additionally early-stops the moment the budget fills.)\n if (files.length < PARALLEL_MIN_FILES && !process.env.VG_PARALLEL_MIN_BYTES) {\n return opts.collectAll\n ? scanInline(root, files, needleLower, ROW_CAP, false, undefined)\n : scanInline(root, files, needleLower, opts.budget, true, undefined);\n }\n // Many files: measure the candidate bytes once, then let workers in only when\n // there's enough volume to amortise them. This now includes the BOUNDED path\n // (a single-name fallthrough): its early-stop only ever helps when the needle\n // is common enough to fill the budget — the expensive case is precisely a RARE\n // needle, where the scan must sweep everything anyway and used to do so\n // single-threaded (the 16s-per-call trace). Sizes from the measure pass are\n // reused by the inline scan (no double-stat).\n const { over, sizes } = measure(root, files);\n if (!over) {\n return opts.collectAll\n ? scanInline(root, files, needleLower, ROW_CAP, false, sizes)\n : scanInline(root, files, needleLower, opts.budget, true, sizes);\n }\n const out = await scanParallel(root, files, needleLower);\n if (!opts.collectAll && out.hits.length > opts.budget) {\n out.hits.length = opts.budget;\n out.truncated = true;\n }\n return out;\n}\n\n/** The byte threshold, overridable via VG_PARALLEL_MIN_BYTES (ops knob + tests). */\nfunction parallelMinBytes(): number {\n const v = Number(process.env.VG_PARALLEL_MIN_BYTES);\n return Number.isFinite(v) && v >= 0 ? v : PARALLEL_MIN_BYTES;\n}\n\n/** Sum candidate bytes, short-circuiting once the worker threshold is crossed. */\nfunction measure(root: string, files: string[]): { over: boolean; sizes: Map<string, number> } {\n const threshold = parallelMinBytes();\n const sizes = new Map<string, number>();\n let total = 0;\n for (const rel of files) {\n let size: number;\n try {\n size = fs.statSync(path.join(root, rel)).size;\n } catch {\n continue;\n }\n sizes.set(rel, size);\n if (size <= MAX_FILE_BYTES) total += size;\n if (total >= threshold) return { over: true, sizes };\n }\n return { over: false, sizes };\n}\n\n/** The one true per-file matcher. Kept trivial so the worker copy stays in sync. */\nfunction matchLines(text: string, needleLower: string): Array<{ line: number; preview: string }> {\n const low = text.toLowerCase();\n if (!low.includes(needleLower)) return [];\n const lowLines = low.split('\\n');\n const rawLines = text.split('\\n');\n const hits: Array<{ line: number; preview: string }> = [];\n for (let i = 0; i < lowLines.length; i++) {\n if (lowLines[i].includes(needleLower)) hits.push({ line: i + 1, preview: rawLines[i].trim().slice(0, PREVIEW_CHARS) });\n }\n return hits;\n}\n\n/**\n * Read one candidate file, applying the size/binary guards. `null` = skip.\n * `knownSize` (from the measure pass) lets us skip a redundant `statSync`.\n */\nfunction readCandidate(abs: string, knownSize?: number): string | null {\n try {\n const size = knownSize ?? fs.statSync(abs).size;\n if (size > MAX_FILE_BYTES) return null;\n const text = fs.readFileSync(abs, 'utf8');\n return text.includes(NUL) ? null : text;\n } catch {\n return null;\n }\n}\n\nfunction scanInline(root: string, files: string[], needleLower: string, cap: number, stopAtCap: boolean, sizes: Map<string, number> | undefined): ScanOutcome {\n const hits: LiteralHit[] = [];\n let total = 0;\n let truncated = false;\n for (const rel of files) {\n const text = readCandidate(path.join(root, rel), sizes?.get(rel));\n if (text === null) continue;\n for (const h of matchLines(text, needleLower)) {\n total++;\n if (hits.length < cap) hits.push({ file: rel, line: h.line, preview: h.preview });\n else {\n truncated = true;\n if (stopAtCap) return { hits, total, truncated };\n }\n }\n }\n return { hits, total, truncated };\n}\n\n/**\n * Fan the candidate files across `worker_threads`. Each worker runs the same\n * matcher over its shard and returns rows + an exact count; the main thread\n * merges, sorts and caps. The worker source is a self-contained CommonJS string\n * (eval worker) so it survives bundling with no separate worker-file path to\n * resolve at runtime. Any worker failure falls back to a correct inline scan —\n * speed is negotiable, completeness is not.\n */\nasync function scanParallel(root: string, files: string[], needleLower: string): Promise<ScanOutcome> {\n const n = Math.min(files.length, Math.max(2, Math.min(8, os.cpus().length - 1)));\n const shards: string[][] = Array.from({ length: n }, () => []);\n files.forEach((f, i) => shards[i % n].push(f));\n\n let results: ScanOutcome[];\n try {\n results = await Promise.all(shards.map((shard) => runWorker(root, shard, needleLower)));\n } catch {\n return scanInline(root, files, needleLower, ROW_CAP, false, undefined);\n }\n\n const hits: LiteralHit[] = [];\n let total = 0;\n let truncated = false;\n for (const r of results) {\n total += r.total;\n truncated = truncated || r.truncated;\n for (const h of r.hits) hits.push(h);\n }\n hits.sort((a, b) => (a.file < b.file ? -1 : a.file > b.file ? 1 : a.line - b.line));\n if (hits.length > ROW_CAP) {\n hits.length = ROW_CAP;\n truncated = true;\n }\n return { hits, total, truncated };\n}\n\nconst WORKER_SOURCE = [\n \"const { parentPort, workerData } = require('worker_threads');\",\n \"const fs = require('fs');\",\n \"const path = require('path');\",\n `const MAX = ${MAX_FILE_BYTES};`,\n `const PREVIEW = ${PREVIEW_CHARS};`,\n `const CAP = ${ROW_CAP};`,\n 'const NUL = String.fromCharCode(0);',\n 'const NL = String.fromCharCode(10);',\n 'const { root, files, needleLower } = workerData;',\n 'const hits = []; let total = 0, truncated = false;',\n 'for (const rel of files) {',\n ' const abs = path.join(root, rel);',\n ' let text;',\n ' try { if (fs.statSync(abs).size > MAX) continue; text = fs.readFileSync(abs, \"utf8\"); } catch { continue; }',\n ' if (text.includes(NUL)) continue;',\n ' const low = text.toLowerCase();',\n ' if (!low.includes(needleLower)) continue;',\n ' const lowLines = low.split(NL); const rawLines = text.split(NL);',\n ' for (let i = 0; i < lowLines.length; i++) {',\n ' if (!lowLines[i].includes(needleLower)) continue;',\n ' total++;',\n ' if (hits.length < CAP) hits.push({ file: rel, line: i + 1, preview: rawLines[i].trim().slice(0, PREVIEW) });',\n ' else truncated = true;',\n ' }',\n '}',\n 'parentPort.postMessage({ hits, total, truncated });',\n].join('\\n');\n\n/** One shard on one worker; rejects on any worker error so the caller can fall back. */\nfunction runWorker(root: string, files: string[], needleLower: string): Promise<ScanOutcome> {\n return new Promise<ScanOutcome>((resolve, reject) => {\n const w = new Worker(WORKER_SOURCE, { eval: true, workerData: { root, files, needleLower } });\n let settled = false;\n w.once('message', (m: ScanOutcome) => {\n settled = true;\n resolve(m);\n });\n w.once('error', reject);\n w.once('exit', (code) => {\n if (!settled && code !== 0) reject(new Error(`literal-scan worker exited with code ${code}`));\n });\n });\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { spawnSync } from 'node:child_process';\nimport { findNodes } from './lookup.js';\nimport { scanCandidates } from './literal-scan.js';\nimport { extractLiteralNeedles, residualForSymbolSearch } from './query.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * `search_symbols` — the hybrid flashlight next to the map\n * (docs/graph/VG-GRAPH-OPTIMIZATION-PLAN.md P1).\n *\n * Two passes, both bounded and deterministic:\n * 1. symbol pass — the graph's own name index via findNodes (exact id /\n * qualified name / short name / case-insensitive / substring), ranked;\n * 2. literal pass — a repo-root-jailed substring scan over source files for\n * strings the graph does not model (config keys, log messages, comments),\n * only run when the symbol pass has spare result budget.\n *\n * Rows are tiny by contract ({kind, name, file, line, score|preview}) — this\n * tool exists to make \"I know the name\" discovery one cheap call, so the model\n * never flails through graph queries for a plain string lookup.\n */\n\nexport interface SymbolHit {\n kind: string;\n name: string;\n file: string;\n line: number;\n score: number;\n}\n\nexport interface TextHit {\n kind: 'text';\n file: string;\n line: number;\n preview: string;\n}\n\nexport interface SearchResult {\n matches: (SymbolHit | TextHit)[];\n moreAvailable: boolean;\n /**\n * Total literal (text) matches across the scanned tree, reported when a\n * literal sweep ran (a whitespace/phrase query). Lets a caller doing a \"find\n * every occurrence\" sweep know whether the shown text rows are the complete\n * set (`totalTextMatches` === shown text rows) or a page of a larger set\n * (`totalTextMatches` > shown) — so it never mistakes a truncated list for a\n * complete one, and never has to fall back to grep to be sure. A trailing `+`\n * intent is signalled via `moreAvailable`; absent for single-name lookups.\n */\n totalTextMatches?: number;\n /**\n * Present when nothing matched (the pivot to take) or when a literal sweep was\n * truncated (how to get the rest).\n */\n hint?: string;\n}\n\nconst IGNORE_DIRS = new Set([\n '.git', '.claude', '.vibgrate', 'node_modules', 'dist', 'build', 'out', 'target', 'vendor', '__pycache__',\n // .NET intermediate output and coverage reports: purely generated trees that a\n // C#/coverage-heavy repo pays for on every literal sweep. `bin` is deliberately\n // NOT here — plenty of repos keep real scripts in bin/ (rails, node CLIs), and\n // completeness beats speed; the binary-extension skip below keeps a .NET bin/\n // cheap anyway.\n 'obj', 'coverage',\n]);\nconst MAX_FILES_SCANNED = 20_000;\n\n/**\n * Extensions that are binary by construction — skipped at listing time so the\n * scan never stats/reads megabytes of DLLs or images just to reject them on the\n * NUL check. Applied identically to the Node walk and the rg parse so both\n * listers see the same corpus. Content-level binary detection (the NUL check in\n * literal-scan) still guards everything this list misses.\n */\nconst BINARY_EXTS = new Set([\n '.dll', '.pdb', '.exe', '.so', '.dylib', '.a', '.lib', '.o', '.class', '.jar', '.wasm', '.node',\n '.png', '.jpg', '.jpeg', '.gif', '.webp', '.ico', '.icns', '.bmp',\n '.zip', '.gz', '.tgz', '.bz2', '.xz', '.7z', '.rar',\n '.woff', '.woff2', '.ttf', '.otf', '.eot',\n '.mp3', '.mp4', '.mov', '.avi', '.pdf',\n]);\n\nfunction hasBinaryExt(rel: string): boolean {\n return BINARY_EXTS.has(path.extname(rel).toLowerCase());\n}\n\n/** Repo-relative paths are always reported with forward slashes — matching the\n * graph's own file paths, so symbol-hit/text-hit dedup works on Windows too. */\nfunction toPosix(rel: string): string {\n return path.sep === '\\\\' ? rel.replaceAll('\\\\', '/') : rel;\n}\n\nexport async function searchSymbols(graph: VgGraph, root: string, query: string, limit: number): Promise<SearchResult> {\n let q = query.trim();\n if (!q) return { matches: [], moreAvailable: false, hint: 'query is required' };\n\n // A query wrapped in matching quotes is an explicit \"find this exact string\"\n // — the tool description tells agents a QUOTED phrase runs a complete literal\n // sweep, but a quoted SINGLE identifier (\"AddJwtBearer\") has no whitespace,\n // used to take the single-name path, and searched for the quote characters\n // themselves: a guaranteed no-match that sent the agent straight back to grep\n // (the field-report failure). Strip the quotes and honour the intent.\n const quoted = /^([\"'`])(.+)\\1$/.exec(q);\n if (quoted && quoted[2]!.trim()) q = quoted[2]!.trim();\n\n // Embedded URL / quoted needles inside a natural-language ask\n // (\"https://dash…/signup does not exist find occurrences\"). The literal\n // sweep must search for the *needle*, not the whole sentence — otherwise\n // extension.ts:955 (bare URL) is a complete miss while only test fixtures\n // that paste the full ask match.\n const embeddedNeedles = extractLiteralNeedles(q);\n const scanNeedle =\n embeddedNeedles.length === 0\n ? q\n : embeddedNeedles.length === 1 && embeddedNeedles[0] === q\n ? q\n : [...embeddedNeedles].sort((a, b) => b.length - a.length)[0]!;\n // Symbol pass: residual framing only, and empty when residual is pure\n // scaffolding (\"where is …?\") so we do not rank applyPlan.where etc.\n const symbolQuery =\n embeddedNeedles.length > 0 ? residualForSymbolSearch(q) : q;\n\n // Literal-sweep routing. Shapes that can never name one graph symbol:\n // - internal whitespace (\"find every place that says X\");\n // - explicit quotes (stripped above — quoting IS the sweep signal);\n // - a URL (`https://…`) — host/path tokens are not identifiers; without this\n // branch a bare URL stayed symbol-first and never ran the literal sweep\n // (field report: find occurrences of https://dash…/signup);\n // - embedded URL/quote inside NL framing (scanNeedle ≠ full query);\n // - a slash path with no `:` and no glob chars (\"opportunities/mine\",\n // \"api/users/mine\") — a route/path STRING. Its tokens previously fell into\n // the per-token symbol union, where a single loose token (\"mine\") produced\n // a confidently-ranked, completely unrelated symbol instead of a clean\n // literal answer. (`:`-bearing non-URL queries stay symbol-first: file:line\n // and qualified names look like paths too; globs keep the glob tier.)\n // Single-name lookups (the hot path) keep symbol-first behaviour unchanged.\n const isUrl = /^https?:\\/\\//i.test(scanNeedle) || embeddedNeedles.some((n) => /^https?:\\/\\//i.test(n));\n const isPhrase =\n Boolean(quoted) ||\n isUrl ||\n embeddedNeedles.length > 0 ||\n /\\s/.test(q) ||\n (/[/\\\\]/.test(q) && !q.includes(':') && !/[*?]/.test(q));\n\n // Pass 1 — graph name index (already ranked by importance).\n let nodes: GraphNode[] = [];\n if (symbolQuery.trim()) {\n nodes = findNodes(graph, symbolQuery).filter((n) => n.kind !== 'file');\n // File-path tier: a query that IS a repo path (\"src/services/OrderService.ts\")\n // used to dead-end — the name index only knows the file NODE (filtered out as\n // uninteresting) and the literal scan only finds the path where it appears as\n // text. The useful answer is the symbols DEFINED in that file, ranked.\n if (nodes.length === 0) {\n nodes = fileSymbolNodes(graph, symbolQuery);\n }\n // Reconstructed-identifier fallthrough: a humanized/spaced query (\"get id\",\n // \"use team\", \"f 0304\") is frequently a *single* identifier whose original\n // separators (camelCase boundary, `_`) were lost in humanization, not a\n // multi-word phrase. Try the two mechanical rejoins — concatenated (recovers\n // camelCase: \"get id\" -> \"getid\" == \"getId\") and underscore-joined (recovers\n // snake_case: \"f 0304\" -> \"f_0304\") — against the exact/case-insensitive name\n // index before falling through to the noisy per-token substring union below,\n // which has no way to re-associate short tokens back into one identifier and\n // silently drops single-character tokens (\"f\") that carry real information\n // (VG-LOCATE-FAILURE-ANALYSIS.md).\n if (nodes.length === 0 && isPhrase) {\n nodes = reconstructedIdentifierNodes(graph, symbolQuery);\n }\n // Multi-word fallthrough: an agent that types a phrase (\"NewScan modal\n // component\", \"dsn install command\") gets nothing from the whole-string name\n // index and nothing from the whole-string literal scan — a dead end. When the\n // exact query finds no symbol AND the query is multiple words, union the\n // per-token matches and rank by how many distinct query tokens each symbol\n // covers (then importance).\n if (nodes.length === 0) {\n const tokens = queryTokens(symbolQuery);\n if (tokens.length >= 2) nodes = multiTokenNodes(graph, tokens);\n }\n }\n // For a phrase, cap the symbol section to a fraction of the budget so it can\n // never crowd out the literal scan; the string hits lead, the loosely-matching\n // symbols follow as \"the name also means this\" context. Single names keep the\n // full budget for the symbol pass.\n const symbolCap = isPhrase ? Math.max(1, Math.floor(limit / 3)) : limit;\n const symbolHits: SymbolHit[] = nodes.slice(0, symbolCap).map((n, i) => ({\n kind: n.kind,\n name: n.qualifiedName,\n file: n.file,\n line: n.span.start,\n score: Math.round((1 - i / Math.max(nodes.length, 1)) * 100) / 100,\n }));\n\n // Pass 2 — literal scan for what the graph doesn't model. A phrase always gets\n // the budget the symbol cap freed up and a full count of what's out there\n // (`countAll`), so the caller can trust it for a complete sweep. A single name\n // only falls through on spare budget and stops at the budget, as before.\n // Scan `scanNeedle` (extracted URL/quote when present), not the full NL ask.\n const spare = limit - symbolHits.length;\n const textHits: TextHit[] = [];\n let truncatedScan = false;\n let totalTextMatches: number | undefined;\n // A single name the graph resolved EXACTLY (id / name / qualified name /\n // file:line) doesn't fall through to the literal scan at all: the symbol\n // answer is authoritative for \"where is X defined\", and padding it with text\n // occurrences meant every perfect lookup still paid a worst-case full-tree\n // sweep (the 16s-per-call trace on a large repo). Occurrence sweeps stay one\n // explicit call away (quote it / add whitespace, or use impact_of/get_node\n // callers for reference lists). Non-exact fallthroughs are unchanged.\n const skipScan = !isPhrase && hasExactSymbolMatch(nodes, symbolQuery || q);\n if (spare > 0 && !skipScan) {\n const seen = new Set(symbolHits.map((h) => `${h.file}:${h.line}`));\n const scan = await scanFiles(root, scanNeedle, spare, seen, textHits, isPhrase);\n truncatedScan = scan.truncated;\n if (isPhrase) totalTextMatches = scan.total;\n }\n\n // Phrase/URL occurrence answers lead with text hits; symbols are secondary.\n const matches = isPhrase ? [...textHits, ...symbolHits] : [...symbolHits, ...textHits];\n if (matches.length === 0) {\n const empty: SearchResult = {\n matches,\n moreAvailable: false,\n hint: 'no symbol or text match — for meaning-level questions (symptoms, relationships, what-breaks-if) use query_graph',\n };\n // Phrase/URL sweeps still report totalTextMatches (including 0) so callers\n // can tell a complete miss from a symbol-only empty without re-scanning.\n if (totalTextMatches !== undefined) empty.totalTextMatches = totalTextMatches;\n return empty;\n }\n\n const literalTruncated = totalTextMatches !== undefined && totalTextMatches > textHits.length;\n // A phrase's deliberately-capped symbol section is not \"more available\"; only a\n // truncated literal sweep is. A single name reports the usual symbol overflow.\n const moreAvailable = isPhrase ? literalTruncated || truncatedScan : nodes.length > symbolHits.length || truncatedScan;\n const result: SearchResult = { matches, moreAvailable };\n if (totalTextMatches !== undefined) result.totalTextMatches = totalTextMatches;\n if (literalTruncated) {\n result.hint = `showing ${textHits.length} of ${totalTextMatches}${truncatedScan ? '+' : ''} literal matches — raise limit or narrow the query to get them all`;\n }\n return result;\n}\n\n/**\n * Symbols defined in the file the query names, ranked by importance — the\n * file-path resolution tier. Accepts the exact repo-relative path (with or\n * without a leading `./`, either separator style) or an unambiguous path\n * suffix (\"services/OrderService.ts\"). Returns [] when the query names no file.\n */\nfunction fileSymbolNodes(graph: VgGraph, q: string): GraphNode[] {\n if (!/[/\\\\]/.test(q) && !/\\.\\w+$/.test(q)) return []; // cheap guard: not path-shaped\n const norm = q.replaceAll('\\\\', '/').replace(/^\\.\\//, '');\n const inFile = graph.nodes.filter(\n (n) => n.kind !== 'file' && (n.file === norm || n.file.endsWith(`/${norm}`)),\n );\n return [...inFile].sort((a, b) => b.importance - a.importance || a.qualifiedName.localeCompare(b.qualifiedName));\n}\n\n/**\n * Did the graph resolve `q` as an exact identifier (not a loose substring)?\n * Mirrors findNodes' exact tiers: content-hash id, `file:line`, and whole-name /\n * qualified-name equality (case-insensitive). Substring-tier matches return\n * false so a partial name still gets the literal fallthrough.\n */\nfunction hasExactSymbolMatch(nodes: GraphNode[], q: string): boolean {\n if (nodes.length === 0) return false;\n if (/^(.*):(\\d+)$/.test(q)) return true; // resolved via the file:line tier\n const lower = q.toLowerCase();\n return nodes.some((n) => n.id === q || n.qualifiedName.toLowerCase() === lower || n.name.toLowerCase() === lower);\n}\n\n/** Meaningful query words for the multi-word fallthrough (drop tiny tokens). */\nfunction queryTokens(q: string): string[] {\n return [...new Set(q.toLowerCase().split(/[^a-z0-9]+/).filter((t) => t.length >= 2))];\n}\n\n/**\n * Rejoin a humanized query's words back into one identifier and look it up\n * exactly. Humanization is lossy (both camelCase boundaries and `_`/`-`\n * collapse to a plain space), so the original separator can't be recovered —\n * try both mechanical rejoins and let `findNodes`'s case-insensitive exact\n * match do the rest. Concatenated first (camelCase is the more common source\n * convention across this engine's languages); underscore-joined second.\n */\nfunction reconstructedIdentifierNodes(graph: VgGraph, q: string): GraphNode[] {\n const words = q.trim().split(/\\s+/).filter(Boolean);\n if (words.length < 2) return [];\n const concat = findNodes(graph, words.join(''));\n if (concat.length) return concat.filter((n) => n.kind !== 'file');\n const snake = findNodes(graph, words.join('_'));\n return snake.filter((n) => n.kind !== 'file');\n}\n\n/**\n * Union of per-token name-index matches, ranked by how many distinct query\n * tokens each symbol covers (then by importance). Reuses `findNodes` per token\n * so the matching rules (exact/short/case-insensitive/substring) stay identical\n * to a single-name lookup — this only broadens a phrase into its words.\n *\n * Noise guard: a symbol that only SUBSTRING-matched a single token is exactly\n * the false-positive case — \"opportunities/mine\" surfacing an unrelated symbol\n * through \"mine\" and presenting it as a confident answer when the honest\n * result is \"no match\" (field report). Such nodes need ≥ 2 covered tokens to\n * survive. A node whose NAME (or qualified name) equals a token outright is a\n * strong signal on its own and always survives — \"UserCard7 card panel\" must\n * keep UserCard7 even when the loose \"card\" token list is capped elsewhere.\n */\nfunction multiTokenNodes(graph: VgGraph, tokens: string[]): GraphNode[] {\n // One uncapped pass over the graph, scoring every node against every token.\n // (Delegating per-token to findNodes hit its 25-row substring cap: on a large\n // graph a common token's list overflows, real targets lose that token's\n // coverage, and the noise filter below would then discard them.)\n const scored: Array<{ node: GraphNode; hits: number; exact: boolean }> = [];\n for (const n of graph.nodes) {\n if (n.kind === 'file') continue;\n const name = n.name.toLowerCase();\n const qn = n.qualifiedName.toLowerCase();\n let hits = 0;\n let exact = false;\n for (const t of tokens) {\n if (name === t || qn === t) {\n hits++;\n exact = true;\n } else if (qn.includes(t)) hits++;\n }\n if (exact || hits >= 2) scored.push({ node: n, hits, exact });\n }\n return scored\n .sort((a, b) => Number(b.exact) - Number(a.exact) || b.hits - a.hits || b.node.importance - a.node.importance || a.node.qualifiedName.localeCompare(b.node.qualifiedName))\n .map((e) => e.node);\n}\n\ninterface ScanResult {\n /** Distinct matching lines found (excluding those already in `seen`). When\n * `countAll` is false this is only a lower bound — the scan stops at `budget`. */\n total: number;\n /** True when the scan stopped early (file cap hit, or budget hit without\n * `countAll`) — more matches may exist beyond what was counted. */\n truncated: boolean;\n}\n\n/**\n * Bounded, repo-root-jailed literal scan. Fills `out` with up to `budget` hits;\n * with `countAll` it reports the true total across the tree (a \"find every\n * occurrence\" sweep), otherwise it stops at `budget` (a cheap fallthrough).\n *\n * Two stages (VG-LITERAL-INDEX-DESIGN.md, Stage 1):\n * 1. LIST candidate files — `ripgrep` when it's on PATH (SIMD/parallel, prunes\n * to just the files that match), else a Node directory walk (Node-native,\n * offline, air-gap-safe). rg is only a pruner, never the authority.\n * 2. SCAN those files — `scanCandidates`, a uniform pure-JS engine that fans\n * large sweeps across `worker_threads` so it's fast on every platform with\n * nothing installed. It is the single source of the reported rows and\n * `total`, so the answer is identical whether or not rg is present.\n *\n * `seen` (the symbol-pass hit lines) is excluded so a line already shown as a\n * symbol isn't repeated as a text hit.\n */\nasync function scanFiles(root: string, needle: string, budget: number, seen: Set<string>, out: TextHit[], countAll: boolean): Promise<ScanResult> {\n const listing = listCandidateFiles(root, needle);\n const outcome = await scanCandidates(root, listing.files, needle, { collectAll: countAll, budget });\n\n let overlap = 0; // matches that coincide with a symbol-pass line (near-zero in practice)\n for (const h of outcome.hits) {\n if (seen.has(`${h.file}:${h.line}`)) {\n overlap++;\n continue;\n }\n seen.add(`${h.file}:${h.line}`);\n if (out.length < budget) out.push({ kind: 'text', file: h.file, line: h.line, preview: h.preview });\n }\n return { total: outcome.total - overlap, truncated: listing.truncated || outcome.truncated };\n}\n\ninterface Listing {\n /** Repo-relative candidate paths, lexicographically sorted (deterministic in\n * both modes so rows and truncation don't depend on which lister ran). */\n files: string[];\n /** True when the candidate set was capped (more files may match beyond it). */\n truncated: boolean;\n}\n\n/** rg-pruned candidates when available (fast), else the (cached) full Node walk. */\nfunction listCandidateFiles(root: string, needle: string): Listing {\n return ripgrepCandidates(root, needle) ?? walkCandidatesCached(root);\n}\n\n/**\n * TTL cache for the Node-walk listing. The walk is needle-independent (it lists\n * every scannable file), so a burst of search_symbols calls — the normal agent\n * pattern is several lookups in one turn — was re-walking the whole tree each\n * time. The TTL bounds staleness to the same few-second window the serve\n * freshness probe already accepts (server.ts PROBE_INTERVAL_MS); file CONTENTS\n * are always read live at scan time, so only a file created/deleted inside the\n * window can be missed, and only from the listing. rg listings are per-needle\n * and fast, so they bypass this cache entirely.\n */\nconst LISTING_TTL_MS = 2000;\nconst listingCache = new Map<string, { listing: Listing; at: number }>();\n\n/** Drop all cached listings (tests, or after a known tree mutation). */\nexport function clearListingCache(): void {\n listingCache.clear();\n}\n\n/** TTL, overridable via VG_LISTING_TTL_MS (0 disables caching entirely). */\nfunction listingTtlMs(): number {\n const v = Number(process.env.VG_LISTING_TTL_MS);\n return Number.isFinite(v) && v >= 0 ? v : LISTING_TTL_MS;\n}\n\nfunction walkCandidatesCached(root: string): Listing {\n const ttl = listingTtlMs();\n if (ttl > 0) {\n const hit = listingCache.get(root);\n if (hit && Date.now() - hit.at < ttl) return hit.listing;\n }\n const listing = walkCandidates(root);\n if (ttl > 0) listingCache.set(root, { listing, at: Date.now() });\n return listing;\n}\n\n/** Every non-ignored, non-hidden file under root — the Node-native fallback. */\nfunction walkCandidates(root: string): Listing {\n const files: string[] = [];\n let truncated = false;\n const stack = [root];\n while (stack.length) {\n const dir = stack.pop()!;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const e of entries) {\n if (e.name.startsWith('.') || IGNORE_DIRS.has(e.name)) continue;\n const abs = path.join(dir, e.name);\n if (e.isDirectory()) {\n stack.push(abs);\n continue;\n }\n if (hasBinaryExt(e.name)) continue;\n if (files.length >= MAX_FILES_SCANNED) {\n truncated = true;\n continue;\n }\n files.push(toPosix(path.relative(root, abs)));\n }\n }\n files.sort();\n return { files, truncated };\n}\n\nlet rgAvailable: boolean | undefined;\n/** Is `ripgrep` usable? Probed once; opt out with VG_DISABLE_RIPGREP. */\nfunction hasRipgrep(): boolean {\n if (process.env.VG_DISABLE_RIPGREP) return false;\n if (rgAvailable === undefined) {\n try {\n rgAvailable = spawnSync('rg', ['--version'], { stdio: 'ignore', timeout: 3000 }).status === 0;\n } catch {\n rgAvailable = false;\n }\n }\n return rgAvailable;\n}\n\n/**\n * Files containing `needle` per ripgrep, or `null` if rg is unavailable/errored\n * (caller falls back to the Node walk). rg is invoked as a fixed-string,\n * case-insensitive, gitignore-disabled, hidden-skipping lister — the same corpus\n * the Node walk sees — jailed to `root` via cwd. `--fixed-strings` + `--` make\n * the agent-supplied needle inert as a pattern/flag; no shell is involved.\n */\nfunction ripgrepCandidates(root: string, needle: string): Listing | null {\n if (!hasRipgrep()) return null;\n const globs = [...IGNORE_DIRS].flatMap((d) => ['--glob', `!**/${d}/**`, '--glob', `!${d}/**`]);\n const res = spawnSync(\n 'rg',\n ['--files-with-matches', '--fixed-strings', '--ignore-case', '--no-ignore', '--no-messages', ...globs, '--', needle, '.'],\n { cwd: root, encoding: 'utf8', timeout: 15_000, maxBuffer: 32 * 1024 * 1024 },\n );\n // status 0 = matches, 1 = no matches (both fine); anything else / a spawn error\n // (signal kill on timeout, buffer overflow) is untrustworthy — fall back.\n if (res.error || (res.status !== 0 && res.status !== 1) || res.signal) return null;\n const files = parseRgFileList(res.stdout);\n if (files.length > MAX_FILES_SCANNED) return { files: files.slice(0, MAX_FILES_SCANNED), truncated: true };\n return { files, truncated: false };\n}\n\n/**\n * Parse `rg --files-with-matches` stdout into clean, sorted, POSIX-relative\n * paths. On Windows rg emits `.\\src\\Foo.cs` — before this was separator-aware,\n * the whole backslash path read as ONE segment starting with `.`, so the\n * defensive hidden-file filter below discarded every result and a Windows\n * machine with rg installed silently lost all literal hits. Normalising to\n * forward slashes first (matching the graph's own path style) makes the filter\n * see real segments on every platform. Exported for tests; `sep` is injectable\n * so Windows output can be simulated on any host.\n */\nexport function parseRgFileList(stdout: string, sep: string = path.sep): string[] {\n const seen = new Set<string>();\n for (const raw of stdout.split('\\n')) {\n if (!raw) continue;\n const posix = sep === '\\\\' ? raw.replaceAll('\\\\', '/') : raw;\n const rel = posix.startsWith('./') ? posix.slice(2) : posix;\n if (!rel) continue;\n // Defensive: never trust a path that escaped the ignore/hidden rules, and\n // keep the corpus identical to the walk's (same binary-extension skip).\n const segs = rel.split('/');\n if (segs.some((s) => s.startsWith('.') || IGNORE_DIRS.has(s))) continue;\n if (hasBinaryExt(rel)) continue;\n seen.add(rel);\n }\n return [...seen].sort();\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/model-orchestrator.ts"],"names":[],"mappings":"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","file":"chunk-NZELMYT4.js","sourcesContent":["/**\n * Vibgrate Model Orchestrator — Code Modes (Spark / Flow / Forge).\n *\n * Product stance (PRD): users and agents select outcome-oriented **Code Modes**,\n * never GGUF names by default. This module:\n * 1. Declares versioned **qualified packs** (contract + primary/fallback weights)\n * 2. Runs a **fit** algorithm (available memory now × reserves × repo signals)\n * 3. Resolves mode → pack → concrete model / backend\n * 4. Supports pin/unpin for reproducibility\n *\n * Pure resolve + fit helpers have no I/O. Registry pin state uses the global\n * Vibgrate data dir (never in-repo). Pull/ensure is a separate CLI concern that\n * calls into `vg models pull` after resolve.\n *\n * schemaVersion: model-orchestrator/0\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { estimateModelBytes, type SystemMemory } from '../code/capability.js';\nimport {\n MODEL_EXECUTION_PROFILE_SCHEMA_VERSION,\n type ModelExecutionProfile,\n type ModelMode,\n type ToolCallingMode,\n type EditFormatPreference,\n} from './model-execution-profile.js';\nimport { vibgrateDataDir } from './paths.js';\n\nexport const MODEL_ORCHESTRATOR_SCHEMA_VERSION = 'model-orchestrator/0' as const;\n\n/** UX fit vocabulary (stricter than “weights fit”). */\nexport type FitLabel = 'flies' | 'comfortable' | 'tight' | 'will_not_fit';\n\nexport type TaskClass = 'spark_task' | 'flow_task' | 'forge_task' | 'explicit_mode';\n\nexport interface PackWeightsRef {\n /** Backend that can load these weights. */\n backend: 'ollama' | 'llama.cpp' | 'lm-studio' | 'foundry-local' | 'other';\n /** Concrete model id / slug (e.g. qwen2.5-coder:3b). */\n weightsRef: string;\n quant?: string;\n /** SPDX / short license note for first-download surface. */\n license?: string;\n /** Approx weights size in bytes (for fit when not discoverable). */\n weightsBytes?: number;\n /**\n * Optional HTTPS GGUF URL for the first-party weight store (must pass host\n * allowlist). When set, `vg models install` can download without Ollama.\n */\n downloadUrl?: string;\n /** Optional content hash for downloaded GGUF. */\n sha256?: string;\n}\n\nexport interface PackContract {\n toolCalling: ToolCallingMode;\n editFormat: EditFormatPreference;\n capsuleBudgetTokens: number;\n maxRepairRounds: number;\n maxParallelEdits: number;\n /** Minimum qualification score (0–1) this pack was gated on. */\n minEffectiveScore?: number;\n constrainedDecoding?: boolean;\n kvCacheStrategy?: ModelExecutionProfile['kvCacheStrategy'];\n securityTier?: ModelExecutionProfile['securityTier'];\n /**\n * Preferred inference path when available (ADR-005). Weights may still be\n * pulled via Ollama; embedded llama.cpp is preferred for sampler/grammar.\n */\n preferredInference?: 'ollama' | 'llama.cpp';\n /** Process isolation for preferredInference llama.cpp (default embedded). */\n inferenceIsolation?: ModelExecutionProfile['inferenceIsolation'];\n}\n\nexport interface QualifiedPack {\n /** e.g. flow@2026.07.1 */\n packId: string;\n mode: ModelMode;\n displayName: string;\n /** User-facing promise (one line). */\n promise: string;\n primary: PackWeightsRef;\n fallback?: PackWeightsRef[];\n contract: PackContract;\n resources: {\n minRamGb: number;\n minVramGb?: number;\n /** Estimated KV cache bytes per 1k context tokens. */\n estimatedKvPer1kContext?: number;\n };\n provenance?: {\n evalRunIds?: string[];\n notes?: string;\n };\n}\n\nexport interface RepoSignals {\n /** Approximate source file count (0 = unknown). */\n fileCount?: number;\n /** Graph node count when a map is warm (0 = unknown). */\n graphNodeCount?: number;\n /** Dominant languages (optional). */\n languages?: string[];\n}\n\nexport interface FitInput {\n system: SystemMemory;\n pack: QualifiedPack;\n repo?: RepoSignals;\n taskClass?: TaskClass;\n /**\n * Free space on the volume that holds model weights (weight store / Ollama).\n * When set, insufficient disk for the GGUF forces {@link FitLabel will_not_fit}.\n */\n freeDiskBytes?: number;\n /**\n * Static reserves (bytes) for IDE / OS / graph / tests.\n * Defaults applied when omitted.\n */\n reserves?: {\n ideBytes?: number;\n osBytes?: number;\n graphBytes?: number;\n testsBytes?: number;\n safetyMarginBytes?: number;\n };\n /** Context budget used to estimate KV (tokens). Defaults from pack contract. */\n contextBudgetTokens?: number;\n}\n\nexport interface FitResult {\n label: FitLabel;\n /** 0–100; higher is more headroom. */\n score: number;\n needBytes: number;\n availableBytes: number;\n /** Disk needed to store weights safely (weights + 15% + ≥1 GiB floor). */\n diskNeedBytes?: number;\n /** Free disk observed when fit was computed (if provided). */\n freeDiskBytes?: number;\n /** Breakdown for “memory pie” UX. */\n breakdown: {\n modelBytes: number;\n kvBytes: number;\n ideBytes: number;\n osBytes: number;\n graphBytes: number;\n testsBytes: number;\n freeAfterReservesBytes: number;\n };\n /** When tight: suggested reduced capsule budget. */\n reducedCapsuleBudgetTokens?: number;\n reasons: string[];\n}\n\nexport interface ResolvedMode {\n schemaVersion: typeof MODEL_ORCHESTRATOR_SCHEMA_VERSION;\n mode: ModelMode;\n pack: QualifiedPack;\n /** Concrete weights chosen (primary or fallback after fit). */\n underlying: PackWeightsRef;\n fit: FitResult;\n profile: ModelExecutionProfile;\n /** True when pack id was pinned by the user. */\n pinned: boolean;\n /** How the mode was chosen. */\n selection: 'explicit' | 'default' | 'auto_fit' | 'pinned';\n}\n\nexport interface OrchestratorStatus {\n schemaVersion: typeof MODEL_ORCHESTRATOR_SCHEMA_VERSION;\n defaultMode: ModelMode;\n pin?: { mode: ModelMode; packId: string } | null;\n modes: Array<{\n mode: ModelMode;\n packId: string;\n displayName: string;\n promise: string;\n underlyingModelId: string;\n backend: string;\n fit: FitLabel;\n fitScore: number;\n needBytes: number;\n availableBytes: number;\n /** Disk budget for storing this pack’s weights (when free disk was known). */\n diskNeedBytes?: number;\n installed: boolean;\n pinned: boolean;\n }>;\n recommended: ModelMode;\n system: {\n totalRamBytes: number;\n freeRamBytes: number;\n vramTotalBytes?: number;\n vramFreeBytes?: number;\n loaded: Array<{ name: string; bytes: number }>;\n /** Free bytes on the model-cache volume (when probed). */\n freeDiskBytes?: number;\n };\n memoryBreakdown?: FitResult['breakdown'];\n}\n\n// ── Curated packs (versioned; weights may change under the same mode contract) ─\n\n/** Pack channel — bump when contracts or weight refs change under stable mode names. */\nconst PACK_CHANNEL = '2026.07.4';\n\n/**\n * Current qualified packs — one primary per mode.\n *\n * Approach B default: Spark/Flow **primary** is first-party GGUF (llama.cpp)\n * for install + inference when fit allows. Ollama remains an explicit fallback\n * adapter, not the default path.\n */\nexport const QUALIFIED_PACKS: QualifiedPack[] = [\n {\n packId: `spark@${PACK_CHANNEL}`,\n mode: 'spark',\n displayName: 'Spark',\n promise: 'Fastest capable local coding — simple edits, minimal memory.',\n primary: {\n backend: 'llama.cpp',\n weightsRef: 'qwen2.5-coder-3b-q4_k_m.gguf',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:3b').bytes,\n },\n fallback: [\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:3b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:3b').bytes,\n },\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:1.5b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:1.5b').bytes,\n },\n ],\n contract: {\n toolCalling: 'grammar',\n editFormat: 'patch_ir_json',\n capsuleBudgetTokens: 2000,\n maxRepairRounds: 2,\n maxParallelEdits: 2,\n minEffectiveScore: 0.55,\n constrainedDecoding: true,\n preferredInference: 'llama.cpp',\n inferenceIsolation: 'embedded',\n kvCacheStrategy: 'stable_prefix',\n securityTier: 'L1',\n },\n resources: { minRamGb: 4, estimatedKvPer1kContext: 2 * 1024 * 1024 },\n provenance: {\n notes: 'Spark@2026.07.4 — Approach B: first-party GGUF + embedded vibgrate manager; Ollama pack fallback only',\n },\n },\n {\n packId: `flow@${PACK_CHANNEL}`,\n mode: 'flow',\n displayName: 'Flow',\n promise: 'Best everyday graph-guided coding for this machine.',\n primary: {\n backend: 'llama.cpp',\n weightsRef: 'qwen2.5-coder-7b-q4_k_m.gguf',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:7b').bytes,\n },\n fallback: [\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:7b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:7b').bytes,\n },\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:3b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:3b').bytes,\n },\n ],\n contract: {\n toolCalling: 'native',\n editFormat: 'auto',\n capsuleBudgetTokens: 3500,\n maxRepairRounds: 2,\n maxParallelEdits: 4,\n minEffectiveScore: 0.65,\n constrainedDecoding: false,\n preferredInference: 'llama.cpp',\n inferenceIsolation: 'embedded',\n kvCacheStrategy: 'stable_prefix',\n securityTier: 'L1',\n },\n resources: { minRamGb: 8, minVramGb: 6, estimatedKvPer1kContext: 4 * 1024 * 1024 },\n provenance: {\n notes: 'Flow@2026.07.4 — first-party GGUF primary; Ollama pack fallback only',\n },\n },\n {\n packId: `forge@${PACK_CHANNEL}`,\n mode: 'forge',\n displayName: 'Forge',\n promise: 'Strongest deep work that safely fits (migrations, multi-file).',\n primary: {\n backend: 'llama.cpp',\n weightsRef: 'qwen2.5-coder-14b-q4_k_m.gguf',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:14b').bytes,\n },\n fallback: [\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:14b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:14b').bytes,\n },\n {\n backend: 'ollama',\n weightsRef: 'qwen2.5-coder:7b',\n quant: 'q4_k_m',\n license: 'Apache-2.0',\n weightsBytes: estimateModelBytes('qwen2.5-coder:7b').bytes,\n },\n ],\n contract: {\n toolCalling: 'native',\n editFormat: 'patch_ir_json',\n capsuleBudgetTokens: 6000,\n maxRepairRounds: 3,\n maxParallelEdits: 6,\n minEffectiveScore: 0.7,\n constrainedDecoding: false,\n preferredInference: 'llama.cpp',\n inferenceIsolation: 'embedded',\n kvCacheStrategy: 'stable_prefix',\n securityTier: 'L1',\n },\n resources: { minRamGb: 16, minVramGb: 12, estimatedKvPer1kContext: 8 * 1024 * 1024 },\n provenance: {\n notes:\n 'Forge@2026.07.4 — first-party 14B GGUF + embedded vibgrate manager (same path as Spark/Flow); Ollama pack fallback only',\n },\n },\n];\n\nconst GiB = 1024 ** 3;\n\n/**\n * Static reserves applied on top of *available* RAM.\n *\n * Important: `freeRamBytes` is already residual after currently-running\n * processes (IDE, OS, browsers, …). Subtracting a full IDE/OS footprint again\n * double-counts and falsely zeros fit on healthy machines. Keep growth\n * headroom for graph/tests (often not yet resident) + safety, and a modest\n * fraction of IDE/OS for workspace growth under load.\n */\nconst DEFAULT_RESERVES = {\n ideBytes: 1.5 * GiB,\n osBytes: 2 * GiB,\n graphBytes: 0.5 * GiB,\n testsBytes: 0.25 * GiB,\n safetyMarginBytes: 1 * GiB,\n};\n\n/** Fraction of IDE+OS reserves kept as growth headroom on the free-RAM path. */\nconst IDE_OS_GROWTH_FRACTION = 0.25;\n\n// ── Pack lookup ───────────────────────────────────────────────────────────────\n\nexport function packForMode(mode: ModelMode, packs: QualifiedPack[] = QUALIFIED_PACKS): QualifiedPack | null {\n return packs.find((p) => p.mode === mode) ?? null;\n}\n\nexport function packById(packId: string, packs: QualifiedPack[] = QUALIFIED_PACKS): QualifiedPack | null {\n return packs.find((p) => p.packId === packId) ?? null;\n}\n\nexport function listModes(): ModelMode[] {\n return ['spark', 'flow', 'forge'];\n}\n\n// ── Fit algorithm ─────────────────────────────────────────────────────────────\n\n/**\n * Fit decision: available memory *now* after IDE/OS/graph/tests reserves and\n * safety margin — not only “weights fit in total RAM”.\n *\n * Target: < 100 ms once system snapshot is warm (pure arithmetic).\n */\nexport function fitPack(input: FitInput): FitResult {\n const r = { ...DEFAULT_RESERVES, ...input.reserves };\n const pack = input.pack;\n const weightsBytes =\n pack.primary.weightsBytes ??\n estimateModelBytes(pack.primary.weightsRef).bytes;\n const ctxTokens = input.contextBudgetTokens ?? pack.contract.capsuleBudgetTokens * 2;\n const kvPer1k = pack.resources.estimatedKvPer1kContext ?? 2 * 1024 * 1024;\n const kvBytes = Math.round((ctxTokens / 1000) * kvPer1k);\n const modelBytes = weightsBytes;\n const needBytes = modelBytes + kvBytes;\n\n const useVram =\n typeof input.system.vramTotalBytes === 'number' && input.system.vramTotalBytes > 0;\n const freeNow = useVram\n ? (input.system.vramFreeBytes ?? 0)\n : input.system.freeRamBytes;\n const loadedBytes = input.system.loaded.reduce((n, m) => n + m.bytes, 0);\n // Prefer free-after-unload for fit of *next* load when something is resident.\n const freePool = freeNow + loadedBytes;\n\n const graphBump =\n (input.repo?.graphNodeCount ?? 0) > 50_000\n ? 0.5 * GiB\n : (input.repo?.fileCount ?? 0) > 5_000\n ? 0.25 * GiB\n : 0;\n const graphBytes = r.graphBytes + graphBump;\n\n // On discrete VRAM, only model+KV compete for VRAM — host reserves stay on RAM.\n // On unified / CPU path: free/available RAM already excludes current IDE/OS\n // usage, so only charge growth (graph/tests/safety + modest IDE/OS headroom).\n const reserved = useVram\n ? r.safetyMarginBytes\n : graphBytes +\n r.testsBytes +\n r.safetyMarginBytes +\n IDE_OS_GROWTH_FRACTION * (r.ideBytes + r.osBytes);\n const freeAfterReserves = Math.max(0, freePool - reserved);\n\n const availableBytes = freeAfterReserves;\n const reasons: string[] = [];\n const headroom = availableBytes - needBytes;\n const ratio = needBytes > 0 ? availableBytes / needBytes : 0;\n\n let label: FitLabel;\n let reducedCapsuleBudgetTokens: number | undefined;\n\n if (availableBytes < needBytes * 0.85) {\n label = 'will_not_fit';\n reasons.push(\n `needs ~${fmtGb(needBytes)} but only ~${fmtGb(availableBytes)} is free after reserves`,\n );\n } else if (ratio < 1.1 || headroom < 0.5 * GiB) {\n label = 'tight';\n reducedCapsuleBudgetTokens = Math.max(\n 1200,\n Math.floor(pack.contract.capsuleBudgetTokens * 0.65),\n );\n reasons.push('tight fit — capsule budget will be reduced automatically');\n } else if (ratio >= 1.6 && headroom >= 2 * GiB) {\n label = 'flies';\n reasons.push('comfortable headroom for this mode');\n } else {\n label = 'comfortable';\n reasons.push('within policy for this machine');\n }\n\n // Large monorepo + forge → soft-downgrade score (does not force will_not_fit).\n if (\n pack.mode === 'forge' &&\n ((input.repo?.fileCount ?? 0) > 10_000 || (input.repo?.graphNodeCount ?? 0) > 100_000) &&\n label === 'comfortable'\n ) {\n reasons.push('large repository — prefer moderated capsule + graph paging');\n }\n\n // Disk: downloads need the full GGUF + headroom on the cache volume (not RAM).\n const diskNeedBytes = Math.round(modelBytes + Math.max(GiB, modelBytes * 0.15));\n if (typeof input.freeDiskBytes === 'number' && Number.isFinite(input.freeDiskBytes)) {\n if (input.freeDiskBytes < diskNeedBytes) {\n if (label !== 'will_not_fit') {\n label = 'will_not_fit';\n }\n reasons.push(\n `needs ~${fmtGb(diskNeedBytes)} free disk for weights, only ~${fmtGb(input.freeDiskBytes)} free`,\n );\n }\n }\n\n // Score: map ratio into 0–100 with floors for labels.\n let score = Math.max(0, Math.min(100, Math.round(ratio * 50)));\n if (label === 'will_not_fit') score = Math.min(score, 20);\n if (label === 'tight') score = Math.min(Math.max(score, 25), 45);\n if (label === 'comfortable') score = Math.min(Math.max(score, 50), 75);\n if (label === 'flies') score = Math.max(score, 80);\n\n return {\n label,\n score,\n needBytes,\n availableBytes,\n diskNeedBytes,\n freeDiskBytes: typeof input.freeDiskBytes === 'number' ? input.freeDiskBytes : undefined,\n breakdown: {\n modelBytes,\n kvBytes,\n // Report the charged growth headroom (not the full static IDE/OS footprint).\n ideBytes: useVram ? 0 : IDE_OS_GROWTH_FRACTION * r.ideBytes,\n osBytes: useVram ? 0 : IDE_OS_GROWTH_FRACTION * r.osBytes,\n graphBytes: useVram ? 0 : graphBytes,\n testsBytes: useVram ? 0 : r.testsBytes,\n freeAfterReservesBytes: freeAfterReserves,\n },\n reducedCapsuleBudgetTokens,\n reasons,\n };\n}\n\nfunction fmtGb(bytes: number): string {\n return `${(bytes / GiB).toFixed(1)} GiB`;\n}\n\n// ── Resolve mode → pack → underlying ──────────────────────────────────────────\n\nexport interface ResolveModeOptions {\n mode?: ModelMode;\n /** Prefer auto-fit when no mode set (default true for first-run wizard). */\n autoFit?: boolean;\n system: SystemMemory;\n repo?: RepoSignals;\n taskClass?: TaskClass;\n /** Free disk on the weight-store volume (bytes). */\n freeDiskBytes?: number;\n /** Installed model names (ollama/lmstudio) for installed: true. */\n installedNames?: string[];\n /** Pin map mode → packId. */\n pin?: { mode: ModelMode; packId: string } | null;\n packs?: QualifiedPack[];\n defaultMode?: ModelMode;\n}\n\nfunction packToProfile(pack: QualifiedPack, underlying: PackWeightsRef, fit: FitResult): ModelExecutionProfile {\n const budget =\n fit.label === 'tight' && fit.reducedCapsuleBudgetTokens\n ? fit.reducedCapsuleBudgetTokens\n : pack.contract.capsuleBudgetTokens;\n return {\n schemaVersion: MODEL_EXECUTION_PROFILE_SCHEMA_VERSION,\n id: underlying.weightsRef,\n displayName: `${pack.displayName} · ${underlying.weightsRef}`,\n mode: pack.mode,\n backend:\n underlying.backend === 'ollama'\n ? 'ollama'\n : underlying.backend === 'llama.cpp'\n ? 'llama.cpp'\n : underlying.backend === 'lm-studio'\n ? 'openai-compatible'\n : 'other',\n toolCalling: pack.contract.toolCalling,\n editFormat: pack.contract.editFormat,\n capsuleBudgetTokens: budget,\n maxParallelEdits: pack.contract.maxParallelEdits,\n maxRepairRounds: pack.contract.maxRepairRounds,\n temperature: 0,\n constrainedDecoding: pack.contract.constrainedDecoding ?? false,\n kvCacheStrategy: pack.contract.kvCacheStrategy,\n resources: {\n minRamGb: pack.resources.minRamGb,\n minVramGb: pack.resources.minVramGb,\n quant: underlying.quant,\n },\n securityTier: pack.contract.securityTier,\n inferenceIsolation: pack.contract.inferenceIsolation ?? 'embedded',\n };\n}\n\nfunction tryWeights(\n pack: QualifiedPack,\n weights: PackWeightsRef,\n system: SystemMemory,\n repo?: RepoSignals,\n taskClass?: TaskClass,\n freeDiskBytes?: number,\n): { fit: FitResult; underlying: PackWeightsRef } {\n const trial: QualifiedPack = { ...pack, primary: weights };\n return {\n fit: fitPack({ system, pack: trial, repo, taskClass, freeDiskBytes }),\n underlying: weights,\n };\n}\n\n/**\n * Resolve a Code Mode to a pack, concrete weights, fit label, and MEP.\n * Refuses primary load when fit is will_not_fit and tries fallbacks; if all\n * fail, returns the best effort with label will_not_fit (caller must not load).\n */\nexport function resolveMode(opts: ResolveModeOptions): ResolvedMode {\n const packs = opts.packs ?? QUALIFIED_PACKS;\n const defaultMode = opts.defaultMode ?? 'flow';\n let mode: ModelMode = opts.mode ?? defaultMode;\n let selection: ResolvedMode['selection'] = opts.mode ? 'explicit' : 'default';\n\n if (!opts.mode && opts.autoFit !== false) {\n mode = recommendMode(opts.system, opts.repo, packs);\n selection = 'auto_fit';\n }\n\n let pack = packForMode(mode, packs);\n if (!pack) {\n pack = packForMode('flow', packs)!;\n mode = 'flow';\n selection = 'default';\n }\n\n if (opts.pin && opts.pin.mode === mode) {\n const pinned = packById(opts.pin.packId, packs);\n if (pinned && pinned.mode === mode) {\n pack = pinned;\n selection = 'pinned';\n }\n }\n\n const candidates = [pack.primary, ...(pack.fallback ?? [])];\n let best: { fit: FitResult; underlying: PackWeightsRef } | null = null;\n\n for (const w of candidates) {\n const trial = tryWeights(pack, w, opts.system, opts.repo, opts.taskClass, opts.freeDiskBytes);\n if (!best || fitRank(trial.fit) > fitRank(best.fit)) best = trial;\n if (trial.fit.label === 'flies' || trial.fit.label === 'comfortable') {\n best = trial;\n break;\n }\n }\n\n const chosen =\n best ?? tryWeights(pack, pack.primary, opts.system, opts.repo, opts.taskClass, opts.freeDiskBytes);\n const profile = packToProfile(pack, chosen.underlying, chosen.fit);\n\n return {\n schemaVersion: MODEL_ORCHESTRATOR_SCHEMA_VERSION,\n mode,\n pack,\n underlying: chosen.underlying,\n fit: chosen.fit,\n profile,\n pinned: selection === 'pinned',\n selection,\n };\n}\n\nfunction fitRank(f: FitResult): number {\n const order: Record<FitLabel, number> = {\n flies: 4,\n comfortable: 3,\n tight: 2,\n will_not_fit: 1,\n };\n return order[f.label] * 1000 + f.score;\n}\n\n/**\n * Pick the strongest mode that still fits at least “comfortable” (or tight\n * for spark). Prefer Flow when both Flow and Forge are comfortable.\n */\nexport function recommendMode(\n system: SystemMemory,\n repo?: RepoSignals,\n packs: QualifiedPack[] = QUALIFIED_PACKS,\n): ModelMode {\n const order: ModelMode[] = ['forge', 'flow', 'spark'];\n let bestTight: ModelMode | null = null;\n for (const mode of order) {\n const pack = packForMode(mode, packs);\n if (!pack) continue;\n const resolved = resolveMode({\n mode,\n autoFit: false,\n system,\n repo,\n packs,\n });\n if (resolved.fit.label === 'flies' || resolved.fit.label === 'comfortable') {\n // Prefer Flow as daily default when Forge also fits, unless repo is tiny.\n if (mode === 'forge') {\n const flow = resolveMode({ mode: 'flow', autoFit: false, system, repo, packs });\n if (flow.fit.label === 'flies' || flow.fit.label === 'comfortable') {\n const files = repo?.fileCount ?? 0;\n if (files < 2000) return 'flow';\n }\n return 'forge';\n }\n return mode;\n }\n if (resolved.fit.label === 'tight' && !bestTight) bestTight = mode;\n }\n return bestTight ?? 'spark';\n}\n\n/** Build orchestrator status for `vg models status` / host UIs. */\nexport function buildOrchestratorStatus(opts: {\n system: SystemMemory;\n repo?: RepoSignals;\n installedNames?: string[];\n /** Free bytes on the weight-store volume (factored into fit). */\n freeDiskBytes?: number;\n /** Single pin (legacy) or full pin map. */\n pin?: { mode: ModelMode; packId: string } | null;\n pins?: Partial<Record<ModelMode, string>>;\n defaultMode?: ModelMode;\n packs?: QualifiedPack[];\n}): OrchestratorStatus {\n const packs = opts.packs ?? QUALIFIED_PACKS;\n const installed = new Set((opts.installedNames ?? []).map((n) => n.toLowerCase()));\n const freeDiskBytes = opts.freeDiskBytes;\n const recommended = recommendMode(opts.system, opts.repo, packs);\n const pinFor = (mode: ModelMode): { mode: ModelMode; packId: string } | null => {\n const fromMap = opts.pins?.[mode];\n if (fromMap) return { mode, packId: fromMap };\n if (opts.pin?.mode === mode) return opts.pin;\n return null;\n };\n const modes = listModes().map((mode) => {\n const resolved = resolveMode({\n mode,\n autoFit: false,\n system: opts.system,\n repo: opts.repo,\n freeDiskBytes,\n pin: pinFor(mode),\n packs,\n });\n const id = resolved.underlying.weightsRef.toLowerCase();\n const installedHit =\n installed.has(id) ||\n [...installed].some((n) => n.includes(id) || id.includes(n));\n return {\n mode,\n packId: resolved.pack.packId,\n displayName: resolved.pack.displayName,\n promise: resolved.pack.promise,\n underlyingModelId: resolved.underlying.weightsRef,\n backend: resolved.underlying.backend,\n fit: resolved.fit.label,\n fitScore: resolved.fit.score,\n needBytes: resolved.fit.needBytes,\n availableBytes: resolved.fit.availableBytes,\n diskNeedBytes: resolved.fit.diskNeedBytes,\n installed: installedHit,\n pinned: resolved.pinned,\n };\n });\n\n const recResolved = resolveMode({\n mode: recommended,\n autoFit: false,\n system: opts.system,\n freeDiskBytes,\n repo: opts.repo,\n pin: pinFor(recommended),\n packs,\n });\n\n return {\n schemaVersion: MODEL_ORCHESTRATOR_SCHEMA_VERSION,\n defaultMode: opts.defaultMode ?? 'flow',\n pin: pinFor(recommended),\n modes,\n recommended,\n system: {\n totalRamBytes: opts.system.totalRamBytes,\n freeRamBytes: opts.system.freeRamBytes,\n ...(typeof opts.system.vramTotalBytes === 'number'\n ? { vramTotalBytes: opts.system.vramTotalBytes }\n : {}),\n ...(typeof opts.system.vramFreeBytes === 'number'\n ? { vramFreeBytes: opts.system.vramFreeBytes }\n : {}),\n ...(typeof freeDiskBytes === 'number' ? { freeDiskBytes } : {}),\n loaded: opts.system.loaded.map((l) => ({ name: l.name, bytes: l.bytes })),\n },\n memoryBreakdown: recResolved.fit.breakdown,\n };\n}\n\n// ── Pin registry (global storage, not in-repo) ────────────────────────────────\n\nexport interface OrchestratorPinState {\n schemaVersion: 'model-orchestrator-pin/0';\n /** mode → packId */\n pins: Partial<Record<ModelMode, string>>;\n /** Workspace / global default mode preference. */\n defaultMode?: ModelMode;\n updatedAt: string;\n}\n\nexport function orchestratorStatePath(\n env: NodeJS.ProcessEnv = process.env,\n platform: NodeJS.Platform = process.platform,\n home?: string,\n): string {\n return path.join(vibgrateDataDir(env, platform, home), 'model-orchestrator', 'state.json');\n}\n\nexport function readOrchestratorState(\n env: NodeJS.ProcessEnv = process.env,\n platform: NodeJS.Platform = process.platform,\n home?: string,\n): OrchestratorPinState {\n const p = orchestratorStatePath(env, platform, home);\n try {\n const raw = JSON.parse(fs.readFileSync(p, 'utf8')) as Partial<OrchestratorPinState>;\n return {\n schemaVersion: 'model-orchestrator-pin/0',\n pins: raw.pins && typeof raw.pins === 'object' ? raw.pins : {},\n defaultMode:\n raw.defaultMode === 'spark' || raw.defaultMode === 'flow' || raw.defaultMode === 'forge'\n ? raw.defaultMode\n : undefined,\n updatedAt: typeof raw.updatedAt === 'string' ? raw.updatedAt : new Date(0).toISOString(),\n };\n } catch {\n return {\n schemaVersion: 'model-orchestrator-pin/0',\n pins: {},\n updatedAt: new Date(0).toISOString(),\n };\n }\n}\n\nexport function writeOrchestratorState(\n state: OrchestratorPinState,\n env: NodeJS.ProcessEnv = process.env,\n platform: NodeJS.Platform = process.platform,\n home?: string,\n): string {\n const p = orchestratorStatePath(env, platform, home);\n fs.mkdirSync(path.dirname(p), { recursive: true });\n const next: OrchestratorPinState = {\n ...state,\n schemaVersion: 'model-orchestrator-pin/0',\n updatedAt: new Date().toISOString(),\n };\n fs.writeFileSync(p, JSON.stringify(next, null, 2) + '\\n', 'utf8');\n return p;\n}\n\nexport function pinPack(\n mode: ModelMode,\n packId: string,\n env?: NodeJS.ProcessEnv,\n platform?: NodeJS.Platform,\n home?: string,\n): OrchestratorPinState {\n const state = readOrchestratorState(env, platform, home);\n if (!packById(packId)) {\n throw new Error(`unknown pack id: ${packId}`);\n }\n state.pins[mode] = packId;\n writeOrchestratorState(state, env, platform, home);\n return state;\n}\n\nexport function unpinPack(\n mode: ModelMode,\n env?: NodeJS.ProcessEnv,\n platform?: NodeJS.Platform,\n home?: string,\n): OrchestratorPinState {\n const state = readOrchestratorState(env, platform, home);\n delete state.pins[mode];\n writeOrchestratorState(state, env, platform, home);\n return state;\n}\n\nexport function setDefaultMode(\n mode: ModelMode,\n env?: NodeJS.ProcessEnv,\n platform?: NodeJS.Platform,\n home?: string,\n): OrchestratorPinState {\n const state = readOrchestratorState(env, platform, home);\n state.defaultMode = mode;\n writeOrchestratorState(state, env, platform, home);\n return state;\n}\n\n/** Active pin for a mode, if any. */\nexport function activePin(\n mode: ModelMode,\n state: OrchestratorPinState = readOrchestratorState(),\n): { mode: ModelMode; packId: string } | null {\n const packId = state.pins[mode];\n return packId ? { mode, packId } : null;\n}\n\n/** Map backend hint to vg code --provider id. */\nexport function providerForBackend(backend: PackWeightsRef['backend']): string {\n switch (backend) {\n case 'ollama':\n return 'ollama';\n case 'llama.cpp':\n return 'llama-cpp';\n case 'lm-studio':\n return 'lmstudio';\n default:\n return 'ollama';\n }\n}\n\n/** Parse mode from user string; null if invalid. */\nexport function parseMode(raw: string | undefined | null): ModelMode | null {\n if (!raw) return null;\n const m = raw.trim().toLowerCase();\n if (m === 'spark' || m === 'flow' || m === 'forge') return m;\n return null;\n}\n"]}
|