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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/security/incident-response.ts"],"sourcesContent":["// SOC 2 Incident Response System\r\n// Manages security incident lifecycle: creation, investigation, containment, resolution\r\n\r\nimport { db } from \"../../db\";\r\nimport { securityIncidents, incidentTimeline, users } from \"../../db/schema\";\r\nimport { eq, or, desc } from \"drizzle-orm\";\r\nimport { logAudit } from \"./audit-logger\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// Type aliases (matching the schema column types)\r\n// ---------------------------------------------------------------------------\r\n\r\ntype IncidentType =\r\n | \"brute_force\"\r\n | \"unauthorized_access\"\r\n | \"data_breach\"\r\n | \"suspicious_activity\"\r\n | \"system_compromise\"\r\n | \"policy_violation\";\r\n\r\ntype IncidentSeverity = \"low\" | \"medium\" | \"high\" | \"critical\";\r\n\r\ntype IncidentStatus =\r\n | \"open\"\r\n | \"investigating\"\r\n | \"contained\"\r\n | \"resolved\"\r\n | \"closed\";\r\n\r\n// ---------------------------------------------------------------------------\r\n// Helpers\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Generate a unique incident number in the format INC-YYYYMMDD-XXXX\r\n * where XXXX is 4 random uppercase alphanumeric characters.\r\n */\r\nexport function generateIncidentNumber(): string {\r\n const now = new Date();\r\n const yyyy = now.getFullYear().toString();\r\n const mm = (now.getMonth() + 1).toString().padStart(2, \"0\");\r\n const dd = now.getDate().toString().padStart(2, \"0\");\r\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\r\n let suffix = \"\";\r\n for (let i = 0; i < 4; i++) {\r\n suffix += chars.charAt(Math.floor(Math.random() * chars.length));\r\n }\r\n return `INC-${yyyy}${mm}${dd}-${suffix}`;\r\n}\r\n\r\n/**\r\n * Map an anomaly type string (from AuthMonitor) to the corresponding\r\n * incident type and severity.\r\n */\r\nexport function mapAnomalyToIncident(anomalyType: string): {\r\n type: IncidentType;\r\n severity: IncidentSeverity;\r\n} {\r\n switch (anomalyType) {\r\n case \"brute_force\":\r\n return { type: \"brute_force\", severity: \"critical\" };\r\n case \"impossible_travel\":\r\n return { type: \"unauthorized_access\", severity: \"high\" };\r\n case \"new_device\":\r\n return { type: \"suspicious_activity\", severity: \"medium\" };\r\n case \"new_ip\":\r\n return { type: \"suspicious_activity\", severity: \"low\" };\r\n case \"rapid_session_switching\":\r\n return { type: \"suspicious_activity\", severity: \"medium\" };\r\n case \"unusual_time\":\r\n return { type: \"suspicious_activity\", severity: \"low\" };\r\n default:\r\n return { type: \"suspicious_activity\", severity: \"medium\" };\r\n }\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Core CRUD\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Create a new security incident, add the initial \"created\" timeline event,\r\n * and emit an audit log entry.\r\n */\r\nexport async function createIncident(params: {\r\n title: string;\r\n description: string;\r\n type: IncidentType;\r\n severity: IncidentSeverity;\r\n userId?: string;\r\n source: string;\r\n sourceData?: unknown;\r\n assignedTo?: string;\r\n}) {\r\n const incidentNumber = generateIncidentNumber();\r\n\r\n const [incident] = await db\r\n .insert(securityIncidents)\r\n .values({\r\n incidentNumber,\r\n title: params.title,\r\n description: params.description,\r\n type: params.type,\r\n severity: params.severity,\r\n status: \"open\",\r\n userId: params.userId,\r\n assignedTo: params.assignedTo,\r\n source: params.source,\r\n sourceData: params.sourceData as any,\r\n })\r\n .returning();\r\n\r\n // Add \"created\" timeline event\r\n await addTimelineEvent({\r\n incidentId: incident.id,\r\n eventType: \"created\",\r\n description: `Incident ${incidentNumber} created: ${params.title}`,\r\n performedBy: params.userId,\r\n metadata: {\r\n type: params.type,\r\n severity: params.severity,\r\n source: params.source,\r\n },\r\n });\r\n\r\n // Audit log\r\n try {\r\n await logAudit({\r\n userId: params.userId,\r\n action: \"tool_use\" as any,\r\n resource: \"tool\" as any,\r\n resourceId: incident.id,\r\n details: {\r\n event: \"incident_created\",\r\n incidentNumber,\r\n type: params.type,\r\n severity: params.severity,\r\n source: params.source,\r\n },\r\n });\r\n } catch {\r\n // Audit logging should not block incident creation\r\n }\r\n\r\n return incident;\r\n}\r\n\r\n/**\r\n * Create an incident automatically from an AuthMonitor anomaly.\r\n */\r\nexport async function createIncidentFromAnomaly(\r\n userId: string,\r\n anomaly: {\r\n type: string;\r\n level: string;\r\n message: string;\r\n details?: unknown;\r\n timestamp: Date;\r\n }\r\n) {\r\n const { type, severity } = mapAnomalyToIncident(anomaly.type);\r\n\r\n return createIncident({\r\n title: `[Auto] ${anomaly.message}`,\r\n description: `Automatically created from ${anomaly.type} anomaly detected at ${anomaly.timestamp.toISOString()}.\\n\\nLevel: ${anomaly.level}\\nMessage: ${anomaly.message}`,\r\n type,\r\n severity,\r\n userId,\r\n source: \"auth_monitor\",\r\n sourceData: {\r\n anomalyType: anomaly.type,\r\n anomalyLevel: anomaly.level,\r\n details: anomaly.details,\r\n detectedAt: anomaly.timestamp.toISOString(),\r\n },\r\n });\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Status management\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Transition an incident to a new status, updating the appropriate timestamp\r\n * field and recording a timeline event.\r\n */\r\nexport async function updateIncidentStatus(\r\n incidentId: string,\r\n newStatus: IncidentStatus,\r\n performedBy?: string,\r\n notes?: string\r\n) {\r\n const updateData: Record<string, unknown> = {\r\n status: newStatus,\r\n updatedAt: new Date(),\r\n };\r\n\r\n switch (newStatus) {\r\n case \"investigating\":\r\n updateData.investigatedAt = new Date();\r\n break;\r\n case \"contained\":\r\n updateData.containedAt = new Date();\r\n break;\r\n case \"resolved\":\r\n updateData.resolvedAt = new Date();\r\n if (notes) {\r\n updateData.resolutionNotes = notes;\r\n }\r\n break;\r\n case \"closed\":\r\n updateData.closedAt = new Date();\r\n break;\r\n }\r\n\r\n const [updated] = await db\r\n .update(securityIncidents)\r\n .set(updateData)\r\n .where(eq(securityIncidents.id, incidentId))\r\n .returning();\r\n\r\n // Timeline event\r\n await addTimelineEvent({\r\n incidentId,\r\n eventType: \"status_change\",\r\n description: `Status changed to ${newStatus}${notes ? `: ${notes}` : \"\"}`,\r\n performedBy,\r\n metadata: { newStatus, notes },\r\n });\r\n\r\n return updated;\r\n}\r\n\r\n/**\r\n * Assign an incident to a user and record the assignment in the timeline.\r\n */\r\nexport async function assignIncident(\r\n incidentId: string,\r\n assignedTo: string,\r\n performedBy?: string\r\n) {\r\n const [updated] = await db\r\n .update(securityIncidents)\r\n .set({ assignedTo, updatedAt: new Date() })\r\n .where(eq(securityIncidents.id, incidentId))\r\n .returning();\r\n\r\n await addTimelineEvent({\r\n incidentId,\r\n eventType: \"assignment\",\r\n description: `Incident assigned to ${assignedTo}`,\r\n performedBy,\r\n metadata: { assignedTo },\r\n });\r\n\r\n return updated;\r\n}\r\n\r\n/**\r\n * Add a timeline event to an incident.\r\n */\r\nexport async function addTimelineEvent(params: {\r\n incidentId: string;\r\n eventType: string;\r\n description: string;\r\n performedBy?: string;\r\n metadata?: unknown;\r\n}) {\r\n const [event] = await db\r\n .insert(incidentTimeline)\r\n .values({\r\n incidentId: params.incidentId,\r\n eventType: params.eventType as any,\r\n description: params.description,\r\n performedBy: params.performedBy,\r\n metadata: params.metadata as any,\r\n })\r\n .returning();\r\n\r\n return event;\r\n}\r\n\r\n/**\r\n * Convenience wrapper to resolve an incident with notes.\r\n */\r\nexport async function resolveIncident(\r\n incidentId: string,\r\n notes: string,\r\n performedBy?: string\r\n) {\r\n return updateIncidentStatus(incidentId, \"resolved\", performedBy, notes);\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Queries\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Retrieve open incidents (status = open | investigating | contained),\r\n * optionally filtered by severity, type, userId, and limited.\r\n */\r\nexport async function getOpenIncidents(\r\n options: {\r\n severity?: IncidentSeverity;\r\n type?: IncidentType;\r\n userId?: string;\r\n limit?: number;\r\n } = {}\r\n) {\r\n const { severity, type, userId, limit = 50 } = options;\r\n\r\n let results = await db\r\n .select()\r\n .from(securityIncidents)\r\n .where(\r\n or(\r\n eq(securityIncidents.status, \"open\"),\r\n eq(securityIncidents.status, \"investigating\"),\r\n eq(securityIncidents.status, \"contained\")\r\n )\r\n )\r\n .orderBy(desc(securityIncidents.createdAt))\r\n .limit(limit);\r\n\r\n // Post-filter by optional criteria\r\n if (severity) {\r\n results = results.filter((inc) => inc.severity === severity);\r\n }\r\n if (type) {\r\n results = results.filter((inc) => inc.type === type);\r\n }\r\n if (userId) {\r\n results = results.filter((inc) => inc.userId === userId);\r\n }\r\n\r\n return results;\r\n}\r\n\r\n/**\r\n * Retrieve the full timeline for a specific incident, ordered chronologically.\r\n */\r\nexport async function getIncidentTimeline(incidentId: string) {\r\n return db\r\n .select()\r\n .from(incidentTimeline)\r\n .where(eq(incidentTimeline.incidentId, incidentId))\r\n .orderBy(desc(incidentTimeline.createdAt));\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Reporting\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Generate a structured incident report with a markdown-formatted summary.\r\n */\r\nexport async function generateIncidentReport(incidentId: string) {\r\n const [incident] = await db\r\n .select()\r\n .from(securityIncidents)\r\n .where(eq(securityIncidents.id, incidentId))\r\n .limit(1);\r\n\r\n if (!incident) {\r\n throw new Error(`Incident not found: ${incidentId}`);\r\n }\r\n\r\n const timeline = await getIncidentTimeline(incidentId);\r\n\r\n const timelineEntries = timeline\r\n .map(\r\n (e) =>\r\n `- **${e.createdAt.toISOString()}** [${e.eventType}] ${e.description}`\r\n )\r\n .join(\"\\n\");\r\n\r\n const summary = `# Incident Report: ${incident.incidentNumber}\r\n\r\n## Overview\r\n- **Title**: ${incident.title}\r\n- **Type**: ${incident.type}\r\n- **Severity**: ${incident.severity}\r\n- **Status**: ${incident.status}\r\n- **Source**: ${incident.source}\r\n- **Created**: ${incident.createdAt.toISOString()}\r\n- **Updated**: ${incident.updatedAt.toISOString()}\r\n\r\n## Description\r\n${incident.description}\r\n\r\n## Impact Assessment\r\n${incident.impactAssessment ?? \"Not yet assessed.\"}\r\n\r\n## Resolution\r\n${incident.resolutionNotes ?? \"Not yet resolved.\"}\r\n\r\n## Timeline\r\n${timelineEntries || \"No timeline events recorded.\"}\r\n`;\r\n\r\n return { incident, timeline, summary };\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n// Integration with AuthMonitor\r\n// ---------------------------------------------------------------------------\r\n\r\n/**\r\n * Wire the incident response system into an AuthMonitor instance so that\r\n * warning-level and critical-level anomalies automatically create incidents.\r\n */\r\nexport function wireIncidentResponseToAuthMonitor(authMonitor: {\r\n onAlert: (\r\n cb: (userId: string, anomaly: any) => void | Promise<void>\r\n ) => void;\r\n}) {\r\n authMonitor.onAlert(async (userId: string, anomaly: any) => {\r\n // Only create incidents for warning and critical anomalies\r\n if (anomaly.level === \"warning\" || anomaly.level === \"critical\") {\r\n try {\r\n await createIncidentFromAnomaly(userId, anomaly);\r\n } catch {\r\n // Incident creation failure should not crash the auth flow\r\n }\r\n }\r\n });\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -13,17 +13,17 @@ import {
|
|
|
13
13
|
queryKnowledgeBase,
|
|
14
14
|
searchDocuments,
|
|
15
15
|
updateDocumentMetadata
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-ZVHG4KF2.js";
|
|
17
17
|
import "./chunk-XTX7EK43.js";
|
|
18
18
|
import "./chunk-6W6PTJFT.js";
|
|
19
19
|
import "./chunk-MIC5IBQF.js";
|
|
20
20
|
import "./chunk-ZIYTHUM5.js";
|
|
21
|
-
import "./chunk-
|
|
22
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-5BTVJR7R.js";
|
|
22
|
+
import "./chunk-4KIHDIXZ.js";
|
|
23
23
|
import {
|
|
24
24
|
documentChunks,
|
|
25
25
|
documents
|
|
26
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-ZIBRVA3Y.js";
|
|
27
27
|
import "./chunk-UP2VWCW5.js";
|
|
28
28
|
export {
|
|
29
29
|
deleteDocument,
|
|
@@ -43,4 +43,4 @@ export {
|
|
|
43
43
|
searchDocuments,
|
|
44
44
|
updateDocumentMetadata
|
|
45
45
|
};
|
|
46
|
-
//# sourceMappingURL=knowledge-base-
|
|
46
|
+
//# sourceMappingURL=knowledge-base-5SMMOGQJ.js.map
|
package/dist/lib.d.ts
CHANGED
|
@@ -99,6 +99,13 @@ declare const envSchema: z.ZodObject<{
|
|
|
99
99
|
OUTLOOK_CLIENT_SECRET: z.ZodOptional<z.ZodString>;
|
|
100
100
|
OUTLOOK_REDIRECT_URI: z.ZodOptional<z.ZodString>;
|
|
101
101
|
OUTLOOK_REFRESH_TOKEN: z.ZodOptional<z.ZodString>;
|
|
102
|
+
M365_CLIENT_ID: z.ZodOptional<z.ZodString>;
|
|
103
|
+
M365_CLIENT_SECRET: z.ZodOptional<z.ZodString>;
|
|
104
|
+
M365_TENANT_ID: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
105
|
+
M365_REDIRECT_URI: z.ZodOptional<z.ZodString>;
|
|
106
|
+
M365_GRAPH_SCOPES: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
107
|
+
M365_ANALYZE_RATE_LIMIT: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
108
|
+
M365_ANALYZE_RATE_REFILL: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
102
109
|
DROPBOX_CLIENT_ID: z.ZodOptional<z.ZodString>;
|
|
103
110
|
DROPBOX_CLIENT_SECRET: z.ZodOptional<z.ZodString>;
|
|
104
111
|
DROPBOX_REDIRECT_URI: z.ZodOptional<z.ZodString>;
|
|
@@ -226,6 +233,10 @@ declare const envSchema: z.ZodObject<{
|
|
|
226
233
|
EXCHANGE_MAX_TRADES_PER_HOUR: number;
|
|
227
234
|
EXCHANGE_AGENT_TRADING_ENABLED: boolean;
|
|
228
235
|
ALCHEMY_NETWORK: string;
|
|
236
|
+
M365_TENANT_ID: string;
|
|
237
|
+
M365_GRAPH_SCOPES: string;
|
|
238
|
+
M365_ANALYZE_RATE_LIMIT: number;
|
|
239
|
+
M365_ANALYZE_RATE_REFILL: number;
|
|
229
240
|
MCP_ENABLED: boolean;
|
|
230
241
|
MCP_CONFIG_PATH: string;
|
|
231
242
|
LLM_PROVIDER: string;
|
|
@@ -361,6 +372,9 @@ declare const envSchema: z.ZodObject<{
|
|
|
361
372
|
OUTLOOK_CLIENT_SECRET?: string | undefined;
|
|
362
373
|
OUTLOOK_REDIRECT_URI?: string | undefined;
|
|
363
374
|
OUTLOOK_REFRESH_TOKEN?: string | undefined;
|
|
375
|
+
M365_CLIENT_ID?: string | undefined;
|
|
376
|
+
M365_CLIENT_SECRET?: string | undefined;
|
|
377
|
+
M365_REDIRECT_URI?: string | undefined;
|
|
364
378
|
DROPBOX_CLIENT_ID?: string | undefined;
|
|
365
379
|
DROPBOX_CLIENT_SECRET?: string | undefined;
|
|
366
380
|
DROPBOX_REDIRECT_URI?: string | undefined;
|
|
@@ -479,6 +493,13 @@ declare const envSchema: z.ZodObject<{
|
|
|
479
493
|
OUTLOOK_CLIENT_SECRET?: string | undefined;
|
|
480
494
|
OUTLOOK_REDIRECT_URI?: string | undefined;
|
|
481
495
|
OUTLOOK_REFRESH_TOKEN?: string | undefined;
|
|
496
|
+
M365_CLIENT_ID?: string | undefined;
|
|
497
|
+
M365_CLIENT_SECRET?: string | undefined;
|
|
498
|
+
M365_TENANT_ID?: string | undefined;
|
|
499
|
+
M365_REDIRECT_URI?: string | undefined;
|
|
500
|
+
M365_GRAPH_SCOPES?: string | undefined;
|
|
501
|
+
M365_ANALYZE_RATE_LIMIT?: number | undefined;
|
|
502
|
+
M365_ANALYZE_RATE_REFILL?: number | undefined;
|
|
482
503
|
DROPBOX_CLIENT_ID?: string | undefined;
|
|
483
504
|
DROPBOX_CLIENT_SECRET?: string | undefined;
|
|
484
505
|
DROPBOX_REDIRECT_URI?: string | undefined;
|
package/dist/lib.js
CHANGED
|
@@ -1,34 +1,54 @@
|
|
|
1
1
|
import {
|
|
2
2
|
app
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import {
|
|
5
|
-
SignalBot
|
|
6
|
-
} from "./chunk-KT7NLIXP.js";
|
|
7
|
-
import {
|
|
8
|
-
iMessageBot
|
|
9
|
-
} from "./chunk-TAAZB5KN.js";
|
|
3
|
+
} from "./chunk-S2EOIVF4.js";
|
|
10
4
|
import {
|
|
11
5
|
createBot
|
|
12
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-56UJS2LA.js";
|
|
13
7
|
import {
|
|
14
8
|
DiscordBot
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-HQZQFEAX.js";
|
|
10
|
+
import "./chunk-J4JW73TT.js";
|
|
17
11
|
import {
|
|
18
12
|
SlackBot
|
|
19
|
-
} from "./chunk-
|
|
20
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-WMDVOWN6.js";
|
|
14
|
+
import "./chunk-BNZHWAZC.js";
|
|
21
15
|
import {
|
|
22
16
|
cancelTask,
|
|
23
17
|
generateBriefing,
|
|
24
18
|
scheduleReminder,
|
|
25
19
|
scheduleTask
|
|
26
|
-
} from "./chunk-
|
|
27
|
-
import "./chunk-LFDXEYYB.js";
|
|
28
|
-
import "./chunk-7MZN73J2.js";
|
|
20
|
+
} from "./chunk-GJETKBOY.js";
|
|
29
21
|
import {
|
|
30
22
|
WhatsAppBot
|
|
31
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-PD3CTDO6.js";
|
|
24
|
+
import {
|
|
25
|
+
SignalBot
|
|
26
|
+
} from "./chunk-JHYYFPKX.js";
|
|
27
|
+
import {
|
|
28
|
+
iMessageBot
|
|
29
|
+
} from "./chunk-CWT6CAE5.js";
|
|
30
|
+
import "./chunk-SDLOMKCW.js";
|
|
31
|
+
import "./chunk-66SAOZPU.js";
|
|
32
|
+
import {
|
|
33
|
+
SYSTEM_PROMPT,
|
|
34
|
+
TOOLS,
|
|
35
|
+
chat,
|
|
36
|
+
chatWithTools,
|
|
37
|
+
executeTool,
|
|
38
|
+
streamChat,
|
|
39
|
+
streamChatWithTools
|
|
40
|
+
} from "./chunk-ZMML6T63.js";
|
|
41
|
+
import "./chunk-5JJTLWOR.js";
|
|
42
|
+
import {
|
|
43
|
+
buildMemoryContext,
|
|
44
|
+
extractMemories,
|
|
45
|
+
generateEmbedding,
|
|
46
|
+
searchMemories,
|
|
47
|
+
storeMemory
|
|
48
|
+
} from "./chunk-QPY3WRVM.js";
|
|
49
|
+
import "./chunk-ADTDYJO7.js";
|
|
50
|
+
import "./chunk-LFDXEYYB.js";
|
|
51
|
+
import "./chunk-TKBVW7ZJ.js";
|
|
32
52
|
import {
|
|
33
53
|
compareHashes,
|
|
34
54
|
generateToken,
|
|
@@ -52,24 +72,11 @@ import {
|
|
|
52
72
|
import {
|
|
53
73
|
clipboardTool
|
|
54
74
|
} from "./chunk-MGFBLVR7.js";
|
|
55
|
-
import
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
executeTool,
|
|
61
|
-
streamChat,
|
|
62
|
-
streamChatWithTools
|
|
63
|
-
} from "./chunk-6JY4HNUH.js";
|
|
64
|
-
import "./chunk-HKOPRRDJ.js";
|
|
65
|
-
import {
|
|
66
|
-
buildMemoryContext,
|
|
67
|
-
extractMemories,
|
|
68
|
-
generateEmbedding,
|
|
69
|
-
searchMemories,
|
|
70
|
-
storeMemory
|
|
71
|
-
} from "./chunk-6UZPE35A.js";
|
|
72
|
-
import "./chunk-ADTDYJO7.js";
|
|
75
|
+
import "./chunk-6HGMRR4J.js";
|
|
76
|
+
import "./chunk-DTISLIMB.js";
|
|
77
|
+
import "./chunk-3AWAWRWB.js";
|
|
78
|
+
import "./chunk-PBOCSGNL.js";
|
|
79
|
+
import "./chunk-7BNFELEK.js";
|
|
73
80
|
import {
|
|
74
81
|
generateEncryptionKey,
|
|
75
82
|
getRotationInfo,
|
|
@@ -114,35 +121,35 @@ import "./chunk-X6Q3K3L2.js";
|
|
|
114
121
|
import "./chunk-ODCFS5WD.js";
|
|
115
122
|
import "./chunk-KM22GV7G.js";
|
|
116
123
|
import "./chunk-P6QINGFL.js";
|
|
117
|
-
import "./chunk-
|
|
124
|
+
import "./chunk-HJSEEFO3.js";
|
|
118
125
|
import "./chunk-C6PELIHS.js";
|
|
119
126
|
import "./chunk-7WQO5J2M.js";
|
|
120
|
-
import "./chunk-
|
|
121
|
-
import "./chunk-
|
|
122
|
-
import "./chunk-
|
|
127
|
+
import "./chunk-WMFYI7XC.js";
|
|
128
|
+
import "./chunk-YEDEAX6Y.js";
|
|
129
|
+
import "./chunk-6ZNCY2GI.js";
|
|
123
130
|
import "./chunk-WZAH34TG.js";
|
|
124
131
|
import "./chunk-6KONMXQ6.js";
|
|
125
132
|
import "./chunk-22VGGA7S.js";
|
|
126
133
|
import "./chunk-HN3F4WSW.js";
|
|
127
|
-
import "./chunk-
|
|
128
|
-
import "./chunk-
|
|
129
|
-
import "./chunk-
|
|
130
|
-
import "./chunk-
|
|
134
|
+
import "./chunk-V3OKHQUX.js";
|
|
135
|
+
import "./chunk-2I5QHYG6.js";
|
|
136
|
+
import "./chunk-CZTMGHUC.js";
|
|
137
|
+
import "./chunk-4WH6MFEW.js";
|
|
131
138
|
import {
|
|
132
139
|
initializeProviders
|
|
133
|
-
} from "./chunk-
|
|
140
|
+
} from "./chunk-GW6V4D43.js";
|
|
134
141
|
import "./chunk-DOYGMNMK.js";
|
|
135
142
|
import "./chunk-CQ4JURG7.js";
|
|
136
|
-
import "./chunk-
|
|
143
|
+
import "./chunk-BBN4VCNK.js";
|
|
137
144
|
import {
|
|
138
145
|
db
|
|
139
|
-
} from "./chunk-
|
|
146
|
+
} from "./chunk-5BTVJR7R.js";
|
|
140
147
|
import {
|
|
141
148
|
configure,
|
|
142
149
|
env,
|
|
143
150
|
ready
|
|
144
|
-
} from "./chunk-
|
|
145
|
-
import "./chunk-
|
|
151
|
+
} from "./chunk-4KIHDIXZ.js";
|
|
152
|
+
import "./chunk-ZIBRVA3Y.js";
|
|
146
153
|
import "./chunk-35WYTA3C.js";
|
|
147
154
|
import "./chunk-UP2VWCW5.js";
|
|
148
155
|
|
|
@@ -162,7 +169,7 @@ var OpenSentinel = class {
|
|
|
162
169
|
if (this._running) return;
|
|
163
170
|
const services = this.config.services || {};
|
|
164
171
|
if (services.telegram && env.TELEGRAM_BOT_TOKEN) {
|
|
165
|
-
const { createBot: createBot2 } = await import("./bot-
|
|
172
|
+
const { createBot: createBot2 } = await import("./bot-VDHBGUVI.js");
|
|
166
173
|
this._services.telegramBot = createBot2();
|
|
167
174
|
this._services.telegramBot.start({
|
|
168
175
|
onStart: (botInfo) => {
|
|
@@ -172,7 +179,7 @@ var OpenSentinel = class {
|
|
|
172
179
|
}
|
|
173
180
|
if (services.scheduler) {
|
|
174
181
|
try {
|
|
175
|
-
const { startWorker } = await import("./scheduler-
|
|
182
|
+
const { startWorker } = await import("./scheduler-6PLLAQI7.js");
|
|
176
183
|
startWorker(async (task) => {
|
|
177
184
|
console.log(`[Scheduler] Executing task: ${task.type}`);
|
|
178
185
|
if (task.chatId && task.message && this._services.telegramBot) {
|
|
@@ -192,8 +199,8 @@ var OpenSentinel = class {
|
|
|
192
199
|
}
|
|
193
200
|
if (services.mcp !== false && env.MCP_ENABLED) {
|
|
194
201
|
try {
|
|
195
|
-
const { initMCPRegistry, getMCPToolSummary } = await import("./mcp-
|
|
196
|
-
const { setMCPRegistry } = await import("./tools-
|
|
202
|
+
const { initMCPRegistry, getMCPToolSummary } = await import("./mcp-DJ2QDA6A.js");
|
|
203
|
+
const { setMCPRegistry } = await import("./tools-PJZ6RI4P.js");
|
|
197
204
|
this._services.mcpRegistry = await initMCPRegistry(env.MCP_CONFIG_PATH);
|
|
198
205
|
setMCPRegistry(this._services.mcpRegistry);
|
|
199
206
|
if (this._services.mcpRegistry.connectedCount > 0) {
|
|
@@ -209,7 +216,7 @@ var OpenSentinel = class {
|
|
|
209
216
|
}
|
|
210
217
|
if (services.discord && env.DISCORD_BOT_TOKEN) {
|
|
211
218
|
try {
|
|
212
|
-
const { DiscordBot: DiscordBot2 } = await import("./discord-
|
|
219
|
+
const { DiscordBot: DiscordBot2 } = await import("./discord-6UQHCN27.js");
|
|
213
220
|
this._services.discordBot = new DiscordBot2({
|
|
214
221
|
token: env.DISCORD_BOT_TOKEN,
|
|
215
222
|
clientId: env.DISCORD_CLIENT_ID || "",
|
|
@@ -226,7 +233,7 @@ var OpenSentinel = class {
|
|
|
226
233
|
}
|
|
227
234
|
if (services.slack && env.SLACK_BOT_TOKEN && env.SLACK_SIGNING_SECRET) {
|
|
228
235
|
try {
|
|
229
|
-
const { SlackBot: SlackBot2 } = await import("./slack-
|
|
236
|
+
const { SlackBot: SlackBot2 } = await import("./slack-KSS6YK5Z.js");
|
|
230
237
|
this._services.slackBot = new SlackBot2({
|
|
231
238
|
token: env.SLACK_BOT_TOKEN,
|
|
232
239
|
signingSecret: env.SLACK_SIGNING_SECRET,
|
|
@@ -245,7 +252,7 @@ var OpenSentinel = class {
|
|
|
245
252
|
}
|
|
246
253
|
if (services.whatsapp && env.WHATSAPP_ENABLED) {
|
|
247
254
|
try {
|
|
248
|
-
const { WhatsAppBot: WhatsAppBot2 } = await import("./whatsapp-
|
|
255
|
+
const { WhatsAppBot: WhatsAppBot2 } = await import("./whatsapp-DWXK25V2.js");
|
|
249
256
|
this._services.whatsappBot = new WhatsAppBot2({
|
|
250
257
|
authDir: env.WHATSAPP_AUTH_DIR,
|
|
251
258
|
allowedNumbers: env.WHATSAPP_ALLOWED_NUMBERS?.split(",").filter(Boolean) || [],
|
|
@@ -260,7 +267,7 @@ var OpenSentinel = class {
|
|
|
260
267
|
}
|
|
261
268
|
if (services.signal && env.SIGNAL_ENABLED && env.SIGNAL_PHONE_NUMBER) {
|
|
262
269
|
try {
|
|
263
|
-
const { SignalBot: SignalBot2 } = await import("./signal-
|
|
270
|
+
const { SignalBot: SignalBot2 } = await import("./signal-7D5EPGVL.js");
|
|
264
271
|
this._services.signalBot = new SignalBot2({
|
|
265
272
|
phoneNumber: env.SIGNAL_PHONE_NUMBER,
|
|
266
273
|
signalCliPath: env.SIGNAL_CLI_PATH,
|
|
@@ -275,7 +282,7 @@ var OpenSentinel = class {
|
|
|
275
282
|
}
|
|
276
283
|
if (services.imessage && env.IMESSAGE_ENABLED) {
|
|
277
284
|
try {
|
|
278
|
-
const { iMessageBot: iMessageBot2 } = await import("./imessage-
|
|
285
|
+
const { iMessageBot: iMessageBot2 } = await import("./imessage-DSGSGUZS.js");
|
|
279
286
|
this._services.imessageBot = new iMessageBot2({
|
|
280
287
|
mode: env.IMESSAGE_MODE,
|
|
281
288
|
serverUrl: env.IMESSAGE_BLUEBUBBLES_URL,
|
|
@@ -294,7 +301,7 @@ var OpenSentinel = class {
|
|
|
294
301
|
async stop() {
|
|
295
302
|
if (!this._running) return;
|
|
296
303
|
console.log("Shutting down OpenSentinel...");
|
|
297
|
-
const { stopWorker } = await import("./scheduler-
|
|
304
|
+
const { stopWorker } = await import("./scheduler-6PLLAQI7.js");
|
|
298
305
|
stopWorker();
|
|
299
306
|
if (this._services.mcpRegistry) {
|
|
300
307
|
await this._services.mcpRegistry.shutdown();
|
package/dist/lib.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/app.ts"],"sourcesContent":["/**\n * OpenSentinel - Programmatic API\n *\n * Usage:\n * import { OpenSentinel } from 'opensentinel';\n *\n * const sentinel = new OpenSentinel({\n * claudeApiKey: 'sk-ant-...',\n * env: { DATABASE_URL: 'postgresql://...', TELEGRAM_BOT_TOKEN: '...' },\n * services: { telegram: true, api: true },\n * });\n *\n * await sentinel.start();\n */\n\nimport { configure, env, type Env } from \"./config/env\";\nimport { chat, chatWithTools, type Message, type BrainResponse } from \"./core/brain\";\n\nexport interface OpenSentinelConfig {\n /** Required: your Claude API key */\n claudeApiKey: string;\n /** All other env vars as optional overrides */\n env?: Partial<Env>;\n /** Which services to start (all default to false except api) */\n services?: {\n telegram?: boolean;\n discord?: boolean;\n slack?: boolean;\n whatsapp?: boolean;\n signal?: boolean;\n imessage?: boolean;\n api?: boolean;\n scheduler?: boolean;\n mcp?: boolean;\n websocket?: boolean;\n };\n}\n\nexport class OpenSentinel {\n private config: OpenSentinelConfig;\n private _running = false;\n private _services: {\n telegramBot?: any;\n discordBot?: any;\n slackBot?: any;\n whatsappBot?: any;\n signalBot?: any;\n imessageBot?: any;\n mcpRegistry?: any;\n server?: any;\n } = {};\n\n constructor(config: OpenSentinelConfig) {\n this.config = config;\n\n // Configure the env singleton\n configure({\n CLAUDE_API_KEY: config.claudeApiKey,\n ...(config.env || {}),\n } as Partial<Env> & { CLAUDE_API_KEY: string });\n }\n\n async start(): Promise<void> {\n if (this._running) return;\n\n const services = this.config.services || {};\n\n // Start Telegram bot\n if (services.telegram && env.TELEGRAM_BOT_TOKEN) {\n const { createBot } = await import(\"./inputs/telegram/bot\");\n this._services.telegramBot = createBot();\n this._services.telegramBot.start({\n onStart: (botInfo: any) => {\n console.log(`[Telegram] Bot started as @${botInfo.username}`);\n },\n });\n }\n\n // Start scheduler\n if (services.scheduler) {\n try {\n const { startWorker } = await import(\"./core/scheduler\");\n startWorker(async (task: any) => {\n console.log(`[Scheduler] Executing task: ${task.type}`);\n if (task.chatId && task.message && this._services.telegramBot) {\n try {\n await this._services.telegramBot.api.sendMessage(\n task.chatId,\n `Reminder: ${task.message}`\n );\n } catch (err) {\n console.error(\"[Scheduler] Failed to send reminder:\", err);\n }\n }\n });\n } catch (err) {\n console.warn(\"[Scheduler] Could not start worker:\", err);\n }\n }\n\n // Initialize MCP\n if (services.mcp !== false && env.MCP_ENABLED) {\n try {\n const { initMCPRegistry, getMCPToolSummary } = await import(\"./core/mcp\");\n const { setMCPRegistry } = await import(\"./tools\");\n this._services.mcpRegistry = await initMCPRegistry(env.MCP_CONFIG_PATH);\n setMCPRegistry(this._services.mcpRegistry);\n\n if (this._services.mcpRegistry.connectedCount > 0) {\n console.log(\n `[MCP] Connected to ${this._services.mcpRegistry.connectedCount} server(s), ${this._services.mcpRegistry.totalToolCount} tools available`\n );\n console.log(getMCPToolSummary(this._services.mcpRegistry));\n }\n } catch (err) {\n console.warn(\"[MCP] Failed to initialize:\", err);\n this._services.mcpRegistry = null;\n }\n }\n\n // Start Discord bot\n if (services.discord && env.DISCORD_BOT_TOKEN) {\n try {\n const { DiscordBot } = await import(\"./inputs/discord\");\n this._services.discordBot = new DiscordBot({\n token: env.DISCORD_BOT_TOKEN,\n clientId: env.DISCORD_CLIENT_ID || \"\",\n guildId: env.DISCORD_GUILD_ID,\n allowedUserIds: env.DISCORD_ALLOWED_USER_IDS?.split(\",\") || [],\n allowedRoleIds: env.DISCORD_ALLOWED_ROLE_IDS?.split(\",\") || [],\n });\n await this._services.discordBot.start();\n console.log(\"[Discord] Bot started\");\n } catch (err: any) {\n console.warn(\"[Discord] Failed to start bot:\", err.message);\n this._services.discordBot = null;\n }\n }\n\n // Start Slack bot\n if (services.slack && env.SLACK_BOT_TOKEN && env.SLACK_SIGNING_SECRET) {\n try {\n const { SlackBot } = await import(\"./inputs/slack\");\n this._services.slackBot = new SlackBot({\n token: env.SLACK_BOT_TOKEN,\n signingSecret: env.SLACK_SIGNING_SECRET,\n appToken: env.SLACK_APP_TOKEN,\n socketMode: env.SLACK_SOCKET_MODE,\n port: parseInt(String(env.SLACK_PORT) || \"3000\"),\n allowedUserIds: env.SLACK_ALLOWED_USER_IDS?.split(\",\") || [],\n allowedChannelIds: env.SLACK_ALLOWED_CHANNEL_IDS?.split(\",\") || [],\n });\n await this._services.slackBot.start();\n console.log(\"[Slack] Bot started\");\n } catch (err: any) {\n console.warn(\"[Slack] Failed to start bot:\", err.message);\n this._services.slackBot = null;\n }\n }\n\n // Start WhatsApp bot\n if (services.whatsapp && env.WHATSAPP_ENABLED) {\n try {\n const { WhatsAppBot } = await import(\"./inputs/whatsapp\");\n this._services.whatsappBot = new WhatsAppBot({\n authDir: env.WHATSAPP_AUTH_DIR,\n allowedNumbers:\n env.WHATSAPP_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n printQR: true,\n });\n await this._services.whatsappBot.start();\n console.log(\"[WhatsApp] Bot started\");\n } catch (err: any) {\n console.warn(\"[WhatsApp] Failed to start bot:\", err.message);\n this._services.whatsappBot = null;\n }\n }\n\n // Start Signal bot\n if (services.signal && env.SIGNAL_ENABLED && env.SIGNAL_PHONE_NUMBER) {\n try {\n const { SignalBot } = await import(\"./inputs/signal\");\n this._services.signalBot = new SignalBot({\n phoneNumber: env.SIGNAL_PHONE_NUMBER,\n signalCliPath: env.SIGNAL_CLI_PATH,\n allowedNumbers:\n env.SIGNAL_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n });\n await this._services.signalBot.start();\n console.log(\"[Signal] Bot started\");\n } catch (err: any) {\n console.warn(\"[Signal] Failed to start bot:\", err.message);\n this._services.signalBot = null;\n }\n }\n\n // Start iMessage bot\n if (services.imessage && env.IMESSAGE_ENABLED) {\n try {\n const { iMessageBot } = await import(\"./inputs/imessage\");\n this._services.imessageBot = new iMessageBot({\n mode: env.IMESSAGE_MODE as \"bluebubbles\" | \"applescript\",\n serverUrl: env.IMESSAGE_BLUEBUBBLES_URL,\n password: env.IMESSAGE_BLUEBUBBLES_PASSWORD,\n allowedNumbers:\n env.IMESSAGE_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n });\n await this._services.imessageBot.start();\n console.log(\"[iMessage] Bot started\");\n } catch (err: any) {\n console.warn(\"[iMessage] Failed to start bot:\", err.message);\n this._services.imessageBot = null;\n }\n }\n\n this._running = true;\n }\n\n async stop(): Promise<void> {\n if (!this._running) return;\n\n console.log(\"Shutting down OpenSentinel...\");\n\n const { stopWorker } = await import(\"./core/scheduler\");\n stopWorker();\n\n if (this._services.mcpRegistry) {\n await this._services.mcpRegistry.shutdown();\n }\n if (this._services.telegramBot) {\n await this._services.telegramBot.stop();\n }\n if (this._services.discordBot) {\n await this._services.discordBot.stop();\n }\n if (this._services.slackBot) {\n await this._services.slackBot.stop();\n }\n if (this._services.whatsappBot) {\n await this._services.whatsappBot.stop();\n }\n if (this._services.signalBot) {\n await this._services.signalBot.stop();\n }\n if (this._services.imessageBot) {\n await this._services.imessageBot.stop();\n }\n if (this._services.server) {\n this._services.server.stop();\n }\n\n this._running = false;\n console.log(\"OpenSentinel stopped.\");\n }\n\n /** Send a simple chat message (no tools) */\n async chat(\n messages: Message[],\n systemPrompt?: string\n ): Promise<BrainResponse> {\n return chat(messages, systemPrompt);\n }\n\n /** Send a chat message with tool execution */\n async chatWithTools(\n messages: Message[],\n userId?: string,\n onToolUse?: (toolName: string, input: unknown) => void\n ): Promise<BrainResponse> {\n return chatWithTools(messages, userId, onToolUse);\n }\n\n get running(): boolean {\n return this._running;\n }\n\n get services() {\n return { ...this._services };\n }\n}\n"],"mappings":"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","names":["createBot","DiscordBot","SlackBot","WhatsAppBot","SignalBot","iMessageBot"]}
|
|
1
|
+
{"version":3,"sources":["../src/app.ts"],"sourcesContent":["/**\n * OpenSentinel - Programmatic API\n *\n * Usage:\n * import { OpenSentinel } from 'opensentinel';\n *\n * const sentinel = new OpenSentinel({\n * claudeApiKey: 'sk-ant-...',\n * env: { DATABASE_URL: 'postgresql://...', TELEGRAM_BOT_TOKEN: '...' },\n * services: { telegram: true, api: true },\n * });\n *\n * await sentinel.start();\n */\n\nimport { configure, env, type Env } from \"./config/env\";\nimport { chat, chatWithTools, type Message, type BrainResponse } from \"./core/brain\";\n\nexport interface OpenSentinelConfig {\n /** Required: your Claude API key */\n claudeApiKey: string;\n /** All other env vars as optional overrides */\n env?: Partial<Env>;\n /** Which services to start (all default to false except api) */\n services?: {\n telegram?: boolean;\n discord?: boolean;\n slack?: boolean;\n whatsapp?: boolean;\n signal?: boolean;\n imessage?: boolean;\n api?: boolean;\n scheduler?: boolean;\n mcp?: boolean;\n websocket?: boolean;\n };\n}\n\nexport class OpenSentinel {\n private config: OpenSentinelConfig;\n private _running = false;\n private _services: {\n telegramBot?: any;\n discordBot?: any;\n slackBot?: any;\n whatsappBot?: any;\n signalBot?: any;\n imessageBot?: any;\n mcpRegistry?: any;\n server?: any;\n } = {};\n\n constructor(config: OpenSentinelConfig) {\n this.config = config;\n\n // Configure the env singleton\n configure({\n CLAUDE_API_KEY: config.claudeApiKey,\n ...(config.env || {}),\n } as Partial<Env> & { CLAUDE_API_KEY: string });\n }\n\n async start(): Promise<void> {\n if (this._running) return;\n\n const services = this.config.services || {};\n\n // Start Telegram bot\n if (services.telegram && env.TELEGRAM_BOT_TOKEN) {\n const { createBot } = await import(\"./inputs/telegram/bot\");\n this._services.telegramBot = createBot();\n this._services.telegramBot.start({\n onStart: (botInfo: any) => {\n console.log(`[Telegram] Bot started as @${botInfo.username}`);\n },\n });\n }\n\n // Start scheduler\n if (services.scheduler) {\n try {\n const { startWorker } = await import(\"./core/scheduler\");\n startWorker(async (task: any) => {\n console.log(`[Scheduler] Executing task: ${task.type}`);\n if (task.chatId && task.message && this._services.telegramBot) {\n try {\n await this._services.telegramBot.api.sendMessage(\n task.chatId,\n `Reminder: ${task.message}`\n );\n } catch (err) {\n console.error(\"[Scheduler] Failed to send reminder:\", err);\n }\n }\n });\n } catch (err) {\n console.warn(\"[Scheduler] Could not start worker:\", err);\n }\n }\n\n // Initialize MCP\n if (services.mcp !== false && env.MCP_ENABLED) {\n try {\n const { initMCPRegistry, getMCPToolSummary } = await import(\"./core/mcp\");\n const { setMCPRegistry } = await import(\"./tools\");\n this._services.mcpRegistry = await initMCPRegistry(env.MCP_CONFIG_PATH);\n setMCPRegistry(this._services.mcpRegistry);\n\n if (this._services.mcpRegistry.connectedCount > 0) {\n console.log(\n `[MCP] Connected to ${this._services.mcpRegistry.connectedCount} server(s), ${this._services.mcpRegistry.totalToolCount} tools available`\n );\n console.log(getMCPToolSummary(this._services.mcpRegistry));\n }\n } catch (err) {\n console.warn(\"[MCP] Failed to initialize:\", err);\n this._services.mcpRegistry = null;\n }\n }\n\n // Start Discord bot\n if (services.discord && env.DISCORD_BOT_TOKEN) {\n try {\n const { DiscordBot } = await import(\"./inputs/discord\");\n this._services.discordBot = new DiscordBot({\n token: env.DISCORD_BOT_TOKEN,\n clientId: env.DISCORD_CLIENT_ID || \"\",\n guildId: env.DISCORD_GUILD_ID,\n allowedUserIds: env.DISCORD_ALLOWED_USER_IDS?.split(\",\") || [],\n allowedRoleIds: env.DISCORD_ALLOWED_ROLE_IDS?.split(\",\") || [],\n });\n await this._services.discordBot.start();\n console.log(\"[Discord] Bot started\");\n } catch (err: any) {\n console.warn(\"[Discord] Failed to start bot:\", err.message);\n this._services.discordBot = null;\n }\n }\n\n // Start Slack bot\n if (services.slack && env.SLACK_BOT_TOKEN && env.SLACK_SIGNING_SECRET) {\n try {\n const { SlackBot } = await import(\"./inputs/slack\");\n this._services.slackBot = new SlackBot({\n token: env.SLACK_BOT_TOKEN,\n signingSecret: env.SLACK_SIGNING_SECRET,\n appToken: env.SLACK_APP_TOKEN,\n socketMode: env.SLACK_SOCKET_MODE,\n port: parseInt(String(env.SLACK_PORT) || \"3000\"),\n allowedUserIds: env.SLACK_ALLOWED_USER_IDS?.split(\",\") || [],\n allowedChannelIds: env.SLACK_ALLOWED_CHANNEL_IDS?.split(\",\") || [],\n });\n await this._services.slackBot.start();\n console.log(\"[Slack] Bot started\");\n } catch (err: any) {\n console.warn(\"[Slack] Failed to start bot:\", err.message);\n this._services.slackBot = null;\n }\n }\n\n // Start WhatsApp bot\n if (services.whatsapp && env.WHATSAPP_ENABLED) {\n try {\n const { WhatsAppBot } = await import(\"./inputs/whatsapp\");\n this._services.whatsappBot = new WhatsAppBot({\n authDir: env.WHATSAPP_AUTH_DIR,\n allowedNumbers:\n env.WHATSAPP_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n printQR: true,\n });\n await this._services.whatsappBot.start();\n console.log(\"[WhatsApp] Bot started\");\n } catch (err: any) {\n console.warn(\"[WhatsApp] Failed to start bot:\", err.message);\n this._services.whatsappBot = null;\n }\n }\n\n // Start Signal bot\n if (services.signal && env.SIGNAL_ENABLED && env.SIGNAL_PHONE_NUMBER) {\n try {\n const { SignalBot } = await import(\"./inputs/signal\");\n this._services.signalBot = new SignalBot({\n phoneNumber: env.SIGNAL_PHONE_NUMBER,\n signalCliPath: env.SIGNAL_CLI_PATH,\n allowedNumbers:\n env.SIGNAL_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n });\n await this._services.signalBot.start();\n console.log(\"[Signal] Bot started\");\n } catch (err: any) {\n console.warn(\"[Signal] Failed to start bot:\", err.message);\n this._services.signalBot = null;\n }\n }\n\n // Start iMessage bot\n if (services.imessage && env.IMESSAGE_ENABLED) {\n try {\n const { iMessageBot } = await import(\"./inputs/imessage\");\n this._services.imessageBot = new iMessageBot({\n mode: env.IMESSAGE_MODE as \"bluebubbles\" | \"applescript\",\n serverUrl: env.IMESSAGE_BLUEBUBBLES_URL,\n password: env.IMESSAGE_BLUEBUBBLES_PASSWORD,\n allowedNumbers:\n env.IMESSAGE_ALLOWED_NUMBERS?.split(\",\").filter(Boolean) || [],\n });\n await this._services.imessageBot.start();\n console.log(\"[iMessage] Bot started\");\n } catch (err: any) {\n console.warn(\"[iMessage] Failed to start bot:\", err.message);\n this._services.imessageBot = null;\n }\n }\n\n this._running = true;\n }\n\n async stop(): Promise<void> {\n if (!this._running) return;\n\n console.log(\"Shutting down OpenSentinel...\");\n\n const { stopWorker } = await import(\"./core/scheduler\");\n stopWorker();\n\n if (this._services.mcpRegistry) {\n await this._services.mcpRegistry.shutdown();\n }\n if (this._services.telegramBot) {\n await this._services.telegramBot.stop();\n }\n if (this._services.discordBot) {\n await this._services.discordBot.stop();\n }\n if (this._services.slackBot) {\n await this._services.slackBot.stop();\n }\n if (this._services.whatsappBot) {\n await this._services.whatsappBot.stop();\n }\n if (this._services.signalBot) {\n await this._services.signalBot.stop();\n }\n if (this._services.imessageBot) {\n await this._services.imessageBot.stop();\n }\n if (this._services.server) {\n this._services.server.stop();\n }\n\n this._running = false;\n console.log(\"OpenSentinel stopped.\");\n }\n\n /** Send a simple chat message (no tools) */\n async chat(\n messages: Message[],\n systemPrompt?: string\n ): Promise<BrainResponse> {\n return chat(messages, systemPrompt);\n }\n\n /** Send a chat message with tool execution */\n async chatWithTools(\n messages: Message[],\n userId?: string,\n onToolUse?: (toolName: string, input: unknown) => void\n ): Promise<BrainResponse> {\n return chatWithTools(messages, userId, onToolUse);\n }\n\n get running(): boolean {\n return this._running;\n }\n\n get services() {\n return { ...this._services };\n }\n}\n"],"mappings":"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","names":["createBot","DiscordBot","SlackBot","WhatsAppBot","SignalBot","iMessageBot"]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
2
|
chatWithTools
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
5
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-ZMML6T63.js";
|
|
4
|
+
import "./chunk-5JJTLWOR.js";
|
|
5
|
+
import "./chunk-QPY3WRVM.js";
|
|
6
6
|
import "./chunk-ADTDYJO7.js";
|
|
7
|
+
import "./chunk-DTISLIMB.js";
|
|
7
8
|
import "./chunk-CUPEENUY.js";
|
|
8
9
|
import "./chunk-2WTKTG2C.js";
|
|
9
10
|
import "./chunk-U2X2J3FI.js";
|
|
@@ -11,27 +12,27 @@ import "./chunk-X6Q3K3L2.js";
|
|
|
11
12
|
import "./chunk-ODCFS5WD.js";
|
|
12
13
|
import "./chunk-KM22GV7G.js";
|
|
13
14
|
import "./chunk-P6QINGFL.js";
|
|
14
|
-
import "./chunk-
|
|
15
|
+
import "./chunk-HJSEEFO3.js";
|
|
15
16
|
import "./chunk-C6PELIHS.js";
|
|
16
17
|
import "./chunk-7WQO5J2M.js";
|
|
17
|
-
import "./chunk-
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-WMFYI7XC.js";
|
|
19
|
+
import "./chunk-YEDEAX6Y.js";
|
|
20
|
+
import "./chunk-6ZNCY2GI.js";
|
|
20
21
|
import "./chunk-WZAH34TG.js";
|
|
21
22
|
import "./chunk-6KONMXQ6.js";
|
|
22
23
|
import "./chunk-22VGGA7S.js";
|
|
23
24
|
import "./chunk-HN3F4WSW.js";
|
|
24
|
-
import "./chunk-
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
28
|
-
import "./chunk-
|
|
25
|
+
import "./chunk-V3OKHQUX.js";
|
|
26
|
+
import "./chunk-2I5QHYG6.js";
|
|
27
|
+
import "./chunk-CZTMGHUC.js";
|
|
28
|
+
import "./chunk-4WH6MFEW.js";
|
|
29
|
+
import "./chunk-GW6V4D43.js";
|
|
29
30
|
import "./chunk-DOYGMNMK.js";
|
|
30
31
|
import "./chunk-CQ4JURG7.js";
|
|
31
|
-
import "./chunk-
|
|
32
|
-
import "./chunk-
|
|
33
|
-
import "./chunk-
|
|
34
|
-
import "./chunk-
|
|
32
|
+
import "./chunk-BBN4VCNK.js";
|
|
33
|
+
import "./chunk-5BTVJR7R.js";
|
|
34
|
+
import "./chunk-4KIHDIXZ.js";
|
|
35
|
+
import "./chunk-ZIBRVA3Y.js";
|
|
35
36
|
import "./chunk-35WYTA3C.js";
|
|
36
37
|
import "./chunk-UP2VWCW5.js";
|
|
37
38
|
|
|
@@ -284,4 +285,4 @@ export {
|
|
|
284
285
|
createMatrixBot,
|
|
285
286
|
matrix_default as default
|
|
286
287
|
};
|
|
287
|
-
//# sourceMappingURL=matrix-
|
|
288
|
+
//# sourceMappingURL=matrix-WYGEOZL5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/inputs/matrix/index.ts"],"sourcesContent":["import sdk from \"matrix-js-sdk\";\nimport { chatWithTools, type Message } from \"../../core/brain\";\n\n/**\n * Matrix bot configuration\n */\nexport interface MatrixBotConfig {\n homeserverUrl: string;\n accessToken: string;\n userId: string;\n allowedRoomIds?: string[];\n autoJoin?: boolean;\n e2eEnabled?: boolean;\n}\n\n/**\n * Matrix bot class — connects to a Matrix homeserver and responds to messages\n * using the OpenSentinel brain (chatWithTools).\n */\nexport class MatrixBot {\n private client: any;\n private sessions: Map<string, Array<{ role: string; content: string }>> =\n new Map();\n private maxSessionMessages: number = 20;\n\n private homeserverUrl: string;\n private accessToken: string;\n private userId: string;\n private allowedRoomIds?: string[];\n private autoJoin: boolean;\n private e2eEnabled: boolean;\n\n constructor(config: MatrixBotConfig) {\n this.homeserverUrl = config.homeserverUrl;\n this.accessToken = config.accessToken;\n this.userId = config.userId;\n this.allowedRoomIds = config.allowedRoomIds;\n this.autoJoin = config.autoJoin ?? false;\n this.e2eEnabled = config.e2eEnabled ?? false;\n }\n\n /**\n * Start the Matrix bot — creates the client, registers event listeners,\n * and begins syncing with the homeserver.\n */\n async start(): Promise<void> {\n console.log(\"[Matrix] Starting bot...\");\n\n this.client = sdk.createClient({\n baseUrl: this.homeserverUrl,\n accessToken: this.accessToken,\n userId: this.userId,\n });\n\n // Handle incoming room timeline events (messages)\n this.client.on(\"Room.timeline\", async (event: any, room: any) => {\n try {\n // Only handle m.room.message events\n if (event.getType() !== \"m.room.message\") return;\n\n const sender: string = event.getSender();\n const roomId: string = room.roomId;\n\n // Ignore our own messages\n if (sender === this.userId) return;\n\n const content = event.getContent();\n\n // Ignore non-text messages (images, files, etc.)\n if (!content || content.msgtype !== \"m.text\") return;\n\n const body: string = content.body;\n if (!body || !body.trim()) return;\n\n // Check if room is in the allowed list (if configured)\n if (\n this.allowedRoomIds &&\n this.allowedRoomIds.length > 0 &&\n !this.allowedRoomIds.includes(roomId)\n ) {\n return;\n }\n\n // Only respond if the bot is mentioned or if it's a DM\n const mentioned = this.isMentioned(body);\n const dm = this.isDM(roomId);\n\n if (!mentioned && !dm) return;\n\n // Set typing indicator to show we're processing\n try {\n await this.client.sendTyping(roomId, true, 30000);\n } catch (err) {\n console.warn(\"[Matrix] Failed to set typing indicator:\", err);\n }\n\n // Process the message and get a response\n const response = await this.processMessage(roomId, sender, body);\n\n // Clear typing indicator\n try {\n await this.client.sendTyping(roomId, false, 0);\n } catch (err) {\n console.warn(\"[Matrix] Failed to clear typing indicator:\", err);\n }\n\n // Send the response, splitting if necessary\n await this.sendMessage(roomId, response);\n\n console.log(\n `[Matrix] Processed message from ${sender} in room ${roomId}`\n );\n } catch (error) {\n console.error(\"[Matrix] Error handling Room.timeline event:\", error);\n\n // Attempt to clear typing indicator on error\n try {\n await this.client.sendTyping(room.roomId, false, 0);\n } catch {\n // Ignore typing indicator cleanup errors\n }\n\n // Attempt to send error message to the room\n try {\n await this.client.sendEvent(\n room.roomId,\n \"m.room.message\",\n {\n msgtype: \"m.text\",\n body: \"Sorry, I encountered an error processing your message. Please try again.\",\n },\n \"\"\n );\n } catch (sendError) {\n console.error(\"[Matrix] Failed to send error message:\", sendError);\n }\n }\n });\n\n // Handle room membership events (auto-join invites)\n this.client.on(\n \"RoomMember.membership\",\n async (event: any, member: any) => {\n try {\n if (\n this.autoJoin &&\n member.membership === \"invite\" &&\n member.userId === this.userId\n ) {\n const roomId = member.roomId;\n console.log(`[Matrix] Auto-joining room: ${roomId}`);\n\n await this.client.joinRoom(roomId);\n console.log(`[Matrix] Successfully joined room: ${roomId}`);\n }\n } catch (error) {\n console.error(\"[Matrix] Error handling membership event:\", error);\n }\n }\n );\n\n // Start the client with a limited initial sync\n await this.client.startClient({ initialSyncLimit: 10 });\n\n console.log(`[Matrix] Bot started as ${this.userId}`);\n }\n\n /**\n * Stop the Matrix bot and disconnect from the homeserver.\n */\n async stop(): Promise<void> {\n console.log(\"[Matrix] Stopping bot...\");\n\n if (this.client) {\n this.client.stopClient();\n }\n\n console.log(\"[Matrix] Bot stopped\");\n }\n\n /**\n * Process an incoming message: manage session history, call chatWithTools,\n * and return the response text.\n */\n private async processMessage(\n roomId: string,\n sender: string,\n body: string\n ): Promise<string> {\n // Get or create the session for this room\n let session = this.sessions.get(roomId);\n if (!session) {\n session = [];\n this.sessions.set(roomId, session);\n }\n\n // Add the user message to the session\n session.push({ role: \"user\", content: body });\n\n // Trim session to the max allowed messages\n if (session.length > this.maxSessionMessages) {\n session.splice(0, session.length - this.maxSessionMessages);\n }\n\n try {\n // Call chatWithTools with the session messages\n const response = await chatWithTools(\n session as Message[],\n `matrix:${sender}`,\n async () => {\n // Refresh typing indicator during tool use\n try {\n await this.client.sendTyping(roomId, true, 30000);\n } catch {\n // Ignore typing indicator errors during tool use\n }\n }\n );\n\n // Add the assistant response to the session\n session.push({ role: \"assistant\", content: response.content });\n\n // Trim session again if needed\n if (session.length > this.maxSessionMessages) {\n session.splice(0, session.length - this.maxSessionMessages);\n }\n\n // Build response with tool usage info\n let finalResponse = response.content;\n if (response.toolsUsed && response.toolsUsed.length > 0) {\n const toolList = [...new Set(response.toolsUsed)].join(\", \");\n finalResponse = `[Used: ${toolList}]\\n\\n${response.content}`;\n }\n\n console.log(\n `[Matrix] Response generated. Tokens: ${response.inputTokens}/${response.outputTokens}` +\n (response.toolsUsed\n ? ` Tools: ${response.toolsUsed.join(\", \")}`\n : \"\")\n );\n\n return finalResponse;\n } catch (error) {\n console.error(\"[Matrix] Error calling chatWithTools:\", error);\n return \"Sorry, I encountered an error processing your message. Please try again.\";\n }\n }\n\n /**\n * Send a message to a room, splitting into multiple messages if the text\n * exceeds 4000 characters.\n */\n private async sendMessage(roomId: string, text: string): Promise<void> {\n const MAX_LENGTH = 4000;\n\n if (text.length <= MAX_LENGTH) {\n await this.client.sendEvent(\n roomId,\n \"m.room.message\",\n {\n msgtype: \"m.text\",\n body: text,\n },\n \"\"\n );\n } else {\n // Split into chunks at line boundaries when possible\n const chunks: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= MAX_LENGTH) {\n chunks.push(remaining);\n break;\n }\n\n // Try to split at a newline near the limit\n let splitIndex = remaining.lastIndexOf(\"\\n\", MAX_LENGTH);\n if (splitIndex === -1 || splitIndex < MAX_LENGTH * 0.5) {\n // If no good newline break, try a space\n splitIndex = remaining.lastIndexOf(\" \", MAX_LENGTH);\n }\n if (splitIndex === -1 || splitIndex < MAX_LENGTH * 0.5) {\n // Hard split as a last resort\n splitIndex = MAX_LENGTH;\n }\n\n chunks.push(remaining.substring(0, splitIndex));\n remaining = remaining.substring(splitIndex).trimStart();\n }\n\n for (const chunk of chunks) {\n await this.client.sendEvent(\n roomId,\n \"m.room.message\",\n {\n msgtype: \"m.text\",\n body: chunk,\n },\n \"\"\n );\n }\n\n console.log(\n `[Matrix] Split long message into ${chunks.length} chunks for room ${roomId}`\n );\n }\n }\n\n /**\n * Check if the bot is mentioned in the message body.\n * Looks for the bot's full userId (e.g. @bot:matrix.org) or the localpart\n * (e.g. bot).\n */\n private isMentioned(body: string): boolean {\n const lowerBody = body.toLowerCase();\n\n // Check for full userId mention (e.g. @opensentinel:matrix.org)\n if (lowerBody.includes(this.userId.toLowerCase())) {\n return true;\n }\n\n // Check for localpart mention (e.g. opensentinel)\n // userId format is @localpart:server\n const localpart = this.userId.split(\":\")[0]?.replace(\"@\", \"\");\n if (localpart && lowerBody.includes(localpart.toLowerCase())) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Check if a room is a direct message (has exactly 2 joined members).\n */\n private isDM(roomId: string): boolean {\n try {\n const room = this.client.getRoom(roomId);\n if (!room) return false;\n\n const members = room.getJoinedMembers();\n return members && members.length === 2;\n } catch (error) {\n console.error(\"[Matrix] Error checking if room is DM:\", error);\n return false;\n }\n }\n}\n\n/**\n * Create and configure a Matrix bot\n */\nexport function createMatrixBot(config: MatrixBotConfig): MatrixBot {\n return new MatrixBot(config);\n}\n\n/**\n * Default export\n */\nexport default {\n createMatrixBot,\n MatrixBot,\n};\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/inputs/matrix/index.ts"],"sourcesContent":["import sdk from \"matrix-js-sdk\";\nimport { chatWithTools, type Message } from \"../../core/brain\";\n\n/**\n * Matrix bot configuration\n */\nexport interface MatrixBotConfig {\n homeserverUrl: string;\n accessToken: string;\n userId: string;\n allowedRoomIds?: string[];\n autoJoin?: boolean;\n e2eEnabled?: boolean;\n}\n\n/**\n * Matrix bot class — connects to a Matrix homeserver and responds to messages\n * using the OpenSentinel brain (chatWithTools).\n */\nexport class MatrixBot {\n private client: any;\n private sessions: Map<string, Array<{ role: string; content: string }>> =\n new Map();\n private maxSessionMessages: number = 20;\n\n private homeserverUrl: string;\n private accessToken: string;\n private userId: string;\n private allowedRoomIds?: string[];\n private autoJoin: boolean;\n private e2eEnabled: boolean;\n\n constructor(config: MatrixBotConfig) {\n this.homeserverUrl = config.homeserverUrl;\n this.accessToken = config.accessToken;\n this.userId = config.userId;\n this.allowedRoomIds = config.allowedRoomIds;\n this.autoJoin = config.autoJoin ?? false;\n this.e2eEnabled = config.e2eEnabled ?? false;\n }\n\n /**\n * Start the Matrix bot — creates the client, registers event listeners,\n * and begins syncing with the homeserver.\n */\n async start(): Promise<void> {\n console.log(\"[Matrix] Starting bot...\");\n\n this.client = sdk.createClient({\n baseUrl: this.homeserverUrl,\n accessToken: this.accessToken,\n userId: this.userId,\n });\n\n // Handle incoming room timeline events (messages)\n this.client.on(\"Room.timeline\", async (event: any, room: any) => {\n try {\n // Only handle m.room.message events\n if (event.getType() !== \"m.room.message\") return;\n\n const sender: string = event.getSender();\n const roomId: string = room.roomId;\n\n // Ignore our own messages\n if (sender === this.userId) return;\n\n const content = event.getContent();\n\n // Ignore non-text messages (images, files, etc.)\n if (!content || content.msgtype !== \"m.text\") return;\n\n const body: string = content.body;\n if (!body || !body.trim()) return;\n\n // Check if room is in the allowed list (if configured)\n if (\n this.allowedRoomIds &&\n this.allowedRoomIds.length > 0 &&\n !this.allowedRoomIds.includes(roomId)\n ) {\n return;\n }\n\n // Only respond if the bot is mentioned or if it's a DM\n const mentioned = this.isMentioned(body);\n const dm = this.isDM(roomId);\n\n if (!mentioned && !dm) return;\n\n // Set typing indicator to show we're processing\n try {\n await this.client.sendTyping(roomId, true, 30000);\n } catch (err) {\n console.warn(\"[Matrix] Failed to set typing indicator:\", err);\n }\n\n // Process the message and get a response\n const response = await this.processMessage(roomId, sender, body);\n\n // Clear typing indicator\n try {\n await this.client.sendTyping(roomId, false, 0);\n } catch (err) {\n console.warn(\"[Matrix] Failed to clear typing indicator:\", err);\n }\n\n // Send the response, splitting if necessary\n await this.sendMessage(roomId, response);\n\n console.log(\n `[Matrix] Processed message from ${sender} in room ${roomId}`\n );\n } catch (error) {\n console.error(\"[Matrix] Error handling Room.timeline event:\", error);\n\n // Attempt to clear typing indicator on error\n try {\n await this.client.sendTyping(room.roomId, false, 0);\n } catch {\n // Ignore typing indicator cleanup errors\n }\n\n // Attempt to send error message to the room\n try {\n await this.client.sendEvent(\n room.roomId,\n \"m.room.message\",\n {\n msgtype: \"m.text\",\n body: \"Sorry, I encountered an error processing your message. Please try again.\",\n },\n \"\"\n );\n } catch (sendError) {\n console.error(\"[Matrix] Failed to send error message:\", sendError);\n }\n }\n });\n\n // Handle room membership events (auto-join invites)\n this.client.on(\n \"RoomMember.membership\",\n async (event: any, member: any) => {\n try {\n if (\n this.autoJoin &&\n member.membership === \"invite\" &&\n member.userId === this.userId\n ) {\n const roomId = member.roomId;\n console.log(`[Matrix] Auto-joining room: ${roomId}`);\n\n await this.client.joinRoom(roomId);\n console.log(`[Matrix] Successfully joined room: ${roomId}`);\n }\n } catch (error) {\n console.error(\"[Matrix] Error handling membership event:\", error);\n }\n }\n );\n\n // Start the client with a limited initial sync\n await this.client.startClient({ initialSyncLimit: 10 });\n\n console.log(`[Matrix] Bot started as ${this.userId}`);\n }\n\n /**\n * Stop the Matrix bot and disconnect from the homeserver.\n */\n async stop(): Promise<void> {\n console.log(\"[Matrix] Stopping bot...\");\n\n if (this.client) {\n this.client.stopClient();\n }\n\n console.log(\"[Matrix] Bot stopped\");\n }\n\n /**\n * Process an incoming message: manage session history, call chatWithTools,\n * and return the response text.\n */\n private async processMessage(\n roomId: string,\n sender: string,\n body: string\n ): Promise<string> {\n // Get or create the session for this room\n let session = this.sessions.get(roomId);\n if (!session) {\n session = [];\n this.sessions.set(roomId, session);\n }\n\n // Add the user message to the session\n session.push({ role: \"user\", content: body });\n\n // Trim session to the max allowed messages\n if (session.length > this.maxSessionMessages) {\n session.splice(0, session.length - this.maxSessionMessages);\n }\n\n try {\n // Call chatWithTools with the session messages\n const response = await chatWithTools(\n session as Message[],\n `matrix:${sender}`,\n async () => {\n // Refresh typing indicator during tool use\n try {\n await this.client.sendTyping(roomId, true, 30000);\n } catch {\n // Ignore typing indicator errors during tool use\n }\n }\n );\n\n // Add the assistant response to the session\n session.push({ role: \"assistant\", content: response.content });\n\n // Trim session again if needed\n if (session.length > this.maxSessionMessages) {\n session.splice(0, session.length - this.maxSessionMessages);\n }\n\n // Build response with tool usage info\n let finalResponse = response.content;\n if (response.toolsUsed && response.toolsUsed.length > 0) {\n const toolList = [...new Set(response.toolsUsed)].join(\", \");\n finalResponse = `[Used: ${toolList}]\\n\\n${response.content}`;\n }\n\n console.log(\n `[Matrix] Response generated. Tokens: ${response.inputTokens}/${response.outputTokens}` +\n (response.toolsUsed\n ? ` Tools: ${response.toolsUsed.join(\", \")}`\n : \"\")\n );\n\n return finalResponse;\n } catch (error) {\n console.error(\"[Matrix] Error calling chatWithTools:\", error);\n return \"Sorry, I encountered an error processing your message. Please try again.\";\n }\n }\n\n /**\n * Send a message to a room, splitting into multiple messages if the text\n * exceeds 4000 characters.\n */\n private async sendMessage(roomId: string, text: string): Promise<void> {\n const MAX_LENGTH = 4000;\n\n if (text.length <= MAX_LENGTH) {\n await this.client.sendEvent(\n roomId,\n \"m.room.message\",\n {\n msgtype: \"m.text\",\n body: text,\n },\n \"\"\n );\n } else {\n // Split into chunks at line boundaries when possible\n const chunks: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= MAX_LENGTH) {\n chunks.push(remaining);\n break;\n }\n\n // Try to split at a newline near the limit\n let splitIndex = remaining.lastIndexOf(\"\\n\", MAX_LENGTH);\n if (splitIndex === -1 || splitIndex < MAX_LENGTH * 0.5) {\n // If no good newline break, try a space\n splitIndex = remaining.lastIndexOf(\" \", MAX_LENGTH);\n }\n if (splitIndex === -1 || splitIndex < MAX_LENGTH * 0.5) {\n // Hard split as a last resort\n splitIndex = MAX_LENGTH;\n }\n\n chunks.push(remaining.substring(0, splitIndex));\n remaining = remaining.substring(splitIndex).trimStart();\n }\n\n for (const chunk of chunks) {\n await this.client.sendEvent(\n roomId,\n \"m.room.message\",\n {\n msgtype: \"m.text\",\n body: chunk,\n },\n \"\"\n );\n }\n\n console.log(\n `[Matrix] Split long message into ${chunks.length} chunks for room ${roomId}`\n );\n }\n }\n\n /**\n * Check if the bot is mentioned in the message body.\n * Looks for the bot's full userId (e.g. @bot:matrix.org) or the localpart\n * (e.g. bot).\n */\n private isMentioned(body: string): boolean {\n const lowerBody = body.toLowerCase();\n\n // Check for full userId mention (e.g. @opensentinel:matrix.org)\n if (lowerBody.includes(this.userId.toLowerCase())) {\n return true;\n }\n\n // Check for localpart mention (e.g. opensentinel)\n // userId format is @localpart:server\n const localpart = this.userId.split(\":\")[0]?.replace(\"@\", \"\");\n if (localpart && lowerBody.includes(localpart.toLowerCase())) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Check if a room is a direct message (has exactly 2 joined members).\n */\n private isDM(roomId: string): boolean {\n try {\n const room = this.client.getRoom(roomId);\n if (!room) return false;\n\n const members = room.getJoinedMembers();\n return members && members.length === 2;\n } catch (error) {\n console.error(\"[Matrix] Error checking if room is DM:\", error);\n return false;\n }\n }\n}\n\n/**\n * Create and configure a Matrix bot\n */\nexport function createMatrixBot(config: MatrixBotConfig): MatrixBot {\n return new MatrixBot(config);\n}\n\n/**\n * Default export\n */\nexport default {\n createMatrixBot,\n MatrixBot,\n};\n"],"mappings":"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","names":[]}
|
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
mcpToolToAnthropicTool,
|
|
12
12
|
mcpToolsToAnthropicTools,
|
|
13
13
|
parseMCPToolName
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-CZTMGHUC.js";
|
|
15
15
|
import "./chunk-UP2VWCW5.js";
|
|
16
16
|
export {
|
|
17
17
|
MCPClient,
|
|
@@ -27,4 +27,4 @@ export {
|
|
|
27
27
|
mcpToolsToAnthropicTools,
|
|
28
28
|
parseMCPToolName
|
|
29
29
|
};
|
|
30
|
-
//# sourceMappingURL=mcp-
|
|
30
|
+
//# sourceMappingURL=mcp-DJ2QDA6A.js.map
|
|
@@ -7,10 +7,10 @@ import {
|
|
|
7
7
|
metric,
|
|
8
8
|
queryMetrics,
|
|
9
9
|
recordMetric
|
|
10
|
-
} from "./chunk-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
10
|
+
} from "./chunk-YEDEAX6Y.js";
|
|
11
|
+
import "./chunk-5BTVJR7R.js";
|
|
12
|
+
import "./chunk-4KIHDIXZ.js";
|
|
13
|
+
import "./chunk-ZIBRVA3Y.js";
|
|
14
14
|
import "./chunk-UP2VWCW5.js";
|
|
15
15
|
export {
|
|
16
16
|
cleanupOldMetrics,
|
|
@@ -22,4 +22,4 @@ export {
|
|
|
22
22
|
queryMetrics,
|
|
23
23
|
recordMetric
|
|
24
24
|
};
|
|
25
|
-
//# sourceMappingURL=metrics-
|
|
25
|
+
//# sourceMappingURL=metrics-BH3ZLGEV.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
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
|
apiKeys,
|
|
7
7
|
organizationMembers,
|
|
8
8
|
organizations,
|
|
9
9
|
sessions,
|
|
10
10
|
users
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-ZIBRVA3Y.js";
|
|
12
12
|
import "./chunk-UP2VWCW5.js";
|
|
13
13
|
|
|
14
14
|
// src/core/enterprise/multi-user.ts
|
|
@@ -408,4 +408,4 @@ export {
|
|
|
408
408
|
suspendUser,
|
|
409
409
|
updateUser
|
|
410
410
|
};
|
|
411
|
-
//# sourceMappingURL=multi-user-
|
|
411
|
+
//# sourceMappingURL=multi-user-XAEMB244.js.map
|