openclaw-multi-auto 1.4.3 → 1.4.4
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/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/plugin-sdk/accounts-CJWOBzwB.js +35 -0
- package/dist/plugin-sdk/accounts-DP1-L-QS.js +288 -0
- package/dist/plugin-sdk/accounts-DZhWlEg3.js +46 -0
- package/dist/plugin-sdk/active-listener-B_sLJTXM.js +50 -0
- package/dist/plugin-sdk/api-key-rotation-BRE4X2tf.js +181 -0
- package/dist/plugin-sdk/audio-preflight-DGEUDxxR.js +69 -0
- package/dist/plugin-sdk/audio-transcription-runner-DkoPNPYt.js +2176 -0
- package/dist/plugin-sdk/audit-membership-runtime-DSBHHw7o.js +58 -0
- package/dist/plugin-sdk/channel-activity-F3d0yUwy.js +94 -0
- package/dist/plugin-sdk/channel-web-QF7EpjeP.js +2256 -0
- package/dist/plugin-sdk/chrome-BXoCyCkY.js +2415 -0
- package/dist/plugin-sdk/commands-registry-t7cXBTfN.js +1125 -0
- package/dist/plugin-sdk/config-BkEnz2Po.js +17913 -0
- package/dist/plugin-sdk/deliver-B6AG_l67.js +1694 -0
- package/dist/plugin-sdk/deliver-runtime-D585kJZc.js +32 -0
- package/dist/plugin-sdk/deps-send-discord.runtime-a_OKY2js.js +23 -0
- package/dist/plugin-sdk/deps-send-imessage.runtime-Baxy9TD4.js +22 -0
- package/dist/plugin-sdk/deps-send-signal.runtime-BwXoCrFl.js +21 -0
- package/dist/plugin-sdk/deps-send-slack.runtime-CLmKjgso.js +19 -0
- package/dist/plugin-sdk/deps-send-telegram.runtime-BKfdBKnZ.js +24 -0
- package/dist/plugin-sdk/deps-send-whatsapp.runtime-BOTwkbx_.js +57 -0
- package/dist/plugin-sdk/diagnostic-CsP-lEkI.js +319 -0
- package/dist/plugin-sdk/errors-DaiAM-yU.js +54 -0
- package/dist/plugin-sdk/fetch-guard-DETCcJzQ.js +156 -0
- package/dist/plugin-sdk/fs-safe-B8y811FR.js +352 -0
- package/dist/plugin-sdk/image-DjTEkYZE.js +2310 -0
- package/dist/plugin-sdk/image-ops-BSiMpAw4.js +584 -0
- package/dist/plugin-sdk/image-runtime-6xPp8m5a.js +25 -0
- package/dist/plugin-sdk/index.js +50 -50
- package/dist/plugin-sdk/ir-DQ7_HbvK.js +1296 -0
- package/dist/plugin-sdk/local-roots-BUP4YBmR.js +186 -0
- package/dist/plugin-sdk/logger-CZY9KIoY.js +1163 -0
- package/dist/plugin-sdk/login-BxEKLlCo.js +57 -0
- package/dist/plugin-sdk/login-qr-BQIpMPr9.js +320 -0
- package/dist/plugin-sdk/manager-I6KbPihW.js +3917 -0
- package/dist/plugin-sdk/manager-runtime-CFfYYWIQ.js +15 -0
- package/dist/plugin-sdk/mattermost.js +3 -3
- package/dist/plugin-sdk/outbound-NS6UHnB6.js +212 -0
- package/dist/plugin-sdk/outbound-attachment-Dy6fyf6H.js +19 -0
- package/dist/plugin-sdk/path-alias-guards-DBjLbIX_.js +43 -0
- package/dist/plugin-sdk/paths-vTM3Lh3X.js +166 -0
- package/dist/plugin-sdk/pi-embedded-helpers-1R1gu7eX.js +9627 -0
- package/dist/plugin-sdk/pi-model-discovery-runtime-Do9o-dUd.js +8 -0
- package/dist/plugin-sdk/pi-model-discovery-v-XPUOOf.js +134 -0
- package/dist/plugin-sdk/pi-tools.before-tool-call.runtime-D4sFsIks.js +354 -0
- package/dist/plugin-sdk/plugins-DeBZB9l_.js +864 -0
- package/dist/plugin-sdk/proxy-fetch-ChxOhWF4.js +38 -0
- package/dist/plugin-sdk/pw-ai-DEOmCSSC.js +1938 -0
- package/dist/plugin-sdk/qmd-manager-HyYKoEch.js +1448 -0
- package/dist/plugin-sdk/query-expansion-CeyKUeDW.js +1011 -0
- package/dist/plugin-sdk/redact-DjVX-1N3.js +319 -0
- package/dist/plugin-sdk/reply-DAo_Jt8K.js +97916 -0
- package/dist/plugin-sdk/resolve-outbound-target-B42qgQS9.js +40 -0
- package/dist/plugin-sdk/run-with-concurrency-Bt_ks0Qa.js +1994 -0
- package/dist/plugin-sdk/runtime-whatsapp-login.runtime-B6W989eF.js +10 -0
- package/dist/plugin-sdk/runtime-whatsapp-outbound.runtime-c_GDFy37.js +19 -0
- package/dist/plugin-sdk/send-CQpMudwO.js +2587 -0
- package/dist/plugin-sdk/send-DQHLzVyO.js +414 -0
- package/dist/plugin-sdk/send-DTB24bEF.js +3135 -0
- package/dist/plugin-sdk/send-DfHadjZ_.js +503 -0
- package/dist/plugin-sdk/send-XXlW2iny.js +540 -0
- package/dist/plugin-sdk/session-6TF6MyaC.js +169 -0
- package/dist/plugin-sdk/skill-commands-CkGeFUMl.js +342 -0
- package/dist/plugin-sdk/skills-CBkHBYPq.js +1428 -0
- package/dist/plugin-sdk/slash-commands.runtime-CxliuGaP.js +13 -0
- package/dist/plugin-sdk/slash-dispatch.runtime-DFaeYlJQ.js +52 -0
- package/dist/plugin-sdk/slash-skill-commands.runtime-0M0OLCxq.js +16 -0
- package/dist/plugin-sdk/ssrf-cFtplYtS.js +202 -0
- package/dist/plugin-sdk/store-5nyxY3WU.js +81 -0
- package/dist/plugin-sdk/subagent-registry-runtime-DCtmDwna.js +52 -0
- package/dist/plugin-sdk/tables-C47P4GTN.js +55 -0
- package/dist/plugin-sdk/target-errors-Blia4S69.js +195 -0
- package/dist/plugin-sdk/thinking-Bo2eosVa.js +1206 -0
- package/dist/plugin-sdk/tokens-DgNRBwIg.js +52 -0
- package/dist/plugin-sdk/tool-images-Gk_-0y2N.js +274 -0
- package/dist/plugin-sdk/web-CVxZbXyH.js +56 -0
- package/dist/plugin-sdk/whatsapp-actions-Bw0H9g-n.js +80 -0
- package/package.json +1 -1
- package/scripts/install-maca.sh +28 -5
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import "./run-with-concurrency-Bt_ks0Qa.js";
|
|
2
|
+
import "./accounts-DP1-L-QS.js";
|
|
3
|
+
import "./paths-MKyEVmEb.js";
|
|
4
|
+
import "./github-copilot-token-D5fdS6xD.js";
|
|
5
|
+
import "./config-BkEnz2Po.js";
|
|
6
|
+
import "./logger-CZY9KIoY.js";
|
|
7
|
+
import "./thinking-Bo2eosVa.js";
|
|
8
|
+
import "./image-ops-BSiMpAw4.js";
|
|
9
|
+
import "./pi-embedded-helpers-1R1gu7eX.js";
|
|
10
|
+
import "./plugins-DeBZB9l_.js";
|
|
11
|
+
import "./accounts-CJWOBzwB.js";
|
|
12
|
+
import "./accounts-DZhWlEg3.js";
|
|
13
|
+
import "./paths-vTM3Lh3X.js";
|
|
14
|
+
import "./fetch-Bv4TQOMH.js";
|
|
15
|
+
import "./redact-DjVX-1N3.js";
|
|
16
|
+
import "./errors-DaiAM-yU.js";
|
|
17
|
+
import "./path-alias-guards-DBjLbIX_.js";
|
|
18
|
+
import "./fs-safe-B8y811FR.js";
|
|
19
|
+
import "./ssrf-cFtplYtS.js";
|
|
20
|
+
import "./fetch-guard-DETCcJzQ.js";
|
|
21
|
+
import "./local-roots-BUP4YBmR.js";
|
|
22
|
+
import "./ir-DQ7_HbvK.js";
|
|
23
|
+
import "./tool-images-Gk_-0y2N.js";
|
|
24
|
+
import "./tokens-DgNRBwIg.js";
|
|
25
|
+
import "./skills-CBkHBYPq.js";
|
|
26
|
+
import "./chrome-BXoCyCkY.js";
|
|
27
|
+
import { t as deliverOutboundPayloads } from "./deliver-B6AG_l67.js";
|
|
28
|
+
import "./store-5nyxY3WU.js";
|
|
29
|
+
import "./send-XXlW2iny.js";
|
|
30
|
+
import "./outbound-attachment-Dy6fyf6H.js";
|
|
31
|
+
|
|
32
|
+
export { deliverOutboundPayloads };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import "./run-with-concurrency-Bt_ks0Qa.js";
|
|
2
|
+
import "./accounts-DP1-L-QS.js";
|
|
3
|
+
import "./paths-MKyEVmEb.js";
|
|
4
|
+
import "./github-copilot-token-D5fdS6xD.js";
|
|
5
|
+
import "./config-BkEnz2Po.js";
|
|
6
|
+
import "./logger-CZY9KIoY.js";
|
|
7
|
+
import "./image-ops-BSiMpAw4.js";
|
|
8
|
+
import "./plugins-DeBZB9l_.js";
|
|
9
|
+
import { h as sendMessageDiscord } from "./send-DTB24bEF.js";
|
|
10
|
+
import "./fetch-Bv4TQOMH.js";
|
|
11
|
+
import "./redact-DjVX-1N3.js";
|
|
12
|
+
import "./errors-DaiAM-yU.js";
|
|
13
|
+
import "./channel-activity-F3d0yUwy.js";
|
|
14
|
+
import "./path-alias-guards-DBjLbIX_.js";
|
|
15
|
+
import "./fs-safe-B8y811FR.js";
|
|
16
|
+
import "./ssrf-cFtplYtS.js";
|
|
17
|
+
import "./fetch-guard-DETCcJzQ.js";
|
|
18
|
+
import "./local-roots-BUP4YBmR.js";
|
|
19
|
+
import "./ir-DQ7_HbvK.js";
|
|
20
|
+
import "./render-HmipMDlP.js";
|
|
21
|
+
import "./tables-C47P4GTN.js";
|
|
22
|
+
|
|
23
|
+
export { sendMessageDiscord };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import "./run-with-concurrency-Bt_ks0Qa.js";
|
|
2
|
+
import "./accounts-DP1-L-QS.js";
|
|
3
|
+
import "./paths-MKyEVmEb.js";
|
|
4
|
+
import "./github-copilot-token-D5fdS6xD.js";
|
|
5
|
+
import "./config-BkEnz2Po.js";
|
|
6
|
+
import "./logger-CZY9KIoY.js";
|
|
7
|
+
import "./image-ops-BSiMpAw4.js";
|
|
8
|
+
import "./plugins-DeBZB9l_.js";
|
|
9
|
+
import "./accounts-CJWOBzwB.js";
|
|
10
|
+
import "./path-alias-guards-DBjLbIX_.js";
|
|
11
|
+
import "./fs-safe-B8y811FR.js";
|
|
12
|
+
import "./ssrf-cFtplYtS.js";
|
|
13
|
+
import "./fetch-guard-DETCcJzQ.js";
|
|
14
|
+
import "./local-roots-BUP4YBmR.js";
|
|
15
|
+
import "./ir-DQ7_HbvK.js";
|
|
16
|
+
import "./render-HmipMDlP.js";
|
|
17
|
+
import "./tables-C47P4GTN.js";
|
|
18
|
+
import { t as sendMessageIMessage } from "./send-DfHadjZ_.js";
|
|
19
|
+
import "./store-5nyxY3WU.js";
|
|
20
|
+
import "./outbound-attachment-Dy6fyf6H.js";
|
|
21
|
+
|
|
22
|
+
export { sendMessageIMessage };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import "./run-with-concurrency-Bt_ks0Qa.js";
|
|
2
|
+
import "./accounts-DP1-L-QS.js";
|
|
3
|
+
import "./paths-MKyEVmEb.js";
|
|
4
|
+
import "./github-copilot-token-D5fdS6xD.js";
|
|
5
|
+
import "./config-BkEnz2Po.js";
|
|
6
|
+
import "./logger-CZY9KIoY.js";
|
|
7
|
+
import "./image-ops-BSiMpAw4.js";
|
|
8
|
+
import "./plugins-DeBZB9l_.js";
|
|
9
|
+
import "./accounts-DZhWlEg3.js";
|
|
10
|
+
import "./fetch-Bv4TQOMH.js";
|
|
11
|
+
import "./path-alias-guards-DBjLbIX_.js";
|
|
12
|
+
import "./fs-safe-B8y811FR.js";
|
|
13
|
+
import "./ssrf-cFtplYtS.js";
|
|
14
|
+
import "./fetch-guard-DETCcJzQ.js";
|
|
15
|
+
import "./local-roots-BUP4YBmR.js";
|
|
16
|
+
import "./ir-DQ7_HbvK.js";
|
|
17
|
+
import "./store-5nyxY3WU.js";
|
|
18
|
+
import { t as sendMessageSignal } from "./send-XXlW2iny.js";
|
|
19
|
+
import "./outbound-attachment-Dy6fyf6H.js";
|
|
20
|
+
|
|
21
|
+
export { sendMessageSignal };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import "./run-with-concurrency-Bt_ks0Qa.js";
|
|
2
|
+
import "./accounts-DP1-L-QS.js";
|
|
3
|
+
import "./paths-MKyEVmEb.js";
|
|
4
|
+
import "./github-copilot-token-D5fdS6xD.js";
|
|
5
|
+
import "./config-BkEnz2Po.js";
|
|
6
|
+
import "./logger-CZY9KIoY.js";
|
|
7
|
+
import "./image-ops-BSiMpAw4.js";
|
|
8
|
+
import "./plugins-DeBZB9l_.js";
|
|
9
|
+
import "./path-alias-guards-DBjLbIX_.js";
|
|
10
|
+
import "./fs-safe-B8y811FR.js";
|
|
11
|
+
import "./ssrf-cFtplYtS.js";
|
|
12
|
+
import "./fetch-guard-DETCcJzQ.js";
|
|
13
|
+
import "./local-roots-BUP4YBmR.js";
|
|
14
|
+
import "./ir-DQ7_HbvK.js";
|
|
15
|
+
import "./render-HmipMDlP.js";
|
|
16
|
+
import { t as sendMessageSlack } from "./send-DQHLzVyO.js";
|
|
17
|
+
import "./tokens-DgNRBwIg.js";
|
|
18
|
+
|
|
19
|
+
export { sendMessageSlack };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import "./run-with-concurrency-Bt_ks0Qa.js";
|
|
2
|
+
import "./accounts-DP1-L-QS.js";
|
|
3
|
+
import "./paths-MKyEVmEb.js";
|
|
4
|
+
import "./github-copilot-token-D5fdS6xD.js";
|
|
5
|
+
import "./config-BkEnz2Po.js";
|
|
6
|
+
import "./logger-CZY9KIoY.js";
|
|
7
|
+
import "./image-ops-BSiMpAw4.js";
|
|
8
|
+
import "./plugins-DeBZB9l_.js";
|
|
9
|
+
import "./fetch-Bv4TQOMH.js";
|
|
10
|
+
import "./redact-DjVX-1N3.js";
|
|
11
|
+
import "./errors-DaiAM-yU.js";
|
|
12
|
+
import "./channel-activity-F3d0yUwy.js";
|
|
13
|
+
import "./path-alias-guards-DBjLbIX_.js";
|
|
14
|
+
import "./fs-safe-B8y811FR.js";
|
|
15
|
+
import "./ssrf-cFtplYtS.js";
|
|
16
|
+
import "./fetch-guard-DETCcJzQ.js";
|
|
17
|
+
import "./local-roots-BUP4YBmR.js";
|
|
18
|
+
import "./ir-DQ7_HbvK.js";
|
|
19
|
+
import "./render-HmipMDlP.js";
|
|
20
|
+
import { o as sendMessageTelegram } from "./send-CQpMudwO.js";
|
|
21
|
+
import "./proxy-fetch-ChxOhWF4.js";
|
|
22
|
+
import "./proxy-BKdNrmWL.js";
|
|
23
|
+
|
|
24
|
+
export { sendMessageTelegram };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import "./run-with-concurrency-Bt_ks0Qa.js";
|
|
2
|
+
import "./accounts-DP1-L-QS.js";
|
|
3
|
+
import "./reply-DAo_Jt8K.js";
|
|
4
|
+
import "./paths-MKyEVmEb.js";
|
|
5
|
+
import "./github-copilot-token-D5fdS6xD.js";
|
|
6
|
+
import "./config-BkEnz2Po.js";
|
|
7
|
+
import "./logger-CZY9KIoY.js";
|
|
8
|
+
import "./thinking-Bo2eosVa.js";
|
|
9
|
+
import "./image-ops-BSiMpAw4.js";
|
|
10
|
+
import "./pi-embedded-helpers-1R1gu7eX.js";
|
|
11
|
+
import "./plugins-DeBZB9l_.js";
|
|
12
|
+
import "./accounts-CJWOBzwB.js";
|
|
13
|
+
import "./accounts-DZhWlEg3.js";
|
|
14
|
+
import "./send-DTB24bEF.js";
|
|
15
|
+
import "./paths-vTM3Lh3X.js";
|
|
16
|
+
import "./fetch-Bv4TQOMH.js";
|
|
17
|
+
import "./redact-DjVX-1N3.js";
|
|
18
|
+
import "./errors-DaiAM-yU.js";
|
|
19
|
+
import "./channel-activity-F3d0yUwy.js";
|
|
20
|
+
import "./path-alias-guards-DBjLbIX_.js";
|
|
21
|
+
import "./fs-safe-B8y811FR.js";
|
|
22
|
+
import "./ssrf-cFtplYtS.js";
|
|
23
|
+
import "./fetch-guard-DETCcJzQ.js";
|
|
24
|
+
import "./local-roots-BUP4YBmR.js";
|
|
25
|
+
import "./ir-DQ7_HbvK.js";
|
|
26
|
+
import "./render-HmipMDlP.js";
|
|
27
|
+
import "./tables-C47P4GTN.js";
|
|
28
|
+
import "./send-DfHadjZ_.js";
|
|
29
|
+
import "./send-CQpMudwO.js";
|
|
30
|
+
import "./tool-images-Gk_-0y2N.js";
|
|
31
|
+
import "./target-errors-Blia4S69.js";
|
|
32
|
+
import "./send-DQHLzVyO.js";
|
|
33
|
+
import "./audio-transcription-runner-DkoPNPYt.js";
|
|
34
|
+
import "./tokens-DgNRBwIg.js";
|
|
35
|
+
import "./skill-commands-CkGeFUMl.js";
|
|
36
|
+
import "./skills-CBkHBYPq.js";
|
|
37
|
+
import "./chrome-BXoCyCkY.js";
|
|
38
|
+
import "./deliver-B6AG_l67.js";
|
|
39
|
+
import "./diagnostic-CsP-lEkI.js";
|
|
40
|
+
import "./store-5nyxY3WU.js";
|
|
41
|
+
import "./commands-registry-t7cXBTfN.js";
|
|
42
|
+
import "./channel-web-QF7EpjeP.js";
|
|
43
|
+
import "./image-DjTEkYZE.js";
|
|
44
|
+
import "./api-key-rotation-BRE4X2tf.js";
|
|
45
|
+
import "./proxy-fetch-ChxOhWF4.js";
|
|
46
|
+
import "./pi-model-discovery-v-XPUOOf.js";
|
|
47
|
+
import "./send-XXlW2iny.js";
|
|
48
|
+
import "./outbound-attachment-Dy6fyf6H.js";
|
|
49
|
+
import "./proxy-BKdNrmWL.js";
|
|
50
|
+
import "./manager-I6KbPihW.js";
|
|
51
|
+
import "./query-expansion-CeyKUeDW.js";
|
|
52
|
+
import { t as sendMessageWhatsApp } from "./outbound-NS6UHnB6.js";
|
|
53
|
+
import "./session-6TF6MyaC.js";
|
|
54
|
+
import "./login-BxEKLlCo.js";
|
|
55
|
+
import "./web-CVxZbXyH.js";
|
|
56
|
+
|
|
57
|
+
export { sendMessageWhatsApp };
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { n as loadConfig } from "./config-BkEnz2Po.js";
|
|
2
|
+
import { a as createSubsystemLogger } from "./logger-CZY9KIoY.js";
|
|
3
|
+
|
|
4
|
+
//#region src/infra/diagnostic-events.ts
|
|
5
|
+
function getDiagnosticEventsState() {
|
|
6
|
+
const globalStore = globalThis;
|
|
7
|
+
if (!globalStore.__openclawDiagnosticEventsState) globalStore.__openclawDiagnosticEventsState = {
|
|
8
|
+
seq: 0,
|
|
9
|
+
listeners: /* @__PURE__ */ new Set(),
|
|
10
|
+
dispatchDepth: 0
|
|
11
|
+
};
|
|
12
|
+
return globalStore.__openclawDiagnosticEventsState;
|
|
13
|
+
}
|
|
14
|
+
function isDiagnosticsEnabled(config) {
|
|
15
|
+
return config?.diagnostics?.enabled === true;
|
|
16
|
+
}
|
|
17
|
+
function emitDiagnosticEvent(event) {
|
|
18
|
+
const state = getDiagnosticEventsState();
|
|
19
|
+
if (state.dispatchDepth > 100) {
|
|
20
|
+
console.error(`[diagnostic-events] recursion guard tripped at depth=${state.dispatchDepth}, dropping type=${event.type}`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const enriched = {
|
|
24
|
+
...event,
|
|
25
|
+
seq: state.seq += 1,
|
|
26
|
+
ts: Date.now()
|
|
27
|
+
};
|
|
28
|
+
state.dispatchDepth += 1;
|
|
29
|
+
for (const listener of state.listeners) try {
|
|
30
|
+
listener(enriched);
|
|
31
|
+
} catch (err) {
|
|
32
|
+
const errorMessage = err instanceof Error ? err.stack ?? err.message : typeof err === "string" ? err : String(err);
|
|
33
|
+
console.error(`[diagnostic-events] listener error type=${enriched.type} seq=${enriched.seq}: ${errorMessage}`);
|
|
34
|
+
}
|
|
35
|
+
state.dispatchDepth -= 1;
|
|
36
|
+
}
|
|
37
|
+
function onDiagnosticEvent(listener) {
|
|
38
|
+
const state = getDiagnosticEventsState();
|
|
39
|
+
state.listeners.add(listener);
|
|
40
|
+
return () => {
|
|
41
|
+
state.listeners.delete(listener);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
//#endregion
|
|
46
|
+
//#region src/logging/diagnostic-session-state.ts
|
|
47
|
+
const diagnosticSessionStates = /* @__PURE__ */ new Map();
|
|
48
|
+
const SESSION_STATE_TTL_MS = 1800 * 1e3;
|
|
49
|
+
const SESSION_STATE_PRUNE_INTERVAL_MS = 60 * 1e3;
|
|
50
|
+
const SESSION_STATE_MAX_ENTRIES = 2e3;
|
|
51
|
+
let lastSessionPruneAt = 0;
|
|
52
|
+
function pruneDiagnosticSessionStates(now = Date.now(), force = false) {
|
|
53
|
+
const shouldPruneForSize = diagnosticSessionStates.size > SESSION_STATE_MAX_ENTRIES;
|
|
54
|
+
if (!force && !shouldPruneForSize && now - lastSessionPruneAt < SESSION_STATE_PRUNE_INTERVAL_MS) return;
|
|
55
|
+
lastSessionPruneAt = now;
|
|
56
|
+
for (const [key, state] of diagnosticSessionStates.entries()) {
|
|
57
|
+
const ageMs = now - state.lastActivity;
|
|
58
|
+
if (state.state === "idle" && state.queueDepth <= 0 && ageMs > SESSION_STATE_TTL_MS) diagnosticSessionStates.delete(key);
|
|
59
|
+
}
|
|
60
|
+
if (diagnosticSessionStates.size <= SESSION_STATE_MAX_ENTRIES) return;
|
|
61
|
+
const excess = diagnosticSessionStates.size - SESSION_STATE_MAX_ENTRIES;
|
|
62
|
+
const ordered = Array.from(diagnosticSessionStates.entries()).toSorted((a, b) => a[1].lastActivity - b[1].lastActivity);
|
|
63
|
+
for (let i = 0; i < excess; i += 1) {
|
|
64
|
+
const key = ordered[i]?.[0];
|
|
65
|
+
if (!key) break;
|
|
66
|
+
diagnosticSessionStates.delete(key);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function resolveSessionKey({ sessionKey, sessionId }) {
|
|
70
|
+
return sessionKey ?? sessionId ?? "unknown";
|
|
71
|
+
}
|
|
72
|
+
function findStateBySessionId(sessionId) {
|
|
73
|
+
for (const state of diagnosticSessionStates.values()) if (state.sessionId === sessionId) return state;
|
|
74
|
+
}
|
|
75
|
+
function getDiagnosticSessionState(ref) {
|
|
76
|
+
pruneDiagnosticSessionStates();
|
|
77
|
+
const key = resolveSessionKey(ref);
|
|
78
|
+
const existing = diagnosticSessionStates.get(key) ?? (ref.sessionId && findStateBySessionId(ref.sessionId));
|
|
79
|
+
if (existing) {
|
|
80
|
+
if (ref.sessionId) existing.sessionId = ref.sessionId;
|
|
81
|
+
if (ref.sessionKey) existing.sessionKey = ref.sessionKey;
|
|
82
|
+
return existing;
|
|
83
|
+
}
|
|
84
|
+
const created = {
|
|
85
|
+
sessionId: ref.sessionId,
|
|
86
|
+
sessionKey: ref.sessionKey,
|
|
87
|
+
lastActivity: Date.now(),
|
|
88
|
+
state: "idle",
|
|
89
|
+
queueDepth: 0
|
|
90
|
+
};
|
|
91
|
+
diagnosticSessionStates.set(key, created);
|
|
92
|
+
pruneDiagnosticSessionStates(Date.now(), true);
|
|
93
|
+
return created;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
//#endregion
|
|
97
|
+
//#region src/logging/diagnostic.ts
|
|
98
|
+
const diag = createSubsystemLogger("diagnostic");
|
|
99
|
+
const webhookStats = {
|
|
100
|
+
received: 0,
|
|
101
|
+
processed: 0,
|
|
102
|
+
errors: 0,
|
|
103
|
+
lastReceived: 0
|
|
104
|
+
};
|
|
105
|
+
let lastActivityAt = 0;
|
|
106
|
+
const DEFAULT_STUCK_SESSION_WARN_MS = 12e4;
|
|
107
|
+
const MIN_STUCK_SESSION_WARN_MS = 1e3;
|
|
108
|
+
const MAX_STUCK_SESSION_WARN_MS = 1440 * 60 * 1e3;
|
|
109
|
+
let commandPollBackoffRuntimePromise = null;
|
|
110
|
+
function loadCommandPollBackoffRuntime() {
|
|
111
|
+
commandPollBackoffRuntimePromise ??= import("./command-poll-backoff.runtime-BrAQqJqT.js");
|
|
112
|
+
return commandPollBackoffRuntimePromise;
|
|
113
|
+
}
|
|
114
|
+
function markActivity() {
|
|
115
|
+
lastActivityAt = Date.now();
|
|
116
|
+
}
|
|
117
|
+
function resolveStuckSessionWarnMs(config) {
|
|
118
|
+
const raw = config?.diagnostics?.stuckSessionWarnMs;
|
|
119
|
+
if (typeof raw !== "number" || !Number.isFinite(raw)) return DEFAULT_STUCK_SESSION_WARN_MS;
|
|
120
|
+
const rounded = Math.floor(raw);
|
|
121
|
+
if (rounded < MIN_STUCK_SESSION_WARN_MS || rounded > MAX_STUCK_SESSION_WARN_MS) return DEFAULT_STUCK_SESSION_WARN_MS;
|
|
122
|
+
return rounded;
|
|
123
|
+
}
|
|
124
|
+
function logWebhookReceived(params) {
|
|
125
|
+
webhookStats.received += 1;
|
|
126
|
+
webhookStats.lastReceived = Date.now();
|
|
127
|
+
if (diag.isEnabled("debug")) diag.debug(`webhook received: channel=${params.channel} type=${params.updateType ?? "unknown"} chatId=${params.chatId ?? "unknown"} total=${webhookStats.received}`);
|
|
128
|
+
emitDiagnosticEvent({
|
|
129
|
+
type: "webhook.received",
|
|
130
|
+
channel: params.channel,
|
|
131
|
+
updateType: params.updateType,
|
|
132
|
+
chatId: params.chatId
|
|
133
|
+
});
|
|
134
|
+
markActivity();
|
|
135
|
+
}
|
|
136
|
+
function logWebhookProcessed(params) {
|
|
137
|
+
webhookStats.processed += 1;
|
|
138
|
+
if (diag.isEnabled("debug")) diag.debug(`webhook processed: channel=${params.channel} type=${params.updateType ?? "unknown"} chatId=${params.chatId ?? "unknown"} duration=${params.durationMs ?? 0}ms processed=${webhookStats.processed}`);
|
|
139
|
+
emitDiagnosticEvent({
|
|
140
|
+
type: "webhook.processed",
|
|
141
|
+
channel: params.channel,
|
|
142
|
+
updateType: params.updateType,
|
|
143
|
+
chatId: params.chatId,
|
|
144
|
+
durationMs: params.durationMs
|
|
145
|
+
});
|
|
146
|
+
markActivity();
|
|
147
|
+
}
|
|
148
|
+
function logWebhookError(params) {
|
|
149
|
+
webhookStats.errors += 1;
|
|
150
|
+
diag.error(`webhook error: channel=${params.channel} type=${params.updateType ?? "unknown"} chatId=${params.chatId ?? "unknown"} error="${params.error}" errors=${webhookStats.errors}`);
|
|
151
|
+
emitDiagnosticEvent({
|
|
152
|
+
type: "webhook.error",
|
|
153
|
+
channel: params.channel,
|
|
154
|
+
updateType: params.updateType,
|
|
155
|
+
chatId: params.chatId,
|
|
156
|
+
error: params.error
|
|
157
|
+
});
|
|
158
|
+
markActivity();
|
|
159
|
+
}
|
|
160
|
+
function logMessageQueued(params) {
|
|
161
|
+
const state = getDiagnosticSessionState(params);
|
|
162
|
+
state.queueDepth += 1;
|
|
163
|
+
state.lastActivity = Date.now();
|
|
164
|
+
if (diag.isEnabled("debug")) diag.debug(`message queued: sessionId=${state.sessionId ?? "unknown"} sessionKey=${state.sessionKey ?? "unknown"} source=${params.source} queueDepth=${state.queueDepth} sessionState=${state.state}`);
|
|
165
|
+
emitDiagnosticEvent({
|
|
166
|
+
type: "message.queued",
|
|
167
|
+
sessionId: state.sessionId,
|
|
168
|
+
sessionKey: state.sessionKey,
|
|
169
|
+
channel: params.channel,
|
|
170
|
+
source: params.source,
|
|
171
|
+
queueDepth: state.queueDepth
|
|
172
|
+
});
|
|
173
|
+
markActivity();
|
|
174
|
+
}
|
|
175
|
+
function logMessageProcessed(params) {
|
|
176
|
+
if (params.outcome === "error" ? diag.isEnabled("error") : diag.isEnabled("debug")) {
|
|
177
|
+
const payload = `message processed: channel=${params.channel} chatId=${params.chatId ?? "unknown"} messageId=${params.messageId ?? "unknown"} sessionId=${params.sessionId ?? "unknown"} sessionKey=${params.sessionKey ?? "unknown"} outcome=${params.outcome} duration=${params.durationMs ?? 0}ms${params.reason ? ` reason=${params.reason}` : ""}${params.error ? ` error="${params.error}"` : ""}`;
|
|
178
|
+
if (params.outcome === "error") diag.error(payload);
|
|
179
|
+
else diag.debug(payload);
|
|
180
|
+
}
|
|
181
|
+
emitDiagnosticEvent({
|
|
182
|
+
type: "message.processed",
|
|
183
|
+
channel: params.channel,
|
|
184
|
+
chatId: params.chatId,
|
|
185
|
+
messageId: params.messageId,
|
|
186
|
+
sessionId: params.sessionId,
|
|
187
|
+
sessionKey: params.sessionKey,
|
|
188
|
+
durationMs: params.durationMs,
|
|
189
|
+
outcome: params.outcome,
|
|
190
|
+
reason: params.reason,
|
|
191
|
+
error: params.error
|
|
192
|
+
});
|
|
193
|
+
markActivity();
|
|
194
|
+
}
|
|
195
|
+
function logSessionStateChange(params) {
|
|
196
|
+
const state = getDiagnosticSessionState(params);
|
|
197
|
+
const isProbeSession = state.sessionId?.startsWith("probe-") ?? false;
|
|
198
|
+
const prevState = state.state;
|
|
199
|
+
state.state = params.state;
|
|
200
|
+
state.lastActivity = Date.now();
|
|
201
|
+
if (params.state === "idle") state.queueDepth = Math.max(0, state.queueDepth - 1);
|
|
202
|
+
if (!isProbeSession && diag.isEnabled("debug")) diag.debug(`session state: sessionId=${state.sessionId ?? "unknown"} sessionKey=${state.sessionKey ?? "unknown"} prev=${prevState} new=${params.state} reason="${params.reason ?? ""}" queueDepth=${state.queueDepth}`);
|
|
203
|
+
emitDiagnosticEvent({
|
|
204
|
+
type: "session.state",
|
|
205
|
+
sessionId: state.sessionId,
|
|
206
|
+
sessionKey: state.sessionKey,
|
|
207
|
+
prevState,
|
|
208
|
+
state: params.state,
|
|
209
|
+
reason: params.reason,
|
|
210
|
+
queueDepth: state.queueDepth
|
|
211
|
+
});
|
|
212
|
+
markActivity();
|
|
213
|
+
}
|
|
214
|
+
function logSessionStuck(params) {
|
|
215
|
+
const state = getDiagnosticSessionState(params);
|
|
216
|
+
diag.warn(`stuck session: sessionId=${state.sessionId ?? "unknown"} sessionKey=${state.sessionKey ?? "unknown"} state=${params.state} age=${Math.round(params.ageMs / 1e3)}s queueDepth=${state.queueDepth}`);
|
|
217
|
+
emitDiagnosticEvent({
|
|
218
|
+
type: "session.stuck",
|
|
219
|
+
sessionId: state.sessionId,
|
|
220
|
+
sessionKey: state.sessionKey,
|
|
221
|
+
state: params.state,
|
|
222
|
+
ageMs: params.ageMs,
|
|
223
|
+
queueDepth: state.queueDepth
|
|
224
|
+
});
|
|
225
|
+
markActivity();
|
|
226
|
+
}
|
|
227
|
+
function logLaneEnqueue(lane, queueSize) {
|
|
228
|
+
diag.debug(`lane enqueue: lane=${lane} queueSize=${queueSize}`);
|
|
229
|
+
emitDiagnosticEvent({
|
|
230
|
+
type: "queue.lane.enqueue",
|
|
231
|
+
lane,
|
|
232
|
+
queueSize
|
|
233
|
+
});
|
|
234
|
+
markActivity();
|
|
235
|
+
}
|
|
236
|
+
function logLaneDequeue(lane, waitMs, queueSize) {
|
|
237
|
+
diag.debug(`lane dequeue: lane=${lane} waitMs=${waitMs} queueSize=${queueSize}`);
|
|
238
|
+
emitDiagnosticEvent({
|
|
239
|
+
type: "queue.lane.dequeue",
|
|
240
|
+
lane,
|
|
241
|
+
queueSize,
|
|
242
|
+
waitMs
|
|
243
|
+
});
|
|
244
|
+
markActivity();
|
|
245
|
+
}
|
|
246
|
+
function logToolLoopAction(params) {
|
|
247
|
+
const payload = `tool loop: sessionId=${params.sessionId ?? "unknown"} sessionKey=${params.sessionKey ?? "unknown"} tool=${params.toolName} level=${params.level} action=${params.action} detector=${params.detector} count=${params.count}${params.pairedToolName ? ` pairedTool=${params.pairedToolName}` : ""} message="${params.message}"`;
|
|
248
|
+
if (params.level === "critical") diag.error(payload);
|
|
249
|
+
else diag.warn(payload);
|
|
250
|
+
emitDiagnosticEvent({
|
|
251
|
+
type: "tool.loop",
|
|
252
|
+
sessionId: params.sessionId,
|
|
253
|
+
sessionKey: params.sessionKey,
|
|
254
|
+
toolName: params.toolName,
|
|
255
|
+
level: params.level,
|
|
256
|
+
action: params.action,
|
|
257
|
+
detector: params.detector,
|
|
258
|
+
count: params.count,
|
|
259
|
+
message: params.message,
|
|
260
|
+
pairedToolName: params.pairedToolName
|
|
261
|
+
});
|
|
262
|
+
markActivity();
|
|
263
|
+
}
|
|
264
|
+
let heartbeatInterval = null;
|
|
265
|
+
function startDiagnosticHeartbeat(config) {
|
|
266
|
+
if (heartbeatInterval) return;
|
|
267
|
+
heartbeatInterval = setInterval(() => {
|
|
268
|
+
let heartbeatConfig = config;
|
|
269
|
+
if (!heartbeatConfig) try {
|
|
270
|
+
heartbeatConfig = loadConfig();
|
|
271
|
+
} catch {
|
|
272
|
+
heartbeatConfig = void 0;
|
|
273
|
+
}
|
|
274
|
+
const stuckSessionWarnMs = resolveStuckSessionWarnMs(heartbeatConfig);
|
|
275
|
+
const now = Date.now();
|
|
276
|
+
pruneDiagnosticSessionStates(now, true);
|
|
277
|
+
const activeCount = Array.from(diagnosticSessionStates.values()).filter((s) => s.state === "processing").length;
|
|
278
|
+
const waitingCount = Array.from(diagnosticSessionStates.values()).filter((s) => s.state === "waiting").length;
|
|
279
|
+
const totalQueued = Array.from(diagnosticSessionStates.values()).reduce((sum, s) => sum + s.queueDepth, 0);
|
|
280
|
+
if (!(lastActivityAt > 0 || webhookStats.received > 0 || activeCount > 0 || waitingCount > 0 || totalQueued > 0)) return;
|
|
281
|
+
if (now - lastActivityAt > 12e4 && activeCount === 0 && waitingCount === 0) return;
|
|
282
|
+
diag.debug(`heartbeat: webhooks=${webhookStats.received}/${webhookStats.processed}/${webhookStats.errors} active=${activeCount} waiting=${waitingCount} queued=${totalQueued}`);
|
|
283
|
+
emitDiagnosticEvent({
|
|
284
|
+
type: "diagnostic.heartbeat",
|
|
285
|
+
webhooks: {
|
|
286
|
+
received: webhookStats.received,
|
|
287
|
+
processed: webhookStats.processed,
|
|
288
|
+
errors: webhookStats.errors
|
|
289
|
+
},
|
|
290
|
+
active: activeCount,
|
|
291
|
+
waiting: waitingCount,
|
|
292
|
+
queued: totalQueued
|
|
293
|
+
});
|
|
294
|
+
loadCommandPollBackoffRuntime().then(({ pruneStaleCommandPolls }) => {
|
|
295
|
+
for (const [, state] of diagnosticSessionStates) pruneStaleCommandPolls(state);
|
|
296
|
+
}).catch((err) => {
|
|
297
|
+
diag.debug(`command-poll-backoff prune failed: ${String(err)}`);
|
|
298
|
+
});
|
|
299
|
+
for (const [, state] of diagnosticSessionStates) {
|
|
300
|
+
const ageMs = now - state.lastActivity;
|
|
301
|
+
if (state.state === "processing" && ageMs > stuckSessionWarnMs) logSessionStuck({
|
|
302
|
+
sessionId: state.sessionId,
|
|
303
|
+
sessionKey: state.sessionKey,
|
|
304
|
+
state: state.state,
|
|
305
|
+
ageMs
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
}, 3e4);
|
|
309
|
+
heartbeatInterval.unref?.();
|
|
310
|
+
}
|
|
311
|
+
function stopDiagnosticHeartbeat() {
|
|
312
|
+
if (heartbeatInterval) {
|
|
313
|
+
clearInterval(heartbeatInterval);
|
|
314
|
+
heartbeatInterval = null;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
//#endregion
|
|
319
|
+
export { logMessageQueued as a, logWebhookError as c, startDiagnosticHeartbeat as d, stopDiagnosticHeartbeat as f, onDiagnosticEvent as g, isDiagnosticsEnabled as h, logMessageProcessed as i, logWebhookProcessed as l, emitDiagnosticEvent as m, logLaneDequeue as n, logSessionStateChange as o, getDiagnosticSessionState as p, logLaneEnqueue as r, logToolLoopAction as s, diag as t, logWebhookReceived as u };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { t as redactSensitiveText } from "./redact-DjVX-1N3.js";
|
|
2
|
+
|
|
3
|
+
//#region src/infra/errors.ts
|
|
4
|
+
function extractErrorCode(err) {
|
|
5
|
+
if (!err || typeof err !== "object") return;
|
|
6
|
+
const code = err.code;
|
|
7
|
+
if (typeof code === "string") return code;
|
|
8
|
+
if (typeof code === "number") return String(code);
|
|
9
|
+
}
|
|
10
|
+
function readErrorName(err) {
|
|
11
|
+
if (!err || typeof err !== "object") return "";
|
|
12
|
+
const name = err.name;
|
|
13
|
+
return typeof name === "string" ? name : "";
|
|
14
|
+
}
|
|
15
|
+
function collectErrorGraphCandidates(err, resolveNested) {
|
|
16
|
+
const queue = [err];
|
|
17
|
+
const seen = /* @__PURE__ */ new Set();
|
|
18
|
+
const candidates = [];
|
|
19
|
+
while (queue.length > 0) {
|
|
20
|
+
const current = queue.shift();
|
|
21
|
+
if (current == null || seen.has(current)) continue;
|
|
22
|
+
seen.add(current);
|
|
23
|
+
candidates.push(current);
|
|
24
|
+
if (!current || typeof current !== "object" || !resolveNested) continue;
|
|
25
|
+
for (const nested of resolveNested(current)) if (nested != null && !seen.has(nested)) queue.push(nested);
|
|
26
|
+
}
|
|
27
|
+
return candidates;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Type guard for NodeJS.ErrnoException (any error with a `code` property).
|
|
31
|
+
*/
|
|
32
|
+
function isErrno(err) {
|
|
33
|
+
return Boolean(err && typeof err === "object" && "code" in err);
|
|
34
|
+
}
|
|
35
|
+
function formatErrorMessage(err) {
|
|
36
|
+
let formatted;
|
|
37
|
+
if (err instanceof Error) formatted = err.message || err.name || "Error";
|
|
38
|
+
else if (typeof err === "string") formatted = err;
|
|
39
|
+
else if (typeof err === "number" || typeof err === "boolean" || typeof err === "bigint") formatted = String(err);
|
|
40
|
+
else try {
|
|
41
|
+
formatted = JSON.stringify(err);
|
|
42
|
+
} catch {
|
|
43
|
+
formatted = Object.prototype.toString.call(err);
|
|
44
|
+
}
|
|
45
|
+
return redactSensitiveText(formatted);
|
|
46
|
+
}
|
|
47
|
+
function formatUncaughtError(err) {
|
|
48
|
+
if (extractErrorCode(err) === "INVALID_CONFIG") return formatErrorMessage(err);
|
|
49
|
+
if (err instanceof Error) return redactSensitiveText(err.stack ?? err.message ?? err.name);
|
|
50
|
+
return formatErrorMessage(err);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
//#endregion
|
|
54
|
+
export { isErrno as a, formatUncaughtError as i, extractErrorCode as n, readErrorName as o, formatErrorMessage as r, collectErrorGraphCandidates as t };
|