@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,213 @@
1
+ import { resolveSocketInfo } from "@boxes-dev/core";
2
+ import { createSecretStore, createSpritesClient, loadConfig, resolveSpritesApiUrl, } from "@boxes-dev/core";
3
+ import { DAEMON_TIMEOUT_MS, ensureDaemonRunning, requestJson, requireDaemonFeatures, } from "../daemonClient.js";
4
+ import { recordCompletionAliases } from "../completions/index.js";
5
+ import { ensureSpritesToken } from "../auth.js";
6
+ import { logger } from "../logger.js";
7
+ import { colors } from "../ui/colors.js";
8
+ import { formatRelativeTime, formatTable, makeCell, parseIsoTimestamp, } from "./listFormatting.js";
9
+ const parseListArgs = (args) => {
10
+ const parsed = { json: false };
11
+ for (let i = 0; i < args.length; i += 1) {
12
+ const arg = args[i];
13
+ if (!arg)
14
+ continue;
15
+ if (arg === "--json") {
16
+ parsed.json = true;
17
+ continue;
18
+ }
19
+ if (arg.startsWith("-")) {
20
+ throw new Error(`Unknown list flag: ${arg}`);
21
+ }
22
+ throw new Error("Usage: dvb list [--json]");
23
+ }
24
+ return parsed;
25
+ };
26
+ const resolveBoxStateStyle = (status) => {
27
+ if (!status)
28
+ return colors.dim;
29
+ switch (status) {
30
+ case "active":
31
+ case "running":
32
+ return colors.green;
33
+ case "warm":
34
+ return colors.magenta;
35
+ case "cold":
36
+ return colors.blue;
37
+ default:
38
+ return colors.gray;
39
+ }
40
+ };
41
+ const resolveBoxStatus = (box) => {
42
+ if (box.remote !== "present") {
43
+ const errorStyle = box.remote === "missing" ? colors.red : colors.yellow;
44
+ const label = box.remote === "missing"
45
+ ? "missing"
46
+ : box.remote === "error"
47
+ ? "error"
48
+ : "-";
49
+ return { text: label, style: errorStyle, dotStyle: errorStyle };
50
+ }
51
+ const status = box.status?.toLowerCase();
52
+ const style = resolveBoxStateStyle(status);
53
+ return { text: status ?? "-", style, dotStyle: style };
54
+ };
55
+ const resolveSetupCell = (status) => {
56
+ if (status === "local_required") {
57
+ return makeCell("local setup", colors.yellow);
58
+ }
59
+ if (status === "remote_ready") {
60
+ return makeCell("remote setup", colors.yellow);
61
+ }
62
+ if (status === "complete") {
63
+ return makeCell("complete", colors.cyan);
64
+ }
65
+ return makeCell("-", colors.dim);
66
+ };
67
+ const fetchSpritesIndex = async (client) => {
68
+ const byName = new Map();
69
+ let continuationToken;
70
+ let hasMore = true;
71
+ let hadError = false;
72
+ const pageSize = 100;
73
+ try {
74
+ while (hasMore) {
75
+ const page = await client.listSprites({
76
+ maxResults: pageSize,
77
+ ...(continuationToken ? { continuationToken } : {}),
78
+ });
79
+ for (const sprite of page.sprites) {
80
+ if (!sprite || typeof sprite !== "object")
81
+ continue;
82
+ const name = "name" in sprite ? sprite.name : undefined;
83
+ if (!name || typeof name !== "string")
84
+ continue;
85
+ byName.set(name, {
86
+ ...(sprite.status ? { status: String(sprite.status) } : {}),
87
+ });
88
+ }
89
+ const nextToken = page.nextContinuationToken ?? undefined;
90
+ const pageHasMore = typeof page.hasMore === "boolean" ? page.hasMore : Boolean(nextToken);
91
+ if (!pageHasMore || !nextToken) {
92
+ break;
93
+ }
94
+ continuationToken = nextToken;
95
+ }
96
+ }
97
+ catch (error) {
98
+ hadError = true;
99
+ logger.warn("sprites_list_failed", { error: String(error) });
100
+ }
101
+ return { byName, hadError };
102
+ };
103
+ const resolveRemoteStates = (boxes, index) => boxes.map((box) => {
104
+ const state = index.byName.get(box.canonical);
105
+ if (state) {
106
+ return {
107
+ remote: "present",
108
+ ...(state.status ? { status: state.status } : {}),
109
+ };
110
+ }
111
+ return { remote: index.hadError ? "error" : "missing" };
112
+ });
113
+ export const runList = async (args) => {
114
+ const parsed = parseListArgs(args);
115
+ const socketInfo = resolveSocketInfo();
116
+ const config = await loadConfig(process.env.HOME ? { homeDir: process.env.HOME } : undefined);
117
+ const store = await createSecretStore(config?.tokenStore, process.env.HOME ? { homeDir: process.env.HOME } : undefined);
118
+ const { token } = await ensureSpritesToken(store);
119
+ const apiBaseUrl = resolveSpritesApiUrl(config);
120
+ const client = createSpritesClient({ apiBaseUrl, token });
121
+ const spritesIndexPromise = fetchSpritesIndex(client);
122
+ await ensureDaemonRunning(socketInfo.socketPath);
123
+ await requireDaemonFeatures(socketInfo.socketPath, ["boxes"]);
124
+ const response = await requestJson(socketInfo.socketPath, "GET", "/boxes", DAEMON_TIMEOUT_MS.registry);
125
+ if (response.status !== 200) {
126
+ if (response.status === 404) {
127
+ throw new Error("dvbd does not support this command. Restart the daemon and try again.");
128
+ }
129
+ throw new Error(`dvbd error: ${response.status}`);
130
+ }
131
+ try {
132
+ await recordCompletionAliases(response.body.boxes);
133
+ }
134
+ catch (error) {
135
+ logger.warn("completion_cache_update_failed", { error: String(error) });
136
+ }
137
+ const spritesIndex = await spritesIndexPromise;
138
+ const remoteStates = resolveRemoteStates(response.body.boxes, spritesIndex);
139
+ const boxesWithRemote = response.body.boxes.map((box, index) => ({
140
+ ...box,
141
+ remote: remoteStates[index]?.remote ?? "error",
142
+ ...(remoteStates[index]?.status ? { status: remoteStates[index]?.status } : {}),
143
+ }));
144
+ if (parsed.json) {
145
+ console.log(JSON.stringify({ boxes: boxesWithRemote }, null, 2));
146
+ return;
147
+ }
148
+ if (!boxesWithRemote.length) {
149
+ console.log("No devboxes found.");
150
+ return;
151
+ }
152
+ const now = Date.now();
153
+ const hasNotes = boxesWithRemote.some((box) => box.remote !== "present");
154
+ const boxRows = boxesWithRemote
155
+ .slice()
156
+ .sort((a, b) => {
157
+ const aTime = parseIsoTimestamp(a.lastUsedAt) ?? 0;
158
+ const bTime = parseIsoTimestamp(b.lastUsedAt) ?? 0;
159
+ return bTime - aTime;
160
+ })
161
+ .map((box) => {
162
+ const last = formatRelativeTime(box.lastUsedAt, now);
163
+ const { text: statusText, style: statusStyle, dotStyle, } = resolveBoxStatus(box);
164
+ const note = box.remote === "missing"
165
+ ? "server missing"
166
+ : box.remote === "error"
167
+ ? "status check failed"
168
+ : "-";
169
+ const noteStyle = note === "-"
170
+ ? colors.dim
171
+ : box.remote === "missing"
172
+ ? colors.red
173
+ : colors.yellow;
174
+ return {
175
+ alias: makeCell(`${dotStyle("●")} ${box.alias ? colors.boldWhite(box.alias) : colors.dim("-")}`),
176
+ status: makeCell(statusText, statusStyle),
177
+ setup: resolveSetupCell(box.setupStatus),
178
+ box: makeCell(box.canonical, colors.cyan),
179
+ org: makeCell(box.org ?? "-", box.org ? undefined : colors.dim),
180
+ last: makeCell(last.text, last.isNow
181
+ ? colors.green
182
+ : last.text === "-"
183
+ ? colors.dim
184
+ : undefined),
185
+ notes: makeCell(note, noteStyle),
186
+ };
187
+ });
188
+ const maxWidth = process.stdout.isTTY && process.stdout.columns
189
+ ? process.stdout.columns
190
+ : undefined;
191
+ const output = formatTable([
192
+ { key: "alias", label: " DEVBOX" },
193
+ { key: "status", label: "STATUS" },
194
+ { key: "setup", label: "SETUP" },
195
+ { key: "box", label: "SERVER" },
196
+ { key: "org", label: "ORG" },
197
+ { key: "last", label: "SEEN" },
198
+ ...(hasNotes ? [{ key: "notes", label: "NOTES" }] : []),
199
+ ], boxRows, {
200
+ gap: 2,
201
+ truncateColumnKey: "box",
202
+ headerStyle: (value) => colors
203
+ .style(value, ["dim", "underline"])
204
+ .replace(/^(\s+)/, (prefix) => colors.style(prefix, "dim")),
205
+ ...(typeof maxWidth === "number" ? { maxWidth } : {}),
206
+ });
207
+ console.log("");
208
+ for (const line of output) {
209
+ console.log(` ${line}`);
210
+ }
211
+ console.log("");
212
+ };
213
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/devbox/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export type TableColumn = {
2
+ key: string;
3
+ label: string;
4
+ align?: "left" | "right";
5
+ minWidth?: number;
6
+ };
7
+ export type TableCell = {
8
+ text: string;
9
+ style?: (value: string) => string;
10
+ };
11
+ export type TableRow = Record<string, TableCell>;
12
+ export declare const padVisible: (value: string, width: number, align?: "left" | "right") => string;
13
+ export declare const truncateText: (value: string, width: number) => string;
14
+ export declare const makeCell: (text: string, style?: (value: string) => string) => TableCell;
15
+ export declare const formatTable: (columns: TableColumn[], rows: TableRow[], options?: {
16
+ gap?: number;
17
+ maxWidth?: number;
18
+ truncateColumnKey?: string;
19
+ headerStyle?: (value: string) => string;
20
+ }) => string[];
21
+ export declare const parseIsoTimestamp: (value?: string) => number | null;
22
+ export declare const formatRelativeTime: (value?: string, now?: number) => {
23
+ text: string;
24
+ isNow: boolean;
25
+ };
26
+ export declare const formatBytesPerSecond: (value?: number) => string;
27
+ //# sourceMappingURL=listFormatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listFormatting.d.ts","sourceRoot":"","sources":["../../../src/devbox/commands/listFormatting.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAOjD,eAAO,MAAM,UAAU,GACrB,OAAO,MAAM,EACb,OAAO,MAAM,EACb,QAAO,MAAM,GAAG,OAAgB,WAMjC,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,WA4BxD,CAAC;AAEF,eAAO,MAAM,QAAQ,GACnB,MAAM,MAAM,EACZ,QAAQ,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,KAChC,SAAiD,CAAC;AAErD,eAAO,MAAM,WAAW,GACtB,SAAS,WAAW,EAAE,EACtB,MAAM,QAAQ,EAAE,EAChB,UAAU;IACR,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACzC,aAgEF,CAAC;AAYF,eAAO,MAAM,iBAAiB,GAAI,QAAQ,MAAM,kBAM/C,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,EAAE,YAAgB;;;CAiBlE,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,QAAQ,MAAM,WAalD,CAAC"}
@@ -0,0 +1,155 @@
1
+ const ANSI_ESCAPE_PATTERN = /\u001b\[[0-9;]*m/g;
2
+ const visibleLength = (value) => value.replace(ANSI_ESCAPE_PATTERN, "").length;
3
+ export const padVisible = (value, width, align = "left") => {
4
+ const length = visibleLength(value);
5
+ if (length >= width)
6
+ return value;
7
+ const padding = " ".repeat(width - length);
8
+ return align === "right" ? `${padding}${value}` : `${value}${padding}`;
9
+ };
10
+ export const truncateText = (value, width) => {
11
+ const length = visibleLength(value);
12
+ if (length <= width)
13
+ return value;
14
+ if (width <= 0)
15
+ return "";
16
+ const limit = width <= 3 ? width : width - 3;
17
+ let current = 0;
18
+ let index = 0;
19
+ let output = "";
20
+ while (index < value.length && current < limit) {
21
+ if (value[index] === "\u001b") {
22
+ const match = value.slice(index).match(/^\u001b\[[0-9;]*m/);
23
+ if (match) {
24
+ output += match[0];
25
+ index += match[0].length;
26
+ continue;
27
+ }
28
+ }
29
+ output += value[index];
30
+ current += 1;
31
+ index += 1;
32
+ }
33
+ const suffix = width <= 3 ? "" : "...";
34
+ if (value.includes("\u001b[")) {
35
+ return `${output}\u001b[0m${suffix}`;
36
+ }
37
+ return `${output}${suffix}`;
38
+ };
39
+ export const makeCell = (text, style) => (style ? { text, style } : { text });
40
+ export const formatTable = (columns, rows, options) => {
41
+ const gap = options?.gap ?? 2;
42
+ const widths = columns.map((column) => {
43
+ const base = visibleLength(column.label);
44
+ const values = rows.map((row) => {
45
+ const cell = row[column.key];
46
+ return cell ? visibleLength(cell.text) : 0;
47
+ });
48
+ const max = values.length ? Math.max(base, ...values) : base;
49
+ return Math.max(column.minWidth ?? 0, max);
50
+ });
51
+ const truncateKey = options?.truncateColumnKey;
52
+ if (options?.maxWidth && truncateKey) {
53
+ const columnIndex = columns.findIndex((column) => column.key === truncateKey);
54
+ if (columnIndex >= 0) {
55
+ const column = columns[columnIndex];
56
+ if (column) {
57
+ const totalWidth = widths.reduce((sum, value) => sum + value, 0) +
58
+ gap * (columns.length - 1);
59
+ if (totalWidth > options.maxWidth) {
60
+ const overflow = totalWidth - options.maxWidth;
61
+ const minWidth = column.minWidth ?? 8;
62
+ const currentWidth = widths[columnIndex] ?? minWidth;
63
+ widths[columnIndex] = Math.max(minWidth, currentWidth - overflow);
64
+ const nextWidth = widths[columnIndex] ?? minWidth;
65
+ for (const row of rows) {
66
+ const cell = row[truncateKey];
67
+ if (cell) {
68
+ cell.text = truncateText(cell.text, nextWidth);
69
+ }
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
75
+ const joiner = " ".repeat(gap);
76
+ const headerLine = columns
77
+ .map((column, index) => {
78
+ const width = widths[index] ?? visibleLength(column.label);
79
+ return padVisible(column.label, width, column.align ?? "left");
80
+ })
81
+ .join(joiner);
82
+ const header = options?.headerStyle
83
+ ? options.headerStyle(headerLine)
84
+ : headerLine;
85
+ const lines = rows.map((row) => columns
86
+ .map((column, index) => {
87
+ const cell = row[column.key] ?? { text: "-" };
88
+ const width = widths[index] ?? visibleLength(cell.text);
89
+ const padded = padVisible(cell.text, width, column.align ?? "left");
90
+ return cell.style ? cell.style(padded) : padded;
91
+ })
92
+ .join(joiner));
93
+ return [header, ...lines];
94
+ };
95
+ const normalizeIsoTimestamp = (value) => {
96
+ const match = value.match(/^(.+?)(\.\d+)?(Z|[+-]\d\d:\d\d)$/);
97
+ if (!match)
98
+ return value;
99
+ const [, base, fractional, tz] = match;
100
+ if (!fractional)
101
+ return `${base}${tz}`;
102
+ const digits = fractional.slice(1);
103
+ const trimmed = digits.slice(0, 3).padEnd(3, "0");
104
+ return `${base}.${trimmed}${tz}`;
105
+ };
106
+ export const parseIsoTimestamp = (value) => {
107
+ if (!value)
108
+ return null;
109
+ const normalized = normalizeIsoTimestamp(value);
110
+ const parsed = new Date(normalized);
111
+ if (Number.isNaN(parsed.getTime()))
112
+ return null;
113
+ return parsed.getTime();
114
+ };
115
+ export const formatRelativeTime = (value, now = Date.now()) => {
116
+ const timestamp = parseIsoTimestamp(value);
117
+ if (timestamp === null)
118
+ return { text: "-", isNow: false };
119
+ const deltaMs = now - timestamp;
120
+ if (deltaMs <= 60_000)
121
+ return { text: "now", isNow: true };
122
+ const minutes = Math.floor(deltaMs / 60_000);
123
+ if (minutes < 60)
124
+ return { text: `${minutes}m`, isNow: false };
125
+ const hours = Math.floor(minutes / 60);
126
+ if (hours < 24)
127
+ return { text: `${hours}h`, isNow: false };
128
+ const days = Math.floor(hours / 24);
129
+ if (days < 7)
130
+ return { text: `${days}d`, isNow: false };
131
+ const weeks = Math.floor(days / 7);
132
+ if (weeks < 5)
133
+ return { text: `${weeks}w`, isNow: false };
134
+ const months = Math.floor(days / 30);
135
+ if (months < 12)
136
+ return { text: `${months}mo`, isNow: false };
137
+ const years = Math.floor(days / 365);
138
+ return { text: `${years}y`, isNow: false };
139
+ };
140
+ export const formatBytesPerSecond = (value) => {
141
+ if (value === undefined || Number.isNaN(value))
142
+ return "-";
143
+ const abs = Math.abs(value);
144
+ const units = ["B/s", "KB/s", "MB/s", "GB/s", "TB/s"];
145
+ let scaled = abs;
146
+ let unitIndex = 0;
147
+ while (scaled >= 1024 && unitIndex < units.length - 1) {
148
+ scaled /= 1024;
149
+ unitIndex += 1;
150
+ }
151
+ const precision = unitIndex === 0 || scaled >= 10 ? 0 : 1;
152
+ const formatted = `${scaled.toFixed(precision)}${units[unitIndex]}`;
153
+ return value < 0 ? `-${formatted}` : formatted;
154
+ };
155
+ //# sourceMappingURL=listFormatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listFormatting.js","sourceRoot":"","sources":["../../../src/devbox/commands/listFormatting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const runLogout: (args: string[]) => Promise<void>;
2
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/devbox/commands/logout.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,SAAS,GAAU,MAAM,MAAM,EAAE,kBAwC7C,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { createSecretStore, loadConfig, resolveSecretsPath } from "@boxes-dev/core";
2
+ import { signOutControlPlane } from "../controlPlane.js";
3
+ import { logger } from "../logger.js";
4
+ const parseLogoutArgs = (args) => {
5
+ const parsed = {};
6
+ for (const arg of args) {
7
+ if (arg === "--json") {
8
+ parsed.json = true;
9
+ continue;
10
+ }
11
+ throw new Error(`Unknown logout flag: ${arg}`);
12
+ }
13
+ return parsed;
14
+ };
15
+ export const runLogout = async (args) => {
16
+ const parsed = parseLogoutArgs(args);
17
+ const config = await loadConfig(process.env.HOME ? { homeDir: process.env.HOME } : undefined);
18
+ const store = await createSecretStore(config?.tokenStore, process.env.HOME ? { homeDir: process.env.HOME } : undefined);
19
+ const token = await store.getControlPlaneToken();
20
+ if (!token) {
21
+ if (parsed.json) {
22
+ console.log(JSON.stringify({ ok: true, loggedOut: false, reason: "no_session" }));
23
+ return;
24
+ }
25
+ console.log("dvb already logged out");
26
+ return;
27
+ }
28
+ try {
29
+ await signOutControlPlane(token);
30
+ }
31
+ catch (error) {
32
+ logger.warn("control_plane_signout_failed", { error: String(error) });
33
+ }
34
+ await store.clearControlPlaneToken();
35
+ await store.clearControlPlaneRefreshToken();
36
+ await store.clearControlPlaneTokenExpiresAt();
37
+ await store.clearSpritesTokenSyncHash();
38
+ if (parsed.json) {
39
+ console.log(JSON.stringify({ ok: true, loggedOut: true }));
40
+ return;
41
+ }
42
+ console.log("dvb logged out");
43
+ console.log(`secrets: ${resolveSecretsPath(process.env.HOME)}`);
44
+ };
45
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/devbox/commands/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAMtC,MAAM,eAAe,GAAG,CAAC,IAAc,EAAc,EAAE;IACrD,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;YACnB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;IAChD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAC7D,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,iBAAiB,CACnC,MAAM,EAAE,UAAU,EAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAC7D,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,oBAAoB,EAAE,CAAC;IAEjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CACrE,CAAC;YACF,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,8BAA8B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,KAAK,CAAC,sBAAsB,EAAE,CAAC;IACrC,MAAM,KAAK,CAAC,6BAA6B,EAAE,CAAC;IAC5C,MAAM,KAAK,CAAC,+BAA+B,EAAE,CAAC;IAC9C,MAAM,KAAK,CAAC,yBAAyB,EAAE,CAAC;IAExC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,YAAY,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAClE,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const runMount: (args: string[]) => Promise<void>;
2
+ export declare const runUnmount: (args: string[]) => Promise<void>;
3
+ //# sourceMappingURL=mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../../src/devbox/commands/mount.ts"],"names":[],"mappings":"AAsJA,eAAO,MAAM,QAAQ,GAAU,MAAM,MAAM,EAAE,kBA+D5C,CAAC;AAEF,eAAO,MAAM,UAAU,GAAU,MAAM,MAAM,EAAE,kBAyB9C,CAAC"}
@@ -0,0 +1,144 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { createSecretStore, createSpritesClient, loadConfig, resolveDevboxDir, resolveSocketInfo, resolveSpritesApiUrl, } from "@boxes-dev/core";
5
+ import { DAEMON_TIMEOUT_MS, ensureDaemonRunning, requestJson, requireDaemonFeatures, } from "../daemonClient.js";
6
+ import { ensureSpritesToken } from "../auth.js";
7
+ import { selectDevbox } from "./boxSelect.js";
8
+ import { ensureKnownHostsFile, ensureLocalMountKey, ensureRemoteMountAccess, ensureSshdService, readLocalMountPublicKey, } from "./mountSsh.js";
9
+ const parseMountArgs = (args) => {
10
+ const parsed = {};
11
+ for (const arg of args) {
12
+ if (!arg)
13
+ continue;
14
+ if (arg.startsWith("-")) {
15
+ throw new Error(`Unknown mount flag: ${arg}`);
16
+ }
17
+ if (!parsed.box) {
18
+ parsed.box = arg;
19
+ continue;
20
+ }
21
+ throw new Error(`Unexpected argument: ${arg}`);
22
+ }
23
+ return parsed;
24
+ };
25
+ const resolveMountDir = (canonical) => path.join(resolveDevboxDir(), "mounts", canonical);
26
+ const commandExists = (command) => {
27
+ const checker = process.platform === "win32" ? "where" : "which";
28
+ const result = spawnSync(checker, [command], { stdio: "ignore" });
29
+ return result.status === 0;
30
+ };
31
+ const ensureLocalDependencies = () => {
32
+ if (!commandExists("sshfs")) {
33
+ const installHint = process.platform === "darwin"
34
+ ? "Install with: brew install macfuse sshfs"
35
+ : "Install sshfs with your package manager.";
36
+ throw new Error(`Missing sshfs. ${installHint}`);
37
+ }
38
+ if (!commandExists("ssh")) {
39
+ throw new Error("Missing ssh client.");
40
+ }
41
+ };
42
+ const resolveCanonicalBox = async (socketPath, box) => {
43
+ const aliasLookup = await requestJson(socketPath, "GET", `/registry/alias?alias=${encodeURIComponent(box)}`, DAEMON_TIMEOUT_MS.registry);
44
+ return aliasLookup.body.canonical ?? box;
45
+ };
46
+ const runCommand = (command, args, options = {}) => new Promise((resolve, reject) => {
47
+ const child = spawn(command, args, {
48
+ cwd: options.cwd,
49
+ stdio: "inherit",
50
+ });
51
+ child.on("error", reject);
52
+ child.on("exit", (code) => resolve(code ?? 0));
53
+ });
54
+ const forwardSshPort = async (socketPath, box) => {
55
+ const response = await requestJson(socketPath, "POST", "/ports/forward", DAEMON_TIMEOUT_MS.quick, { box, port: 22 });
56
+ if (response.status < 200 || response.status >= 300) {
57
+ throw new Error(`dvbd error: ${response.status}`);
58
+ }
59
+ const localPort = response.body.localPort;
60
+ if (typeof localPort !== "number") {
61
+ throw new Error("dvbd did not return a local port for SSH.");
62
+ }
63
+ return localPort;
64
+ };
65
+ const stopSshPort = async (socketPath, box) => {
66
+ const response = await requestJson(socketPath, "POST", "/ports/stop", DAEMON_TIMEOUT_MS.quick, { box, port: 22 });
67
+ if (response.status < 200 || response.status >= 300) {
68
+ throw new Error(`dvbd error: ${response.status}`);
69
+ }
70
+ };
71
+ const unmount = async (mountDir) => {
72
+ const command = process.platform === "darwin" ? "diskutil" : "umount";
73
+ const args = process.platform === "darwin" ? ["unmount", mountDir] : [mountDir];
74
+ const exitCode = await runCommand(command, args);
75
+ if (exitCode !== 0) {
76
+ throw new Error(`Failed to unmount ${mountDir}`);
77
+ }
78
+ };
79
+ export const runMount = async (args) => {
80
+ const parsed = parseMountArgs(args);
81
+ let targetBox = parsed.box;
82
+ if (!targetBox) {
83
+ const selected = await selectDevbox("Use `dvb mount <box>` to target a specific box.");
84
+ if (!selected)
85
+ return;
86
+ targetBox = selected.box;
87
+ }
88
+ const socketInfo = resolveSocketInfo();
89
+ await ensureDaemonRunning(socketInfo.socketPath);
90
+ await requireDaemonFeatures(socketInfo.socketPath, ["ports.forward"]);
91
+ const canonical = await resolveCanonicalBox(socketInfo.socketPath, targetBox);
92
+ ensureLocalDependencies();
93
+ const config = await loadConfig(process.env.HOME ? { homeDir: process.env.HOME } : undefined);
94
+ const store = await createSecretStore(config?.tokenStore, process.env.HOME ? { homeDir: process.env.HOME } : undefined);
95
+ const { token } = await ensureSpritesToken(store);
96
+ const apiBaseUrl = resolveSpritesApiUrl(config);
97
+ const client = createSpritesClient({ apiBaseUrl, token });
98
+ const { privateKeyPath } = await ensureLocalMountKey();
99
+ const publicKey = await readLocalMountPublicKey();
100
+ const knownHostsPath = await ensureKnownHostsFile();
101
+ await ensureRemoteMountAccess(client, canonical, publicKey);
102
+ await ensureSshdService(client, canonical);
103
+ const mountDir = resolveMountDir(canonical);
104
+ await fs.mkdir(mountDir, { recursive: true });
105
+ const localPort = await forwardSshPort(socketInfo.socketPath, canonical);
106
+ const sshfsArgs = [
107
+ "-o",
108
+ "reconnect,ServerAliveInterval=15,ServerAliveCountMax=3",
109
+ "-o",
110
+ `IdentityFile=${privateKeyPath}`,
111
+ "-o",
112
+ `UserKnownHostsFile=${knownHostsPath}`,
113
+ "-o",
114
+ "StrictHostKeyChecking=accept-new",
115
+ "-p",
116
+ String(localPort),
117
+ "sprite@localhost:/home/sprite",
118
+ mountDir,
119
+ ];
120
+ const exitCode = await runCommand("sshfs", sshfsArgs);
121
+ if (exitCode !== 0) {
122
+ throw new Error("sshfs failed to mount.");
123
+ }
124
+ console.log(`Mounted ${canonical} at ${mountDir}`);
125
+ };
126
+ export const runUnmount = async (args) => {
127
+ const parsed = parseMountArgs(args);
128
+ let targetBox = parsed.box;
129
+ if (!targetBox) {
130
+ const selected = await selectDevbox("Use `dvb unmount <box>` to target a specific box.");
131
+ if (!selected)
132
+ return;
133
+ targetBox = selected.box;
134
+ }
135
+ const socketInfo = resolveSocketInfo();
136
+ await ensureDaemonRunning(socketInfo.socketPath);
137
+ await requireDaemonFeatures(socketInfo.socketPath, ["ports.forward"]);
138
+ const canonical = await resolveCanonicalBox(socketInfo.socketPath, targetBox);
139
+ const mountDir = resolveMountDir(canonical);
140
+ await unmount(mountDir);
141
+ await stopSshPort(socketInfo.socketPath, canonical);
142
+ console.log(`Unmounted ${canonical} from ${mountDir}`);
143
+ };
144
+ //# sourceMappingURL=mount.js.map