@vibgrate/cli 2026.803.3 → 2026.803.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-WYBWUBCC.js +26 -0
- package/dist/{agent-JTA4YWMQ.js.map → agent-WYBWUBCC.js.map} +1 -1
- package/dist/baseline-3HECX4Q6.js +9 -0
- package/dist/{baseline-2V7PKA7Q.js.map → baseline-3HECX4Q6.js.map} +1 -1
- package/dist/{chunk-TNADGCOX.js → chunk-23UPIFRU.js} +8 -8
- package/dist/{chunk-TNADGCOX.js.map → chunk-23UPIFRU.js.map} +1 -1
- package/dist/chunk-2A7XCANX.js +375 -0
- package/dist/chunk-2A7XCANX.js.map +1 -0
- package/dist/{chunk-QMME6TB4.js → chunk-4LGDQBYK.js} +3 -102
- package/dist/chunk-4LGDQBYK.js.map +1 -0
- package/dist/{chunk-L5PUNO3T.js → chunk-4ZMJKR74.js} +451 -22
- package/dist/chunk-4ZMJKR74.js.map +1 -0
- package/dist/{chunk-CPLG4GFB.js → chunk-537JBQVB.js} +4 -4
- package/dist/{chunk-CPLG4GFB.js.map → chunk-537JBQVB.js.map} +1 -1
- package/dist/{chunk-NUZM7UOR.js → chunk-5TS7N7J2.js} +59 -9
- package/dist/chunk-5TS7N7J2.js.map +1 -0
- package/dist/{chunk-XK5LKOBF.js → chunk-5WMFX7TY.js} +4 -4
- package/dist/{chunk-XK5LKOBF.js.map → chunk-5WMFX7TY.js.map} +1 -1
- package/dist/{chunk-M452MRWI.js → chunk-66B4ZQA3.js} +9 -8
- package/dist/chunk-66B4ZQA3.js.map +1 -0
- package/dist/{chunk-WGPS3NZQ.js → chunk-7BU7CWXC.js} +33 -11
- package/dist/chunk-7BU7CWXC.js.map +1 -0
- package/dist/{chunk-3Q3ZXJZP.js → chunk-7TOIESUT.js} +5 -4
- package/dist/chunk-7TOIESUT.js.map +1 -0
- package/dist/{chunk-4ACXDVON.js → chunk-BRUMBQV7.js} +4 -4
- package/dist/{chunk-4ACXDVON.js.map → chunk-BRUMBQV7.js.map} +1 -1
- package/dist/{chunk-M7773OUN.js → chunk-BUCNKYTW.js} +5 -5
- package/dist/{chunk-M7773OUN.js.map → chunk-BUCNKYTW.js.map} +1 -1
- package/dist/{chunk-NSWEJPLV.js → chunk-FAA7RBIG.js} +9 -9
- package/dist/{chunk-NSWEJPLV.js.map → chunk-FAA7RBIG.js.map} +1 -1
- package/dist/chunk-FZ5Y4KEI.js +6 -0
- package/dist/{chunk-7KNFG44U.js.map → chunk-FZ5Y4KEI.js.map} +1 -1
- package/dist/{chunk-UXR7FBE3.js → chunk-HBQC4XQJ.js} +6 -6
- package/dist/{chunk-UXR7FBE3.js.map → chunk-HBQC4XQJ.js.map} +1 -1
- package/dist/{chunk-KYX2YCXT.js → chunk-HVHCXM2E.js} +9 -9
- package/dist/{chunk-KYX2YCXT.js.map → chunk-HVHCXM2E.js.map} +1 -1
- package/dist/{chunk-NJFQCDGA.js → chunk-INIULQEP.js} +3 -3
- package/dist/{chunk-NJFQCDGA.js.map → chunk-INIULQEP.js.map} +1 -1
- package/dist/{chunk-K6Q6HTFD.js → chunk-JZGVUH57.js} +4 -4
- package/dist/{chunk-K6Q6HTFD.js.map → chunk-JZGVUH57.js.map} +1 -1
- package/dist/{chunk-TM5XQY3L.js → chunk-KFK7KCAH.js} +3 -3
- package/dist/{chunk-TM5XQY3L.js.map → chunk-KFK7KCAH.js.map} +1 -1
- package/dist/{chunk-6DFV4WCQ.js → chunk-OVDL76LB.js} +3 -3
- package/dist/{chunk-6DFV4WCQ.js.map → chunk-OVDL76LB.js.map} +1 -1
- package/dist/{chunk-SJFBXCII.js → chunk-QUI3E3TQ.js} +54 -9
- package/dist/chunk-QUI3E3TQ.js.map +1 -0
- package/dist/chunk-RBMKBYGV.js +102 -0
- package/dist/chunk-RBMKBYGV.js.map +1 -0
- package/dist/{chunk-HC44772H.js → chunk-TVRM57CE.js} +5 -373
- package/dist/chunk-TVRM57CE.js.map +1 -0
- package/dist/{chunk-PXM3VZYR.js → chunk-UWVFLVZX.js} +4 -4
- package/dist/{chunk-PXM3VZYR.js.map → chunk-UWVFLVZX.js.map} +1 -1
- package/dist/{chunk-6JP7HGIF.js → chunk-Y4JO6LYP.js} +3 -3
- package/dist/{chunk-6JP7HGIF.js.map → chunk-Y4JO6LYP.js.map} +1 -1
- package/dist/cli.js +489 -337
- package/dist/cli.js.map +1 -1
- package/dist/embed-worker-main.d.ts +2 -0
- package/dist/embed-worker-main.js +64 -0
- package/dist/embed-worker-main.js.map +1 -0
- package/dist/ensure-map-DZ53QXRT.js +31 -0
- package/dist/{ensure-map-TAVYMPEG.js.map → ensure-map-DZ53QXRT.js.map} +1 -1
- package/dist/graph-backend-3A2M22QN.js +13 -0
- package/dist/{graph-backend-WF4LGBGD.js.map → graph-backend-3A2M22QN.js.map} +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +16 -14
- package/dist/index.js.map +1 -1
- package/dist/{interactive-6PN237LX.js → interactive-DB7IC3BL.js} +31 -29
- package/dist/interactive-DB7IC3BL.js.map +1 -0
- package/dist/load-6KVGUQMU.js +11 -0
- package/dist/{load-T2FOJUPI.js.map → load-6KVGUQMU.js.map} +1 -1
- package/dist/{run-outcome-AMIKAASL.js → run-outcome-YOYRC32U.js} +7 -6
- package/dist/run-outcome-YOYRC32U.js.map +1 -0
- package/dist/runtime-session-XEP7IPGP.js +22 -0
- package/dist/{runtime-session-QAVOPSSH.js.map → runtime-session-XEP7IPGP.js.map} +1 -1
- package/dist/session-5WKEACIF.js +17 -0
- package/dist/{session-SCHQQTHN.js.map → session-5WKEACIF.js.map} +1 -1
- package/dist/{stream-json-A6K2MONY.js → stream-json-3OJCPBWY.js} +13 -11
- package/dist/stream-json-3OJCPBWY.js.map +1 -0
- package/dist/{vg-mcp-bridge-3TSFOL4V.js → vg-mcp-bridge-PM3C4FQL.js} +12 -10
- package/dist/vg-mcp-bridge-PM3C4FQL.js.map +1 -0
- package/dist/{vgd-B67JCNJP.js → vgd-UTLMMPIZ.js} +12 -10
- package/dist/vgd-UTLMMPIZ.js.map +1 -0
- package/package.json +1 -1
- package/scripts/postinstall.mjs +22 -1
- package/dist/agent-JTA4YWMQ.js +0 -24
- package/dist/baseline-2V7PKA7Q.js +0 -9
- package/dist/chunk-3Q3ZXJZP.js.map +0 -1
- package/dist/chunk-7KNFG44U.js +0 -6
- package/dist/chunk-HC44772H.js.map +0 -1
- package/dist/chunk-L5PUNO3T.js.map +0 -1
- package/dist/chunk-M452MRWI.js.map +0 -1
- package/dist/chunk-NUZM7UOR.js.map +0 -1
- package/dist/chunk-QMME6TB4.js.map +0 -1
- package/dist/chunk-SJFBXCII.js.map +0 -1
- package/dist/chunk-WGPS3NZQ.js.map +0 -1
- package/dist/ensure-map-TAVYMPEG.js +0 -29
- package/dist/graph-backend-WF4LGBGD.js +0 -11
- package/dist/interactive-6PN237LX.js.map +0 -1
- package/dist/load-T2FOJUPI.js +0 -10
- package/dist/run-outcome-AMIKAASL.js.map +0 -1
- package/dist/runtime-session-QAVOPSSH.js +0 -20
- package/dist/session-SCHQQTHN.js +0 -15
- package/dist/stream-json-A6K2MONY.js.map +0 -1
- package/dist/vg-mcp-bridge-3TSFOL4V.js.map +0 -1
- package/dist/vgd-B67JCNJP.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/relations.ts","../src/engine/lock.ts","../src/engine/embeddings.ts","../src/engine/query.ts","../src/engine/impact.ts"],"names":["fs","path","push","text","round"],"mappings":"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","file":"chunk-HC44772H.js","sourcesContent":["import type { EdgeKind, GraphEdge, GraphNode, VgGraph } from '../schema.js';\n\n/** Indexes over a graph for O(1) neighbor lookups (built once per command). */\nexport class GraphIndex {\n readonly nodeById = new Map<string, GraphNode>();\n private outById = new Map<string, GraphEdge[]>();\n private inById = new Map<string, GraphEdge[]>();\n\n constructor(readonly graph: VgGraph) {\n for (const n of graph.nodes) this.nodeById.set(n.id, n);\n for (const e of graph.edges) {\n push(this.outById, e.src, e);\n push(this.inById, e.dst, e);\n }\n }\n\n out(id: string, kind?: EdgeKind): GraphEdge[] {\n const all = this.outById.get(id) ?? [];\n return kind ? all.filter((e) => e.kind === kind) : all;\n }\n\n in(id: string, kind?: EdgeKind): GraphEdge[] {\n const all = this.inById.get(id) ?? [];\n return kind ? all.filter((e) => e.kind === kind) : all;\n }\n\n node(id: string): GraphNode | undefined {\n return this.nodeById.get(id);\n }\n\n /**\n * Resolved nodes called by `id` — invocations (`call`) plus structural\n * dependency references (`references`, e.g. a constructor-injected field's\n * type), since both represent real usage a caller/impact question cares\n * about. `references` is otherwise only emitted by the precise SCIP/tsc\n * rungs and (for Java DI wiring) the heuristic rung — never a guess.\n */\n callees(id: string): { edge: GraphEdge; node: GraphNode }[] {\n return this.resolveTargets(this.out(id).filter(isUsageEdge), 'dst');\n }\n\n /** Resolved nodes that call or structurally reference `id`. */\n callers(id: string): { edge: GraphEdge; node: GraphNode }[] {\n return this.resolveTargets(this.in(id).filter(isUsageEdge), 'src');\n }\n\n private resolveTargets(edges: GraphEdge[], end: 'src' | 'dst') {\n const out: { edge: GraphEdge; node: GraphNode }[] = [];\n for (const e of edges) {\n const node = this.nodeById.get(e[end]);\n if (node) out.push({ edge: e, node });\n }\n return out;\n }\n}\n\nconst USAGE_KINDS: ReadonlySet<EdgeKind> = new Set(['call', 'references']);\nfunction isUsageEdge(e: GraphEdge): boolean {\n return USAGE_KINDS.has(e.kind);\n}\n\nfunction push(map: Map<string, GraphEdge[]>, key: string, value: GraphEdge): void {\n const list = map.get(key);\n if (list) list.push(value);\n else map.set(key, [value]);\n}\n\n/**\n * Memoized `GraphIndex`, keyed on the graph object's identity.\n *\n * The index (node-by-id + in/out adjacency) is a pure function of the graph's\n * content, and every read path rebuilds it from scratch — an O(nodes + edges)\n * pass that, on a large map, costs hundreds of milliseconds *per query*. Under\n * `vg serve` the same parsed graph object is reused across many tool calls\n * (`GraphSource` caches it by file mtime and only replaces the reference when\n * `graph.json` actually changes), so rebuilding the index on every call is pure\n * waste. Keying a `WeakMap` on that object identity builds the index once and\n * reuses it until the file is rebuilt — at which point `GraphSource` hands back a\n * *new* object, this map misses, and the stale index is collected with the old\n * graph. Correct and stale-safe by construction: a different graph is a\n * different object, so there is no cross-graph reuse and nothing to invalidate.\n *\n * `GraphIndex` is read-only (no method mutates its maps), so sharing one\n * instance across callers is safe.\n */\nconst INDEX_CACHE = new WeakMap<VgGraph, GraphIndex>();\n\nexport function indexFor(graph: VgGraph): GraphIndex {\n let idx = INDEX_CACHE.get(graph);\n if (!idx) {\n idx = new GraphIndex(graph);\n INDEX_CACHE.set(graph, idx);\n }\n return idx;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\n/**\n * Cross-process single-writer lock (O_EXCL create), shared by the embedding\n * cache writer and the auto-refresh rebuild so two vg processes never write\n * the same repo-local artifact at once. A lock whose owning process is dead,\n * or that is older than `staleMs`, is presumed abandoned and reclaimed.\n */\n\n/** A lock older than this is presumed dead (crashed process). */\nexport const DEFAULT_LOCK_STALE_MS = 15 * 60 * 1000;\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (e) {\n return (e as NodeJS.ErrnoException).code === 'EPERM'; // exists, just not ours to signal\n }\n}\n\nfunction lockIsStale(file: string, staleMs: number): boolean {\n try {\n const { pid, at } = JSON.parse(fs.readFileSync(file, 'utf8')) as { pid?: number; at?: number };\n if (typeof at === 'number' && Date.now() - at > staleMs) return true;\n if (typeof pid === 'number' && !isProcessAlive(pid)) return true;\n return false;\n } catch {\n return true; // unreadable/corrupt → reclaim it\n }\n}\n\n/** Take the lock (O_EXCL), reclaiming a stale/dead one. Returns success. */\nexport function acquireLock(file: string, staleMs = DEFAULT_LOCK_STALE_MS): boolean {\n const write = (): boolean => {\n try {\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const fd = fs.openSync(file, 'wx');\n fs.writeFileSync(fd, JSON.stringify({ pid: process.pid, at: Date.now() }));\n fs.closeSync(fd);\n return true;\n } catch {\n return false;\n }\n };\n if (write()) return true;\n if (lockIsStale(file, staleMs)) {\n try {\n fs.rmSync(file, { force: true });\n } catch {\n /* another process may have reclaimed it */\n }\n return write();\n }\n return false;\n}\n\nexport function releaseLock(file: string): void {\n try {\n fs.rmSync(file, { force: true });\n } catch {\n /* best-effort */\n }\n}\n","import * as fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { hashString } from './hash.js';\nimport { cacheDir } from './cache.js';\nimport { acquireLock, releaseLock } from './lock.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Local-embedding semantic search for `vg ask --semantic`/`--deep` (no API key).\n *\n * The embedding backend is an OPTIONAL, lazily-loaded dependency (`fastembed`,\n * Apache-2.0, local ONNX) so the core install stays lean and `ask` never breaks:\n * if the backend or model isn't available it degrades to (prefix-fuzzy) lexical\n * search with a clear note. Embeddings are query-time + cached under\n * `.vibgrate/cache/` (keyed by node-text hash); they are NEVER written into the\n * committed `graph.json`, so the artifact stays byte-deterministic.\n *\n * `--local` disables the model download (semantic is skipped unless already\n * cached via an injected backend), keeping the air-gapped guarantee.\n */\n\nexport interface Embedder {\n /** Stable model id (recorded with cached vectors so a model change invalidates them). */\n id: string;\n /** Embed documents → unit-or-raw vectors (cosine handles normalization). */\n embed(texts: string[]): Promise<number[][]>;\n /** Embed a single query string. */\n embedQuery(text: string): Promise<number[]>;\n}\n\n/** Why semantic fell back to lexical — for calm, specific messaging. */\nexport type EmbedUnavailable = 'not-installed' | 'no-permission' | 'download-failed' | 'init-failed';\n\nexport interface LoadEmbedderOptions {\n local?: boolean; // --local: do not download a model\n model?: string; // override the embedding model id\n noDownload?: boolean; // only load if the model is already cached (never fetch)\n showDownloadProgress?: boolean; // let fastembed print its one-time download progress\n onUnavailable?: (reason: EmbedUnavailable) => void; // called (not thrown) when it can't load\n}\n\n/** The embedding model id in effect (explicit override → default). */\nexport function resolveEmbedModel(model?: string): string {\n return model ?? 'bge-small-en-v1.5';\n}\n\n/**\n * The **central, per-user** model cache — downloaded once per machine and shared\n * across every repo/folder (devs have many repos; the ~tens-of-MB model should\n * not re-download per project). Uses the XDG standard:\n * `$XDG_CACHE_HOME/vibgrate/models` (or `~/.cache/vibgrate/models`); relocate via\n * the standard `XDG_CACHE_HOME`. NB: fastembed's own default is the relative\n * `./local_cache`, i.e. per-CWD — which we override.\n */\nexport function modelCacheDir(): string {\n const base = process.env.XDG_CACHE_HOME || path.join(os.homedir(), '.cache');\n return path.join(base, 'vibgrate', 'models');\n}\n\n/** A machine-global marker written once the model has loaded successfully. */\nfunction modelReadyMarker(modelId: string): string {\n return path.join(modelCacheDir(), `.ready-${safe(modelId)}`);\n}\n\n/**\n * Whether the embedding model is already present on this machine (loaded at least\n * once), so it can be used with **no network**. Lets the background warm-up\n * trigger only when it won't surprise-download.\n */\nexport function isModelReady(modelId = resolveEmbedModel()): boolean {\n return fs.existsSync(modelReadyMarker(modelId));\n}\n\n/**\n * A calm, specific, actionable one-liner for why semantic isn't available right\n * now — built to reassure (lexical still works) and inform, never to alarm. No\n * stack traces, no scary words; always names the off switch and the fix.\n */\nexport function unavailableMessage(reason: EmbedUnavailable): string {\n switch (reason) {\n case 'no-permission':\n return `semantic search couldn't write its model cache at ${modelCacheDir()} — using fast lexical search instead. Relocate it with the standard XDG_CACHE_HOME, or run with --local to stay lexical quietly. (No admin/sudo is ever needed — the cache lives in your home folder.)`;\n case 'download-failed':\n return `the semantic model isn't downloaded yet and couldn't be fetched (offline?) — using fast lexical search. It'll try again next time; run with --local to keep lexical without retrying.`;\n case 'not-installed':\n return `the optional semantic backend isn't available here — using fast lexical search.`;\n case 'init-failed':\n default:\n return `the semantic model couldn't load — using fast lexical search.`;\n }\n}\n\nexport interface ModelCacheInfo {\n dir: string;\n present: boolean;\n bytes: number;\n}\n\n/** Where the shared model lives, whether it's present, and how big it is. */\nexport function modelCacheInfo(modelId = resolveEmbedModel()): ModelCacheInfo {\n const dir = modelCacheDir();\n return { dir, present: isModelReady(modelId) || fs.existsSync(dir), bytes: dirSize(dir) };\n}\n\n/** Remove the shared, re-downloadable model from the central cache. Returns bytes freed. */\nexport function clearModelCache(): number {\n const dir = modelCacheDir();\n const bytes = dirSize(dir);\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n } catch {\n /* best-effort */\n }\n return bytes;\n}\n\nfunction dirSize(dir: string): number {\n let total = 0;\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return 0;\n }\n for (const e of entries) {\n const p = path.join(dir, e.name);\n if (e.isDirectory()) total += dirSize(p);\n else {\n try {\n total += fs.statSync(p).size;\n } catch {\n /* skip unreadable */\n }\n }\n }\n return total;\n}\n\nfunction isPermissionError(e: unknown): boolean {\n const code = (e as NodeJS.ErrnoException | undefined)?.code;\n return code === 'EACCES' || code === 'EPERM' || code === 'EROFS';\n}\n\n/**\n * Whether this repo already has a cached vector set for `modelId` — i.e. semantic\n * search has run here before, so the next run is fast (no first-use download/embed).\n * Lets `ask` show the one-time setup note only when it's actually warranted.\n */\nexport function embeddingsCached(root: string, modelId: string): boolean {\n return fs.existsSync(path.join(cacheDir(root), `embeddings-${safe(modelId)}.json`));\n}\n\n/**\n * Try to load the optional local embedding backend. Returns null (→ caller falls\n * back to lexical) when running `--local`, when the dependency isn't installed,\n * or when the model can't initialize.\n */\nexport async function loadEmbedder(options: LoadEmbedderOptions = {}): Promise<Embedder | null> {\n // `--local` forces the deterministic lexical floor with no model load/download\n // (air-gapped guarantee; also how tests stay offline).\n if (options.local) return null;\n const modelId = resolveEmbedModel(options.model);\n // noDownload (used by the background warm-up): never fetch — bail if not cached.\n if (options.noDownload && !isModelReady(modelId)) return null;\n const fail = (reason: EmbedUnavailable): null => {\n options.onUnavailable?.(reason);\n return null;\n };\n\n // Lazy, optional dependency (native ONNX): loaded only for `vg ask`/`embed`,\n // never by build/verify, so the graph artifact stays deterministic.\n const mod: any = await importEmbedBackend();\n if (!mod?.FlagEmbedding) return fail('not-installed');\n\n const cache = modelCacheDir(); // central, shared across all repos\n try {\n fs.mkdirSync(cache, { recursive: true });\n } catch (e) {\n return fail(isPermissionError(e) ? 'no-permission' : 'init-failed');\n }\n\n try {\n // First use fetches the model. A refused connection fails fast, but a\n // black-holing proxy (common on corporate networks) would hang the first\n // `vg ask` / MCP query_graph forever — bound the wait and fall back to\n // lexical instead. Cached loads are local disk and get the same generous\n // ceiling without ever hitting it.\n const model: any = await withTimeout(\n mod.FlagEmbedding.init({\n model: mapModel(mod, modelId),\n cacheDir: cache,\n showDownloadProgress: options.showDownloadProgress ?? false,\n }) as Promise<unknown>,\n embedInitTimeoutMs(),\n 'embedding model init timed out',\n );\n // Record machine-global readiness so future builds can warm up offline.\n try {\n fs.writeFileSync(modelReadyMarker(modelId), new Date(0).toISOString());\n } catch {\n /* marker is best-effort */\n }\n return {\n id: modelId,\n async embed(texts) {\n const out: number[][] = [];\n for await (const batch of model.embed(texts, 64)) {\n for (const v of batch) out.push(Array.from(v as ArrayLike<number>));\n }\n return out;\n },\n async embedQuery(text) {\n const v = await model.queryEmbed(text);\n return Array.from(v as ArrayLike<number>);\n },\n };\n } catch (e) {\n return fail(isPermissionError(e) ? 'no-permission' : 'download-failed');\n }\n}\n\n/**\n * Import the optional native backend. A host can supply it out-of-tree via\n * `VIBGRATE_EMBEDDER_PATH` — a directory whose `node_modules` contains\n * `fastembed`. Editor integrations use this when their bundled engine ships\n * without the native optional dependency (the VS Code extension installs it\n * into its own storage on consent); the host dir wins over this package's own\n * dependency tree so the copy the user consented to is the one that loads.\n * Any resolution failure falls through — never throws.\n */\nasync function importEmbedBackend(): Promise<any> {\n const hostDir = process.env.VIBGRATE_EMBEDDER_PATH;\n if (hostDir) {\n try {\n const req = createRequire(path.join(hostDir, 'package.json'));\n const mod: any = await import(pathToFileURL(req.resolve('fastembed')).href);\n // A CJS entry imported over ESM may nest its exports under `default`.\n const resolved = mod?.FlagEmbedding ? mod : mod?.default;\n if (resolved?.FlagEmbedding) return resolved;\n } catch {\n /* fall through to normal resolution */\n }\n }\n return await import('fastembed' as string).catch(() => null);\n}\n\n/** Ceiling for the one-time model fetch/init; override via VG_EMBED_TIMEOUT_MS. */\nfunction embedInitTimeoutMs(): number {\n const n = Number(process.env.VG_EMBED_TIMEOUT_MS);\n return Number.isFinite(n) && n > 0 ? n : 60_000;\n}\n\n/** Reject `promise` if it hasn't settled within `ms` (the work itself is not cancelled). */\nexport async function withTimeout<T>(promise: Promise<T>, ms: number, message: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n try {\n return await Promise.race([\n promise,\n new Promise<never>((_, reject) => {\n timer = setTimeout(() => reject(new Error(message)), ms);\n timer.unref?.();\n }),\n ]);\n } finally {\n clearTimeout(timer);\n }\n}\n\nfunction mapModel(mod: any, id: string): unknown {\n const m = mod.EmbeddingModel ?? {};\n if (/bge-small/i.test(id)) return m.BGESmallENV15 ?? m.BGESmallEN ?? id;\n if (/bge-base/i.test(id)) return m.BGEBaseENV15 ?? id;\n if (/all-minilm/i.test(id)) return m.AllMiniLML6V2 ?? id;\n return id;\n}\n\n/** Path segments that carry no semantic signal — dropped from embed context. */\nconst PATH_NOISE = new Set([\n 'src', 'app', 'apps', 'lib', 'libs', 'dist', 'build', 'out', 'index', 'main',\n 'packages', 'pkg', 'test', 'tests', '__tests__', 'spec', 'node_modules', 'internal',\n 'com', 'example', 'demo', 'java', 'net', 'org', 'www',\n]);\n\n/** Meaningful path context for a node: a couple of parent dirs + the filename stem. */\nfunction pathContext(file: string): string {\n const parts = file.split('/');\n const stem = (parts.pop() ?? '').replace(/\\.[^.]+$/, '');\n const dirs = parts.filter((p) => p && !PATH_NOISE.has(p.toLowerCase()));\n return [...dirs.slice(-2), stem].filter(Boolean).join(' ');\n}\n\n/**\n * The text we embed for a node. Alongside identity + signature we add the\n * strongest available signal — the node's **doc-comment / docstring** summary —\n * plus lightweight context already on the graph (file-path words, area label), so\n * a tersely-named symbol (`Table`, `NotificationJob`) a concept query can reach.\n *\n * `document` nodes (markdown, manifests, Docker, CI, OpenAPI, …) put the\n * scrubbed body in `doc` — that body is the primary embed signal so `vg ask`\n * can answer project-context questions, not only code symbols.\n */\nexport function nodeEmbedText(node: GraphNode, areaLabel?: string): string {\n if (node.kind === 'document') {\n const category = (node.signature ?? 'document').replace(/^document:/, '');\n // Category keywords help ops/config queries land on the right file type.\n const categoryHints: Record<string, string> = {\n manifest: 'package dependencies scripts install dependencies versions',\n docker: 'dockerfile container image build runtime',\n compose: 'docker-compose services containers networking volumes',\n ci: 'continuous integration github actions workflow pipeline test build deploy',\n 'build-config': 'typescript tsconfig bundler vite webpack eslint prettier test',\n 'api-contract': 'openapi swagger graphql protobuf api schema endpoints',\n 'task-runner': 'makefile justfile tasks build test run commands',\n workspace: 'monorepo workspace packages pnpm turbo nx',\n infra: 'deploy infrastructure kubernetes kubernetes terraform helm kubernetes',\n 'env-example': 'environment variables configuration secrets template',\n markdown: 'documentation readme guide',\n };\n const hint = categoryHints[category] ?? category;\n return [\n node.qualifiedName,\n 'document',\n category,\n hint,\n pathContext(node.file),\n (node.doc ?? '').slice(0, 5000),\n ]\n .filter(Boolean)\n .join('\\n');\n }\n return [node.qualifiedName, node.kind, node.signature ?? '', node.doc ?? '', pathContext(node.file), areaLabel ?? '']\n .filter(Boolean)\n .join(' ');\n}\n\nexport function cosine(a: number[], b: number[]): number {\n let dot = 0;\n let na = 0;\n let nb = 0;\n const n = Math.min(a.length, b.length);\n for (let i = 0; i < n; i++) {\n dot += a[i] * b[i];\n na += a[i] * a[i];\n nb += b[i] * b[i];\n }\n if (na === 0 || nb === 0) return 0;\n return dot / (Math.sqrt(na) * Math.sqrt(nb));\n}\n\ninterface EmbedCache {\n model: string;\n entries: Record<string, { hash: string; vec: number[] }>;\n}\n\n/** Reports embedding progress: how many of `total` nodes are done so far. */\nexport type EmbedProgress = (done: number, total: number) => void;\n\n/** Nodes embedded per chunk — bounds memory and gives progress granularity. */\nconst EMBED_CHUNK = 256;\n/** Min gap between incremental cache writes (ms) — caps IO on big repos. */\nconst CACHE_WRITE_INTERVAL_MS = 1500;\n\nfunction vectorCachePath(root: string, modelId: string): string {\n return path.join(cacheDir(root), `embeddings-${safe(modelId)}.json`);\n}\n\n/**\n * How many searchable nodes still need embedding for `modelId` — cheap (hashes\n * the embed-text, reads only the cache; never loads the model). Lets the embed\n * command / background warm-up exit instantly when nothing changed.\n */\nexport function countPending(graph: VgGraph, root: string, modelId: string): number {\n const entries = readCacheEntries(vectorCachePath(root, modelId), modelId);\n const areaLabel = new Map(graph.areas.map((a) => [a.id, a.label] as const));\n let pending = 0;\n for (const n of graph.nodes) {\n // file/external stay out of the index; document (docs/env examples) are in.\n if (n.kind === 'file' || n.kind === 'external') continue;\n const h = hashString(nodeEmbedText(n, areaLabel.get(n.area)));\n const cached = entries[n.id];\n if (!cached || cached.hash !== h) pending++;\n }\n return pending;\n}\n\nfunction readCacheEntries(file: string, modelId: string): EmbedCache['entries'] {\n if (!fs.existsSync(file)) return {};\n try {\n const loaded = JSON.parse(fs.readFileSync(file, 'utf8')) as EmbedCache;\n if (loaded.model === modelId && loaded.entries) return loaded.entries;\n } catch {\n /* treat as empty */\n }\n return {};\n}\n\n// Single-writer lock (shared helper — see ./lock.ts) so a foreground `ask`\n// and a background `embed` never both embed the same repo at once (which\n// would race on the cache file).\n\n/**\n * Node embeddings for the searchable (non-file/external) nodes, cache-backed:\n * only nodes whose embed-text changed are re-embedded. The first run embeds in\n * chunks, **persists the cache incrementally** (so an interrupted/timed-out run\n * resumes instead of wasting the work), and reports progress via `onProgress`.\n */\nexport async function getNodeEmbeddings(\n graph: VgGraph,\n embedder: Embedder,\n root: string,\n onProgress?: EmbedProgress,\n): Promise<Map<string, number[]>> {\n const file = vectorCachePath(root, embedder.id);\n let cache: EmbedCache = { model: embedder.id, entries: {} };\n if (fs.existsSync(file)) {\n try {\n const loaded = JSON.parse(fs.readFileSync(file, 'utf8')) as EmbedCache;\n if (loaded.model === embedder.id && loaded.entries) cache = loaded;\n } catch {\n /* rebuild */\n }\n }\n\n const areaLabel = new Map(graph.areas.map((a) => [a.id, a.label] as const));\n // Include document nodes (markdown/txt/env examples) so ask can retrieve docs.\n const targets = graph.nodes.filter((n) => n.kind !== 'file' && n.kind !== 'external');\n const toEmbed: { id: string; text: string; hash: string }[] = [];\n const vectors = new Map<string, number[]>();\n for (const n of targets) {\n const text = nodeEmbedText(n, areaLabel.get(n.area));\n const h = hashString(text);\n const cached = cache.entries[n.id];\n if (cached && cached.hash === h) vectors.set(n.id, cached.vec);\n else toEmbed.push({ id: n.id, text, hash: h });\n }\n\n // Atomic write (temp + rename) so a reader never sees a half-written cache.\n const persist = (): void => {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n const tmp = `${file}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, JSON.stringify(cache));\n fs.renameSync(tmp, file);\n } catch {\n /* cache write best-effort */\n }\n };\n\n if (toEmbed.length) {\n // Single-writer: if another process (e.g. a background warm-up) is already\n // embedding this repo, don't double-work or race the cache — return what's\n // cached so far (lexical floor still applies). It will be complete next run.\n const lock = `${file}.lock`;\n if (!acquireLock(lock)) return vectors;\n try {\n onProgress?.(0, toEmbed.length);\n let lastWrite = Date.now();\n for (let i = 0; i < toEmbed.length; i += EMBED_CHUNK) {\n const slice = toEmbed.slice(i, i + EMBED_CHUNK);\n const vecs = await embedder.embed(slice.map((t) => t.text));\n slice.forEach((t, j) => {\n const vec = vecs[j] ?? [];\n vectors.set(t.id, vec);\n cache.entries[t.id] = { hash: t.hash, vec };\n });\n onProgress?.(Math.min(i + EMBED_CHUNK, toEmbed.length), toEmbed.length);\n // Persist periodically so a crash/timeout resumes from here next run.\n if (Date.now() - lastWrite >= CACHE_WRITE_INTERVAL_MS) {\n persist();\n lastWrite = Date.now();\n }\n }\n // prune entries for nodes no longer present, then a final authoritative write\n const live = new Set(targets.map((n) => n.id));\n for (const id of Object.keys(cache.entries)) if (!live.has(id)) delete cache.entries[id];\n persist();\n } finally {\n releaseLock(lock);\n }\n }\n\n return vectors;\n}\n\nfunction safe(id: string): string {\n return id.replace(/[^a-z0-9.-]+/gi, '_');\n}\n","import { indexFor, type GraphIndex } from './relations.js';\nimport { cosine, type Embedder } from './embeddings.js';\nimport { WEAK_TERMS, expandConcepts, bigramConsumedTokens } from './concepts.js';\nimport type { RelevanceAnalysis } from './relevance-provider.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\n\n/**\n * Deterministic retrieval for `vg ask` (VG-CLI-SPEC §3.2).\n *\n * Builds a structured, fact-annotated, budget-bounded context block for a\n * question — designed to drop straight into an assistant's context. The default\n * is deterministic lexical+structural retrieval: identifier/term matching with\n * morphological prefix-fuzzing, term-role weighting (process verbs like \"add\"\n * only corroborate, never seed — see engine/concepts.ts), static concept\n * expansion (\"payments\" → stripe/billing/…, \"direct debit\" → sepa/bacs/mandate),\n * and a multi-term coverage bonus, ranked with importance as a mild tiebreaker.\n * `--semantic`/`--deep` adds\n * a hybrid local-embedding pass (`queryGraphSemantic`) that surfaces conceptually\n * related code even when no word is shared — still no API key.\n */\n\nexport interface QueryOptions {\n budget?: number; // approx token budget for the context block (default 2000)\n limit?: number; // max seed matches to expand (default 12)\n /** Optional pre-computed relevance analysis (engine/relevance-provider.ts).\n * Injected by async callers so this module stays pure and sync; when\n * absent, ranking is exactly the built-in lexicon path. */\n relevance?: RelevanceAnalysis | null;\n /** Optional per-node topic tags (engine/relevance-enrich.ts). Combined with\n * `relevance.topics` into a bounded affinity bonus: a node structurally\n * tagged with a topic the question is about ranks above an equal textual\n * match outside it. Never seeds alone — it multiplies existing evidence. */\n topicTags?: Map<string, readonly string[]> | null;\n /** Previous conversational ask (multi-turn `vg code`). Its content terms —\n * never its process verbs — join ranking at a damped weight (CARRY_WEIGHT)\n * so a follow-up like \"can we use direct debits?\" keeps the prior turn's\n * topic (\"where is stripe used?\") instead of ranking the repo on the\n * follow-up's words alone. Absent → behaviour is unchanged. */\n priorQuestion?: string | null;\n}\n\nexport interface QueryMatch {\n node: GraphNode;\n score: number;\n why: string;\n}\n\nexport interface QueryResult {\n question: string;\n matches: QueryMatch[];\n context: string;\n tokensEstimate: number;\n}\n\nconst STOPWORDS = new Set([\n 'the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'to', 'of', 'in', 'on', 'for', 'and', 'or',\n 'where', 'what', 'which', 'how', 'do', 'does', 'did', 'i', 'we', 'it', 'this', 'that', 'with',\n 'when', 'who', 'why', 'can', 'should', 'my', 'our', 'you', 'your', 'from', 'by', 'at', 'as',\n // Discovery-question scaffolding: words a caller uses to FRAME the ask\n // (\"find the code responsible for X\", \"I need to modify X, where do I\n // start?\", \"explain how X works in this codebase\") rather than to name the\n // target. Left in, these compete on equal footing with the real identifier\n // terms and can outrank it outright — e.g. \"find the code responsible for\n // deleteAsync\" let \"find\" alone drag in every FindByIdAsync/FindAll method\n // in the repo, none of them the target (VG-LOCATE-FAILURE-ANALYSIS.md).\n 'find', 'code', 'responsible', 'need', 'modify', 'me',\n 'implementation', 'explain', 'works', 'codebase', 'contains', 'file',\n // String/URL occurrence scaffolding: \"does not exist\", \"find occurrences of …\"\n // must not light up DoesNot*/NonExisting*/commandExists via weak substrings\n // (field report: https://…/signup does not exist find occurrences).\n 'not', 'no', 'exist', 'exists', 'existing', 'occurrence', 'occurrences',\n 'occurence', 'occurences', 'every', 'place', 'places', 'string', 'literal',\n 'text', 'search', 'locate', 'look', 'looking', 'show', 'list', 'all',\n]);\n\n/**\n * Strip sentence punctuation from a URL match without breaking real query\n * strings (`?key=value`). A lone trailing `?` / `!` is English punctuation\n * (\"where is https://…/signup?\") — leaving it in the needle makes the literal\n * sweep miss the bare path in source.\n */\nfunction cleanUrlNeedle(raw: string): string {\n let s = raw.trim();\n // Trailing ) ] } > , ; : ! . from markdown links / sentence ends.\n s = s.replace(/[.,;:!)\\]}>]+$/g, '');\n // Lone trailing `?` → drop. Keep `?key=…` (content after `?`).\n if (s.endsWith('?')) {\n const qi = s.lastIndexOf('?');\n if (qi === s.length - 1) s = s.slice(0, -1);\n }\n return s;\n}\n\n/**\n * Extract string/URL needles a caller is asking to *locate as text*, not as\n * bag-of-words symbol terms. URLs and quoted phrases are exact-match material\n * for the literal sweep (`search_symbols` / `search_code`); feeding their path\n * segments into lexical symbol ranking produces confidently wrong seeds\n * (dash → dashboard package, exist → NonExisting, …).\n */\nexport function extractLiteralNeedles(question: string): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n const push = (raw: string, kind: 'url' | 'quote') => {\n let s = raw.trim();\n s = kind === 'url' ? cleanUrlNeedle(s) : s.replace(/[.,;:!)\\]}>?]+$/g, '');\n if (s.length < 2 || seen.has(s)) return;\n seen.add(s);\n out.push(s);\n };\n for (const m of question.matchAll(/https?:\\/\\/[^\\s\"'`<>]+/gi)) push(m[0]!, 'url');\n for (const m of question.matchAll(/([\"'`])((?:(?!\\1)[^\\\\]|\\\\.){2,})\\1/g)) {\n push(m[2]!.replace(/\\\\(.)/g, '$1'), 'quote');\n }\n return out;\n}\n\n/** Question text with URL/quoted needles removed so residual tokens can name symbols. */\nexport function stripLiteralNeedles(question: string): string {\n let s = question;\n // Strip raw URL spans first (may still carry a trailing `?` from the ask).\n for (const m of question.matchAll(/https?:\\/\\/[^\\s\"'`<>]+/gi)) {\n s = s.split(m[0]!).join(' ');\n }\n for (const lit of extractLiteralNeedles(question)) {\n s = s.split(lit).join(' ');\n }\n // Also strip bare quote pairs left behind.\n s = s.replace(/([\"'`])\\s*\\1/g, ' ');\n return s.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Residual ask used for graph symbol ranking when the question embeds a\n * URL/quote. Empty when only framing words remain (\"where is …?\") so we do\n * not light up unrelated symbols like `applyPlan.where`.\n */\nexport function residualForSymbolSearch(question: string): string {\n const literals = extractLiteralNeedles(question);\n if (literals.length === 0) return question.trim();\n const stripped = stripLiteralNeedles(question);\n return tokenize(stripped).length === 0 ? '' : stripped;\n}\n\n/**\n * True when the instruction is a string/URL occurrence locate (not an edit).\n * Used to skip PatchIR grammar and answer from the literal sweep without\n * dumping constrained-decoding JSON into the VG Code panel.\n */\nexport function isLocateOnlyInstruction(instruction: string): boolean {\n const q = instruction.trim();\n if (!q) return false;\n const needles = extractLiteralNeedles(q);\n const hasLocateFrame =\n /\\b(where\\s+is|where\\s+are|find\\s+(all\\s+|every\\s+)?occurrence|find\\s+occurrences|does\\s+not\\s+exist|locate|search\\s+for)\\b/i.test(\n q,\n ) ||\n (needles.length > 0 && /^https?:\\/\\//i.test(q));\n // Strong edit verbs cancel locate-only (ignore \"does not exist\" as non-edit).\n const withoutExist = q.replace(/\\bdoes\\s+not\\s+exist\\b/gi, ' ');\n if (\n /\\b(fix|edit|change|replace|implement|refactor|rename|patch|create\\s+file|delete\\s+file|add\\s+a\\b|remove\\s+the\\b)\\b/i.test(\n withoutExist,\n )\n ) {\n return false;\n }\n if (needles.some((n) => /^https?:\\/\\//i.test(n))) return true;\n return hasLocateFrame && needles.length > 0;\n}\n\nexport function queryGraph(graph: VgGraph, question: string, options: QueryOptions = {}): QueryResult {\n const budget = options.budget ?? 2000;\n const limit = options.limit ?? 12;\n // When the ask embeds a URL or quoted string, score symbols only on the\n // residual framing text. Empty residual → empty matches (honest miss) rather\n // than path-token false positives that poison Task Capsules.\n const literals = extractLiteralNeedles(question);\n const forTokens = literals.length > 0 ? stripLiteralNeedles(question) : question;\n const prep = prepareTerms(forTokens, options.relevance, priorResidual(options.priorQuestion));\n const weightOf = termWeights(graph, prep.terms.map((t) => t.term));\n const index = indexFor(graph);\n\n const scored: QueryMatch[] = [];\n // Two honest-miss paths: literal-only locate (no identifier terms after\n // stripping needles) and weak-only asks (\"add a new feature\") whose every\n // term is a process verb — seeding those from `add*`/`create*` surface\n // matches is exactly the capsule-poisoning failure (field report 2026-07).\n if (prep.hasContent) {\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n const { score, why } = scoreNode(node, prep.terms, weightOf);\n if (score > 0) {\n const affinity = topicAffinity(node.id, options.relevance, options.topicTags);\n scored.push({\n node,\n score: round(score * affinity.boost * (1 + IMPORTANCE_WEIGHT * node.importance)),\n why: why + affinity.label,\n });\n }\n }\n scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));\n }\n\n const seeds = scored.slice(0, limit);\n const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget, literals);\n\n return { question, matches: seeds, context, tokensEstimate };\n}\n\nexport interface SemanticQueryOptions extends QueryOptions {\n embedder: Embedder;\n /** Precomputed node vectors (from getNodeEmbeddings); falls back to lexical for nodes without one. */\n nodeVectors: Map<string, number[]>;\n}\n\n/**\n * Reciprocal Rank Fusion constant (the standard k=60). Fusing RANKINGS\n * instead of blending raw scores removes the need to calibrate two\n * incomparable scales (tiered lexical evidence vs cosine similarity): a node's\n * fused score is Σ 1/(k + rankᵢ) over the lists it appears in, so agreement\n * between signals dominates and a single signal's outlier magnitude cannot.\n */\nconst RRF_K = 60;\n\n/** 1-based ranks for a scored id list (desc score, qualifiedName tiebreak). */\nfunction ranksOf(scores: Map<string, number>, nameOf: (id: string) => string): Map<string, number> {\n const ids = [...scores.entries()]\n .filter(([, s]) => s > 0)\n .sort((a, b) => b[1] - a[1] || nameOf(a[0]).localeCompare(nameOf(b[0])))\n .map(([id]) => id);\n return new Map(ids.map((id, i) => [id, i + 1]));\n}\n\n/**\n * Hybrid lexical + local-embedding retrieval, combined with Reciprocal Rank\n * Fusion (Phase 3.2 — replaces the former 50/50 score blend), so a question\n * like \"where do we handle auth failures?\" can surface `verify_token` even\n * with no shared identifier. Topic affinity and importance stay multiplicative\n * tiebreakers on the fused score. Deterministic given the same model + cached\n * vectors; embeddings live only in the cache, never in `graph.json`.\n */\nexport async function queryGraphSemantic(\n graph: VgGraph,\n question: string,\n options: SemanticQueryOptions,\n): Promise<QueryResult> {\n const budget = options.budget ?? 2000;\n const limit = options.limit ?? 12;\n const literals = extractLiteralNeedles(question);\n const forTokens = literals.length > 0 ? stripLiteralNeedles(question) : question;\n const prep = prepareTerms(forTokens, options.relevance, priorResidual(options.priorQuestion));\n const terms = prep.terms.map((t) => t.term);\n const weightOf = termWeights(graph, terms);\n const index = indexFor(graph);\n // Embed the residual ask (without URL/quote noise) so semantic neighbours\n // aren't dragged toward package names that share host path segments.\n const queryVec = await options.embedder.embedQuery(forTokens || question);\n\n // Raw lexical scores (pre-importance) — RRF consumes only their ORDER.\n // Weak-only asks get no lexical evidence (same suppression as queryGraph);\n // the semantic cosine below may still surface conceptual neighbours for them.\n const lexRaw = new Map<string, number>();\n const whyById = new Map<string, string>();\n if (prep.hasContent) {\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n const { score, why } = scoreNode(node, prep.terms, weightOf);\n lexRaw.set(node.id, score);\n whyById.set(node.id, why);\n }\n }\n\n const scored: QueryMatch[] = [];\n // Literal-only asks: skip the semantic loop entirely — embeddings over\n // \"does not exist find occurrences\" still surface unrelated hubs.\n if (terms.length > 0 || literals.length === 0) {\n // Independent per-signal rankings, then RRF.\n const semRaw = new Map<string, number>();\n const nodeById = new Map<string, GraphNode>();\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n nodeById.set(node.id, node);\n const vec = options.nodeVectors.get(node.id);\n const sem = vec && terms.length > 0 ? Math.max(0, cosine(queryVec, vec)) : 0;\n if (sem > 0) semRaw.set(node.id, sem);\n }\n const nameOf = (id: string) => nodeById.get(id)?.qualifiedName ?? id;\n const lexRanks = ranksOf(lexRaw, nameOf);\n const semRanks = ranksOf(semRaw, nameOf);\n for (const [id, node] of nodeById) {\n const lr = lexRanks.get(id);\n const sr = semRanks.get(id);\n if (lr === undefined && sr === undefined) continue;\n const fused = (lr !== undefined ? 1 / (RRF_K + lr) : 0) + (sr !== undefined ? 1 / (RRF_K + sr) : 0);\n const sem = semRaw.get(id) ?? 0;\n const lexWhy = whyById.get(id);\n const affinity = topicAffinity(id, options.relevance, options.topicTags);\n const why = (lexWhy || (sem > 0.3 ? `semantic match (${sem.toFixed(2)})` : 'weak match')) + affinity.label;\n scored.push({ node, score: round(fused * affinity.boost * (1 + IMPORTANCE_WEIGHT * node.importance)), why });\n }\n scored.sort((a, b) => b.score - a.score || a.node.qualifiedName.localeCompare(b.node.qualifiedName));\n }\n\n const seeds = scored.slice(0, limit);\n const { context, tokensEstimate } = buildContext(graph, index, question, seeds, budget, literals);\n return { question, matches: seeds, context, tokensEstimate };\n}\n\n/**\n * Split on anything that isn't a Unicode letter/number (`\\p{L}\\p{N}`, not the\n * ASCII-only `[a-z0-9]`) so identifiers in non-Latin scripts (Japanese,\n * Cyrillic, ...) survive tokenization instead of vanishing entirely — the\n * ASCII-only split treated every character of e.g. `名前` as a separator,\n * producing zero terms and a guaranteed empty result for any question about\n * it (VG-LOCATE-FAILURE-ANALYSIS.md). Length floor is 1, not 2: a single\n * non-stopword letter/digit is still the whole identifier when that's genuinely\n * the symbol's name (adversarial fixtures deliberately use bare `f`/`x`/`h`\n * names to stress this) — STOPWORDS already screens out short function words.\n */\nfunction tokenize(q: string): string[] {\n return [\n ...new Set(\n q\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter((t) => t.length >= 1 && !STOPWORDS.has(t)),\n ),\n ];\n}\n\n/** Ordered, lowercased token stream WITH stopwords — bigram concepts (\"sign in\",\n * \"direct debit\") need adjacency over the raw word order. */\nfunction tokenizeOrdered(q: string): string[] {\n return q\n .toLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter((t) => t.length >= 1);\n}\n\n/**\n * A query term with its role resolved. Roles decide how much evidence a match\n * carries (see scoreNode):\n * - content — names the topic; full weight, counts toward coverage\n * - weak — process verb (\"add\", \"create\", \"via\"); down-weighted, can only\n * corroborate a content match, never carry a seed alone\n * - expansion — concept vocabulary from the lexicon (\"payments\"→\"stripe\");\n * reduced weight, counts as content evidence, provenance in `why`\n */\ninterface QueryTerm {\n term: string;\n weak: boolean;\n /** Source token/bigram when this term came from concept expansion. */\n from?: string;\n /** Provider-supplied confidence (0..1) when this term came from the optional\n * relevance provider; replaces the flat EXPANSION_WEIGHT for that term. */\n providerWeight?: number;\n /** True when this term was carried over from the previous conversational\n * turn (QueryOptions.priorQuestion); scores at CARRY_WEIGHT. */\n carried?: boolean;\n}\n\ninterface PreparedTerms {\n terms: QueryTerm[];\n /** True when at least one content or expansion term exists — the bar a\n * question must clear before ANY node may seed. */\n hasContent: boolean;\n}\n\n/** Weak process verbs corroborate at a fraction of a content term's weight. */\nconst WEAK_TERM_WEIGHT = 0.25;\n/** Concept expansions score below a literal question term of the same rarity. */\nconst EXPANSION_WEIGHT = 0.7;\n/** Per extra distinct content term matched, the multiplicative coverage bonus.\n * Multi-topic evidence (\"direct\" + \"debit\" + \"payments\") must beat any\n * single-term surface hit (\"add\") by construction, not by luck. */\nconst COVERAGE_BONUS = 0.35;\n/** Terms carried from the previous conversational turn score at half weight:\n * enough to keep a follow-up anchored to the conversation's topic (and to\n * rescue weak-only follow-ups like \"can we use it?\"), never enough for stale\n * context to outrank a clearly-named new topic in the current ask. */\nconst CARRY_WEIGHT = 0.5;\n\n/** Resolve term roles + concept expansions for the residual ask text. */\nfunction prepareTerms(forTokens: string, relevance?: RelevanceAnalysis | null, prior?: string | null): PreparedTerms {\n const base = tokenize(forTokens);\n const ordered = tokenizeOrdered(forTokens);\n const baseSet = new Set(base);\n // A token consumed by a fired bigram concept (\"direct\" in \"direct debits\")\n // is demoted to the weak role: the bigram's expansions carry the topic, and\n // the constituent alone is a distractor magnet (directGet, redirectUrl, …).\n const consumed = bigramConsumedTokens(ordered);\n const terms: QueryTerm[] = base.map((t) => ({ term: t, weak: WEAK_TERMS.has(t) || consumed.has(t) }));\n const have = new Set(base);\n for (const e of expandConcepts(ordered)) {\n if (baseSet.has(e.term)) continue;\n terms.push({ term: e.term, weak: false, from: e.from });\n have.add(e.term);\n }\n // Provider expansions (already sanitized by engine/relevance-provider.ts)\n // join as expansion-role terms with their own confidence weight. The\n // built-in lexicon wins ties: a term it already produced is not re-added,\n // so provider presence never changes the score of a lexicon-covered term.\n for (const e of relevance?.expansions ?? []) {\n if (have.has(e.term)) continue;\n terms.push({ term: e.term, weak: false, from: e.from, providerWeight: e.weight });\n have.add(e.term);\n }\n // Conversation carry-over: the previous turn's CONTENT terms (plus their\n // lexicon expansions) join at CARRY_WEIGHT. Weak process verbs from the\n // prior turn are dropped outright — carrying \"add\"/\"use\" forward would\n // re-open the grab-bag failure this module exists to prevent. A term the\n // current ask already produced is never re-added, so the current turn\n // always wins ties and single-turn behaviour is byte-identical.\n if (prior?.trim()) {\n const priorOrdered = tokenizeOrdered(prior);\n const priorConsumed = bigramConsumedTokens(priorOrdered);\n for (const t of tokenize(prior)) {\n if (have.has(t) || WEAK_TERMS.has(t) || priorConsumed.has(t)) continue;\n terms.push({ term: t, weak: false, carried: true });\n have.add(t);\n }\n for (const e of expandConcepts(priorOrdered)) {\n if (have.has(e.term)) continue;\n terms.push({ term: e.term, weak: false, from: e.from, carried: true });\n have.add(e.term);\n }\n }\n const hasContent = terms.some((t) => !t.weak);\n return { terms, hasContent };\n}\n\n/** Residual text of the previous ask, with URL/quoted needles stripped so a\n * pasted link in turn N-1 cannot poison turn N's carried vocabulary. */\nfunction priorResidual(prior: string | null | undefined): string | null {\n const raw = prior?.trim();\n if (!raw) return null;\n return extractLiteralNeedles(raw).length > 0 ? stripLiteralNeedles(raw) : raw;\n}\n\n/**\n * Plain-language concept map for one ask: how its words were interpreted —\n * fired concept/bigram expansions, relevance-kernel topics and vocabulary,\n * and terms carried from the previous conversational turn. Rendered into the\n * Task Capsule so a model (especially a small local one) can read the\n * inference chain (\"direct debits\" → debit/mandate/…; topic payments →\n * stripe/billing/…) as sentences instead of reverse-engineering the `a→b`\n * slugs in per-seed match provenance. Deterministic and bounded; empty when\n * nothing fired (honest-empty asks stay empty).\n */\nexport function conceptMapLines(\n question: string,\n relevance?: RelevanceAnalysis | null,\n priorQuestion?: string | null,\n): string[] {\n const cap = (xs: string[]) => [...new Set(xs)].slice(0, 8).join(', ');\n const literals = extractLiteralNeedles(question);\n const residual = literals.length > 0 ? stripLiteralNeedles(question) : question;\n const lines: string[] = [];\n\n // Lexicon / bigram expansions, grouped by the ask term that fired them.\n const byFrom = new Map<string, string[]>();\n for (const e of expandConcepts(tokenizeOrdered(residual))) {\n const list = byFrom.get(e.from) ?? [];\n list.push(e.term);\n byFrom.set(e.from, list);\n }\n for (const [from, terms] of byFrom) {\n lines.push(`- \"${from}\" in the ask implies these codebase identifiers: ${cap(terms)}.`);\n }\n\n // Relevance-kernel topics + their vocabulary (provider seam, when active).\n if (relevance?.topics?.length) {\n const topicVocab = new Map<string, string[]>();\n for (const e of relevance.expansions ?? []) {\n const list = topicVocab.get(e.from) ?? [];\n list.push(e.term);\n topicVocab.set(e.from, list);\n }\n for (const t of relevance.topics.slice(0, 3)) {\n const vocab = topicVocab.get(t.id);\n lines.push(\n vocab?.length\n ? `- The ask is about the \"${t.id}\" domain; code for it typically uses: ${cap(vocab)}.`\n : `- The ask is about the \"${t.id}\" domain.`,\n );\n }\n }\n\n // Conversation carry-over provenance.\n const priorText = priorResidual(priorQuestion);\n if (priorText) {\n const current = new Set(tokenize(residual));\n const consumed = bigramConsumedTokens(tokenizeOrdered(priorText));\n const carried = tokenize(priorText).filter((t) => !current.has(t) && !WEAK_TERMS.has(t) && !consumed.has(t));\n if (carried.length) {\n lines.push(`- This is a follow-up; topic words carried from the previous ask: ${cap(carried)}.`);\n }\n }\n\n if (lines.length) {\n lines.push(\n '- Seed notation below: `a→b` = ask term \"a\" implied identifier \"b\"; `~t` = word-form match; `↩t` = carried from the previous ask.',\n );\n }\n return lines;\n}\n\nfunction scoreNode(node: GraphNode, terms: QueryTerm[], weightOf: (t: string) => number = () => 1): { score: number; why: string } {\n let score = 0;\n let contentHits = 0;\n const hits: string[] = [];\n const name = node.name.toLowerCase();\n const qn = node.qualifiedName.toLowerCase();\n const file = node.file.toLowerCase();\n // Directory segments of the file path: a term naming a whole directory\n // (\"payments\" → src/payments/…) is domain evidence, stronger than an\n // incidental substring somewhere in the path.\n const dirSegments = new Set(file.split('/').slice(0, -1));\n // Split the ORIGINAL name on camelCase / snake_case, then lowercase the parts\n // (splitting must see the capitals, so it happens before lowercasing).\n const nameParts = identifierParts(node.name);\n for (const { term: t, weak, from, providerWeight, carried } of terms) {\n // Each term's contribution is weighted by its specificity (IDF over symbol\n // names): a match on a distinctive term (\"toComparable\", \"layoutFor\") counts\n // for more than a match on a term shared by hundreds of symbols (\"code\",\n // \"get\", \"run\"). Without this, an incidental exact-name hit on a common word\n // in a natural-language question outranked the conceptually-correct symbol,\n // and importance weighting amplified the wrong hit (VG-NAVIGATION trace).\n // Role multipliers stack on top: process verbs corroborate at a fraction,\n // concept expansions score below a literal term of the same rarity.\n // Expansion role multiplier: provider expansions carry their own 0..1\n // confidence (capped at the lexicon's EXPANSION_WEIGHT so an installed\n // provider can widen vocabulary but never outrank the reviewed lexicon's\n // evidence class); lexicon expansions keep the flat EXPANSION_WEIGHT.\n const expansionW = providerWeight !== undefined ? Math.min(providerWeight, EXPANSION_WEIGHT) : from ? EXPANSION_WEIGHT : 1;\n const w = weightOf(t) * (weak ? WEAK_TERM_WEIGHT : 1) * expansionW * (carried ? CARRY_WEIGHT : 1);\n const label = (carried ? '↩' : '') + (from ? `${from}→${t}` : t);\n let contribution = 0;\n if (name === t) {\n contribution = 10 * w;\n hits.push(label);\n } else if (nameParts.has(t)) {\n contribution = 6 * w;\n hits.push(label);\n } else if (name.includes(t)) {\n contribution = 4 * w;\n hits.push(label);\n } else if (qn.includes(t)) {\n contribution = 3 * w;\n hits.push(label);\n } else if (fuzzyPartMatch(t, nameParts)) {\n // Morphological / subword match: \"authentication\" ↔ \"authenticate\"\n // (shared prefix), so lexical ask survives word-form differences without\n // a model. The semantic path handles non-shared-root synonyms.\n contribution = 2 * w;\n hits.push((carried ? '↩' : '') + (from ? `~${from}→${t}` : `~${t}`));\n } else if (dirSegments.has(t)) {\n contribution = 2 * w;\n hits.push(label);\n } else if (file.includes(t)) {\n contribution = 1 * w;\n hits.push(label);\n }\n if (contribution > 0) {\n score += contribution;\n if (!weak) contentHits += 1;\n }\n }\n // A node whose only evidence is weak process verbs is noise by definition —\n // the `add`-grab-bag capsule failure. Suppress it outright: weak terms\n // corroborate content matches, they never carry a seed.\n if (contentHits === 0) return { score: 0, why: '' };\n // Reward multi-term topic coverage multiplicatively so converging evidence\n // (\"direct\" + \"debit\" + payments-expansion) dominates single-term hits.\n score *= 1 + COVERAGE_BONUS * Math.min(contentHits - 1, 4);\n return { score, why: hits.length ? `matched: ${hits.join(', ')}` : '' };\n}\n\n/**\n * Importance is a mild tiebreaker, not a doubling. The old `1 + importance`\n * let a hub (importance→1) double its score and outrank a stronger textual\n * match on the actual target; at 0.4 a top hub adds at most 40%, enough to\n * break genuine ties without overriding term evidence.\n */\nconst IMPORTANCE_WEIGHT = 0.4;\n\n/**\n * Topic-affinity bonus cap: a node whose enrichment tags intersect the\n * question's inferred topics gains at most this fraction on top of its\n * textual evidence. Sized between IMPORTANCE_WEIGHT (0.4) and nothing:\n * strong enough to break domain ties (\"direct debits\" → the payments file\n * over an equal-scoring name hit elsewhere), never strong enough to outrank\n * a clearly better textual match — and it multiplies an existing non-zero\n * score, so it can never conjure a seed by itself.\n */\nconst TOPIC_AFFINITY_WEIGHT = 0.3;\n\n/** Affinity multiplier + provenance for one node under the current analysis. */\nfunction topicAffinity(\n nodeId: string,\n relevance: RelevanceAnalysis | null | undefined,\n topicTags: Map<string, readonly string[]> | null | undefined,\n): { boost: number; label: string } {\n if (!relevance?.topics?.length || !topicTags) return { boost: 1, label: '' };\n const tags = topicTags.get(nodeId);\n if (!tags?.length) return { boost: 1, label: '' };\n let affinity = 0;\n const matched: string[] = [];\n for (const t of relevance.topics) {\n if (tags.includes(t.id)) {\n affinity += t.score;\n matched.push(t.id);\n }\n }\n if (affinity <= 0) return { boost: 1, label: '' };\n return { boost: 1 + TOPIC_AFFINITY_WEIGHT * Math.min(affinity, 1), label: `, topic:${matched.sort().join('+')}` };\n}\n\n/**\n * Per-term specificity weights (IDF) for one question, computed over the graph's\n * symbol-name vocabulary: `ln((N+1)/(df+1)) + 1`, clamped to a sane band. A term\n * that appears in one symbol name is highly discriminating; one that appears in\n * hundreds (\"get\", \"code\", \"run\", \"handler\") is near-noise. Clamped so a term\n * matching nothing (huge idf, but it scores 0 anyway) or everything can't\n * distort the scale. Cost is one O(nodes) pass, dwarfed by the scoring loop.\n */\nfunction termWeights(graph: VgGraph, terms: string[]): (t: string) => number {\n if (terms.length === 0) return () => 1;\n const df = new Map<string, number>();\n let n = 0;\n for (const node of graph.nodes) {\n if (node.kind === 'file' || node.kind === 'external') continue;\n n++;\n const name = node.name.toLowerCase();\n const parts = identifierParts(node.name);\n for (const t of terms) {\n if (parts.has(t) || name.includes(t)) df.set(t, (df.get(t) ?? 0) + 1);\n }\n }\n const w = new Map<string, number>();\n for (const t of terms) {\n const idf = Math.log((n + 1) / ((df.get(t) ?? 0) + 1)) + 1;\n // Ceiling of 8 (vs a natural df≈40 idf ≈ 5.4) keeps genuinely rare terms\n // dominant while a term matching nothing/only a file path can't distort.\n w.set(t, Math.max(0.5, Math.min(8, idf)));\n }\n return (t: string) => w.get(t) ?? 1;\n}\n\n/**\n * camelCase / snake_case / kebab split of an identifier → lowercased parts.\n * The separator alternative is Unicode-letter-aware (`\\p{L}\\p{N}`, not\n * ASCII-only `a-zA-Z0-9`) so non-Latin identifiers split on punctuation\n * without losing every character to it; the camelCase boundary lookaround\n * stays ASCII-only since upper/lowercase casing is itself an ASCII-script\n * concept — scripts without case simply never trigger it and fall through to\n * the separator split.\n */\nexport function identifierParts(name: string): Set<string> {\n return new Set(\n name\n .split(/[^\\p{L}\\p{N}]+|(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/u)\n .filter(Boolean)\n .map((s) => s.toLowerCase()),\n );\n}\n\n/** A term fuzzily matches a part if they share a long-enough prefix (same root). */\nfunction fuzzyPartMatch(term: string, parts: Set<string>): boolean {\n for (const part of parts) {\n const shared = sharedPrefixLen(term, part);\n if (shared >= 5 && shared >= 0.6 * Math.min(term.length, part.length)) return true;\n }\n return false;\n}\n\nfunction sharedPrefixLen(a: string, b: string): number {\n const n = Math.min(a.length, b.length);\n let i = 0;\n while (i < n && a[i] === b[i]) i++;\n return i;\n}\n\nfunction buildContext(\n graph: VgGraph,\n index: GraphIndex,\n question: string,\n seeds: QueryMatch[],\n budget: number,\n literals: string[] = [],\n): { context: string; tokensEstimate: number } {\n const lines: string[] = [];\n lines.push(`# Context for: ${question}`);\n lines.push('');\n if (literals.length) {\n lines.push('## Literal string(s) to locate (exact text, not symbol names)');\n for (const lit of literals) lines.push(`- \\`${lit}\\``);\n lines.push(\n '_Use a quoted phrase / URL search (`search_symbols` or `search_code` with the exact needle) for occurrences. Graph symbols below (if any) are residual identifier hints only._',\n );\n lines.push('');\n }\n if (seeds.length === 0) {\n lines.push(\n literals.length\n ? '_No graph symbols matched residual terms — this is expected for a pure string/URL occurrence search. Run a literal sweep on the needle(s) above._'\n : '_No matching symbols found in the map. Try different terms, or `vg hubs` for the most important code._',\n );\n const text = lines.join('\\n');\n return { context: text, tokensEstimate: estimateTokens(text) };\n }\n\n for (const { node, why } of seeds) {\n const block: string[] = [];\n block.push(`## ${node.qualifiedName} (${node.kind}, ${node.file}:${node.span.start})`);\n if (node.signature) block.push('`' + node.signature + '`');\n const callees = index.callees(node.id).map((x) => x.node.qualifiedName);\n const callers = index.callers(node.id).map((x) => x.node.qualifiedName);\n if (callees.length) block.push(`calls: ${unique(callees).slice(0, 8).join(', ')}`);\n if (callers.length) block.push(`called by: ${unique(callers).slice(0, 8).join(', ')}`);\n block.push(`importance ${node.importance.toFixed(3)} · area #${node.area}${node.isHub ? ' · hub' : ''} · ${why}`);\n block.push('');\n\n const candidate = lines.concat(block).join('\\n');\n if (estimateTokens(candidate) > budget && lines.length > 2) break;\n lines.push(...block);\n }\n\n const text = lines.join('\\n');\n return { context: text, tokensEstimate: estimateTokens(text) };\n}\n\nfunction unique(xs: string[]): string[] {\n return [...new Set(xs)];\n}\n\nfunction estimateTokens(text: string): number {\n // ~4 chars per token, the standard rough estimate.\n return Math.ceil(text.length / 4);\n}\n\nfunction round(x: number): number {\n return Math.round(x * 1e6) / 1e6;\n}\n","import { indexFor } from './relations.js';\nimport type { EdgeKind, VgGraph } from '../schema.js';\n\n/**\n * Deterministic reverse-reachability impact analysis (VG-CLI-SPEC §3.5).\n *\n * \"What breaks if `<node>` changes\" = everything that (transitively) depends on\n * it: its callers, importers, and subtypes. We BFS *backwards* along dependency\n * edges, bounded by depth, with a confidence that decays with distance (direct =\n * high; transitive lower; ambiguous/dynamic edges already carry lower edge\n * confidence which we fold in). Test-impact selection (`--tests`) lands in\n * Phase 2; this is the structural blast radius.\n */\n\nconst DEPEND_EDGES = new Set<EdgeKind>(['call', 'import', 'extends', 'implements', 'references']);\n\nexport interface ImpactItem {\n id: string;\n name: string;\n kind: string;\n file: string;\n line: number;\n depth: number;\n confidence: number;\n}\n\nexport interface ImpactResult {\n root: { id: string; name: string };\n depth: number;\n affected: ImpactItem[];\n direct: number;\n transitive: number;\n /** Lowest edge confidence encountered (e.g. a dynamic-dispatch edge). */\n minEdgeConfidence: number;\n}\n\nexport function impactOf(graph: VgGraph, rootId: string, opts: { depth?: number } = {}): ImpactResult {\n const maxDepth = Math.max(1, opts.depth ?? 4);\n const index = indexFor(graph);\n const root = index.node(rootId);\n\n const affected = new Map<string, ImpactItem>();\n let minEdgeConfidence = 1;\n\n // BFS over incoming dependency edges (dependents of the frontier).\n let frontier: { id: string; conf: number }[] = [{ id: rootId, conf: 1 }];\n for (let depth = 1; depth <= maxDepth; depth++) {\n const nextFrontier: { id: string; conf: number }[] = [];\n for (const { id, conf } of frontier) {\n for (const e of index.in(id)) {\n if (!DEPEND_EDGES.has(e.kind)) continue;\n minEdgeConfidence = Math.min(minEdgeConfidence, e.confidence);\n const dependentId = e.src;\n if (dependentId === rootId || affected.has(dependentId)) continue;\n const node = index.node(dependentId);\n if (!node) continue;\n const conf2 = round(conf * e.confidence * 0.9); // decay with distance\n affected.set(dependentId, {\n id: node.id,\n name: node.qualifiedName,\n kind: node.kind,\n file: node.file,\n line: node.span.start,\n depth,\n confidence: conf2,\n });\n nextFrontier.push({ id: dependentId, conf: conf2 });\n }\n }\n frontier = nextFrontier;\n if (frontier.length === 0) break;\n }\n\n const items = [...affected.values()].sort(\n (a, b) => a.depth - b.depth || b.confidence - a.confidence || a.name.localeCompare(b.name),\n );\n\n return {\n root: { id: rootId, name: root?.qualifiedName ?? rootId },\n depth: maxDepth,\n affected: items,\n direct: items.filter((i) => i.depth === 1).length,\n transitive: items.filter((i) => i.depth > 1).length,\n minEdgeConfidence: round(minEdgeConfidence),\n };\n}\n\nfunction round(x: number): number {\n return Math.round(x * 1e6) / 1e6;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/vgd/protocol.ts","../src/runtime/active-graph-cache.ts","../src/runtime/vgd/registry.ts","../src/runtime/vgd/host-broker.ts","../src/runtime/vgd/server.ts","../src/runtime/branch-graph-session.ts"],"names":["path","dropped","path2","resolve","graph"],"mappings":"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","file":"chunk-L5PUNO3T.js","sourcesContent":["/**\n * Wire protocol for the lightweight Vibgrate daemon (`vgd`) — Fusion Runtime Phase 2 prototype.\n *\n * Line-delimited JSON over a local Unix domain socket (named pipe on Windows).\n * No credentials leave this process; the socket is local-only.\n */\n\nexport const VGD_PROTOCOL_VERSION = 'vgd/0' as const;\n\nexport interface WorkspaceRecord {\n /** Stable repository id (same as global store key). */\n id: string;\n /** Absolute repository root. */\n root: string;\n /** Absolute path to the current graph snapshot (may not exist yet). */\n graphPath: string;\n /** ISO timestamp when this workspace was last registered / refreshed. */\n registeredAt: string;\n /** Optional federation label. */\n label?: string;\n /** Optional federation role. */\n role?: 'primary' | 'member';\n /** Git branch or detached SHA at registration (multi-branch ActiveGraph). */\n gitRef?: string;\n}\n\n/** Lightweight ActiveGraph slot summary (no full graph payload). */\nexport interface GraphSlotSummary {\n repositoryId: string;\n gitRef: string;\n loadedAt: number;\n lastAccessAt: number;\n nodeCount: number;\n current: boolean;\n idleMs: number;\n evictable: boolean;\n}\n\nexport type VgdRequest =\n | { op: 'ping' }\n | { op: 'status' }\n /** Ask the daemon to exit cleanly (honoured only by a standalone `vg daemon start`). */\n | { op: 'shutdown' }\n | { op: 'list' }\n | { op: 'register'; root: string; label?: string; role?: 'primary' | 'member' }\n | { op: 'unregister'; root: string }\n | {\n op: 'register-federation';\n primaryRoot: string;\n members: Array<{ root: string; label?: string; role?: 'primary' | 'member' }>;\n }\n | { op: 'list-graph-slots'; repositoryId?: string }\n | { op: 'select-git-ref'; repositoryId: string; gitRef: string }\n | { op: 'put-graph'; repositoryId: string; gitRef: string; graph: unknown }\n /**\n * Load the workspace's on-disk code map into ActiveGraph inside the daemon\n * (binary snapshot first, JSON fallback). The fast-path alternative to\n * shipping the whole graph over the socket with put-graph — use it whenever\n * the map already exists on disk.\n */\n | { op: 'load-graph'; root: string; gitRef?: string; graphPath?: string }\n /** Lexical/structural query against the ActiveGraph for a repository. */\n | { op: 'query-graph'; repositoryId: string; query: string; limit?: number; gitRef?: string }\n /** Blast-radius impact for a symbol id or qualified name. */\n | { op: 'impact-of'; repositoryId: string; symbol: string; depth?: number; gitRef?: string }\n /** Compact graph meta for the current (or named) slot — not the full graph. */\n | { op: 'graph-summary'; repositoryId: string; gitRef?: string }\n /** Approach B host broker: warm model status inside vgd. */\n | { op: 'host-status' }\n | { op: 'host-load'; modelPath: string }\n | { op: 'host-unload'; modelPath?: string }\n | {\n op: 'host-generate';\n modelPath: string;\n messages: Array<{ role: string; content: string }>;\n grammar?: string;\n requireGrammar?: boolean;\n maxTokens?: number;\n temperature?: number;\n };\n\n/** Compact match row for query-graph (no full node payloads). */\nexport interface VgdQueryMatch {\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n line: number;\n score: number;\n why: string;\n}\n\nexport interface VgdImpactItem {\n id: string;\n name: string;\n kind: string;\n file: string;\n line: number;\n depth: number;\n confidence: number;\n}\n\nexport type VgdResponse =\n | { ok: true; pong: true; version: typeof VGD_PROTOCOL_VERSION }\n | {\n ok: true;\n pid: number;\n uptimeMs: number;\n workspaces: number;\n /** Resident multi-branch ActiveGraph slots (Fusion §4.1.1). */\n graphSlots?: number;\n version: typeof VGD_PROTOCOL_VERSION;\n socketPath: string;\n }\n | { ok: true; workspaces: WorkspaceRecord[] }\n | { ok: true; workspace: WorkspaceRecord }\n | { ok: true; workspaces: WorkspaceRecord[]; federation: true }\n | { ok: true; removed: boolean }\n | { ok: true; stopping: true }\n | { ok: true; slots: GraphSlotSummary[] }\n | { ok: true; selected: true; repositoryId: string; gitRef: string }\n | { ok: true; stored: true; repositoryId: string; gitRef: string; nodeCount: number }\n | {\n ok: true;\n query: string;\n repositoryId: string;\n gitRef: string;\n matches: VgdQueryMatch[];\n tokensEstimate: number;\n }\n | {\n ok: true;\n repositoryId: string;\n gitRef: string;\n symbol: string;\n root: { id: string; name: string };\n depth: number;\n affected: VgdImpactItem[];\n direct: number;\n transitive: number;\n }\n | {\n ok: true;\n repositoryId: string;\n gitRef: string;\n summary: {\n nodeCount: number;\n edgeCount: number;\n languages: string[];\n corpusHash: string | null;\n root: string | null;\n };\n }\n | {\n ok: true;\n host: {\n poolSize: number;\n loadedModels: string[];\n bindingReady: boolean;\n };\n }\n | { ok: true; hostLoaded: true; modelPath: string }\n | { ok: true; hostUnloaded: true; cleared: number }\n | {\n ok: true;\n hostGenerated: true;\n text: string;\n model: string;\n constrained: boolean;\n grammarApplied?: boolean;\n draftAcceptedChars?: number;\n latencyMs?: number;\n unknownIdentifiers?: string[];\n }\n | { ok: false; error: string; code?: string };\n\nexport function parseRequest(line: string): VgdRequest | { error: string } {\n let raw: unknown;\n try {\n raw = JSON.parse(line);\n } catch {\n return { error: 'invalid JSON' };\n }\n if (!raw || typeof raw !== 'object') return { error: 'request must be an object' };\n const op = (raw as { op?: unknown }).op;\n if (op === 'ping' || op === 'status' || op === 'shutdown' || op === 'list') return { op };\n if (op === 'list-graph-slots') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n return {\n op: 'list-graph-slots',\n repositoryId: typeof repositoryId === 'string' && repositoryId.trim() ? repositoryId.trim() : undefined,\n };\n }\n if (op === 'select-git-ref') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n if (typeof repositoryId !== 'string' || !repositoryId.trim()) return { error: 'select-git-ref requires repositoryId' };\n if (typeof gitRef !== 'string' || !gitRef.trim()) return { error: 'select-git-ref requires gitRef' };\n return { op: 'select-git-ref', repositoryId: repositoryId.trim(), gitRef: gitRef.trim() };\n }\n if (op === 'put-graph') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n const graph = (raw as { graph?: unknown }).graph;\n if (typeof repositoryId !== 'string' || !repositoryId.trim()) return { error: 'put-graph requires repositoryId' };\n if (typeof gitRef !== 'string' || !gitRef.trim()) return { error: 'put-graph requires gitRef' };\n if (!graph || typeof graph !== 'object') return { error: 'put-graph requires graph object' };\n return { op: 'put-graph', repositoryId: repositoryId.trim(), gitRef: gitRef.trim(), graph };\n }\n if (op === 'load-graph') {\n const root = (raw as { root?: unknown }).root;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n const graphPath = (raw as { graphPath?: unknown }).graphPath;\n if (typeof root !== 'string' || !root.trim()) return { error: 'load-graph requires a non-empty root' };\n return {\n op: 'load-graph',\n root: root.trim(),\n gitRef: typeof gitRef === 'string' && gitRef.trim() ? gitRef.trim() : undefined,\n graphPath: typeof graphPath === 'string' && graphPath.trim() ? graphPath.trim() : undefined,\n };\n }\n if (op === 'query-graph') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n const query = (raw as { query?: unknown }).query;\n const limit = (raw as { limit?: unknown }).limit;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n if (typeof repositoryId !== 'string' || !repositoryId.trim()) return { error: 'query-graph requires repositoryId' };\n if (typeof query !== 'string' || !query.trim()) return { error: 'query-graph requires query' };\n return {\n op: 'query-graph',\n repositoryId: repositoryId.trim(),\n query: query.trim(),\n limit: typeof limit === 'number' && limit > 0 ? Math.min(Math.floor(limit), 50) : undefined,\n gitRef: typeof gitRef === 'string' && gitRef.trim() ? gitRef.trim() : undefined,\n };\n }\n if (op === 'impact-of') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n const symbol = (raw as { symbol?: unknown }).symbol;\n const depth = (raw as { depth?: unknown }).depth;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n if (typeof repositoryId !== 'string' || !repositoryId.trim()) return { error: 'impact-of requires repositoryId' };\n if (typeof symbol !== 'string' || !symbol.trim()) return { error: 'impact-of requires symbol' };\n return {\n op: 'impact-of',\n repositoryId: repositoryId.trim(),\n symbol: symbol.trim(),\n depth: typeof depth === 'number' && depth > 0 ? Math.min(Math.floor(depth), 12) : undefined,\n gitRef: typeof gitRef === 'string' && gitRef.trim() ? gitRef.trim() : undefined,\n };\n }\n if (op === 'graph-summary') {\n const repositoryId = (raw as { repositoryId?: unknown }).repositoryId;\n const gitRef = (raw as { gitRef?: unknown }).gitRef;\n if (typeof repositoryId !== 'string' || !repositoryId.trim()) return { error: 'graph-summary requires repositoryId' };\n return {\n op: 'graph-summary',\n repositoryId: repositoryId.trim(),\n gitRef: typeof gitRef === 'string' && gitRef.trim() ? gitRef.trim() : undefined,\n };\n }\n if (op === 'register' || op === 'unregister') {\n const root = (raw as { root?: unknown }).root;\n if (typeof root !== 'string' || !root.trim()) return { error: `${op} requires a non-empty root` };\n const label = (raw as { label?: unknown }).label;\n const role = (raw as { role?: unknown }).role;\n if (op === 'register') {\n return {\n op: 'register',\n root: root.trim(),\n label: typeof label === 'string' ? label : undefined,\n role: role === 'primary' || role === 'member' ? role : undefined,\n };\n }\n return { op: 'unregister', root: root.trim() };\n }\n if (op === 'register-federation') {\n const primaryRoot = (raw as { primaryRoot?: unknown }).primaryRoot;\n const members = (raw as { members?: unknown }).members;\n if (typeof primaryRoot !== 'string' || !primaryRoot.trim()) return { error: 'register-federation requires primaryRoot' };\n if (!Array.isArray(members) || members.length === 0) return { error: 'register-federation requires members[]' };\n const parsed: Array<{ root: string; label?: string; role?: 'primary' | 'member' }> = [];\n for (const m of members) {\n if (!m || typeof m !== 'object') continue;\n const root = (m as { root?: unknown }).root;\n if (typeof root !== 'string' || !root.trim()) continue;\n const label = (m as { label?: unknown }).label;\n const role = (m as { role?: unknown }).role;\n parsed.push({\n root: root.trim(),\n label: typeof label === 'string' ? label : undefined,\n role: role === 'primary' || role === 'member' ? role : undefined,\n });\n }\n if (!parsed.length) return { error: 'register-federation members must include at least one root' };\n return { op: 'register-federation', primaryRoot: primaryRoot.trim(), members: parsed };\n }\n if (op === 'host-status') return { op: 'host-status' };\n if (op === 'host-load') {\n const modelPath = (raw as { modelPath?: unknown }).modelPath;\n if (typeof modelPath !== 'string' || !modelPath.trim()) return { error: 'host-load requires modelPath' };\n return { op: 'host-load', modelPath: modelPath.trim() };\n }\n if (op === 'host-unload') {\n const modelPath = (raw as { modelPath?: unknown }).modelPath;\n return {\n op: 'host-unload',\n modelPath: typeof modelPath === 'string' && modelPath.trim() ? modelPath.trim() : undefined,\n };\n }\n if (op === 'host-generate') {\n const modelPath = (raw as { modelPath?: unknown }).modelPath;\n const messages = (raw as { messages?: unknown }).messages;\n if (typeof modelPath !== 'string' || !modelPath.trim()) return { error: 'host-generate requires modelPath' };\n if (!Array.isArray(messages) || messages.length === 0) return { error: 'host-generate requires messages[]' };\n const parsed: Array<{ role: string; content: string }> = [];\n for (const m of messages) {\n if (!m || typeof m !== 'object') continue;\n const role = (m as { role?: unknown }).role;\n const content = (m as { content?: unknown }).content;\n if (typeof role !== 'string' || typeof content !== 'string') continue;\n parsed.push({ role, content });\n }\n if (!parsed.length) return { error: 'host-generate messages must include role+content' };\n const grammar = (raw as { grammar?: unknown }).grammar;\n const requireGrammar = (raw as { requireGrammar?: unknown }).requireGrammar;\n const maxTokens = (raw as { maxTokens?: unknown }).maxTokens;\n const temperature = (raw as { temperature?: unknown }).temperature;\n return {\n op: 'host-generate',\n modelPath: modelPath.trim(),\n messages: parsed,\n grammar: typeof grammar === 'string' ? grammar : undefined,\n requireGrammar: requireGrammar === true,\n maxTokens: typeof maxTokens === 'number' ? maxTokens : undefined,\n temperature: typeof temperature === 'number' ? temperature : undefined,\n };\n }\n return { error: `unknown op: ${String(op)}` };\n}\n","/**\n * Multi-branch ActiveGraph cache (Fusion plan §4.1.1).\n *\n * Holds several in-memory graphs for the same repository — one per gitRef\n * (branch or detached SHA). Memory management: after an idle timeout, slots\n * become evictable; among idle slots, LILO (last-in, last-out ≡ FIFO by\n * load order) reclaims the oldest-loaded idle graph first. The currently\n * selected slot for a repository is never evicted.\n */\n\nimport type { VgGraph } from '../schema.js';\nimport { activeGraphSlotKey } from './git-ref.js';\n\n/** Default idle timeout: 20 minutes (within the 15–30 min plan band). */\nexport const DEFAULT_ACTIVE_GRAPH_IDLE_MS = 20 * 60 * 1000;\n\nexport interface ActiveGraphSlot {\n repositoryId: string;\n gitRef: string;\n graph: VgGraph;\n /** When this slot was first loaded into the cache. */\n loadedAt: number;\n /** Last access / select time. */\n lastAccessAt: number;\n /** Approximate size hint for diagnostics (node count). */\n nodeCount: number;\n}\n\nexport interface ActiveGraphCacheOptions {\n /** Idle duration before a non-selected slot is evictable (default 20 min). */\n idleTimeoutMs?: number;\n /** Max resident graphs per repositoryId (default 8). */\n maxPerRepo?: number;\n /** Max resident graphs process-wide (default 32). */\n maxTotal?: number;\n now?: () => number;\n}\n\nexport interface ActiveGraphSlotSummary {\n repositoryId: string;\n gitRef: string;\n loadedAt: number;\n lastAccessAt: number;\n nodeCount: number;\n current: boolean;\n idleMs: number;\n evictable: boolean;\n}\n\n/**\n * In-memory multi-branch graph cache. Pure structure — does not load/save disk.\n */\nexport class ActiveGraphCache {\n private readonly slots = new Map<string, ActiveGraphSlot>();\n /** repositoryId → currently selected gitRef */\n private readonly currentRef = new Map<string, string>();\n private readonly idleTimeoutMs: number;\n private readonly maxPerRepo: number;\n private readonly maxTotal: number;\n private readonly now: () => number;\n\n constructor(options: ActiveGraphCacheOptions = {}) {\n this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_ACTIVE_GRAPH_IDLE_MS;\n this.maxPerRepo = options.maxPerRepo ?? 8;\n this.maxTotal = options.maxTotal ?? 32;\n this.now = options.now ?? (() => Date.now());\n }\n\n size(): number {\n return this.slots.size;\n }\n\n get(repositoryId: string, gitRef: string): ActiveGraphSlot | undefined {\n const slot = this.slots.get(activeGraphSlotKey(repositoryId, gitRef));\n if (slot) {\n slot.lastAccessAt = this.now();\n }\n return slot;\n }\n\n /**\n * Insert or replace a graph for (repositoryId, gitRef). Touches access time.\n * Runs eviction if over cap.\n */\n put(repositoryId: string, gitRef: string, graph: VgGraph): ActiveGraphSlot {\n const key = activeGraphSlotKey(repositoryId, gitRef);\n const t = this.now();\n const existing = this.slots.get(key);\n const slot: ActiveGraphSlot = {\n repositoryId,\n gitRef,\n graph,\n loadedAt: existing?.loadedAt ?? t,\n lastAccessAt: t,\n nodeCount: graph.nodes?.length ?? 0,\n };\n this.slots.set(key, slot);\n if (!this.currentRef.has(repositoryId)) {\n this.currentRef.set(repositoryId, gitRef);\n }\n this.evictIfNeeded();\n return slot;\n }\n\n /**\n * Mark gitRef as the current branch for this repository and touch it.\n * Returns the slot if present.\n */\n select(repositoryId: string, gitRef: string): ActiveGraphSlot | undefined {\n this.currentRef.set(repositoryId, gitRef);\n return this.get(repositoryId, gitRef);\n }\n\n /** Currently selected gitRef for a repository, if any. */\n selectedRef(repositoryId: string): string | undefined {\n return this.currentRef.get(repositoryId);\n }\n\n current(repositoryId: string): ActiveGraphSlot | undefined {\n const ref = this.currentRef.get(repositoryId);\n if (!ref) return undefined;\n return this.get(repositoryId, ref);\n }\n\n /**\n * Drop idle slots past the timeout (LILO among idle).\n * Returns keys of removed slots.\n */\n evictIdle(now: number = this.now()): string[] {\n return this.evict(now, false);\n }\n\n /** Force eviction of idle slots when over caps (timeout may be ignored for overflow). */\n evictIfNeeded(): string[] {\n return this.evict(this.now(), true);\n }\n\n list(repositoryId?: string): ActiveGraphSlotSummary[] {\n const t = this.now();\n const out: ActiveGraphSlotSummary[] = [];\n for (const slot of this.slots.values()) {\n if (repositoryId && slot.repositoryId !== repositoryId) continue;\n const current = this.currentRef.get(slot.repositoryId) === slot.gitRef;\n const idleMs = t - slot.lastAccessAt;\n out.push({\n repositoryId: slot.repositoryId,\n gitRef: slot.gitRef,\n loadedAt: slot.loadedAt,\n lastAccessAt: slot.lastAccessAt,\n nodeCount: slot.nodeCount,\n current,\n idleMs,\n evictable: !current && idleMs >= this.idleTimeoutMs,\n });\n }\n return out.sort(\n (a, b) => a.repositoryId.localeCompare(b.repositoryId) || a.gitRef.localeCompare(b.gitRef),\n );\n }\n\n clear(): void {\n this.slots.clear();\n this.currentRef.clear();\n }\n\n private evict(now: number, forceOverflow: boolean): string[] {\n const removed: string[] = [];\n\n const removeKey = (key: string): void => {\n const slot = this.slots.get(key);\n if (!slot) return;\n this.slots.delete(key);\n removed.push(key);\n };\n\n // 1) Idle timeout: LILO among idle (earliest loadedAt first).\n const idle = this.idleCandidates(now, this.idleTimeoutMs);\n idle.sort((a, b) => a.loadedAt - b.loadedAt);\n for (const slot of idle) {\n removeKey(activeGraphSlotKey(slot.repositoryId, slot.gitRef));\n }\n\n // 2) Overflow: if still over maxPerRepo or maxTotal, LILO among any non-current idle-or-all-non-current.\n if (forceOverflow) {\n while (this.slots.size > this.maxTotal) {\n const victim = this.pickLiloVictim(now, /* requireIdleTimeout */ false);\n if (!victim) break;\n removeKey(activeGraphSlotKey(victim.repositoryId, victim.gitRef));\n }\n // Per-repo caps\n const byRepo = new Map<string, ActiveGraphSlot[]>();\n for (const s of this.slots.values()) {\n const list = byRepo.get(s.repositoryId) ?? [];\n list.push(s);\n byRepo.set(s.repositoryId, list);\n }\n for (const [repoId, list] of byRepo) {\n if (list.length <= this.maxPerRepo) continue;\n const nonCurrent = list\n .filter((s) => this.currentRef.get(repoId) !== s.gitRef)\n .sort((a, b) => a.loadedAt - b.loadedAt);\n let excess = list.length - this.maxPerRepo;\n for (const s of nonCurrent) {\n if (excess <= 0) break;\n removeKey(activeGraphSlotKey(s.repositoryId, s.gitRef));\n excess--;\n }\n }\n }\n\n return removed;\n }\n\n private idleCandidates(now: number, timeoutMs: number): ActiveGraphSlot[] {\n const out: ActiveGraphSlot[] = [];\n for (const slot of this.slots.values()) {\n if (this.currentRef.get(slot.repositoryId) === slot.gitRef) continue;\n if (now - slot.lastAccessAt >= timeoutMs) out.push(slot);\n }\n return out;\n }\n\n private pickLiloVictim(now: number, requireIdleTimeout: boolean): ActiveGraphSlot | null {\n let best: ActiveGraphSlot | null = null;\n for (const slot of this.slots.values()) {\n if (this.currentRef.get(slot.repositoryId) === slot.gitRef) continue;\n if (requireIdleTimeout && now - slot.lastAccessAt < this.idleTimeoutMs) continue;\n if (!best || slot.loadedAt < best.loadedAt) best = slot;\n }\n return best;\n }\n}\n","import * as path from 'node:path';\nimport { repositoryIdFromRoot, globalGraphPathForRef, globalGraphPath } from '../paths.js';\nimport { detectGitRef } from '../git-ref.js';\nimport { ActiveGraphCache } from '../active-graph-cache.js';\nimport type { WorkspaceRecord } from './protocol.js';\nimport type { VgGraph } from '../../schema.js';\n\n/**\n * In-memory workspace registry for the vgd prototype.\n *\n * Tracks which repository roots the daemon knows about and where their\n * graphs live. Holds a multi-branch {@link ActiveGraphCache} so several\n * git refs of the same repo can stay warm (Fusion §4.1.1).\n */\nexport class WorkspaceRegistry {\n private readonly byId = new Map<string, WorkspaceRecord>();\n /** Multi-branch in-memory graphs (shared across registered workspaces). */\n readonly graphs = new ActiveGraphCache();\n\n register(\n root: string,\n now: () => Date = () => new Date(),\n meta: { label?: string; role?: 'primary' | 'member'; gitRef?: string } = {},\n ): WorkspaceRecord {\n const resolved = path.resolve(root);\n const id = repositoryIdFromRoot(resolved);\n const git = meta.gitRef ? { ref: meta.gitRef, kind: 'branch' as const } : detectGitRef(resolved);\n const graphPath =\n git.kind !== 'none' && git.ref ? globalGraphPathForRef(resolved, git.ref) : globalGraphPath(resolved);\n const record: WorkspaceRecord = {\n id,\n root: resolved,\n graphPath,\n registeredAt: now().toISOString(),\n label: meta.label,\n role: meta.role,\n gitRef: git.ref || undefined,\n };\n this.byId.set(id, record);\n if (git.ref) this.graphs.select(id, git.ref);\n return record;\n }\n\n /**\n * Activate or insert an in-memory graph for a workspace branch.\n * Call after load/build; runs LILO idle eviction as needed.\n */\n putGraph(repositoryId: string, gitRef: string, graph: VgGraph): void {\n this.graphs.put(repositoryId, gitRef, graph);\n this.graphs.select(repositoryId, gitRef);\n }\n\n /** Switch the current branch slot for a repository (no load). */\n selectGitRef(repositoryId: string, gitRef: string): void {\n this.graphs.select(repositoryId, gitRef);\n }\n\n /** Register every member of a federation (primary + members). */\n registerFederation(\n members: Array<{ root: string; label?: string; role?: 'primary' | 'member' }>,\n now: () => Date = () => new Date(),\n ): WorkspaceRecord[] {\n return members.map((m) => this.register(m.root, now, { label: m.label, role: m.role }));\n }\n\n unregister(root: string): boolean {\n const id = repositoryIdFromRoot(path.resolve(root));\n return this.byId.delete(id);\n }\n\n list(): WorkspaceRecord[] {\n return [...this.byId.values()].sort((a, b) => a.root.localeCompare(b.root));\n }\n\n get(root: string): WorkspaceRecord | undefined {\n return this.byId.get(repositoryIdFromRoot(path.resolve(root)));\n }\n\n /** Lookup by stable repository id. */\n getById(repositoryId: string): WorkspaceRecord | undefined {\n return this.byId.get(repositoryId);\n }\n\n size(): number {\n return this.byId.size;\n }\n\n /**\n * Resolve an ActiveGraph for query/impact: prefer the named gitRef, else the\n * selected current slot, else any warm slot for the repository.\n */\n resolveGraph(repositoryId: string, gitRef?: string): { graph: VgGraph; gitRef: string } | null {\n if (gitRef) {\n const slot = this.graphs.get(repositoryId, gitRef);\n if (slot) return { graph: slot.graph, gitRef: slot.gitRef };\n }\n const current = this.graphs.current(repositoryId);\n if (current) return { graph: current.graph, gitRef: current.gitRef };\n // Fall back to any warm slot for this repo (deterministic: earliest loaded).\n const any = this.graphs\n .list(repositoryId)\n .slice()\n .sort((a, b) => a.loadedAt - b.loadedAt)[0];\n if (any) {\n const slot = this.graphs.get(repositoryId, any.gitRef);\n if (slot) return { graph: slot.graph, gitRef: slot.gitRef };\n }\n return null;\n }\n}\n","/**\n * Model host broker inside vgd (Approach B / B4 + P4 multi-client).\n *\n * Long-lived daemon process can keep warm llama.cpp sessions so CLI and IDE\n * clients share one loaded model. Management (which pack/mode) stays in the\n * client/orchestrator; vgd only loads paths the client requests and generates.\n *\n * P4: clients acquire/release leases per model path so unload is refcounted\n * (one IDE + CLI can share a warm model without the first exit killing it).\n *\n * Binding is injected (never static node-llama-cpp import).\n */\n\nimport {\n acquireHostSession,\n clearHostSessionPool,\n dropHostSession,\n evictIdleSessions,\n generateOnSession,\n hostSessionPoolSize,\n listHostSessions,\n type HostGenerateReport,\n type HostSessionInfo,\n} from '../llm-host/session.js';\nimport type { LlmChatMessage, LlmGenerateOptions } from '../llm-host/types.js';\n\nexport interface HostBrokerStatus {\n poolSize: number;\n loadedModels: string[];\n bindingReady: boolean;\n /** Per-path client lease counts (P4). */\n leases: Record<string, number>;\n sessions: HostSessionInfo[];\n}\n\nexport interface HostClientLease {\n clientId: string;\n modelPath: string;\n}\n\nexport class VgdHostBroker {\n private binding: unknown | null = null;\n private readonly loaded = new Set<string>();\n /** modelPath → set of client ids holding a lease. */\n private readonly leases = new Map<string, Set<string>>();\n\n setBinding(lib: unknown | null): void {\n this.binding = lib;\n }\n\n hasBinding(): boolean {\n return this.binding != null;\n }\n\n status(): HostBrokerStatus {\n const leases: Record<string, number> = {};\n for (const [path, clients] of this.leases) {\n leases[path] = clients.size;\n }\n return {\n poolSize: hostSessionPoolSize(),\n loadedModels: [...this.loaded],\n bindingReady: this.binding != null,\n leases,\n sessions: listHostSessions(),\n };\n }\n\n /**\n * Load weights and optionally register a client lease (P4 multi-client).\n * When clientId is omitted, behaves like a one-shot load (no lease bookkeeping).\n */\n async load(\n modelPath: string,\n clientId?: string,\n ): Promise<{ ok: true; modelPath: string; leases: number } | { ok: false; error: string }> {\n if (!this.binding) {\n return { ok: false, error: 'host binding not configured — start vgd with llama runtime or attach binding' };\n }\n try {\n await acquireHostSession(this.binding, modelPath);\n this.loaded.add(modelPath);\n if (clientId) {\n let set = this.leases.get(modelPath);\n if (!set) {\n set = new Set();\n this.leases.set(modelPath, set);\n }\n set.add(clientId);\n }\n evictIdleSessions(4);\n return { ok: true, modelPath, leases: this.leases.get(modelPath)?.size ?? 0 };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n }\n\n /**\n * Release a client lease. When the last lease is released, drop the warm\n * session for that path. Without clientId, clears all leases for the path\n * (or entire pool if modelPath omitted).\n */\n async unload(\n modelPath?: string,\n clientId?: string,\n ): Promise<{ ok: true; cleared: number; remainingLeases: number }> {\n if (!modelPath) {\n const n = hostSessionPoolSize();\n clearHostSessionPool();\n this.loaded.clear();\n this.leases.clear();\n return { ok: true, cleared: n, remainingLeases: 0 };\n }\n\n if (clientId) {\n const set = this.leases.get(modelPath);\n if (set) {\n set.delete(clientId);\n if (set.size === 0) this.leases.delete(modelPath);\n }\n const remaining = this.leases.get(modelPath)?.size ?? 0;\n if (remaining === 0) {\n const dropped = dropHostSession(modelPath) ? 1 : 0;\n this.loaded.delete(modelPath);\n return { ok: true, cleared: dropped, remainingLeases: 0 };\n }\n return { ok: true, cleared: 0, remainingLeases: remaining };\n }\n\n // No clientId: force drop path (all leases).\n this.leases.delete(modelPath);\n const dropped = dropHostSession(modelPath) ? 1 : 0;\n this.loaded.delete(modelPath);\n return { ok: true, cleared: dropped, remainingLeases: 0 };\n }\n\n /** How many clients hold a lease on modelPath. */\n leaseCount(modelPath: string): number {\n return this.leases.get(modelPath)?.size ?? 0;\n }\n\n async generate(\n modelPath: string,\n messages: LlmChatMessage[],\n opts?: LlmGenerateOptions,\n ): Promise<{ ok: true; result: HostGenerateReport } | { ok: false; error: string }> {\n if (!this.binding) {\n return { ok: false, error: 'host binding not configured' };\n }\n try {\n const session = await acquireHostSession(this.binding, modelPath);\n this.loaded.add(modelPath);\n const result = await generateOnSession(session, messages, {\n grammar: opts?.grammar,\n requireGrammar: opts?.requireGrammar,\n identifierTrie: opts?.identifierTrie,\n annotateUnknownIdentifiers: opts?.annotateUnknownIdentifiers,\n draftCandidates: opts?.draftCandidates,\n maxTokens: opts?.maxTokens,\n temperature: opts?.temperature,\n promptSegments: opts?.promptSegments,\n });\n return { ok: true, result };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n }\n}\n\n/** Process-wide broker for the running vgd (tests may replace). */\nlet defaultBroker: VgdHostBroker | null = null;\n\nexport function getVgdHostBroker(): VgdHostBroker {\n if (!defaultBroker) defaultBroker = new VgdHostBroker();\n return defaultBroker;\n}\n\nexport function resetVgdHostBroker(): void {\n defaultBroker = null;\n clearHostSessionPool();\n}\n","import * as fs from 'node:fs';\nimport * as net from 'node:net';\nimport * as path from 'node:path';\nimport { VGD_PROTOCOL_VERSION, parseRequest, type VgdResponse } from './protocol.js';\nimport { WorkspaceRegistry } from './registry.js';\nimport { vgdPidPath, vgdSocketPath } from './paths.js';\nimport { queryGraph } from '../../engine/query.js';\nimport { loadGraph } from '../../engine/load.js';\nimport { impactOf } from '../../engine/impact.js';\nimport { resolveOne } from '../../engine/lookup.js';\nimport { getVgdHostBroker, type VgdHostBroker } from './host-broker.js';\nimport type { VgGraph } from '../../schema.js';\n\nexport interface VgdServerOptions {\n /** Override socket path (tests). */\n socketPath?: string;\n /** Override PID path (tests). */\n pidPath?: string;\n registry?: WorkspaceRegistry;\n now?: () => Date;\n /** Process id recorded in status / pid file (tests). */\n pid?: number;\n /** Inject host broker (tests); default process-wide broker. */\n hostBroker?: VgdHostBroker;\n /**\n * Invoked (shortly after the reply is written) when a client sends the\n * `shutdown` op. Only a standalone `vg daemon start` passes this — an\n * in-process vgd (e.g. inside `vg code`) leaves it unset, and the op is\n * refused so another process can never take down the owning session.\n */\n onShutdownRequest?: () => void;\n}\n\nexport interface VgdServer {\n readonly socketPath: string;\n readonly registry: WorkspaceRegistry;\n /** Wall time when the server started listening. */\n readonly startedAt: number;\n close(): Promise<void>;\n}\n\n/**\n * Start a line-delimited JSON daemon on the local vgd socket.\n * Creates the daemon directory; removes a stale Unix socket file if present.\n */\nexport async function startVgdServer(options: VgdServerOptions = {}): Promise<VgdServer> {\n const socketPath = options.socketPath ?? vgdSocketPath();\n const pidPath = options.pidPath ?? vgdPidPath();\n const registry = options.registry ?? new WorkspaceRegistry();\n const hostBroker = options.hostBroker ?? getVgdHostBroker();\n const onShutdownRequest = options.onShutdownRequest;\n const now = options.now ?? (() => new Date());\n const pid = options.pid ?? process.pid;\n const startedAt = Date.now();\n\n // Unix sockets need a free path; named pipes on Windows are cleaned by the OS.\n if (!socketPath.startsWith('\\\\\\\\.\\\\pipe')) {\n fs.mkdirSync(path.dirname(socketPath), { recursive: true });\n try {\n fs.unlinkSync(socketPath);\n } catch {\n /* nothing to remove */\n }\n } else {\n fs.mkdirSync(path.dirname(pidPath), { recursive: true });\n }\n\n const server = net.createServer((socket) => {\n let buffer = '';\n socket.setEncoding('utf8');\n socket.on('data', (chunk: string) => {\n buffer += chunk;\n let nl: number;\n while ((nl = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, nl).trim();\n buffer = buffer.slice(nl + 1);\n if (!line) continue;\n void Promise.resolve(\n handleLine(line, { registry, hostBroker, now, pid, startedAt, socketPath, onShutdownRequest }),\n ).then(\n (response) => {\n socket.write(JSON.stringify(response) + '\\n');\n },\n );\n }\n });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(socketPath, () => {\n server.off('error', reject);\n resolve();\n });\n });\n\n try {\n fs.mkdirSync(path.dirname(pidPath), { recursive: true });\n fs.writeFileSync(pidPath, `${pid}\\n`, 'utf8');\n } catch {\n /* pid file is best-effort */\n }\n\n return {\n socketPath,\n registry,\n startedAt,\n async close() {\n await new Promise<void>((resolve) => server.close(() => resolve()));\n try {\n fs.unlinkSync(pidPath);\n } catch {\n /* gone */\n }\n if (!socketPath.startsWith('\\\\\\\\.\\\\pipe')) {\n try {\n fs.unlinkSync(socketPath);\n } catch {\n /* gone */\n }\n }\n },\n };\n}\n\nasync function handleLine(\n line: string,\n ctx: {\n registry: WorkspaceRegistry;\n hostBroker: VgdHostBroker;\n now: () => Date;\n pid: number;\n startedAt: number;\n socketPath: string;\n onShutdownRequest?: () => void;\n },\n): Promise<VgdResponse> {\n const req = parseRequest(line);\n if ('error' in req) return { ok: false, error: req.error, code: 'bad_request' };\n\n switch (req.op) {\n case 'ping':\n return { ok: true, pong: true, version: VGD_PROTOCOL_VERSION };\n case 'status':\n return {\n ok: true,\n pid: ctx.pid,\n uptimeMs: Date.now() - ctx.startedAt,\n workspaces: ctx.registry.size(),\n graphSlots: ctx.registry.graphs.size(),\n version: VGD_PROTOCOL_VERSION,\n socketPath: ctx.socketPath,\n };\n case 'shutdown': {\n if (!ctx.onShutdownRequest) {\n return {\n ok: false,\n error:\n 'this vgd is embedded in another process (e.g. vg code) and cannot be stopped remotely — stop the owning process instead',\n code: 'shutdown_unsupported',\n };\n }\n // Let the reply flush to the client before the listener goes away.\n const hook = ctx.onShutdownRequest;\n setTimeout(() => hook(), 150);\n return { ok: true, stopping: true };\n }\n case 'host-status':\n return { ok: true, host: ctx.hostBroker.status() };\n case 'host-load': {\n const r = await ctx.hostBroker.load(req.modelPath);\n if (!r.ok) return { ok: false, error: r.error, code: 'host_error' };\n return { ok: true, hostLoaded: true, modelPath: r.modelPath };\n }\n case 'host-unload': {\n const r = await ctx.hostBroker.unload(req.modelPath);\n return { ok: true, hostUnloaded: true, cleared: r.cleared };\n }\n case 'host-generate': {\n const r = await ctx.hostBroker.generate(\n req.modelPath,\n req.messages.map((m) => ({\n role: (m.role === 'system' || m.role === 'assistant' ? m.role : 'user') as 'system' | 'user' | 'assistant',\n content: m.content,\n })),\n {\n grammar: req.grammar,\n requireGrammar: req.requireGrammar,\n maxTokens: req.maxTokens,\n temperature: req.temperature,\n },\n );\n if (!r.ok) return { ok: false, error: r.error, code: 'host_error' };\n return {\n ok: true,\n hostGenerated: true,\n text: r.result.text,\n model: r.result.model,\n constrained: r.result.constrained,\n grammarApplied: r.result.grammarApplied,\n draftAcceptedChars: r.result.draftAcceptedChars,\n latencyMs: r.result.latencyMs,\n unknownIdentifiers: r.result.unknownIdentifiers,\n };\n }\n case 'list':\n return { ok: true, workspaces: ctx.registry.list() };\n case 'register':\n return {\n ok: true,\n workspace: ctx.registry.register(req.root, ctx.now, { label: req.label, role: req.role }),\n };\n case 'unregister':\n return { ok: true, removed: ctx.registry.unregister(req.root) };\n case 'register-federation': {\n const workspaces = ctx.registry.registerFederation(req.members, ctx.now);\n return { ok: true, workspaces, federation: true };\n }\n case 'list-graph-slots': {\n ctx.registry.graphs.evictIdle();\n return { ok: true, slots: ctx.registry.graphs.list(req.repositoryId) };\n }\n case 'select-git-ref': {\n ctx.registry.selectGitRef(req.repositoryId, req.gitRef);\n return { ok: true, selected: true, repositoryId: req.repositoryId, gitRef: req.gitRef };\n }\n case 'put-graph': {\n try {\n // The wire line was already JSON.parse'd by parseRequest — re-encoding a\n // large repo's graph (`parseGraph(JSON.stringify(...))`) blocked the\n // daemon's event loop for seconds, timing out every concurrent client.\n const graph = req.graph as VgGraph;\n ctx.registry.putGraph(req.repositoryId, req.gitRef, graph);\n return {\n ok: true,\n stored: true,\n repositoryId: req.repositoryId,\n gitRef: req.gitRef,\n nodeCount: graph.nodes?.length ?? 0,\n };\n } catch (e) {\n return { ok: false, error: e instanceof Error ? e.message : 'invalid graph', code: 'bad_graph' };\n }\n }\n case 'load-graph': {\n // Load from disk inside the daemon: the snapshot-first loader decodes\n // the binary sidecar (msgpack) when fresh — no multi-MB JSON line ever\n // crosses the socket, which is what made put-graph publishes slow on\n // large repos.\n const record = ctx.registry.register(req.root, ctx.now, { gitRef: req.gitRef });\n const gitRef = req.gitRef ?? record.gitRef ?? 'HEAD';\n const graph = loadGraph(req.root, req.graphPath);\n if (!graph) {\n return {\n ok: false,\n error: `no code map found for ${req.root} — run \\`vg build\\` (or bare \\`vg\\`) first`,\n code: 'no_map',\n };\n }\n ctx.registry.putGraph(record.id, gitRef, graph);\n return {\n ok: true,\n stored: true,\n repositoryId: record.id,\n gitRef,\n nodeCount: graph.nodes?.length ?? 0,\n };\n }\n case 'query-graph': {\n const resolved = ctx.registry.resolveGraph(req.repositoryId, req.gitRef);\n if (!resolved) {\n return { ok: false, error: 'no ActiveGraph loaded for repository — put-graph first', code: 'no_graph' };\n }\n const result = queryGraph(resolved.graph, req.query, { limit: req.limit ?? 12, budget: 2000 });\n return {\n ok: true,\n query: req.query,\n repositoryId: req.repositoryId,\n gitRef: resolved.gitRef,\n matches: result.matches.slice(0, req.limit ?? 12).map((m) => ({\n id: m.node.id,\n qualifiedName: m.node.qualifiedName,\n kind: m.node.kind,\n file: m.node.file,\n line: m.node.span?.start ?? 0,\n score: m.score,\n why: m.why,\n })),\n tokensEstimate: result.tokensEstimate,\n };\n }\n case 'impact-of': {\n const resolved = ctx.registry.resolveGraph(req.repositoryId, req.gitRef);\n if (!resolved) {\n return { ok: false, error: 'no ActiveGraph loaded for repository — put-graph first', code: 'no_graph' };\n }\n const node = resolveSymbol(resolved.graph, req.symbol);\n if (!node) {\n return { ok: false, error: `symbol not found: ${req.symbol}`, code: 'not_found' };\n }\n const impact = impactOf(resolved.graph, node.id, { depth: req.depth ?? 4 });\n return {\n ok: true,\n repositoryId: req.repositoryId,\n gitRef: resolved.gitRef,\n symbol: req.symbol,\n root: impact.root,\n depth: impact.depth,\n affected: impact.affected.slice(0, 40).map((a) => ({\n id: a.id,\n name: a.name,\n kind: a.kind,\n file: a.file,\n line: a.line,\n depth: a.depth,\n confidence: a.confidence,\n })),\n direct: impact.direct,\n transitive: impact.transitive,\n };\n }\n case 'graph-summary': {\n const resolved = ctx.registry.resolveGraph(req.repositoryId, req.gitRef);\n if (!resolved) {\n return { ok: false, error: 'no ActiveGraph loaded for repository — put-graph first', code: 'no_graph' };\n }\n const g = resolved.graph;\n return {\n ok: true,\n repositoryId: req.repositoryId,\n gitRef: resolved.gitRef,\n summary: {\n nodeCount: g.nodes?.length ?? 0,\n edgeCount: g.edges?.length ?? 0,\n languages: g.meta?.languages ?? [],\n corpusHash: g.provenance?.corpusHash ?? null,\n root: g.meta?.root ?? null,\n },\n };\n }\n }\n}\n\nfunction resolveSymbol(graph: VgGraph, symbol: string): { id: string } | null {\n // Prefer exact id, then qualified-name / short-name lookup.\n if (graph.nodes.some((n) => n.id === symbol)) return { id: symbol };\n const hit = resolveOne(graph, symbol);\n if (hit.node?.id) return { id: hit.node.id };\n if (hit.candidates.length === 1 && hit.candidates[0]?.id) return { id: hit.candidates[0].id };\n const q = symbol.toLowerCase();\n const byQn = graph.nodes.find((n) => n.qualifiedName?.toLowerCase() === q || n.name?.toLowerCase() === q);\n return byQn ? { id: byQn.id } : null;\n}\n","/**\n * Branch-aware graph loading for a single repository worktree (Fusion §4.1.1).\n *\n * Combines {@link detectGitRef}, disk load via {@link loadGraph}, and an\n * {@link ActiveGraphCache} so checkout A → B → A reuses a warm in-memory map\n * when the branch is still resident (LILO idle eviction applies).\n */\n\nimport { loadGraph } from '../engine/load.js';\nimport { repositoryIdFromRoot } from './paths.js';\nimport { detectGitRef, type GitRunner } from './git-ref.js';\nimport { ActiveGraphCache } from './active-graph-cache.js';\nimport type { VgGraph } from '../schema.js';\n\nexport interface BranchGraphLoadResult {\n graph: VgGraph | null;\n gitRef: string;\n kind: 'branch' | 'detached' | 'none';\n /** True when the selected ActiveGraph slot changed since the previous ensure. */\n switched: boolean;\n /** True when the graph was served from the in-memory cache. */\n fromCache: boolean;\n repositoryId: string;\n}\n\nexport interface BranchGraphSessionOptions {\n root: string;\n cache?: ActiveGraphCache;\n /** Optional explicit graph path (CLI `--graph`); bypasses branch keying for disk. */\n graphPath?: string;\n detectGit?: typeof detectGitRef;\n load?: typeof loadGraph;\n gitRun?: GitRunner;\n}\n\n/**\n * Stateful helper: call {@link ensureCurrent} at session start and before each\n * agent turn so a mid-session `git checkout` picks up the correct map.\n */\nexport class BranchGraphSession {\n readonly root: string;\n readonly repositoryId: string;\n readonly cache: ActiveGraphCache;\n private readonly graphPath?: string;\n private readonly detectGit: typeof detectGitRef;\n private readonly load: typeof loadGraph;\n private readonly gitRun?: GitRunner;\n private lastRef = '';\n\n constructor(options: BranchGraphSessionOptions) {\n this.root = options.root;\n this.repositoryId = repositoryIdFromRoot(options.root);\n this.cache = options.cache ?? new ActiveGraphCache();\n this.graphPath = options.graphPath;\n this.detectGit = options.detectGit ?? detectGitRef;\n this.load = options.load ?? loadGraph;\n this.gitRun = options.gitRun;\n }\n\n /**\n * Resolve HEAD, activate the matching cache slot (or load from disk), and\n * run idle eviction. Returns null graph when no map exists for this ref.\n */\n ensureCurrent(): BranchGraphLoadResult {\n this.cache.evictIdle();\n const info = this.gitRun ? this.detectGit(this.root, this.gitRun) : this.detectGit(this.root);\n const gitRef = info.ref || 'unknown';\n const switched = this.lastRef !== '' && this.lastRef !== gitRef;\n this.lastRef = gitRef;\n\n // Explicit --graph path: still track ref for cache identity but load that file.\n if (this.graphPath) {\n const graph = this.load(this.root, this.graphPath);\n if (graph) {\n this.cache.put(this.repositoryId, gitRef, graph);\n this.cache.select(this.repositoryId, gitRef);\n }\n return {\n graph,\n gitRef,\n kind: info.kind,\n switched,\n fromCache: false,\n repositoryId: this.repositoryId,\n };\n }\n\n const warm = this.cache.get(this.repositoryId, gitRef);\n if (warm) {\n this.cache.select(this.repositoryId, gitRef);\n return {\n graph: warm.graph,\n gitRef,\n kind: info.kind,\n switched,\n fromCache: true,\n repositoryId: this.repositoryId,\n };\n }\n\n const graph = this.load(this.root);\n if (graph) {\n this.cache.put(this.repositoryId, gitRef, graph);\n this.cache.select(this.repositoryId, gitRef);\n }\n return {\n graph,\n gitRef,\n kind: info.kind,\n switched,\n fromCache: false,\n repositoryId: this.repositoryId,\n };\n }\n\n /** Diagnostics for daemon status / tests. */\n listSlots() {\n return this.cache.list(this.repositoryId);\n }\n}\n"]}
|