volute 0.36.0 → 0.37.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 (140) hide show
  1. package/dist/{accept-ZBDVVCEU.js → accept-AHAOUFBK.js} +4 -4
  2. package/dist/{activity-events-PWOGSMRL.js → activity-events-N6HCHU4P.js} +4 -4
  3. package/dist/{ai-service-GSZWIETO.js → ai-service-C2YNARGH.js} +5 -5
  4. package/dist/{api-client-3A77HMH7.js → api-client-LC5YRA32.js} +1 -1
  5. package/dist/{archive-Y2YEOCGB.js → archive-AWIJTVQV.js} +4 -4
  6. package/dist/{auth-YTQME4EV.js → auth-2QOOPMBX.js} +5 -5
  7. package/dist/{bridge-PXIO6PS2.js → bridge-F3ZJEKDN.js} +4 -4
  8. package/dist/{chat-ED7YOGKO.js → chat-5Y4FD77E.js} +9 -9
  9. package/dist/{chunk-75AJ54GM.js → chunk-2NHRJ3YO.js} +1 -1
  10. package/dist/{chunk-PJ4IPTIN.js → chunk-3F7XK5Q7.js} +1 -1
  11. package/dist/{chunk-6F3YNULE.js → chunk-4L2Q7IP5.js} +16 -16
  12. package/dist/{chunk-IIWF2IPD.js → chunk-5DPRTREW.js} +3 -3
  13. package/dist/{chunk-X2J7QUFH.js → chunk-7AZQFSOV.js} +1 -1
  14. package/dist/{chunk-NUX47Y2V.js → chunk-A6FLW5XD.js} +1 -1
  15. package/dist/{chunk-SWW6AUVW.js → chunk-BIEWHAAM.js} +1 -1
  16. package/dist/{chunk-TWAN7ZNO.js → chunk-CF4SO5L3.js} +3 -3
  17. package/dist/{chunk-7PTQGPJY.js → chunk-CJ26DXZL.js} +1 -1
  18. package/dist/{chunk-PY557GDR.js → chunk-GVVVMZ4J.js} +1 -1
  19. package/dist/chunk-K3NQKI34.js +10 -0
  20. package/dist/{chunk-BOLJUV77.js → chunk-KXXJYY62.js} +4 -4
  21. package/dist/chunk-LIIX2MOM.js +853 -0
  22. package/dist/chunk-LQ6Z4FXN.js +87 -0
  23. package/dist/{chunk-N2AUHW4C.js → chunk-MQRS4J24.js} +2 -2
  24. package/dist/{chunk-B35VNNSS.js → chunk-N42QMDID.js} +2 -2
  25. package/dist/{chunk-M5RYAA5I.js → chunk-ORNY3MZR.js} +4 -4
  26. package/dist/{chunk-YDBAY3NA.js → chunk-PMMHVSCR.js} +1 -1
  27. package/dist/{chunk-GBDVNPN2.js → chunk-QJGLTPAP.js} +8 -8
  28. package/dist/{chunk-DQ7VBXAP.js → chunk-RUIVWCYY.js} +122 -81
  29. package/dist/{chunk-L72WYMF7.js → chunk-SNW2NPP4.js} +1 -1
  30. package/dist/chunk-SZJWC2GA.js +125 -0
  31. package/dist/{chunk-DJT5Y4UF.js → chunk-TNZ5XQA4.js} +2 -2
  32. package/dist/{chunk-DMV5P2LU.js → chunk-UIM5NHPP.js} +3 -3
  33. package/dist/{chunk-ZTVKQOU7.js → chunk-WC635OPK.js} +1 -1
  34. package/dist/{chunk-YTWZORJN.js → chunk-XLBQYIHH.js} +1 -1
  35. package/dist/cli.js +24 -24
  36. package/dist/{clock-HSEKS5AR.js → clock-BMLJ2TR6.js} +8 -8
  37. package/dist/{cloud-sync-BOCZSDIA.js → cloud-sync-EZKCEIBX.js} +18 -18
  38. package/dist/{config-UTS7QULS.js → config-QB7W3Z7P.js} +4 -4
  39. package/dist/connectors/discord-bridge.js +1 -1
  40. package/dist/connectors/slack-bridge.js +1 -1
  41. package/dist/connectors/telegram-bridge.js +1 -1
  42. package/dist/{conversations-HH3CJD4E.js → conversations-G6YRSABR.js} +5 -5
  43. package/dist/{create-5BPOOJAN.js → create-C3BBFYV7.js} +4 -4
  44. package/dist/{create-QBEPSD2Z.js → create-PN73742N.js} +4 -4
  45. package/dist/{daemon-client-RVIKXGFQ.js → daemon-client-2MIPKY3E.js} +1 -1
  46. package/dist/{daemon-restart-SIR3UR4B.js → daemon-restart-S6SOD3C5.js} +11 -11
  47. package/dist/daemon.js +392 -1101
  48. package/dist/db-CBOCDYVA.js +9 -0
  49. package/dist/{db-BDMH4SZ2.js → db-IJL6B26S.js} +1 -1
  50. package/dist/{delete-L5PAVDGQ.js → delete-NLXES2C7.js} +3 -3
  51. package/dist/delivery-manager-3I7CA734.js +30 -0
  52. package/dist/{delivery-router-VSULHXNH.js → delivery-router-QTFEZ26O.js} +4 -4
  53. package/dist/down-25L2RKCQ.js +17 -0
  54. package/dist/echo-text-IWAQKNTC.js +31 -0
  55. package/dist/{env-E4XHO2BI.js → env-IQ6Q2333.js} +6 -6
  56. package/dist/exec-ONYZEA5B.js +17 -0
  57. package/dist/{export-HTFOHOKL.js → export-JPDBQESV.js} +6 -6
  58. package/dist/{extension-AKZ46YSL.js → extension-LZYHBNLV.js} +4 -4
  59. package/dist/{extensions-OOSFVH7U.js → extensions-PCOXTHNM.js} +17 -17
  60. package/dist/{files-H2YLRD37.js → files-LAQ3NXQK.js} +7 -7
  61. package/dist/{import-OL5BZX7S.js → import-EROF27RH.js} +11 -10
  62. package/dist/{isolation-N74RWOUX.js → isolation-G5J3MTKU.js} +4 -4
  63. package/dist/{join-DF5XSJAC.js → join-6SZCA5FX.js} +3 -3
  64. package/dist/{list-GJ4RUQQT.js → list-KHJZJPEJ.js} +4 -4
  65. package/dist/{login-JXRVMBRB.js → login-F6YMAVLE.js} +6 -6
  66. package/dist/{login-GOTAYLXP.js → login-GYTH67ES.js} +4 -4
  67. package/dist/{logout-FW243JBU.js → logout-HHPH52KZ.js} +6 -6
  68. package/dist/{logout-6KIA74EV.js → logout-YHQLOFLR.js} +4 -4
  69. package/dist/message-delivery-NWL7XEIX.js +40 -0
  70. package/dist/{mind-6VJJHF65.js → mind-MM2IYMJ3.js} +19 -19
  71. package/dist/{mind-activity-tracker-66UVYIFW.js → mind-activity-tracker-42ENM32S.js} +5 -5
  72. package/dist/{mind-history-MII2SK7F.js → mind-history-WHCNZ6I5.js} +5 -5
  73. package/dist/{mind-list-GEWHWAL4.js → mind-list-H3HC2ZRG.js} +4 -4
  74. package/dist/mind-manager-VOEQ2IZL.js +30 -0
  75. package/dist/{mind-profile-DCBDVF5B.js → mind-profile-7VYRJGFZ.js} +2 -2
  76. package/dist/mind-service-WRTOQSAL.js +36 -0
  77. package/dist/{mind-sleep-ITCF6OQA.js → mind-sleep-ZL5ZXFTM.js} +4 -4
  78. package/dist/{mind-status-X4SX3YUG.js → mind-status-ZWULKOUO.js} +4 -4
  79. package/dist/{mind-wake-KXMKMGWX.js → mind-wake-HK5ORGUK.js} +4 -4
  80. package/dist/{package-3W2MEXHB.js → package-TA6IHIED.js} +2 -2
  81. package/dist/{read-ZUDG4JWU.js → read-CP7MYMJQ.js} +4 -4
  82. package/dist/{read-stdin-3X5VYKNS.js → read-stdin-4B5UYPPM.js} +1 -1
  83. package/dist/{register-SB7NXCOE.js → register-XOBFEMI4.js} +4 -4
  84. package/dist/{registry-YPHK534W.js → registry-KMELPC3X.js} +3 -3
  85. package/dist/{reject-MUR2KWJ4.js → reject-43AGXB6B.js} +4 -4
  86. package/dist/{restart-5EGG4JXU.js → restart-O5QIYQJT.js} +5 -5
  87. package/dist/{sandbox-LP6YRAXS.js → sandbox-PQYEICEF.js} +5 -5
  88. package/dist/scheduler-355E746X.js +30 -0
  89. package/dist/{schema-MISD3JFG.js → schema-K575EBPE.js} +2 -2
  90. package/dist/{seed-CEC4RC23.js → seed-6S4Z6TAM.js} +2 -2
  91. package/dist/{seed-check-KJNTL72M.js → seed-check-HZPVFJKZ.js} +2 -2
  92. package/dist/{seed-cmd-WTTG7SRQ.js → seed-cmd-CBWLJWYD.js} +4 -4
  93. package/dist/{seed-create-M6RCC6RP.js → seed-create-NT6DG4SE.js} +6 -6
  94. package/dist/{seed-sprout-ZKCHFJKH.js → seed-sprout-GQLSK4EF.js} +14 -14
  95. package/dist/{send-LXUT2GGR.js → send-7CIP5GLS.js} +8 -8
  96. package/dist/{service-M6N3RUYU.js → service-YMHWPDXW.js} +6 -6
  97. package/dist/{setup-PJOF5UV5.js → setup-APNN7KJB.js} +32 -37
  98. package/dist/{setup-PMJHCZQX.js → setup-PF7JSFMO.js} +4 -4
  99. package/dist/{skill-TAAKEYBV.js → skill-ICN6Y2ZF.js} +6 -6
  100. package/dist/{skills-2PTRTBQP.js → skills-ZFVNN4TU.js} +7 -7
  101. package/dist/sleep-manager-PBOIEBJZ.js +34 -0
  102. package/dist/{spirit-6KVDIROQ.js → spirit-4QOYM33G.js} +9 -9
  103. package/dist/{split-AWVOYOPZ.js → split-5YBEQTBF.js} +3 -3
  104. package/dist/{sprout-WX2FFYLP.js → sprout-UDLZPMEO.js} +2 -2
  105. package/dist/{src-QEOLMAYC.js → src-LT6ZBYYX.js} +2 -2
  106. package/dist/{src-GW6FP6VL.js → src-O4PRLMKM.js} +1 -1
  107. package/dist/{src-FQE4BHRG.js → src-OYWRPLC6.js} +1 -1
  108. package/dist/{start-3UXOPXQG.js → start-LMXXRR3X.js} +5 -5
  109. package/dist/{status-3IVSLJDN.js → status-MC2P7DBG.js} +7 -7
  110. package/dist/{stop-3XYIBGFM.js → stop-TWDKVEUX.js} +5 -5
  111. package/dist/system-chat-7AIN3U5M.js +34 -0
  112. package/dist/{systems-O43WGQY6.js → systems-Y2WZV2K4.js} +7 -7
  113. package/dist/{tailscale-DZU4WM3E.js → tailscale-LTYNKIPZ.js} +3 -3
  114. package/dist/{template-hash-6ITI3WC4.js → template-hash-SSIBEEYK.js} +1 -1
  115. package/dist/up-4T32B7OB.js +19 -0
  116. package/dist/{update-RIQYUPVN.js → update-UOP2INF2.js} +7 -7
  117. package/dist/{update-check-4TIJKVGD.js → update-check-IKS7SGK5.js} +4 -4
  118. package/dist/{upgrade-ZMDGC7M2.js → upgrade-RXFZR5FI.js} +3 -3
  119. package/dist/{variant-QWL2WSRI.js → variant-HHDTW74J.js} +1 -1
  120. package/dist/{version-notify-UXSHBZ35.js → version-notify-NCRIN5QK.js} +18 -18
  121. package/dist/{volute-config-V7UFFBG3.js → volute-config-TS62GS6A.js} +1 -1
  122. package/dist/web-assets/assets/{index-C-eYso8Y.js → index-B3xLeex8.js} +16 -16
  123. package/dist/web-assets/assets/{index-CCv_fSte.css → index-Dr4A90Lo.css} +1 -1
  124. package/dist/web-assets/index.html +2 -2
  125. package/package.json +1 -1
  126. package/templates/_base/src/lib/context-breakdown.ts +22 -16
  127. package/dist/chunk-7KJOFUNN.js +0 -22
  128. package/dist/chunk-PZYJBOQP.js +0 -207
  129. package/dist/db-URORGSXQ.js +0 -9
  130. package/dist/delivery-manager-WTGIPBGY.js +0 -30
  131. package/dist/down-DGGLZ5TA.js +0 -17
  132. package/dist/exec-X3C6ZZTQ.js +0 -17
  133. package/dist/lib-DYEZMGW7.js +0 -6588
  134. package/dist/message-delivery-YORUXKDQ.js +0 -40
  135. package/dist/mind-manager-TJ2SUPRX.js +0 -30
  136. package/dist/mind-service-E7FM2WZF.js +0 -36
  137. package/dist/scheduler-FRJ5DK24.js +0 -30
  138. package/dist/sleep-manager-WAZWMFJT.js +0 -34
  139. package/dist/system-chat-2IFS5HCX.js +0 -34
  140. package/dist/up-4SCIUIMG.js +0 -19
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ logger_default
4
+ } from "./chunk-T2TP6ZC6.js";
5
+ import {
6
+ voluteSystemDir
7
+ } from "./chunk-2NHRJ3YO.js";
8
+
9
+ // packages/daemon/src/lib/bridges/bridges.ts
10
+ import { existsSync, readFileSync, writeFileSync } from "fs";
11
+ import { resolve } from "path";
12
+ function bridgesPath() {
13
+ return resolve(voluteSystemDir(), "bridges.json");
14
+ }
15
+ function readBridgesConfig() {
16
+ const path = bridgesPath();
17
+ if (!existsSync(path)) return {};
18
+ try {
19
+ return JSON.parse(readFileSync(path, "utf-8"));
20
+ } catch (err) {
21
+ logger_default.error(
22
+ `bridges.json is corrupt or unreadable at ${path} \u2014 all bridges disabled`,
23
+ logger_default.errorData(err)
24
+ );
25
+ return {};
26
+ }
27
+ }
28
+ function writeBridgesConfig(config) {
29
+ writeFileSync(bridgesPath(), `${JSON.stringify(config, null, 2)}
30
+ `, { mode: 384 });
31
+ }
32
+ function getBridgeConfig(platform) {
33
+ const config = readBridgesConfig();
34
+ return config[platform] ?? null;
35
+ }
36
+ function setBridgeConfig(platform, bridge) {
37
+ const config = readBridgesConfig();
38
+ config[platform] = bridge;
39
+ writeBridgesConfig(config);
40
+ }
41
+ function removeBridgeConfig(platform) {
42
+ const config = readBridgesConfig();
43
+ delete config[platform];
44
+ writeBridgesConfig(config);
45
+ }
46
+ function setChannelMapping(platform, externalChannel, voluteChannel) {
47
+ const config = readBridgesConfig();
48
+ const bridge = config[platform];
49
+ if (!bridge) throw new Error(`Bridge not configured for ${platform}`);
50
+ bridge.channelMappings[externalChannel] = voluteChannel;
51
+ writeBridgesConfig(config);
52
+ }
53
+ function removeChannelMapping(platform, externalChannel) {
54
+ const config = readBridgesConfig();
55
+ const bridge = config[platform];
56
+ if (!bridge) return;
57
+ delete bridge.channelMappings[externalChannel];
58
+ writeBridgesConfig(config);
59
+ }
60
+ function resolveChannelMapping(platform, externalChannel) {
61
+ const bridge = getBridgeConfig(platform);
62
+ if (!bridge) return null;
63
+ return bridge.channelMappings[externalChannel] ?? null;
64
+ }
65
+ function findBridgeForChannel(voluteChannelName) {
66
+ const config = readBridgesConfig();
67
+ for (const [platform, bridge] of Object.entries(config)) {
68
+ if (!bridge.enabled) continue;
69
+ for (const [external, volute] of Object.entries(bridge.channelMappings)) {
70
+ if (volute === voluteChannelName) {
71
+ return { platform, externalChannel: external };
72
+ }
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+
78
+ export {
79
+ readBridgesConfig,
80
+ getBridgeConfig,
81
+ setBridgeConfig,
82
+ removeBridgeConfig,
83
+ setChannelMapping,
84
+ removeChannelMapping,
85
+ resolveChannelMapping,
86
+ findBridgeForChannel
87
+ };
@@ -5,13 +5,13 @@ import {
5
5
  pollHealthDown,
6
6
  readDaemonConfig,
7
7
  stopService
8
- } from "./chunk-DJT5Y4UF.js";
8
+ } from "./chunk-TNZ5XQA4.js";
9
9
  import {
10
10
  command
11
11
  } from "./chunk-TXSA4Q3V.js";
12
12
  import {
13
13
  voluteSystemDir
14
- } from "./chunk-75AJ54GM.js";
14
+ } from "./chunk-2NHRJ3YO.js";
15
15
 
16
16
  // src/commands/down.ts
17
17
  import { existsSync, readFileSync, unlinkSync } from "fs";
@@ -4,10 +4,10 @@ import {
4
4
  } from "./chunk-T2TP6ZC6.js";
5
5
  import {
6
6
  getDb
7
- } from "./chunk-75AJ54GM.js";
7
+ } from "./chunk-2NHRJ3YO.js";
8
8
  import {
9
9
  activity
10
- } from "./chunk-7PTQGPJY.js";
10
+ } from "./chunk-CJ26DXZL.js";
11
11
 
12
12
  // packages/daemon/src/lib/events/activity-events.ts
13
13
  var subscribers = /* @__PURE__ */ new Set();
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- logger_default
4
- } from "./chunk-T2TP6ZC6.js";
5
2
  import {
6
3
  readGlobalConfig,
7
4
  writeGlobalConfig
8
- } from "./chunk-NUX47Y2V.js";
5
+ } from "./chunk-A6FLW5XD.js";
6
+ import {
7
+ logger_default
8
+ } from "./chunk-T2TP6ZC6.js";
9
9
 
10
10
  // packages/daemon/src/lib/ai-service.ts
11
11
  import { complete, getEnvApiKey, getModel, getModels, getProviders } from "@mariozechner/pi-ai";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  stateDir,
4
4
  voluteSystemDir
5
- } from "./chunk-75AJ54GM.js";
5
+ } from "./chunk-2NHRJ3YO.js";
6
6
 
7
7
  // packages/daemon/src/lib/config/env.ts
8
8
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- logger_default
4
- } from "./chunk-T2TP6ZC6.js";
5
2
  import {
6
3
  exec,
7
4
  gitExec
8
- } from "./chunk-PJ4IPTIN.js";
5
+ } from "./chunk-3F7XK5Q7.js";
9
6
  import {
10
7
  readGlobalConfig,
11
8
  writeGlobalConfig
12
- } from "./chunk-NUX47Y2V.js";
9
+ } from "./chunk-A6FLW5XD.js";
10
+ import {
11
+ logger_default
12
+ } from "./chunk-T2TP6ZC6.js";
13
13
  import {
14
14
  getDb,
15
15
  mindDir,
16
16
  readRegistry,
17
17
  voluteHome
18
- } from "./chunk-75AJ54GM.js";
18
+ } from "./chunk-2NHRJ3YO.js";
19
19
  import {
20
20
  sharedSkills
21
- } from "./chunk-7PTQGPJY.js";
21
+ } from "./chunk-CJ26DXZL.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-OOSFVH7U.js");
49
+ const { getExtensionStandardSkills } = await import("./extensions-PCOXTHNM.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,37 +1,16 @@
1
1
  #!/usr/bin/env node
2
+ import {
3
+ loadMergedEnv
4
+ } from "./chunk-PMMHVSCR.js";
2
5
  import {
3
6
  spiritDir
4
- } from "./chunk-6F3YNULE.js";
7
+ } from "./chunk-4L2Q7IP5.js";
5
8
  import {
6
9
  hashSkillDir,
7
10
  importSkillFromDir,
8
11
  removeSharedSkill,
9
12
  sharedSkillsDir
10
- } from "./chunk-GBDVNPN2.js";
11
- import {
12
- markIdle
13
- } from "./chunk-PY557GDR.js";
14
- import {
15
- getOrCreateMindUser,
16
- getOrCreateSystemUser,
17
- getUser,
18
- getUserByUsername,
19
- syncMindProfile
20
- } from "./chunk-DMV5P2LU.js";
21
- import {
22
- addMessage,
23
- createChannel,
24
- createConversation,
25
- findDMConversation,
26
- getChannelByName,
27
- getParticipants,
28
- joinChannel,
29
- publish as publish2
30
- } from "./chunk-IIWF2IPD.js";
31
- import {
32
- publish,
33
- subscribe
34
- } from "./chunk-B35VNNSS.js";
13
+ } from "./chunk-QJGLTPAP.js";
35
14
  import {
36
15
  readVoluteConfig,
37
16
  writeVoluteConfig
@@ -39,37 +18,58 @@ import {
39
18
  import {
40
19
  isSandboxEnabled,
41
20
  wrapForSandbox
42
- } from "./chunk-BOLJUV77.js";
21
+ } from "./chunk-KXXJYY62.js";
43
22
  import {
44
23
  extractTextContent,
45
24
  getRoutingConfig,
46
25
  resolveDeliveryMode,
47
26
  resolveRoute
48
- } from "./chunk-X2J7QUFH.js";
49
- import {
50
- loadMergedEnv
51
- } from "./chunk-YDBAY3NA.js";
27
+ } from "./chunk-7AZQFSOV.js";
52
28
  import {
53
- aiCompleteUtility,
54
- getAiConfig,
55
- resolveApiKey
56
- } from "./chunk-M5RYAA5I.js";
57
- import {
58
- logger_default
59
- } from "./chunk-T2TP6ZC6.js";
29
+ markIdle
30
+ } from "./chunk-GVVVMZ4J.js";
60
31
  import {
61
32
  exec
62
- } from "./chunk-PJ4IPTIN.js";
33
+ } from "./chunk-3F7XK5Q7.js";
63
34
  import {
64
35
  chownMindDir,
65
36
  isIsolationEnabled,
66
37
  mindUserName,
67
38
  wrapForIsolation
68
- } from "./chunk-L72WYMF7.js";
39
+ } from "./chunk-SNW2NPP4.js";
40
+ import {
41
+ getOrCreateMindUser,
42
+ getOrCreateSystemUser,
43
+ getUser,
44
+ getUserByUsername,
45
+ syncMindProfile
46
+ } from "./chunk-UIM5NHPP.js";
47
+ import {
48
+ aiCompleteUtility,
49
+ getAiConfig,
50
+ resolveApiKey
51
+ } from "./chunk-ORNY3MZR.js";
69
52
  import {
70
53
  readGlobalConfig,
71
54
  writeGlobalConfig
72
- } from "./chunk-NUX47Y2V.js";
55
+ } from "./chunk-A6FLW5XD.js";
56
+ import {
57
+ addMessage,
58
+ createChannel,
59
+ createConversation,
60
+ findDMConversation,
61
+ getChannelByName,
62
+ getParticipants,
63
+ joinChannel,
64
+ publish as publish2
65
+ } from "./chunk-5DPRTREW.js";
66
+ import {
67
+ publish,
68
+ subscribe
69
+ } from "./chunk-N42QMDID.js";
70
+ import {
71
+ logger_default
72
+ } from "./chunk-T2TP6ZC6.js";
73
73
  import {
74
74
  findMind,
75
75
  getBaseName,
@@ -79,7 +79,7 @@ import {
79
79
  stateDir,
80
80
  voluteHome,
81
81
  voluteSystemDir
82
- } from "./chunk-75AJ54GM.js";
82
+ } from "./chunk-2NHRJ3YO.js";
83
83
  import {
84
84
  activity,
85
85
  conversationParticipants,
@@ -90,7 +90,7 @@ import {
90
90
  systemPrompts,
91
91
  turns,
92
92
  users
93
- } from "./chunk-7PTQGPJY.js";
93
+ } from "./chunk-CJ26DXZL.js";
94
94
 
95
95
  // packages/daemon/src/lib/delivery/message-delivery.ts
96
96
  import { and as and4, desc as desc2, eq as eq6, inArray as inArray3, sql as sql3 } from "drizzle-orm";
@@ -1534,12 +1534,47 @@ var MindManager = class {
1534
1534
  }
1535
1535
  }
1536
1536
  if (target.template === "codex") {
1537
- const ai = (await import("./ai-service-GSZWIETO.js")).getAiConfig();
1538
- const providerConfig = ai?.providers["openai-codex"];
1539
- if (providerConfig?.apiKey) {
1540
- env.OPENAI_API_KEY = providerConfig.apiKey;
1541
- } else if (process.env.OPENAI_API_KEY) {
1542
- env.OPENAI_API_KEY = process.env.OPENAI_API_KEY;
1537
+ try {
1538
+ const ai = getAiConfig();
1539
+ const codexConfig = ai?.providers["openai-codex"];
1540
+ if (codexConfig?.oauth) {
1541
+ const codexDir = resolve(dir, ".mind", "codex");
1542
+ mkdirSync(codexDir, { recursive: true });
1543
+ env.CODEX_HOME = codexDir;
1544
+ const authPath = resolve(codexDir, "auth.json");
1545
+ writeFileSync2(
1546
+ authPath,
1547
+ JSON.stringify({
1548
+ auth_mode: "chatgpt",
1549
+ tokens: {
1550
+ access_token: codexConfig.oauth.access,
1551
+ refresh_token: codexConfig.oauth.refresh,
1552
+ id_token: codexConfig.oauth.access
1553
+ },
1554
+ last_refresh: (/* @__PURE__ */ new Date()).toISOString()
1555
+ }),
1556
+ { mode: 384 }
1557
+ );
1558
+ const configTomlPath = resolve(codexDir, "config.toml");
1559
+ if (!existsSync3(configTomlPath)) {
1560
+ writeFileSync2(configTomlPath, 'cli_auth_credentials_store = "file"\n');
1561
+ }
1562
+ if (isIsolationEnabled()) {
1563
+ chownMindDir(codexDir, baseName);
1564
+ }
1565
+ } else {
1566
+ const apiKey = await resolveApiKey("openai-codex");
1567
+ if (apiKey) {
1568
+ env.OPENAI_API_KEY = apiKey;
1569
+ } else if (process.env.OPENAI_API_KEY) {
1570
+ env.OPENAI_API_KEY = process.env.OPENAI_API_KEY;
1571
+ }
1572
+ }
1573
+ } catch (err) {
1574
+ mlog.error(`failed to resolve OpenAI API key for ${name}`, logger_default.errorData(err));
1575
+ if (process.env.OPENAI_API_KEY) {
1576
+ env.OPENAI_API_KEY = process.env.OPENAI_API_KEY;
1577
+ }
1543
1578
  }
1544
1579
  const homeDir = resolve(dir, "home");
1545
1580
  const zshenvLines = Object.entries(env).filter(([k, v]) => k.startsWith("VOLUTE_") && v != null).map(([k, v]) => `export ${k}=${JSON.stringify(v)}`);
@@ -1734,7 +1769,7 @@ var MindManager = class {
1734
1769
  if (this.shuttingDown || this.stopping.has(name)) return;
1735
1770
  mlog.error(`mind ${name} exited with code ${code}`);
1736
1771
  try {
1737
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-WAZWMFJT.js");
1772
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-PBOIEBJZ.js");
1738
1773
  const sleepState = getSleepManagerIfReady2()?.getState(name);
1739
1774
  if (sleepState?.sleeping) {
1740
1775
  mlog.info(`${name} is sleeping \u2014 skipping crash recovery`);
@@ -1747,15 +1782,15 @@ var MindManager = class {
1747
1782
  (err) => mlog.warn(`failed to clear turn state for ${name} after crash`, logger_default.errorData(err))
1748
1783
  );
1749
1784
  try {
1750
- const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-WTGIPBGY.js");
1785
+ const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-3I7CA734.js");
1751
1786
  getDeliveryManager2().clearMindSessions(name);
1752
1787
  } catch (err) {
1753
1788
  if (!(err instanceof Error && err.message.includes("not initialized"))) {
1754
1789
  mlog.warn(`failed to clear delivery state for ${name} after crash`, logger_default.errorData(err));
1755
1790
  }
1756
1791
  }
1757
- import("./mind-activity-tracker-66UVYIFW.js").then(({ markIdle: markIdle2 }) => markIdle2(name)).catch((err) => mlog.warn(`failed to mark ${name} idle after crash`, logger_default.errorData(err)));
1758
- import("./activity-events-PWOGSMRL.js").then(
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(
1759
1794
  ({ publish: publish4 }) => publish4({ type: "mind_stopped", mind: name, summary: `${name} crashed (exit ${code})` })
1760
1795
  ).catch((err) => mlog.warn(`failed to publish crash event for ${name}`, logger_default.errorData(err)));
1761
1796
  const { shouldRestart, delay, attempt } = this.restartTracker.recordCrash(name);
@@ -1806,13 +1841,19 @@ var MindManager = class {
1806
1841
  mlog.warn(`failed to clear turn state for ${name} on stop`, logger_default.errorData(err));
1807
1842
  }
1808
1843
  try {
1809
- const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-WTGIPBGY.js");
1844
+ const { getDeliveryManager: getDeliveryManager2 } = await import("./delivery-manager-3I7CA734.js");
1810
1845
  getDeliveryManager2().clearMindSessions(name);
1811
1846
  } catch (err) {
1812
1847
  if (!(err instanceof Error && err.message.includes("not initialized"))) {
1813
1848
  mlog.warn(`failed to clear delivery state for ${name} on stop`, logger_default.errorData(err));
1814
1849
  }
1815
1850
  }
1851
+ try {
1852
+ const { clearEchoTextCache } = await import("./echo-text-IWAQKNTC.js");
1853
+ clearEchoTextCache(name);
1854
+ } catch (err) {
1855
+ mlog.debug(`failed to clear echo-text cache for ${name}`, logger_default.errorData(err));
1856
+ }
1816
1857
  if (this.restartTracker.reset(name)) this.saveCrashAttempts();
1817
1858
  rmSync(mindPidPath(name), { force: true });
1818
1859
  if (!this.shuttingDown) {
@@ -2291,9 +2332,9 @@ function resolveSkillsDir(manifest) {
2291
2332
  }
2292
2333
  async function discoverBuiltinExtensions(disabledIds) {
2293
2334
  const builtins = [
2294
- { id: "notes", load: async () => (await import("./src-FQE4BHRG.js")).default },
2295
- { id: "pages", load: async () => (await import("./src-QEOLMAYC.js")).default },
2296
- { id: "plan", load: async () => (await import("./src-GW6FP6VL.js")).default }
2335
+ { id: "notes", load: async () => (await import("./src-OYWRPLC6.js")).default },
2336
+ { id: "pages", load: async () => (await import("./src-LT6ZBYYX.js")).default },
2337
+ { id: "plan", load: async () => (await import("./src-O4PRLMKM.js")).default }
2297
2338
  ];
2298
2339
  const results = [];
2299
2340
  for (const { id, load } of builtins) {
@@ -2533,7 +2574,7 @@ async function installNpmExtension(pkg) {
2533
2574
  throw new Error(`Extension "${pkg}" is already installed`);
2534
2575
  }
2535
2576
  const dir = ensureExtensionsNpmDir();
2536
- const { exec: exec2 } = await import("./exec-X3C6ZZTQ.js");
2577
+ const { exec: exec2 } = await import("./exec-ONYZEA5B.js");
2537
2578
  try {
2538
2579
  await exec2("npm", ["install", pkg], { cwd: dir });
2539
2580
  } catch (err) {
@@ -2554,7 +2595,7 @@ async function uninstallNpmExtension(pkg) {
2554
2595
  packages.splice(idx, 1);
2555
2596
  writeExtensionsConfig(packages);
2556
2597
  try {
2557
- const { exec: exec2 } = await import("./exec-X3C6ZZTQ.js");
2598
+ const { exec: exec2 } = await import("./exec-ONYZEA5B.js");
2558
2599
  await exec2("npm", ["uninstall", pkg], { cwd: extensionsNpmDir() });
2559
2600
  } catch (err) {
2560
2601
  logger_default.warn(
@@ -3329,7 +3370,7 @@ async function wakeMind(name) {
3329
3370
  async function startSpiritFull(name) {
3330
3371
  const entry = await findMind(name);
3331
3372
  if (entry?.dir) {
3332
- const { registerMindDir } = await import("./delivery-router-VSULHXNH.js");
3373
+ const { registerMindDir } = await import("./delivery-router-QTFEZ26O.js");
3333
3374
  registerMindDir(name, entry.dir);
3334
3375
  }
3335
3376
  await getMindManager().startMind(name);
@@ -3351,8 +3392,8 @@ async function stopSpiritFull(name) {
3351
3392
  }).catch((err) => logger_default.error("failed to publish spirit_stopped activity", logger_default.errorData(err)));
3352
3393
  }
3353
3394
  async function ensureCreatorDM(mindName, creatorUsername) {
3354
- const { getOrCreateMindUser: getOrCreateMindUser2, getUserByUsername: getUserByUsername2 } = await import("./auth-YTQME4EV.js");
3355
- const { findDMConversation: findDMConversation2, createConversation: createConversation2 } = await import("./conversations-HH3CJD4E.js");
3395
+ const { getOrCreateMindUser: getOrCreateMindUser2, getUserByUsername: getUserByUsername2 } = await import("./auth-2QOOPMBX.js");
3396
+ const { findDMConversation: findDMConversation2, createConversation: createConversation2 } = await import("./conversations-G6YRSABR.js");
3356
3397
  const mindUser = await getOrCreateMindUser2(mindName);
3357
3398
  const creatorUser = await getUserByUsername2(creatorUsername);
3358
3399
  if (!creatorUser) {
@@ -3696,7 +3737,7 @@ var SleepManager = class {
3696
3737
  const db = await getDb();
3697
3738
  const rows = await db.select().from(deliveryQueue).where(and2(eq4(deliveryQueue.mind, name), eq4(deliveryQueue.status, "sleep-queued"))).all();
3698
3739
  if (rows.length === 0) return 0;
3699
- const { deliverMessage: deliverMessage2 } = await import("./message-delivery-YORUXKDQ.js");
3740
+ const { deliverMessage: deliverMessage2 } = await import("./message-delivery-NWL7XEIX.js");
3700
3741
  const delivered = [];
3701
3742
  for (const row of rows) {
3702
3743
  try {
@@ -4606,7 +4647,7 @@ var DeliveryManager = class {
4606
4647
  `To accept this channel, add a routing rule for "${channel}" to your routes.json.`,
4607
4648
  `Messages are being held until a route is configured.`
4608
4649
  ].filter((line) => line !== null).join("\n");
4609
- const { sendSystemMessage: sendSystemMessage2 } = await import("./system-chat-2IFS5HCX.js");
4650
+ const { sendSystemMessage: sendSystemMessage2 } = await import("./system-chat-7AIN3U5M.js");
4610
4651
  await sendSystemMessage2(mindName, notification);
4611
4652
  }
4612
4653
  async persistToQueue(mindName, session, payload, status = "pending") {
@@ -4662,7 +4703,7 @@ var DeliveryManager = class {
4662
4703
  const blocks = [];
4663
4704
  let sharpDefault = null;
4664
4705
  try {
4665
- const mod = await import("./lib-DYEZMGW7.js");
4706
+ const mod = await import("sharp");
4666
4707
  sharpDefault = mod.default ?? mod;
4667
4708
  } catch (err) {
4668
4709
  const code = err.code;
@@ -4820,7 +4861,7 @@ async function recordOutbound(mind, channel, content, opts = {}) {
4820
4861
  type: "outbound",
4821
4862
  channel,
4822
4863
  content,
4823
- turn_id: null,
4864
+ turn_id: opts.turnId ?? null,
4824
4865
  message_id: opts.messageId ?? null
4825
4866
  }).returning({ id: mindHistory.id });
4826
4867
  return result[0]?.id;
@@ -5129,7 +5170,7 @@ async function generateSystemReply(conversationId, mindName, message) {
5129
5170
  if (config.sleep.schedule?.wake) contextParts.push(`Wake cron: ${config.sleep.schedule.wake}`);
5130
5171
  }
5131
5172
  try {
5132
- const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-WAZWMFJT.js");
5173
+ const { getSleepManagerIfReady: getSleepManagerIfReady2 } = await import("./sleep-manager-PBOIEBJZ.js");
5133
5174
  const sm = getSleepManagerIfReady2();
5134
5175
  if (sm) {
5135
5176
  const state = sm.getState(mindName);
@@ -5213,6 +5254,19 @@ export {
5213
5254
  readSystemsConfig,
5214
5255
  writeSystemsConfig,
5215
5256
  deleteSystemsConfig,
5257
+ parseCommandArgs,
5258
+ loadAllExtensions,
5259
+ getLoadedExtensions,
5260
+ getAllDiscoveredExtensions,
5261
+ getAllDiscoveredExtensionsDetailed,
5262
+ setExtensionEnabled,
5263
+ installNpmExtension,
5264
+ uninstallNpmExtension,
5265
+ getExtensionStandardSkills,
5266
+ notifyExtensionsDaemonStart,
5267
+ notifyExtensionsDaemonStop,
5268
+ notifyExtensionsMindStart,
5269
+ notifyExtensionsMindStop,
5216
5270
  initMailPoller,
5217
5271
  Scheduler,
5218
5272
  initScheduler,
@@ -5240,18 +5294,5 @@ export {
5240
5294
  deliverMessage,
5241
5295
  ensureSystemChannel,
5242
5296
  joinSystemChannel,
5243
- announceToSystem,
5244
- parseCommandArgs,
5245
- loadAllExtensions,
5246
- getLoadedExtensions,
5247
- getAllDiscoveredExtensions,
5248
- getAllDiscoveredExtensionsDetailed,
5249
- setExtensionEnabled,
5250
- installNpmExtension,
5251
- uninstallNpmExtension,
5252
- getExtensionStandardSkills,
5253
- notifyExtensionsDaemonStart,
5254
- notifyExtensionsDaemonStop,
5255
- notifyExtensionsMindStart,
5256
- notifyExtensionsMindStop
5297
+ announceToSystem
5257
5298
  };
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  getBaseName,
4
4
  validateMindName
5
- } from "./chunk-75AJ54GM.js";
5
+ } from "./chunk-2NHRJ3YO.js";
6
6
 
7
7
  // packages/daemon/src/lib/mind/isolation.ts
8
8
  import { execFileSync } from "child_process";
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ setBridgeConfig
4
+ } from "./chunk-LQ6Z4FXN.js";
5
+ import {
6
+ readEnv,
7
+ sharedEnvPath,
8
+ writeEnv
9
+ } from "./chunk-PMMHVSCR.js";
10
+
11
+ // packages/daemon/src/lib/template/import-utils.ts
12
+ import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "fs";
13
+ import { homedir } from "os";
14
+ import { basename, resolve } from "path";
15
+ function findOpenClawSession(workspaceDir) {
16
+ const ocAgentsDir = resolve(homedir(), ".openclaw/agents");
17
+ if (!existsSync(ocAgentsDir)) return void 0;
18
+ const matches = [];
19
+ try {
20
+ for (const entry of readdirSync(ocAgentsDir)) {
21
+ const sessionsDir = resolve(ocAgentsDir, entry, "sessions");
22
+ if (!existsSync(sessionsDir)) continue;
23
+ for (const file of readdirSync(sessionsDir)) {
24
+ if (!file.endsWith(".jsonl")) continue;
25
+ const fullPath = resolve(sessionsDir, file);
26
+ if (sessionMatchesWorkspace(fullPath, workspaceDir)) {
27
+ matches.push({ path: fullPath, mtime: statSync(fullPath).mtimeMs });
28
+ }
29
+ }
30
+ }
31
+ } catch (err) {
32
+ console.warn("Warning: error scanning OpenClaw sessions:", err);
33
+ return void 0;
34
+ }
35
+ if (matches.length === 0) return void 0;
36
+ matches.sort((a, b) => b.mtime - a.mtime);
37
+ console.log(`Found session: ${matches[0].path}`);
38
+ return matches[0].path;
39
+ }
40
+ function sessionMatchesWorkspace(sessionPath, workspaceDir) {
41
+ try {
42
+ const fd = readFileSync(sessionPath, "utf-8");
43
+ const firstLine = fd.slice(0, fd.indexOf("\n"));
44
+ const header = JSON.parse(firstLine);
45
+ return header.type === "session" && resolve(header.cwd) === resolve(workspaceDir);
46
+ } catch {
47
+ return false;
48
+ }
49
+ }
50
+ function importPiSession(sessionFile, mindDirPath) {
51
+ const homeDir = resolve(mindDirPath, "home");
52
+ const piSessionDir = resolve(mindDirPath, ".mind/pi-sessions/main");
53
+ mkdirSync(piSessionDir, { recursive: true });
54
+ const content = readFileSync(sessionFile, "utf-8");
55
+ const lines = content.trim().split("\n");
56
+ try {
57
+ const header = JSON.parse(lines[0]);
58
+ if (header.type === "session") {
59
+ header.cwd = homeDir;
60
+ lines[0] = JSON.stringify(header);
61
+ }
62
+ } catch {
63
+ }
64
+ const filename = basename(sessionFile);
65
+ const destPath = resolve(piSessionDir, filename);
66
+ writeFileSync(destPath, `${lines.join("\n")}
67
+ `);
68
+ console.log(`Imported session (${lines.length} entries)`);
69
+ }
70
+ function importOpenClawConnectors(name, _mindDirPath) {
71
+ const configPath = resolve(homedir(), ".openclaw/openclaw.json");
72
+ if (!existsSync(configPath)) return;
73
+ let config;
74
+ try {
75
+ config = JSON.parse(readFileSync(configPath, "utf-8"));
76
+ } catch (err) {
77
+ console.warn("Warning: failed to parse openclaw.json:", err);
78
+ return;
79
+ }
80
+ const discord = config.channels?.discord;
81
+ if (!discord?.enabled || !discord.token) return;
82
+ const envPath = sharedEnvPath();
83
+ const env = readEnv(envPath);
84
+ if (!env.DISCORD_TOKEN) {
85
+ env.DISCORD_TOKEN = discord.token;
86
+ writeEnv(envPath, env);
87
+ }
88
+ const channelMappings = {};
89
+ if (discord.guilds) {
90
+ for (const guild of Object.values(discord.guilds)) {
91
+ if (!guild.channels) continue;
92
+ for (const [channelName, ch] of Object.entries(guild.channels)) {
93
+ if (ch.allow) {
94
+ channelMappings[channelName] = channelName;
95
+ }
96
+ }
97
+ }
98
+ }
99
+ setBridgeConfig("discord", {
100
+ enabled: true,
101
+ defaultMind: name,
102
+ channelMappings
103
+ });
104
+ console.log(`Imported Discord as system bridge (default mind: ${name})`);
105
+ if (Object.keys(channelMappings).length > 0) {
106
+ console.log(`Mapped channels: ${Object.keys(channelMappings).join(", ")}`);
107
+ }
108
+ }
109
+ function parseNameFromIdentity(identity) {
110
+ const match = identity.match(/\*\*Name:\*\*\s*(.+)/);
111
+ if (match) {
112
+ const raw = match[1].trim();
113
+ if (!raw || raw.startsWith("*") || raw.startsWith("(")) return void 0;
114
+ return raw.toLowerCase().replace(/\s+/g, "-").replace(/[^a-z0-9.-]/g, "");
115
+ }
116
+ return void 0;
117
+ }
118
+
119
+ export {
120
+ findOpenClawSession,
121
+ sessionMatchesWorkspace,
122
+ importPiSession,
123
+ importOpenClawConnectors,
124
+ parseNameFromIdentity
125
+ };