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.
Files changed (197) hide show
  1. package/README.md +12 -0
  2. package/dist/{agent-manager-7N7REQZQ.js → agent-manager-JZ4IM7XI.js} +8 -8
  3. package/dist/{agent-processor-I23VWQY3.js → agent-processor-DDDHC2SO.js} +22 -21
  4. package/dist/{agent-processor-I23VWQY3.js.map → agent-processor-DDDHC2SO.js.map} +1 -1
  5. package/dist/{alerting-4I37GG4U.js → alerting-LK7VVYTX.js} +4 -4
  6. package/dist/alerting-LK7VVYTX.js.map +1 -0
  7. package/dist/analyzer-OTWE3ARE.js +22 -0
  8. package/dist/{archiver-XLRIIXPY.js → archiver-FPGKRP6P.js} +16 -85
  9. package/dist/archiver-FPGKRP6P.js.map +1 -0
  10. package/dist/{audit-logger-AU3TMWKI.js → audit-logger-CI4WZQPD.js} +5 -5
  11. package/dist/bot-VDHBGUVI.js +47 -0
  12. package/dist/{brain-SLA474EU.js → brain-6QTXN4QP.js} +18 -17
  13. package/dist/{chunk-AR34B6XR.js → chunk-2I5QHYG6.js} +3 -3
  14. package/dist/chunk-2I5QHYG6.js.map +1 -0
  15. package/dist/chunk-3AWAWRWB.js +143 -0
  16. package/dist/chunk-3AWAWRWB.js.map +1 -0
  17. package/dist/{chunk-PUNIMPMY.js → chunk-4KIHDIXZ.js} +13 -2
  18. package/dist/chunk-4KIHDIXZ.js.map +1 -0
  19. package/dist/{chunk-GUKKW7JI.js → chunk-4WH6MFEW.js} +2 -2
  20. package/dist/chunk-4WH6MFEW.js.map +1 -0
  21. package/dist/{chunk-M7YLQHFP.js → chunk-56UJS2LA.js} +6 -6
  22. package/dist/{chunk-S4NJJS5C.js → chunk-5BTVJR7R.js} +3 -3
  23. package/dist/{chunk-HKOPRRDJ.js → chunk-5JJTLWOR.js} +3 -3
  24. package/dist/chunk-5JJTLWOR.js.map +1 -0
  25. package/dist/chunk-66SAOZPU.js +236 -0
  26. package/dist/chunk-66SAOZPU.js.map +1 -0
  27. package/dist/chunk-6HGMRR4J.js +113 -0
  28. package/dist/chunk-6HGMRR4J.js.map +1 -0
  29. package/dist/{chunk-BMOUYXLX.js → chunk-6ZNCY2GI.js} +5 -5
  30. package/dist/chunk-7BNFELEK.js +31 -0
  31. package/dist/chunk-7BNFELEK.js.map +1 -0
  32. package/dist/{chunk-KABG5PG3.js → chunk-BBN4VCNK.js} +4 -4
  33. package/dist/chunk-BBN4VCNK.js.map +1 -0
  34. package/dist/{chunk-4YJRBMMA.js → chunk-BNZHWAZC.js} +2 -2
  35. package/dist/{chunk-TAAZB5KN.js → chunk-CWT6CAE5.js} +2 -2
  36. package/dist/{chunk-UWUIJTT4.js → chunk-CZTMGHUC.js} +1 -1
  37. package/dist/chunk-CZTMGHUC.js.map +1 -0
  38. package/dist/chunk-DTISLIMB.js +89 -0
  39. package/dist/chunk-DTISLIMB.js.map +1 -0
  40. package/dist/{chunk-VKMFUIVA.js → chunk-GBVJTRXS.js} +2 -2
  41. package/dist/{chunk-MFK34XSY.js → chunk-GJETKBOY.js} +15 -15
  42. package/dist/chunk-GJETKBOY.js.map +1 -0
  43. package/dist/{chunk-HTF2GIQC.js → chunk-GW6V4D43.js} +2 -2
  44. package/dist/chunk-GW6V4D43.js.map +1 -0
  45. package/dist/{chunk-2RGPWU77.js → chunk-HJSEEFO3.js} +2 -2
  46. package/dist/{chunk-JOA5A3G3.js → chunk-HQZQFEAX.js} +5 -5
  47. package/dist/{chunk-45YXODSB.js → chunk-J4JW73TT.js} +2 -2
  48. package/dist/{chunk-KT7NLIXP.js → chunk-JHYYFPKX.js} +2 -2
  49. package/dist/{chunk-XMCVRVTF.js → chunk-P64EV4YY.js} +1 -1
  50. package/dist/chunk-P64EV4YY.js.map +1 -0
  51. package/dist/chunk-PBOCSGNL.js +84 -0
  52. package/dist/chunk-PBOCSGNL.js.map +1 -0
  53. package/dist/{chunk-H3BOLSTS.js → chunk-PD3CTDO6.js} +2 -2
  54. package/dist/{chunk-6UZPE35A.js → chunk-QPY3WRVM.js} +10 -87
  55. package/dist/chunk-QPY3WRVM.js.map +1 -0
  56. package/dist/{chunk-AD6YEH6U.js → chunk-S2EOIVF4.js} +590 -91
  57. package/dist/chunk-S2EOIVF4.js.map +1 -0
  58. package/dist/chunk-SDLOMKCW.js +213 -0
  59. package/dist/chunk-SDLOMKCW.js.map +1 -0
  60. package/dist/{chunk-7MZN73J2.js → chunk-TKBVW7ZJ.js} +4 -4
  61. package/dist/{chunk-A24GPVLY.js → chunk-V3OKHQUX.js} +5 -5
  62. package/dist/{chunk-NMSHVO5O.js → chunk-WMDVOWN6.js} +4 -4
  63. package/dist/{chunk-643M3AP5.js → chunk-WMFYI7XC.js} +7 -7
  64. package/dist/{chunk-6LTLIYAQ.js → chunk-YEDEAX6Y.js} +3 -3
  65. package/dist/{chunk-NYVBXUGD.js → chunk-ZIBRVA3Y.js} +60 -1
  66. package/dist/chunk-ZIBRVA3Y.js.map +1 -0
  67. package/dist/{chunk-6JY4HNUH.js → chunk-ZMML6T63.js} +361 -24
  68. package/dist/chunk-ZMML6T63.js.map +1 -0
  69. package/dist/{chunk-FFV2SXFD.js → chunk-ZVHG4KF2.js} +4 -4
  70. package/dist/cli.js.map +1 -1
  71. package/dist/commands/setup.js +1 -1
  72. package/dist/commands/start.js +2 -2
  73. package/dist/commands/status.js +1 -1
  74. package/dist/commands/stop.js +1 -1
  75. package/dist/commands/utils.js +1 -1
  76. package/dist/{cost-tracker-EMOIOYH7.js → cost-tracker-KZQSTSE2.js} +2 -2
  77. package/dist/{db-LRIOKQBO.js → db-I7MNG6CL.js} +10 -4
  78. package/dist/{discord-NKR3X4AV.js → discord-6UQHCN27.js} +24 -23
  79. package/dist/{documents-EYIYLZK2.js → documents-PFHSK7SZ.js} +19 -19
  80. package/dist/{email-EAQNULVD.js → email-6OIN4SYL.js} +22 -21
  81. package/dist/email-6OIN4SYL.js.map +1 -0
  82. package/dist/{enhanced-retrieval-OGHT6TS5.js → enhanced-retrieval-JWX2HWU4.js} +7 -6
  83. package/dist/{enhanced-retrieval-OGHT6TS5.js.map → enhanced-retrieval-JWX2HWU4.js.map} +1 -1
  84. package/dist/enrichment-pipeline-7FE5R5ZI.js +14 -0
  85. package/dist/{entity-resolution-4X4JU43O.js → entity-resolution-7Z6STVXX.js} +5 -5
  86. package/dist/{env-CHOFICED.js → env-GN5VHI43.js} +2 -2
  87. package/dist/{error-tracker-SVQSDQDW.js → error-tracker-64DEH3D7.js} +6 -6
  88. package/dist/{github-KGNILDWJ.js → github-DUWSXCNP.js} +4 -4
  89. package/dist/graph-client-NB475AK5.js +17 -0
  90. package/dist/{imessage-V2XNDDHT.js → imessage-DSGSGUZS.js} +19 -18
  91. package/dist/{inbox-summarizer-DKKRYXDR.js → inbox-summarizer-F2KAU72V.js} +19 -18
  92. package/dist/{incident-response-ZTIKUWEO.js → incident-response-E3UGMX5G.js} +5 -5
  93. package/dist/incident-response-E3UGMX5G.js.map +1 -0
  94. package/dist/{knowledge-base-J7PJ7MZ3.js → knowledge-base-5SMMOGQJ.js} +5 -5
  95. package/dist/lib.d.ts +21 -0
  96. package/dist/lib.js +64 -57
  97. package/dist/lib.js.map +1 -1
  98. package/dist/{matrix-XHTR53VQ.js → matrix-WYGEOZL5.js} +18 -17
  99. package/dist/{matrix-XHTR53VQ.js.map → matrix-WYGEOZL5.js.map} +1 -1
  100. package/dist/{mcp-3C2TN67D.js → mcp-DJ2QDA6A.js} +2 -2
  101. package/dist/{metrics-VJDWQWU7.js → metrics-BH3ZLGEV.js} +5 -5
  102. package/dist/{multi-user-S56GUD6L.js → multi-user-XAEMB244.js} +4 -4
  103. package/dist/oauth-UPJYFOVU.js +34 -0
  104. package/dist/{ocr-LGUIPKVZ.js → ocr-UONKTQU7.js} +4 -4
  105. package/dist/{presentations-HXTAMGHT.js → presentations-UOET2FVZ.js} +2 -2
  106. package/dist/{providers-H6YIC3MG.js → providers-2YQ6E3IF.js} +3 -3
  107. package/dist/{scheduler-CA5UNHZV.js → scheduler-6PLLAQI7.js} +21 -20
  108. package/dist/{schema-ALJ67YVG.js → schema-ETY7L2VA.js} +8 -2
  109. package/dist/sharepoint-V5P4Q62L.js +30 -0
  110. package/dist/{signal-X7IQJGRQ.js → signal-7D5EPGVL.js} +19 -18
  111. package/dist/{slack-P2LFUJUQ.js → slack-KSS6YK5Z.js} +23 -22
  112. package/dist/slack-KSS6YK5Z.js.map +1 -0
  113. package/dist/{sms-4VME2HUL.js → sms-CSUCC7HL.js} +3 -3
  114. package/dist/sms-CSUCC7HL.js.map +1 -0
  115. package/dist/{src-S5KX4YEV.js → src-GO7GGW7O.js} +48 -41
  116. package/dist/{src-S5KX4YEV.js.map → src-GO7GGW7O.js.map} +1 -1
  117. package/dist/token-store-SEWRX6RE.js +20 -0
  118. package/dist/token-store-SEWRX6RE.js.map +1 -0
  119. package/dist/{tools-FGPN522P.js → tools-PJZ6RI4P.js} +18 -17
  120. package/dist/tools-PJZ6RI4P.js.map +1 -0
  121. package/dist/{whatsapp-KRPQ4YUX.js → whatsapp-DWXK25V2.js} +19 -18
  122. package/dist/whatsapp-DWXK25V2.js.map +1 -0
  123. package/dist/{word-document-D6N2C47N.js → word-document-AV3YB4L2.js} +2 -2
  124. package/dist/{workflow-store-ZYAYE5P6.js → workflow-store-5Y56GUP7.js} +4 -4
  125. package/drizzle/0002_mushy_master_mold.sql +139 -139
  126. package/drizzle/0003_overjoyed_rhodey.sql +46 -0
  127. package/drizzle/meta/0002_snapshot.json +3636 -3636
  128. package/drizzle/meta/0003_snapshot.json +3946 -0
  129. package/drizzle/meta/_journal.json +7 -0
  130. package/package.json +110 -110
  131. package/dist/alerting-4I37GG4U.js.map +0 -1
  132. package/dist/archiver-XLRIIXPY.js.map +0 -1
  133. package/dist/bot-MU2TJQ3Y.js +0 -46
  134. package/dist/chunk-6JY4HNUH.js.map +0 -1
  135. package/dist/chunk-6UZPE35A.js.map +0 -1
  136. package/dist/chunk-AD6YEH6U.js.map +0 -1
  137. package/dist/chunk-AR34B6XR.js.map +0 -1
  138. package/dist/chunk-GUKKW7JI.js.map +0 -1
  139. package/dist/chunk-HKOPRRDJ.js.map +0 -1
  140. package/dist/chunk-HTF2GIQC.js.map +0 -1
  141. package/dist/chunk-KABG5PG3.js.map +0 -1
  142. package/dist/chunk-MFK34XSY.js.map +0 -1
  143. package/dist/chunk-NYVBXUGD.js.map +0 -1
  144. package/dist/chunk-PUNIMPMY.js.map +0 -1
  145. package/dist/chunk-UWUIJTT4.js.map +0 -1
  146. package/dist/chunk-XMCVRVTF.js.map +0 -1
  147. package/dist/email-EAQNULVD.js.map +0 -1
  148. package/dist/enrichment-pipeline-CMUVBDC7.js +0 -14
  149. package/dist/incident-response-ZTIKUWEO.js.map +0 -1
  150. /package/dist/{agent-manager-7N7REQZQ.js.map → agent-manager-JZ4IM7XI.js.map} +0 -0
  151. /package/dist/{audit-logger-AU3TMWKI.js.map → analyzer-OTWE3ARE.js.map} +0 -0
  152. /package/dist/{bot-MU2TJQ3Y.js.map → audit-logger-CI4WZQPD.js.map} +0 -0
  153. /package/dist/{brain-SLA474EU.js.map → bot-VDHBGUVI.js.map} +0 -0
  154. /package/dist/{cost-tracker-EMOIOYH7.js.map → brain-6QTXN4QP.js.map} +0 -0
  155. /package/dist/{chunk-M7YLQHFP.js.map → chunk-56UJS2LA.js.map} +0 -0
  156. /package/dist/{chunk-S4NJJS5C.js.map → chunk-5BTVJR7R.js.map} +0 -0
  157. /package/dist/{chunk-BMOUYXLX.js.map → chunk-6ZNCY2GI.js.map} +0 -0
  158. /package/dist/{chunk-4YJRBMMA.js.map → chunk-BNZHWAZC.js.map} +0 -0
  159. /package/dist/{chunk-TAAZB5KN.js.map → chunk-CWT6CAE5.js.map} +0 -0
  160. /package/dist/{chunk-VKMFUIVA.js.map → chunk-GBVJTRXS.js.map} +0 -0
  161. /package/dist/{chunk-2RGPWU77.js.map → chunk-HJSEEFO3.js.map} +0 -0
  162. /package/dist/{chunk-JOA5A3G3.js.map → chunk-HQZQFEAX.js.map} +0 -0
  163. /package/dist/{chunk-45YXODSB.js.map → chunk-J4JW73TT.js.map} +0 -0
  164. /package/dist/{chunk-KT7NLIXP.js.map → chunk-JHYYFPKX.js.map} +0 -0
  165. /package/dist/{chunk-H3BOLSTS.js.map → chunk-PD3CTDO6.js.map} +0 -0
  166. /package/dist/{chunk-7MZN73J2.js.map → chunk-TKBVW7ZJ.js.map} +0 -0
  167. /package/dist/{chunk-A24GPVLY.js.map → chunk-V3OKHQUX.js.map} +0 -0
  168. /package/dist/{chunk-NMSHVO5O.js.map → chunk-WMDVOWN6.js.map} +0 -0
  169. /package/dist/{chunk-643M3AP5.js.map → chunk-WMFYI7XC.js.map} +0 -0
  170. /package/dist/{chunk-6LTLIYAQ.js.map → chunk-YEDEAX6Y.js.map} +0 -0
  171. /package/dist/{chunk-FFV2SXFD.js.map → chunk-ZVHG4KF2.js.map} +0 -0
  172. /package/dist/{db-LRIOKQBO.js.map → cost-tracker-KZQSTSE2.js.map} +0 -0
  173. /package/dist/{discord-NKR3X4AV.js.map → db-I7MNG6CL.js.map} +0 -0
  174. /package/dist/{enrichment-pipeline-CMUVBDC7.js.map → discord-6UQHCN27.js.map} +0 -0
  175. /package/dist/{documents-EYIYLZK2.js.map → documents-PFHSK7SZ.js.map} +0 -0
  176. /package/dist/{entity-resolution-4X4JU43O.js.map → enrichment-pipeline-7FE5R5ZI.js.map} +0 -0
  177. /package/dist/{env-CHOFICED.js.map → entity-resolution-7Z6STVXX.js.map} +0 -0
  178. /package/dist/{error-tracker-SVQSDQDW.js.map → env-GN5VHI43.js.map} +0 -0
  179. /package/dist/{imessage-V2XNDDHT.js.map → error-tracker-64DEH3D7.js.map} +0 -0
  180. /package/dist/{github-KGNILDWJ.js.map → github-DUWSXCNP.js.map} +0 -0
  181. /package/dist/{inbox-summarizer-DKKRYXDR.js.map → graph-client-NB475AK5.js.map} +0 -0
  182. /package/dist/{knowledge-base-J7PJ7MZ3.js.map → imessage-DSGSGUZS.js.map} +0 -0
  183. /package/dist/{mcp-3C2TN67D.js.map → inbox-summarizer-F2KAU72V.js.map} +0 -0
  184. /package/dist/{metrics-VJDWQWU7.js.map → knowledge-base-5SMMOGQJ.js.map} +0 -0
  185. /package/dist/{ocr-LGUIPKVZ.js.map → mcp-DJ2QDA6A.js.map} +0 -0
  186. /package/dist/{providers-H6YIC3MG.js.map → metrics-BH3ZLGEV.js.map} +0 -0
  187. /package/dist/{multi-user-S56GUD6L.js.map → multi-user-XAEMB244.js.map} +0 -0
  188. /package/dist/{scheduler-CA5UNHZV.js.map → oauth-UPJYFOVU.js.map} +0 -0
  189. /package/dist/{schema-ALJ67YVG.js.map → ocr-UONKTQU7.js.map} +0 -0
  190. /package/dist/{presentations-HXTAMGHT.js.map → presentations-UOET2FVZ.js.map} +0 -0
  191. /package/dist/{signal-X7IQJGRQ.js.map → providers-2YQ6E3IF.js.map} +0 -0
  192. /package/dist/{slack-P2LFUJUQ.js.map → scheduler-6PLLAQI7.js.map} +0 -0
  193. /package/dist/{sms-4VME2HUL.js.map → schema-ETY7L2VA.js.map} +0 -0
  194. /package/dist/{tools-FGPN522P.js.map → sharepoint-V5P4Q62L.js.map} +0 -0
  195. /package/dist/{whatsapp-KRPQ4YUX.js.map → signal-7D5EPGVL.js.map} +0 -0
  196. /package/dist/{word-document-D6N2C47N.js.map → word-document-AV3YB4L2.js.map} +0 -0
  197. /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-FFV2SXFD.js";
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-S4NJJS5C.js";
22
- import "./chunk-PUNIMPMY.js";
21
+ import "./chunk-5BTVJR7R.js";
22
+ import "./chunk-4KIHDIXZ.js";
23
23
  import {
24
24
  documentChunks,
25
25
  documents
26
- } from "./chunk-NYVBXUGD.js";
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-J7PJ7MZ3.js.map
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-AD6YEH6U.js";
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-M7YLQHFP.js";
6
+ } from "./chunk-56UJS2LA.js";
13
7
  import {
14
8
  DiscordBot
15
- } from "./chunk-JOA5A3G3.js";
16
- import "./chunk-45YXODSB.js";
9
+ } from "./chunk-HQZQFEAX.js";
10
+ import "./chunk-J4JW73TT.js";
17
11
  import {
18
12
  SlackBot
19
- } from "./chunk-NMSHVO5O.js";
20
- import "./chunk-4YJRBMMA.js";
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-MFK34XSY.js";
27
- import "./chunk-LFDXEYYB.js";
28
- import "./chunk-7MZN73J2.js";
20
+ } from "./chunk-GJETKBOY.js";
29
21
  import {
30
22
  WhatsAppBot
31
- } from "./chunk-H3BOLSTS.js";
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
- SYSTEM_PROMPT,
57
- TOOLS,
58
- chat,
59
- chatWithTools,
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-2RGPWU77.js";
124
+ import "./chunk-HJSEEFO3.js";
118
125
  import "./chunk-C6PELIHS.js";
119
126
  import "./chunk-7WQO5J2M.js";
120
- import "./chunk-643M3AP5.js";
121
- import "./chunk-6LTLIYAQ.js";
122
- import "./chunk-BMOUYXLX.js";
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-A24GPVLY.js";
128
- import "./chunk-AR34B6XR.js";
129
- import "./chunk-UWUIJTT4.js";
130
- import "./chunk-GUKKW7JI.js";
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-HTF2GIQC.js";
140
+ } from "./chunk-GW6V4D43.js";
134
141
  import "./chunk-DOYGMNMK.js";
135
142
  import "./chunk-CQ4JURG7.js";
136
- import "./chunk-KABG5PG3.js";
143
+ import "./chunk-BBN4VCNK.js";
137
144
  import {
138
145
  db
139
- } from "./chunk-S4NJJS5C.js";
146
+ } from "./chunk-5BTVJR7R.js";
140
147
  import {
141
148
  configure,
142
149
  env,
143
150
  ready
144
- } from "./chunk-PUNIMPMY.js";
145
- import "./chunk-NYVBXUGD.js";
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-MU2TJQ3Y.js");
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-CA5UNHZV.js");
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-3C2TN67D.js");
196
- const { setMCPRegistry } = await import("./tools-FGPN522P.js");
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-NKR3X4AV.js");
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-P2LFUJUQ.js");
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-KRPQ4YUX.js");
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-X7IQJGRQ.js");
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-V2XNDDHT.js");
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-CA5UNHZV.js");
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-6JY4HNUH.js";
4
- import "./chunk-HKOPRRDJ.js";
5
- import "./chunk-6UZPE35A.js";
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-2RGPWU77.js";
15
+ import "./chunk-HJSEEFO3.js";
15
16
  import "./chunk-C6PELIHS.js";
16
17
  import "./chunk-7WQO5J2M.js";
17
- import "./chunk-643M3AP5.js";
18
- import "./chunk-6LTLIYAQ.js";
19
- import "./chunk-BMOUYXLX.js";
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-A24GPVLY.js";
25
- import "./chunk-AR34B6XR.js";
26
- import "./chunk-UWUIJTT4.js";
27
- import "./chunk-GUKKW7JI.js";
28
- import "./chunk-HTF2GIQC.js";
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-KABG5PG3.js";
32
- import "./chunk-S4NJJS5C.js";
33
- import "./chunk-PUNIMPMY.js";
34
- import "./chunk-NYVBXUGD.js";
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-XHTR53VQ.js.map
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-UWUIJTT4.js";
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-3C2TN67D.js.map
30
+ //# sourceMappingURL=mcp-DJ2QDA6A.js.map
@@ -7,10 +7,10 @@ import {
7
7
  metric,
8
8
  queryMetrics,
9
9
  recordMetric
10
- } from "./chunk-6LTLIYAQ.js";
11
- import "./chunk-S4NJJS5C.js";
12
- import "./chunk-PUNIMPMY.js";
13
- import "./chunk-NYVBXUGD.js";
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-VJDWQWU7.js.map
25
+ //# sourceMappingURL=metrics-BH3ZLGEV.js.map
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  db
3
- } from "./chunk-S4NJJS5C.js";
4
- import "./chunk-PUNIMPMY.js";
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-NYVBXUGD.js";
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-S56GUD6L.js.map
411
+ //# sourceMappingURL=multi-user-XAEMB244.js.map