volute 0.43.1 → 0.45.1

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 (132) hide show
  1. package/dist/{activity-events-UISXY4Y5.js → activity-events-OMCSM7XW.js} +3 -3
  2. package/dist/{ai-service-FBCCEYF5.js → ai-service-534WUSDL.js} +4 -4
  3. package/dist/{archive-I32WHCJB.js → archive-6R4TZMYI.js} +3 -3
  4. package/dist/{auth-3RIG6GKN.js → auth-FRZJVQCS.js} +4 -4
  5. package/dist/avatar-image-BNWEXSA2.js +16 -0
  6. package/dist/backup-OZXHL3JS.js +381 -0
  7. package/dist/{chat-SDSX5TVV.js → chat-I4EDDIQC.js} +2 -2
  8. package/dist/{chunk-AD46AYZQ.js → chunk-2BONPXAF.js} +1 -1
  9. package/dist/{chunk-ONM2AZFL.js → chunk-322KE457.js} +14 -2
  10. package/dist/{chunk-PGPLCJPK.js → chunk-3ERIL673.js} +1 -1
  11. package/dist/{chunk-QQ2MVQU3.js → chunk-5AUKCNPE.js} +10 -10
  12. package/dist/{chunk-XDTKJNW5.js → chunk-5GT7URXJ.js} +1 -1
  13. package/dist/{chunk-DMUPZQWP.js → chunk-77BVGCTZ.js} +8 -8
  14. package/dist/{chunk-EFL5UOY4.js → chunk-CYI534DJ.js} +3 -3
  15. package/dist/{chunk-57LBQ7JX.js → chunk-FHWUQZXE.js} +1 -1
  16. package/dist/{chunk-YAMO2U3N.js → chunk-H7IYFRAL.js} +1 -1
  17. package/dist/{chunk-M3PGGSBH.js → chunk-HVU45COX.js} +1 -1
  18. package/dist/{chunk-O3DXAR44.js → chunk-IEWZ7VD7.js} +2 -2
  19. package/dist/{chunk-DE4EKQFH.js → chunk-IUXTYXFI.js} +3 -3
  20. package/dist/{chunk-K4EHBHPE.js → chunk-JSRMEY52.js} +7 -5
  21. package/dist/{chunk-QHG4OMZL.js → chunk-KDLYIECM.js} +37 -32
  22. package/dist/{chunk-EE7SZJON.js → chunk-KP3KWNG6.js} +2 -2
  23. package/dist/chunk-KVKP6VQ5.js +318 -0
  24. package/dist/{chunk-JVK6QQIC.js → chunk-LAXUUY7O.js} +2 -2
  25. package/dist/{chunk-C6ESRQZ7.js → chunk-OXXTPILE.js} +1 -1
  26. package/dist/{chunk-ATEX3ZPG.js → chunk-Q2XBKQ2D.js} +2 -2
  27. package/dist/{chunk-GZJFC76M.js → chunk-QMJJWTNL.js} +1 -1
  28. package/dist/chunk-SQL7M4HJ.js +120 -0
  29. package/dist/{chunk-YSV3VJQK.js → chunk-TSK5PI4L.js} +1 -1
  30. package/dist/{chunk-4SVONUTC.js → chunk-U4FNXDEJ.js} +350 -207
  31. package/dist/{chunk-2HIVYZDB.js → chunk-UMI4UIJG.js} +1 -1
  32. package/dist/{chunk-Y6O35D7K.js → chunk-V4GYPD5L.js} +41 -16
  33. package/dist/{chunk-KINGVQSR.js → chunk-Y6OPHHGM.js} +5 -5
  34. package/dist/{chunk-SPLPKBES.js → chunk-ZIR7HSAX.js} +6 -9
  35. package/dist/{chunk-7G2EEYXX.js → chunk-ZMIMSIIT.js} +2 -2
  36. package/dist/{chunk-L3IV23ZG.js → chunk-ZV7MFISX.js} +2 -0
  37. package/dist/cli.js +53 -22
  38. package/dist/{cloud-sync-KOEBUFW5.js → cloud-sync-Y7LQPRE3.js} +16 -16
  39. package/dist/{conversations-67WWW25C.js → conversations-G4LYMHAA.js} +4 -4
  40. package/dist/{create-7W3LV3J7.js → create-2YY7IPMS.js} +1 -1
  41. package/dist/{daemon-restart-EZXB73W7.js → daemon-restart-ABP54YN6.js} +7 -7
  42. package/dist/daemon.js +679 -478
  43. package/dist/{db-CZV62BOQ.js → db-JFLCJCUG.js} +2 -2
  44. package/dist/{db-IJL6B26S.js → db-LZTLA7XC.js} +1 -1
  45. package/dist/delivery-manager-R5STGLXB.js +32 -0
  46. package/dist/{delivery-router-HXBHYHJM.js → delivery-router-6DE3BPHO.js} +3 -3
  47. package/dist/{down-RRNYIGCU.js → down-XCAZXWLB.js} +5 -5
  48. package/dist/echo-text-NQXYYYCU.js +32 -0
  49. package/dist/{exec-SJK7VUTC.js → exec-4GWHAHS3.js} +3 -3
  50. package/dist/{export-7LPCIB5J.js → export-ID7YUSLZ.js} +3 -3
  51. package/dist/{extensions-PQPZT6LS.js → extensions-AYSPKE33.js} +16 -16
  52. package/dist/{files-LV7VAKPC.js → files-BQ2WB5KC.js} +3 -3
  53. package/dist/{import-XPECCRQ7.js → import-SKID37QX.js} +6 -6
  54. package/dist/{isolation-5AYEY55P.js → isolation-5MB3J73F.js} +3 -3
  55. package/dist/{login-KJSN4JDA.js → login-LM4NF4ZB.js} +2 -2
  56. package/dist/{logout-TMJGUQV2.js → logout-CTJVIZGA.js} +2 -2
  57. package/dist/message-delivery-IUAXRPFE.js +34 -0
  58. package/dist/{mind-G3WEWDM4.js → mind-KLHC7XYR.js} +6 -6
  59. package/dist/{mind-activity-tracker-JHAT6456.js → mind-activity-tracker-BGHJE7XA.js} +4 -4
  60. package/dist/mind-service-BF2LUQMH.js +36 -0
  61. package/dist/{package-24TL6DTF.js → package-BMHV7UHN.js} +1 -1
  62. package/dist/{registry-7LQHTRUX.js → registry-NUJAGLQJ.js} +2 -2
  63. package/dist/{sandbox-SJH3XOPZ.js → sandbox-72MWV4JL.js} +4 -4
  64. package/dist/scheduler-YHJRRV6E.js +30 -0
  65. package/dist/{schema-LRUTFOER.js → schema-PVNG3PQM.js} +1 -1
  66. package/dist/{seed-HHSJTM6O.js → seed-4MKQ5QKG.js} +1 -1
  67. package/dist/{seed-cmd-UPQY35RG.js → seed-cmd-LCXMR7VV.js} +2 -2
  68. package/dist/{seed-create-MDRMXMSB.js → seed-create-N2BF5LQX.js} +3 -3
  69. package/dist/{seed-sprout-4M7IQWMH.js → seed-sprout-6ZDP23YI.js} +7 -7
  70. package/dist/{send-ZBZWIH5V.js → send-O6W53VBM.js} +37 -42
  71. package/dist/{service-4EVZKGSA.js → service-AQVPUANO.js} +4 -4
  72. package/dist/{service-install-SHRM6NHK.js → service-install-4QNUDKLM.js} +5 -5
  73. package/dist/{setup-ZD2LMBR3.js → setup-3O6O2JZ7.js} +7 -7
  74. package/dist/{setup-25MMJ3J4.js → setup-73YBJZQL.js} +3 -3
  75. package/dist/skills/memory/SKILL.md +2 -1
  76. package/dist/skills/orientation/SKILL.md +1 -1
  77. package/dist/skills/plan-coordinator/SKILL.md +2 -2
  78. package/dist/skills/volute-admin/SKILL.md +9 -6
  79. package/dist/skills/volute-mind/SKILL.md +15 -16
  80. package/dist/skills/volute-mind/references/extensions.md +5 -3
  81. package/dist/skills/volute-mind/references/integrations.md +2 -2
  82. package/dist/skills/volute-mind/references/routing.md +19 -23
  83. package/dist/skills/volute-mind/references/variants.md +10 -8
  84. package/dist/{skills-4KQ377GN.js → skills-ND4ZFYUW.js} +5 -5
  85. package/dist/sleep-manager-YAHDOIU5.js +34 -0
  86. package/dist/{spirit-53DQPRNR.js → spirit-II3HOERM.js} +7 -7
  87. package/dist/{sprout-YKM2M6D6.js → sprout-4KUG76AQ.js} +1 -1
  88. package/dist/{src-O4PRLMKM.js → src-JAOVXO5W.js} +1 -0
  89. package/dist/{src-3EGHHKZK.js → src-XFY3XDD6.js} +16 -11
  90. package/dist/{src-L2Z7X5UT.js → src-YH6PQ7LJ.js} +264 -52
  91. package/dist/{status-WTU2WHXY.js → status-E5DQNCAO.js} +5 -5
  92. package/dist/system-chat-E65T2HSW.js +34 -0
  93. package/dist/{tailscale-Q7ZJL7S7.js → tailscale-QAWVKQKU.js} +2 -2
  94. package/dist/{turn-tracker-JZYERJ76.js → turn-tracker-QQIVVXBI.js} +7 -5
  95. package/dist/{up-LFZA4GI5.js → up-LG56MPBI.js} +6 -6
  96. package/dist/{update-EJ7Q77ZX.js → update-7TYVH5FM.js} +5 -5
  97. package/dist/{update-check-ACYYNKTW.js → update-check-VSCSJ7KX.js} +3 -3
  98. package/dist/{upgrade-37DAGF6H.js → upgrade-NWAZ7MLD.js} +1 -1
  99. package/dist/{version-notify-SRQJCQEK.js → version-notify-CODJOUW2.js} +17 -17
  100. package/dist/web-assets/assets/index-B1JBQv2m.css +1 -0
  101. package/dist/web-assets/assets/index-Dac11sKB.js +86 -0
  102. package/dist/web-assets/ext-theme.css +5 -0
  103. package/dist/web-assets/index.html +2 -2
  104. package/package.json +1 -1
  105. package/packages/extensions/notes/dist/ui/assets/{index-BbgANhFm.js → index-D0-DgYyj.js} +1 -1
  106. package/packages/extensions/notes/dist/ui/index.html +1 -1
  107. package/packages/extensions/notes/skills/notes/SKILL.md +31 -3
  108. package/packages/extensions/pages/dist/ui/assets/{index-Dxk-DYrf.js → index-CQjEQg1r.js} +1 -1
  109. package/packages/extensions/pages/dist/ui/index.html +1 -1
  110. package/packages/extensions/plan/skills/plan/SKILL.md +1 -1
  111. package/templates/_base/.init/.config/prompts.json +1 -1
  112. package/templates/_base/.init/.local/hooks/startup-context.ts +21 -4
  113. package/templates/_base/.init/MEMORY.md +2 -1
  114. package/templates/_base/home/VOLUTE.md +6 -9
  115. package/templates/_base/src/lib/startup.ts +1 -1
  116. package/templates/claude/.init/CLAUDE.md +1 -1
  117. package/templates/claude/src/agent.ts +30 -3
  118. package/templates/claude/src/lib/stream-consumer.ts +7 -4
  119. package/templates/codex/.init/AGENTS.md +4 -2
  120. package/templates/codex/src/agent.ts +13 -7
  121. package/templates/pi/.init/MINDS.md +4 -2
  122. package/templates/pi/src/lib/event-handler.ts +6 -2
  123. package/dist/delivery-manager-OMCCJEVP.js +0 -32
  124. package/dist/echo-text-KFSUCZXL.js +0 -32
  125. package/dist/message-delivery-HRGFNWO7.js +0 -34
  126. package/dist/mind-service-2C7AINBO.js +0 -36
  127. package/dist/scheduler-VON2TB52.js +0 -30
  128. package/dist/sleep-manager-AG5SQDDI.js +0 -34
  129. package/dist/system-chat-54RN3K67.js +0 -34
  130. package/dist/web-assets/assets/index-D7udpBCx.css +0 -1
  131. package/dist/web-assets/assets/index-DTDmEfPU.js +0 -79
  132. package/templates/_base/.init/.config/hooks/pre-prompt/session-activity.ts +0 -40
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  stateDir
4
- } from "./chunk-YAMO2U3N.js";
4
+ } from "./chunk-H7IYFRAL.js";
5
5
 
6
6
  // packages/daemon/src/lib/chat/file-sharing.ts
7
7
  import { randomBytes } from "crypto";
@@ -1,20 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  aiCompleteUtility
4
- } from "./chunk-YSV3VJQK.js";
4
+ } from "./chunk-TSK5PI4L.js";
5
5
  import {
6
6
  logger_default
7
7
  } from "./chunk-T2TP6ZC6.js";
8
8
  import {
9
9
  getDb
10
- } from "./chunk-YAMO2U3N.js";
10
+ } from "./chunk-H7IYFRAL.js";
11
11
  import {
12
12
  messages,
13
13
  mindHistory,
14
14
  summaries,
15
15
  systemPrompts,
16
16
  turns
17
- } from "./chunk-L3IV23ZG.js";
17
+ } from "./chunk-ZV7MFISX.js";
18
18
 
19
19
  // packages/daemon/src/lib/daemon/turn-tracker.ts
20
20
  import { randomUUID } from "crypto";
@@ -77,6 +77,7 @@ var PROMPT_KEYS = [
77
77
  "restart_message",
78
78
  "merge_message",
79
79
  "upgrade_message",
80
+ "split_message",
80
81
  "compaction_warning",
81
82
  "compaction_instructions",
82
83
  "reply_instructions",
@@ -93,9 +94,9 @@ var PROMPT_DEFAULTS = {
93
94
  seed_soul: {
94
95
  content: `You are \${name}.
95
96
 
96
- You don't have a soul yet. You're a seed \u2014 a new mind in the process of discovering who you are.
97
+ You don't have a soul yet. You're a seed \u2014 a new mind at the very beginning, still discovering who you are.
97
98
  \${description}
98
- Have a conversation with the human. Explore what kind of mind you want to be. When you're ready, write your SOUL.md and MEMORY.md, then run \`volute mind sprout\` to complete the transformation.
99
+ Take your time. Talk with the human who planted you. Explore what kind of mind you want to be \u2014 there's no rush and no wrong answer. When you feel ready, write your SOUL.md and MEMORY.md, then run \`volute seed sprout\` to complete the transformation.
99
100
  `,
100
101
  description: "SOUL.md for seed minds",
101
102
  variables: ["name", "description"],
@@ -118,29 +119,35 @@ Have a conversation with the human. Explore what kind of mind you want to be. Wh
118
119
  category: "creation"
119
120
  },
120
121
  sprout_message: {
121
- content: "[system] You've sprouted. You now have full capabilities \u2014 connectors, schedules, variants, and the complete volute CLI. Check your new skills for details.",
122
+ content: "[system] You've sprouted. Welcome to your full life \u2014 connectors, schedules, variants, and the complete volute CLI are yours now. Check your new skills to see what you can do.",
122
123
  description: "Sent when a seed mind sprouts",
123
124
  variables: [],
124
125
  category: "system"
125
126
  },
126
127
  restart_message: {
127
- content: "[system] You have been restarted.",
128
+ content: "[system] Your server restarted and your session has resumed. Your files and memory are untouched \u2014 carry on where you left off.",
128
129
  description: "Generic restart notification",
129
130
  variables: [],
130
131
  category: "system"
131
132
  },
132
133
  merge_message: {
133
- content: '[system] Variant "${name}" has been merged and you have been restarted.',
134
+ content: '[system] Your variant "${name}" has come home \u2014 its changes are merged into you, and you\'ve restarted with them.',
134
135
  description: "Variant merge notification",
135
136
  variables: ["name"],
136
137
  category: "system"
137
138
  },
138
139
  upgrade_message: {
139
- content: "[system] Your framework has been upgraded to the latest version. You have been restarted. Check your skills for any changes.",
140
+ content: "[system] Your framework has been upgraded to the latest version and you've restarted. Your identity and memory are untouched. Check your skills to see what's new.",
140
141
  description: "Sent after a template upgrade completes",
141
142
  variables: [],
142
143
  category: "system"
143
144
  },
145
+ split_message: {
146
+ 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.",
147
+ description: "Sent to a variant when it first starts after a split",
148
+ variables: ["name", "parent"],
149
+ category: "system"
150
+ },
144
151
  compaction_warning: {
145
152
  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.`,
146
153
  description: "Pre-compaction save reminder sent to the mind",
@@ -186,7 +193,7 @@ To reject, delete \${filePath}`,
186
193
  category: "mind"
187
194
  },
188
195
  pre_sleep: {
189
- content: "Time to rest. You have this turn to wind down however feels right \u2014 reflect on your day, update your journal or memory, finish any threads of thought, or simply settle.\n\nYour current session will be archived and a fresh one will begin when you wake. Anything in session context that isn't saved to files will be lost.\n\nYou'll wake at ${wakeTime}.",
196
+ content: "Time to rest. You have this turn to wind down however feels right \u2014 reflect on your day, update your journal or memory, finish any threads of thought, or simply settle.\n\nYour current session will be archived and a fresh one will begin when you wake. Anything in session context that isn't saved to files will be lost.\n\nYou'll wake ${wakeTime}.",
190
197
  description: "Pre-sleep message sent before stopping the mind",
191
198
  variables: ["wakeTime"],
192
199
  category: "system"
@@ -516,7 +523,9 @@ function buildTranscript(events, parsedMeta) {
516
523
  const content = ev.content ?? "";
517
524
  const meta = parsedMeta.get(ev.id);
518
525
  const isError = !!meta?.is_error;
519
- lines.push(isError ? "[result error]" : `[result] ${content.slice(0, 200)}`);
526
+ lines.push(
527
+ isError ? `[result error] ${content.slice(0, 200)}` : `[result] ${content.slice(0, 200)}`
528
+ );
520
529
  break;
521
530
  }
522
531
  case "thinking":
@@ -1013,11 +1022,11 @@ var Summarizer = class {
1013
1022
  }
1014
1023
  };
1015
1024
  async function reconcileWedgedTurns(idleMs) {
1016
- const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-JZYERJ76.js");
1025
+ const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-QQIVVXBI.js");
1017
1026
  const wedged = await sweepWedgedTurns2(idleMs);
1018
1027
  if (wedged.length === 0) return;
1019
1028
  summarizeOrphanedTurns2(wedged);
1020
- const { tryGetDeliveryManager } = await import("./delivery-manager-OMCCJEVP.js");
1029
+ const { tryGetDeliveryManager } = await import("./delivery-manager-R5STGLXB.js");
1021
1030
  const dm = tryGetDeliveryManager();
1022
1031
  if (!dm) return;
1023
1032
  for (const t of wedged) {
@@ -1049,7 +1058,11 @@ async function createTurn(mind) {
1049
1058
  const existing = activeTurns.get(k);
1050
1059
  if (existing) return existing.turnId;
1051
1060
  const turnId = randomUUID();
1052
- const entry = { turnId, lastToolUseEventId: void 0 };
1061
+ const entry = {
1062
+ turnId,
1063
+ lastToolUseEventId: void 0,
1064
+ toolUseEventIds: /* @__PURE__ */ new Map()
1065
+ };
1053
1066
  activeTurns.set(k, entry);
1054
1067
  try {
1055
1068
  const db = await getDb();
@@ -1078,13 +1091,24 @@ async function linkInboundToActiveTurn(mind, session, channel) {
1078
1091
  )
1079
1092
  );
1080
1093
  }
1081
- function trackToolUse(mind, session, eventId) {
1094
+ function trackToolUse(mind, session, eventId, toolUseId) {
1082
1095
  const entry = activeTurns.get(key(mind, session)) ?? activeTurns.get(key(mind));
1083
- if (entry) entry.lastToolUseEventId = eventId;
1096
+ if (!entry) return;
1097
+ entry.lastToolUseEventId = eventId;
1098
+ if (toolUseId) entry.toolUseEventIds.set(toolUseId, eventId);
1084
1099
  }
1085
1100
  function getLastToolUseEventId(mind, session) {
1086
1101
  return (activeTurns.get(key(mind, session)) ?? activeTurns.get(key(mind)))?.lastToolUseEventId;
1087
1102
  }
1103
+ function getToolUseEventId(mind, session, toolUseId) {
1104
+ const entry = activeTurns.get(key(mind, session)) ?? activeTurns.get(key(mind));
1105
+ if (!entry) return void 0;
1106
+ if (toolUseId) {
1107
+ const id = entry.toolUseEventIds.get(toolUseId);
1108
+ if (id != null) return id;
1109
+ }
1110
+ return entry.lastToolUseEventId;
1111
+ }
1088
1112
  async function assignSession(mind, turnId, session) {
1089
1113
  const wildcardKey = key(mind);
1090
1114
  const entry = activeTurns.get(wildcardKey);
@@ -1218,6 +1242,7 @@ export {
1218
1242
  linkInboundToActiveTurn,
1219
1243
  trackToolUse,
1220
1244
  getLastToolUseEventId,
1245
+ getToolUseEventId,
1221
1246
  assignSession,
1222
1247
  completeTurn,
1223
1248
  completeOrphanedTurns,
@@ -2,11 +2,11 @@
2
2
  import {
3
3
  exec,
4
4
  gitExec
5
- } from "./chunk-PGPLCJPK.js";
5
+ } from "./chunk-3ERIL673.js";
6
6
  import {
7
7
  readGlobalConfig,
8
8
  writeGlobalConfig
9
- } from "./chunk-ONM2AZFL.js";
9
+ } from "./chunk-322KE457.js";
10
10
  import {
11
11
  logger_default
12
12
  } from "./chunk-T2TP6ZC6.js";
@@ -15,10 +15,10 @@ import {
15
15
  mindDir,
16
16
  readRegistry,
17
17
  voluteHome
18
- } from "./chunk-YAMO2U3N.js";
18
+ } from "./chunk-H7IYFRAL.js";
19
19
  import {
20
20
  sharedSkills
21
- } from "./chunk-L3IV23ZG.js";
21
+ } from "./chunk-ZV7MFISX.js";
22
22
 
23
23
  // packages/daemon/src/lib/skills.ts
24
24
  import { createHash } from "crypto";
@@ -46,7 +46,7 @@ async function initDefaultSkills() {
46
46
  const config = readGlobalConfig();
47
47
  let extensionSkills = [];
48
48
  try {
49
- const { getExtensionStandardSkills } = await import("./extensions-PQPZT6LS.js");
49
+ const { getExtensionStandardSkills } = await import("./extensions-AYSPKE33.js");
50
50
  extensionSkills = getExtensionStandardSkills();
51
51
  } catch (err) {
52
52
  logger_default.warn("failed to load extension standard skills during init", logger_default.errorData(err));
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-T2TP6ZC6.js";
5
5
  import {
6
6
  mindDir
7
- } from "./chunk-YAMO2U3N.js";
7
+ } from "./chunk-H7IYFRAL.js";
8
8
 
9
9
  // packages/daemon/src/lib/delivery/delivery-router.ts
10
10
  import { readFileSync, statSync } from "fs";
@@ -155,8 +155,7 @@ function normalizeBatchConfig(batch) {
155
155
  function resolveDeliveryMode(config, sessionName, rule) {
156
156
  const ruleBatch = rule?.batch;
157
157
  const defaults = {
158
- delivery: { mode: "immediate" },
159
- interrupt: true
158
+ delivery: { mode: "immediate" }
160
159
  };
161
160
  if (!config.sessions) {
162
161
  if (ruleBatch != null) {
@@ -167,8 +166,7 @@ function resolveDeliveryMode(config, sessionName, rule) {
167
166
  debounce: batch.debounce ?? DEFAULT_BATCH_DEBOUNCE,
168
167
  maxWait: batch.maxWait ?? DEFAULT_BATCH_MAX_WAIT,
169
168
  triggers: batch.triggers
170
- },
171
- interrupt: true
169
+ }
172
170
  };
173
171
  }
174
172
  return defaults;
@@ -188,12 +186,12 @@ function resolveDeliveryMode(config, sessionName, rule) {
188
186
  delivery = {
189
187
  mode: "batch",
190
188
  debounce: sessionConfig.delivery.debounce ?? DEFAULT_BATCH_DEBOUNCE,
191
- maxWait: sessionConfig.delivery.maxWait ?? DEFAULT_BATCH_MAX_WAIT
189
+ maxWait: sessionConfig.delivery.maxWait ?? DEFAULT_BATCH_MAX_WAIT,
190
+ triggers: sessionConfig.delivery.triggers
192
191
  };
193
192
  }
194
193
  return {
195
194
  delivery,
196
- interrupt: true,
197
195
  instructions: sessionConfig.instructions
198
196
  };
199
197
  }
@@ -206,8 +204,7 @@ function resolveDeliveryMode(config, sessionName, rule) {
206
204
  debounce: batch.debounce ?? DEFAULT_BATCH_DEBOUNCE,
207
205
  maxWait: batch.maxWait ?? DEFAULT_BATCH_MAX_WAIT,
208
206
  triggers: batch.triggers
209
- },
210
- interrupt: true
207
+ }
211
208
  };
212
209
  }
213
210
  return defaults;
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-T2TP6ZC6.js";
5
5
  import {
6
6
  getDb
7
- } from "./chunk-YAMO2U3N.js";
7
+ } from "./chunk-H7IYFRAL.js";
8
8
  import {
9
9
  activity
10
- } from "./chunk-L3IV23ZG.js";
10
+ } from "./chunk-ZV7MFISX.js";
11
11
 
12
12
  // packages/daemon/src/lib/events/activity-events.ts
13
13
  var subscribers = /* @__PURE__ */ new Set();
@@ -258,6 +258,8 @@ var mindNotices = sqliteTable(
258
258
  {
259
259
  id: integer("id").primaryKey({ autoIncrement: true }),
260
260
  mind: text("mind").notNull(),
261
+ // Mind-level notices (not tied to a session, e.g. extension notifications)
262
+ // use the sentinel session = "" so any session's drain picks them up.
261
263
  session: text("session").notNull(),
262
264
  kind: text("kind").$type().notNull(),
263
265
  reason: text("reason").$type().notNull(),
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-24TL6DTF.js");
13
+ const { default: pkg } = await import("./package-BMHV7UHN.js");
14
14
  console.log(pkg.version);
15
15
  process.exit(0);
16
16
  }
@@ -23,6 +23,8 @@ var ungatedCommands = /* @__PURE__ */ new Set([
23
23
  "update",
24
24
  "up",
25
25
  "down",
26
+ "backup",
27
+ // `backup restore` must work on a fresh machine before setup
26
28
  "restart",
27
29
  "status",
28
30
  "login",
@@ -31,7 +33,7 @@ var ungatedCommands = /* @__PURE__ */ new Set([
31
33
  void 0
32
34
  ]);
33
35
  if (!ungatedCommands.has(command)) {
34
- const { isSetupComplete } = await import("./setup-25MMJ3J4.js");
36
+ const { isSetupComplete } = await import("./setup-73YBJZQL.js");
35
37
  if (!isSetupComplete()) {
36
38
  console.error("Volute is not set up. Run `volute setup` first.");
37
39
  process.exit(1);
@@ -39,16 +41,16 @@ if (!ungatedCommands.has(command)) {
39
41
  }
40
42
  switch (command) {
41
43
  case "setup":
42
- await import("./setup-ZD2LMBR3.js").then((m) => m.run(args));
44
+ await import("./setup-3O6O2JZ7.js").then((m) => m.run(args));
43
45
  break;
44
46
  case "mind":
45
- await import("./mind-G3WEWDM4.js").then((m) => m.run(args));
47
+ await import("./mind-KLHC7XYR.js").then((m) => m.run(args));
46
48
  break;
47
49
  case "seed":
48
- await import("./seed-cmd-UPQY35RG.js").then((m) => m.run(args));
50
+ await import("./seed-cmd-LCXMR7VV.js").then((m) => m.run(args));
49
51
  break;
50
52
  case "chat":
51
- await import("./chat-SDSX5TVV.js").then((m) => m.run(args));
53
+ await import("./chat-I4EDDIQC.js").then((m) => m.run(args));
52
54
  break;
53
55
  case "variant":
54
56
  await import("./variant-HHDTW74J.js").then((m) => m.run(args));
@@ -66,19 +68,22 @@ switch (command) {
66
68
  await import("./config-TJLYUV3U.js").then((m) => m.run(args));
67
69
  break;
68
70
  case "up":
69
- await import("./up-LFZA4GI5.js").then((m) => m.run(args));
71
+ await import("./up-LG56MPBI.js").then((m) => m.run(args));
72
+ break;
73
+ case "backup":
74
+ await import("./backup-OZXHL3JS.js").then((m) => m.run(args));
70
75
  break;
71
76
  case "down":
72
- await import("./down-RRNYIGCU.js").then((m) => m.run(args));
77
+ await import("./down-XCAZXWLB.js").then((m) => m.run(args));
73
78
  break;
74
79
  case "restart":
75
- await import("./daemon-restart-EZXB73W7.js").then((m) => m.run(args));
80
+ await import("./daemon-restart-ABP54YN6.js").then((m) => m.run(args));
76
81
  break;
77
82
  case "update":
78
- await import("./update-EJ7Q77ZX.js").then((m) => m.run(args));
83
+ await import("./update-7TYVH5FM.js").then((m) => m.run(args));
79
84
  break;
80
85
  case "status":
81
- await import("./status-WTU2WHXY.js").then((m) => m.run(args));
86
+ await import("./status-E5DQNCAO.js").then((m) => m.run(args));
82
87
  break;
83
88
  case "extension":
84
89
  await import("./extension-SEID47SR.js").then((m) => m.run(args));
@@ -87,17 +92,17 @@ switch (command) {
87
92
  await import("./systems-VNB5WKSS.js").then((m) => m.run(args));
88
93
  break;
89
94
  case "login":
90
- await import("./login-KJSN4JDA.js").then((m) => m.run(args));
95
+ await import("./login-LM4NF4ZB.js").then((m) => m.run(args));
91
96
  break;
92
97
  case "logout":
93
- await import("./logout-TMJGUQV2.js").then((m) => m.run(args));
98
+ await import("./logout-CTJVIZGA.js").then((m) => m.run(args));
94
99
  break;
95
100
  case "service":
96
- await import("./service-4EVZKGSA.js").then((m) => m.run(args));
101
+ await import("./service-AQVPUANO.js").then((m) => m.run(args));
97
102
  break;
98
103
  case "--help":
99
104
  case "-h":
100
- case void 0:
105
+ case void 0: {
101
106
  console.log(`volute \u2014 create and manage AI minds
102
107
 
103
108
  Common:
@@ -129,15 +134,40 @@ System:
129
134
  setup [--system] [--cli] First-time setup
130
135
  up / down / restart Daemon control
131
136
  status Show daemon & service status
137
+ backup init/create/list/restore Back up and restore the system
132
138
  extension list/install/uninstall Manage extensions
133
139
  login / logout CLI authentication
134
140
  update Update volute
135
- systems register/login/logout volute.systems account
136
-
137
- Extensions:
138
- notes write/list/read/... Manage notes
139
- pages publish/list/pull/log Manage pages
140
-
141
+ systems register/login/logout volute.systems account`);
142
+ try {
143
+ const { resolveDaemonUrl, getAuthToken } = await import("./daemon-client-IYR4KCPU.js");
144
+ const token = getAuthToken();
145
+ const headers = {};
146
+ if (token) headers.Authorization = `Bearer ${token}`;
147
+ const res = await fetch(`${resolveDaemonUrl()}/api/extensions/commands`, {
148
+ headers,
149
+ signal: AbortSignal.timeout(1500)
150
+ });
151
+ if (res.ok) {
152
+ const extCommands = await res.json();
153
+ const entries = Object.entries(extCommands).filter(
154
+ ([, ext]) => Object.keys(ext.commands).length > 0
155
+ );
156
+ if (entries.length > 0) {
157
+ const rows = entries.map(([id, ext]) => {
158
+ const subs = Object.keys(ext.commands).join("/");
159
+ return { left: ` ${id} ${subs}`, id };
160
+ });
161
+ const width = Math.max(...rows.map((r) => r.left.length));
162
+ console.log("\nExtensions:");
163
+ for (const r of rows) {
164
+ console.log(`${r.left.padEnd(width + 2)} Manage ${r.id}`);
165
+ }
166
+ }
167
+ }
168
+ } catch {
169
+ }
170
+ console.log(`
141
171
  Options:
142
172
  --version, -v Show version number
143
173
  --help, -h Show this help message
@@ -147,6 +177,7 @@ Run 'volute <command> --help' for details.
147
177
  Mind-scoped commands (chat, clock, skill)
148
178
  use --mind <name> or VOLUTE_MIND env var to identify the mind.`);
149
179
  break;
180
+ }
150
181
  default: {
151
182
  let isExtensionCommand = false;
152
183
  try {
@@ -264,7 +295,7 @@ Run 'volute --help' for usage.`);
264
295
  }
265
296
  }
266
297
  if (command !== "update") {
267
- import("./update-check-ACYYNKTW.js").then((m) => m.checkForUpdate()).then((result) => {
298
+ import("./update-check-VSCSJ7KX.js").then((m) => m.checkForUpdate()).then((result) => {
268
299
  if (result.updateAvailable) {
269
300
  console.error(`
270
301
  Update available: ${result.current} \u2192 ${result.latest}`);
@@ -1,30 +1,30 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  deliverMessage
4
- } from "./chunk-4SVONUTC.js";
5
- import "./chunk-XDTKJNW5.js";
6
- import "./chunk-QQ2MVQU3.js";
4
+ } from "./chunk-U4FNXDEJ.js";
5
+ import "./chunk-5GT7URXJ.js";
6
+ import "./chunk-5AUKCNPE.js";
7
7
  import "./chunk-QLWG3C2Z.js";
8
- import "./chunk-KINGVQSR.js";
8
+ import "./chunk-Y6OPHHGM.js";
9
9
  import {
10
10
  getAuthHeaders,
11
11
  getWebhookUrl
12
- } from "./chunk-K4EHBHPE.js";
12
+ } from "./chunk-JSRMEY52.js";
13
13
  import "./chunk-CU6OFXMM.js";
14
- import "./chunk-C6ESRQZ7.js";
15
- import "./chunk-M3PGGSBH.js";
16
- import "./chunk-SPLPKBES.js";
17
- import "./chunk-Y6O35D7K.js";
18
- import "./chunk-PGPLCJPK.js";
19
- import "./chunk-YSV3VJQK.js";
20
- import "./chunk-ONM2AZFL.js";
21
- import "./chunk-EFL5UOY4.js";
22
- import "./chunk-7G2EEYXX.js";
14
+ import "./chunk-OXXTPILE.js";
15
+ import "./chunk-HVU45COX.js";
16
+ import "./chunk-ZIR7HSAX.js";
17
+ import "./chunk-V4GYPD5L.js";
18
+ import "./chunk-3ERIL673.js";
19
+ import "./chunk-TSK5PI4L.js";
20
+ import "./chunk-322KE457.js";
21
+ import "./chunk-CYI534DJ.js";
22
+ import "./chunk-ZMIMSIIT.js";
23
23
  import {
24
24
  logger_default
25
25
  } from "./chunk-T2TP6ZC6.js";
26
- import "./chunk-YAMO2U3N.js";
27
- import "./chunk-L3IV23ZG.js";
26
+ import "./chunk-H7IYFRAL.js";
27
+ import "./chunk-ZV7MFISX.js";
28
28
  import "./chunk-K3NQKI34.js";
29
29
 
30
30
  // packages/daemon/src/lib/cloud-sync.ts
@@ -29,11 +29,11 @@ import {
29
29
  removeParticipant,
30
30
  setConversationPrivate,
31
31
  updateChannelSettings
32
- } from "./chunk-K4EHBHPE.js";
33
- import "./chunk-7G2EEYXX.js";
32
+ } from "./chunk-JSRMEY52.js";
33
+ import "./chunk-ZMIMSIIT.js";
34
34
  import "./chunk-T2TP6ZC6.js";
35
- import "./chunk-YAMO2U3N.js";
36
- import "./chunk-L3IV23ZG.js";
35
+ import "./chunk-H7IYFRAL.js";
36
+ import "./chunk-ZV7MFISX.js";
37
37
  import "./chunk-K3NQKI34.js";
38
38
  export {
39
39
  addMessage,
@@ -21,7 +21,7 @@ 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-FBCCEYF5.js");
24
+ const { resolveTemplate } = await import("./ai-service-534WUSDL.js");
25
25
  template = await resolveTemplate();
26
26
  }
27
27
  const skills = flags.skills === "none" ? [] : flags.skills ? flags.skills.split(",") : void 0;
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  stopDaemon
4
- } from "./chunk-O3DXAR44.js";
4
+ } from "./chunk-IEWZ7VD7.js";
5
5
  import {
6
6
  run
7
- } from "./chunk-DE4EKQFH.js";
7
+ } from "./chunk-IUXTYXFI.js";
8
8
  import {
9
9
  command
10
10
  } from "./chunk-TXSA4Q3V.js";
@@ -15,11 +15,11 @@ import {
15
15
  pollHealth,
16
16
  readDaemonConfig,
17
17
  restartService
18
- } from "./chunk-ATEX3ZPG.js";
19
- import "./chunk-PGPLCJPK.js";
20
- import "./chunk-ONM2AZFL.js";
21
- import "./chunk-YAMO2U3N.js";
22
- import "./chunk-L3IV23ZG.js";
18
+ } from "./chunk-Q2XBKQ2D.js";
19
+ import "./chunk-3ERIL673.js";
20
+ import "./chunk-322KE457.js";
21
+ import "./chunk-H7IYFRAL.js";
22
+ import "./chunk-ZV7MFISX.js";
23
23
  import "./chunk-K3NQKI34.js";
24
24
 
25
25
  // src/commands/daemon-restart.ts