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,17 +1,19 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  broadcast
4
- } from "./chunk-LTLFOSA4.js";
4
+ } from "./chunk-3BAFMGCJ.js";
5
5
  import {
6
- getDb
7
- } from "./chunk-WW6C3PLV.js";
6
+ getDb,
7
+ getSpiritName,
8
+ isSpiritName
9
+ } from "./chunk-CAIYV33P.js";
8
10
  import {
9
11
  users
10
- } from "./chunk-2MJ7EOMT.js";
12
+ } from "./chunk-5IIVOWSP.js";
11
13
 
12
14
  // packages/daemon/src/lib/auth.ts
13
15
  import { compareSync, hashSync } from "bcryptjs";
14
- import { and, count, eq, or } from "drizzle-orm";
16
+ import { and, count, eq, inArray, or } from "drizzle-orm";
15
17
  var userSelectFields = {
16
18
  id: users.id,
17
19
  username: users.username,
@@ -25,7 +27,7 @@ var userSelectFields = {
25
27
  async function createUser(username, password) {
26
28
  const db = await getDb();
27
29
  const hash = hashSync(password, 10);
28
- const [{ value }] = await db.select({ value: count() }).from(users).where(eq(users.user_type, "brain"));
30
+ const [{ value }] = await db.select({ value: count() }).from(users).where(eq(users.user_type, "human"));
29
31
  const role = value === 0 ? "admin" : "pending";
30
32
  const [result] = await db.insert(users).values({ username, password_hash: hash, role }).returning(userSelectFields);
31
33
  return result;
@@ -44,6 +46,24 @@ async function getUser(id) {
44
46
  const row = await db.select(userSelectFields).from(users).where(eq(users.id, id)).get();
45
47
  return row ?? null;
46
48
  }
49
+ async function getDisplayNames(usernames) {
50
+ const unique = [...new Set(usernames.filter((u) => !!u))];
51
+ const map = /* @__PURE__ */ new Map();
52
+ if (unique.length === 0) return map;
53
+ const db = await getDb();
54
+ const rows = await db.select({ username: users.username, displayName: users.display_name }).from(users).where(inArray(users.username, unique));
55
+ for (const r of rows) {
56
+ if (r.displayName) map.set(r.username, r.displayName);
57
+ }
58
+ return map;
59
+ }
60
+ async function withSenderDisplayNames(msgs) {
61
+ const displayNames = await getDisplayNames(msgs.map((m) => m.sender_name));
62
+ return msgs.map((m) => ({
63
+ ...m,
64
+ sender_display_name: m.sender_name ? displayNames.get(m.sender_name) ?? null : null
65
+ }));
66
+ }
47
67
  async function getUserByUsername(username) {
48
68
  const db = await getDb();
49
69
  const row = await db.select(userSelectFields).from(users).where(eq(users.username, username)).get();
@@ -62,6 +82,7 @@ async function listUsersByType(userType) {
62
82
  return db.select(userSelectFields).from(users).where(eq(users.user_type, userType)).orderBy(users.created_at).all();
63
83
  }
64
84
  async function getOrCreateMindUser(mindName) {
85
+ if (isSpiritName(mindName)) return getOrCreateSystemUser();
65
86
  const db = await getDb();
66
87
  const existing = await db.select(userSelectFields).from(users).where(
67
88
  and(
@@ -91,20 +112,27 @@ async function getOrCreateMindUser(mindName) {
91
112
  }
92
113
  async function getOrCreateSystemUser() {
93
114
  const db = await getDb();
94
- const existing = await db.select(userSelectFields).from(users).where(and(eq(users.username, "volute"), eq(users.user_type, "system"))).get();
95
- if (existing) return existing;
115
+ const spiritName = getSpiritName();
116
+ const existing = await db.select(userSelectFields).from(users).where(eq(users.user_type, "system")).get();
117
+ if (existing) {
118
+ if (existing.username !== spiritName) {
119
+ const [renamed] = await db.update(users).set({ username: spiritName, display_name: spiritName }).where(eq(users.id, existing.id)).returning(userSelectFields);
120
+ return renamed;
121
+ }
122
+ return existing;
123
+ }
96
124
  try {
97
125
  const [result] = await db.insert(users).values({
98
- username: "volute",
126
+ username: spiritName,
99
127
  password_hash: "!system",
100
128
  role: "system",
101
129
  user_type: "system",
102
- display_name: "volute"
130
+ display_name: spiritName
103
131
  }).returning(userSelectFields);
104
132
  return result;
105
133
  } catch (err) {
106
134
  if (err instanceof Error && err.message.includes("UNIQUE constraint")) {
107
- const retried = await db.select(userSelectFields).from(users).where(and(eq(users.username, "volute"), eq(users.user_type, "system"))).get();
135
+ const retried = await db.select(userSelectFields).from(users).where(eq(users.user_type, "system")).get();
108
136
  if (retried) return retried;
109
137
  }
110
138
  throw err;
@@ -140,9 +168,9 @@ async function setUserRole(id, role) {
140
168
  }
141
169
  async function deleteUser(id) {
142
170
  const db = await getDb();
143
- const target = await db.select({ id: users.id }).from(users).where(and(eq(users.id, id), eq(users.user_type, "brain"))).get();
171
+ const target = await db.select({ id: users.id }).from(users).where(and(eq(users.id, id), eq(users.user_type, "human"))).get();
144
172
  if (!target) throw new Error("User not found");
145
- await db.delete(users).where(and(eq(users.id, id), eq(users.user_type, "brain")));
173
+ await db.delete(users).where(and(eq(users.id, id), eq(users.user_type, "human")));
146
174
  }
147
175
  async function updateUserProfile(userId, profile) {
148
176
  const db = await getDb();
@@ -168,6 +196,8 @@ export {
168
196
  createUser,
169
197
  verifyUser,
170
198
  getUser,
199
+ getDisplayNames,
200
+ withSenderDisplayNames,
171
201
  getUserByUsername,
172
202
  listUsers,
173
203
  listPendingUsers,
@@ -1,19 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  exec
4
- } from "./chunk-DGGZVZTM.js";
5
- import {
6
- readGlobalConfig
7
- } from "./chunk-5KXCM5AW.js";
4
+ } from "./chunk-AJWFDIEY.js";
8
5
  import {
9
6
  logger_default
10
- } from "./chunk-T2TP6ZC6.js";
7
+ } from "./chunk-QUSMYGNQ.js";
11
8
  import {
12
9
  getDb,
13
10
  readAllMinds,
11
+ readGlobalConfig,
14
12
  voluteHome,
15
13
  voluteSystemDir
16
- } from "./chunk-WW6C3PLV.js";
14
+ } from "./chunk-CAIYV33P.js";
17
15
 
18
16
  // packages/daemon/src/lib/backup/restic.ts
19
17
  import { writeFileSync } from "fs";
@@ -7,12 +7,12 @@ import {
7
7
  } from "./chunk-WCFSBH33.js";
8
8
  import {
9
9
  logger_default
10
- } from "./chunk-T2TP6ZC6.js";
10
+ } from "./chunk-QUSMYGNQ.js";
11
11
  import {
12
12
  mindDir,
13
13
  readAllMinds,
14
14
  voluteHome
15
- } from "./chunk-WW6C3PLV.js";
15
+ } from "./chunk-CAIYV33P.js";
16
16
 
17
17
  // packages/daemon/src/lib/util/avatar-image.ts
18
18
  import { readdir, readFile, writeFile } from "fs/promises";
@@ -8,14 +8,12 @@ import {
8
8
  modeLabel,
9
9
  pollHealth,
10
10
  startService
11
- } from "./chunk-FJ2MZ5PH.js";
12
- import {
13
- readGlobalConfig
14
- } from "./chunk-5KXCM5AW.js";
11
+ } from "./chunk-5FVANDON.js";
15
12
  import {
13
+ readGlobalConfig,
16
14
  voluteHome,
17
15
  voluteSystemDir
18
- } from "./chunk-WW6C3PLV.js";
16
+ } from "./chunk-CAIYV33P.js";
19
17
 
20
18
  // src/commands/up.ts
21
19
  import { spawn } from "child_process";
@@ -1,13 +1,15 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- readGlobalConfig
4
- } from "./chunk-5KXCM5AW.js";
5
2
  import {
6
3
  logger_default
7
- } from "./chunk-T2TP6ZC6.js";
4
+ } from "./chunk-QUSMYGNQ.js";
5
+ import {
6
+ readGlobalConfig
7
+ } from "./chunk-CAIYV33P.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
  };
package/dist/cli.js CHANGED
@@ -10,7 +10,7 @@ if (!process.env.VOLUTE_HOME) {
10
10
  var command = process.argv[2];
11
11
  var args = process.argv.slice(3);
12
12
  if (command === "--version" || command === "-v") {
13
- const { default: pkg } = await import("./package-RTN2PS7O.js");
13
+ const { default: pkg } = await import("./package-XYSV7NUT.js");
14
14
  console.log(pkg.version);
15
15
  process.exit(0);
16
16
  }
@@ -32,8 +32,9 @@ var ungatedCommands = /* @__PURE__ */ new Set([
32
32
  "service",
33
33
  void 0
34
34
  ]);
35
- if (!ungatedCommands.has(command)) {
36
- const { setupStatus, setupUrl } = await import("./setup-5ECWTYKG.js");
35
+ var isMind = !!process.env.VOLUTE_MIND_TOKEN;
36
+ if (!isMind && !ungatedCommands.has(command)) {
37
+ const { setupStatus, setupUrl } = await import("./setup-CAJFOR2N.js");
37
38
  const status = setupStatus();
38
39
  if (status !== "complete") {
39
40
  if (status === "in-progress") {
@@ -41,72 +42,78 @@ if (!ungatedCommands.has(command)) {
41
42
  console.error(`Open ${setupUrl()} in your browser to complete it.`);
42
43
  console.error("(If the daemon isn't running, start it with `volute up` first.)");
43
44
  } else {
44
- console.error("Volute is not set up. Run `volute setup` to get started.");
45
- console.error("It starts the daemon and opens a browser wizard to finish configuration.");
45
+ const { detectSystemInstallHint } = await import("./system-install-YZSWCPDK.js");
46
+ const hint = detectSystemInstallHint();
47
+ if (hint) {
48
+ console.error(hint);
49
+ } else {
50
+ console.error("Volute is not set up. Run `volute setup` to get started.");
51
+ console.error("It starts the daemon and opens a browser wizard to finish configuration.");
52
+ }
46
53
  }
47
54
  process.exit(1);
48
55
  }
49
56
  }
50
57
  switch (command) {
51
58
  case "setup":
52
- await import("./setup-AE4CVUC4.js").then((m) => m.run(args));
59
+ await import("./setup-JGYAXXW7.js").then((m) => m.run(args));
53
60
  break;
54
61
  case "mind":
55
- await import("./mind-46AOK373.js").then((m) => m.run(args));
62
+ await import("./mind-NYRALSV2.js").then((m) => m.run(args));
56
63
  break;
57
64
  case "seed":
58
- await import("./seed-cmd-MLCTGSX5.js").then((m) => m.run(args));
65
+ await import("./seed-cmd-U73XVQMI.js").then((m) => m.run(args));
59
66
  break;
60
67
  case "chat":
61
- await import("./chat-X43VYHH2.js").then((m) => m.run(args));
68
+ await import("./chat-W5K6HCBE.js").then((m) => m.run(args));
62
69
  break;
63
70
  case "variant":
64
71
  await import("./variant-HHDTW74J.js").then((m) => m.run(args));
65
72
  break;
66
73
  case "clock":
67
- await import("./clock-CNRF6F7T.js").then((m) => m.run(args));
74
+ await import("./clock-LH7UFNLJ.js").then((m) => m.run(args));
68
75
  break;
69
76
  case "skill":
70
- await import("./skill-UUM4JZRF.js").then((m) => m.run(args));
77
+ await import("./skill-NXIHDQCG.js").then((m) => m.run(args));
71
78
  break;
72
79
  case "env":
73
- await import("./env-C7Z55QCJ.js").then((m) => m.run(args));
80
+ await import("./env-ABM5IMA7.js").then((m) => m.run(args));
74
81
  break;
75
82
  case "config":
76
- await import("./config-RPSLA2HX.js").then((m) => m.run(args));
83
+ await import("./config-UGJS57VT.js").then((m) => m.run(args));
77
84
  break;
78
85
  case "up":
79
- await import("./up-RVGDE6CQ.js").then((m) => m.run(args));
86
+ await import("./up-CLL4665A.js").then((m) => m.run(args));
80
87
  break;
81
88
  case "backup":
82
- await import("./backup-UDH4GMSW.js").then((m) => m.run(args));
89
+ await import("./backup-IE6PMXJO.js").then((m) => m.run(args));
83
90
  break;
84
91
  case "down":
85
- await import("./down-G6IADJXV.js").then((m) => m.run(args));
92
+ await import("./down-D4IRNEMJ.js").then((m) => m.run(args));
86
93
  break;
87
94
  case "restart":
88
- await import("./daemon-restart-7KUHVZIN.js").then((m) => m.run(args));
95
+ await import("./daemon-restart-2AAGYFHE.js").then((m) => m.run(args));
89
96
  break;
90
97
  case "update":
91
- await import("./update-OXQEGGXD.js").then((m) => m.run(args));
98
+ await import("./update-HVAUCQPN.js").then((m) => m.run(args));
92
99
  break;
93
100
  case "status":
94
- await import("./status-F4PGREUU.js").then((m) => m.run(args));
101
+ await import("./status-IL67CYM4.js").then((m) => m.run(args));
95
102
  break;
96
103
  case "extension":
97
- await import("./extension-J4ZQ2GHV.js").then((m) => m.run(args));
104
+ await import("./extension-MRYJWSMV.js").then((m) => m.run(args));
98
105
  break;
99
106
  case "systems":
100
- await import("./systems-JJNGQHAO.js").then((m) => m.run(args));
107
+ await import("./systems-VDRUZXNF.js").then((m) => m.run(args));
101
108
  break;
102
109
  case "login":
103
- await import("./login-CL4IT2ED.js").then((m) => m.run(args));
110
+ await import("./login-MOXVLULE.js").then((m) => m.run(args));
104
111
  break;
105
112
  case "logout":
106
- await import("./logout-HZYJCYCA.js").then((m) => m.run(args));
113
+ await import("./logout-DWD3OQVT.js").then((m) => m.run(args));
107
114
  break;
108
115
  case "service":
109
- await import("./service-CVZMQYK6.js").then((m) => m.run(args));
116
+ await import("./service-XMXAXGJD.js").then((m) => m.run(args));
110
117
  break;
111
118
  case "--help":
112
119
  case "-h":
@@ -148,7 +155,7 @@ System:
148
155
  update Update volute
149
156
  systems register/login/logout volute.systems account`);
150
157
  try {
151
- const { resolveDaemonUrl, getAuthToken } = await import("./daemon-client-ZFY5MOAL.js");
158
+ const { resolveDaemonUrl, getAuthToken } = await import("./daemon-client-VVYFZI2D.js");
152
159
  const token = getAuthToken();
153
160
  const headers = {};
154
161
  if (token) headers.Authorization = `Bearer ${token}`;
@@ -189,7 +196,7 @@ use --mind <name> or VOLUTE_MIND env var to identify the mind.`);
189
196
  default: {
190
197
  let isExtensionCommand = false;
191
198
  try {
192
- const { daemonFetch } = await import("./daemon-client-ZFY5MOAL.js");
199
+ const { daemonFetch } = await import("./daemon-client-VVYFZI2D.js");
193
200
  const res = await daemonFetch("/api/extensions/commands");
194
201
  if (res.ok) {
195
202
  const extCommands = await res.json();
@@ -303,7 +310,7 @@ Run 'volute --help' for usage.`);
303
310
  }
304
311
  }
305
312
  if (command !== "update") {
306
- import("./update-check-266R4ZSY.js").then((m) => m.checkForUpdate()).then((result) => {
313
+ import("./update-check-2MGBBAFF.js").then((m) => m.checkForUpdate()).then((result) => {
307
314
  if (result.updateAvailable) {
308
315
  console.error(`
309
316
  Update available: ${result.current} \u2192 ${result.latest}`);
@@ -2,13 +2,14 @@
2
2
  import {
3
3
  parseDuration,
4
4
  run
5
- } from "./chunk-WARH6GIV.js";
6
- import "./chunk-5T5YMX6S.js";
7
- import "./chunk-LOPXTW6H.js";
5
+ } from "./chunk-74T3CEXK.js";
6
+ import "./chunk-PW65BXY5.js";
8
7
  import "./chunk-BTY4WNFE.js";
9
- import "./chunk-BCG45AQB.js";
8
+ import "./chunk-M74I3HHF.js";
9
+ import "./chunk-LOPXTW6H.js";
10
10
  import "./chunk-TXSA4Q3V.js";
11
11
  import "./chunk-O7IGP7ZW.js";
12
+ import "./chunk-FNJCBRD3.js";
12
13
  import "./chunk-K3NQKI34.js";
13
14
  export {
14
15
  parseDuration,
@@ -1,34 +1,37 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  deliverMessage
4
- } from "./chunk-VB2QXUJQ.js";
5
- import "./chunk-HNGFKPNS.js";
4
+ } from "./chunk-EQKSRVDE.js";
5
+ import "./chunk-SFRYRW37.js";
6
6
  import "./chunk-RRZ4RQQU.js";
7
- import "./chunk-USD45JKR.js";
8
- import "./chunk-MOERAQXH.js";
9
- import "./chunk-HUNDXZBZ.js";
10
- import "./chunk-ODDGGLM6.js";
7
+ import "./chunk-7FDWPQCU.js";
8
+ import "./chunk-JI67D7O2.js";
9
+ import "./chunk-ALIVXDM4.js";
10
+ import "./chunk-6BM2I736.js";
11
+ import "./chunk-7DXLIYPY.js";
12
+ import "./chunk-TGJHGVBZ.js";
13
+ import "./chunk-UC6BNMGT.js";
14
+ import "./chunk-7OZWKHA3.js";
15
+ import "./chunk-LNNI3MS4.js";
16
+ import "./chunk-5TPC4KCV.js";
17
+ import "./chunk-ZUG76D3P.js";
11
18
  import {
12
19
  getAuthHeaders,
13
20
  getWebhookUrl
14
- } from "./chunk-HPGN6XRT.js";
15
- import "./chunk-VZRA5TYO.js";
16
- import "./chunk-IYCV34IU.js";
17
- import "./chunk-MTRMQFCQ.js";
18
- import "./chunk-WQ46E33M.js";
21
+ } from "./chunk-574M6I7F.js";
22
+ import "./chunk-E5S3ILVA.js";
23
+ import "./chunk-3BAFMGCJ.js";
24
+ import "./chunk-X67VT4QO.js";
19
25
  import "./chunk-DW4TRDOZ.js";
20
26
  import "./chunk-WCFSBH33.js";
21
- import "./chunk-EIQDZC43.js";
22
- import "./chunk-DGGZVZTM.js";
23
- import "./chunk-IJPMIEVE.js";
24
- import "./chunk-YNBXEQAP.js";
25
- import "./chunk-5KXCM5AW.js";
26
- import "./chunk-LTLFOSA4.js";
27
+ import "./chunk-AJWFDIEY.js";
28
+ import "./chunk-7UWXAJMK.js";
29
+ import "./chunk-632FJ23O.js";
27
30
  import {
28
31
  logger_default
29
- } from "./chunk-T2TP6ZC6.js";
30
- import "./chunk-WW6C3PLV.js";
31
- import "./chunk-2MJ7EOMT.js";
32
+ } from "./chunk-QUSMYGNQ.js";
33
+ import "./chunk-CAIYV33P.js";
34
+ import "./chunk-5IIVOWSP.js";
32
35
  import "./chunk-K3NQKI34.js";
33
36
 
34
37
  // packages/daemon/src/lib/cloud-sync.ts
@@ -7,7 +7,7 @@ import "./chunk-K3NQKI34.js";
7
7
 
8
8
  // packages/cli/src/commands/config.ts
9
9
  async function listModels() {
10
- const { daemonFetch } = await import("./daemon-client-ZFY5MOAL.js");
10
+ const { daemonFetch } = await import("./daemon-client-VVYFZI2D.js");
11
11
  const res = await daemonFetch("/api/config/models");
12
12
  if (!res.ok) {
13
13
  console.error(`Failed to fetch models (HTTP ${res.status})`);
@@ -24,7 +24,7 @@ async function listModels() {
24
24
  }
25
25
  }
26
26
  async function listProviders() {
27
- const { daemonFetch } = await import("./daemon-client-ZFY5MOAL.js");
27
+ const { daemonFetch } = await import("./daemon-client-VVYFZI2D.js");
28
28
  const res = await daemonFetch("/api/config/providers");
29
29
  if (!res.ok) {
30
30
  console.error(`Failed to fetch providers (HTTP ${res.status})`);
@@ -41,7 +41,7 @@ async function listProviders() {
41
41
  }
42
42
  }
43
43
  async function showStatus() {
44
- const { daemonFetch } = await import("./daemon-client-ZFY5MOAL.js");
44
+ const { daemonFetch } = await import("./daemon-client-VVYFZI2D.js");
45
45
  const res = await daemonFetch("/api/config/status");
46
46
  if (!res.ok) {
47
47
  console.error(`Failed to fetch config (HTTP ${res.status})`);
@@ -12,6 +12,8 @@ import {
12
12
  getChannelName,
13
13
  getChannelSettings,
14
14
  getConversation,
15
+ getConversationWithParticipants,
16
+ getLastMessageBySender,
15
17
  getMessages,
16
18
  getMessagesPaginated,
17
19
  getParticipants,
@@ -29,11 +31,11 @@ import {
29
31
  removeParticipant,
30
32
  setConversationPrivate,
31
33
  updateChannelSettings
32
- } from "./chunk-HPGN6XRT.js";
33
- import "./chunk-LTLFOSA4.js";
34
- import "./chunk-T2TP6ZC6.js";
35
- import "./chunk-WW6C3PLV.js";
36
- import "./chunk-2MJ7EOMT.js";
34
+ } from "./chunk-574M6I7F.js";
35
+ import "./chunk-3BAFMGCJ.js";
36
+ import "./chunk-QUSMYGNQ.js";
37
+ import "./chunk-CAIYV33P.js";
38
+ import "./chunk-5IIVOWSP.js";
37
39
  import "./chunk-K3NQKI34.js";
38
40
  export {
39
41
  addMessage,
@@ -48,6 +50,8 @@ export {
48
50
  getChannelName,
49
51
  getChannelSettings,
50
52
  getConversation,
53
+ getConversationWithParticipants,
54
+ getLastMessageBySender,
51
55
  getMessages,
52
56
  getMessagesPaginated,
53
57
  getParticipants,
@@ -21,11 +21,11 @@ var cmd = command({
21
21
  const name = args.name;
22
22
  let template = flags.template;
23
23
  if (!template) {
24
- const { resolveTemplate } = await import("./ai-service-643TNFPH.js");
24
+ const { resolveTemplate } = await import("./ai-service-V4CTNGI3.js");
25
25
  template = await resolveTemplate();
26
26
  }
27
27
  const skills = flags.skills === "none" ? [] : flags.skills ? flags.skills.split(",") : void 0;
28
- const { daemonFetch } = await import("./daemon-client-ZFY5MOAL.js");
28
+ const { daemonFetch } = await import("./daemon-client-VVYFZI2D.js");
29
29
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
30
30
  const client = getClient();
31
31
  const res = await daemonFetch(urlOf(client.api.minds.$url()), {
@@ -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/create.ts
@@ -6,7 +6,8 @@ import {
6
6
  readSessionFile,
7
7
  resolveDaemonUrl,
8
8
  resolveWebUrl
9
- } from "./chunk-BCG45AQB.js";
9
+ } from "./chunk-M74I3HHF.js";
10
+ import "./chunk-FNJCBRD3.js";
10
11
  import "./chunk-K3NQKI34.js";
11
12
  export {
12
13
  daemonDispatcher,
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  stopDaemon
4
- } from "./chunk-PJVPDY2Z.js";
4
+ } from "./chunk-U3EJJ7JN.js";
5
5
  import {
6
6
  run
7
- } from "./chunk-MJRXFUMS.js";
7
+ } from "./chunk-YQOYZ6G7.js";
8
8
  import {
9
9
  command
10
10
  } from "./chunk-TXSA4Q3V.js";
@@ -15,11 +15,10 @@ import {
15
15
  pollHealth,
16
16
  readDaemonConfig,
17
17
  restartService
18
- } from "./chunk-FJ2MZ5PH.js";
19
- import "./chunk-DGGZVZTM.js";
20
- import "./chunk-5KXCM5AW.js";
21
- import "./chunk-WW6C3PLV.js";
22
- import "./chunk-2MJ7EOMT.js";
18
+ } from "./chunk-5FVANDON.js";
19
+ import "./chunk-AJWFDIEY.js";
20
+ import "./chunk-CAIYV33P.js";
21
+ import "./chunk-5IIVOWSP.js";
23
22
  import "./chunk-K3NQKI34.js";
24
23
 
25
24
  // src/commands/daemon-restart.ts