@boxes-dev/dvb 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/dist/bin/dvb.cjs +28232 -0
  2. package/dist/bin/dvb.d.ts +2 -0
  3. package/dist/bin/dvb.d.ts.map +1 -0
  4. package/dist/bin/dvb.js +71 -0
  5. package/dist/bin/dvb.js.map +1 -0
  6. package/dist/bin/dvbd.cjs +11816 -0
  7. package/dist/bin/dvbd.d.ts +2 -0
  8. package/dist/bin/dvbd.d.ts.map +1 -0
  9. package/dist/bin/dvbd.js +20 -0
  10. package/dist/bin/dvbd.js.map +1 -0
  11. package/dist/codex/services-schema.json +59 -0
  12. package/dist/codex/setup-schema.json +176 -0
  13. package/dist/devbox/auth.d.ts +17 -0
  14. package/dist/devbox/auth.d.ts.map +1 -0
  15. package/dist/devbox/auth.js +302 -0
  16. package/dist/devbox/auth.js.map +1 -0
  17. package/dist/devbox/cli.d.ts +2 -0
  18. package/dist/devbox/cli.d.ts.map +1 -0
  19. package/dist/devbox/cli.js +142 -0
  20. package/dist/devbox/cli.js.map +1 -0
  21. package/dist/devbox/commands/agent.d.ts +21 -0
  22. package/dist/devbox/commands/agent.d.ts.map +1 -0
  23. package/dist/devbox/commands/agent.js +257 -0
  24. package/dist/devbox/commands/agent.js.map +1 -0
  25. package/dist/devbox/commands/boxSelect.d.ts +14 -0
  26. package/dist/devbox/commands/boxSelect.d.ts.map +1 -0
  27. package/dist/devbox/commands/boxSelect.js +82 -0
  28. package/dist/devbox/commands/boxSelect.js.map +1 -0
  29. package/dist/devbox/commands/connect.d.ts +8 -0
  30. package/dist/devbox/commands/connect.d.ts.map +1 -0
  31. package/dist/devbox/commands/connect.js +1369 -0
  32. package/dist/devbox/commands/connect.js.map +1 -0
  33. package/dist/devbox/commands/daemon.d.ts +4 -0
  34. package/dist/devbox/commands/daemon.d.ts.map +1 -0
  35. package/dist/devbox/commands/daemon.js +36 -0
  36. package/dist/devbox/commands/daemon.js.map +1 -0
  37. package/dist/devbox/commands/destroy.d.ts +2 -0
  38. package/dist/devbox/commands/destroy.d.ts.map +1 -0
  39. package/dist/devbox/commands/destroy.js +131 -0
  40. package/dist/devbox/commands/destroy.js.map +1 -0
  41. package/dist/devbox/commands/init/args.d.ts +12 -0
  42. package/dist/devbox/commands/init/args.d.ts.map +1 -0
  43. package/dist/devbox/commands/init/args.js +42 -0
  44. package/dist/devbox/commands/init/args.js.map +1 -0
  45. package/dist/devbox/commands/init/codex/artifacts.d.ts +26 -0
  46. package/dist/devbox/commands/init/codex/artifacts.d.ts.map +1 -0
  47. package/dist/devbox/commands/init/codex/artifacts.js +108 -0
  48. package/dist/devbox/commands/init/codex/artifacts.js.map +1 -0
  49. package/dist/devbox/commands/init/codex/index.d.ts +35 -0
  50. package/dist/devbox/commands/init/codex/index.d.ts.map +1 -0
  51. package/dist/devbox/commands/init/codex/index.js +147 -0
  52. package/dist/devbox/commands/init/codex/index.js.map +1 -0
  53. package/dist/devbox/commands/init/codex/local.d.ts +19 -0
  54. package/dist/devbox/commands/init/codex/local.d.ts.map +1 -0
  55. package/dist/devbox/commands/init/codex/local.js +189 -0
  56. package/dist/devbox/commands/init/codex/local.js.map +1 -0
  57. package/dist/devbox/commands/init/codex/plan.d.ts +61 -0
  58. package/dist/devbox/commands/init/codex/plan.d.ts.map +1 -0
  59. package/dist/devbox/commands/init/codex/plan.js +39 -0
  60. package/dist/devbox/commands/init/codex/plan.js.map +1 -0
  61. package/dist/devbox/commands/init/codex/prompts.d.ts +6 -0
  62. package/dist/devbox/commands/init/codex/prompts.d.ts.map +1 -0
  63. package/dist/devbox/commands/init/codex/prompts.js +26 -0
  64. package/dist/devbox/commands/init/codex/prompts.js.map +1 -0
  65. package/dist/devbox/commands/init/codex/remote.d.ts +56 -0
  66. package/dist/devbox/commands/init/codex/remote.d.ts.map +1 -0
  67. package/dist/devbox/commands/init/codex/remote.js +395 -0
  68. package/dist/devbox/commands/init/codex/remote.js.map +1 -0
  69. package/dist/devbox/commands/init/codex/template.d.ts +3 -0
  70. package/dist/devbox/commands/init/codex/template.d.ts.map +1 -0
  71. package/dist/devbox/commands/init/codex/template.js +3 -0
  72. package/dist/devbox/commands/init/codex/template.js.map +1 -0
  73. package/dist/devbox/commands/init/index.d.ts +2 -0
  74. package/dist/devbox/commands/init/index.d.ts.map +1 -0
  75. package/dist/devbox/commands/init/index.js +1117 -0
  76. package/dist/devbox/commands/init/index.js.map +1 -0
  77. package/dist/devbox/commands/init/packaging.d.ts +5 -0
  78. package/dist/devbox/commands/init/packaging.d.ts.map +1 -0
  79. package/dist/devbox/commands/init/packaging.js +86 -0
  80. package/dist/devbox/commands/init/packaging.js.map +1 -0
  81. package/dist/devbox/commands/init/registry.d.ts +14 -0
  82. package/dist/devbox/commands/init/registry.d.ts.map +1 -0
  83. package/dist/devbox/commands/init/registry.js +61 -0
  84. package/dist/devbox/commands/init/registry.js.map +1 -0
  85. package/dist/devbox/commands/init/remote.d.ts +38 -0
  86. package/dist/devbox/commands/init/remote.d.ts.map +1 -0
  87. package/dist/devbox/commands/init/remote.js +554 -0
  88. package/dist/devbox/commands/init/remote.js.map +1 -0
  89. package/dist/devbox/commands/init/repo.d.ts +31 -0
  90. package/dist/devbox/commands/init/repo.d.ts.map +1 -0
  91. package/dist/devbox/commands/init/repo.js +164 -0
  92. package/dist/devbox/commands/init/repo.js.map +1 -0
  93. package/dist/devbox/commands/init/scripts.d.ts +3 -0
  94. package/dist/devbox/commands/init/scripts.d.ts.map +1 -0
  95. package/dist/devbox/commands/init/scripts.js +15 -0
  96. package/dist/devbox/commands/init/scripts.js.map +1 -0
  97. package/dist/devbox/commands/init/ssh.d.ts +19 -0
  98. package/dist/devbox/commands/init/ssh.d.ts.map +1 -0
  99. package/dist/devbox/commands/init/ssh.js +270 -0
  100. package/dist/devbox/commands/init/ssh.js.map +1 -0
  101. package/dist/devbox/commands/init/state.d.ts +31 -0
  102. package/dist/devbox/commands/init/state.d.ts.map +1 -0
  103. package/dist/devbox/commands/init/state.js +25 -0
  104. package/dist/devbox/commands/init/state.js.map +1 -0
  105. package/dist/devbox/commands/list.d.ts +2 -0
  106. package/dist/devbox/commands/list.d.ts.map +1 -0
  107. package/dist/devbox/commands/list.js +213 -0
  108. package/dist/devbox/commands/list.js.map +1 -0
  109. package/dist/devbox/commands/listFormatting.d.ts +27 -0
  110. package/dist/devbox/commands/listFormatting.d.ts.map +1 -0
  111. package/dist/devbox/commands/listFormatting.js +155 -0
  112. package/dist/devbox/commands/listFormatting.js.map +1 -0
  113. package/dist/devbox/commands/logout.d.ts +2 -0
  114. package/dist/devbox/commands/logout.d.ts.map +1 -0
  115. package/dist/devbox/commands/logout.js +45 -0
  116. package/dist/devbox/commands/logout.js.map +1 -0
  117. package/dist/devbox/commands/mount.d.ts +3 -0
  118. package/dist/devbox/commands/mount.d.ts.map +1 -0
  119. package/dist/devbox/commands/mount.js +144 -0
  120. package/dist/devbox/commands/mount.js.map +1 -0
  121. package/dist/devbox/commands/mountSsh.d.ts +12 -0
  122. package/dist/devbox/commands/mountSsh.d.ts.map +1 -0
  123. package/dist/devbox/commands/mountSsh.js +137 -0
  124. package/dist/devbox/commands/mountSsh.js.map +1 -0
  125. package/dist/devbox/commands/ports.d.ts +2 -0
  126. package/dist/devbox/commands/ports.d.ts.map +1 -0
  127. package/dist/devbox/commands/ports.js +145 -0
  128. package/dist/devbox/commands/ports.js.map +1 -0
  129. package/dist/devbox/commands/services.d.ts +2 -0
  130. package/dist/devbox/commands/services.d.ts.map +1 -0
  131. package/dist/devbox/commands/services.js +552 -0
  132. package/dist/devbox/commands/services.js.map +1 -0
  133. package/dist/devbox/commands/servicesToml.d.ts +13 -0
  134. package/dist/devbox/commands/servicesToml.d.ts.map +1 -0
  135. package/dist/devbox/commands/servicesToml.js +198 -0
  136. package/dist/devbox/commands/servicesToml.js.map +1 -0
  137. package/dist/devbox/commands/sessionUtils.d.ts +10 -0
  138. package/dist/devbox/commands/sessionUtils.d.ts.map +1 -0
  139. package/dist/devbox/commands/sessionUtils.js +48 -0
  140. package/dist/devbox/commands/sessionUtils.js.map +1 -0
  141. package/dist/devbox/commands/sessions.d.ts +2 -0
  142. package/dist/devbox/commands/sessions.d.ts.map +1 -0
  143. package/dist/devbox/commands/sessions.js +425 -0
  144. package/dist/devbox/commands/sessions.js.map +1 -0
  145. package/dist/devbox/commands/setup.d.ts +2 -0
  146. package/dist/devbox/commands/setup.d.ts.map +1 -0
  147. package/dist/devbox/commands/setup.js +183 -0
  148. package/dist/devbox/commands/setup.js.map +1 -0
  149. package/dist/devbox/commands/wezterm.d.ts +3 -0
  150. package/dist/devbox/commands/wezterm.d.ts.map +1 -0
  151. package/dist/devbox/commands/wezterm.js +878 -0
  152. package/dist/devbox/commands/wezterm.js.map +1 -0
  153. package/dist/devbox/completions/cache.d.ts +59 -0
  154. package/dist/devbox/completions/cache.d.ts.map +1 -0
  155. package/dist/devbox/completions/cache.js +122 -0
  156. package/dist/devbox/completions/cache.js.map +1 -0
  157. package/dist/devbox/completions/index.d.ts +14 -0
  158. package/dist/devbox/completions/index.d.ts.map +1 -0
  159. package/dist/devbox/completions/index.js +796 -0
  160. package/dist/devbox/completions/index.js.map +1 -0
  161. package/dist/devbox/controlPlane.d.ts +44 -0
  162. package/dist/devbox/controlPlane.d.ts.map +1 -0
  163. package/dist/devbox/controlPlane.js +310 -0
  164. package/dist/devbox/controlPlane.js.map +1 -0
  165. package/dist/devbox/daemonClient.d.ts +28 -0
  166. package/dist/devbox/daemonClient.d.ts.map +1 -0
  167. package/dist/devbox/daemonClient.js +276 -0
  168. package/dist/devbox/daemonClient.js.map +1 -0
  169. package/dist/devbox/latency.d.ts +25 -0
  170. package/dist/devbox/latency.d.ts.map +1 -0
  171. package/dist/devbox/latency.js +186 -0
  172. package/dist/devbox/latency.js.map +1 -0
  173. package/dist/devbox/logger.d.ts +2 -0
  174. package/dist/devbox/logger.d.ts.map +1 -0
  175. package/dist/devbox/logger.js +3 -0
  176. package/dist/devbox/logger.js.map +1 -0
  177. package/dist/devbox/terminal/osc.d.ts +10 -0
  178. package/dist/devbox/terminal/osc.d.ts.map +1 -0
  179. package/dist/devbox/terminal/osc.js +88 -0
  180. package/dist/devbox/terminal/osc.js.map +1 -0
  181. package/dist/devbox/types.d.ts +4 -0
  182. package/dist/devbox/types.d.ts.map +1 -0
  183. package/dist/devbox/types.js +2 -0
  184. package/dist/devbox/types.js.map +1 -0
  185. package/dist/devbox/ui/colors.d.ts +19 -0
  186. package/dist/devbox/ui/colors.d.ts.map +1 -0
  187. package/dist/devbox/ui/colors.js +22 -0
  188. package/dist/devbox/ui/colors.js.map +1 -0
  189. package/dist/devbox/ui/statusLine.d.ts +14 -0
  190. package/dist/devbox/ui/statusLine.d.ts.map +1 -0
  191. package/dist/devbox/ui/statusLine.js +90 -0
  192. package/dist/devbox/ui/statusLine.js.map +1 -0
  193. package/dist/devbox/weztermMux.d.ts +11 -0
  194. package/dist/devbox/weztermMux.d.ts.map +1 -0
  195. package/dist/devbox/weztermMux.js +11 -0
  196. package/dist/devbox/weztermMux.js.map +1 -0
  197. package/dist/prompts/local-scan.md +32 -0
  198. package/dist/prompts/local-services-scan.md +17 -0
  199. package/dist/prompts/remote-apply.md +370 -0
  200. package/dist/scripts/fix-bashrc.sh +48 -0
  201. package/package.json +38 -0
@@ -0,0 +1,425 @@
1
+ import { createSecretStore, createSpritesClient, loadConfig, readSpriteSessions, resolveSocketInfo, resolveSpritesApiUrl, SpritesApiError, writeSpriteSessions, } from "@boxes-dev/core";
2
+ import { DAEMON_TIMEOUT_MS, ensureDaemonRunning, requestJson, requireDaemonFeatures, } from "../daemonClient.js";
3
+ import { ensureSpritesToken } from "../auth.js";
4
+ import { colors } from "../ui/colors.js";
5
+ import { formatBytesPerSecond, formatRelativeTime, formatTable, makeCell, parseIsoTimestamp, } from "./listFormatting.js";
6
+ import { selectDevbox } from "./boxSelect.js";
7
+ import { renameSessionLog } from "./sessionUtils.js";
8
+ import { recordCompletionSessionsFromMap, recordCompletionSessionsFromViews, } from "../completions/index.js";
9
+ const renameUsage = "Usage: dvb sessions rename <session> -n <name> or dvb sessions rename <box>/<session> -n <name>";
10
+ const killUsage = "Usage: dvb sessions kill <session> or dvb sessions kill <box>/<session>";
11
+ const listUsage = "Usage: dvb sessions [<box>] [--json]";
12
+ const parseSessionsArgs = (args) => {
13
+ const parsed = {};
14
+ if (args[0] === "rename") {
15
+ parsed.subcommand = "rename";
16
+ const target = args[1];
17
+ if (!target) {
18
+ throw new Error(renameUsage);
19
+ }
20
+ parsed.target = target;
21
+ for (let i = 2; i < args.length; i += 1) {
22
+ const arg = args[i];
23
+ if (!arg)
24
+ continue;
25
+ if ((arg === "-n" || arg === "--name") && args[i + 1]) {
26
+ const value = args[i + 1];
27
+ if (!value)
28
+ throw new Error("Missing value for --name");
29
+ parsed.name = value;
30
+ i += 1;
31
+ continue;
32
+ }
33
+ if (arg.startsWith("-")) {
34
+ throw new Error(`Unknown sessions flag: ${arg}`);
35
+ }
36
+ throw new Error(renameUsage);
37
+ }
38
+ if (!parsed.target || !parsed.name) {
39
+ throw new Error(renameUsage);
40
+ }
41
+ return parsed;
42
+ }
43
+ if (args[0] === "kill") {
44
+ parsed.subcommand = "kill";
45
+ const target = args[1];
46
+ if (!target) {
47
+ throw new Error(killUsage);
48
+ }
49
+ parsed.target = target;
50
+ for (let i = 2; i < args.length; i += 1) {
51
+ const arg = args[i];
52
+ if (!arg)
53
+ continue;
54
+ if (arg.startsWith("-")) {
55
+ throw new Error(`Unknown sessions flag: ${arg}`);
56
+ }
57
+ throw new Error(killUsage);
58
+ }
59
+ return parsed;
60
+ }
61
+ for (let i = 0; i < args.length; i += 1) {
62
+ const arg = args[i];
63
+ if (!arg)
64
+ continue;
65
+ if (arg === "--json") {
66
+ parsed.json = true;
67
+ continue;
68
+ }
69
+ if (arg.startsWith("-")) {
70
+ throw new Error(`Unknown sessions flag: ${arg}`);
71
+ }
72
+ if (!parsed.target) {
73
+ parsed.target = arg;
74
+ continue;
75
+ }
76
+ throw new Error(listUsage);
77
+ }
78
+ return parsed;
79
+ };
80
+ const parseSessionTarget = (value) => {
81
+ const slashIndex = value.indexOf("/");
82
+ if (slashIndex === -1) {
83
+ if (!value) {
84
+ throw new Error(renameUsage);
85
+ }
86
+ return { box: undefined, session: value };
87
+ }
88
+ const box = value.slice(0, slashIndex);
89
+ const session = value.slice(slashIndex + 1);
90
+ if (!box || !session) {
91
+ throw new Error(renameUsage);
92
+ }
93
+ return { box, session };
94
+ };
95
+ const parseKillTarget = (value) => {
96
+ const slashIndex = value.indexOf("/");
97
+ if (slashIndex === -1) {
98
+ if (!value) {
99
+ throw new Error(killUsage);
100
+ }
101
+ return { box: undefined, session: value };
102
+ }
103
+ const box = value.slice(0, slashIndex);
104
+ const session = value.slice(slashIndex + 1);
105
+ if (!box || !session) {
106
+ throw new Error(killUsage);
107
+ }
108
+ return { box, session };
109
+ };
110
+ const runRename = async (target, name) => {
111
+ const trimmed = name.trim();
112
+ if (!trimmed) {
113
+ throw new Error("Session name cannot be empty.");
114
+ }
115
+ const parsedTarget = parseSessionTarget(target);
116
+ let targetBox = parsedTarget.box;
117
+ if (!targetBox) {
118
+ const selected = await selectDevbox("To rename a session on a specific box, use `dvb sessions rename <box>/<session> -n <name>`.");
119
+ if (!selected)
120
+ return;
121
+ targetBox = selected.box;
122
+ }
123
+ const socketInfo = resolveSocketInfo();
124
+ await ensureDaemonRunning(socketInfo.socketPath);
125
+ await requireDaemonFeatures(socketInfo.socketPath, ["registry"]);
126
+ const aliasLookup = await requestJson(socketInfo.socketPath, "GET", `/registry/alias?alias=${encodeURIComponent(targetBox)}`, DAEMON_TIMEOUT_MS.registry);
127
+ const canonical = aliasLookup.body.canonical ?? targetBox;
128
+ const config = await loadConfig(process.env.HOME ? { homeDir: process.env.HOME } : undefined);
129
+ const store = await createSecretStore(config?.tokenStore, process.env.HOME ? { homeDir: process.env.HOME } : undefined);
130
+ const { token } = await ensureSpritesToken(store);
131
+ const apiBaseUrl = resolveSpritesApiUrl(config);
132
+ const client = createSpritesClient({ apiBaseUrl, token });
133
+ const sessions = await readSpriteSessions(client, canonical);
134
+ const sessionId = sessions[parsedTarget.session];
135
+ if (!sessionId) {
136
+ throw new Error(`Session "${parsedTarget.session}" not found.`);
137
+ }
138
+ if (sessions[trimmed] !== undefined &&
139
+ sessions[trimmed] !== sessionId) {
140
+ throw new Error(`Session "${trimmed}" already exists.`);
141
+ }
142
+ if (trimmed === parsedTarget.session) {
143
+ console.log(`Session "${parsedTarget.session}" already has that name.`);
144
+ return;
145
+ }
146
+ delete sessions[parsedTarget.session];
147
+ sessions[trimmed] = sessionId;
148
+ await writeSpriteSessions(client, canonical, sessions);
149
+ await renameSessionLog(client, canonical, parsedTarget.session, trimmed);
150
+ await recordCompletionSessionsFromMap(canonical, sessions, parsedTarget.box);
151
+ const displayBox = parsedTarget.box ?? targetBox;
152
+ console.log(`Renamed session ${displayBox}/${parsedTarget.session} -> ${trimmed}`);
153
+ };
154
+ const runKill = async (target) => {
155
+ const parsedTarget = parseKillTarget(target);
156
+ let targetBox = parsedTarget.box;
157
+ if (!targetBox) {
158
+ const selected = await selectDevbox("Use `dvb sessions kill <box>/<session>` to kill a specific session.");
159
+ if (!selected)
160
+ return;
161
+ targetBox = selected.box;
162
+ }
163
+ const socketInfo = resolveSocketInfo();
164
+ await ensureDaemonRunning(socketInfo.socketPath);
165
+ await requireDaemonFeatures(socketInfo.socketPath, ["registry"]);
166
+ const aliasLookup = await requestJson(socketInfo.socketPath, "GET", `/registry/alias?alias=${encodeURIComponent(targetBox)}`, DAEMON_TIMEOUT_MS.registry);
167
+ const canonical = aliasLookup.body.canonical ?? targetBox;
168
+ const config = await loadConfig(process.env.HOME ? { homeDir: process.env.HOME } : undefined);
169
+ const store = await createSecretStore(config?.tokenStore, process.env.HOME ? { homeDir: process.env.HOME } : undefined);
170
+ const { token } = await ensureSpritesToken(store);
171
+ const apiBaseUrl = resolveSpritesApiUrl(config);
172
+ const client = createSpritesClient({ apiBaseUrl, token });
173
+ const sessionRef = parsedTarget.session;
174
+ const sessions = await readSpriteSessions(client, canonical);
175
+ let sessionId = sessions[sessionRef];
176
+ if (!sessionId) {
177
+ const mappedNames = Object.entries(sessions)
178
+ .filter(([, id]) => id === sessionRef)
179
+ .map(([name]) => name);
180
+ if (mappedNames.length > 0) {
181
+ sessionId = sessionRef;
182
+ }
183
+ else {
184
+ const available = await client.listExecSessions(canonical);
185
+ const match = available.find((session) => session.id === sessionRef);
186
+ if (!match) {
187
+ throw new Error(`Session "${sessionRef}" not found. Use \`dvb sessions ${targetBox}\` to list sessions.`);
188
+ }
189
+ sessionId = sessionRef;
190
+ }
191
+ }
192
+ const namesToRemove = new Set();
193
+ for (const [name, id] of Object.entries(sessions)) {
194
+ if (id === sessionId) {
195
+ namesToRemove.add(name);
196
+ }
197
+ }
198
+ const removeMappings = async () => {
199
+ if (namesToRemove.size === 0)
200
+ return;
201
+ for (const name of namesToRemove) {
202
+ delete sessions[name];
203
+ }
204
+ await writeSpriteSessions(client, canonical, sessions);
205
+ await recordCompletionSessionsFromMap(canonical, sessions, targetBox);
206
+ };
207
+ try {
208
+ await client.killExecSession(canonical, sessionId);
209
+ }
210
+ catch (error) {
211
+ if (error instanceof SpritesApiError && error.status === 404) {
212
+ await removeMappings();
213
+ if (namesToRemove.size > 0) {
214
+ console.log(`Session "${sessionRef}" already gone; cleared mapping.`);
215
+ return;
216
+ }
217
+ console.log(`Session "${sessionRef}" already gone.`);
218
+ return;
219
+ }
220
+ throw error;
221
+ }
222
+ await removeMappings();
223
+ const displayBox = parsedTarget.box ?? targetBox;
224
+ console.log(`session killed: ${displayBox}/${sessionRef}`);
225
+ };
226
+ export const runSessions = async (args) => {
227
+ const parsed = parseSessionsArgs(args);
228
+ if (parsed.subcommand === "rename") {
229
+ if (!parsed.target || !parsed.name) {
230
+ throw new Error(renameUsage);
231
+ }
232
+ await runRename(parsed.target, parsed.name);
233
+ return;
234
+ }
235
+ if (parsed.subcommand === "kill") {
236
+ if (!parsed.target) {
237
+ throw new Error(killUsage);
238
+ }
239
+ await runKill(parsed.target);
240
+ return;
241
+ }
242
+ let targetArg = parsed.target;
243
+ if (!targetArg) {
244
+ const selected = await selectDevbox("Use `dvb sessions <box>` to list sessions for a specific box.");
245
+ if (!selected)
246
+ return;
247
+ targetArg = selected.box;
248
+ }
249
+ const socketInfo = resolveSocketInfo();
250
+ await ensureDaemonRunning(socketInfo.socketPath);
251
+ await requireDaemonFeatures(socketInfo.socketPath, ["registry", "ports"]);
252
+ const aliasLookup = await requestJson(socketInfo.socketPath, "GET", `/registry/alias?alias=${encodeURIComponent(targetArg)}`, DAEMON_TIMEOUT_MS.registry);
253
+ const canonical = aliasLookup.body.canonical ?? targetArg;
254
+ const config = await loadConfig(process.env.HOME ? { homeDir: process.env.HOME } : undefined);
255
+ const store = await createSecretStore(config?.tokenStore, process.env.HOME ? { homeDir: process.env.HOME } : undefined);
256
+ const { token } = await ensureSpritesToken(store);
257
+ const apiBaseUrl = resolveSpritesApiUrl(config);
258
+ const client = createSpritesClient({ apiBaseUrl, token });
259
+ const [sessions, sessionMap, portsResponse] = await Promise.all([
260
+ client.listExecSessions(canonical),
261
+ readSpriteSessions(client, canonical),
262
+ requestJson(socketInfo.socketPath, "GET", "/ports", DAEMON_TIMEOUT_MS.quick),
263
+ ]);
264
+ const idToName = new Map();
265
+ for (const [name, id] of Object.entries(sessionMap)) {
266
+ idToName.set(id, name);
267
+ }
268
+ const sessionViews = sessions.map((session) => {
269
+ const view = { id: session.id };
270
+ const name = idToName.get(session.id);
271
+ if (name)
272
+ view.name = name;
273
+ if (session.tty !== undefined)
274
+ view.tty = session.tty;
275
+ if (session.createdAt)
276
+ view.createdAt = session.createdAt;
277
+ if (session.lastActivityAt)
278
+ view.lastActivityAt = session.lastActivityAt;
279
+ if (session.command)
280
+ view.command = session.command;
281
+ if (session.isActive !== undefined)
282
+ view.isActive = session.isActive;
283
+ if (session.bytesPerSecond !== undefined) {
284
+ view.bytesPerSecond = session.bytesPerSecond;
285
+ }
286
+ return view;
287
+ });
288
+ const ports = {
289
+ forwards: portsResponse.body.forwards.filter((entry) => entry.box === canonical),
290
+ detected: portsResponse.body.detected.filter((entry) => entry.box === canonical),
291
+ };
292
+ await recordCompletionSessionsFromViews(canonical, sessionViews, targetArg);
293
+ if (parsed.json) {
294
+ console.log(JSON.stringify({ sessions: sessionViews, ports }, null, 2));
295
+ return;
296
+ }
297
+ if (!sessions.length) {
298
+ console.log("No sessions found.");
299
+ }
300
+ else {
301
+ console.log("");
302
+ const now = Date.now();
303
+ const sessionRows = sessions
304
+ .slice()
305
+ .sort((a, b) => {
306
+ const aTime = parseIsoTimestamp(a.lastActivityAt) ??
307
+ parseIsoTimestamp(a.createdAt) ??
308
+ 0;
309
+ const bTime = parseIsoTimestamp(b.lastActivityAt) ??
310
+ parseIsoTimestamp(b.createdAt) ??
311
+ 0;
312
+ return bTime - aTime;
313
+ })
314
+ .map((session) => {
315
+ const name = idToName.get(session.id);
316
+ const created = formatRelativeTime(session.createdAt, now);
317
+ const last = formatRelativeTime(session.lastActivityAt, now);
318
+ const activeText = session.isActive === undefined
319
+ ? "-"
320
+ : session.isActive
321
+ ? "active"
322
+ : "idle";
323
+ const activeStyle = session.isActive === undefined
324
+ ? colors.dim
325
+ : session.isActive
326
+ ? colors.green
327
+ : colors.gray;
328
+ const dotStyle = activeStyle;
329
+ const bpsText = formatBytesPerSecond(session.bytesPerSecond);
330
+ const command = session.command && session.command.length > 0
331
+ ? session.command.join(" ")
332
+ : "-";
333
+ const nameText = name ? colors.boldWhite(name) : colors.dim("-");
334
+ return {
335
+ name: makeCell(`${dotStyle("●")} ${nameText}`),
336
+ id: makeCell(session.id),
337
+ tty: makeCell(session.tty === undefined ? "-" : session.tty ? "yes" : "no", session.tty === undefined ? colors.dim : undefined),
338
+ active: makeCell(activeText, activeStyle),
339
+ created: makeCell(created.text, created.text === "-" ? colors.dim : undefined),
340
+ last: makeCell(last.text, last.isNow
341
+ ? colors.green
342
+ : last.text === "-"
343
+ ? colors.dim
344
+ : undefined),
345
+ bps: makeCell(bpsText, bpsText === "-" ? colors.dim : undefined),
346
+ command: makeCell(command, command === "-" ? colors.dim : undefined),
347
+ };
348
+ });
349
+ const maxWidth = process.stdout.isTTY && process.stdout.columns
350
+ ? process.stdout.columns
351
+ : undefined;
352
+ const sessionTable = formatTable([
353
+ { key: "name", label: "SESSION" },
354
+ { key: "id", label: "ID" },
355
+ { key: "tty", label: "TTY" },
356
+ { key: "active", label: "ACTIVE" },
357
+ { key: "created", label: "CREATED" },
358
+ { key: "last", label: "SEEN" },
359
+ { key: "bps", label: "BPS", align: "right" },
360
+ { key: "command", label: "COMMAND", minWidth: 8 },
361
+ ], sessionRows, {
362
+ gap: 2,
363
+ truncateColumnKey: "command",
364
+ headerStyle: (value) => colors.style(value, ["dim", "underline"]),
365
+ ...(typeof maxWidth === "number" ? { maxWidth } : {}),
366
+ });
367
+ for (const line of sessionTable) {
368
+ console.log(` ${line}`);
369
+ }
370
+ console.log("");
371
+ }
372
+ const forwarded = ports.forwards;
373
+ const detected = ports.detected.filter((entry) => {
374
+ return !forwarded.some((forward) => forward.remotePort === entry.port && forward.box === entry.box);
375
+ });
376
+ if (forwarded.length) {
377
+ console.log(colors.bold("Forwarded ports:"));
378
+ console.log("");
379
+ const forwardedRows = forwarded.map((entry) => ({
380
+ remote: makeCell(String(entry.remotePort), colors.boldWhite),
381
+ local: makeCell(`127.0.0.1:${entry.localPort}`),
382
+ policy: makeCell(entry.policy),
383
+ session: makeCell(entry.sessionId ?? "-", entry.sessionId ? undefined : colors.dim),
384
+ pid: makeCell(entry.pid ? String(entry.pid) : "-", entry.pid ? undefined : colors.dim),
385
+ }));
386
+ const forwardedTable = formatTable([
387
+ { key: "remote", label: "REMOTE", align: "right" },
388
+ { key: "local", label: "LOCAL" },
389
+ { key: "policy", label: "POLICY" },
390
+ { key: "session", label: "SESSION" },
391
+ { key: "pid", label: "PID", align: "right" },
392
+ ], forwardedRows, {
393
+ gap: 2,
394
+ headerStyle: (value) => colors.style(value, ["dim", "underline"]),
395
+ });
396
+ for (const line of forwardedTable) {
397
+ console.log(` ${line}`);
398
+ }
399
+ console.log("");
400
+ }
401
+ if (detected.length) {
402
+ console.log(colors.bold("Detected (not forwarded):"));
403
+ console.log("");
404
+ const detectedRows = detected.map((entry) => ({
405
+ port: makeCell(String(entry.port), colors.boldWhite),
406
+ policy: makeCell(entry.policy),
407
+ session: makeCell(entry.sessionId ?? "-", entry.sessionId ? undefined : colors.dim),
408
+ pid: makeCell(entry.pid ? String(entry.pid) : "-", entry.pid ? undefined : colors.dim),
409
+ }));
410
+ const detectedTable = formatTable([
411
+ { key: "port", label: "PORT", align: "right" },
412
+ { key: "policy", label: "POLICY" },
413
+ { key: "session", label: "SESSION" },
414
+ { key: "pid", label: "PID", align: "right" },
415
+ ], detectedRows, {
416
+ gap: 2,
417
+ headerStyle: (value) => colors.style(value, ["dim", "underline"]),
418
+ });
419
+ for (const line of detectedTable) {
420
+ console.log(` ${line}`);
421
+ }
422
+ console.log("");
423
+ }
424
+ };
425
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/devbox/commands/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const runSetup: (args: string[]) => Promise<void>;
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/devbox/commands/setup.ts"],"names":[],"mappings":"AAiHA,eAAO,MAAM,QAAQ,GAAU,MAAM,MAAM,EAAE,kBAiG5C,CAAC"}
@@ -0,0 +1,183 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import readline from "node:readline/promises";
3
+ import { resolveSocketInfo } from "@boxes-dev/core";
4
+ import { createSecretStore, loadConfig, resolveConfigPath, resolveDevboxDir, resolveSecretsPath, resolveSpritesApiUrl, saveConfig, } from "@boxes-dev/core";
5
+ import { ensureSpritesToken } from "../auth.js";
6
+ import { ensureDaemonRunning } from "../daemonClient.js";
7
+ import { logger } from "../logger.js";
8
+ import { createStatusLine } from "../ui/statusLine.js";
9
+ import { maybeOfferCompletionsInstall } from "../completions/index.js";
10
+ const parseSetupArgs = (args) => {
11
+ const parsed = { verify: true };
12
+ for (let i = 0; i < args.length; i += 1) {
13
+ const arg = args[i];
14
+ if (arg === "--token" && args[i + 1]) {
15
+ const value = args[i + 1];
16
+ if (!value)
17
+ throw new Error("Missing value for --token");
18
+ parsed.token = value;
19
+ i += 1;
20
+ continue;
21
+ }
22
+ if (arg === "--org" && args[i + 1]) {
23
+ const value = args[i + 1];
24
+ if (!value)
25
+ throw new Error("Missing value for --org");
26
+ parsed.org = value;
27
+ i += 1;
28
+ continue;
29
+ }
30
+ if (arg === "--api-base-url" && args[i + 1]) {
31
+ const value = args[i + 1];
32
+ if (!value)
33
+ throw new Error("Missing value for --api-base-url");
34
+ parsed.apiBaseUrl = value;
35
+ i += 1;
36
+ continue;
37
+ }
38
+ if (arg === "--json") {
39
+ parsed.json = true;
40
+ continue;
41
+ }
42
+ if (arg === "--no-verify") {
43
+ parsed.verify = false;
44
+ continue;
45
+ }
46
+ throw new Error(`Unknown setup flag: ${arg}`);
47
+ }
48
+ return parsed;
49
+ };
50
+ const promptForValue = async (label) => {
51
+ if (!process.stdin.isTTY) {
52
+ throw new Error(`Missing ${label} (non-interactive)`);
53
+ }
54
+ const rl = readline.createInterface({
55
+ input: process.stdin,
56
+ output: process.stdout,
57
+ });
58
+ const answer = await rl.question(`${label}: `);
59
+ rl.close();
60
+ return answer.trim();
61
+ };
62
+ const listSprites = async (apiBaseUrl, token) => {
63
+ const requestId = randomUUID();
64
+ const url = new URL("/v1/sprites", apiBaseUrl);
65
+ url.searchParams.set("max_results", "1");
66
+ logger.info("sprites_request", {
67
+ requestId,
68
+ path: url.pathname,
69
+ method: "GET",
70
+ });
71
+ const response = await fetch(url, {
72
+ headers: {
73
+ authorization: `Bearer ${token}`,
74
+ },
75
+ });
76
+ logger.info("sprites_response", {
77
+ requestId,
78
+ path: url.pathname,
79
+ status: response.status,
80
+ });
81
+ if (!response.ok) {
82
+ throw new Error(`Sprites API error: ${response.status}`);
83
+ }
84
+ const payload = (await response.json());
85
+ const orgs = new Set();
86
+ for (const sprite of payload.sprites ?? []) {
87
+ if (sprite.org_slug)
88
+ orgs.add(sprite.org_slug);
89
+ }
90
+ return { orgs: [...orgs] };
91
+ };
92
+ export const runSetup = async (args) => {
93
+ const parsed = parseSetupArgs(args);
94
+ const statusEnabled = process.stderr.isTTY && !parsed.json;
95
+ const status = createStatusLine({ enabled: statusEnabled });
96
+ const run = async () => {
97
+ status.stage("Loading devbox config");
98
+ const homeDir = process.env.HOME;
99
+ const configOptions = homeDir ? { homeDir } : undefined;
100
+ const existingConfig = await loadConfig(configOptions);
101
+ const storeOptions = homeDir ? { homeDir } : undefined;
102
+ const store = await createSecretStore(undefined, storeOptions);
103
+ const tokenResult = await ensureSpritesToken(store, (message) => status.stage(message), parsed.token
104
+ ? { tokenOverride: parsed.token }
105
+ : { forceSync: true });
106
+ const token = tokenResult.token;
107
+ const tokenSource = tokenResult.source;
108
+ const apiBaseUrl = parsed.apiBaseUrl ??
109
+ resolveSpritesApiUrl(existingConfig);
110
+ let org = parsed.org ?? existingConfig?.org;
111
+ if (parsed.verify) {
112
+ status.stage("Verifying token");
113
+ const { orgs } = await listSprites(apiBaseUrl, token);
114
+ if (!org && orgs.length === 1) {
115
+ org = orgs[0];
116
+ }
117
+ else if (!org && orgs.length > 1) {
118
+ status.stop();
119
+ org = await promptForValue("Sprites org slug");
120
+ }
121
+ else if (!org && orgs.length === 0) {
122
+ status.stop();
123
+ org = await promptForValue("Sprites org slug (optional)");
124
+ if (org.length === 0)
125
+ org = undefined;
126
+ }
127
+ }
128
+ status.stage("Saving config");
129
+ await store.setToken(token);
130
+ const config = {
131
+ version: 1,
132
+ spritesApiUrl: apiBaseUrl,
133
+ tokenStore: store.kind,
134
+ tokenUpdatedAt: new Date().toISOString(),
135
+ lastSetupAt: new Date().toISOString(),
136
+ ...(org ? { org } : {}),
137
+ };
138
+ await saveConfig(config, configOptions);
139
+ status.stage("Starting dvbd");
140
+ const socketInfo = resolveSocketInfo();
141
+ const daemon = await ensureDaemonRunning(socketInfo.socketPath);
142
+ status.stop();
143
+ if (parsed.json) {
144
+ const payload = {
145
+ config,
146
+ configPath: resolveConfigPath(homeDir),
147
+ devboxDir: resolveDevboxDir(homeDir),
148
+ secretsPath: resolveSecretsPath(homeDir),
149
+ tokenStore: store.kind,
150
+ tokenSource,
151
+ daemon,
152
+ };
153
+ console.log(JSON.stringify(payload, null, 2));
154
+ return;
155
+ }
156
+ if (existingConfig && tokenSource === "store") {
157
+ console.log("dvb already set up");
158
+ }
159
+ else {
160
+ console.log("dvb setup complete");
161
+ }
162
+ console.log(`config: ${resolveConfigPath(homeDir)}`);
163
+ console.log(`secrets: ${resolveSecretsPath(homeDir)}`);
164
+ if (org)
165
+ console.log(`org: ${org}`);
166
+ console.log(`token store: ${store.kind}`);
167
+ console.log(`token source: ${tokenSource}`);
168
+ console.log(`daemon: pid ${daemon.pid}`);
169
+ console.log(`socket: ${daemon.socketPath}`);
170
+ await maybeOfferCompletionsInstall();
171
+ };
172
+ try {
173
+ await run();
174
+ }
175
+ catch (error) {
176
+ status.fail("Setup failed");
177
+ throw error;
178
+ }
179
+ finally {
180
+ status.stop();
181
+ }
182
+ };
183
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/devbox/commands/setup.ts"],"names":[],"mappings":"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"}