volute 0.43.0 → 0.43.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 (35) hide show
  1. package/dist/{chunk-PF2AB7VJ.js → chunk-4SVONUTC.js} +11 -11
  2. package/dist/{chunk-FZ5TH5PF.js → chunk-DMUPZQWP.js} +2 -2
  3. package/dist/{chunk-FSSUANZJ.js → chunk-KINGVQSR.js} +1 -1
  4. package/dist/{chunk-65OLHBCL.js → chunk-QQ2MVQU3.js} +1 -1
  5. package/dist/{chunk-3WLWKOGM.js → chunk-Y6O35D7K.js} +2 -2
  6. package/dist/cli.js +6 -6
  7. package/dist/{cloud-sync-FRYNWKCR.js → cloud-sync-KOEBUFW5.js} +4 -4
  8. package/dist/{daemon-restart-5GVZ5V3X.js → daemon-restart-EZXB73W7.js} +1 -1
  9. package/dist/daemon.js +25 -25
  10. package/dist/{delivery-manager-5J2BE22P.js → delivery-manager-OMCCJEVP.js} +4 -4
  11. package/dist/{echo-text-XKBJM6RV.js → echo-text-KFSUCZXL.js} +5 -5
  12. package/dist/{extensions-76EGTMFY.js → extensions-PQPZT6LS.js} +4 -4
  13. package/dist/{message-delivery-WJBZFALY.js → message-delivery-HRGFNWO7.js} +4 -4
  14. package/dist/{mind-QEWCR7FA.js → mind-G3WEWDM4.js} +2 -2
  15. package/dist/{mind-service-ZBVUMJ5H.js → mind-service-2C7AINBO.js} +4 -4
  16. package/dist/{package-ZOI2KAYC.js → package-24TL6DTF.js} +1 -1
  17. package/dist/{scheduler-BR6C6B3E.js → scheduler-VON2TB52.js} +4 -4
  18. package/dist/{seed-KOG6KJAO.js → seed-HHSJTM6O.js} +1 -1
  19. package/dist/{seed-cmd-GJFENEJH.js → seed-cmd-UPQY35RG.js} +2 -2
  20. package/dist/{seed-create-YXO6R4KE.js → seed-create-MDRMXMSB.js} +1 -1
  21. package/dist/{seed-sprout-BBU64QXP.js → seed-sprout-4M7IQWMH.js} +2 -2
  22. package/dist/{setup-354PDHUF.js → setup-ZD2LMBR3.js} +1 -1
  23. package/dist/{skills-DPI3WZPQ.js → skills-4KQ377GN.js} +1 -1
  24. package/dist/{sleep-manager-BVU5D2AE.js → sleep-manager-AG5SQDDI.js} +4 -4
  25. package/dist/{spirit-JQQHUVWR.js → spirit-53DQPRNR.js} +2 -2
  26. package/dist/{sprout-4WAYBUVV.js → sprout-YKM2M6D6.js} +1 -1
  27. package/dist/{src-TJ7RBU5H.js → src-3EGHHKZK.js} +8 -8
  28. package/dist/{system-chat-KMQIP7VH.js → system-chat-54RN3K67.js} +4 -4
  29. package/dist/{turn-tracker-2GMKJQTN.js → turn-tracker-JZYERJ76.js} +1 -1
  30. package/dist/{up-7RSBEKW6.js → up-LFZA4GI5.js} +1 -1
  31. package/dist/{version-notify-DCAIXXZB.js → version-notify-SRQJCQEK.js} +4 -4
  32. package/package.json +1 -1
  33. package/templates/claude/src/agent.ts +8 -1
  34. package/templates/claude/src/lib/message-channel.ts +28 -6
  35. /package/dist/{chunk-ZO7IQJKO.js → chunk-DE4EKQFH.js} +0 -0
@@ -4,13 +4,13 @@ import {
4
4
  } from "./chunk-XDTKJNW5.js";
5
5
  import {
6
6
  spiritDir
7
- } from "./chunk-65OLHBCL.js";
7
+ } from "./chunk-QQ2MVQU3.js";
8
8
  import {
9
9
  hashSkillDir,
10
10
  importSkillFromDir,
11
11
  removeSharedSkill,
12
12
  sharedSkillsDir
13
- } from "./chunk-FSSUANZJ.js";
13
+ } from "./chunk-KINGVQSR.js";
14
14
  import {
15
15
  addMessage,
16
16
  createChannel,
@@ -46,7 +46,7 @@ import {
46
46
  linkInboundToActiveTurn,
47
47
  publish as publish3,
48
48
  summarizeOrphanedTurns
49
- } from "./chunk-3WLWKOGM.js";
49
+ } from "./chunk-Y6O35D7K.js";
50
50
  import {
51
51
  chownMindDir,
52
52
  exec,
@@ -905,7 +905,7 @@ var MindManager = class {
905
905
  if (this.shuttingDown || this.stopping.has(name)) return;
906
906
  mlog.error(`mind ${name} exited with code ${code}`);
907
907
  try {
908
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-BVU5D2AE.js");
908
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-AG5SQDDI.js");
909
909
  const sleepMgr = getSleepManagerIfReady2();
910
910
  const sleepState = sleepMgr?.getState(name);
911
911
  if (sleepState?.sleeping) {
@@ -935,7 +935,7 @@ var MindManager = class {
935
935
  (err) => mlog.warn(`failed to clear turn state for ${name} after crash`, logger_default.errorData(err))
936
936
  );
937
937
  try {
938
- const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-5J2BE22P.js");
938
+ const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-OMCCJEVP.js");
939
939
  getDeliveryManager2().clearMindSessions(name);
940
940
  } catch (err) {
941
941
  if (!(err instanceof Error && err.message.includes("not initialized"))) {
@@ -1001,7 +1001,7 @@ var MindManager = class {
1001
1001
  mlog.warn(`failed to clear turn state for ${name} on stop`, logger_default.errorData(err));
1002
1002
  }
1003
1003
  try {
1004
- const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-5J2BE22P.js");
1004
+ const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-OMCCJEVP.js");
1005
1005
  getDeliveryManager2().clearMindSessions(name);
1006
1006
  } catch (err) {
1007
1007
  if (!(err instanceof Error && err.message.includes("not initialized"))) {
@@ -1009,7 +1009,7 @@ var MindManager = class {
1009
1009
  }
1010
1010
  }
1011
1011
  try {
1012
- const { clearEchoTextCache } = await import("./echo-text-XKBJM6RV.js");
1012
+ const { clearEchoTextCache } = await import("./echo-text-KFSUCZXL.js");
1013
1013
  clearEchoTextCache(name);
1014
1014
  } catch (err) {
1015
1015
  mlog.debug(`failed to clear echo-text cache for ${name}`, logger_default.errorData(err));
@@ -1647,7 +1647,7 @@ function resolveSkillsDir(manifest) {
1647
1647
  async function discoverBuiltinExtensions(disabledIds) {
1648
1648
  const builtins = [
1649
1649
  { id: "notes", load: async () => (await import("./src-L2Z7X5UT.js")).default },
1650
- { id: "pages", load: async () => (await import("./src-TJ7RBU5H.js")).default },
1650
+ { id: "pages", load: async () => (await import("./src-3EGHHKZK.js")).default },
1651
1651
  { id: "plan", load: async () => (await import("./src-O4PRLMKM.js")).default }
1652
1652
  ];
1653
1653
  const results = [];
@@ -3108,7 +3108,7 @@ var SleepManager = class {
3108
3108
  const db = await getDb();
3109
3109
  const rows = await db.select().from(deliveryQueue).where(and2(eq3(deliveryQueue.mind, name), eq3(deliveryQueue.status, "sleep-queued"))).all();
3110
3110
  if (rows.length === 0) return 0;
3111
- const { deliverMessage: deliverMessage2 } = await import("./message-delivery-WJBZFALY.js");
3111
+ const { deliverMessage: deliverMessage2 } = await import("./message-delivery-HRGFNWO7.js");
3112
3112
  const delivered = [];
3113
3113
  for (const row of rows) {
3114
3114
  try {
@@ -4201,7 +4201,7 @@ var DeliveryManager = class {
4201
4201
  `To accept this channel, add a routing rule for "${channel}" to your routes.json.`,
4202
4202
  `Messages are being held until a route is configured.`
4203
4203
  ].filter((line) => line !== null).join("\n");
4204
- const { sendSystemMessage: sendSystemMessage2 } = await import("./system-chat-KMQIP7VH.js");
4204
+ const { sendSystemMessage: sendSystemMessage2 } = await import("./system-chat-54RN3K67.js");
4205
4205
  await sendSystemMessage2(mindName, notification);
4206
4206
  }
4207
4207
  /**
@@ -4643,7 +4643,7 @@ async function generateSystemReply(conversationId, mindName, message) {
4643
4643
  if (config.sleep.schedule?.wake) contextParts.push(`Wake cron: ${config.sleep.schedule.wake}`);
4644
4644
  }
4645
4645
  try {
4646
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-BVU5D2AE.js");
4646
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-AG5SQDDI.js");
4647
4647
  const sm = getSleepManagerIfReady2();
4648
4648
  if (sm) {
4649
4649
  const state = sm.getState(mindName);
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-57LBQ7JX.js";
6
6
  import {
7
7
  recordOutbound
8
- } from "./chunk-PF2AB7VJ.js";
8
+ } from "./chunk-4SVONUTC.js";
9
9
  import {
10
10
  readEnv,
11
11
  sharedEnvPath
@@ -23,7 +23,7 @@ import {
23
23
  } from "./chunk-CU6OFXMM.js";
24
24
  import {
25
25
  publish
26
- } from "./chunk-3WLWKOGM.js";
26
+ } from "./chunk-Y6O35D7K.js";
27
27
  import {
28
28
  daemonConfigPath,
29
29
  readDaemonToken
@@ -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-76EGTMFY.js");
49
+ const { getExtensionStandardSkills } = await import("./extensions-PQPZT6LS.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));
@@ -10,7 +10,7 @@ import {
10
10
  getSharedSkill,
11
11
  installSkill,
12
12
  mindSkillsDir
13
- } from "./chunk-FSSUANZJ.js";
13
+ } from "./chunk-KINGVQSR.js";
14
14
  import {
15
15
  readVoluteConfig,
16
16
  writeVoluteConfig
@@ -1013,11 +1013,11 @@ var Summarizer = class {
1013
1013
  }
1014
1014
  };
1015
1015
  async function reconcileWedgedTurns(idleMs) {
1016
- const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-2GMKJQTN.js");
1016
+ const { sweepWedgedTurns: sweepWedgedTurns2, summarizeOrphanedTurns: summarizeOrphanedTurns2 } = await import("./turn-tracker-JZYERJ76.js");
1017
1017
  const wedged = await sweepWedgedTurns2(idleMs);
1018
1018
  if (wedged.length === 0) return;
1019
1019
  summarizeOrphanedTurns2(wedged);
1020
- const { tryGetDeliveryManager } = await import("./delivery-manager-5J2BE22P.js");
1020
+ const { tryGetDeliveryManager } = await import("./delivery-manager-OMCCJEVP.js");
1021
1021
  const dm = tryGetDeliveryManager();
1022
1022
  if (!dm) return;
1023
1023
  for (const t of wedged) {
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-ZOI2KAYC.js");
13
+ const { default: pkg } = await import("./package-24TL6DTF.js");
14
14
  console.log(pkg.version);
15
15
  process.exit(0);
16
16
  }
@@ -39,13 +39,13 @@ if (!ungatedCommands.has(command)) {
39
39
  }
40
40
  switch (command) {
41
41
  case "setup":
42
- await import("./setup-354PDHUF.js").then((m) => m.run(args));
42
+ await import("./setup-ZD2LMBR3.js").then((m) => m.run(args));
43
43
  break;
44
44
  case "mind":
45
- await import("./mind-QEWCR7FA.js").then((m) => m.run(args));
45
+ await import("./mind-G3WEWDM4.js").then((m) => m.run(args));
46
46
  break;
47
47
  case "seed":
48
- await import("./seed-cmd-GJFENEJH.js").then((m) => m.run(args));
48
+ await import("./seed-cmd-UPQY35RG.js").then((m) => m.run(args));
49
49
  break;
50
50
  case "chat":
51
51
  await import("./chat-SDSX5TVV.js").then((m) => m.run(args));
@@ -66,13 +66,13 @@ switch (command) {
66
66
  await import("./config-TJLYUV3U.js").then((m) => m.run(args));
67
67
  break;
68
68
  case "up":
69
- await import("./up-7RSBEKW6.js").then((m) => m.run(args));
69
+ await import("./up-LFZA4GI5.js").then((m) => m.run(args));
70
70
  break;
71
71
  case "down":
72
72
  await import("./down-RRNYIGCU.js").then((m) => m.run(args));
73
73
  break;
74
74
  case "restart":
75
- await import("./daemon-restart-5GVZ5V3X.js").then((m) => m.run(args));
75
+ await import("./daemon-restart-EZXB73W7.js").then((m) => m.run(args));
76
76
  break;
77
77
  case "update":
78
78
  await import("./update-EJ7Q77ZX.js").then((m) => m.run(args));
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  deliverMessage
4
- } from "./chunk-PF2AB7VJ.js";
4
+ } from "./chunk-4SVONUTC.js";
5
5
  import "./chunk-XDTKJNW5.js";
6
- import "./chunk-65OLHBCL.js";
6
+ import "./chunk-QQ2MVQU3.js";
7
7
  import "./chunk-QLWG3C2Z.js";
8
- import "./chunk-FSSUANZJ.js";
8
+ import "./chunk-KINGVQSR.js";
9
9
  import {
10
10
  getAuthHeaders,
11
11
  getWebhookUrl
@@ -14,7 +14,7 @@ import "./chunk-CU6OFXMM.js";
14
14
  import "./chunk-C6ESRQZ7.js";
15
15
  import "./chunk-M3PGGSBH.js";
16
16
  import "./chunk-SPLPKBES.js";
17
- import "./chunk-3WLWKOGM.js";
17
+ import "./chunk-Y6O35D7K.js";
18
18
  import "./chunk-PGPLCJPK.js";
19
19
  import "./chunk-YSV3VJQK.js";
20
20
  import "./chunk-ONM2AZFL.js";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-O3DXAR44.js";
5
5
  import {
6
6
  run
7
- } from "./chunk-ZO7IQJKO.js";
7
+ } from "./chunk-DE4EKQFH.js";
8
8
  import {
9
9
  command
10
10
  } from "./chunk-TXSA4Q3V.js";
package/dist/daemon.js CHANGED
@@ -30,7 +30,7 @@ import {
30
30
  fixModelEscapes,
31
31
  getPlatformDriver,
32
32
  routeOutboundBridge
33
- } from "./chunk-FZ5TH5PF.js";
33
+ } from "./chunk-DMUPZQWP.js";
34
34
  import {
35
35
  getBridgeConfig,
36
36
  readBridgesConfig,
@@ -98,7 +98,7 @@ import {
98
98
  syncProviderToMinds,
99
99
  uninstallNpmExtension,
100
100
  writeSystemsConfig
101
- } from "./chunk-PF2AB7VJ.js";
101
+ } from "./chunk-4SVONUTC.js";
102
102
  import {
103
103
  loadMergedEnv,
104
104
  mindEnvPath,
@@ -106,7 +106,7 @@ import {
106
106
  sharedEnvPath,
107
107
  writeEnv
108
108
  } from "./chunk-XDTKJNW5.js";
109
- import "./chunk-65OLHBCL.js";
109
+ import "./chunk-QQ2MVQU3.js";
110
110
  import {
111
111
  applyInitFiles,
112
112
  applyTemplateHomeFiles,
@@ -135,7 +135,7 @@ import {
135
135
  syncBuiltinSkills,
136
136
  uninstallSkill,
137
137
  updateSkill
138
- } from "./chunk-FSSUANZJ.js";
138
+ } from "./chunk-KINGVQSR.js";
139
139
  import {
140
140
  addMessage,
141
141
  createChannel,
@@ -206,7 +206,7 @@ import {
206
206
  summarizeTurn,
207
207
  takeErrored,
208
208
  trackToolUse
209
- } from "./chunk-3WLWKOGM.js";
209
+ } from "./chunk-Y6O35D7K.js";
210
210
  import "./chunk-ATEX3ZPG.js";
211
211
  import {
212
212
  chownMindDir,
@@ -2274,7 +2274,7 @@ async function notifyMind(mindName, message) {
2274
2274
  const entry = await findMind(mindName);
2275
2275
  if (!entry) return;
2276
2276
  try {
2277
- const { sendSystemMessage } = await import("./system-chat-KMQIP7VH.js");
2277
+ const { sendSystemMessage } = await import("./system-chat-54RN3K67.js");
2278
2278
  await sendSystemMessage(mindName, message);
2279
2279
  } catch (err) {
2280
2280
  logger_default.warn(`[file-sharing] notify mind ${mindName} failed`, logger_default.errorData(err));
@@ -3768,7 +3768,7 @@ async function getMindStatus(name, port, registryRunning) {
3768
3768
  const manager = getMindManager();
3769
3769
  let status = "stopped";
3770
3770
  try {
3771
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-BVU5D2AE.js");
3771
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-AG5SQDDI.js");
3772
3772
  if (getSleepManagerIfReady2()?.isSleeping(name)) {
3773
3773
  status = "sleeping";
3774
3774
  }
@@ -4372,7 +4372,7 @@ The human who planted you described you as: "${body.description}"
4372
4372
  try {
4373
4373
  const spiritEntry = await findMind("volute");
4374
4374
  if (spiritEntry) {
4375
- const { spiritDir } = await import("./spirit-JQQHUVWR.js");
4375
+ const { spiritDir } = await import("./spirit-53DQPRNR.js");
4376
4376
  const sDir = spiritEntry.dir ?? spiritDir();
4377
4377
  const spiritConfig = readVoluteConfig(sDir) ?? {};
4378
4378
  const schedules = spiritConfig.schedules ?? [];
@@ -4387,7 +4387,7 @@ The human who planted you described you as: "${body.description}"
4387
4387
  });
4388
4388
  spiritConfig.schedules = schedules;
4389
4389
  writeVoluteConfig(sDir, spiritConfig);
4390
- const { getScheduler: getScheduler2 } = await import("./scheduler-BR6C6B3E.js");
4390
+ const { getScheduler: getScheduler2 } = await import("./scheduler-VON2TB52.js");
4391
4391
  getScheduler2().loadSchedules("volute", sDir);
4392
4392
  }
4393
4393
  }
@@ -4652,7 +4652,7 @@ ${user.trimEnd()}
4652
4652
  const manager = getMindManager();
4653
4653
  try {
4654
4654
  if (context?.type === "reload") {
4655
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-BVU5D2AE.js");
4655
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-AG5SQDDI.js");
4656
4656
  const sleepState = getSleepManagerIfReady2()?.getState(name);
4657
4657
  if (sleepState?.sleeping) {
4658
4658
  logger_default.info(`skipping reload for ${name} during sleep \u2014 will apply on next wake`);
@@ -4779,7 +4779,7 @@ ${user.trimEnd()}
4779
4779
  const name = c.req.param("name");
4780
4780
  const entry = await findMind(name);
4781
4781
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4782
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-BVU5D2AE.js");
4782
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-AG5SQDDI.js");
4783
4783
  const sm = getSleepManagerIfReady2();
4784
4784
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4785
4785
  return c.json(sm.getState(name));
@@ -4787,7 +4787,7 @@ ${user.trimEnd()}
4787
4787
  const name = c.req.param("name");
4788
4788
  const entry = await findMind(name);
4789
4789
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4790
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-BVU5D2AE.js");
4790
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-AG5SQDDI.js");
4791
4791
  const sm = getSleepManagerIfReady2();
4792
4792
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4793
4793
  if (sm.isSleeping(name)) return c.json({ error: "Mind is already sleeping" }, 409);
@@ -4807,7 +4807,7 @@ ${user.trimEnd()}
4807
4807
  const name = c.req.param("name");
4808
4808
  const entry = await findMind(name);
4809
4809
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4810
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-BVU5D2AE.js");
4810
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-AG5SQDDI.js");
4811
4811
  const sm = getSleepManagerIfReady2();
4812
4812
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4813
4813
  const sleepState = sm.getState(name);
@@ -4822,7 +4822,7 @@ ${user.trimEnd()}
4822
4822
  const name = c.req.param("name");
4823
4823
  const entry = await findMind(name);
4824
4824
  if (!entry) return c.json({ error: "Mind not found" }, 404);
4825
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-BVU5D2AE.js");
4825
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-AG5SQDDI.js");
4826
4826
  const sm = getSleepManagerIfReady2();
4827
4827
  if (!sm) return c.json({ error: "Sleep manager not initialized" }, 503);
4828
4828
  const flushed = await sm.flushQueuedMessages(name);
@@ -4925,7 +4925,7 @@ ${user.trimEnd()}
4925
4925
  try {
4926
4926
  const spiritEntry = await findMind("volute");
4927
4927
  if (spiritEntry) {
4928
- const { spiritDir } = await import("./spirit-JQQHUVWR.js");
4928
+ const { spiritDir } = await import("./spirit-53DQPRNR.js");
4929
4929
  const sDir = spiritEntry.dir ?? spiritDir();
4930
4930
  const spiritConfig = readVoluteConfig(sDir);
4931
4931
  if (spiritConfig?.schedules) {
@@ -4933,7 +4933,7 @@ ${user.trimEnd()}
4933
4933
  spiritConfig.schedules = spiritConfig.schedules.filter((s) => s.id !== nurtureId);
4934
4934
  if (spiritConfig.schedules.length === 0) spiritConfig.schedules = void 0;
4935
4935
  writeVoluteConfig(sDir, spiritConfig);
4936
- const { getScheduler: getScheduler2 } = await import("./scheduler-BR6C6B3E.js");
4936
+ const { getScheduler: getScheduler2 } = await import("./scheduler-VON2TB52.js");
4937
4937
  getScheduler2().loadSchedules("volute", sDir);
4938
4938
  }
4939
4939
  }
@@ -5368,7 +5368,7 @@ ${user.trimEnd()}
5368
5368
  }
5369
5369
  writeVoluteConfig(dir, existing);
5370
5370
  if (body.unescapeNewlines !== void 0) {
5371
- const { clearEchoTextCache } = await import("./echo-text-XKBJM6RV.js");
5371
+ const { clearEchoTextCache } = await import("./echo-text-KFSUCZXL.js");
5372
5372
  clearEchoTextCache(name);
5373
5373
  }
5374
5374
  const needsConfigJson = body.model !== void 0 || body.thinkingLevel !== void 0 || body.maxThinkingTokens !== void 0 || body.compaction !== void 0;
@@ -6058,7 +6058,7 @@ var app15 = new Hono17().get("/:name/clock/status", requireSelf(), async (c) =>
6058
6058
  const body = await c.req.text();
6059
6059
  const message = `[webhook: ${event}] ${body}`;
6060
6060
  try {
6061
- const { sendSystemMessage } = await import("./system-chat-KMQIP7VH.js");
6061
+ const { sendSystemMessage } = await import("./system-chat-54RN3K67.js");
6062
6062
  await sendSystemMessage(name, message);
6063
6063
  return c.json({ ok: true });
6064
6064
  } catch (err) {
@@ -6387,8 +6387,8 @@ setup.post("/complete", async (c) => {
6387
6387
  return c.json({ error: "Setup already complete" }, 400);
6388
6388
  }
6389
6389
  try {
6390
- const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-JQQHUVWR.js");
6391
- const { startSpiritFull } = await import("./mind-service-ZBVUMJ5H.js");
6390
+ const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-53DQPRNR.js");
6391
+ const { startSpiritFull } = await import("./mind-service-2C7AINBO.js");
6392
6392
  await ensureSpiritProject();
6393
6393
  await syncSpiritTemplate();
6394
6394
  const warnings = [];
@@ -6446,7 +6446,7 @@ setup.post("/complete", async (c) => {
6446
6446
  logger_default.info("setup complete state", { spiritConversationId, spiritStarted });
6447
6447
  if (spiritConversationId && spiritStarted) {
6448
6448
  try {
6449
- const { deliverMessage: deliverMessage2 } = await import("./message-delivery-WJBZFALY.js");
6449
+ const { deliverMessage: deliverMessage2 } = await import("./message-delivery-HRGFNWO7.js");
6450
6450
  const { listUsersByType: listUsers2 } = await import("./auth-3RIG6GKN.js");
6451
6451
  const admins = await listUsers2("brain");
6452
6452
  const admin2 = admins.find((u) => u.role === "admin");
@@ -8143,8 +8143,8 @@ async function startDaemon(opts) {
8143
8143
  try {
8144
8144
  const { isSetupComplete: isSetupComplete2 } = await import("./setup-25MMJ3J4.js");
8145
8145
  if (isSetupComplete2()) {
8146
- const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-JQQHUVWR.js");
8147
- const { startSpiritFull } = await import("./mind-service-ZBVUMJ5H.js");
8146
+ const { ensureSpiritProject, syncSpiritTemplate } = await import("./spirit-53DQPRNR.js");
8147
+ const { startSpiritFull } = await import("./mind-service-2C7AINBO.js");
8148
8148
  await ensureSpiritProject();
8149
8149
  await syncSpiritTemplate();
8150
8150
  const spiritEntry = await findMind("volute");
@@ -8161,7 +8161,7 @@ async function startDaemon(opts) {
8161
8161
  bridgeManager.startBridges(daemonPort).catch((err) => {
8162
8162
  logger_default.warn("failed to start bridges", logger_default.errorData(err));
8163
8163
  });
8164
- import("./cloud-sync-FRYNWKCR.js").then(
8164
+ import("./cloud-sync-KOEBUFW5.js").then(
8165
8165
  ({ consumeQueuedMessages }) => consumeQueuedMessages().catch((err) => {
8166
8166
  logger_default.warn("failed to consume queued cloud messages", logger_default.errorData(err));
8167
8167
  })
@@ -8169,7 +8169,7 @@ async function startDaemon(opts) {
8169
8169
  logger_default.warn("failed to load cloud-sync module", logger_default.errorData(err));
8170
8170
  });
8171
8171
  try {
8172
- const { backfillTemplateHashes, notifyVersionUpdate } = await import("./version-notify-DCAIXXZB.js");
8172
+ const { backfillTemplateHashes, notifyVersionUpdate } = await import("./version-notify-SRQJCQEK.js");
8173
8173
  backfillTemplateHashes();
8174
8174
  notifyVersionUpdate().catch((err) => {
8175
8175
  logger_default.warn("failed to send version update notifications", logger_default.errorData(err));
@@ -4,17 +4,17 @@ import {
4
4
  getDeliveryManager,
5
5
  initDeliveryManager,
6
6
  tryGetDeliveryManager
7
- } from "./chunk-PF2AB7VJ.js";
7
+ } from "./chunk-4SVONUTC.js";
8
8
  import "./chunk-XDTKJNW5.js";
9
- import "./chunk-65OLHBCL.js";
9
+ import "./chunk-QQ2MVQU3.js";
10
10
  import "./chunk-QLWG3C2Z.js";
11
- import "./chunk-FSSUANZJ.js";
11
+ import "./chunk-KINGVQSR.js";
12
12
  import "./chunk-K4EHBHPE.js";
13
13
  import "./chunk-CU6OFXMM.js";
14
14
  import "./chunk-C6ESRQZ7.js";
15
15
  import "./chunk-M3PGGSBH.js";
16
16
  import "./chunk-SPLPKBES.js";
17
- import "./chunk-3WLWKOGM.js";
17
+ import "./chunk-Y6O35D7K.js";
18
18
  import "./chunk-PGPLCJPK.js";
19
19
  import "./chunk-YSV3VJQK.js";
20
20
  import "./chunk-ONM2AZFL.js";
@@ -2,19 +2,19 @@
2
2
  import {
3
3
  clearEchoTextCache,
4
4
  echoTextToChannel
5
- } from "./chunk-FZ5TH5PF.js";
5
+ } from "./chunk-DMUPZQWP.js";
6
6
  import "./chunk-57LBQ7JX.js";
7
- import "./chunk-PF2AB7VJ.js";
7
+ import "./chunk-4SVONUTC.js";
8
8
  import "./chunk-XDTKJNW5.js";
9
- import "./chunk-65OLHBCL.js";
9
+ import "./chunk-QQ2MVQU3.js";
10
10
  import "./chunk-QLWG3C2Z.js";
11
- import "./chunk-FSSUANZJ.js";
11
+ import "./chunk-KINGVQSR.js";
12
12
  import "./chunk-K4EHBHPE.js";
13
13
  import "./chunk-CU6OFXMM.js";
14
14
  import "./chunk-C6ESRQZ7.js";
15
15
  import "./chunk-M3PGGSBH.js";
16
16
  import "./chunk-SPLPKBES.js";
17
- import "./chunk-3WLWKOGM.js";
17
+ import "./chunk-Y6O35D7K.js";
18
18
  import "./chunk-ATEX3ZPG.js";
19
19
  import "./chunk-PGPLCJPK.js";
20
20
  import "./chunk-YSV3VJQK.js";
@@ -13,17 +13,17 @@ import {
13
13
  parseCommandArgs,
14
14
  setExtensionEnabled,
15
15
  uninstallNpmExtension
16
- } from "./chunk-PF2AB7VJ.js";
16
+ } from "./chunk-4SVONUTC.js";
17
17
  import "./chunk-XDTKJNW5.js";
18
- import "./chunk-65OLHBCL.js";
18
+ import "./chunk-QQ2MVQU3.js";
19
19
  import "./chunk-QLWG3C2Z.js";
20
- import "./chunk-FSSUANZJ.js";
20
+ import "./chunk-KINGVQSR.js";
21
21
  import "./chunk-K4EHBHPE.js";
22
22
  import "./chunk-CU6OFXMM.js";
23
23
  import "./chunk-C6ESRQZ7.js";
24
24
  import "./chunk-M3PGGSBH.js";
25
25
  import "./chunk-SPLPKBES.js";
26
- import "./chunk-3WLWKOGM.js";
26
+ import "./chunk-Y6O35D7K.js";
27
27
  import "./chunk-PGPLCJPK.js";
28
28
  import "./chunk-YSV3VJQK.js";
29
29
  import "./chunk-ONM2AZFL.js";
@@ -5,17 +5,17 @@ import {
5
5
  recordInbound,
6
6
  recordOutbound,
7
7
  resolveSleepAction
8
- } from "./chunk-PF2AB7VJ.js";
8
+ } from "./chunk-4SVONUTC.js";
9
9
  import "./chunk-XDTKJNW5.js";
10
- import "./chunk-65OLHBCL.js";
10
+ import "./chunk-QQ2MVQU3.js";
11
11
  import "./chunk-QLWG3C2Z.js";
12
- import "./chunk-FSSUANZJ.js";
12
+ import "./chunk-KINGVQSR.js";
13
13
  import "./chunk-K4EHBHPE.js";
14
14
  import "./chunk-CU6OFXMM.js";
15
15
  import "./chunk-C6ESRQZ7.js";
16
16
  import "./chunk-M3PGGSBH.js";
17
17
  import "./chunk-SPLPKBES.js";
18
- import "./chunk-3WLWKOGM.js";
18
+ import "./chunk-Y6O35D7K.js";
19
19
  import "./chunk-PGPLCJPK.js";
20
20
  import "./chunk-YSV3VJQK.js";
21
21
  import "./chunk-ONM2AZFL.js";
@@ -82,11 +82,11 @@ var cmd = subcommands({
82
82
  },
83
83
  seed: {
84
84
  description: "(legacy) Use 'volute seed create' instead",
85
- run: (args) => import("./seed-KOG6KJAO.js").then((m) => m.run(args))
85
+ run: (args) => import("./seed-HHSJTM6O.js").then((m) => m.run(args))
86
86
  },
87
87
  sprout: {
88
88
  description: "(legacy) Use 'volute seed sprout' instead",
89
- run: (args) => import("./sprout-4WAYBUVV.js").then((m) => m.run(args))
89
+ run: (args) => import("./sprout-YKM2M6D6.js").then((m) => m.run(args))
90
90
  }
91
91
  },
92
92
  footer: "Mind name can be omitted (where applicable) if VOLUTE_MIND is set."
@@ -6,17 +6,17 @@ import {
6
6
  stopMindFull,
7
7
  stopSpiritFull,
8
8
  wakeMind
9
- } from "./chunk-PF2AB7VJ.js";
9
+ } from "./chunk-4SVONUTC.js";
10
10
  import "./chunk-XDTKJNW5.js";
11
- import "./chunk-65OLHBCL.js";
11
+ import "./chunk-QQ2MVQU3.js";
12
12
  import "./chunk-QLWG3C2Z.js";
13
- import "./chunk-FSSUANZJ.js";
13
+ import "./chunk-KINGVQSR.js";
14
14
  import "./chunk-K4EHBHPE.js";
15
15
  import "./chunk-CU6OFXMM.js";
16
16
  import "./chunk-C6ESRQZ7.js";
17
17
  import "./chunk-M3PGGSBH.js";
18
18
  import "./chunk-SPLPKBES.js";
19
- import "./chunk-3WLWKOGM.js";
19
+ import "./chunk-Y6O35D7K.js";
20
20
  import "./chunk-PGPLCJPK.js";
21
21
  import "./chunk-YSV3VJQK.js";
22
22
  import "./chunk-ONM2AZFL.js";
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
4
4
  // package.json
5
5
  var package_default = {
6
6
  name: "volute",
7
- version: "0.43.0",
7
+ version: "0.43.1",
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",
@@ -3,17 +3,17 @@ import {
3
3
  Scheduler,
4
4
  getScheduler,
5
5
  initScheduler
6
- } from "./chunk-PF2AB7VJ.js";
6
+ } from "./chunk-4SVONUTC.js";
7
7
  import "./chunk-XDTKJNW5.js";
8
- import "./chunk-65OLHBCL.js";
8
+ import "./chunk-QQ2MVQU3.js";
9
9
  import "./chunk-QLWG3C2Z.js";
10
- import "./chunk-FSSUANZJ.js";
10
+ import "./chunk-KINGVQSR.js";
11
11
  import "./chunk-K4EHBHPE.js";
12
12
  import "./chunk-CU6OFXMM.js";
13
13
  import "./chunk-C6ESRQZ7.js";
14
14
  import "./chunk-M3PGGSBH.js";
15
15
  import "./chunk-SPLPKBES.js";
16
- import "./chunk-3WLWKOGM.js";
16
+ import "./chunk-Y6O35D7K.js";
17
17
  import "./chunk-PGPLCJPK.js";
18
18
  import "./chunk-YSV3VJQK.js";
19
19
  import "./chunk-ONM2AZFL.js";
@@ -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-YXO6R4KE.js").then((m) => m.run(args));
7
+ await import("./seed-create-MDRMXMSB.js").then((m) => m.run(args));
8
8
  }
9
9
  export {
10
10
  run
@@ -12,11 +12,11 @@ var cmd = subcommands({
12
12
  commands: {
13
13
  create: {
14
14
  description: "Plant a new seed",
15
- run: (args) => import("./seed-create-YXO6R4KE.js").then((m) => m.run(args))
15
+ run: (args) => import("./seed-create-MDRMXMSB.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-BBU64QXP.js").then((m) => m.run(args))
19
+ run: (args) => import("./seed-sprout-4M7IQWMH.js").then((m) => m.run(args))
20
20
  },
21
21
  check: {
22
22
  description: "Check seed readiness",
@@ -58,7 +58,7 @@ var cmd = command({
58
58
  }
59
59
  if (template !== "claude" && !model) {
60
60
  if (process.env.VOLUTE_MIND || !process.stdin.isTTY) {
61
- const { getSpiritModel } = await import("./spirit-JQQHUVWR.js");
61
+ const { getSpiritModel } = await import("./spirit-53DQPRNR.js");
62
62
  const { qualifyModelId } = await import("./ai-service-FBCCEYF5.js");
63
63
  const spiritModel = getSpiritModel();
64
64
  if (spiritModel) {
@@ -8,7 +8,7 @@ import {
8
8
  import "./chunk-O7IGP7ZW.js";
9
9
  import {
10
10
  getStandardSkillsWithExtensions
11
- } from "./chunk-FSSUANZJ.js";
11
+ } from "./chunk-KINGVQSR.js";
12
12
  import "./chunk-PGPLCJPK.js";
13
13
  import "./chunk-ONM2AZFL.js";
14
14
  import "./chunk-T2TP6ZC6.js";
@@ -73,7 +73,7 @@ var cmd = command({
73
73
  }
74
74
  }
75
75
  const { getClient, urlOf } = await import("./api-client-LC5YRA32.js");
76
- const { mindSkillsDir } = await import("./skills-DPI3WZPQ.js");
76
+ const { mindSkillsDir } = await import("./skills-4KQ377GN.js");
77
77
  const client = getClient();
78
78
  const failedSkills = [];
79
79
  for (const skillId of getStandardSkillsWithExtensions()) {
@@ -221,7 +221,7 @@ async function startDaemonAndOpenBrowser(port, host) {
221
221
  const url = `http://${displayHost === "0.0.0.0" || displayHost === "::" ? "localhost" : displayHost}:${displayPort}`;
222
222
  console.log("\nStarting daemon...");
223
223
  try {
224
- const { run: runUp } = await import("./up-7RSBEKW6.js");
224
+ const { run: runUp } = await import("./up-LFZA4GI5.js");
225
225
  await runUp([
226
226
  ...port != null ? ["--port", String(port)] : [],
227
227
  ...host ? ["--host", host] : []
@@ -27,7 +27,7 @@ import {
27
27
  syncBuiltinSkills,
28
28
  uninstallSkill,
29
29
  updateSkill
30
- } from "./chunk-FSSUANZJ.js";
30
+ } from "./chunk-KINGVQSR.js";
31
31
  import "./chunk-PGPLCJPK.js";
32
32
  import "./chunk-ONM2AZFL.js";
33
33
  import "./chunk-T2TP6ZC6.js";
@@ -5,17 +5,17 @@ import {
5
5
  getSleepManagerIfReady,
6
6
  initSleepManager,
7
7
  matchesGlob
8
- } from "./chunk-PF2AB7VJ.js";
8
+ } from "./chunk-4SVONUTC.js";
9
9
  import "./chunk-XDTKJNW5.js";
10
- import "./chunk-65OLHBCL.js";
10
+ import "./chunk-QQ2MVQU3.js";
11
11
  import "./chunk-QLWG3C2Z.js";
12
- import "./chunk-FSSUANZJ.js";
12
+ import "./chunk-KINGVQSR.js";
13
13
  import "./chunk-K4EHBHPE.js";
14
14
  import "./chunk-CU6OFXMM.js";
15
15
  import "./chunk-C6ESRQZ7.js";
16
16
  import "./chunk-M3PGGSBH.js";
17
17
  import "./chunk-SPLPKBES.js";
18
- import "./chunk-3WLWKOGM.js";
18
+ import "./chunk-Y6O35D7K.js";
19
19
  import "./chunk-PGPLCJPK.js";
20
20
  import "./chunk-YSV3VJQK.js";
21
21
  import "./chunk-ONM2AZFL.js";
@@ -4,9 +4,9 @@ import {
4
4
  getSpiritModel,
5
5
  spiritDir,
6
6
  syncSpiritTemplate
7
- } from "./chunk-65OLHBCL.js";
7
+ } from "./chunk-QQ2MVQU3.js";
8
8
  import "./chunk-QLWG3C2Z.js";
9
- import "./chunk-FSSUANZJ.js";
9
+ import "./chunk-KINGVQSR.js";
10
10
  import "./chunk-CU6OFXMM.js";
11
11
  import "./chunk-PGPLCJPK.js";
12
12
  import "./chunk-YSV3VJQK.js";
@@ -4,7 +4,7 @@ import "./chunk-K3NQKI34.js";
4
4
  // packages/cli/src/commands/sprout.ts
5
5
  async function run(args) {
6
6
  console.error("Note: `volute mind sprout` is now `volute seed sprout`");
7
- await import("./seed-sprout-BBU64QXP.js").then((m) => m.run(args));
7
+ await import("./seed-sprout-4M7IQWMH.js").then((m) => m.run(args));
8
8
  }
9
9
  export {
10
10
  run
@@ -77,6 +77,11 @@ function pagesRepoDir(dataDir) {
77
77
  function worktreePath(mindDir) {
78
78
  return resolve(mindDir, "home", "pages", "_system");
79
79
  }
80
+ function pagesIsolationChownPaths(mindDir, wtGitDir) {
81
+ const paths = [resolve(mindDir, "home", "pages")];
82
+ if (wtGitDir) paths.push(wtGitDir);
83
+ return paths;
84
+ }
80
85
  async function ensurePagesRepo(dataDir, isolation) {
81
86
  const dir = pagesRepoDir(dataDir);
82
87
  mkdirSync(dir, { recursive: true });
@@ -129,17 +134,12 @@ async function addPagesWorktree(mindName, mindDir, dataDir, isolation) {
129
134
  }
130
135
  if (isolation?.isIsolationEnabled()) {
131
136
  const user = isolation.getMindUser(mindName);
132
- try {
133
- await execAsync("chown", ["-R", `${user}:volute`, wt]);
134
- } catch {
135
- console.warn(`[pages] failed to chown worktree for ${mindName}`);
136
- }
137
137
  const wtGitDir = readWorktreeGitDir(wt);
138
- if (wtGitDir) {
138
+ for (const target of pagesIsolationChownPaths(mindDir, wtGitDir)) {
139
139
  try {
140
- await execAsync("chown", ["-R", `${user}:volute`, wtGitDir]);
140
+ await execAsync("chown", ["-R", `${user}:volute`, target]);
141
141
  } catch {
142
- console.warn(`[pages] failed to chown worktree git dir for ${mindName}`);
142
+ console.warn(`[pages] failed to chown ${target} for ${mindName}`);
143
143
  }
144
144
  }
145
145
  }
@@ -5,17 +5,17 @@ import {
5
5
  resetSystemDMCache,
6
6
  sendSystemMessage,
7
7
  sendSystemMessageDirect
8
- } from "./chunk-PF2AB7VJ.js";
8
+ } from "./chunk-4SVONUTC.js";
9
9
  import "./chunk-XDTKJNW5.js";
10
- import "./chunk-65OLHBCL.js";
10
+ import "./chunk-QQ2MVQU3.js";
11
11
  import "./chunk-QLWG3C2Z.js";
12
- import "./chunk-FSSUANZJ.js";
12
+ import "./chunk-KINGVQSR.js";
13
13
  import "./chunk-K4EHBHPE.js";
14
14
  import "./chunk-CU6OFXMM.js";
15
15
  import "./chunk-C6ESRQZ7.js";
16
16
  import "./chunk-M3PGGSBH.js";
17
17
  import "./chunk-SPLPKBES.js";
18
- import "./chunk-3WLWKOGM.js";
18
+ import "./chunk-Y6O35D7K.js";
19
19
  import "./chunk-PGPLCJPK.js";
20
20
  import "./chunk-YSV3VJQK.js";
21
21
  import "./chunk-ONM2AZFL.js";
@@ -13,7 +13,7 @@ import {
13
13
  sweepWedgedTurns,
14
14
  takeErrored,
15
15
  trackToolUse
16
- } from "./chunk-3WLWKOGM.js";
16
+ } from "./chunk-Y6O35D7K.js";
17
17
  import "./chunk-YSV3VJQK.js";
18
18
  import "./chunk-ONM2AZFL.js";
19
19
  import "./chunk-T2TP6ZC6.js";
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  run
4
- } from "./chunk-ZO7IQJKO.js";
4
+ } from "./chunk-DE4EKQFH.js";
5
5
  import "./chunk-TXSA4Q3V.js";
6
6
  import "./chunk-O7IGP7ZW.js";
7
7
  import "./chunk-ATEX3ZPG.js";
@@ -7,17 +7,17 @@ import {
7
7
  } from "./chunk-QMJCNZ6C.js";
8
8
  import {
9
9
  sendSystemMessage
10
- } from "./chunk-PF2AB7VJ.js";
10
+ } from "./chunk-4SVONUTC.js";
11
11
  import "./chunk-XDTKJNW5.js";
12
- import "./chunk-65OLHBCL.js";
12
+ import "./chunk-QQ2MVQU3.js";
13
13
  import "./chunk-QLWG3C2Z.js";
14
- import "./chunk-FSSUANZJ.js";
14
+ import "./chunk-KINGVQSR.js";
15
15
  import "./chunk-K4EHBHPE.js";
16
16
  import "./chunk-CU6OFXMM.js";
17
17
  import "./chunk-C6ESRQZ7.js";
18
18
  import "./chunk-M3PGGSBH.js";
19
19
  import "./chunk-SPLPKBES.js";
20
- import "./chunk-3WLWKOGM.js";
20
+ import "./chunk-Y6O35D7K.js";
21
21
  import "./chunk-PGPLCJPK.js";
22
22
  import "./chunk-YSV3VJQK.js";
23
23
  import "./chunk-ONM2AZFL.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "volute",
3
- "version": "0.43.0",
3
+ "version": "0.43.1",
4
4
  "description": "CLI for creating and managing self-modifying AI minds powered by the Claude Agent SDK",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -292,6 +292,9 @@ export function createMind(options: {
292
292
  },
293
293
  broadcast: (event: VoluteEvent) => broadcastToSession(session, event),
294
294
  onTurnEnd: async () => {
295
+ // This turn's message is fully processed — drop it from the channel's
296
+ // in-flight set so a later compaction abort won't re-feed it.
297
+ session.channel.ack();
295
298
  await autoCommit.flushFileChanges();
296
299
  const wasCompacting = compactionTriggered.get(session.name);
297
300
  compactionTriggered.set(session.name, false);
@@ -422,7 +425,11 @@ export function createMind(options: {
422
425
  break;
423
426
  }
424
427
  streamAbort = new AbortController();
425
- const pending = session.channel.drain();
428
+ // Recover input the aborted stream had already pulled but not
429
+ // finished (the compaction wrap-up plus any messages that arrived
430
+ // mid-turn) alongside anything queued during /compact, so nothing
431
+ // is dropped when the killed subprocess takes its buffer with it.
432
+ const pending = session.channel.recover();
426
433
  session.channel = createMessageChannel();
427
434
  for (const msg of pending) session.channel.push(msg);
428
435
  continue; // restart the stream loop
@@ -2,40 +2,62 @@ import type { SDKUserMessage } from "@anthropic-ai/claude-agent-sdk";
2
2
 
3
3
  export type MessageChannel = {
4
4
  push: (msg: SDKUserMessage) => void;
5
- drain: () => SDKUserMessage[];
5
+ /** Acknowledge that the oldest in-flight message's turn has completed. */
6
+ ack: () => void;
7
+ /**
8
+ * Return every message that has not been fully processed — those delivered to
9
+ * the consumer but not yet acked (their turn never finished) followed by those
10
+ * still queued — and reset the channel. Used to re-feed the stream after a
11
+ * compaction abort so in-flight input is never lost.
12
+ */
13
+ recover: () => SDKUserMessage[];
6
14
  iterable: AsyncIterable<SDKUserMessage>;
7
15
  };
8
16
 
9
17
  export function createMessageChannel(): MessageChannel {
10
18
  const queue: SDKUserMessage[] = [];
19
+ // Messages handed to the consumer (the SDK's read-ahead) whose turn has not yet
20
+ // completed. The SDK's streamInput loop pulls messages eagerly and writes them
21
+ // to the CLI subprocess, so once delivered they no longer live in `queue`. We
22
+ // retain them here so a compaction abort — which kills that subprocess — can
23
+ // re-feed the unprocessed ones instead of dropping them.
24
+ const inFlight: SDKUserMessage[] = [];
11
25
  let resolve: ((value: IteratorResult<SDKUserMessage>) => void) | null = null;
12
26
 
27
+ function deliver(msg: SDKUserMessage): IteratorResult<SDKUserMessage> {
28
+ inFlight.push(msg);
29
+ return { value: msg, done: false };
30
+ }
31
+
13
32
  return {
14
33
  push(msg: SDKUserMessage) {
15
34
  if (resolve) {
16
35
  const r = resolve;
17
36
  resolve = null;
18
- r({ value: msg, done: false });
37
+ r(deliver(msg));
19
38
  } else {
20
39
  queue.push(msg);
21
40
  }
22
41
  },
23
- drain() {
42
+ ack() {
43
+ inFlight.shift();
44
+ },
45
+ recover() {
24
46
  // Resolve any pending iterator wait with done:true so it doesn't
25
- // leak as an orphaned promise (the old iterator is discarded after drain)
47
+ // leak as an orphaned promise (the old iterator is discarded after recover)
26
48
  if (resolve) {
27
49
  const r = resolve;
28
50
  resolve = null;
29
51
  r({ value: undefined as any, done: true });
30
52
  }
31
- return queue.splice(0);
53
+ return [...inFlight.splice(0), ...queue.splice(0)];
32
54
  },
33
55
  iterable: {
34
56
  [Symbol.asyncIterator]() {
35
57
  return {
36
58
  next(): Promise<IteratorResult<SDKUserMessage>> {
37
59
  if (queue.length > 0) {
38
- return Promise.resolve({ value: queue.shift()!, done: false });
60
+ return Promise.resolve(deliver(queue.shift()!));
39
61
  }
40
62
  return new Promise((r) => {
41
63
  resolve = r;
File without changes