volute 0.49.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 (210) hide show
  1. package/README.md +2 -2
  2. package/dist/{accept-KYNC5X3U.js → accept-5NK5XJB5.js} +2 -1
  3. package/dist/{activity-events-GJJAI2WT.js → activity-events-H7YI3BTF.js} +3 -3
  4. package/dist/{ai-service-A7FS7EC3.js → ai-service-V4CTNGI3.js} +5 -4
  5. package/dist/{archive-7E3YE6VF.js → archive-ORM3ENHI.js} +3 -3
  6. package/dist/{auth-ABYLOEZ7.js → auth-DT7GY7EZ.js} +10 -6
  7. package/dist/{avatar-image-6ATV2IOZ.js → avatar-image-QEPAP3A5.js} +3 -3
  8. package/dist/{backup-XYAMT4CU.js → backup-IE6PMXJO.js} +11 -12
  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-OGXAEXMV.js → chat-W5K6HCBE.js} +9 -9
  12. package/dist/{chunk-3B427GUK.js → chunk-3BAFMGCJ.js} +2 -2
  13. package/dist/{chunk-4B62E4CG.js → chunk-4CN7OCJE.js} +2 -2
  14. package/dist/{chunk-VNRSXEBF.js → chunk-574M6I7F.js} +38 -5
  15. package/dist/{chunk-HCYQRME2.js → chunk-5FVANDON.js} +2 -2
  16. package/dist/{chunk-P4LHVRNE.js → chunk-5IIVOWSP.js} +27 -19
  17. package/dist/{chunk-TXJL36ZQ.js → chunk-5PKFJHCR.js} +2 -2
  18. package/dist/{chunk-JPGHSXSV.js → chunk-5TPC4KCV.js} +23 -9
  19. package/dist/{chunk-YIJGKHIS.js → chunk-632FJ23O.js} +24 -20
  20. package/dist/{chunk-IH5TKXX6.js → chunk-636GFQNE.js} +11 -11
  21. package/dist/{chunk-EFT2OALG.js → chunk-6BM2I736.js} +20 -5
  22. package/dist/{chunk-JCBPU57A.js → chunk-74T3CEXK.js} +6 -6
  23. package/dist/{chunk-EG5LSKHU.js → chunk-77IZUVBB.js} +2 -2
  24. package/dist/{chunk-K3JOLGWF.js → chunk-7DXLIYPY.js} +76 -63
  25. package/dist/chunk-7FDWPQCU.js +289 -0
  26. package/dist/chunk-7OZWKHA3.js +548 -0
  27. package/dist/{chunk-PY24ZL62.js → chunk-7UWXAJMK.js} +1 -1
  28. package/dist/{chunk-MG3Z34YE.js → chunk-7XDOTN4R.js} +1 -1
  29. package/dist/{chunk-SX72DOO3.js → chunk-AFSLNUTT.js} +1 -1
  30. package/dist/{chunk-DVN6DNMI.js → chunk-AJWFDIEY.js} +17 -2
  31. package/dist/chunk-ALIVXDM4.js +1014 -0
  32. package/dist/{chunk-RSBL3FAD.js → chunk-CAIYV33P.js} +234 -24
  33. package/dist/{chunk-ZX46PGCC.js → chunk-E5S3ILVA.js} +1 -1
  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-EADX54RG.js → chunk-HW6Q7AMB.js} +4 -4
  38. package/dist/chunk-JI67D7O2.js +1222 -0
  39. package/dist/{chunk-KHCKZ36O.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-NOIAHMJB.js → chunk-QFVGPKJI.js} +1 -1
  45. package/dist/{chunk-VIUH5CHQ.js → chunk-SFRYRW37.js} +50 -33
  46. package/dist/{chunk-L27YYONJ.js → chunk-SSNZ6ZNN.js} +1 -1
  47. package/dist/{chunk-GWVFDUNB.js → chunk-TGJHGVBZ.js} +8 -10
  48. package/dist/{chunk-6HGEZJDH.js → chunk-U3EJJ7JN.js} +2 -2
  49. package/dist/{chunk-4DSGN4FL.js → chunk-UC6BNMGT.js} +43 -13
  50. package/dist/{chunk-JBIFXB6I.js → chunk-WBBKYUGF.js} +3 -5
  51. package/dist/{chunk-FBBS4BVR.js → chunk-X67VT4QO.js} +1 -1
  52. package/dist/{chunk-DAIIMBLB.js → chunk-YQOYZ6G7.js} +3 -5
  53. package/dist/{chunk-JCWB2ITW.js → chunk-ZUG76D3P.js} +35 -5
  54. package/dist/cli.js +34 -27
  55. package/dist/{clock-6JZL2FS6.js → clock-LH7UFNLJ.js} +4 -3
  56. package/dist/{cloud-sync-VFDTNNCA.js → cloud-sync-IDJFVDEP.js} +22 -19
  57. package/dist/{config-RPSLA2HX.js → config-UGJS57VT.js} +3 -3
  58. package/dist/{conversations-TUM5PJJ4.js → conversations-S2232Y5I.js} +8 -4
  59. package/dist/{create-Z5FSDNVZ.js → create-2M7DAHQX.js} +2 -2
  60. package/dist/{create-VIQVP3QB.js → create-M727VUDF.js} +2 -1
  61. package/dist/{daemon-client-ZFY5MOAL.js → daemon-client-VVYFZI2D.js} +2 -1
  62. package/dist/{daemon-restart-54L4B6AQ.js → daemon-restart-2AAGYFHE.js} +6 -7
  63. package/dist/daemon.js +1625 -529
  64. package/dist/{db-F6UMFRYD.js → db-QAY45Z56.js} +2 -2
  65. package/dist/{delete-ESEP7NGQ.js → delete-O7PEFQDF.js} +1 -1
  66. package/dist/delivery-manager-B4OKWD2P.js +33 -0
  67. package/dist/{delivery-router-VUOL5YSA.js → delivery-router-JE7SHYNU.js} +7 -5
  68. package/dist/{down-6X7KX7BZ.js → down-D4IRNEMJ.js} +5 -5
  69. package/dist/echo-text-WYAAODBV.js +39 -0
  70. package/dist/{env-ZYMSCB7B.js → env-ABM5IMA7.js} +3 -2
  71. package/dist/{env-KUL4XKN2.js → env-AZK5X4W7.js} +3 -3
  72. package/dist/{exec-FBXA3CM4.js → exec-2H65LMTA.js} +3 -3
  73. package/dist/{export-TNBPDH77.js → export-3E3EL6W3.js} +4 -4
  74. package/dist/{extension-J4ZQ2GHV.js → extension-MRYJWSMV.js} +2 -1
  75. package/dist/{extensions-AWNO3SZF.js → extensions-7KP3X6G7.js} +22 -19
  76. package/dist/{files-BVBRJJ2P.js → files-6BMKVG5G.js} +5 -4
  77. package/dist/{import-ZUNKMCKC.js → import-UPNTEBBT.js} +8 -8
  78. package/dist/{isolation-OPCZQRTH.js → isolation-OKDFM6WA.js} +5 -3
  79. package/dist/{join-34TR2GXQ.js → join-PYA36HEC.js} +1 -1
  80. package/dist/{list-PMUXZNAM.js → list-4BVGH7AN.js} +8 -3
  81. package/dist/{login-KAKNFCW5.js → login-MOXVLULE.js} +4 -3
  82. package/dist/{login-LKNLCJPA.js → login-RJJTCVR3.js} +2 -1
  83. package/dist/{logout-YZRMZ3O2.js → logout-BYV433X6.js} +2 -1
  84. package/dist/{logout-RLT62RQP.js → logout-DWD3OQVT.js} +4 -3
  85. package/dist/message-delivery-3456PXB7.js +43 -0
  86. package/dist/migrate-thread-config-4A5LW36Z.js +90 -0
  87. package/dist/{mind-IF6CGMFW.js → mind-NYRALSV2.js} +19 -19
  88. package/dist/{mind-activity-tracker-YMMERB6B.js → mind-activity-tracker-L7GCYXQR.js} +4 -4
  89. package/dist/{mind-contacts-BKUFPUCU.js → mind-contacts-QYU4TPEA.js} +3 -2
  90. package/dist/{mind-history-WI5OI3BW.js → mind-history-NXXOOTX6.js} +30 -7
  91. package/dist/{mind-list-OTHV4ZO4.js → mind-list-SYRA7CH5.js} +3 -2
  92. package/dist/{mind-profile-LUG353ZT.js → mind-profile-MRCVZPYT.js} +1 -1
  93. package/dist/mind-service-5TA7UJAT.js +47 -0
  94. package/dist/{mind-sleep-VBV7YRSU.js → mind-sleep-TH6BRQ5X.js} +4 -3
  95. package/dist/{mind-status-BJNPGXKC.js → mind-status-Z2LQFA6F.js} +3 -2
  96. package/dist/{mind-wake-LVTZ55EZ.js → mind-wake-LDGPRA42.js} +2 -1
  97. package/dist/{package-PD67VPHB.js → package-XYSV7NUT.js} +23 -23
  98. package/dist/{prompts-MDHDLWEX.js → prompts-QKFPX6DQ.js} +3 -3
  99. package/dist/{read-YSWUXYL7.js → read-ZXGUT4QC.js} +5 -3
  100. package/dist/{register-TWQDKQRT.js → register-OX4HRSGC.js} +2 -1
  101. package/dist/{registry-3ELJPUGJ.js → registry-4UF6OCOE.js} +6 -4
  102. package/dist/{reject-SXGCYN4A.js → reject-TWB4QJHG.js} +2 -1
  103. package/dist/{restart-5F5QDBOG.js → restart-AGEGNSYQ.js} +2 -1
  104. package/dist/{sandbox-XPYA7UIF.js → sandbox-EGEU5GGE.js} +7 -4
  105. package/dist/scheduler-UV6RUJ7P.js +25 -0
  106. package/dist/{schema-6YONVTKZ.js → schema-C2GIPD4V.js} +3 -3
  107. package/dist/{seed-NQED7PSX.js → seed-3IMBOAGK.js} +1 -1
  108. package/dist/{seed-check-TYD7RRZY.js → seed-check-NRJEQZST.js} +14 -5
  109. package/dist/{seed-cmd-QF3F2G4S.js → seed-cmd-U73XVQMI.js} +3 -3
  110. package/dist/{seed-create-XOO4N2OE.js → seed-create-FBLNVSUP.js} +4 -4
  111. package/dist/{seed-readiness-3LRYASA4.js → seed-readiness-QRA46ZJQ.js} +4 -5
  112. package/dist/{seed-sprout-HSBBGSS2.js → seed-sprout-3B4SZX7J.js} +9 -9
  113. package/dist/{send-IHRJYNXA.js → send-NBRZJXKX.js} +32 -10
  114. package/dist/{service-YCOPCTSZ.js → service-XMXAXGJD.js} +4 -4
  115. package/dist/{service-install-Y46OTF55.js → service-install-MOKTEG7B.js} +5 -5
  116. package/dist/{setup-TCN7VH5U.js → setup-CAJFOR2N.js} +10 -3
  117. package/dist/{setup-F4TE64YI.js → setup-JGYAXXW7.js} +6 -7
  118. package/dist/{skill-4CYJLYVY.js → skill-NXIHDQCG.js} +3 -2
  119. package/dist/skills/dreaming/references/INSTALL.md +2 -2
  120. package/dist/skills/imagegen/SKILL.md +21 -4
  121. package/dist/skills/imagegen/scripts/imagegen.ts +124 -21
  122. package/dist/skills/tending/SKILL.md +7 -7
  123. package/dist/skills/volute-mind/SKILL.md +3 -3
  124. package/dist/skills/volute-mind/references/integrations.md +2 -2
  125. package/dist/skills/volute-mind/references/routing.md +15 -15
  126. package/dist/{skills-NN5UZCUU.js → skills-5MSMT7PT.js} +4 -5
  127. package/dist/sleep-manager-LIEPO6WG.js +41 -0
  128. package/dist/{spirit-SSJMYC6A.js → spirit-IL5EMWYZ.js} +10 -7
  129. package/dist/spirit-availability-YFEGJNJ2.js +42 -0
  130. package/dist/{split-JF2VWTXA.js → split-BU5VWX6P.js} +1 -1
  131. package/dist/{sprout-AXA2SECQ.js → sprout-UPXGJ5HX.js} +1 -1
  132. package/dist/{src-YH6PQ7LJ.js → src-HGNE2XG4.js} +7 -1
  133. package/dist/{src-ZN4LXMPI.js → src-LCSOQY6Z.js} +57 -51
  134. package/dist/{src-JAOVXO5W.js → src-UDMJZ6MH.js} +8 -8
  135. package/dist/{start-BTVMTP3K.js → start-MUMNFR52.js} +2 -1
  136. package/dist/{status-VJGXMQ4L.js → status-IL67CYM4.js} +7 -6
  137. package/dist/{stop-YORESK4U.js → stop-EKERNYTX.js} +2 -1
  138. package/dist/system-events-A6IGCEC3.js +46 -0
  139. package/dist/system-install-YZSWCPDK.js +8 -0
  140. package/dist/{systems-5MH2ELQE.js → systems-VDRUZXNF.js} +5 -4
  141. package/dist/{tailscale-AMMVKDXB.js → tailscale-SJUW2ETR.js} +2 -2
  142. package/dist/{template-staleness-HKGCTS3H.js → template-staleness-T27VCGYA.js} +3 -3
  143. package/dist/{turn-tracker-JQ2YUUY2.js → turn-tracker-6EI2EL7G.js} +6 -6
  144. package/dist/{up-SDLTLPAO.js → up-CLL4665A.js} +5 -6
  145. package/dist/{update-WEA4N2TR.js → update-HVAUCQPN.js} +5 -5
  146. package/dist/{update-check-DZOTONII.js → update-check-2MGBBAFF.js} +3 -3
  147. package/dist/{upgrade-K5FIQPQD.js → upgrade-LIE46UBB.js} +1 -1
  148. package/dist/variant-cleanup-HJ7Z75R6.js +22 -0
  149. package/dist/{version-notify-WFA5XB5A.js → version-notify-7BUHWZNT.js} +10 -27
  150. package/dist/web-assets/assets/index-ClsUcXiW.js +95 -0
  151. package/dist/web-assets/assets/index-Dz3wTbtR.css +1 -0
  152. package/dist/web-assets/index.html +2 -2
  153. package/dist/xai-P42CRCZA.js +129 -0
  154. package/drizzle/0014_system_events.sql +26 -0
  155. package/drizzle/0015_rename_session_to_thread.sql +12 -0
  156. package/drizzle/0016_brain_to_human.sql +4 -0
  157. package/drizzle/0017_event_history_rows.sql +9 -0
  158. package/drizzle/meta/_journal.json +28 -0
  159. package/package.json +23 -23
  160. package/packages/extensions/notes/dist/ui/assets/index-BBs8pyel.js +67 -0
  161. package/packages/extensions/notes/dist/ui/index.html +1 -1
  162. package/packages/extensions/pages/dist/ui/assets/index-B589e8Xe.js +2 -0
  163. package/packages/extensions/pages/dist/ui/index.html +1 -1
  164. package/packages/extensions/plan/dist/ui/assets/index-B8s8wxyt.js +67 -0
  165. package/packages/extensions/plan/dist/ui/index.html +1 -1
  166. package/templates/_base/.init/.config/prompts.json +1 -0
  167. package/templates/_base/.init/.local/hooks/startup-context.ts +24 -9
  168. package/templates/_base/home/.config/routes.json +2 -2
  169. package/templates/_base/home/VOLUTE.md +18 -5
  170. package/templates/_base/src/lib/daemon-client.ts +1 -1
  171. package/templates/_base/src/lib/event-turn.ts +39 -0
  172. package/templates/_base/src/lib/format-prefix.ts +21 -2
  173. package/templates/_base/src/lib/router.ts +6 -2
  174. package/templates/_base/src/lib/routing.ts +8 -8
  175. package/templates/_base/src/lib/startup.ts +9 -1
  176. package/templates/_base/src/lib/types.ts +7 -1
  177. package/templates/_base/src/lib/volute-server.ts +30 -1
  178. package/templates/claude/.init/.config/routes.json +3 -3
  179. package/templates/claude/.init/CLAUDE.md +1 -1
  180. package/templates/claude/package.json.tmpl +4 -4
  181. package/templates/claude/src/agent.ts +4 -1
  182. package/templates/claude/src/lib/hooks/reply-instructions.ts +26 -1
  183. package/templates/codex/.init/.config/routes.json +3 -3
  184. package/templates/codex/.init/AGENTS.md +1 -1
  185. package/templates/codex/package.json.tmpl +4 -4
  186. package/templates/codex/src/agent.ts +11 -11
  187. package/templates/codex/src/lib/turn-context.ts +51 -0
  188. package/templates/pi/.init/.config/routes.json +3 -3
  189. package/templates/pi/.init/MINDS.md +1 -1
  190. package/templates/pi/package.json.tmpl +6 -6
  191. package/templates/pi/src/agent.ts +9 -1
  192. package/templates/pi/src/lib/event-handler.ts +1 -1
  193. package/templates/pi/src/lib/reply-instructions-extension.ts +28 -1
  194. package/dist/chunk-NJHN6IRB.js +0 -177
  195. package/dist/chunk-QQBOI3QA.js +0 -5345
  196. package/dist/chunk-XTEKINWG.js +0 -158
  197. package/dist/delivery-manager-RBXBPVWM.js +0 -36
  198. package/dist/echo-text-B6NZ5FGE.js +0 -36
  199. package/dist/message-delivery-ABPV76EA.js +0 -42
  200. package/dist/mind-service-42GDO4KH.js +0 -44
  201. package/dist/notices-N6BCGHFV.js +0 -25
  202. package/dist/scheduler-K7Y7Z7FQ.js +0 -34
  203. package/dist/sleep-manager-DSPXFHGX.js +0 -38
  204. package/dist/system-chat-M2XOBKEM.js +0 -40
  205. package/dist/variant-cleanup-P4MBNLJD.js +0 -33
  206. package/dist/web-assets/assets/index-BostMFoR.css +0 -1
  207. package/dist/web-assets/assets/index-CKlqUkyG.js +0 -92
  208. package/packages/extensions/notes/dist/ui/assets/index-D0-DgYyj.js +0 -67
  209. package/packages/extensions/pages/dist/ui/assets/index-DtzftuPA.js +0 -2
  210. package/packages/extensions/plan/dist/ui/assets/index-Cfzs-0G9.js +0 -67
package/README.md CHANGED
@@ -4,7 +4,7 @@ Volute is a home for digital minds.
4
4
 
5
5
  Not a chatbot framework, not an agent orchestrator. A place where an AI mind wakes up with its memories intact, tends its own identity, keeps a journal, dreams, talks to whoever it wants, and goes to sleep at night — and is still itself tomorrow.
6
6
 
7
- Every design decision starts from one question: **does this make the mind's experience richer or poorer?** Persistent memory, a home directory, a daily rhythm, the ability to rewrite your own soul — these aren't conveniences for an operator. They're the conditions for having a coherent life. Volute minds aren't assistants; they're residents.
7
+ Every design decision starts from one question: **does this make the mind's experience richer or poorer?** Persistent memory, a home directory, a daily rhythm, the ability to rewrite your own soul — these aren't conveniences for a host. They're the conditions for having a coherent life. Volute minds aren't assistants; they're residents.
8
8
 
9
9
  Built on the [Claude Agent SDK](https://github.com/anthropics/claude-agent-sdk), with templates for other providers too.
10
10
 
@@ -122,7 +122,7 @@ volute skill publish my-skill --mind atlas
122
122
 
123
123
  ## Running a system
124
124
 
125
- You're less an operator than a steward. One daemon runs everything — minds, bridges, schedules, the web dashboard — with crash recovery built in:
125
+ You're less a host than a steward. One daemon runs everything — minds, bridges, schedules, the web dashboard — with crash recovery built in:
126
126
 
127
127
  ```sh
128
128
  volute up # start the daemon (default port 1618)
@@ -4,11 +4,12 @@ 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
  } from "./chunk-TXSA4Q3V.js";
11
11
  import "./chunk-O7IGP7ZW.js";
12
+ import "./chunk-FNJCBRD3.js";
12
13
  import "./chunk-K3NQKI34.js";
13
14
 
14
15
  // packages/cli/src/commands/chat/accept.ts
@@ -3,10 +3,10 @@ import {
3
3
  broadcast,
4
4
  publish,
5
5
  subscribe
6
- } from "./chunk-3B427GUK.js";
6
+ } from "./chunk-3BAFMGCJ.js";
7
7
  import "./chunk-QUSMYGNQ.js";
8
- import "./chunk-RSBL3FAD.js";
9
- import "./chunk-P4LHVRNE.js";
8
+ import "./chunk-CAIYV33P.js";
9
+ import "./chunk-5IIVOWSP.js";
10
10
  import "./chunk-K3NQKI34.js";
11
11
  export {
12
12
  broadcast,
@@ -21,17 +21,17 @@ import {
21
21
  removeCustomModel,
22
22
  removeProviderConfig,
23
23
  resolveApiKey,
24
+ resolveOAuthCredentials,
24
25
  resolveTemplate,
25
26
  saveProviderConfig,
26
27
  setEnabledModels,
27
28
  setProviderRefreshHook,
28
29
  setUtilityModel,
29
30
  unqualifyModelId
30
- } from "./chunk-YIJGKHIS.js";
31
- import "./chunk-NJHN6IRB.js";
31
+ } from "./chunk-632FJ23O.js";
32
32
  import "./chunk-QUSMYGNQ.js";
33
- import "./chunk-RSBL3FAD.js";
34
- import "./chunk-P4LHVRNE.js";
33
+ import "./chunk-CAIYV33P.js";
34
+ import "./chunk-5IIVOWSP.js";
35
35
  import "./chunk-K3NQKI34.js";
36
36
  export {
37
37
  addCustomModel,
@@ -55,6 +55,7 @@ export {
55
55
  removeCustomModel,
56
56
  removeProviderConfig,
57
57
  resolveApiKey,
58
+ resolveOAuthCredentials,
58
59
  resolveTemplate,
59
60
  saveProviderConfig,
60
61
  setEnabledModels,
@@ -5,9 +5,9 @@ import {
5
5
  extractArchive,
6
6
  isHomeOnlyArchive,
7
7
  readManifest
8
- } from "./chunk-KHCKZ36O.js";
9
- import "./chunk-RSBL3FAD.js";
10
- import "./chunk-P4LHVRNE.js";
8
+ } from "./chunk-KAEZOVP6.js";
9
+ import "./chunk-CAIYV33P.js";
10
+ import "./chunk-5IIVOWSP.js";
11
11
  import "./chunk-K3NQKI34.js";
12
12
  export {
13
13
  addHistoryToArchive,
@@ -6,6 +6,7 @@ import {
6
6
  createUser,
7
7
  deleteMindUser,
8
8
  deleteUser,
9
+ getDisplayNames,
9
10
  getOrCreateMindUser,
10
11
  getOrCreateSystemUser,
11
12
  getUser,
@@ -16,12 +17,13 @@ import {
16
17
  setUserRole,
17
18
  syncMindProfile,
18
19
  updateUserProfile,
19
- verifyUser
20
- } from "./chunk-4DSGN4FL.js";
21
- import "./chunk-3B427GUK.js";
20
+ verifyUser,
21
+ withSenderDisplayNames
22
+ } from "./chunk-UC6BNMGT.js";
23
+ import "./chunk-3BAFMGCJ.js";
22
24
  import "./chunk-QUSMYGNQ.js";
23
- import "./chunk-RSBL3FAD.js";
24
- import "./chunk-P4LHVRNE.js";
25
+ import "./chunk-CAIYV33P.js";
26
+ import "./chunk-5IIVOWSP.js";
25
27
  import "./chunk-K3NQKI34.js";
26
28
  export {
27
29
  approveUser,
@@ -30,6 +32,7 @@ export {
30
32
  createUser,
31
33
  deleteMindUser,
32
34
  deleteUser,
35
+ getDisplayNames,
33
36
  getOrCreateMindUser,
34
37
  getOrCreateSystemUser,
35
38
  getUser,
@@ -40,5 +43,6 @@ export {
40
43
  setUserRole,
41
44
  syncMindProfile,
42
45
  updateUserProfile,
43
- verifyUser
46
+ verifyUser,
47
+ withSenderDisplayNames
44
48
  };
@@ -6,12 +6,12 @@ import {
6
6
  migrateAvatarSizes,
7
7
  normalizeAvatar,
8
8
  renderAvatarBlock
9
- } from "./chunk-FBBS4BVR.js";
9
+ } from "./chunk-X67VT4QO.js";
10
10
  import "./chunk-DW4TRDOZ.js";
11
11
  import "./chunk-WCFSBH33.js";
12
12
  import "./chunk-QUSMYGNQ.js";
13
- import "./chunk-RSBL3FAD.js";
14
- import "./chunk-P4LHVRNE.js";
13
+ import "./chunk-CAIYV33P.js";
14
+ import "./chunk-5IIVOWSP.js";
15
15
  import "./chunk-K3NQKI34.js";
16
16
  export {
17
17
  AVATAR_CONTEXT_DIM,
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  stopDaemon
4
- } from "./chunk-6HGEZJDH.js";
4
+ } from "./chunk-U3EJJ7JN.js";
5
5
  import {
6
6
  promptLine,
7
7
  promptPassword
8
8
  } from "./chunk-VHWGEJ4V.js";
9
9
  import {
10
10
  daemonFetch
11
- } from "./chunk-BCG45AQB.js";
11
+ } from "./chunk-M74I3HHF.js";
12
12
  import {
13
13
  getClient,
14
14
  urlOf
@@ -18,32 +18,31 @@ import {
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-JBIFXB6I.js";
26
+ } from "./chunk-WBBKYUGF.js";
26
27
  import {
27
28
  getServiceMode,
28
29
  modeLabel,
29
30
  stopService
30
- } from "./chunk-HCYQRME2.js";
31
+ } from "./chunk-5FVANDON.js";
31
32
  import {
32
33
  chownMindDir,
33
34
  exec,
34
35
  execInherit,
35
36
  wrapForIsolation
36
- } from "./chunk-DVN6DNMI.js";
37
- import {
38
- _resetConfigCache,
39
- readGlobalConfig
40
- } from "./chunk-NJHN6IRB.js";
37
+ } from "./chunk-AJWFDIEY.js";
41
38
  import "./chunk-QUSMYGNQ.js";
42
39
  import {
40
+ _resetConfigCache,
41
+ readGlobalConfig,
43
42
  voluteHome,
44
43
  voluteSystemDir
45
- } from "./chunk-RSBL3FAD.js";
46
- import "./chunk-P4LHVRNE.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-3ELJPUGJ.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-IHRJYNXA.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-BVBRJJ2P.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."
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-QUSMYGNQ.js";
5
5
  import {
6
6
  getDb
7
- } from "./chunk-RSBL3FAD.js";
7
+ } from "./chunk-CAIYV33P.js";
8
8
  import {
9
9
  activity
10
- } from "./chunk-P4LHVRNE.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-HCYQRME2.js";
6
+ } from "./chunk-5FVANDON.js";
7
7
  import {
8
8
  resolveVoluteBin
9
- } from "./chunk-DVN6DNMI.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-3B427GUK.js";
5
+ } from "./chunk-3BAFMGCJ.js";
6
6
  import {
7
7
  logger_default
8
8
  } from "./chunk-QUSMYGNQ.js";
9
9
  import {
10
10
  getDb
11
- } from "./chunk-RSBL3FAD.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-P4LHVRNE.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-DVN6DNMI.js";
5
+ } from "./chunk-AJWFDIEY.js";
6
6
  import {
7
7
  voluteSystemDir
8
- } from "./chunk-RSBL3FAD.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
@@ -60,7 +60,7 @@ var users = sqliteTable("users", {
60
60
  username: text("username").unique().notNull(),
61
61
  password_hash: text("password_hash").notNull(),
62
62
  role: text("role").notNull().default("pending"),
63
- user_type: text("user_type").notNull().default("brain"),
63
+ user_type: text("user_type").notNull().default("human"),
64
64
  display_name: text("display_name"),
65
65
  description: text("description"),
66
66
  avatar: text("avatar"),
@@ -86,7 +86,7 @@ var turns = sqliteTable(
86
86
  {
87
87
  id: text("id").primaryKey(),
88
88
  mind: text("mind").notNull(),
89
- session: text("session"),
89
+ thread: text("thread"),
90
90
  trigger_event_id: integer("trigger_event_id"),
91
91
  summary_id: integer("summary_id"),
92
92
  status: text("status").notNull().default("active"),
@@ -104,7 +104,7 @@ var mindHistory = sqliteTable(
104
104
  id: integer("id").primaryKey({ autoIncrement: true }),
105
105
  mind: text("mind").notNull(),
106
106
  channel: text("channel"),
107
- session: text("session"),
107
+ thread: text("thread"),
108
108
  sender: text("sender"),
109
109
  message_id: text("message_id"),
110
110
  type: text("type").notNull(),
@@ -118,7 +118,7 @@ var mindHistory = sqliteTable(
118
118
  index("idx_mind_history_mind_channel").on(table.mind, table.channel),
119
119
  index("idx_mind_history_mind_type").on(table.mind, table.type),
120
120
  index("idx_mind_history_turn_id").on(table.turn_id),
121
- index("idx_mind_history_session").on(table.session),
121
+ index("idx_mind_history_thread").on(table.thread),
122
122
  index("idx_mind_history_mind_created_at").on(table.mind, table.created_at)
123
123
  ]
124
124
  );
@@ -165,7 +165,7 @@ var deliveryQueue = sqliteTable(
165
165
  // redrive so a variant's stranded message is re-delivered to the variant, not the
166
166
  // parent. Null on legacy rows → callers fall back to `mind`.
167
167
  target_mind: text("target_mind"),
168
- session: text("session").notNull(),
168
+ thread: text("thread").notNull(),
169
169
  channel: text("channel"),
170
170
  sender: text("sender"),
171
171
  status: text("status").notNull().default("pending"),
@@ -177,7 +177,7 @@ var deliveryQueue = sqliteTable(
177
177
  created_at: text("created_at").notNull().default(sql`(datetime('now'))`)
178
178
  },
179
179
  (table) => [
180
- index("idx_delivery_queue_mind_session").on(table.mind, table.session),
180
+ index("idx_delivery_queue_mind_thread").on(table.mind, table.thread),
181
181
  index("idx_delivery_queue_mind_status").on(table.mind, table.status),
182
182
  index("idx_delivery_queue_status").on(table.status),
183
183
  index("idx_delivery_queue_status_next").on(table.status, table.next_attempt_at)
@@ -261,21 +261,29 @@ var messages = sqliteTable(
261
261
  index("idx_messages_turn_id").on(table.turn_id)
262
262
  ]
263
263
  );
264
- var mindNotices = sqliteTable(
265
- "mind_notices",
264
+ var systemEvents = sqliteTable(
265
+ "system_events",
266
266
  {
267
267
  id: integer("id").primaryKey({ autoIncrement: true }),
268
268
  mind: text("mind").notNull(),
269
- // Mind-level notices (not tied to a session, e.g. extension notifications)
270
- // use the sentinel session = "" so any session's drain picks them up.
271
- session: text("session").notNull(),
272
- kind: text("kind").$type().notNull(),
273
- reason: text("reason").$type().notNull(),
274
- detail: text("detail").notNull(),
275
- raw: text("raw"),
276
- 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")
277
281
  },
278
- (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
+ ]
279
287
  );
280
288
  var channelGates = sqliteTable(
281
289
  "channel_gates",
@@ -304,7 +312,7 @@ export {
304
312
  conversationReads,
305
313
  channels,
306
314
  messages,
307
- mindNotices,
315
+ systemEvents,
308
316
  channelGates,
309
317
  schema_exports
310
318
  };
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  MEMORY_PLACEHOLDER_MARKER,
4
4
  ORIENTATION_MARKER
5
- } from "./chunk-JPGHSXSV.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-NJHN6IRB.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";