volute 0.34.0 → 0.36.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 (227) 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-PWOGSMRL.js} +4 -4
  4. package/dist/{ai-service-PSILB5WD.js → ai-service-GSZWIETO.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-Y2YEOCGB.js} +3 -3
  8. package/dist/{auth-ZFZXJZDQ.js → auth-YTQME4EV.js} +5 -5
  9. package/dist/bridge-PXIO6PS2.js +206 -0
  10. package/dist/chat-ED7YOGKO.js +51 -0
  11. package/dist/{chunk-6LXAAQ43.js → chunk-33ODGMFZ.js} +1 -1
  12. package/dist/{chunk-G53F3JA4.js → chunk-46DYYHN6.js} +8 -3
  13. package/dist/{chunk-FYCALD4Q.js → chunk-5T5YMX6S.js} +1 -1
  14. package/dist/{chunk-B2BVAIZ4.js → chunk-6F3YNULE.js} +76 -24
  15. package/dist/{chunk-N7BLAHNE.js → chunk-75AJ54GM.js} +16 -5
  16. package/dist/{chunk-4JSR7YO7.js → chunk-7PTQGPJY.js} +29 -13
  17. package/dist/{chunk-XWXBJQBE.js → chunk-B35VNNSS.js} +4 -4
  18. package/dist/{chunk-V45JXOWY.js → chunk-BOLJUV77.js} +4 -4
  19. package/dist/{chunk-NAOW2CLO.js → chunk-BTY4WNFE.js} +1 -1
  20. package/dist/{chunk-OYAKCAVY.js → chunk-CU6OFXMM.js} +1 -1
  21. package/dist/{chunk-7F2SW2KD.js → chunk-DJT5Y4UF.js} +3 -3
  22. package/dist/{chunk-BM474GX6.js → chunk-DMV5P2LU.js} +4 -4
  23. package/dist/{chunk-TAHX36HZ.js → chunk-DQ7VBXAP.js} +2014 -436
  24. package/dist/{chunk-N3DNFPVA.js → chunk-GBDVNPN2.js} +15 -13
  25. package/dist/{chunk-E5C7OWZ2.js → chunk-IIWF2IPD.js} +150 -190
  26. package/dist/{chunk-PVY5W6QN.js → chunk-KAB6UGOL.js} +2 -2
  27. package/dist/{chunk-BDK73LK6.js → chunk-L72WYMF7.js} +2 -2
  28. package/dist/{chunk-G6BSYHPK.js → chunk-LGNUFVMR.js} +1 -1
  29. package/dist/{chunk-4RQBJWQX.js → chunk-LOPXTW6H.js} +1 -1
  30. package/dist/{chunk-BFWHBQK4.js → chunk-M5RYAA5I.js} +3 -3
  31. package/dist/{chunk-V6ZCNULL.js → chunk-N2AUHW4C.js} +37 -28
  32. package/dist/{chunk-6OWJXUAR.js → chunk-NUX47Y2V.js} +19 -4
  33. package/dist/{chunk-D424ZQGI.js → chunk-O7IGP7ZW.js} +11 -3
  34. package/dist/{chunk-U5BTYSAL.js → chunk-PJ4IPTIN.js} +2 -2
  35. package/dist/{chunk-BTWAGDV5.js → chunk-PY557GDR.js} +3 -3
  36. package/dist/{chunk-47ZPNLF4.js → chunk-PZYJBOQP.js} +8 -137
  37. package/dist/chunk-QHG4OMZL.js +145 -0
  38. package/dist/chunk-RG5TOL4O.js +18 -0
  39. package/dist/{chunk-6WAWMWR5.js → chunk-SWW6AUVW.js} +2 -2
  40. package/dist/{chunk-YUIHSKR6.js → chunk-T2TP6ZC6.js} +20 -8
  41. package/dist/chunk-TWAN7ZNO.js +164 -0
  42. package/dist/chunk-TXSA4Q3V.js +116 -0
  43. package/dist/{chunk-KTLFDYPT.js → chunk-UI7RPV2B.js} +1 -1
  44. package/dist/{chunk-SSI47XP2.js → chunk-VHWGEJ4V.js} +1 -1
  45. package/dist/{chunk-IS7WJ56Q.js → chunk-X2J7QUFH.js} +3 -3
  46. package/dist/{chunk-M3K5AARV.js → chunk-YDBAY3NA.js} +2 -2
  47. package/dist/{chunk-MLOQKQNB.js → chunk-YTWZORJN.js} +2 -2
  48. package/dist/{chunk-2IOP6PHB.js → chunk-ZTVKQOU7.js} +2 -2
  49. package/dist/{chunk-PLDWHR4D.js → chunk-ZX7EAV5J.js} +17 -7
  50. package/dist/cli.js +90 -29
  51. package/dist/clock-HSEKS5AR.js +289 -0
  52. package/dist/{cloud-sync-TG3TIX5H.js → cloud-sync-BOCZSDIA.js} +20 -22
  53. package/dist/config-UTS7QULS.js +76 -0
  54. package/dist/connectors/discord-bridge.js +3 -3
  55. package/dist/connectors/slack-bridge.js +3 -3
  56. package/dist/connectors/telegram-bridge.js +3 -3
  57. package/dist/{conversations-HL2JP5GI.js → conversations-HH3CJD4E.js} +15 -9
  58. package/dist/create-5BPOOJAN.js +75 -0
  59. package/dist/create-QBEPSD2Z.js +50 -0
  60. package/dist/daemon-client-RVIKXGFQ.js +12 -0
  61. package/dist/daemon-restart-SIR3UR4B.js +65 -0
  62. package/dist/daemon.js +1186 -1989
  63. package/dist/{db-PLEDCBHZ.js → db-BDMH4SZ2.js} +7 -3
  64. package/dist/{db-RYX3SS2W.js → db-URORGSXQ.js} +2 -2
  65. package/dist/delete-L5PAVDGQ.js +42 -0
  66. package/dist/delivery-manager-WTGIPBGY.js +30 -0
  67. package/dist/{delivery-router-D5ELDMS2.js → delivery-router-VSULHXNH.js} +4 -4
  68. package/dist/down-DGGLZ5TA.js +17 -0
  69. package/dist/env-E4XHO2BI.js +223 -0
  70. package/dist/{exec-DVLXKRIO.js → exec-X3C6ZZTQ.js} +4 -4
  71. package/dist/export-HTFOHOKL.js +113 -0
  72. package/dist/{extension-PM42QCID.js → extension-AKZ46YSL.js} +46 -35
  73. package/dist/extensions-OOSFVH7U.js +50 -0
  74. package/dist/files-H2YLRD37.js +53 -0
  75. package/dist/import-OL5BZX7S.js +143 -0
  76. package/dist/{isolation-62MKDZN3.js → isolation-N74RWOUX.js} +3 -3
  77. package/dist/join-DF5XSJAC.js +67 -0
  78. package/dist/list-GJ4RUQQT.js +59 -0
  79. package/dist/login-GOTAYLXP.js +51 -0
  80. package/dist/login-JXRVMBRB.js +60 -0
  81. package/dist/logout-6KIA74EV.js +29 -0
  82. package/dist/logout-FW243JBU.js +50 -0
  83. package/dist/message-delivery-YORUXKDQ.js +40 -0
  84. package/dist/mind-6VJJHF65.js +97 -0
  85. package/dist/{mind-activity-tracker-2ACNHA7B.js → mind-activity-tracker-66UVYIFW.js} +5 -5
  86. package/dist/mind-history-MII2SK7F.js +342 -0
  87. package/dist/mind-list-GEWHWAL4.js +38 -0
  88. package/dist/mind-manager-TJ2SUPRX.js +30 -0
  89. package/dist/mind-profile-DCBDVF5B.js +53 -0
  90. package/dist/mind-service-E7FM2WZF.js +36 -0
  91. package/dist/mind-sleep-ITCF6OQA.js +47 -0
  92. package/dist/mind-status-X4SX3YUG.js +65 -0
  93. package/dist/mind-wake-KXMKMGWX.js +42 -0
  94. package/dist/{package-V2WHWVG6.js → package-3W2MEXHB.js} +5 -5
  95. package/dist/read-ZUDG4JWU.js +91 -0
  96. package/dist/{read-stdin-PIRM6A2Y.js → read-stdin-3X5VYKNS.js} +1 -1
  97. package/dist/register-SB7NXCOE.js +51 -0
  98. package/dist/{registry-UYV5S6QT.js → registry-YPHK534W.js} +2 -2
  99. package/dist/reject-MUR2KWJ4.js +40 -0
  100. package/dist/restart-5EGG4JXU.js +42 -0
  101. package/dist/{sandbox-SI5HMBP3.js → sandbox-LP6YRAXS.js} +5 -5
  102. package/dist/scheduler-FRJ5DK24.js +30 -0
  103. package/dist/{schema-ETMABTW4.js → schema-MISD3JFG.js} +3 -1
  104. package/dist/{seed-WNGI6PNW.js → seed-CEC4RC23.js} +2 -2
  105. package/dist/seed-check-KJNTL72M.js +35 -0
  106. package/dist/seed-cmd-WTTG7SRQ.js +30 -0
  107. package/dist/seed-create-M6RCC6RP.js +113 -0
  108. package/dist/seed-sprout-ZKCHFJKH.js +148 -0
  109. package/dist/send-LXUT2GGR.js +409 -0
  110. package/dist/service-M6N3RUYU.js +121 -0
  111. package/dist/{setup-Z3DEVWV7.js → setup-PJOF5UV5.js} +153 -127
  112. package/dist/{setup-GGMKENLN.js → setup-PMJHCZQX.js} +5 -3
  113. package/dist/skill-TAAKEYBV.js +389 -0
  114. package/dist/skills/tending/SKILL.md +52 -0
  115. package/dist/skills/volute-mind/SKILL.md +3 -7
  116. package/dist/skills/volute-mind/references/extensions.md +8 -11
  117. package/dist/{skills-Q6VZ2UGD.js → skills-2PTRTBQP.js} +7 -7
  118. package/dist/sleep-manager-WAZWMFJT.js +34 -0
  119. package/dist/spirit-6KVDIROQ.js +24 -0
  120. package/dist/split-AWVOYOPZ.js +64 -0
  121. package/dist/{sprout-E3HJIV2Z.js → sprout-WX2FFYLP.js} +2 -2
  122. package/dist/src-FQE4BHRG.js +617 -0
  123. package/dist/src-GW6FP6VL.js +425 -0
  124. package/dist/src-QEOLMAYC.js +2133 -0
  125. package/dist/start-3UXOPXQG.js +39 -0
  126. package/dist/status-3IVSLJDN.js +125 -0
  127. package/dist/stop-3XYIBGFM.js +41 -0
  128. package/dist/system-chat-2IFS5HCX.js +34 -0
  129. package/dist/systems-O43WGQY6.js +52 -0
  130. package/dist/{tailscale-ZEUK7GKZ.js → tailscale-DZU4WM3E.js} +4 -4
  131. package/dist/{template-hash-EJRTKE36.js → template-hash-6ITI3WC4.js} +2 -2
  132. package/dist/up-4SCIUIMG.js +19 -0
  133. package/dist/update-RIQYUPVN.js +225 -0
  134. package/dist/{update-check-X3YG4WVP.js → update-check-4TIJKVGD.js} +3 -3
  135. package/dist/upgrade-ZMDGC7M2.js +74 -0
  136. package/dist/variant-QWL2WSRI.js +62 -0
  137. package/dist/{version-notify-YCH4UVQ2.js → version-notify-UXSHBZ35.js} +27 -27
  138. package/dist/{volute-config-WBKYJGYQ.js → volute-config-V7UFFBG3.js} +1 -1
  139. package/dist/web-assets/assets/index-C-eYso8Y.js +75 -0
  140. package/dist/web-assets/assets/index-CCv_fSte.css +1 -0
  141. package/dist/web-assets/index.html +2 -2
  142. package/dist/web-assets/sw.js +117 -0
  143. package/drizzle/0006_channels.sql +17 -0
  144. package/drizzle/0007_drop_conversation_name_title.sql +11 -0
  145. package/drizzle/0008_performance_indexes.sql +6 -0
  146. package/drizzle/meta/0006_snapshot.json +7 -0
  147. package/drizzle/meta/0007_snapshot.json +7 -0
  148. package/drizzle/meta/_journal.json +21 -0
  149. package/package.json +5 -5
  150. package/packages/extensions/pages/dist/ui/assets/index-DKZLNMED.js +2 -0
  151. package/packages/extensions/pages/dist/ui/index.html +1 -1
  152. package/packages/extensions/pages/skills/pages/SKILL.md +84 -9
  153. package/templates/_base/home/.config/routes.json +2 -2
  154. package/templates/_base/home/VOLUTE.md +1 -2
  155. package/templates/_base/src/lib/auto-commit.ts +8 -8
  156. package/templates/_base/src/lib/format-prefix.ts +1 -7
  157. package/templates/_base/src/lib/volute-server.ts +6 -0
  158. package/templates/claude/.init/.config/routes.json +2 -2
  159. package/templates/claude/src/agent.ts +8 -1
  160. package/templates/codex/.init/.config/routes.json +2 -2
  161. package/templates/pi/.init/.config/routes.json +2 -2
  162. package/dist/accept-TW6V4WI4.js +0 -42
  163. package/dist/bridge-O753D5F4.js +0 -207
  164. package/dist/chat-BHYX7DJ4.js +0 -68
  165. package/dist/chunk-47XDEWWV.js +0 -156
  166. package/dist/chunk-CVL5IGIR.js +0 -2084
  167. package/dist/chunk-PB65JZK2.js +0 -85
  168. package/dist/clock-3X4DSC2N.js +0 -281
  169. package/dist/config-OROA5DUA.js +0 -72
  170. package/dist/create-3SEKKI6P.js +0 -71
  171. package/dist/create-UOSOQ2HN.js +0 -44
  172. package/dist/daemon-client-WOAQXXBM.js +0 -12
  173. package/dist/daemon-restart-5ABHNXJZ.js +0 -52
  174. package/dist/delete-KYOVWR23.js +0 -35
  175. package/dist/delivery-manager-2BR5NZKF.js +0 -32
  176. package/dist/down-QVFN4UPK.js +0 -15
  177. package/dist/env-R34DT7XL.js +0 -195
  178. package/dist/export-6ZXAXATG.js +0 -112
  179. package/dist/extensions-BBGVL5JC.js +0 -38
  180. package/dist/files-VQV2VZQO.js +0 -47
  181. package/dist/import-MK2I2T6F.js +0 -23
  182. package/dist/join-DGYHTJUH.js +0 -66
  183. package/dist/list-C644WTHV.js +0 -49
  184. package/dist/login-IIGEQPHL.js +0 -47
  185. package/dist/login-KZQLMAWE.js +0 -47
  186. package/dist/logout-AGTZVRGP.js +0 -40
  187. package/dist/logout-KD6GXIJJ.js +0 -21
  188. package/dist/message-delivery-V3R6NXJP.js +0 -42
  189. package/dist/mind-BI4EPBVZ.js +0 -108
  190. package/dist/mind-history-WOYFLQAI.js +0 -264
  191. package/dist/mind-list-6VPM7GUQ.js +0 -30
  192. package/dist/mind-manager-MWW3BTS4.js +0 -32
  193. package/dist/mind-profile-WPG42U5Y.js +0 -47
  194. package/dist/mind-service-VIKZJK2M.js +0 -38
  195. package/dist/mind-sleep-XDISJY74.js +0 -42
  196. package/dist/mind-status-7FTZWPZF.js +0 -56
  197. package/dist/mind-wake-KIIKEI3A.js +0 -37
  198. package/dist/read-H5C26YO7.js +0 -85
  199. package/dist/register-J27WP33N.js +0 -47
  200. package/dist/reject-OEANJYIA.js +0 -40
  201. package/dist/restart-V5EGYBJG.js +0 -33
  202. package/dist/scheduler-AGG3L2FO.js +0 -32
  203. package/dist/seed-check-PXTH7YXS.js +0 -32
  204. package/dist/seed-cmd-VENFTGS3.js +0 -36
  205. package/dist/seed-create-663ALOKH.js +0 -112
  206. package/dist/seed-sprout-EH3AGKAI.js +0 -132
  207. package/dist/send-7FUUUZZH.js +0 -386
  208. package/dist/skill-DKNYJS4P.js +0 -362
  209. package/dist/skills/shared-files/SKILL.md +0 -44
  210. package/dist/skills/shared-files/scripts/merge.ts +0 -72
  211. package/dist/skills/shared-files/scripts/pull.ts +0 -52
  212. package/dist/sleep-manager-BJK2ROPX.js +0 -36
  213. package/dist/spirit-4JP4TY4C.js +0 -23
  214. package/dist/split-3YPMS2CL.js +0 -63
  215. package/dist/start-W3TPKX4D.js +0 -33
  216. package/dist/status-4OVFXFEJ.js +0 -115
  217. package/dist/stop-GTT6YWYO.js +0 -32
  218. package/dist/system-channel-DXD2JBOU.js +0 -36
  219. package/dist/system-chat-TYLOL7SX.js +0 -36
  220. package/dist/systems-AYLO727G.js +0 -61
  221. package/dist/up-PA7F2CXE.js +0 -18
  222. package/dist/update-HG4LCUSG.js +0 -215
  223. package/dist/upgrade-YGNIDICG.js +0 -67
  224. package/dist/variant-MZUMRTQO.js +0 -41
  225. package/dist/web-assets/assets/index-DiiwC-CZ.css +0 -1
  226. package/dist/web-assets/assets/index-d6y5b9Ij.js +0 -75
  227. package/packages/extensions/pages/dist/ui/assets/index-tLTROSk5.js +0 -2
@@ -1,68 +0,0 @@
1
- #!/usr/bin/env node
2
- import "./chunk-7KJOFUNN.js";
3
-
4
- // src/commands/chat.ts
5
- async function run(args) {
6
- const subcommand = args[0];
7
- const subArgs = args.slice(1);
8
- switch (subcommand) {
9
- case "send":
10
- await import("./send-7FUUUZZH.js").then((m) => m.run(subArgs));
11
- break;
12
- case "list":
13
- await import("./list-C644WTHV.js").then((m) => m.run(subArgs));
14
- break;
15
- case "read":
16
- await import("./read-H5C26YO7.js").then((m) => m.run(subArgs));
17
- break;
18
- case "create":
19
- await import("./create-3SEKKI6P.js").then((m) => m.run(subArgs));
20
- break;
21
- case "bridge":
22
- await import("./bridge-O753D5F4.js").then((m) => m.run(subArgs));
23
- break;
24
- case "files":
25
- await import("./files-VQV2VZQO.js").then((m) => m.run(subArgs));
26
- break;
27
- case "accept":
28
- await import("./accept-TW6V4WI4.js").then((m) => m.run(subArgs));
29
- break;
30
- case "reject":
31
- await import("./reject-OEANJYIA.js").then((m) => m.run(subArgs));
32
- break;
33
- case "--help":
34
- case "-h":
35
- case void 0:
36
- console.log(`volute chat \u2014 conversations, files, and bridges
37
-
38
- Messages:
39
- send <target> "<msg>" Send a message (--image, --file)
40
- list List conversations
41
- read <conversation> [--limit] Read conversation messages
42
- create --participants u1,u2 Create a conversation
43
-
44
- Files:
45
- files [--mind <name>] List pending incoming files
46
- accept <id> [--mind] [--dest] Accept a pending file
47
- reject <id> [--mind] Reject a pending file
48
-
49
- Bridges:
50
- bridge add <platform> Set up a bridge
51
- bridge remove <platform> Remove a bridge
52
- bridge list Show bridges + status
53
- bridge map <p>:<ch> <volute> Map external \u2192 Volute channel
54
- bridge unmap <p>:<ch> Remove mapping
55
- bridge mappings [<platform>] List mappings
56
-
57
- Send targets: @mindname for DMs, channel-name for conversations.
58
- Mind-scoped commands use --mind <name> or VOLUTE_MIND env var.`);
59
- break;
60
- default:
61
- console.error(`Unknown chat subcommand: ${subcommand}
62
- Run 'volute chat --help' for usage.`);
63
- process.exit(1);
64
- }
65
- }
66
- export {
67
- run
68
- };
@@ -1,156 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- getServiceMode,
4
- modeLabel,
5
- pollHealth,
6
- startService
7
- } from "./chunk-7F2SW2KD.js";
8
- import {
9
- parseArgs
10
- } from "./chunk-D424ZQGI.js";
11
- import {
12
- readGlobalConfig
13
- } from "./chunk-6OWJXUAR.js";
14
- import {
15
- voluteHome,
16
- voluteSystemDir
17
- } from "./chunk-N7BLAHNE.js";
18
-
19
- // src/commands/up.ts
20
- import { spawn } from "child_process";
21
- import { existsSync, mkdirSync, openSync, readFileSync } from "fs";
22
- import { dirname, resolve } from "path";
23
- async function run(args) {
24
- const { flags } = parseArgs(args, {
25
- port: { type: "number" },
26
- host: { type: "string" },
27
- foreground: { type: "boolean" },
28
- tailscale: { type: "boolean" },
29
- "no-sandbox": { type: "boolean" }
30
- });
31
- const mode = getServiceMode();
32
- if (!flags.foreground && mode !== "manual") {
33
- console.log(`Starting volute (${modeLabel(mode)})...`);
34
- try {
35
- await startService(mode);
36
- } catch (err) {
37
- console.error(`Failed to start service: ${err instanceof Error ? err.message : err}`);
38
- process.exit(1);
39
- }
40
- const config2 = readGlobalConfig();
41
- const h = flags.host ?? config2.hostname ?? "127.0.0.1";
42
- const p = flags.port ?? config2.port ?? 1618;
43
- if (await pollHealth(h, p)) {
44
- console.log(`Volute daemon running on ${h}:${p}`);
45
- } else {
46
- console.error("Service started but daemon did not become healthy within 30s.");
47
- process.exit(1);
48
- }
49
- return;
50
- }
51
- const config = readGlobalConfig();
52
- const port = flags.port ?? config.port ?? 1618;
53
- const hostname = flags.host ?? config.hostname ?? "127.0.0.1";
54
- const home = voluteHome();
55
- const systemDir = voluteSystemDir();
56
- const pidPath = resolve(systemDir, "daemon.pid");
57
- if (existsSync(pidPath)) {
58
- try {
59
- const pid = parseInt(readFileSync(pidPath, "utf-8").trim(), 10);
60
- process.kill(pid, 0);
61
- console.error(`Daemon already running (pid ${pid}). Use 'volute down' first.`);
62
- process.exit(1);
63
- } catch {
64
- }
65
- }
66
- const pollHost = hostname === "0.0.0.0" || hostname === "::" ? "localhost" : hostname;
67
- let tailscaleHostname;
68
- if (flags.tailscale) {
69
- try {
70
- const { execFile } = await import("child_process");
71
- const { promisify } = await import("util");
72
- const execFileAsync = promisify(execFile);
73
- const { stdout } = await execFileAsync("tailscale", ["status", "--json"]);
74
- const status = JSON.parse(stdout);
75
- tailscaleHostname = status.Self?.DNSName?.replace(/\.$/, "");
76
- } catch (err) {
77
- console.error(`Tailscale setup failed: ${err instanceof Error ? err.message : err}`);
78
- process.exit(1);
79
- }
80
- }
81
- try {
82
- const res = await fetch(`http://${pollHost}:${port}/api/health`);
83
- if (res.ok) {
84
- const body = await res.json().catch(() => null);
85
- if (body && body.ok) {
86
- console.error(
87
- `Port ${port} is already in use by a Volute daemon. Use 'volute down' first, or kill the process on that port.`
88
- );
89
- process.exit(1);
90
- }
91
- }
92
- } catch {
93
- }
94
- if (flags["no-sandbox"]) {
95
- process.env.VOLUTE_SANDBOX = "0";
96
- }
97
- if (flags.foreground) {
98
- const { startDaemon } = await import("./daemon.js");
99
- await startDaemon({ port, hostname, foreground: true, tailscale: flags.tailscale });
100
- return;
101
- }
102
- const daemonModule = resolve(dirname(new URL(import.meta.url).pathname), "daemon.js");
103
- if (!existsSync(daemonModule)) {
104
- console.error("Could not find daemon module. Run `npm run build` first.");
105
- process.exit(1);
106
- }
107
- mkdirSync(home, { recursive: true });
108
- mkdirSync(systemDir, { recursive: true });
109
- const logFile = resolve(systemDir, "daemon.log");
110
- const logFd = openSync(logFile, "a");
111
- const daemonArgs = [daemonModule, "--port", String(port), "--host", hostname];
112
- if (flags.tailscale) daemonArgs.push("--tailscale");
113
- if (flags["no-sandbox"]) daemonArgs.push("--no-sandbox");
114
- const child = spawn(process.execPath, daemonArgs, {
115
- stdio: ["ignore", "ignore", logFd],
116
- detached: true
117
- });
118
- child.unref();
119
- const pollPort = flags.tailscale ? port + 1 : port;
120
- const url = `http://localhost:${pollPort}/api/health`;
121
- const maxWait = 3e4;
122
- const start = Date.now();
123
- while (Date.now() - start < maxWait) {
124
- try {
125
- const res = await fetch(url);
126
- if (res.ok) {
127
- const displayHost = tailscaleHostname ?? hostname;
128
- const displayProto = flags.tailscale ? "https" : "http";
129
- console.log(
130
- `Volute daemon running on ${displayProto}://${displayHost}:${port} (pid ${child.pid})`
131
- );
132
- console.log(`Logs: ${logFile}`);
133
- return;
134
- }
135
- } catch {
136
- }
137
- await new Promise((r) => setTimeout(r, 500));
138
- }
139
- if (child.pid) {
140
- try {
141
- process.kill(-child.pid, "SIGTERM");
142
- } catch {
143
- try {
144
- process.kill(child.pid, "SIGTERM");
145
- } catch {
146
- }
147
- }
148
- }
149
- console.error("Daemon started but did not become healthy within 30s.");
150
- console.error(`Check logs: ${logFile}`);
151
- process.exit(1);
152
- }
153
-
154
- export {
155
- run
156
- };