volute 0.54.0 → 0.56.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 (204) hide show
  1. package/dist/{activity-events-LQII6PZS.js → activity-events-YASF46HS.js} +3 -3
  2. package/dist/{ai-service-YW5SWCSB.js → ai-service-3UFNG6GI.js} +3 -5
  3. package/dist/{archive-FOHGXHPT.js → archive-L2OFBGDQ.js} +2 -2
  4. package/dist/{auth-KRDSM55Q.js → auth-N2F5ASAB.js} +4 -4
  5. package/dist/auto-upgrade-O4MQPYQF.js +46 -0
  6. package/dist/{avatar-image-52WGXLHV.js → avatar-image-QEKKUFDF.js} +3 -3
  7. package/dist/{backup-QRNX6RK7.js → backup-TPM7QQBQ.js} +13 -13
  8. package/dist/{channels-CKCY64TD.js → channels-JP3GYTPX.js} +18 -18
  9. package/dist/{chat-ZUGNL5GS.js → chat-7YCF4ZU5.js} +3 -3
  10. package/dist/{chunk-QUSMYGNQ.js → chunk-2674KIGI.js} +1 -0
  11. package/dist/{chunk-444RR3YF.js → chunk-2B4E6SL7.js} +14 -14
  12. package/dist/chunk-2GATCSZK.js +520 -0
  13. package/dist/{chunk-I7U5EEZC.js → chunk-2LFTJNVH.js} +2 -2
  14. package/dist/{chunk-L7BKTZ5U.js → chunk-2QLWAYIU.js} +2 -2
  15. package/dist/{chunk-F6D766VQ.js → chunk-45MCH4G4.js} +2 -2
  16. package/dist/{chunk-OGPVJ53N.js → chunk-4RZS7XCV.js} +5 -5
  17. package/dist/{chunk-HKGYZVWN.js → chunk-6LICEQGP.js} +38 -4
  18. package/dist/{chunk-LAUCO2HC.js → chunk-APDEUAIE.js} +1 -1
  19. package/dist/{chunk-5Y54AE3L.js → chunk-CLH357FI.js} +2 -2
  20. package/dist/{chunk-OAYY3WF3.js → chunk-CVPCRWWC.js} +1 -12
  21. package/dist/{chunk-EGV6R6UF.js → chunk-E2SN3ZOJ.js} +5 -40
  22. package/dist/{chunk-LGXVGIWN.js → chunk-ELQU2GBT.js} +193 -69
  23. package/dist/{chunk-OT5SXF7L.js → chunk-EPRLTYJR.js} +28 -14
  24. package/dist/{chunk-ATZF2RNJ.js → chunk-EYFBT2KP.js} +15 -15
  25. package/dist/{chunk-U54PJPTB.js → chunk-FYMIGUJ5.js} +2 -2
  26. package/dist/{chunk-7XKPG66D.js → chunk-G7A5LEVI.js} +5 -5
  27. package/dist/{chunk-RGHF3OK5.js → chunk-GAAATVTM.js} +17 -17
  28. package/dist/{chunk-7LT3YZUR.js → chunk-I3OJ342S.js} +2 -2
  29. package/dist/{chunk-3LHUXY3E.js → chunk-IABDYN4N.js} +4 -4
  30. package/dist/{chunk-VDUCLVZI.js → chunk-IOMBP2T5.js} +28 -26
  31. package/dist/{chunk-YSRYCS3N.js → chunk-IQROTVBG.js} +2 -2
  32. package/dist/{chunk-PPSN2MLC.js → chunk-IRNM4LSF.js} +9 -6
  33. package/dist/{chunk-ZNHL5KQJ.js → chunk-KN3UHV7O.js} +8 -3
  34. package/dist/{chunk-CV6BNGFK.js → chunk-KXM4K46T.js} +4 -4
  35. package/dist/{chunk-Z4Q6TQWL.js → chunk-LRRPKZBD.js} +2 -2
  36. package/dist/{chunk-LNNI3MS4.js → chunk-MNKPAAQF.js} +9 -2
  37. package/dist/{chunk-OIOW3FPT.js → chunk-NA2NJXY4.js} +1 -1
  38. package/dist/{chunk-GLM7TVWP.js → chunk-OHHS5PSI.js} +1 -1
  39. package/dist/{chunk-CKPAVQNK.js → chunk-OPTA3BJ4.js} +36 -24
  40. package/dist/{chunk-X67BDDZR.js → chunk-P3GXOT2X.js} +48 -2
  41. package/dist/{chunk-WHL6PKYP.js → chunk-PAO7JZNW.js} +52 -48
  42. package/dist/{chunk-TPX6E6PL.js → chunk-Q5M5QFKY.js} +3 -3
  43. package/dist/{chunk-OYF25B62.js → chunk-T7UMSTH2.js} +3 -3
  44. package/dist/{chunk-H6X6CKDN.js → chunk-TAVIVN2I.js} +2 -32
  45. package/dist/{chunk-56IT2ZXF.js → chunk-TGYKFUCF.js} +9 -15
  46. package/dist/{chunk-5U5GLZSD.js → chunk-TZ7OHGNL.js} +2 -2
  47. package/dist/{chunk-UFTDRTCP.js → chunk-UMQP5TC5.js} +2 -2
  48. package/dist/{chunk-LKUGUQUW.js → chunk-UNTDRIV2.js} +5 -5
  49. package/dist/{chunk-CLCHOXLR.js → chunk-V2M6PNLE.js} +5 -5
  50. package/dist/{chunk-ICXY54ZC.js → chunk-WTZD6LFW.js} +2 -2
  51. package/dist/{chunk-FLIEXG2T.js → chunk-XZP3FJ7Q.js} +1 -1
  52. package/dist/{chunk-HTRSSOHY.js → chunk-YU5EYQAE.js} +1 -1
  53. package/dist/cli.js +26 -23
  54. package/dist/{clock-X7V3C7NL.js → clock-ZT5YT6HA.js} +2 -2
  55. package/dist/{cloud-sync-52YNJRMR.js → cloud-sync-RTUXMYU2.js} +23 -23
  56. package/dist/{conversations-ZL6PHROD.js → conversations-ERMMPMOS.js} +4 -4
  57. package/dist/{create-G2RIKQYK.js → create-IUCFJXCE.js} +1 -1
  58. package/dist/{daemon-restart-QWHN5VMU.js → daemon-restart-N2YOISNJ.js} +11 -6
  59. package/dist/daemon.js +230 -279
  60. package/dist/{db-BONH4SUG.js → db-BQFYIONA.js} +1 -1
  61. package/dist/{db-I4EH5SLF.js → db-JH3NTERX.js} +17 -3
  62. package/dist/delivery-manager-5EGCFN4K.js +41 -0
  63. package/dist/{delivery-notices-RZQ6GONP.js → delivery-notices-LZKZXWTX.js} +6 -6
  64. package/dist/{delivery-router-QS4NLJR6.js → delivery-router-U6Q22ZYU.js} +3 -3
  65. package/dist/doctor-225FYBAQ.js +454 -0
  66. package/dist/{down-UN2EDX2Y.js → down-3BQSPUAZ.js} +4 -4
  67. package/dist/echo-text-Y2DFTD7L.js +40 -0
  68. package/dist/{env-SQFCWW52.js → env-4YX5YNWZ.js} +2 -2
  69. package/dist/{exec-Z34TTUO3.js → exec-Y5VMDAVA.js} +2 -2
  70. package/dist/{export-VBNWM7I4.js → export-ASRHBMRG.js} +2 -2
  71. package/dist/{extensions-QT65JGV6.js → extensions-YEPEWURN.js} +27 -23
  72. package/dist/{files-PCKBQHAY.js → files-FASUDSZQ.js} +3 -3
  73. package/dist/{import-DB2KULRO.js → import-O35Y7DSF.js} +6 -6
  74. package/dist/{isolation-UQPDO34R.js → isolation-ZOAUXYXA.js} +2 -2
  75. package/dist/{login-57MMYILL.js → login-54TZQQP4.js} +5 -5
  76. package/dist/{logout-YFZAJRPY.js → logout-4G46Z4RU.js} +1 -1
  77. package/dist/message-delivery-HBTMGWFU.js +46 -0
  78. package/dist/{mind-CT6ANXK4.js → mind-IKMX7K7G.js} +8 -24
  79. package/dist/{mind-activity-tracker-QF6DCX2X.js → mind-activity-tracker-ABAEIMA3.js} +4 -4
  80. package/dist/mind-service-LRVOQG2T.js +48 -0
  81. package/dist/{mind-sleep-24HV4RCA.js → mind-sleep-LZAFBDZD.js} +2 -2
  82. package/dist/{package-F6S5NHY2.js → package-X5O7OD2E.js} +12 -13
  83. package/dist/{prompts-JECJIFPQ.js → prompts-ZNOE3KN3.js} +2 -2
  84. package/dist/{registry-TRC2HJXR.js → registry-BTQXLDW6.js} +1 -1
  85. package/dist/{sandbox-NNWCTHRI.js → sandbox-OUFAGN45.js} +3 -3
  86. package/dist/scheduler-G6BCIVGP.js +27 -0
  87. package/dist/{seed-cmd-6IMTO3LG.js → seed-cmd-BGAW3WDY.js} +2 -2
  88. package/dist/{seed-create-VNLDYRFK.js → seed-create-SMCPEUFQ.js} +3 -3
  89. package/dist/{seed-readiness-H5TTPAQH.js → seed-readiness-RBANMSWW.js} +3 -3
  90. package/dist/{seed-sprout-PPGYGK4G.js → seed-sprout-CSHV36N3.js} +9 -9
  91. package/dist/{send-UXUQKO4N.js → send-D3ADUBR5.js} +6 -6
  92. package/dist/{service-T4P5W6RS.js → service-SWEEBOOY.js} +3 -24
  93. package/dist/{service-install-R4SNYUVO.js → service-install-RCC26KDV.js} +4 -4
  94. package/dist/{setup-YUAQMDVZ.js → setup-L5NZG2U3.js} +5 -5
  95. package/dist/{setup-WZSXHHRJ.js → setup-R7Q4HFJP.js} +1 -5
  96. package/dist/skills/volute-mind/SKILL.md +8 -0
  97. package/dist/{skills-GMQ5UIIW.js → skills-BCCU4OJW.js} +4 -4
  98. package/dist/sleep-manager-25P44HAO.js +42 -0
  99. package/dist/{spirit-Q5VGFWUI.js → spirit-YPG2MU6W.js} +7 -7
  100. package/dist/spirit-availability-ZQM5IH4C.js +43 -0
  101. package/dist/{src-H3UCOP6B.js → src-246GSX7A.js} +5 -2
  102. package/dist/src-LOUB3WPR.js +4189 -0
  103. package/dist/{status-LCKTTIWS.js → status-BYPCJU6H.js} +4 -4
  104. package/dist/{system-events-Q7IVZ5T4.js → system-events-CWC7CBKP.js} +6 -4
  105. package/dist/{systems-HL7SGSW7.js → systems-VDRUZXNF.js} +2 -2
  106. package/dist/{tailscale-KHNZFC7L.js → tailscale-4XY7B5A2.js} +2 -2
  107. package/dist/{template-hash-YKWMVYMM.js → template-hash-RJRMF6DT.js} +2 -2
  108. package/dist/{template-staleness-PY2CULH6.js → template-staleness-CL4V7BT7.js} +5 -5
  109. package/dist/{turn-tracker-HZDPMSCC.js → turn-tracker-LZP5X6GZ.js} +8 -8
  110. package/dist/{up-XZDSJVMU.js → up-3AAN4GYY.js} +4 -4
  111. package/dist/{update-ILCPVNDD.js → update-2MWXRE2S.js} +4 -4
  112. package/dist/{update-check-SZ7B5IFI.js → update-check-PJOZXZYJ.js} +2 -2
  113. package/dist/variant-cleanup-K7RFMSH7.js +24 -0
  114. package/dist/{version-notify-VNVFX6UP.js → version-notify-QIDHR6WO.js} +12 -12
  115. package/dist/web-assets/assets/{index-CwtxGwe_.js → index-Bfvls20e.js} +17 -17
  116. package/dist/web-assets/assets/index-hPn_fkz3.css +1 -0
  117. package/dist/web-assets/index.html +2 -2
  118. package/drizzle/0000_crazy_epoch.sql +232 -0
  119. package/drizzle/README.md +42 -0
  120. package/drizzle/meta/0000_snapshot.json +1420 -3
  121. package/drizzle/meta/_journal.json +2 -128
  122. package/package.json +12 -13
  123. package/packages/extensions/intentions/dist/ui/assets/index-Bl5KEcli.js +67 -0
  124. package/packages/extensions/intentions/dist/ui/index.html +1 -1
  125. package/packages/extensions/pages/dist/ui/assets/index-BKxVQkA9.css +1 -0
  126. package/packages/extensions/pages/dist/ui/assets/index-BMt6sStP.js +68 -0
  127. package/packages/extensions/pages/dist/ui/index.html +2 -2
  128. package/packages/extensions/pages/skills/pages/SKILL.md +123 -4
  129. package/templates/_base/.init/.config/prompts.json +0 -1
  130. package/templates/_base/.init/.local/hooks/pre-prompt/turn-context.ts +30 -0
  131. package/templates/_base/src/lib/codex-session-seed.ts +6 -55
  132. package/templates/_base/src/lib/pi-session-seed.ts +8 -57
  133. package/templates/_base/src/lib/seed-note.ts +4 -4
  134. package/templates/_base/src/lib/session-seed.ts +8 -53
  135. package/templates/_base/src/lib/startup.ts +0 -20
  136. package/templates/claude/package.json +2 -2
  137. package/templates/claude/src/agent.ts +34 -102
  138. package/templates/claude/src/lib/hooks/pre-compact.ts +6 -6
  139. package/templates/claude/src/server.ts +0 -1
  140. package/templates/codex/package.json +2 -2
  141. package/templates/codex/src/agent.ts +23 -89
  142. package/templates/pi/package.json +1 -1
  143. package/templates/pi/src/agent.ts +26 -93
  144. package/templates/pi/src/server.ts +0 -1
  145. package/dist/auto-upgrade-HEVZKPTF.js +0 -46
  146. package/dist/chunk-AAPNU7GA.js +0 -168
  147. package/dist/delivery-manager-7R2YIQ2W.js +0 -41
  148. package/dist/echo-text-73CYQRL7.js +0 -40
  149. package/dist/message-delivery-TRKT4T2P.js +0 -46
  150. package/dist/migrate-name-placeholder-C7NCNLWF.js +0 -37
  151. package/dist/migrate-thread-config-EQSEP2XG.js +0 -90
  152. package/dist/mind-service-7EFIJ3ZA.js +0 -48
  153. package/dist/scheduler-73Q4MQ7Y.js +0 -27
  154. package/dist/seed-DRKAP3XV.js +0 -11
  155. package/dist/sleep-manager-KHI65FEX.js +0 -42
  156. package/dist/spirit-availability-G5FMWKRH.js +0 -43
  157. package/dist/sprout-PMTRL7QN.js +0 -11
  158. package/dist/src-3FIW7DLH.js +0 -2376
  159. package/dist/src-LTTQVN2Z.js +0 -832
  160. package/dist/variant-HHDTW74J.js +0 -62
  161. package/dist/variant-cleanup-QHGGY7ND.js +0 -24
  162. package/dist/web-assets/assets/index-DhM1yYRN.css +0 -1
  163. package/drizzle/0000_baseline.sql +0 -152
  164. package/drizzle/0001_add_conversation_private.sql +0 -1
  165. package/drizzle/0002_turns.sql +0 -21
  166. package/drizzle/0003_turn_feed_links.sql +0 -11
  167. package/drizzle/0004_spirits.sql +0 -5
  168. package/drizzle/0005_meta_summaries.sql +0 -15
  169. package/drizzle/0006_channels.sql +0 -17
  170. package/drizzle/0007_drop_conversation_name_title.sql +0 -11
  171. package/drizzle/0008_performance_indexes.sql +0 -6
  172. package/drizzle/0009_mind_notices.sql +0 -14
  173. package/drizzle/0010_delivery_queue_redrive.sql +0 -10
  174. package/drizzle/0011_drop_turn_summary_event_id.sql +0 -3
  175. package/drizzle/0012_channel_gates.sql +0 -17
  176. package/drizzle/0013_variant_purpose.sql +0 -3
  177. package/drizzle/0014_system_events.sql +0 -26
  178. package/drizzle/0015_rename_session_to_thread.sql +0 -12
  179. package/drizzle/0016_brain_to_human.sql +0 -4
  180. package/drizzle/0017_event_history_rows.sql +0 -9
  181. package/drizzle/0018_api_tokens.sql +0 -20
  182. package/drizzle/meta/0001_snapshot.json +0 -7
  183. package/drizzle/meta/0002_snapshot.json +0 -7
  184. package/drizzle/meta/0003_snapshot.json +0 -7
  185. package/drizzle/meta/0004_snapshot.json +0 -7
  186. package/drizzle/meta/0005_snapshot.json +0 -7
  187. package/drizzle/meta/0006_snapshot.json +0 -7
  188. package/drizzle/meta/0007_snapshot.json +0 -7
  189. package/packages/extensions/intentions/dist/ui/assets/index-CQz4aceM.js +0 -67
  190. package/packages/extensions/notes/dist/ui/assets/index-BBs8pyel.js +0 -67
  191. package/packages/extensions/notes/dist/ui/assets/index-D3cdui42.css +0 -1
  192. package/packages/extensions/notes/dist/ui/index.html +0 -14
  193. package/packages/extensions/notes/skills/notes/SKILL.md +0 -90
  194. package/packages/extensions/pages/dist/ui/assets/index-B589e8Xe.js +0 -2
  195. package/packages/extensions/pages/dist/ui/assets/index-BuXnE-rb.css +0 -1
  196. package/dist/{env-7AZFBPWX.js → env-IBW2QI6K.js} +5 -5
  197. package/dist/{login-4NUS72Z5.js → login-RJJTCVR3.js} +3 -3
  198. package/dist/{mind-contacts-PEXCDRXA.js → mind-contacts-KV64UDJS.js} +6 -6
  199. package/dist/{mind-history-RZMMCHMX.js → mind-history-H45GM2M2.js} +6 -6
  200. package/dist/{register-WNCSOTAU.js → register-OX4HRSGC.js} +3 -3
  201. package/dist/{restart-B4GNMVF2.js → restart-AGEGNSYQ.js} +4 -4
  202. package/dist/{skill-QYTBUDNQ.js → skill-B5OJEQUA.js} +4 -4
  203. package/dist/{start-BDHJVOVX.js → start-MUMNFR52.js} +3 -3
  204. package/dist/{stop-45QYSGYS.js → stop-EKERNYTX.js} +4 -4
@@ -2,16 +2,10 @@
2
2
  import {
3
3
  exec,
4
4
  execInherit
5
- } from "./chunk-OIOW3FPT.js";
5
+ } from "./chunk-NA2NJXY4.js";
6
6
  import {
7
7
  voluteSystemDir
8
- } from "./chunk-H6X6CKDN.js";
9
-
10
- // packages/daemon/src/lib/config/service-mode.ts
11
- import { execFileSync } from "child_process";
12
- import { existsSync, readFileSync as readFileSync2 } from "fs";
13
- import { homedir } from "os";
14
- import { resolve } from "path";
8
+ } from "./chunk-TAVIVN2I.js";
15
9
 
16
10
  // packages/daemon/src/lib/util/log-tail.ts
17
11
  import { readFileSync } from "fs";
@@ -28,6 +22,10 @@ function readLogTail(logFile, maxLines = 20) {
28
22
  }
29
23
 
30
24
  // packages/daemon/src/lib/config/service-mode.ts
25
+ import { execFileSync } from "child_process";
26
+ import { existsSync, readFileSync as readFileSync2 } from "fs";
27
+ import { homedir } from "os";
28
+ import { resolve } from "path";
31
29
  var SYSTEM_SERVICE_PATH = "/etc/systemd/system/volute.service";
32
30
  var USER_SYSTEMD_UNIT = resolve(homedir(), ".config", "systemd", "user", "volute.service");
33
31
  var LAUNCHD_PLIST_LABEL = "com.volute.daemon";
@@ -38,32 +36,43 @@ var LAUNCHD_PLIST_PATH = resolve(
38
36
  `${LAUNCHD_PLIST_LABEL}.plist`
39
37
  );
40
38
  var SYSTEM_LAUNCHD_PLIST_PATH = "/Library/LaunchDaemons/com.volute.daemon.plist";
41
- var HEALTH_POLL_TIMEOUT = 3e4;
39
+ var HEALTH_POLL_TIMEOUT = 12e4;
42
40
  var STOP_GRACE_TIMEOUT = 1e4;
43
41
  var POLL_INTERVAL = 500;
44
- function getServiceMode() {
45
- if (existsSync(SYSTEM_SERVICE_PATH)) {
46
- try {
47
- execFileSync("systemctl", ["is-enabled", "--quiet", "volute"]);
48
- return "system";
49
- } catch {
50
- }
42
+ function systemctlSucceeds(args) {
43
+ try {
44
+ execFileSync("systemctl", args, { stdio: "ignore" });
45
+ return true;
46
+ } catch {
47
+ return false;
51
48
  }
52
- if (existsSync(USER_SYSTEMD_UNIT)) {
53
- try {
54
- execFileSync("systemctl", ["--user", "is-enabled", "--quiet", "volute"]);
55
- return "user-systemd";
56
- } catch {
57
- }
49
+ }
50
+ function systemdManaged(scope) {
51
+ const prefix = scope === "user" ? ["--user"] : [];
52
+ return systemctlSucceeds([...prefix, "is-enabled", "--quiet", "volute"]) || systemctlSucceeds([...prefix, "is-active", "--quiet", "volute"]);
53
+ }
54
+ function resolveServiceMode(probes) {
55
+ if (probes.fileExists(SYSTEM_SERVICE_PATH) && probes.systemdManaged("system")) {
56
+ return "system";
58
57
  }
59
- if (process.platform === "darwin" && existsSync(SYSTEM_LAUNCHD_PLIST_PATH)) {
58
+ if (probes.fileExists(USER_SYSTEMD_UNIT) && probes.systemdManaged("user")) {
59
+ return "user-systemd";
60
+ }
61
+ if (probes.platform === "darwin" && probes.fileExists(SYSTEM_LAUNCHD_PLIST_PATH)) {
60
62
  return "system-launchd";
61
63
  }
62
- if (process.platform === "darwin" && existsSync(LAUNCHD_PLIST_PATH)) {
64
+ if (probes.platform === "darwin" && probes.fileExists(LAUNCHD_PLIST_PATH)) {
63
65
  return "user-launchd";
64
66
  }
65
67
  return "manual";
66
68
  }
69
+ function getServiceMode() {
70
+ return resolveServiceMode({
71
+ fileExists: existsSync,
72
+ systemdManaged,
73
+ platform: process.platform
74
+ });
75
+ }
67
76
  function getDaemonUrl(hostname, port) {
68
77
  const url = new URL("http://localhost");
69
78
  let h = hostname;
@@ -249,11 +258,13 @@ function modeLabel(mode) {
249
258
  }
250
259
 
251
260
  export {
261
+ readLogTail,
252
262
  SYSTEM_SERVICE_PATH,
253
263
  USER_SYSTEMD_UNIT,
254
264
  LAUNCHD_PLIST_LABEL,
255
265
  LAUNCHD_PLIST_PATH,
256
266
  SYSTEM_LAUNCHD_PLIST_PATH,
267
+ HEALTH_POLL_TIMEOUT,
257
268
  getServiceMode,
258
269
  getDaemonUrl,
259
270
  pollHealth,
@@ -264,6 +275,7 @@ export {
264
275
  daemonConfigPath,
265
276
  readDaemonToken,
266
277
  readDaemonConfig,
278
+ daemonLogSource,
267
279
  daemonLogReport,
268
280
  modeLabel
269
281
  };
@@ -2,6 +2,7 @@
2
2
 
3
3
  // packages/daemon/src/lib/template/template.ts
4
4
  import {
5
+ chmodSync,
5
6
  cpSync,
6
7
  existsSync,
7
8
  mkdirSync,
@@ -14,9 +15,9 @@ import {
14
15
  writeFileSync
15
16
  } from "fs";
16
17
  import { tmpdir } from "os";
17
- import { dirname, join, relative, resolve } from "path";
18
+ import { dirname, join, relative, resolve, sep } from "path";
18
19
  var _templatesRoot = null;
19
- function findTemplatesRoot() {
20
+ function locateTemplatesRoot() {
20
21
  if (_templatesRoot) return _templatesRoot;
21
22
  let dir = dirname(new URL(import.meta.url).pathname);
22
23
  for (let i = 0; i < 7; i++) {
@@ -27,6 +28,11 @@ function findTemplatesRoot() {
27
28
  }
28
29
  dir = dirname(dir);
29
30
  }
31
+ return null;
32
+ }
33
+ function findTemplatesRoot() {
34
+ const root = locateTemplatesRoot();
35
+ if (root) return root;
30
36
  console.error(
31
37
  "Templates directory not found. Searched up from:",
32
38
  dirname(new URL(import.meta.url).pathname)
@@ -100,6 +106,45 @@ function applyInitFiles(destDir) {
100
106
  }
101
107
  rmSync(initDir, { recursive: true, force: true });
102
108
  }
109
+ var INIT_INFRASTRUCTURE_PREFIXES = [".local/"];
110
+ function isInitInfrastructure(relPath) {
111
+ const normalized = relPath.split(sep).join("/");
112
+ return INIT_INFRASTRUCTURE_PREFIXES.some((prefix) => normalized.startsWith(prefix));
113
+ }
114
+ function backfillInitInfrastructure(homeDir, template, mindName) {
115
+ const root = locateTemplatesRoot();
116
+ if (!root) throw new Error("templates root not found on disk");
117
+ if (!existsSync(resolve(root, template, "volute-template.json"))) {
118
+ throw new Error(`template "${template}" is missing or has no manifest at ${root}`);
119
+ }
120
+ const { composedDir, manifest } = composeTemplate(root, template);
121
+ try {
122
+ const initDir = resolve(composedDir, ".init");
123
+ if (!existsSync(initDir)) return [];
124
+ const substitute = new Set(
125
+ manifest.substitute.map((p) => p.split(sep).join("/")).filter((p) => p.startsWith(".init/")).map((p) => p.slice(".init/".length))
126
+ );
127
+ const added = [];
128
+ for (const file of listFiles(initDir)) {
129
+ const rel = file.split(sep).join("/");
130
+ if (!isInitInfrastructure(rel)) continue;
131
+ const dest = resolve(homeDir, file);
132
+ if (existsSync(dest)) continue;
133
+ const src = resolve(initDir, file);
134
+ mkdirSync(dirname(dest), { recursive: true });
135
+ if (substitute.has(rel)) {
136
+ writeFileSync(dest, readFileSync(src, "utf-8").replaceAll("{{name}}", mindName));
137
+ chmodSync(dest, statSync(src).mode);
138
+ } else {
139
+ cpSync(src, dest);
140
+ }
141
+ added.push(rel);
142
+ }
143
+ return added;
144
+ } finally {
145
+ rmSync(composedDir, { recursive: true, force: true });
146
+ }
147
+ }
103
148
  var MECHANICS_DOCS = {
104
149
  claude: "CLAUDE.md",
105
150
  pi: "MINDS.md",
@@ -155,6 +200,7 @@ export {
155
200
  copyTemplateToDir,
156
201
  renderComposedPackageJson,
157
202
  applyInitFiles,
203
+ backfillInitInfrastructure,
158
204
  isKnownTemplate,
159
205
  applyTemplateHomeFiles,
160
206
  listFiles
@@ -2,36 +2,36 @@
2
2
  import {
3
3
  clearMind,
4
4
  summarizeOrphanedTurns
5
- } from "./chunk-56IT2ZXF.js";
5
+ } from "./chunk-TGYKFUCF.js";
6
+ import {
7
+ isSandboxEnabled,
8
+ wrapForSandbox
9
+ } from "./chunk-CLH357FI.js";
6
10
  import {
7
11
  deliverEvent,
8
12
  recordNotice
9
- } from "./chunk-HKGYZVWN.js";
13
+ } from "./chunk-6LICEQGP.js";
10
14
  import {
11
15
  getPrompt
12
- } from "./chunk-OAYY3WF3.js";
13
- import {
14
- isSandboxEnabled,
15
- wrapForSandbox
16
- } from "./chunk-5Y54AE3L.js";
16
+ } from "./chunk-CVPCRWWC.js";
17
17
  import {
18
18
  chownMindDir,
19
19
  isIsolationEnabled,
20
20
  wrapForIsolation
21
- } from "./chunk-OIOW3FPT.js";
21
+ } from "./chunk-NA2NJXY4.js";
22
22
  import {
23
23
  loadMergedEnv
24
- } from "./chunk-GLM7TVWP.js";
24
+ } from "./chunk-OHHS5PSI.js";
25
25
  import {
26
26
  OAuthRefreshError,
27
27
  getAiConfig,
28
28
  resolveApiKey,
29
29
  resolveOAuthCredentials,
30
30
  resolveProviderKey
31
- } from "./chunk-EGV6R6UF.js";
31
+ } from "./chunk-E2SN3ZOJ.js";
32
32
  import {
33
33
  logger_default
34
- } from "./chunk-QUSMYGNQ.js";
34
+ } from "./chunk-2674KIGI.js";
35
35
  import {
36
36
  findMind,
37
37
  getSystemName,
@@ -42,7 +42,32 @@ import {
42
42
  setMindRunning,
43
43
  stateDir,
44
44
  voluteSystemDir
45
- } from "./chunk-H6X6CKDN.js";
45
+ } from "./chunk-TAVIVN2I.js";
46
+
47
+ // packages/daemon/src/lib/daemon/mind-tokens.ts
48
+ import { randomUUID } from "crypto";
49
+ var tokenToMind = /* @__PURE__ */ new Map();
50
+ var mindToToken = /* @__PURE__ */ new Map();
51
+ function generateMindToken(mindName) {
52
+ revokeMindToken(mindName);
53
+ const token = randomUUID();
54
+ tokenToMind.set(token, mindName);
55
+ mindToToken.set(mindName, token);
56
+ return token;
57
+ }
58
+ function revokeMindToken(mindName) {
59
+ const token = mindToToken.get(mindName);
60
+ if (token) {
61
+ tokenToMind.delete(token);
62
+ mindToToken.delete(mindName);
63
+ }
64
+ }
65
+ function resolveMindToken(token) {
66
+ return tokenToMind.get(token) ?? null;
67
+ }
68
+ function getMindToken(mindName) {
69
+ return mindToToken.get(mindName) ?? null;
70
+ }
46
71
 
47
72
  // packages/daemon/src/lib/util/json-state.ts
48
73
  import { existsSync, readFileSync, unlinkSync, writeFileSync } from "fs";
@@ -116,6 +141,9 @@ var RotatingLog = class extends Writable {
116
141
  }
117
142
  this.stream = createWriteStream(path, { flags: "a" });
118
143
  }
144
+ path;
145
+ maxSize;
146
+ maxFiles;
119
147
  stream;
120
148
  size;
121
149
  async rotateAsync() {
@@ -286,31 +314,6 @@ async function syncProviderToMinds(provider, deps = {}) {
286
314
  }
287
315
  }
288
316
 
289
- // packages/daemon/src/lib/daemon/mind-tokens.ts
290
- import { randomUUID } from "crypto";
291
- var tokenToMind = /* @__PURE__ */ new Map();
292
- var mindToToken = /* @__PURE__ */ new Map();
293
- function generateMindToken(mindName) {
294
- revokeMindToken(mindName);
295
- const token = randomUUID();
296
- tokenToMind.set(token, mindName);
297
- mindToToken.set(mindName, token);
298
- return token;
299
- }
300
- function revokeMindToken(mindName) {
301
- const token = mindToToken.get(mindName);
302
- if (token) {
303
- tokenToMind.delete(token);
304
- mindToToken.delete(mindName);
305
- }
306
- }
307
- function resolveMindToken(token) {
308
- return tokenToMind.get(token) ?? null;
309
- }
310
- function getMindToken(mindName) {
311
- return mindToToken.get(mindName) ?? null;
312
- }
313
-
314
317
  // packages/daemon/src/lib/daemon/mind-manager.ts
315
318
  import { execFile, spawn } from "child_process";
316
319
  import { existsSync as existsSync4, mkdirSync as mkdirSync2, readFileSync as readFileSync3, rmSync, writeFileSync as writeFileSync3 } from "fs";
@@ -429,6 +432,7 @@ var MindStartupError = class extends Error {
429
432
  this.stderr = stderr;
430
433
  this.name = "MindStartupError";
431
434
  }
435
+ stderr;
432
436
  };
433
437
  function mindPidPath(name) {
434
438
  return resolve2(stateDir(name), "mind.pid");
@@ -805,9 +809,9 @@ var MindManager = class {
805
809
  mlog.info(`started mind ${name} on port ${port}`);
806
810
  await this.deliverPendingContext(name);
807
811
  try {
808
- const { getSleepManagerIfReady } = await import("./sleep-manager-KHI65FEX.js");
812
+ const { getSleepManagerIfReady } = await import("./sleep-manager-25P44HAO.js");
809
813
  if (!getSleepManagerIfReady()?.isSleeping(name)) {
810
- const { flushQueuedEvents } = await import("./system-events-Q7IVZ5T4.js");
814
+ const { flushQueuedEvents } = await import("./system-events-CWC7CBKP.js");
811
815
  const flushed = await flushQueuedEvents(name);
812
816
  if (flushed > 0) mlog.info(`redelivered ${flushed} pending event(s) to ${name}`);
813
817
  }
@@ -843,7 +847,7 @@ var MindManager = class {
843
847
  if (this.shuttingDown || this.stopping.has(name)) return;
844
848
  mlog.error(`mind ${name} exited with code ${code}`);
845
849
  try {
846
- const { getSleepManagerIfReady } = await import("./sleep-manager-KHI65FEX.js");
850
+ const { getSleepManagerIfReady } = await import("./sleep-manager-25P44HAO.js");
847
851
  const sleepMgr = getSleepManagerIfReady();
848
852
  const sleepState = sleepMgr?.getState(name);
849
853
  if (sleepState?.sleeping) {
@@ -873,15 +877,15 @@ var MindManager = class {
873
877
  (err) => mlog.warn(`failed to clear turn state for ${name} after crash`, logger_default.errorData(err))
874
878
  );
875
879
  try {
876
- const { getDeliveryManager } = await import("./delivery-manager-7R2YIQ2W.js");
880
+ const { getDeliveryManager } = await import("./delivery-manager-5EGCFN4K.js");
877
881
  getDeliveryManager().clearMindSessions(name);
878
882
  } catch (err) {
879
883
  if (!(err instanceof Error && err.message.includes("not initialized"))) {
880
884
  mlog.warn(`failed to clear delivery state for ${name} after crash`, logger_default.errorData(err));
881
885
  }
882
886
  }
883
- import("./mind-activity-tracker-QF6DCX2X.js").then(({ markIdle }) => markIdle(name)).catch((err) => mlog.warn(`failed to mark ${name} idle after crash`, logger_default.errorData(err)));
884
- import("./activity-events-LQII6PZS.js").then(
887
+ import("./mind-activity-tracker-ABAEIMA3.js").then(({ markIdle }) => markIdle(name)).catch((err) => mlog.warn(`failed to mark ${name} idle after crash`, logger_default.errorData(err)));
888
+ import("./activity-events-YASF46HS.js").then(
885
889
  ({ publish }) => publish({ type: "mind_stopped", mind: name, summary: `${name} crashed (exit ${code})` })
886
890
  ).catch((err) => mlog.warn(`failed to publish crash event for ${name}`, logger_default.errorData(err)));
887
891
  const { shouldRestart, delay, attempt } = this.restartTracker.recordCrash(name);
@@ -939,7 +943,7 @@ var MindManager = class {
939
943
  mlog.warn(`failed to clear turn state for ${name} on stop`, logger_default.errorData(err));
940
944
  }
941
945
  try {
942
- const { getDeliveryManager } = await import("./delivery-manager-7R2YIQ2W.js");
946
+ const { getDeliveryManager } = await import("./delivery-manager-5EGCFN4K.js");
943
947
  getDeliveryManager().clearMindSessions(name);
944
948
  } catch (err) {
945
949
  if (!(err instanceof Error && err.message.includes("not initialized"))) {
@@ -947,7 +951,7 @@ var MindManager = class {
947
951
  }
948
952
  }
949
953
  try {
950
- const { clearEchoTextCache } = await import("./echo-text-73CYQRL7.js");
954
+ const { clearEchoTextCache } = await import("./echo-text-Y2DFTD7L.js");
951
955
  clearEchoTextCache(name);
952
956
  } catch (err) {
953
957
  mlog.debug(`failed to clear echo-text cache for ${name}`, logger_default.errorData(err));
@@ -1040,15 +1044,15 @@ function tryGetMindManager() {
1040
1044
  }
1041
1045
 
1042
1046
  export {
1047
+ generateMindToken,
1048
+ resolveMindToken,
1049
+ getMindToken,
1043
1050
  checkHealth,
1044
1051
  loadJsonMap,
1045
1052
  saveJsonMapAsync,
1046
1053
  clearJsonMap,
1047
1054
  RotatingLog,
1048
1055
  syncProviderToMinds,
1049
- generateMindToken,
1050
- resolveMindToken,
1051
- getMindToken,
1052
1056
  RestartTracker,
1053
1057
  buildMindBaseEnv,
1054
1058
  MindStartupError,
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  bufferEvent,
4
4
  subscribe
5
- } from "./chunk-U54PJPTB.js";
5
+ } from "./chunk-FYMIGUJ5.js";
6
6
  import {
7
7
  logger_default
8
- } from "./chunk-QUSMYGNQ.js";
8
+ } from "./chunk-2674KIGI.js";
9
9
  import {
10
10
  getDb
11
- } from "./chunk-H6X6CKDN.js";
11
+ } from "./chunk-TAVIVN2I.js";
12
12
  import {
13
13
  channels,
14
14
  conversationParticipants,
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  exec
4
- } from "./chunk-OIOW3FPT.js";
4
+ } from "./chunk-NA2NJXY4.js";
5
5
  import {
6
6
  logger_default
7
- } from "./chunk-QUSMYGNQ.js";
7
+ } from "./chunk-2674KIGI.js";
8
8
  import {
9
9
  getDb,
10
10
  readAllMinds,
11
11
  readGlobalConfig,
12
12
  voluteHome,
13
13
  voluteSystemDir
14
- } from "./chunk-H6X6CKDN.js";
14
+ } from "./chunk-TAVIVN2I.js";
15
15
 
16
16
  // packages/daemon/src/lib/backup/restic.ts
17
17
  import { writeFileSync } from "fs";
@@ -29,7 +29,7 @@ import { fileURLToPath } from "url";
29
29
  import { and, eq, inArray, isNull, or } from "drizzle-orm";
30
30
 
31
31
  // packages/daemon/src/lib/config/setup.ts
32
- import { chmodSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "fs";
32
+ import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
33
33
  import { resolve } from "path";
34
34
  function configPath() {
35
35
  return resolve(voluteSystemDir(), "config.json");
@@ -124,27 +124,6 @@ function writeGlobalConfig(config) {
124
124
  chmodSync(secPath, 384);
125
125
  _cachedConfig = { config, ts: Date.now() };
126
126
  }
127
- function migrateConfigSecrets() {
128
- const path = configPath();
129
- if (!existsSync(path)) return;
130
- let raw;
131
- try {
132
- raw = readFileSync(path, "utf-8");
133
- } catch {
134
- return;
135
- }
136
- let parsed;
137
- try {
138
- parsed = JSON.parse(raw);
139
- } catch {
140
- return;
141
- }
142
- const embedsSecrets = hasEntries(parsed.ai?.providers) || hasEntries(parsed.imagegen?.providers) || !!parsed.backup?.password || hasEntries(parsed.backup?.env);
143
- const mode = statSync(path).mode & 511;
144
- if (!embedsSecrets && mode === 420) return;
145
- _resetConfigCache();
146
- writeGlobalConfig(readGlobalConfig());
147
- }
148
127
  function computeSetupStatus(config) {
149
128
  if (config.setupCompleted === true) return "complete";
150
129
  if (config.setup != null && config.setupCompleted == null) return "complete";
@@ -196,13 +175,6 @@ function mindLimitError(count, limit) {
196
175
  }
197
176
  return null;
198
177
  }
199
- function migrateSetupCompleted() {
200
- const config = readGlobalConfig();
201
- if (config.setup != null && config.setupCompleted == null) {
202
- config.setupCompleted = true;
203
- writeGlobalConfig(config);
204
- }
205
- }
206
178
 
207
179
  // packages/daemon/src/lib/mind/registry.ts
208
180
  function isSpiritName(name) {
@@ -510,7 +482,6 @@ export {
510
482
  _resetConfigCache,
511
483
  readGlobalConfig,
512
484
  writeGlobalConfig,
513
- migrateConfigSecrets,
514
485
  computeSetupStatus,
515
486
  setupStatus,
516
487
  readGlobalConfigStrict,
@@ -519,6 +490,5 @@ export {
519
490
  getSpiritName,
520
491
  getSystemName,
521
492
  isImagegenEnabled,
522
- mindLimitError,
523
- migrateSetupCompleted
493
+ mindLimitError
524
494
  };
@@ -1,23 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getUserByUsername
4
- } from "./chunk-7LT3YZUR.js";
4
+ } from "./chunk-I3OJ342S.js";
5
5
  import {
6
+ parseDbTimestamp,
6
7
  publish
7
- } from "./chunk-LNNI3MS4.js";
8
+ } from "./chunk-MNKPAAQF.js";
8
9
  import {
9
10
  getPrompt
10
- } from "./chunk-OAYY3WF3.js";
11
+ } from "./chunk-CVPCRWWC.js";
11
12
  import {
12
13
  aiCompleteUtility
13
- } from "./chunk-EGV6R6UF.js";
14
+ } from "./chunk-E2SN3ZOJ.js";
14
15
  import {
15
16
  logger_default
16
- } from "./chunk-QUSMYGNQ.js";
17
+ } from "./chunk-2674KIGI.js";
17
18
  import {
18
19
  getDb,
19
20
  resolveMindDir
20
- } from "./chunk-H6X6CKDN.js";
21
+ } from "./chunk-TAVIVN2I.js";
21
22
  import {
22
23
  messages,
23
24
  mindHistory,
@@ -187,12 +188,6 @@ function getTimeRange(periodKey, period) {
187
188
  }
188
189
  }
189
190
 
190
- // packages/daemon/src/lib/util/time.ts
191
- function parseDbTimestamp(ts) {
192
- if (/[zZ]$|[+-]\d\d:?\d\d$/.test(ts)) return new Date(ts);
193
- return /* @__PURE__ */ new Date(`${ts.replace(" ", "T")}Z`);
194
- }
195
-
196
191
  // packages/daemon/src/lib/daemon/summarizer.ts
197
192
  var sLog = logger_default.child("summarizer");
198
193
  var SYSTEM_MIND = "_system";
@@ -1200,11 +1195,11 @@ var Summarizer = class {
1200
1195
  }
1201
1196
  };
1202
1197
  async function reconcileWedgedTurns(idleMs) {
1203
- const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-HZDPMSCC.js");
1198
+ const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-LZP5X6GZ.js");
1204
1199
  const wedged = await sweepWedgedTurns2(idleMs);
1205
1200
  if (wedged.length === 0) return;
1206
1201
  summarizeOrphanedTurns2(wedged);
1207
- const { tryGetDeliveryManager } = await import("./delivery-manager-7R2YIQ2W.js");
1202
+ const { tryGetDeliveryManager } = await import("./delivery-manager-5EGCFN4K.js");
1208
1203
  const dm = tryGetDeliveryManager();
1209
1204
  if (!dm) return;
1210
1205
  for (const t of wedged) {
@@ -1408,7 +1403,6 @@ export {
1408
1403
  utcDateTimeStr,
1409
1404
  parseUtcDateTime,
1410
1405
  getUtcTimeRange,
1411
- parseDbTimestamp,
1412
1406
  SYSTEM_MIND,
1413
1407
  summarizeTurn,
1414
1408
  supersedeTurnSummary,
@@ -3,10 +3,10 @@ import {
3
3
  LAUNCHD_PLIST_LABEL,
4
4
  LAUNCHD_PLIST_PATH,
5
5
  USER_SYSTEMD_UNIT
6
- } from "./chunk-CKPAVQNK.js";
6
+ } from "./chunk-OPTA3BJ4.js";
7
7
  import {
8
8
  resolveVoluteBin
9
- } from "./chunk-OIOW3FPT.js";
9
+ } from "./chunk-NA2NJXY4.js";
10
10
 
11
11
  // packages/daemon/src/lib/config/service-install.ts
12
12
  import { execFile } from "child_process";
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  publish
4
- } from "./chunk-U54PJPTB.js";
4
+ } from "./chunk-FYMIGUJ5.js";
5
5
  import {
6
6
  logger_default
7
- } from "./chunk-QUSMYGNQ.js";
7
+ } from "./chunk-2674KIGI.js";
8
8
 
9
9
  // packages/daemon/src/lib/events/mind-activity-tracker.ts
10
10
  var IDLE_TIMEOUT_MS = 5 * 60 * 1e3;
@@ -2,22 +2,22 @@
2
2
  import {
3
3
  getSleepManagerIfReady,
4
4
  startSpiritFull
5
- } from "./chunk-LGXVGIWN.js";
5
+ } from "./chunk-ELQU2GBT.js";
6
6
  import {
7
7
  spiritCreationInProgress
8
- } from "./chunk-RGHF3OK5.js";
8
+ } from "./chunk-GAAATVTM.js";
9
9
  import {
10
10
  MindStartupError,
11
11
  tryGetMindManager
12
- } from "./chunk-WHL6PKYP.js";
12
+ } from "./chunk-PAO7JZNW.js";
13
13
  import {
14
14
  logger_default
15
- } from "./chunk-QUSMYGNQ.js";
15
+ } from "./chunk-2674KIGI.js";
16
16
  import {
17
17
  computeSetupStatus,
18
18
  findMind,
19
19
  readGlobalConfigStrict
20
- } from "./chunk-H6X6CKDN.js";
20
+ } from "./chunk-TAVIVN2I.js";
21
21
 
22
22
  // packages/daemon/src/lib/chat/spirit-availability.ts
23
23
  var slog = logger_default.child("spirit-availability");
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- MEMORY_PLACEHOLDER_MARKER,
4
- ORIENTATION_MARKER
5
- } from "./chunk-OAYY3WF3.js";
6
2
  import {
7
3
  safeResolveWithinBase
8
4
  } from "./chunk-DW4TRDOZ.js";
9
5
  import {
10
6
  readVoluteConfig
11
7
  } from "./chunk-WCFSBH33.js";
8
+ import {
9
+ MEMORY_PLACEHOLDER_MARKER,
10
+ ORIENTATION_MARKER
11
+ } from "./chunk-CVPCRWWC.js";
12
12
  import {
13
13
  isImagegenEnabled
14
- } from "./chunk-H6X6CKDN.js";
14
+ } from "./chunk-TAVIVN2I.js";
15
15
 
16
16
  // packages/daemon/src/lib/mind/seed-readiness.ts
17
17
  import { existsSync, readFileSync } from "fs";
@@ -7,12 +7,12 @@ import {
7
7
  } from "./chunk-WCFSBH33.js";
8
8
  import {
9
9
  logger_default
10
- } from "./chunk-QUSMYGNQ.js";
10
+ } from "./chunk-2674KIGI.js";
11
11
  import {
12
12
  mindDir,
13
13
  readAllMinds,
14
14
  voluteHome
15
- } from "./chunk-H6X6CKDN.js";
15
+ } from "./chunk-TAVIVN2I.js";
16
16
 
17
17
  // packages/daemon/src/lib/util/avatar-image.ts
18
18
  import { readdir, readFile, writeFile } from "fs/promises";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  mindDir,
4
4
  stateDir
5
- } from "./chunk-H6X6CKDN.js";
5
+ } from "./chunk-TAVIVN2I.js";
6
6
 
7
7
  // packages/daemon/src/lib/mind/archive.ts
8
8
  import { execFileSync } from "child_process";