@vibgrate/cli 2026.814.2 → 2026.817.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/DOCS.md +61 -0
  2. package/README.md +1 -0
  3. package/dist/agent-UQC7QN77.js +27 -0
  4. package/dist/{agent-5ANHRYEI.js.map → agent-UQC7QN77.js.map} +1 -1
  5. package/dist/{approvals-T2KXPJLV.js → approvals-ASPJQUZK.js} +6 -5
  6. package/dist/{approvals-T2KXPJLV.js.map → approvals-ASPJQUZK.js.map} +1 -1
  7. package/dist/baseline-FIV6PR2M.js +9 -0
  8. package/dist/{baseline-WVD6P5IO.js.map → baseline-FIV6PR2M.js.map} +1 -1
  9. package/dist/{chunk-FOW5IF73.js → chunk-2FEB5KJS.js} +11 -34
  10. package/dist/chunk-2FEB5KJS.js.map +1 -0
  11. package/dist/{chunk-WQLZSVNF.js → chunk-3FMRFECC.js} +7 -6
  12. package/dist/chunk-3FMRFECC.js.map +1 -0
  13. package/dist/{chunk-7QDHQLUS.js → chunk-3H3SVJUY.js} +13 -11
  14. package/dist/chunk-3H3SVJUY.js.map +1 -0
  15. package/dist/{chunk-REIGWTTH.js → chunk-3HNPVXUK.js} +3 -3
  16. package/dist/{chunk-REIGWTTH.js.map → chunk-3HNPVXUK.js.map} +1 -1
  17. package/dist/{chunk-YQNTIBKS.js → chunk-3NJUOIZQ.js} +6 -6
  18. package/dist/{chunk-YQNTIBKS.js.map → chunk-3NJUOIZQ.js.map} +1 -1
  19. package/dist/{chunk-BH54SLGZ.js → chunk-5OL2TSHK.js} +4 -4
  20. package/dist/{chunk-BH54SLGZ.js.map → chunk-5OL2TSHK.js.map} +1 -1
  21. package/dist/{chunk-TFAXW7VM.js → chunk-6K3XK7C5.js} +69 -976
  22. package/dist/chunk-6K3XK7C5.js.map +1 -0
  23. package/dist/{chunk-N3XFY3PX.js → chunk-74UBGF4P.js} +3 -3
  24. package/dist/{chunk-N3XFY3PX.js.map → chunk-74UBGF4P.js.map} +1 -1
  25. package/dist/{chunk-X76VPOYH.js → chunk-AXZZ5CCG.js} +4 -4
  26. package/dist/{chunk-X76VPOYH.js.map → chunk-AXZZ5CCG.js.map} +1 -1
  27. package/dist/{chunk-5GLQNMTI.js → chunk-C3LMWZKF.js} +6 -6
  28. package/dist/{chunk-5GLQNMTI.js.map → chunk-C3LMWZKF.js.map} +1 -1
  29. package/dist/{chunk-WWGLVF7D.js → chunk-DVW3SVCW.js} +9 -8
  30. package/dist/chunk-DVW3SVCW.js.map +1 -0
  31. package/dist/{chunk-TNROG5CO.js → chunk-E2FAQREZ.js} +1739 -116
  32. package/dist/chunk-E2FAQREZ.js.map +1 -0
  33. package/dist/{chunk-7NMXE6KG.js → chunk-EXV4QSAD.js} +4 -4
  34. package/dist/{chunk-7NMXE6KG.js.map → chunk-EXV4QSAD.js.map} +1 -1
  35. package/dist/{chunk-3LSG7Z4I.js → chunk-EZ7UC5Y5.js} +25 -4
  36. package/dist/chunk-EZ7UC5Y5.js.map +1 -0
  37. package/dist/{chunk-OWSFZQOP.js → chunk-FJG5AXKZ.js} +3 -3
  38. package/dist/{chunk-OWSFZQOP.js.map → chunk-FJG5AXKZ.js.map} +1 -1
  39. package/dist/{chunk-NKFXXP6W.js → chunk-GOGMS3ST.js} +8 -6
  40. package/dist/chunk-GOGMS3ST.js.map +1 -0
  41. package/dist/{chunk-WHJMS7XC.js → chunk-I5LP55B6.js} +3 -3
  42. package/dist/{chunk-WHJMS7XC.js.map → chunk-I5LP55B6.js.map} +1 -1
  43. package/dist/{chunk-IHXNOY3R.js → chunk-K6DXETMC.js} +12 -12
  44. package/dist/{chunk-IHXNOY3R.js.map → chunk-K6DXETMC.js.map} +1 -1
  45. package/dist/{chunk-DSUGC7F5.js → chunk-KJT2R6WW.js} +4 -4
  46. package/dist/{chunk-DSUGC7F5.js.map → chunk-KJT2R6WW.js.map} +1 -1
  47. package/dist/chunk-KNGAZDGF.js +467 -0
  48. package/dist/chunk-KNGAZDGF.js.map +1 -0
  49. package/dist/{chunk-JCN6MSXQ.js → chunk-LHKQGVRF.js} +17 -29
  50. package/dist/chunk-LHKQGVRF.js.map +1 -0
  51. package/dist/{chunk-YNV5M3JW.js → chunk-M7IO3DXH.js} +9 -8
  52. package/dist/chunk-M7IO3DXH.js.map +1 -0
  53. package/dist/chunk-MS6V5XKB.js +33 -0
  54. package/dist/chunk-MS6V5XKB.js.map +1 -0
  55. package/dist/{chunk-2U37PFB2.js → chunk-MVPRPSXU.js} +7 -4
  56. package/dist/chunk-MVPRPSXU.js.map +1 -0
  57. package/dist/{chunk-DT4KIVRI.js → chunk-NG4KIJW6.js} +34 -2
  58. package/dist/chunk-NG4KIJW6.js.map +1 -0
  59. package/dist/{chunk-IHLLWBZU.js → chunk-O2DL2Q55.js} +6 -6
  60. package/dist/{chunk-IHLLWBZU.js.map → chunk-O2DL2Q55.js.map} +1 -1
  61. package/dist/chunk-O3LABX6I.js +43 -0
  62. package/dist/chunk-O3LABX6I.js.map +1 -0
  63. package/dist/chunk-OZ3IFXRD.js +22 -0
  64. package/dist/chunk-OZ3IFXRD.js.map +1 -0
  65. package/dist/chunk-PRG2ULPK.js +6 -0
  66. package/dist/{chunk-2H2U3DC7.js.map → chunk-PRG2ULPK.js.map} +1 -1
  67. package/dist/{chunk-TVDYEHIM.js → chunk-Q3M6K3HY.js} +3 -3
  68. package/dist/{chunk-TVDYEHIM.js.map → chunk-Q3M6K3HY.js.map} +1 -1
  69. package/dist/{chunk-KGPX4EUN.js → chunk-Q4G2BWE3.js} +4 -4
  70. package/dist/{chunk-KGPX4EUN.js.map → chunk-Q4G2BWE3.js.map} +1 -1
  71. package/dist/chunk-T7RSQ5WD.js +227 -0
  72. package/dist/chunk-T7RSQ5WD.js.map +1 -0
  73. package/dist/{chunk-54RGT2T5.js → chunk-TVDMNIUT.js} +3 -3
  74. package/dist/{chunk-54RGT2T5.js.map → chunk-TVDMNIUT.js.map} +1 -1
  75. package/dist/{chunk-N6ZMZ5AI.js → chunk-WAKP7SK7.js} +4922 -1011
  76. package/dist/chunk-WAKP7SK7.js.map +1 -0
  77. package/dist/{chunk-75LJM5XD.js → chunk-WVMOGIPC.js} +9 -43
  78. package/dist/chunk-WVMOGIPC.js.map +1 -0
  79. package/dist/{chunk-UTNNGKKX.js → chunk-XLXJC7H3.js} +142 -14
  80. package/dist/chunk-XLXJC7H3.js.map +1 -0
  81. package/dist/cli.js +1727 -1127
  82. package/dist/cli.js.map +1 -1
  83. package/dist/daemon-FPTRHO5N.js +26 -0
  84. package/dist/daemon-FPTRHO5N.js.map +1 -0
  85. package/dist/embed-worker-main.js +5 -4
  86. package/dist/embed-worker-main.js.map +1 -1
  87. package/dist/ensure-map-342G2IV3.js +33 -0
  88. package/dist/{ensure-map-HQ7A5NDL.js.map → ensure-map-342G2IV3.js.map} +1 -1
  89. package/dist/{fs-NTQUFCXV.js → fs-TLPOWC2D.js} +3 -3
  90. package/dist/fs-TLPOWC2D.js.map +1 -0
  91. package/dist/graph-backend-RNWQBT3P.js +15 -0
  92. package/dist/{graph-backend-W2TNTMY7.js.map → graph-backend-RNWQBT3P.js.map} +1 -1
  93. package/dist/index.d.ts +28 -6
  94. package/dist/index.js +21 -18
  95. package/dist/index.js.map +1 -1
  96. package/dist/{interactive-EW2VJ3BZ.js → interactive-SR7TMF6M.js} +36 -33
  97. package/dist/interactive-SR7TMF6M.js.map +1 -0
  98. package/dist/load-AYFECIQB.js +11 -0
  99. package/dist/{load-64RK5O6C.js.map → load-AYFECIQB.js.map} +1 -1
  100. package/dist/local-runtime-6SNWKSA7.js +6 -0
  101. package/dist/{local-runtime-2ED33KK6.js.map → local-runtime-6SNWKSA7.js.map} +1 -1
  102. package/dist/model-manager-SXHZ5VD4.js +10 -0
  103. package/dist/{model-manager-GJ2YSTSK.js.map → model-manager-SXHZ5VD4.js.map} +1 -1
  104. package/dist/parse-worker.d.ts +1 -1
  105. package/dist/parse-worker.js +5 -2
  106. package/dist/parse-worker.js.map +1 -1
  107. package/dist/{run-outcome-6QNQIHPV.js → run-outcome-YQQJG3LW.js} +7 -6
  108. package/dist/run-outcome-YQQJG3LW.js.map +1 -0
  109. package/dist/runtime-session-CNJ4DAV5.js +22 -0
  110. package/dist/{runtime-session-RJHH3KMF.js.map → runtime-session-CNJ4DAV5.js.map} +1 -1
  111. package/dist/session-H34HUV2Y.js +17 -0
  112. package/dist/{session-4BGYASOH.js.map → session-H34HUV2Y.js.map} +1 -1
  113. package/dist/{stream-json-GY5N7WZT.js → stream-json-55YDNAFX.js} +18 -17
  114. package/dist/stream-json-55YDNAFX.js.map +1 -0
  115. package/dist/{types-DLH-Ritr.d.ts → types-DHqH0XIE.d.ts} +68 -6
  116. package/dist/version-WSE3QOPK.js +4 -0
  117. package/dist/{version-DPAMQW6M.js.map → version-WSE3QOPK.js.map} +1 -1
  118. package/dist/{vg-mcp-bridge-IGHJKKSL.js → vg-mcp-bridge-2CNLHNEL.js} +13 -12
  119. package/dist/vg-mcp-bridge-2CNLHNEL.js.map +1 -0
  120. package/dist/{vgd-ORPA5C2K.js → vgd-URUZQORN.js} +10 -9
  121. package/dist/vgd-URUZQORN.js.map +1 -0
  122. package/grammars/tree-sitter-hcl.wasm +0 -0
  123. package/package.json +9 -8
  124. package/dist/agent-5ANHRYEI.js +0 -26
  125. package/dist/baseline-WVD6P5IO.js +0 -9
  126. package/dist/chunk-2H2U3DC7.js +0 -6
  127. package/dist/chunk-2U37PFB2.js.map +0 -1
  128. package/dist/chunk-3LSG7Z4I.js.map +0 -1
  129. package/dist/chunk-75LJM5XD.js.map +0 -1
  130. package/dist/chunk-7QDHQLUS.js.map +0 -1
  131. package/dist/chunk-DT4KIVRI.js.map +0 -1
  132. package/dist/chunk-FOW5IF73.js.map +0 -1
  133. package/dist/chunk-JCN6MSXQ.js.map +0 -1
  134. package/dist/chunk-N6ZMZ5AI.js.map +0 -1
  135. package/dist/chunk-NKFXXP6W.js.map +0 -1
  136. package/dist/chunk-RXP66R2E.js +0 -39
  137. package/dist/chunk-RXP66R2E.js.map +0 -1
  138. package/dist/chunk-TFAXW7VM.js.map +0 -1
  139. package/dist/chunk-TNROG5CO.js.map +0 -1
  140. package/dist/chunk-UTNNGKKX.js.map +0 -1
  141. package/dist/chunk-WQLZSVNF.js.map +0 -1
  142. package/dist/chunk-WWGLVF7D.js.map +0 -1
  143. package/dist/chunk-YNV5M3JW.js.map +0 -1
  144. package/dist/ensure-map-HQ7A5NDL.js +0 -30
  145. package/dist/fs-NTQUFCXV.js.map +0 -1
  146. package/dist/graph-backend-W2TNTMY7.js +0 -14
  147. package/dist/interactive-EW2VJ3BZ.js.map +0 -1
  148. package/dist/load-64RK5O6C.js +0 -10
  149. package/dist/local-runtime-2ED33KK6.js +0 -6
  150. package/dist/model-manager-GJ2YSTSK.js +0 -10
  151. package/dist/run-outcome-6QNQIHPV.js.map +0 -1
  152. package/dist/runtime-session-RJHH3KMF.js +0 -21
  153. package/dist/session-4BGYASOH.js +0 -16
  154. package/dist/stream-json-GY5N7WZT.js.map +0 -1
  155. package/dist/version-DPAMQW6M.js +0 -4
  156. package/dist/vg-mcp-bridge-IGHJKKSL.js.map +0 -1
  157. package/dist/vgd-ORPA5C2K.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/engine/refresh-scheduler.ts","../src/engine/watch-filter.ts","../src/mcp/server.ts","../src/engine/export.ts"],"names":["path2"],"mappings":"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","file":"chunk-YNV5M3JW.js","sourcesContent":["import { refreshIfStale, type RefreshOutcome } from './refresh.js';\n\n/**\n * Debounced, single-flight, budget-capped auto-refresh.\n *\n * `refreshIfStale` is expensive and **synchronous in its hot half**: the\n * freshness probe walks the whole corpus (`discover` + `discoverDocs`) and\n * `statSync`s every file before anything can drift-check, and a real drift then\n * runs a full incremental `buildGraph`. On a 22k-file repo that is seconds for a\n * clean tree and over a minute for a dirty one.\n *\n * No interactive surface may pay that inline. This scheduler is the shared\n * discipline that keeps it off the request path, and it exists as one module\n * precisely because the previous per-server copies diverged: `vg serve` (MCP)\n * grew the guard while `vg lsp` kept a bare `await refreshIfStale(...)`, which\n * made a single editor Ask block for ~90s on a large workspace.\n *\n * Four properties, all load-bearing:\n * - **Single-flight** — concurrent callers share one refresh, never stack.\n * - **Debounced** — at most one probe per `probeIntervalMs`.\n * - **Self-tuning** — the interval grows with the *measured* cost of the last\n * refresh, so probe/rebuild work stays under ~1/`PROBE_DUTY_FACTOR` of wall\n * time however big the repo is.\n * - **Budget-capped** — a caller waits `refreshBudgetMs` at most, then proceeds\n * with the map it already has. A warm probe lands inside the budget; a\n * rebuild never does, and shouldn't.\n *\n * Answering from a map that is one edit stale is always better than making the\n * user wait: the rebuild lands for the next call.\n */\n\nexport type RefreshImpl = typeof refreshIfStale;\n\n/** Min gap between freshness probes — bounds stat-walk cost under bursty calls. */\nexport const PROBE_INTERVAL_MS = 2000;\n/** Ceiling for the self-tuned probe interval on very large repos. */\nexport const MAX_PROBE_INTERVAL_MS = 30_000;\n/** Probe/rebuild may consume at most ~1/PROBE_DUTY_FACTOR of wall-time (20 → ≤5%). */\nexport const PROBE_DUTY_FACTOR = 20;\n/**\n * How long a caller waits for an in-flight refresh before answering from the\n * current map. Deliberately small: warm lookups are sub-10ms, so a multi-second\n * budget turns every call during a large-repo rebuild into a multi-second stall.\n */\nexport const REFRESH_BUDGET_MS = 100;\n/** After a refresh failure (e.g. read-only checkout), don't retry for this long. */\nexport const FAILURE_COOLDOWN_MS = 60_000;\n\nexport interface RefreshSchedulerOptions {\n /** Workspace root for freshness probes and rebuilds. */\n root: string;\n /**\n * The already-resolved map path, or a getter for it. Passing it through spares\n * `refreshIfStale` a `defaultGraphPath` re-resolution (which consults git).\n */\n graphPath?: string | (() => string | undefined);\n /** Min gap between probes. `0` probes every call (tests). */\n probeIntervalMs?: number;\n /** Max wait before a caller gives up and uses the current map. */\n refreshBudgetMs?: number;\n /** Tests only: inject a slow/fake refresh to assert the micro-budget. */\n refreshImpl?: RefreshImpl;\n /** Force single-threaded parsing on a rebuild (constrained hosts / tests). */\n inline?: boolean;\n /**\n * Called when a refresh settles, with the outcome (`null` if it threw) and the\n * ms timestamp the refresh started at. Lets an owner react — invalidate a\n * cached graph, clear a pending-change set — without re-implementing any of\n * the scheduling above.\n */\n onSettled?: (outcome: RefreshOutcome | null, startedAt: number) => void;\n}\n\nexport class RefreshScheduler {\n private lastProbeAt = 0;\n private failedUntil = 0;\n private inflight: Promise<void> | null = null;\n /** Self-tuned: grows with measured probe/rebuild cost so huge repos aren't penalized. */\n private tunedIntervalMs = PROBE_INTERVAL_MS;\n private readonly refreshImpl: RefreshImpl;\n\n constructor(private readonly opts: RefreshSchedulerOptions) {\n this.refreshImpl = opts.refreshImpl ?? refreshIfStale;\n }\n\n /** The interval currently in force — diagnostics and tests. */\n get probeIntervalMs(): number {\n return this.opts.probeIntervalMs ?? this.tunedIntervalMs;\n }\n\n /** Is a refresh running right now? Lets a caller report \"refreshing\" state. */\n get busy(): boolean {\n return this.inflight !== null;\n }\n\n /**\n * Re-arm the next probe regardless of the debounce interval — for a watcher\n * event or an explicit user action, where waiting out the interval would feel\n * broken. Clears the failure cooldown too: a real event is evidence the tree\n * moved, not a poll, and the condition that failed may be exactly what\n * changed. Does not itself start a refresh; the next `maybeRefresh` does.\n */\n arm(): void {\n this.lastProbeAt = 0;\n this.failedUntil = 0;\n }\n\n /**\n * Probe/rebuild if due, and wait at most the budget for it. Never throws —\n * a refresh problem must degrade to \"answer from the current map\", not break\n * the caller.\n */\n async maybeRefresh(): Promise<void> {\n const now = Date.now();\n if (!this.inflight) {\n if (now < this.failedUntil || now - this.lastProbeAt < this.probeIntervalMs) return;\n this.lastProbeAt = now;\n const graphPath =\n typeof this.opts.graphPath === 'function' ? this.opts.graphPath() : this.opts.graphPath;\n this.inflight = this.refreshImpl(this.opts.root, { graphPath, inline: this.opts.inline })\n .then((outcome) => {\n if (outcome.status === 'error') this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n this.tune(outcome, now);\n this.opts.onSettled?.(outcome, now);\n })\n .catch(() => {\n this.failedUntil = Date.now() + FAILURE_COOLDOWN_MS;\n this.tune(null, now);\n this.opts.onSettled?.(null, now);\n })\n .finally(() => {\n this.inflight = null;\n });\n }\n await Promise.race([this.inflight, sleep(this.opts.refreshBudgetMs ?? REFRESH_BUDGET_MS)]);\n }\n\n /**\n * Back off proportionally to what the refresh actually cost — including a\n * multi-second rebuild. Tuning off probe-only outcomes alone would re-arm\n * after the floor and make every sequential call pay the budget again for the\n * whole duration of a large rebuild.\n */\n private tune(outcome: RefreshOutcome | null, startedAt: number): void {\n const elapsed = Date.now() - startedAt;\n const cost =\n outcome?.status === 'refreshed' && typeof outcome.ms === 'number'\n ? Math.max(outcome.ms, elapsed)\n : elapsed;\n this.tunedIntervalMs = Math.min(\n MAX_PROBE_INTERVAL_MS,\n Math.max(PROBE_INTERVAL_MS, cost * PROBE_DUTY_FACTOR),\n );\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n timer.unref?.();\n });\n}\n","import * as path from 'node:path';\n\n/**\n * Shared change-event filter for the two file watchers (`vg watch` and the\n * serve-loop watcher in mcp/server.ts): which filesystem events are real\n * source changes, and which are dependency/artifact/VCS noise that must never\n * trigger a rebuild — including vg's own artifacts, or every build would\n * re-trigger itself.\n */\nexport const WATCH_SKIP_NAMES = new Set([\n '.git',\n 'node_modules',\n '.vibgrate',\n 'dist',\n 'build',\n 'out',\n 'coverage',\n '.next',\n 'target',\n '__pycache__',\n '.venv',\n 'venv',\n]);\n\n/** True when a watch event's filename is a change worth rebuilding for. */\nexport function isRelevantChange(filename: string): boolean {\n if (filename.split(path.sep).some((p) => WATCH_SKIP_NAMES.has(p))) return false;\n if (filename.includes(`${path.sep}.vibgrate${path.sep}`) || filename.startsWith('.vibgrate')) return false;\n return true;\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { parseGraph } from '../engine/serialize.js';\nimport { mapFileStat } from '../engine/snapshot.js';\nimport { loadGraphPreferIndex } from '../engine/index-db.js';\nimport type { RefreshOutcome, refreshIfStale } from '../engine/refresh.js';\nimport { RefreshScheduler, REFRESH_BUDGET_MS as SCHEDULER_BUDGET_MS } from '../engine/refresh-scheduler.js';\nimport { TOOLS, budgetSuffix, listedToolNames, warmEmbedderInBackground, type ToolSurface } from './tools.js';\nimport { isRelevantChange } from '../engine/watch-filter.js';\nimport { renderToolResult } from './response.js';\nimport { recordSaving, sanitizeClient, PER_FILE_TOKENS, SAVINGS_TOOLS, type Outcome } from '../engine/savings.js';\nimport type { SessionStats } from './serve-stats.js';\nimport { countTokens } from '../engine/tokens.js';\nimport { VERSION } from '../version.js';\nimport type { VgGraph } from '../schema.js';\n\n/**\n * The local `vg serve` MCP server. Self-contained and offline. Freshness is\n * two-layered, with no filesystem watcher (freshness only matters at the\n * moment of a query, so we check on read instead of watching):\n *\n * 1. **Hot reload** — `graph.json` is re-read whenever its mtime changes, so a\n * rebuild from ANY source (a foreground `vg`, another serve process, CI)\n * is picked up on the next tool call.\n * 2. **Auto-refresh** (default on) — each tool call runs a debounced, stat-only\n * freshness probe against the last build's snapshot; if the working tree\n * drifted, an incremental rebuild runs in-process (cross-process locked,\n * single-flight). The call waits only a **micro-budget** so a warm probe can\n * land without stalling MCP tools — otherwise it answers from the current\n * map while the rebuild finishes for a later call (hot-reload picks it up).\n *\n * Every tool remains read-only and auto-approvable; the refresh only rewrites\n * vg's own artifacts under `.vibgrate/`, never user code.\n */\n\n/**\n * How long a tool call waits for an in-flight refresh before answering from\n * the current map. Kept deliberately small: MCP tool latency is sub-10ms on\n * warm maps, and a multi-second budget (the previous 5s ceiling matched\n * `git rev-parse`'s spawn timeout) turned every sequential tool call during a\n * large-repo rebuild into a multi-second stall — measured as TypeScript p50\n * ~5.2s on the release benchmark for the `vg-cli-public` corpus entry.\n * Warm probes still finish inside this window; heavy rebuilds never should.\n *\n * Re-exported from the shared scheduler, which owns this and the probe-interval\n * tuning for every surface (`vg serve` and `vg lsp` alike).\n */\nexport const REFRESH_BUDGET_MS = SCHEDULER_BUDGET_MS;\n/** Settle time between a watcher event and the background refresh it triggers. */\nconst WATCH_DEBOUNCE_MS = 400;\n\nexport type RefreshImpl = typeof refreshIfStale;\n\nexport interface GraphSourceTuning {\n probeIntervalMs?: number;\n refreshBudgetMs?: number;\n /**\n * Workspace root for freshness probes. Prefer passing this explicitly —\n * deriving it from `graphPath` via `dirname` twice only works for the legacy\n * `root/.vibgrate/graph.json` layout, not the global branch-keyed store.\n */\n root?: string;\n /** Tests only: inject a slow/fake refresh to assert the micro-budget. */\n refreshImpl?: RefreshImpl;\n}\n\nexport interface ServeOptions {\n /** Record local, counts-only usage savings (opt-in). */\n savings?: boolean;\n /**\n * Periodically upload the counts-only ledger to Vibgrate (opt-in; off by\n * default). Implies recording. The upload itself is driven by the serve\n * command (see commands/serve.ts + engine/stats-share.ts); here it just also\n * turns recording on so there's something to send.\n */\n shareStats?: boolean;\n /** Air-gapped mode (no model downloads). */\n local?: boolean;\n /** Collapse repeat heavy relation lists within a session (opt-in). */\n dedup?: boolean;\n /** Auto-refresh the map when the working tree drifts (default true). */\n refresh?: boolean;\n /**\n * Event-driven refresh: recursive fs.watch on the workspace so a save\n * rebuilds in ~400 ms instead of waiting out the freshness poll (default\n * true when refresh is on; `--no-watch` opts out). Where recursive watch is\n * unavailable the poll silently remains the only mechanism.\n */\n watch?: boolean;\n /**\n * Workspace root (project directory). When set, freshness probes and tools\n * use this instead of inferring root from the graph path.\n */\n root?: string;\n /**\n * In-memory session stats behind the live `vg serve` status display. Always\n * safe to pass: nothing recorded here is persisted or uploaded — it dies with\n * the process (the opt-in ledger above is a separate concern).\n */\n stats?: SessionStats;\n /**\n * Listing surface (`--surface hot` / `--tools a,b`). Filters ONLY what\n * `tools/list` advertises; every tool stays callable so behaviour is\n * byte-identical across surfaces. See `listedToolNames` in ./tools.ts.\n */\n toolSurface?: ToolSurface;\n}\n\nexport class GraphSource {\n private cachedMtimeMs = -1;\n private cached: VgGraph | null = null;\n /** Project root used for freshness probes and rebuilds. */\n readonly root: string;\n /** Debounce, single-flight, self-tuning and budget cap — shared with `vg lsp`. */\n private readonly refresher: RefreshScheduler;\n /**\n * Files seen changing since the last COMMITTED refresh (watcher events,\n * filename → last-seen ms). Entries are cleared only after a refresh that\n * started at-or-after their last event completes with 'fresh'/'refreshed' —\n * a change landing mid-refresh stays pending, so the staleness signal can\n * be a false positive but never a false negative.\n */\n private readonly pendingChanges = new Map<string, number>();\n private watcher: fs.FSWatcher | null = null;\n private watchTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n readonly graphPath: string,\n private readonly refresh = false,\n /** Timing / root overrides (production passes `root`; tests may pass more). */\n private readonly tuning: GraphSourceTuning = {},\n ) {\n // Prefer an explicit root. Fallback assumes legacy `root/.vibgrate/graph.json`\n // (dirname twice); wrong for the global store — callers should pass `root`.\n this.root = tuning.root ?? path.dirname(path.dirname(graphPath));\n this.refresher = new RefreshScheduler({\n root: this.root,\n graphPath,\n probeIntervalMs: tuning.probeIntervalMs,\n refreshBudgetMs: tuning.refreshBudgetMs,\n refreshImpl: tuning.refreshImpl,\n onSettled: (outcome, startedAt) => this.onRefreshSettled(outcome, startedAt),\n });\n }\n\n /** Current graph: auto-refreshed if the tree drifted, reloaded if the file changed. */\n async get(): Promise<VgGraph> {\n if (this.refresh) await this.maybeRefresh();\n // JSON when present, else the standalone snapshot (global-store mode);\n // throws if neither exists → surfaced as tool error.\n const stat = mapFileStat(this.graphPath);\n if (stat.mtimeMs !== this.cachedMtimeMs || !this.cached) {\n // Prefer SQLite reconstruct when corpusHash matches (scale past JSON parse).\n const preferred = loadGraphPreferIndex(this.root, this.graphPath);\n this.cached = preferred\n ? preferred.graph\n : parseGraph(fs.readFileSync(this.graphPath, 'utf8'));\n this.cachedMtimeMs = stat.mtimeMs;\n }\n return this.cached;\n }\n\n /**\n * Debounced, single-flight refresh — the shared scheduler does the work (see\n * engine/refresh-scheduler.ts). Never throws: a refresh problem must degrade\n * to \"answer from the current map\", not break the tool call.\n */\n private maybeRefresh(): Promise<void> {\n return this.refresher.maybeRefresh();\n }\n\n /**\n * A COMMITTED outcome (map verified fresh, or rebuilt) clears the pending\n * set — but only entries whose last event predates the refresh start.\n * 'locked'/'error'/'no-snapshot' clear nothing: the map may still be behind\n * those changes.\n */\n private onRefreshSettled(outcome: RefreshOutcome | null, startedAt: number): void {\n if (outcome?.status !== 'fresh' && outcome?.status !== 'refreshed') return;\n for (const [file, seenAt] of this.pendingChanges) {\n if (seenAt <= startedAt) this.pendingChanges.delete(file);\n }\n }\n\n /**\n * Record a source change (watcher event, or a test). Arms the next probe to\n * run immediately (bypassing the self-tuned interval — a real event is not a\n * poll) and schedules a debounced background refresh so the rebuild happens\n * BETWEEN tool calls instead of on the next call's 100 ms budget.\n */\n notePendingChange(filename: string): void {\n this.pendingChanges.set(filename, Date.now());\n this.refresher.arm();\n if (!this.refresh) return;\n if (this.watchTimer) clearTimeout(this.watchTimer);\n this.watchTimer = setTimeout(() => {\n this.watchTimer = null;\n void this.maybeRefresh();\n }, WATCH_DEBOUNCE_MS);\n this.watchTimer.unref?.();\n }\n\n /**\n * Event-driven freshness (the serve-loop watcher): a recursive `fs.watch`\n * on the workspace feeds `notePendingChange`, so a save triggers a rebuild\n * in ~WATCH_DEBOUNCE_MS instead of waiting out the 2–30 s poll. The poll\n * stays armed as the fallback — on filesystems where recursive watch fails\n * (some containers/NFS) this returns false and behaviour is unchanged.\n */\n startWatching(): boolean {\n if (this.watcher) return true;\n try {\n this.watcher = fs.watch(this.root, { recursive: true }, (_event, filename) => {\n if (!filename) return;\n if (!isRelevantChange(filename)) return;\n this.notePendingChange(filename);\n });\n this.watcher.unref?.();\n return true;\n } catch {\n this.watcher = null;\n return false;\n }\n }\n\n stopWatching(): void {\n this.watcher?.close();\n this.watcher = null;\n if (this.watchTimer) clearTimeout(this.watchTimer);\n this.watchTimer = null;\n }\n\n /**\n * In-band staleness signal for tool responses: what has changed since the\n * last committed refresh. Null when the map is current (the common case —\n * responses carry zero overhead then).\n */\n stalenessNote(): string | null {\n const n = this.pendingChanges.size;\n if (n === 0) return null;\n const names = [...this.pendingChanges.keys()].sort().slice(0, 3);\n const more = n > names.length ? `, +${n - names.length} more` : '';\n return `map freshness: ${n} file(s) changed since the last rebuild (${names.join(', ')}${more}) — auto-refresh pending; symbol locations may have shifted`;\n }\n}\n\nexport function createServer(source: GraphSource, opts: ServeOptions = {}): Server {\n const { savings = false, shareStats = false, local = false, dedup = false, stats } = opts;\n // Recording feeds both the local `vg savings` report and the opt-in upload, so\n // enabling either turns it on. Absent both, `vg serve` records nothing.\n const record = savings || shareStats;\n // Prefer GraphSource's explicit root (set by serve from the project cwd).\n const root = opts.root ?? source.root;\n // Per-session memory of node ids whose full detail was already returned — the\n // basis for opt-in cross-call dedup (`--dedup`). Scoped to this server\n // instance so it never leaks across sessions. Node ids are content-addressed\n // (blake3 of content), so an edited node gets a new id and is never falsely\n // treated as already-seen — dedup is stale-safe by construction.\n const seen = new Set<string>();\n const server = new Server(\n { name: 'vg', version: VERSION },\n {\n capabilities: { tools: {} },\n // Routing guidance once at the server level (hosts that surface\n // `instructions` get it at zero per-step schema cost): the flashlight\n // vs the map.\n instructions:\n 'vg is a code map. Use search_symbols to find a known name or literal string fast — ' +\n 'a multi-word/quoted phrase runs a complete literal sweep and reports totalTextMatches, ' +\n 'so reach for it instead of grep even for plain-string \"find every occurrence\" lookups. ' +\n 'Use orient/query_graph for meaning: symptoms, relationships, and what-breaks-if. ' +\n 'Responses are concise by default; pass response_format:\"detailed\" only when a node proves load-bearing. ' +\n // Stop-discipline: the failure mode on a focused task is over-navigation\n // — one more query, one more get_node — which re-bills the whole context\n // every step. One good navigation call usually locates the code.\n 'Navigate as little as possible: one good search/query usually locates the code. ' +\n 'As soon as you have the file and line, read that file and make the edit — ' +\n 'do not call further graph tools unless the edit fails or the match was wrong. ' +\n // Library docs: position against web search (version-correct beats\n // SEO results), and give a stopping rule so a thin doc doesn't turn\n // into an open-ended search loop.\n 'For how-do-I-use-this-library questions call resolve_library once, then library_docs ' +\n 'with the returned targetId and a focused query: the docs are official and matched to ' +\n 'the version THIS project has installed (drift-annotated) — prefer them over web search ' +\n 'or training-data recall when they conflict. Skip them for language built-ins or APIs ' +\n 'already shown in context. If two library_docs calls have not surfaced the section you ' +\n 'need, read the package source under node_modules instead of searching again.',\n },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n const listed = new Set(listedToolNames(opts.toolSurface));\n // Repo-size call budget on orient's listed description: the stop-discipline\n // where the model decides, priced once per list, not per step. Best-effort —\n // when no map is loadable yet the description ships without the line.\n let budget = '';\n try {\n const graph = await source.get();\n budget = budgetSuffix(new Set(graph.nodes.map((n) => n.file)).size);\n } catch {\n /* no map yet — plain description */\n }\n return {\n tools: TOOLS.filter((t) => listed.has(t.name)).map((t) => ({\n name: t.name,\n description: t.name === 'orient' && budget ? `${t.description}${budget}` : t.description,\n inputSchema: t.inputSchema,\n annotations: { readOnlyHint: true, openWorldHint: false },\n })),\n };\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const tool = TOOLS.find((t) => t.name === request.params.name);\n if (!tool) {\n return errorResult(`unknown tool \"${request.params.name}\"`);\n }\n let graph: VgGraph;\n try {\n graph = await source.get();\n } catch {\n return errorResult(\n 'no code map found. Run `vg` in the project to build .vibgrate/graph.json, then retry.',\n );\n }\n const startedAt = Date.now();\n try {\n const args = (request.params.arguments ?? {}) as Record<string, unknown>;\n const result = await tool.handler(graph, args, { root, local, dedup, seen, graphPath: source.graphPath });\n const ms = Date.now() - startedAt;\n // Live, in-memory session stats for the serve status display — always on\n // when a serve process passed them (nothing leaves the process).\n stats?.record({ ...measureCall(tool.name, result), client: sanitizeClient(detectClient(server)), ms });\n // Opt-in, counts-only usage ledger: one entry per navigation call, with its\n // outcome, the grep-baseline token counts, and — so `vg savings` can show\n // the command-vs-MCP split and which AI is calling — the source (`mcp`) and\n // the client detected from the initialize handshake.\n if (record) recordUsage(root, tool.name, result, detectClient(server), ms);\n // Compact → clamp to the token ceiling → compact-serialise. See ./response.ts.\n const rendered = renderToolResult(result);\n // In-band staleness (serve-loop watcher): when the working tree has\n // drifted past the served map, say so ON the response — the agent is the\n // one acting on possibly-moved symbols, and stderr never reaches it.\n // Zero overhead when the map is current (the overwhelmingly common case).\n const staleness = source.stalenessNote();\n if (staleness) rendered.content = [...(rendered.content ?? []), { type: 'text', text: `[${staleness}]` }];\n return rendered;\n } catch (err) {\n // A failed call still counts in the live display — as a miss, so the\n // operator sees trouble instead of a silently frozen dashboard.\n stats?.record({\n tool: tool.name,\n client: sanitizeClient(detectClient(server)),\n outcome: 'miss',\n ms: Date.now() - startedAt,\n vgTokens: 0,\n baselineTokens: 0,\n });\n return errorResult(`tool \"${tool.name}\" failed: ${(err as Error).message}`);\n }\n });\n\n return server;\n}\n\nexport async function serveStdio(graphPath: string, opts: ServeOptions = {}): Promise<void> {\n const source = new GraphSource(graphPath, opts.refresh !== false, { root: opts.root });\n if (opts.refresh !== false && opts.watch !== false) source.startWatching();\n const server = createServer(source, opts);\n // Start the semantic-model warm-up as soon as the server boots, so the first\n // orient/query_graph doesn't pay a cold download. Non-blocking: navigation\n // answers lexically until the model is ready, then upgrades to semantic.\n warmEmbedderInBackground(opts.local);\n await server.connect(new StdioServerTransport());\n}\n\n\n/**\n * Append a counts-only usage entry for a navigation call: which tool, how it\n * resolved (complete/partial/miss), and — for the grep-baseline tools — the\n * tokens vg spent vs the grep/read baseline it replaced.\n *\n * `vgTokens` is the size of the payload vg ACTUALLY returned — the rendered text\n * block the model receives and re-pays on every subsequent turn — measured with\n * the same token counter the budget uses. It is deliberately NOT read from a\n * `tokensEstimate` field: only query_graph's rarely-used *detailed* mode ever\n * set that (get_node never did), so the old code recorded nothing under normal\n * concise usage and `vg savings` always reported \"recording is off\".\n */\nexport function recordUsage(root: string, tool: string, result: unknown, client?: string, ms?: number): void {\n recordSaving(\n root,\n { ...measureCall(tool, result), source: 'mcp', client: sanitizeClient(client), ...(ms !== undefined ? { ms } : {}) },\n Date.now(),\n );\n}\n\n/**\n * Measure one tool call for the ledger and the live session stats: its outcome\n * plus — for the grep-baseline tools only — the context tokens vg returned and\n * the baseline they replaced (other tools report zeros, meaning \"no baseline\").\n */\nfunction measureCall(tool: string, result: unknown): { tool: string; outcome: Outcome; vgTokens: number; baselineTokens: number } {\n const outcome = classifyOutcome(result);\n let vgTokens = 0;\n let baselineTokens = 0;\n if (SAVINGS_TOOLS.has(tool) && result && typeof result === 'object') {\n vgTokens = countTokens(renderedText(renderToolResult(result)));\n // Grep/read baseline: ~PER_FILE_TOKENS per distinct file the answer points\n // at — the files a grep/read agent would have had to open to learn the same\n // thing. query_graph surfaces them as `matches[].file`; get_node as its own\n // `file` plus the files of the callers/callees it returned in one call.\n baselineTokens = referencedFiles(result).size * PER_FILE_TOKENS;\n }\n return { tool, outcome, vgTokens, baselineTokens };\n}\n\n/**\n * The coarse client label from the MCP `initialize` handshake, if the host sent\n * `clientInfo`. Read defensively — `getClientVersion()` exists on the SDK Server\n * once initialized, but we never want telemetry bookkeeping to throw. Returns\n * undefined when unknown (then sanitized to `'unknown'`).\n */\nfunction detectClient(server: Server): string | undefined {\n try {\n const info = (server as { getClientVersion?: () => { name?: string } | undefined }).getClientVersion?.();\n return typeof info?.name === 'string' ? info.name : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Bucket a tool result into complete / partial / miss. A `miss` is an answer\n * that found nothing (no match, not-found, not-connected, or an empty listing);\n * a `partial` found results but capped or paginated some of them; everything\n * else is `complete`. Note that a legitimately empty `affected`/`covers` (e.g.\n * \"nothing depends on this\") is a successful answer, not a miss — only the\n * primary discovery signals below mark a miss.\n */\nfunction classifyOutcome(result: unknown): Outcome {\n if (Array.isArray(result)) return result.length === 0 ? 'miss' : 'complete';\n if (!result || typeof result !== 'object') return 'miss';\n const r = result as Record<string, unknown>;\n if (typeof r.error === 'string' && r.error) return 'miss'; // not_found / ambiguous / unresolved\n if (r.connected === false) return 'miss'; // find_path\n if (Array.isArray(r.matches) && r.matches.length === 0) return 'miss'; // query_graph / search_symbols\n return isPartial(r) ? 'partial' : 'complete';\n}\n\n/** True when a hit left results on the table: paginated, or a capped relation list. */\nfunction isPartial(r: Record<string, unknown>): boolean {\n if (r.moreAvailable === true) return true;\n if (r._truncated && typeof r._truncated === 'object') return true;\n // A `<name>Total` greater than the length of its sibling `<name>` array means\n // the array was capped (e.g. get_node's callsTotal vs the shown calls).\n for (const [key, value] of Object.entries(r)) {\n if (typeof value !== 'number' || !key.endsWith('Total')) continue;\n const base = key.slice(0, -'Total'.length);\n const shown = Array.isArray(r[base]) ? (r[base] as unknown[]).length : 0;\n if (value > shown) return true;\n }\n return false;\n}\n\n/** The text block of a rendered tool result — what the model is billed for. */\nfunction renderedText(rendered: CallToolResult): string {\n const block = rendered.content?.find((b) => b.type === 'text');\n return block && 'text' in block && typeof block.text === 'string' ? block.text : '';\n}\n\n/** Distinct files a navigation result points at (its grep/read baseline set). */\nfunction referencedFiles(result: unknown): Set<string> {\n const r = result as { file?: unknown; matches?: unknown; calls?: unknown; calledBy?: unknown };\n const files = new Set<string>();\n if (typeof r.file === 'string' && r.file) files.add(r.file);\n for (const m of asArray(r.matches)) {\n const f = (m as { file?: unknown }).file;\n if (typeof f === 'string' && f) files.add(f);\n }\n // get_node's calls/calledBy are qualified names of the form `path:symbol`; the\n // path prefix is the file a grep/read agent would open to inspect that edge.\n for (const name of [...asArray(r.calls), ...asArray(r.calledBy)]) {\n if (typeof name !== 'string') continue;\n const i = name.indexOf(':');\n if (i > 0) files.add(name.slice(0, i));\n }\n return files;\n}\n\nfunction asArray(v: unknown): unknown[] {\n return Array.isArray(v) ? v : [];\n}\n\nfunction errorResult(message: string) {\n return { content: [{ type: 'text', text: message }], isError: true };\n}\n","import { serializeGraph, slimGraphForExport } from './serialize.js';\nimport { renderReport } from './report.js';\nimport { renderHtml } from './html.js';\nimport type { DepRecord } from './drift.js';\nimport type { LocalModel } from './models.js';\nimport type { VgGraph } from '../schema.js';\n\n/** Above this node count, JSON export defaults to compact (no pretty-print). */\nexport const COMPACT_JSON_NODES = 5_000;\n\n/**\n * Deterministic exporters (VG-CLI-SPEC §4.2). One `vg export <file>` verb, format\n * inferred from the extension. Live graph-DB push is deliberately out (a file\n * import covers the same need offline). CycloneDX/SPDX power the SBOM/AI-BOM seam\n * (VG-LOCAL-MODELS §9.4).\n */\n\nexport type ExportFormat =\n | 'json'\n | 'ndjson'\n | 'graphml'\n | 'dot'\n | 'cypher'\n | 'sql'\n | 'md'\n | 'html'\n | 'cyclonedx'\n | 'spdx';\n\nexport function formatForExt(ext: string): ExportFormat | null {\n switch (ext.toLowerCase()) {\n case '.json':\n return 'json';\n case '.ndjson':\n return 'ndjson';\n case '.graphml':\n return 'graphml';\n case '.dot':\n case '.gv':\n return 'dot';\n case '.cypher':\n return 'cypher';\n case '.sql':\n return 'sql';\n case '.md':\n return 'md';\n case '.html':\n return 'html';\n default:\n return null;\n }\n}\n\nexport interface ExportContext {\n graph: VgGraph;\n deps?: DepRecord[];\n models?: LocalModel[];\n generatedAt: string;\n /** Force compact JSON (no indent). Default: auto when nodes > COMPACT_JSON_NODES. */\n compact?: boolean;\n /** Drop area members + grounding for smaller artifacts. */\n slim?: boolean;\n}\n\nexport function exportGraph(format: ExportFormat, ctx: ExportContext): string {\n const graph = ctx.slim ? slimGraphForExport(ctx.graph) : ctx.graph;\n const compact =\n ctx.compact === true ||\n (ctx.compact !== false && format === 'json' && graph.meta.counts.nodes > COMPACT_JSON_NODES);\n\n switch (format) {\n case 'json':\n return serializeGraph(graph, { compact });\n case 'md':\n return renderReport(graph);\n case 'html':\n return renderHtml(graph);\n case 'ndjson':\n return ndjson(graph);\n case 'graphml':\n return graphml(graph);\n case 'dot':\n return dot(graph);\n case 'cypher':\n return cypher(graph);\n case 'sql':\n return sql({ ...ctx, graph });\n case 'cyclonedx':\n return cyclonedx({ ...ctx, graph });\n case 'spdx':\n return spdx({ ...ctx, graph });\n }\n}\n\nfunction ndjson(graph: VgGraph): string {\n // Facts stream if present, else the node stream — one JSON object per line.\n const rows = graph.facts && graph.facts.length ? graph.facts : graph.nodes;\n return rows.map((r) => JSON.stringify(r)).join('\\n') + '\\n';\n}\n\nfunction esc(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;');\n}\n\nfunction graphml(graph: VgGraph): string {\n const lines: string[] = [];\n lines.push('<?xml version=\"1.0\" encoding=\"UTF-8\"?>');\n lines.push('<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\">');\n lines.push(' <key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"/>');\n lines.push(' <key id=\"kind\" for=\"node\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <key id=\"file\" for=\"node\" attr.name=\"file\" attr.type=\"string\"/>');\n lines.push(' <key id=\"ekind\" for=\"edge\" attr.name=\"kind\" attr.type=\"string\"/>');\n lines.push(' <graph edgedefault=\"directed\">');\n for (const n of graph.nodes) {\n lines.push(` <node id=\"${esc(n.id)}\"><data key=\"name\">${esc(n.qualifiedName)}</data><data key=\"kind\">${esc(n.kind)}</data><data key=\"file\">${esc(n.file)}</data></node>`);\n }\n for (const e of graph.edges) {\n lines.push(` <edge source=\"${esc(e.src)}\" target=\"${esc(e.dst)}\"><data key=\"ekind\">${esc(e.kind)}</data></edge>`);\n }\n lines.push(' </graph>');\n lines.push('</graphml>');\n return lines.join('\\n') + '\\n';\n}\n\nfunction dot(graph: VgGraph): string {\n const lines: string[] = ['digraph vg {'];\n for (const n of graph.nodes) lines.push(` \"${n.id}\" [label=\"${dotEsc(n.qualifiedName)}\"];`);\n for (const e of graph.edges) lines.push(` \"${e.src}\" -> \"${e.dst}\" [label=\"${e.kind}\"];`);\n lines.push('}');\n return lines.join('\\n') + '\\n';\n}\nfunction dotEsc(s: string): string {\n return s.replace(/\"/g, '\\\\\"');\n}\n\nfunction cypher(graph: VgGraph): string {\n const lines: string[] = [];\n for (const n of graph.nodes) {\n lines.push(\n `CREATE (:\\`${cypherLabel(n.kind)}\\` {id:${q(n.id)}, name:${q(n.qualifiedName)}, file:${q(n.file)}});`,\n );\n }\n for (const e of graph.edges) {\n lines.push(\n `MATCH (a {id:${q(e.src)}}),(b {id:${q(e.dst)}}) CREATE (a)-[:\\`${cypherLabel(e.kind)}\\`]->(b);`,\n );\n }\n return lines.join('\\n') + '\\n';\n}\nfunction cypherLabel(s: string): string {\n return s.replace(/[^A-Za-z0-9_]/g, '_');\n}\nfunction q(s: string): string {\n return JSON.stringify(s);\n}\n\n/**\n * Portable SQL fact-DB (VG-CLI-SPEC §4.2, agent-consumption). Emits deterministic\n * DDL + INSERT text — NOT a native driver — that loads identically into BOTH\n * sqlite3 and duckdb (`sqlite3 map.db < map.sql` / `duckdb map.db < map.sql`).\n * Text keeps the CLI dependency-free, offline, and byte-diffable; an identical\n * graph yields identical bytes. An agent can then run e.g.\n * SELECT src, dst FROM edges WHERE epistemic = 'observed' AND confidence >= 0.9;\n * Determinism: single transaction, `CREATE TABLE IF NOT EXISTS`, rows emitted in\n * the graph's own (already-sorted) array order, single quotes doubled, NULL for\n * absent optionals, booleans as 0/1, and no timestamp but the graph's generatedAt.\n */\nfunction sql(ctx: ExportContext): string {\n const graph = ctx.graph;\n const lines: string[] = [];\n lines.push('BEGIN;');\n\n // meta — provenance / toolchain fingerprint (key/value; agent can read the corpus hash).\n lines.push('CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT);');\n const meta: [string, string | null][] = [\n ['schemaVersion', graph.schemaVersion],\n ['generatedAt', ctx.generatedAt],\n ['corpusHash', graph.provenance.corpusHash],\n ['tool', graph.provenance.tool],\n ['toolVersion', graph.provenance.version],\n ['resolver', graph.provenance.resolver.join(',')],\n ['fingerprint', graph.provenance.toolchain?.fingerprint ?? null],\n ];\n for (const [k, v] of meta) lines.push(`INSERT INTO meta VALUES (${sqlStr(k)}, ${sqlStr(v)});`);\n\n // nodes\n lines.push(\n 'CREATE TABLE IF NOT EXISTS nodes (id TEXT PRIMARY KEY, kind TEXT, name TEXT, qualified_name TEXT, file TEXT, span_start INTEGER, span_end INTEGER, lang TEXT, visibility TEXT, signature TEXT, importance REAL, area INTEGER, is_hub INTEGER, tested INTEGER, coverage REAL);',\n );\n for (const n of graph.nodes) {\n lines.push(\n `INSERT INTO nodes VALUES (${sqlStr(n.id)}, ${sqlStr(n.kind)}, ${sqlStr(n.name)}, ${sqlStr(n.qualifiedName)}, ${sqlStr(n.file)}, ${sqlNum(n.span.start)}, ${sqlNum(n.span.end)}, ${sqlStr(n.lang)}, ${sqlStr(n.visibility)}, ${sqlStr(n.signature)}, ${sqlNum(n.importance)}, ${sqlNum(n.area)}, ${sqlBool(n.isHub)}, ${sqlBool(n.tested)}, ${sqlNum(n.coverage)});`,\n );\n }\n\n // edges — the epistemic column is the point: SELECT ... WHERE epistemic='observed'.\n lines.push(\n 'CREATE TABLE IF NOT EXISTS edges (id TEXT PRIMARY KEY, kind TEXT, src TEXT, dst TEXT, resolution TEXT, confidence REAL, epistemic TEXT, surprise REAL, \"count\" INTEGER);',\n );\n for (const e of graph.edges) {\n lines.push(\n `INSERT INTO edges VALUES (${sqlStr(e.id)}, ${sqlStr(e.kind)}, ${sqlStr(e.src)}, ${sqlStr(e.dst)}, ${sqlStr(e.resolution)}, ${sqlNum(e.confidence)}, ${sqlStr(e.epistemic)}, ${sqlNum(e.surprise)}, ${sqlNum(e.count)});`,\n );\n }\n\n // areas (+ members)\n lines.push('CREATE TABLE IF NOT EXISTS areas (id INTEGER PRIMARY KEY, label TEXT, size INTEGER, cohesion REAL, external_edges INTEGER);');\n lines.push('CREATE TABLE IF NOT EXISTS area_members (area_id INTEGER, node_id TEXT);');\n for (const a of graph.areas) {\n lines.push(`INSERT INTO areas VALUES (${sqlNum(a.id)}, ${sqlStr(a.label)}, ${sqlNum(a.size)}, ${sqlNum(a.cohesion)}, ${sqlNum(a.externalEdges)});`);\n for (const m of a.members) lines.push(`INSERT INTO area_members VALUES (${sqlNum(a.id)}, ${sqlStr(m)});`);\n }\n\n // facts (+ subjects, evidence) when the graph carried them.\n if (graph.facts && graph.facts.length) {\n lines.push('CREATE TABLE IF NOT EXISTS facts (id TEXT PRIMARY KEY, kind TEXT, predicate_json TEXT, derived_by TEXT, confidence TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_subjects (fact_id TEXT, node_id TEXT);');\n lines.push('CREATE TABLE IF NOT EXISTS fact_evidence (fact_id TEXT, file TEXT, span_start INTEGER, span_end INTEGER);');\n for (const f of graph.facts) {\n lines.push(`INSERT INTO facts VALUES (${sqlStr(f.id)}, ${sqlStr(f.kind)}, ${sqlStr(JSON.stringify(f.predicate))}, ${sqlStr(f.derivedBy)}, ${sqlStr(f.confidence)});`);\n for (const s of f.subjectIds) lines.push(`INSERT INTO fact_subjects VALUES (${sqlStr(f.id)}, ${sqlStr(s)});`);\n for (const ev of f.evidence) lines.push(`INSERT INTO fact_evidence VALUES (${sqlStr(f.id)}, ${sqlStr(ev.file)}, ${sqlNum(ev.span.start)}, ${sqlNum(ev.span.end)});`);\n }\n }\n\n lines.push('COMMIT;');\n return lines.join('\\n') + '\\n';\n}\n\n/** SQL string literal (single quotes doubled) or NULL for absent values. */\nfunction sqlStr(v: string | null | undefined): string {\n if (v == null) return 'NULL';\n return `'${v.replace(/'/g, \"''\")}'`;\n}\n/** Numeric literal or NULL for absent values. */\nfunction sqlNum(v: number | null | undefined): string {\n return v == null || !Number.isFinite(v) ? 'NULL' : String(v);\n}\n/** Boolean as 0/1, NULL when unknown (e.g. an unanalyzable node's `tested`). */\nfunction sqlBool(v: boolean | null | undefined): string {\n return v == null ? 'NULL' : v ? '1' : '0';\n}\n\nfunction cyclonedx(ctx: ExportContext): string {\n // CycloneDX 1.6 JSON — dependencies as library components + local models as\n // machine-learning-model components (AI-BOM). Deterministic ordering; no\n // timestamps beyond the pinned generatedAt.\n const components: unknown[] = [];\n for (const d of ctx.deps ?? []) {\n components.push({\n type: 'library',\n name: d.name,\n version: d.installed ?? d.declared,\n purl: d.ecosystem === 'npm' ? `pkg:npm/${d.name}@${d.installed ?? ''}` : undefined,\n });\n }\n for (const m of ctx.models ?? []) {\n components.push({ type: 'machine-learning-model', name: m.name, properties: [{ name: 'vg:runtime', value: m.runtime }] });\n }\n const bom = {\n bomFormat: 'CycloneDX',\n specVersion: '1.6',\n metadata: { timestamp: ctx.generatedAt, tools: [{ name: 'vg', version: ctx.graph.provenance.version }] },\n components,\n };\n return JSON.stringify(bom, null, 2) + '\\n';\n}\n\nfunction spdx(ctx: ExportContext): string {\n const packages = (ctx.deps ?? []).map((d) => ({\n SPDXID: `SPDXRef-Package-${cypherLabel(d.name)}`,\n name: d.name,\n versionInfo: d.installed ?? d.declared,\n downloadLocation: 'NOASSERTION',\n }));\n const doc = {\n spdxVersion: 'SPDX-2.3',\n dataLicense: 'CC0-1.0',\n SPDXID: 'SPDXRef-DOCUMENT',\n name: 'vg-sbom',\n creationInfo: { created: ctx.generatedAt, creators: [`Tool: vg-${ctx.graph.provenance.version}`] },\n packages,\n };\n return JSON.stringify(doc, null, 2) + '\\n';\n}\n"]}
@@ -1,30 +0,0 @@
1
- export { ensureCodeMap } from './chunk-BH54SLGZ.js';
2
- import './chunk-JCN6MSXQ.js';
3
- import './chunk-CT5BS56U.js';
4
- import './chunk-TNROG5CO.js';
5
- import './chunk-WWGLVF7D.js';
6
- import './chunk-HTLDXEHW.js';
7
- import './chunk-N6ZMZ5AI.js';
8
- import './chunk-VIWZ4QT7.js';
9
- import './chunk-7QDHQLUS.js';
10
- import './chunk-J7LKEB2R.js';
11
- import './chunk-KGPX4EUN.js';
12
- import './chunk-CQDUBAQY.js';
13
- import './chunk-OV4KGXPD.js';
14
- import './chunk-WQLZSVNF.js';
15
- import './chunk-5I4VSBWQ.js';
16
- import './chunk-DT4KIVRI.js';
17
- import './chunk-CRAMOEBE.js';
18
- import './chunk-3LSG7Z4I.js';
19
- import './chunk-UTNNGKKX.js';
20
- import './chunk-RXP66R2E.js';
21
- import './chunk-X76VPOYH.js';
22
- import './chunk-2U37PFB2.js';
23
- import './chunk-75LJM5XD.js';
24
- import './chunk-2H2U3DC7.js';
25
- import './chunk-BWPBB45M.js';
26
- import './chunk-JFGYT6BI.js';
27
- import './chunk-BPF3YX2U.js';
28
- import './chunk-Z6ZWNWWR.js';
29
- //# sourceMappingURL=ensure-map-HQ7A5NDL.js.map
30
- //# sourceMappingURL=ensure-map-HQ7A5NDL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"fs-NTQUFCXV.js"}
@@ -1,14 +0,0 @@
1
- export { localGraphBackend, resolveGraphBackend, vgdGraphBackend } from './chunk-54RGT2T5.js';
2
- import './chunk-RBIRXQR6.js';
3
- import './chunk-J7LKEB2R.js';
4
- import './chunk-KGPX4EUN.js';
5
- import './chunk-X76VPOYH.js';
6
- import './chunk-2U37PFB2.js';
7
- import './chunk-75LJM5XD.js';
8
- import './chunk-2H2U3DC7.js';
9
- import './chunk-BWPBB45M.js';
10
- import './chunk-JFGYT6BI.js';
11
- import './chunk-BPF3YX2U.js';
12
- import './chunk-Z6ZWNWWR.js';
13
- //# sourceMappingURL=graph-backend-W2TNTMY7.js.map
14
- //# sourceMappingURL=graph-backend-W2TNTMY7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/code/wizard.ts","../src/code/cost.ts","../src/runtime/bridge-facts.ts","../src/code/interactive.ts"],"names":["group","model","sp"],"mappings":"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","file":"interactive-EW2VJ3BZ.js","sourcesContent":["/**\n * The `vg code` guided provider/model wizard (VG-CLI-CODE §8).\n *\n * Walks the developer from \"I want to code\" to a concrete (provider, model)\n * choice: run locally, or pick one of the current top hosted providers\n * (Claude / GPT / Grok / Gemini / …) surfaced live from the model catalog — with\n * an \"enter a slug myself\" escape hatch at every step. Pure over an injected\n * {@link Prompter} + catalog + local fleet, so the whole decision tree is\n * unit-tested with a scripted prompter and no network or TTY.\n */\n\nimport type { Prompter } from './ui.js';\nimport type { Catalog } from './catalog.js';\nimport { topProviders } from './catalog.js';\nimport type { LocalModel } from '../engine/models.js';\n\nexport interface WizardResult {\n kind: 'hosted' | 'local';\n /** The router `--provider` value: `openrouter` for hosted picks, `ollama` for local. */\n provider: 'openrouter' | 'ollama';\n /** The concrete model slug/tag to run. */\n model: string;\n /** The display provider for per-model savings attribution (e.g. `anthropic`, `ollama`). */\n providerSlug: string;\n /** For a local model not yet present on the machine → pull it first. */\n needsPull?: boolean;\n}\n\nconst ENTER_SLUG = '__enter_slug__';\nconst LOCAL = '__local__';\nconst BROWSE = '__browse__';\n\nexport interface WizardDeps {\n catalog: Catalog;\n localModels: LocalModel[];\n topN?: number;\n}\n\n/** Run the guided selection and return the resolved provider + model. */\nexport async function runProviderWizard(prompter: Prompter, deps: WizardDeps): Promise<WizardResult> {\n const providers = topProviders(deps.catalog, deps.topN ?? 6);\n\n // Screen 1 — where should the model run?\n const choice = await prompter.select<string>('Where should the model run?', [\n { label: 'Local model (on your machine)', value: LOCAL, hint: deps.localModels.length ? `${deps.localModels.length} found` : 'nothing installed yet' },\n ...providers.map((p) => ({ label: p.label, value: p.id, hint: 'via OpenRouter' })),\n { label: 'Enter a provider or model slug myself', value: ENTER_SLUG },\n ]);\n\n if (choice === LOCAL) return pickLocal(prompter, deps);\n if (choice === ENTER_SLUG) {\n const slug = (await prompter.input('Model slug (e.g. anthropic/claude-3.5-sonnet, or a provider like openai)')).trim();\n // A full `provider/model` slug is a hosted pick; a bare provider name → show its models.\n if (slug.includes('/')) return { kind: 'hosted', provider: 'openrouter', model: slug, providerSlug: slug.split('/')[0] };\n const group = deps.catalog.providers.find((p) => p.id === slug);\n if (group && group.models.length) return pickHostedModel(prompter, group.id, group.models);\n // Unknown provider → let them type the full model slug.\n const model = (await prompter.input(`Model id for \"${slug}\"`)).trim();\n return { kind: 'hosted', provider: 'openrouter', model: model || slug, providerSlug: slug };\n }\n\n // A hosted provider was chosen → pick one of its models.\n const group = providers.find((p) => p.id === choice)!;\n return pickHostedModel(prompter, group.id, group.models);\n}\n\nasync function pickHostedModel(prompter: Prompter, providerSlug: string, models: Catalog['providers'][number]['models']) {\n if (models.length === 0) {\n const model = (await prompter.input(`Enter a ${providerSlug} model id`)).trim();\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model, providerSlug };\n }\n const model = await prompter.select<string>('Choose a model', [\n ...models.slice(0, 12).map((m) => ({ label: m.name, value: m.id, hint: modelHint(m.contextLength, m.promptPricePerM) })),\n { label: 'Enter a model slug myself', value: ENTER_SLUG },\n ]);\n if (model === ENTER_SLUG) {\n const typed = (await prompter.input(`Enter a ${providerSlug} model id`)).trim();\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model: typed, providerSlug };\n }\n return { kind: 'hosted' as const, provider: 'openrouter' as const, model, providerSlug };\n}\n\nasync function pickLocal(prompter: Prompter, deps: WizardDeps): Promise<WizardResult> {\n const installed = deps.localModels.filter((m) => m.runtime === 'ollama');\n const choices = [\n ...installed.map((m) => ({ label: m.name, value: m.name, hint: 'installed' })),\n { label: 'Browse coding models to pull (Ollama)', value: BROWSE },\n { label: 'Enter a model name to pull', value: ENTER_SLUG },\n ];\n const picked = await prompter.select<string>('Local model', choices);\n\n if (picked === ENTER_SLUG) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n if (picked === BROWSE) {\n // Suggest coding models from the catalog, mapped to a likely Ollama tag.\n const coding = deps.catalog.providers\n .flatMap((p) => p.models)\n .filter((m) => /cod(e|er|ing)/i.test(m.id))\n .slice(0, 10);\n if (coding.length === 0) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n const slug = await prompter.select<string>('Coding model to pull', [\n ...coding.map((m) => ({ label: m.name, value: toOllamaTag(m.id), hint: m.id })),\n { label: 'Enter a model name myself', value: ENTER_SLUG },\n ]);\n if (slug === ENTER_SLUG) {\n const name = (await prompter.input('Ollama model to pull (e.g. qwen2.5-coder:7b)')).trim();\n return { kind: 'local', provider: 'ollama', model: name, providerSlug: 'ollama', needsPull: true };\n }\n return { kind: 'local', provider: 'ollama', model: slug, providerSlug: 'ollama', needsPull: true };\n }\n // An already-installed model — no pull needed.\n return { kind: 'local', provider: 'ollama', model: picked, providerSlug: 'ollama', needsPull: false };\n}\n\n/** Best-effort map an OpenRouter slug to a likely Ollama tag (`qwen/qwen-2.5-coder-7b` → `qwen2.5-coder:7b`). */\nexport function toOllamaTag(slug: string): string {\n const tail = slug.split('/').pop() ?? slug;\n const size = tail.match(/(\\d+(?:\\.\\d+)?)b\\b/i);\n const base = tail\n .replace(/-instruct\\b/i, '')\n .replace(/(\\d+(?:\\.\\d+)?)b\\b/i, '')\n .replace(/[-.]+$/g, '')\n .replace(/\\s+/g, '-');\n return size ? `${base}:${size[1]}b` : base;\n}\n\nfunction modelHint(contextLength?: number, pricePerM?: number): string {\n const parts: string[] = [];\n if (contextLength) parts.push(`${Math.round(contextLength / 1000)}k ctx`);\n if (typeof pricePerM === 'number') parts.push(pricePerM === 0 ? 'free' : `$${pricePerM}/M in`);\n return parts.join(' · ');\n}\n","/**\n * Live cost / token metering for VG Code (VG-CLI-CODE §15).\n *\n * A session meter accumulates the prompt/completion tokens providers report and\n * turns them into a running dollar estimate from the model's published price\n * (per-million, from the catalog). Local models are free, so cost is 0 and only\n * tokens are shown. Pure and unit-tested; the estimate is labelled as such.\n */\n\nexport interface TokenUsage {\n promptTokens?: number;\n completionTokens?: number;\n}\n\n/** USD per 1M tokens for the active model (from the catalog); absent for local/free. */\nexport interface ModelPricing {\n promptPerM?: number;\n completionPerM?: number;\n}\n\n/** Dollar cost of one usage sample under a pricing table (0 when unpriced/free). */\nexport function costOf(usage: TokenUsage, pricing: ModelPricing): number {\n const inCost = ((usage.promptTokens ?? 0) / 1e6) * (pricing.promptPerM ?? 0);\n const outCost = ((usage.completionTokens ?? 0) / 1e6) * (pricing.completionPerM ?? 0);\n return round4(inCost + outCost);\n}\n\n/** Accumulates usage + cost across a coding session. */\nexport class SessionMeter {\n private prompt = 0;\n private completion = 0;\n private cost = 0;\n private turns = 0;\n\n constructor(private pricing: ModelPricing = {}) {}\n\n /** Update the pricing (e.g. after `/model` switches model mid-session). */\n setPricing(pricing: ModelPricing): void {\n this.pricing = pricing;\n }\n\n /** Record one model turn; returns the incremental cost of just this turn. */\n add(usage: TokenUsage): number {\n this.prompt += usage.promptTokens ?? 0;\n this.completion += usage.completionTokens ?? 0;\n this.turns += 1;\n const delta = costOf(usage, this.pricing);\n this.cost = round4(this.cost + delta);\n return delta;\n }\n\n get totals(): { promptTokens: number; completionTokens: number; totalTokens: number; cost: number; turns: number } {\n return { promptTokens: this.prompt, completionTokens: this.completion, totalTokens: this.prompt + this.completion, cost: this.cost, turns: this.turns };\n }\n\n /** A compact one-line summary, e.g. `3.1k tok · ~$0.0042` (cost only when priced). */\n summary(): string {\n const t = this.totals;\n const tok = `${fmtTokens(t.totalTokens)} tok`;\n const priced = this.pricing.promptPerM || this.pricing.completionPerM;\n return priced ? `${tok} · ~$${t.cost.toFixed(4)}` : tok;\n }\n}\n\nexport function fmtTokens(n: number): string {\n if (n >= 1e6) return `${(n / 1e6).toFixed(2)}M`;\n if (n >= 1e3) return `${(n / 1e3).toFixed(1)}k`;\n return String(n);\n}\n\nfunction round4(x: number): number {\n return Math.round(x * 1e4) / 1e4;\n}\n","/**\n * Project federation bridge edges into capsule pinned facts (Fusion Phase 6).\n *\n * High-confidence bridges become short, secret-free facts the model can see\n * without opening every workspace root. Pure over {@link BridgeEdge}.\n */\n\nimport type { BridgeEdge } from './bridge-edges.js';\n\n/**\n * Turn bridge edges into pinned-fact lines for Task Capsules.\n * Default minConfidence 0.8 keeps only workspace/package-strong links\n * (interface bridges sit ~0.68–0.75 and stay out unless lowered).\n */\nexport function bridgePinnedFacts(\n bridges: BridgeEdge[] | undefined | null,\n options: { minConfidence?: number; maxFacts?: number } = {},\n): string[] {\n if (!bridges?.length) return [];\n const min = options.minConfidence ?? 0.8;\n const max = options.maxFacts ?? 12;\n return bridges\n .filter((b) => b.confidence >= min)\n .map((b) => {\n const from = shortLabel(b.fromRoot);\n const to = shortLabel(b.toRoot);\n const via = b.packageName ? ` package ${b.packageName}` : '';\n return `bridge ${b.kind}: ${from} → ${to}${via} (${b.confidence.toFixed(2)})`;\n })\n .sort((a, b) => a.localeCompare(b))\n .slice(0, max);\n}\n\nfunction shortLabel(root: string): string {\n const parts = root.replace(/\\\\/g, '/').split('/').filter(Boolean);\n return parts[parts.length - 1] || root;\n}\n","/**\n * The `vg code` guided, interactive mode (VG-CLI-CODE §8–§11).\n *\n * Running bare `vg code` at a terminal enters this flow: show the VG Code\n * banner, make sure the code map is built (behind a spinner, no map banner),\n * walk the developer through choosing a provider + model (local or a top hosted\n * provider), run a memory pre-flight before pulling any local model, then drop\n * into a coding REPL that proposes a diff per instruction and writes only what\n * the developer approves.\n *\n * The decision logic (catalog grouping, wizard tree, capability assessment) is\n * pure and unit-tested elsewhere; this module is the I/O shell that wires those\n * pieces to the terminal, the graph build, and the model runtime.\n */\n\nimport { loadGraph } from '../engine/load.js';\nimport { refreshIfStale } from '../engine/refresh.js';\nimport { resolveGraphPath } from '../engine/artifacts.js';\nimport { BranchGraphSession } from '../runtime/branch-graph-session.js';\nimport { discoverModels } from '../engine/models.js';\nimport { ensureCodeMap } from './ensure-map.js';\nimport { printCodeLogo } from '../util/logo.js';\nimport { c, info, out } from '../util/output.js';\nimport type { GlobalOpts } from '../cli-options.js';\nimport { fetchCatalog } from './catalog.js';\nimport { runProviderWizard, type WizardResult } from './wizard.js';\nimport { TtyPrompter, PromptCancelled, type Prompter } from './ui.js';\nimport { estimateModelBytes, assessCapability, fmt } from './capability.js';\nimport { gatherSystemMemory, hasOllama, stopModel, pullModelClean } from './local-runtime.js';\nimport { spawnSync } from 'node:child_process';\nimport { resolveProviders } from './router.js';\nimport { nodeCodeFs, undoChanges } from './session.js';\nimport { runAgent, type AgentEvent, type AgentOptions, type AgentResult } from './agent.js';\nimport { readModelSavings } from '../engine/savings.js';\nimport { SessionMeter } from './cost.js';\nimport { McpToolset, defaultMcpConnect, type McpConnect } from './mcp-tools.js';\nimport { condenseSession, loadLatestSession, loadSession, saveSession, summarizeSession, newSession, recordTask, type StoredSession } from './session-store.js';\nimport type { McpServerConfig } from './config.js';\nimport type { MutatingAction, ShellResult } from './tools.js';\nimport type { FileChange, Provider } from './types.js';\nimport { startCodeRuntimeSession } from './runtime-session.js';\nimport { loadOrDiscoverFederation } from '../runtime/federation.js';\nimport { bridgePinnedFacts } from '../runtime/bridge-facts.js';\nimport { resolveExecutionEnv, type SecurityTier } from '../runtime/execution-env.js';\nimport {\n mergeModelExecutionProfile,\n resolveModelExecutionProfile,\n type ModelExecutionProfile,\n} from '../runtime/model-execution-profile.js';\nimport { vgdIsRunning, vgdRequest } from '../runtime/vgd/index.js';\nimport { resolveGraphBackend } from './graph-backend.js';\nimport { summarizeDiffs } from './diff.js';\n\nexport interface InteractiveOptions {\n provider?: string;\n model?: string;\n modelPath?: string;\n budget?: string;\n file?: string[];\n /** Auto-approve edits and commands (autonomous). */\n auto?: boolean;\n /** Cap on agent steps per instruction. */\n maxSteps?: number;\n /** Extra command-denylist rules for autonomous mode (from config). */\n denyCommands?: string[];\n /** Project test/verify command surfaced to the agent (from config). */\n testCommand?: string;\n /** Transcript compaction budget in tokens (from config / model window). */\n contextBudget?: number;\n /** Stream assistant tokens live. */\n stream?: boolean;\n /** Auto-verify: run the test command after the agent finishes and fix failures. */\n verify?: { command: string; maxRounds?: number };\n /** External MCP servers whose tools the agent may call. */\n mcpServers?: Record<string, McpServerConfig>;\n /** Which config files the MCP servers came from (for a transparent note). */\n mcpSources?: string[];\n /** Resume a session: `true` for the most recent, or an explicit session id. */\n continueSession?: boolean | string;\n /** Prefer source-bearing Task Capsule context (Fusion Runtime A/B). */\n capsule?: boolean;\n /**\n * Security ladder tier for shell (ADR-002). When omitted: L1 under `--auto`,\n * otherwise L0. Explicit value always wins.\n */\n securityTier?: SecurityTier;\n /** Optional Model Execution Profile overrides from code.json. */\n modelProfile?: Partial<ModelExecutionProfile>;\n /** Injectable MCP connect (tests). */\n mcpConnect?: McpConnect;\n}\n\n/** Entry point for guided `vg code` (no instruction, at a TTY). */\nexport async function runInteractive(root: string, global: GlobalOpts, opts: InteractiveOptions, prompter: Prompter = new TtyPrompter()): Promise<void> {\n printCodeLogo(root);\n try {\n await ensureMap(root, global, prompter);\n const selection = await chooseModel(root, global, opts, prompter);\n if (!selection) return; // aborted (e.g. can't run a local model)\n await codingRepl(root, global, opts, selection, prompter);\n } catch (e) {\n if (e instanceof PromptCancelled) {\n info(c.dim('\\n cancelled — no changes were made'));\n return;\n }\n throw e;\n }\n}\n\n/** Build the code map if missing, or refresh it if the tree drifted — behind a spinner, no map banner. */\nasync function ensureMap(root: string, global: GlobalOpts, prompter: Prompter): Promise<void> {\n const existing = loadGraph(root, global.graph);\n if (!existing) {\n const sp = prompter.spinner('Building the code map…');\n try {\n await ensureCodeMap(root, global);\n sp.stop('Code map built');\n } catch (e) {\n sp.fail(`couldn't build the code map: ${(e as Error).message}`);\n throw e;\n }\n return;\n }\n const sp = prompter.spinner('Checking the code map is up to date…');\n const graphPath = resolveGraphPath(root);\n const refreshed = await refreshIfStale(root, { graphPath }).catch(() => null);\n if (refreshed?.status === 'refreshed') sp.stop('Code map refreshed');\n else sp.stop('Code map ready');\n}\n\n/** Resolve the provider/model — from flags if given, else via the guided wizard. */\nasync function chooseModel(root: string, global: GlobalOpts, opts: InteractiveOptions, prompter: Prompter): Promise<WizardResult | null> {\n // Explicit flags skip the wizard entirely.\n if (opts.provider && (opts.model || opts.modelPath)) {\n const local = opts.provider === 'ollama' || opts.provider === 'lmstudio' || opts.provider === 'llama-cpp' || !!global.local;\n return { kind: local ? 'local' : 'hosted', provider: opts.provider === 'ollama' ? 'ollama' : 'openrouter', model: opts.model ?? opts.modelPath ?? '', providerSlug: opts.provider, needsPull: false };\n }\n\n const sp = prompter.spinner('Loading the model catalog…');\n const catalog = await fetchCatalog({ offline: global.local });\n sp.stop(catalog.source === 'network' ? 'Model catalog loaded' : catalog.source === 'cache' ? 'Model catalog (cached)' : 'Model catalog (offline list)');\n const localModels = discoverModels();\n\n const selection = await runProviderWizard(prompter, { catalog, localModels });\n\n if (selection.kind === 'local' && selection.needsPull) {\n const ok = await preflightAndPull(selection, prompter);\n if (!ok) return null;\n }\n if (selection.kind === 'hosted' && !process.env.OPENROUTER_API_KEY) {\n prompter.note(c.yellow('Set OPENROUTER_API_KEY in your environment to use this hosted model (keys are never passed as flags).'));\n }\n return selection;\n}\n\n/** Memory pre-flight, then a clean, wrapped `ollama pull`. Returns false if we shouldn't proceed. */\nasync function preflightAndPull(selection: WizardResult, prompter: Prompter): Promise<boolean> {\n if (!hasOllama()) {\n prompter.note(c.yellow('Ollama isn’t installed — get it from https://ollama.com, then re-run. (We never install a runtime for you.)'));\n return false;\n }\n const estimate = estimateModelBytes(selection.model);\n const report = assessCapability(estimate, gatherSystemMemory());\n\n prompter.note(`${c.bold(selection.model)} — estimated ${fmt(estimate.bytes)}${estimate.guessed ? c.dim(' (size guessed)') : ''}; ~${fmt(report.availableBytes)} free now`);\n for (const s of report.suggestions) prompter.note(c.dim(`· ${s}`));\n\n if (!report.canRun) {\n prompter.note(c.red('This machine doesn’t have enough memory for that model — not pulling it. Pick a smaller model or a lower quant.'));\n return false;\n }\n if (report.needsUnload) {\n const biggest = [...report.loaded].sort((a, b) => b.bytes - a.bytes)[0];\n if (biggest && (await prompter.confirm(`Unload ${biggest.name} to free ~${fmt(biggest.bytes)}?`, true))) {\n stopModel(biggest.name);\n }\n }\n if (!(await prompter.confirm(`Pull ${selection.model} (~${fmt(estimate.bytes)})?`, true))) return false;\n\n const sp = prompter.spinner(`Pulling ${selection.model}…`);\n const ok = await pullModelClean(selection.model, sp);\n if (ok) sp.stop(`Pulled ${selection.model}`);\n else sp.fail(`couldn’t pull ${selection.model}`);\n return ok;\n}\n\n/** The coding REPL: a graph-grounded agent per task, plus slash-commands (/help, /undo, …). */\nasync function codingRepl(root: string, global: GlobalOpts, opts: InteractiveOptions, selection: WizardResult, prompter: Prompter): Promise<void> {\n let sel = selection;\n let route = resolveProviders({\n provider: sel.provider,\n model: sel.model,\n local: sel.kind === 'local' || global.local,\n consent: true, // interactive selection is consent for manager runtime deps\n });\n try {\n const { ensureManagerRuntime } = await import('../runtime/model-manager.js');\n const ensure = await ensureManagerRuntime({\n providerId: route.providers[0]?.id ?? sel.provider,\n model: route.providers[0]?.model ?? sel.model,\n offline: !!global.local,\n consent: true,\n });\n if (!ensure.ok) prompter.note(c.yellow(ensure.error ?? 'model manager not ready'));\n else if (ensure.installed.length || ensure.pulled.length) {\n for (const s of ensure.installed) prompter.note(c.dim(`installed ${s}`));\n for (const s of ensure.pulled) prompter.note(c.dim(`pulled ${s}`));\n }\n prompter.note(c.dim(`manager ${route.managerLine}`));\n } catch {\n /* non-fatal — route still usable */\n }\n const fsImpl = nodeCodeFs(root);\n const meter = new SessionMeter();\n let lastChanges: FileChange[] = [];\n\n // Resume the most recent session (recap for the model + restore /undo).\n let store: StoredSession = newSession(sessionId(), sel.providerSlug, sel.model, Date.now());\n let priorSummary: string | undefined;\n if (opts.continueSession) {\n const prev =\n typeof opts.continueSession === 'string'\n ? loadSession(root, opts.continueSession)\n : loadLatestSession(root);\n if (prev) {\n store = prev;\n lastChanges = prev.lastChanges ?? [];\n priorSummary = summarizeSession(prev);\n prompter.note(c.dim(`resumed session — ${prev.tasks.length} earlier task(s); /undo restores the last change`));\n } else prompter.note(c.dim('no previous session to continue'));\n }\n\n // Live graph holder: filled each turn; MCP builtins always read the current map.\n const graphHolder: { current: import('../schema.js').VgGraph | null } = { current: null };\n\n // Always expose local `vg serve` MCP tools; merge any project-configured servers.\n const { createVgBuiltinMcpTools, mergeExternalToolsets } = await import('./vg-mcp-bridge.js');\n const vgBuiltin = createVgBuiltinMcpTools({\n getGraph: () => {\n if (!graphHolder.current) throw new Error('graph not loaded yet');\n return graphHolder.current;\n },\n root,\n local: global.local === true,\n });\n let mcp: McpToolset | undefined;\n if (opts.mcpServers && Object.keys(opts.mcpServers).length) {\n const sp = prompter.spinner('Connecting MCP tools…');\n const { toolset, warnings } = await McpToolset.connect(opts.mcpServers, opts.mcpConnect ?? defaultMcpConnect);\n mcp = toolset;\n const from = opts.mcpSources?.length ? ` (from ${opts.mcpSources.join(', ')})` : '';\n sp.stop(\n `MCP tools: ${toolset.specs().length} project + ${vgBuiltin.specs.length} local vg` +\n ` (${Object.keys(opts.mcpServers).length} server(s)${from})`,\n );\n for (const w of warnings) prompter.note(c.yellow(` ${w}`));\n } else {\n prompter.note(c.dim(`MCP · ${vgBuiltin.specs.length} local vg tools (mcp__vibgrate__*) always available`));\n }\n const externalToolsMerged = mergeExternalToolsets(\n vgBuiltin,\n mcp ? mcpExternalTools(mcp, agentApprove(opts, prompter)) : undefined,\n );\n\n // Fusion Runtime: attach to (or own) a local vgd session instead of spawning\n // `vg serve` as GraphProcess. Failure degrades to in-process graph only.\n const runtime = await startCodeRuntimeSession({ root });\n // Multi-branch ActiveGraph: warm maps per gitRef; ensureCurrent on each turn\n // so `git checkout` mid-session switches the tool-visible graph (plan §4.1.1).\n const branchGraphs = new BranchGraphSession({ root, graphPath: global.graph });\n // Federated workspaces: if `.vibgrate/federation.json` exists and a daemon is\n // reachable, register every member so multi-repo graphs share one vgd session.\n const federation = loadOrDiscoverFederation(root);\n const extraPinnedFacts = bridgePinnedFacts(federation.bridges);\n if (federation.members.length > 1 && (await vgdIsRunning({ socketPath: runtime.socketPath }))) {\n try {\n await vgdRequest(\n {\n op: 'register-federation',\n primaryRoot: federation.primaryRoot,\n members: federation.members.map((m) => ({ root: m.root, label: m.label, role: m.role })),\n },\n { socketPath: runtime.socketPath },\n );\n const bridgeN = federation.bridges?.length ?? 0;\n prompter.note(\n c.dim(\n `federation · ${federation.members.length} workspace(s) registered with vgd` +\n (bridgeN ? ` · ${bridgeN} bridge edge(s)` : ''),\n ),\n );\n } catch {\n /* federation registration is best-effort */\n }\n } else if ((federation.bridges?.length ?? 0) > 0) {\n prompter.note(\n c.dim(\n `federation · ${federation.members.length} member(s) · ${federation.bridges!.length} bridge edge(s) (discovery)`,\n ),\n );\n }\n\n // Model Execution Profile: provider/model heuristics + code.json overrides.\n let modelProfile = mergeModelExecutionProfile(\n resolveModelExecutionProfile({\n providerId: sel.providerSlug,\n model: sel.model,\n budget: opts.budget ? Number(opts.budget) : undefined,\n maxRepairRounds: opts.verify?.maxRounds,\n securityTier: opts.securityTier,\n }),\n opts.modelProfile,\n );\n\n // Security ladder (ADR-002): explicit flag > MEP > --auto → L1 > L0.\n // Writable roots include every federation member so multi-root sessions can\n // write into sibling workspace folders under L1/L2 isolation.\n const securityTier: SecurityTier =\n opts.securityTier ?? modelProfile.securityTier ?? (opts.auto ? 'L1' : 'L0');\n const writableRoots = federation?.members.map((m) => m.root) ?? [root];\n const executionEnv = resolveExecutionEnv(securityTier, { writableRoots });\n\n const cleanup = (): void => {\n void runtime.dispose();\n void mcp?.dispose();\n };\n process.once('SIGINT', cleanup);\n\n const autoNote = opts.auto ? c.yellow(' · auto-approve ON') : '';\n const runtimeNote = runtime.kind !== 'none' ? c.dim(` · ${runtime.label}`) : '';\n const securityNote = c.dim(` · ${executionEnv.tier}/${executionEnv.label}`);\n const mepNote = c.dim(` · mep ${modelProfile.mode}`);\n prompter.intro(`Ready — ${sel.providerSlug}/${sel.model}${runtimeNote}${securityNote}${mepNote}${autoNote}. Describe a task, or /help. Empty line to exit.`);\n\n try {\n for (;;) {\n const line = (await prompter.input('code ›')).trim();\n if (!line || /^(exit|quit)$/i.test(line) || line === '/exit' || line === '/quit') break;\n\n if (line.startsWith('/')) {\n const [cmd] = line.slice(1).split(/\\s+/);\n if (cmd === 'help') {\n prompter.note('commands: /undo /diff /model /cost /compact /clear /exit');\n } else if (cmd === 'undo') {\n if (lastChanges.length === 0) prompter.note(c.dim('nothing to undo'));\n else {\n const restored = undoChanges(lastChanges, fsImpl);\n prompter.note(c.green(`↩ reverted ${restored.length} file(s): ${restored.join(', ')}`));\n lastChanges = [];\n store = { ...store, lastChanges: [] };\n saveSession(root, store);\n }\n } else if (cmd === 'diff') {\n if (lastChanges.length === 0) prompter.note(c.dim('no recent change'));\n else for (const ch of lastChanges) if (ch.diff) out(ch.diff);\n } else if (cmd === 'model') {\n const swapped = await reselectModel(root, global, prompter);\n if (swapped) {\n sel = swapped;\n route = resolveProviders({\n provider: sel.provider,\n model: sel.model,\n local: sel.kind === 'local' || global.local,\n consent: true,\n });\n prompter.note(c.green(`now using ${sel.providerSlug}/${sel.model}`));\n }\n } else if (cmd === 'cost') {\n prompter.note(`this session: ${meter.summary()}`);\n printCost(root);\n } else if (cmd === 'compact') {\n if (store.tasks.length <= 1) prompter.note(c.dim('nothing to compact yet'));\n else {\n const before = store.tasks.length;\n store = condenseSession(store, Date.now());\n saveSession(root, store);\n priorSummary = summarizeSession(store) || undefined;\n prompter.note(c.green(`compacted ${before} task(s) into one checkpoint — future turns carry the short recap`));\n }\n } else if (cmd === 'clear') {\n prompter.note(c.dim('each task already starts fresh — nothing to clear'));\n } else {\n prompter.note(c.yellow(`unknown command /${cmd} — try /help`));\n }\n continue;\n }\n\n const branchLoad = branchGraphs.ensureCurrent();\n const graph = branchLoad.graph;\n graphHolder.current = graph;\n if (!graph) {\n prompter.note(c.red('the code map disappeared — run `vg` to rebuild'));\n break;\n }\n if (branchLoad.switched) {\n prompter.note(\n c.dim(\n `branch · ${branchLoad.gitRef}${branchLoad.fromCache ? ' (warm cache)' : ' (loaded map)'}`,\n ),\n );\n }\n // Share warm slot with a running vgd (local process or long-lived daemon).\n if (runtime.socketPath && graph && branchLoad.gitRef && branchLoad.gitRef !== 'unknown') {\n void vgdRequest(\n {\n op: 'put-graph',\n repositoryId: branchLoad.repositoryId,\n gitRef: branchLoad.gitRef,\n graph,\n },\n { socketPath: runtime.socketPath },\n ).catch(() => {\n /* best-effort IPC */\n });\n }\n // Prefer vgd ActiveGraph for search/impact when the daemon holds this slot.\n const graphBackend = resolveGraphBackend({\n graph,\n repositoryId: branchLoad.repositoryId,\n gitRef: branchLoad.gitRef !== 'unknown' ? branchLoad.gitRef : null,\n socketPath: runtime.socketPath,\n });\n // Refresh MEP if the user swapped models mid-session.\n modelProfile = mergeModelExecutionProfile(\n resolveModelExecutionProfile({\n providerId: sel.providerSlug,\n model: sel.model,\n budget: opts.budget ? Number(opts.budget) : undefined,\n maxRepairRounds: opts.verify?.maxRounds,\n securityTier,\n }),\n opts.modelProfile,\n );\n const result = await agentTask({\n root,\n graph,\n instruction: line,\n providers: route.providers,\n fsImpl,\n attribution: { client: 'vg-code', provider: sel.providerSlug, model: sel.model },\n auto: !!opts.auto,\n maxSteps: opts.maxSteps,\n budget: modelProfile.capsuleBudgetTokens,\n denyCommands: opts.denyCommands,\n testCommand: opts.testCommand,\n contextBudget: opts.contextBudget,\n stream: opts.stream,\n verify: opts.verify\n ? { ...opts.verify, maxRounds: opts.verify.maxRounds ?? modelProfile.maxRepairRounds }\n : undefined,\n priorSummary,\n // Conversation carry-over for capsule seed ranking: the previous\n // task's instruction keeps follow-up asks anchored to the topic.\n priorInstruction: store.tasks.at(-1)?.instruction,\n externalTools: externalToolsMerged,\n meter,\n prompter,\n capsule: opts.capsule,\n executionEnv,\n graphBackend,\n modelProfile,\n extraPinnedFacts,\n llmCompaction: true,\n });\n priorSummary = undefined; // recap only seeds the first task after --continue\n if (result.changes.length) {\n lastChanges = result.changes;\n prompter.note(c.dim(' /undo to revert · /diff to review'));\n }\n // Persist the session after each task so --continue and /undo survive a restart.\n store = recordTask(store, { instruction: line, summary: result.finalText, changes: result.changes, stopped: result.stopped }, Date.now());\n saveSession(root, store);\n }\n } finally {\n cleanup();\n process.removeListener('SIGINT', cleanup);\n }\n prompter.outro('Done.');\n}\n\n/** Approval gate closure for MCP tools (mirrors agentTask's gate). */\nfunction agentApprove(opts: InteractiveOptions, prompter: Prompter): (a: MutatingAction) => Promise<boolean> {\n return async (action) => {\n if (opts.auto) return true;\n if (action.kind === 'tool') return prompter.confirm(`Call ${action.name}?`, false);\n if (action.kind === 'patch') {\n const n = action.files.length;\n const names = action.files\n .slice(0, 6)\n .map((f) => f.file)\n .join(', ');\n const more = n > 6 ? ` (+${n - 6} more)` : '';\n return prompter.confirm(`Apply patch to ${n} file(s): ${names}${more}?`, false);\n }\n return true;\n };\n}\n\n/** Bind an McpToolset to the agent's externalTools shape. */\nfunction mcpExternalTools(mcp: McpToolset, approve: (a: MutatingAction) => Promise<boolean>): AgentOptions['externalTools'] {\n return { specs: mcp.specs(), owns: (name) => mcp.owns(name), execute: (call) => mcp.execute(call, approve) };\n}\n\n/** A time-free-ish session id (runtime randomness is fine — not a graph artifact). */\nfunction sessionId(): string {\n let s = '';\n const alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789';\n for (let i = 0; i < 10; i++) s += alphabet[Math.floor(Math.random() * alphabet.length)];\n return s;\n}\n\n/** Re-run the provider/model wizard mid-session (the `/model` command). */\nasync function reselectModel(root: string, global: GlobalOpts, prompter: Prompter): Promise<WizardResult | null> {\n try {\n const sp = prompter.spinner('Loading the model catalog…');\n const catalog = await fetchCatalog({ offline: global.local });\n sp.stop('Model catalog loaded');\n const selection = await runProviderWizard(prompter, { catalog, localModels: discoverModels() });\n if (selection.kind === 'local' && selection.needsPull) {\n const ok = await preflightAndPull(selection, prompter);\n if (!ok) return null;\n }\n return selection;\n } catch (e) {\n if (e instanceof PromptCancelled) return null;\n prompter.note(c.yellow(`couldn't switch model: ${(e as Error).message}`));\n return null;\n }\n}\n\n/** Print the local per-model savings for `/cost`. */\nfunction printCost(root: string): void {\n const now = Date.now();\n const models = readModelSavings(root, 30, now);\n if (models.length === 0) {\n info(c.dim(' no usage recorded yet this session'));\n return;\n }\n info(c.bold(' savings by model (last 30 days, local)'));\n for (const m of models) info(` ${m.key.padEnd(32)} ${m.queries} call(s) · ~${m.vgTokens} tokens · saved ≈ $${m.saved}`);\n}\n\n/**\n * Run one agentic task and render it to the terminal. Shared by the guided REPL\n * and the one-shot command. Read-only tools stream as dim status lines; each\n * mutating tool (edit / create / delete / run) is gated — auto-approved under\n * `--auto`, otherwise confirmed by the developer (with the diff or command shown).\n */\nexport async function agentTask(params: {\n root: string;\n graph: import('../schema.js').VgGraph;\n instruction: string;\n providers: Provider[];\n fsImpl: ReturnType<typeof nodeCodeFs>;\n attribution: { client: string; provider?: string; model?: string };\n auto: boolean;\n maxSteps?: number;\n budget?: number;\n contextBudget?: number;\n denyCommands?: string[];\n testCommand?: string;\n stream?: boolean;\n verify?: { command: string; maxRounds?: number };\n priorSummary?: string;\n priorInstruction?: string;\n externalTools?: AgentOptions['externalTools'];\n meter?: SessionMeter;\n prompter?: Prompter;\n /** Prefer source-bearing Task Capsule context (Fusion Runtime A/B). */\n capsule?: boolean;\n files?: string[];\n /** Security ladder substrate (ADR-002). */\n executionEnv?: AgentOptions['executionEnv'];\n graphBackend?: AgentOptions['graphBackend'];\n modelProfile?: AgentOptions['modelProfile'];\n advancedMode?: boolean;\n worktreeOverlay?: boolean;\n extraPinnedFacts?: string[];\n /** Model-written checkpoint summaries on compaction (real-model hosts). */\n llmCompaction?: boolean;\n}): Promise<AgentResult> {\n const { prompter } = params;\n const approve = async (action: MutatingAction): Promise<boolean> => {\n if (params.auto) return true;\n if (!prompter) return false; // non-interactive without --auto: refuse mutations\n switch (action.kind) {\n case 'edit':\n out(action.diff);\n return prompter.confirm(`Apply edit to ${action.file}?`, true);\n case 'create':\n return prompter.confirm(`Create ${action.file} (${action.bytes} bytes)?`, true);\n case 'delete':\n return prompter.confirm(`Delete ${action.file}?`, false);\n case 'run':\n return prompter.confirm(`Run \\`${action.command}\\`?`, false);\n case 'tool':\n return prompter.confirm(`Call ${action.name}(${briefArgs(action.args)})?`, false);\n case 'patch': {\n const n = action.files.length;\n for (const f of action.files) {\n if (f.diff) out(f.diff);\n else out(`${f.op} ${f.file}`);\n }\n const names = action.files\n .slice(0, 6)\n .map((f) => f.file)\n .join(', ');\n const more = n > 6 ? ` (+${n - 6} more)` : '';\n return prompter.confirm(`Apply patch to ${n} file(s): ${names}${more}?`, false);\n }\n }\n };\n\n // Event rendering, with live token streaming: raw tokens print inline; any\n // other event first closes the streamed line so the layout stays clean.\n let streaming = false;\n const closeStream = (): void => {\n if (streaming) {\n process.stderr.write('\\n');\n streaming = false;\n }\n };\n const onEvent = (e: AgentEvent): void => {\n if (e.type === 'token') {\n process.stderr.write(e.text);\n streaming = true;\n return;\n }\n closeStream();\n if (e.type === 'assistant') {\n if (e.text.trim()) info(e.text.trim());\n } else if (e.type === 'tool-call') {\n info(c.dim(` → ${e.name}(${briefArgs(e.args)})`));\n } else if (e.type === 'tool-result') {\n info(c.dim(` ${e.mutated ? c.green('✔ ') : ''}${e.content.split('\\n')[0].slice(0, 100)}`));\n } else if (e.type === 'compact') {\n info(c.dim(` · compacted context (${e.droppedRounds} earlier round(s) summarized)`));\n } else if (e.type === 'verify') {\n info(e.passed ? c.green(` ✔ ${e.command} passed`) : c.yellow(` ✗ ${e.command} failed — asking the model to fix it`));\n } else if (e.type === 'ladder') {\n info(e.ok ? c.green(' ✔ verification ladder passed') : c.yellow(' ✗ verification ladder failed — asking the model to fix it'));\n if (!e.ok && e.summary.trim()) {\n for (const line of e.summary.split('\\n').slice(0, 6)) info(c.dim(` ${line}`));\n }\n } else if (e.type === 'notice') {\n info(c.dim(` · ${e.text}`));\n } else if (e.type === 'session-graph') {\n info(c.dim(` · session graph updated (${e.reparsed} reparsed, ${e.dirty} dirty)`));\n } else if (e.type === 'capsule') {\n info(c.dim(` · Task Capsule · ${e.summary.primary.length} primary · ${e.summary.sourceSliceCount} source slice(s) · ~${e.summary.tokensEstimate} tokens`));\n } else if (e.type === 'failure-capsule') {\n info(c.yellow(` · Failure Capsule · ${e.capsule.failedStep.type}${e.capsule.failedStep.command ? ` · ${e.capsule.failedStep.command}` : ''}`));\n } else if (e.type === 'metrics') {\n const m = e.metrics;\n info(c.dim(` · metrics · discovery ${m.discoveryToolCalls} · mutations ${m.mutationToolCalls}${m.znsAt1 ? ' · ZNS@1' : ''}`));\n }\n };\n\n const result = await runAgent({\n graph: params.graph,\n root: params.root,\n instruction: params.instruction,\n providers: params.providers,\n fsImpl: params.fsImpl,\n run: shellRunner(params.root),\n streamShell: !params.executionEnv,\n allowSubagents: true,\n executionEnv: params.executionEnv,\n graphBackend: params.graphBackend,\n modelProfile: params.modelProfile,\n advancedMode: params.advancedMode,\n // Interactive sessions always prefer a worktree-correct map unless disabled.\n worktreeOverlay: params.worktreeOverlay ?? true,\n extraPinnedFacts: params.extraPinnedFacts,\n approve,\n onEvent,\n attribution: params.attribution,\n maxSteps: params.maxSteps,\n budget: params.budget,\n contextBudget: params.contextBudget,\n auto: params.auto,\n denyCommands: params.denyCommands,\n testCommand: params.testCommand,\n stream: params.stream,\n verify: params.verify,\n priorSummary: params.priorSummary,\n priorInstruction: params.priorInstruction,\n externalTools: params.externalTools,\n capsule: params.capsule,\n files: params.files,\n llmCompaction: params.llmCompaction,\n now: () => Date.now(),\n });\n closeStream();\n\n const perTask = params.meter?.add(result.usage);\n const summary = summarizeDiffs(result.changes.map((ch) => ({ file: ch.file, diff: ch.diff })));\n info('');\n info(\n result.stopped === 'finished'\n ? c.green(`✔ ${result.finalText}`)\n : result.stopped === 'max-steps'\n ? c.yellow(`stopped at the step limit — ${result.changes.length} change(s) so far`)\n : c.dim(result.finalText),\n );\n const meterNote = perTask !== undefined ? ` · ${params.meter!.summary()}` : '';\n if (result.changes.length || perTask) info(c.dim(` ${summary} · via ${result.provider.id}/${result.provider.model}${result.provider.fellBack ? ' (fell back)' : ''}${meterNote}`));\n return result;\n}\n\nfunction briefArgs(args: Record<string, unknown>): string {\n const parts: string[] = [];\n for (const [k, v] of Object.entries(args)) {\n const s = typeof v === 'string' ? v : JSON.stringify(v);\n parts.push(`${k}: ${s.length > 40 ? s.slice(0, 40) + '…' : s}`);\n if (parts.length >= 2) break;\n }\n return parts.join(', ');\n}\n\n/** A shell runner for the agent's run_command tool, scoped to the repo root. */\nfunction shellRunner(root: string): (command: string) => ShellResult | Promise<ShellResult> {\n // Prefer async streaming when streamShell is enabled on the agent options;\n // this sync wrapper remains for callers that do not set streamShell.\n return (command: string) => {\n const res = spawnSync(command, { cwd: root, shell: true, encoding: 'utf8', timeout: 120_000, maxBuffer: 10 * 1024 * 1024 });\n const stdout = (res.stdout ?? '') + (res.stderr ? `\\n${res.stderr}` : '');\n return { stdout, exitCode: res.status ?? 1 };\n };\n}\n"]}
@@ -1,10 +0,0 @@
1
- export { loadGraph } from './chunk-WQLZSVNF.js';
2
- import './chunk-2U37PFB2.js';
3
- import './chunk-75LJM5XD.js';
4
- import './chunk-2H2U3DC7.js';
5
- import './chunk-BWPBB45M.js';
6
- import './chunk-JFGYT6BI.js';
7
- import './chunk-BPF3YX2U.js';
8
- import './chunk-Z6ZWNWWR.js';
9
- //# sourceMappingURL=load-64RK5O6C.js.map
10
- //# sourceMappingURL=load-64RK5O6C.js.map
@@ -1,6 +0,0 @@
1
- export { gatherSystemMemory, hasOllama, pullModelClean, stopModel } from './chunk-OWSFZQOP.js';
2
- import './chunk-7N4Y3E47.js';
3
- import './chunk-3LSG7Z4I.js';
4
- import './chunk-Z6ZWNWWR.js';
5
- //# sourceMappingURL=local-runtime-2ED33KK6.js.map
6
- //# sourceMappingURL=local-runtime-2ED33KK6.js.map
@@ -1,10 +0,0 @@
1
- export { ensureManagerRuntime, formatManagerBadgeLine, managerBadge, managerFromProviderId } from './chunk-WHJMS7XC.js';
2
- import './chunk-REIGWTTH.js';
3
- import './chunk-OV4KGXPD.js';
4
- import './chunk-3LSG7Z4I.js';
5
- import './chunk-BWPBB45M.js';
6
- import './chunk-JFGYT6BI.js';
7
- import './chunk-BPF3YX2U.js';
8
- import './chunk-Z6ZWNWWR.js';
9
- //# sourceMappingURL=model-manager-GJ2YSTSK.js.map
10
- //# sourceMappingURL=model-manager-GJ2YSTSK.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/code/run-outcome.ts"],"names":[],"mappings":"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","file":"run-outcome-6QNQIHPV.js","sourcesContent":["/**\n * `vibgrate.run-outcome/1` — the local, append-only record of what a `vg code`\n * run did: what was proposed, what the human decided, and how the run ended.\n *\n * CORRECTION (2026-07-30, maintainer): this module was originally justified by\n * two future consumers — the verify loop and \"Relay routing telemetry\" (using\n * edit-acceptance data to auto-pick a model per request). The second is now\n * confirmed void: Relay never re-picks a model — the user (or their chosen\n * Code Mode) selects one model for the whole session, and that has never been\n * a requirement for any product in this space. The verify loop, meanwhile, is\n * shipped separately via the extension's LSP round-trip and never depended on\n * this schema. See `docs/VG-RUN-OUTCOME-EVENTS-SPEC.md` for the full record —\n * **this producer currently has no live or committed consumer.**\n *\n * This module only produces; nothing reads or transmits the file yet, and\n * nothing here changes `vg code`'s stdout NDJSON protocol — it is a silent\n * observer wired at the `--stream-json` call site in `commands/code.ts`, built\n * and unit-tested independent of any process, model, or socket, the same way\n * `stream-json.ts` is.\n *\n * Privacy (spec's hard rule): no event carries source code, diffs, file\n * contents, prompts, or file paths. Instructions become a salted hash only;\n * files become a language/kind classification only.\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { createHash, randomUUID } from 'node:crypto';\nimport { installId } from '../engine/stats-share.js';\nimport { ensureVibgrateGitignore } from '../engine/artifacts.js';\nimport { repositoryIdFromRoot } from '../runtime/paths.js';\nimport type { MutatingAction, PatchFileAction } from './tools.js';\nimport type { AgentResult } from './agent.js';\nimport type { StreamJsonOut } from './stream-json.js';\n\nexport const RUN_OUTCOME_SCHEMA = 'vibgrate.run-outcome/1';\n\nexport type InstructionKind = 'upgrade' | 'fix-vuln' | 'refactor' | 'feature' | 'other';\nexport type EditKind = 'code' | 'manifest' | 'lockfile' | 'config' | 'docs' | 'test';\nexport type EditDecision = 'approved' | 'rejected' | 'auto-approved';\nexport type RunOutcome = 'done' | 'error' | 'cancelled';\n\ninterface Envelope {\n schema: typeof RUN_OUTCOME_SCHEMA;\n runId: string;\n ts: string;\n repoId: string;\n gitRef: string | null;\n route: { mode?: string; provider?: string; model?: string };\n securityTier: string;\n}\n\nexport type RunOutcomeEvent =\n | (Envelope & {\n event: 'run_started';\n instructionHash: string;\n instructionKind: InstructionKind;\n /** Absent (never 0/null-as-zero) — this producer does not trigger a rescan. */\n baseline: { driftScore: number | null; scoreMode: 'verified' | 'estimated' | null; advisories: number | null };\n })\n | (Envelope & {\n event: 'edit_proposed';\n editId: string;\n language: string | null;\n linesAdded: number;\n linesRemoved: number;\n kind: EditKind;\n })\n | (Envelope & { event: 'edit_decision'; editId: string; decision: EditDecision; latencyMs: number })\n | (Envelope & {\n event: 'run_completed';\n outcome: RunOutcome;\n edits: { proposed: number; approved: number; rejected: number; autoApproved: number };\n /** Same reasoning as `baseline` — this producer never triggers a rescan. */\n verify: null;\n /**\n * Last verify-step (the project's configured test/build command) result\n * observed this run. `null` = no verify step ran, never a false pass.\n */\n verifyOk: boolean | null;\n tokens: { input: number; output: number } | null;\n });\n\nexport interface RunOutcomeRoute {\n mode?: string;\n provider?: string;\n model?: string;\n}\n\nfunction hash(saltValue: string, value: string): string {\n return createHash('sha256').update(`${saltValue}|${value}`).digest('hex');\n}\n\n/**\n * Best-effort, best-guess classification of an instruction's purpose. A\n * heuristic, not a model call — good enough for routing-signal aggregation,\n * not claimed as precise. `fromFinding` is set when the instruction was\n * composed by \"Fix →\" (routeFix.ts), which already know their own\n * kind and skip guessing.\n */\nexport function classifyInstructionKind(\n instruction: string,\n fromFinding?: 'upgrade' | 'fix-vuln',\n): InstructionKind {\n if (fromFinding) return fromFinding;\n const s = instruction.toLowerCase();\n if (/\\bupgrade\\b/.test(s) || /\\bfrom\\s+\\S+\\s+to\\s+\\S+/.test(s)) return 'upgrade';\n if (/\\b(cve|vulnerab|advisor|security fix|exploit)\\b/.test(s)) return 'fix-vuln';\n if (/\\brefactor\\b/.test(s)) return 'refactor';\n if (/\\b(add|implement|build|create|feature)\\b/.test(s)) return 'feature';\n return 'other';\n}\n\nconst MANIFEST_BASENAMES = new Set([\n 'package.json', 'go.mod', 'cargo.toml', 'pyproject.toml', 'requirements.txt',\n 'gemfile', 'composer.json', 'pom.xml', 'build.gradle', 'build.gradle.kts',\n 'pubspec.yaml', 'mix.exs',\n]);\nconst LOCKFILE_BASENAMES = new Set([\n 'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'cargo.lock', 'poetry.lock',\n 'gemfile.lock', 'composer.lock', 'go.sum', 'pubspec.lock', 'mix.lock',\n]);\nconst MANIFEST_EXTS = new Set(['.csproj', '.fsproj', '.vbproj']);\n\n/** Coarse per-file classification for `edit_proposed.kind` — filename-only, no content read. */\nexport function classifyEditKind(file: string): EditKind {\n const base = path.basename(file).toLowerCase();\n const ext = path.extname(base);\n if (MANIFEST_BASENAMES.has(base) || MANIFEST_EXTS.has(ext)) return 'manifest';\n if (LOCKFILE_BASENAMES.has(base)) return 'lockfile';\n if (ext === '.md' || ext === '.mdx' || file.split(/[\\\\/]/).includes('docs')) return 'docs';\n if (/\\.(test|spec)\\.[^.]+$/.test(base) || /(^|[\\\\/])(__tests__|tests|test|spec)([\\\\/]|$)/.test(file)) return 'test';\n if (base.startsWith('.') || /\\.config\\.[^.]+$/.test(base) || /\\.(ya?ml|toml|ini|env)$/.test(base)) return 'config';\n return 'code';\n}\n\n/** Language/extension label only — never a path. Empty extension → null. */\nfunction languageOf(file: string): string | null {\n const ext = path.extname(file).replace(/^\\./, '');\n return ext || null;\n}\n\n/** Count `+`/`-` content lines in a unified diff (excludes `+++`/`---` headers). */\nfunction diffLineCounts(diff: string): { added: number; removed: number } {\n let added = 0;\n let removed = 0;\n for (const line of diff.split('\\n')) {\n if (line.startsWith('+++') || line.startsWith('---')) continue;\n if (line.startsWith('+')) added++;\n else if (line.startsWith('-')) removed++;\n }\n return { added, removed };\n}\n\ninterface EditShape {\n language: string | null;\n linesAdded: number;\n linesRemoved: number;\n kind: EditKind;\n}\n\n/** Derive the `edit_proposed` shape from a `MutatingAction`, or null for non-edit actions (`run`/`tool`). */\nexport function shapeOfAction(action: MutatingAction): EditShape | null {\n switch (action.kind) {\n case 'edit': {\n const { added, removed } = diffLineCounts(action.diff);\n return { language: languageOf(action.file), linesAdded: added, linesRemoved: removed, kind: classifyEditKind(action.file) };\n }\n case 'create':\n return { language: languageOf(action.file), linesAdded: 0, linesRemoved: 0, kind: classifyEditKind(action.file) };\n case 'delete':\n return { language: languageOf(action.file), linesAdded: 0, linesRemoved: 0, kind: classifyEditKind(action.file) };\n case 'patch': {\n let added = 0;\n let removed = 0;\n const kinds = new Set<EditKind>();\n for (const f of action.files as PatchFileAction[]) {\n if (f.diff) {\n const c = diffLineCounts(f.diff);\n added += c.added;\n removed += c.removed;\n }\n kinds.add(classifyEditKind(f.file));\n }\n return { language: null, linesAdded: added, linesRemoved: removed, kind: kinds.size === 1 ? [...kinds][0]! : 'code' };\n }\n case 'run':\n case 'tool':\n return null; // not a file edit — out of scope for this schema\n }\n}\n\nfunction outcomeDir(root: string): string {\n return path.join(root, '.vibgrate');\n}\n\nfunction outcomePath(root: string): string {\n return path.join(outcomeDir(root), 'run-outcomes.jsonl');\n}\n\n/** Best-effort append — a read-only checkout just means no local record, never a thrown error. */\nfunction append(root: string, event: RunOutcomeEvent): void {\n try {\n fs.mkdirSync(outcomeDir(root), { recursive: true });\n // First writer into .vibgrate/ in this repo creates its .gitignore (create-once,\n // never overwritten) — protects this file even when `vg code` runs before any\n // `vg scan`/`vg build`/`vg install` has touched the repo.\n ensureVibgrateGitignore(root);\n fs.appendFileSync(outcomePath(root), `${JSON.stringify(event)}\\n`);\n } catch {\n /* best-effort only */\n }\n}\n\ninterface PendingEdit {\n runId: string;\n shape: EditShape;\n proposedAt: number;\n}\n\ninterface RunTally {\n proposed: number;\n approved: number;\n rejected: number;\n autoApproved: number;\n lastVerifyOk: boolean | null;\n}\n\n/**\n * Observes the same `StreamJsonOut` lines already flowing to the host over\n * stdout/stdin (via a transparent tee — see `wireRunOutcome`) and turns them\n * into the envelope above. One instance per `vg code` process; `beginRun` is\n * called once per turn (once for a one-shot run, once per turn in session\n * mode), so `runId` scoping is the caller's — this class never invents one.\n */\nexport class RunOutcomeRecorder {\n private currentRunId: string | null = null;\n private readonly tallies = new Map<string, RunTally>();\n private readonly pending = new Map<number, PendingEdit>();\n\n constructor(\n private readonly root: string,\n private readonly repoId: string,\n private readonly gitRef: string | null,\n private readonly route: RunOutcomeRoute,\n private readonly securityTier: string,\n private readonly auto: boolean,\n private readonly now: () => number = Date.now,\n /**\n * Salt for `instructionHash`. Defaults to the real per-install id\n * ({@link installId}) in production; tests should pass a fixed string so\n * they never touch the real machine's `~/.vibgrate/install-id`.\n */\n private readonly saltValue: string = installId(),\n ) {}\n\n private envelope(runId: string): Envelope {\n return {\n schema: RUN_OUTCOME_SCHEMA,\n runId,\n ts: new Date(this.now()).toISOString(),\n repoId: this.repoId,\n gitRef: this.gitRef,\n route: this.route,\n securityTier: this.securityTier,\n };\n }\n\n /** Start recording a new run/turn. Call before the instruction is handed to the agent. */\n beginRun(runId: string, instruction: string, fromFinding?: 'upgrade' | 'fix-vuln'): void {\n this.currentRunId = runId;\n this.tallies.set(runId, { proposed: 0, approved: 0, rejected: 0, autoApproved: 0, lastVerifyOk: null });\n append(this.root, {\n ...this.envelope(runId),\n event: 'run_started',\n instructionHash: hash(this.saltValue, instruction),\n instructionKind: classifyInstructionKind(instruction, fromFinding),\n baseline: { driftScore: null, scoreMode: null, advisories: null },\n });\n }\n\n /**\n * Feed one outgoing protocol line. Transparent — never mutates or drops\n * the line; the caller still writes it to the host exactly as before.\n */\n observe(line: StreamJsonOut): void {\n const runId = this.currentRunId;\n if (!runId) return;\n const tally = this.tallies.get(runId);\n if (!tally) return;\n\n if (line.event === 'approve-request') {\n const shape = shapeOfAction(line.action);\n if (!shape) return; // run/tool — not a file edit\n tally.proposed++;\n const editId = randomUUID();\n this.pending.set(line.id, { runId, shape, proposedAt: this.now() });\n append(this.root, { ...this.envelope(runId), event: 'edit_proposed', editId, ...shape });\n // Auto-approve resolves synchronously in StreamJsonSession before any\n // host round-trip — record that decision now; no host message arrives.\n if (this.auto) {\n tally.autoApproved++;\n append(this.root, { ...this.envelope(runId), event: 'edit_decision', editId, decision: 'auto-approved', latencyMs: 0 });\n this.pending.delete(line.id);\n } else {\n // Stash the editId against the wire id so `noteDecision` can find it.\n this.editIdByApproveId.set(line.id, editId);\n }\n return;\n }\n\n if (line.event === 'event' && line.type === 'verify') {\n tally.lastVerifyOk = line.passed;\n return;\n }\n\n if (line.event === 'done') {\n this.finish(runId, tally, 'done', line.result);\n return;\n }\n if (line.event === 'error') {\n this.finish(runId, tally, 'error', null);\n }\n }\n\n private readonly editIdByApproveId = new Map<number, string>();\n\n /**\n * A real (non-auto) approve/reject arrived from the host over stdin. `id`\n * is the same numeric id `StreamJsonSession` put on the `approve-request`\n * line — the natural join key, already unique for the process lifetime.\n */\n noteDecision(approveId: number, approved: boolean): void {\n const editId = this.editIdByApproveId.get(approveId);\n const pending = this.pending.get(approveId);\n if (!editId || !pending) return;\n this.editIdByApproveId.delete(approveId);\n this.pending.delete(approveId);\n const tally = this.tallies.get(pending.runId);\n if (tally) approved ? tally.approved++ : tally.rejected++;\n append(this.root, {\n ...this.envelope(pending.runId),\n event: 'edit_decision',\n editId,\n decision: approved ? 'approved' : 'rejected',\n latencyMs: Math.max(0, this.now() - pending.proposedAt),\n });\n }\n\n /** The host disconnected / turn was cancelled mid-approval — reject what's left, no hang. */\n cancelPending(): void {\n for (const id of [...this.pending.keys()]) this.noteDecision(id, false);\n }\n\n private finish(runId: string, tally: RunTally, outcome: RunOutcome, result: AgentResult | null): void {\n append(this.root, {\n ...this.envelope(runId),\n event: 'run_completed',\n outcome,\n edits: { proposed: tally.proposed, approved: tally.approved, rejected: tally.rejected, autoApproved: tally.autoApproved },\n verify: null,\n verifyOk: tally.lastVerifyOk,\n tokens: result ? { input: result.usage.promptTokens, output: result.usage.completionTokens } : null,\n });\n this.tallies.delete(runId);\n if (this.currentRunId === runId) this.currentRunId = null;\n }\n}\n\n/** Mint a runId for a one-shot `vg code` invocation (no session). */\nexport function newOneShotRunId(): string {\n return `r${randomUUID()}`;\n}\n\n/** Mint a runId for one turn of a `--session` run. */\nexport function turnRunId(sessionId: string, turnIndex: number): string {\n return `${sessionId}#${turnIndex}`;\n}\n\nexport { repositoryIdFromRoot as runOutcomeRepoId };\n"]}
@@ -1,21 +0,0 @@
1
- export { startCodeRuntimeSession } from './chunk-FOW5IF73.js';
2
- import './chunk-NKFXXP6W.js';
3
- import './chunk-IS7VTH2Q.js';
4
- import './chunk-3LOWJSAF.js';
5
- import './chunk-RBIRXQR6.js';
6
- import './chunk-5HYCB55P.js';
7
- import './chunk-IZDH67DX.js';
8
- import './chunk-J7LKEB2R.js';
9
- import './chunk-KGPX4EUN.js';
10
- import './chunk-WQLZSVNF.js';
11
- import './chunk-5I4VSBWQ.js';
12
- import './chunk-X76VPOYH.js';
13
- import './chunk-2U37PFB2.js';
14
- import './chunk-75LJM5XD.js';
15
- import './chunk-2H2U3DC7.js';
16
- import './chunk-BWPBB45M.js';
17
- import './chunk-JFGYT6BI.js';
18
- import './chunk-BPF3YX2U.js';
19
- import './chunk-Z6ZWNWWR.js';
20
- //# sourceMappingURL=runtime-session-RJHH3KMF.js.map
21
- //# sourceMappingURL=runtime-session-RJHH3KMF.js.map
@@ -1,16 +0,0 @@
1
- export { commitChanges, nodeCodeFs, runCodeSession, undoChanges } from './chunk-YQNTIBKS.js';
2
- import './chunk-N3XFY3PX.js';
3
- import './chunk-REIGWTTH.js';
4
- import './chunk-DSUGC7F5.js';
5
- import './chunk-KGPX4EUN.js';
6
- import './chunk-3LSG7Z4I.js';
7
- import './chunk-X76VPOYH.js';
8
- import './chunk-2U37PFB2.js';
9
- import './chunk-75LJM5XD.js';
10
- import './chunk-2H2U3DC7.js';
11
- import './chunk-BWPBB45M.js';
12
- import './chunk-JFGYT6BI.js';
13
- import './chunk-BPF3YX2U.js';
14
- import './chunk-Z6ZWNWWR.js';
15
- //# sourceMappingURL=session-4BGYASOH.js.map
16
- //# sourceMappingURL=session-4BGYASOH.js.map