opensentinel 3.6.1 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/{agent-manager-7N7REQZQ.js → agent-manager-JZ4IM7XI.js} +8 -8
- package/dist/{agent-processor-I23VWQY3.js → agent-processor-DDDHC2SO.js} +22 -21
- package/dist/{agent-processor-I23VWQY3.js.map → agent-processor-DDDHC2SO.js.map} +1 -1
- package/dist/{alerting-4I37GG4U.js → alerting-LK7VVYTX.js} +4 -4
- package/dist/alerting-LK7VVYTX.js.map +1 -0
- package/dist/analyzer-OTWE3ARE.js +22 -0
- package/dist/{archiver-XLRIIXPY.js → archiver-FPGKRP6P.js} +16 -85
- package/dist/archiver-FPGKRP6P.js.map +1 -0
- package/dist/{audit-logger-AU3TMWKI.js → audit-logger-CI4WZQPD.js} +5 -5
- package/dist/bot-VDHBGUVI.js +47 -0
- package/dist/{brain-SLA474EU.js → brain-6QTXN4QP.js} +18 -17
- package/dist/{chunk-AR34B6XR.js → chunk-2I5QHYG6.js} +3 -3
- package/dist/chunk-2I5QHYG6.js.map +1 -0
- package/dist/chunk-3AWAWRWB.js +143 -0
- package/dist/chunk-3AWAWRWB.js.map +1 -0
- package/dist/{chunk-PUNIMPMY.js → chunk-4KIHDIXZ.js} +13 -2
- package/dist/chunk-4KIHDIXZ.js.map +1 -0
- package/dist/{chunk-GUKKW7JI.js → chunk-4WH6MFEW.js} +2 -2
- package/dist/chunk-4WH6MFEW.js.map +1 -0
- package/dist/{chunk-M7YLQHFP.js → chunk-56UJS2LA.js} +6 -6
- package/dist/{chunk-S4NJJS5C.js → chunk-5BTVJR7R.js} +3 -3
- package/dist/{chunk-HKOPRRDJ.js → chunk-5JJTLWOR.js} +3 -3
- package/dist/chunk-5JJTLWOR.js.map +1 -0
- package/dist/chunk-66SAOZPU.js +236 -0
- package/dist/chunk-66SAOZPU.js.map +1 -0
- package/dist/chunk-6HGMRR4J.js +113 -0
- package/dist/chunk-6HGMRR4J.js.map +1 -0
- package/dist/{chunk-BMOUYXLX.js → chunk-6ZNCY2GI.js} +5 -5
- package/dist/chunk-7BNFELEK.js +31 -0
- package/dist/chunk-7BNFELEK.js.map +1 -0
- package/dist/{chunk-KABG5PG3.js → chunk-BBN4VCNK.js} +4 -4
- package/dist/chunk-BBN4VCNK.js.map +1 -0
- package/dist/{chunk-4YJRBMMA.js → chunk-BNZHWAZC.js} +2 -2
- package/dist/{chunk-TAAZB5KN.js → chunk-CWT6CAE5.js} +2 -2
- package/dist/{chunk-UWUIJTT4.js → chunk-CZTMGHUC.js} +1 -1
- package/dist/chunk-CZTMGHUC.js.map +1 -0
- package/dist/chunk-DTISLIMB.js +89 -0
- package/dist/chunk-DTISLIMB.js.map +1 -0
- package/dist/{chunk-VKMFUIVA.js → chunk-GBVJTRXS.js} +2 -2
- package/dist/{chunk-MFK34XSY.js → chunk-GJETKBOY.js} +15 -15
- package/dist/chunk-GJETKBOY.js.map +1 -0
- package/dist/{chunk-HTF2GIQC.js → chunk-GW6V4D43.js} +2 -2
- package/dist/chunk-GW6V4D43.js.map +1 -0
- package/dist/{chunk-2RGPWU77.js → chunk-HJSEEFO3.js} +2 -2
- package/dist/{chunk-JOA5A3G3.js → chunk-HQZQFEAX.js} +5 -5
- package/dist/{chunk-45YXODSB.js → chunk-J4JW73TT.js} +2 -2
- package/dist/{chunk-KT7NLIXP.js → chunk-JHYYFPKX.js} +2 -2
- package/dist/{chunk-XMCVRVTF.js → chunk-P64EV4YY.js} +1 -1
- package/dist/chunk-P64EV4YY.js.map +1 -0
- package/dist/chunk-PBOCSGNL.js +84 -0
- package/dist/chunk-PBOCSGNL.js.map +1 -0
- package/dist/{chunk-H3BOLSTS.js → chunk-PD3CTDO6.js} +2 -2
- package/dist/{chunk-6UZPE35A.js → chunk-QPY3WRVM.js} +10 -87
- package/dist/chunk-QPY3WRVM.js.map +1 -0
- package/dist/{chunk-AD6YEH6U.js → chunk-S2EOIVF4.js} +590 -91
- package/dist/chunk-S2EOIVF4.js.map +1 -0
- package/dist/chunk-SDLOMKCW.js +213 -0
- package/dist/chunk-SDLOMKCW.js.map +1 -0
- package/dist/{chunk-7MZN73J2.js → chunk-TKBVW7ZJ.js} +4 -4
- package/dist/{chunk-A24GPVLY.js → chunk-V3OKHQUX.js} +5 -5
- package/dist/{chunk-NMSHVO5O.js → chunk-WMDVOWN6.js} +4 -4
- package/dist/{chunk-643M3AP5.js → chunk-WMFYI7XC.js} +7 -7
- package/dist/{chunk-6LTLIYAQ.js → chunk-YEDEAX6Y.js} +3 -3
- package/dist/{chunk-NYVBXUGD.js → chunk-ZIBRVA3Y.js} +60 -1
- package/dist/chunk-ZIBRVA3Y.js.map +1 -0
- package/dist/{chunk-6JY4HNUH.js → chunk-ZMML6T63.js} +361 -24
- package/dist/chunk-ZMML6T63.js.map +1 -0
- package/dist/{chunk-FFV2SXFD.js → chunk-ZVHG4KF2.js} +4 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/setup.js +1 -1
- package/dist/commands/start.js +2 -2
- package/dist/commands/status.js +1 -1
- package/dist/commands/stop.js +1 -1
- package/dist/commands/utils.js +1 -1
- package/dist/{cost-tracker-EMOIOYH7.js → cost-tracker-KZQSTSE2.js} +2 -2
- package/dist/{db-LRIOKQBO.js → db-I7MNG6CL.js} +10 -4
- package/dist/{discord-NKR3X4AV.js → discord-6UQHCN27.js} +24 -23
- package/dist/{documents-EYIYLZK2.js → documents-PFHSK7SZ.js} +19 -19
- package/dist/{email-EAQNULVD.js → email-6OIN4SYL.js} +22 -21
- package/dist/email-6OIN4SYL.js.map +1 -0
- package/dist/{enhanced-retrieval-OGHT6TS5.js → enhanced-retrieval-JWX2HWU4.js} +7 -6
- package/dist/{enhanced-retrieval-OGHT6TS5.js.map → enhanced-retrieval-JWX2HWU4.js.map} +1 -1
- package/dist/enrichment-pipeline-7FE5R5ZI.js +14 -0
- package/dist/{entity-resolution-4X4JU43O.js → entity-resolution-7Z6STVXX.js} +5 -5
- package/dist/{env-CHOFICED.js → env-GN5VHI43.js} +2 -2
- package/dist/{error-tracker-SVQSDQDW.js → error-tracker-64DEH3D7.js} +6 -6
- package/dist/{github-KGNILDWJ.js → github-DUWSXCNP.js} +4 -4
- package/dist/graph-client-NB475AK5.js +17 -0
- package/dist/{imessage-V2XNDDHT.js → imessage-DSGSGUZS.js} +19 -18
- package/dist/{inbox-summarizer-DKKRYXDR.js → inbox-summarizer-F2KAU72V.js} +19 -18
- package/dist/{incident-response-ZTIKUWEO.js → incident-response-E3UGMX5G.js} +5 -5
- package/dist/incident-response-E3UGMX5G.js.map +1 -0
- package/dist/{knowledge-base-J7PJ7MZ3.js → knowledge-base-5SMMOGQJ.js} +5 -5
- package/dist/lib.d.ts +21 -0
- package/dist/lib.js +64 -57
- package/dist/lib.js.map +1 -1
- package/dist/{matrix-XHTR53VQ.js → matrix-WYGEOZL5.js} +18 -17
- package/dist/{matrix-XHTR53VQ.js.map → matrix-WYGEOZL5.js.map} +1 -1
- package/dist/{mcp-3C2TN67D.js → mcp-DJ2QDA6A.js} +2 -2
- package/dist/{metrics-VJDWQWU7.js → metrics-BH3ZLGEV.js} +5 -5
- package/dist/{multi-user-S56GUD6L.js → multi-user-XAEMB244.js} +4 -4
- package/dist/oauth-UPJYFOVU.js +34 -0
- package/dist/{ocr-LGUIPKVZ.js → ocr-UONKTQU7.js} +4 -4
- package/dist/{presentations-HXTAMGHT.js → presentations-UOET2FVZ.js} +2 -2
- package/dist/{providers-H6YIC3MG.js → providers-2YQ6E3IF.js} +3 -3
- package/dist/{scheduler-CA5UNHZV.js → scheduler-6PLLAQI7.js} +21 -20
- package/dist/{schema-ALJ67YVG.js → schema-ETY7L2VA.js} +8 -2
- package/dist/sharepoint-V5P4Q62L.js +30 -0
- package/dist/{signal-X7IQJGRQ.js → signal-7D5EPGVL.js} +19 -18
- package/dist/{slack-P2LFUJUQ.js → slack-KSS6YK5Z.js} +23 -22
- package/dist/slack-KSS6YK5Z.js.map +1 -0
- package/dist/{sms-4VME2HUL.js → sms-CSUCC7HL.js} +3 -3
- package/dist/sms-CSUCC7HL.js.map +1 -0
- package/dist/{src-S5KX4YEV.js → src-GO7GGW7O.js} +48 -41
- package/dist/{src-S5KX4YEV.js.map → src-GO7GGW7O.js.map} +1 -1
- package/dist/token-store-SEWRX6RE.js +20 -0
- package/dist/token-store-SEWRX6RE.js.map +1 -0
- package/dist/{tools-FGPN522P.js → tools-PJZ6RI4P.js} +18 -17
- package/dist/tools-PJZ6RI4P.js.map +1 -0
- package/dist/{whatsapp-KRPQ4YUX.js → whatsapp-DWXK25V2.js} +19 -18
- package/dist/whatsapp-DWXK25V2.js.map +1 -0
- package/dist/{word-document-D6N2C47N.js → word-document-AV3YB4L2.js} +2 -2
- package/dist/{workflow-store-ZYAYE5P6.js → workflow-store-5Y56GUP7.js} +4 -4
- package/drizzle/0002_mushy_master_mold.sql +139 -139
- package/drizzle/0003_overjoyed_rhodey.sql +46 -0
- package/drizzle/meta/0002_snapshot.json +3636 -3636
- package/drizzle/meta/0003_snapshot.json +3946 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +110 -110
- package/dist/alerting-4I37GG4U.js.map +0 -1
- package/dist/archiver-XLRIIXPY.js.map +0 -1
- package/dist/bot-MU2TJQ3Y.js +0 -46
- package/dist/chunk-6JY4HNUH.js.map +0 -1
- package/dist/chunk-6UZPE35A.js.map +0 -1
- package/dist/chunk-AD6YEH6U.js.map +0 -1
- package/dist/chunk-AR34B6XR.js.map +0 -1
- package/dist/chunk-GUKKW7JI.js.map +0 -1
- package/dist/chunk-HKOPRRDJ.js.map +0 -1
- package/dist/chunk-HTF2GIQC.js.map +0 -1
- package/dist/chunk-KABG5PG3.js.map +0 -1
- package/dist/chunk-MFK34XSY.js.map +0 -1
- package/dist/chunk-NYVBXUGD.js.map +0 -1
- package/dist/chunk-PUNIMPMY.js.map +0 -1
- package/dist/chunk-UWUIJTT4.js.map +0 -1
- package/dist/chunk-XMCVRVTF.js.map +0 -1
- package/dist/email-EAQNULVD.js.map +0 -1
- package/dist/enrichment-pipeline-CMUVBDC7.js +0 -14
- package/dist/incident-response-ZTIKUWEO.js.map +0 -1
- /package/dist/{agent-manager-7N7REQZQ.js.map → agent-manager-JZ4IM7XI.js.map} +0 -0
- /package/dist/{audit-logger-AU3TMWKI.js.map → analyzer-OTWE3ARE.js.map} +0 -0
- /package/dist/{bot-MU2TJQ3Y.js.map → audit-logger-CI4WZQPD.js.map} +0 -0
- /package/dist/{brain-SLA474EU.js.map → bot-VDHBGUVI.js.map} +0 -0
- /package/dist/{cost-tracker-EMOIOYH7.js.map → brain-6QTXN4QP.js.map} +0 -0
- /package/dist/{chunk-M7YLQHFP.js.map → chunk-56UJS2LA.js.map} +0 -0
- /package/dist/{chunk-S4NJJS5C.js.map → chunk-5BTVJR7R.js.map} +0 -0
- /package/dist/{chunk-BMOUYXLX.js.map → chunk-6ZNCY2GI.js.map} +0 -0
- /package/dist/{chunk-4YJRBMMA.js.map → chunk-BNZHWAZC.js.map} +0 -0
- /package/dist/{chunk-TAAZB5KN.js.map → chunk-CWT6CAE5.js.map} +0 -0
- /package/dist/{chunk-VKMFUIVA.js.map → chunk-GBVJTRXS.js.map} +0 -0
- /package/dist/{chunk-2RGPWU77.js.map → chunk-HJSEEFO3.js.map} +0 -0
- /package/dist/{chunk-JOA5A3G3.js.map → chunk-HQZQFEAX.js.map} +0 -0
- /package/dist/{chunk-45YXODSB.js.map → chunk-J4JW73TT.js.map} +0 -0
- /package/dist/{chunk-KT7NLIXP.js.map → chunk-JHYYFPKX.js.map} +0 -0
- /package/dist/{chunk-H3BOLSTS.js.map → chunk-PD3CTDO6.js.map} +0 -0
- /package/dist/{chunk-7MZN73J2.js.map → chunk-TKBVW7ZJ.js.map} +0 -0
- /package/dist/{chunk-A24GPVLY.js.map → chunk-V3OKHQUX.js.map} +0 -0
- /package/dist/{chunk-NMSHVO5O.js.map → chunk-WMDVOWN6.js.map} +0 -0
- /package/dist/{chunk-643M3AP5.js.map → chunk-WMFYI7XC.js.map} +0 -0
- /package/dist/{chunk-6LTLIYAQ.js.map → chunk-YEDEAX6Y.js.map} +0 -0
- /package/dist/{chunk-FFV2SXFD.js.map → chunk-ZVHG4KF2.js.map} +0 -0
- /package/dist/{db-LRIOKQBO.js.map → cost-tracker-KZQSTSE2.js.map} +0 -0
- /package/dist/{discord-NKR3X4AV.js.map → db-I7MNG6CL.js.map} +0 -0
- /package/dist/{enrichment-pipeline-CMUVBDC7.js.map → discord-6UQHCN27.js.map} +0 -0
- /package/dist/{documents-EYIYLZK2.js.map → documents-PFHSK7SZ.js.map} +0 -0
- /package/dist/{entity-resolution-4X4JU43O.js.map → enrichment-pipeline-7FE5R5ZI.js.map} +0 -0
- /package/dist/{env-CHOFICED.js.map → entity-resolution-7Z6STVXX.js.map} +0 -0
- /package/dist/{error-tracker-SVQSDQDW.js.map → env-GN5VHI43.js.map} +0 -0
- /package/dist/{imessage-V2XNDDHT.js.map → error-tracker-64DEH3D7.js.map} +0 -0
- /package/dist/{github-KGNILDWJ.js.map → github-DUWSXCNP.js.map} +0 -0
- /package/dist/{inbox-summarizer-DKKRYXDR.js.map → graph-client-NB475AK5.js.map} +0 -0
- /package/dist/{knowledge-base-J7PJ7MZ3.js.map → imessage-DSGSGUZS.js.map} +0 -0
- /package/dist/{mcp-3C2TN67D.js.map → inbox-summarizer-F2KAU72V.js.map} +0 -0
- /package/dist/{metrics-VJDWQWU7.js.map → knowledge-base-5SMMOGQJ.js.map} +0 -0
- /package/dist/{ocr-LGUIPKVZ.js.map → mcp-DJ2QDA6A.js.map} +0 -0
- /package/dist/{providers-H6YIC3MG.js.map → metrics-BH3ZLGEV.js.map} +0 -0
- /package/dist/{multi-user-S56GUD6L.js.map → multi-user-XAEMB244.js.map} +0 -0
- /package/dist/{scheduler-CA5UNHZV.js.map → oauth-UPJYFOVU.js.map} +0 -0
- /package/dist/{schema-ALJ67YVG.js.map → ocr-UONKTQU7.js.map} +0 -0
- /package/dist/{presentations-HXTAMGHT.js.map → presentations-UOET2FVZ.js.map} +0 -0
- /package/dist/{signal-X7IQJGRQ.js.map → providers-2YQ6E3IF.js.map} +0 -0
- /package/dist/{slack-P2LFUJUQ.js.map → scheduler-6PLLAQI7.js.map} +0 -0
- /package/dist/{sms-4VME2HUL.js.map → schema-ETY7L2VA.js.map} +0 -0
- /package/dist/{tools-FGPN522P.js.map → sharepoint-V5P4Q62L.js.map} +0 -0
- /package/dist/{whatsapp-KRPQ4YUX.js.map → signal-7D5EPGVL.js.map} +0 -0
- /package/dist/{word-document-D6N2C47N.js.map → word-document-AV3YB4L2.js.map} +0 -0
- /package/dist/{workflow-store-ZYAYE5P6.js.map → workflow-store-5Y56GUP7.js.map} +0 -0
package/README.md
CHANGED
|
@@ -14,6 +14,17 @@
|
|
|
14
14
|
**Website**: [opensentinel.ai](https://opensentinel.ai) | **Docs**: [docs.opensentinel.ai](https://docs.opensentinel.ai) | **Dashboard**: [app.opensentinel.ai](https://app.opensentinel.ai)
|
|
15
15
|
|
|
16
16
|
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Recent Updates (2026-04-10)
|
|
20
|
+
|
|
21
|
+
- All HTTP endpoints returning 200 OK
|
|
22
|
+
- SSL certificates renewed (~90 day validity)
|
|
23
|
+
- Login screens locked down (social buttons hidden, password eye toggle present)
|
|
24
|
+
- CI/CD pipeline verified working with GitHub Secrets
|
|
25
|
+
- No exposed API keys found in code
|
|
26
|
+
- Removed stray `${SNIPPET}` template variable from the landing page (was rendering literally in production)
|
|
27
|
+
|
|
17
28
|
---
|
|
18
29
|
|
|
19
30
|
## Table of Contents
|
|
@@ -154,6 +165,7 @@ Unlike chat-only interfaces, OpenSentinel is a **full-stack AI platform** with 1
|
|
|
154
165
|
|
|
155
166
|
### Integrations
|
|
156
167
|
- **Email**: IMAP/SMTP with AI inbox summarization + web email client (read, compose, attachments)
|
|
168
|
+
- **Microsoft 365 / Entra ID**: Graph-backed mail + SharePoint read/analysis + Claude-powered phishing/BEC + PII / policy analysis, OAuth with PKCE, encrypted token storage, chat-callable tools — see [`docs/M365_FEATURES.md`](docs/M365_FEATURES.md), [`docs/M365_INTEGRATION.md`](docs/M365_INTEGRATION.md), [`docs/M365_SHAREPOINT.md`](docs/M365_SHAREPOINT.md)
|
|
157
169
|
- **SMS/Phone**: Twilio for calls and texts
|
|
158
170
|
- **GitHub**: Repos, issues, PRs, AI code review
|
|
159
171
|
- **Notion**: Pages, databases, search, sync
|
|
@@ -12,14 +12,14 @@ import {
|
|
|
12
12
|
spawnAgent,
|
|
13
13
|
updateAgentStatus,
|
|
14
14
|
updateAgentTokens
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-WMFYI7XC.js";
|
|
16
|
+
import "./chunk-YEDEAX6Y.js";
|
|
17
|
+
import "./chunk-6ZNCY2GI.js";
|
|
18
18
|
import "./chunk-WZAH34TG.js";
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-BBN4VCNK.js";
|
|
20
|
+
import "./chunk-5BTVJR7R.js";
|
|
21
|
+
import "./chunk-4KIHDIXZ.js";
|
|
22
|
+
import "./chunk-ZIBRVA3Y.js";
|
|
23
23
|
import "./chunk-UP2VWCW5.js";
|
|
24
24
|
export {
|
|
25
25
|
addAgentMessage,
|
|
@@ -36,4 +36,4 @@ export {
|
|
|
36
36
|
updateAgentStatus,
|
|
37
37
|
updateAgentTokens
|
|
38
38
|
};
|
|
39
|
-
//# sourceMappingURL=agent-manager-
|
|
39
|
+
//# sourceMappingURL=agent-manager-JZ4IM7XI.js.map
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
AGENT_SYSTEM_PROMPTS,
|
|
3
|
-
AGENT_TOOL_PERMISSIONS
|
|
4
|
-
} from "./chunk-LFDXEYYB.js";
|
|
5
1
|
import {
|
|
6
2
|
TOOLS,
|
|
7
3
|
executeTool
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-ZMML6T63.js";
|
|
5
|
+
import "./chunk-5JJTLWOR.js";
|
|
6
|
+
import "./chunk-QPY3WRVM.js";
|
|
11
7
|
import "./chunk-ADTDYJO7.js";
|
|
8
|
+
import {
|
|
9
|
+
AGENT_SYSTEM_PROMPTS,
|
|
10
|
+
AGENT_TOOL_PERMISSIONS
|
|
11
|
+
} from "./chunk-LFDXEYYB.js";
|
|
12
|
+
import "./chunk-DTISLIMB.js";
|
|
12
13
|
import "./chunk-CUPEENUY.js";
|
|
13
14
|
import "./chunk-2WTKTG2C.js";
|
|
14
15
|
import "./chunk-U2X2J3FI.js";
|
|
@@ -16,7 +17,7 @@ import "./chunk-X6Q3K3L2.js";
|
|
|
16
17
|
import "./chunk-ODCFS5WD.js";
|
|
17
18
|
import "./chunk-KM22GV7G.js";
|
|
18
19
|
import "./chunk-P6QINGFL.js";
|
|
19
|
-
import "./chunk-
|
|
20
|
+
import "./chunk-HJSEEFO3.js";
|
|
20
21
|
import "./chunk-C6PELIHS.js";
|
|
21
22
|
import "./chunk-7WQO5J2M.js";
|
|
22
23
|
import {
|
|
@@ -25,32 +26,32 @@ import {
|
|
|
25
26
|
shouldAgentStop,
|
|
26
27
|
updateAgentStatus,
|
|
27
28
|
updateAgentTokens
|
|
28
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-WMFYI7XC.js";
|
|
29
30
|
import {
|
|
30
31
|
metric
|
|
31
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-YEDEAX6Y.js";
|
|
32
33
|
import {
|
|
33
34
|
MODEL_TIERS
|
|
34
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-6ZNCY2GI.js";
|
|
35
36
|
import "./chunk-WZAH34TG.js";
|
|
36
37
|
import "./chunk-6KONMXQ6.js";
|
|
37
38
|
import "./chunk-22VGGA7S.js";
|
|
38
39
|
import "./chunk-HN3F4WSW.js";
|
|
39
|
-
import "./chunk-
|
|
40
|
-
import "./chunk-
|
|
41
|
-
import "./chunk-
|
|
42
|
-
import "./chunk-
|
|
40
|
+
import "./chunk-V3OKHQUX.js";
|
|
41
|
+
import "./chunk-2I5QHYG6.js";
|
|
42
|
+
import "./chunk-CZTMGHUC.js";
|
|
43
|
+
import "./chunk-4WH6MFEW.js";
|
|
43
44
|
import {
|
|
44
45
|
providerRegistry
|
|
45
|
-
} from "./chunk-
|
|
46
|
+
} from "./chunk-GW6V4D43.js";
|
|
46
47
|
import "./chunk-DOYGMNMK.js";
|
|
47
48
|
import "./chunk-CQ4JURG7.js";
|
|
48
|
-
import "./chunk-
|
|
49
|
-
import "./chunk-
|
|
49
|
+
import "./chunk-BBN4VCNK.js";
|
|
50
|
+
import "./chunk-5BTVJR7R.js";
|
|
50
51
|
import {
|
|
51
52
|
env
|
|
52
|
-
} from "./chunk-
|
|
53
|
-
import "./chunk-
|
|
53
|
+
} from "./chunk-4KIHDIXZ.js";
|
|
54
|
+
import "./chunk-ZIBRVA3Y.js";
|
|
54
55
|
import "./chunk-35WYTA3C.js";
|
|
55
56
|
import "./chunk-UP2VWCW5.js";
|
|
56
57
|
|
|
@@ -277,4 +278,4 @@ export {
|
|
|
277
278
|
startAgentProcessor,
|
|
278
279
|
stopAgentProcessor
|
|
279
280
|
};
|
|
280
|
-
//# sourceMappingURL=agent-processor-
|
|
281
|
+
//# sourceMappingURL=agent-processor-DDDHC2SO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/agents/agent-processor.ts"],"sourcesContent":["// ============================================\r\n// Agent Processor — BullMQ Worker for Sub-Agent Execution\r\n// ============================================\r\n// Consumes jobs from the \"sentinel-agents\" queue and actually executes\r\n// sub-agent tasks. Each agent runs a focused LLM conversation loop\r\n// with an agent-type-specific system prompt and limited tool set.\r\n\r\nimport { Worker, Job } from \"bullmq\";\r\nimport Redis from \"ioredis\";\r\nimport { env } from \"../../config/env\";\r\nimport { providerRegistry } from \"../providers\";\r\nimport { MODEL_TIERS } from \"../brain/router\";\r\nimport { TOOLS, executeTool } from \"../../tools\";\r\nimport {\r\n AGENT_SYSTEM_PROMPTS,\r\n AGENT_TOOL_PERMISSIONS,\r\n type AgentType,\r\n type AgentResult,\r\n} from \"./agent-types\";\r\nimport {\r\n updateAgentStatus,\r\n addAgentMessage,\r\n addAgentProgress,\r\n updateAgentTokens,\r\n shouldAgentStop,\r\n} from \"./agent-manager\";\r\nimport { audit } from \"../security/audit-logger\";\r\nimport { metric } from \"../observability/metrics\";\r\nimport type { LLMTool, LLMMessage, LLMContentBlock } from \"../providers/types\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface AgentJobData {\r\n agentId: string;\r\n userId: string;\r\n type: AgentType;\r\n objective: string;\r\n context: Record<string, unknown> | undefined;\r\n tokenBudget: number;\r\n timeBudgetMs: number;\r\n}\r\n\r\ninterface AgentExecutionState {\r\n agentId: string;\r\n step: number;\r\n totalInputTokens: number;\r\n totalOutputTokens: number;\r\n startTime: number;\r\n messages: LLMMessage[];\r\n}\r\n\r\n// ============================================\r\n// Worker State\r\n// ============================================\r\n\r\nlet worker: Worker | null = null;\r\n\r\n// ============================================\r\n// Tool Filtering\r\n// ============================================\r\n\r\n/**\r\n * Filter the global tool list to only tools allowed for this agent type.\r\n */\r\nexport function getAgentTools(\r\n agentType: AgentType,\r\n allTools: LLMTool[] = TOOLS as LLMTool[]\r\n): LLMTool[] {\r\n const allowedNames = new Set(AGENT_TOOL_PERMISSIONS[agentType] || []);\r\n return allTools.filter((tool) => allowedNames.has(tool.name));\r\n}\r\n\r\n// ============================================\r\n// Agent Job Processor\r\n// ============================================\r\n\r\n/**\r\n * Process a single agent job.\r\n * Runs a focused LLM conversation loop with:\r\n * - Agent-type-specific system prompt\r\n * - Limited tool set (from AGENT_TOOL_PERMISSIONS)\r\n * - Budget enforcement (token + time)\r\n * - Progress tracking via agentProgress table\r\n */\r\nasync function processAgentJob(job: Job<AgentJobData>): Promise<void> {\r\n const { agentId, userId, type, objective, context, tokenBudget, timeBudgetMs } = job.data;\r\n\r\n console.log(`[AgentProcessor] Starting agent ${agentId} (type: ${type})`);\r\n\r\n // Mark as running\r\n await updateAgentStatus(agentId, \"running\");\r\n\r\n const startTime = Date.now();\r\n\r\n // Build system prompt\r\n const systemPrompt = AGENT_SYSTEM_PROMPTS[type] || AGENT_SYSTEM_PROMPTS.research;\r\n\r\n // Get filtered tools\r\n const tools = getAgentTools(type);\r\n\r\n // Initialize conversation with objective\r\n let contextStr = \"\";\r\n if (context && Object.keys(context).length > 0) {\r\n contextStr = `\\n\\nContext provided:\\n${JSON.stringify(context, null, 2)}`;\r\n }\r\n\r\n const state: AgentExecutionState = {\r\n agentId,\r\n step: 0,\r\n totalInputTokens: 0,\r\n totalOutputTokens: 0,\r\n startTime,\r\n messages: [\r\n {\r\n role: \"user\",\r\n content: `Objective: ${objective}${contextStr}\\n\\nPlease begin working on this objective. Report your progress at each step.`,\r\n },\r\n ],\r\n };\r\n\r\n // Store initial message\r\n await addAgentMessage(agentId, {\r\n role: \"user\",\r\n content: state.messages[0].content as string,\r\n });\r\n\r\n const maxTurns = env.AGENT_MAX_TURNS ?? 20;\r\n const model = MODEL_TIERS.balanced.model;\r\n\r\n try {\r\n for (let turn = 0; turn < maxTurns; turn++) {\r\n // Check if agent should stop (cancellation, budget exceeded)\r\n const stopCheck = await shouldAgentStop(agentId);\r\n if (stopCheck.stop) {\r\n console.log(`[AgentProcessor] Agent ${agentId} stopped: ${stopCheck.reason}`);\r\n\r\n const result: AgentResult = {\r\n success: false,\r\n error: stopCheck.reason,\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, stopCheck.reason?.includes(\"cancel\") ? \"cancelled\" : \"failed\", result);\r\n return;\r\n }\r\n\r\n // Check time budget\r\n if (Date.now() - startTime >= timeBudgetMs) {\r\n const result: AgentResult = {\r\n success: false,\r\n error: \"Time budget exceeded\",\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, \"failed\", result);\r\n return;\r\n }\r\n\r\n // Make LLM call\r\n const provider = providerRegistry.getDefault();\r\n const response = await provider.createMessage({\r\n model,\r\n max_tokens: 4096,\r\n system: systemPrompt,\r\n tools: tools.length > 0 ? tools : undefined,\r\n messages: state.messages,\r\n });\r\n\r\n state.totalInputTokens += response.usage.input_tokens;\r\n state.totalOutputTokens += response.usage.output_tokens;\r\n\r\n // Update token count in DB\r\n await updateAgentTokens(agentId, state.totalInputTokens + state.totalOutputTokens);\r\n\r\n // Check token budget\r\n if (state.totalInputTokens + state.totalOutputTokens >= tokenBudget) {\r\n const textContent = response.content.find((c) => c.type === \"text\");\r\n const result: AgentResult = {\r\n success: true,\r\n summary: textContent?.text || \"Token budget reached\",\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, \"completed\", result);\r\n return;\r\n }\r\n\r\n // If end_turn, agent is done\r\n if (response.stop_reason === \"end_turn\" || response.stop_reason === \"stop\") {\r\n const textContent = response.content.find((c) => c.type === \"text\");\r\n const finalText = textContent?.text || \"\";\r\n\r\n // Store assistant response\r\n await addAgentMessage(agentId, {\r\n role: \"assistant\",\r\n content: finalText,\r\n });\r\n\r\n // Log progress\r\n state.step++;\r\n await addAgentProgress(agentId, state.step, \"Completed objective\", \"completed\", {\r\n summary: finalText.slice(0, 500),\r\n });\r\n\r\n // Mark completed\r\n const result: AgentResult = {\r\n success: true,\r\n summary: finalText,\r\n output: finalText,\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, \"completed\", result);\r\n console.log(`[AgentProcessor] Agent ${agentId} completed in ${turn + 1} turns`);\r\n return;\r\n }\r\n\r\n // Handle tool use\r\n if (response.stop_reason === \"tool_use\") {\r\n const toolUseBlocks = response.content.filter((block) => block.type === \"tool_use\");\r\n const toolResults: LLMContentBlock[] = [];\r\n\r\n for (const toolUse of toolUseBlocks) {\r\n if (toolUse.type === \"tool_use\") {\r\n const toolInput = { ...(toolUse.input as Record<string, unknown>) };\r\n delete toolInput._callerContext;\r\n\r\n state.step++;\r\n await addAgentProgress(agentId, state.step, `Executing tool: ${toolUse.name}`, \"running\");\r\n\r\n console.log(`[AgentProcessor] Agent ${agentId} using tool: ${toolUse.name}`);\r\n const toolStartTime = Date.now();\r\n\r\n try {\r\n const result = await executeTool(toolUse.name!, toolInput);\r\n const toolDuration = Date.now() - toolStartTime;\r\n\r\n // Log tool usage\r\n metric.toolDuration(toolUse.name!, toolDuration, result.success);\r\n\r\n toolResults.push({\r\n type: \"tool_result\",\r\n tool_use_id: toolUse.id,\r\n content: JSON.stringify(result),\r\n });\r\n\r\n await addAgentProgress(agentId, state.step, `Tool ${toolUse.name}: ${result.success ? \"success\" : \"failed\"}`, result.success ? \"completed\" : \"failed\");\r\n } catch (err) {\r\n const toolDuration = Date.now() - toolStartTime;\r\n metric.toolDuration(toolUse.name!, toolDuration, false);\r\n\r\n toolResults.push({\r\n type: \"tool_result\",\r\n tool_use_id: toolUse.id,\r\n content: JSON.stringify({ success: false, error: String(err) }),\r\n });\r\n\r\n await addAgentProgress(agentId, state.step, `Tool ${toolUse.name} error: ${err}`, \"failed\");\r\n }\r\n }\r\n }\r\n\r\n // Add assistant response and tool results to conversation\r\n state.messages.push({\r\n role: \"assistant\",\r\n content: response.content,\r\n });\r\n\r\n state.messages.push({\r\n role: \"user\",\r\n content: toolResults,\r\n });\r\n\r\n // Store text portion of assistant message\r\n const textContent = response.content.find((c) => c.type === \"text\");\r\n if (textContent?.text) {\r\n await addAgentMessage(agentId, {\r\n role: \"assistant\",\r\n content: textContent.text,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Max turns reached\r\n const result: AgentResult = {\r\n success: true,\r\n summary: `Agent completed after reaching max turns (${maxTurns})`,\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, \"completed\", result);\r\n console.log(`[AgentProcessor] Agent ${agentId} reached max turns`);\r\n } catch (error) {\r\n console.error(`[AgentProcessor] Agent ${agentId} failed:`, error);\r\n\r\n const result: AgentResult = {\r\n success: false,\r\n error: String(error),\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, \"failed\", result);\r\n }\r\n}\r\n\r\n// ============================================\r\n// Worker Lifecycle\r\n// ============================================\r\n\r\n/**\r\n * Initialize the BullMQ worker that processes agent jobs.\r\n * Should be called once at application startup.\r\n */\r\nexport function startAgentProcessor(): void {\r\n if (worker) {\r\n console.log(\"[AgentProcessor] Worker already running\");\r\n return;\r\n }\r\n\r\n const concurrency = env.AGENT_PROCESSOR_CONCURRENCY ?? 1;\r\n\r\n const connection = new Redis(env.REDIS_URL, {\r\n maxRetriesPerRequest: null,\r\n });\r\n\r\n worker = new Worker<AgentJobData>(\r\n \"sentinel-agents\",\r\n async (job) => {\r\n await processAgentJob(job);\r\n },\r\n {\r\n connection,\r\n concurrency,\r\n }\r\n );\r\n\r\n worker.on(\"completed\", (job) => {\r\n console.log(`[AgentProcessor] Job ${job.id} completed for agent ${job.data.agentId}`);\r\n metric.agentOperation(\"complete\", job.data.type);\r\n });\r\n\r\n worker.on(\"failed\", (job, err) => {\r\n console.error(`[AgentProcessor] Job ${job?.id} failed:`, err.message);\r\n if (job) {\r\n metric.agentOperation(\"fail\", job.data.type);\r\n }\r\n });\r\n\r\n console.log(`[AgentProcessor] Worker started (concurrency: ${concurrency})`);\r\n}\r\n\r\n/**\r\n * Stop the agent processor worker gracefully.\r\n */\r\nexport async function stopAgentProcessor(): Promise<void> {\r\n if (worker) {\r\n await worker.close();\r\n worker = null;\r\n console.log(\"[AgentProcessor] Worker stopped\");\r\n }\r\n}\r\n"],"mappings":"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","names":["result"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/agents/agent-processor.ts"],"sourcesContent":["// ============================================\r\n// Agent Processor — BullMQ Worker for Sub-Agent Execution\r\n// ============================================\r\n// Consumes jobs from the \"sentinel-agents\" queue and actually executes\r\n// sub-agent tasks. Each agent runs a focused LLM conversation loop\r\n// with an agent-type-specific system prompt and limited tool set.\r\n\r\nimport { Worker, Job } from \"bullmq\";\r\nimport Redis from \"ioredis\";\r\nimport { env } from \"../../config/env\";\r\nimport { providerRegistry } from \"../providers\";\r\nimport { MODEL_TIERS } from \"../brain/router\";\r\nimport { TOOLS, executeTool } from \"../../tools\";\r\nimport {\r\n AGENT_SYSTEM_PROMPTS,\r\n AGENT_TOOL_PERMISSIONS,\r\n type AgentType,\r\n type AgentResult,\r\n} from \"./agent-types\";\r\nimport {\r\n updateAgentStatus,\r\n addAgentMessage,\r\n addAgentProgress,\r\n updateAgentTokens,\r\n shouldAgentStop,\r\n} from \"./agent-manager\";\r\nimport { audit } from \"../security/audit-logger\";\r\nimport { metric } from \"../observability/metrics\";\r\nimport type { LLMTool, LLMMessage, LLMContentBlock } from \"../providers/types\";\r\n\r\n// ============================================\r\n// Types\r\n// ============================================\r\n\r\nexport interface AgentJobData {\r\n agentId: string;\r\n userId: string;\r\n type: AgentType;\r\n objective: string;\r\n context: Record<string, unknown> | undefined;\r\n tokenBudget: number;\r\n timeBudgetMs: number;\r\n}\r\n\r\ninterface AgentExecutionState {\r\n agentId: string;\r\n step: number;\r\n totalInputTokens: number;\r\n totalOutputTokens: number;\r\n startTime: number;\r\n messages: LLMMessage[];\r\n}\r\n\r\n// ============================================\r\n// Worker State\r\n// ============================================\r\n\r\nlet worker: Worker | null = null;\r\n\r\n// ============================================\r\n// Tool Filtering\r\n// ============================================\r\n\r\n/**\r\n * Filter the global tool list to only tools allowed for this agent type.\r\n */\r\nexport function getAgentTools(\r\n agentType: AgentType,\r\n allTools: LLMTool[] = TOOLS as LLMTool[]\r\n): LLMTool[] {\r\n const allowedNames = new Set(AGENT_TOOL_PERMISSIONS[agentType] || []);\r\n return allTools.filter((tool) => allowedNames.has(tool.name));\r\n}\r\n\r\n// ============================================\r\n// Agent Job Processor\r\n// ============================================\r\n\r\n/**\r\n * Process a single agent job.\r\n * Runs a focused LLM conversation loop with:\r\n * - Agent-type-specific system prompt\r\n * - Limited tool set (from AGENT_TOOL_PERMISSIONS)\r\n * - Budget enforcement (token + time)\r\n * - Progress tracking via agentProgress table\r\n */\r\nasync function processAgentJob(job: Job<AgentJobData>): Promise<void> {\r\n const { agentId, userId, type, objective, context, tokenBudget, timeBudgetMs } = job.data;\r\n\r\n console.log(`[AgentProcessor] Starting agent ${agentId} (type: ${type})`);\r\n\r\n // Mark as running\r\n await updateAgentStatus(agentId, \"running\");\r\n\r\n const startTime = Date.now();\r\n\r\n // Build system prompt\r\n const systemPrompt = AGENT_SYSTEM_PROMPTS[type] || AGENT_SYSTEM_PROMPTS.research;\r\n\r\n // Get filtered tools\r\n const tools = getAgentTools(type);\r\n\r\n // Initialize conversation with objective\r\n let contextStr = \"\";\r\n if (context && Object.keys(context).length > 0) {\r\n contextStr = `\\n\\nContext provided:\\n${JSON.stringify(context, null, 2)}`;\r\n }\r\n\r\n const state: AgentExecutionState = {\r\n agentId,\r\n step: 0,\r\n totalInputTokens: 0,\r\n totalOutputTokens: 0,\r\n startTime,\r\n messages: [\r\n {\r\n role: \"user\",\r\n content: `Objective: ${objective}${contextStr}\\n\\nPlease begin working on this objective. Report your progress at each step.`,\r\n },\r\n ],\r\n };\r\n\r\n // Store initial message\r\n await addAgentMessage(agentId, {\r\n role: \"user\",\r\n content: state.messages[0].content as string,\r\n });\r\n\r\n const maxTurns = env.AGENT_MAX_TURNS ?? 20;\r\n const model = MODEL_TIERS.balanced.model;\r\n\r\n try {\r\n for (let turn = 0; turn < maxTurns; turn++) {\r\n // Check if agent should stop (cancellation, budget exceeded)\r\n const stopCheck = await shouldAgentStop(agentId);\r\n if (stopCheck.stop) {\r\n console.log(`[AgentProcessor] Agent ${agentId} stopped: ${stopCheck.reason}`);\r\n\r\n const result: AgentResult = {\r\n success: false,\r\n error: stopCheck.reason,\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, stopCheck.reason?.includes(\"cancel\") ? \"cancelled\" : \"failed\", result);\r\n return;\r\n }\r\n\r\n // Check time budget\r\n if (Date.now() - startTime >= timeBudgetMs) {\r\n const result: AgentResult = {\r\n success: false,\r\n error: \"Time budget exceeded\",\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, \"failed\", result);\r\n return;\r\n }\r\n\r\n // Make LLM call\r\n const provider = providerRegistry.getDefault();\r\n const response = await provider.createMessage({\r\n model,\r\n max_tokens: 4096,\r\n system: systemPrompt,\r\n tools: tools.length > 0 ? tools : undefined,\r\n messages: state.messages,\r\n });\r\n\r\n state.totalInputTokens += response.usage.input_tokens;\r\n state.totalOutputTokens += response.usage.output_tokens;\r\n\r\n // Update token count in DB\r\n await updateAgentTokens(agentId, state.totalInputTokens + state.totalOutputTokens);\r\n\r\n // Check token budget\r\n if (state.totalInputTokens + state.totalOutputTokens >= tokenBudget) {\r\n const textContent = response.content.find((c) => c.type === \"text\");\r\n const result: AgentResult = {\r\n success: true,\r\n summary: textContent?.text || \"Token budget reached\",\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, \"completed\", result);\r\n return;\r\n }\r\n\r\n // If end_turn, agent is done\r\n if (response.stop_reason === \"end_turn\" || response.stop_reason === \"stop\") {\r\n const textContent = response.content.find((c) => c.type === \"text\");\r\n const finalText = textContent?.text || \"\";\r\n\r\n // Store assistant response\r\n await addAgentMessage(agentId, {\r\n role: \"assistant\",\r\n content: finalText,\r\n });\r\n\r\n // Log progress\r\n state.step++;\r\n await addAgentProgress(agentId, state.step, \"Completed objective\", \"completed\", {\r\n summary: finalText.slice(0, 500),\r\n });\r\n\r\n // Mark completed\r\n const result: AgentResult = {\r\n success: true,\r\n summary: finalText,\r\n output: finalText,\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, \"completed\", result);\r\n console.log(`[AgentProcessor] Agent ${agentId} completed in ${turn + 1} turns`);\r\n return;\r\n }\r\n\r\n // Handle tool use\r\n if (response.stop_reason === \"tool_use\") {\r\n const toolUseBlocks = response.content.filter((block) => block.type === \"tool_use\");\r\n const toolResults: LLMContentBlock[] = [];\r\n\r\n for (const toolUse of toolUseBlocks) {\r\n if (toolUse.type === \"tool_use\") {\r\n const toolInput = { ...(toolUse.input as Record<string, unknown>) };\r\n delete toolInput._callerContext;\r\n\r\n state.step++;\r\n await addAgentProgress(agentId, state.step, `Executing tool: ${toolUse.name}`, \"running\");\r\n\r\n console.log(`[AgentProcessor] Agent ${agentId} using tool: ${toolUse.name}`);\r\n const toolStartTime = Date.now();\r\n\r\n try {\r\n const result = await executeTool(toolUse.name!, toolInput);\r\n const toolDuration = Date.now() - toolStartTime;\r\n\r\n // Log tool usage\r\n metric.toolDuration(toolUse.name!, toolDuration, result.success);\r\n\r\n toolResults.push({\r\n type: \"tool_result\",\r\n tool_use_id: toolUse.id,\r\n content: JSON.stringify(result),\r\n });\r\n\r\n await addAgentProgress(agentId, state.step, `Tool ${toolUse.name}: ${result.success ? \"success\" : \"failed\"}`, result.success ? \"completed\" : \"failed\");\r\n } catch (err) {\r\n const toolDuration = Date.now() - toolStartTime;\r\n metric.toolDuration(toolUse.name!, toolDuration, false);\r\n\r\n toolResults.push({\r\n type: \"tool_result\",\r\n tool_use_id: toolUse.id,\r\n content: JSON.stringify({ success: false, error: String(err) }),\r\n });\r\n\r\n await addAgentProgress(agentId, state.step, `Tool ${toolUse.name} error: ${err}`, \"failed\");\r\n }\r\n }\r\n }\r\n\r\n // Add assistant response and tool results to conversation\r\n state.messages.push({\r\n role: \"assistant\",\r\n content: response.content,\r\n });\r\n\r\n state.messages.push({\r\n role: \"user\",\r\n content: toolResults,\r\n });\r\n\r\n // Store text portion of assistant message\r\n const textContent = response.content.find((c) => c.type === \"text\");\r\n if (textContent?.text) {\r\n await addAgentMessage(agentId, {\r\n role: \"assistant\",\r\n content: textContent.text,\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Max turns reached\r\n const result: AgentResult = {\r\n success: true,\r\n summary: `Agent completed after reaching max turns (${maxTurns})`,\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, \"completed\", result);\r\n console.log(`[AgentProcessor] Agent ${agentId} reached max turns`);\r\n } catch (error) {\r\n console.error(`[AgentProcessor] Agent ${agentId} failed:`, error);\r\n\r\n const result: AgentResult = {\r\n success: false,\r\n error: String(error),\r\n tokensUsed: state.totalInputTokens + state.totalOutputTokens,\r\n durationMs: Date.now() - startTime,\r\n };\r\n\r\n await updateAgentStatus(agentId, \"failed\", result);\r\n }\r\n}\r\n\r\n// ============================================\r\n// Worker Lifecycle\r\n// ============================================\r\n\r\n/**\r\n * Initialize the BullMQ worker that processes agent jobs.\r\n * Should be called once at application startup.\r\n */\r\nexport function startAgentProcessor(): void {\r\n if (worker) {\r\n console.log(\"[AgentProcessor] Worker already running\");\r\n return;\r\n }\r\n\r\n const concurrency = env.AGENT_PROCESSOR_CONCURRENCY ?? 1;\r\n\r\n const connection = new Redis(env.REDIS_URL, {\r\n maxRetriesPerRequest: null,\r\n });\r\n\r\n worker = new Worker<AgentJobData>(\r\n \"sentinel-agents\",\r\n async (job) => {\r\n await processAgentJob(job);\r\n },\r\n {\r\n connection,\r\n concurrency,\r\n }\r\n );\r\n\r\n worker.on(\"completed\", (job) => {\r\n console.log(`[AgentProcessor] Job ${job.id} completed for agent ${job.data.agentId}`);\r\n metric.agentOperation(\"complete\", job.data.type);\r\n });\r\n\r\n worker.on(\"failed\", (job, err) => {\r\n console.error(`[AgentProcessor] Job ${job?.id} failed:`, err.message);\r\n if (job) {\r\n metric.agentOperation(\"fail\", job.data.type);\r\n }\r\n });\r\n\r\n console.log(`[AgentProcessor] Worker started (concurrency: ${concurrency})`);\r\n}\r\n\r\n/**\r\n * Stop the agent processor worker gracefully.\r\n */\r\nexport async function stopAgentProcessor(): Promise<void> {\r\n if (worker) {\r\n await worker.close();\r\n worker = null;\r\n console.log(\"[AgentProcessor] Worker stopped\");\r\n }\r\n}\r\n"],"mappings":"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","names":["result"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
db
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-5BTVJR7R.js";
|
|
4
|
+
import "./chunk-4KIHDIXZ.js";
|
|
5
5
|
import {
|
|
6
6
|
errorLogs,
|
|
7
7
|
metrics
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ZIBRVA3Y.js";
|
|
9
9
|
import "./chunk-UP2VWCW5.js";
|
|
10
10
|
|
|
11
11
|
// src/core/observability/alerting.ts
|
|
@@ -696,4 +696,4 @@ export {
|
|
|
696
696
|
setRuleEnabled,
|
|
697
697
|
startAlertingSystem
|
|
698
698
|
};
|
|
699
|
-
//# sourceMappingURL=alerting-
|
|
699
|
+
//# sourceMappingURL=alerting-LK7VVYTX.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/observability/alerting.ts"],"sourcesContent":["/**\r\n * Alerting System - Anomaly detection, cost alerts, error spikes, health monitoring\r\n *\r\n * Provides comprehensive alerting and monitoring for the OpenSentinel system,\r\n * including automatic anomaly detection, cost tracking, and health checks.\r\n */\r\n\r\nimport { db } from \"../../db\";\r\nimport { metrics, errorLogs, usageQuotas } from \"../../db/schema\";\r\nimport { eq, and, gte, lte, desc, sql } from \"drizzle-orm\";\r\nimport { EventEmitter } from \"events\";\r\n\r\n// Types\r\nexport interface Alert {\r\n id: string;\r\n type: AlertType;\r\n severity: AlertSeverity;\r\n title: string;\r\n message: string;\r\n source: string;\r\n timestamp: Date;\r\n metadata?: Record<string, unknown>;\r\n acknowledged: boolean;\r\n acknowledgedAt?: Date;\r\n acknowledgedBy?: string;\r\n resolved: boolean;\r\n resolvedAt?: Date;\r\n resolvedBy?: string;\r\n autoResolveTimeout?: number;\r\n}\r\n\r\nexport type AlertType =\r\n | \"anomaly\"\r\n | \"cost_threshold\"\r\n | \"error_spike\"\r\n | \"health_check\"\r\n | \"quota_warning\"\r\n | \"performance\"\r\n | \"security\"\r\n | \"system\";\r\n\r\nexport type AlertSeverity = \"info\" | \"warning\" | \"error\" | \"critical\";\r\n\r\nexport interface AlertRule {\r\n id: string;\r\n name: string;\r\n description: string;\r\n enabled: boolean;\r\n type: AlertType;\r\n condition: AlertCondition;\r\n severity: AlertSeverity;\r\n cooldownMinutes: number;\r\n channels: AlertChannel[];\r\n lastTriggered?: Date;\r\n triggerCount: number;\r\n}\r\n\r\nexport interface AlertCondition {\r\n metric?: string;\r\n operator: \"gt\" | \"lt\" | \"eq\" | \"gte\" | \"lte\" | \"anomaly\";\r\n threshold?: number;\r\n windowMinutes?: number;\r\n aggregation?: \"sum\" | \"avg\" | \"max\" | \"min\" | \"count\";\r\n customCheck?: () => Promise<boolean>;\r\n}\r\n\r\nexport type AlertChannel = \"console\" | \"telegram\" | \"webhook\" | \"email\" | \"database\";\r\n\r\nexport interface AlertChannelConfig {\r\n console: { enabled: boolean };\r\n telegram: { enabled: boolean; chatId?: string };\r\n webhook: { enabled: boolean; url?: string; headers?: Record<string, string> };\r\n email: { enabled: boolean; recipients?: string[] };\r\n database: { enabled: boolean };\r\n}\r\n\r\nexport interface HealthCheckResult {\r\n name: string;\r\n status: \"healthy\" | \"degraded\" | \"unhealthy\";\r\n message: string;\r\n latencyMs?: number;\r\n lastCheck: Date;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface CostMetrics {\r\n totalTokens: number;\r\n inputTokens: number;\r\n outputTokens: number;\r\n estimatedCost: number;\r\n period: \"hourly\" | \"daily\" | \"weekly\" | \"monthly\";\r\n startDate: Date;\r\n endDate: Date;\r\n breakdown: CostBreakdown[];\r\n}\r\n\r\nexport interface CostBreakdown {\r\n category: string;\r\n tokens: number;\r\n cost: number;\r\n percentage: number;\r\n}\r\n\r\nexport interface AnomalyDetection {\r\n metric: string;\r\n currentValue: number;\r\n expectedValue: number;\r\n deviation: number;\r\n deviationPercent: number;\r\n isAnomaly: boolean;\r\n confidence: number;\r\n timestamp: Date;\r\n}\r\n\r\n// Constants\r\n// Dynamic pricing — uses cost-tracker's MODEL_TIERS for accurate multi-model pricing.\r\n// These defaults are used as fallback (Sonnet pricing).\r\nimport { costTracker } from \"./cost-tracker\";\r\nconst TOKEN_COST_PER_MILLION_INPUT = 3.0; // Fallback: Claude Sonnet input\r\nconst TOKEN_COST_PER_MILLION_OUTPUT = 15.0; // Fallback: Claude Sonnet output\r\n\r\n// In-memory stores\r\nconst activeAlerts = new Map<string, Alert>();\r\nconst alertRules = new Map<string, AlertRule>();\r\nconst healthCheckResults = new Map<string, HealthCheckResult>();\r\nconst alertHistory: Alert[] = [];\r\n\r\n// Event emitter for alert notifications\r\nexport const alertEmitter = new EventEmitter();\r\n\r\n// Default channel configuration\r\nlet channelConfig: AlertChannelConfig = {\r\n console: { enabled: true },\r\n telegram: { enabled: false },\r\n webhook: { enabled: false },\r\n email: { enabled: false },\r\n database: { enabled: true },\r\n};\r\n\r\n/**\r\n * Load alert history from database on startup\r\n */\r\nlet historyLoaded = false;\r\nexport async function loadAlertHistoryFromDb(): Promise<void> {\r\n if (historyLoaded) return;\r\n try {\r\n const rows = await db\r\n .select()\r\n .from(errorLogs)\r\n .where(eq(errorLogs.source, \"alerting\"))\r\n .orderBy(desc(errorLogs.createdAt))\r\n .limit(500);\r\n\r\n for (const row of rows.reverse()) {\r\n // Parse the alert type and severity from stored fields\r\n const alertType = (row.errorType?.replace(\"Alert:\", \"\") || \"system\") as AlertType;\r\n const severity = (row.errorCode || \"info\") as AlertSeverity;\r\n const [title, ...msgParts] = (row.message || \"\").split(\": \");\r\n const alert: Alert = {\r\n id: String(row.id),\r\n type: alertType,\r\n severity,\r\n title: title || \"Alert\",\r\n message: msgParts.join(\": \") || row.message || \"\",\r\n source: \"alert_rule\",\r\n timestamp: new Date(row.createdAt),\r\n metadata: (row.context || {}) as Record<string, unknown>,\r\n acknowledged: false,\r\n resolved: true, // historical alerts are resolved\r\n };\r\n alertHistory.push(alert);\r\n }\r\n historyLoaded = true;\r\n if (alertHistory.length > 0) {\r\n console.log(`[Alerting] Loaded ${alertHistory.length} historical alerts from DB`);\r\n }\r\n } catch {\r\n // DB may not be available yet\r\n }\r\n}\r\n\r\n/**\r\n * Initialize default alert rules\r\n */\r\nexport function initializeDefaultRules(): void {\r\n // Error spike detection\r\n addAlertRule({\r\n id: \"error-spike\",\r\n name: \"Error Spike Detection\",\r\n description: \"Triggers when error rate exceeds normal levels\",\r\n enabled: true,\r\n type: \"error_spike\",\r\n condition: {\r\n metric: \"error_count\",\r\n operator: \"gt\",\r\n threshold: 10,\r\n windowMinutes: 5,\r\n aggregation: \"count\",\r\n },\r\n severity: \"error\",\r\n cooldownMinutes: 15,\r\n channels: [\"console\", \"database\"],\r\n triggerCount: 0,\r\n });\r\n\r\n // High latency detection\r\n addAlertRule({\r\n id: \"high-latency\",\r\n name: \"High Response Latency\",\r\n description: \"Triggers when average response time exceeds threshold\",\r\n enabled: true,\r\n type: \"performance\",\r\n condition: {\r\n metric: \"response_latency\",\r\n operator: \"gt\",\r\n threshold: 10000, // 10 seconds\r\n windowMinutes: 5,\r\n aggregation: \"avg\",\r\n },\r\n severity: \"warning\",\r\n cooldownMinutes: 10,\r\n channels: [\"console\", \"database\"],\r\n triggerCount: 0,\r\n });\r\n\r\n // Cost threshold\r\n addAlertRule({\r\n id: \"daily-cost-threshold\",\r\n name: \"Daily Cost Threshold\",\r\n description: \"Triggers when daily API costs exceed threshold\",\r\n enabled: true,\r\n type: \"cost_threshold\",\r\n condition: {\r\n metric: \"cost\",\r\n operator: \"gt\",\r\n threshold: 50, // $50\r\n windowMinutes: 1440, // 24 hours\r\n },\r\n severity: \"warning\",\r\n cooldownMinutes: 60,\r\n channels: [\"console\", \"database\"],\r\n triggerCount: 0,\r\n });\r\n\r\n // Memory usage anomaly\r\n addAlertRule({\r\n id: \"memory-anomaly\",\r\n name: \"Memory Usage Anomaly\",\r\n description: \"Triggers when memory usage is abnormally high\",\r\n enabled: true,\r\n type: \"anomaly\",\r\n condition: {\r\n metric: \"memory_usage\",\r\n operator: \"anomaly\",\r\n windowMinutes: 60,\r\n },\r\n severity: \"warning\",\r\n cooldownMinutes: 30,\r\n channels: [\"console\", \"database\"],\r\n triggerCount: 0,\r\n });\r\n\r\n // Quota warning\r\n addAlertRule({\r\n id: \"quota-80-percent\",\r\n name: \"80% Quota Usage\",\r\n description: \"Triggers when usage reaches 80% of quota\",\r\n enabled: true,\r\n type: \"quota_warning\",\r\n condition: {\r\n metric: \"quota_usage\",\r\n operator: \"gte\",\r\n threshold: 80,\r\n },\r\n severity: \"warning\",\r\n cooldownMinutes: 60,\r\n channels: [\"console\", \"database\"],\r\n triggerCount: 0,\r\n });\r\n\r\n // Tool failure rate\r\n addAlertRule({\r\n id: \"tool-failure-rate\",\r\n name: \"High Tool Failure Rate\",\r\n description: \"Triggers when tool failure rate is high\",\r\n enabled: true,\r\n type: \"performance\",\r\n condition: {\r\n metric: \"tool_failure\",\r\n operator: \"gt\",\r\n threshold: 5,\r\n windowMinutes: 10,\r\n aggregation: \"count\",\r\n },\r\n severity: \"warning\",\r\n cooldownMinutes: 15,\r\n channels: [\"console\", \"database\"],\r\n triggerCount: 0,\r\n });\r\n}\r\n\r\n/**\r\n * Add or update an alert rule\r\n */\r\nexport function addAlertRule(rule: AlertRule): void {\r\n alertRules.set(rule.id, rule);\r\n}\r\n\r\n/**\r\n * Remove an alert rule\r\n */\r\nexport function removeAlertRule(ruleId: string): boolean {\r\n return alertRules.delete(ruleId);\r\n}\r\n\r\n/**\r\n * Get all alert rules\r\n */\r\nexport function getAlertRules(): AlertRule[] {\r\n return Array.from(alertRules.values());\r\n}\r\n\r\n/**\r\n * Enable/disable an alert rule\r\n */\r\nexport function setRuleEnabled(ruleId: string, enabled: boolean): boolean {\r\n const rule = alertRules.get(ruleId);\r\n if (rule) {\r\n rule.enabled = enabled;\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Configure alert channels\r\n */\r\nexport function configureChannels(config: Partial<AlertChannelConfig>): void {\r\n channelConfig = { ...channelConfig, ...config };\r\n}\r\n\r\n/**\r\n * Create and dispatch an alert\r\n */\r\nexport async function createAlert(\r\n type: AlertType,\r\n severity: AlertSeverity,\r\n title: string,\r\n message: string,\r\n source: string,\r\n metadata?: Record<string, unknown>\r\n): Promise<Alert> {\r\n const alert: Alert = {\r\n id: crypto.randomUUID(),\r\n type,\r\n severity,\r\n title,\r\n message,\r\n source,\r\n timestamp: new Date(),\r\n metadata,\r\n acknowledged: false,\r\n resolved: false,\r\n };\r\n\r\n activeAlerts.set(alert.id, alert);\r\n alertHistory.push(alert);\r\n\r\n // Dispatch to configured channels\r\n await dispatchAlert(alert);\r\n\r\n // Emit event\r\n alertEmitter.emit(\"alert\", alert);\r\n\r\n return alert;\r\n}\r\n\r\n/**\r\n * Dispatch alert to configured channels\r\n */\r\nasync function dispatchAlert(alert: Alert): Promise<void> {\r\n const promises: Promise<void>[] = [];\r\n\r\n if (channelConfig.console.enabled) {\r\n promises.push(dispatchToConsole(alert));\r\n }\r\n\r\n if (channelConfig.database.enabled) {\r\n promises.push(dispatchToDatabase(alert));\r\n }\r\n\r\n if (channelConfig.webhook.enabled && channelConfig.webhook.url) {\r\n promises.push(dispatchToWebhook(alert, channelConfig.webhook.url, channelConfig.webhook.headers));\r\n }\r\n\r\n // Telegram and email would need additional implementation\r\n // if (channelConfig.telegram.enabled) { ... }\r\n // if (channelConfig.email.enabled) { ... }\r\n\r\n await Promise.allSettled(promises);\r\n}\r\n\r\n/**\r\n * Dispatch alert to console\r\n */\r\nasync function dispatchToConsole(alert: Alert): Promise<void> {\r\n const severityColors: Record<AlertSeverity, string> = {\r\n info: \"\\x1b[36m\", // Cyan\r\n warning: \"\\x1b[33m\", // Yellow\r\n error: \"\\x1b[31m\", // Red\r\n critical: \"\\x1b[35m\", // Magenta\r\n };\r\n const reset = \"\\x1b[0m\";\r\n const color = severityColors[alert.severity];\r\n\r\n console.log(`${color}[ALERT ${alert.severity.toUpperCase()}]${reset} ${alert.title}`);\r\n console.log(` Source: ${alert.source}`);\r\n console.log(` Message: ${alert.message}`);\r\n if (alert.metadata) {\r\n console.log(` Metadata: ${JSON.stringify(alert.metadata)}`);\r\n }\r\n}\r\n\r\n/**\r\n * Dispatch alert to database (via error logs for now)\r\n */\r\nasync function dispatchToDatabase(alert: Alert): Promise<void> {\r\n await db.insert(errorLogs).values({\r\n source: \"alerting\",\r\n errorType: `Alert:${alert.type}`,\r\n errorCode: alert.severity,\r\n message: `${alert.title}: ${alert.message}`,\r\n context: alert.metadata,\r\n });\r\n}\r\n\r\n/**\r\n * Dispatch alert to webhook\r\n */\r\nasync function dispatchToWebhook(\r\n alert: Alert,\r\n url: string,\r\n headers?: Record<string, string>\r\n): Promise<void> {\r\n try {\r\n await fetch(url, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...headers,\r\n },\r\n body: JSON.stringify(alert),\r\n });\r\n } catch (error) {\r\n console.error(\"[Alerting] Failed to dispatch to webhook:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Acknowledge an alert\r\n */\r\nexport function acknowledgeAlert(alertId: string, acknowledgedBy?: string): boolean {\r\n const alert = activeAlerts.get(alertId);\r\n if (alert) {\r\n alert.acknowledged = true;\r\n alert.acknowledgedAt = new Date();\r\n alert.acknowledgedBy = acknowledgedBy;\r\n alertEmitter.emit(\"alert:acknowledged\", alert);\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Resolve an alert\r\n */\r\nexport function resolveAlert(alertId: string, resolvedBy?: string): boolean {\r\n const alert = activeAlerts.get(alertId);\r\n if (alert) {\r\n alert.resolved = true;\r\n alert.resolvedAt = new Date();\r\n alert.resolvedBy = resolvedBy;\r\n activeAlerts.delete(alertId);\r\n alertEmitter.emit(\"alert:resolved\", alert);\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Get active alerts\r\n */\r\nexport function getActiveAlerts(type?: AlertType, severity?: AlertSeverity): Alert[] {\r\n let alerts = Array.from(activeAlerts.values());\r\n\r\n if (type) {\r\n alerts = alerts.filter(a => a.type === type);\r\n }\r\n\r\n if (severity) {\r\n alerts = alerts.filter(a => a.severity === severity);\r\n }\r\n\r\n return alerts.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\r\n}\r\n\r\n/**\r\n * Get alert history\r\n */\r\nexport function getAlertHistory(limit: number = 100): Alert[] {\r\n return alertHistory.slice(-limit).reverse();\r\n}\r\n\r\n/**\r\n * Clear alert history (in-memory + DB)\r\n */\r\nexport function clearAlertHistory(): void {\r\n alertHistory.length = 0;\r\n activeAlerts.clear();\r\n // Also clear from DB (fire-and-forget)\r\n db.delete(errorLogs)\r\n .where(eq(errorLogs.source, \"alerting\"))\r\n .catch(() => {});\r\n}\r\n\r\n/**\r\n * Run all enabled alert rules\r\n */\r\nexport async function evaluateAlertRules(): Promise<Alert[]> {\r\n const triggeredAlerts: Alert[] = [];\r\n\r\n for (const rule of alertRules.values()) {\r\n if (!rule.enabled) continue;\r\n\r\n // Check cooldown\r\n if (rule.lastTriggered) {\r\n const cooldownMs = rule.cooldownMinutes * 60 * 1000;\r\n if (Date.now() - rule.lastTriggered.getTime() < cooldownMs) {\r\n continue;\r\n }\r\n }\r\n\r\n try {\r\n const shouldTrigger = await evaluateCondition(rule.condition);\r\n\r\n if (shouldTrigger) {\r\n rule.lastTriggered = new Date();\r\n rule.triggerCount++;\r\n\r\n const alert = await createAlert(\r\n rule.type,\r\n rule.severity,\r\n rule.name,\r\n rule.description,\r\n \"alert_rule\",\r\n { ruleId: rule.id, triggerCount: rule.triggerCount }\r\n );\r\n\r\n triggeredAlerts.push(alert);\r\n }\r\n } catch (error) {\r\n console.error(`[Alerting] Error evaluating rule ${rule.id}:`, error);\r\n }\r\n }\r\n\r\n return triggeredAlerts;\r\n}\r\n\r\n/**\r\n * Evaluate an alert condition\r\n */\r\nasync function evaluateCondition(condition: AlertCondition): Promise<boolean> {\r\n // Custom check function\r\n if (condition.customCheck) {\r\n return condition.customCheck();\r\n }\r\n\r\n // Metric-based check\r\n if (condition.metric && condition.operator !== \"anomaly\") {\r\n const windowMs = (condition.windowMinutes || 5) * 60 * 1000;\r\n const startDate = new Date(Date.now() - windowMs);\r\n\r\n const results = await db\r\n .select()\r\n .from(metrics)\r\n .where(\r\n and(\r\n eq(metrics.name, condition.metric),\r\n gte(metrics.timestamp, startDate)\r\n )\r\n );\r\n\r\n if (results.length === 0) return false;\r\n\r\n const values = results.map(r => r.value);\r\n let aggregatedValue: number;\r\n\r\n switch (condition.aggregation || \"avg\") {\r\n case \"sum\":\r\n aggregatedValue = values.reduce((a, b) => a + b, 0);\r\n break;\r\n case \"max\":\r\n aggregatedValue = Math.max(...values);\r\n break;\r\n case \"min\":\r\n aggregatedValue = Math.min(...values);\r\n break;\r\n case \"count\":\r\n aggregatedValue = values.length;\r\n break;\r\n case \"avg\":\r\n default:\r\n aggregatedValue = values.reduce((a, b) => a + b, 0) / values.length;\r\n }\r\n\r\n const threshold = condition.threshold || 0;\r\n\r\n switch (condition.operator) {\r\n case \"gt\":\r\n return aggregatedValue > threshold;\r\n case \"lt\":\r\n return aggregatedValue < threshold;\r\n case \"eq\":\r\n return aggregatedValue === threshold;\r\n case \"gte\":\r\n return aggregatedValue >= threshold;\r\n case \"lte\":\r\n return aggregatedValue <= threshold;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n // Anomaly detection\r\n if (condition.operator === \"anomaly\" && condition.metric) {\r\n const anomaly = await detectAnomaly(condition.metric, condition.windowMinutes || 60);\r\n return anomaly.isAnomaly;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Detect anomalies in a metric\r\n */\r\nexport async function detectAnomaly(\r\n metricName: string,\r\n windowMinutes: number = 60\r\n): Promise<AnomalyDetection> {\r\n const windowMs = windowMinutes * 60 * 1000;\r\n const now = Date.now();\r\n\r\n // Get historical data (past week for baseline)\r\n const baselineStart = new Date(now - 7 * 24 * 60 * 60 * 1000);\r\n const baselineEnd = new Date(now - windowMs);\r\n\r\n const baselineResults = await db\r\n .select()\r\n .from(metrics)\r\n .where(\r\n and(\r\n eq(metrics.name, metricName),\r\n gte(metrics.timestamp, baselineStart),\r\n lte(metrics.timestamp, baselineEnd)\r\n )\r\n );\r\n\r\n // Get current window data\r\n const currentStart = new Date(now - windowMs);\r\n const currentResults = await db\r\n .select()\r\n .from(metrics)\r\n .where(\r\n and(\r\n eq(metrics.name, metricName),\r\n gte(metrics.timestamp, currentStart)\r\n )\r\n );\r\n\r\n if (baselineResults.length < 10 || currentResults.length === 0) {\r\n return {\r\n metric: metricName,\r\n currentValue: currentResults.length > 0\r\n ? currentResults.reduce((a, b) => a + b.value, 0) / currentResults.length\r\n : 0,\r\n expectedValue: 0,\r\n deviation: 0,\r\n deviationPercent: 0,\r\n isAnomaly: false,\r\n confidence: 0,\r\n timestamp: new Date(),\r\n };\r\n }\r\n\r\n // Calculate baseline statistics\r\n const baselineValues = baselineResults.map(r => r.value);\r\n const baselineMean = baselineValues.reduce((a, b) => a + b, 0) / baselineValues.length;\r\n const baselineStdDev = Math.sqrt(\r\n baselineValues.reduce((sum, val) => sum + Math.pow(val - baselineMean, 2), 0) / baselineValues.length\r\n );\r\n\r\n // Calculate current value\r\n const currentValue = currentResults.reduce((a, b) => a + b.value, 0) / currentResults.length;\r\n\r\n // Calculate z-score\r\n const zScore = baselineStdDev > 0 ? (currentValue - baselineMean) / baselineStdDev : 0;\r\n const deviation = currentValue - baselineMean;\r\n const deviationPercent = baselineMean !== 0 ? (deviation / baselineMean) * 100 : 0;\r\n\r\n // Consider anomaly if z-score > 2 (95% confidence)\r\n const isAnomaly = Math.abs(zScore) > 2;\r\n\r\n // Calculate confidence based on data quality\r\n const confidence = Math.min(\r\n baselineResults.length / 100, // More data = higher confidence\r\n 1 - (1 / (1 + Math.abs(zScore))) // Higher z-score = higher confidence\r\n );\r\n\r\n return {\r\n metric: metricName,\r\n currentValue,\r\n expectedValue: baselineMean,\r\n deviation,\r\n deviationPercent,\r\n isAnomaly,\r\n confidence,\r\n timestamp: new Date(),\r\n };\r\n}\r\n\r\n/**\r\n * Calculate cost metrics\r\n */\r\nexport async function calculateCostMetrics(\r\n period: CostMetrics[\"period\"],\r\n startDate?: Date\r\n): Promise<CostMetrics> {\r\n const now = new Date();\r\n let periodStart: Date;\r\n\r\n switch (period) {\r\n case \"hourly\":\r\n periodStart = startDate || new Date(now.getTime() - 60 * 60 * 1000);\r\n break;\r\n case \"daily\":\r\n periodStart = startDate || new Date(now.getTime() - 24 * 60 * 60 * 1000);\r\n break;\r\n case \"weekly\":\r\n periodStart = startDate || new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\r\n break;\r\n case \"monthly\":\r\n periodStart = startDate || new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\r\n break;\r\n }\r\n\r\n // Get input tokens\r\n const inputTokens = await db\r\n .select()\r\n .from(metrics)\r\n .where(\r\n and(\r\n eq(metrics.name, \"token_usage_input\"),\r\n gte(metrics.timestamp, periodStart)\r\n )\r\n );\r\n\r\n // Get output tokens\r\n const outputTokens = await db\r\n .select()\r\n .from(metrics)\r\n .where(\r\n and(\r\n eq(metrics.name, \"token_usage_output\"),\r\n gte(metrics.timestamp, periodStart)\r\n )\r\n );\r\n\r\n const totalInput = inputTokens.reduce((sum, m) => sum + m.value, 0);\r\n const totalOutput = outputTokens.reduce((sum, m) => sum + m.value, 0);\r\n\r\n const inputCost = (totalInput / 1_000_000) * TOKEN_COST_PER_MILLION_INPUT;\r\n const outputCost = (totalOutput / 1_000_000) * TOKEN_COST_PER_MILLION_OUTPUT;\r\n const totalCost = inputCost + outputCost;\r\n\r\n // Group by tags for breakdown\r\n const breakdown: CostBreakdown[] = [];\r\n\r\n // Group input tokens by source/tool if available\r\n const inputByTag = new Map<string, number>();\r\n for (const m of inputTokens) {\r\n const category = (m.tags as Record<string, string>)?.source || \"general\";\r\n inputByTag.set(category, (inputByTag.get(category) || 0) + m.value);\r\n }\r\n\r\n for (const [category, tokens] of inputByTag) {\r\n const cost = (tokens / 1_000_000) * TOKEN_COST_PER_MILLION_INPUT;\r\n breakdown.push({\r\n category: `input:${category}`,\r\n tokens,\r\n cost,\r\n percentage: totalCost > 0 ? (cost / totalCost) * 100 : 0,\r\n });\r\n }\r\n\r\n return {\r\n totalTokens: totalInput + totalOutput,\r\n inputTokens: totalInput,\r\n outputTokens: totalOutput,\r\n estimatedCost: totalCost,\r\n period,\r\n startDate: periodStart,\r\n endDate: now,\r\n breakdown,\r\n };\r\n}\r\n\r\n/**\r\n * Register a health check\r\n */\r\nexport function registerHealthCheck(\r\n name: string,\r\n check: () => Promise<{ status: \"healthy\" | \"degraded\" | \"unhealthy\"; message: string; metadata?: Record<string, unknown> }>\r\n): void {\r\n // Store the check function for periodic execution\r\n healthChecks.set(name, check);\r\n}\r\n\r\nconst healthChecks = new Map<string, () => Promise<{ status: \"healthy\" | \"degraded\" | \"unhealthy\"; message: string; metadata?: Record<string, unknown> }>>();\r\n\r\n/**\r\n * Run all health checks\r\n */\r\nexport async function runHealthChecks(): Promise<HealthCheckResult[]> {\r\n const results: HealthCheckResult[] = [];\r\n\r\n for (const [name, check] of healthChecks) {\r\n const startTime = Date.now();\r\n try {\r\n const result = await check();\r\n const checkResult: HealthCheckResult = {\r\n name,\r\n status: result.status,\r\n message: result.message,\r\n latencyMs: Date.now() - startTime,\r\n lastCheck: new Date(),\r\n metadata: result.metadata,\r\n };\r\n results.push(checkResult);\r\n healthCheckResults.set(name, checkResult);\r\n\r\n // Create alert if unhealthy\r\n if (result.status === \"unhealthy\") {\r\n await createAlert(\r\n \"health_check\",\r\n \"error\",\r\n `Health Check Failed: ${name}`,\r\n result.message,\r\n \"health_monitor\",\r\n result.metadata\r\n );\r\n } else if (result.status === \"degraded\") {\r\n await createAlert(\r\n \"health_check\",\r\n \"warning\",\r\n `Health Check Degraded: ${name}`,\r\n result.message,\r\n \"health_monitor\",\r\n result.metadata\r\n );\r\n }\r\n } catch (error) {\r\n const checkResult: HealthCheckResult = {\r\n name,\r\n status: \"unhealthy\",\r\n message: error instanceof Error ? error.message : \"Unknown error\",\r\n latencyMs: Date.now() - startTime,\r\n lastCheck: new Date(),\r\n };\r\n results.push(checkResult);\r\n healthCheckResults.set(name, checkResult);\r\n\r\n await createAlert(\r\n \"health_check\",\r\n \"error\",\r\n `Health Check Error: ${name}`,\r\n checkResult.message,\r\n \"health_monitor\"\r\n );\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Get health check results\r\n */\r\nexport function getHealthCheckResults(): HealthCheckResult[] {\r\n return Array.from(healthCheckResults.values());\r\n}\r\n\r\n/**\r\n * Initialize default health checks\r\n */\r\nexport function initializeDefaultHealthChecks(): void {\r\n // Database health check\r\n registerHealthCheck(\"database\", async () => {\r\n try {\r\n await db.select().from(metrics).limit(1);\r\n return { status: \"healthy\", message: \"Database connection is healthy\" };\r\n } catch (error) {\r\n return {\r\n status: \"unhealthy\",\r\n message: `Database connection failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\r\n };\r\n }\r\n });\r\n\r\n // Memory health check\r\n registerHealthCheck(\"memory\", async () => {\r\n const memUsage = process.memoryUsage();\r\n const heapUsedPercent = (memUsage.heapUsed / memUsage.heapTotal) * 100;\r\n\r\n if (heapUsedPercent > 90) {\r\n return {\r\n status: \"unhealthy\",\r\n message: `Heap usage critical: ${heapUsedPercent.toFixed(1)}%`,\r\n metadata: { heapUsed: memUsage.heapUsed, heapTotal: memUsage.heapTotal },\r\n };\r\n } else if (heapUsedPercent > 75) {\r\n return {\r\n status: \"degraded\",\r\n message: `Heap usage high: ${heapUsedPercent.toFixed(1)}%`,\r\n metadata: { heapUsed: memUsage.heapUsed, heapTotal: memUsage.heapTotal },\r\n };\r\n }\r\n\r\n return {\r\n status: \"healthy\",\r\n message: `Heap usage: ${heapUsedPercent.toFixed(1)}%`,\r\n metadata: { heapUsed: memUsage.heapUsed, heapTotal: memUsage.heapTotal },\r\n };\r\n });\r\n\r\n // Error rate health check\r\n registerHealthCheck(\"error_rate\", async () => {\r\n const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000);\r\n const errors = await db\r\n .select()\r\n .from(errorLogs)\r\n .where(gte(errorLogs.createdAt, oneHourAgo));\r\n\r\n const errorCount = errors.length;\r\n\r\n if (errorCount > 100) {\r\n return {\r\n status: \"unhealthy\",\r\n message: `High error rate: ${errorCount} errors in the last hour`,\r\n metadata: { errorCount },\r\n };\r\n } else if (errorCount > 50) {\r\n return {\r\n status: \"degraded\",\r\n message: `Elevated error rate: ${errorCount} errors in the last hour`,\r\n metadata: { errorCount },\r\n };\r\n }\r\n\r\n return {\r\n status: \"healthy\",\r\n message: `Error rate normal: ${errorCount} errors in the last hour`,\r\n metadata: { errorCount },\r\n };\r\n });\r\n}\r\n\r\n/**\r\n * Start the alerting system with periodic checks\r\n */\r\nexport function startAlertingSystem(intervalMs: number = 60000): void {\r\n // Initialize defaults\r\n initializeDefaultRules();\r\n initializeDefaultHealthChecks();\r\n\r\n // Run periodic checks\r\n setInterval(async () => {\r\n try {\r\n await evaluateAlertRules();\r\n await runHealthChecks();\r\n } catch (error) {\r\n console.error(\"[Alerting] Error in periodic check:\", error);\r\n }\r\n }, intervalMs);\r\n\r\n console.log(`[Alerting] System started with ${intervalMs}ms check interval`);\r\n}\r\n\r\n/**\r\n * Get alerting system status\r\n */\r\nexport function getAlertingStatus(): {\r\n activeAlerts: number;\r\n totalRules: number;\r\n enabledRules: number;\r\n healthChecks: number;\r\n healthyChecks: number;\r\n lastEvaluation?: Date;\r\n} {\r\n const healthResults = getHealthCheckResults();\r\n return {\r\n activeAlerts: activeAlerts.size,\r\n totalRules: alertRules.size,\r\n enabledRules: Array.from(alertRules.values()).filter(r => r.enabled).length,\r\n healthChecks: healthChecks.size,\r\n healthyChecks: healthResults.filter(r => r.status === \"healthy\").length,\r\n };\r\n}\r\n\r\n/**\r\n * Format alert for display\r\n */\r\nexport function formatAlert(alert: Alert): string {\r\n const lines: string[] = [];\r\n\r\n lines.push(`=== Alert: ${alert.title} ===`);\r\n lines.push(`ID: ${alert.id}`);\r\n lines.push(`Type: ${alert.type}`);\r\n lines.push(`Severity: ${alert.severity.toUpperCase()}`);\r\n lines.push(`Source: ${alert.source}`);\r\n lines.push(`Time: ${alert.timestamp.toISOString()}`);\r\n lines.push(\"\");\r\n lines.push(`Message: ${alert.message}`);\r\n\r\n if (alert.metadata) {\r\n lines.push(\"\");\r\n lines.push(\"Metadata:\");\r\n for (const [key, value] of Object.entries(alert.metadata)) {\r\n lines.push(` ${key}: ${JSON.stringify(value)}`);\r\n }\r\n }\r\n\r\n lines.push(\"\");\r\n lines.push(`Status: ${alert.resolved ? \"Resolved\" : alert.acknowledged ? \"Acknowledged\" : \"Active\"}`);\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import {
|
|
2
|
+
analyzeEmail,
|
|
3
|
+
heuristicAnalyze,
|
|
4
|
+
listAnalyses,
|
|
5
|
+
parseJsonResponse,
|
|
6
|
+
persistAnalysis
|
|
7
|
+
} from "./chunk-SDLOMKCW.js";
|
|
8
|
+
import "./chunk-7BNFELEK.js";
|
|
9
|
+
import "./chunk-GW6V4D43.js";
|
|
10
|
+
import "./chunk-5BTVJR7R.js";
|
|
11
|
+
import "./chunk-4KIHDIXZ.js";
|
|
12
|
+
import "./chunk-ZIBRVA3Y.js";
|
|
13
|
+
import "./chunk-35WYTA3C.js";
|
|
14
|
+
import "./chunk-UP2VWCW5.js";
|
|
15
|
+
export {
|
|
16
|
+
analyzeEmail,
|
|
17
|
+
heuristicAnalyze,
|
|
18
|
+
listAnalyses,
|
|
19
|
+
parseJsonResponse,
|
|
20
|
+
persistAnalysis
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=analyzer-OTWE3ARE.js.map
|
|
@@ -15,9 +15,9 @@ var require_path = __commonJS({
|
|
|
15
15
|
}
|
|
16
16
|
});
|
|
17
17
|
|
|
18
|
-
// node_modules/
|
|
18
|
+
// node_modules/balanced-match/index.js
|
|
19
19
|
var require_balanced_match = __commonJS({
|
|
20
|
-
"node_modules/
|
|
20
|
+
"node_modules/balanced-match/index.js"(exports, module) {
|
|
21
21
|
"use strict";
|
|
22
22
|
module.exports = balanced;
|
|
23
23
|
function balanced(a, b, str) {
|
|
@@ -73,9 +73,9 @@ var require_balanced_match = __commonJS({
|
|
|
73
73
|
}
|
|
74
74
|
});
|
|
75
75
|
|
|
76
|
-
// node_modules/
|
|
76
|
+
// node_modules/brace-expansion/index.js
|
|
77
77
|
var require_brace_expansion = __commonJS({
|
|
78
|
-
"node_modules/
|
|
78
|
+
"node_modules/brace-expansion/index.js"(exports, module) {
|
|
79
79
|
"use strict";
|
|
80
80
|
var balanced = require_balanced_match();
|
|
81
81
|
module.exports = expandTop;
|
|
@@ -3686,9 +3686,9 @@ var require_process_nextick_args = __commonJS({
|
|
|
3686
3686
|
}
|
|
3687
3687
|
});
|
|
3688
3688
|
|
|
3689
|
-
// node_modules/
|
|
3689
|
+
// node_modules/isarray/index.js
|
|
3690
3690
|
var require_isarray = __commonJS({
|
|
3691
|
-
"node_modules/
|
|
3691
|
+
"node_modules/isarray/index.js"(exports, module) {
|
|
3692
3692
|
"use strict";
|
|
3693
3693
|
var toString = {}.toString;
|
|
3694
3694
|
module.exports = Array.isArray || function(arr) {
|
|
@@ -3705,9 +3705,9 @@ var require_stream = __commonJS({
|
|
|
3705
3705
|
}
|
|
3706
3706
|
});
|
|
3707
3707
|
|
|
3708
|
-
// node_modules/
|
|
3708
|
+
// node_modules/safe-buffer/index.js
|
|
3709
3709
|
var require_safe_buffer = __commonJS({
|
|
3710
|
-
"node_modules/
|
|
3710
|
+
"node_modules/safe-buffer/index.js"(exports, module) {
|
|
3711
3711
|
"use strict";
|
|
3712
3712
|
var buffer = __require("buffer");
|
|
3713
3713
|
var Buffer2 = buffer.Buffer;
|
|
@@ -5885,17 +5885,6 @@ var require_lodash = __commonJS({
|
|
|
5885
5885
|
}
|
|
5886
5886
|
});
|
|
5887
5887
|
|
|
5888
|
-
// node_modules/archiver-utils/node_modules/isarray/index.js
|
|
5889
|
-
var require_isarray2 = __commonJS({
|
|
5890
|
-
"node_modules/archiver-utils/node_modules/isarray/index.js"(exports, module) {
|
|
5891
|
-
"use strict";
|
|
5892
|
-
var toString = {}.toString;
|
|
5893
|
-
module.exports = Array.isArray || function(arr) {
|
|
5894
|
-
return toString.call(arr) == "[object Array]";
|
|
5895
|
-
};
|
|
5896
|
-
}
|
|
5897
|
-
});
|
|
5898
|
-
|
|
5899
5888
|
// node_modules/archiver-utils/node_modules/readable-stream/lib/internal/streams/stream.js
|
|
5900
5889
|
var require_stream2 = __commonJS({
|
|
5901
5890
|
"node_modules/archiver-utils/node_modules/readable-stream/lib/internal/streams/stream.js"(exports, module) {
|
|
@@ -5904,64 +5893,6 @@ var require_stream2 = __commonJS({
|
|
|
5904
5893
|
}
|
|
5905
5894
|
});
|
|
5906
5895
|
|
|
5907
|
-
// node_modules/archiver-utils/node_modules/safe-buffer/index.js
|
|
5908
|
-
var require_safe_buffer2 = __commonJS({
|
|
5909
|
-
"node_modules/archiver-utils/node_modules/safe-buffer/index.js"(exports, module) {
|
|
5910
|
-
"use strict";
|
|
5911
|
-
var buffer = __require("buffer");
|
|
5912
|
-
var Buffer2 = buffer.Buffer;
|
|
5913
|
-
function copyProps(src, dst) {
|
|
5914
|
-
for (var key in src) {
|
|
5915
|
-
dst[key] = src[key];
|
|
5916
|
-
}
|
|
5917
|
-
}
|
|
5918
|
-
if (Buffer2.from && Buffer2.alloc && Buffer2.allocUnsafe && Buffer2.allocUnsafeSlow) {
|
|
5919
|
-
module.exports = buffer;
|
|
5920
|
-
} else {
|
|
5921
|
-
copyProps(buffer, exports);
|
|
5922
|
-
exports.Buffer = SafeBuffer;
|
|
5923
|
-
}
|
|
5924
|
-
function SafeBuffer(arg, encodingOrOffset, length) {
|
|
5925
|
-
return Buffer2(arg, encodingOrOffset, length);
|
|
5926
|
-
}
|
|
5927
|
-
copyProps(Buffer2, SafeBuffer);
|
|
5928
|
-
SafeBuffer.from = function(arg, encodingOrOffset, length) {
|
|
5929
|
-
if (typeof arg === "number") {
|
|
5930
|
-
throw new TypeError("Argument must not be a number");
|
|
5931
|
-
}
|
|
5932
|
-
return Buffer2(arg, encodingOrOffset, length);
|
|
5933
|
-
};
|
|
5934
|
-
SafeBuffer.alloc = function(size, fill, encoding) {
|
|
5935
|
-
if (typeof size !== "number") {
|
|
5936
|
-
throw new TypeError("Argument must be a number");
|
|
5937
|
-
}
|
|
5938
|
-
var buf = Buffer2(size);
|
|
5939
|
-
if (fill !== void 0) {
|
|
5940
|
-
if (typeof encoding === "string") {
|
|
5941
|
-
buf.fill(fill, encoding);
|
|
5942
|
-
} else {
|
|
5943
|
-
buf.fill(fill);
|
|
5944
|
-
}
|
|
5945
|
-
} else {
|
|
5946
|
-
buf.fill(0);
|
|
5947
|
-
}
|
|
5948
|
-
return buf;
|
|
5949
|
-
};
|
|
5950
|
-
SafeBuffer.allocUnsafe = function(size) {
|
|
5951
|
-
if (typeof size !== "number") {
|
|
5952
|
-
throw new TypeError("Argument must be a number");
|
|
5953
|
-
}
|
|
5954
|
-
return Buffer2(size);
|
|
5955
|
-
};
|
|
5956
|
-
SafeBuffer.allocUnsafeSlow = function(size) {
|
|
5957
|
-
if (typeof size !== "number") {
|
|
5958
|
-
throw new TypeError("Argument must be a number");
|
|
5959
|
-
}
|
|
5960
|
-
return buffer.SlowBuffer(size);
|
|
5961
|
-
};
|
|
5962
|
-
}
|
|
5963
|
-
});
|
|
5964
|
-
|
|
5965
5896
|
// node_modules/archiver-utils/node_modules/readable-stream/lib/internal/streams/BufferList.js
|
|
5966
5897
|
var require_BufferList2 = __commonJS({
|
|
5967
5898
|
"node_modules/archiver-utils/node_modules/readable-stream/lib/internal/streams/BufferList.js"(exports, module) {
|
|
@@ -5971,7 +5902,7 @@ var require_BufferList2 = __commonJS({
|
|
|
5971
5902
|
throw new TypeError("Cannot call a class as a function");
|
|
5972
5903
|
}
|
|
5973
5904
|
}
|
|
5974
|
-
var Buffer2 =
|
|
5905
|
+
var Buffer2 = require_safe_buffer().Buffer;
|
|
5975
5906
|
var util = __require("util");
|
|
5976
5907
|
function copyBuffer(src, target, offset) {
|
|
5977
5908
|
src.copy(target, offset);
|
|
@@ -6132,7 +6063,7 @@ var require_stream_writable2 = __commonJS({
|
|
|
6132
6063
|
deprecate: require_node()
|
|
6133
6064
|
};
|
|
6134
6065
|
var Stream = require_stream2();
|
|
6135
|
-
var Buffer2 =
|
|
6066
|
+
var Buffer2 = require_safe_buffer().Buffer;
|
|
6136
6067
|
var OurUint8Array = (typeof global !== "undefined" ? global : typeof window !== "undefined" ? window : typeof self !== "undefined" ? self : {}).Uint8Array || function() {
|
|
6137
6068
|
};
|
|
6138
6069
|
function _uint8ArrayToBuffer(chunk) {
|
|
@@ -6630,7 +6561,7 @@ var require_stream_duplex2 = __commonJS({
|
|
|
6630
6561
|
var require_string_decoder2 = __commonJS({
|
|
6631
6562
|
"node_modules/archiver-utils/node_modules/readable-stream/node_modules/string_decoder/lib/string_decoder.js"(exports) {
|
|
6632
6563
|
"use strict";
|
|
6633
|
-
var Buffer2 =
|
|
6564
|
+
var Buffer2 = require_safe_buffer().Buffer;
|
|
6634
6565
|
var isEncoding = Buffer2.isEncoding || function(encoding) {
|
|
6635
6566
|
encoding = "" + encoding;
|
|
6636
6567
|
switch (encoding && encoding.toLowerCase()) {
|
|
@@ -6870,7 +6801,7 @@ var require_stream_readable2 = __commonJS({
|
|
|
6870
6801
|
"use strict";
|
|
6871
6802
|
var pna = require_process_nextick_args();
|
|
6872
6803
|
module.exports = Readable;
|
|
6873
|
-
var isArray =
|
|
6804
|
+
var isArray = require_isarray();
|
|
6874
6805
|
var Duplex;
|
|
6875
6806
|
Readable.ReadableState = ReadableState;
|
|
6876
6807
|
var EE = __require("events").EventEmitter;
|
|
@@ -6878,7 +6809,7 @@ var require_stream_readable2 = __commonJS({
|
|
|
6878
6809
|
return emitter.listeners(type).length;
|
|
6879
6810
|
};
|
|
6880
6811
|
var Stream = require_stream2();
|
|
6881
|
-
var Buffer2 =
|
|
6812
|
+
var Buffer2 = require_safe_buffer().Buffer;
|
|
6882
6813
|
var OurUint8Array = (typeof global !== "undefined" ? global : typeof window !== "undefined" ? window : typeof self !== "undefined" ? self : {}).Uint8Array || function() {
|
|
6883
6814
|
};
|
|
6884
6815
|
function _uint8ArrayToBuffer(chunk) {
|
|
@@ -9961,7 +9892,7 @@ var require_stream_duplex3 = __commonJS({
|
|
|
9961
9892
|
});
|
|
9962
9893
|
|
|
9963
9894
|
// node_modules/string_decoder/node_modules/safe-buffer/index.js
|
|
9964
|
-
var
|
|
9895
|
+
var require_safe_buffer2 = __commonJS({
|
|
9965
9896
|
"node_modules/string_decoder/node_modules/safe-buffer/index.js"(exports, module) {
|
|
9966
9897
|
"use strict";
|
|
9967
9898
|
var buffer = __require("buffer");
|
|
@@ -10023,7 +9954,7 @@ var require_safe_buffer3 = __commonJS({
|
|
|
10023
9954
|
var require_string_decoder3 = __commonJS({
|
|
10024
9955
|
"node_modules/string_decoder/lib/string_decoder.js"(exports) {
|
|
10025
9956
|
"use strict";
|
|
10026
|
-
var Buffer2 =
|
|
9957
|
+
var Buffer2 = require_safe_buffer2().Buffer;
|
|
10027
9958
|
var isEncoding = Buffer2.isEncoding || function(encoding) {
|
|
10028
9959
|
encoding = "" + encoding;
|
|
10029
9960
|
switch (encoding && encoding.toLowerCase()) {
|
|
@@ -15406,4 +15337,4 @@ archiver/index.js:
|
|
|
15406
15337
|
* @copyright (c) 2012-2014 Chris Talkington, contributors.
|
|
15407
15338
|
*)
|
|
15408
15339
|
*/
|
|
15409
|
-
//# sourceMappingURL=archiver-
|
|
15340
|
+
//# sourceMappingURL=archiver-FPGKRP6P.js.map
|