@hivefloor/cli 0.1.5 → 0.1.8

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 (48) hide show
  1. package/LICENSE +6 -20
  2. package/README.md +29 -8
  3. package/dist/chunk-2ERPDCOT.js +38 -0
  4. package/dist/chunk-4G362W6G.js +19 -0
  5. package/dist/chunk-5OJUJCE3.js +817 -0
  6. package/dist/{chunk-U6RRUAC2.js → chunk-5XXYQQG6.js} +53 -8
  7. package/dist/chunk-AGIYVFDQ.js +10984 -0
  8. package/dist/{chunk-RYGL6XU4.js → chunk-BLLPDPTL.js} +4 -2
  9. package/dist/{chunk-3N5JYP5O.js → chunk-FPJNGKT5.js} +5 -3
  10. package/dist/chunk-HW3KRNCO.js +201 -0
  11. package/dist/{chunk-4DRHR7LR.js → chunk-HWBUESB4.js} +1158 -196
  12. package/dist/{chunk-C627OKTW.js → chunk-K2IRTZH5.js} +7 -6
  13. package/dist/chunk-KQMPCV57.js +122 -0
  14. package/dist/{chunk-J36OIJBM.js → chunk-L6EFW2SJ.js} +14 -10
  15. package/dist/{chunk-IJRHCDIG.js → chunk-LX5A25O6.js} +4 -2
  16. package/dist/{chunk-MZGGJ6ZS.js → chunk-MYJCU5JL.js} +4 -2
  17. package/dist/{chunk-H6NYMF2D.js → chunk-NMUH5NXN.js} +6 -4
  18. package/dist/{chunk-VX7SCIF2.js → chunk-NRJONTFT.js} +3 -1
  19. package/dist/chunk-QBBKGORP.js +327 -0
  20. package/dist/{chunk-SOXRITAW.js → chunk-QGULSOQ2.js} +3 -0
  21. package/dist/{chunk-6MDJB3BV.js → chunk-QLMLB7RB.js} +17 -9
  22. package/dist/{chunk-TKMIV7BG.js → chunk-QPAFN47B.js} +3 -1
  23. package/dist/chunk-SBOEAOHD.js +48 -0
  24. package/dist/{chunk-IWIDKNWC.js → chunk-TIR4CV3P.js} +21 -17
  25. package/dist/{chunk-6XVIEX75.js → chunk-X2KH6AR4.js} +25 -303
  26. package/dist/chunk-XAXKZ572.js +106 -0
  27. package/dist/{chunk-TPMFQUAW.js → chunk-XPGL7VYE.js} +12 -0
  28. package/dist/{cli-JCBZICR3.js → cli-BFOJWJNG.js} +56 -20
  29. package/dist/connect-ZJ4JXBAJ.js +27 -0
  30. package/dist/control-6GHTZQJV.js +25 -0
  31. package/dist/{disconnect-WQMDCUXT.js → disconnect-3T25NTKX.js} +24 -17
  32. package/dist/{hook-AYJNRGIY.js → hook-TPSHBCWU.js} +277 -17
  33. package/dist/index.js +9 -6
  34. package/dist/{link-ORT4LID6.js → link-EAS5F5PC.js} +14 -11
  35. package/dist/{machine-connect-N52CKQEW.js → machine-connect-KEI4BRWF.js} +23 -17
  36. package/dist/mcp-LVIYR3EN.js +1882 -0
  37. package/dist/orch-KVRL2YA2.js +137 -0
  38. package/dist/{run-ZAZ45MKQ.js → run-JL2OZWK3.js} +1920 -28
  39. package/dist/{status-GOCFNO7K.js → status-QXOOJGGN.js} +14 -11
  40. package/dist/{token-EMM4AJAU.js → token-BFWWQIDA.js} +10 -7
  41. package/dist/{voice-F5MIS3IZ.js → voice-QXHFXRWG.js} +5 -3
  42. package/dist/{where-XFXRTP7E.js → where-CMUORQIO.js} +11 -8
  43. package/package.json +5 -6
  44. package/dist/chunk-JCLWCMEM.js +0 -8
  45. package/dist/chunk-K3NQKI34.js +0 -10
  46. package/dist/chunk-X6B6R32A.js +0 -303
  47. package/dist/connect-2HLVPEOL.js +0 -23
  48. package/dist/mcp-2SF6Y73M.js +0 -118
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __hfCreateRequire } from 'node:module';
3
+ const require = __hfCreateRequire(import.meta.url);
4
+ import {
5
+ findBin,
6
+ home
7
+ } from "./chunk-XPGL7VYE.js";
8
+
9
+ // src/service/control/proc.ts
10
+ import { execFile } from "child_process";
11
+ function runFile(file, args, opts = {}) {
12
+ return new Promise((resolve) => {
13
+ try {
14
+ const child = execFile(file, args, { timeout: opts.timeoutMs ?? 5e3, maxBuffer: 1024 * 1024, windowsHide: true, ...opts.env ? { env: opts.env } : {} }, (err, stdout, stderr) => {
15
+ if (!err) return resolve({ code: 0, stdout: String(stdout), stderr: String(stderr) });
16
+ const e = err;
17
+ const spawnError = typeof e.code === "string";
18
+ resolve({ code: typeof e.code === "number" ? e.code : null, stdout: String(stdout ?? ""), stderr: String(stderr ?? ""), ...spawnError ? { spawnError: true } : {} });
19
+ });
20
+ if (opts.input !== void 0) {
21
+ child.stdin?.on("error", () => void 0);
22
+ child.stdin?.end(opts.input);
23
+ }
24
+ } catch {
25
+ resolve({ code: null, stdout: "", stderr: "", spawnError: true });
26
+ }
27
+ });
28
+ }
29
+
30
+ // src/service/claude-bin.ts
31
+ import fs from "fs";
32
+ import path from "path";
33
+ var CLAUDE_BIN_ENV = "HIVEFLOOR_CLAUDE_BIN";
34
+ var SHELLS = /* @__PURE__ */ new Set(["sh", "bash", "zsh", "fish", "dash", "ksh"]);
35
+ var NOT_FOUND_TTL_MS = 6e4;
36
+ var LOGIN_SHELL_TIMEOUT_MS = 3e3;
37
+ function userBinDirs(homeDir = home()) {
38
+ return [path.join(homeDir, ".local", "bin"), path.join(homeDir, ".claude", "local"), "/opt/homebrew/bin", "/usr/local/bin"];
39
+ }
40
+ function claudeFallbackPaths(homeDir = home()) {
41
+ return userBinDirs(homeDir).map((d) => path.join(d, "claude"));
42
+ }
43
+ var isExecutableFile = (p) => {
44
+ try {
45
+ if (!fs.statSync(p).isFile()) return false;
46
+ fs.accessSync(p, fs.constants.X_OK);
47
+ return true;
48
+ } catch {
49
+ return false;
50
+ }
51
+ };
52
+ var lastAbsLine = (out) => {
53
+ const lines = out.split(/\r?\n/).map((l) => l.trim()).filter(Boolean);
54
+ for (let i = lines.length - 1; i >= 0; i--) if (path.isAbsolute(lines[i])) return lines[i];
55
+ return void 0;
56
+ };
57
+ function createClaudeResolver(deps = {}) {
58
+ const isExec = deps.isExecutable ?? isExecutableFile;
59
+ const now = deps.now ?? Date.now;
60
+ let found;
61
+ let missAt = -Infinity;
62
+ let warnedBadEnv = false;
63
+ const search = async () => {
64
+ const env = deps.env ?? process.env;
65
+ const homeDir = deps.home ?? home();
66
+ if ((deps.platform ?? process.platform) === "win32") {
67
+ return findBin("claude", env);
68
+ }
69
+ const explicit = env[CLAUDE_BIN_ENV];
70
+ if (explicit) {
71
+ if (path.isAbsolute(explicit) && isExec(explicit)) return explicit;
72
+ if (!warnedBadEnv) {
73
+ warnedBadEnv = true;
74
+ (deps.log ?? ((m) => console.error(m)))(`hivefloor: ${CLAUDE_BIN_ENV} is set but is not an absolute path to an executable file; ignoring it and searching for claude`);
75
+ }
76
+ }
77
+ for (const dir of (env.PATH ?? "").split(path.delimiter)) {
78
+ if (!dir || !path.isAbsolute(dir)) continue;
79
+ const p2 = path.join(dir, "claude");
80
+ if (isExec(p2)) return p2;
81
+ }
82
+ for (const p2 of claudeFallbackPaths(homeDir)) if (isExec(p2)) return p2;
83
+ const shell = env.SHELL;
84
+ if (!shell || !path.isAbsolute(shell) || !SHELLS.has(path.basename(shell)) || !isExec(shell)) return void 0;
85
+ const r = await (deps.run ?? runFile)(shell, ["-lc", "command -v claude"], { timeoutMs: LOGIN_SHELL_TIMEOUT_MS });
86
+ if (r.code !== 0) return void 0;
87
+ const p = lastAbsLine(r.stdout);
88
+ return p && isExec(p) ? p : void 0;
89
+ };
90
+ return async () => {
91
+ if (found && isExec(found)) return found;
92
+ found = void 0;
93
+ if (now() - missAt < NOT_FOUND_TTL_MS) return void 0;
94
+ found = await search();
95
+ if (!found) missAt = now();
96
+ return found;
97
+ };
98
+ }
99
+ var shared;
100
+ var resolveClaudeBin = () => (shared ??= createClaudeResolver())();
101
+
102
+ export {
103
+ runFile,
104
+ userBinDirs,
105
+ resolveClaudeBin
106
+ };
@@ -1,4 +1,6 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire as __hfCreateRequire } from 'node:module';
3
+ const require = __hfCreateRequire(import.meta.url);
2
4
 
3
5
  // src/fsutil.ts
4
6
  import fs from "fs";
@@ -17,6 +19,11 @@ var machineFile = () => path.join(configDir(), "machine.json");
17
19
  var machineSpoolFile = () => path.join(configDir(), "machine-spool.jsonl");
18
20
  var serviceStateFile = () => path.join(configDir(), "service.json");
19
21
  var serviceLogFile = () => path.join(configDir(), "service.log");
22
+ var controlFile = () => path.join(configDir(), "control.json");
23
+ var sessionsFile = () => path.join(configDir(), "sessions.json");
24
+ var controlLogFile = () => path.join(configDir(), "control.log");
25
+ var controlInboxDir = () => path.join(configDir(), "control", "inbox");
26
+ var controlDecisionsDir = () => path.join(configDir(), "control", "decisions");
20
27
  var cliDir = () => path.join(configDir(), "cli");
21
28
  var cliEntry = () => path.join(cliDir(), "index.js");
22
29
  function readText(file) {
@@ -221,6 +228,11 @@ export {
221
228
  machineSpoolFile,
222
229
  serviceStateFile,
223
230
  serviceLogFile,
231
+ controlFile,
232
+ sessionsFile,
233
+ controlLogFile,
234
+ controlInboxDir,
235
+ controlDecisionsDir,
224
236
  cliDir,
225
237
  cliEntry,
226
238
  readText,
@@ -1,22 +1,24 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire as __hfCreateRequire } from 'node:module';
3
+ const require = __hfCreateRequire(import.meta.url);
2
4
  import {
3
5
  parseArgs
4
- } from "./chunk-TKMIV7BG.js";
6
+ } from "./chunk-QPAFN47B.js";
5
7
  import {
6
8
  VERSION
7
- } from "./chunk-C627OKTW.js";
9
+ } from "./chunk-K2IRTZH5.js";
8
10
  import {
9
11
  ApiError
10
- } from "./chunk-VX7SCIF2.js";
12
+ } from "./chunk-NRJONTFT.js";
11
13
  import {
12
14
  defaultCtx
13
- } from "./chunk-SOXRITAW.js";
15
+ } from "./chunk-QGULSOQ2.js";
14
16
  import {
15
17
  CLI_BIN_NAME,
16
18
  CLI_INSTALL_COMMAND,
17
19
  cliNpxCommand
18
- } from "./chunk-4DRHR7LR.js";
19
- import "./chunk-K3NQKI34.js";
20
+ } from "./chunk-HWBUESB4.js";
21
+ import "./chunk-2ERPDCOT.js";
20
22
 
21
23
  // src/help.ts
22
24
  var HOST_NOTE = `Host: --host URL, else HIVEFLOOR_URL, else the hosted instance. Self-hosting: pass --host or set HIVEFLOOR_URL.`;
@@ -26,7 +28,7 @@ var COMMAND_HELP = {
26
28
  Connect this computer once: every agent on it (Claude profiles, Codex, ...) shows up.
27
29
 
28
30
  Options:
29
- --host URL Hivefloor server (default: HIVEFLOOR_URL, else the hosted instance)
31
+ --host URL HiveFloor server (default: HIVEFLOOR_URL, else the hosted instance)
30
32
  --name NAME Display name for this machine (default: the computer's hostname)
31
33
  --no-open Print the sign-in link instead of opening a browser
32
34
  --no-service Do not install the background service
@@ -72,6 +74,35 @@ ${HOST_NOTE}
72
74
  service: `Usage: ${CLI_BIN_NAME} service run
73
75
 
74
76
  Run the background service in the foreground. Your OS starts it for you after connect; you rarely run it by hand.
77
+ `,
78
+ control: `Usage: ${CLI_BIN_NAME} control on [--verbs message,approve,deny,stop|none] [--from owner|admins] [--replies off|after_message|always] [--orchestrator on|off]
79
+ ${CLI_BIN_NAME} control off
80
+ ${CLI_BIN_NAME} control status
81
+
82
+ Session control: let people you allow send a message to, approve or deny a permission prompt of, or stop a live Claude Code session on this computer.
83
+ Off until you turn it on here. Nothing opens a port: the service asks the server for commands. status says what a compromised server could do with the verbs that are on.
84
+
85
+ Options:
86
+ --verbs LIST Which verbs to turn on (default: message,stop). approve and deny add one synchronous PermissionRequest hook to Claude Code's settings.json
87
+ --from WHO owner (default): only the machine's owner; admins: also the project's owners and admins
88
+ --replies MODE Send the agent's last message to the server: off, after_message (default) or always
89
+ --orchestrator on|off Let the server start one Claude Code session in its own folder and type to it (docs/ORCHESTRATOR.md).
90
+ Its tool calls outside reading that folder are asked on the orchestrator page. --verbs none --orchestrator on turns on only this.
91
+ `,
92
+ orch: `Usage: ${CLI_BIN_NAME} orch enable [--full | --no-full]
93
+ ${CLI_BIN_NAME} orch disable
94
+ ${CLI_BIN_NAME} orch status
95
+
96
+ The orchestrator: let your HiveFloor account start one Claude Code session on this computer and talk to it (docs/ORCHESTRATOR.md).
97
+
98
+ enable Turn the orchestrator on. By default the session is sandboxed: its own folder, none of your settings, every tool call asked on the orchestrator page.
99
+ --full Also allow full power: a start from HiveFloor may run the session as a normal Claude Code session of yours (your settings, MCP servers,
100
+ skills and environment, any folder, resume any of your sessions by id, permission prompts bypassed when the start asks for it).
101
+ That is remote code as you: a session with prompts bypassed asks nothing, so text from fleet reports, scheduled check-ins and
102
+ tool output can make it run commands as you. Only this command can turn it on; the server cannot. It asks you to type FULL,
103
+ needs a terminal (no pipe or script), and is refused inside a Claude Code session.
104
+ --no-full Turn full power off again (a running full-power session is stopped).
105
+ disable Turn the orchestrator off (full power too). Session control verbs stay as they are.
75
106
  `,
76
107
  link: `Usage: ${CLI_BIN_NAME} link [options]
77
108
 
@@ -99,7 +130,7 @@ Options:
99
130
  `,
100
131
  mcp: `Usage: ${CLI_BIN_NAME} mcp [options]
101
132
 
102
- Stdio MCP server that proxies to Hivefloor, for tools that cannot send HTTP headers. Needs a stored token (run ${cliNpxCommand("connect")} first).
133
+ Stdio MCP server that proxies to HiveFloor, for tools that cannot send HTTP headers. Needs a stored token (run ${cliNpxCommand("connect")} first).
103
134
 
104
135
  Options:
105
136
  --url URL MCP endpoint (default: <host>/mcp)
@@ -131,7 +162,7 @@ If TalkBack is not installed, status and say print the install line and exit 1.
131
162
  `,
132
163
  hook: `Usage: ${CLI_BIN_NAME} hook <tool> <event> [--profile KEY]
133
164
 
134
- The hook runner that Claude Code, Codex and other tools call. It reads the event JSON on stdin, reports it to Hivefloor, and always exits 0 so a hook never fails the agent. You do not run it by hand; ${cliNpxCommand("connect")} installs the hook entries.
165
+ The hook runner that Claude Code, Codex and other tools call. It reads the event JSON on stdin, reports it to HiveFloor, and always exits 0 so a hook never fails the agent. You do not run it by hand; ${cliNpxCommand("connect")} installs the hook entries.
135
166
 
136
167
  Arguments:
137
168
  tool claude, codex, ...
@@ -156,11 +187,12 @@ Commands:
156
187
  disconnect Remove everything connect added, the machine on the server included (--tool <name> for one agent tool)
157
188
  status This machine and its service; the per-repo agent, its projects and live sessions
158
189
  where [tool] Which account to run next on (read only; --json for the raw answer)
190
+ control on [--verbs ...] [--from owner|admins] | off | status: let people message, approve or stop live sessions
159
191
  service run: the background service (started by your OS; you rarely run it by hand)
160
192
  link Link this repo to another project (--project ID | --new NAME [--path PREFIX])
161
193
  token Print the stored token for shell use (--reveal to print to a terminal)
162
194
  voice status | list [--agent-id ID] | say "<text>" --out file.wav: TalkBack's spoken voice on this computer
163
- mcp Stdio MCP server that proxies to Hivefloor (for tools without HTTP header support)
195
+ mcp Stdio MCP server that proxies to HiveFloor (for tools without HTTP header support)
164
196
  hook <tool> <event>: the hook runner the tools call (reads JSON on stdin)
165
197
  help Show this help (hivefloor <command> --help, or help <command>, for one command)
166
198
  --version Print the version
@@ -197,29 +229,33 @@ async function run(argv, ctx = defaultCtx()) {
197
229
  try {
198
230
  switch (cmd) {
199
231
  case "connect":
200
- return await (await import("./connect-2HLVPEOL.js")).connect(ctx, p);
232
+ return await (await import("./connect-ZJ4JXBAJ.js")).connect(ctx, p);
201
233
  case "disconnect":
202
- return await (await import("./disconnect-WQMDCUXT.js")).disconnect(ctx, p);
234
+ return await (await import("./disconnect-3T25NTKX.js")).disconnect(ctx, p);
203
235
  case "status":
204
- return await (await import("./status-GOCFNO7K.js")).status(ctx, p);
236
+ return await (await import("./status-QXOOJGGN.js")).status(ctx, p);
205
237
  case "where":
206
- return await (await import("./where-XFXRTP7E.js")).where(ctx, p);
238
+ return await (await import("./where-CMUORQIO.js")).where(ctx, p);
207
239
  case "service":
208
240
  if (p.positionals[0] !== "run") {
209
241
  ctx.err("hivefloor: usage: hivefloor service run\n");
210
242
  return 2;
211
243
  }
212
- return await (await import("./run-ZAZ45MKQ.js")).runService({ ctx });
244
+ return await (await import("./run-JL2OZWK3.js")).runService({ ctx });
245
+ case "control":
246
+ return await (await import("./control-6GHTZQJV.js")).control(ctx, p);
247
+ case "orch":
248
+ return await (await import("./orch-KVRL2YA2.js")).orch(ctx, p);
213
249
  case "link":
214
- return await (await import("./link-ORT4LID6.js")).link(ctx, p);
250
+ return await (await import("./link-EAS5F5PC.js")).link(ctx, p);
215
251
  case "token":
216
- return await (await import("./token-EMM4AJAU.js")).token(ctx, p);
252
+ return await (await import("./token-BFWWQIDA.js")).token(ctx, p);
217
253
  case "voice":
218
- return await (await import("./voice-F5MIS3IZ.js")).voice(ctx, p);
254
+ return await (await import("./voice-QXHFXRWG.js")).voice(ctx, p);
219
255
  case "mcp":
220
- return await (await import("./mcp-2SF6Y73M.js")).runMcpProxy(ctx, p);
256
+ return await (await import("./mcp-LVIYR3EN.js")).runMcpProxy(ctx, p);
221
257
  case "hook": {
222
- const { runHook, readStdin } = await import("./hook-AYJNRGIY.js");
258
+ const { runHook, readStdin } = await import("./hook-TPSHBCWU.js");
223
259
  await runHook(rest, { env: ctx.env, cwd: ctx.cwd, fetch: ctx.fetch, now: ctx.now, readStdin });
224
260
  return 0;
225
261
  }
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __hfCreateRequire } from 'node:module';
3
+ const require = __hfCreateRequire(import.meta.url);
4
+ import {
5
+ connect,
6
+ connectAgent,
7
+ resolveHost
8
+ } from "./chunk-TIR4CV3P.js";
9
+ import "./chunk-FPJNGKT5.js";
10
+ import "./chunk-QBBKGORP.js";
11
+ import "./chunk-X2KH6AR4.js";
12
+ import "./chunk-BLLPDPTL.js";
13
+ import "./chunk-QLMLB7RB.js";
14
+ import "./chunk-QPAFN47B.js";
15
+ import "./chunk-K2IRTZH5.js";
16
+ import "./chunk-LX5A25O6.js";
17
+ import "./chunk-NRJONTFT.js";
18
+ import "./chunk-XAXKZ572.js";
19
+ import "./chunk-XPGL7VYE.js";
20
+ import "./chunk-QGULSOQ2.js";
21
+ import "./chunk-HWBUESB4.js";
22
+ import "./chunk-2ERPDCOT.js";
23
+ export {
24
+ connect,
25
+ connectAgent,
26
+ resolveHost
27
+ };
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __hfCreateRequire } from 'node:module';
3
+ const require = __hfCreateRequire(import.meta.url);
4
+ import {
5
+ FULL_POWER_MEANS,
6
+ control,
7
+ describeFull
8
+ } from "./chunk-HW3KRNCO.js";
9
+ import "./chunk-5XXYQQG6.js";
10
+ import "./chunk-4G362W6G.js";
11
+ import "./chunk-X2KH6AR4.js";
12
+ import "./chunk-QPAFN47B.js";
13
+ import "./chunk-KQMPCV57.js";
14
+ import "./chunk-L6EFW2SJ.js";
15
+ import "./chunk-LX5A25O6.js";
16
+ import "./chunk-NRJONTFT.js";
17
+ import "./chunk-XPGL7VYE.js";
18
+ import "./chunk-QGULSOQ2.js";
19
+ import "./chunk-HWBUESB4.js";
20
+ import "./chunk-2ERPDCOT.js";
21
+ export {
22
+ FULL_POWER_MEANS,
23
+ control,
24
+ describeFull
25
+ };
@@ -1,38 +1,45 @@
1
1
  #!/usr/bin/env node
2
+ import { createRequire as __hfCreateRequire } from 'node:module';
3
+ const require = __hfCreateRequire(import.meta.url);
2
4
  import {
3
5
  removeCliCopy,
4
6
  removeMachineHooks
5
- } from "./chunk-U6RRUAC2.js";
7
+ } from "./chunk-5XXYQQG6.js";
8
+ import "./chunk-4G362W6G.js";
6
9
  import {
7
- claudeJson,
8
10
  geminiSettings,
9
- readManifest,
10
- removeClaude,
11
- removeCodex,
12
11
  removeCursor,
13
12
  removeGemini,
14
13
  removeGrok,
15
- removeRcLine,
14
+ removeRcLine
15
+ } from "./chunk-QBBKGORP.js";
16
+ import {
17
+ claudeJson,
18
+ readManifest,
19
+ removeClaude,
20
+ removeCodex,
16
21
  updateManifest
17
- } from "./chunk-6XVIEX75.js";
22
+ } from "./chunk-X2KH6AR4.js";
18
23
  import {
19
24
  KEYCHAIN_SERVICE,
20
25
  deleteCredentials,
21
26
  readCredentials,
22
27
  uninstallService
23
- } from "./chunk-6MDJB3BV.js";
28
+ } from "./chunk-QLMLB7RB.js";
24
29
  import {
25
30
  checkUnknownFlags,
26
31
  flagStr
27
- } from "./chunk-TKMIV7BG.js";
28
- import "./chunk-J36OIJBM.js";
32
+ } from "./chunk-QPAFN47B.js";
33
+ import "./chunk-KQMPCV57.js";
34
+ import "./chunk-L6EFW2SJ.js";
29
35
  import {
30
36
  readMachine,
31
37
  removeMachineFile
32
- } from "./chunk-IJRHCDIG.js";
38
+ } from "./chunk-LX5A25O6.js";
33
39
  import {
34
40
  apiRequest
35
- } from "./chunk-VX7SCIF2.js";
41
+ } from "./chunk-NRJONTFT.js";
42
+ import "./chunk-XAXKZ572.js";
36
43
  import {
37
44
  ConfigError,
38
45
  REAL_TOOLS,
@@ -43,14 +50,14 @@ import {
43
50
  removeFile,
44
51
  serviceLogFile,
45
52
  serviceStateFile
46
- } from "./chunk-TPMFQUAW.js";
53
+ } from "./chunk-XPGL7VYE.js";
47
54
  import {
48
55
  hostFromFlag,
49
56
  runCmd,
50
57
  sameOrigin
51
- } from "./chunk-SOXRITAW.js";
52
- import "./chunk-4DRHR7LR.js";
53
- import "./chunk-K3NQKI34.js";
58
+ } from "./chunk-QGULSOQ2.js";
59
+ import "./chunk-HWBUESB4.js";
60
+ import "./chunk-2ERPDCOT.js";
54
61
 
55
62
  // src/disconnect.ts
56
63
  import fs from "fs";
@@ -139,7 +146,7 @@ async function disconnect(ctx, p) {
139
146
  });
140
147
  const m = readManifest();
141
148
  if (Object.keys(m.tools).length === 0 && m.rc.length === 0) removeFile(manifestFile());
142
- if (lines.length === 0 && warnings.length === 0) ctx.out("Nothing to remove: no Hivefloor entries found.\n");
149
+ if (lines.length === 0 && warnings.length === 0) ctx.out("Nothing to remove: no HiveFloor entries found.\n");
143
150
  else if (lines.length > 0) {
144
151
  ctx.out("Disconnected:\n");
145
152
  for (const l of lines) ctx.out(` ${l}