@vibgrate/cli 2026.819.3 → 2026.825.1
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-AFMDB4GM.js → agent-IHNUBFBM.js} +13 -12
- package/dist/{agent-AFMDB4GM.js.map → agent-IHNUBFBM.js.map} +1 -1
- package/dist/{approvals-F2DJGPU7.js → approvals-HRIMDIX3.js} +5 -5
- package/dist/{approvals-F2DJGPU7.js.map → approvals-HRIMDIX3.js.map} +1 -1
- package/dist/{attach-XTX2Q3AD.js → attach-L43JUJ7A.js} +3 -3
- package/dist/{attach-XTX2Q3AD.js.map → attach-L43JUJ7A.js.map} +1 -1
- package/dist/{baseline-KTE2C3LW.js → baseline-EZQ7SCRT.js} +3 -3
- package/dist/{baseline-KTE2C3LW.js.map → baseline-EZQ7SCRT.js.map} +1 -1
- package/dist/{chunk-TD4JAEMH.js → chunk-4PCFSRYH.js} +5 -5
- package/dist/{chunk-TD4JAEMH.js.map → chunk-4PCFSRYH.js.map} +1 -1
- package/dist/{chunk-ARGYMFST.js → chunk-5BFA532E.js} +3 -3
- package/dist/{chunk-ARGYMFST.js.map → chunk-5BFA532E.js.map} +1 -1
- package/dist/{chunk-UAPA5AHX.js → chunk-6VLOI2ZP.js} +35 -14
- package/dist/chunk-6VLOI2ZP.js.map +1 -0
- package/dist/{chunk-DMI4BMUL.js → chunk-B5X246UH.js} +3 -3
- package/dist/{chunk-DMI4BMUL.js.map → chunk-B5X246UH.js.map} +1 -1
- package/dist/{chunk-3XMTRK24.js → chunk-BCK2NIBM.js} +6 -6
- package/dist/{chunk-3XMTRK24.js.map → chunk-BCK2NIBM.js.map} +1 -1
- package/dist/{chunk-SOAEPTSW.js → chunk-CIC3NY2D.js} +60 -24
- package/dist/chunk-CIC3NY2D.js.map +1 -0
- package/dist/{chunk-XZDI2N7M.js → chunk-DLNNNESQ.js} +3 -3
- package/dist/{chunk-XZDI2N7M.js.map → chunk-DLNNNESQ.js.map} +1 -1
- package/dist/{chunk-5R4HYDTC.js → chunk-ECQFRZJI.js} +4 -4
- package/dist/{chunk-5R4HYDTC.js.map → chunk-ECQFRZJI.js.map} +1 -1
- package/dist/{chunk-C5AOLTQS.js → chunk-FVBN4E5C.js} +53 -463
- package/dist/chunk-FVBN4E5C.js.map +1 -0
- package/dist/{chunk-UEXDSWKN.js → chunk-GRMZU24V.js} +3 -3
- package/dist/{chunk-UEXDSWKN.js.map → chunk-GRMZU24V.js.map} +1 -1
- package/dist/{chunk-CEJIX3O7.js → chunk-JSZ46IDG.js} +6 -6
- package/dist/{chunk-CEJIX3O7.js.map → chunk-JSZ46IDG.js.map} +1 -1
- package/dist/chunk-KFLNWYZG.js +6 -0
- package/dist/{chunk-MQJY4EQV.js.map → chunk-KFLNWYZG.js.map} +1 -1
- package/dist/{chunk-WI66PODG.js → chunk-L3YEEJ6U.js} +25 -5
- package/dist/chunk-L3YEEJ6U.js.map +1 -0
- package/dist/{chunk-XAS45W3G.js → chunk-LKJIYGO5.js} +11 -12
- package/dist/chunk-LKJIYGO5.js.map +1 -0
- package/dist/chunk-LUJ4H4RJ.js +605 -0
- package/dist/chunk-LUJ4H4RJ.js.map +1 -0
- package/dist/{chunk-5RMME7PT.js → chunk-M7O6IVKN.js} +3 -3
- package/dist/{chunk-5RMME7PT.js.map → chunk-M7O6IVKN.js.map} +1 -1
- package/dist/{chunk-3SOJZ3VV.js → chunk-QTQRM7HQ.js} +3 -3
- package/dist/{chunk-3SOJZ3VV.js.map → chunk-QTQRM7HQ.js.map} +1 -1
- package/dist/{chunk-PQISIPYP.js → chunk-RHYRMMN3.js} +3 -3
- package/dist/{chunk-PQISIPYP.js.map → chunk-RHYRMMN3.js.map} +1 -1
- package/dist/{chunk-HRYF4PWE.js → chunk-S3HMG6BC.js} +3 -3
- package/dist/{chunk-HRYF4PWE.js.map → chunk-S3HMG6BC.js.map} +1 -1
- package/dist/{chunk-QOU2Q5L4.js → chunk-TLYNLQL2.js} +221 -10
- package/dist/chunk-TLYNLQL2.js.map +1 -0
- package/dist/{chunk-EXFA7QFC.js → chunk-UUVOA6WD.js} +10 -8
- package/dist/chunk-UUVOA6WD.js.map +1 -0
- package/dist/{chunk-UP2BR6TV.js → chunk-X34HVFZ6.js} +8 -8
- package/dist/{chunk-UP2BR6TV.js.map → chunk-X34HVFZ6.js.map} +1 -1
- package/dist/{chunk-HVJHFTIV.js → chunk-Y3X3ORQ3.js} +10 -12
- package/dist/chunk-Y3X3ORQ3.js.map +1 -0
- package/dist/{chunk-HB3SONYP.js → chunk-YIRDV4YJ.js} +3 -3
- package/dist/{chunk-HB3SONYP.js.map → chunk-YIRDV4YJ.js.map} +1 -1
- package/dist/chunk-YP243ZKD.js +90 -0
- package/dist/chunk-YP243ZKD.js.map +1 -0
- package/dist/cli.js +381 -542
- package/dist/cli.js.map +1 -1
- package/dist/{daemon-VMQKIIYP.js → daemon-WPX2SBVV.js} +9 -9
- package/dist/{daemon-VMQKIIYP.js.map → daemon-WPX2SBVV.js.map} +1 -1
- package/dist/embed-worker-main.js +3 -3
- package/dist/{ensure-map-YIUJWMBK.js → ensure-map-MLI4XCRV.js} +14 -14
- package/dist/{ensure-map-YIUJWMBK.js.map → ensure-map-MLI4XCRV.js.map} +1 -1
- package/dist/{graph-backend-FDZUY4TR.js → graph-backend-LK5EFQXN.js} +7 -7
- package/dist/{graph-backend-FDZUY4TR.js.map → graph-backend-LK5EFQXN.js.map} +1 -1
- package/dist/index.d.ts +115 -132
- package/dist/index.js +15 -14
- package/dist/index.js.map +1 -1
- package/dist/{interactive-CS4PGZPK.js → interactive-K446F42I.js} +27 -25
- package/dist/interactive-K446F42I.js.map +1 -0
- package/dist/load-2FRH37JY.js +11 -0
- package/dist/{load-4EY64JJO.js.map → load-2FRH37JY.js.map} +1 -1
- package/dist/parse-worker.js +3 -2
- package/dist/parse-worker.js.map +1 -1
- package/dist/{run-outcome-T7VDBNWB.js → run-outcome-4ETNDPX6.js} +5 -5
- package/dist/{run-outcome-T7VDBNWB.js.map → run-outcome-4ETNDPX6.js.map} +1 -1
- package/dist/{runtime-session-WZLVADPQ.js → runtime-session-RMSKXFIJ.js} +9 -9
- package/dist/{runtime-session-WZLVADPQ.js.map → runtime-session-RMSKXFIJ.js.map} +1 -1
- package/dist/{session-VPP2VGUN.js → session-22BGDYWF.js} +8 -8
- package/dist/{session-VPP2VGUN.js.map → session-22BGDYWF.js.map} +1 -1
- package/dist/{stream-json-XXCFN4MF.js → stream-json-MD7MSSCH.js} +13 -12
- package/dist/stream-json-MD7MSSCH.js.map +1 -0
- package/dist/version-FRUT6RI2.js +4 -0
- package/dist/{version-2UBJ7N2I.js.map → version-FRUT6RI2.js.map} +1 -1
- package/dist/{vg-mcp-bridge-H6GXYNKV.js → vg-mcp-bridge-H6I3ALUW.js} +8 -8
- package/dist/{vg-mcp-bridge-H6GXYNKV.js.map → vg-mcp-bridge-H6I3ALUW.js.map} +1 -1
- package/dist/{vgd-SBZO4ONQ.js → vgd-TW7HU2PH.js} +8 -8
- package/dist/vgd-TW7HU2PH.js.map +1 -0
- package/package.json +2 -4
- package/dist/chunk-C5AOLTQS.js.map +0 -1
- package/dist/chunk-EXFA7QFC.js.map +0 -1
- package/dist/chunk-HVJHFTIV.js.map +0 -1
- package/dist/chunk-MQJY4EQV.js +0 -6
- package/dist/chunk-QOU2Q5L4.js.map +0 -1
- package/dist/chunk-SOAEPTSW.js.map +0 -1
- package/dist/chunk-UAPA5AHX.js.map +0 -1
- package/dist/chunk-VEQA2FSM.js +0 -699
- package/dist/chunk-VEQA2FSM.js.map +0 -1
- package/dist/chunk-WI66PODG.js.map +0 -1
- package/dist/chunk-XAS45W3G.js.map +0 -1
- package/dist/interactive-CS4PGZPK.js.map +0 -1
- package/dist/load-4EY64JJO.js +0 -11
- package/dist/stream-json-XXCFN4MF.js.map +0 -1
- package/dist/version-2UBJ7N2I.js +0 -4
- package/dist/vgd-SBZO4ONQ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engine/savings.ts","../src/code/context.ts","../src/code/capsule.ts"],"names":["estimateTokens","normalize"],"mappings":"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","file":"chunk-6VLOI2ZP.js","sourcesContent":["import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { cacheDir } from './cache.js';\n\n/**\n * Usage-savings tracking (VG-DEVELOPMENT-PLAN §5) — local, privacy-safe, and\n * **opt-in**. We record *counts only* — never code, never the question text —\n * comparing the context tokens vg returned against a grep/read baseline estimate.\n * `vg savings` reports it with the assumptions shown; figures are labelled\n * estimates, never a hero number.\n *\n * Each entry also carries which path served the call (`source`: an MCP tool call\n * vs a `vg <subcommand>` CLI invocation) and, when known, a coarse `client` label\n * (the AI on the other end). That powers the command-vs-MCP split and the\n * per-client breakdown in `vg savings`, and is the basis for the opt-in\n * `vg serve --share-stats` upload (see ./stats-share.ts). Nothing here leaves the\n * machine unless the operator explicitly enables sharing.\n */\n\nconst LEDGER = 'savings.jsonl';\n// A conservative, documented estimate: tokens an agent reads per file it opens.\nexport const PER_FILE_TOKENS = 400;\n\n/** The tools whose grep/read token baseline the savings summary is computed from.\n * search_symbols belongs here: it is the direct grep replacement (the server\n * instructions steer agents to it INSTEAD of grep), yet it used to contribute\n * zero to the estimate — on search-heavy sessions most of the real saving went\n * uncounted. Its baseline is the same measure as query_graph's: the distinct\n * files its matches point at, at PER_FILE_TOKENS each. */\nexport const SAVINGS_TOOLS = new Set(['query_graph', 'get_node', 'search_symbols']);\n\n/**\n * How a navigation call reached the map:\n * - `mcp` — a tool call over the local `vg serve` MCP server;\n * - `cli` — a `vg <subcommand>` invocation that identified itself with `--client`.\n * Both are recorded into one ledger under a shared tool vocabulary (CLI\n * subcommands are normalised to their MCP tool names via CLI_TOOL_ALIASES), so\n * `(tool, source)` is the command-vs-MCP split and the token math stays unified.\n * Absent on ledger lines written before sources existed → read as `mcp` (the\n * only path that recorded then).\n */\nexport type Source = 'mcp' | 'cli';\n\n/**\n * Canonical tool name a CLI navigation subcommand maps to — the same vocabulary\n * the MCP tools use, so a `vg ask --client=claude` and an MCP `query_graph` call\n * land on one row distinguished only by `source`. A subcommand with no MCP twin\n * (e.g. `tree`) keeps its own name.\n */\nexport const CLI_TOOL_ALIASES: Readonly<Record<string, string>> = {\n ask: 'query_graph',\n show: 'get_node',\n impact: 'impact_of',\n path: 'find_path',\n hubs: 'list_hubs',\n areas: 'list_areas',\n tree: 'tree',\n};\n\n/**\n * Normalise a free-form client name (from `--client` or the MCP `initialize`\n * handshake) to a short, bounded, non-PII token: lowercase, `[a-z0-9._-]` only,\n * ≤ 40 chars. Never carries arbitrary user input into the ledger or an upload —\n * it is a coarse client label (e.g. `claude`, `cursor`, `cline`), not identity.\n * Returns `'unknown'` when nothing usable is provided.\n */\nexport function sanitizeClient(name: string | undefined | null): string {\n if (typeof name !== 'string') return 'unknown';\n const cleaned = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40);\n return cleaned || 'unknown';\n}\n\n/**\n * Outcome of a recorded navigation call:\n * - `complete` — returned results, with nothing capped or paginated;\n * - `partial` — returned results, but more were available/truncated;\n * - `miss` — returned no result (no match, not-found, not-connected).\n */\nexport type Outcome = 'complete' | 'partial' | 'miss';\n\nexport interface SavingEntry {\n ts: number; // epoch ms (runtime ledger state, not part of any artifact)\n tool: string;\n // Optional for back-compat with ledger lines written before outcomes existed;\n // an absent value is read as `complete` (those lines only recorded hits).\n outcome?: Outcome;\n vgTokens: number;\n baselineTokens: number;\n // Optional for back-compat: absent `source` reads as `mcp`. `client` is a\n // sanitized coarse label (see sanitizeClient) or absent when unidentified.\n source?: Source;\n client?: string;\n // The model that made the call, for per-model savings auditing. `provider` is\n // a coarse provider label (e.g. `anthropic`, `ollama`), `model` the sanitized\n // model slug. VG Code sets both so `vg savings` can break usage down per model.\n // Absent on lines from callers that don't identify a model.\n provider?: string;\n model?: string;\n // Wall time of the call, ms. Optional: absent on lines written before timing\n // existed (and on CLI-sourced lines) — absent means \"not measured\", never 0.\n ms?: number;\n}\n\n/**\n * Normalise a model slug to a bounded, non-PII token — like {@link sanitizeClient}\n * but keeping the `/` and `:` that model ids use (`anthropic/claude-3.5-sonnet`,\n * `qwen2.5-coder:7b`). Returns undefined when nothing usable is given.\n */\nexport function sanitizeModelId(name: string | undefined | null): string | undefined {\n if (typeof name !== 'string') return undefined;\n const cleaned = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9._:/-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 60);\n return cleaned || undefined;\n}\n\n/**\n * Record a CLI navigation call (`vg <subcommand> --client=<ai>`) into the same\n * local ledger the MCP path uses. Only ever called when the caller passed\n * `--client` — i.e. an AI host explicitly identified itself — so a human's bare\n * `vg ask` still records nothing. Counts only; never the question or code.\n */\nexport function recordCliCall(\n root: string,\n entry: { tool: string; client?: string; provider?: string; model?: string; outcome: Outcome; vgTokens?: number; baselineFiles?: number },\n now: number,\n): void {\n recordSaving(\n root,\n {\n tool: entry.tool,\n source: 'cli',\n client: sanitizeClient(entry.client),\n provider: entry.provider ? sanitizeClient(entry.provider) : undefined,\n model: sanitizeModelId(entry.model),\n outcome: entry.outcome,\n vgTokens: entry.vgTokens ?? 0,\n baselineTokens: (entry.baselineFiles ?? 0) * PER_FILE_TOKENS,\n },\n now,\n );\n}\n\n/**\n * Absolute path of the local usage ledger for this repo. Exported so the serve\n * status display can tail it live (mcp/ledger-tail.ts) — the file itself stays\n * local-only (GUARDRAILS §3.4; upload is the separate opt-in stats-share path).\n */\nexport function savingsLedgerPath(root: string): string {\n return path.join(cacheDir(root), LEDGER);\n}\n\nfunction ledgerPath(root: string): string {\n return savingsLedgerPath(root);\n}\n\n/** Whether a savings ledger exists for this repo (i.e. `vg serve --savings` has recorded). */\nexport function savingsRecorded(root: string): boolean {\n return fs.existsSync(ledgerPath(root));\n}\n\n/**\n * Delete the recorded usage data for this repo: the ledger itself plus the\n * stats-share state that indexes into it (a byte offset into the ledger and the\n * random per-install id) — a stale offset against a fresh ledger would silently\n * skip new entries, and clearing \"my data\" should also reset the id. Everything\n * removed lives under `.vibgrate/cache/`; nothing else is touched. Returns\n * whether a ledger existed.\n */\nexport function clearSavings(root: string): boolean {\n const file = ledgerPath(root);\n const existed = fs.existsSync(file);\n fs.rmSync(file, { force: true });\n fs.rmSync(path.join(cacheDir(root), 'stats-share.json'), { force: true });\n return existed;\n}\n\nexport function recordSaving(root: string, entry: Omit<SavingEntry, 'ts'>, now: number): void {\n try {\n fs.mkdirSync(cacheDir(root), { recursive: true });\n const line = JSON.stringify({ ts: now, ...entry });\n fs.appendFileSync(ledgerPath(root), line + '\\n');\n } catch {\n /* never let telemetry break a tool call */\n }\n}\n\nexport interface SavingsReport {\n enabled: boolean;\n days: number;\n queries: number;\n vgTokens: number;\n baselineTokens: number;\n ratio: number;\n estCostVg: number;\n estCostBaseline: number;\n saved: number;\n rateLabel: string;\n}\n\n// Published-style input rate ($/1M tokens), shipped with the CLI. Labelled\n// estimate; the user can pass their own model rate.\nconst DEFAULT_RATE_PER_M = 3.0; // e.g. a mid-tier model input rate\nconst DEFAULT_RATE_LABEL = 'input @ $3/1M';\n\nexport function readSavings(root: string, days: number, now: number, ratePerM = DEFAULT_RATE_PER_M): SavingsReport {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n let queries = 0;\n let vgTokens = 0;\n let baselineTokens = 0;\n if (fs.existsSync(file)) {\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as SavingEntry;\n if (e.ts < cutoff) continue;\n // The token-savings figures compare only the tools with a meaningful\n // grep/read baseline; the full per-command breakdown lives in readUsage.\n if (!SAVINGS_TOOLS.has(e.tool)) continue;\n queries++;\n vgTokens += e.vgTokens;\n baselineTokens += e.baselineTokens;\n } catch {\n /* skip corrupt line */\n }\n }\n }\n const estCostVg = (vgTokens / 1e6) * ratePerM;\n const estCostBaseline = (baselineTokens / 1e6) * ratePerM;\n return {\n enabled: savingsRecorded(root),\n days,\n queries,\n vgTokens,\n baselineTokens,\n ratio: vgTokens > 0 ? Math.round((baselineTokens / vgTokens) * 100) / 100 : 0,\n estCostVg: round2(estCostVg),\n estCostBaseline: round2(estCostBaseline),\n saved: round2(estCostBaseline - estCostVg),\n rateLabel: DEFAULT_RATE_LABEL,\n };\n}\n\nfunction round2(x: number): number {\n return Math.round(x * 100) / 100;\n}\n\n/** Token + cost savings attributed to one model (VG Code per-model auditing). */\nexport interface ModelSaving {\n /** `provider/model`, the ledger's per-model key. */\n key: string;\n provider: string;\n model: string;\n queries: number;\n vgTokens: number;\n baselineTokens: number;\n saved: number;\n}\n\n/**\n * Per-model breakdown of the token-savings figures — the basis of \"full savings\n * auditing per model\". Only entries that carry a `model` and are savings-baseline\n * tools contribute, so it lines up with the headline `readSavings` totals.\n * Sorted by dollars saved (desc), then key.\n */\nexport function readModelSavings(root: string, days: number, now: number, ratePerM = DEFAULT_RATE_PER_M): ModelSaving[] {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n const byModel = new Map<string, { provider: string; model: string; queries: number; vg: number; base: number }>();\n if (fs.existsSync(file)) {\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as SavingEntry;\n if (e.ts < cutoff || !e.model || !SAVINGS_TOOLS.has(e.tool)) continue;\n const provider = e.provider ?? 'unknown';\n const key = `${provider}/${e.model}`;\n const row = byModel.get(key) ?? { provider, model: e.model, queries: 0, vg: 0, base: 0 };\n row.queries++;\n row.vg += e.vgTokens;\n row.base += e.baselineTokens;\n byModel.set(key, row);\n } catch {\n /* skip corrupt line */\n }\n }\n }\n return [...byModel.entries()]\n .map(([key, r]) => ({\n key,\n provider: r.provider,\n model: r.model,\n queries: r.queries,\n vgTokens: r.vg,\n baselineTokens: r.base,\n saved: round2(((r.base - r.vg) / 1e6) * ratePerM),\n }))\n .sort((a, b) => b.saved - a.saved || a.key.localeCompare(b.key));\n}\n\n/** Per-command usage stats over the ledger window (all recorded tools). */\nexport interface CommandStat {\n tool: string;\n calls: number;\n complete: number;\n partial: number;\n miss: number;\n /** (complete + partial) / calls, as a whole-number percentage. */\n successPct: number;\n /** Mean wall time over the calls that recorded one; null when none did. */\n avgMs: number | null;\n}\n\n/** Calls attributed to one dimension value (a source, or a client). */\nexport interface DimensionStat {\n key: string;\n calls: number;\n complete: number;\n partial: number;\n miss: number;\n successPct: number;\n}\n\nexport interface UsageReport {\n enabled: boolean;\n days: number;\n /** One row per tool used, ordered by call count (desc), then name. */\n commands: CommandStat[];\n /** The command-vs-MCP split: calls grouped by `source` (`cli` / `mcp`). */\n sources: DimensionStat[];\n /** Which AI is calling: calls grouped by coarse `client` label. */\n clients: DimensionStat[];\n /** Column sums across all commands. */\n totals: { calls: number; complete: number; partial: number; miss: number };\n /** The mean of the per-command success percentages (each command weighted equally). */\n avgSuccessPct: number;\n}\n\ninterface OutcomeCounts {\n complete: number;\n partial: number;\n miss: number;\n}\n\n/** Turn a name→outcome-count map into sorted DimensionStat rows. */\nfunction toDimensionStats(byKey: Map<string, OutcomeCounts>): DimensionStat[] {\n return [...byKey.entries()]\n .map(([key, r]) => {\n const calls = r.complete + r.partial + r.miss;\n return {\n key,\n calls,\n complete: r.complete,\n partial: r.partial,\n miss: r.miss,\n successPct: calls ? Math.round(((r.complete + r.partial) / calls) * 100) : 0,\n };\n })\n .sort((a, b) => b.calls - a.calls || a.key.localeCompare(b.key));\n}\n\n/**\n * Per-command breakdown of recorded navigation calls: how often each tool was\n * used and how those calls resolved (complete / partial / miss), plus column\n * totals and the average success rate. Complements the token-savings summary —\n * this counts *every* recorded tool, not just the grep-baseline ones.\n */\nexport function readUsage(root: string, days: number, now: number): UsageReport {\n const file = ledgerPath(root);\n const cutoff = now - days * 24 * 60 * 60 * 1000;\n const byTool = new Map<string, OutcomeCounts>();\n const bySource = new Map<string, OutcomeCounts>();\n const byClient = new Map<string, OutcomeCounts>();\n // Per-tool timing over the entries that recorded a duration (older ledger\n // lines and CLI-sourced calls carry none — \"not measured\", never zero).\n const msByTool = new Map<string, { sum: number; n: number }>();\n const bump = (m: Map<string, OutcomeCounts>, key: string, outcome: Outcome): void => {\n const row = m.get(key) ?? { complete: 0, partial: 0, miss: 0 };\n row[outcome]++;\n m.set(key, row);\n };\n if (fs.existsSync(file)) {\n for (const line of fs.readFileSync(file, 'utf8').split('\\n')) {\n if (!line.trim()) continue;\n try {\n const e = JSON.parse(line) as SavingEntry;\n if (e.ts < cutoff) continue;\n const outcome: Outcome = e.outcome ?? 'complete';\n // Back-compat: lines written before these dims existed are MCP calls\n // from an unidentified client.\n bump(byTool, e.tool, outcome);\n bump(bySource, e.source ?? 'mcp', outcome);\n bump(byClient, e.client ?? 'unknown', outcome);\n if (typeof e.ms === 'number' && e.ms >= 0) {\n const timing = msByTool.get(e.tool) ?? { sum: 0, n: 0 };\n timing.sum += e.ms;\n timing.n++;\n msByTool.set(e.tool, timing);\n }\n } catch {\n /* skip corrupt line */\n }\n }\n }\n const commands: CommandStat[] = toDimensionStats(byTool).map((d) => {\n const timing = msByTool.get(d.key);\n return {\n tool: d.key,\n calls: d.calls,\n complete: d.complete,\n partial: d.partial,\n miss: d.miss,\n successPct: d.successPct,\n avgMs: timing && timing.n > 0 ? Math.round(timing.sum / timing.n) : null,\n };\n });\n const totals = commands.reduce(\n (t, c) => ({\n calls: t.calls + c.calls,\n complete: t.complete + c.complete,\n partial: t.partial + c.partial,\n miss: t.miss + c.miss,\n }),\n { calls: 0, complete: 0, partial: 0, miss: 0 },\n );\n const avgSuccessPct = commands.length\n ? Math.round(commands.reduce((s, c) => s + c.successPct, 0) / commands.length)\n : 0;\n return {\n enabled: savingsRecorded(root),\n days,\n commands,\n sources: toDimensionStats(bySource),\n clients: toDimensionStats(byClient),\n totals,\n avgSuccessPct,\n };\n}\n","/**\n * Graph-grounded context assembly for `vg code` (VG-CLI-CODE §3).\n *\n * A generic coding agent starts blind and reconstructs structure by grepping and\n * reading whole files — which is exactly what blows the context window and\n * degrades the model. This module instead uses the deterministic code graph to\n * hand the planner a *small, high-signal, budget-bounded* context: the symbols\n * most relevant to the instruction, their immediate relations, the blast radius\n * of changing them, and any declared facts (hard constraints) that must not be\n * dropped by later compaction. Deterministic given a graph + instruction, so it\n * is fully offline-testable and benchmarkable.\n */\n\nimport { extractLiteralNeedles, queryGraph } from '../engine/query.js';\nimport type { SanitizedRank } from '../engine/relevance-provider.js';\nimport { indexFor } from '../engine/relations.js';\nimport { impactOf } from '../engine/impact.js';\nimport type { CodeContext } from './types.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\nimport { userAskFromInstruction } from '../engine/user-ask.js';\n\nexport interface BuildContextOptions {\n /** Approx token budget for the rendered block (default 3000). */\n budget?: number;\n /** How many retrieval seeds to expand (default 8). */\n seeds?: number;\n /** Impact BFS depth for the blast radius (default 2). */\n impactDepth?: number;\n /** Restrict the edit surface to these files (from `--file`), if given. */\n files?: string[];\n /** Sanitized module ranking (engine/relevance-provider.ts rankQuestion),\n * computed by the async caller over the user's ask — carries the seed\n * ordering AND the plain-language concept map. Absent → the mechanical\n * fallback ranks and the concept map is empty. */\n ranked?: SanitizedRank | null;\n}\n\n/**\n * Build the context block for a coding instruction. The ordering is\n * cache-stable by design (see router.ts): the invariant, repo-derived material\n * (facts, symbols, relations) comes first and the volatile instruction is\n * echoed last, so a provider's prompt cache can reuse the stable prefix across\n * turns.\n */\nexport function buildCodeContext(graph: VgGraph, instruction: string, options: BuildContextOptions = {}): CodeContext {\n const budget = options.budget ?? 3000;\n const seedLimit = options.seeds ?? 8;\n const impactDepth = options.impactDepth ?? 2;\n const index = indexFor(graph);\n\n // Hosts (VS Code panel) append a \"User attachments\" block with backticked\n // filenames/paths. Ranking and literal-locate pins must use only the user's\n // ask — otherwise `image.png` becomes a hard constraint that aborts the task.\n // The full instruction (with attachments) still goes in the Task section.\n const ask = userAskFromInstruction(instruction);\n\n // Retrieval seeds: the module ranking when the async caller supplied one\n // (options.ranked — the relevance engine), the mechanical fallback\n // otherwise. When `--file` narrows the surface, keep only seeds in those\n // files (but still let impact reach outside them, so the review is honest).\n const q = queryGraph(graph, ask, {\n budget: Math.floor(budget * 0.6),\n limit: seedLimit * 2,\n ranked: options.ranked,\n });\n let seeds = q.matches.map((m) => ({ node: m.node, why: m.why }));\n if (options.files && options.files.length) {\n const set = new Set(options.files.map(normalize));\n const inScope = seeds.filter((s) => set.has(normalize(s.node.file)));\n // If nothing matched inside the named files, keep the best global seeds but\n // still steer target files to what the caller asked for.\n if (inScope.length) seeds = inScope;\n }\n seeds = seeds.slice(0, seedLimit);\n\n // Blast radius: who depends on the seeds. This is the impact-aware review\n // signal — an edit to a hub is riskier and the context says so.\n const impacted = new Map<string, { node: GraphNode; via: string }>();\n for (const s of seeds) {\n const impact = impactOf(graph, s.node.id, { depth: impactDepth });\n for (const item of impact.affected.slice(0, 6)) {\n const node = index.node(item.id);\n if (node && !impacted.has(node.id)) impacted.set(node.id, { node, via: s.node.qualifiedName });\n }\n }\n\n // Target files: the seed files (or the explicit --file set), stable order.\n const targetFiles = options.files?.length\n ? [...new Set(options.files.map(normalize))].sort()\n : [...new Set(seeds.map((s) => s.node.file))].sort();\n\n // Pinned facts: declared invariants/contracts that touch the seeds. These are\n // hard constraints; they are surfaced explicitly and never summarized away.\n const seedIds = new Set(seeds.map((s) => s.node.id));\n const pinnedFacts = [\n ...literalNeedleFacts(ask),\n ...pinnedFactsFor(graph, seedIds),\n ];\n\n // The plain-language interpretation is authored by the relevance module\n // (and sanitized at the seam); the mechanical fallback has none to offer.\n const conceptMap = options.ranked?.conceptMap ?? [];\n const rendered = render(instruction, seeds, [...impacted.values()], targetFiles, pinnedFacts, conceptMap, index, budget);\n return {\n instruction,\n seeds,\n targetFiles,\n impacted: [...impacted.values()],\n pinnedFacts,\n conceptMap,\n rendered,\n tokensEstimate: estimateTokens(rendered),\n };\n}\n\n/** Pin URL / quoted needles so the agent does not treat path tokens as symbols. */\nfunction literalNeedleFacts(ask: string): string[] {\n const needles = extractLiteralNeedles(ask);\n if (!needles.length) return [];\n return needles.map(\n (n) =>\n `literal-locate: search the workspace for the exact string \\`${n}\\` (use search_code with the quoted needle). This is not a graph symbol name. If there are zero hits, report that honestly and finish — do not invent an edit.`,\n );\n}\n\nfunction pinnedFactsFor(graph: VgGraph, seedIds: Set<string>): string[] {\n if (!graph.facts?.length) return [];\n const out: string[] = [];\n for (const f of graph.facts) {\n if (f.kind === 'characterization') continue; // keep hard constraints only\n if (!f.subjectIds.some((id) => seedIds.has(id))) continue;\n const subjects = f.subjectIds\n .map((id) => graph.nodes.find((n) => n.id === id)?.qualifiedName ?? id)\n .join(', ');\n out.push(`${f.kind}: ${subjects} — ${JSON.stringify(f.predicate)}`);\n }\n return out.sort().slice(0, 12);\n}\n\nfunction render(\n instruction: string,\n seeds: { node: GraphNode; why: string }[],\n impacted: { node: GraphNode; via: string }[],\n targetFiles: string[],\n pinnedFacts: string[],\n conceptMap: string[],\n index: ReturnType<typeof indexFor>,\n budget: number,\n): string {\n const lines: string[] = [];\n lines.push('# Repository context (from the deterministic code graph)');\n lines.push('');\n\n if (pinnedFacts.length) {\n lines.push('## Hard constraints (do not violate)');\n for (const f of pinnedFacts) lines.push(`- ${f}`);\n lines.push('');\n }\n\n if (conceptMap.length) {\n lines.push('## How the ask was interpreted');\n for (const l of conceptMap) lines.push(l);\n lines.push('');\n }\n\n lines.push('## Relevant symbols');\n for (const { node, why } of seeds) {\n const block: string[] = [];\n block.push(`### ${node.qualifiedName} (${node.kind}, ${node.file}:${node.span.start}-${node.span.end})`);\n if (node.signature) block.push('`' + node.signature + '`');\n const callees = uniqueNames(index.callees(node.id).map((x) => x.node.qualifiedName)).slice(0, 6);\n const callers = uniqueNames(index.callers(node.id).map((x) => x.node.qualifiedName)).slice(0, 6);\n if (callees.length) block.push(`calls: ${callees.join(', ')}`);\n if (callers.length) block.push(`called by: ${callers.join(', ')}`);\n block.push(`importance ${node.importance.toFixed(3)}${node.isHub ? ' · hub (high blast radius)' : ''} · ${why}`);\n block.push('');\n const candidate = lines.concat(block).join('\\n');\n if (estimateTokens(candidate) > budget && lines.length > 3) break;\n lines.push(...block);\n }\n\n if (impacted.length) {\n lines.push('## Blast radius (would be affected by a change here)');\n for (const { node, via } of impacted.slice(0, 10)) {\n lines.push(`- ${node.qualifiedName} (${node.file}:${node.span.start}) — depends on ${via}`);\n }\n lines.push('');\n }\n\n lines.push('## Files in scope for this edit');\n for (const f of targetFiles) lines.push(`- ${f}`);\n lines.push('');\n\n lines.push('## Task');\n lines.push(instruction);\n return lines.join('\\n');\n}\n\nfunction uniqueNames(xs: string[]): string[] {\n return [...new Set(xs)];\n}\n\nfunction normalize(file: string): string {\n return file.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n}\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n","/**\n * Source-bearing Context Capsule compiler (Fusion Runtime Phase 0).\n *\n * Today's {@link buildCodeContext} pays for graph metadata, then the model still\n * calls `read_file` — double payment. This module compiles a Context Capsule that\n * includes exact source ranges (from Tree-sitter spans already on graph nodes)\n * so the first inference can solve without navigation tool calls (ZNS@1 path).\n *\n * Deterministic given (graph, instruction, file contents, options). Injectable\n * `readFile` keeps unit tests offline and pure.\n *\n * Schema: docs/fusion/task-capsule-v0.schema.json\n */\n\nimport { queryGraph } from '../engine/query.js';\nimport { indexFor } from '../engine/relations.js';\nimport { impactOf } from '../engine/impact.js';\nimport { hashString } from '../engine/hash.js';\nimport type { GraphNode, VgGraph } from '../schema.js';\nimport type { CodeContext } from './types.js';\nimport { buildCodeContext, type BuildContextOptions } from './context.js';\n\nexport const TASK_CAPSULE_SCHEMA_VERSION = 'task-capsule/0' as const;\n/** Frozen ranking policy id — bump when the heuristic changes (benchmark gate). */\n/** Bumped 2026.07.1: strip URL/quoted needles from seed ranking (no path-token false positives). */\n/** Bumped 2026.08.1: term roles (weak process verbs never seed alone), concept/bigram\n * expansion, multi-term coverage bonus, directory-segment evidence. */\n/** Bumped 2026.08.2: optional relevance-provider seam — sanitized provider expansions\n * join term preparation (own 0..1 weight capped at EXPANSION_WEIGHT; weak-provenance\n * dropped); provider version recorded as `relevanceVersion` provenance. Absent\n * provider = 2026.08.1 behaviour exactly — gated by the same corpus, dual-mode. */\n/** Bumped 2026.08.3: multi-turn field report (\"do we support direct debits?\" after a\n * stripe ask seeded direct* distractors). (a) Tokens consumed by a fired bigram\n * concept are demoted to the weak role — \"direct\" corroborates, never seeds.\n * (b) Conversation carry-over: the previous ask's content terms join ranking at\n * CARRY_WEIGHT when the caller passes `priorInstruction`. (c) A plain-language\n * \"how the ask was interpreted\" concept map is rendered for small local models.\n * No prior instruction + no bigram ask = 2026.08.2 behaviour exactly. */\n/** Bumped 2026.08.4: relevance relocation — the ranking engine (lexicon, term\n * roles, IDF, tiers, typo repair, morphology, diversification, concept map)\n * moved into the auto-provisioned relevance module behind the seam's\n * rankSymbols API; the host keeps mechanical name matching as the\n * module-less fallback. Seed content with the module active matches\n * 2026.08.3 + the coding-prompt-corpus improvements; the recorded\n * relevanceVersion says which engine ranked this capsule. */\nexport const CAPSULE_RANKING_VERSION = 'capsule-rank@2026.08.4' as const;\nexport const CAPSULE_COMPILER_ID = 'vg-task-capsule/0' as const;\n\nexport interface BuildCapsuleOptions extends BuildContextOptions {\n /**\n * Read file contents relative to the repository root. Required for source\n * slices; when omitted, the capsule still builds metadata + empty slices\n * (useful for schema/shape tests).\n */\n readFile?: (relativePath: string) => string | null;\n /** Extra lines of context around each symbol span (default 1). */\n padding?: number;\n /** Max source slices after merge (default 12). */\n maxSlices?: number;\n repositoryId?: string | null;\n /** Optional provenance from the Model Execution Profile / security ladder. */\n provenance?: CapsuleProvenanceExtras;\n /**\n * Extra pinned facts (e.g. high-confidence federation bridge edges) appended\n * after graph-derived facts. Secret-free, short strings only.\n */\n extraPinnedFacts?: string[];\n}\n\nexport interface CapsuleSymbolRef {\n id: string;\n qualifiedName: string;\n kind: string;\n file: string;\n span: { start: number; end: number };\n signature?: string | null;\n why: string;\n importance: number;\n}\n\nexport interface SourceSlice {\n file: string;\n start: number;\n end: number;\n content: string;\n contentHash: string;\n symbolIds: string[];\n}\n\nexport interface CapsuleRelationship {\n kind: 'calls' | 'called-by' | 'impacts' | 'contains' | 'other';\n from: string;\n to: string;\n}\n\nexport interface VerificationPlan {\n syntaxFiles: string[];\n suggestedTests: string[];\n notes: string[];\n}\n\nexport interface TaskCapsule {\n schemaVersion: typeof TASK_CAPSULE_SCHEMA_VERSION;\n instruction: string;\n primary: CapsuleSymbolRef[];\n supporting: CapsuleSymbolRef[];\n sourceSlices: SourceSlice[];\n relationships: CapsuleRelationship[];\n pinnedFacts: string[];\n /** Plain-language interpretation of the ask (concept expansions, relevance\n * topics, carried prior-turn terms) — see engine/query.ts conceptMapLines. */\n conceptMap: string[];\n targetFiles: string[];\n verificationPlan: VerificationPlan;\n rendered: string;\n tokensEstimate: number;\n provenance: {\n compiler: string;\n rankingVersion: string;\n graphCorpusHash: string | null;\n repositoryId: string | null;\n /** Model Execution Profile id when resolved (Fusion Phase 4/7). */\n modelProfileId?: string | null;\n /** Security tier for shell during this task. */\n securityTier?: string | null;\n /** Frozen policy / ranking patch id if any. */\n policyVersion?: string | null;\n /** Version of the optional relevance provider that widened seed\n * vocabulary for this capsule, or null when none was active. */\n relevanceVersion?: string | null;\n };\n}\n\nexport interface CapsuleProvenanceExtras {\n modelProfileId?: string | null;\n securityTier?: string | null;\n policyVersion?: string | null;\n}\n\n/** Host-safe capsule summary for VS Code / stream-json capsule transparency. */\nexport interface CapsuleSummary {\n schemaVersion: string;\n instruction: string;\n primary: Array<{ qualifiedName: string; file: string; kind: string; why: string }>;\n supporting: Array<{ qualifiedName: string; file: string; kind: string; why: string }>;\n sourceSliceCount: number;\n sourceFiles: string[];\n tokensEstimate: number;\n rankingVersion: string;\n /**\n * How the ask was interpreted, ready to show a human: the capsule's concept\n * map with the model-facing seed-notation legend dropped and the leading\n * \"- \" bullet stripped. Empty when no relevance engine widened the ask.\n */\n interpretation: string[];\n /** Truncated rendered capsule for display (not the full prompt dump). */\n preview: string;\n}\n\n/**\n * The concept map, projected for a human surface. The rendered capsule ends its\n * concept map with a notation legend that exists so a small local model can\n * decode the `a→b` slugs on each seed line; a terminal or panel reader has the\n * `why` strings spelled out next to the symbol, so the legend is noise there.\n */\nfunction interpretationFor(conceptMap: string[]): string[] {\n return conceptMap\n .filter((line) => !/^\\s*-?\\s*Seed notation\\b/i.test(line))\n .map((line) => line.replace(/^\\s*-\\s+/, '').trim())\n .filter(Boolean);\n}\n\n/** Host-safe capsule summary (capsule transparency UI / stream-json). */\nexport function summarizeCapsule(capsule: TaskCapsule): CapsuleSummary {\n const sourceFiles = [...new Set(capsule.sourceSlices.map((s) => s.file))].sort();\n const preview = capsule.rendered.length > 4000 ? `${capsule.rendered.slice(0, 4000)}\\n… (truncated)` : capsule.rendered;\n return {\n schemaVersion: capsule.schemaVersion,\n instruction: capsule.instruction,\n primary: capsule.primary.map((p) => ({ qualifiedName: p.qualifiedName, file: p.file, kind: p.kind, why: p.why })),\n supporting: capsule.supporting.map((p) => ({ qualifiedName: p.qualifiedName, file: p.file, kind: p.kind, why: p.why })),\n sourceSliceCount: capsule.sourceSlices.length,\n sourceFiles,\n tokensEstimate: capsule.tokensEstimate,\n rankingVersion: capsule.provenance.rankingVersion,\n interpretation: interpretationFor(capsule.conceptMap),\n preview,\n };\n}\n\n/**\n * Interpretation lines shown before the seeds. Matches the VS Code panel's cap\n * so the two surfaces explain an ask the same way. Three was too few in\n * practice: the concept map orders broad taxonomy lines ahead of the specific\n * ones, so a typo repair (\"read \\\"chekout\\\" as \\\"checkout\\\"\") — the line a\n * reader who typed the typo most needs — fell past the cut.\n */\nconst TRANSPARENCY_INTERPRETATION_LINES = 6;\n/** Seeds shown with their match provenance. */\nconst TRANSPARENCY_SEED_LINES = 3;\n\n/**\n * The capsule transparency block for a text surface: how the ask was read, and\n * which symbols that reached, with the reason each one matched.\n *\n * Returns indented, ready-to-print lines (the caller applies dimming). Both\n * sections are capped — a coding session prints one of these per turn, and the\n * complete block already travels inside the capsule itself. Empty when there is\n * nothing to explain (no relevance engine active and no seeds).\n */\nexport function capsuleTransparencyLines(summary: CapsuleSummary): string[] {\n const lines: string[] = [];\n\n const interpretation = summary.interpretation ?? [];\n for (const line of interpretation.slice(0, TRANSPARENCY_INTERPRETATION_LINES)) {\n lines.push(` read: ${line}`);\n }\n const hiddenInterpretation = interpretation.length - TRANSPARENCY_INTERPRETATION_LINES;\n if (hiddenInterpretation > 0) lines.push(` read: … ${hiddenInterpretation} more`);\n\n const seeds = (summary.primary ?? []).filter((p) => p.qualifiedName);\n for (const seed of seeds.slice(0, TRANSPARENCY_SEED_LINES)) {\n // An external/module node carries no file of its own — no dangling separator.\n const where = seed.file ? ` · ${seed.file}` : '';\n const why = seed.why ? ` — ${seed.why}` : '';\n lines.push(` seed: ${seed.qualifiedName}${where}${why}`);\n }\n const hiddenSeeds = seeds.length - TRANSPARENCY_SEED_LINES;\n if (hiddenSeeds > 0) lines.push(` seed: … ${hiddenSeeds} more`);\n\n return lines;\n}\n\n/**\n * Compile a source-bearing Context Capsule. Reuses the same seed / impact /\n * fact-pinning path as {@link buildCodeContext}, then attaches exact source\n * slices and a verification sketch.\n */\nexport function buildTaskCapsule(graph: VgGraph, instruction: string, options: BuildCapsuleOptions = {}): TaskCapsule {\n const base = buildCodeContext(graph, instruction, options);\n const padding = options.padding ?? 1;\n const maxSlices = options.maxSlices ?? 12;\n const budget = options.budget ?? 3000;\n const index = indexFor(graph);\n\n const primary = base.seeds.map((s) => toRef(s.node, s.why));\n const primaryIds = new Set(primary.map((p) => p.id));\n\n const supporting: CapsuleSymbolRef[] = [];\n for (const { node, via } of base.impacted) {\n if (primaryIds.has(node.id)) continue;\n supporting.push(toRef(node, `depends on ${via}`));\n }\n\n const relationships = collectRelationships(base, index);\n const sourceSlices = options.readFile\n ? buildSourceSlices(\n [...base.seeds.map((s) => s.node), ...base.impacted.map((i) => i.node)],\n options.readFile,\n padding,\n maxSlices,\n )\n : [];\n\n const extraFacts = (options.extraPinnedFacts ?? []).filter((f) => typeof f === 'string' && f.trim());\n const pinnedFacts = [...base.pinnedFacts, ...extraFacts];\n const verificationPlan = buildVerificationPlan(graph, base);\n const rendered = renderCapsule(instruction, primary, supporting, sourceSlices, pinnedFacts, base.conceptMap, base.targetFiles, verificationPlan, relationships, budget);\n\n return {\n schemaVersion: TASK_CAPSULE_SCHEMA_VERSION,\n instruction,\n primary,\n supporting,\n sourceSlices,\n relationships,\n pinnedFacts,\n conceptMap: base.conceptMap,\n targetFiles: base.targetFiles,\n verificationPlan,\n rendered,\n tokensEstimate: estimateTokens(rendered),\n provenance: {\n compiler: CAPSULE_COMPILER_ID,\n rankingVersion: CAPSULE_RANKING_VERSION,\n graphCorpusHash: graph.provenance?.corpusHash ?? null,\n repositoryId: options.repositoryId ?? null,\n modelProfileId: options.provenance?.modelProfileId ?? null,\n securityTier: options.provenance?.securityTier ?? null,\n policyVersion: options.provenance?.policyVersion ?? null,\n relevanceVersion: options.ranked?.version ?? null,\n },\n };\n}\n\n/**\n * Project a capsule into the legacy {@link CodeContext} shape so the existing\n * agent prompt path can consume it without a full rewrite (A/B flag).\n */\nexport function capsuleToCodeContext(capsule: TaskCapsule): CodeContext {\n return {\n instruction: capsule.instruction,\n seeds: capsule.primary.map((p) => ({\n node: {\n id: p.id,\n qualifiedName: p.qualifiedName,\n kind: p.kind,\n file: p.file,\n span: p.span,\n signature: p.signature ?? undefined,\n importance: p.importance,\n } as GraphNode,\n why: p.why,\n })),\n targetFiles: capsule.targetFiles,\n conceptMap: capsule.conceptMap,\n impacted: capsule.supporting.map((s) => ({\n node: {\n id: s.id,\n qualifiedName: s.qualifiedName,\n kind: s.kind,\n file: s.file,\n span: s.span,\n signature: s.signature ?? undefined,\n importance: s.importance,\n } as GraphNode,\n via: s.why.replace(/^depends on /, ''),\n })),\n pinnedFacts: capsule.pinnedFacts,\n rendered: capsule.rendered,\n tokensEstimate: capsule.tokensEstimate,\n };\n}\n\nfunction toRef(node: GraphNode, why: string): CapsuleSymbolRef {\n return {\n id: node.id,\n qualifiedName: node.qualifiedName,\n kind: node.kind,\n file: normalize(node.file),\n span: { start: node.span.start, end: node.span.end },\n signature: node.signature ?? null,\n why,\n importance: node.importance,\n };\n}\n\nfunction collectRelationships(\n base: CodeContext,\n index: ReturnType<typeof indexFor>,\n): CapsuleRelationship[] {\n const out: CapsuleRelationship[] = [];\n const seen = new Set<string>();\n const push = (kind: CapsuleRelationship['kind'], from: string, to: string) => {\n const key = `${kind}|${from}|${to}`;\n if (seen.has(key)) return;\n seen.add(key);\n out.push({ kind, from, to });\n };\n\n for (const { node } of base.seeds) {\n for (const c of index.callees(node.id).slice(0, 6)) {\n push('calls', node.qualifiedName, c.node.qualifiedName);\n }\n for (const c of index.callers(node.id).slice(0, 6)) {\n push('called-by', node.qualifiedName, c.node.qualifiedName);\n }\n }\n for (const { node, via } of base.impacted.slice(0, 10)) {\n push('impacts', via, node.qualifiedName);\n }\n\n // Stable order for determinism.\n return out.sort((a, b) => a.kind.localeCompare(b.kind) || a.from.localeCompare(b.from) || a.to.localeCompare(b.to));\n}\n\nfunction buildSourceSlices(\n nodes: GraphNode[],\n readFile: (relativePath: string) => string | null,\n padding: number,\n maxSlices: number,\n): SourceSlice[] {\n // Prefer concrete symbols over file/module containers for source evidence.\n const eligible = nodes.filter((n) => !['file', 'module', 'package'].includes(n.kind));\n const byFile = new Map<string, GraphNode[]>();\n for (const n of eligible) {\n const file = normalize(n.file);\n const list = byFile.get(file) ?? [];\n list.push(n);\n byFile.set(file, list);\n }\n\n type Range = { file: string; start: number; end: number; symbolIds: string[]; score: number };\n const ranges: Range[] = [];\n\n for (const [file, fileNodes] of [...byFile.entries()].sort(([a], [b]) => a.localeCompare(b))) {\n const sorted = [...fileNodes].sort((a, b) => a.span.start - b.span.start || b.importance - a.importance);\n let current: Range | null = null;\n for (const n of sorted) {\n const start = Math.max(1, n.span.start - padding);\n const end = n.span.end + padding;\n const score = n.importance + (n.isHub ? 0.25 : 0);\n if (current && current.file === file && start <= current.end + 2) {\n current.end = Math.max(current.end, end);\n current.symbolIds.push(n.id);\n current.score = Math.max(current.score, score);\n } else {\n if (current) ranges.push(current);\n current = { file, start, end, symbolIds: [n.id], score };\n }\n }\n if (current) ranges.push(current);\n }\n\n ranges.sort((a, b) => b.score - a.score || a.file.localeCompare(b.file) || a.start - b.start);\n\n const slices: SourceSlice[] = [];\n for (const range of ranges) {\n if (slices.length >= maxSlices) break;\n const raw = readFile(range.file);\n if (raw === null) continue;\n const lines = raw.split('\\n');\n const start = Math.min(range.start, lines.length);\n const end = Math.min(range.end, lines.length);\n if (start < 1 || end < start) continue;\n const content = lines.slice(start - 1, end).join('\\n');\n slices.push({\n file: range.file,\n start,\n end,\n content,\n contentHash: hashString(content),\n symbolIds: [...new Set(range.symbolIds)].sort(),\n });\n }\n\n // Stable final order: file then start line (score only used for selection).\n return slices.sort((a, b) => a.file.localeCompare(b.file) || a.start - b.start);\n}\n\nfunction buildVerificationPlan(graph: VgGraph, base: CodeContext): VerificationPlan {\n const syntaxFiles = [...base.targetFiles].sort();\n const seedIds = new Set(base.seeds.map((s) => s.node.id));\n const suggestedTests: string[] = [];\n\n for (const n of graph.nodes) {\n if (n.kind !== 'test') continue;\n // Prefer tests that share a file with seeds or whose name mentions a seed.\n const sameFile = base.seeds.some((s) => normalize(s.node.file) === normalize(n.file));\n const nameHit = base.seeds.some((s) => n.qualifiedName.toLowerCase().includes(s.node.name.toLowerCase()));\n if (sameFile || nameHit || seedIds.has(n.id)) {\n suggestedTests.push(n.qualifiedName);\n }\n }\n suggestedTests.sort();\n\n const notes: string[] = [];\n if (!suggestedTests.length) {\n notes.push('No graph-linked tests found for seed symbols; run the nearest project test command after apply.');\n }\n if (base.impacted.some((i) => i.node.isHub || i.node.importance >= 0.7)) {\n notes.push('High-importance dependents in blast radius — prefer targeted tests before a full build.');\n }\n\n return {\n syntaxFiles,\n suggestedTests: suggestedTests.slice(0, 12),\n notes,\n };\n}\n\nfunction renderCapsule(\n instruction: string,\n primary: CapsuleSymbolRef[],\n supporting: CapsuleSymbolRef[],\n slices: SourceSlice[],\n pinnedFacts: string[],\n conceptMap: string[],\n targetFiles: string[],\n verification: VerificationPlan,\n relationships: CapsuleRelationship[],\n budget: number,\n): string {\n const lines: string[] = [];\n lines.push('# Context capsule (source-bearing, from the deterministic code graph)');\n lines.push('');\n lines.push('Use the exact source evidence below. Search or read outside it only if this capsule is insufficient.');\n lines.push('');\n\n if (pinnedFacts.length) {\n lines.push('## Hard constraints (do not violate)');\n for (const f of pinnedFacts) lines.push(`- ${f}`);\n lines.push('');\n }\n\n // Rendered before the symbol list on purpose: a small local model reads the\n // interpretation first, so the `a→b` provenance slugs on each seed line are\n // decodable instead of noise.\n if (conceptMap.length) {\n lines.push('## How the ask was interpreted');\n for (const l of conceptMap) lines.push(l);\n lines.push('');\n }\n\n lines.push('## Primary symbols');\n for (const s of primary) {\n lines.push(`- ${s.qualifiedName} (${s.kind}, ${s.file}:${s.span.start}-${s.span.end})${s.signature ? ` — \\`${s.signature}\\`` : ''} — ${s.why}`);\n }\n lines.push('');\n\n if (supporting.length) {\n lines.push('## Supporting / blast radius');\n for (const s of supporting.slice(0, 10)) {\n lines.push(`- ${s.qualifiedName} (${s.file}:${s.span.start}) — ${s.why}`);\n }\n lines.push('');\n }\n\n if (relationships.length) {\n lines.push('## Relationships');\n for (const r of relationships.slice(0, 24)) {\n lines.push(`- ${r.kind}: ${r.from} → ${r.to}`);\n }\n lines.push('');\n }\n\n lines.push('## Exact source evidence');\n if (!slices.length) {\n lines.push('_No source slices available (file reader missing or spans unreadable)._');\n lines.push('');\n } else {\n let included = 0;\n for (const slice of slices) {\n const block = [\n `### ${slice.file}:${slice.start}-${slice.end}`,\n `\\`\\`\\`${langFor(slice.file)}`,\n slice.content,\n '```',\n '',\n ];\n const candidate = [...lines, ...block, '## Task', instruction].join('\\n');\n if (estimateTokens(candidate) > budget && included > 0) break;\n lines.push(...block);\n included += 1;\n }\n }\n\n lines.push('## Files in scope');\n for (const f of targetFiles) lines.push(`- ${f}`);\n lines.push('');\n\n lines.push('## Verification plan');\n for (const f of verification.syntaxFiles) lines.push(`- syntax: ${f}`);\n for (const t of verification.suggestedTests) lines.push(`- test: ${t}`);\n for (const n of verification.notes) lines.push(`- note: ${n}`);\n lines.push('');\n\n lines.push('## Task');\n lines.push(instruction);\n return lines.join('\\n');\n}\n\nfunction langFor(file: string): string {\n const ext = file.split('.').pop()?.toLowerCase() ?? '';\n const map: Record<string, string> = {\n ts: 'ts',\n tsx: 'tsx',\n js: 'js',\n jsx: 'jsx',\n mjs: 'js',\n cjs: 'js',\n py: 'python',\n rs: 'rust',\n go: 'go',\n java: 'java',\n cs: 'csharp',\n md: 'md',\n json: 'json',\n };\n return map[ext] ?? '';\n}\n\nfunction normalize(file: string): string {\n return file.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n}\n\nfunction estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n// Re-export query touch so tree-shaking keeps the dependency explicit for tests.\nexport const __testing = { queryGraph, impactOf };\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveGraphPath } from './chunk-
|
|
1
|
+
import { resolveGraphPath } from './chunk-FVBN4E5C.js';
|
|
2
2
|
import { cacheDir } from './chunk-MVPRPSXU.js';
|
|
3
3
|
import { hashString } from './chunk-JFGYT6BI.js';
|
|
4
4
|
import * as fs2 from 'fs';
|
|
@@ -614,5 +614,5 @@ function safe(id) {
|
|
|
614
614
|
}
|
|
615
615
|
|
|
616
616
|
export { acquireLock, clearModelCache, cosine, countPending, embedTargets, embeddingsCached, embeddingsPath, embeddingsPathFor, getNodeEmbeddings, isModelReady, loadEmbedder, modelCacheInfo, nodeEmbedText, readCachedVectors, releaseLock, resolveEmbedModel, unavailableMessage, withTimeout };
|
|
617
|
-
//# sourceMappingURL=chunk-
|
|
618
|
-
//# sourceMappingURL=chunk-
|
|
617
|
+
//# sourceMappingURL=chunk-B5X246UH.js.map
|
|
618
|
+
//# sourceMappingURL=chunk-B5X246UH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/engine/lock.ts","../src/engine/embeddings.ts"],"names":["fs","path"],"mappings":"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","file":"chunk-DMI4BMUL.js","sourcesContent":["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/**\n * True when a live process is holding this lock right now. Read-only: it never\n * reclaims, so a caller can politely stand down (the vgd semantic warm does\n * this rather than embedding a repo a `vg embed` child is already embedding).\n */\nexport function lockHeld(file: string, staleMs = DEFAULT_LOCK_STALE_MS): boolean {\n if (!fs.existsSync(file)) return false;\n return !lockIsStale(file, staleMs);\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 { resolveGraphPath } from './artifacts.js';\nimport { acquireLock, lockHeld, 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 OPTIONAL and lazily loaded (the vendored\n * `src/vendor/fastembed` dense backend over `onnxruntime-node`, local ONNX)\n * 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. Per-repo vectors live in a binary `*.embeddings`\n * file **alongside the code map** (global store under Application Support /\n * XDG data, or `.vibgrate/embeddings` in-repo) — never model-named, never under\n * `.vibgrate/cache/`, and NEVER inside the committed `graph.json`, so the map\n * stays byte-deterministic. The model id is recorded inside the file header so\n * a model change still invalidates the cache without putting the name in the\n * path.\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 /**\n * Called (not thrown) when the backend can't load. `detail` carries the\n * underlying loader error when there is one, so a host can log something\n * actionable instead of a bare category.\n */\n onUnavailable?: (reason: EmbedUnavailable, detail?: string) => void;\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 * Checks the binary sidecar next to the map (and the legacy JSON path once).\n */\nexport function embeddingsCached(root: string, modelId: string): boolean {\n const file = vectorCachePath(root);\n if (fs.existsSync(file) && readCacheHeader(file)?.model === modelId) return true;\n // One-shot legacy: pre-binary caches lived under `.vibgrate/cache/embeddings-<model>.json`.\n return fs.existsSync(legacyVectorCachePath(root, modelId));\n}\n\n/**\n * Path of the binary embeddings file for this repo's current map — always named\n * `embeddings` (or `<snapshot>.embeddings` next to a branch-keyed graph), never\n * after the model. Exported for `vg embed --where` and tests.\n */\nexport function embeddingsPath(root: string): string {\n return vectorCachePath(root);\n}\n\n/** Sidecar path next to a map file: `…/branch-main.graph.json` → `…/branch-main.embeddings`. */\nexport function embeddingsPathFor(graphPath: string): string {\n // Branch-keyed global maps: `…/graphs/branch-main.graph.json` → `…/graphs/branch-main.embeddings`.\n if (graphPath.endsWith('.graph.json')) return `${graphPath.slice(0, -'.graph.json'.length)}.embeddings`;\n if (graphPath.endsWith('.graph.snap')) return `${graphPath.slice(0, -'.graph.snap'.length)}.embeddings`;\n // In-repo map is exactly `…/graph.json` (or `graph.snap`) → plain `…/embeddings`.\n const base = path.basename(graphPath);\n if (base === 'graph.json' || base === 'graph.snap') {\n return path.join(path.dirname(graphPath), 'embeddings');\n }\n if (graphPath.endsWith('.json')) return `${graphPath.slice(0, -5)}.embeddings`;\n if (graphPath.endsWith('.snap')) return `${graphPath.slice(0, -5)}.embeddings`;\n return `${graphPath}.embeddings`;\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, detail?: string): null => {\n options.onUnavailable?.(reason, detail);\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 backend = await importEmbedBackend();\n const mod: any = backend.mod;\n if (!mod?.FlagEmbedding) return fail('not-installed', backend.error);\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', errText(e));\n }\n}\n\n/**\n * Import the optional embedding backend — the VENDORED dense backend\n * (src/vendor/fastembed). It still needs the optional native deps\n * (`onnxruntime-node`, `@anush008/tokenizers`, `tar`), which a host can supply\n * out-of-tree via `VIBGRATE_EMBEDDER_PATH` — a directory whose `node_modules`\n * contains them. Editor integrations use this when their bundled engine ships\n * without the native optional dependencies (the VS Code extension installs\n * them into its own storage on consent); the host dir wins over this package's\n * own dependency tree so the copies the user consented to are the ones that\n * load (see `ensureNativeDeps` in the vendored module).\n *\n * Legacy host contract: a host dir holding a whole upstream `fastembed`\n * install (what older extension versions set up) is still honored, and wins,\n * so an engine upgrade never breaks a backend the user already consented to.\n * Any resolution failure falls through — never throws.\n */\nasync function importEmbedBackend(): Promise<{ mod: any | null; error?: string }> {\n const hostDir = process.env.VIBGRATE_EMBEDDER_PATH;\n let error: string | undefined;\n if (hostDir) {\n try {\n const req = createRequire(path.join(hostDir, 'package.json'));\n let entry: string | null = null;\n try {\n entry = req.resolve('fastembed');\n } catch {\n // No upstream fastembed in the host dir — the normal state under the\n // current contract (the host supplies only the native deps, resolved\n // by the vendored backend below). Not an error worth reporting.\n }\n if (entry) {\n const mod: any = await import(pathToFileURL(entry).href);\n const resolved = unwrapBackend(mod);\n if (resolved) return { mod: resolved };\n error = `${hostDir}: fastembed loaded but exported no FlagEmbedding`;\n }\n } catch (e) {\n // Keep the reason. A host-supplied backend that resolves but won't load\n // (native binary built for another ABI, a half-extracted tree, a missing\n // transitive dep) is indistinguishable from \"never installed\" once the\n // error is dropped — and that is the one failure a user cannot act on.\n error = `${hostDir}: ${errText(e)}`;\n }\n }\n try {\n const mod: any = await import('../vendor/fastembed/index.js');\n const resolved = unwrapBackend(mod);\n if (!resolved) return { mod: null, error: error ?? 'embed backend exported no FlagEmbedding' };\n // Load the native deps now (host dir first — see the vendored module), so\n // a missing or broken install surfaces here as \"not-installed\" with the\n // real reason instead of failing later mid-init.\n if (typeof resolved.ensureNativeDeps === 'function') await resolved.ensureNativeDeps();\n return { mod: resolved };\n } catch (e) {\n return { mod: null, error: error ?? errText(e) };\n }\n}\n\n/** A CJS entry imported over ESM may nest its exports one or two `default`s deep. */\nfunction unwrapBackend(mod: any): any | null {\n for (const candidate of [mod, mod?.default, mod?.default?.default]) {\n if (candidate?.FlagEmbedding) return candidate;\n }\n return null;\n}\n\nfunction errText(e: unknown): string {\n const msg = e instanceof Error ? e.message : String(e);\n return msg.replace(/\\s+/g, ' ').trim().slice(0, 300);\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\n/**\n * Binary embeddings format (local cache next to the map, never committed):\n *\n * MAGIC \"VGEMB1\\0\" · u16 version · u16 modelLen · model utf8 ·\n * u32 dims · u32 count ·\n * for each entry: u16 idLen · id · u16 hashLen · hash ·\n * then contiguous Float32LE vectors [count × dims]\n *\n * Why binary: a medium map (~4k nodes × 384 dims) is ~6 MB of floats but was\n * ~30 MB of JSON with full decimal text — slow to parse and noisy in source\n * control if it ever landed under the repo. The filename is always\n * `embeddings` / `<snapshot>.embeddings`; the model id lives only in the header.\n */\n/** 8-byte little-endian-friendly magic (same width as graph `VGSNAP1\\0`). */\nconst EMB_MAGIC = Buffer.from('VGEMB01\\0', 'latin1');\nconst EMB_VERSION = 1;\n\nfunction vectorCachePath(root: string): string {\n return embeddingsPathFor(resolveGraphPath(root));\n}\n\n/** Pre-binary path: `.vibgrate/cache/embeddings-<model>.json` (read once to migrate). */\nfunction legacyVectorCachePath(root: string, modelId: string): string {\n return path.join(cacheDir(root), `embeddings-${safe(modelId)}.json`);\n}\n\n/** One node's contribution to the semantic index: what is embedded, and its hash. */\nexport interface EmbedTarget {\n id: string;\n text: string;\n hash: string;\n}\n\n/**\n * The nodes the semantic index covers, and the exact text embedded for each.\n *\n * This is the single definition of \"what is in the index\", shared by the\n * on-disk cache (`vg embed`, `vg ask`) and vgd's in-memory slot index. They\n * used to compute it separately — vgd embedded *every* node with a shorter\n * text — so the two indexes described different things and vgd re-embedded\n * work the disk cache had already done. Keep them on this one function.\n */\nexport function embedTargets(graph: VgGraph): EmbedTarget[] {\n // Tolerant of a partial graph: vgd indexes whatever a client publishes, and\n // an `areas`-less map is a valid (if unlabelled) one.\n const areaLabel = new Map((graph.areas ?? []).map((a) => [a.id, a.label] as const));\n const targets: EmbedTarget[] = [];\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 text = nodeEmbedText(n, areaLabel.get(n.area));\n targets.push({ id: n.id, text, hash: hashString(text) });\n }\n return targets;\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 = loadCache(root, modelId).entries;\n let pending = 0;\n for (const t of embedTargets(graph)) {\n const cached = entries[t.id];\n if (!cached || cached.hash !== t.hash) pending++;\n }\n return pending;\n}\n\n/** What a reader (vgd) finds in this repo's on-disk vector cache. */\nexport interface CachedVectorRead {\n model: string;\n /** nodeId → vector, for every node whose cached hash still matches. */\n vectors: Map<string, number[]>;\n /** Targets the cache does not cover yet. */\n pending: EmbedTarget[];\n /** True while another process holds the cache's single-writer lock. */\n writerBusy: boolean;\n}\n\n/**\n * Read this repo's vector cache without loading the embedding backend.\n *\n * vgd warms its slot index from here first: on a repo `vg embed` has already\n * warmed, a slot goes `ready` in milliseconds with no worker and no duplicated\n * embedding. `writerBusy` reports the single-writer lock so vgd can stand down\n * while the `vg build` warm-up child is mid-run instead of racing it.\n */\nexport function readCachedVectors(\n graph: VgGraph,\n root: string,\n modelId = resolveEmbedModel(),\n): CachedVectorRead {\n const entries = loadCache(root, modelId).entries;\n const vectors = new Map<string, number[]>();\n const pending: EmbedTarget[] = [];\n for (const t of embedTargets(graph)) {\n const cached = entries[t.id];\n if (cached && cached.hash === t.hash && cached.vec.length > 0) vectors.set(t.id, cached.vec);\n else pending.push(t);\n }\n return { model: modelId, vectors, pending, writerBusy: lockHeld(`${vectorCachePath(root)}.lock`) };\n}\n\nfunction loadCache(root: string, modelId: string): EmbedCache {\n const file = vectorCachePath(root);\n const binary = readBinaryCache(file, modelId);\n if (binary) return binary;\n\n // Migrate legacy JSON if present (once) — keep working after upgrade without\n // re-embedding the whole repo.\n const legacy = legacyVectorCachePath(root, modelId);\n if (fs.existsSync(legacy)) {\n try {\n const loaded = JSON.parse(fs.readFileSync(legacy, 'utf8')) as EmbedCache;\n if (loaded.model === modelId && loaded.entries) {\n return { model: modelId, entries: loaded.entries };\n }\n } catch {\n /* treat as empty */\n }\n }\n return { model: modelId, entries: {} };\n}\n\ninterface EmbedHeader {\n model: string;\n dims: number;\n count: number;\n}\n\n/** Cheap header-only peek (no vectors) for `embeddingsCached` / diagnostics. */\nfunction readCacheHeader(file: string): EmbedHeader | null {\n let fd: number | null = null;\n try {\n fd = fs.openSync(file, 'r');\n const prefix = Buffer.alloc(8 + 2 + 2 + 512); // magic + ver + modelLen + model (capped)\n const n = fs.readSync(fd, prefix, 0, prefix.length, 0);\n if (n < EMB_MAGIC.length + 4 || !prefix.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n const version = prefix.readUInt16LE(o);\n o += 2;\n if (version !== EMB_VERSION) return null;\n const modelLen = prefix.readUInt16LE(o);\n o += 2;\n if (o + modelLen + 8 > n) {\n // model spills past our prefix — re-read exactly\n const full = Buffer.alloc(EMB_MAGIC.length + 2 + 2 + modelLen + 8);\n fs.readSync(fd, full, 0, full.length, 0);\n return parseHeaderPrefix(full);\n }\n return parseHeaderPrefix(prefix);\n } catch {\n return null;\n } finally {\n if (fd !== null) fs.closeSync(fd);\n }\n}\n\nfunction parseHeaderPrefix(buf: Buffer): EmbedHeader | null {\n try {\n if (!buf.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n if (buf.readUInt16LE(o) !== EMB_VERSION) return null;\n o += 2;\n const modelLen = buf.readUInt16LE(o);\n o += 2;\n if (o + modelLen + 8 > buf.length) return null;\n const model = buf.subarray(o, o + modelLen).toString('utf8');\n o += modelLen;\n const dims = buf.readUInt32LE(o);\n o += 4;\n const count = buf.readUInt32LE(o);\n return { model, dims, count };\n } catch {\n return null;\n }\n}\n\nfunction readBinaryCache(file: string, modelId: string): EmbedCache | null {\n if (!fs.existsSync(file)) return null;\n try {\n const buf = fs.readFileSync(file);\n if (buf.length < EMB_MAGIC.length + 4 || !buf.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n if (buf.readUInt16LE(o) !== EMB_VERSION) return null;\n o += 2;\n const modelLen = buf.readUInt16LE(o);\n o += 2;\n const model = buf.subarray(o, o + modelLen).toString('utf8');\n o += modelLen;\n if (model !== modelId) return null;\n const dims = buf.readUInt32LE(o);\n o += 4;\n const count = buf.readUInt32LE(o);\n o += 4;\n if (dims === 0 || count === 0) return { model, entries: {} };\n\n const ids: string[] = [];\n const hashes: string[] = [];\n for (let i = 0; i < count; i++) {\n const idLen = buf.readUInt16LE(o);\n o += 2;\n ids.push(buf.subarray(o, o + idLen).toString('utf8'));\n o += idLen;\n const hashLen = buf.readUInt16LE(o);\n o += 2;\n hashes.push(buf.subarray(o, o + hashLen).toString('utf8'));\n o += hashLen;\n }\n const floatsNeeded = count * dims;\n const bytesNeeded = floatsNeeded * 4;\n if (o + bytesNeeded > buf.length) return null;\n // Copy into a standalone ArrayBuffer so Float32Array views are safe after buf is GC'd.\n const floatBuf = Buffer.from(buf.subarray(o, o + bytesNeeded));\n const floats = new Float32Array(floatBuf.buffer, floatBuf.byteOffset, floatsNeeded);\n\n const entries: EmbedCache['entries'] = {};\n for (let i = 0; i < count; i++) {\n const start = i * dims;\n const vec = Array.from(floats.subarray(start, start + dims));\n entries[ids[i]!] = { hash: hashes[i]!, vec };\n }\n return { model, entries };\n } catch {\n return null;\n }\n}\n\nfunction writeBinaryCache(file: string, cache: EmbedCache): void {\n const ids = Object.keys(cache.entries);\n const count = ids.length;\n let dims = 0;\n for (const id of ids) {\n const d = cache.entries[id]!.vec.length;\n if (d > 0) {\n dims = d;\n break;\n }\n }\n // Empty or all-zero-dim cache: still write a valid header so \"cached\" is true.\n const modelBuf = Buffer.from(cache.model, 'utf8');\n if (modelBuf.length > 0xffff) throw new Error('embed model id too long');\n\n // Index size (ids + hashes)\n let indexBytes = 0;\n const idBufs: Buffer[] = [];\n const hashBufs: Buffer[] = [];\n for (const id of ids) {\n const ib = Buffer.from(id, 'utf8');\n const hb = Buffer.from(cache.entries[id]!.hash, 'utf8');\n if (ib.length > 0xffff || hb.length > 0xffff) throw new Error('embed entry key too long');\n idBufs.push(ib);\n hashBufs.push(hb);\n indexBytes += 2 + ib.length + 2 + hb.length;\n }\n\n const headerBytes = EMB_MAGIC.length + 2 + 2 + modelBuf.length + 4 + 4;\n const vecBytes = count * dims * 4;\n const out = Buffer.allocUnsafe(headerBytes + indexBytes + vecBytes);\n let o = 0;\n EMB_MAGIC.copy(out, o);\n o += EMB_MAGIC.length;\n out.writeUInt16LE(EMB_VERSION, o);\n o += 2;\n out.writeUInt16LE(modelBuf.length, o);\n o += 2;\n modelBuf.copy(out, o);\n o += modelBuf.length;\n out.writeUInt32LE(dims, o);\n o += 4;\n out.writeUInt32LE(count, o);\n o += 4;\n\n for (let i = 0; i < count; i++) {\n const ib = idBufs[i]!;\n const hb = hashBufs[i]!;\n out.writeUInt16LE(ib.length, o);\n o += 2;\n ib.copy(out, o);\n o += ib.length;\n out.writeUInt16LE(hb.length, o);\n o += 2;\n hb.copy(out, o);\n o += hb.length;\n }\n\n if (dims > 0 && count > 0) {\n const floats = new Float32Array(count * dims);\n for (let i = 0; i < count; i++) {\n const vec = cache.entries[ids[i]!]!.vec;\n const base = i * dims;\n for (let d = 0; d < dims; d++) floats[base + d] = vec[d] ?? 0;\n }\n Buffer.from(floats.buffer, floats.byteOffset, floats.byteLength).copy(out, o);\n }\n\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const tmp = `${file}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, out);\n fs.renameSync(tmp, file);\n}\n\n/** Best-effort drop of the old model-named JSON caches under `.vibgrate/cache/`. */\nfunction purgeLegacyJsonCaches(root: string): void {\n const dir = cacheDir(root);\n let names: string[];\n try {\n names = fs.readdirSync(dir);\n } catch {\n return;\n }\n for (const name of names) {\n if (/^embeddings-.+\\.json$/.test(name) || /^embeddings-.+\\.json\\.lock$/.test(name)) {\n try {\n fs.rmSync(path.join(dir, name), { force: true });\n } catch {\n /* best-effort */\n }\n }\n }\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);\n const cache = loadCache(root, embedder.id);\n\n // Includes document nodes (markdown/txt/env examples) so ask can retrieve docs.\n const targets = embedTargets(graph);\n const toEmbed: EmbedTarget[] = [];\n const vectors = new Map<string, number[]>();\n for (const t of targets) {\n const cached = cache.entries[t.id];\n if (cached && cached.hash === t.hash) vectors.set(t.id, cached.vec);\n else toEmbed.push(t);\n }\n\n // Atomic write (temp + rename) so a reader never sees a half-written cache.\n const persist = (): void => {\n try {\n writeBinaryCache(file, cache);\n purgeLegacyJsonCaches(root);\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((t) => t.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 } else if (!fs.existsSync(file) && Object.keys(cache.entries).length > 0) {\n // Migrating from legacy JSON with a full hit set — rewrite as binary once\n // so the next run never reads the old path again.\n persist();\n }\n\n return vectors;\n}\n\nfunction safe(id: string): string {\n return id.replace(/[^a-z0-9.-]+/gi, '_');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/engine/lock.ts","../src/engine/embeddings.ts"],"names":["fs","path"],"mappings":"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","file":"chunk-B5X246UH.js","sourcesContent":["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/**\n * True when a live process is holding this lock right now. Read-only: it never\n * reclaims, so a caller can politely stand down (the vgd semantic warm does\n * this rather than embedding a repo a `vg embed` child is already embedding).\n */\nexport function lockHeld(file: string, staleMs = DEFAULT_LOCK_STALE_MS): boolean {\n if (!fs.existsSync(file)) return false;\n return !lockIsStale(file, staleMs);\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 { resolveGraphPath } from './artifacts.js';\nimport { acquireLock, lockHeld, 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 OPTIONAL and lazily loaded (the vendored\n * `src/vendor/fastembed` dense backend over `onnxruntime-node`, local ONNX)\n * 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. Per-repo vectors live in a binary `*.embeddings`\n * file **alongside the code map** (global store under Application Support /\n * XDG data, or `.vibgrate/embeddings` in-repo) — never model-named, never under\n * `.vibgrate/cache/`, and NEVER inside the committed `graph.json`, so the map\n * stays byte-deterministic. The model id is recorded inside the file header so\n * a model change still invalidates the cache without putting the name in the\n * path.\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 /**\n * Called (not thrown) when the backend can't load. `detail` carries the\n * underlying loader error when there is one, so a host can log something\n * actionable instead of a bare category.\n */\n onUnavailable?: (reason: EmbedUnavailable, detail?: string) => void;\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 * Checks the binary sidecar next to the map (and the legacy JSON path once).\n */\nexport function embeddingsCached(root: string, modelId: string): boolean {\n const file = vectorCachePath(root);\n if (fs.existsSync(file) && readCacheHeader(file)?.model === modelId) return true;\n // One-shot legacy: pre-binary caches lived under `.vibgrate/cache/embeddings-<model>.json`.\n return fs.existsSync(legacyVectorCachePath(root, modelId));\n}\n\n/**\n * Path of the binary embeddings file for this repo's current map — always named\n * `embeddings` (or `<snapshot>.embeddings` next to a branch-keyed graph), never\n * after the model. Exported for `vg embed --where` and tests.\n */\nexport function embeddingsPath(root: string): string {\n return vectorCachePath(root);\n}\n\n/** Sidecar path next to a map file: `…/branch-main.graph.json` → `…/branch-main.embeddings`. */\nexport function embeddingsPathFor(graphPath: string): string {\n // Branch-keyed global maps: `…/graphs/branch-main.graph.json` → `…/graphs/branch-main.embeddings`.\n if (graphPath.endsWith('.graph.json')) return `${graphPath.slice(0, -'.graph.json'.length)}.embeddings`;\n if (graphPath.endsWith('.graph.snap')) return `${graphPath.slice(0, -'.graph.snap'.length)}.embeddings`;\n // In-repo map is exactly `…/graph.json` (or `graph.snap`) → plain `…/embeddings`.\n const base = path.basename(graphPath);\n if (base === 'graph.json' || base === 'graph.snap') {\n return path.join(path.dirname(graphPath), 'embeddings');\n }\n if (graphPath.endsWith('.json')) return `${graphPath.slice(0, -5)}.embeddings`;\n if (graphPath.endsWith('.snap')) return `${graphPath.slice(0, -5)}.embeddings`;\n return `${graphPath}.embeddings`;\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, detail?: string): null => {\n options.onUnavailable?.(reason, detail);\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 backend = await importEmbedBackend();\n const mod: any = backend.mod;\n if (!mod?.FlagEmbedding) return fail('not-installed', backend.error);\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', errText(e));\n }\n}\n\n/**\n * Import the optional embedding backend — the VENDORED dense backend\n * (src/vendor/fastembed). It still needs the optional native deps\n * (`onnxruntime-node`, `@anush008/tokenizers`, `tar`), which a host can supply\n * out-of-tree via `VIBGRATE_EMBEDDER_PATH` — a directory whose `node_modules`\n * contains them. Editor integrations use this when their bundled engine ships\n * without the native optional dependencies (the VS Code extension installs\n * them into its own storage on consent); the host dir wins over this package's\n * own dependency tree so the copies the user consented to are the ones that\n * load (see `ensureNativeDeps` in the vendored module).\n *\n * Legacy host contract: a host dir holding a whole upstream `fastembed`\n * install (what older extension versions set up) is still honored, and wins,\n * so an engine upgrade never breaks a backend the user already consented to.\n * Any resolution failure falls through — never throws.\n */\nasync function importEmbedBackend(): Promise<{ mod: any | null; error?: string }> {\n const hostDir = process.env.VIBGRATE_EMBEDDER_PATH;\n let error: string | undefined;\n if (hostDir) {\n try {\n const req = createRequire(path.join(hostDir, 'package.json'));\n let entry: string | null = null;\n try {\n entry = req.resolve('fastembed');\n } catch {\n // No upstream fastembed in the host dir — the normal state under the\n // current contract (the host supplies only the native deps, resolved\n // by the vendored backend below). Not an error worth reporting.\n }\n if (entry) {\n const mod: any = await import(pathToFileURL(entry).href);\n const resolved = unwrapBackend(mod);\n if (resolved) return { mod: resolved };\n error = `${hostDir}: fastembed loaded but exported no FlagEmbedding`;\n }\n } catch (e) {\n // Keep the reason. A host-supplied backend that resolves but won't load\n // (native binary built for another ABI, a half-extracted tree, a missing\n // transitive dep) is indistinguishable from \"never installed\" once the\n // error is dropped — and that is the one failure a user cannot act on.\n error = `${hostDir}: ${errText(e)}`;\n }\n }\n try {\n const mod: any = await import('../vendor/fastembed/index.js');\n const resolved = unwrapBackend(mod);\n if (!resolved) return { mod: null, error: error ?? 'embed backend exported no FlagEmbedding' };\n // Load the native deps now (host dir first — see the vendored module), so\n // a missing or broken install surfaces here as \"not-installed\" with the\n // real reason instead of failing later mid-init.\n if (typeof resolved.ensureNativeDeps === 'function') await resolved.ensureNativeDeps();\n return { mod: resolved };\n } catch (e) {\n return { mod: null, error: error ?? errText(e) };\n }\n}\n\n/** A CJS entry imported over ESM may nest its exports one or two `default`s deep. */\nfunction unwrapBackend(mod: any): any | null {\n for (const candidate of [mod, mod?.default, mod?.default?.default]) {\n if (candidate?.FlagEmbedding) return candidate;\n }\n return null;\n}\n\nfunction errText(e: unknown): string {\n const msg = e instanceof Error ? e.message : String(e);\n return msg.replace(/\\s+/g, ' ').trim().slice(0, 300);\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\n/**\n * Binary embeddings format (local cache next to the map, never committed):\n *\n * MAGIC \"VGEMB1\\0\" · u16 version · u16 modelLen · model utf8 ·\n * u32 dims · u32 count ·\n * for each entry: u16 idLen · id · u16 hashLen · hash ·\n * then contiguous Float32LE vectors [count × dims]\n *\n * Why binary: a medium map (~4k nodes × 384 dims) is ~6 MB of floats but was\n * ~30 MB of JSON with full decimal text — slow to parse and noisy in source\n * control if it ever landed under the repo. The filename is always\n * `embeddings` / `<snapshot>.embeddings`; the model id lives only in the header.\n */\n/** 8-byte little-endian-friendly magic (same width as graph `VGSNAP1\\0`). */\nconst EMB_MAGIC = Buffer.from('VGEMB01\\0', 'latin1');\nconst EMB_VERSION = 1;\n\nfunction vectorCachePath(root: string): string {\n return embeddingsPathFor(resolveGraphPath(root));\n}\n\n/** Pre-binary path: `.vibgrate/cache/embeddings-<model>.json` (read once to migrate). */\nfunction legacyVectorCachePath(root: string, modelId: string): string {\n return path.join(cacheDir(root), `embeddings-${safe(modelId)}.json`);\n}\n\n/** One node's contribution to the semantic index: what is embedded, and its hash. */\nexport interface EmbedTarget {\n id: string;\n text: string;\n hash: string;\n}\n\n/**\n * The nodes the semantic index covers, and the exact text embedded for each.\n *\n * This is the single definition of \"what is in the index\", shared by the\n * on-disk cache (`vg embed`, `vg ask`) and vgd's in-memory slot index. They\n * used to compute it separately — vgd embedded *every* node with a shorter\n * text — so the two indexes described different things and vgd re-embedded\n * work the disk cache had already done. Keep them on this one function.\n */\nexport function embedTargets(graph: VgGraph): EmbedTarget[] {\n // Tolerant of a partial graph: vgd indexes whatever a client publishes, and\n // an `areas`-less map is a valid (if unlabelled) one.\n const areaLabel = new Map((graph.areas ?? []).map((a) => [a.id, a.label] as const));\n const targets: EmbedTarget[] = [];\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 text = nodeEmbedText(n, areaLabel.get(n.area));\n targets.push({ id: n.id, text, hash: hashString(text) });\n }\n return targets;\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 = loadCache(root, modelId).entries;\n let pending = 0;\n for (const t of embedTargets(graph)) {\n const cached = entries[t.id];\n if (!cached || cached.hash !== t.hash) pending++;\n }\n return pending;\n}\n\n/** What a reader (vgd) finds in this repo's on-disk vector cache. */\nexport interface CachedVectorRead {\n model: string;\n /** nodeId → vector, for every node whose cached hash still matches. */\n vectors: Map<string, number[]>;\n /** Targets the cache does not cover yet. */\n pending: EmbedTarget[];\n /** True while another process holds the cache's single-writer lock. */\n writerBusy: boolean;\n}\n\n/**\n * Read this repo's vector cache without loading the embedding backend.\n *\n * vgd warms its slot index from here first: on a repo `vg embed` has already\n * warmed, a slot goes `ready` in milliseconds with no worker and no duplicated\n * embedding. `writerBusy` reports the single-writer lock so vgd can stand down\n * while the `vg build` warm-up child is mid-run instead of racing it.\n */\nexport function readCachedVectors(\n graph: VgGraph,\n root: string,\n modelId = resolveEmbedModel(),\n): CachedVectorRead {\n const entries = loadCache(root, modelId).entries;\n const vectors = new Map<string, number[]>();\n const pending: EmbedTarget[] = [];\n for (const t of embedTargets(graph)) {\n const cached = entries[t.id];\n if (cached && cached.hash === t.hash && cached.vec.length > 0) vectors.set(t.id, cached.vec);\n else pending.push(t);\n }\n return { model: modelId, vectors, pending, writerBusy: lockHeld(`${vectorCachePath(root)}.lock`) };\n}\n\nfunction loadCache(root: string, modelId: string): EmbedCache {\n const file = vectorCachePath(root);\n const binary = readBinaryCache(file, modelId);\n if (binary) return binary;\n\n // Migrate legacy JSON if present (once) — keep working after upgrade without\n // re-embedding the whole repo.\n const legacy = legacyVectorCachePath(root, modelId);\n if (fs.existsSync(legacy)) {\n try {\n const loaded = JSON.parse(fs.readFileSync(legacy, 'utf8')) as EmbedCache;\n if (loaded.model === modelId && loaded.entries) {\n return { model: modelId, entries: loaded.entries };\n }\n } catch {\n /* treat as empty */\n }\n }\n return { model: modelId, entries: {} };\n}\n\ninterface EmbedHeader {\n model: string;\n dims: number;\n count: number;\n}\n\n/** Cheap header-only peek (no vectors) for `embeddingsCached` / diagnostics. */\nfunction readCacheHeader(file: string): EmbedHeader | null {\n let fd: number | null = null;\n try {\n fd = fs.openSync(file, 'r');\n const prefix = Buffer.alloc(8 + 2 + 2 + 512); // magic + ver + modelLen + model (capped)\n const n = fs.readSync(fd, prefix, 0, prefix.length, 0);\n if (n < EMB_MAGIC.length + 4 || !prefix.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n const version = prefix.readUInt16LE(o);\n o += 2;\n if (version !== EMB_VERSION) return null;\n const modelLen = prefix.readUInt16LE(o);\n o += 2;\n if (o + modelLen + 8 > n) {\n // model spills past our prefix — re-read exactly\n const full = Buffer.alloc(EMB_MAGIC.length + 2 + 2 + modelLen + 8);\n fs.readSync(fd, full, 0, full.length, 0);\n return parseHeaderPrefix(full);\n }\n return parseHeaderPrefix(prefix);\n } catch {\n return null;\n } finally {\n if (fd !== null) fs.closeSync(fd);\n }\n}\n\nfunction parseHeaderPrefix(buf: Buffer): EmbedHeader | null {\n try {\n if (!buf.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n if (buf.readUInt16LE(o) !== EMB_VERSION) return null;\n o += 2;\n const modelLen = buf.readUInt16LE(o);\n o += 2;\n if (o + modelLen + 8 > buf.length) return null;\n const model = buf.subarray(o, o + modelLen).toString('utf8');\n o += modelLen;\n const dims = buf.readUInt32LE(o);\n o += 4;\n const count = buf.readUInt32LE(o);\n return { model, dims, count };\n } catch {\n return null;\n }\n}\n\nfunction readBinaryCache(file: string, modelId: string): EmbedCache | null {\n if (!fs.existsSync(file)) return null;\n try {\n const buf = fs.readFileSync(file);\n if (buf.length < EMB_MAGIC.length + 4 || !buf.subarray(0, EMB_MAGIC.length).equals(EMB_MAGIC)) return null;\n let o = EMB_MAGIC.length;\n if (buf.readUInt16LE(o) !== EMB_VERSION) return null;\n o += 2;\n const modelLen = buf.readUInt16LE(o);\n o += 2;\n const model = buf.subarray(o, o + modelLen).toString('utf8');\n o += modelLen;\n if (model !== modelId) return null;\n const dims = buf.readUInt32LE(o);\n o += 4;\n const count = buf.readUInt32LE(o);\n o += 4;\n if (dims === 0 || count === 0) return { model, entries: {} };\n\n const ids: string[] = [];\n const hashes: string[] = [];\n for (let i = 0; i < count; i++) {\n const idLen = buf.readUInt16LE(o);\n o += 2;\n ids.push(buf.subarray(o, o + idLen).toString('utf8'));\n o += idLen;\n const hashLen = buf.readUInt16LE(o);\n o += 2;\n hashes.push(buf.subarray(o, o + hashLen).toString('utf8'));\n o += hashLen;\n }\n const floatsNeeded = count * dims;\n const bytesNeeded = floatsNeeded * 4;\n if (o + bytesNeeded > buf.length) return null;\n // Copy into a standalone ArrayBuffer so Float32Array views are safe after buf is GC'd.\n const floatBuf = Buffer.from(buf.subarray(o, o + bytesNeeded));\n const floats = new Float32Array(floatBuf.buffer, floatBuf.byteOffset, floatsNeeded);\n\n const entries: EmbedCache['entries'] = {};\n for (let i = 0; i < count; i++) {\n const start = i * dims;\n const vec = Array.from(floats.subarray(start, start + dims));\n entries[ids[i]!] = { hash: hashes[i]!, vec };\n }\n return { model, entries };\n } catch {\n return null;\n }\n}\n\nfunction writeBinaryCache(file: string, cache: EmbedCache): void {\n const ids = Object.keys(cache.entries);\n const count = ids.length;\n let dims = 0;\n for (const id of ids) {\n const d = cache.entries[id]!.vec.length;\n if (d > 0) {\n dims = d;\n break;\n }\n }\n // Empty or all-zero-dim cache: still write a valid header so \"cached\" is true.\n const modelBuf = Buffer.from(cache.model, 'utf8');\n if (modelBuf.length > 0xffff) throw new Error('embed model id too long');\n\n // Index size (ids + hashes)\n let indexBytes = 0;\n const idBufs: Buffer[] = [];\n const hashBufs: Buffer[] = [];\n for (const id of ids) {\n const ib = Buffer.from(id, 'utf8');\n const hb = Buffer.from(cache.entries[id]!.hash, 'utf8');\n if (ib.length > 0xffff || hb.length > 0xffff) throw new Error('embed entry key too long');\n idBufs.push(ib);\n hashBufs.push(hb);\n indexBytes += 2 + ib.length + 2 + hb.length;\n }\n\n const headerBytes = EMB_MAGIC.length + 2 + 2 + modelBuf.length + 4 + 4;\n const vecBytes = count * dims * 4;\n const out = Buffer.allocUnsafe(headerBytes + indexBytes + vecBytes);\n let o = 0;\n EMB_MAGIC.copy(out, o);\n o += EMB_MAGIC.length;\n out.writeUInt16LE(EMB_VERSION, o);\n o += 2;\n out.writeUInt16LE(modelBuf.length, o);\n o += 2;\n modelBuf.copy(out, o);\n o += modelBuf.length;\n out.writeUInt32LE(dims, o);\n o += 4;\n out.writeUInt32LE(count, o);\n o += 4;\n\n for (let i = 0; i < count; i++) {\n const ib = idBufs[i]!;\n const hb = hashBufs[i]!;\n out.writeUInt16LE(ib.length, o);\n o += 2;\n ib.copy(out, o);\n o += ib.length;\n out.writeUInt16LE(hb.length, o);\n o += 2;\n hb.copy(out, o);\n o += hb.length;\n }\n\n if (dims > 0 && count > 0) {\n const floats = new Float32Array(count * dims);\n for (let i = 0; i < count; i++) {\n const vec = cache.entries[ids[i]!]!.vec;\n const base = i * dims;\n for (let d = 0; d < dims; d++) floats[base + d] = vec[d] ?? 0;\n }\n Buffer.from(floats.buffer, floats.byteOffset, floats.byteLength).copy(out, o);\n }\n\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const tmp = `${file}.tmp.${process.pid}`;\n fs.writeFileSync(tmp, out);\n fs.renameSync(tmp, file);\n}\n\n/** Best-effort drop of the old model-named JSON caches under `.vibgrate/cache/`. */\nfunction purgeLegacyJsonCaches(root: string): void {\n const dir = cacheDir(root);\n let names: string[];\n try {\n names = fs.readdirSync(dir);\n } catch {\n return;\n }\n for (const name of names) {\n if (/^embeddings-.+\\.json$/.test(name) || /^embeddings-.+\\.json\\.lock$/.test(name)) {\n try {\n fs.rmSync(path.join(dir, name), { force: true });\n } catch {\n /* best-effort */\n }\n }\n }\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);\n const cache = loadCache(root, embedder.id);\n\n // Includes document nodes (markdown/txt/env examples) so ask can retrieve docs.\n const targets = embedTargets(graph);\n const toEmbed: EmbedTarget[] = [];\n const vectors = new Map<string, number[]>();\n for (const t of targets) {\n const cached = cache.entries[t.id];\n if (cached && cached.hash === t.hash) vectors.set(t.id, cached.vec);\n else toEmbed.push(t);\n }\n\n // Atomic write (temp + rename) so a reader never sees a half-written cache.\n const persist = (): void => {\n try {\n writeBinaryCache(file, cache);\n purgeLegacyJsonCaches(root);\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((t) => t.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 } else if (!fs.existsSync(file) && Object.keys(cache.entries).length > 0) {\n // Migrating from legacy JSON with a full hit set — rewrite as binary once\n // so the next run never reads the old path again.\n persist();\n }\n\n return vectors;\n}\n\nfunction safe(id: string): string {\n return id.replace(/[^a-z0-9.-]+/gi, '_');\n}\n"]}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { readGlobal, applyGlobalOptions } from './chunk-YENM3HT7.js';
|
|
2
2
|
import { json, info, c } from './chunk-CT5BS56U.js';
|
|
3
|
-
import { VGD_PROTOCOL_VERSION, startVgdServer } from './chunk-
|
|
3
|
+
import { VGD_PROTOCOL_VERSION, startVgdServer } from './chunk-JSZ46IDG.js';
|
|
4
4
|
import { CliError, ExitCode } from './chunk-MS6V5XKB.js';
|
|
5
5
|
import { init_cli_invocation, reinvokeCli } from './chunk-EZ7UC5Y5.js';
|
|
6
|
-
import { loadGraph } from './chunk-
|
|
6
|
+
import { loadGraph } from './chunk-5BFA532E.js';
|
|
7
7
|
import { vgdIsRunning, vgdRequest } from './chunk-VHRSG6CF.js';
|
|
8
8
|
import { vgdSocketPath, vgdPidPath } from './chunk-6H2QV5DR.js';
|
|
9
|
-
import { VERSION } from './chunk-
|
|
9
|
+
import { VERSION } from './chunk-KFLNWYZG.js';
|
|
10
10
|
import * as fs from 'fs';
|
|
11
11
|
import * as net from 'net';
|
|
12
12
|
import * as path2 from 'path';
|
|
@@ -311,7 +311,7 @@ function registerDaemon(program) {
|
|
|
311
311
|
throw new CliError(loaded.error, ExitCode.NOT_FOUND);
|
|
312
312
|
}
|
|
313
313
|
if (!loaded.ok) {
|
|
314
|
-
const { loadGraph: loadGraph2 } = await import('./load-
|
|
314
|
+
const { loadGraph: loadGraph2 } = await import('./load-2FRH37JY.js');
|
|
315
315
|
const { detectGitRef } = await import('./git-ref-LMT3EXYY.js');
|
|
316
316
|
const { repositoryIdFromRoot } = await import('./paths-RVK6FKRN.js');
|
|
317
317
|
const graph = loadGraph2(root, global.graph);
|
|
@@ -652,5 +652,5 @@ async function repositoryIdForCwd(socketPath, root) {
|
|
|
652
652
|
}
|
|
653
653
|
|
|
654
654
|
export { compareDaemonVersion, ensureVgd, ensureVgdSoft, registerDaemon, requireGraph, restartVgdIfRunning, retireWedgedVgd, rootOf, startDetachedVgd, stopVgd, vgdCliVersion, vgdVersionSkew };
|
|
655
|
-
//# sourceMappingURL=chunk-
|
|
656
|
-
//# sourceMappingURL=chunk-
|
|
655
|
+
//# sourceMappingURL=chunk-BCK2NIBM.js.map
|
|
656
|
+
//# sourceMappingURL=chunk-BCK2NIBM.js.map
|