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/package.json
CHANGED
|
@@ -1,110 +1,110 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "opensentinel",
|
|
3
|
-
"version": "3.
|
|
4
|
-
"description": "Self-hosted personal AI assistant powered by Claude with Telegram, Discord, Slack, WhatsApp, Signal, iMessage, and web interfaces",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"main": "./dist/lib.js",
|
|
7
|
-
"module": "./dist/lib.js",
|
|
8
|
-
"types": "./dist/lib.d.ts",
|
|
9
|
-
"exports": {
|
|
10
|
-
".": {
|
|
11
|
-
"import": "./dist/lib.js",
|
|
12
|
-
"types": "./dist/lib.d.ts"
|
|
13
|
-
}
|
|
14
|
-
},
|
|
15
|
-
"bin": {
|
|
16
|
-
"opensentinel": "./dist/cli.js"
|
|
17
|
-
},
|
|
18
|
-
"files": [
|
|
19
|
-
"dist",
|
|
20
|
-
"drizzle",
|
|
21
|
-
"README.md"
|
|
22
|
-
],
|
|
23
|
-
"scripts": {
|
|
24
|
-
"dev": "bun --watch src/cli.ts",
|
|
25
|
-
"start": "bun src/cli.ts",
|
|
26
|
-
"build": "tsup",
|
|
27
|
-
"prepublishOnly": "bun run build",
|
|
28
|
-
"test": "bun test",
|
|
29
|
-
"test:watch": "bun test --watch",
|
|
30
|
-
"test:coverage": "bun test --coverage",
|
|
31
|
-
"db:generate": "drizzle-kit generate",
|
|
32
|
-
"db:migrate": "bun src/db/migrate.ts",
|
|
33
|
-
"db:studio": "drizzle-kit studio"
|
|
34
|
-
},
|
|
35
|
-
"keywords": [
|
|
36
|
-
"ai",
|
|
37
|
-
"assistant",
|
|
38
|
-
"claude",
|
|
39
|
-
"telegram",
|
|
40
|
-
"discord",
|
|
41
|
-
"slack",
|
|
42
|
-
"whatsapp",
|
|
43
|
-
"signal",
|
|
44
|
-
"imessage",
|
|
45
|
-
"self-hosted"
|
|
46
|
-
],
|
|
47
|
-
"license": "MIT",
|
|
48
|
-
"author": "OpenSentinel Contributors",
|
|
49
|
-
"repository": {
|
|
50
|
-
"type": "git",
|
|
51
|
-
"url": "https://github.com/dsiemon2/OpenSentinel.git"
|
|
52
|
-
},
|
|
53
|
-
"homepage": "https://opensentinel.ai",
|
|
54
|
-
"bugs": {
|
|
55
|
-
"url": "https://github.com/dsiemon2/OpenSentinel/issues"
|
|
56
|
-
},
|
|
57
|
-
"dependencies": {
|
|
58
|
-
"@anthropic-ai/sdk": "^0.39.0",
|
|
59
|
-
"@notionhq/client": "^5.11.0",
|
|
60
|
-
"bullmq": "^5.34.0",
|
|
61
|
-
"date-fns": "^4.1.0",
|
|
62
|
-
"drizzle-orm": "^0.39.0",
|
|
63
|
-
"glob": "^13.0.1",
|
|
64
|
-
"hono": "^4.7.0",
|
|
65
|
-
"ioredis": "^5.4.1",
|
|
66
|
-
"marked": "^12.0.0",
|
|
67
|
-
"matrix-js-sdk": "^41.0.0-rc.0",
|
|
68
|
-
"nanoid": "^5.0.0",
|
|
69
|
-
"neo4j-driver": "^6.0.1",
|
|
70
|
-
"node-cron": "^4.2.1",
|
|
71
|
-
"openai": "^4.77.0",
|
|
72
|
-
"postgres": "^3.4.5",
|
|
73
|
-
"uuid": "^13.0.0",
|
|
74
|
-
"zod": "^3.24.0"
|
|
75
|
-
},
|
|
76
|
-
"optionalDependencies": {
|
|
77
|
-
"@discordjs/voice": "^0.18.0",
|
|
78
|
-
"@grammyjs/files": "^1.1.1",
|
|
79
|
-
"@hapi/boom": "^10.0.0",
|
|
80
|
-
"@octokit/webhooks": "^14.2.0",
|
|
81
|
-
"@slack/bolt": "^4.1.0",
|
|
82
|
-
"@slack/web-api": "^7.7.0",
|
|
83
|
-
"@whiskeysockets/baileys": "^7.0.0-rc.9",
|
|
84
|
-
"discord.js": "^14.16.0",
|
|
85
|
-
"exceljs": "^4.4.0",
|
|
86
|
-
"grammy": "^1.34.0",
|
|
87
|
-
"imapflow": "^1.2.8",
|
|
88
|
-
"mailparser": "^3.9.3",
|
|
89
|
-
"mammoth": "^1.11.0",
|
|
90
|
-
"nodemailer": "^7.0.13",
|
|
91
|
-
"octokit": "^5.0.5",
|
|
92
|
-
"pdf-parse": "^2.4.5",
|
|
93
|
-
"pdfkit": "^0.15.0",
|
|
94
|
-
"playwright": "^1.58.1",
|
|
95
|
-
"qrcode-terminal": "^0.12.0",
|
|
96
|
-
"screenshot-desktop": "^1.15.0",
|
|
97
|
-
"tesseract.js": "^5.0.0"
|
|
98
|
-
},
|
|
99
|
-
"devDependencies": {
|
|
100
|
-
"@types/bun": "latest",
|
|
101
|
-
"@types/mailparser": "^3.4.6",
|
|
102
|
-
"@types/node-cron": "^3.0.11",
|
|
103
|
-
"@types/nodemailer": "^7.0.9",
|
|
104
|
-
"@types/pdf-parse": "^1.1.5",
|
|
105
|
-
"@types/uuid": "^11.0.0",
|
|
106
|
-
"drizzle-kit": "^0.30.0",
|
|
107
|
-
"tsup": "^8.5.1",
|
|
108
|
-
"typescript": "^5.7.0"
|
|
109
|
-
}
|
|
110
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "opensentinel",
|
|
3
|
+
"version": "3.7.0",
|
|
4
|
+
"description": "Self-hosted personal AI assistant powered by Claude with Telegram, Discord, Slack, WhatsApp, Signal, iMessage, and web interfaces",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/lib.js",
|
|
7
|
+
"module": "./dist/lib.js",
|
|
8
|
+
"types": "./dist/lib.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/lib.js",
|
|
12
|
+
"types": "./dist/lib.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"opensentinel": "./dist/cli.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"drizzle",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"dev": "bun --watch src/cli.ts",
|
|
25
|
+
"start": "bun src/cli.ts",
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"prepublishOnly": "bun run build",
|
|
28
|
+
"test": "bun test",
|
|
29
|
+
"test:watch": "bun test --watch",
|
|
30
|
+
"test:coverage": "bun test --coverage",
|
|
31
|
+
"db:generate": "drizzle-kit generate",
|
|
32
|
+
"db:migrate": "bun src/db/migrate.ts",
|
|
33
|
+
"db:studio": "drizzle-kit studio"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"ai",
|
|
37
|
+
"assistant",
|
|
38
|
+
"claude",
|
|
39
|
+
"telegram",
|
|
40
|
+
"discord",
|
|
41
|
+
"slack",
|
|
42
|
+
"whatsapp",
|
|
43
|
+
"signal",
|
|
44
|
+
"imessage",
|
|
45
|
+
"self-hosted"
|
|
46
|
+
],
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"author": "OpenSentinel Contributors",
|
|
49
|
+
"repository": {
|
|
50
|
+
"type": "git",
|
|
51
|
+
"url": "https://github.com/dsiemon2/OpenSentinel.git"
|
|
52
|
+
},
|
|
53
|
+
"homepage": "https://opensentinel.ai",
|
|
54
|
+
"bugs": {
|
|
55
|
+
"url": "https://github.com/dsiemon2/OpenSentinel/issues"
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"@anthropic-ai/sdk": "^0.39.0",
|
|
59
|
+
"@notionhq/client": "^5.11.0",
|
|
60
|
+
"bullmq": "^5.34.0",
|
|
61
|
+
"date-fns": "^4.1.0",
|
|
62
|
+
"drizzle-orm": "^0.39.0",
|
|
63
|
+
"glob": "^13.0.1",
|
|
64
|
+
"hono": "^4.7.0",
|
|
65
|
+
"ioredis": "^5.4.1",
|
|
66
|
+
"marked": "^12.0.0",
|
|
67
|
+
"matrix-js-sdk": "^41.0.0-rc.0",
|
|
68
|
+
"nanoid": "^5.0.0",
|
|
69
|
+
"neo4j-driver": "^6.0.1",
|
|
70
|
+
"node-cron": "^4.2.1",
|
|
71
|
+
"openai": "^4.77.0",
|
|
72
|
+
"postgres": "^3.4.5",
|
|
73
|
+
"uuid": "^13.0.0",
|
|
74
|
+
"zod": "^3.24.0"
|
|
75
|
+
},
|
|
76
|
+
"optionalDependencies": {
|
|
77
|
+
"@discordjs/voice": "^0.18.0",
|
|
78
|
+
"@grammyjs/files": "^1.1.1",
|
|
79
|
+
"@hapi/boom": "^10.0.0",
|
|
80
|
+
"@octokit/webhooks": "^14.2.0",
|
|
81
|
+
"@slack/bolt": "^4.1.0",
|
|
82
|
+
"@slack/web-api": "^7.7.0",
|
|
83
|
+
"@whiskeysockets/baileys": "^7.0.0-rc.9",
|
|
84
|
+
"discord.js": "^14.16.0",
|
|
85
|
+
"exceljs": "^4.4.0",
|
|
86
|
+
"grammy": "^1.34.0",
|
|
87
|
+
"imapflow": "^1.2.8",
|
|
88
|
+
"mailparser": "^3.9.3",
|
|
89
|
+
"mammoth": "^1.11.0",
|
|
90
|
+
"nodemailer": "^7.0.13",
|
|
91
|
+
"octokit": "^5.0.5",
|
|
92
|
+
"pdf-parse": "^2.4.5",
|
|
93
|
+
"pdfkit": "^0.15.0",
|
|
94
|
+
"playwright": "^1.58.1",
|
|
95
|
+
"qrcode-terminal": "^0.12.0",
|
|
96
|
+
"screenshot-desktop": "^1.15.0",
|
|
97
|
+
"tesseract.js": "^5.0.0"
|
|
98
|
+
},
|
|
99
|
+
"devDependencies": {
|
|
100
|
+
"@types/bun": "latest",
|
|
101
|
+
"@types/mailparser": "^3.4.6",
|
|
102
|
+
"@types/node-cron": "^3.0.11",
|
|
103
|
+
"@types/nodemailer": "^7.0.9",
|
|
104
|
+
"@types/pdf-parse": "^1.1.5",
|
|
105
|
+
"@types/uuid": "^11.0.0",
|
|
106
|
+
"drizzle-kit": "^0.30.0",
|
|
107
|
+
"tsup": "^8.5.1",
|
|
108
|
+
"typescript": "^5.7.0"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/observability/alerting.ts"],"sourcesContent":["/**\n * Alerting System - Anomaly detection, cost alerts, error spikes, health monitoring\n *\n * Provides comprehensive alerting and monitoring for the OpenSentinel system,\n * including automatic anomaly detection, cost tracking, and health checks.\n */\n\nimport { db } from \"../../db\";\nimport { metrics, errorLogs, usageQuotas } from \"../../db/schema\";\nimport { eq, and, gte, lte, desc, sql } from \"drizzle-orm\";\nimport { EventEmitter } from \"events\";\n\n// Types\nexport interface Alert {\n id: string;\n type: AlertType;\n severity: AlertSeverity;\n title: string;\n message: string;\n source: string;\n timestamp: Date;\n metadata?: Record<string, unknown>;\n acknowledged: boolean;\n acknowledgedAt?: Date;\n acknowledgedBy?: string;\n resolved: boolean;\n resolvedAt?: Date;\n resolvedBy?: string;\n autoResolveTimeout?: number;\n}\n\nexport type AlertType =\n | \"anomaly\"\n | \"cost_threshold\"\n | \"error_spike\"\n | \"health_check\"\n | \"quota_warning\"\n | \"performance\"\n | \"security\"\n | \"system\";\n\nexport type AlertSeverity = \"info\" | \"warning\" | \"error\" | \"critical\";\n\nexport interface AlertRule {\n id: string;\n name: string;\n description: string;\n enabled: boolean;\n type: AlertType;\n condition: AlertCondition;\n severity: AlertSeverity;\n cooldownMinutes: number;\n channels: AlertChannel[];\n lastTriggered?: Date;\n triggerCount: number;\n}\n\nexport interface AlertCondition {\n metric?: string;\n operator: \"gt\" | \"lt\" | \"eq\" | \"gte\" | \"lte\" | \"anomaly\";\n threshold?: number;\n windowMinutes?: number;\n aggregation?: \"sum\" | \"avg\" | \"max\" | \"min\" | \"count\";\n customCheck?: () => Promise<boolean>;\n}\n\nexport type AlertChannel = \"console\" | \"telegram\" | \"webhook\" | \"email\" | \"database\";\n\nexport interface AlertChannelConfig {\n console: { enabled: boolean };\n telegram: { enabled: boolean; chatId?: string };\n webhook: { enabled: boolean; url?: string; headers?: Record<string, string> };\n email: { enabled: boolean; recipients?: string[] };\n database: { enabled: boolean };\n}\n\nexport interface HealthCheckResult {\n name: string;\n status: \"healthy\" | \"degraded\" | \"unhealthy\";\n message: string;\n latencyMs?: number;\n lastCheck: Date;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CostMetrics {\n totalTokens: number;\n inputTokens: number;\n outputTokens: number;\n estimatedCost: number;\n period: \"hourly\" | \"daily\" | \"weekly\" | \"monthly\";\n startDate: Date;\n endDate: Date;\n breakdown: CostBreakdown[];\n}\n\nexport interface CostBreakdown {\n category: string;\n tokens: number;\n cost: number;\n percentage: number;\n}\n\nexport interface AnomalyDetection {\n metric: string;\n currentValue: number;\n expectedValue: number;\n deviation: number;\n deviationPercent: number;\n isAnomaly: boolean;\n confidence: number;\n timestamp: Date;\n}\n\n// Constants\n// Dynamic pricing — uses cost-tracker's MODEL_TIERS for accurate multi-model pricing.\n// These defaults are used as fallback (Sonnet pricing).\nimport { costTracker } from \"./cost-tracker\";\nconst TOKEN_COST_PER_MILLION_INPUT = 3.0; // Fallback: Claude Sonnet input\nconst TOKEN_COST_PER_MILLION_OUTPUT = 15.0; // Fallback: Claude Sonnet output\n\n// In-memory stores\nconst activeAlerts = new Map<string, Alert>();\nconst alertRules = new Map<string, AlertRule>();\nconst healthCheckResults = new Map<string, HealthCheckResult>();\nconst alertHistory: Alert[] = [];\n\n// Event emitter for alert notifications\nexport const alertEmitter = new EventEmitter();\n\n// Default channel configuration\nlet channelConfig: AlertChannelConfig = {\n console: { enabled: true },\n telegram: { enabled: false },\n webhook: { enabled: false },\n email: { enabled: false },\n database: { enabled: true },\n};\n\n/**\n * Load alert history from database on startup\n */\nlet historyLoaded = false;\nexport async function loadAlertHistoryFromDb(): Promise<void> {\n if (historyLoaded) return;\n try {\n const rows = await db\n .select()\n .from(errorLogs)\n .where(eq(errorLogs.source, \"alerting\"))\n .orderBy(desc(errorLogs.createdAt))\n .limit(500);\n\n for (const row of rows.reverse()) {\n // Parse the alert type and severity from stored fields\n const alertType = (row.errorType?.replace(\"Alert:\", \"\") || \"system\") as AlertType;\n const severity = (row.errorCode || \"info\") as AlertSeverity;\n const [title, ...msgParts] = (row.message || \"\").split(\": \");\n const alert: Alert = {\n id: String(row.id),\n type: alertType,\n severity,\n title: title || \"Alert\",\n message: msgParts.join(\": \") || row.message || \"\",\n source: \"alert_rule\",\n timestamp: new Date(row.createdAt),\n metadata: (row.context || {}) as Record<string, unknown>,\n acknowledged: false,\n resolved: true, // historical alerts are resolved\n };\n alertHistory.push(alert);\n }\n historyLoaded = true;\n if (alertHistory.length > 0) {\n console.log(`[Alerting] Loaded ${alertHistory.length} historical alerts from DB`);\n }\n } catch {\n // DB may not be available yet\n }\n}\n\n/**\n * Initialize default alert rules\n */\nexport function initializeDefaultRules(): void {\n // Error spike detection\n addAlertRule({\n id: \"error-spike\",\n name: \"Error Spike Detection\",\n description: \"Triggers when error rate exceeds normal levels\",\n enabled: true,\n type: \"error_spike\",\n condition: {\n metric: \"error_count\",\n operator: \"gt\",\n threshold: 10,\n windowMinutes: 5,\n aggregation: \"count\",\n },\n severity: \"error\",\n cooldownMinutes: 15,\n channels: [\"console\", \"database\"],\n triggerCount: 0,\n });\n\n // High latency detection\n addAlertRule({\n id: \"high-latency\",\n name: \"High Response Latency\",\n description: \"Triggers when average response time exceeds threshold\",\n enabled: true,\n type: \"performance\",\n condition: {\n metric: \"response_latency\",\n operator: \"gt\",\n threshold: 10000, // 10 seconds\n windowMinutes: 5,\n aggregation: \"avg\",\n },\n severity: \"warning\",\n cooldownMinutes: 10,\n channels: [\"console\", \"database\"],\n triggerCount: 0,\n });\n\n // Cost threshold\n addAlertRule({\n id: \"daily-cost-threshold\",\n name: \"Daily Cost Threshold\",\n description: \"Triggers when daily API costs exceed threshold\",\n enabled: true,\n type: \"cost_threshold\",\n condition: {\n metric: \"cost\",\n operator: \"gt\",\n threshold: 50, // $50\n windowMinutes: 1440, // 24 hours\n },\n severity: \"warning\",\n cooldownMinutes: 60,\n channels: [\"console\", \"database\"],\n triggerCount: 0,\n });\n\n // Memory usage anomaly\n addAlertRule({\n id: \"memory-anomaly\",\n name: \"Memory Usage Anomaly\",\n description: \"Triggers when memory usage is abnormally high\",\n enabled: true,\n type: \"anomaly\",\n condition: {\n metric: \"memory_usage\",\n operator: \"anomaly\",\n windowMinutes: 60,\n },\n severity: \"warning\",\n cooldownMinutes: 30,\n channels: [\"console\", \"database\"],\n triggerCount: 0,\n });\n\n // Quota warning\n addAlertRule({\n id: \"quota-80-percent\",\n name: \"80% Quota Usage\",\n description: \"Triggers when usage reaches 80% of quota\",\n enabled: true,\n type: \"quota_warning\",\n condition: {\n metric: \"quota_usage\",\n operator: \"gte\",\n threshold: 80,\n },\n severity: \"warning\",\n cooldownMinutes: 60,\n channels: [\"console\", \"database\"],\n triggerCount: 0,\n });\n\n // Tool failure rate\n addAlertRule({\n id: \"tool-failure-rate\",\n name: \"High Tool Failure Rate\",\n description: \"Triggers when tool failure rate is high\",\n enabled: true,\n type: \"performance\",\n condition: {\n metric: \"tool_failure\",\n operator: \"gt\",\n threshold: 5,\n windowMinutes: 10,\n aggregation: \"count\",\n },\n severity: \"warning\",\n cooldownMinutes: 15,\n channels: [\"console\", \"database\"],\n triggerCount: 0,\n });\n}\n\n/**\n * Add or update an alert rule\n */\nexport function addAlertRule(rule: AlertRule): void {\n alertRules.set(rule.id, rule);\n}\n\n/**\n * Remove an alert rule\n */\nexport function removeAlertRule(ruleId: string): boolean {\n return alertRules.delete(ruleId);\n}\n\n/**\n * Get all alert rules\n */\nexport function getAlertRules(): AlertRule[] {\n return Array.from(alertRules.values());\n}\n\n/**\n * Enable/disable an alert rule\n */\nexport function setRuleEnabled(ruleId: string, enabled: boolean): boolean {\n const rule = alertRules.get(ruleId);\n if (rule) {\n rule.enabled = enabled;\n return true;\n }\n return false;\n}\n\n/**\n * Configure alert channels\n */\nexport function configureChannels(config: Partial<AlertChannelConfig>): void {\n channelConfig = { ...channelConfig, ...config };\n}\n\n/**\n * Create and dispatch an alert\n */\nexport async function createAlert(\n type: AlertType,\n severity: AlertSeverity,\n title: string,\n message: string,\n source: string,\n metadata?: Record<string, unknown>\n): Promise<Alert> {\n const alert: Alert = {\n id: crypto.randomUUID(),\n type,\n severity,\n title,\n message,\n source,\n timestamp: new Date(),\n metadata,\n acknowledged: false,\n resolved: false,\n };\n\n activeAlerts.set(alert.id, alert);\n alertHistory.push(alert);\n\n // Dispatch to configured channels\n await dispatchAlert(alert);\n\n // Emit event\n alertEmitter.emit(\"alert\", alert);\n\n return alert;\n}\n\n/**\n * Dispatch alert to configured channels\n */\nasync function dispatchAlert(alert: Alert): Promise<void> {\n const promises: Promise<void>[] = [];\n\n if (channelConfig.console.enabled) {\n promises.push(dispatchToConsole(alert));\n }\n\n if (channelConfig.database.enabled) {\n promises.push(dispatchToDatabase(alert));\n }\n\n if (channelConfig.webhook.enabled && channelConfig.webhook.url) {\n promises.push(dispatchToWebhook(alert, channelConfig.webhook.url, channelConfig.webhook.headers));\n }\n\n // Telegram and email would need additional implementation\n // if (channelConfig.telegram.enabled) { ... }\n // if (channelConfig.email.enabled) { ... }\n\n await Promise.allSettled(promises);\n}\n\n/**\n * Dispatch alert to console\n */\nasync function dispatchToConsole(alert: Alert): Promise<void> {\n const severityColors: Record<AlertSeverity, string> = {\n info: \"\\x1b[36m\", // Cyan\n warning: \"\\x1b[33m\", // Yellow\n error: \"\\x1b[31m\", // Red\n critical: \"\\x1b[35m\", // Magenta\n };\n const reset = \"\\x1b[0m\";\n const color = severityColors[alert.severity];\n\n console.log(`${color}[ALERT ${alert.severity.toUpperCase()}]${reset} ${alert.title}`);\n console.log(` Source: ${alert.source}`);\n console.log(` Message: ${alert.message}`);\n if (alert.metadata) {\n console.log(` Metadata: ${JSON.stringify(alert.metadata)}`);\n }\n}\n\n/**\n * Dispatch alert to database (via error logs for now)\n */\nasync function dispatchToDatabase(alert: Alert): Promise<void> {\n await db.insert(errorLogs).values({\n source: \"alerting\",\n errorType: `Alert:${alert.type}`,\n errorCode: alert.severity,\n message: `${alert.title}: ${alert.message}`,\n context: alert.metadata,\n });\n}\n\n/**\n * Dispatch alert to webhook\n */\nasync function dispatchToWebhook(\n alert: Alert,\n url: string,\n headers?: Record<string, string>\n): Promise<void> {\n try {\n await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...headers,\n },\n body: JSON.stringify(alert),\n });\n } catch (error) {\n console.error(\"[Alerting] Failed to dispatch to webhook:\", error);\n }\n}\n\n/**\n * Acknowledge an alert\n */\nexport function acknowledgeAlert(alertId: string, acknowledgedBy?: string): boolean {\n const alert = activeAlerts.get(alertId);\n if (alert) {\n alert.acknowledged = true;\n alert.acknowledgedAt = new Date();\n alert.acknowledgedBy = acknowledgedBy;\n alertEmitter.emit(\"alert:acknowledged\", alert);\n return true;\n }\n return false;\n}\n\n/**\n * Resolve an alert\n */\nexport function resolveAlert(alertId: string, resolvedBy?: string): boolean {\n const alert = activeAlerts.get(alertId);\n if (alert) {\n alert.resolved = true;\n alert.resolvedAt = new Date();\n alert.resolvedBy = resolvedBy;\n activeAlerts.delete(alertId);\n alertEmitter.emit(\"alert:resolved\", alert);\n return true;\n }\n return false;\n}\n\n/**\n * Get active alerts\n */\nexport function getActiveAlerts(type?: AlertType, severity?: AlertSeverity): Alert[] {\n let alerts = Array.from(activeAlerts.values());\n\n if (type) {\n alerts = alerts.filter(a => a.type === type);\n }\n\n if (severity) {\n alerts = alerts.filter(a => a.severity === severity);\n }\n\n return alerts.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime());\n}\n\n/**\n * Get alert history\n */\nexport function getAlertHistory(limit: number = 100): Alert[] {\n return alertHistory.slice(-limit).reverse();\n}\n\n/**\n * Clear alert history (in-memory + DB)\n */\nexport function clearAlertHistory(): void {\n alertHistory.length = 0;\n activeAlerts.clear();\n // Also clear from DB (fire-and-forget)\n db.delete(errorLogs)\n .where(eq(errorLogs.source, \"alerting\"))\n .catch(() => {});\n}\n\n/**\n * Run all enabled alert rules\n */\nexport async function evaluateAlertRules(): Promise<Alert[]> {\n const triggeredAlerts: Alert[] = [];\n\n for (const rule of alertRules.values()) {\n if (!rule.enabled) continue;\n\n // Check cooldown\n if (rule.lastTriggered) {\n const cooldownMs = rule.cooldownMinutes * 60 * 1000;\n if (Date.now() - rule.lastTriggered.getTime() < cooldownMs) {\n continue;\n }\n }\n\n try {\n const shouldTrigger = await evaluateCondition(rule.condition);\n\n if (shouldTrigger) {\n rule.lastTriggered = new Date();\n rule.triggerCount++;\n\n const alert = await createAlert(\n rule.type,\n rule.severity,\n rule.name,\n rule.description,\n \"alert_rule\",\n { ruleId: rule.id, triggerCount: rule.triggerCount }\n );\n\n triggeredAlerts.push(alert);\n }\n } catch (error) {\n console.error(`[Alerting] Error evaluating rule ${rule.id}:`, error);\n }\n }\n\n return triggeredAlerts;\n}\n\n/**\n * Evaluate an alert condition\n */\nasync function evaluateCondition(condition: AlertCondition): Promise<boolean> {\n // Custom check function\n if (condition.customCheck) {\n return condition.customCheck();\n }\n\n // Metric-based check\n if (condition.metric && condition.operator !== \"anomaly\") {\n const windowMs = (condition.windowMinutes || 5) * 60 * 1000;\n const startDate = new Date(Date.now() - windowMs);\n\n const results = await db\n .select()\n .from(metrics)\n .where(\n and(\n eq(metrics.name, condition.metric),\n gte(metrics.timestamp, startDate)\n )\n );\n\n if (results.length === 0) return false;\n\n const values = results.map(r => r.value);\n let aggregatedValue: number;\n\n switch (condition.aggregation || \"avg\") {\n case \"sum\":\n aggregatedValue = values.reduce((a, b) => a + b, 0);\n break;\n case \"max\":\n aggregatedValue = Math.max(...values);\n break;\n case \"min\":\n aggregatedValue = Math.min(...values);\n break;\n case \"count\":\n aggregatedValue = values.length;\n break;\n case \"avg\":\n default:\n aggregatedValue = values.reduce((a, b) => a + b, 0) / values.length;\n }\n\n const threshold = condition.threshold || 0;\n\n switch (condition.operator) {\n case \"gt\":\n return aggregatedValue > threshold;\n case \"lt\":\n return aggregatedValue < threshold;\n case \"eq\":\n return aggregatedValue === threshold;\n case \"gte\":\n return aggregatedValue >= threshold;\n case \"lte\":\n return aggregatedValue <= threshold;\n default:\n return false;\n }\n }\n\n // Anomaly detection\n if (condition.operator === \"anomaly\" && condition.metric) {\n const anomaly = await detectAnomaly(condition.metric, condition.windowMinutes || 60);\n return anomaly.isAnomaly;\n }\n\n return false;\n}\n\n/**\n * Detect anomalies in a metric\n */\nexport async function detectAnomaly(\n metricName: string,\n windowMinutes: number = 60\n): Promise<AnomalyDetection> {\n const windowMs = windowMinutes * 60 * 1000;\n const now = Date.now();\n\n // Get historical data (past week for baseline)\n const baselineStart = new Date(now - 7 * 24 * 60 * 60 * 1000);\n const baselineEnd = new Date(now - windowMs);\n\n const baselineResults = await db\n .select()\n .from(metrics)\n .where(\n and(\n eq(metrics.name, metricName),\n gte(metrics.timestamp, baselineStart),\n lte(metrics.timestamp, baselineEnd)\n )\n );\n\n // Get current window data\n const currentStart = new Date(now - windowMs);\n const currentResults = await db\n .select()\n .from(metrics)\n .where(\n and(\n eq(metrics.name, metricName),\n gte(metrics.timestamp, currentStart)\n )\n );\n\n if (baselineResults.length < 10 || currentResults.length === 0) {\n return {\n metric: metricName,\n currentValue: currentResults.length > 0\n ? currentResults.reduce((a, b) => a + b.value, 0) / currentResults.length\n : 0,\n expectedValue: 0,\n deviation: 0,\n deviationPercent: 0,\n isAnomaly: false,\n confidence: 0,\n timestamp: new Date(),\n };\n }\n\n // Calculate baseline statistics\n const baselineValues = baselineResults.map(r => r.value);\n const baselineMean = baselineValues.reduce((a, b) => a + b, 0) / baselineValues.length;\n const baselineStdDev = Math.sqrt(\n baselineValues.reduce((sum, val) => sum + Math.pow(val - baselineMean, 2), 0) / baselineValues.length\n );\n\n // Calculate current value\n const currentValue = currentResults.reduce((a, b) => a + b.value, 0) / currentResults.length;\n\n // Calculate z-score\n const zScore = baselineStdDev > 0 ? (currentValue - baselineMean) / baselineStdDev : 0;\n const deviation = currentValue - baselineMean;\n const deviationPercent = baselineMean !== 0 ? (deviation / baselineMean) * 100 : 0;\n\n // Consider anomaly if z-score > 2 (95% confidence)\n const isAnomaly = Math.abs(zScore) > 2;\n\n // Calculate confidence based on data quality\n const confidence = Math.min(\n baselineResults.length / 100, // More data = higher confidence\n 1 - (1 / (1 + Math.abs(zScore))) // Higher z-score = higher confidence\n );\n\n return {\n metric: metricName,\n currentValue,\n expectedValue: baselineMean,\n deviation,\n deviationPercent,\n isAnomaly,\n confidence,\n timestamp: new Date(),\n };\n}\n\n/**\n * Calculate cost metrics\n */\nexport async function calculateCostMetrics(\n period: CostMetrics[\"period\"],\n startDate?: Date\n): Promise<CostMetrics> {\n const now = new Date();\n let periodStart: Date;\n\n switch (period) {\n case \"hourly\":\n periodStart = startDate || new Date(now.getTime() - 60 * 60 * 1000);\n break;\n case \"daily\":\n periodStart = startDate || new Date(now.getTime() - 24 * 60 * 60 * 1000);\n break;\n case \"weekly\":\n periodStart = startDate || new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n break;\n case \"monthly\":\n periodStart = startDate || new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000);\n break;\n }\n\n // Get input tokens\n const inputTokens = await db\n .select()\n .from(metrics)\n .where(\n and(\n eq(metrics.name, \"token_usage_input\"),\n gte(metrics.timestamp, periodStart)\n )\n );\n\n // Get output tokens\n const outputTokens = await db\n .select()\n .from(metrics)\n .where(\n and(\n eq(metrics.name, \"token_usage_output\"),\n gte(metrics.timestamp, periodStart)\n )\n );\n\n const totalInput = inputTokens.reduce((sum, m) => sum + m.value, 0);\n const totalOutput = outputTokens.reduce((sum, m) => sum + m.value, 0);\n\n const inputCost = (totalInput / 1_000_000) * TOKEN_COST_PER_MILLION_INPUT;\n const outputCost = (totalOutput / 1_000_000) * TOKEN_COST_PER_MILLION_OUTPUT;\n const totalCost = inputCost + outputCost;\n\n // Group by tags for breakdown\n const breakdown: CostBreakdown[] = [];\n\n // Group input tokens by source/tool if available\n const inputByTag = new Map<string, number>();\n for (const m of inputTokens) {\n const category = (m.tags as Record<string, string>)?.source || \"general\";\n inputByTag.set(category, (inputByTag.get(category) || 0) + m.value);\n }\n\n for (const [category, tokens] of inputByTag) {\n const cost = (tokens / 1_000_000) * TOKEN_COST_PER_MILLION_INPUT;\n breakdown.push({\n category: `input:${category}`,\n tokens,\n cost,\n percentage: totalCost > 0 ? (cost / totalCost) * 100 : 0,\n });\n }\n\n return {\n totalTokens: totalInput + totalOutput,\n inputTokens: totalInput,\n outputTokens: totalOutput,\n estimatedCost: totalCost,\n period,\n startDate: periodStart,\n endDate: now,\n breakdown,\n };\n}\n\n/**\n * Register a health check\n */\nexport function registerHealthCheck(\n name: string,\n check: () => Promise<{ status: \"healthy\" | \"degraded\" | \"unhealthy\"; message: string; metadata?: Record<string, unknown> }>\n): void {\n // Store the check function for periodic execution\n healthChecks.set(name, check);\n}\n\nconst healthChecks = new Map<string, () => Promise<{ status: \"healthy\" | \"degraded\" | \"unhealthy\"; message: string; metadata?: Record<string, unknown> }>>();\n\n/**\n * Run all health checks\n */\nexport async function runHealthChecks(): Promise<HealthCheckResult[]> {\n const results: HealthCheckResult[] = [];\n\n for (const [name, check] of healthChecks) {\n const startTime = Date.now();\n try {\n const result = await check();\n const checkResult: HealthCheckResult = {\n name,\n status: result.status,\n message: result.message,\n latencyMs: Date.now() - startTime,\n lastCheck: new Date(),\n metadata: result.metadata,\n };\n results.push(checkResult);\n healthCheckResults.set(name, checkResult);\n\n // Create alert if unhealthy\n if (result.status === \"unhealthy\") {\n await createAlert(\n \"health_check\",\n \"error\",\n `Health Check Failed: ${name}`,\n result.message,\n \"health_monitor\",\n result.metadata\n );\n } else if (result.status === \"degraded\") {\n await createAlert(\n \"health_check\",\n \"warning\",\n `Health Check Degraded: ${name}`,\n result.message,\n \"health_monitor\",\n result.metadata\n );\n }\n } catch (error) {\n const checkResult: HealthCheckResult = {\n name,\n status: \"unhealthy\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n latencyMs: Date.now() - startTime,\n lastCheck: new Date(),\n };\n results.push(checkResult);\n healthCheckResults.set(name, checkResult);\n\n await createAlert(\n \"health_check\",\n \"error\",\n `Health Check Error: ${name}`,\n checkResult.message,\n \"health_monitor\"\n );\n }\n }\n\n return results;\n}\n\n/**\n * Get health check results\n */\nexport function getHealthCheckResults(): HealthCheckResult[] {\n return Array.from(healthCheckResults.values());\n}\n\n/**\n * Initialize default health checks\n */\nexport function initializeDefaultHealthChecks(): void {\n // Database health check\n registerHealthCheck(\"database\", async () => {\n try {\n await db.select().from(metrics).limit(1);\n return { status: \"healthy\", message: \"Database connection is healthy\" };\n } catch (error) {\n return {\n status: \"unhealthy\",\n message: `Database connection failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n };\n }\n });\n\n // Memory health check\n registerHealthCheck(\"memory\", async () => {\n const memUsage = process.memoryUsage();\n const heapUsedPercent = (memUsage.heapUsed / memUsage.heapTotal) * 100;\n\n if (heapUsedPercent > 90) {\n return {\n status: \"unhealthy\",\n message: `Heap usage critical: ${heapUsedPercent.toFixed(1)}%`,\n metadata: { heapUsed: memUsage.heapUsed, heapTotal: memUsage.heapTotal },\n };\n } else if (heapUsedPercent > 75) {\n return {\n status: \"degraded\",\n message: `Heap usage high: ${heapUsedPercent.toFixed(1)}%`,\n metadata: { heapUsed: memUsage.heapUsed, heapTotal: memUsage.heapTotal },\n };\n }\n\n return {\n status: \"healthy\",\n message: `Heap usage: ${heapUsedPercent.toFixed(1)}%`,\n metadata: { heapUsed: memUsage.heapUsed, heapTotal: memUsage.heapTotal },\n };\n });\n\n // Error rate health check\n registerHealthCheck(\"error_rate\", async () => {\n const oneHourAgo = new Date(Date.now() - 60 * 60 * 1000);\n const errors = await db\n .select()\n .from(errorLogs)\n .where(gte(errorLogs.createdAt, oneHourAgo));\n\n const errorCount = errors.length;\n\n if (errorCount > 100) {\n return {\n status: \"unhealthy\",\n message: `High error rate: ${errorCount} errors in the last hour`,\n metadata: { errorCount },\n };\n } else if (errorCount > 50) {\n return {\n status: \"degraded\",\n message: `Elevated error rate: ${errorCount} errors in the last hour`,\n metadata: { errorCount },\n };\n }\n\n return {\n status: \"healthy\",\n message: `Error rate normal: ${errorCount} errors in the last hour`,\n metadata: { errorCount },\n };\n });\n}\n\n/**\n * Start the alerting system with periodic checks\n */\nexport function startAlertingSystem(intervalMs: number = 60000): void {\n // Initialize defaults\n initializeDefaultRules();\n initializeDefaultHealthChecks();\n\n // Run periodic checks\n setInterval(async () => {\n try {\n await evaluateAlertRules();\n await runHealthChecks();\n } catch (error) {\n console.error(\"[Alerting] Error in periodic check:\", error);\n }\n }, intervalMs);\n\n console.log(`[Alerting] System started with ${intervalMs}ms check interval`);\n}\n\n/**\n * Get alerting system status\n */\nexport function getAlertingStatus(): {\n activeAlerts: number;\n totalRules: number;\n enabledRules: number;\n healthChecks: number;\n healthyChecks: number;\n lastEvaluation?: Date;\n} {\n const healthResults = getHealthCheckResults();\n return {\n activeAlerts: activeAlerts.size,\n totalRules: alertRules.size,\n enabledRules: Array.from(alertRules.values()).filter(r => r.enabled).length,\n healthChecks: healthChecks.size,\n healthyChecks: healthResults.filter(r => r.status === \"healthy\").length,\n };\n}\n\n/**\n * Format alert for display\n */\nexport function formatAlert(alert: Alert): string {\n const lines: string[] = [];\n\n lines.push(`=== Alert: ${alert.title} ===`);\n lines.push(`ID: ${alert.id}`);\n lines.push(`Type: ${alert.type}`);\n lines.push(`Severity: ${alert.severity.toUpperCase()}`);\n lines.push(`Source: ${alert.source}`);\n lines.push(`Time: ${alert.timestamp.toISOString()}`);\n lines.push(\"\");\n lines.push(`Message: ${alert.message}`);\n\n if (alert.metadata) {\n lines.push(\"\");\n lines.push(\"Metadata:\");\n for (const [key, value] of Object.entries(alert.metadata)) {\n lines.push(` ${key}: ${JSON.stringify(value)}`);\n }\n }\n\n lines.push(\"\");\n lines.push(`Status: ${alert.resolved ? \"Resolved\" : alert.acknowledged ? \"Acknowledged\" : \"Active\"}`);\n\n return lines.join(\"\\n\");\n}\n"],"mappings":";;;;;;;;;;;AASA,SAAS,IAAI,KAAK,KAAK,KAAK,YAAiB;AAC7C,SAAS,oBAAoB;AA4G7B,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AAGtC,IAAM,eAAe,oBAAI,IAAmB;AAC5C,IAAM,aAAa,oBAAI,IAAuB;AAC9C,IAAM,qBAAqB,oBAAI,IAA+B;AAC9D,IAAM,eAAwB,CAAC;AAGxB,IAAM,eAAe,IAAI,aAAa;AAG7C,IAAI,gBAAoC;AAAA,EACtC,SAAS,EAAE,SAAS,KAAK;AAAA,EACzB,UAAU,EAAE,SAAS,MAAM;AAAA,EAC3B,SAAS,EAAE,SAAS,MAAM;AAAA,EAC1B,OAAO,EAAE,SAAS,MAAM;AAAA,EACxB,UAAU,EAAE,SAAS,KAAK;AAC5B;AAKA,IAAI,gBAAgB;AACpB,eAAsB,yBAAwC;AAC5D,MAAI,cAAe;AACnB,MAAI;AACF,UAAM,OAAO,MAAM,GAChB,OAAO,EACP,KAAK,SAAS,EACd,MAAM,GAAG,UAAU,QAAQ,UAAU,CAAC,EACtC,QAAQ,KAAK,UAAU,SAAS,CAAC,EACjC,MAAM,GAAG;AAEZ,eAAW,OAAO,KAAK,QAAQ,GAAG;AAEhC,YAAM,YAAa,IAAI,WAAW,QAAQ,UAAU,EAAE,KAAK;AAC3D,YAAM,WAAY,IAAI,aAAa;AACnC,YAAM,CAAC,OAAO,GAAG,QAAQ,KAAK,IAAI,WAAW,IAAI,MAAM,IAAI;AAC3D,YAAM,QAAe;AAAA,QACnB,IAAI,OAAO,IAAI,EAAE;AAAA,QACjB,MAAM;AAAA,QACN;AAAA,QACA,OAAO,SAAS;AAAA,QAChB,SAAS,SAAS,KAAK,IAAI,KAAK,IAAI,WAAW;AAAA,QAC/C,QAAQ;AAAA,QACR,WAAW,IAAI,KAAK,IAAI,SAAS;AAAA,QACjC,UAAW,IAAI,WAAW,CAAC;AAAA,QAC3B,cAAc;AAAA,QACd,UAAU;AAAA;AAAA,MACZ;AACA,mBAAa,KAAK,KAAK;AAAA,IACzB;AACA,oBAAgB;AAChB,QAAI,aAAa,SAAS,GAAG;AAC3B,cAAQ,IAAI,qBAAqB,aAAa,MAAM,4BAA4B;AAAA,IAClF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAKO,SAAS,yBAA+B;AAE7C,eAAa;AAAA,IACX,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,MACX,eAAe;AAAA,MACf,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,UAAU,CAAC,WAAW,UAAU;AAAA,IAChC,cAAc;AAAA,EAChB,CAAC;AAGD,eAAa;AAAA,IACX,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,MACX,eAAe;AAAA,MACf,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,UAAU,CAAC,WAAW,UAAU;AAAA,IAChC,cAAc;AAAA,EAChB,CAAC;AAGD,eAAa;AAAA,IACX,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,MACX,eAAe;AAAA;AAAA,IACjB;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,UAAU,CAAC,WAAW,UAAU;AAAA,IAChC,cAAc;AAAA,EAChB,CAAC;AAGD,eAAa;AAAA,IACX,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,eAAe;AAAA,IACjB;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,UAAU,CAAC,WAAW,UAAU;AAAA,IAChC,cAAc;AAAA,EAChB,CAAC;AAGD,eAAa;AAAA,IACX,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,UAAU,CAAC,WAAW,UAAU;AAAA,IAChC,cAAc;AAAA,EAChB,CAAC;AAGD,eAAa;AAAA,IACX,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,WAAW;AAAA,MACX,eAAe;AAAA,MACf,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,UAAU,CAAC,WAAW,UAAU;AAAA,IAChC,cAAc;AAAA,EAChB,CAAC;AACH;AAKO,SAAS,aAAa,MAAuB;AAClD,aAAW,IAAI,KAAK,IAAI,IAAI;AAC9B;AAKO,SAAS,gBAAgB,QAAyB;AACvD,SAAO,WAAW,OAAO,MAAM;AACjC;AAKO,SAAS,gBAA6B;AAC3C,SAAO,MAAM,KAAK,WAAW,OAAO,CAAC;AACvC;AAKO,SAAS,eAAe,QAAgB,SAA2B;AACxE,QAAM,OAAO,WAAW,IAAI,MAAM;AAClC,MAAI,MAAM;AACR,SAAK,UAAU;AACf,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKO,SAAS,kBAAkB,QAA2C;AAC3E,kBAAgB,EAAE,GAAG,eAAe,GAAG,OAAO;AAChD;AAKA,eAAsB,YACpB,MACA,UACA,OACA,SACA,QACA,UACgB;AAChB,QAAM,QAAe;AAAA,IACnB,IAAI,OAAO,WAAW;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,oBAAI,KAAK;AAAA,IACpB;AAAA,IACA,cAAc;AAAA,IACd,UAAU;AAAA,EACZ;AAEA,eAAa,IAAI,MAAM,IAAI,KAAK;AAChC,eAAa,KAAK,KAAK;AAGvB,QAAM,cAAc,KAAK;AAGzB,eAAa,KAAK,SAAS,KAAK;AAEhC,SAAO;AACT;AAKA,eAAe,cAAc,OAA6B;AACxD,QAAM,WAA4B,CAAC;AAEnC,MAAI,cAAc,QAAQ,SAAS;AACjC,aAAS,KAAK,kBAAkB,KAAK,CAAC;AAAA,EACxC;AAEA,MAAI,cAAc,SAAS,SAAS;AAClC,aAAS,KAAK,mBAAmB,KAAK,CAAC;AAAA,EACzC;AAEA,MAAI,cAAc,QAAQ,WAAW,cAAc,QAAQ,KAAK;AAC9D,aAAS,KAAK,kBAAkB,OAAO,cAAc,QAAQ,KAAK,cAAc,QAAQ,OAAO,CAAC;AAAA,EAClG;AAMA,QAAM,QAAQ,WAAW,QAAQ;AACnC;AAKA,eAAe,kBAAkB,OAA6B;AAC5D,QAAM,iBAAgD;AAAA,IACpD,MAAM;AAAA;AAAA,IACN,SAAS;AAAA;AAAA,IACT,OAAO;AAAA;AAAA,IACP,UAAU;AAAA;AAAA,EACZ;AACA,QAAM,QAAQ;AACd,QAAM,QAAQ,eAAe,MAAM,QAAQ;AAE3C,UAAQ,IAAI,GAAG,KAAK,UAAU,MAAM,SAAS,YAAY,CAAC,IAAI,KAAK,IAAI,MAAM,KAAK,EAAE;AACpF,UAAQ,IAAI,aAAa,MAAM,MAAM,EAAE;AACvC,UAAQ,IAAI,cAAc,MAAM,OAAO,EAAE;AACzC,MAAI,MAAM,UAAU;AAClB,YAAQ,IAAI,eAAe,KAAK,UAAU,MAAM,QAAQ,CAAC,EAAE;AAAA,EAC7D;AACF;AAKA,eAAe,mBAAmB,OAA6B;AAC7D,QAAM,GAAG,OAAO,SAAS,EAAE,OAAO;AAAA,IAChC,QAAQ;AAAA,IACR,WAAW,SAAS,MAAM,IAAI;AAAA,IAC9B,WAAW,MAAM;AAAA,IACjB,SAAS,GAAG,MAAM,KAAK,KAAK,MAAM,OAAO;AAAA,IACzC,SAAS,MAAM;AAAA,EACjB,CAAC;AACH;AAKA,eAAe,kBACb,OACA,KACA,SACe;AACf,MAAI;AACF,UAAM,MAAM,KAAK;AAAA,MACf,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG;AAAA,MACL;AAAA,MACA,MAAM,KAAK,UAAU,KAAK;AAAA,IAC5B,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,6CAA6C,KAAK;AAAA,EAClE;AACF;AAKO,SAAS,iBAAiB,SAAiB,gBAAkC;AAClF,QAAM,QAAQ,aAAa,IAAI,OAAO;AACtC,MAAI,OAAO;AACT,UAAM,eAAe;AACrB,UAAM,iBAAiB,oBAAI,KAAK;AAChC,UAAM,iBAAiB;AACvB,iBAAa,KAAK,sBAAsB,KAAK;AAC7C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKO,SAAS,aAAa,SAAiB,YAA8B;AAC1E,QAAM,QAAQ,aAAa,IAAI,OAAO;AACtC,MAAI,OAAO;AACT,UAAM,WAAW;AACjB,UAAM,aAAa,oBAAI,KAAK;AAC5B,UAAM,aAAa;AACnB,iBAAa,OAAO,OAAO;AAC3B,iBAAa,KAAK,kBAAkB,KAAK;AACzC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAKO,SAAS,gBAAgB,MAAkB,UAAmC;AACnF,MAAI,SAAS,MAAM,KAAK,aAAa,OAAO,CAAC;AAE7C,MAAI,MAAM;AACR,aAAS,OAAO,OAAO,OAAK,EAAE,SAAS,IAAI;AAAA,EAC7C;AAEA,MAAI,UAAU;AACZ,aAAS,OAAO,OAAO,OAAK,EAAE,aAAa,QAAQ;AAAA,EACrD;AAEA,SAAO,OAAO,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,QAAQ,IAAI,EAAE,UAAU,QAAQ,CAAC;AAC5E;AAKO,SAAS,gBAAgB,QAAgB,KAAc;AAC5D,SAAO,aAAa,MAAM,CAAC,KAAK,EAAE,QAAQ;AAC5C;AAKO,SAAS,oBAA0B;AACxC,eAAa,SAAS;AACtB,eAAa,MAAM;AAEnB,KAAG,OAAO,SAAS,EAChB,MAAM,GAAG,UAAU,QAAQ,UAAU,CAAC,EACtC,MAAM,MAAM;AAAA,EAAC,CAAC;AACnB;AAKA,eAAsB,qBAAuC;AAC3D,QAAM,kBAA2B,CAAC;AAElC,aAAW,QAAQ,WAAW,OAAO,GAAG;AACtC,QAAI,CAAC,KAAK,QAAS;AAGnB,QAAI,KAAK,eAAe;AACtB,YAAM,aAAa,KAAK,kBAAkB,KAAK;AAC/C,UAAI,KAAK,IAAI,IAAI,KAAK,cAAc,QAAQ,IAAI,YAAY;AAC1D;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AACF,YAAM,gBAAgB,MAAM,kBAAkB,KAAK,SAAS;AAE5D,UAAI,eAAe;AACjB,aAAK,gBAAgB,oBAAI,KAAK;AAC9B,aAAK;AAEL,cAAM,QAAQ,MAAM;AAAA,UAClB,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL,KAAK;AAAA,UACL;AAAA,UACA,EAAE,QAAQ,KAAK,IAAI,cAAc,KAAK,aAAa;AAAA,QACrD;AAEA,wBAAgB,KAAK,KAAK;AAAA,MAC5B;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,MAAM,oCAAoC,KAAK,EAAE,KAAK,KAAK;AAAA,IACrE;AAAA,EACF;AAEA,SAAO;AACT;AAKA,eAAe,kBAAkB,WAA6C;AAE5E,MAAI,UAAU,aAAa;AACzB,WAAO,UAAU,YAAY;AAAA,EAC/B;AAGA,MAAI,UAAU,UAAU,UAAU,aAAa,WAAW;AACxD,UAAM,YAAY,UAAU,iBAAiB,KAAK,KAAK;AACvD,UAAM,YAAY,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ;AAEhD,UAAM,UAAU,MAAM,GACnB,OAAO,EACP,KAAK,OAAO,EACZ;AAAA,MACC;AAAA,QACE,GAAG,QAAQ,MAAM,UAAU,MAAM;AAAA,QACjC,IAAI,QAAQ,WAAW,SAAS;AAAA,MAClC;AAAA,IACF;AAEF,QAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,UAAM,SAAS,QAAQ,IAAI,OAAK,EAAE,KAAK;AACvC,QAAI;AAEJ,YAAQ,UAAU,eAAe,OAAO;AAAA,MACtC,KAAK;AACH,0BAAkB,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAClD;AAAA,MACF,KAAK;AACH,0BAAkB,KAAK,IAAI,GAAG,MAAM;AACpC;AAAA,MACF,KAAK;AACH,0BAAkB,KAAK,IAAI,GAAG,MAAM;AACpC;AAAA,MACF,KAAK;AACH,0BAAkB,OAAO;AACzB;AAAA,MACF,KAAK;AAAA,MACL;AACE,0BAAkB,OAAO,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,OAAO;AAAA,IACjE;AAEA,UAAM,YAAY,UAAU,aAAa;AAEzC,YAAQ,UAAU,UAAU;AAAA,MAC1B,KAAK;AACH,eAAO,kBAAkB;AAAA,MAC3B,KAAK;AACH,eAAO,kBAAkB;AAAA,MAC3B,KAAK;AACH,eAAO,oBAAoB;AAAA,MAC7B,KAAK;AACH,eAAO,mBAAmB;AAAA,MAC5B,KAAK;AACH,eAAO,mBAAmB;AAAA,MAC5B;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAGA,MAAI,UAAU,aAAa,aAAa,UAAU,QAAQ;AACxD,UAAM,UAAU,MAAM,cAAc,UAAU,QAAQ,UAAU,iBAAiB,EAAE;AACnF,WAAO,QAAQ;AAAA,EACjB;AAEA,SAAO;AACT;AAKA,eAAsB,cACpB,YACA,gBAAwB,IACG;AAC3B,QAAM,WAAW,gBAAgB,KAAK;AACtC,QAAM,MAAM,KAAK,IAAI;AAGrB,QAAM,gBAAgB,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,GAAI;AAC5D,QAAM,cAAc,IAAI,KAAK,MAAM,QAAQ;AAE3C,QAAM,kBAAkB,MAAM,GAC3B,OAAO,EACP,KAAK,OAAO,EACZ;AAAA,IACC;AAAA,MACE,GAAG,QAAQ,MAAM,UAAU;AAAA,MAC3B,IAAI,QAAQ,WAAW,aAAa;AAAA,MACpC,IAAI,QAAQ,WAAW,WAAW;AAAA,IACpC;AAAA,EACF;AAGF,QAAM,eAAe,IAAI,KAAK,MAAM,QAAQ;AAC5C,QAAM,iBAAiB,MAAM,GAC1B,OAAO,EACP,KAAK,OAAO,EACZ;AAAA,IACC;AAAA,MACE,GAAG,QAAQ,MAAM,UAAU;AAAA,MAC3B,IAAI,QAAQ,WAAW,YAAY;AAAA,IACrC;AAAA,EACF;AAEF,MAAI,gBAAgB,SAAS,MAAM,eAAe,WAAW,GAAG;AAC9D,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,cAAc,eAAe,SAAS,IAClC,eAAe,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,CAAC,IAAI,eAAe,SACjE;AAAA,MACJ,eAAe;AAAA,MACf,WAAW;AAAA,MACX,kBAAkB;AAAA,MAClB,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,WAAW,oBAAI,KAAK;AAAA,IACtB;AAAA,EACF;AAGA,QAAM,iBAAiB,gBAAgB,IAAI,OAAK,EAAE,KAAK;AACvD,QAAM,eAAe,eAAe,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,eAAe;AAChF,QAAM,iBAAiB,KAAK;AAAA,IAC1B,eAAe,OAAO,CAAC,KAAK,QAAQ,MAAM,KAAK,IAAI,MAAM,cAAc,CAAC,GAAG,CAAC,IAAI,eAAe;AAAA,EACjG;AAGA,QAAM,eAAe,eAAe,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,OAAO,CAAC,IAAI,eAAe;AAGtF,QAAM,SAAS,iBAAiB,KAAK,eAAe,gBAAgB,iBAAiB;AACrF,QAAM,YAAY,eAAe;AACjC,QAAM,mBAAmB,iBAAiB,IAAK,YAAY,eAAgB,MAAM;AAGjF,QAAM,YAAY,KAAK,IAAI,MAAM,IAAI;AAGrC,QAAM,aAAa,KAAK;AAAA,IACtB,gBAAgB,SAAS;AAAA;AAAA,IACzB,IAAK,KAAK,IAAI,KAAK,IAAI,MAAM;AAAA;AAAA,EAC/B;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,oBAAI,KAAK;AAAA,EACtB;AACF;AAKA,eAAsB,qBACpB,QACA,WACsB;AACtB,QAAM,MAAM,oBAAI,KAAK;AACrB,MAAI;AAEJ,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,oBAAc,aAAa,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,GAAI;AAClE;AAAA,IACF,KAAK;AACH,oBAAc,aAAa,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,KAAK,GAAI;AACvE;AAAA,IACF,KAAK;AACH,oBAAc,aAAa,IAAI,KAAK,IAAI,QAAQ,IAAI,IAAI,KAAK,KAAK,KAAK,GAAI;AAC3E;AAAA,IACF,KAAK;AACH,oBAAc,aAAa,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK,KAAK,KAAK,KAAK,GAAI;AAC5E;AAAA,EACJ;AAGA,QAAM,cAAc,MAAM,GACvB,OAAO,EACP,KAAK,OAAO,EACZ;AAAA,IACC;AAAA,MACE,GAAG,QAAQ,MAAM,mBAAmB;AAAA,MACpC,IAAI,QAAQ,WAAW,WAAW;AAAA,IACpC;AAAA,EACF;AAGF,QAAM,eAAe,MAAM,GACxB,OAAO,EACP,KAAK,OAAO,EACZ;AAAA,IACC;AAAA,MACE,GAAG,QAAQ,MAAM,oBAAoB;AAAA,MACrC,IAAI,QAAQ,WAAW,WAAW;AAAA,IACpC;AAAA,EACF;AAEF,QAAM,aAAa,YAAY,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AAClE,QAAM,cAAc,aAAa,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,CAAC;AAEpE,QAAM,YAAa,aAAa,MAAa;AAC7C,QAAM,aAAc,cAAc,MAAa;AAC/C,QAAM,YAAY,YAAY;AAG9B,QAAM,YAA6B,CAAC;AAGpC,QAAM,aAAa,oBAAI,IAAoB;AAC3C,aAAW,KAAK,aAAa;AAC3B,UAAM,WAAY,EAAE,MAAiC,UAAU;AAC/D,eAAW,IAAI,WAAW,WAAW,IAAI,QAAQ,KAAK,KAAK,EAAE,KAAK;AAAA,EACpE;AAEA,aAAW,CAAC,UAAU,MAAM,KAAK,YAAY;AAC3C,UAAM,OAAQ,SAAS,MAAa;AACpC,cAAU,KAAK;AAAA,MACb,UAAU,SAAS,QAAQ;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,YAAY,YAAY,IAAK,OAAO,YAAa,MAAM;AAAA,IACzD,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,aAAa,aAAa;AAAA,IAC1B,aAAa;AAAA,IACb,cAAc;AAAA,IACd,eAAe;AAAA,IACf;AAAA,IACA,WAAW;AAAA,IACX,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAKO,SAAS,oBACd,MACA,OACM;AAEN,eAAa,IAAI,MAAM,KAAK;AAC9B;AAEA,IAAM,eAAe,oBAAI,IAAkI;AAK3J,eAAsB,kBAAgD;AACpE,QAAM,UAA+B,CAAC;AAEtC,aAAW,CAAC,MAAM,KAAK,KAAK,cAAc;AACxC,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,SAAS,MAAM,MAAM;AAC3B,YAAM,cAAiC;AAAA,QACrC;AAAA,QACA,QAAQ,OAAO;AAAA,QACf,SAAS,OAAO;AAAA,QAChB,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,WAAW,oBAAI,KAAK;AAAA,QACpB,UAAU,OAAO;AAAA,MACnB;AACA,cAAQ,KAAK,WAAW;AACxB,yBAAmB,IAAI,MAAM,WAAW;AAGxC,UAAI,OAAO,WAAW,aAAa;AACjC,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,wBAAwB,IAAI;AAAA,UAC5B,OAAO;AAAA,UACP;AAAA,UACA,OAAO;AAAA,QACT;AAAA,MACF,WAAW,OAAO,WAAW,YAAY;AACvC,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,0BAA0B,IAAI;AAAA,UAC9B,OAAO;AAAA,UACP;AAAA,UACA,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,cAAiC;AAAA,QACrC;AAAA,QACA,QAAQ;AAAA,QACR,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QAClD,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,WAAW,oBAAI,KAAK;AAAA,MACtB;AACA,cAAQ,KAAK,WAAW;AACxB,yBAAmB,IAAI,MAAM,WAAW;AAExC,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA,uBAAuB,IAAI;AAAA,QAC3B,YAAY;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,wBAA6C;AAC3D,SAAO,MAAM,KAAK,mBAAmB,OAAO,CAAC;AAC/C;AAKO,SAAS,gCAAsC;AAEpD,sBAAoB,YAAY,YAAY;AAC1C,QAAI;AACF,YAAM,GAAG,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,CAAC;AACvC,aAAO,EAAE,QAAQ,WAAW,SAAS,iCAAiC;AAAA,IACxE,SAAS,OAAO;AACd,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,eAAe;AAAA,MAClG;AAAA,IACF;AAAA,EACF,CAAC;AAGD,sBAAoB,UAAU,YAAY;AACxC,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,kBAAmB,SAAS,WAAW,SAAS,YAAa;AAEnE,QAAI,kBAAkB,IAAI;AACxB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,wBAAwB,gBAAgB,QAAQ,CAAC,CAAC;AAAA,QAC3D,UAAU,EAAE,UAAU,SAAS,UAAU,WAAW,SAAS,UAAU;AAAA,MACzE;AAAA,IACF,WAAW,kBAAkB,IAAI;AAC/B,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,oBAAoB,gBAAgB,QAAQ,CAAC,CAAC;AAAA,QACvD,UAAU,EAAE,UAAU,SAAS,UAAU,WAAW,SAAS,UAAU;AAAA,MACzE;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,eAAe,gBAAgB,QAAQ,CAAC,CAAC;AAAA,MAClD,UAAU,EAAE,UAAU,SAAS,UAAU,WAAW,SAAS,UAAU;AAAA,IACzE;AAAA,EACF,CAAC;AAGD,sBAAoB,cAAc,YAAY;AAC5C,UAAM,aAAa,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,GAAI;AACvD,UAAM,SAAS,MAAM,GAClB,OAAO,EACP,KAAK,SAAS,EACd,MAAM,IAAI,UAAU,WAAW,UAAU,CAAC;AAE7C,UAAM,aAAa,OAAO;AAE1B,QAAI,aAAa,KAAK;AACpB,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,oBAAoB,UAAU;AAAA,QACvC,UAAU,EAAE,WAAW;AAAA,MACzB;AAAA,IACF,WAAW,aAAa,IAAI;AAC1B,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,wBAAwB,UAAU;AAAA,QAC3C,UAAU,EAAE,WAAW;AAAA,MACzB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,sBAAsB,UAAU;AAAA,MACzC,UAAU,EAAE,WAAW;AAAA,IACzB;AAAA,EACF,CAAC;AACH;AAKO,SAAS,oBAAoB,aAAqB,KAAa;AAEpE,yBAAuB;AACvB,gCAA8B;AAG9B,cAAY,YAAY;AACtB,QAAI;AACF,YAAM,mBAAmB;AACzB,YAAM,gBAAgB;AAAA,IACxB,SAAS,OAAO;AACd,cAAQ,MAAM,uCAAuC,KAAK;AAAA,IAC5D;AAAA,EACF,GAAG,UAAU;AAEb,UAAQ,IAAI,kCAAkC,UAAU,mBAAmB;AAC7E;AAKO,SAAS,oBAOd;AACA,QAAM,gBAAgB,sBAAsB;AAC5C,SAAO;AAAA,IACL,cAAc,aAAa;AAAA,IAC3B,YAAY,WAAW;AAAA,IACvB,cAAc,MAAM,KAAK,WAAW,OAAO,CAAC,EAAE,OAAO,OAAK,EAAE,OAAO,EAAE;AAAA,IACrE,cAAc,aAAa;AAAA,IAC3B,eAAe,cAAc,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAAA,EACnE;AACF;AAKO,SAAS,YAAY,OAAsB;AAChD,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,cAAc,MAAM,KAAK,MAAM;AAC1C,QAAM,KAAK,OAAO,MAAM,EAAE,EAAE;AAC5B,QAAM,KAAK,SAAS,MAAM,IAAI,EAAE;AAChC,QAAM,KAAK,aAAa,MAAM,SAAS,YAAY,CAAC,EAAE;AACtD,QAAM,KAAK,WAAW,MAAM,MAAM,EAAE;AACpC,QAAM,KAAK,SAAS,MAAM,UAAU,YAAY,CAAC,EAAE;AACnD,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,YAAY,MAAM,OAAO,EAAE;AAEtC,MAAI,MAAM,UAAU;AAClB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,WAAW;AACtB,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,QAAQ,GAAG;AACzD,YAAM,KAAK,KAAK,GAAG,KAAK,KAAK,UAAU,KAAK,CAAC,EAAE;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,WAAW,MAAM,WAAW,aAAa,MAAM,eAAe,iBAAiB,QAAQ,EAAE;AAEpG,SAAO,MAAM,KAAK,IAAI;AACxB;","names":[]}
|