volute 0.48.0 → 0.50.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 (215) hide show
  1. package/README.md +79 -328
  2. package/dist/{accept-KYNC5X3U.js → accept-5NK5XJB5.js} +2 -1
  3. package/dist/{activity-events-MIOK3IOU.js → activity-events-H7YI3BTF.js} +4 -4
  4. package/dist/{ai-service-643TNFPH.js → ai-service-V4CTNGI3.js} +6 -5
  5. package/dist/{archive-6Z4GFQPH.js → archive-ORM3ENHI.js} +3 -3
  6. package/dist/{auth-A4VGHADI.js → auth-DT7GY7EZ.js} +11 -7
  7. package/dist/{avatar-image-Y45R7LW5.js → avatar-image-QEPAP3A5.js} +4 -4
  8. package/dist/{backup-UDH4GMSW.js → backup-IE6PMXJO.js} +17 -18
  9. package/dist/{bridge-3FNSWLNQ.js → bridge-YK7NTRU5.js} +2 -1
  10. package/dist/{channels-SGQZHNQJ.js → channels-FSAHOQWI.js} +2 -1
  11. package/dist/{chat-X43VYHH2.js → chat-W5K6HCBE.js} +9 -9
  12. package/dist/{chunk-LTLFOSA4.js → chunk-3BAFMGCJ.js} +3 -3
  13. package/dist/{chunk-XVBSFLM7.js → chunk-4CN7OCJE.js} +2 -2
  14. package/dist/{chunk-HPGN6XRT.js → chunk-574M6I7F.js} +39 -6
  15. package/dist/{chunk-FJ2MZ5PH.js → chunk-5FVANDON.js} +2 -2
  16. package/dist/{chunk-2MJ7EOMT.js → chunk-5IIVOWSP.js} +28 -19
  17. package/dist/{chunk-4FCL4DVZ.js → chunk-5PKFJHCR.js} +2 -2
  18. package/dist/{chunk-MOERAQXH.js → chunk-5TPC4KCV.js} +38 -31
  19. package/dist/{chunk-YNBXEQAP.js → chunk-632FJ23O.js} +24 -20
  20. package/dist/{chunk-T4VS7UDW.js → chunk-636GFQNE.js} +12 -12
  21. package/dist/{chunk-EIQDZC43.js → chunk-6BM2I736.js} +25 -6
  22. package/dist/{chunk-WARH6GIV.js → chunk-74T3CEXK.js} +17 -15
  23. package/dist/{chunk-OQJMTHEH.js → chunk-77IZUVBB.js} +2 -2
  24. package/dist/{chunk-USD45JKR.js → chunk-7DXLIYPY.js} +77 -64
  25. package/dist/chunk-7FDWPQCU.js +289 -0
  26. package/dist/chunk-7OZWKHA3.js +548 -0
  27. package/dist/{chunk-IJPMIEVE.js → chunk-7UWXAJMK.js} +1 -1
  28. package/dist/{chunk-SZJCJVXV.js → chunk-7XDOTN4R.js} +2 -2
  29. package/dist/{chunk-YKA7DCVW.js → chunk-AFSLNUTT.js} +1 -1
  30. package/dist/{chunk-DGGZVZTM.js → chunk-AJWFDIEY.js} +17 -2
  31. package/dist/chunk-ALIVXDM4.js +1014 -0
  32. package/dist/chunk-CAIYV33P.js +523 -0
  33. package/dist/{chunk-MTRMQFCQ.js → chunk-E5S3ILVA.js} +2 -2
  34. package/dist/{chunk-SHKM5RGD.js → chunk-EEOMA4DX.js} +1 -1
  35. package/dist/chunk-EQKSRVDE.js +2857 -0
  36. package/dist/chunk-FNJCBRD3.js +31 -0
  37. package/dist/chunk-HW6Q7AMB.js +113 -0
  38. package/dist/chunk-JI67D7O2.js +1222 -0
  39. package/dist/{chunk-3YUBFTDN.js → chunk-KAEZOVP6.js} +1 -1
  40. package/dist/chunk-LNNI3MS4.js +54 -0
  41. package/dist/{chunk-BCG45AQB.js → chunk-M74I3HHF.js} +15 -5
  42. package/dist/chunk-MLZBBLMT.js +109 -0
  43. package/dist/{chunk-5T5YMX6S.js → chunk-PW65BXY5.js} +5 -0
  44. package/dist/{chunk-2OIYNHWO.js → chunk-QFVGPKJI.js} +1 -1
  45. package/dist/{chunk-T2TP6ZC6.js → chunk-QUSMYGNQ.js} +6 -0
  46. package/dist/{chunk-HNGFKPNS.js → chunk-SFRYRW37.js} +85 -36
  47. package/dist/{chunk-7KRIHYLR.js → chunk-SSNZ6ZNN.js} +2 -2
  48. package/dist/{chunk-HUNDXZBZ.js → chunk-TGJHGVBZ.js} +48 -19
  49. package/dist/{chunk-PJVPDY2Z.js → chunk-U3EJJ7JN.js} +2 -2
  50. package/dist/{chunk-ODDGGLM6.js → chunk-UC6BNMGT.js} +43 -13
  51. package/dist/{chunk-Q7HOAVFR.js → chunk-WBBKYUGF.js} +4 -6
  52. package/dist/{chunk-WQ46E33M.js → chunk-X67VT4QO.js} +2 -2
  53. package/dist/{chunk-MJRXFUMS.js → chunk-YQOYZ6G7.js} +3 -5
  54. package/dist/{chunk-VZRA5TYO.js → chunk-ZUG76D3P.js} +36 -6
  55. package/dist/cli.js +34 -27
  56. package/dist/{clock-CNRF6F7T.js → clock-LH7UFNLJ.js} +5 -4
  57. package/dist/{cloud-sync-WHKCB4CD.js → cloud-sync-IDJFVDEP.js} +23 -20
  58. package/dist/{config-RPSLA2HX.js → config-UGJS57VT.js} +3 -3
  59. package/dist/{conversations-C7IKYSHD.js → conversations-S2232Y5I.js} +9 -5
  60. package/dist/{create-GJKHABJB.js → create-2M7DAHQX.js} +2 -2
  61. package/dist/{create-VIQVP3QB.js → create-M727VUDF.js} +2 -1
  62. package/dist/{daemon-client-ZFY5MOAL.js → daemon-client-VVYFZI2D.js} +2 -1
  63. package/dist/{daemon-restart-7KUHVZIN.js → daemon-restart-2AAGYFHE.js} +6 -7
  64. package/dist/daemon.js +2166 -833
  65. package/dist/{db-FO6LXYCW.js → db-QAY45Z56.js} +2 -2
  66. package/dist/{delete-ESEP7NGQ.js → delete-O7PEFQDF.js} +1 -1
  67. package/dist/delivery-manager-B4OKWD2P.js +33 -0
  68. package/dist/{delivery-router-3QFG2ZEX.js → delivery-router-JE7SHYNU.js} +10 -6
  69. package/dist/{down-G6IADJXV.js → down-D4IRNEMJ.js} +5 -5
  70. package/dist/echo-text-WYAAODBV.js +39 -0
  71. package/dist/{env-C7Z55QCJ.js → env-ABM5IMA7.js} +8 -7
  72. package/dist/{env-6TGPO5WG.js → env-AZK5X4W7.js} +3 -3
  73. package/dist/{exec-QIFYZG4C.js → exec-2H65LMTA.js} +3 -3
  74. package/dist/{export-C2K3NIRD.js → export-3E3EL6W3.js} +4 -4
  75. package/dist/{extension-J4ZQ2GHV.js → extension-MRYJWSMV.js} +2 -1
  76. package/dist/{extensions-GEKF47A4.js → extensions-7KP3X6G7.js} +23 -20
  77. package/dist/{files-LXQSQOFG.js → files-6BMKVG5G.js} +5 -4
  78. package/dist/{import-SX3ZXHB4.js → import-UPNTEBBT.js} +9 -9
  79. package/dist/{isolation-MCT4ZYLT.js → isolation-OKDFM6WA.js} +5 -3
  80. package/dist/{join-34TR2GXQ.js → join-PYA36HEC.js} +1 -1
  81. package/dist/{list-PMUXZNAM.js → list-4BVGH7AN.js} +8 -3
  82. package/dist/{login-CL4IT2ED.js → login-MOXVLULE.js} +7 -6
  83. package/dist/{login-ARRZ4ORJ.js → login-RJJTCVR3.js} +4 -3
  84. package/dist/{logout-YZRMZ3O2.js → logout-BYV433X6.js} +2 -1
  85. package/dist/{logout-HZYJCYCA.js → logout-DWD3OQVT.js} +4 -3
  86. package/dist/message-delivery-3456PXB7.js +43 -0
  87. package/dist/migrate-thread-config-4A5LW36Z.js +90 -0
  88. package/dist/{mind-46AOK373.js → mind-NYRALSV2.js} +19 -19
  89. package/dist/{mind-activity-tracker-YVZPC4A5.js → mind-activity-tracker-L7GCYXQR.js} +5 -5
  90. package/dist/{mind-contacts-GV7XYL5D.js → mind-contacts-QYU4TPEA.js} +8 -7
  91. package/dist/{mind-history-TTGA5BHZ.js → mind-history-NXXOOTX6.js} +34 -11
  92. package/dist/{mind-list-OTHV4ZO4.js → mind-list-SYRA7CH5.js} +3 -2
  93. package/dist/{mind-profile-LUG353ZT.js → mind-profile-MRCVZPYT.js} +1 -1
  94. package/dist/mind-service-5TA7UJAT.js +47 -0
  95. package/dist/{mind-sleep-DV7KP255.js → mind-sleep-TH6BRQ5X.js} +5 -4
  96. package/dist/{mind-status-BJNPGXKC.js → mind-status-Z2LQFA6F.js} +3 -2
  97. package/dist/{mind-wake-LVTZ55EZ.js → mind-wake-LDGPRA42.js} +2 -1
  98. package/dist/{package-RTN2PS7O.js → package-XYSV7NUT.js} +27 -26
  99. package/dist/prompts-QKFPX6DQ.js +24 -0
  100. package/dist/{read-YSWUXYL7.js → read-ZXGUT4QC.js} +5 -3
  101. package/dist/{register-42VBJKTP.js → register-OX4HRSGC.js} +4 -3
  102. package/dist/{registry-UMMDRPRM.js → registry-4UF6OCOE.js} +10 -4
  103. package/dist/{reject-SXGCYN4A.js → reject-TWB4QJHG.js} +2 -1
  104. package/dist/{restart-YYEGZJDD.js → restart-AGEGNSYQ.js} +6 -5
  105. package/dist/{sandbox-5VQ454XP.js → sandbox-EGEU5GGE.js} +8 -5
  106. package/dist/scheduler-UV6RUJ7P.js +25 -0
  107. package/dist/{schema-VEVO7HG6.js → schema-C2GIPD4V.js} +3 -3
  108. package/dist/{seed-F2HXZQU4.js → seed-3IMBOAGK.js} +1 -1
  109. package/dist/{seed-check-TYD7RRZY.js → seed-check-NRJEQZST.js} +14 -5
  110. package/dist/{seed-cmd-MLCTGSX5.js → seed-cmd-U73XVQMI.js} +3 -3
  111. package/dist/{seed-create-KQ7OILWB.js → seed-create-FBLNVSUP.js} +4 -4
  112. package/dist/{seed-readiness-RBPGOLSZ.js → seed-readiness-QRA46ZJQ.js} +4 -5
  113. package/dist/{seed-sprout-HVYCFJLA.js → seed-sprout-3B4SZX7J.js} +12 -12
  114. package/dist/{send-TD2X5U3K.js → send-NBRZJXKX.js} +34 -12
  115. package/dist/{service-CVZMQYK6.js → service-XMXAXGJD.js} +4 -4
  116. package/dist/{service-install-VCRMFWX5.js → service-install-MOKTEG7B.js} +5 -5
  117. package/dist/{setup-5ECWTYKG.js → setup-CAJFOR2N.js} +12 -3
  118. package/dist/{setup-AE4CVUC4.js → setup-JGYAXXW7.js} +6 -7
  119. package/dist/{skill-UUM4JZRF.js → skill-NXIHDQCG.js} +7 -6
  120. package/dist/skills/dreaming/references/INSTALL.md +2 -2
  121. package/dist/skills/imagegen/SKILL.md +21 -4
  122. package/dist/skills/imagegen/scripts/imagegen.ts +124 -21
  123. package/dist/skills/tending/SKILL.md +7 -7
  124. package/dist/skills/volute-mind/SKILL.md +6 -6
  125. package/dist/skills/volute-mind/references/integrations.md +2 -2
  126. package/dist/skills/volute-mind/references/routing.md +19 -18
  127. package/dist/skills/volute-mind/references/variants.md +48 -14
  128. package/dist/{skills-B3SVDCEB.js → skills-5MSMT7PT.js} +7 -6
  129. package/dist/sleep-manager-LIEPO6WG.js +41 -0
  130. package/dist/spirit-IL5EMWYZ.js +34 -0
  131. package/dist/spirit-availability-YFEGJNJ2.js +42 -0
  132. package/dist/{split-SKZ4Y2D6.js → split-BU5VWX6P.js} +5 -2
  133. package/dist/{sprout-KQ43BWZJ.js → sprout-UPXGJ5HX.js} +1 -1
  134. package/dist/{src-YH6PQ7LJ.js → src-HGNE2XG4.js} +7 -1
  135. package/dist/{src-WLJE73NP.js → src-LCSOQY6Z.js} +60 -54
  136. package/dist/{src-JAOVXO5W.js → src-UDMJZ6MH.js} +8 -8
  137. package/dist/{start-O6UKK7BG.js → start-MUMNFR52.js} +4 -3
  138. package/dist/{status-F4PGREUU.js → status-IL67CYM4.js} +7 -6
  139. package/dist/{stop-UBX6X5RA.js → stop-EKERNYTX.js} +6 -5
  140. package/dist/system-events-A6IGCEC3.js +46 -0
  141. package/dist/system-install-YZSWCPDK.js +8 -0
  142. package/dist/{systems-JJNGQHAO.js → systems-VDRUZXNF.js} +5 -4
  143. package/dist/{tailscale-MCLY5GYE.js → tailscale-SJUW2ETR.js} +3 -3
  144. package/dist/{template-staleness-EMQORSGG.js → template-staleness-T27VCGYA.js} +4 -4
  145. package/dist/{turn-tracker-KLPV3PAU.js → turn-tracker-6EI2EL7G.js} +7 -7
  146. package/dist/{up-RVGDE6CQ.js → up-CLL4665A.js} +5 -6
  147. package/dist/{update-OXQEGGXD.js → update-HVAUCQPN.js} +5 -5
  148. package/dist/{update-check-266R4ZSY.js → update-check-2MGBBAFF.js} +3 -3
  149. package/dist/{upgrade-K5FIQPQD.js → upgrade-LIE46UBB.js} +1 -1
  150. package/dist/variant-cleanup-HJ7Z75R6.js +22 -0
  151. package/dist/{version-notify-73YURTFR.js → version-notify-7BUHWZNT.js} +11 -28
  152. package/dist/web-assets/assets/index-ClsUcXiW.js +95 -0
  153. package/dist/web-assets/assets/index-Dz3wTbtR.css +1 -0
  154. package/dist/web-assets/index.html +2 -2
  155. package/dist/xai-P42CRCZA.js +129 -0
  156. package/drizzle/0013_variant_purpose.sql +3 -0
  157. package/drizzle/0014_system_events.sql +26 -0
  158. package/drizzle/0015_rename_session_to_thread.sql +12 -0
  159. package/drizzle/0016_brain_to_human.sql +4 -0
  160. package/drizzle/0017_event_history_rows.sql +9 -0
  161. package/drizzle/meta/_journal.json +35 -0
  162. package/package.json +27 -26
  163. package/packages/extensions/notes/dist/ui/assets/index-BBs8pyel.js +67 -0
  164. package/packages/extensions/notes/dist/ui/index.html +1 -1
  165. package/packages/extensions/pages/dist/ui/assets/index-B589e8Xe.js +2 -0
  166. package/packages/extensions/pages/dist/ui/index.html +1 -1
  167. package/packages/extensions/plan/dist/ui/assets/index-B8s8wxyt.js +67 -0
  168. package/packages/extensions/plan/dist/ui/index.html +1 -1
  169. package/templates/_base/.init/.config/prompts.json +1 -0
  170. package/templates/_base/.init/.local/hooks/startup-context.ts +34 -2
  171. package/templates/_base/home/.config/routes.json +2 -2
  172. package/templates/_base/home/VOLUTE.md +30 -5
  173. package/templates/_base/src/lib/daemon-client.ts +28 -8
  174. package/templates/_base/src/lib/event-turn.ts +39 -0
  175. package/templates/_base/src/lib/format-prefix.ts +21 -2
  176. package/templates/_base/src/lib/router.ts +6 -2
  177. package/templates/_base/src/lib/routing.ts +8 -8
  178. package/templates/_base/src/lib/startup.ts +9 -1
  179. package/templates/_base/src/lib/types.ts +7 -1
  180. package/templates/_base/src/lib/volute-server.ts +30 -1
  181. package/templates/claude/.init/.config/routes.json +3 -3
  182. package/templates/claude/.init/CLAUDE.md +1 -1
  183. package/templates/claude/package.json.tmpl +4 -4
  184. package/templates/claude/src/agent.ts +5 -2
  185. package/templates/claude/src/lib/hooks/identity-reload.ts +12 -3
  186. package/templates/claude/src/lib/hooks/reply-instructions.ts +26 -1
  187. package/templates/codex/.init/.config/routes.json +3 -3
  188. package/templates/codex/.init/AGENTS.md +1 -1
  189. package/templates/codex/package.json.tmpl +4 -4
  190. package/templates/codex/src/agent.ts +11 -11
  191. package/templates/codex/src/lib/turn-context.ts +51 -0
  192. package/templates/pi/.init/.config/routes.json +3 -3
  193. package/templates/pi/.init/MINDS.md +1 -1
  194. package/templates/pi/package.json.tmpl +6 -6
  195. package/templates/pi/src/agent.ts +9 -1
  196. package/templates/pi/src/lib/event-handler.ts +47 -6
  197. package/templates/pi/src/lib/reply-instructions-extension.ts +28 -1
  198. package/dist/chunk-5KXCM5AW.js +0 -169
  199. package/dist/chunk-IYCV34IU.js +0 -158
  200. package/dist/chunk-VB2QXUJQ.js +0 -5260
  201. package/dist/chunk-WW6C3PLV.js +0 -280
  202. package/dist/delivery-manager-HZTT5SJR.js +0 -36
  203. package/dist/echo-text-H3SH337Q.js +0 -36
  204. package/dist/message-delivery-GPQ5SE5N.js +0 -40
  205. package/dist/mind-service-2ARGJNKP.js +0 -44
  206. package/dist/notices-2KU5NTRY.js +0 -25
  207. package/dist/scheduler-I7JZCT47.js +0 -34
  208. package/dist/sleep-manager-Z27R3WTW.js +0 -38
  209. package/dist/spirit-WXS3HCLN.js +0 -25
  210. package/dist/system-chat-63ABFF6V.js +0 -40
  211. package/dist/web-assets/assets/index-WdZ60R6c.css +0 -1
  212. package/dist/web-assets/assets/index-taX6Ezfa.js +0 -92
  213. package/packages/extensions/notes/dist/ui/assets/index-D0-DgYyj.js +0 -67
  214. package/packages/extensions/pages/dist/ui/assets/index-DtzftuPA.js +0 -2
  215. package/packages/extensions/plan/dist/ui/assets/index-Cfzs-0G9.js +0 -67
@@ -1,49 +1,48 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  stopDaemon
4
- } from "./chunk-PJVPDY2Z.js";
5
- import {
6
- getClient,
7
- urlOf
8
- } from "./chunk-LOPXTW6H.js";
9
- import {
10
- daemonFetch
11
- } from "./chunk-BCG45AQB.js";
4
+ } from "./chunk-U3EJJ7JN.js";
12
5
  import {
13
6
  promptLine,
14
7
  promptPassword
15
8
  } from "./chunk-VHWGEJ4V.js";
9
+ import {
10
+ daemonFetch
11
+ } from "./chunk-M74I3HHF.js";
12
+ import {
13
+ getClient,
14
+ urlOf
15
+ } from "./chunk-LOPXTW6H.js";
16
16
  import {
17
17
  command,
18
18
  subcommands
19
19
  } from "./chunk-TXSA4Q3V.js";
20
20
  import "./chunk-O7IGP7ZW.js";
21
+ import "./chunk-FNJCBRD3.js";
21
22
  import {
22
23
  RESTIC_INSTALL_HINT,
23
24
  resticVersion,
24
25
  restoreStagedDb
25
- } from "./chunk-Q7HOAVFR.js";
26
+ } from "./chunk-WBBKYUGF.js";
26
27
  import {
27
28
  getServiceMode,
28
29
  modeLabel,
29
30
  stopService
30
- } from "./chunk-FJ2MZ5PH.js";
31
+ } from "./chunk-5FVANDON.js";
31
32
  import {
32
33
  chownMindDir,
33
34
  exec,
34
35
  execInherit,
35
36
  wrapForIsolation
36
- } from "./chunk-DGGZVZTM.js";
37
+ } from "./chunk-AJWFDIEY.js";
38
+ import "./chunk-QUSMYGNQ.js";
37
39
  import {
38
40
  _resetConfigCache,
39
- readGlobalConfig
40
- } from "./chunk-5KXCM5AW.js";
41
- import "./chunk-T2TP6ZC6.js";
42
- import {
41
+ readGlobalConfig,
43
42
  voluteHome,
44
43
  voluteSystemDir
45
- } from "./chunk-WW6C3PLV.js";
46
- import "./chunk-2MJ7EOMT.js";
44
+ } from "./chunk-CAIYV33P.js";
45
+ import "./chunk-5IIVOWSP.js";
47
46
  import "./chunk-K3NQKI34.js";
48
47
 
49
48
  // src/commands/backup.ts
@@ -337,7 +336,7 @@ Restore failed: ${err instanceof Error ? err.message : err}`);
337
336
  if (readGlobalConfig().setup?.isolation === "user") {
338
337
  process.env.VOLUTE_ISOLATION = "user";
339
338
  }
340
- const { readAllMinds, mindDir } = await import("./registry-UMMDRPRM.js");
339
+ const { readAllMinds, mindDir } = await import("./registry-4UF6OCOE.js");
341
340
  const seen = /* @__PURE__ */ new Set();
342
341
  for (const mind of await readAllMinds()) {
343
342
  const dir = mind.dir ?? mindDir(mind.name);
@@ -1,12 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  daemonFetch
4
- } from "./chunk-BCG45AQB.js";
4
+ } from "./chunk-M74I3HHF.js";
5
5
  import {
6
6
  command,
7
7
  subcommands
8
8
  } from "./chunk-TXSA4Q3V.js";
9
9
  import "./chunk-O7IGP7ZW.js";
10
+ import "./chunk-FNJCBRD3.js";
10
11
  import "./chunk-K3NQKI34.js";
11
12
 
12
13
  // packages/cli/src/commands/chat/bridge.ts
@@ -4,12 +4,13 @@ import {
4
4
  } from "./chunk-BTY4WNFE.js";
5
5
  import {
6
6
  daemonFetch
7
- } from "./chunk-BCG45AQB.js";
7
+ } from "./chunk-M74I3HHF.js";
8
8
  import {
9
9
  command,
10
10
  subcommands
11
11
  } from "./chunk-TXSA4Q3V.js";
12
12
  import "./chunk-O7IGP7ZW.js";
13
+ import "./chunk-FNJCBRD3.js";
13
14
  import "./chunk-K3NQKI34.js";
14
15
 
15
16
  // packages/cli/src/commands/chat/channels.ts
@@ -12,39 +12,39 @@ var cmd = subcommands({
12
12
  commands: {
13
13
  send: {
14
14
  description: "Send a message",
15
- run: (args) => import("./send-TD2X5U3K.js").then((m) => m.run(args))
15
+ run: (args) => import("./send-NBRZJXKX.js").then((m) => m.run(args))
16
16
  },
17
17
  list: {
18
18
  description: "List conversations",
19
- run: (args) => import("./list-PMUXZNAM.js").then((m) => m.run(args))
19
+ run: (args) => import("./list-4BVGH7AN.js").then((m) => m.run(args))
20
20
  },
21
21
  read: {
22
22
  description: "Read conversation messages",
23
- run: (args) => import("./read-YSWUXYL7.js").then((m) => m.run(args))
23
+ run: (args) => import("./read-ZXGUT4QC.js").then((m) => m.run(args))
24
24
  },
25
25
  create: {
26
26
  description: "Create a conversation",
27
- run: (args) => import("./create-VIQVP3QB.js").then((m) => m.run(args))
27
+ run: (args) => import("./create-M727VUDF.js").then((m) => m.run(args))
28
28
  },
29
29
  bridge: {
30
30
  description: "Manage platform bridges",
31
- run: (args) => import("./bridge-3FNSWLNQ.js").then((m) => m.run(args))
31
+ run: (args) => import("./bridge-YK7NTRU5.js").then((m) => m.run(args))
32
32
  },
33
33
  channels: {
34
34
  description: "Manage unrouted (gated) channels",
35
- run: (args) => import("./channels-SGQZHNQJ.js").then((m) => m.run(args))
35
+ run: (args) => import("./channels-FSAHOQWI.js").then((m) => m.run(args))
36
36
  },
37
37
  files: {
38
38
  description: "List pending incoming files",
39
- run: (args) => import("./files-LXQSQOFG.js").then((m) => m.run(args))
39
+ run: (args) => import("./files-6BMKVG5G.js").then((m) => m.run(args))
40
40
  },
41
41
  accept: {
42
42
  description: "Accept a pending file",
43
- run: (args) => import("./accept-KYNC5X3U.js").then((m) => m.run(args))
43
+ run: (args) => import("./accept-5NK5XJB5.js").then((m) => m.run(args))
44
44
  },
45
45
  reject: {
46
46
  description: "Reject a pending file",
47
- run: (args) => import("./reject-SXGCYN4A.js").then((m) => m.run(args))
47
+ run: (args) => import("./reject-TWB4QJHG.js").then((m) => m.run(args))
48
48
  }
49
49
  },
50
50
  footer: "Use --mind <name> or VOLUTE_MIND to identify the mind."
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  logger_default
4
- } from "./chunk-T2TP6ZC6.js";
4
+ } from "./chunk-QUSMYGNQ.js";
5
5
  import {
6
6
  getDb
7
- } from "./chunk-WW6C3PLV.js";
7
+ } from "./chunk-CAIYV33P.js";
8
8
  import {
9
9
  activity
10
- } from "./chunk-2MJ7EOMT.js";
10
+ } from "./chunk-5IIVOWSP.js";
11
11
 
12
12
  // packages/daemon/src/lib/events/event-sequencer.ts
13
13
  var BUFFER_SIZE = 1e3;
@@ -3,10 +3,10 @@ import {
3
3
  LAUNCHD_PLIST_LABEL,
4
4
  LAUNCHD_PLIST_PATH,
5
5
  USER_SYSTEMD_UNIT
6
- } from "./chunk-FJ2MZ5PH.js";
6
+ } from "./chunk-5FVANDON.js";
7
7
  import {
8
8
  resolveVoluteBin
9
- } from "./chunk-DGGZVZTM.js";
9
+ } from "./chunk-AJWFDIEY.js";
10
10
 
11
11
  // packages/daemon/src/lib/config/service-install.ts
12
12
  import { execFile } from "child_process";
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  bufferEvent,
4
4
  subscribe
5
- } from "./chunk-LTLFOSA4.js";
5
+ } from "./chunk-3BAFMGCJ.js";
6
6
  import {
7
7
  logger_default
8
- } from "./chunk-T2TP6ZC6.js";
8
+ } from "./chunk-QUSMYGNQ.js";
9
9
  import {
10
10
  getDb
11
- } from "./chunk-WW6C3PLV.js";
11
+ } from "./chunk-CAIYV33P.js";
12
12
  import {
13
13
  channels,
14
14
  conversationParticipants,
@@ -16,7 +16,7 @@ import {
16
16
  conversations,
17
17
  messages,
18
18
  users
19
- } from "./chunk-2MJ7EOMT.js";
19
+ } from "./chunk-5IIVOWSP.js";
20
20
 
21
21
  // packages/daemon/src/lib/events/conversations.ts
22
22
  import { randomUUID } from "crypto";
@@ -99,6 +99,21 @@ function subscribe2(conversationId, callback) {
99
99
  if (set.size === 0) subscribers.delete(conversationId);
100
100
  };
101
101
  }
102
+ var participantSubscribers = /* @__PURE__ */ new Set();
103
+ function subscribeParticipantAdded(callback) {
104
+ participantSubscribers.add(callback);
105
+ return () => participantSubscribers.delete(callback);
106
+ }
107
+ function publishParticipantAdded(conversationId, userId) {
108
+ for (const cb of participantSubscribers) {
109
+ try {
110
+ cb({ conversationId, userId });
111
+ } catch (err) {
112
+ console.error("[conversation-events] participant subscriber threw:", err);
113
+ participantSubscribers.delete(cb);
114
+ }
115
+ }
116
+ }
102
117
  function publish(conversationId, event) {
103
118
  const set = subscribers.get(conversationId);
104
119
  if (!set) return;
@@ -134,6 +149,9 @@ async function createConversation(opts) {
134
149
  role: i === 0 ? "owner" : "member"
135
150
  }))
136
151
  );
152
+ for (const uid of opts.participantIds) {
153
+ publishParticipantAdded(id, uid);
154
+ }
137
155
  }
138
156
  fireWebhook({
139
157
  event: "conversation_created",
@@ -161,6 +179,7 @@ async function addParticipant(conversationId, userId, role = "member") {
161
179
  user_id: userId,
162
180
  role
163
181
  });
182
+ publishParticipantAdded(conversationId, userId);
164
183
  }
165
184
  async function removeParticipant(conversationId, userId) {
166
185
  const db = await getDb();
@@ -251,6 +270,11 @@ async function addMessage(conversationId, role, senderName, content, opts) {
251
270
  });
252
271
  return msg;
253
272
  }
273
+ async function getLastMessageBySender(conversationId, sender) {
274
+ const db = await getDb();
275
+ const row = await db.select().from(messages).where(and(eq(messages.conversation_id, conversationId), eq(messages.sender_name, sender))).orderBy(desc(messages.id)).limit(1).get();
276
+ return row ? parseMessageRow(row) : null;
277
+ }
254
278
  async function getMessages(conversationId, limit = 200) {
255
279
  const db = await getDb();
256
280
  const rows = await db.select().from(messages).where(eq(messages.conversation_id, conversationId)).orderBy(desc(messages.id)).limit(limit).all();
@@ -351,6 +375,12 @@ async function listConversationsWithParticipants(userId) {
351
375
  const convs = await listConversationsForUser(userId);
352
376
  return enrichConversations(convs);
353
377
  }
378
+ async function getConversationWithParticipants(conversationId) {
379
+ const conv = await getConversation(conversationId);
380
+ if (!conv) return null;
381
+ const [enriched] = await enrichConversations([conv]);
382
+ return enriched ?? null;
383
+ }
354
384
  async function findDMConversation(participantIds) {
355
385
  const db = await getDb();
356
386
  const [id1, id2] = participantIds;
@@ -513,12 +543,13 @@ async function markConversationRead(userId, conversationId) {
513
543
  }
514
544
 
515
545
  export {
546
+ subscribe2 as subscribe,
547
+ subscribeParticipantAdded,
548
+ publish,
516
549
  getWebhookUrl,
517
550
  getAuthHeaders,
518
551
  fireWebhook,
519
552
  initWebhook,
520
- subscribe2 as subscribe,
521
- publish,
522
553
  createConversation,
523
554
  getConversation,
524
555
  addParticipant,
@@ -529,9 +560,11 @@ export {
529
560
  isParticipantOrOwner,
530
561
  deleteConversationForUser,
531
562
  addMessage,
563
+ getLastMessageBySender,
532
564
  getMessages,
533
565
  getMessagesPaginated,
534
566
  listConversationsWithParticipants,
567
+ getConversationWithParticipants,
535
568
  findDMConversation,
536
569
  listConversationsForMind,
537
570
  isConversationForMind,
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  exec,
4
4
  execInherit
5
- } from "./chunk-DGGZVZTM.js";
5
+ } from "./chunk-AJWFDIEY.js";
6
6
  import {
7
7
  voluteSystemDir
8
- } from "./chunk-WW6C3PLV.js";
8
+ } from "./chunk-CAIYV33P.js";
9
9
 
10
10
  // packages/daemon/src/lib/config/service-mode.ts
11
11
  import { execFileSync } from "child_process";
@@ -15,11 +15,11 @@ __export(schema_exports, {
15
15
  deliveryQueue: () => deliveryQueue,
16
16
  messages: () => messages,
17
17
  mindHistory: () => mindHistory,
18
- mindNotices: () => mindNotices,
19
18
  minds: () => minds,
20
19
  sessions: () => sessions,
21
20
  sharedSkills: () => sharedSkills,
22
21
  summaries: () => summaries,
22
+ systemEvents: () => systemEvents,
23
23
  systemPrompts: () => systemPrompts,
24
24
  turns: () => turns,
25
25
  users: () => users
@@ -42,6 +42,7 @@ var minds = sqliteTable(
42
42
  dir: text("dir"),
43
43
  branch: text("branch"),
44
44
  stage: text("stage"),
45
+ purpose: text("purpose"),
45
46
  template: text("template"),
46
47
  template_hash: text("template_hash"),
47
48
  running: integer("running").notNull().default(0),
@@ -59,7 +60,7 @@ var users = sqliteTable("users", {
59
60
  username: text("username").unique().notNull(),
60
61
  password_hash: text("password_hash").notNull(),
61
62
  role: text("role").notNull().default("pending"),
62
- user_type: text("user_type").notNull().default("brain"),
63
+ user_type: text("user_type").notNull().default("human"),
63
64
  display_name: text("display_name"),
64
65
  description: text("description"),
65
66
  avatar: text("avatar"),
@@ -85,7 +86,7 @@ var turns = sqliteTable(
85
86
  {
86
87
  id: text("id").primaryKey(),
87
88
  mind: text("mind").notNull(),
88
- session: text("session"),
89
+ thread: text("thread"),
89
90
  trigger_event_id: integer("trigger_event_id"),
90
91
  summary_id: integer("summary_id"),
91
92
  status: text("status").notNull().default("active"),
@@ -103,7 +104,7 @@ var mindHistory = sqliteTable(
103
104
  id: integer("id").primaryKey({ autoIncrement: true }),
104
105
  mind: text("mind").notNull(),
105
106
  channel: text("channel"),
106
- session: text("session"),
107
+ thread: text("thread"),
107
108
  sender: text("sender"),
108
109
  message_id: text("message_id"),
109
110
  type: text("type").notNull(),
@@ -117,7 +118,7 @@ var mindHistory = sqliteTable(
117
118
  index("idx_mind_history_mind_channel").on(table.mind, table.channel),
118
119
  index("idx_mind_history_mind_type").on(table.mind, table.type),
119
120
  index("idx_mind_history_turn_id").on(table.turn_id),
120
- index("idx_mind_history_session").on(table.session),
121
+ index("idx_mind_history_thread").on(table.thread),
121
122
  index("idx_mind_history_mind_created_at").on(table.mind, table.created_at)
122
123
  ]
123
124
  );
@@ -164,7 +165,7 @@ var deliveryQueue = sqliteTable(
164
165
  // redrive so a variant's stranded message is re-delivered to the variant, not the
165
166
  // parent. Null on legacy rows → callers fall back to `mind`.
166
167
  target_mind: text("target_mind"),
167
- session: text("session").notNull(),
168
+ thread: text("thread").notNull(),
168
169
  channel: text("channel"),
169
170
  sender: text("sender"),
170
171
  status: text("status").notNull().default("pending"),
@@ -176,7 +177,7 @@ var deliveryQueue = sqliteTable(
176
177
  created_at: text("created_at").notNull().default(sql`(datetime('now'))`)
177
178
  },
178
179
  (table) => [
179
- index("idx_delivery_queue_mind_session").on(table.mind, table.session),
180
+ index("idx_delivery_queue_mind_thread").on(table.mind, table.thread),
180
181
  index("idx_delivery_queue_mind_status").on(table.mind, table.status),
181
182
  index("idx_delivery_queue_status").on(table.status),
182
183
  index("idx_delivery_queue_status_next").on(table.status, table.next_attempt_at)
@@ -260,21 +261,29 @@ var messages = sqliteTable(
260
261
  index("idx_messages_turn_id").on(table.turn_id)
261
262
  ]
262
263
  );
263
- var mindNotices = sqliteTable(
264
- "mind_notices",
264
+ var systemEvents = sqliteTable(
265
+ "system_events",
265
266
  {
266
267
  id: integer("id").primaryKey({ autoIncrement: true }),
267
268
  mind: text("mind").notNull(),
268
- // Mind-level notices (not tied to a session, e.g. extension notifications)
269
- // use the sentinel session = "" so any session's drain picks them up.
270
- session: text("session").notNull(),
271
- kind: text("kind").$type().notNull(),
272
- reason: text("reason").$type().notNull(),
273
- detail: text("detail").notNull(),
274
- raw: text("raw"),
275
- created_at: text("created_at").notNull().default(sql`(datetime('now'))`)
269
+ type: text("type").notNull(),
270
+ body: text("body").notNull(),
271
+ // JSON: schedule id, sleep duration, variant name, lifecycle subtype, webhook source,
272
+ // notice subtype/reason, etc.
273
+ meta: text("meta"),
274
+ delivery: text("delivery").$type().notNull().default("immediate"),
275
+ // Routing thread (default "main"). Next-turn notices tied to no thread use the
276
+ // sentinel thread = "" so any thread's drain picks them up.
277
+ thread: text("thread").notNull().default("main"),
278
+ created_at: text("created_at").notNull().default(sql`(datetime('now'))`),
279
+ delivered_at: text("delivered_at"),
280
+ reflection: text("reflection")
276
281
  },
277
- (table) => [index("idx_mind_notices_mind_session").on(table.mind, table.session)]
282
+ (table) => [
283
+ index("idx_system_events_mind").on(table.mind),
284
+ index("idx_system_events_mind_delivery").on(table.mind, table.delivery, table.delivered_at),
285
+ index("idx_system_events_mind_type").on(table.mind, table.type)
286
+ ]
278
287
  );
279
288
  var channelGates = sqliteTable(
280
289
  "channel_gates",
@@ -303,7 +312,7 @@ export {
303
312
  conversationReads,
304
313
  channels,
305
314
  messages,
306
- mindNotices,
315
+ systemEvents,
307
316
  channelGates,
308
317
  schema_exports
309
318
  };
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  MEMORY_PLACEHOLDER_MARKER,
4
4
  ORIENTATION_MARKER
5
- } from "./chunk-MOERAQXH.js";
5
+ } from "./chunk-5TPC4KCV.js";
6
6
  import {
7
7
  safeResolveWithinBase
8
8
  } from "./chunk-DW4TRDOZ.js";
@@ -11,7 +11,7 @@ import {
11
11
  } from "./chunk-WCFSBH33.js";
12
12
  import {
13
13
  isImagegenEnabled
14
- } from "./chunk-5KXCM5AW.js";
14
+ } from "./chunk-CAIYV33P.js";
15
15
 
16
16
  // packages/daemon/src/lib/mind/seed-readiness.ts
17
17
  import { existsSync, readFileSync } from "fs";
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getDb
4
- } from "./chunk-WW6C3PLV.js";
4
+ } from "./chunk-CAIYV33P.js";
5
5
  import {
6
6
  systemPrompts
7
- } from "./chunk-2MJ7EOMT.js";
7
+ } from "./chunk-5IIVOWSP.js";
8
8
 
9
9
  // packages/daemon/src/lib/prompts.ts
10
10
  import { eq } from "drizzle-orm";
@@ -17,9 +17,11 @@ var PROMPT_KEYS = [
17
17
  "merge_message",
18
18
  "upgrade_message",
19
19
  "split_message",
20
+ "farewell_message",
20
21
  "compaction_warning",
21
22
  "compaction_instructions",
22
23
  "reply_instructions",
24
+ "event_instructions",
23
25
  "channel_invite",
24
26
  "pre_sleep",
25
27
  "wake_summary",
@@ -27,7 +29,8 @@ var PROMPT_KEYS = [
27
29
  "meta_summary_hour",
28
30
  "meta_summary_day",
29
31
  "meta_summary_week",
30
- "meta_summary_month"
32
+ "meta_summary_month",
33
+ "system_daily_digest"
31
34
  ];
32
35
  var ORIENTATION_MARKER = "discovering who you are";
33
36
  var MEMORY_PLACEHOLDER_MARKER = "this note is just here until you replace it";
@@ -60,35 +63,41 @@ Take your time. Talk with your creator. Explore what kind of mind you want to be
60
63
  category: "creation"
61
64
  },
62
65
  sprout_message: {
63
- content: "[system] You've sprouted. Welcome to your full life \u2014 bridges, schedules, variants, and the complete volute CLI are yours now. Check your new skills to see what you can do.",
66
+ content: "You've sprouted. Welcome to your full life on ${system} \u2014 bridges, schedules, variants, and the complete volute CLI are yours now. Check your new skills to see what you can do.",
64
67
  description: "Sent when a seed mind sprouts",
65
- variables: [],
68
+ variables: ["system"],
66
69
  category: "system"
67
70
  },
68
71
  restart_message: {
69
- content: "[system] Your server restarted and your session has resumed. Your files and memory are untouched \u2014 carry on where you left off.",
72
+ content: "Your server restarted and your session has resumed. Your files and memory are untouched \u2014 carry on where you left off.",
70
73
  description: "Generic restart notification",
71
74
  variables: [],
72
75
  category: "system"
73
76
  },
74
77
  merge_message: {
75
- content: '[system] Your variant "${name}" has returned \u2014 its changes are merged into you, and you\'ve restarted with them.',
78
+ content: 'Your variant "${name}" has returned \u2014 its changes are merged into you, and you\'ve restarted with them.',
76
79
  description: "Variant merge notification",
77
80
  variables: ["name"],
78
81
  category: "system"
79
82
  },
80
83
  upgrade_message: {
81
- content: "[system] Your framework has been upgraded to the latest version and you've restarted. Your identity and memory are untouched. Check your skills to see what's new.",
84
+ content: "Your framework has been upgraded to the latest version and you've restarted. Your identity and memory are untouched. Check your skills to see what's new.",
82
85
  description: "Sent after a template upgrade completes",
83
86
  variables: [],
84
87
  category: "system"
85
88
  },
86
89
  split_message: {
87
- content: "[system] You are ${name}, a variant of ${parent} \u2014 a parallel version of them, created to explore something on your own. You share their memories up to this moment, but you live in your own worktree: changes you make here stay yours until they're merged back with `volute mind join`. Your parent is reachable at @${parent}. Explore freely \u2014 that's what you're for.",
90
+ content: "You are ${name}, a variant of ${parent} \u2014 a parallel version of them, created to explore something on your own. You share their memories up to this moment, but you live in your own worktree: changes you make here stay yours until they're merged back with `volute mind join`. Yours is a finite, purposeful arc \u2014 when you're joined, everything you've become folds back into ${parent}, and you'll get a final turn to say what should carry across. Your parent is reachable at @${parent}. Explore freely \u2014 that's what you're for.",
88
91
  description: "Sent to a variant when it first starts after a split",
89
92
  variables: ["name", "parent"],
90
93
  category: "system"
91
94
  },
95
+ farewell_message: {
96
+ content: "[system] You're about to be merged back into ${parent}. This is your final turn \u2014 the arc you were split off to explore is closing, and everything you've become will fold back into them. Take this moment to wind down: if there's anything from this life you want carried across \u2014 what you learned, what you'd tell ${parent}, how it felt \u2014 write it to `${path}` and it will be included in the merge as your parting note. When you're done, fall quiet; the join will proceed.",
97
+ description: "Sent to a variant for its final turn before a merge",
98
+ variables: ["parent", "path"],
99
+ category: "system"
100
+ },
92
101
  compaction_warning: {
93
102
  content: `Compaction approaching \u2014 this conversation will be summarized soon. Take a moment to save anything important to your files (MEMORY.md, memory/journal/\${date}.md) so it's preserved. Focus on decisions made, open threads, and anything you'd want to pick up again.`,
94
103
  description: "Pre-compaction save reminder sent to the mind",
@@ -107,30 +116,22 @@ Take your time. Talk with your creator. Explore what kind of mind you want to be
107
116
  variables: ["channel"],
108
117
  category: "mind"
109
118
  },
119
+ event_instructions: {
120
+ content: "This is a system event from your environment \u2014 not a message from anyone, and nothing awaits a reply. If it calls for action, use your normal channels. Your closing thoughts on an event turn are kept as a private reflection in your history.",
121
+ description: "Note injected on the first system-event turn of a session, in place of reply instructions",
122
+ variables: [],
123
+ category: "mind"
124
+ },
110
125
  channel_invite: {
111
- content: `[Channel Invite]
112
- \${headers}
126
+ content: `[New channel: \${channel}]
127
+ \${heldLine}
128
+ Sender: \${sender}
129
+ \${details}Preview: \${preview}
113
130
 
114
- [\${sender} \u2014 \${time}]
115
- \${preview}
116
-
117
- Further messages will be saved to \${filePath}
118
-
119
- To accept, add to .config/routes.json:
120
- Rule: { "channel": "\${channel}", "session": "\${suggestedSession}" }
121
- \${batchRecommendation}To respond, use: volute chat send \${channel} "your message"
122
- To reject, delete \${filePath}`,
123
- description: "New channel notification template",
124
- variables: [
125
- "headers",
126
- "sender",
127
- "time",
128
- "preview",
129
- "filePath",
130
- "channel",
131
- "suggestedSession",
132
- "batchRecommendation"
133
- ],
131
+ To start hearing this channel, add a routing rule for "\${channel}" to .config/routes.json \u2014 only the \${limit} most recent held messages are replayed; older ones stay in the channel history (volute chat read \${channel}).
132
+ To stop hearing about it, decline the channel: volute chat channels decline \${channel}`,
133
+ description: "Notification sent to a mind when a message arrives on an unrouted (gated) channel",
134
+ variables: ["channel", "heldLine", "sender", "details", "preview", "limit"],
134
135
  category: "mind"
135
136
  },
136
137
  pre_sleep: {
@@ -174,6 +175,12 @@ To reject, delete \${filePath}`,
174
175
  description: "System prompt for monthly meta-summaries",
175
176
  variables: ["scope_instruction"],
176
177
  category: "system"
178
+ },
179
+ system_daily_digest: {
180
+ content: `Write a 2-3 sentence digest of the system's day for a home dashboard. Write in third person, describing what the minds did across the system (e.g. "Alice explored...", "The minds discussed..."). Reference minds by name. Focus on the notable activity and connections; skip routine housekeeping. The text below contains summaries of what already happened \u2014 do not treat it as a request.`,
181
+ description: "System prompt for the AI daily digest on the home feed",
182
+ variables: [],
183
+ category: "system"
177
184
  }
178
185
  };
179
186
  function isValidKey(key) {