volute 0.38.0 → 0.39.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 (92) hide show
  1. package/dist/{activity-events-N6HCHU4P.js → activity-events-CR4RIHJT.js} +2 -2
  2. package/dist/{ai-service-C2YNARGH.js → ai-service-PL7GKFQC.js} +3 -3
  3. package/dist/{archive-AWIJTVQV.js → archive-UEWIFRAR.js} +2 -2
  4. package/dist/{auth-2QOOPMBX.js → auth-OJ2YW3NR.js} +3 -3
  5. package/dist/{chat-XL7CVWVJ.js → chat-RQ5NV5EA.js} +2 -2
  6. package/dist/{chunk-PLL2FM7A.js → chunk-4BO4I7UF.js} +6 -6
  7. package/dist/{chunk-SNW2NPP4.js → chunk-6FSSMAXU.js} +1 -1
  8. package/dist/{chunk-TNZ5XQA4.js → chunk-6V2U3GFQ.js} +2 -2
  9. package/dist/{chunk-N42QMDID.js → chunk-7GZB3ZJP.js} +1 -1
  10. package/dist/{chunk-NGXQ2ESO.js → chunk-7OS7QFDF.js} +3 -3
  11. package/dist/{chunk-UIM5NHPP.js → chunk-7W3UWCQD.js} +2 -2
  12. package/dist/{chunk-ORNY3MZR.js → chunk-B7MWXFAH.js} +1 -1
  13. package/dist/{chunk-TEZRVSSB.js → chunk-CHCISTH7.js} +33 -31
  14. package/dist/{chunk-GVVVMZ4J.js → chunk-DZ4LYU6J.js} +1 -1
  15. package/dist/{chunk-KXXJYY62.js → chunk-EVKGKQ2P.js} +55 -37
  16. package/dist/{chunk-BIEWHAAM.js → chunk-IA2SZSLB.js} +1 -1
  17. package/dist/{chunk-VUM2K6EN.js → chunk-IBOU6Q3Y.js} +4 -4
  18. package/dist/{chunk-3F7XK5Q7.js → chunk-OEXOFBW5.js} +1 -1
  19. package/dist/{chunk-7AZQFSOV.js → chunk-OS5MRIEP.js} +1 -1
  20. package/dist/{chunk-2NHRJ3YO.js → chunk-QDWP435B.js} +2 -2
  21. package/dist/{chunk-5DPRTREW.js → chunk-QDWPM73D.js} +2 -2
  22. package/dist/{chunk-LN67VPZJ.js → chunk-QJ4GU5XT.js} +2 -2
  23. package/dist/{chunk-WC635OPK.js → chunk-RAVQXKAG.js} +1 -1
  24. package/dist/{chunk-A6FLW5XD.js → chunk-TCNCRDB5.js} +1 -1
  25. package/dist/{chunk-XLBQYIHH.js → chunk-TT4WT6Y7.js} +1 -1
  26. package/dist/{chunk-PMMHVSCR.js → chunk-WUH54G5S.js} +1 -1
  27. package/dist/{chunk-SZJWC2GA.js → chunk-X7GM2OPM.js} +2 -2
  28. package/dist/{chunk-LQ6Z4FXN.js → chunk-XOSAY7PY.js} +1 -1
  29. package/dist/{chunk-2TR2OPVA.js → chunk-Y4W3OS7Q.js} +7 -7
  30. package/dist/{chunk-JOJT34M2.js → chunk-Y5UC6G3O.js} +2 -2
  31. package/dist/cli.js +15 -15
  32. package/dist/{cloud-sync-PEM3IVI4.js → cloud-sync-NQCWJLYI.js} +15 -15
  33. package/dist/{conversations-G6YRSABR.js → conversations-EUXHBWJD.js} +3 -3
  34. package/dist/{create-PN73742N.js → create-3QH7DVLC.js} +1 -1
  35. package/dist/{daemon-restart-6QONRBTK.js → daemon-restart-UEB3PLKB.js} +7 -7
  36. package/dist/daemon.js +69 -69
  37. package/dist/{db-CBOCDYVA.js → db-32YFKMFL.js} +1 -1
  38. package/dist/delivery-manager-N34XKUGL.js +30 -0
  39. package/dist/{delivery-router-QTFEZ26O.js → delivery-router-EUW4RIWG.js} +2 -2
  40. package/dist/{down-5XZWH4ZP.js → down-TCEBGTMY.js} +5 -5
  41. package/dist/echo-text-N3BC3WNX.js +31 -0
  42. package/dist/{exec-ONYZEA5B.js → exec-2MFHTGOS.js} +3 -3
  43. package/dist/{export-JPDBQESV.js → export-JDAK3THX.js} +2 -2
  44. package/dist/{extensions-P477XR46.js → extensions-V7TXKAKM.js} +15 -15
  45. package/dist/{files-LAQ3NXQK.js → files-K5XV23H6.js} +2 -2
  46. package/dist/{import-EROF27RH.js → import-GZ5IYVV7.js} +5 -5
  47. package/dist/{isolation-G5J3MTKU.js → isolation-FPF4UTH2.js} +2 -2
  48. package/dist/{login-F6YMAVLE.js → login-BGF5JY3I.js} +1 -1
  49. package/dist/{logout-HHPH52KZ.js → logout-GQHI6KH6.js} +1 -1
  50. package/dist/{message-delivery-54IXVE5H.js → message-delivery-X7MKA3TA.js} +15 -15
  51. package/dist/{mind-G5HDKBKL.js → mind-QMJIWWWW.js} +5 -5
  52. package/dist/{mind-activity-tracker-42ENM32S.js → mind-activity-tracker-Z3KBQTVU.js} +3 -3
  53. package/dist/mind-manager-7GWTTKWD.js +30 -0
  54. package/dist/mind-service-MO2XJKJN.js +36 -0
  55. package/dist/{package-LYQHSDPG.js → package-IR4ZEQA2.js} +1 -1
  56. package/dist/{registry-KMELPC3X.js → registry-LWEOAO53.js} +1 -1
  57. package/dist/{sandbox-PQYEICEF.js → sandbox-KUAVC37A.js} +5 -5
  58. package/dist/scheduler-CGUPAEBA.js +30 -0
  59. package/dist/{seed-3KH4ZRJL.js → seed-GPBERPXJ.js} +1 -1
  60. package/dist/{seed-cmd-6A76SSAA.js → seed-cmd-PWF4FYFG.js} +2 -2
  61. package/dist/{seed-create-XXRRGZCO.js → seed-create-NTIICZVB.js} +3 -3
  62. package/dist/{seed-sprout-HLMUH2AI.js → seed-sprout-PRPFKGJF.js} +7 -7
  63. package/dist/{send-7CIP5GLS.js → send-IMHDYJHW.js} +2 -2
  64. package/dist/{service-RH6Q2XWR.js → service-DWBRRFXS.js} +4 -4
  65. package/dist/{service-install-AIQBLE6P.js → service-install-KEBDNZVE.js} +5 -5
  66. package/dist/{setup-NPAZXBIJ.js → setup-4CWQ53VV.js} +7 -7
  67. package/dist/{setup-PF7JSFMO.js → setup-IFYS3TLS.js} +2 -2
  68. package/dist/{skills-NVOWS5NY.js → skills-FJ5W73AV.js} +5 -5
  69. package/dist/sleep-manager-6QRMUNHK.js +34 -0
  70. package/dist/{spirit-ZFYG4JOH.js → spirit-U6MDQLYT.js} +7 -7
  71. package/dist/{sprout-FLBCETYG.js → sprout-ABX2G76C.js} +1 -1
  72. package/dist/{status-TGOKAFW3.js → status-C6BBWNU3.js} +5 -5
  73. package/dist/system-chat-D343HYGR.js +34 -0
  74. package/dist/{tailscale-LTYNKIPZ.js → tailscale-2KKXDMNK.js} +1 -1
  75. package/dist/{up-YRZAEZ3Z.js → up-ZU6ILVMA.js} +6 -6
  76. package/dist/{update-ZCTQ6UGY.js → update-V26PT4VN.js} +5 -5
  77. package/dist/{update-check-IKS7SGK5.js → update-check-XRERV36Y.js} +2 -2
  78. package/dist/{version-notify-764EXVQQ.js → version-notify-ZBMY2TEX.js} +16 -16
  79. package/dist/web-assets/assets/index-B1zwqwt8.css +1 -0
  80. package/dist/web-assets/assets/index-D1guJF1i.js +73 -0
  81. package/dist/web-assets/index.html +2 -2
  82. package/package.json +1 -1
  83. package/templates/codex/src/agent.ts +6 -0
  84. package/dist/delivery-manager-IMCRV6A3.js +0 -30
  85. package/dist/echo-text-ADKLNTIA.js +0 -31
  86. package/dist/mind-manager-5G6P2EAT.js +0 -30
  87. package/dist/mind-service-FDATHL6X.js +0 -36
  88. package/dist/scheduler-ZRUZNQI5.js +0 -30
  89. package/dist/sleep-manager-VPPQXBPH.js +0 -34
  90. package/dist/system-chat-YUIT7RA6.js +0 -34
  91. package/dist/web-assets/assets/index-BI7hUTBr.js +0 -73
  92. package/dist/web-assets/assets/index-BJifO9h_.css +0 -1
@@ -3,9 +3,9 @@ import {
3
3
  broadcast,
4
4
  publish,
5
5
  subscribe
6
- } from "./chunk-N42QMDID.js";
6
+ } from "./chunk-7GZB3ZJP.js";
7
7
  import "./chunk-T2TP6ZC6.js";
8
- import "./chunk-2NHRJ3YO.js";
8
+ import "./chunk-QDWP435B.js";
9
9
  import "./chunk-CJ26DXZL.js";
10
10
  import "./chunk-K3NQKI34.js";
11
11
  export {
@@ -17,10 +17,10 @@ import {
17
17
  setEnabledModels,
18
18
  setUtilityModel,
19
19
  unqualifyModelId
20
- } from "./chunk-ORNY3MZR.js";
21
- import "./chunk-A6FLW5XD.js";
20
+ } from "./chunk-B7MWXFAH.js";
21
+ import "./chunk-TCNCRDB5.js";
22
22
  import "./chunk-T2TP6ZC6.js";
23
- import "./chunk-2NHRJ3YO.js";
23
+ import "./chunk-QDWP435B.js";
24
24
  import "./chunk-CJ26DXZL.js";
25
25
  import "./chunk-K3NQKI34.js";
26
26
  export {
@@ -5,8 +5,8 @@ import {
5
5
  extractArchive,
6
6
  isHomeOnlyArchive,
7
7
  readManifest
8
- } from "./chunk-BIEWHAAM.js";
9
- import "./chunk-2NHRJ3YO.js";
8
+ } from "./chunk-IA2SZSLB.js";
9
+ import "./chunk-QDWP435B.js";
10
10
  import "./chunk-CJ26DXZL.js";
11
11
  import "./chunk-K3NQKI34.js";
12
12
  export {
@@ -17,10 +17,10 @@ import {
17
17
  syncMindProfile,
18
18
  updateUserProfile,
19
19
  verifyUser
20
- } from "./chunk-UIM5NHPP.js";
21
- import "./chunk-N42QMDID.js";
20
+ } from "./chunk-7W3UWCQD.js";
21
+ import "./chunk-7GZB3ZJP.js";
22
22
  import "./chunk-T2TP6ZC6.js";
23
- import "./chunk-2NHRJ3YO.js";
23
+ import "./chunk-QDWP435B.js";
24
24
  import "./chunk-CJ26DXZL.js";
25
25
  import "./chunk-K3NQKI34.js";
26
26
  export {
@@ -12,7 +12,7 @@ var cmd = subcommands({
12
12
  commands: {
13
13
  send: {
14
14
  description: "Send a message",
15
- run: (args) => import("./send-7CIP5GLS.js").then((m) => m.run(args))
15
+ run: (args) => import("./send-IMHDYJHW.js").then((m) => m.run(args))
16
16
  },
17
17
  list: {
18
18
  description: "List conversations",
@@ -32,7 +32,7 @@ var cmd = subcommands({
32
32
  },
33
33
  files: {
34
34
  description: "List pending incoming files",
35
- run: (args) => import("./files-LAQ3NXQK.js").then((m) => m.run(args))
35
+ run: (args) => import("./files-K5XV23H6.js").then((m) => m.run(args))
36
36
  },
37
37
  accept: {
38
38
  description: "Accept a pending file",
@@ -2,15 +2,15 @@
2
2
  import {
3
3
  findBridgeForChannel,
4
4
  getBridgeConfig
5
- } from "./chunk-LQ6Z4FXN.js";
5
+ } from "./chunk-XOSAY7PY.js";
6
6
  import {
7
7
  publish,
8
8
  recordOutbound
9
- } from "./chunk-TEZRVSSB.js";
9
+ } from "./chunk-CHCISTH7.js";
10
10
  import {
11
11
  readEnv,
12
12
  sharedEnvPath
13
- } from "./chunk-PMMHVSCR.js";
13
+ } from "./chunk-WUH54G5S.js";
14
14
  import {
15
15
  addMessage,
16
16
  findDMConversation,
@@ -18,14 +18,14 @@ import {
18
18
  getChannelName,
19
19
  getConversation,
20
20
  getParticipants
21
- } from "./chunk-5DPRTREW.js";
21
+ } from "./chunk-QDWPM73D.js";
22
22
  import {
23
23
  readVoluteConfig
24
24
  } from "./chunk-CU6OFXMM.js";
25
25
  import {
26
26
  getOrCreateMindUser,
27
27
  getUserByUsername
28
- } from "./chunk-UIM5NHPP.js";
28
+ } from "./chunk-7W3UWCQD.js";
29
29
  import {
30
30
  logger_default
31
31
  } from "./chunk-T2TP6ZC6.js";
@@ -35,7 +35,7 @@ import {
35
35
  import {
36
36
  mindDir,
37
37
  voluteSystemDir
38
- } from "./chunk-2NHRJ3YO.js";
38
+ } from "./chunk-QDWP435B.js";
39
39
  import {
40
40
  __export
41
41
  } from "./chunk-K3NQKI34.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  getBaseName,
4
4
  validateMindName
5
- } from "./chunk-2NHRJ3YO.js";
5
+ } from "./chunk-QDWP435B.js";
6
6
 
7
7
  // packages/daemon/src/lib/mind/isolation.ts
8
8
  import { execFileSync } from "child_process";
@@ -2,10 +2,10 @@
2
2
  import {
3
3
  exec,
4
4
  execInherit
5
- } from "./chunk-3F7XK5Q7.js";
5
+ } from "./chunk-OEXOFBW5.js";
6
6
  import {
7
7
  voluteSystemDir
8
- } from "./chunk-2NHRJ3YO.js";
8
+ } from "./chunk-QDWP435B.js";
9
9
 
10
10
  // packages/daemon/src/lib/config/service-mode.ts
11
11
  import { execFileSync } from "child_process";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-T2TP6ZC6.js";
5
5
  import {
6
6
  getDb
7
- } from "./chunk-2NHRJ3YO.js";
7
+ } from "./chunk-QDWP435B.js";
8
8
  import {
9
9
  activity
10
10
  } from "./chunk-CJ26DXZL.js";
@@ -7,14 +7,14 @@ import {
7
7
  modeLabel,
8
8
  pollHealth,
9
9
  startService
10
- } from "./chunk-TNZ5XQA4.js";
10
+ } from "./chunk-6V2U3GFQ.js";
11
11
  import {
12
12
  readGlobalConfig
13
- } from "./chunk-A6FLW5XD.js";
13
+ } from "./chunk-TCNCRDB5.js";
14
14
  import {
15
15
  voluteHome,
16
16
  voluteSystemDir
17
- } from "./chunk-2NHRJ3YO.js";
17
+ } from "./chunk-QDWP435B.js";
18
18
 
19
19
  // src/commands/up.ts
20
20
  import { spawn } from "child_process";
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  broadcast
4
- } from "./chunk-N42QMDID.js";
4
+ } from "./chunk-7GZB3ZJP.js";
5
5
  import {
6
6
  getDb
7
- } from "./chunk-2NHRJ3YO.js";
7
+ } from "./chunk-QDWP435B.js";
8
8
  import {
9
9
  users
10
10
  } from "./chunk-CJ26DXZL.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  readGlobalConfig,
4
4
  writeGlobalConfig
5
- } from "./chunk-A6FLW5XD.js";
5
+ } from "./chunk-TCNCRDB5.js";
6
6
  import {
7
7
  logger_default
8
8
  } from "./chunk-T2TP6ZC6.js";
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  loadMergedEnv
4
- } from "./chunk-PMMHVSCR.js";
4
+ } from "./chunk-WUH54G5S.js";
5
5
  import {
6
6
  spiritDir
7
- } from "./chunk-2TR2OPVA.js";
7
+ } from "./chunk-Y4W3OS7Q.js";
8
8
  import {
9
9
  hashSkillDir,
10
10
  importSkillFromDir,
11
11
  removeSharedSkill,
12
12
  sharedSkillsDir
13
- } from "./chunk-VUM2K6EN.js";
13
+ } from "./chunk-IBOU6Q3Y.js";
14
14
  import {
15
15
  addMessage,
16
16
  createChannel,
@@ -20,7 +20,7 @@ import {
20
20
  getParticipants,
21
21
  joinChannel,
22
22
  publish as publish2
23
- } from "./chunk-5DPRTREW.js";
23
+ } from "./chunk-QDWPM73D.js";
24
24
  import {
25
25
  readVoluteConfig,
26
26
  writeVoluteConfig
@@ -28,45 +28,46 @@ import {
28
28
  import {
29
29
  isSandboxEnabled,
30
30
  wrapForSandbox
31
- } from "./chunk-KXXJYY62.js";
31
+ } from "./chunk-EVKGKQ2P.js";
32
+ import {
33
+ markIdle,
34
+ onMindEvent
35
+ } from "./chunk-DZ4LYU6J.js";
32
36
  import {
33
37
  extractTextContent,
34
38
  getRoutingConfig,
35
39
  resolveDeliveryMode,
36
40
  resolveRoute
37
- } from "./chunk-7AZQFSOV.js";
38
- import {
39
- markIdle
40
- } from "./chunk-GVVVMZ4J.js";
41
+ } from "./chunk-OS5MRIEP.js";
41
42
  import {
42
43
  exec
43
- } from "./chunk-3F7XK5Q7.js";
44
+ } from "./chunk-OEXOFBW5.js";
44
45
  import {
45
46
  chownMindDir,
46
47
  isIsolationEnabled,
47
48
  mindUserName,
48
49
  wrapForIsolation
49
- } from "./chunk-SNW2NPP4.js";
50
+ } from "./chunk-6FSSMAXU.js";
50
51
  import {
51
52
  getOrCreateMindUser,
52
53
  getOrCreateSystemUser,
53
54
  getUser,
54
55
  getUserByUsername,
55
56
  syncMindProfile
56
- } from "./chunk-UIM5NHPP.js";
57
+ } from "./chunk-7W3UWCQD.js";
57
58
  import {
58
59
  publish,
59
60
  subscribe
60
- } from "./chunk-N42QMDID.js";
61
+ } from "./chunk-7GZB3ZJP.js";
61
62
  import {
62
63
  aiCompleteUtility,
63
64
  getAiConfig,
64
65
  resolveApiKey
65
- } from "./chunk-ORNY3MZR.js";
66
+ } from "./chunk-B7MWXFAH.js";
66
67
  import {
67
68
  readGlobalConfig,
68
69
  writeGlobalConfig
69
- } from "./chunk-A6FLW5XD.js";
70
+ } from "./chunk-TCNCRDB5.js";
70
71
  import {
71
72
  logger_default
72
73
  } from "./chunk-T2TP6ZC6.js";
@@ -79,7 +80,7 @@ import {
79
80
  stateDir,
80
81
  voluteHome,
81
82
  voluteSystemDir
82
- } from "./chunk-2NHRJ3YO.js";
83
+ } from "./chunk-QDWP435B.js";
83
84
  import {
84
85
  activity,
85
86
  conversationParticipants,
@@ -1639,7 +1640,7 @@ var MindManager = class {
1639
1640
  let spawnArgs;
1640
1641
  if (isIsolationEnabled()) {
1641
1642
  [spawnCmd, spawnArgs] = await wrapForIsolation(baseBin, baseArgs, name);
1642
- } else if (isSandboxEnabled()) {
1643
+ } else if (isSandboxEnabled() && target.template !== "codex") {
1643
1644
  [spawnCmd, spawnArgs] = await wrapForSandbox(baseBin, baseArgs, dir, name, [
1644
1645
  dir,
1645
1646
  mindStateDir,
@@ -1769,7 +1770,7 @@ var MindManager = class {
1769
1770
  if (this.shuttingDown || this.stopping.has(name)) return;
1770
1771
  mlog.error(`mind ${name} exited with code ${code}`);
1771
1772
  try {
1772
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-VPPQXBPH.js");
1773
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-6QRMUNHK.js");
1773
1774
  const sleepState = getSleepManagerIfReady2()?.getState(name);
1774
1775
  if (sleepState?.sleeping) {
1775
1776
  mlog.info(`${name} is sleeping \u2014 skipping crash recovery`);
@@ -1782,15 +1783,15 @@ var MindManager = class {
1782
1783
  (err) => mlog.warn(`failed to clear turn state for ${name} after crash`, logger_default.errorData(err))
1783
1784
  );
1784
1785
  try {
1785
- const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-IMCRV6A3.js");
1786
+ const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-N34XKUGL.js");
1786
1787
  getDeliveryManager2().clearMindSessions(name);
1787
1788
  } catch (err) {
1788
1789
  if (!(err instanceof Error && err.message.includes("not initialized"))) {
1789
1790
  mlog.warn(`failed to clear delivery state for ${name} after crash`, logger_default.errorData(err));
1790
1791
  }
1791
1792
  }
1792
- import("./mind-activity-tracker-42ENM32S.js").then(({ markIdle: markIdle2 }) => markIdle2(name)).catch((err) => mlog.warn(`failed to mark ${name} idle after crash`, logger_default.errorData(err)));
1793
- import("./activity-events-N6HCHU4P.js").then(
1793
+ import("./mind-activity-tracker-Z3KBQTVU.js").then(({ markIdle: markIdle2 }) => markIdle2(name)).catch((err) => mlog.warn(`failed to mark ${name} idle after crash`, logger_default.errorData(err)));
1794
+ import("./activity-events-CR4RIHJT.js").then(
1794
1795
  ({ publish: publish4 }) => publish4({ type: "mind_stopped", mind: name, summary: `${name} crashed (exit ${code})` })
1795
1796
  ).catch((err) => mlog.warn(`failed to publish crash event for ${name}`, logger_default.errorData(err)));
1796
1797
  const { shouldRestart, delay, attempt } = this.restartTracker.recordCrash(name);
@@ -1841,7 +1842,7 @@ var MindManager = class {
1841
1842
  mlog.warn(`failed to clear turn state for ${name} on stop`, logger_default.errorData(err));
1842
1843
  }
1843
1844
  try {
1844
- const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-IMCRV6A3.js");
1845
+ const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-N34XKUGL.js");
1845
1846
  getDeliveryManager2().clearMindSessions(name);
1846
1847
  } catch (err) {
1847
1848
  if (!(err instanceof Error && err.message.includes("not initialized"))) {
@@ -1849,7 +1850,7 @@ var MindManager = class {
1849
1850
  }
1850
1851
  }
1851
1852
  try {
1852
- const { clearEchoTextCache } = await import("./echo-text-ADKLNTIA.js");
1853
+ const { clearEchoTextCache } = await import("./echo-text-N3BC3WNX.js");
1853
1854
  clearEchoTextCache(name);
1854
1855
  } catch (err) {
1855
1856
  mlog.debug(`failed to clear echo-text cache for ${name}`, logger_default.errorData(err));
@@ -2574,7 +2575,7 @@ async function installNpmExtension(pkg) {
2574
2575
  throw new Error(`Extension "${pkg}" is already installed`);
2575
2576
  }
2576
2577
  const dir = ensureExtensionsNpmDir();
2577
- const { exec: exec2 } = await import("./exec-ONYZEA5B.js");
2578
+ const { exec: exec2 } = await import("./exec-2MFHTGOS.js");
2578
2579
  try {
2579
2580
  await exec2("npm", ["install", pkg], { cwd: dir });
2580
2581
  } catch (err) {
@@ -2595,7 +2596,7 @@ async function uninstallNpmExtension(pkg) {
2595
2596
  packages.splice(idx, 1);
2596
2597
  writeExtensionsConfig(packages);
2597
2598
  try {
2598
- const { exec: exec2 } = await import("./exec-ONYZEA5B.js");
2599
+ const { exec: exec2 } = await import("./exec-2MFHTGOS.js");
2599
2600
  await exec2("npm", ["uninstall", pkg], { cwd: extensionsNpmDir() });
2600
2601
  } catch (err) {
2601
2602
  logger_default.warn(
@@ -3370,7 +3371,7 @@ async function wakeMind(name) {
3370
3371
  async function startSpiritFull(name) {
3371
3372
  const entry = await findMind(name);
3372
3373
  if (entry?.dir) {
3373
- const { registerMindDir } = await import("./delivery-router-QTFEZ26O.js");
3374
+ const { registerMindDir } = await import("./delivery-router-EUW4RIWG.js");
3374
3375
  registerMindDir(name, entry.dir);
3375
3376
  }
3376
3377
  await getMindManager().startMind(name);
@@ -3392,8 +3393,8 @@ async function stopSpiritFull(name) {
3392
3393
  }).catch((err) => logger_default.error("failed to publish spirit_stopped activity", logger_default.errorData(err)));
3393
3394
  }
3394
3395
  async function ensureCreatorDM(mindName, creatorUsername) {
3395
- const { getOrCreateMindUser: getOrCreateMindUser2, getUserByUsername: getUserByUsername2 } = await import("./auth-2QOOPMBX.js");
3396
- const { findDMConversation: findDMConversation2, createConversation: createConversation2 } = await import("./conversations-G6YRSABR.js");
3396
+ const { getOrCreateMindUser: getOrCreateMindUser2, getUserByUsername: getUserByUsername2 } = await import("./auth-OJ2YW3NR.js");
3397
+ const { findDMConversation: findDMConversation2, createConversation: createConversation2 } = await import("./conversations-EUXHBWJD.js");
3397
3398
  const mindUser = await getOrCreateMindUser2(mindName);
3398
3399
  const creatorUser = await getUserByUsername2(creatorUsername);
3399
3400
  if (!creatorUser) {
@@ -3737,7 +3738,7 @@ var SleepManager = class {
3737
3738
  const db = await getDb();
3738
3739
  const rows = await db.select().from(deliveryQueue).where(and2(eq4(deliveryQueue.mind, name), eq4(deliveryQueue.status, "sleep-queued"))).all();
3739
3740
  if (rows.length === 0) return 0;
3740
- const { deliverMessage: deliverMessage2 } = await import("./message-delivery-54IXVE5H.js");
3741
+ const { deliverMessage: deliverMessage2 } = await import("./message-delivery-X7MKA3TA.js");
3741
3742
  const delivered = [];
3742
3743
  for (const row of rows) {
3743
3744
  try {
@@ -4410,6 +4411,7 @@ var DeliveryManager = class {
4410
4411
  if (payload.conversationId) {
4411
4412
  typingMap.set(payload.conversationId, baseName, { persistent: true });
4412
4413
  }
4414
+ onMindEvent(baseName, "delivery", payload.channel);
4413
4415
  const enrichedPayload = await this.enrichWithProfiles(baseName, session, payload);
4414
4416
  const body = JSON.stringify({
4415
4417
  ...enrichedPayload,
@@ -4647,7 +4649,7 @@ var DeliveryManager = class {
4647
4649
  `To accept this channel, add a routing rule for "${channel}" to your routes.json.`,
4648
4650
  `Messages are being held until a route is configured.`
4649
4651
  ].filter((line) => line !== null).join("\n");
4650
- const { sendSystemMessage: sendSystemMessage2 } = await import("./system-chat-YUIT7RA6.js");
4652
+ const { sendSystemMessage: sendSystemMessage2 } = await import("./system-chat-D343HYGR.js");
4651
4653
  await sendSystemMessage2(mindName, notification);
4652
4654
  }
4653
4655
  async persistToQueue(mindName, session, payload, status = "pending") {
@@ -5170,7 +5172,7 @@ async function generateSystemReply(conversationId, mindName, message) {
5170
5172
  if (config.sleep.schedule?.wake) contextParts.push(`Wake cron: ${config.sleep.schedule.wake}`);
5171
5173
  }
5172
5174
  try {
5173
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-VPPQXBPH.js");
5175
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-6QRMUNHK.js");
5174
5176
  const sm = getSleepManagerIfReady2();
5175
5177
  if (sm) {
5176
5178
  const state = sm.getState(mindName);
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  publish
4
- } from "./chunk-N42QMDID.js";
4
+ } from "./chunk-7GZB3ZJP.js";
5
5
  import {
6
6
  logger_default
7
7
  } from "./chunk-T2TP6ZC6.js";
@@ -1,30 +1,59 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  readGlobalConfig
4
- } from "./chunk-A6FLW5XD.js";
4
+ } from "./chunk-TCNCRDB5.js";
5
5
  import {
6
6
  logger_default
7
7
  } from "./chunk-T2TP6ZC6.js";
8
- import {
9
- getBaseName,
10
- readRegistry,
11
- voluteHome,
12
- voluteSystemDir,
13
- voluteUserHome
14
- } from "./chunk-2NHRJ3YO.js";
15
8
 
16
9
  // packages/daemon/src/lib/mind/sandbox.ts
17
- import { resolve } from "path";
10
+ import { execFileSync } from "child_process";
18
11
  var slog = logger_default.child("sandbox");
19
12
  var sandboxManager = null;
20
13
  function isSandboxEnabled() {
21
14
  if (process.env.VOLUTE_SANDBOX === "0") return false;
22
15
  return readGlobalConfig().setup?.isolation === "sandbox";
23
16
  }
17
+ function findRipgrep() {
18
+ if (process.env.VOLUTE_RIPGREP_PATH) {
19
+ try {
20
+ execFileSync(process.env.VOLUTE_RIPGREP_PATH, ["--version"], {
21
+ encoding: "utf-8",
22
+ timeout: 5e3
23
+ });
24
+ return process.env.VOLUTE_RIPGREP_PATH;
25
+ } catch {
26
+ slog.warn(
27
+ `VOLUTE_RIPGREP_PATH set to ${process.env.VOLUTE_RIPGREP_PATH} but binary not executable \u2014 falling back to system PATH`
28
+ );
29
+ }
30
+ }
31
+ try {
32
+ return execFileSync("which", ["rg"], { encoding: "utf-8" }).trim() || null;
33
+ } catch {
34
+ return null;
35
+ }
36
+ }
24
37
  async function initSandbox() {
25
38
  if (!isSandboxEnabled()) return;
26
39
  try {
27
40
  const { SandboxManager } = await import("@anthropic-ai/sandbox-runtime");
41
+ const rgPath = findRipgrep();
42
+ const ripgrepConfig = rgPath ? { command: rgPath } : void 0;
43
+ const { errors, warnings } = SandboxManager.checkDependencies(ripgrepConfig);
44
+ if (warnings.length > 0) {
45
+ slog.warn(`sandbox dependency warnings: ${warnings.join(", ")}`);
46
+ }
47
+ if (errors.length > 0) {
48
+ if (process.platform === "darwin") {
49
+ slog.warn(`sandbox dependency issues (non-fatal on macOS): ${errors.join(", ")}`);
50
+ } else {
51
+ slog.error(
52
+ `sandbox dependencies missing \u2014 minds will run without sandbox isolation: ${errors.join(", ")}`
53
+ );
54
+ return;
55
+ }
56
+ }
28
57
  const config = {
29
58
  network: {
30
59
  allowedDomains: ["*"],
@@ -36,7 +65,8 @@ async function initSandbox() {
36
65
  denyRead: [],
37
66
  allowWrite: [],
38
67
  denyWrite: []
39
- }
68
+ },
69
+ ...ripgrepConfig ? { ripgrep: ripgrepConfig } : {}
40
70
  };
41
71
  await SandboxManager.initialize(config);
42
72
  sandboxManager = SandboxManager;
@@ -47,45 +77,33 @@ async function initSandbox() {
47
77
  );
48
78
  }
49
79
  }
50
- async function buildDenyRead(mindName, mindDir) {
51
- const home = voluteHome();
80
+ async function buildSandboxReadConfig(_mindName, mindDir) {
52
81
  const userHome = process.env.HOME || "";
53
- const mindsDir = process.env.VOLUTE_MINDS_DIR || resolve(home, "minds");
54
- const deny = [];
55
- deny.push(voluteSystemDir());
56
- const userVoluteHome = voluteUserHome();
57
- if (userVoluteHome !== home) {
58
- deny.push(userVoluteHome);
82
+ const denyRead = [];
83
+ const allowRead = [mindDir];
84
+ if (userHome) {
85
+ denyRead.push(userHome);
86
+ } else {
87
+ slog.warn("$HOME is not set \u2014 sandbox read restrictions will be limited");
59
88
  }
60
- try {
61
- const entries = await readRegistry();
62
- for (const entry of entries) {
63
- if (entry.name === await getBaseName(mindName)) continue;
64
- const otherDir = resolve(mindsDir, entry.name);
65
- if (otherDir !== mindDir) {
66
- deny.push(otherDir);
67
- }
89
+ if (process.env.VOLUTE_ISOLATION === "user") {
90
+ const usersDir = process.platform === "darwin" ? "/Users" : "/home";
91
+ if (!denyRead.includes(usersDir)) {
92
+ denyRead.push(usersDir);
68
93
  }
69
- } catch (err) {
70
- slog.warn("failed to read minds registry for deny-read list", logger_default.errorData(err));
71
- }
72
- if (userHome) {
73
- deny.push(resolve(userHome, ".ssh"));
74
- deny.push(resolve(userHome, ".aws"));
75
- deny.push(resolve(userHome, ".gnupg"));
76
- deny.push(resolve(userHome, ".config"));
77
94
  }
78
- return deny;
95
+ return { denyRead, allowRead };
79
96
  }
80
97
  function shellEscape(s) {
81
98
  return `'${s.replace(/'/g, "'\\''")}'`;
82
99
  }
83
100
  async function wrapForSandbox(cmd, args, mindDir, mindName, allowWrite) {
84
101
  if (!sandboxManager) return [cmd, args];
85
- const denyRead = await buildDenyRead(mindName, mindDir);
102
+ const { denyRead, allowRead } = await buildSandboxReadConfig(mindName, mindDir);
86
103
  const customConfig = {
87
104
  filesystem: {
88
105
  denyRead,
106
+ allowRead,
89
107
  allowWrite: allowWrite ?? [mindDir],
90
108
  denyWrite: []
91
109
  }
@@ -106,7 +124,7 @@ async function wrapForSandbox(cmd, args, mindDir, mindName, allowWrite) {
106
124
  export {
107
125
  isSandboxEnabled,
108
126
  initSandbox,
109
- buildDenyRead,
127
+ buildSandboxReadConfig,
110
128
  shellEscape,
111
129
  wrapForSandbox
112
130
  };
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  mindDir,
4
4
  stateDir
5
- } from "./chunk-2NHRJ3YO.js";
5
+ } from "./chunk-QDWP435B.js";
6
6
 
7
7
  // packages/daemon/src/lib/mind/archive.ts
8
8
  import { execFileSync } from "child_process";
@@ -2,11 +2,11 @@
2
2
  import {
3
3
  exec,
4
4
  gitExec
5
- } from "./chunk-3F7XK5Q7.js";
5
+ } from "./chunk-OEXOFBW5.js";
6
6
  import {
7
7
  readGlobalConfig,
8
8
  writeGlobalConfig
9
- } from "./chunk-A6FLW5XD.js";
9
+ } from "./chunk-TCNCRDB5.js";
10
10
  import {
11
11
  logger_default
12
12
  } from "./chunk-T2TP6ZC6.js";
@@ -15,7 +15,7 @@ import {
15
15
  mindDir,
16
16
  readRegistry,
17
17
  voluteHome
18
- } from "./chunk-2NHRJ3YO.js";
18
+ } from "./chunk-QDWP435B.js";
19
19
  import {
20
20
  sharedSkills
21
21
  } from "./chunk-CJ26DXZL.js";
@@ -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-P477XR46.js");
49
+ const { getExtensionStandardSkills } = await import("./extensions-V7TXKAKM.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));
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  wrapForIsolation
4
- } from "./chunk-SNW2NPP4.js";
4
+ } from "./chunk-6FSSMAXU.js";
5
5
 
6
6
  // packages/daemon/src/lib/util/exec.ts
7
7
  import { execFile as execFileCb, execFileSync, spawn } from "child_process";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-T2TP6ZC6.js";
5
5
  import {
6
6
  mindDir
7
- } from "./chunk-2NHRJ3YO.js";
7
+ } from "./chunk-QDWP435B.js";
8
8
 
9
9
  // packages/daemon/src/lib/delivery/delivery-router.ts
10
10
  import { readFileSync, statSync } from "fs";
@@ -17,7 +17,7 @@ import { mkdirSync } from "fs";
17
17
  import { homedir } from "os";
18
18
  import { dirname, resolve } from "path";
19
19
  import { fileURLToPath } from "url";
20
- import { and, eq, isNull } from "drizzle-orm";
20
+ import { and, eq, inArray, isNull } from "drizzle-orm";
21
21
  function voluteHome() {
22
22
  if (process.env.VOLUTE_HOME) return process.env.VOLUTE_HOME;
23
23
  const dir = dirname(fileURLToPath(import.meta.url));
@@ -61,7 +61,7 @@ function rowToEntry(row) {
61
61
  }
62
62
  async function readRegistry() {
63
63
  const db2 = await getDb();
64
- const rows = await db2.select().from(minds).where(and(isNull(minds.parent), eq(minds.mind_type, "mind")));
64
+ const rows = await db2.select().from(minds).where(and(isNull(minds.parent), inArray(minds.mind_type, ["mind", "spirit"])));
65
65
  return rows.map(rowToEntry);
66
66
  }
67
67
  async function readAllMinds() {
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  subscribe
4
- } from "./chunk-N42QMDID.js";
4
+ } from "./chunk-7GZB3ZJP.js";
5
5
  import {
6
6
  logger_default
7
7
  } from "./chunk-T2TP6ZC6.js";
8
8
  import {
9
9
  getDb
10
- } from "./chunk-2NHRJ3YO.js";
10
+ } from "./chunk-QDWP435B.js";
11
11
  import {
12
12
  channels,
13
13
  conversationParticipants,