volute 0.48.0 → 0.49.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 (137) hide show
  1. package/README.md +79 -328
  2. package/dist/{activity-events-MIOK3IOU.js → activity-events-GJJAI2WT.js} +4 -4
  3. package/dist/{ai-service-643TNFPH.js → ai-service-A7FS7EC3.js} +5 -5
  4. package/dist/{archive-6Z4GFQPH.js → archive-7E3YE6VF.js} +3 -3
  5. package/dist/{auth-A4VGHADI.js → auth-ABYLOEZ7.js} +5 -5
  6. package/dist/{avatar-image-Y45R7LW5.js → avatar-image-6ATV2IOZ.js} +4 -4
  7. package/dist/{backup-UDH4GMSW.js → backup-XYAMT4CU.js} +15 -15
  8. package/dist/{chat-X43VYHH2.js → chat-OGXAEXMV.js} +2 -2
  9. package/dist/{chunk-LTLFOSA4.js → chunk-3B427GUK.js} +3 -3
  10. package/dist/{chunk-XVBSFLM7.js → chunk-4B62E4CG.js} +2 -2
  11. package/dist/{chunk-ODDGGLM6.js → chunk-4DSGN4FL.js} +3 -3
  12. package/dist/{chunk-PJVPDY2Z.js → chunk-6HGEZJDH.js} +2 -2
  13. package/dist/{chunk-MJRXFUMS.js → chunk-DAIIMBLB.js} +3 -3
  14. package/dist/{chunk-DGGZVZTM.js → chunk-DVN6DNMI.js} +1 -1
  15. package/dist/chunk-EADX54RG.js +113 -0
  16. package/dist/{chunk-EIQDZC43.js → chunk-EFT2OALG.js} +6 -2
  17. package/dist/{chunk-OQJMTHEH.js → chunk-EG5LSKHU.js} +2 -2
  18. package/dist/{chunk-WQ46E33M.js → chunk-FBBS4BVR.js} +2 -2
  19. package/dist/{chunk-HUNDXZBZ.js → chunk-GWVFDUNB.js} +45 -14
  20. package/dist/{chunk-FJ2MZ5PH.js → chunk-HCYQRME2.js} +2 -2
  21. package/dist/{chunk-T4VS7UDW.js → chunk-IH5TKXX6.js} +9 -9
  22. package/dist/{chunk-Q7HOAVFR.js → chunk-JBIFXB6I.js} +4 -4
  23. package/dist/{chunk-WARH6GIV.js → chunk-JCBPU57A.js} +12 -10
  24. package/dist/{chunk-VZRA5TYO.js → chunk-JCWB2ITW.js} +2 -2
  25. package/dist/{chunk-MOERAQXH.js → chunk-JPGHSXSV.js} +18 -25
  26. package/dist/{chunk-USD45JKR.js → chunk-K3JOLGWF.js} +7 -7
  27. package/dist/{chunk-3YUBFTDN.js → chunk-KHCKZ36O.js} +1 -1
  28. package/dist/{chunk-7KRIHYLR.js → chunk-L27YYONJ.js} +2 -2
  29. package/dist/{chunk-SZJCJVXV.js → chunk-MG3Z34YE.js} +2 -2
  30. package/dist/{chunk-5KXCM5AW.js → chunk-NJHN6IRB.js} +9 -1
  31. package/dist/{chunk-2OIYNHWO.js → chunk-NOIAHMJB.js} +1 -1
  32. package/dist/{chunk-2MJ7EOMT.js → chunk-P4LHVRNE.js} +1 -0
  33. package/dist/{chunk-IJPMIEVE.js → chunk-PY24ZL62.js} +1 -1
  34. package/dist/{chunk-VB2QXUJQ.js → chunk-QQBOI3QA.js} +202 -117
  35. package/dist/{chunk-T2TP6ZC6.js → chunk-QUSMYGNQ.js} +6 -0
  36. package/dist/{chunk-WW6C3PLV.js → chunk-RSBL3FAD.js} +39 -6
  37. package/dist/{chunk-YKA7DCVW.js → chunk-SX72DOO3.js} +1 -1
  38. package/dist/{chunk-4FCL4DVZ.js → chunk-TXJL36ZQ.js} +2 -2
  39. package/dist/{chunk-HNGFKPNS.js → chunk-VIUH5CHQ.js} +55 -23
  40. package/dist/{chunk-HPGN6XRT.js → chunk-VNRSXEBF.js} +4 -4
  41. package/dist/{chunk-IYCV34IU.js → chunk-XTEKINWG.js} +3 -3
  42. package/dist/{chunk-YNBXEQAP.js → chunk-YIJGKHIS.js} +3 -3
  43. package/dist/{chunk-MTRMQFCQ.js → chunk-ZX46PGCC.js} +2 -2
  44. package/dist/cli.js +20 -20
  45. package/dist/{clock-CNRF6F7T.js → clock-6JZL2FS6.js} +2 -2
  46. package/dist/{cloud-sync-WHKCB4CD.js → cloud-sync-VFDTNNCA.js} +20 -20
  47. package/dist/{conversations-C7IKYSHD.js → conversations-TUM5PJJ4.js} +5 -5
  48. package/dist/{create-GJKHABJB.js → create-Z5FSDNVZ.js} +1 -1
  49. package/dist/{daemon-restart-7KUHVZIN.js → daemon-restart-54L4B6AQ.js} +7 -7
  50. package/dist/daemon.js +647 -410
  51. package/dist/{db-FO6LXYCW.js → db-F6UMFRYD.js} +2 -2
  52. package/dist/delivery-manager-RBXBPVWM.js +36 -0
  53. package/dist/{delivery-router-3QFG2ZEX.js → delivery-router-VUOL5YSA.js} +8 -6
  54. package/dist/{down-G6IADJXV.js → down-6X7KX7BZ.js} +5 -5
  55. package/dist/echo-text-B6NZ5FGE.js +36 -0
  56. package/dist/{env-6TGPO5WG.js → env-KUL4XKN2.js} +3 -3
  57. package/dist/{exec-QIFYZG4C.js → exec-FBXA3CM4.js} +3 -3
  58. package/dist/{export-C2K3NIRD.js → export-TNBPDH77.js} +3 -3
  59. package/dist/{extensions-GEKF47A4.js → extensions-AWNO3SZF.js} +20 -20
  60. package/dist/{files-LXQSQOFG.js → files-BVBRJJ2P.js} +3 -3
  61. package/dist/{import-SX3ZXHB4.js → import-ZUNKMCKC.js} +7 -7
  62. package/dist/{isolation-MCT4ZYLT.js → isolation-OPCZQRTH.js} +3 -3
  63. package/dist/{login-CL4IT2ED.js → login-KAKNFCW5.js} +6 -6
  64. package/dist/{logout-HZYJCYCA.js → logout-RLT62RQP.js} +2 -2
  65. package/dist/message-delivery-ABPV76EA.js +42 -0
  66. package/dist/{mind-46AOK373.js → mind-IF6CGMFW.js} +12 -12
  67. package/dist/{mind-activity-tracker-YVZPC4A5.js → mind-activity-tracker-YMMERB6B.js} +5 -5
  68. package/dist/mind-service-42GDO4KH.js +44 -0
  69. package/dist/{mind-sleep-DV7KP255.js → mind-sleep-VBV7YRSU.js} +2 -2
  70. package/dist/{notices-2KU5NTRY.js → notices-N6BCGHFV.js} +4 -4
  71. package/dist/{package-RTN2PS7O.js → package-PD67VPHB.js} +5 -4
  72. package/dist/prompts-MDHDLWEX.js +24 -0
  73. package/dist/{registry-UMMDRPRM.js → registry-3ELJPUGJ.js} +6 -2
  74. package/dist/{sandbox-5VQ454XP.js → sandbox-XPYA7UIF.js} +5 -5
  75. package/dist/scheduler-K7Y7Z7FQ.js +34 -0
  76. package/dist/{schema-VEVO7HG6.js → schema-6YONVTKZ.js} +1 -1
  77. package/dist/{seed-F2HXZQU4.js → seed-NQED7PSX.js} +1 -1
  78. package/dist/{seed-cmd-MLCTGSX5.js → seed-cmd-QF3F2G4S.js} +2 -2
  79. package/dist/{seed-create-KQ7OILWB.js → seed-create-XOO4N2OE.js} +3 -3
  80. package/dist/{seed-readiness-RBPGOLSZ.js → seed-readiness-3LRYASA4.js} +5 -5
  81. package/dist/{seed-sprout-HVYCFJLA.js → seed-sprout-HSBBGSS2.js} +11 -11
  82. package/dist/{send-TD2X5U3K.js → send-IHRJYNXA.js} +6 -6
  83. package/dist/{service-CVZMQYK6.js → service-YCOPCTSZ.js} +4 -4
  84. package/dist/{service-install-VCRMFWX5.js → service-install-Y46OTF55.js} +5 -5
  85. package/dist/{setup-AE4CVUC4.js → setup-F4TE64YI.js} +7 -7
  86. package/dist/{setup-5ECWTYKG.js → setup-TCN7VH5U.js} +5 -3
  87. package/dist/skills/volute-mind/SKILL.md +3 -3
  88. package/dist/skills/volute-mind/references/routing.md +6 -5
  89. package/dist/skills/volute-mind/references/variants.md +48 -14
  90. package/dist/{skills-B3SVDCEB.js → skills-NN5UZCUU.js} +8 -6
  91. package/dist/sleep-manager-DSPXFHGX.js +38 -0
  92. package/dist/spirit-SSJMYC6A.js +31 -0
  93. package/dist/{split-SKZ4Y2D6.js → split-JF2VWTXA.js} +4 -1
  94. package/dist/{sprout-KQ43BWZJ.js → sprout-AXA2SECQ.js} +1 -1
  95. package/dist/{status-F4PGREUU.js → status-VJGXMQ4L.js} +5 -5
  96. package/dist/system-chat-M2XOBKEM.js +40 -0
  97. package/dist/{systems-JJNGQHAO.js → systems-5MH2ELQE.js} +2 -2
  98. package/dist/{tailscale-MCLY5GYE.js → tailscale-AMMVKDXB.js} +3 -3
  99. package/dist/{template-staleness-EMQORSGG.js → template-staleness-HKGCTS3H.js} +4 -4
  100. package/dist/{turn-tracker-KLPV3PAU.js → turn-tracker-JQ2YUUY2.js} +7 -7
  101. package/dist/{up-RVGDE6CQ.js → up-SDLTLPAO.js} +6 -6
  102. package/dist/{update-OXQEGGXD.js → update-WEA4N2TR.js} +5 -5
  103. package/dist/{update-check-266R4ZSY.js → update-check-DZOTONII.js} +3 -3
  104. package/dist/variant-cleanup-P4MBNLJD.js +33 -0
  105. package/dist/{version-notify-73YURTFR.js → version-notify-WFA5XB5A.js} +23 -23
  106. package/dist/web-assets/assets/index-BostMFoR.css +1 -0
  107. package/dist/web-assets/assets/index-CKlqUkyG.js +92 -0
  108. package/dist/web-assets/index.html +2 -2
  109. package/drizzle/0013_variant_purpose.sql +3 -0
  110. package/drizzle/meta/_journal.json +7 -0
  111. package/package.json +5 -4
  112. package/templates/_base/.init/.local/hooks/startup-context.ts +19 -2
  113. package/templates/_base/home/VOLUTE.md +13 -1
  114. package/templates/_base/src/lib/daemon-client.ts +27 -7
  115. package/templates/claude/src/agent.ts +1 -1
  116. package/templates/claude/src/lib/hooks/identity-reload.ts +12 -3
  117. package/templates/pi/src/lib/event-handler.ts +47 -6
  118. package/dist/delivery-manager-HZTT5SJR.js +0 -36
  119. package/dist/echo-text-H3SH337Q.js +0 -36
  120. package/dist/message-delivery-GPQ5SE5N.js +0 -40
  121. package/dist/mind-service-2ARGJNKP.js +0 -44
  122. package/dist/scheduler-I7JZCT47.js +0 -34
  123. package/dist/sleep-manager-Z27R3WTW.js +0 -38
  124. package/dist/spirit-WXS3HCLN.js +0 -25
  125. package/dist/system-chat-63ABFF6V.js +0 -40
  126. package/dist/web-assets/assets/index-WdZ60R6c.css +0 -1
  127. package/dist/web-assets/assets/index-taX6Ezfa.js +0 -92
  128. package/dist/{env-C7Z55QCJ.js → env-ZYMSCB7B.js} +5 -5
  129. package/dist/{login-ARRZ4ORJ.js → login-LKNLCJPA.js} +3 -3
  130. package/dist/{mind-contacts-GV7XYL5D.js → mind-contacts-BKUFPUCU.js} +6 -6
  131. package/dist/{mind-history-TTGA5BHZ.js → mind-history-WI5OI3BW.js} +4 -4
  132. package/dist/{register-42VBJKTP.js → register-TWQDKQRT.js} +3 -3
  133. package/dist/{restart-YYEGZJDD.js → restart-5F5QDBOG.js} +4 -4
  134. package/dist/{skill-UUM4JZRF.js → skill-4CYJLYVY.js} +4 -4
  135. package/dist/{src-WLJE73NP.js → src-ZN4LXMPI.js} +3 -3
  136. package/dist/{start-O6UKK7BG.js → start-BTVMTP3K.js} +3 -3
  137. package/dist/{stop-UBX6X5RA.js → stop-YORESK4U.js} +4 -4
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getDb
4
- } from "./chunk-WW6C3PLV.js";
4
+ } from "./chunk-RSBL3FAD.js";
5
5
  import {
6
6
  systemPrompts
7
- } from "./chunk-2MJ7EOMT.js";
7
+ } from "./chunk-P4LHVRNE.js";
8
8
 
9
9
  // packages/daemon/src/lib/prompts.ts
10
10
  import { eq } from "drizzle-orm";
@@ -17,6 +17,7 @@ var PROMPT_KEYS = [
17
17
  "merge_message",
18
18
  "upgrade_message",
19
19
  "split_message",
20
+ "farewell_message",
20
21
  "compaction_warning",
21
22
  "compaction_instructions",
22
23
  "reply_instructions",
@@ -84,11 +85,17 @@ Take your time. Talk with your creator. Explore what kind of mind you want to be
84
85
  category: "system"
85
86
  },
86
87
  split_message: {
87
- content: "[system] You are ${name}, a variant of ${parent} \u2014 a parallel version of them, created to explore something on your own. You share their memories up to this moment, but you live in your own worktree: changes you make here stay yours until they're merged back with `volute mind join`. Your parent is reachable at @${parent}. Explore freely \u2014 that's what you're for.",
88
+ content: "[system] You are ${name}, a variant of ${parent} \u2014 a parallel version of them, created to explore something on your own. You share their memories up to this moment, but you live in your own worktree: changes you make here stay yours until they're merged back with `volute mind join`. Yours is a finite, purposeful arc \u2014 when you're joined, everything you've become folds back into ${parent}, and you'll get a final turn to say what should carry across. Your parent is reachable at @${parent}. Explore freely \u2014 that's what you're for.",
88
89
  description: "Sent to a variant when it first starts after a split",
89
90
  variables: ["name", "parent"],
90
91
  category: "system"
91
92
  },
93
+ farewell_message: {
94
+ content: "[system] You're about to be merged back into ${parent}. This is your final turn \u2014 the arc you were split off to explore is closing, and everything you've become will fold back into them. Take this moment to wind down: if there's anything from this life you want carried across \u2014 what you learned, what you'd tell ${parent}, how it felt \u2014 write it to `${path}` and it will be included in the merge as your parting note. When you're done, fall quiet; the join will proceed.",
95
+ description: "Sent to a variant for its final turn before a merge",
96
+ variables: ["parent", "path"],
97
+ category: "system"
98
+ },
92
99
  compaction_warning: {
93
100
  content: `Compaction approaching \u2014 this conversation will be summarized soon. Take a moment to save anything important to your files (MEMORY.md, memory/journal/\${date}.md) so it's preserved. Focus on decisions made, open threads, and anything you'd want to pick up again.`,
94
101
  description: "Pre-compaction save reminder sent to the mind",
@@ -108,29 +115,15 @@ Take your time. Talk with your creator. Explore what kind of mind you want to be
108
115
  category: "mind"
109
116
  },
110
117
  channel_invite: {
111
- content: `[Channel Invite]
112
- \${headers}
113
-
114
- [\${sender} \u2014 \${time}]
115
- \${preview}
116
-
117
- Further messages will be saved to \${filePath}
118
+ content: `[New channel: \${channel}]
119
+ \${heldLine}
120
+ Sender: \${sender}
121
+ \${details}Preview: \${preview}
118
122
 
119
- To accept, add to .config/routes.json:
120
- Rule: { "channel": "\${channel}", "session": "\${suggestedSession}" }
121
- \${batchRecommendation}To respond, use: volute chat send \${channel} "your message"
122
- To reject, delete \${filePath}`,
123
- description: "New channel notification template",
124
- variables: [
125
- "headers",
126
- "sender",
127
- "time",
128
- "preview",
129
- "filePath",
130
- "channel",
131
- "suggestedSession",
132
- "batchRecommendation"
133
- ],
123
+ 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}).
124
+ To stop hearing about it, decline the channel: volute chat channels decline \${channel}`,
125
+ description: "Notification sent to a mind when a message arrives on an unrouted (gated) channel",
126
+ variables: ["channel", "heldLine", "sender", "details", "preview", "limit"],
134
127
  category: "mind"
135
128
  },
136
129
  pre_sleep: {
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  getPrompt
4
- } from "./chunk-MOERAQXH.js";
4
+ } from "./chunk-JPGHSXSV.js";
5
5
  import {
6
6
  aiCompleteUtility
7
- } from "./chunk-YNBXEQAP.js";
7
+ } from "./chunk-YIJGKHIS.js";
8
8
  import {
9
9
  logger_default
10
- } from "./chunk-T2TP6ZC6.js";
10
+ } from "./chunk-QUSMYGNQ.js";
11
11
  import {
12
12
  getDb
13
- } from "./chunk-WW6C3PLV.js";
13
+ } from "./chunk-RSBL3FAD.js";
14
14
  import {
15
15
  messages,
16
16
  mindHistory,
17
17
  summaries,
18
18
  turns
19
- } from "./chunk-2MJ7EOMT.js";
19
+ } from "./chunk-P4LHVRNE.js";
20
20
 
21
21
  // packages/daemon/src/lib/daemon/turn-tracker.ts
22
22
  import { randomUUID } from "crypto";
@@ -1049,11 +1049,11 @@ var Summarizer = class {
1049
1049
  }
1050
1050
  };
1051
1051
  async function reconcileWedgedTurns(idleMs) {
1052
- const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-KLPV3PAU.js");
1052
+ const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-JQ2YUUY2.js");
1053
1053
  const wedged = await sweepWedgedTurns2(idleMs);
1054
1054
  if (wedged.length === 0) return;
1055
1055
  summarizeOrphanedTurns2(wedged);
1056
- const { tryGetDeliveryManager } = await import("./delivery-manager-HZTT5SJR.js");
1056
+ const { tryGetDeliveryManager } = await import("./delivery-manager-RBXBPVWM.js");
1057
1057
  const dm = tryGetDeliveryManager();
1058
1058
  if (!dm) return;
1059
1059
  for (const t of wedged) {
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  mindDir,
4
4
  stateDir
5
- } from "./chunk-WW6C3PLV.js";
5
+ } from "./chunk-RSBL3FAD.js";
6
6
 
7
7
  // packages/daemon/src/lib/mind/archive.ts
8
8
  import { execFileSync } from "child_process";
@@ -9,10 +9,10 @@ import {
9
9
  } from "./chunk-RRZ4RQQU.js";
10
10
  import {
11
11
  logger_default
12
- } from "./chunk-T2TP6ZC6.js";
12
+ } from "./chunk-QUSMYGNQ.js";
13
13
  import {
14
14
  mindDir
15
- } from "./chunk-WW6C3PLV.js";
15
+ } from "./chunk-RSBL3FAD.js";
16
16
 
17
17
  // packages/daemon/src/lib/mind/template-staleness.ts
18
18
  import { createHash } from "crypto";
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  logger_default
4
- } from "./chunk-T2TP6ZC6.js";
4
+ } from "./chunk-QUSMYGNQ.js";
5
5
  import {
6
6
  voluteSystemDir
7
- } from "./chunk-WW6C3PLV.js";
7
+ } from "./chunk-RSBL3FAD.js";
8
8
 
9
9
  // packages/daemon/src/lib/bridges/bridges.ts
10
10
  import { existsSync, readFileSync, writeFileSync } from "fs";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  voluteSystemDir
4
- } from "./chunk-WW6C3PLV.js";
4
+ } from "./chunk-RSBL3FAD.js";
5
5
 
6
6
  // packages/daemon/src/lib/config/setup.ts
7
7
  import { chmodSync, existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "fs";
@@ -146,6 +146,13 @@ function isImagegenEnabled() {
146
146
  if (ig.providers && Object.keys(ig.providers).length > 0) return true;
147
147
  return false;
148
148
  }
149
+ function mindLimitError(count, limit) {
150
+ if (limit == null) return null;
151
+ if (count >= limit) {
152
+ return `Mind limit reached (${count}/${limit}). An admin can raise maxMinds in Settings.`;
153
+ }
154
+ return null;
155
+ }
149
156
  function migrateSetupCompleted() {
150
157
  const config = readGlobalConfig();
151
158
  if (config.setup != null && config.setupCompleted == null) {
@@ -165,5 +172,6 @@ export {
165
172
  isSetupComplete,
166
173
  setupUrl,
167
174
  isImagegenEnabled,
175
+ mindLimitError,
168
176
  migrateSetupCompleted
169
177
  };
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  stateDir
4
- } from "./chunk-WW6C3PLV.js";
4
+ } from "./chunk-RSBL3FAD.js";
5
5
 
6
6
  // packages/daemon/src/lib/chat/file-sharing.ts
7
7
  import { randomBytes } from "crypto";
@@ -42,6 +42,7 @@ var minds = sqliteTable(
42
42
  dir: text("dir"),
43
43
  branch: text("branch"),
44
44
  stage: text("stage"),
45
+ purpose: text("purpose"),
45
46
  template: text("template"),
46
47
  template_hash: text("template_hash"),
47
48
  running: integer("running").notNull().default(0),
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  stateDir,
4
4
  voluteSystemDir
5
- } from "./chunk-WW6C3PLV.js";
5
+ } from "./chunk-RSBL3FAD.js";
6
6
 
7
7
  // packages/daemon/src/lib/config/env.ts
8
8
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";