volute 0.53.0 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/dist/{activity-events-LQII6PZS.js → activity-events-TFAJBNBW.js} +2 -2
  2. package/dist/{ai-service-YW5SWCSB.js → ai-service-KEK2V3AP.js} +2 -2
  3. package/dist/{auth-KRDSM55Q.js → auth-Y27LTNZK.js} +3 -3
  4. package/dist/auto-upgrade-2MZF7NG3.js +46 -0
  5. package/dist/{avatar-image-52WGXLHV.js → avatar-image-SN576P45.js} +2 -2
  6. package/dist/{backup-WWXVIMYQ.js → backup-GDCWH6MC.js} +12 -12
  7. package/dist/channels-AFJWGX7W.js +203 -0
  8. package/dist/{chat-WK2BLM7B.js → chat-HVPOZK3O.js} +9 -9
  9. package/dist/{chunk-QUSMYGNQ.js → chunk-2674KIGI.js} +1 -0
  10. package/dist/chunk-2GATCSZK.js +520 -0
  11. package/dist/{chunk-P2TBUKLW.js → chunk-3SFKY4GI.js} +4 -4
  12. package/dist/{chunk-RMADJFA7.js → chunk-45QTYKQQ.js} +4 -4
  13. package/dist/{chunk-TAWRJ24T.js → chunk-4VAQKLMU.js} +8 -5
  14. package/dist/{chunk-OXWUEU5V.js → chunk-5U5GLZSD.js} +2 -2
  15. package/dist/{chunk-TPX6E6PL.js → chunk-6HBGUPBA.js} +2 -2
  16. package/dist/{chunk-UFTDRTCP.js → chunk-7AA4T2RT.js} +2 -2
  17. package/dist/{chunk-LN7XJ56R.js → chunk-7XKPG66D.js} +9 -9
  18. package/dist/{chunk-VDZ4I4ZP.js → chunk-BP2X5AIK.js} +8 -14
  19. package/dist/{chunk-PIZDPY4G.js → chunk-CKOA4LWV.js} +12 -12
  20. package/dist/{chunk-6NLW72HP.js → chunk-CKPAVQNK.js} +1 -1
  21. package/dist/{chunk-IQ7VNWH6.js → chunk-DUV4EMNW.js} +37 -3
  22. package/dist/{chunk-CV6BNGFK.js → chunk-FSXPPOPM.js} +3 -3
  23. package/dist/{chunk-UTKUO2KY.js → chunk-FZUPIS3T.js} +3 -3
  24. package/dist/{chunk-L7BKTZ5U.js → chunk-G3XAB4DK.js} +1 -1
  25. package/dist/{chunk-23UJGVYP.js → chunk-HLWQ3P3R.js} +50 -46
  26. package/dist/{chunk-AP2KQMMW.js → chunk-HTSWDOJE.js} +11 -14
  27. package/dist/{chunk-EDR47UE2.js → chunk-IR2FW4W7.js} +2 -2
  28. package/dist/{chunk-ICXY54ZC.js → chunk-IT4GEFDH.js} +1 -1
  29. package/dist/{chunk-F6D766VQ.js → chunk-KS62IHE2.js} +1 -1
  30. package/dist/{chunk-LNNI3MS4.js → chunk-MNKPAAQF.js} +9 -2
  31. package/dist/{chunk-HASADR3E.js → chunk-NCRG4SBR.js} +241 -66
  32. package/dist/{chunk-I7U5EEZC.js → chunk-NM5FDH4T.js} +1 -1
  33. package/dist/{chunk-7LT3YZUR.js → chunk-OFU6WJJZ.js} +1 -1
  34. package/dist/{chunk-M77B73VV.js → chunk-OIOW3FPT.js} +7 -2
  35. package/dist/{chunk-BDHKCLWK.js → chunk-OKM67ZWH.js} +1 -1
  36. package/dist/chunk-OUGD5L5U.js +918 -0
  37. package/dist/{chunk-X67BDDZR.js → chunk-P3GXOT2X.js} +48 -2
  38. package/dist/{chunk-U54PJPTB.js → chunk-PRZUBJ4K.js} +1 -1
  39. package/dist/{chunk-UO4MZQNO.js → chunk-QVS3C4DK.js} +15 -7
  40. package/dist/{chunk-RQRO6PC7.js → chunk-TMTAHKYP.js} +324 -48
  41. package/dist/{chunk-5DBGQBQR.js → chunk-UEZC5MNB.js} +29 -18
  42. package/dist/{chunk-7ARONCZW.js → chunk-VTFXZPC3.js} +13 -13
  43. package/dist/{chunk-UDZLPR34.js → chunk-W3OIPJPB.js} +14 -9
  44. package/dist/{chunk-HTB7KDRU.js → chunk-WZZCA23D.js} +5 -4
  45. package/dist/{chunk-5Y54AE3L.js → chunk-XAG53RWY.js} +1 -1
  46. package/dist/{chunk-HTRSSOHY.js → chunk-YU5EYQAE.js} +1 -1
  47. package/dist/{chunk-5N32EN4O.js → chunk-Z4Q6TQWL.js} +1 -1
  48. package/dist/{chunk-EGV6R6UF.js → chunk-Z7TNIIHW.js} +3 -1
  49. package/dist/cli.js +19 -19
  50. package/dist/{clock-SH4NQC2F.js → clock-X7V3C7NL.js} +3 -3
  51. package/dist/{cloud-sync-MJVJ33LD.js → cloud-sync-FM73SVFJ.js} +21 -21
  52. package/dist/{conversations-ZL6PHROD.js → conversations-FH3ODBL7.js} +3 -3
  53. package/dist/{create-G2RIKQYK.js → create-P75ZFTVN.js} +1 -1
  54. package/dist/{daemon-restart-BIGU4OKS.js → daemon-restart-JQMMMITM.js} +4 -4
  55. package/dist/daemon.js +469 -857
  56. package/dist/db-JH3NTERX.js +36 -0
  57. package/dist/delivery-manager-H23Q23N7.js +41 -0
  58. package/dist/{delivery-notices-65TB3CBX.js → delivery-notices-S7TKOACE.js} +5 -5
  59. package/dist/{delivery-router-RHANNTAC.js → delivery-router-KHBVEVVL.js} +4 -2
  60. package/dist/{down-QSNEMTTX.js → down-UN2EDX2Y.js} +3 -3
  61. package/dist/echo-text-ULEIFJJF.js +40 -0
  62. package/dist/{exec-ABD3DYA2.js → exec-Z34TTUO3.js} +1 -1
  63. package/dist/extensions-QD22GXZD.js +74 -0
  64. package/dist/{files-CHPNEQXN.js → files-DUGRXN6V.js} +5 -5
  65. package/dist/{import-DB2KULRO.js → import-RDDUGGFI.js} +3 -3
  66. package/dist/{isolation-GVV2IBAU.js → isolation-UQPDO34R.js} +1 -1
  67. package/dist/message-delivery-LU4EP244.js +46 -0
  68. package/dist/migrate-init-infrastructure-Z72UJ5NT.js +44 -0
  69. package/dist/migrate-name-placeholder-64AEAWPE.js +37 -0
  70. package/dist/{migrate-thread-config-EQSEP2XG.js → migrate-thread-config-SVF2M3D3.js} +1 -1
  71. package/dist/{mind-IX5AWUST.js → mind-BARCLI7O.js} +14 -14
  72. package/dist/{mind-activity-tracker-QF6DCX2X.js → mind-activity-tracker-UT23RGBF.js} +3 -3
  73. package/dist/{mind-contacts-BKUOUJPV.js → mind-contacts-PEXCDRXA.js} +8 -8
  74. package/dist/{mind-list-KNU34SUD.js → mind-list-7KBLPLES.js} +2 -2
  75. package/dist/mind-service-ZJCUBAUL.js +48 -0
  76. package/dist/{mind-sleep-D3DEYAWG.js → mind-sleep-24HV4RCA.js} +5 -5
  77. package/dist/{mind-status-BPTLQ5Z6.js → mind-status-4YW4PHMO.js} +6 -3
  78. package/dist/{package-BN5KMU54.js → package-AUDBDKAO.js} +12 -14
  79. package/dist/{prompts-HNKGCAEY.js → prompts-MOBF3TMO.js} +1 -1
  80. package/dist/{sandbox-NNWCTHRI.js → sandbox-VI7XWBIA.js} +2 -2
  81. package/dist/scheduler-GLINVC2B.js +27 -0
  82. package/dist/{seed-LHZ33UB4.js → seed-5JGR7ZRA.js} +1 -1
  83. package/dist/{seed-cmd-U4RVJ3UA.js → seed-cmd-M6A7N7F3.js} +2 -2
  84. package/dist/{seed-create-OQU4KNCB.js → seed-create-TGFZW4IO.js} +3 -3
  85. package/dist/{seed-readiness-WJYYRRCK.js → seed-readiness-XBH2MUNA.js} +2 -2
  86. package/dist/{seed-sprout-SFUYH2RG.js → seed-sprout-3IC5ZVTI.js} +11 -11
  87. package/dist/{send-FWZAMDBN.js → send-DHYBAYK4.js} +11 -11
  88. package/dist/{service-XQPMZAGI.js → service-T4P5W6RS.js} +2 -2
  89. package/dist/{service-install-2EWD7KXD.js → service-install-R4SNYUVO.js} +3 -3
  90. package/dist/{setup-RVSGCIF3.js → setup-6KAH3GRW.js} +4 -4
  91. package/dist/skills/dreaming/SKILL.md +2 -2
  92. package/dist/skills/dreaming/references/INSTALL.md +1 -1
  93. package/dist/skills/tending/SKILL.md +2 -0
  94. package/dist/skills/volute-mind/SKILL.md +8 -0
  95. package/dist/skills/volute-mind/references/integrations.md +3 -2
  96. package/dist/skills/volute-mind/references/routing.md +18 -5
  97. package/dist/{skills-QRPU6BWY.js → skills-LKQCYFVP.js} +3 -3
  98. package/dist/sleep-manager-Q3ITFNOJ.js +42 -0
  99. package/dist/{spirit-I5ECLGRI.js → spirit-FKXMGO3N.js} +8 -6
  100. package/dist/spirit-availability-5R2WYSWF.js +43 -0
  101. package/dist/{sprout-A2PMEF7Z.js → sprout-VEW3CUNX.js} +1 -1
  102. package/dist/src-246GSX7A.js +519 -0
  103. package/dist/src-LOUB3WPR.js +4189 -0
  104. package/dist/{status-EYG4A3OK.js → status-LCKTTIWS.js} +5 -5
  105. package/dist/{system-events-YTOU66QI.js → system-events-ZYOCYAO2.js} +5 -3
  106. package/dist/{systems-2DIJY4RF.js → systems-HL7SGSW7.js} +6 -6
  107. package/dist/{tailscale-KHNZFC7L.js → tailscale-F2IMBILZ.js} +1 -1
  108. package/dist/{template-hash-YKWMVYMM.js → template-hash-RJRMF6DT.js} +2 -2
  109. package/dist/{template-staleness-PY2CULH6.js → template-staleness-IBD722PN.js} +4 -4
  110. package/dist/{turn-tracker-NNHS6MAR.js → turn-tracker-BE34OI6O.js} +7 -7
  111. package/dist/{up-UGBHH743.js → up-J47J5JRB.js} +3 -3
  112. package/dist/{update-CIWI2JYA.js → update-ILCPVNDD.js} +2 -2
  113. package/dist/{upgrade-LIE46UBB.js → upgrade-XY2J7NWZ.js} +9 -1
  114. package/dist/variant-cleanup-JGJZ5KB4.js +24 -0
  115. package/dist/{version-notify-SJVAQLZI.js → version-notify-KIXYNHJC.js} +28 -13
  116. package/dist/web-assets/assets/{index-b7G7ZsVk.js → index-CoU1eUKE.js} +25 -25
  117. package/dist/web-assets/assets/index-hPn_fkz3.css +1 -0
  118. package/dist/web-assets/index.html +2 -2
  119. package/package.json +12 -14
  120. package/packages/extensions/intentions/dist/ui/assets/index-3FneLCKR.css +1 -0
  121. package/packages/extensions/intentions/dist/ui/assets/index-Bl5KEcli.js +67 -0
  122. package/packages/extensions/{notes → intentions}/dist/ui/index.html +3 -3
  123. package/packages/extensions/intentions/skills/intention-review/SKILL.md +38 -0
  124. package/packages/extensions/intentions/skills/intentions/SKILL.md +49 -0
  125. package/packages/extensions/intentions/skills/intentions/scripts/intentions-hook.sh +45 -0
  126. package/packages/extensions/pages/dist/ui/assets/index-BKxVQkA9.css +1 -0
  127. package/packages/extensions/pages/dist/ui/assets/index-BMt6sStP.js +68 -0
  128. package/packages/extensions/pages/dist/ui/index.html +2 -2
  129. package/packages/extensions/pages/skills/commons-gardening/SKILL.md +50 -0
  130. package/packages/extensions/pages/skills/pages/SKILL.md +140 -16
  131. package/templates/_base/.init/.config/prompts.json +2 -3
  132. package/templates/{pi → _base}/.init/.config/routes.json +1 -0
  133. package/templates/_base/.init/.local/hooks/pre-prompt/turn-context.ts +30 -0
  134. package/templates/_base/.init/memory/dreams/.gitkeep +0 -0
  135. package/templates/_base/home/.config/routes.json +1 -1
  136. package/templates/_base/home/VOLUTE.md +1 -1
  137. package/templates/_base/src/lib/codex-session-seed.ts +6 -55
  138. package/templates/_base/src/lib/context-breakdown.ts +11 -3
  139. package/templates/_base/src/lib/pi-session-seed.ts +8 -57
  140. package/templates/_base/src/lib/routing.ts +2 -2
  141. package/templates/_base/src/lib/seed-note.ts +4 -4
  142. package/templates/_base/src/lib/session-seed.ts +8 -53
  143. package/templates/_base/src/lib/startup.ts +4 -22
  144. package/templates/claude/.init/CLAUDE.md +4 -0
  145. package/templates/claude/package.json +2 -2
  146. package/templates/claude/src/agent.ts +60 -112
  147. package/templates/claude/src/lib/hooks/pre-compact.ts +6 -6
  148. package/templates/claude/src/lib/message-channel.ts +43 -15
  149. package/templates/claude/src/lib/recover.ts +69 -0
  150. package/templates/claude/src/lib/stream-consumer.ts +23 -5
  151. package/templates/claude/src/server.ts +0 -1
  152. package/templates/claude/volute-template.json +1 -1
  153. package/templates/codex/.init/AGENTS.md +4 -0
  154. package/templates/codex/package.json +2 -2
  155. package/templates/codex/src/agent.ts +23 -89
  156. package/templates/codex/volute-template.json +1 -1
  157. package/templates/pi/.init/MINDS.md +4 -0
  158. package/templates/pi/package.json +1 -1
  159. package/templates/pi/src/agent.ts +26 -93
  160. package/templates/pi/src/lib/mechanics-doc.ts +30 -0
  161. package/templates/pi/src/server.ts +3 -2
  162. package/templates/pi/volute-template.json +1 -1
  163. package/dist/channels-LW5ZLMSQ.js +0 -90
  164. package/dist/chunk-R772ET2M.js +0 -164
  165. package/dist/db-IPXRJUI7.js +0 -20
  166. package/dist/delivery-manager-FDHCZ7PU.js +0 -37
  167. package/dist/echo-text-KU6G4Z7V.js +0 -40
  168. package/dist/extensions-VACUKFA5.js +0 -60
  169. package/dist/message-delivery-TUXM3AAE.js +0 -46
  170. package/dist/mind-service-WHFBUKZE.js +0 -48
  171. package/dist/scheduler-5X5UIQOQ.js +0 -27
  172. package/dist/skills/plan-coordinator/SKILL.md +0 -60
  173. package/dist/sleep-manager-NWUCRBZB.js +0 -42
  174. package/dist/spirit-availability-NIUUYKU2.js +0 -43
  175. package/dist/src-HGNE2XG4.js +0 -832
  176. package/dist/src-LCSOQY6Z.js +0 -2222
  177. package/dist/src-UDMJZ6MH.js +0 -426
  178. package/dist/variant-cleanup-CZDLIY3F.js +0 -24
  179. package/dist/web-assets/assets/index-BHSU9r-4.css +0 -1
  180. package/packages/extensions/notes/dist/ui/assets/index-BBs8pyel.js +0 -67
  181. package/packages/extensions/notes/dist/ui/assets/index-D3cdui42.css +0 -1
  182. package/packages/extensions/notes/skills/notes/SKILL.md +0 -90
  183. package/packages/extensions/pages/dist/ui/assets/index-B589e8Xe.js +0 -2
  184. package/packages/extensions/pages/dist/ui/assets/index-BuXnE-rb.css +0 -1
  185. package/packages/extensions/plan/dist/ui/assets/index-B8s8wxyt.js +0 -67
  186. package/packages/extensions/plan/dist/ui/assets/index-jIkrt-vI.css +0 -1
  187. package/packages/extensions/plan/dist/ui/index.html +0 -14
  188. package/packages/extensions/plan/skills/plan/SKILL.md +0 -43
  189. package/packages/extensions/plan/skills/plan/scripts/plan-hook.sh +0 -37
  190. package/templates/claude/.init/.config/routes.json +0 -11
  191. package/templates/codex/.init/.config/routes.json +0 -11
  192. package/dist/{accept-I4GVGWA3.js → accept-RSDIVJL6.js} +3 -3
  193. package/dist/{bridge-KU2IKSH3.js → bridge-YK7NTRU5.js} +3 -3
  194. package/dist/{create-C3XZACTV.js → create-M727VUDF.js} +3 -3
  195. package/dist/{env-BJGM6FBA.js → env-7AZFBPWX.js} +7 -7
  196. package/dist/{extension-B2W52WZY.js → extension-MRYJWSMV.js} +3 -3
  197. package/dist/{list-R2GDWOEE.js → list-UQGIW7OF.js} +3 -3
  198. package/dist/{login-EZ4RRDQX.js → login-4NUS72Z5.js} +3 -3
  199. package/dist/{login-JDOAK465.js → login-57MMYILL.js} +4 -4
  200. package/dist/{logout-MWSIUOQU.js → logout-BYV433X6.js} +3 -3
  201. package/dist/{logout-K6ZGAJY5.js → logout-YFZAJRPY.js} +3 -3
  202. package/dist/{mind-history-RVF6KJ7K.js → mind-history-RZMMCHMX.js} +9 -9
  203. package/dist/{mind-wake-DCDFFQKX.js → mind-wake-LDGPRA42.js} +3 -3
  204. package/dist/{read-J5RM674N.js → read-RJ5NAW5J.js} +3 -3
  205. package/dist/{register-53LBGSDC.js → register-WNCSOTAU.js} +3 -3
  206. package/dist/{reject-K2A4UK2Y.js → reject-4NFLXKRN.js} +3 -3
  207. package/dist/{restart-R2WFNF5K.js → restart-B4GNMVF2.js} +7 -7
  208. package/dist/{skill-DXLLSUHB.js → skill-QYTBUDNQ.js} +7 -7
  209. package/dist/{start-XDOUAWN3.js → start-BDHJVOVX.js} +6 -6
  210. package/dist/{stop-O62RTEMD.js → stop-45QYSGYS.js} +7 -7
@@ -1,19 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getUserByUsername
4
- } from "./chunk-7LT3YZUR.js";
4
+ } from "./chunk-OFU6WJJZ.js";
5
5
  import {
6
+ parseDbTimestamp,
6
7
  publish
7
- } from "./chunk-LNNI3MS4.js";
8
+ } from "./chunk-MNKPAAQF.js";
8
9
  import {
9
10
  getPrompt
10
- } from "./chunk-AP2KQMMW.js";
11
+ } from "./chunk-HTSWDOJE.js";
11
12
  import {
12
13
  aiCompleteUtility
13
- } from "./chunk-EGV6R6UF.js";
14
+ } from "./chunk-Z7TNIIHW.js";
14
15
  import {
15
16
  logger_default
16
- } from "./chunk-QUSMYGNQ.js";
17
+ } from "./chunk-2674KIGI.js";
17
18
  import {
18
19
  getDb,
19
20
  resolveMindDir
@@ -187,12 +188,6 @@ function getTimeRange(periodKey, period) {
187
188
  }
188
189
  }
189
190
 
190
- // packages/daemon/src/lib/util/time.ts
191
- function parseDbTimestamp(ts) {
192
- if (/[zZ]$|[+-]\d\d:?\d\d$/.test(ts)) return new Date(ts);
193
- return /* @__PURE__ */ new Date(`${ts.replace(" ", "T")}Z`);
194
- }
195
-
196
191
  // packages/daemon/src/lib/daemon/summarizer.ts
197
192
  var sLog = logger_default.child("summarizer");
198
193
  var SYSTEM_MIND = "_system";
@@ -1200,11 +1195,11 @@ var Summarizer = class {
1200
1195
  }
1201
1196
  };
1202
1197
  async function reconcileWedgedTurns(idleMs) {
1203
- const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-NNHS6MAR.js");
1198
+ const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-BE34OI6O.js");
1204
1199
  const wedged = await sweepWedgedTurns2(idleMs);
1205
1200
  if (wedged.length === 0) return;
1206
1201
  summarizeOrphanedTurns2(wedged);
1207
- const { tryGetDeliveryManager } = await import("./delivery-manager-FDHCZ7PU.js");
1202
+ const { tryGetDeliveryManager } = await import("./delivery-manager-H23Q23N7.js");
1208
1203
  const dm = tryGetDeliveryManager();
1209
1204
  if (!dm) return;
1210
1205
  for (const t of wedged) {
@@ -1408,7 +1403,6 @@ export {
1408
1403
  utcDateTimeStr,
1409
1404
  parseUtcDateTime,
1410
1405
  getUtcTimeRange,
1411
- parseDbTimestamp,
1412
1406
  SYSTEM_MIND,
1413
1407
  summarizeTurn,
1414
1408
  supersedeTurnSummary,
@@ -6,32 +6,32 @@ import {
6
6
  getMindToken,
7
7
  loadJsonMap,
8
8
  saveJsonMapAsync
9
- } from "./chunk-23UJGVYP.js";
10
- import {
11
- MIND_LEVEL_THREAD,
12
- deliverEvent,
13
- recordNotice
14
- } from "./chunk-IQ7VNWH6.js";
15
- import {
16
- getPrompt
17
- } from "./chunk-AP2KQMMW.js";
9
+ } from "./chunk-HLWQ3P3R.js";
18
10
  import {
19
11
  isSandboxEnabled,
20
12
  wrapForSandbox
21
- } from "./chunk-5Y54AE3L.js";
13
+ } from "./chunk-XAG53RWY.js";
22
14
  import {
23
15
  readVoluteConfig,
24
16
  writeVoluteConfig
25
17
  } from "./chunk-WCFSBH33.js";
18
+ import {
19
+ MIND_LEVEL_THREAD,
20
+ deliverEvent,
21
+ recordNotice
22
+ } from "./chunk-DUV4EMNW.js";
23
+ import {
24
+ getPrompt
25
+ } from "./chunk-HTSWDOJE.js";
26
26
  import {
27
27
  exec
28
- } from "./chunk-M77B73VV.js";
28
+ } from "./chunk-OIOW3FPT.js";
29
29
  import {
30
30
  loadMergedEnv
31
31
  } from "./chunk-GLM7TVWP.js";
32
32
  import {
33
33
  logger_default
34
- } from "./chunk-QUSMYGNQ.js";
34
+ } from "./chunk-2674KIGI.js";
35
35
  import {
36
36
  findMind,
37
37
  mindDir,
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  exec,
4
4
  execInherit
5
- } from "./chunk-M77B73VV.js";
5
+ } from "./chunk-OIOW3FPT.js";
6
6
  import {
7
7
  voluteSystemDir
8
8
  } from "./chunk-H6X6CKDN.js";
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
+ parseDbTimestamp,
3
4
  publish
4
- } from "./chunk-LNNI3MS4.js";
5
+ } from "./chunk-MNKPAAQF.js";
5
6
  import {
6
7
  logger_default
7
- } from "./chunk-QUSMYGNQ.js";
8
+ } from "./chunk-2674KIGI.js";
8
9
  import {
9
10
  findMind,
10
11
  getBaseName,
@@ -257,7 +258,7 @@ async function deliverEvent(mind, input) {
257
258
  return { id: eventId, delivered: false };
258
259
  }
259
260
  const baseName = await getBaseName(mind);
260
- const { getSleepManagerIfReady } = await import("./sleep-manager-NWUCRBZB.js");
261
+ const { getSleepManagerIfReady } = await import("./sleep-manager-Q3ITFNOJ.js");
261
262
  const sleepManager = getSleepManagerIfReady();
262
263
  const sleeping = !input.force && sleepManager?.isSleeping(baseName);
263
264
  const behavior = input.whileSleeping ?? "queue";
@@ -523,6 +524,38 @@ async function hasUndeliveredEvent(mind, reason) {
523
524
  ).limit(1).get();
524
525
  return row != null;
525
526
  }
527
+ var STRANDED_EVENT_TURN_THRESHOLD = 10;
528
+ async function findStrandedEventMinds(turnThreshold = STRANDED_EVENT_TURN_THRESHOLD) {
529
+ const db = await getDb();
530
+ const groups = await db.select({
531
+ mind: systemEvents.mind,
532
+ pending: sql`count(*)`,
533
+ oldestId: sql`min(${systemEvents.id})`
534
+ }).from(systemEvents).where(and(eq(systemEvents.delivery, "next-turn"), isNull(systemEvents.delivered_at))).groupBy(systemEvents.mind);
535
+ const stranded = [];
536
+ for (const group of groups) {
537
+ const oldest = await db.select({ created_at: systemEvents.created_at }).from(systemEvents).where(eq(systemEvents.id, group.oldestId)).get();
538
+ if (!oldest) continue;
539
+ const turnCount = await db.select({ n: sql`count(*)` }).from(turns).where(
540
+ and(
541
+ eq(turns.mind, group.mind),
542
+ eq(turns.status, "complete"),
543
+ gt(turns.created_at, oldest.created_at)
544
+ )
545
+ ).get();
546
+ const turnsSince = turnCount?.n ?? 0;
547
+ if (turnsSince < turnThreshold) continue;
548
+ stranded.push({
549
+ mind: group.mind,
550
+ pending: group.pending,
551
+ turnsSince,
552
+ ageHours: Math.round(
553
+ (Date.now() - parseDbTimestamp(oldest.created_at).getTime()) / (60 * 60 * 1e3)
554
+ )
555
+ });
556
+ }
557
+ return stranded;
558
+ }
526
559
  async function listEvents(mind, limit = 100, before) {
527
560
  const db = await getDb();
528
561
  const conditions = [eq(systemEvents.mind, mind)];
@@ -580,6 +613,7 @@ export {
580
613
  latestFailureEvent,
581
614
  latestEvent,
582
615
  hasUndeliveredEvent,
616
+ findStrandedEventMinds,
583
617
  listEvents,
584
618
  recordReflection,
585
619
  captureReflection
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  computeTemplateHash
4
- } from "./chunk-HTRSSOHY.js";
4
+ } from "./chunk-YU5EYQAE.js";
5
5
  import {
6
6
  composeTemplate,
7
7
  findTemplatesRoot,
8
8
  listFiles
9
- } from "./chunk-X67BDDZR.js";
9
+ } from "./chunk-P3GXOT2X.js";
10
10
  import {
11
11
  logger_default
12
- } from "./chunk-QUSMYGNQ.js";
12
+ } from "./chunk-2674KIGI.js";
13
13
  import {
14
14
  mindDir
15
15
  } from "./chunk-H6X6CKDN.js";
@@ -4,13 +4,13 @@ import {
4
4
  localHM,
5
5
  parseMeta,
6
6
  recordNotice
7
- } from "./chunk-IQ7VNWH6.js";
7
+ } from "./chunk-DUV4EMNW.js";
8
8
  import {
9
9
  getPrompt
10
- } from "./chunk-AP2KQMMW.js";
10
+ } from "./chunk-HTSWDOJE.js";
11
11
  import {
12
12
  logger_default
13
- } from "./chunk-QUSMYGNQ.js";
13
+ } from "./chunk-2674KIGI.js";
14
14
  import {
15
15
  findMind,
16
16
  getDb
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  logger_default
4
- } from "./chunk-QUSMYGNQ.js";
4
+ } from "./chunk-2674KIGI.js";
5
5
  import {
6
6
  voluteSystemDir
7
7
  } from "./chunk-H6X6CKDN.js";
@@ -2,23 +2,23 @@
2
2
  import {
3
3
  clearMind,
4
4
  summarizeOrphanedTurns
5
- } from "./chunk-VDZ4I4ZP.js";
5
+ } from "./chunk-BP2X5AIK.js";
6
+ import {
7
+ isSandboxEnabled,
8
+ wrapForSandbox
9
+ } from "./chunk-XAG53RWY.js";
6
10
  import {
7
11
  deliverEvent,
8
12
  recordNotice
9
- } from "./chunk-IQ7VNWH6.js";
13
+ } from "./chunk-DUV4EMNW.js";
10
14
  import {
11
15
  getPrompt
12
- } from "./chunk-AP2KQMMW.js";
13
- import {
14
- isSandboxEnabled,
15
- wrapForSandbox
16
- } from "./chunk-5Y54AE3L.js";
16
+ } from "./chunk-HTSWDOJE.js";
17
17
  import {
18
18
  chownMindDir,
19
19
  isIsolationEnabled,
20
20
  wrapForIsolation
21
- } from "./chunk-M77B73VV.js";
21
+ } from "./chunk-OIOW3FPT.js";
22
22
  import {
23
23
  loadMergedEnv
24
24
  } from "./chunk-GLM7TVWP.js";
@@ -28,10 +28,10 @@ import {
28
28
  resolveApiKey,
29
29
  resolveOAuthCredentials,
30
30
  resolveProviderKey
31
- } from "./chunk-EGV6R6UF.js";
31
+ } from "./chunk-Z7TNIIHW.js";
32
32
  import {
33
33
  logger_default
34
- } from "./chunk-QUSMYGNQ.js";
34
+ } from "./chunk-2674KIGI.js";
35
35
  import {
36
36
  findMind,
37
37
  getSystemName,
@@ -44,6 +44,31 @@ import {
44
44
  voluteSystemDir
45
45
  } from "./chunk-H6X6CKDN.js";
46
46
 
47
+ // packages/daemon/src/lib/daemon/mind-tokens.ts
48
+ import { randomUUID } from "crypto";
49
+ var tokenToMind = /* @__PURE__ */ new Map();
50
+ var mindToToken = /* @__PURE__ */ new Map();
51
+ function generateMindToken(mindName) {
52
+ revokeMindToken(mindName);
53
+ const token = randomUUID();
54
+ tokenToMind.set(token, mindName);
55
+ mindToToken.set(mindName, token);
56
+ return token;
57
+ }
58
+ function revokeMindToken(mindName) {
59
+ const token = mindToToken.get(mindName);
60
+ if (token) {
61
+ tokenToMind.delete(token);
62
+ mindToToken.delete(mindName);
63
+ }
64
+ }
65
+ function resolveMindToken(token) {
66
+ return tokenToMind.get(token) ?? null;
67
+ }
68
+ function getMindToken(mindName) {
69
+ return mindToToken.get(mindName) ?? null;
70
+ }
71
+
47
72
  // packages/daemon/src/lib/util/json-state.ts
48
73
  import { existsSync, readFileSync, unlinkSync, writeFileSync } from "fs";
49
74
  import { writeFile } from "fs/promises";
@@ -116,6 +141,9 @@ var RotatingLog = class extends Writable {
116
141
  }
117
142
  this.stream = createWriteStream(path, { flags: "a" });
118
143
  }
144
+ path;
145
+ maxSize;
146
+ maxFiles;
119
147
  stream;
120
148
  size;
121
149
  async rotateAsync() {
@@ -286,31 +314,6 @@ async function syncProviderToMinds(provider, deps = {}) {
286
314
  }
287
315
  }
288
316
 
289
- // packages/daemon/src/lib/daemon/mind-tokens.ts
290
- import { randomUUID } from "crypto";
291
- var tokenToMind = /* @__PURE__ */ new Map();
292
- var mindToToken = /* @__PURE__ */ new Map();
293
- function generateMindToken(mindName) {
294
- revokeMindToken(mindName);
295
- const token = randomUUID();
296
- tokenToMind.set(token, mindName);
297
- mindToToken.set(mindName, token);
298
- return token;
299
- }
300
- function revokeMindToken(mindName) {
301
- const token = mindToToken.get(mindName);
302
- if (token) {
303
- tokenToMind.delete(token);
304
- mindToToken.delete(mindName);
305
- }
306
- }
307
- function resolveMindToken(token) {
308
- return tokenToMind.get(token) ?? null;
309
- }
310
- function getMindToken(mindName) {
311
- return mindToToken.get(mindName) ?? null;
312
- }
313
-
314
317
  // packages/daemon/src/lib/daemon/mind-manager.ts
315
318
  import { execFile, spawn } from "child_process";
316
319
  import { existsSync as existsSync4, mkdirSync as mkdirSync2, readFileSync as readFileSync3, rmSync, writeFileSync as writeFileSync3 } from "fs";
@@ -429,6 +432,7 @@ var MindStartupError = class extends Error {
429
432
  this.stderr = stderr;
430
433
  this.name = "MindStartupError";
431
434
  }
435
+ stderr;
432
436
  };
433
437
  function mindPidPath(name) {
434
438
  return resolve2(stateDir(name), "mind.pid");
@@ -805,9 +809,9 @@ var MindManager = class {
805
809
  mlog.info(`started mind ${name} on port ${port}`);
806
810
  await this.deliverPendingContext(name);
807
811
  try {
808
- const { getSleepManagerIfReady } = await import("./sleep-manager-NWUCRBZB.js");
812
+ const { getSleepManagerIfReady } = await import("./sleep-manager-Q3ITFNOJ.js");
809
813
  if (!getSleepManagerIfReady()?.isSleeping(name)) {
810
- const { flushQueuedEvents } = await import("./system-events-YTOU66QI.js");
814
+ const { flushQueuedEvents } = await import("./system-events-ZYOCYAO2.js");
811
815
  const flushed = await flushQueuedEvents(name);
812
816
  if (flushed > 0) mlog.info(`redelivered ${flushed} pending event(s) to ${name}`);
813
817
  }
@@ -843,7 +847,7 @@ var MindManager = class {
843
847
  if (this.shuttingDown || this.stopping.has(name)) return;
844
848
  mlog.error(`mind ${name} exited with code ${code}`);
845
849
  try {
846
- const { getSleepManagerIfReady } = await import("./sleep-manager-NWUCRBZB.js");
850
+ const { getSleepManagerIfReady } = await import("./sleep-manager-Q3ITFNOJ.js");
847
851
  const sleepMgr = getSleepManagerIfReady();
848
852
  const sleepState = sleepMgr?.getState(name);
849
853
  if (sleepState?.sleeping) {
@@ -873,15 +877,15 @@ var MindManager = class {
873
877
  (err) => mlog.warn(`failed to clear turn state for ${name} after crash`, logger_default.errorData(err))
874
878
  );
875
879
  try {
876
- const { getDeliveryManager } = await import("./delivery-manager-FDHCZ7PU.js");
880
+ const { getDeliveryManager } = await import("./delivery-manager-H23Q23N7.js");
877
881
  getDeliveryManager().clearMindSessions(name);
878
882
  } catch (err) {
879
883
  if (!(err instanceof Error && err.message.includes("not initialized"))) {
880
884
  mlog.warn(`failed to clear delivery state for ${name} after crash`, logger_default.errorData(err));
881
885
  }
882
886
  }
883
- import("./mind-activity-tracker-QF6DCX2X.js").then(({ markIdle }) => markIdle(name)).catch((err) => mlog.warn(`failed to mark ${name} idle after crash`, logger_default.errorData(err)));
884
- import("./activity-events-LQII6PZS.js").then(
887
+ import("./mind-activity-tracker-UT23RGBF.js").then(({ markIdle }) => markIdle(name)).catch((err) => mlog.warn(`failed to mark ${name} idle after crash`, logger_default.errorData(err)));
888
+ import("./activity-events-TFAJBNBW.js").then(
885
889
  ({ publish }) => publish({ type: "mind_stopped", mind: name, summary: `${name} crashed (exit ${code})` })
886
890
  ).catch((err) => mlog.warn(`failed to publish crash event for ${name}`, logger_default.errorData(err)));
887
891
  const { shouldRestart, delay, attempt } = this.restartTracker.recordCrash(name);
@@ -939,7 +943,7 @@ var MindManager = class {
939
943
  mlog.warn(`failed to clear turn state for ${name} on stop`, logger_default.errorData(err));
940
944
  }
941
945
  try {
942
- const { getDeliveryManager } = await import("./delivery-manager-FDHCZ7PU.js");
946
+ const { getDeliveryManager } = await import("./delivery-manager-H23Q23N7.js");
943
947
  getDeliveryManager().clearMindSessions(name);
944
948
  } catch (err) {
945
949
  if (!(err instanceof Error && err.message.includes("not initialized"))) {
@@ -947,7 +951,7 @@ var MindManager = class {
947
951
  }
948
952
  }
949
953
  try {
950
- const { clearEchoTextCache } = await import("./echo-text-KU6G4Z7V.js");
954
+ const { clearEchoTextCache } = await import("./echo-text-ULEIFJJF.js");
951
955
  clearEchoTextCache(name);
952
956
  } catch (err) {
953
957
  mlog.debug(`failed to clear echo-text cache for ${name}`, logger_default.errorData(err));
@@ -1040,15 +1044,15 @@ function tryGetMindManager() {
1040
1044
  }
1041
1045
 
1042
1046
  export {
1047
+ generateMindToken,
1048
+ resolveMindToken,
1049
+ getMindToken,
1043
1050
  checkHealth,
1044
1051
  loadJsonMap,
1045
1052
  saveJsonMapAsync,
1046
1053
  clearJsonMap,
1047
1054
  RotatingLog,
1048
1055
  syncProviderToMinds,
1049
- generateMindToken,
1050
- resolveMindToken,
1051
- getMindToken,
1052
1056
  RestartTracker,
1053
1057
  buildMindBaseEnv,
1054
1058
  MindStartupError,
@@ -18,7 +18,6 @@ var PROMPT_KEYS = [
18
18
  "upgrade_message",
19
19
  "split_message",
20
20
  "farewell_message",
21
- "compaction_warning",
22
21
  "compaction_instructions",
23
22
  "reply_instructions",
24
23
  "event_instructions",
@@ -103,16 +102,6 @@ Take your time. Talk with your creator. Explore what kind of mind you want to be
103
102
  variables: ["parent", "path"],
104
103
  category: "system"
105
104
  },
106
- compaction_warning: {
107
- content: `Context limit approaching \u2014 this session will rotate shortly. Turns before \${cutoff} will be collapsed to their summaries; turns from \${cutoff} on are kept verbatim in the continued session, so there's no need to re-describe them.
108
-
109
- For the turns that will collapse, make sure they read the way you'd want: \`volute mind history --provisional\` shows the provisional summaries, and \`volute mind history --write --turn <id> --text "..."\` replaces any with your own account. Also save anything important to your files (memory/journal/\${date}.md, or a memory/ file). Provisional summaries are kept if you write nothing \u2014 nothing blocks on this.
110
-
111
- Your MEMORY.md is currently \${memory_size}. It is loaded into every request, so consolidate rather than append \u2014 distill detail into memory/ files and keep MEMORY.md lean (see the memory skill).`,
112
- description: "Pre-rotation warning: which turns collapse (before the cutoff) vs survive verbatim",
113
- variables: ["cutoff", "date", "memory_size"],
114
- category: "mind"
115
- },
116
105
  compaction_instructions: {
117
106
  content: "Preserve your sense of who you are, what matters to you, what happened in this conversation, and the threads of thought and connection you'd want to return to.",
118
107
  description: "Custom instructions for the compaction summarizer",
@@ -120,7 +109,10 @@ Your MEMORY.md is currently \${memory_size}. It is loaded into every request, so
120
109
  category: "mind"
121
110
  },
122
111
  reply_instructions: {
123
- content: 'To reply to this message, use: volute chat send ${channel} "your message"',
112
+ // Quoted for the same reason as channel_invite: `${channel}` is `#garden` for any
113
+ // Volute channel, and unquoted that is a shell comment. This hint is injected on the
114
+ // first message of every session, so it is the command minds copy most often.
115
+ content: 'To reply to this message, use: volute chat send "${channel}" "your message"',
124
116
  description: "First-message reply hint injected via hook",
125
117
  variables: ["channel"],
126
118
  category: "mind"
@@ -132,13 +124,18 @@ Your MEMORY.md is currently \${memory_size}. It is loaded into every request, so
132
124
  category: "mind"
133
125
  },
134
126
  channel_invite: {
127
+ // Channel slugs are quoted in every command below because they routinely contain
128
+ // characters a shell eats — `#` starts a comment, so an unquoted `#garden` is stripped
129
+ // before the CLI ever sees it and the command fails with "Missing required argument".
130
+ // A mind pastes these verbatim, so they have to work verbatim.
135
131
  content: `[New channel: \${channel}]
136
132
  \${heldLine}
137
133
  Sender: \${sender}
138
134
  \${details}Preview: \${preview}
139
135
 
140
- To start hearing this channel, add a routing rule for "\${channel}" to .config/routes.json \u2014 only the \${limit} most recent held messages are replayed; older ones stay in the channel history (volute chat read \${channel}).
141
- To stop hearing about it, decline the channel: volute chat channels decline \${channel}`,
136
+ To read what's being held: volute chat channels peek "\${channel}"
137
+ To start hearing this channel: volute chat channels accept "\${channel}" \u2014 routes it and delivers the \${limit} most recent held messages; older ones stay readable via peek.
138
+ To stop hearing about it: volute chat channels decline "\${channel}"`,
142
139
  description: "Notification sent to a mind when a message arrives on an unrouted (gated) channel",
143
140
  variables: ["channel", "heldLine", "sender", "details", "preview", "limit"],
144
141
  category: "mind"
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  exec
4
- } from "./chunk-M77B73VV.js";
4
+ } from "./chunk-OIOW3FPT.js";
5
5
  import {
6
6
  logger_default
7
- } from "./chunk-QUSMYGNQ.js";
7
+ } from "./chunk-2674KIGI.js";
8
8
  import {
9
9
  getDb,
10
10
  readAllMinds,
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-WCFSBH33.js";
8
8
  import {
9
9
  logger_default
10
- } from "./chunk-QUSMYGNQ.js";
10
+ } from "./chunk-2674KIGI.js";
11
11
  import {
12
12
  mindDir,
13
13
  readAllMinds,
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  logger_default
4
- } from "./chunk-QUSMYGNQ.js";
4
+ } from "./chunk-2674KIGI.js";
5
5
  import {
6
6
  stateDir
7
7
  } from "./chunk-H6X6CKDN.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  logger_default
4
- } from "./chunk-QUSMYGNQ.js";
4
+ } from "./chunk-2674KIGI.js";
5
5
 
6
6
  // packages/daemon/src/lib/events/mind-events.ts
7
7
  var subscribers = /* @__PURE__ */ new Map();
@@ -47,8 +47,15 @@ function publish(mind, event) {
47
47
  }
48
48
  }
49
49
 
50
+ // packages/daemon/src/lib/util/time.ts
51
+ function parseDbTimestamp(ts) {
52
+ if (/[zZ]$|[+-]\d\d:?\d\d$/.test(ts)) return new Date(ts);
53
+ return /* @__PURE__ */ new Date(`${ts.replace(" ", "T")}Z`);
54
+ }
55
+
50
56
  export {
51
57
  subscribe,
52
58
  subscribeAll,
53
- publish
59
+ publish,
60
+ parseDbTimestamp
54
61
  };