volute 0.46.0 → 0.48.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 (172) hide show
  1. package/README.md +10 -10
  2. package/dist/{accept-N5XULCXK.js → accept-KYNC5X3U.js} +1 -1
  3. package/dist/{activity-events-NF6VWTJQ.js → activity-events-MIOK3IOU.js} +3 -3
  4. package/dist/{ai-service-UODCCE4O.js → ai-service-643TNFPH.js} +8 -4
  5. package/dist/{archive-WS2L2VIQ.js → archive-6Z4GFQPH.js} +3 -3
  6. package/dist/{auth-CCFAU4GQ.js → auth-A4VGHADI.js} +4 -4
  7. package/dist/avatar-image-Y45R7LW5.js +23 -0
  8. package/dist/{backup-TST5C2YN.js → backup-UDH4GMSW.js} +15 -15
  9. package/dist/{bridge-2PO3AI5D.js → bridge-3FNSWLNQ.js} +1 -1
  10. package/dist/channels-SGQZHNQJ.js +89 -0
  11. package/dist/{chat-ZIQQS25U.js → chat-X43VYHH2.js} +12 -8
  12. package/dist/{chunk-ZV7MFISX.js → chunk-2MJ7EOMT.js} +20 -2
  13. package/dist/{chunk-R77O2WMK.js → chunk-2OIYNHWO.js} +1 -1
  14. package/dist/{chunk-QCN24XEN.js → chunk-3YUBFTDN.js} +1 -1
  15. package/dist/chunk-4FCL4DVZ.js +48 -0
  16. package/dist/{chunk-F7H6ATM4.js → chunk-5KXCM5AW.js} +18 -2
  17. package/dist/chunk-7KRIHYLR.js +124 -0
  18. package/dist/{chunk-RBNMDAKB.js → chunk-BCG45AQB.js} +15 -1
  19. package/dist/{chunk-QMJCNZ6C.js → chunk-C3KLHJDB.js} +1 -1
  20. package/dist/{chunk-H2X54EHC.js → chunk-DGGZVZTM.js} +1 -1
  21. package/dist/chunk-DW4TRDOZ.js +29 -0
  22. package/dist/{chunk-4JOQZPCE.js → chunk-EIQDZC43.js} +1 -1
  23. package/dist/{chunk-TQJ6ZYVY.js → chunk-FJ2MZ5PH.js} +41 -5
  24. package/dist/{chunk-BJZ4PV7R.js → chunk-HNGFKPNS.js} +26 -10
  25. package/dist/{chunk-5ZQZDDIK.js → chunk-HPGN6XRT.js} +3 -3
  26. package/dist/{chunk-KGIXX4NM.js → chunk-HUNDXZBZ.js} +5 -5
  27. package/dist/{chunk-ZDZISKCL.js → chunk-IJPMIEVE.js} +1 -1
  28. package/dist/chunk-IYCV34IU.js +158 -0
  29. package/dist/{chunk-ZNMCCHCP.js → chunk-LTLFOSA4.js} +2 -2
  30. package/dist/{chunk-K6T43YBD.js → chunk-MJRXFUMS.js} +26 -6
  31. package/dist/{chunk-4YU7HF4L.js → chunk-MOERAQXH.js} +6 -4
  32. package/dist/{chunk-KQSFTPIM.js → chunk-MTRMQFCQ.js} +1 -1
  33. package/dist/{chunk-OV7ZQ2GH.js → chunk-ODDGGLM6.js} +3 -3
  34. package/dist/{chunk-A7WQZKOU.js → chunk-OQJMTHEH.js} +2 -2
  35. package/dist/{chunk-RRNXJOKB.js → chunk-PJVPDY2Z.js} +2 -2
  36. package/dist/{chunk-FXORA5JG.js → chunk-Q7HOAVFR.js} +3 -3
  37. package/dist/{chunk-KDLYIECM.js → chunk-R772ET2M.js} +18 -4
  38. package/dist/{chunk-QLWG3C2Z.js → chunk-RRZ4RQQU.js} +2 -2
  39. package/dist/{mind-list-4D7J4CHD.js → chunk-SHKM5RGD.js} +18 -4
  40. package/dist/{chunk-RXEEYDIB.js → chunk-SZJCJVXV.js} +1 -1
  41. package/dist/{chunk-E3DA4HYV.js → chunk-T4VS7UDW.js} +15 -15
  42. package/dist/{chunk-YXSUMLTC.js → chunk-USD45JKR.js} +322 -76
  43. package/dist/{chunk-JO5IO4FH.js → chunk-VB2QXUJQ.js} +391 -294
  44. package/dist/{chunk-JZ62SYWR.js → chunk-VZRA5TYO.js} +1 -1
  45. package/dist/{chunk-PJ45FQPT.js → chunk-WARH6GIV.js} +8 -8
  46. package/dist/{chunk-PFZBNKUH.js → chunk-WCFSBH33.js} +0 -1
  47. package/dist/{chunk-DRJ24GXK.js → chunk-WQ46E33M.js} +59 -39
  48. package/dist/{chunk-ALKYQULU.js → chunk-WW6C3PLV.js} +1 -1
  49. package/dist/{chunk-CDPBTTZO.js → chunk-XVBSFLM7.js} +2 -2
  50. package/dist/{chunk-6EMWJZBK.js → chunk-YKA7DCVW.js} +1 -1
  51. package/dist/{chunk-IHKGWTGT.js → chunk-YNBXEQAP.js} +31 -1
  52. package/dist/cli.js +34 -26
  53. package/dist/{clock-RHS2JEDL.js → clock-CNRF6F7T.js} +3 -3
  54. package/dist/{cloud-sync-46RS4SDA.js → cloud-sync-WHKCB4CD.js} +22 -19
  55. package/dist/{config-TJLYUV3U.js → config-RPSLA2HX.js} +3 -3
  56. package/dist/{conversations-CJOOCGNW.js → conversations-C7IKYSHD.js} +4 -4
  57. package/dist/{create-IOV4GCRX.js → create-GJKHABJB.js} +16 -5
  58. package/dist/{create-DF3KISTW.js → create-VIQVP3QB.js} +1 -1
  59. package/dist/{daemon-client-IYR4KCPU.js → daemon-client-ZFY5MOAL.js} +5 -3
  60. package/dist/{daemon-restart-VFEI57UO.js → daemon-restart-7KUHVZIN.js} +7 -7
  61. package/dist/daemon.js +829 -496
  62. package/dist/{db-MF2JNRUW.js → db-FO6LXYCW.js} +2 -2
  63. package/dist/{db-LZTLA7XC.js → db-IPXRJUI7.js} +1 -1
  64. package/dist/{delete-HPLC7ETU.js → delete-ESEP7NGQ.js} +1 -1
  65. package/dist/delivery-manager-HZTT5SJR.js +36 -0
  66. package/dist/{delivery-router-N4A7ZC5T.js → delivery-router-3QFG2ZEX.js} +3 -3
  67. package/dist/{down-U2CZ23M4.js → down-G6IADJXV.js} +5 -5
  68. package/dist/echo-text-H3SH337Q.js +36 -0
  69. package/dist/env-6TGPO5WG.js +18 -0
  70. package/dist/{env-VZ4MLFQW.js → env-C7Z55QCJ.js} +6 -6
  71. package/dist/{exec-G3ZRST4Z.js → exec-QIFYZG4C.js} +3 -3
  72. package/dist/{export-LY723I3Z.js → export-C2K3NIRD.js} +4 -4
  73. package/dist/{extension-SEID47SR.js → extension-J4ZQ2GHV.js} +1 -1
  74. package/dist/{extensions-ZELQLTSR.js → extensions-GEKF47A4.js} +24 -19
  75. package/dist/{files-4LN3EN7Q.js → files-LXQSQOFG.js} +4 -4
  76. package/dist/{import-42YNQBF4.js → import-SX3ZXHB4.js} +8 -8
  77. package/dist/{isolation-YMGZZ4E5.js → isolation-MCT4ZYLT.js} +3 -3
  78. package/dist/{join-ZJV7W6MO.js → join-34TR2GXQ.js} +1 -1
  79. package/dist/{list-OXIAY3W7.js → list-PMUXZNAM.js} +1 -1
  80. package/dist/{login-MY6ETFYB.js → login-ARRZ4ORJ.js} +3 -3
  81. package/dist/{login-M6OJUPQ2.js → login-CL4IT2ED.js} +14 -5
  82. package/dist/{logout-WQBWO77G.js → logout-HZYJCYCA.js} +3 -3
  83. package/dist/{logout-NCG3TMDL.js → logout-YZRMZ3O2.js} +1 -1
  84. package/dist/message-delivery-GPQ5SE5N.js +40 -0
  85. package/dist/{mind-LHKS55DI.js → mind-46AOK373.js} +23 -19
  86. package/dist/{mind-activity-tracker-3QRNJVR4.js → mind-activity-tracker-YVZPC4A5.js} +4 -4
  87. package/dist/mind-contacts-GV7XYL5D.js +64 -0
  88. package/dist/{mind-history-VRO5A76U.js → mind-history-TTGA5BHZ.js} +5 -5
  89. package/dist/mind-list-OTHV4ZO4.js +13 -0
  90. package/dist/{mind-profile-PEQYASQX.js → mind-profile-LUG353ZT.js} +1 -1
  91. package/dist/mind-service-2ARGJNKP.js +44 -0
  92. package/dist/{mind-sleep-74TGOQBC.js → mind-sleep-DV7KP255.js} +3 -3
  93. package/dist/{mind-status-UO34ASXZ.js → mind-status-BJNPGXKC.js} +23 -1
  94. package/dist/{mind-wake-LCLGTXA2.js → mind-wake-LVTZ55EZ.js} +1 -1
  95. package/dist/notices-2KU5NTRY.js +25 -0
  96. package/dist/{package-DOD6CPO6.js → package-RTN2PS7O.js} +5 -3
  97. package/dist/{read-QVAXMTPV.js → read-YSWUXYL7.js} +1 -1
  98. package/dist/{register-Y2H4PY5R.js → register-42VBJKTP.js} +3 -3
  99. package/dist/{registry-OUZBZ3Q4.js → registry-UMMDRPRM.js} +2 -2
  100. package/dist/{reject-EV35X64Y.js → reject-SXGCYN4A.js} +1 -1
  101. package/dist/{restart-FJQ662XJ.js → restart-YYEGZJDD.js} +5 -5
  102. package/dist/{sandbox-ZJ7QA6Z6.js → sandbox-5VQ454XP.js} +4 -4
  103. package/dist/scheduler-I7JZCT47.js +34 -0
  104. package/dist/{schema-PVNG3PQM.js → schema-VEVO7HG6.js} +3 -1
  105. package/dist/{seed-CNYIHPOH.js → seed-F2HXZQU4.js} +1 -1
  106. package/dist/{seed-check-VLTVILOV.js → seed-check-TYD7RRZY.js} +1 -1
  107. package/dist/{seed-cmd-AVNUNLZV.js → seed-cmd-MLCTGSX5.js} +3 -3
  108. package/dist/{seed-create-ANXGYSCC.js → seed-create-KQ7OILWB.js} +6 -4
  109. package/dist/seed-readiness-RBPGOLSZ.js +18 -0
  110. package/dist/{seed-sprout-NIUFTX32.js → seed-sprout-HVYCFJLA.js} +30 -31
  111. package/dist/{send-SPE6DVNJ.js → send-TD2X5U3K.js} +6 -6
  112. package/dist/{service-UOCLXDWR.js → service-CVZMQYK6.js} +4 -4
  113. package/dist/{service-install-4HHFDDWY.js → service-install-VCRMFWX5.js} +5 -5
  114. package/dist/{setup-Y2EJI3GG.js → setup-5ECWTYKG.js} +7 -3
  115. package/dist/{setup-QT2A25SY.js → setup-AE4CVUC4.js} +7 -7
  116. package/dist/{skill-FKFHIJRR.js → skill-UUM4JZRF.js} +5 -5
  117. package/dist/skills/dreaming/SKILL.md +5 -1
  118. package/dist/skills/dreaming/scripts/dream.ts +5 -1
  119. package/dist/skills/orientation/SKILL.md +8 -7
  120. package/dist/skills/tending/SKILL.md +51 -2
  121. package/dist/skills/volute-mind/SKILL.md +2 -0
  122. package/dist/{skills-AKCFA7BN.js → skills-B3SVDCEB.js} +5 -5
  123. package/dist/sleep-manager-Z27R3WTW.js +38 -0
  124. package/dist/spirit-WXS3HCLN.js +25 -0
  125. package/dist/{split-WBMZXBHF.js → split-SKZ4Y2D6.js} +1 -1
  126. package/dist/{sprout-SMX42ZBP.js → sprout-KQ43BWZJ.js} +1 -1
  127. package/dist/{src-OJHARHTF.js → src-WLJE73NP.js} +14 -5
  128. package/dist/{start-5JE3TV66.js → start-O6UKK7BG.js} +3 -3
  129. package/dist/{status-SWRVGXBI.js → status-F4PGREUU.js} +19 -7
  130. package/dist/{stop-AAMTG3TU.js → stop-UBX6X5RA.js} +5 -5
  131. package/dist/system-chat-63ABFF6V.js +40 -0
  132. package/dist/{systems-VNB5WKSS.js → systems-JJNGQHAO.js} +4 -4
  133. package/dist/{tailscale-3XOKOW7T.js → tailscale-MCLY5GYE.js} +2 -2
  134. package/dist/{template-hash-446HHH5V.js → template-hash-GSOUARW4.js} +2 -2
  135. package/dist/template-staleness-EMQORSGG.js +15 -0
  136. package/dist/{turn-tracker-FOIBNUUA.js → turn-tracker-KLPV3PAU.js} +6 -6
  137. package/dist/up-RVGDE6CQ.js +20 -0
  138. package/dist/{update-SWAYZRWJ.js → update-OXQEGGXD.js} +5 -5
  139. package/dist/{update-check-PQ2MZ47K.js → update-check-266R4ZSY.js} +3 -3
  140. package/dist/{upgrade-NWAZ7MLD.js → upgrade-K5FIQPQD.js} +1 -1
  141. package/dist/{version-notify-C5CH7CVP.js → version-notify-73YURTFR.js} +41 -25
  142. package/dist/web-assets/assets/index-WdZ60R6c.css +1 -0
  143. package/dist/web-assets/assets/index-taX6Ezfa.js +92 -0
  144. package/dist/web-assets/index.html +2 -2
  145. package/drizzle/0011_drop_turn_summary_event_id.sql +3 -0
  146. package/drizzle/0012_channel_gates.sql +17 -0
  147. package/drizzle/meta/_journal.json +14 -0
  148. package/package.json +5 -3
  149. package/packages/extensions/pages/dist/ui/assets/index-BuXnE-rb.css +1 -0
  150. package/packages/extensions/pages/dist/ui/assets/index-DtzftuPA.js +2 -0
  151. package/packages/extensions/pages/dist/ui/index.html +2 -2
  152. package/templates/_base/src/lib/startup.ts +59 -3
  153. package/templates/claude/src/agent.ts +37 -4
  154. package/templates/claude/src/lib/session-reaper.ts +32 -0
  155. package/templates/claude/src/server.ts +14 -3
  156. package/templates/pi/src/agent.ts +7 -10
  157. package/templates/pi/src/lib/dispatch.ts +65 -0
  158. package/dist/avatar-image-6KY6UU4D.js +0 -16
  159. package/dist/delivery-manager-JINZRG2W.js +0 -33
  160. package/dist/echo-text-VQPB5L2X.js +0 -33
  161. package/dist/message-delivery-R7JSQGYX.js +0 -37
  162. package/dist/mind-service-NB2JMWQZ.js +0 -39
  163. package/dist/scheduler-WVKII3LA.js +0 -31
  164. package/dist/sleep-manager-G6TXSDP7.js +0 -35
  165. package/dist/spirit-RPBLLUQ5.js +0 -23
  166. package/dist/system-chat-NDAW6YP7.js +0 -37
  167. package/dist/up-PS6PFS75.js +0 -18
  168. package/dist/volute-config-A52FHWKM.js +0 -14
  169. package/dist/web-assets/assets/index-B1JBQv2m.css +0 -1
  170. package/dist/web-assets/assets/index-CU6XWICM.js +0 -86
  171. package/packages/extensions/pages/dist/ui/assets/index-BcY6lnq4.css +0 -1
  172. package/packages/extensions/pages/dist/ui/assets/index-CQjEQg1r.js +0 -2
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ getClient,
4
+ urlOf
5
+ } from "./chunk-LOPXTW6H.js";
6
+ import {
7
+ resolveMindName
8
+ } from "./chunk-BTY4WNFE.js";
9
+ import {
10
+ relativeAge
11
+ } from "./chunk-SHKM5RGD.js";
12
+ import {
13
+ daemonFetch
14
+ } from "./chunk-BCG45AQB.js";
15
+ import {
16
+ command
17
+ } from "./chunk-TXSA4Q3V.js";
18
+ import "./chunk-O7IGP7ZW.js";
19
+ import "./chunk-K3NQKI34.js";
20
+
21
+ // packages/cli/src/commands/mind-contacts.ts
22
+ var cmd = command({
23
+ name: "volute mind contacts",
24
+ description: "Who a mind has recently been in contact with (freshness-independent)",
25
+ flags: {
26
+ mind: { type: "string", description: "Mind name" },
27
+ hours: { type: "string", description: "Lookback window in hours (default 48)" }
28
+ },
29
+ examples: ["volute mind contacts --mind atlas", "volute mind contacts atlas --hours 24"],
30
+ run: async ({ flags }) => {
31
+ const name = resolveMindName(flags);
32
+ const client = getClient();
33
+ const url = client.api.minds[":name"].history.contacts.$url({ param: { name } });
34
+ if (flags.hours) url.searchParams.set("hours", flags.hours);
35
+ const res = await daemonFetch(urlOf(url));
36
+ if (!res.ok) {
37
+ let errorMsg = `Failed to get contacts: ${res.status}`;
38
+ try {
39
+ const data = await res.json();
40
+ if (data.error) errorMsg = data.error;
41
+ } catch {
42
+ }
43
+ console.error(errorMsg);
44
+ process.exit(1);
45
+ }
46
+ const { hours, contacts } = await res.json();
47
+ if (contacts.length === 0) {
48
+ console.log(`No contacts for ${name} in the last ${hours}h.`);
49
+ return;
50
+ }
51
+ console.log(`Recent contacts for ${name} (last ${hours}h):`);
52
+ for (const row of contacts) {
53
+ const channel = row.channel ?? "(unknown)";
54
+ const ago = relativeAge(row.last_at);
55
+ const last = ago ? `${ago} ago` : row.last_at;
56
+ const who = row.last_sender ? `, with ${row.last_sender}` : "";
57
+ console.log(` ${channel} \u2014 last ${last}, ${row.message_count} msg${who}`);
58
+ }
59
+ }
60
+ });
61
+ var run = cmd.execute;
62
+ export {
63
+ run
64
+ };
@@ -3,16 +3,16 @@ import {
3
3
  compactTime,
4
4
  isCompact
5
5
  } from "./chunk-5T5YMX6S.js";
6
+ import {
7
+ getClient,
8
+ urlOf
9
+ } from "./chunk-LOPXTW6H.js";
6
10
  import {
7
11
  resolveMindName
8
12
  } from "./chunk-BTY4WNFE.js";
9
13
  import {
10
14
  daemonFetch
11
- } from "./chunk-RBNMDAKB.js";
12
- import {
13
- getClient,
14
- urlOf
15
- } from "./chunk-LOPXTW6H.js";
15
+ } from "./chunk-BCG45AQB.js";
16
16
  import {
17
17
  command
18
18
  } from "./chunk-TXSA4Q3V.js";
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ relativeAge,
4
+ run
5
+ } from "./chunk-SHKM5RGD.js";
6
+ import "./chunk-BCG45AQB.js";
7
+ import "./chunk-TXSA4Q3V.js";
8
+ import "./chunk-O7IGP7ZW.js";
9
+ import "./chunk-K3NQKI34.js";
10
+ export {
11
+ relativeAge,
12
+ run
13
+ };
@@ -29,7 +29,7 @@ var cmd = command({
29
29
  );
30
30
  process.exit(1);
31
31
  }
32
- const { daemonFetch } = await import("./daemon-client-IYR4KCPU.js");
32
+ const { daemonFetch } = await import("./daemon-client-ZFY5MOAL.js");
33
33
  const body = {};
34
34
  if (displayName) body.displayName = displayName;
35
35
  if (description) body.description = description;
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ buildSeedOrientation,
4
+ recordMissingCredentialsNotice,
5
+ sleepMind,
6
+ startMindFull,
7
+ startSpiritFull,
8
+ stopMindFull,
9
+ stopSpiritFull,
10
+ wakeMind
11
+ } from "./chunk-VB2QXUJQ.js";
12
+ import "./chunk-HNGFKPNS.js";
13
+ import "./chunk-RRZ4RQQU.js";
14
+ import "./chunk-USD45JKR.js";
15
+ import "./chunk-MOERAQXH.js";
16
+ import "./chunk-HUNDXZBZ.js";
17
+ import "./chunk-ODDGGLM6.js";
18
+ import "./chunk-HPGN6XRT.js";
19
+ import "./chunk-VZRA5TYO.js";
20
+ import "./chunk-IYCV34IU.js";
21
+ import "./chunk-MTRMQFCQ.js";
22
+ import "./chunk-WQ46E33M.js";
23
+ import "./chunk-DW4TRDOZ.js";
24
+ import "./chunk-WCFSBH33.js";
25
+ import "./chunk-EIQDZC43.js";
26
+ import "./chunk-DGGZVZTM.js";
27
+ import "./chunk-IJPMIEVE.js";
28
+ import "./chunk-YNBXEQAP.js";
29
+ import "./chunk-5KXCM5AW.js";
30
+ import "./chunk-LTLFOSA4.js";
31
+ import "./chunk-T2TP6ZC6.js";
32
+ import "./chunk-WW6C3PLV.js";
33
+ import "./chunk-2MJ7EOMT.js";
34
+ import "./chunk-K3NQKI34.js";
35
+ export {
36
+ buildSeedOrientation,
37
+ recordMissingCredentialsNotice,
38
+ sleepMind,
39
+ startMindFull,
40
+ startSpiritFull,
41
+ stopMindFull,
42
+ stopSpiritFull,
43
+ wakeMind
44
+ };
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  parseDuration
4
- } from "./chunk-PJ45FQPT.js";
4
+ } from "./chunk-WARH6GIV.js";
5
5
  import "./chunk-5T5YMX6S.js";
6
+ import "./chunk-LOPXTW6H.js";
6
7
  import {
7
8
  resolveMindName
8
9
  } from "./chunk-BTY4WNFE.js";
9
10
  import {
10
11
  daemonFetch
11
- } from "./chunk-RBNMDAKB.js";
12
- import "./chunk-LOPXTW6H.js";
12
+ } from "./chunk-BCG45AQB.js";
13
13
  import {
14
14
  command
15
15
  } from "./chunk-TXSA4Q3V.js";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-BTY4WNFE.js";
5
5
  import {
6
6
  daemonFetch
7
- } from "./chunk-RBNMDAKB.js";
7
+ } from "./chunk-BCG45AQB.js";
8
8
  import {
9
9
  command
10
10
  } from "./chunk-TXSA4Q3V.js";
@@ -41,6 +41,14 @@ var cmd = command({
41
41
  if (mind.stage) console.log(`Stage: ${mind.stage}`);
42
42
  if (mind.parent) console.log(`Parent: ${mind.parent}`);
43
43
  if (mind.model) console.log(`Model: ${mind.model}`);
44
+ if (mind.templateStale) {
45
+ console.log(`Template: outdated \u2014 run 'volute mind upgrade ${mind.name}'`);
46
+ }
47
+ if (mind.lastNotice) {
48
+ const label = mind.lastNotice.kind === "turn_error" ? "Last turn failed" : "Last issue";
49
+ console.log(`
50
+ ${label}: ${mind.lastNotice.detail}`);
51
+ }
44
52
  if (mind.channels && mind.channels.length > 0) {
45
53
  console.log(`
46
54
  Channels:`);
@@ -57,6 +65,20 @@ Variants:`);
57
65
  }
58
66
  if (mind.hasPages) console.log(`
59
67
  Pages: published`);
68
+ const pendingRes = await daemonFetch(
69
+ `/api/minds/${encodeURIComponent(name)}/delivery/pending`
70
+ ).catch(() => null);
71
+ if (pendingRes?.ok) {
72
+ const pending = await pendingRes.json().catch(() => []);
73
+ if (pending.length > 0) {
74
+ const total = pending.reduce((sum, p) => sum + p.count, 0);
75
+ console.log(`
76
+ Gated channels (held, unrouted): ${total} message(s)`);
77
+ for (const p of pending) {
78
+ console.log(` ${p.channel ?? "unknown"}: ${p.count}`);
79
+ }
80
+ }
81
+ }
60
82
  }
61
83
  });
62
84
  var run = cmd.execute;
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-BTY4WNFE.js";
5
5
  import {
6
6
  daemonFetch
7
- } from "./chunk-RBNMDAKB.js";
7
+ } from "./chunk-BCG45AQB.js";
8
8
  import {
9
9
  command
10
10
  } from "./chunk-TXSA4Q3V.js";
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ MIND_LEVEL_SESSION,
4
+ clearDeliveredNotices,
5
+ drainNotices,
6
+ formatNotices,
7
+ hasUndeliveredNotice,
8
+ latestFailureNotice,
9
+ latestNotice,
10
+ recordNotice
11
+ } from "./chunk-IYCV34IU.js";
12
+ import "./chunk-T2TP6ZC6.js";
13
+ import "./chunk-WW6C3PLV.js";
14
+ import "./chunk-2MJ7EOMT.js";
15
+ import "./chunk-K3NQKI34.js";
16
+ export {
17
+ MIND_LEVEL_SESSION,
18
+ clearDeliveredNotices,
19
+ drainNotices,
20
+ formatNotices,
21
+ hasUndeliveredNotice,
22
+ latestFailureNotice,
23
+ latestNotice,
24
+ recordNotice
25
+ };
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
4
4
  // package.json
5
5
  var package_default = {
6
6
  name: "volute",
7
- version: "0.46.0",
7
+ version: "0.48.0",
8
8
  description: "CLI for creating and managing self-modifying AI minds powered by the Claude Agent SDK",
9
9
  type: "module",
10
10
  license: "MIT",
@@ -62,6 +62,7 @@ var package_default = {
62
62
  "typecheck:templates": "tsx scripts/typecheck-templates.ts",
63
63
  "lint:templates": "biome check templates/",
64
64
  "typecheck:web": "svelte-check --tsconfig packages/web/tsconfig.json",
65
+ knip: "knip --workspace packages/web --include files",
65
66
  prepare: "lefthook install",
66
67
  prepublishOnly: "npm run build",
67
68
  "db:generate": "drizzle-kit generate",
@@ -69,10 +70,10 @@ var package_default = {
69
70
  },
70
71
  dependencies: {
71
72
  "@anthropic-ai/sandbox-runtime": "^0.0.56",
73
+ "@earendil-works/pi-ai": "^0.80.3",
72
74
  "@hono/node-server": "^2.0.6",
73
75
  "@hono/zod-validator": "^0.8.0",
74
76
  "@libsql/client": "^0.17.4",
75
- "@earendil-works/pi-ai": "^0.80.3",
76
77
  "@slack/bolt": "^4.7.3",
77
78
  "adm-zip": "^0.5.17",
78
79
  bcryptjs: "^3.0.3",
@@ -83,6 +84,7 @@ var package_default = {
83
84
  "isomorphic-dompurify": "^2.36.0",
84
85
  libsql: "^0.5.29",
85
86
  replicate: "^1.4.0",
87
+ sharp: "^0.35.2",
86
88
  telegraf: "^4.16.3",
87
89
  undici: "^6.24.1",
88
90
  zod: "^4.4.3"
@@ -96,9 +98,9 @@ var package_default = {
96
98
  "@types/node": "^26.0.0",
97
99
  dompurify: "^3.4.11",
98
100
  "drizzle-kit": "^0.31.10",
101
+ knip: "^6.26.0",
99
102
  lefthook: "^2.1.9",
100
103
  marked: "^18.0.5",
101
- sharp: "^0.35.2",
102
104
  svelte: "^5.56.3",
103
105
  "svelte-check": "4.7.1",
104
106
  tsup: "^8.5.1",
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-BTY4WNFE.js";
9
9
  import {
10
10
  daemonFetch
11
- } from "./chunk-RBNMDAKB.js";
11
+ } from "./chunk-BCG45AQB.js";
12
12
  import {
13
13
  command
14
14
  } from "./chunk-TXSA4Q3V.js";
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ daemonFetch
4
+ } from "./chunk-BCG45AQB.js";
2
5
  import {
3
6
  promptLine
4
7
  } from "./chunk-VHWGEJ4V.js";
5
- import {
6
- daemonFetch
7
- } from "./chunk-RBNMDAKB.js";
8
8
  import {
9
9
  command
10
10
  } from "./chunk-TXSA4Q3V.js";
@@ -28,8 +28,8 @@ import {
28
28
  voluteHome,
29
29
  voluteSystemDir,
30
30
  voluteUserHome
31
- } from "./chunk-ALKYQULU.js";
32
- import "./chunk-ZV7MFISX.js";
31
+ } from "./chunk-WW6C3PLV.js";
32
+ import "./chunk-2MJ7EOMT.js";
33
33
  import "./chunk-K3NQKI34.js";
34
34
  export {
35
35
  SPIRIT_NAME,
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-BTY4WNFE.js";
5
5
  import {
6
6
  daemonFetch
7
- } from "./chunk-RBNMDAKB.js";
7
+ } from "./chunk-BCG45AQB.js";
8
8
  import {
9
9
  command
10
10
  } from "./chunk-TXSA4Q3V.js";
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ getClient,
4
+ urlOf
5
+ } from "./chunk-LOPXTW6H.js";
2
6
  import {
3
7
  resolveMindName
4
8
  } from "./chunk-BTY4WNFE.js";
5
9
  import {
6
10
  daemonFetch
7
- } from "./chunk-RBNMDAKB.js";
8
- import {
9
- getClient,
10
- urlOf
11
- } from "./chunk-LOPXTW6H.js";
11
+ } from "./chunk-BCG45AQB.js";
12
12
  import {
13
13
  command
14
14
  } from "./chunk-TXSA4Q3V.js";
@@ -7,11 +7,11 @@ import {
7
7
  isSandboxOptional,
8
8
  shellEscape,
9
9
  wrapForSandbox
10
- } from "./chunk-JZ62SYWR.js";
11
- import "./chunk-F7H6ATM4.js";
10
+ } from "./chunk-VZRA5TYO.js";
11
+ import "./chunk-5KXCM5AW.js";
12
12
  import "./chunk-T2TP6ZC6.js";
13
- import "./chunk-ALKYQULU.js";
14
- import "./chunk-ZV7MFISX.js";
13
+ import "./chunk-WW6C3PLV.js";
14
+ import "./chunk-2MJ7EOMT.js";
15
15
  import "./chunk-K3NQKI34.js";
16
16
  export {
17
17
  SandboxUnavailableError,
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ Scheduler,
4
+ getScheduler,
5
+ initScheduler
6
+ } from "./chunk-VB2QXUJQ.js";
7
+ import "./chunk-HNGFKPNS.js";
8
+ import "./chunk-RRZ4RQQU.js";
9
+ import "./chunk-USD45JKR.js";
10
+ import "./chunk-MOERAQXH.js";
11
+ import "./chunk-HUNDXZBZ.js";
12
+ import "./chunk-ODDGGLM6.js";
13
+ import "./chunk-HPGN6XRT.js";
14
+ import "./chunk-VZRA5TYO.js";
15
+ import "./chunk-IYCV34IU.js";
16
+ import "./chunk-MTRMQFCQ.js";
17
+ import "./chunk-WQ46E33M.js";
18
+ import "./chunk-DW4TRDOZ.js";
19
+ import "./chunk-WCFSBH33.js";
20
+ import "./chunk-EIQDZC43.js";
21
+ import "./chunk-DGGZVZTM.js";
22
+ import "./chunk-IJPMIEVE.js";
23
+ import "./chunk-YNBXEQAP.js";
24
+ import "./chunk-5KXCM5AW.js";
25
+ import "./chunk-LTLFOSA4.js";
26
+ import "./chunk-T2TP6ZC6.js";
27
+ import "./chunk-WW6C3PLV.js";
28
+ import "./chunk-2MJ7EOMT.js";
29
+ import "./chunk-K3NQKI34.js";
30
+ export {
31
+ Scheduler,
32
+ getScheduler,
33
+ initScheduler
34
+ };
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  activity,
4
+ channelGates,
4
5
  channels,
5
6
  conversationParticipants,
6
7
  conversationReads,
@@ -16,10 +17,11 @@ import {
16
17
  systemPrompts,
17
18
  turns,
18
19
  users
19
- } from "./chunk-ZV7MFISX.js";
20
+ } from "./chunk-2MJ7EOMT.js";
20
21
  import "./chunk-K3NQKI34.js";
21
22
  export {
22
23
  activity,
24
+ channelGates,
23
25
  channels,
24
26
  conversationParticipants,
25
27
  conversationReads,
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
4
4
  // packages/cli/src/commands/seed.ts
5
5
  async function run(args) {
6
6
  console.error("Note: `volute mind seed` is now `volute seed create`");
7
- await import("./seed-create-ANXGYSCC.js").then((m) => m.run(args));
7
+ await import("./seed-create-KQ7OILWB.js").then((m) => m.run(args));
8
8
  }
9
9
  export {
10
10
  run
@@ -13,7 +13,7 @@ var cmd = command({
13
13
  flags: {},
14
14
  run: async ({ args }) => {
15
15
  const name = args.name;
16
- const { daemonFetch } = await import("./daemon-client-IYR4KCPU.js");
16
+ const { daemonFetch } = await import("./daemon-client-ZFY5MOAL.js");
17
17
  const res = await daemonFetch(`/api/minds/${encodeURIComponent(name)}/seed-check`);
18
18
  if (!res.ok) {
19
19
  if (res.status === 404) {
@@ -12,15 +12,15 @@ var cmd = subcommands({
12
12
  commands: {
13
13
  create: {
14
14
  description: "Plant a new seed",
15
- run: (args) => import("./seed-create-ANXGYSCC.js").then((m) => m.run(args))
15
+ run: (args) => import("./seed-create-KQ7OILWB.js").then((m) => m.run(args))
16
16
  },
17
17
  sprout: {
18
18
  description: "Complete orientation and become a full mind",
19
- run: (args) => import("./seed-sprout-NIUFTX32.js").then((m) => m.run(args))
19
+ run: (args) => import("./seed-sprout-HVYCFJLA.js").then((m) => m.run(args))
20
20
  },
21
21
  check: {
22
22
  description: "Check seed readiness",
23
- run: (args) => import("./seed-check-VLTVILOV.js").then((m) => m.run(args))
23
+ run: (args) => import("./seed-check-TYD7RRZY.js").then((m) => m.run(args))
24
24
  }
25
25
  }
26
26
  });
@@ -47,19 +47,19 @@ var cmd = command({
47
47
  const name = args.name;
48
48
  const skills = flags.skills === "none" ? [] : flags.skills ? flags.skills.split(",") : void 0;
49
49
  const createdBy = flags["created-by"];
50
- const { daemonFetch } = await import("./daemon-client-IYR4KCPU.js");
50
+ const { daemonFetch } = await import("./daemon-client-ZFY5MOAL.js");
51
51
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
52
52
  const client = getClient();
53
53
  let model = flags.model;
54
54
  let template = flags.template;
55
55
  if (!template) {
56
- const { resolveTemplate } = await import("./ai-service-UODCCE4O.js");
56
+ const { resolveTemplate } = await import("./ai-service-643TNFPH.js");
57
57
  template = await resolveTemplate(model);
58
58
  }
59
59
  if (template !== "claude" && !model) {
60
60
  if (process.env.VOLUTE_MIND || !process.stdin.isTTY) {
61
- const { getSpiritModel } = await import("./spirit-RPBLLUQ5.js");
62
- const { qualifyModelId } = await import("./ai-service-UODCCE4O.js");
61
+ const { getSpiritModel } = await import("./spirit-WXS3HCLN.js");
62
+ const { qualifyModelId } = await import("./ai-service-643TNFPH.js");
63
63
  const spiritModel = getSpiritModel();
64
64
  if (spiritModel) {
65
65
  model = template === "pi" ? qualifyModelId(spiritModel) : spiritModel;
@@ -91,6 +91,8 @@ var cmd = command({
91
91
  console.error(createData.error ?? "Failed to create mind");
92
92
  process.exit(1);
93
93
  }
94
+ if (createData.credentialWarning) console.warn(`
95
+ \u26A0 ${createData.credentialWarning}`);
94
96
  const startRes = await daemonFetch(
95
97
  urlOf(client.api.minds[":name"].start.$url({ param: { name } })),
96
98
  { method: "POST" }
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ evaluateSeedChecklist,
4
+ isMemoryWritten,
5
+ isSoulWritten
6
+ } from "./chunk-4FCL4DVZ.js";
7
+ import "./chunk-MOERAQXH.js";
8
+ import "./chunk-DW4TRDOZ.js";
9
+ import "./chunk-WCFSBH33.js";
10
+ import "./chunk-5KXCM5AW.js";
11
+ import "./chunk-WW6C3PLV.js";
12
+ import "./chunk-2MJ7EOMT.js";
13
+ import "./chunk-K3NQKI34.js";
14
+ export {
15
+ evaluateSeedChecklist,
16
+ isMemoryWritten,
17
+ isSoulWritten
18
+ };
@@ -1,28 +1,31 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  daemonFetch
4
- } from "./chunk-RBNMDAKB.js";
4
+ } from "./chunk-BCG45AQB.js";
5
+ import {
6
+ evaluateSeedChecklist
7
+ } from "./chunk-4FCL4DVZ.js";
5
8
  import {
6
9
  command
7
10
  } from "./chunk-TXSA4Q3V.js";
8
11
  import "./chunk-O7IGP7ZW.js";
12
+ import "./chunk-MOERAQXH.js";
9
13
  import {
10
14
  getStandardSkillsWithExtensions
11
- } from "./chunk-KGIXX4NM.js";
12
- import {
13
- ORIENTATION_MARKER
14
- } from "./chunk-4YU7HF4L.js";
15
- import "./chunk-H2X54EHC.js";
16
- import "./chunk-F7H6ATM4.js";
15
+ } from "./chunk-HUNDXZBZ.js";
16
+ import "./chunk-DW4TRDOZ.js";
17
+ import "./chunk-WCFSBH33.js";
18
+ import "./chunk-DGGZVZTM.js";
19
+ import "./chunk-5KXCM5AW.js";
17
20
  import "./chunk-T2TP6ZC6.js";
18
21
  import {
19
22
  mindDir
20
- } from "./chunk-ALKYQULU.js";
21
- import "./chunk-ZV7MFISX.js";
23
+ } from "./chunk-WW6C3PLV.js";
24
+ import "./chunk-2MJ7EOMT.js";
22
25
  import "./chunk-K3NQKI34.js";
23
26
 
24
27
  // packages/cli/src/commands/seed-sprout.ts
25
- import { existsSync, readFileSync } from "fs";
28
+ import { existsSync } from "fs";
26
29
  import { resolve } from "path";
27
30
  var cmd = command({
28
31
  name: "volute seed sprout",
@@ -45,37 +48,33 @@ var cmd = command({
45
48
  process.exit(1);
46
49
  }
47
50
  const dir = mindDir(mindName);
48
- const soulPath = resolve(dir, "home/SOUL.md");
49
- const memoryPath = resolve(dir, "home/MEMORY.md");
50
- if (!existsSync(soulPath)) {
51
- console.error("Write your SOUL.md before sprouting.");
51
+ const checklist = evaluateSeedChecklist(dir);
52
+ if (!checklist.soulWritten) {
53
+ console.error(
54
+ "Your SOUL.md is still the orientation template (or unwritten). Write your own identity first."
55
+ );
52
56
  process.exit(1);
53
57
  }
54
- const soul = readFileSync(soulPath, "utf-8");
55
- if (soul.includes(ORIENTATION_MARKER)) {
58
+ if (!checklist.memoryWritten) {
56
59
  console.error(
57
- "Your SOUL.md still contains the orientation template. Write your own identity first."
60
+ "Your MEMORY.md is still empty or the starter placeholder. Write your own memory first."
58
61
  );
59
62
  process.exit(1);
60
63
  }
61
- if (!existsSync(memoryPath)) {
62
- console.error("Write your MEMORY.md before sprouting.");
64
+ if (!checklist.displayNameSet) {
65
+ console.error(
66
+ 'Set your display name before sprouting: volute mind profile --display-name "Your Name"'
67
+ );
63
68
  process.exit(1);
64
69
  }
65
- const { isImagegenEnabled } = await import("./setup-Y2EJI3GG.js");
66
- if (isImagegenEnabled()) {
67
- const { readVoluteConfig } = await import("./volute-config-A52FHWKM.js");
68
- const config = readVoluteConfig(dir);
69
- const avatarPath = config?.profile?.avatar;
70
- if (!avatarPath || !existsSync(resolve(dir, "home", avatarPath))) {
71
- console.error(
72
- "Generate an avatar before sprouting. Use `imagegen generate` to create one, then `volute mind profile --avatar <path>` to set it."
73
- );
74
- process.exit(1);
75
- }
70
+ if (checklist.imagegenEnabled && !checklist.avatarSet) {
71
+ console.error(
72
+ "Generate an avatar before sprouting. Use `imagegen generate` to create one, then `volute mind profile --avatar <path>` to set it."
73
+ );
74
+ process.exit(1);
76
75
  }
77
76
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
78
- const { mindSkillsDir } = await import("./skills-AKCFA7BN.js");
77
+ const { mindSkillsDir } = await import("./skills-B3SVDCEB.js");
79
78
  const client = getClient();
80
79
  const failedSkills = [];
81
80
  for (const skillId of getStandardSkillsWithExtensions()) {
@@ -5,22 +5,22 @@ import {
5
5
  import {
6
6
  isCompact
7
7
  } from "./chunk-5T5YMX6S.js";
8
- import {
9
- daemonFetch
10
- } from "./chunk-RBNMDAKB.js";
11
8
  import {
12
9
  getClient,
13
10
  urlOf
14
11
  } from "./chunk-LOPXTW6H.js";
12
+ import {
13
+ daemonFetch
14
+ } from "./chunk-BCG45AQB.js";
15
15
  import {
16
16
  command
17
17
  } from "./chunk-TXSA4Q3V.js";
18
18
  import "./chunk-O7IGP7ZW.js";
19
19
  import {
20
20
  formatFileSize
21
- } from "./chunk-R77O2WMK.js";
22
- import "./chunk-ALKYQULU.js";
23
- import "./chunk-ZV7MFISX.js";
21
+ } from "./chunk-2OIYNHWO.js";
22
+ import "./chunk-WW6C3PLV.js";
23
+ import "./chunk-2MJ7EOMT.js";
24
24
  import "./chunk-K3NQKI34.js";
25
25
 
26
26
  // packages/cli/src/commands/send.ts