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.
- package/dist/{accept-ZBDVVCEU.js → accept-AHAOUFBK.js} +4 -4
- package/dist/{activity-events-PWOGSMRL.js → activity-events-N6HCHU4P.js} +4 -4
- package/dist/{ai-service-GSZWIETO.js → ai-service-C2YNARGH.js} +5 -5
- package/dist/{api-client-3A77HMH7.js → api-client-LC5YRA32.js} +1 -1
- package/dist/{archive-Y2YEOCGB.js → archive-AWIJTVQV.js} +4 -4
- package/dist/{auth-YTQME4EV.js → auth-2QOOPMBX.js} +5 -5
- package/dist/{bridge-PXIO6PS2.js → bridge-F3ZJEKDN.js} +4 -4
- package/dist/{chat-ED7YOGKO.js → chat-5Y4FD77E.js} +9 -9
- package/dist/{chunk-75AJ54GM.js → chunk-2NHRJ3YO.js} +1 -1
- package/dist/{chunk-PJ4IPTIN.js → chunk-3F7XK5Q7.js} +1 -1
- package/dist/{chunk-6F3YNULE.js → chunk-4L2Q7IP5.js} +16 -16
- package/dist/{chunk-IIWF2IPD.js → chunk-5DPRTREW.js} +3 -3
- package/dist/{chunk-X2J7QUFH.js → chunk-7AZQFSOV.js} +1 -1
- package/dist/{chunk-NUX47Y2V.js → chunk-A6FLW5XD.js} +1 -1
- package/dist/{chunk-SWW6AUVW.js → chunk-BIEWHAAM.js} +1 -1
- package/dist/{chunk-TWAN7ZNO.js → chunk-CF4SO5L3.js} +3 -3
- package/dist/{chunk-7PTQGPJY.js → chunk-CJ26DXZL.js} +1 -1
- package/dist/{chunk-PY557GDR.js → chunk-GVVVMZ4J.js} +1 -1
- package/dist/chunk-K3NQKI34.js +10 -0
- package/dist/{chunk-BOLJUV77.js → chunk-KXXJYY62.js} +4 -4
- package/dist/chunk-LIIX2MOM.js +853 -0
- package/dist/chunk-LQ6Z4FXN.js +87 -0
- package/dist/{chunk-N2AUHW4C.js → chunk-MQRS4J24.js} +2 -2
- package/dist/{chunk-B35VNNSS.js → chunk-N42QMDID.js} +2 -2
- package/dist/{chunk-M5RYAA5I.js → chunk-ORNY3MZR.js} +4 -4
- package/dist/{chunk-YDBAY3NA.js → chunk-PMMHVSCR.js} +1 -1
- package/dist/{chunk-GBDVNPN2.js → chunk-QJGLTPAP.js} +8 -8
- package/dist/{chunk-DQ7VBXAP.js → chunk-RUIVWCYY.js} +122 -81
- package/dist/{chunk-L72WYMF7.js → chunk-SNW2NPP4.js} +1 -1
- package/dist/chunk-SZJWC2GA.js +125 -0
- package/dist/{chunk-DJT5Y4UF.js → chunk-TNZ5XQA4.js} +2 -2
- package/dist/{chunk-DMV5P2LU.js → chunk-UIM5NHPP.js} +3 -3
- package/dist/{chunk-ZTVKQOU7.js → chunk-WC635OPK.js} +1 -1
- package/dist/{chunk-YTWZORJN.js → chunk-XLBQYIHH.js} +1 -1
- package/dist/cli.js +24 -24
- package/dist/{clock-HSEKS5AR.js → clock-BMLJ2TR6.js} +8 -8
- package/dist/{cloud-sync-BOCZSDIA.js → cloud-sync-EZKCEIBX.js} +18 -18
- package/dist/{config-UTS7QULS.js → config-QB7W3Z7P.js} +4 -4
- package/dist/connectors/discord-bridge.js +1 -1
- package/dist/connectors/slack-bridge.js +1 -1
- package/dist/connectors/telegram-bridge.js +1 -1
- package/dist/{conversations-HH3CJD4E.js → conversations-G6YRSABR.js} +5 -5
- package/dist/{create-5BPOOJAN.js → create-C3BBFYV7.js} +4 -4
- package/dist/{create-QBEPSD2Z.js → create-PN73742N.js} +4 -4
- package/dist/{daemon-client-RVIKXGFQ.js → daemon-client-2MIPKY3E.js} +1 -1
- package/dist/{daemon-restart-SIR3UR4B.js → daemon-restart-S6SOD3C5.js} +11 -11
- package/dist/daemon.js +392 -1101
- package/dist/db-CBOCDYVA.js +9 -0
- package/dist/{db-BDMH4SZ2.js → db-IJL6B26S.js} +1 -1
- package/dist/{delete-L5PAVDGQ.js → delete-NLXES2C7.js} +3 -3
- package/dist/delivery-manager-3I7CA734.js +30 -0
- package/dist/{delivery-router-VSULHXNH.js → delivery-router-QTFEZ26O.js} +4 -4
- package/dist/down-25L2RKCQ.js +17 -0
- package/dist/echo-text-IWAQKNTC.js +31 -0
- package/dist/{env-E4XHO2BI.js → env-IQ6Q2333.js} +6 -6
- package/dist/exec-ONYZEA5B.js +17 -0
- package/dist/{export-HTFOHOKL.js → export-JPDBQESV.js} +6 -6
- package/dist/{extension-AKZ46YSL.js → extension-LZYHBNLV.js} +4 -4
- package/dist/{extensions-OOSFVH7U.js → extensions-PCOXTHNM.js} +17 -17
- package/dist/{files-H2YLRD37.js → files-LAQ3NXQK.js} +7 -7
- package/dist/{import-OL5BZX7S.js → import-EROF27RH.js} +11 -10
- package/dist/{isolation-N74RWOUX.js → isolation-G5J3MTKU.js} +4 -4
- package/dist/{join-DF5XSJAC.js → join-6SZCA5FX.js} +3 -3
- package/dist/{list-GJ4RUQQT.js → list-KHJZJPEJ.js} +4 -4
- package/dist/{login-JXRVMBRB.js → login-F6YMAVLE.js} +6 -6
- package/dist/{login-GOTAYLXP.js → login-GYTH67ES.js} +4 -4
- package/dist/{logout-FW243JBU.js → logout-HHPH52KZ.js} +6 -6
- package/dist/{logout-6KIA74EV.js → logout-YHQLOFLR.js} +4 -4
- package/dist/message-delivery-NWL7XEIX.js +40 -0
- package/dist/{mind-6VJJHF65.js → mind-MM2IYMJ3.js} +19 -19
- package/dist/{mind-activity-tracker-66UVYIFW.js → mind-activity-tracker-42ENM32S.js} +5 -5
- package/dist/{mind-history-MII2SK7F.js → mind-history-WHCNZ6I5.js} +5 -5
- package/dist/{mind-list-GEWHWAL4.js → mind-list-H3HC2ZRG.js} +4 -4
- package/dist/mind-manager-VOEQ2IZL.js +30 -0
- package/dist/{mind-profile-DCBDVF5B.js → mind-profile-7VYRJGFZ.js} +2 -2
- package/dist/mind-service-WRTOQSAL.js +36 -0
- package/dist/{mind-sleep-ITCF6OQA.js → mind-sleep-ZL5ZXFTM.js} +4 -4
- package/dist/{mind-status-X4SX3YUG.js → mind-status-ZWULKOUO.js} +4 -4
- package/dist/{mind-wake-KXMKMGWX.js → mind-wake-HK5ORGUK.js} +4 -4
- package/dist/{package-3W2MEXHB.js → package-TA6IHIED.js} +2 -2
- package/dist/{read-ZUDG4JWU.js → read-CP7MYMJQ.js} +4 -4
- package/dist/{read-stdin-3X5VYKNS.js → read-stdin-4B5UYPPM.js} +1 -1
- package/dist/{register-SB7NXCOE.js → register-XOBFEMI4.js} +4 -4
- package/dist/{registry-YPHK534W.js → registry-KMELPC3X.js} +3 -3
- package/dist/{reject-MUR2KWJ4.js → reject-43AGXB6B.js} +4 -4
- package/dist/{restart-5EGG4JXU.js → restart-O5QIYQJT.js} +5 -5
- package/dist/{sandbox-LP6YRAXS.js → sandbox-PQYEICEF.js} +5 -5
- package/dist/scheduler-355E746X.js +30 -0
- package/dist/{schema-MISD3JFG.js → schema-K575EBPE.js} +2 -2
- package/dist/{seed-CEC4RC23.js → seed-6S4Z6TAM.js} +2 -2
- package/dist/{seed-check-KJNTL72M.js → seed-check-HZPVFJKZ.js} +2 -2
- package/dist/{seed-cmd-WTTG7SRQ.js → seed-cmd-CBWLJWYD.js} +4 -4
- package/dist/{seed-create-M6RCC6RP.js → seed-create-NT6DG4SE.js} +6 -6
- package/dist/{seed-sprout-ZKCHFJKH.js → seed-sprout-GQLSK4EF.js} +14 -14
- package/dist/{send-LXUT2GGR.js → send-7CIP5GLS.js} +8 -8
- package/dist/{service-M6N3RUYU.js → service-YMHWPDXW.js} +6 -6
- package/dist/{setup-PJOF5UV5.js → setup-APNN7KJB.js} +32 -37
- package/dist/{setup-PMJHCZQX.js → setup-PF7JSFMO.js} +4 -4
- package/dist/{skill-TAAKEYBV.js → skill-ICN6Y2ZF.js} +6 -6
- package/dist/{skills-2PTRTBQP.js → skills-ZFVNN4TU.js} +7 -7
- package/dist/sleep-manager-PBOIEBJZ.js +34 -0
- package/dist/{spirit-6KVDIROQ.js → spirit-4QOYM33G.js} +9 -9
- package/dist/{split-AWVOYOPZ.js → split-5YBEQTBF.js} +3 -3
- package/dist/{sprout-WX2FFYLP.js → sprout-UDLZPMEO.js} +2 -2
- package/dist/{src-QEOLMAYC.js → src-LT6ZBYYX.js} +2 -2
- package/dist/{src-GW6FP6VL.js → src-O4PRLMKM.js} +1 -1
- package/dist/{src-FQE4BHRG.js → src-OYWRPLC6.js} +1 -1
- package/dist/{start-3UXOPXQG.js → start-LMXXRR3X.js} +5 -5
- package/dist/{status-3IVSLJDN.js → status-MC2P7DBG.js} +7 -7
- package/dist/{stop-3XYIBGFM.js → stop-TWDKVEUX.js} +5 -5
- package/dist/system-chat-7AIN3U5M.js +34 -0
- package/dist/{systems-O43WGQY6.js → systems-Y2WZV2K4.js} +7 -7
- package/dist/{tailscale-DZU4WM3E.js → tailscale-LTYNKIPZ.js} +3 -3
- package/dist/{template-hash-6ITI3WC4.js → template-hash-SSIBEEYK.js} +1 -1
- package/dist/up-4T32B7OB.js +19 -0
- package/dist/{update-RIQYUPVN.js → update-UOP2INF2.js} +7 -7
- package/dist/{update-check-4TIJKVGD.js → update-check-IKS7SGK5.js} +4 -4
- package/dist/{upgrade-ZMDGC7M2.js → upgrade-RXFZR5FI.js} +3 -3
- package/dist/{variant-QWL2WSRI.js → variant-HHDTW74J.js} +1 -1
- package/dist/{version-notify-UXSHBZ35.js → version-notify-NCRIN5QK.js} +18 -18
- package/dist/{volute-config-V7UFFBG3.js → volute-config-TS62GS6A.js} +1 -1
- package/dist/web-assets/assets/{index-C-eYso8Y.js → index-B3xLeex8.js} +16 -16
- package/dist/web-assets/assets/{index-CCv_fSte.css → index-Dr4A90Lo.css} +1 -1
- package/dist/web-assets/index.html +2 -2
- package/package.json +1 -1
- package/templates/_base/src/lib/context-breakdown.ts +22 -16
- package/dist/chunk-7KJOFUNN.js +0 -22
- package/dist/chunk-PZYJBOQP.js +0 -207
- package/dist/db-URORGSXQ.js +0 -9
- package/dist/delivery-manager-WTGIPBGY.js +0 -30
- package/dist/down-DGGLZ5TA.js +0 -17
- package/dist/exec-X3C6ZZTQ.js +0 -17
- package/dist/lib-DYEZMGW7.js +0 -6588
- package/dist/message-delivery-YORUXKDQ.js +0 -40
- package/dist/mind-manager-TJ2SUPRX.js +0 -30
- package/dist/mind-service-E7FM2WZF.js +0 -36
- package/dist/scheduler-FRJ5DK24.js +0 -30
- package/dist/sleep-manager-WAZWMFJT.js +0 -34
- package/dist/system-chat-2IFS5HCX.js +0 -34
- 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-
|
|
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-
|
|
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-
|
|
7
|
+
} from "./chunk-2NHRJ3YO.js";
|
|
8
8
|
import {
|
|
9
9
|
activity
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
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";
|
|
@@ -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-
|
|
5
|
+
} from "./chunk-3F7XK5Q7.js";
|
|
9
6
|
import {
|
|
10
7
|
readGlobalConfig,
|
|
11
8
|
writeGlobalConfig
|
|
12
|
-
} from "./chunk-
|
|
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-
|
|
18
|
+
} from "./chunk-2NHRJ3YO.js";
|
|
19
19
|
import {
|
|
20
20
|
sharedSkills
|
|
21
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
7
|
+
} from "./chunk-4L2Q7IP5.js";
|
|
5
8
|
import {
|
|
6
9
|
hashSkillDir,
|
|
7
10
|
importSkillFromDir,
|
|
8
11
|
removeSharedSkill,
|
|
9
12
|
sharedSkillsDir
|
|
10
|
-
} from "./chunk-
|
|
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-
|
|
21
|
+
} from "./chunk-KXXJYY62.js";
|
|
43
22
|
import {
|
|
44
23
|
extractTextContent,
|
|
45
24
|
getRoutingConfig,
|
|
46
25
|
resolveDeliveryMode,
|
|
47
26
|
resolveRoute
|
|
48
|
-
} from "./chunk-
|
|
49
|
-
import {
|
|
50
|
-
loadMergedEnv
|
|
51
|
-
} from "./chunk-YDBAY3NA.js";
|
|
27
|
+
} from "./chunk-7AZQFSOV.js";
|
|
52
28
|
import {
|
|
53
|
-
|
|
54
|
-
|
|
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-
|
|
33
|
+
} from "./chunk-3F7XK5Q7.js";
|
|
63
34
|
import {
|
|
64
35
|
chownMindDir,
|
|
65
36
|
isIsolationEnabled,
|
|
66
37
|
mindUserName,
|
|
67
38
|
wrapForIsolation
|
|
68
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
1758
|
-
import("./activity-events-
|
|
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-
|
|
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-
|
|
2295
|
-
{ id: "pages", load: async () => (await import("./src-
|
|
2296
|
-
{ id: "plan", load: async () => (await import("./src-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
3355
|
-
const { findDMConversation: findDMConversation2, createConversation: createConversation2 } = await import("./conversations-
|
|
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-
|
|
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-
|
|
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("
|
|
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-
|
|
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
|
};
|
|
@@ -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
|
+
};
|