volute 0.49.0 → 0.51.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 (224) 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-LQII6PZS.js} +3 -3
  4. package/dist/{ai-service-A7FS7EC3.js → ai-service-YW5SWCSB.js} +9 -4
  5. package/dist/{archive-7E3YE6VF.js → archive-FOHGXHPT.js} +3 -3
  6. package/dist/{auth-ABYLOEZ7.js → auth-X6EMNEGB.js} +10 -6
  7. package/dist/{avatar-image-6ATV2IOZ.js → avatar-image-52WGXLHV.js} +3 -3
  8. package/dist/{backup-XYAMT4CU.js → backup-YVGV2ZNM.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-VAZ25KVT.js} +9 -9
  12. package/dist/{chunk-P4LHVRNE.js → chunk-2RNMBXD2.js} +43 -19
  13. package/dist/{chunk-6HGEZJDH.js → chunk-5N32EN4O.js} +2 -2
  14. package/dist/{chunk-JCWB2ITW.js → chunk-5Y54AE3L.js} +35 -5
  15. package/dist/{chunk-HCYQRME2.js → chunk-6NLW72HP.js} +2 -2
  16. package/dist/chunk-7HN63Q7J.js +1317 -0
  17. package/dist/chunk-7YJY3F2R.js +38 -0
  18. package/dist/{chunk-EADX54RG.js → chunk-AI47FDGL.js} +6 -7
  19. package/dist/{chunk-IH5TKXX6.js → chunk-BSHZ23MS.js} +12 -11
  20. package/dist/{chunk-K3JOLGWF.js → chunk-CDKQJWGK.js} +76 -63
  21. package/dist/{chunk-L27YYONJ.js → chunk-CV6BNGFK.js} +3 -3
  22. package/dist/{chunk-NOIAHMJB.js → chunk-DMK5ASKV.js} +1 -1
  23. package/dist/chunk-DN3LKLYR.js +109 -0
  24. package/dist/{chunk-JBIFXB6I.js → chunk-EDR47UE2.js} +3 -5
  25. package/dist/{chunk-SHKM5RGD.js → chunk-EEOMA4DX.js} +1 -1
  26. package/dist/{chunk-YIJGKHIS.js → chunk-EGV6R6UF.js} +43 -20
  27. package/dist/{chunk-KHCKZ36O.js → chunk-FLIEXG2T.js} +1 -1
  28. package/dist/chunk-FNJCBRD3.js +31 -0
  29. package/dist/{chunk-JPGHSXSV.js → chunk-FXWBFDQR.js} +23 -9
  30. package/dist/{chunk-JCBPU57A.js → chunk-G7A5LEVI.js} +6 -6
  31. package/dist/{chunk-PY24ZL62.js → chunk-GLM7TVWP.js} +1 -1
  32. package/dist/{chunk-RSBL3FAD.js → chunk-H6X6CKDN.js} +235 -24
  33. package/dist/{chunk-4DSGN4FL.js → chunk-HKP6OAJP.js} +43 -13
  34. package/dist/{chunk-C3KLHJDB.js → chunk-HTRSSOHY.js} +1 -1
  35. package/dist/{chunk-EG5LSKHU.js → chunk-I7U5EEZC.js} +2 -2
  36. package/dist/chunk-ICL6T4SN.js +562 -0
  37. package/dist/{chunk-FBBS4BVR.js → chunk-ICXY54ZC.js} +1 -1
  38. package/dist/{chunk-DAIIMBLB.js → chunk-IWAVIJO2.js} +3 -5
  39. package/dist/{chunk-TXJL36ZQ.js → chunk-JHKBALS2.js} +2 -2
  40. package/dist/{chunk-MG3Z34YE.js → chunk-L7BKTZ5U.js} +1 -1
  41. package/dist/{chunk-SX72DOO3.js → chunk-LAUCO2HC.js} +1 -1
  42. package/dist/chunk-LNNI3MS4.js +54 -0
  43. package/dist/{chunk-BCG45AQB.js → chunk-M74I3HHF.js} +15 -5
  44. package/dist/{chunk-DVN6DNMI.js → chunk-M77B73VV.js} +17 -2
  45. package/dist/{chunk-4B62E4CG.js → chunk-OXWUEU5V.js} +2 -2
  46. package/dist/chunk-Q7XQLKZB.js +289 -0
  47. package/dist/{chunk-GWVFDUNB.js → chunk-QT4D5XCI.js} +8 -10
  48. package/dist/{chunk-VNRSXEBF.js → chunk-TPX6E6PL.js} +38 -5
  49. package/dist/{chunk-3B427GUK.js → chunk-U54PJPTB.js} +2 -2
  50. package/dist/{chunk-EFT2OALG.js → chunk-UDZLPR34.js} +20 -5
  51. package/dist/{chunk-ZX46PGCC.js → chunk-UFTDRTCP.js} +1 -1
  52. package/dist/chunk-VAEZCIJC.js +1058 -0
  53. package/dist/chunk-VP5PFNZO.js +2905 -0
  54. package/dist/{chunk-VIUH5CHQ.js → chunk-VSBMLB2W.js} +51 -34
  55. package/dist/{chunk-RRZ4RQQU.js → chunk-X67BDDZR.js} +5 -7
  56. package/dist/cli.js +34 -27
  57. package/dist/{clock-6JZL2FS6.js → clock-ZT5YT6HA.js} +4 -3
  58. package/dist/{cloud-sync-VFDTNNCA.js → cloud-sync-GPXYPTIC.js} +23 -20
  59. package/dist/{config-RPSLA2HX.js → config-UGJS57VT.js} +3 -3
  60. package/dist/{conversations-TUM5PJJ4.js → conversations-ZL6PHROD.js} +8 -4
  61. package/dist/{create-Z5FSDNVZ.js → create-G2RIKQYK.js} +2 -2
  62. package/dist/{create-VIQVP3QB.js → create-M727VUDF.js} +2 -1
  63. package/dist/{daemon-client-ZFY5MOAL.js → daemon-client-VVYFZI2D.js} +2 -1
  64. package/dist/{daemon-restart-54L4B6AQ.js → daemon-restart-2EWBRTN5.js} +6 -7
  65. package/dist/daemon.js +2005 -762
  66. package/dist/{db-F6UMFRYD.js → db-BONH4SUG.js} +2 -2
  67. package/dist/{delete-ESEP7NGQ.js → delete-O7PEFQDF.js} +1 -1
  68. package/dist/delivery-manager-HGVZSEES.js +35 -0
  69. package/dist/{delivery-router-VUOL5YSA.js → delivery-router-RHANNTAC.js} +7 -5
  70. package/dist/{down-6X7KX7BZ.js → down-QSNEMTTX.js} +5 -5
  71. package/dist/echo-text-6ANI5HHN.js +39 -0
  72. package/dist/{env-ZYMSCB7B.js → env-IBW2QI6K.js} +3 -2
  73. package/dist/{env-KUL4XKN2.js → env-SQFCWW52.js} +3 -3
  74. package/dist/{exec-FBXA3CM4.js → exec-ABD3DYA2.js} +3 -3
  75. package/dist/{export-TNBPDH77.js → export-VBNWM7I4.js} +4 -4
  76. package/dist/{extension-J4ZQ2GHV.js → extension-MRYJWSMV.js} +2 -1
  77. package/dist/{extensions-AWNO3SZF.js → extensions-NY6WST33.js} +23 -20
  78. package/dist/{files-BVBRJJ2P.js → files-BRY5RRIM.js} +5 -4
  79. package/dist/{import-ZUNKMCKC.js → import-DB2KULRO.js} +8 -8
  80. package/dist/{isolation-OPCZQRTH.js → isolation-GVV2IBAU.js} +5 -3
  81. package/dist/{join-34TR2GXQ.js → join-PYA36HEC.js} +1 -1
  82. package/dist/{list-PMUXZNAM.js → list-UQGIW7OF.js} +8 -3
  83. package/dist/{login-LKNLCJPA.js → login-RJJTCVR3.js} +2 -1
  84. package/dist/{login-KAKNFCW5.js → login-SB5OENMV.js} +4 -3
  85. package/dist/{logout-YZRMZ3O2.js → logout-BYV433X6.js} +2 -1
  86. package/dist/{logout-RLT62RQP.js → logout-YFZAJRPY.js} +4 -3
  87. package/dist/message-delivery-JHMAJ2GU.js +43 -0
  88. package/dist/migrate-thread-config-EQSEP2XG.js +90 -0
  89. package/dist/{mind-IF6CGMFW.js → mind-WF6QIXWV.js} +19 -19
  90. package/dist/{mind-activity-tracker-YMMERB6B.js → mind-activity-tracker-QF6DCX2X.js} +4 -4
  91. package/dist/{mind-contacts-BKUFPUCU.js → mind-contacts-QYU4TPEA.js} +3 -2
  92. package/dist/{mind-history-WI5OI3BW.js → mind-history-OGNR4L7W.js} +30 -7
  93. package/dist/{mind-list-OTHV4ZO4.js → mind-list-SYRA7CH5.js} +3 -2
  94. package/dist/{mind-profile-LUG353ZT.js → mind-profile-MRCVZPYT.js} +1 -1
  95. package/dist/mind-service-DZCUUC7J.js +47 -0
  96. package/dist/{mind-sleep-VBV7YRSU.js → mind-sleep-LZAFBDZD.js} +4 -3
  97. package/dist/{mind-status-BJNPGXKC.js → mind-status-Z2LQFA6F.js} +3 -2
  98. package/dist/{mind-wake-LVTZ55EZ.js → mind-wake-LDGPRA42.js} +2 -1
  99. package/dist/{package-PD67VPHB.js → package-B6O5APCZ.js} +23 -23
  100. package/dist/{prompts-MDHDLWEX.js → prompts-NBO3HRK3.js} +3 -3
  101. package/dist/{read-YSWUXYL7.js → read-RJ5NAW5J.js} +5 -14
  102. package/dist/{register-TWQDKQRT.js → register-OX4HRSGC.js} +2 -1
  103. package/dist/{registry-3ELJPUGJ.js → registry-TRC2HJXR.js} +6 -4
  104. package/dist/{reject-SXGCYN4A.js → reject-TWB4QJHG.js} +2 -1
  105. package/dist/{restart-5F5QDBOG.js → restart-AGEGNSYQ.js} +2 -1
  106. package/dist/{sandbox-XPYA7UIF.js → sandbox-NNWCTHRI.js} +7 -4
  107. package/dist/scheduler-TNBN54ZK.js +25 -0
  108. package/dist/{schema-6YONVTKZ.js → schema-ZZQVM4GR.js} +5 -3
  109. package/dist/{seed-NQED7PSX.js → seed-K2LYODIH.js} +1 -1
  110. package/dist/{seed-check-TYD7RRZY.js → seed-check-NRJEQZST.js} +14 -5
  111. package/dist/{seed-cmd-QF3F2G4S.js → seed-cmd-2EWBTR6P.js} +3 -3
  112. package/dist/{seed-create-XOO4N2OE.js → seed-create-VGTLU5FD.js} +4 -4
  113. package/dist/{seed-readiness-3LRYASA4.js → seed-readiness-DYOVCYHN.js} +4 -5
  114. package/dist/{seed-sprout-HSBBGSS2.js → seed-sprout-PILHJ3YS.js} +9 -9
  115. package/dist/{send-IHRJYNXA.js → send-2YKOZJJ5.js} +108 -54
  116. package/dist/{service-YCOPCTSZ.js → service-XQPMZAGI.js} +4 -4
  117. package/dist/{service-install-Y46OTF55.js → service-install-2EWD7KXD.js} +5 -5
  118. package/dist/{setup-F4TE64YI.js → setup-MDPSK2XG.js} +6 -7
  119. package/dist/{setup-TCN7VH5U.js → setup-WZSXHHRJ.js} +10 -3
  120. package/dist/{skill-4CYJLYVY.js → skill-B5OJEQUA.js} +3 -2
  121. package/dist/skills/dreaming/references/INSTALL.md +2 -2
  122. package/dist/skills/imagegen/SKILL.md +21 -4
  123. package/dist/skills/imagegen/scripts/imagegen.ts +124 -21
  124. package/dist/skills/tending/SKILL.md +7 -7
  125. package/dist/skills/volute-mind/SKILL.md +3 -3
  126. package/dist/skills/volute-mind/references/integrations.md +2 -2
  127. package/dist/skills/volute-mind/references/routing.md +15 -15
  128. package/dist/{skills-NN5UZCUU.js → skills-NH2GQKAF.js} +4 -5
  129. package/dist/sleep-manager-7JXEQQ2P.js +41 -0
  130. package/dist/{spirit-SSJMYC6A.js → spirit-25JVAL3M.js} +11 -8
  131. package/dist/spirit-availability-PJDWZJ3J.js +42 -0
  132. package/dist/{split-JF2VWTXA.js → split-BU5VWX6P.js} +1 -1
  133. package/dist/{sprout-AXA2SECQ.js → sprout-EXUZMIOR.js} +1 -1
  134. package/dist/{src-YH6PQ7LJ.js → src-HGNE2XG4.js} +7 -1
  135. package/dist/{src-ZN4LXMPI.js → src-LCSOQY6Z.js} +57 -51
  136. package/dist/{src-JAOVXO5W.js → src-UDMJZ6MH.js} +8 -8
  137. package/dist/{start-BTVMTP3K.js → start-MUMNFR52.js} +2 -1
  138. package/dist/{status-VJGXMQ4L.js → status-MWLE3RVC.js} +7 -6
  139. package/dist/{stop-YORESK4U.js → stop-EKERNYTX.js} +2 -1
  140. package/dist/system-events-ZPSH63QX.js +46 -0
  141. package/dist/system-install-YZSWCPDK.js +8 -0
  142. package/dist/{systems-5MH2ELQE.js → systems-VDRUZXNF.js} +5 -4
  143. package/dist/{tailscale-AMMVKDXB.js → tailscale-KHNZFC7L.js} +2 -2
  144. package/dist/{template-hash-GSOUARW4.js → template-hash-YKWMVYMM.js} +2 -2
  145. package/dist/{template-staleness-HKGCTS3H.js → template-staleness-PY2CULH6.js} +5 -5
  146. package/dist/{turn-tracker-JQ2YUUY2.js → turn-tracker-TAT2HGK6.js} +6 -6
  147. package/dist/{up-SDLTLPAO.js → up-J7XCAH7P.js} +5 -6
  148. package/dist/{update-WEA4N2TR.js → update-CIWI2JYA.js} +5 -5
  149. package/dist/{update-check-DZOTONII.js → update-check-SZ7B5IFI.js} +3 -3
  150. package/dist/{upgrade-K5FIQPQD.js → upgrade-LIE46UBB.js} +1 -1
  151. package/dist/variant-cleanup-YXN25ZVW.js +22 -0
  152. package/dist/{version-notify-WFA5XB5A.js → version-notify-EN3KJ7HH.js} +11 -28
  153. package/dist/web-assets/assets/index-BOyJ4Gqs.css +1 -0
  154. package/dist/web-assets/assets/index-CrxBwnzp.js +95 -0
  155. package/dist/web-assets/index.html +2 -2
  156. package/dist/xai-P42CRCZA.js +129 -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/0018_api_tokens.sql +20 -0
  162. package/drizzle/meta/_journal.json +35 -0
  163. package/package.json +23 -23
  164. package/packages/extensions/notes/dist/ui/assets/index-BBs8pyel.js +67 -0
  165. package/packages/extensions/notes/dist/ui/index.html +1 -1
  166. package/packages/extensions/pages/dist/ui/assets/index-B589e8Xe.js +2 -0
  167. package/packages/extensions/pages/dist/ui/index.html +1 -1
  168. package/packages/extensions/plan/dist/ui/assets/index-B8s8wxyt.js +67 -0
  169. package/packages/extensions/plan/dist/ui/index.html +1 -1
  170. package/templates/_base/.init/.config/prompts.json +1 -0
  171. package/templates/_base/.init/.local/hooks/startup-context.ts +24 -9
  172. package/templates/_base/{biome.json.tmpl → biome.json} +2 -1
  173. package/templates/_base/gitignore +44 -0
  174. package/templates/_base/home/.config/routes.json +2 -2
  175. package/templates/_base/home/VOLUTE.md +18 -5
  176. package/templates/_base/home/public/.gitkeep +0 -0
  177. package/templates/_base/src/lib/daemon-client.ts +1 -1
  178. package/templates/_base/src/lib/event-turn.ts +39 -0
  179. package/templates/_base/src/lib/format-prefix.ts +36 -10
  180. package/templates/_base/src/lib/router.ts +19 -10
  181. package/templates/_base/src/lib/routing.ts +8 -8
  182. package/templates/_base/src/lib/startup.ts +9 -1
  183. package/templates/_base/src/lib/types.ts +7 -1
  184. package/templates/_base/src/lib/volute-server.ts +30 -1
  185. package/templates/claude/.init/.config/routes.json +3 -3
  186. package/templates/claude/.init/CLAUDE.md +1 -1
  187. package/templates/claude/{package.json.tmpl → package.json} +4 -4
  188. package/templates/claude/src/agent.ts +4 -1
  189. package/templates/claude/src/lib/hooks/reply-instructions.ts +26 -1
  190. package/templates/claude/volute-template.json +1 -3
  191. package/templates/codex/.init/.config/routes.json +3 -3
  192. package/templates/codex/.init/AGENTS.md +1 -1
  193. package/templates/codex/{package.json.tmpl → package.json} +4 -4
  194. package/templates/codex/src/agent.ts +11 -11
  195. package/templates/codex/src/lib/turn-context.ts +51 -0
  196. package/templates/codex/volute-template.json +1 -3
  197. package/templates/pi/.init/.config/routes.json +3 -3
  198. package/templates/pi/.init/MINDS.md +1 -1
  199. package/templates/pi/{package.json.tmpl → package.json} +6 -6
  200. package/templates/pi/src/agent.ts +9 -1
  201. package/templates/pi/src/lib/event-handler.ts +1 -1
  202. package/templates/pi/src/lib/reply-instructions-extension.ts +28 -1
  203. package/templates/pi/volute-template.json +1 -3
  204. package/dist/chunk-5T5YMX6S.js +0 -23
  205. package/dist/chunk-NJHN6IRB.js +0 -177
  206. package/dist/chunk-QQBOI3QA.js +0 -5345
  207. package/dist/chunk-XTEKINWG.js +0 -158
  208. package/dist/delivery-manager-RBXBPVWM.js +0 -36
  209. package/dist/echo-text-B6NZ5FGE.js +0 -36
  210. package/dist/message-delivery-ABPV76EA.js +0 -42
  211. package/dist/mind-service-42GDO4KH.js +0 -44
  212. package/dist/notices-N6BCGHFV.js +0 -25
  213. package/dist/scheduler-K7Y7Z7FQ.js +0 -34
  214. package/dist/sleep-manager-DSPXFHGX.js +0 -38
  215. package/dist/system-chat-M2XOBKEM.js +0 -40
  216. package/dist/variant-cleanup-P4MBNLJD.js +0 -33
  217. package/dist/web-assets/assets/index-BostMFoR.css +0 -1
  218. package/dist/web-assets/assets/index-CKlqUkyG.js +0 -92
  219. package/packages/extensions/notes/dist/ui/assets/index-D0-DgYyj.js +0 -67
  220. package/packages/extensions/pages/dist/ui/assets/index-DtzftuPA.js +0 -2
  221. package/packages/extensions/plan/dist/ui/assets/index-Cfzs-0G9.js +0 -67
  222. /package/templates/_base/home/.config/{config.json.tmpl → config.json} +0 -0
  223. /package/templates/codex/home/.config/{config.json.tmpl → config.json} +0 -0
  224. /package/templates/pi/home/.config/{config.json.tmpl → config.json} +0 -0
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-U54PJPTB.js";
7
7
  import "./chunk-QUSMYGNQ.js";
8
- import "./chunk-RSBL3FAD.js";
9
- import "./chunk-P4LHVRNE.js";
8
+ import "./chunk-H6X6CKDN.js";
9
+ import "./chunk-2RNMBXD2.js";
10
10
  import "./chunk-K3NQKI34.js";
11
11
  export {
12
12
  broadcast,
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ OAuthRefreshError,
3
4
  addCustomModel,
4
5
  aiComplete,
5
6
  aiCompleteUtility,
@@ -21,19 +22,21 @@ import {
21
22
  removeCustomModel,
22
23
  removeProviderConfig,
23
24
  resolveApiKey,
25
+ resolveOAuthCredentials,
26
+ resolveProviderKey,
24
27
  resolveTemplate,
25
28
  saveProviderConfig,
26
29
  setEnabledModels,
27
30
  setProviderRefreshHook,
28
31
  setUtilityModel,
29
32
  unqualifyModelId
30
- } from "./chunk-YIJGKHIS.js";
31
- import "./chunk-NJHN6IRB.js";
33
+ } from "./chunk-EGV6R6UF.js";
32
34
  import "./chunk-QUSMYGNQ.js";
33
- import "./chunk-RSBL3FAD.js";
34
- import "./chunk-P4LHVRNE.js";
35
+ import "./chunk-H6X6CKDN.js";
36
+ import "./chunk-2RNMBXD2.js";
35
37
  import "./chunk-K3NQKI34.js";
36
38
  export {
39
+ OAuthRefreshError,
37
40
  addCustomModel,
38
41
  aiComplete,
39
42
  aiCompleteUtility,
@@ -55,6 +58,8 @@ export {
55
58
  removeCustomModel,
56
59
  removeProviderConfig,
57
60
  resolveApiKey,
61
+ resolveOAuthCredentials,
62
+ resolveProviderKey,
58
63
  resolveTemplate,
59
64
  saveProviderConfig,
60
65
  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-FLIEXG2T.js";
9
+ import "./chunk-H6X6CKDN.js";
10
+ import "./chunk-2RNMBXD2.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-HKP6OAJP.js";
23
+ import "./chunk-U54PJPTB.js";
22
24
  import "./chunk-QUSMYGNQ.js";
23
- import "./chunk-RSBL3FAD.js";
24
- import "./chunk-P4LHVRNE.js";
25
+ import "./chunk-H6X6CKDN.js";
26
+ import "./chunk-2RNMBXD2.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-ICXY54ZC.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-H6X6CKDN.js";
14
+ import "./chunk-2RNMBXD2.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-5N32EN4O.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-EDR47UE2.js";
26
27
  import {
27
28
  getServiceMode,
28
29
  modeLabel,
29
30
  stopService
30
- } from "./chunk-HCYQRME2.js";
31
+ } from "./chunk-6NLW72HP.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-M77B73VV.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-H6X6CKDN.js";
45
+ import "./chunk-2RNMBXD2.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-TRC2HJXR.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-2YKOZJJ5.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-UQGIW7OF.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-RJ5NAW5J.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-BRY5RRIM.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."
@@ -7,6 +7,7 @@ import {
7
7
  var schema_exports = {};
8
8
  __export(schema_exports, {
9
9
  activity: () => activity,
10
+ apiTokens: () => apiTokens,
10
11
  channelGates: () => channelGates,
11
12
  channels: () => channels,
12
13
  conversationParticipants: () => conversationParticipants,
@@ -15,11 +16,11 @@ __export(schema_exports, {
15
16
  deliveryQueue: () => deliveryQueue,
16
17
  messages: () => messages,
17
18
  mindHistory: () => mindHistory,
18
- mindNotices: () => mindNotices,
19
19
  minds: () => minds,
20
20
  sessions: () => sessions,
21
21
  sharedSkills: () => sharedSkills,
22
22
  summaries: () => summaries,
23
+ systemEvents: () => systemEvents,
23
24
  systemPrompts: () => systemPrompts,
24
25
  turns: () => turns,
25
26
  users: () => users
@@ -60,12 +61,26 @@ var users = sqliteTable("users", {
60
61
  username: text("username").unique().notNull(),
61
62
  password_hash: text("password_hash").notNull(),
62
63
  role: text("role").notNull().default("pending"),
63
- user_type: text("user_type").notNull().default("brain"),
64
+ user_type: text("user_type").notNull().default("human"),
64
65
  display_name: text("display_name"),
65
66
  description: text("description"),
66
67
  avatar: text("avatar"),
67
68
  created_at: text("created_at").notNull().default(sql`(datetime('now'))`)
68
69
  });
70
+ var apiTokens = sqliteTable(
71
+ "api_tokens",
72
+ {
73
+ id: integer("id").primaryKey({ autoIncrement: true }),
74
+ user_id: integer("user_id").notNull().references(() => users.id, { onDelete: "cascade" }),
75
+ token_hash: text("token_hash").notNull(),
76
+ label: text("label"),
77
+ created_at: text("created_at").notNull().default(sql`(datetime('now'))`)
78
+ },
79
+ (table) => [
80
+ uniqueIndex("idx_api_tokens_hash").on(table.token_hash),
81
+ index("idx_api_tokens_user").on(table.user_id)
82
+ ]
83
+ );
69
84
  var conversations = sqliteTable(
70
85
  "conversations",
71
86
  {
@@ -86,7 +101,7 @@ var turns = sqliteTable(
86
101
  {
87
102
  id: text("id").primaryKey(),
88
103
  mind: text("mind").notNull(),
89
- session: text("session"),
104
+ thread: text("thread"),
90
105
  trigger_event_id: integer("trigger_event_id"),
91
106
  summary_id: integer("summary_id"),
92
107
  status: text("status").notNull().default("active"),
@@ -104,7 +119,7 @@ var mindHistory = sqliteTable(
104
119
  id: integer("id").primaryKey({ autoIncrement: true }),
105
120
  mind: text("mind").notNull(),
106
121
  channel: text("channel"),
107
- session: text("session"),
122
+ thread: text("thread"),
108
123
  sender: text("sender"),
109
124
  message_id: text("message_id"),
110
125
  type: text("type").notNull(),
@@ -118,7 +133,7 @@ var mindHistory = sqliteTable(
118
133
  index("idx_mind_history_mind_channel").on(table.mind, table.channel),
119
134
  index("idx_mind_history_mind_type").on(table.mind, table.type),
120
135
  index("idx_mind_history_turn_id").on(table.turn_id),
121
- index("idx_mind_history_session").on(table.session),
136
+ index("idx_mind_history_thread").on(table.thread),
122
137
  index("idx_mind_history_mind_created_at").on(table.mind, table.created_at)
123
138
  ]
124
139
  );
@@ -165,7 +180,7 @@ var deliveryQueue = sqliteTable(
165
180
  // redrive so a variant's stranded message is re-delivered to the variant, not the
166
181
  // parent. Null on legacy rows → callers fall back to `mind`.
167
182
  target_mind: text("target_mind"),
168
- session: text("session").notNull(),
183
+ thread: text("thread").notNull(),
169
184
  channel: text("channel"),
170
185
  sender: text("sender"),
171
186
  status: text("status").notNull().default("pending"),
@@ -177,7 +192,7 @@ var deliveryQueue = sqliteTable(
177
192
  created_at: text("created_at").notNull().default(sql`(datetime('now'))`)
178
193
  },
179
194
  (table) => [
180
- index("idx_delivery_queue_mind_session").on(table.mind, table.session),
195
+ index("idx_delivery_queue_mind_thread").on(table.mind, table.thread),
181
196
  index("idx_delivery_queue_mind_status").on(table.mind, table.status),
182
197
  index("idx_delivery_queue_status").on(table.status),
183
198
  index("idx_delivery_queue_status_next").on(table.status, table.next_attempt_at)
@@ -261,21 +276,29 @@ var messages = sqliteTable(
261
276
  index("idx_messages_turn_id").on(table.turn_id)
262
277
  ]
263
278
  );
264
- var mindNotices = sqliteTable(
265
- "mind_notices",
279
+ var systemEvents = sqliteTable(
280
+ "system_events",
266
281
  {
267
282
  id: integer("id").primaryKey({ autoIncrement: true }),
268
283
  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'))`)
284
+ type: text("type").notNull(),
285
+ body: text("body").notNull(),
286
+ // JSON: schedule id, sleep duration, variant name, lifecycle subtype, webhook source,
287
+ // notice subtype/reason, etc.
288
+ meta: text("meta"),
289
+ delivery: text("delivery").$type().notNull().default("immediate"),
290
+ // Routing thread (default "main"). Next-turn notices tied to no thread use the
291
+ // sentinel thread = "" so any thread's drain picks them up.
292
+ thread: text("thread").notNull().default("main"),
293
+ created_at: text("created_at").notNull().default(sql`(datetime('now'))`),
294
+ delivered_at: text("delivered_at"),
295
+ reflection: text("reflection")
277
296
  },
278
- (table) => [index("idx_mind_notices_mind_session").on(table.mind, table.session)]
297
+ (table) => [
298
+ index("idx_system_events_mind").on(table.mind),
299
+ index("idx_system_events_mind_delivery").on(table.mind, table.delivery, table.delivered_at),
300
+ index("idx_system_events_mind_type").on(table.mind, table.type)
301
+ ]
279
302
  );
280
303
  var channelGates = sqliteTable(
281
304
  "channel_gates",
@@ -291,6 +314,7 @@ var channelGates = sqliteTable(
291
314
  export {
292
315
  minds,
293
316
  users,
317
+ apiTokens,
294
318
  conversations,
295
319
  turns,
296
320
  mindHistory,
@@ -304,7 +328,7 @@ export {
304
328
  conversationReads,
305
329
  channels,
306
330
  messages,
307
- mindNotices,
331
+ systemEvents,
308
332
  channelGates,
309
333
  schema_exports
310
334
  };
@@ -8,10 +8,10 @@ import {
8
8
  pollHealthDown,
9
9
  readDaemonConfig,
10
10
  stopService
11
- } from "./chunk-HCYQRME2.js";
11
+ } from "./chunk-6NLW72HP.js";
12
12
  import {
13
13
  voluteSystemDir
14
- } from "./chunk-RSBL3FAD.js";
14
+ } from "./chunk-H6X6CKDN.js";
15
15
 
16
16
  // src/commands/down.ts
17
17
  import { existsSync, readFileSync, unlinkSync } from "fs";
@@ -1,13 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- readGlobalConfig
4
- } from "./chunk-NJHN6IRB.js";
5
2
  import {
6
3
  logger_default
7
4
  } from "./chunk-QUSMYGNQ.js";
5
+ import {
6
+ readGlobalConfig
7
+ } from "./chunk-H6X6CKDN.js";
8
8
 
9
9
  // packages/daemon/src/lib/mind/sandbox.ts
10
10
  import { execFileSync } from "child_process";
11
+ import { existsSync, realpathSync } from "fs";
12
+ import { dirname, resolve } from "path";
11
13
  var slog = logger_default.child("sandbox");
12
14
  var sandboxManager = null;
13
15
  var SandboxUnavailableError = class extends Error {
@@ -69,6 +71,7 @@ async function initSandbox() {
69
71
  allowWrite: [],
70
72
  denyWrite: []
71
73
  },
74
+ network: {},
72
75
  ...ripgrepConfig ? { ripgrep: ripgrepConfig } : {}
73
76
  };
74
77
  await SandboxManager.initialize(config);
@@ -94,10 +97,32 @@ async function initSandbox() {
94
97
  throw new SandboxUnavailableError("sandbox runtime not available", err);
95
98
  }
96
99
  }
100
+ function voluteCliPaths(env = process.env) {
101
+ for (const dir of (env.PATH ?? "").split(":")) {
102
+ if (!dir || dir.endsWith("/.local/bin")) continue;
103
+ const shim = resolve(dir, "volute");
104
+ if (!existsSync(shim)) continue;
105
+ const paths = [shim, resolve(dirname(process.execPath), "..")];
106
+ let target;
107
+ try {
108
+ target = realpathSync(shim);
109
+ } catch {
110
+ return paths;
111
+ }
112
+ for (let dir2 = dirname(target); dir2 !== dirname(dir2); dir2 = dirname(dir2)) {
113
+ if (existsSync(resolve(dir2, "package.json"))) {
114
+ paths.push(dir2);
115
+ break;
116
+ }
117
+ }
118
+ return paths;
119
+ }
120
+ return [];
121
+ }
97
122
  async function buildSandboxReadConfig(_mindName, mindDir) {
98
123
  const userHome = process.env.HOME || "";
99
124
  const denyRead = [];
100
- const allowRead = [mindDir];
125
+ const allowRead = [mindDir, ...voluteCliPaths()];
101
126
  if (userHome) {
102
127
  denyRead.push(userHome);
103
128
  } else {
@@ -114,6 +139,9 @@ async function buildSandboxReadConfig(_mindName, mindDir) {
114
139
  function shellEscape(s) {
115
140
  return `'${s.replace(/'/g, "'\\''")}'`;
116
141
  }
142
+ function shellTempWritePaths() {
143
+ return process.platform === "darwin" ? ["/private/tmp", "/private/var/tmp"] : [];
144
+ }
117
145
  async function wrapForSandbox(cmd, args, mindDir, mindName, allowWrite) {
118
146
  if (!sandboxManager) {
119
147
  if (isSandboxEnabled() && !isSandboxOptional()) {
@@ -126,7 +154,7 @@ async function wrapForSandbox(cmd, args, mindDir, mindName, allowWrite) {
126
154
  filesystem: {
127
155
  denyRead,
128
156
  allowRead,
129
- allowWrite: allowWrite ?? [mindDir],
157
+ allowWrite: [...allowWrite ?? [mindDir], ...shellTempWritePaths()],
130
158
  denyWrite: []
131
159
  }
132
160
  };
@@ -151,7 +179,9 @@ export {
151
179
  isSandboxEnabled,
152
180
  isSandboxOptional,
153
181
  initSandbox,
182
+ voluteCliPaths,
154
183
  buildSandboxReadConfig,
155
184
  shellEscape,
185
+ shellTempWritePaths,
156
186
  wrapForSandbox
157
187
  };
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  exec,
4
4
  execInherit
5
- } from "./chunk-DVN6DNMI.js";
5
+ } from "./chunk-M77B73VV.js";
6
6
  import {
7
7
  voluteSystemDir
8
- } from "./chunk-RSBL3FAD.js";
8
+ } from "./chunk-H6X6CKDN.js";
9
9
 
10
10
  // packages/daemon/src/lib/config/service-mode.ts
11
11
  import { execFileSync } from "child_process";