@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
@@ -0,0 +1,467 @@
1
+ import { readGlobal, applyGlobalOptions } from './chunk-OZ3IFXRD.js';
2
+ import { json, info, c } from './chunk-CT5BS56U.js';
3
+ import { VGD_PROTOCOL_VERSION, startVgdServer } from './chunk-GOGMS3ST.js';
4
+ import { vgdIsRunning, vgdRequest, vgdSocketPath, vgdPidPath } from './chunk-RBIRXQR6.js';
5
+ import { CliError, ExitCode } from './chunk-MS6V5XKB.js';
6
+ import { loadGraph } from './chunk-3FMRFECC.js';
7
+ import { init_cli_invocation, reinvokeCli } from './chunk-EZ7UC5Y5.js';
8
+ import * as fs from 'fs';
9
+ import * as path2 from 'path';
10
+ import { spawn } from 'child_process';
11
+
12
+ function rootOf(global) {
13
+ return path2.resolve(global.cwd ?? ".");
14
+ }
15
+ function requireGraph(global) {
16
+ const root = rootOf(global);
17
+ const graph = loadGraph(root, global.graph);
18
+ if (!graph) {
19
+ throw new CliError(
20
+ `no map found \u2014 run \`vg\` to build one first` + (global.graph ? ` (looked at ${global.graph})` : ""),
21
+ ExitCode.NOT_FOUND
22
+ );
23
+ }
24
+ return { root, graph };
25
+ }
26
+
27
+ // src/commands/daemon.ts
28
+ init_cli_invocation();
29
+ function registerDaemon(program) {
30
+ const cmd = program.command("daemon").description("local Fusion Runtime daemon (vgd) \u2014 workspace registry prototype").option("--socket <path>", "override the daemon socket path");
31
+ const status = cmd.command("status").description("show whether vgd is running and how many workspaces it tracks").action(async function() {
32
+ const global = readGlobal(this);
33
+ const socketPath = socketOf(this);
34
+ const running = await vgdIsRunning({ socketPath });
35
+ if (!running) {
36
+ if (global.json) {
37
+ json({ running: false, socketPath, version: VGD_PROTOCOL_VERSION });
38
+ } else {
39
+ info(c.dim(`vgd \xB7 not running (${socketPath})`));
40
+ }
41
+ process.exitCode = ExitCode.NOT_FOUND;
42
+ return;
43
+ }
44
+ const res = await vgdRequest({ op: "status" }, { socketPath });
45
+ if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);
46
+ const semantic = await vgdRequest({ op: "embed-status" }, { socketPath }).catch(() => null);
47
+ const semanticPayload = semantic && semantic.ok && "semantic" in semantic ? semantic.semantic : void 0;
48
+ if (global.json) json({ running: true, ...res, semantic: semanticPayload });
49
+ else if ("pid" in res) {
50
+ const slots = typeof res.graphSlots === "number" ? ` \xB7 ${res.graphSlots} graph slot(s)` : "";
51
+ const cli = res.cliVersion ? ` \xB7 cli ${res.cliVersion}` : "";
52
+ info(
53
+ `vgd \xB7 running pid ${res.pid}${cli} \xB7 ${res.workspaces} workspace(s)${slots} \xB7 ${res.uptimeMs}ms up \xB7 ${c.dim(res.socketPath)}`
54
+ );
55
+ if (semanticPayload) {
56
+ const ready = semanticPayload.slots.filter((sl) => sl.state === "ready");
57
+ const vectors = ready.reduce((n, sl) => n + sl.vectors, 0);
58
+ const detail = semanticPayload.worker === "unavailable" ? c.dim(semanticPayload.reason ?? "semantic off \u2014 lexical only") : `${ready.length}/${semanticPayload.slots.length} index(es) ready \xB7 ${vectors} vector(s)` + (semanticPayload.model ? ` \xB7 ${semanticPayload.model}` : "");
59
+ info(` semantic \xB7 worker ${semanticPayload.worker} \xB7 ${detail}`);
60
+ for (const sl of semanticPayload.slots) {
61
+ if (sl.state === "ready") continue;
62
+ info(c.dim(` ${sl.repositoryId}@${sl.gitRef} \xB7 ${sl.state}${sl.error ? ` \u2014 ${sl.error}` : ""}`));
63
+ }
64
+ }
65
+ }
66
+ });
67
+ applyGlobalOptions(status);
68
+ const start = cmd.command("start").description("run vgd in the foreground (Ctrl-C to stop)").action(async function() {
69
+ const global = readGlobal(this);
70
+ const socketPath = socketOf(this);
71
+ if (await vgdIsRunning({ socketPath })) {
72
+ throw new CliError(`vgd is already running at ${socketPath}`, ExitCode.ERROR);
73
+ }
74
+ let requestShutdown = () => {
75
+ };
76
+ const server = await startVgdServer({
77
+ socketPath,
78
+ onShutdownRequest: () => requestShutdown(),
79
+ // Show the daemon working: graph publishes, branch switches, new repos,
80
+ // and every semantic index build. Silent under --quiet/--json.
81
+ log: global.quiet || global.json ? void 0 : (message) => info(c.dim(`vgd \xB7 ${message}`))
82
+ });
83
+ if (!global.quiet) {
84
+ info(`vgd \xB7 listening on ${c.dim(server.socketPath)} (${VGD_PROTOCOL_VERSION})`);
85
+ info(c.dim(" register a workspace: vg daemon register"));
86
+ info(c.dim(" status: vg daemon status"));
87
+ }
88
+ const shutdown = async () => {
89
+ await server.close();
90
+ if (!global.quiet) info(c.dim("vgd \xB7 stopped"));
91
+ process.exit(0);
92
+ };
93
+ requestShutdown = () => void shutdown();
94
+ process.on("SIGINT", () => void shutdown());
95
+ process.on("SIGTERM", () => void shutdown());
96
+ await new Promise(() => {
97
+ });
98
+ });
99
+ applyGlobalOptions(start);
100
+ const ensure = cmd.command("ensure").description("ensure vgd is running (start in background if needed)").action(async function() {
101
+ const global = readGlobal(this);
102
+ const socketPath = socketOf(this);
103
+ const ensured = await ensureVgd(socketPath);
104
+ const res = await vgdRequest({ op: "status" }, { socketPath });
105
+ if (!res.ok) {
106
+ throw new CliError(
107
+ ensured.started ? `vgd started (pid ${ensured.pid ?? "?"}) but status failed: ${res.error} (${socketPath})` : `vgd is running but status failed: ${res.error} (${socketPath})`,
108
+ ExitCode.ERROR
109
+ );
110
+ }
111
+ if (global.json) {
112
+ json({ running: true, ensured: ensured.started, ...res });
113
+ } else if (!global.quiet) {
114
+ const pid = "pid" in res ? res.pid : ensured.pid;
115
+ info(
116
+ ensured.started ? `vgd \xB7 started in background pid ${pid} \xB7 ${c.dim(socketPath)}` : `vgd \xB7 already running pid ${pid} \xB7 ${c.dim(socketPath)}`
117
+ );
118
+ }
119
+ });
120
+ applyGlobalOptions(ensure);
121
+ const stop = cmd.command("stop").description("stop the running vgd (idempotent \u2014 succeeds if none is running)").action(async function() {
122
+ const global = readGlobal(this);
123
+ const socketPath = socketOf(this);
124
+ const result = await stopVgd(socketPath);
125
+ if (global.json) {
126
+ json({ stopped: result === "stopped", result, socketPath });
127
+ } else if (!global.quiet) {
128
+ if (result === "stopped") info(`vgd \xB7 stopped ${c.dim(socketPath)}`);
129
+ else if (result === "not-running") info(c.dim(`vgd \xB7 not running (${socketPath})`));
130
+ }
131
+ if (result === "refused") {
132
+ throw new CliError(
133
+ "this vgd cannot be stopped remotely \u2014 it is running inside another process; stop that process instead",
134
+ ExitCode.ERROR
135
+ );
136
+ }
137
+ if (result === "failed") {
138
+ throw new CliError(
139
+ `vgd did not stop within 5s (${socketPath}) \u2014 check \`vg daemon status\` and stop the process manually`,
140
+ ExitCode.ERROR
141
+ );
142
+ }
143
+ });
144
+ applyGlobalOptions(stop);
145
+ const restart = cmd.command("restart").description("restart vgd (stop if running, then start in the background)").action(async function() {
146
+ const global = readGlobal(this);
147
+ const socketPath = socketOf(this);
148
+ const stopResult = await stopVgd(socketPath);
149
+ if (stopResult === "refused") {
150
+ throw new CliError(
151
+ "this vgd cannot be stopped remotely \u2014 it is running inside another process; stop that process instead",
152
+ ExitCode.ERROR
153
+ );
154
+ }
155
+ if (stopResult === "failed") {
156
+ throw new CliError(
157
+ `vgd did not stop within 5s (${socketPath}) \u2014 check \`vg daemon status\` and stop the process manually`,
158
+ ExitCode.ERROR
159
+ );
160
+ }
161
+ await startDetachedVgd(socketPath);
162
+ const res = await vgdRequest({ op: "status" }, { socketPath });
163
+ if (global.json) {
164
+ json({ running: true, restarted: true, ...res.ok ? res : { socketPath } });
165
+ } else if (!global.quiet) {
166
+ const pid = res.ok && "pid" in res ? res.pid : "?";
167
+ info(`vgd \xB7 restarted pid ${pid} \xB7 ${c.dim(socketPath)}`);
168
+ }
169
+ });
170
+ applyGlobalOptions(restart);
171
+ const register = cmd.command("register").description("register the current repository with a running vgd").argument("[root]", "repository root (default: cwd)").action(async function(rootArg) {
172
+ const global = readGlobal(this);
173
+ const socketPath = socketOf(this);
174
+ const root = path2.resolve(rootArg ?? rootOf(global));
175
+ if (!await vgdIsRunning({ socketPath })) {
176
+ throw new CliError(`vgd is not running \u2014 start it with \`vg daemon start\` (${socketPath})`, ExitCode.NOT_FOUND);
177
+ }
178
+ const res = await vgdRequest({ op: "register", root }, { socketPath });
179
+ if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);
180
+ if (global.json) json(res);
181
+ else if ("workspace" in res) {
182
+ info(`vgd \xB7 registered ${res.workspace.root}`);
183
+ info(c.dim(` id ${res.workspace.id}`));
184
+ info(c.dim(` graph ${res.workspace.graphPath}`));
185
+ }
186
+ });
187
+ applyGlobalOptions(register);
188
+ const list = cmd.command("list").description("list workspaces registered with the running vgd").action(async function() {
189
+ const global = readGlobal(this);
190
+ const socketPath = socketOf(this);
191
+ if (!await vgdIsRunning({ socketPath })) {
192
+ throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);
193
+ }
194
+ const res = await vgdRequest({ op: "list" }, { socketPath });
195
+ if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);
196
+ if (global.json) json(res);
197
+ else if ("workspaces" in res && Array.isArray(res.workspaces)) {
198
+ if (res.workspaces.length === 0) info(c.dim("vgd \xB7 no workspaces registered"));
199
+ for (const w of res.workspaces) {
200
+ const tag = w.label ? ` (${w.label}${w.role ? `/${w.role}` : ""})` : "";
201
+ info(`${w.root}${tag}`);
202
+ info(c.dim(` id ${w.id} \xB7 graph ${w.graphPath}`));
203
+ }
204
+ }
205
+ });
206
+ applyGlobalOptions(list);
207
+ const federation = cmd.command("federation").description("register a multi-root federation from .vibgrate/federation.json (or primary cwd)").argument("[root]", "primary repository root (default: cwd)").action(async function(rootArg) {
208
+ const global = readGlobal(this);
209
+ const socketPath = socketOf(this);
210
+ const primary = path2.resolve(rootArg ?? rootOf(global));
211
+ if (!await vgdIsRunning({ socketPath })) {
212
+ throw new CliError(`vgd is not running \u2014 start it with \`vg daemon start\` (${socketPath})`, ExitCode.NOT_FOUND);
213
+ }
214
+ const { loadFederation } = await import('./federation-MDQPO3PW.js');
215
+ const fed = loadFederation(primary);
216
+ if (!fed) throw new CliError(`could not load federation for ${primary}`, ExitCode.ERROR);
217
+ const res = await vgdRequest(
218
+ {
219
+ op: "register-federation",
220
+ primaryRoot: fed.primaryRoot,
221
+ members: fed.members.map((m) => ({ root: m.root, label: m.label, role: m.role }))
222
+ },
223
+ { socketPath }
224
+ );
225
+ if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);
226
+ if (global.json) json(res);
227
+ else if ("workspaces" in res && Array.isArray(res.workspaces)) {
228
+ info(`vgd \xB7 federation registered (${res.workspaces.length} workspace(s))`);
229
+ for (const w of res.workspaces) {
230
+ info(c.dim(` ${w.label ?? w.root}${w.role ? ` [${w.role}]` : ""}`));
231
+ }
232
+ }
233
+ });
234
+ applyGlobalOptions(federation);
235
+ const publish = cmd.command("publish").description("load the workspace code map into vgd ActiveGraph (from global/legacy store)").argument("[root]", "repository root (default: cwd)").option("--git-ref <ref>", "branch or SHA (default: detect HEAD)").action(async function(rootArg) {
236
+ const global = readGlobal(this);
237
+ const socketPath = socketOf(this);
238
+ const root = path2.resolve(rootArg ?? rootOf(global));
239
+ if (!await vgdIsRunning({ socketPath })) {
240
+ throw new CliError(`vgd is not running \u2014 start it with \`vg daemon ensure\` (${socketPath})`, ExitCode.NOT_FOUND);
241
+ }
242
+ const opts = this.opts();
243
+ const loaded = await vgdRequest(
244
+ { op: "load-graph", root, gitRef: opts.gitRef?.trim() || void 0, graphPath: global.graph },
245
+ { socketPath }
246
+ );
247
+ let put = loaded;
248
+ if (!loaded.ok && loaded.code === "no_map") {
249
+ throw new CliError(loaded.error, ExitCode.NOT_FOUND);
250
+ }
251
+ if (!loaded.ok) {
252
+ const { loadGraph: loadGraph2 } = await import('./load-AYFECIQB.js');
253
+ const { detectGitRef } = await import('./git-ref-RSRAN4OH.js');
254
+ const { repositoryIdFromRoot } = await import('./paths-62AKTFSR.js');
255
+ const graph = loadGraph2(root, global.graph);
256
+ if (!graph) {
257
+ throw new CliError(
258
+ `no code map found for ${root} \u2014 run \`vg build\` (or bare \`vg\`) first`,
259
+ ExitCode.NOT_FOUND
260
+ );
261
+ }
262
+ const reg = await vgdRequest({ op: "register", root }, { socketPath });
263
+ if (!reg.ok) throw new CliError(reg.error, ExitCode.ERROR);
264
+ const git = opts.gitRef?.trim() || detectGitRef(root).ref || "HEAD";
265
+ const repositoryId = reg.ok && "workspace" in reg ? reg.workspace.id : repositoryIdFromRoot(root);
266
+ put = await vgdRequest(
267
+ { op: "put-graph", repositoryId, gitRef: git, graph },
268
+ { socketPath }
269
+ );
270
+ if (!put.ok) throw new CliError(put.error, ExitCode.ERROR);
271
+ }
272
+ if (global.json) json(put);
273
+ else if (put.ok && "stored" in put) {
274
+ info(`vgd \xB7 published graph \xB7 ${put.nodeCount} node(s) \xB7 ref ${put.gitRef}`);
275
+ info(c.dim(` repositoryId ${put.repositoryId}`));
276
+ }
277
+ });
278
+ applyGlobalOptions(publish);
279
+ const query = cmd.command("query").description("query the ActiveGraph held by vgd (lexical/structural)").option("--repository-id <id>", "repository id from `vg daemon list` (default: cwd workspace)").argument("<query...>", "what to find").option("--limit <n>", "max matches", "12").option("--git-ref <ref>", "branch or SHA (default: current slot)").action(async function(queryParts) {
280
+ const global = readGlobal(this);
281
+ const socketPath = socketOf(this);
282
+ const opts = this.opts();
283
+ const q = (queryParts ?? []).join(" ").trim();
284
+ if (!q) throw new CliError("say what to find", ExitCode.USAGE_ERROR);
285
+ if (!await vgdIsRunning({ socketPath })) {
286
+ throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);
287
+ }
288
+ const repositoryId = opts.repositoryId?.trim() || await repositoryIdForCwd(socketPath, rootOf(global));
289
+ const res = await vgdRequest(
290
+ {
291
+ op: "query-graph",
292
+ repositoryId,
293
+ query: q,
294
+ limit: opts.limit ? Number(opts.limit) : 12,
295
+ gitRef: opts.gitRef
296
+ },
297
+ { socketPath }
298
+ );
299
+ if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);
300
+ if (global.json) json(res);
301
+ else if ("matches" in res) {
302
+ info(`vgd query \xB7 ${res.matches.length} match(es) \xB7 ref ${res.gitRef}`);
303
+ for (const m of res.matches) {
304
+ info(`${m.qualifiedName} (${m.kind}) ${m.file}:${m.line}`);
305
+ info(c.dim(` score ${m.score} \xB7 ${m.why}`));
306
+ }
307
+ }
308
+ });
309
+ applyGlobalOptions(query);
310
+ const impact = cmd.command("impact").description("blast radius for a symbol in the vgd ActiveGraph").option("--repository-id <id>", "repository id (default: cwd workspace)").argument("<symbol>", "symbol id or qualified name").option("--depth <n>", "max dependency depth", "4").option("--git-ref <ref>", "branch or SHA").action(async function(symbol) {
311
+ const global = readGlobal(this);
312
+ const socketPath = socketOf(this);
313
+ const opts = this.opts();
314
+ if (!await vgdIsRunning({ socketPath })) {
315
+ throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);
316
+ }
317
+ const repositoryId = opts.repositoryId?.trim() || await repositoryIdForCwd(socketPath, rootOf(global));
318
+ const res = await vgdRequest(
319
+ {
320
+ op: "impact-of",
321
+ repositoryId,
322
+ symbol: symbol.trim(),
323
+ depth: opts.depth ? Number(opts.depth) : 4,
324
+ gitRef: opts.gitRef
325
+ },
326
+ { socketPath }
327
+ );
328
+ if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);
329
+ if (global.json) json(res);
330
+ else if ("affected" in res) {
331
+ info(`vgd impact \xB7 ${res.root.name} \xB7 depth ${res.depth} \xB7 ${res.affected.length} affected`);
332
+ for (const a of res.affected.slice(0, 30)) {
333
+ info(`- ${a.name} (${a.file}:${a.line}) d=${a.depth}`);
334
+ }
335
+ }
336
+ });
337
+ applyGlobalOptions(impact);
338
+ const graphs = cmd.command("graphs").description("list multi-branch ActiveGraph slots resident in the running vgd (Fusion \xA74.1.1)").option("--repository-id <id>", "filter slots to one repository id").action(async function() {
339
+ const global = readGlobal(this);
340
+ const socketPath = socketOf(this);
341
+ const opts = this.opts();
342
+ if (!await vgdIsRunning({ socketPath })) {
343
+ throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);
344
+ }
345
+ const res = await vgdRequest(
346
+ { op: "list-graph-slots", repositoryId: opts.repositoryId },
347
+ { socketPath }
348
+ );
349
+ if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);
350
+ if (global.json) json(res);
351
+ else if ("slots" in res) {
352
+ if (!res.slots.length) info(c.dim("vgd \xB7 no graph slots resident"));
353
+ for (const s of res.slots) {
354
+ const cur = s.current ? c.green(" current") : "";
355
+ const idle = s.evictable ? c.yellow(" idle") : "";
356
+ info(`${s.repositoryId.slice(0, 8)}\u2026 ${s.gitRef}${cur}${idle}`);
357
+ info(c.dim(` nodes ${s.nodeCount} \xB7 idle ${Math.round(s.idleMs / 1e3)}s \xB7 loaded ${new Date(s.loadedAt).toISOString()}`));
358
+ }
359
+ }
360
+ });
361
+ applyGlobalOptions(graphs);
362
+ applyGlobalOptions(cmd);
363
+ }
364
+ function socketOf(cmd) {
365
+ let c2 = cmd;
366
+ while (c2) {
367
+ const opts = c2.opts();
368
+ if (opts.socket) return path2.resolve(opts.socket);
369
+ c2 = c2.parent;
370
+ }
371
+ return vgdSocketPath();
372
+ }
373
+ function spawnDetachedDaemonStart(socketPath) {
374
+ const opts = {
375
+ detached: true,
376
+ stdio: "ignore",
377
+ env: process.env,
378
+ windowsHide: true
379
+ };
380
+ const { command, argv } = reinvokeCli(["daemon", "start", "--socket", socketPath]);
381
+ return spawn(command, argv, opts);
382
+ }
383
+ function sleep(ms) {
384
+ return new Promise((r) => setTimeout(r, ms));
385
+ }
386
+ async function startDetachedVgd(socketPath) {
387
+ const child = spawnDetachedDaemonStart(socketPath);
388
+ child.unref();
389
+ const readyMs = 3e4;
390
+ const deadline = Date.now() + readyMs;
391
+ while (Date.now() < deadline) {
392
+ await sleep(150);
393
+ if (await vgdIsRunning({ socketPath })) return child.pid;
394
+ if (child.exitCode != null && child.exitCode !== 0) {
395
+ if (await vgdIsRunning({ socketPath })) return child.pid;
396
+ throw new CliError(
397
+ `vgd child exited ${child.exitCode} before becoming ready at ${socketPath} \u2014 run "vg daemon start" in the foreground to see the error`,
398
+ ExitCode.ERROR
399
+ );
400
+ }
401
+ }
402
+ throw new CliError(
403
+ `vgd failed to become ready within ${Math.round(readyMs / 1e3)}s at ${socketPath}`,
404
+ ExitCode.ERROR
405
+ );
406
+ }
407
+ async function ensureVgd(socketPath = vgdSocketPath()) {
408
+ if (await vgdIsRunning({ socketPath })) return { started: false };
409
+ const pid = await startDetachedVgd(socketPath);
410
+ return { started: true, pid };
411
+ }
412
+ async function stopVgd(socketPath) {
413
+ if (!await vgdIsRunning({ socketPath })) return "not-running";
414
+ let acknowledged = false;
415
+ try {
416
+ const res = await vgdRequest({ op: "shutdown" }, { socketPath });
417
+ if (res.ok) acknowledged = true;
418
+ else if (res.code === "shutdown_unsupported") return "refused";
419
+ } catch {
420
+ }
421
+ if (!acknowledged) {
422
+ const pid = readVgdPid();
423
+ if (pid == null) return "failed";
424
+ try {
425
+ process.kill(pid, "SIGTERM");
426
+ } catch {
427
+ return "failed";
428
+ }
429
+ }
430
+ const deadline = Date.now() + 5e3;
431
+ while (Date.now() < deadline) {
432
+ await sleep(100);
433
+ if (!await vgdIsRunning({ socketPath })) return "stopped";
434
+ }
435
+ return "failed";
436
+ }
437
+ async function restartVgdIfRunning(socketPath = vgdSocketPath()) {
438
+ try {
439
+ const stopResult = await stopVgd(socketPath);
440
+ if (stopResult === "not-running") return "not-running";
441
+ if (stopResult === "refused") return "refused";
442
+ if (stopResult === "failed") return "failed";
443
+ await startDetachedVgd(socketPath);
444
+ return "restarted";
445
+ } catch {
446
+ return "failed";
447
+ }
448
+ }
449
+ function readVgdPid() {
450
+ try {
451
+ const raw = fs.readFileSync(vgdPidPath(), "utf8").trim();
452
+ const pid = Number.parseInt(raw, 10);
453
+ return Number.isInteger(pid) && pid > 0 ? pid : null;
454
+ } catch {
455
+ return null;
456
+ }
457
+ }
458
+ async function repositoryIdForCwd(socketPath, root) {
459
+ const { repositoryIdFromRoot } = await import('./paths-62AKTFSR.js');
460
+ const reg = await vgdRequest({ op: "register", root }, { socketPath });
461
+ if (reg.ok && "workspace" in reg) return reg.workspace.id;
462
+ return repositoryIdFromRoot(root);
463
+ }
464
+
465
+ export { ensureVgd, registerDaemon, requireGraph, restartVgdIfRunning, rootOf, stopVgd };
466
+ //# sourceMappingURL=chunk-KNGAZDGF.js.map
467
+ //# sourceMappingURL=chunk-KNGAZDGF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/util.ts","../src/commands/daemon.ts"],"names":["path","loadGraph","c"],"mappings":"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","file":"chunk-KNGAZDGF.js","sourcesContent":["import * as path from 'node:path';\nimport { loadGraph } from '../engine/load.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport type { GlobalOpts } from '../cli-options.js';\nimport type { VgGraph } from '../schema.js';\n\nexport function rootOf(global: GlobalOpts): string {\n return path.resolve(global.cwd ?? '.');\n}\n\n/** Load the committed graph, or fail with an actionable NOT_FOUND error. */\nexport function requireGraph(global: GlobalOpts): { root: string; graph: VgGraph } {\n const root = rootOf(global);\n const graph = loadGraph(root, global.graph);\n if (!graph) {\n throw new CliError(\n `no map found — run \\`vg\\` to build one first` +\n (global.graph ? ` (looked at ${global.graph})` : ''),\n ExitCode.NOT_FOUND,\n );\n }\n return { root, graph };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { spawn } from 'node:child_process';\nimport { Command } from 'commander';\nimport { applyGlobalOptions, readGlobal } from '../cli-options.js';\nimport { startVgdServer, vgdIsRunning, vgdPidPath, vgdRequest, vgdSocketPath, VGD_PROTOCOL_VERSION } from '../runtime/vgd/index.js';\nimport { rootOf } from './util.js';\nimport { CliError, ExitCode } from '../util/exit.js';\nimport { reinvokeCli } from '../util/cli-invocation.js';\nimport { c, info, json } from '../util/output.js';\n\n/**\n * `vg daemon` — lightweight local Fusion Runtime daemon (`vgd`) prototype.\n *\n * Phase 2 slice: local socket + workspace registry. Interactive `vg code`\n * attaches via `startCodeRuntimeSession` (ensures this standalone daemon).\n * No overlays yet. Safe to start/stop; does not mutate repos.\n */\nexport function registerDaemon(program: Command): void {\n const cmd = program\n .command('daemon')\n .description('local Fusion Runtime daemon (vgd) — workspace registry prototype')\n .option('--socket <path>', 'override the daemon socket path');\n\n const status = cmd\n .command('status')\n .description('show whether vgd is running and how many workspaces it tracks')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const running = await vgdIsRunning({ socketPath });\n if (!running) {\n if (global.json) {\n json({ running: false, socketPath, version: VGD_PROTOCOL_VERSION });\n } else {\n info(c.dim(`vgd · not running (${socketPath})`));\n }\n process.exitCode = ExitCode.NOT_FOUND;\n return;\n }\n const res = await vgdRequest({ op: 'status' }, { socketPath });\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n // \"Warm\" used to mean the code map only, while every client still loaded\n // its own embedder — so the semantic state is reported next to the graph\n // slots rather than left to be inferred.\n const semantic = await vgdRequest({ op: 'embed-status' }, { socketPath }).catch(() => null);\n const semanticPayload = semantic && semantic.ok && 'semantic' in semantic ? semantic.semantic : undefined;\n if (global.json) json({ running: true, ...res, semantic: semanticPayload });\n else if ('pid' in res) {\n const slots = typeof res.graphSlots === 'number' ? ` · ${res.graphSlots} graph slot(s)` : '';\n const cli = res.cliVersion ? ` · cli ${res.cliVersion}` : '';\n info(\n `vgd · running pid ${res.pid}${cli} · ${res.workspaces} workspace(s)${slots} · ${res.uptimeMs}ms up · ${c.dim(res.socketPath)}`,\n );\n if (semanticPayload) {\n const ready = semanticPayload.slots.filter((sl) => sl.state === 'ready');\n const vectors = ready.reduce((n, sl) => n + sl.vectors, 0);\n const detail =\n semanticPayload.worker === 'unavailable'\n ? c.dim(semanticPayload.reason ?? 'semantic off — lexical only')\n : `${ready.length}/${semanticPayload.slots.length} index(es) ready · ${vectors} vector(s)` +\n (semanticPayload.model ? ` · ${semanticPayload.model}` : '');\n info(` semantic · worker ${semanticPayload.worker} · ${detail}`);\n for (const sl of semanticPayload.slots) {\n if (sl.state === 'ready') continue;\n info(c.dim(` ${sl.repositoryId}@${sl.gitRef} · ${sl.state}${sl.error ? ` — ${sl.error}` : ''}`));\n }\n }\n }\n });\n applyGlobalOptions(status);\n\n const start = cmd\n .command('start')\n .description('run vgd in the foreground (Ctrl-C to stop)')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n if (await vgdIsRunning({ socketPath })) {\n throw new CliError(`vgd is already running at ${socketPath}`, ExitCode.ERROR);\n }\n // The shutdown closure needs the server; the server needs the hook.\n // Bridge with a mutable ref so `vg daemon stop` can reach us.\n let requestShutdown: () => void = () => {};\n const server = await startVgdServer({\n socketPath,\n onShutdownRequest: () => requestShutdown(),\n // Show the daemon working: graph publishes, branch switches, new repos,\n // and every semantic index build. Silent under --quiet/--json.\n log: global.quiet || global.json ? undefined : (message) => info(c.dim(`vgd · ${message}`)),\n });\n if (!global.quiet) {\n info(`vgd · listening on ${c.dim(server.socketPath)} (${VGD_PROTOCOL_VERSION})`);\n info(c.dim(' register a workspace: vg daemon register'));\n info(c.dim(' status: vg daemon status'));\n }\n\n const shutdown = async (): Promise<void> => {\n await server.close();\n if (!global.quiet) info(c.dim('vgd · stopped'));\n process.exit(0);\n };\n requestShutdown = () => void shutdown();\n process.on('SIGINT', () => void shutdown());\n process.on('SIGTERM', () => void shutdown());\n // Keep the event loop alive until signal.\n await new Promise(() => {});\n });\n applyGlobalOptions(start);\n\n /**\n * Idempotent start for host UIs (VS Code) and agents: if vgd is already\n * listening, exit 0; otherwise spawn a detached background `daemon start`.\n */\n const ensure = cmd\n .command('ensure')\n .description('ensure vgd is running (start in background if needed)')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const ensured = await ensureVgd(socketPath);\n const res = await vgdRequest({ op: 'status' }, { socketPath });\n if (!res.ok) {\n throw new CliError(\n ensured.started\n ? `vgd started (pid ${ensured.pid ?? '?'}) but status failed: ${res.error} (${socketPath})`\n : `vgd is running but status failed: ${res.error} (${socketPath})`,\n ExitCode.ERROR,\n );\n }\n if (global.json) {\n json({ running: true, ensured: ensured.started, ...res });\n } else if (!global.quiet) {\n const pid = 'pid' in res ? res.pid : ensured.pid;\n info(\n ensured.started\n ? `vgd · started in background pid ${pid} · ${c.dim(socketPath)}`\n : `vgd · already running pid ${pid} · ${c.dim(socketPath)}`,\n );\n }\n });\n applyGlobalOptions(ensure);\n\n const stop = cmd\n .command('stop')\n .description('stop the running vgd (idempotent — succeeds if none is running)')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const result = await stopVgd(socketPath);\n if (global.json) {\n json({ stopped: result === 'stopped', result, socketPath });\n } else if (!global.quiet) {\n if (result === 'stopped') info(`vgd · stopped ${c.dim(socketPath)}`);\n else if (result === 'not-running') info(c.dim(`vgd · not running (${socketPath})`));\n }\n if (result === 'refused') {\n throw new CliError(\n 'this vgd cannot be stopped remotely — it is running inside another process; stop that process instead',\n ExitCode.ERROR,\n );\n }\n if (result === 'failed') {\n throw new CliError(\n `vgd did not stop within 5s (${socketPath}) — check \\`vg daemon status\\` and stop the process manually`,\n ExitCode.ERROR,\n );\n }\n });\n applyGlobalOptions(stop);\n\n const restart = cmd\n .command('restart')\n .description('restart vgd (stop if running, then start in the background)')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const stopResult = await stopVgd(socketPath);\n if (stopResult === 'refused') {\n throw new CliError(\n 'this vgd cannot be stopped remotely — it is running inside another process; stop that process instead',\n ExitCode.ERROR,\n );\n }\n if (stopResult === 'failed') {\n throw new CliError(\n `vgd did not stop within 5s (${socketPath}) — check \\`vg daemon status\\` and stop the process manually`,\n ExitCode.ERROR,\n );\n }\n await startDetachedVgd(socketPath);\n const res = await vgdRequest({ op: 'status' }, { socketPath });\n if (global.json) {\n json({ running: true, restarted: true, ...(res.ok ? res : { socketPath }) });\n } else if (!global.quiet) {\n const pid = res.ok && 'pid' in res ? res.pid : '?';\n info(`vgd · restarted pid ${pid} · ${c.dim(socketPath)}`);\n }\n });\n applyGlobalOptions(restart);\n\n const register = cmd\n .command('register')\n .description('register the current repository with a running vgd')\n .argument('[root]', 'repository root (default: cwd)')\n .action(async function (this: Command, rootArg?: string) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const root = path.resolve(rootArg ?? rootOf(global));\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running — start it with \\`vg daemon start\\` (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const res = await vgdRequest({ op: 'register', root }, { socketPath });\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('workspace' in res) {\n info(`vgd · registered ${res.workspace.root}`);\n info(c.dim(` id ${res.workspace.id}`));\n info(c.dim(` graph ${res.workspace.graphPath}`));\n }\n });\n applyGlobalOptions(register);\n\n const list = cmd\n .command('list')\n .description('list workspaces registered with the running vgd')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const res = await vgdRequest({ op: 'list' }, { socketPath });\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('workspaces' in res && Array.isArray(res.workspaces)) {\n if (res.workspaces.length === 0) info(c.dim('vgd · no workspaces registered'));\n for (const w of res.workspaces) {\n const tag = w.label ? ` (${w.label}${w.role ? `/${w.role}` : ''})` : '';\n info(`${w.root}${tag}`);\n info(c.dim(` id ${w.id} · graph ${w.graphPath}`));\n }\n }\n });\n applyGlobalOptions(list);\n\n const federation = cmd\n .command('federation')\n .description('register a multi-root federation from .vibgrate/federation.json (or primary cwd)')\n .argument('[root]', 'primary repository root (default: cwd)')\n .action(async function (this: Command, rootArg?: string) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const primary = path.resolve(rootArg ?? rootOf(global));\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running — start it with \\`vg daemon start\\` (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const { loadFederation } = await import('../runtime/federation.js');\n const fed = loadFederation(primary);\n if (!fed) throw new CliError(`could not load federation for ${primary}`, ExitCode.ERROR);\n const res = await vgdRequest(\n {\n op: 'register-federation',\n primaryRoot: fed.primaryRoot,\n members: fed.members.map((m) => ({ root: m.root, label: m.label, role: m.role })),\n },\n { socketPath },\n );\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('workspaces' in res && Array.isArray(res.workspaces)) {\n info(`vgd · federation registered (${res.workspaces.length} workspace(s))`);\n for (const w of res.workspaces) {\n info(c.dim(` ${w.label ?? w.root}${w.role ? ` [${w.role}]` : ''}`));\n }\n }\n });\n applyGlobalOptions(federation);\n\n /**\n * Load the on-disk code map for a workspace into vgd's ActiveGraph cache so\n * query/impact work without an agent put-graph first (VS Code / IDE path).\n */\n const publish = cmd\n .command('publish')\n .description('load the workspace code map into vgd ActiveGraph (from global/legacy store)')\n .argument('[root]', 'repository root (default: cwd)')\n .option('--git-ref <ref>', 'branch or SHA (default: detect HEAD)')\n .action(async function (this: Command, rootArg?: string) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const root = path.resolve(rootArg ?? rootOf(global));\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running — start it with \\`vg daemon ensure\\` (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const opts = this.opts() as { gitRef?: string };\n // Fast path: the daemon loads the map from disk itself (binary snapshot\n // first) — nothing heavy crosses the socket.\n const loaded = await vgdRequest(\n { op: 'load-graph', root, gitRef: opts.gitRef?.trim() || undefined, graphPath: global.graph },\n { socketPath },\n );\n let put = loaded;\n if (!loaded.ok && loaded.code === 'no_map') {\n throw new CliError(loaded.error, ExitCode.NOT_FOUND);\n }\n if (!loaded.ok) {\n // Older daemon without load-graph — legacy path: load locally and ship\n // the graph over the socket with put-graph.\n const { loadGraph } = await import('../engine/load.js');\n const { detectGitRef } = await import('../runtime/git-ref.js');\n const { repositoryIdFromRoot } = await import('../runtime/paths.js');\n const graph = loadGraph(root, global.graph);\n if (!graph) {\n throw new CliError(\n `no code map found for ${root} — run \\`vg build\\` (or bare \\`vg\\`) first`,\n ExitCode.NOT_FOUND,\n );\n }\n // Ensure workspace is registered so list shows the root.\n const reg = await vgdRequest({ op: 'register', root }, { socketPath });\n if (!reg.ok) throw new CliError(reg.error, ExitCode.ERROR);\n const git = opts.gitRef?.trim() || detectGitRef(root).ref || 'HEAD';\n const repositoryId =\n reg.ok && 'workspace' in reg ? reg.workspace.id : repositoryIdFromRoot(root);\n put = await vgdRequest(\n { op: 'put-graph', repositoryId, gitRef: git, graph },\n { socketPath },\n );\n if (!put.ok) throw new CliError(put.error, ExitCode.ERROR);\n }\n if (global.json) json(put);\n else if (put.ok && 'stored' in put) {\n info(`vgd · published graph · ${put.nodeCount} node(s) · ref ${put.gitRef}`);\n info(c.dim(` repositoryId ${put.repositoryId}`));\n }\n });\n applyGlobalOptions(publish);\n\n const query = cmd\n .command('query')\n .description('query the ActiveGraph held by vgd (lexical/structural)')\n .option('--repository-id <id>', 'repository id from `vg daemon list` (default: cwd workspace)')\n .argument('<query...>', 'what to find')\n .option('--limit <n>', 'max matches', '12')\n .option('--git-ref <ref>', 'branch or SHA (default: current slot)')\n .action(async function (this: Command, queryParts: string[]) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const opts = this.opts() as { repositoryId?: string; limit?: string; gitRef?: string };\n const q = (queryParts ?? []).join(' ').trim();\n if (!q) throw new CliError('say what to find', ExitCode.USAGE_ERROR);\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const repositoryId = opts.repositoryId?.trim() || (await repositoryIdForCwd(socketPath, rootOf(global)));\n const res = await vgdRequest(\n {\n op: 'query-graph',\n repositoryId,\n query: q,\n limit: opts.limit ? Number(opts.limit) : 12,\n gitRef: opts.gitRef,\n },\n { socketPath },\n );\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('matches' in res) {\n info(`vgd query · ${res.matches.length} match(es) · ref ${res.gitRef}`);\n for (const m of res.matches) {\n info(`${m.qualifiedName} (${m.kind}) ${m.file}:${m.line}`);\n info(c.dim(` score ${m.score} · ${m.why}`));\n }\n }\n });\n applyGlobalOptions(query);\n\n const impact = cmd\n .command('impact')\n .description('blast radius for a symbol in the vgd ActiveGraph')\n .option('--repository-id <id>', 'repository id (default: cwd workspace)')\n .argument('<symbol>', 'symbol id or qualified name')\n .option('--depth <n>', 'max dependency depth', '4')\n .option('--git-ref <ref>', 'branch or SHA')\n .action(async function (this: Command, symbol: string) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const opts = this.opts() as { repositoryId?: string; depth?: string; gitRef?: string };\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const repositoryId = opts.repositoryId?.trim() || (await repositoryIdForCwd(socketPath, rootOf(global)));\n const res = await vgdRequest(\n {\n op: 'impact-of',\n repositoryId,\n symbol: symbol.trim(),\n depth: opts.depth ? Number(opts.depth) : 4,\n gitRef: opts.gitRef,\n },\n { socketPath },\n );\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('affected' in res) {\n info(`vgd impact · ${res.root.name} · depth ${res.depth} · ${res.affected.length} affected`);\n for (const a of res.affected.slice(0, 30)) {\n info(`- ${a.name} (${a.file}:${a.line}) d=${a.depth}`);\n }\n }\n });\n applyGlobalOptions(impact);\n\n const graphs = cmd\n .command('graphs')\n .description('list multi-branch ActiveGraph slots resident in the running vgd (Fusion §4.1.1)')\n .option('--repository-id <id>', 'filter slots to one repository id')\n .action(async function (this: Command) {\n const global = readGlobal(this);\n const socketPath = socketOf(this);\n const opts = this.opts() as { repositoryId?: string };\n if (!(await vgdIsRunning({ socketPath }))) {\n throw new CliError(`vgd is not running (${socketPath})`, ExitCode.NOT_FOUND);\n }\n const res = await vgdRequest(\n { op: 'list-graph-slots', repositoryId: opts.repositoryId },\n { socketPath },\n );\n if (!res.ok) throw new CliError(res.error, ExitCode.ERROR);\n if (global.json) json(res);\n else if ('slots' in res) {\n if (!res.slots.length) info(c.dim('vgd · no graph slots resident'));\n for (const s of res.slots) {\n const cur = s.current ? c.green(' current') : '';\n const idle = s.evictable ? c.yellow(' idle') : '';\n info(`${s.repositoryId.slice(0, 8)}… ${s.gitRef}${cur}${idle}`);\n info(c.dim(` nodes ${s.nodeCount} · idle ${Math.round(s.idleMs / 1000)}s · loaded ${new Date(s.loadedAt).toISOString()}`));\n }\n }\n });\n applyGlobalOptions(graphs);\n\n applyGlobalOptions(cmd);\n}\n\nfunction socketOf(cmd: Command): string {\n // Walk parents for --socket on the daemon parent or the leaf.\n let c: Command | null = cmd;\n while (c) {\n const opts = c.opts() as { socket?: string };\n if (opts.socket) return path.resolve(opts.socket);\n c = c.parent;\n }\n return vgdSocketPath();\n}\n\n/**\n * Re-invoke this CLI as a detached background `daemon start`.\n * Handles `node dist/cli.js …`, a global `vg` symlink (npm bin), and a\n * packaged `vg` binary. The symlink case must realpath to cli.js — see\n * {@link reinvokeCli}.\n */\nfunction spawnDetachedDaemonStart(socketPath: string): ReturnType<typeof spawn> {\n // windowsHide: on Windows a detached console can flash and (with some AV /\n // job-object setups) keep the child tied to the parent session. Hide it.\n const opts = {\n detached: true,\n stdio: 'ignore' as const,\n env: process.env,\n windowsHide: true,\n };\n const { command, argv } = reinvokeCli(['daemon', 'start', '--socket', socketPath]);\n return spawn(command, argv, opts);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\n/**\n * Spawn a detached background `daemon start` and wait for it to answer ping.\n * Returns the child pid; throws when the socket never becomes ready.\n *\n * Ready budget is long because the detached child pays a full Node + CLI cold\n * start of its own (often >8s under Windows AV). The previous 8s window made\n * `vg daemon ensure` report success only when ping raced ahead of the child\n * exiting, or fail right as the child was about to listen.\n */\nasync function startDetachedVgd(socketPath: string): Promise<number | undefined> {\n const child = spawnDetachedDaemonStart(socketPath);\n child.unref();\n const readyMs = 30_000;\n const deadline = Date.now() + readyMs;\n while (Date.now() < deadline) {\n await sleep(150);\n if (await vgdIsRunning({ socketPath })) return child.pid;\n // If the child already exited without ever answering, fail fast rather\n // than waiting out the full budget for a dead process. Another client\n // (the VS Code extension's `daemon ensure`) may have bound in this\n // tick — treat that as ready rather than reporting a false failure.\n if (child.exitCode != null && child.exitCode !== 0) {\n if (await vgdIsRunning({ socketPath })) return child.pid;\n throw new CliError(\n `vgd child exited ${child.exitCode} before becoming ready at ${socketPath} — run \"vg daemon start\" in the foreground to see the error`,\n ExitCode.ERROR,\n );\n }\n }\n throw new CliError(\n `vgd failed to become ready within ${Math.round(readyMs / 1000)}s at ${socketPath}`,\n ExitCode.ERROR,\n );\n}\n\n/**\n * Idempotent start used by `vg daemon ensure` and `vg code`: if vgd is already\n * listening, do nothing; otherwise spawn a detached standalone `daemon start`.\n */\nexport async function ensureVgd(socketPath: string = vgdSocketPath()): Promise<{ started: boolean; pid?: number }> {\n if (await vgdIsRunning({ socketPath })) return { started: false };\n const pid = await startDetachedVgd(socketPath);\n return { started: true, pid };\n}\n\n/**\n * Stop a running vgd: polite `shutdown` op first, SIGTERM via the pid file for\n * daemons that predate the op, then wait (≤5s) for the socket to go quiet.\n *\n * `refused` means the daemon declined remote shutdown (a listener started\n * without a shutdown hook) — never escalate that to a pid-file kill, because\n * the pid file belongs to the owning process.\n */\nexport async function stopVgd(socketPath: string): Promise<'stopped' | 'not-running' | 'refused' | 'failed'> {\n if (!(await vgdIsRunning({ socketPath }))) return 'not-running';\n let acknowledged = false;\n try {\n const res = await vgdRequest({ op: 'shutdown' }, { socketPath });\n if (res.ok) acknowledged = true;\n else if (res.code === 'shutdown_unsupported') return 'refused';\n // Any other refusal (an older daemon answers `unknown op`) → pid fallback.\n } catch {\n /* connection dropped mid-shutdown or slow daemon — fall through to pid */\n }\n if (!acknowledged) {\n const pid = readVgdPid();\n if (pid == null) return 'failed';\n try {\n process.kill(pid, 'SIGTERM');\n } catch {\n return 'failed';\n }\n }\n const deadline = Date.now() + 5_000;\n while (Date.now() < deadline) {\n await sleep(100);\n if (!(await vgdIsRunning({ socketPath }))) return 'stopped';\n }\n return 'failed';\n}\n\n/**\n * Restart the local vgd if (and only if) one is running — used by `vg update`\n * so a freshly installed CLI does not keep serving from a daemon still running\n * the old build. Best-effort: never throws.\n */\nexport async function restartVgdIfRunning(\n socketPath: string = vgdSocketPath(),\n): Promise<'restarted' | 'not-running' | 'refused' | 'failed'> {\n try {\n const stopResult = await stopVgd(socketPath);\n if (stopResult === 'not-running') return 'not-running';\n if (stopResult === 'refused') return 'refused';\n if (stopResult === 'failed') return 'failed';\n await startDetachedVgd(socketPath);\n return 'restarted';\n } catch {\n return 'failed';\n }\n}\n\nfunction readVgdPid(): number | null {\n try {\n const raw = fs.readFileSync(vgdPidPath(), 'utf8').trim();\n const pid = Number.parseInt(raw, 10);\n return Number.isInteger(pid) && pid > 0 ? pid : null;\n } catch {\n return null;\n }\n}\n\n/** Resolve repository id for cwd: register if needed, return workspace id. */\nasync function repositoryIdForCwd(socketPath: string, root: string): Promise<string> {\n const { repositoryIdFromRoot } = await import('../runtime/paths.js');\n const reg = await vgdRequest({ op: 'register', root }, { socketPath });\n if (reg.ok && 'workspace' in reg) return reg.workspace.id;\n return repositoryIdFromRoot(root);\n}\n"]}