volute 0.34.0 → 0.35.0

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 (209) hide show
  1. package/README.md +7 -6
  2. package/dist/accept-ZBDVVCEU.js +42 -0
  3. package/dist/{activity-events-BN7V6KCC.js → activity-events-ZW4SDL2C.js} +4 -4
  4. package/dist/{ai-service-PSILB5WD.js → ai-service-LURBEDDB.js} +5 -5
  5. package/dist/{api-client-XUXOB7LI.js → api-client-3A77HMH7.js} +1 -1
  6. package/dist/api.d.ts +1 -5618
  7. package/dist/{archive-C2VEMQOR.js → archive-ESU2FUN4.js} +3 -3
  8. package/dist/{auth-ZFZXJZDQ.js → auth-WX4TESEI.js} +5 -5
  9. package/dist/bridge-PXIO6PS2.js +206 -0
  10. package/dist/chat-QXAJF3FU.js +51 -0
  11. package/dist/{chunk-7F2SW2KD.js → chunk-2TGZJFAT.js} +3 -3
  12. package/dist/{chunk-6LXAAQ43.js → chunk-33ODGMFZ.js} +1 -1
  13. package/dist/{chunk-4JSR7YO7.js → chunk-5N7Y5WAM.js} +1 -1
  14. package/dist/{chunk-FYCALD4Q.js → chunk-5T5YMX6S.js} +1 -1
  15. package/dist/{chunk-B2BVAIZ4.js → chunk-5XJYUFZH.js} +21 -15
  16. package/dist/{chunk-M3K5AARV.js → chunk-A2ZLHBHG.js} +2 -2
  17. package/dist/{chunk-U5BTYSAL.js → chunk-AN2W47GW.js} +2 -2
  18. package/dist/{chunk-G53F3JA4.js → chunk-AOB6GVRM.js} +1 -1
  19. package/dist/{chunk-N7BLAHNE.js → chunk-BDYXIWA5.js} +5 -5
  20. package/dist/{chunk-YUIHSKR6.js → chunk-BKF4WQCY.js} +2 -2
  21. package/dist/{chunk-6OWJXUAR.js → chunk-BMZQYACC.js} +2 -2
  22. package/dist/{chunk-NAOW2CLO.js → chunk-BTY4WNFE.js} +1 -1
  23. package/dist/{chunk-MLOQKQNB.js → chunk-BV65KRHM.js} +2 -2
  24. package/dist/{chunk-XWXBJQBE.js → chunk-CORXD635.js} +4 -4
  25. package/dist/{chunk-PVY5W6QN.js → chunk-F7ZNLYKZ.js} +2 -2
  26. package/dist/{chunk-BFWHBQK4.js → chunk-FT5KETXZ.js} +3 -3
  27. package/dist/{chunk-N3DNFPVA.js → chunk-IJHIXLVN.js} +8 -8
  28. package/dist/{chunk-V6ZCNULL.js → chunk-J6CJQDWI.js} +37 -28
  29. package/dist/{chunk-4RQBJWQX.js → chunk-LOPXTW6H.js} +1 -1
  30. package/dist/{chunk-47ZPNLF4.js → chunk-MDJGMOSD.js} +8 -137
  31. package/dist/{chunk-BTWAGDV5.js → chunk-N446KRP7.js} +3 -3
  32. package/dist/{chunk-6WAWMWR5.js → chunk-N5LMGYXX.js} +2 -2
  33. package/dist/{chunk-G6BSYHPK.js → chunk-NJK5SDGR.js} +1 -1
  34. package/dist/{chunk-D424ZQGI.js → chunk-O7IGP7ZW.js} +11 -3
  35. package/dist/{chunk-2IOP6PHB.js → chunk-OTC67N2Z.js} +2 -2
  36. package/dist/{chunk-V45JXOWY.js → chunk-PWQ2ITYG.js} +4 -4
  37. package/dist/{chunk-KTLFDYPT.js → chunk-QCH6K235.js} +1 -1
  38. package/dist/chunk-QHG4OMZL.js +145 -0
  39. package/dist/{chunk-IS7WJ56Q.js → chunk-QWTR6AWZ.js} +3 -3
  40. package/dist/chunk-TXSA4Q3V.js +116 -0
  41. package/dist/{chunk-BDK73LK6.js → chunk-VHJRZM2S.js} +2 -2
  42. package/dist/{chunk-SSI47XP2.js → chunk-VHWGEJ4V.js} +1 -1
  43. package/dist/chunk-VY3RB2V7.js +164 -0
  44. package/dist/chunk-WJPROOU5.js +8314 -0
  45. package/dist/{chunk-E5C7OWZ2.js → chunk-WZRZFFCL.js} +8 -8
  46. package/dist/{chunk-BM474GX6.js → chunk-XRQSAMX2.js} +4 -4
  47. package/dist/{chunk-OYAKCAVY.js → chunk-ZSR72JB3.js} +1 -1
  48. package/dist/{chunk-PLDWHR4D.js → chunk-ZX7EAV5J.js} +17 -7
  49. package/dist/cli.js +90 -29
  50. package/dist/clock-HSEKS5AR.js +289 -0
  51. package/dist/{cloud-sync-TG3TIX5H.js → cloud-sync-6JL4C24T.js} +21 -22
  52. package/dist/config-UTS7QULS.js +76 -0
  53. package/dist/connectors/discord-bridge.js +3 -3
  54. package/dist/connectors/slack-bridge.js +3 -3
  55. package/dist/connectors/telegram-bridge.js +3 -3
  56. package/dist/{conversations-HL2JP5GI.js → conversations-2PW57WO2.js} +5 -5
  57. package/dist/create-5BPOOJAN.js +75 -0
  58. package/dist/create-UVCK2CS6.js +50 -0
  59. package/dist/daemon-client-RVIKXGFQ.js +12 -0
  60. package/dist/daemon-restart-HSZ3BCX5.js +65 -0
  61. package/dist/daemon.js +845 -1766
  62. package/dist/{db-PLEDCBHZ.js → db-BDMH4SZ2.js} +7 -3
  63. package/dist/{db-RYX3SS2W.js → db-BVBJ57TU.js} +2 -2
  64. package/dist/delete-L5PAVDGQ.js +42 -0
  65. package/dist/delivery-manager-H5ZVBMCQ.js +31 -0
  66. package/dist/{delivery-router-D5ELDMS2.js → delivery-router-HEJSJAHQ.js} +4 -4
  67. package/dist/down-74VXM45A.js +17 -0
  68. package/dist/env-E4XHO2BI.js +223 -0
  69. package/dist/{exec-DVLXKRIO.js → exec-PY7THYH4.js} +4 -4
  70. package/dist/export-OAS6QVBN.js +113 -0
  71. package/dist/{extension-PM42QCID.js → extension-D74CNM7G.js} +25 -33
  72. package/dist/{extensions-BBGVL5JC.js → extensions-XDDFY72A.js} +22 -11
  73. package/dist/files-CWTK6V3H.js +53 -0
  74. package/dist/import-5A3T7QV4.js +143 -0
  75. package/dist/{isolation-62MKDZN3.js → isolation-TK5RX2WM.js} +3 -3
  76. package/dist/join-DF5XSJAC.js +67 -0
  77. package/dist/list-PDMQM7ZV.js +53 -0
  78. package/dist/login-7TE6CIZF.js +60 -0
  79. package/dist/login-GOTAYLXP.js +51 -0
  80. package/dist/logout-6KIA74EV.js +29 -0
  81. package/dist/logout-T4XS6LRU.js +50 -0
  82. package/dist/message-delivery-GRC4W6P7.js +41 -0
  83. package/dist/mind-5IEYKV7I.js +97 -0
  84. package/dist/{mind-activity-tracker-2ACNHA7B.js → mind-activity-tracker-QBLIV7ZJ.js} +5 -5
  85. package/dist/{mind-history-WOYFLQAI.js → mind-history-IE2QH7U5.js} +82 -71
  86. package/dist/mind-list-GEWHWAL4.js +38 -0
  87. package/dist/mind-manager-HFLB5653.js +31 -0
  88. package/dist/mind-profile-DCBDVF5B.js +53 -0
  89. package/dist/mind-service-X2CAA6W6.js +37 -0
  90. package/dist/mind-sleep-ITCF6OQA.js +47 -0
  91. package/dist/mind-status-X4SX3YUG.js +65 -0
  92. package/dist/mind-wake-KXMKMGWX.js +42 -0
  93. package/dist/{package-V2WHWVG6.js → package-D2FSVFAX.js} +5 -5
  94. package/dist/read-67VRP2DO.js +91 -0
  95. package/dist/{read-stdin-PIRM6A2Y.js → read-stdin-3X5VYKNS.js} +1 -1
  96. package/dist/register-SB7NXCOE.js +51 -0
  97. package/dist/{registry-UYV5S6QT.js → registry-GBSNW3HG.js} +2 -2
  98. package/dist/reject-MUR2KWJ4.js +40 -0
  99. package/dist/restart-5EGG4JXU.js +42 -0
  100. package/dist/{sandbox-SI5HMBP3.js → sandbox-R37VIU36.js} +5 -5
  101. package/dist/scheduler-Y7O4CJXL.js +31 -0
  102. package/dist/{schema-ETMABTW4.js → schema-XVZ2CLKW.js} +1 -1
  103. package/dist/{seed-WNGI6PNW.js → seed-EQORWX77.js} +2 -2
  104. package/dist/seed-check-KJNTL72M.js +35 -0
  105. package/dist/seed-cmd-ZM2XGVU2.js +30 -0
  106. package/dist/seed-create-DRWGGHEI.js +113 -0
  107. package/dist/seed-sprout-JYXGXOP3.js +148 -0
  108. package/dist/send-JBJJQ7CA.js +409 -0
  109. package/dist/service-WNPCNHOX.js +121 -0
  110. package/dist/{setup-Z3DEVWV7.js → setup-BJ4YAY26.js} +153 -127
  111. package/dist/{setup-GGMKENLN.js → setup-RHJRFURI.js} +3 -3
  112. package/dist/skill-TAAKEYBV.js +389 -0
  113. package/dist/skills/volute-mind/SKILL.md +3 -7
  114. package/dist/skills/volute-mind/references/extensions.md +8 -11
  115. package/dist/{skills-Q6VZ2UGD.js → skills-EKMCQ46K.js} +7 -7
  116. package/dist/sleep-manager-7KFK3USC.js +35 -0
  117. package/dist/spirit-ZFRDXMG7.js +23 -0
  118. package/dist/split-AWVOYOPZ.js +64 -0
  119. package/dist/{sprout-E3HJIV2Z.js → sprout-HE4TITMK.js} +2 -2
  120. package/dist/start-3UXOPXQG.js +39 -0
  121. package/dist/status-ZK34WYIM.js +125 -0
  122. package/dist/stop-3XYIBGFM.js +41 -0
  123. package/dist/system-chat-IDPHYHY4.js +35 -0
  124. package/dist/systems-O43WGQY6.js +52 -0
  125. package/dist/{tailscale-ZEUK7GKZ.js → tailscale-ZIZ2HWJ5.js} +4 -4
  126. package/dist/{template-hash-EJRTKE36.js → template-hash-A7FNHTB7.js} +2 -2
  127. package/dist/up-77ICEDEW.js +19 -0
  128. package/dist/update-ANE5ZM7F.js +225 -0
  129. package/dist/{update-check-X3YG4WVP.js → update-check-UV55CBEP.js} +3 -3
  130. package/dist/upgrade-ZMDGC7M2.js +74 -0
  131. package/dist/variant-QWL2WSRI.js +62 -0
  132. package/dist/{version-notify-YCH4UVQ2.js → version-notify-FXSEMXWW.js} +28 -27
  133. package/dist/{volute-config-WBKYJGYQ.js → volute-config-D2XVS2YI.js} +1 -1
  134. package/dist/web-assets/assets/index-BhxWKvbB.css +1 -0
  135. package/dist/web-assets/assets/index-CHVKJ9II.js +75 -0
  136. package/dist/web-assets/index.html +2 -2
  137. package/dist/web-assets/sw.js +117 -0
  138. package/package.json +5 -5
  139. package/packages/extensions/pages/dist/ui/assets/index-DKZLNMED.js +2 -0
  140. package/packages/extensions/pages/dist/ui/index.html +1 -1
  141. package/packages/extensions/pages/skills/pages/SKILL.md +84 -9
  142. package/templates/_base/src/lib/auto-commit.ts +8 -8
  143. package/templates/_base/src/lib/volute-server.ts +6 -0
  144. package/templates/claude/src/agent.ts +8 -1
  145. package/dist/accept-TW6V4WI4.js +0 -42
  146. package/dist/bridge-O753D5F4.js +0 -207
  147. package/dist/chat-BHYX7DJ4.js +0 -68
  148. package/dist/chunk-47XDEWWV.js +0 -156
  149. package/dist/chunk-CVL5IGIR.js +0 -2084
  150. package/dist/chunk-PB65JZK2.js +0 -85
  151. package/dist/chunk-TAHX36HZ.js +0 -3679
  152. package/dist/clock-3X4DSC2N.js +0 -281
  153. package/dist/config-OROA5DUA.js +0 -72
  154. package/dist/create-3SEKKI6P.js +0 -71
  155. package/dist/create-UOSOQ2HN.js +0 -44
  156. package/dist/daemon-client-WOAQXXBM.js +0 -12
  157. package/dist/daemon-restart-5ABHNXJZ.js +0 -52
  158. package/dist/delete-KYOVWR23.js +0 -35
  159. package/dist/delivery-manager-2BR5NZKF.js +0 -32
  160. package/dist/down-QVFN4UPK.js +0 -15
  161. package/dist/env-R34DT7XL.js +0 -195
  162. package/dist/export-6ZXAXATG.js +0 -112
  163. package/dist/files-VQV2VZQO.js +0 -47
  164. package/dist/import-MK2I2T6F.js +0 -23
  165. package/dist/join-DGYHTJUH.js +0 -66
  166. package/dist/list-C644WTHV.js +0 -49
  167. package/dist/login-IIGEQPHL.js +0 -47
  168. package/dist/login-KZQLMAWE.js +0 -47
  169. package/dist/logout-AGTZVRGP.js +0 -40
  170. package/dist/logout-KD6GXIJJ.js +0 -21
  171. package/dist/message-delivery-V3R6NXJP.js +0 -42
  172. package/dist/mind-BI4EPBVZ.js +0 -108
  173. package/dist/mind-list-6VPM7GUQ.js +0 -30
  174. package/dist/mind-manager-MWW3BTS4.js +0 -32
  175. package/dist/mind-profile-WPG42U5Y.js +0 -47
  176. package/dist/mind-service-VIKZJK2M.js +0 -38
  177. package/dist/mind-sleep-XDISJY74.js +0 -42
  178. package/dist/mind-status-7FTZWPZF.js +0 -56
  179. package/dist/mind-wake-KIIKEI3A.js +0 -37
  180. package/dist/read-H5C26YO7.js +0 -85
  181. package/dist/register-J27WP33N.js +0 -47
  182. package/dist/reject-OEANJYIA.js +0 -40
  183. package/dist/restart-V5EGYBJG.js +0 -33
  184. package/dist/scheduler-AGG3L2FO.js +0 -32
  185. package/dist/seed-check-PXTH7YXS.js +0 -32
  186. package/dist/seed-cmd-VENFTGS3.js +0 -36
  187. package/dist/seed-create-663ALOKH.js +0 -112
  188. package/dist/seed-sprout-EH3AGKAI.js +0 -132
  189. package/dist/send-7FUUUZZH.js +0 -386
  190. package/dist/skill-DKNYJS4P.js +0 -362
  191. package/dist/skills/shared-files/SKILL.md +0 -44
  192. package/dist/skills/shared-files/scripts/merge.ts +0 -72
  193. package/dist/skills/shared-files/scripts/pull.ts +0 -52
  194. package/dist/sleep-manager-BJK2ROPX.js +0 -36
  195. package/dist/spirit-4JP4TY4C.js +0 -23
  196. package/dist/split-3YPMS2CL.js +0 -63
  197. package/dist/start-W3TPKX4D.js +0 -33
  198. package/dist/status-4OVFXFEJ.js +0 -115
  199. package/dist/stop-GTT6YWYO.js +0 -32
  200. package/dist/system-channel-DXD2JBOU.js +0 -36
  201. package/dist/system-chat-TYLOL7SX.js +0 -36
  202. package/dist/systems-AYLO727G.js +0 -61
  203. package/dist/up-PA7F2CXE.js +0 -18
  204. package/dist/update-HG4LCUSG.js +0 -215
  205. package/dist/upgrade-YGNIDICG.js +0 -67
  206. package/dist/variant-MZUMRTQO.js +0 -41
  207. package/dist/web-assets/assets/index-DiiwC-CZ.css +0 -1
  208. package/dist/web-assets/assets/index-d6y5b9Ij.js +0 -75
  209. package/packages/extensions/pages/dist/ui/assets/index-tLTROSk5.js +0 -2
@@ -5,25 +5,26 @@ import {
5
5
  SYSTEM_LAUNCHD_PLIST_PATH,
6
6
  SYSTEM_SERVICE_PATH,
7
7
  USER_SYSTEMD_UNIT
8
- } from "./chunk-7F2SW2KD.js";
8
+ } from "./chunk-2TGZJFAT.js";
9
9
  import {
10
10
  promptLine
11
- } from "./chunk-SSI47XP2.js";
11
+ } from "./chunk-VHWGEJ4V.js";
12
12
  import {
13
- parseArgs
14
- } from "./chunk-D424ZQGI.js";
13
+ command
14
+ } from "./chunk-TXSA4Q3V.js";
15
+ import "./chunk-O7IGP7ZW.js";
15
16
  import {
16
17
  resolveVoluteBin
17
- } from "./chunk-U5BTYSAL.js";
18
+ } from "./chunk-AN2W47GW.js";
18
19
  import {
19
20
  ensureVoluteGroup
20
- } from "./chunk-BDK73LK6.js";
21
+ } from "./chunk-VHJRZM2S.js";
21
22
  import {
22
23
  readGlobalConfig,
23
24
  writeGlobalConfig
24
- } from "./chunk-6OWJXUAR.js";
25
- import "./chunk-N7BLAHNE.js";
26
- import "./chunk-4JSR7YO7.js";
25
+ } from "./chunk-BMZQYACC.js";
26
+ import "./chunk-BDYXIWA5.js";
27
+ import "./chunk-5N7Y5WAM.js";
27
28
  import "./chunk-7KJOFUNN.js";
28
29
 
29
30
  // src/commands/setup.ts
@@ -272,133 +273,158 @@ export VOLUTE_MINDS_DIR=${MINDS_DIR}
272
273
  console.log(` Wrote ${PROFILE_PATH}`);
273
274
  }
274
275
  }
275
- async function run(args) {
276
- const { flags } = parseArgs(args, {
277
- name: { type: "string" },
278
- system: { type: "boolean" },
279
- service: { type: "boolean" },
280
- dir: { type: "string" },
281
- port: { type: "number" },
282
- host: { type: "string" }
283
- });
284
- const isInteractive = !flags.name && process.stdin.isTTY;
285
- let systemName;
286
- let setupType;
287
- let wantService;
288
- const port = flags.port;
289
- const host = flags.host;
290
- if (isInteractive) {
291
- console.log("Welcome to Volute!\n");
292
- systemName = await promptLine("System name: ");
293
- if (!systemName.trim()) {
294
- console.error("System name is required.");
295
- process.exit(1);
296
- }
297
- systemName = systemName.trim();
298
- console.log("\nInstall type:");
299
- console.log(" 1. Local (minds in ~/.volute/minds/, sandbox isolation)");
300
- console.log(" 2. System (minds in /minds, per-user isolation, requires sudo)");
301
- const typeChoice = await promptLine("> ");
302
- setupType = typeChoice.trim() === "2" ? "system" : "local";
303
- if (setupType === "system" && process.getuid?.() !== 0) {
304
- console.error("\nSystem install requires root. Re-run with sudo.");
305
- process.exit(1);
306
- }
307
- const serviceDefault = setupType === "system" ? "Y/n" : "y/N";
308
- const servicePrompt = `
276
+ var cmd = command({
277
+ name: "volute setup",
278
+ description: "First-time Volute setup",
279
+ flags: {
280
+ name: { type: "string", description: "System name" },
281
+ system: { type: "boolean", description: "System-level install" },
282
+ service: { type: "boolean", description: "Install as service" },
283
+ remote: { type: "boolean", description: "Allow access from other devices" },
284
+ dir: { type: "string", description: "Data directory" },
285
+ port: { type: "number", description: "Daemon port" },
286
+ host: { type: "string", description: "Daemon host" }
287
+ },
288
+ run: async ({ flags }) => {
289
+ const isInteractive = !flags.name && process.stdin.isTTY;
290
+ let systemName;
291
+ let setupType;
292
+ let wantService;
293
+ let wantRemote = flags.remote ?? false;
294
+ const port = flags.port;
295
+ let host = flags.host;
296
+ if (isInteractive) {
297
+ console.log("Welcome to Volute!\n");
298
+ systemName = await promptLine("System name: ");
299
+ if (!systemName.trim()) {
300
+ console.error("System name is required.");
301
+ process.exit(1);
302
+ }
303
+ systemName = systemName.trim();
304
+ console.log("\nInstall type:");
305
+ console.log(" 1. Local (minds in ~/.volute/minds/, sandbox isolation)");
306
+ console.log(" 2. System (minds in /minds, per-user isolation, requires sudo)");
307
+ const typeChoice = await promptLine("> ");
308
+ setupType = typeChoice.trim() === "2" ? "system" : "local";
309
+ if (setupType === "system" && process.getuid?.() !== 0) {
310
+ console.error("\nSystem install requires root. Re-run with sudo.");
311
+ process.exit(1);
312
+ }
313
+ if (!host) {
314
+ const remoteAnswer = (await promptLine("\nAllow access from other devices on the network? [y/N]: ")).trim().toLowerCase();
315
+ if (remoteAnswer === "y" || remoteAnswer === "yes") {
316
+ wantRemote = true;
317
+ host = "0.0.0.0";
318
+ }
319
+ }
320
+ const serviceDefault = setupType === "system" ? "Y/n" : "y/N";
321
+ const servicePrompt = `
309
322
  Install as a service (auto-start on boot)? [${serviceDefault}]: `;
310
- const serviceAnswer = (await promptLine(servicePrompt)).trim().toLowerCase();
311
- if (setupType === "system") {
312
- wantService = serviceAnswer !== "n";
323
+ const serviceAnswer = (await promptLine(servicePrompt)).trim().toLowerCase();
324
+ if (setupType === "system") {
325
+ wantService = serviceAnswer !== "n";
326
+ } else {
327
+ wantService = serviceAnswer === "y" || serviceAnswer === "yes";
328
+ }
313
329
  } else {
314
- wantService = serviceAnswer === "y" || serviceAnswer === "yes";
315
- }
316
- } else {
317
- if (!flags.name) {
318
- console.error("Error: --name is required in non-interactive mode.");
319
- console.error("Usage: volute setup --name <name> [--system] [--service] [--dir <path>]");
320
- process.exit(1);
321
- }
322
- systemName = flags.name;
323
- setupType = flags.system ? "system" : "local";
324
- wantService = flags.service ?? setupType === "system";
325
- if (setupType === "system" && process.getuid?.() !== 0) {
326
- console.error("Error: system install requires root (use sudo).");
327
- process.exit(1);
328
- }
329
- }
330
- if (host) validateHost(host);
331
- console.log("\nSetting up...");
332
- let isolation;
333
- let mindsDir;
334
- let configHome;
335
- if (setupType === "system") {
336
- configHome = DATA_DIR;
337
- mindsDir = MINDS_DIR;
338
- isolation = "user";
339
- process.env.VOLUTE_HOME = DATA_DIR;
340
- process.env.VOLUTE_MINDS_DIR = MINDS_DIR;
341
- setupSystemDirectories();
342
- ensureVoluteGroup({ force: true });
343
- console.log(" Ensured volute group exists");
344
- setupSystemGitIdentity();
345
- const voluteBin = resolveVoluteBin();
346
- setupSystemWrapper(voluteBin);
347
- setupSystemEnvProfile();
348
- if (wantService) {
349
- if (!installSystemService(voluteBin, port, host)) wantService = false;
350
- }
351
- } else {
352
- configHome = flags.dir ? resolve(flags.dir) : resolve(homedir(), ".volute");
353
- if (flags.dir) {
354
- process.env.VOLUTE_HOME = configHome;
330
+ if (!flags.name) {
331
+ console.error("Error: --name is required in non-interactive mode.");
332
+ console.error(
333
+ "Usage: volute setup --name <name> [--system] [--service] [--remote] [--dir <path>]"
334
+ );
335
+ process.exit(1);
336
+ }
337
+ systemName = flags.name;
338
+ setupType = flags.system ? "system" : "local";
339
+ wantService = flags.service ?? setupType === "system";
340
+ if (wantRemote && !host) {
341
+ host = "0.0.0.0";
342
+ }
343
+ if (setupType === "system" && process.getuid?.() !== 0) {
344
+ console.error("Error: system install requires root (use sudo).");
345
+ process.exit(1);
346
+ }
355
347
  }
356
- mindsDir = resolve(configHome, "minds");
357
- isolation = "sandbox";
358
- mkdirSync(configHome, { recursive: true });
359
- console.log(` Created ${configHome}`);
360
- mkdirSync(mindsDir, { recursive: true });
361
- console.log(" Sandbox enabled for mind isolation");
362
- if (wantService) {
348
+ if (host) validateHost(host);
349
+ console.log("\nSetting up...");
350
+ let isolation;
351
+ let mindsDir;
352
+ let configHome;
353
+ if (setupType === "system") {
354
+ configHome = DATA_DIR;
355
+ mindsDir = MINDS_DIR;
356
+ isolation = "user";
357
+ process.env.VOLUTE_HOME = DATA_DIR;
358
+ process.env.VOLUTE_MINDS_DIR = MINDS_DIR;
359
+ setupSystemDirectories();
360
+ ensureVoluteGroup({ force: true });
361
+ console.log(" Ensured volute group exists");
362
+ setupSystemGitIdentity();
363
363
  const voluteBin = resolveVoluteBin();
364
- if (!await installUserService(voluteBin, port, host)) wantService = false;
364
+ setupSystemWrapper(voluteBin);
365
+ setupSystemEnvProfile();
366
+ if (wantService) {
367
+ if (!installSystemService(voluteBin, port, host)) wantService = false;
368
+ }
369
+ } else {
370
+ configHome = flags.dir ? resolve(flags.dir) : resolve(homedir(), ".volute");
371
+ if (flags.dir) {
372
+ process.env.VOLUTE_HOME = configHome;
373
+ }
374
+ mindsDir = resolve(configHome, "minds");
375
+ isolation = "sandbox";
376
+ mkdirSync(configHome, { recursive: true });
377
+ console.log(` Created ${configHome}`);
378
+ mkdirSync(mindsDir, { recursive: true });
379
+ console.log(" Sandbox enabled for mind isolation");
380
+ if (wantService) {
381
+ const voluteBin = resolveVoluteBin();
382
+ if (!await installUserService(voluteBin, port, host)) wantService = false;
383
+ }
365
384
  }
366
- }
367
- const existingConfig = readGlobalConfig();
368
- const setup = {
369
- type: setupType,
370
- mindsDir,
371
- isolation,
372
- service: wantService
373
- };
374
- const config = {
375
- ...existingConfig,
376
- name: systemName,
377
- setup,
378
- setupCompleted: true
379
- };
380
- if (port != null) config.port = port;
381
- if (host) config.hostname = host;
382
- writeGlobalConfig(config);
383
- if (isInteractive) {
384
- const wantAi = (await promptLine("\nConfigure an AI provider? (optional) [y/N]: ")).trim().toLowerCase();
385
- if (wantAi === "y" || wantAi === "yes") {
386
- const aiProvider = (await promptLine("Provider (anthropic, openai, google, etc.): ")).trim();
387
- if (aiProvider) {
388
- const aiApiKey = (await promptLine("API key (leave empty to use env var): ")).trim();
389
- if (aiApiKey) {
390
- const { saveProviderConfig } = await import("./ai-service-PSILB5WD.js");
391
- saveProviderConfig(aiProvider, { apiKey: aiApiKey });
392
- console.log(` AI provider configured: ${aiProvider}`);
393
- } else {
394
- console.log(` Using env var for ${aiProvider} (no explicit key saved)`);
385
+ const existingConfig = readGlobalConfig();
386
+ const setup = {
387
+ type: setupType,
388
+ mindsDir,
389
+ isolation,
390
+ service: wantService
391
+ };
392
+ const config = {
393
+ ...existingConfig,
394
+ name: systemName,
395
+ setup,
396
+ setupCompleted: true
397
+ };
398
+ if (port != null) config.port = port;
399
+ if (host) config.hostname = host;
400
+ writeGlobalConfig(config);
401
+ if (isInteractive) {
402
+ const wantAi = (await promptLine("\nConfigure an AI provider? (optional) [y/N]: ")).trim().toLowerCase();
403
+ if (wantAi === "y" || wantAi === "yes") {
404
+ const aiProvider = (await promptLine("Provider (anthropic, openai, google, etc.): ")).trim();
405
+ if (aiProvider) {
406
+ const aiApiKey = (await promptLine("API key (leave empty to use env var): ")).trim();
407
+ if (aiApiKey) {
408
+ const { saveProviderConfig } = await import("./ai-service-LURBEDDB.js");
409
+ saveProviderConfig(aiProvider, { apiKey: aiApiKey });
410
+ console.log(` AI provider configured: ${aiProvider}`);
411
+ } else {
412
+ console.log(` Using env var for ${aiProvider} (no explicit key saved)`);
413
+ }
395
414
  }
396
415
  }
397
416
  }
398
- }
399
- console.log(`
417
+ console.log(`
400
418
  Done! Use \`volute mind create <name>\` to create your first mind.`);
401
- }
419
+ if (wantRemote || host === "0.0.0.0" || host === "::") {
420
+ const displayPort = port ?? 1618;
421
+ console.log(`
422
+ Remote access enabled. Connect from other devices at:`);
423
+ console.log(` http://<this-machine-ip>:${displayPort}/`);
424
+ }
425
+ }
426
+ });
427
+ var run = cmd.execute;
402
428
  export {
403
429
  run
404
430
  };
@@ -6,9 +6,9 @@ import {
6
6
  migrateSetupCompleted,
7
7
  readGlobalConfig,
8
8
  writeGlobalConfig
9
- } from "./chunk-6OWJXUAR.js";
10
- import "./chunk-N7BLAHNE.js";
11
- import "./chunk-4JSR7YO7.js";
9
+ } from "./chunk-BMZQYACC.js";
10
+ import "./chunk-BDYXIWA5.js";
11
+ import "./chunk-5N7Y5WAM.js";
12
12
  import "./chunk-7KJOFUNN.js";
13
13
  export {
14
14
  configPath,