opensentinel 3.1.1 → 3.6.1

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 (325) hide show
  1. package/README.md +126 -83
  2. package/dist/agent-manager-7N7REQZQ.js +39 -0
  3. package/dist/agent-processor-I23VWQY3.js +280 -0
  4. package/dist/agent-processor-I23VWQY3.js.map +1 -0
  5. package/dist/agent-types-2T4PXLFQ.js +12 -0
  6. package/dist/alerting-4I37GG4U.js +699 -0
  7. package/dist/alerting-4I37GG4U.js.map +1 -0
  8. package/dist/analysis-agent-JWN2GXYE.js +288 -0
  9. package/dist/analysis-agent-JWN2GXYE.js.map +1 -0
  10. package/dist/{archiver-AVNBYCKQ.js → archiver-XLRIIXPY.js} +86 -17
  11. package/dist/archiver-XLRIIXPY.js.map +1 -0
  12. package/dist/{audit-logger-OBPR7CRO.js → audit-logger-AU3TMWKI.js} +6 -5
  13. package/dist/{auth-UOX5K2BE.js → auth-PH5IHISW.js} +2 -2
  14. package/dist/{autonomy-ZXDBDQUJ.js → autonomy-N7W5XPLX.js} +4 -3
  15. package/dist/autonomy-N7W5XPLX.js.map +1 -0
  16. package/dist/{aws-s3-Q4LLZZPD.js → aws-s3-QZMURYXB.js} +2 -2
  17. package/dist/{backup-restore-PZ7CYYB7.js → backup-restore-72OQTZO3.js} +2 -2
  18. package/dist/{blocks-R3PODY47.js → blocks-YOWOESDD.js} +4 -4
  19. package/dist/bot-MU2TJQ3Y.js +46 -0
  20. package/dist/brain-SLA474EU.js +65 -0
  21. package/dist/{camera-monitor-M5CYKUU4.js → camera-monitor-LHTUWHEL.js} +2 -2
  22. package/dist/{charts-V7ARZNKF.js → charts-FJ32GQK7.js} +2 -2
  23. package/dist/{chunk-6PMVAAA7.js → chunk-2RGPWU77.js} +3 -3
  24. package/dist/{chunk-TVEWKIK3.js → chunk-2WTKTG2C.js} +2 -2
  25. package/dist/{chunk-MXAPLSJ5.js → chunk-45YXODSB.js} +2 -2
  26. package/dist/{chunk-SJSUSJ47.js → chunk-4YJRBMMA.js} +2 -2
  27. package/dist/chunk-643M3AP5.js +564 -0
  28. package/dist/chunk-643M3AP5.js.map +1 -0
  29. package/dist/{chunk-766ASQWE.js → chunk-6JY4HNUH.js} +2413 -2368
  30. package/dist/chunk-6JY4HNUH.js.map +1 -0
  31. package/dist/chunk-6LTLIYAQ.js +194 -0
  32. package/dist/chunk-6LTLIYAQ.js.map +1 -0
  33. package/dist/chunk-6UZPE35A.js +724 -0
  34. package/dist/chunk-6UZPE35A.js.map +1 -0
  35. package/dist/chunk-6W6PTJFT.js +181 -0
  36. package/dist/chunk-6W6PTJFT.js.map +1 -0
  37. package/dist/chunk-7MZN73J2.js +162 -0
  38. package/dist/chunk-7MZN73J2.js.map +1 -0
  39. package/dist/{chunk-SVAPX2XN.js → chunk-A24GPVLY.js} +9 -7
  40. package/dist/{chunk-SVAPX2XN.js.map → chunk-A24GPVLY.js.map} +1 -1
  41. package/dist/chunk-AD6YEH6U.js +3408 -0
  42. package/dist/chunk-AD6YEH6U.js.map +1 -0
  43. package/dist/chunk-ADTDYJO7.js +265 -0
  44. package/dist/chunk-ADTDYJO7.js.map +1 -0
  45. package/dist/{chunk-WRAKK6K6.js → chunk-AR34B6XR.js} +5 -3
  46. package/dist/{chunk-WRAKK6K6.js.map → chunk-AR34B6XR.js.map} +1 -1
  47. package/dist/chunk-BMOUYXLX.js +418 -0
  48. package/dist/chunk-BMOUYXLX.js.map +1 -0
  49. package/dist/chunk-C6PELIHS.js +60 -0
  50. package/dist/chunk-C6PELIHS.js.map +1 -0
  51. package/dist/{chunk-MQJ2ECQT.js → chunk-CUPEENUY.js} +3 -3
  52. package/dist/{chunk-RZ4YESBG.js → chunk-DOYGMNMK.js} +1 -1
  53. package/dist/chunk-DOYGMNMK.js.map +1 -0
  54. package/dist/chunk-FFV2SXFD.js +380 -0
  55. package/dist/chunk-FFV2SXFD.js.map +1 -0
  56. package/dist/{chunk-EVE7MIIY.js → chunk-GUKKW7JI.js} +15 -16
  57. package/dist/chunk-GUKKW7JI.js.map +1 -0
  58. package/dist/{chunk-66OJ3WB4.js → chunk-H3BOLSTS.js} +2 -2
  59. package/dist/chunk-HKOPRRDJ.js +1021 -0
  60. package/dist/chunk-HKOPRRDJ.js.map +1 -0
  61. package/dist/{chunk-BXZ6EA52.js → chunk-HTF2GIQC.js} +57 -3
  62. package/dist/chunk-HTF2GIQC.js.map +1 -0
  63. package/dist/{chunk-TYAGMJNV.js → chunk-JOA5A3G3.js} +5 -5
  64. package/dist/{chunk-OCVQGBJK.js → chunk-KABG5PG3.js} +6 -4
  65. package/dist/{chunk-OCVQGBJK.js.map → chunk-KABG5PG3.js.map} +1 -1
  66. package/dist/{chunk-VEHFVBLI.js → chunk-KT7NLIXP.js} +2 -2
  67. package/dist/chunk-LFDXEYYB.js +150 -0
  68. package/dist/chunk-LFDXEYYB.js.map +1 -0
  69. package/dist/{chunk-I6BDYQIG.js → chunk-M7YLQHFP.js} +6 -6
  70. package/dist/chunk-M7YLQHFP.js.map +1 -0
  71. package/dist/{chunk-AYUKPTSM.js → chunk-MFK34XSY.js} +96 -218
  72. package/dist/chunk-MFK34XSY.js.map +1 -0
  73. package/dist/chunk-MIC5IBQF.js +386 -0
  74. package/dist/chunk-MIC5IBQF.js.map +1 -0
  75. package/dist/{chunk-4UOE5TUZ.js → chunk-NMSHVO5O.js} +4 -4
  76. package/dist/{chunk-XKYRH4FM.js → chunk-NYVBXUGD.js} +13 -32
  77. package/dist/chunk-NYVBXUGD.js.map +1 -0
  78. package/dist/chunk-ODCFS5WD.js +463 -0
  79. package/dist/chunk-ODCFS5WD.js.map +1 -0
  80. package/dist/{chunk-ZLZKF2PM.js → chunk-PUNIMPMY.js} +32 -2
  81. package/dist/chunk-PUNIMPMY.js.map +1 -0
  82. package/dist/chunk-S4NJJS5C.js +37 -0
  83. package/dist/chunk-S4NJJS5C.js.map +1 -0
  84. package/dist/{chunk-NHMBTUMW.js → chunk-TAAZB5KN.js} +2 -2
  85. package/dist/{chunk-BRBWNV65.js → chunk-U2X2J3FI.js} +3 -3
  86. package/dist/chunk-U2X2J3FI.js.map +1 -0
  87. package/dist/{chunk-PLDDJCW6.js → chunk-UP2VWCW5.js} +1 -12
  88. package/dist/{chunk-4GLYY4NN.js → chunk-UWUIJTT4.js} +8 -2
  89. package/dist/chunk-UWUIJTT4.js.map +1 -0
  90. package/dist/{chunk-SPPMCAKG.js → chunk-VKMFUIVA.js} +2 -2
  91. package/dist/chunk-VKMFUIVA.js.map +1 -0
  92. package/dist/chunk-WZAH34TG.js +129 -0
  93. package/dist/chunk-WZAH34TG.js.map +1 -0
  94. package/dist/{chunk-H5RQOFO2.js → chunk-X6Q3K3L2.js} +6 -6
  95. package/dist/chunk-X6Q3K3L2.js.map +1 -0
  96. package/dist/chunk-XTX7EK43.js +134 -0
  97. package/dist/chunk-XTX7EK43.js.map +1 -0
  98. package/dist/chunk-ZIYTHUM5.js +457 -0
  99. package/dist/chunk-ZIYTHUM5.js.map +1 -0
  100. package/dist/chunker-K6WTR62A.js +12 -0
  101. package/dist/cli.js +1 -1
  102. package/dist/{client-ZQSFPMOB.js → client-FOIYPOZQ.js} +5 -6
  103. package/dist/{clipboard-manager-TEO2GEDN.js → clipboard-manager-4SBNESGZ.js} +2 -2
  104. package/dist/coding-agent-DESSU3AC.js +233 -0
  105. package/dist/coding-agent-DESSU3AC.js.map +1 -0
  106. package/dist/commands/setup.js +1 -1
  107. package/dist/commands/start.js +2 -2
  108. package/dist/commands/status.js +1 -1
  109. package/dist/commands/stop.js +1 -1
  110. package/dist/commands/utils.js +1 -1
  111. package/dist/cost-tracker-EMOIOYH7.js +11 -0
  112. package/dist/{cron-explain-HHQKPD3M.js → cron-explain-UOOOYWZZ.js} +2 -2
  113. package/dist/{crypto-4AP47IKC.js → crypto-2VG3RJR2.js} +2 -2
  114. package/dist/{databases-37X4CI2Y.js → databases-XDPMG5AV.js} +4 -4
  115. package/dist/db-LRIOKQBO.js +77 -0
  116. package/dist/discord-NKR3X4AV.js +80 -0
  117. package/dist/documents-EYIYLZK2.js +184 -0
  118. package/dist/documents-EYIYLZK2.js.map +1 -0
  119. package/dist/docx-parser-EXL4TN5E.js +16 -0
  120. package/dist/{email-K7LO2IPB.js → email-EAQNULVD.js} +33 -25
  121. package/dist/{email-K7LO2IPB.js.map → email-EAQNULVD.js.map} +1 -1
  122. package/dist/{enhanced-retrieval-DNLLEM4Z.js → enhanced-retrieval-OGHT6TS5.js} +11 -8
  123. package/dist/{enhanced-retrieval-DNLLEM4Z.js.map → enhanced-retrieval-OGHT6TS5.js.map} +1 -1
  124. package/dist/enrichment-pipeline-CMUVBDC7.js +14 -0
  125. package/dist/{entity-resolution-Y3IUWEAT.js → entity-resolution-4X4JU43O.js} +6 -5
  126. package/dist/env-CHOFICED.js +12 -0
  127. package/dist/error-tracker-SVQSDQDW.js +32 -0
  128. package/dist/finnhub-X7ZMQSXF.js +178 -0
  129. package/dist/finnhub-X7ZMQSXF.js.map +1 -0
  130. package/dist/fred-TMUF3J2V.js +203 -0
  131. package/dist/fred-TMUF3J2V.js.map +1 -0
  132. package/dist/github-KGNILDWJ.js +833 -0
  133. package/dist/github-KGNILDWJ.js.map +1 -0
  134. package/dist/{google-workspace-DKWUVNGC.js → google-workspace-TSZPZK5G.js} +2 -2
  135. package/dist/{hash-tool-ULQYD7B5.js → hash-tool-ENAB5LWH.js} +2 -2
  136. package/dist/{heartbeat-monitor-GCISLXI3.js → heartbeat-monitor-KRDYTDBF.js} +2 -2
  137. package/dist/hooks-N4MIFBVM.js +14 -0
  138. package/dist/{image-generation-OSU7FP6F.js → image-generation-MDE6AVQO.js} +2 -2
  139. package/dist/imessage-V2XNDDHT.js +43 -0
  140. package/dist/inbox-summarizer-DKKRYXDR.js +55 -0
  141. package/dist/{incident-response-C5J7Q6DT.js → incident-response-ZTIKUWEO.js} +8 -6
  142. package/dist/{incident-response-C5J7Q6DT.js.map → incident-response-ZTIKUWEO.js.map} +1 -1
  143. package/dist/{inventory-manager-352OHXWD.js → inventory-manager-C67BSZM6.js} +2 -2
  144. package/dist/{jira-GSGDBMIG.js → jira-PAGZWUBJ.js} +2 -2
  145. package/dist/{json-tool-QE2SYHEG.js → json-tool-4FK5RNER.js} +2 -2
  146. package/dist/{key-rotation-DPHU4ZTB.js → key-rotation-WCC5FOYS.js} +2 -2
  147. package/dist/knowledge-base-J7PJ7MZ3.js +46 -0
  148. package/dist/lib.d.ts +73 -1
  149. package/dist/lib.js +86 -76
  150. package/dist/lib.js.map +1 -1
  151. package/dist/{mailchimp-KKNF6QJ7.js → mailchimp-ZFYDC44J.js} +2 -2
  152. package/dist/{matrix-QVHG76I7.js → matrix-XHTR53VQ.js} +29 -21
  153. package/dist/{matrix-QVHG76I7.js.map → matrix-XHTR53VQ.js.map} +1 -1
  154. package/dist/{mcp-3JI6W7ZE.js → mcp-3C2TN67D.js} +3 -3
  155. package/dist/metrics-VJDWQWU7.js +25 -0
  156. package/dist/{microsoft365-UCBKJHNX.js → microsoft365-6G2IJMWC.js} +2 -2
  157. package/dist/multi-user-S56GUD6L.js +411 -0
  158. package/dist/multi-user-S56GUD6L.js.map +1 -0
  159. package/dist/{ocr-AC7NPX33.js → ocr-LGUIPKVZ.js} +6 -4
  160. package/dist/{ollama-BOAMSPLJ.js → ollama-J7CU45WT.js} +2 -2
  161. package/dist/osint-agent-RL5XPBRQ.js +189 -0
  162. package/dist/osint-agent-RL5XPBRQ.js.map +1 -0
  163. package/dist/{pages-MI523RB7.js → pages-XDE7JRCA.js} +5 -5
  164. package/dist/{pair-JDFTERIK.js → pair-YZJFQUU5.js} +2 -2
  165. package/dist/{pairing-IFQYCPNS.js → pairing-77N47RAT.js} +2 -2
  166. package/dist/{pdf-ALQVOEJR.js → pdf-67HGXCFJ.js} +3 -3
  167. package/dist/pdf-parser-YLMTTYHL.js +14 -0
  168. package/dist/{presentations-DSV5IHG5.js → presentations-HXTAMGHT.js} +3 -3
  169. package/dist/presentations-HXTAMGHT.js.map +1 -0
  170. package/dist/{prometheus-JNT2BD4L.js → prometheus-YETCZO4I.js} +2 -2
  171. package/dist/{providers-J4LYPHDR.js → providers-H6YIC3MG.js} +6 -4
  172. package/dist/{qr-code-WIX4PB4U.js → qr-code-6WZJHRKL.js} +2 -2
  173. package/dist/{quickbooks-XB4NII2S.js → quickbooks-N675W7IK.js} +2 -2
  174. package/dist/{regex-tool-W4ABRKGK.js → regex-tool-6Q63LQ7B.js} +2 -2
  175. package/dist/regex-tool-6Q63LQ7B.js.map +1 -0
  176. package/dist/research-agent-WCRSY3UZ.js +168 -0
  177. package/dist/research-agent-WCRSY3UZ.js.map +1 -0
  178. package/dist/risk-engine-YKCPT5D5.js +10 -0
  179. package/dist/risk-engine-YKCPT5D5.js.map +1 -0
  180. package/dist/scheduler-CA5UNHZV.js +73 -0
  181. package/dist/scheduler-CA5UNHZV.js.map +1 -0
  182. package/dist/schema-ALJ67YVG.js +72 -0
  183. package/dist/schema-ALJ67YVG.js.map +1 -0
  184. package/dist/{search-BCLBO5E3.js → search-GMLKBHSW.js} +4 -4
  185. package/dist/search-GMLKBHSW.js.map +1 -0
  186. package/dist/{sendgrid-RNXCAFKM.js → sendgrid-QGJIVPWV.js} +2 -2
  187. package/dist/{shopify-NCXYJB4R.js → shopify-ON2PAU27.js} +2 -2
  188. package/dist/signal-X7IQJGRQ.js +43 -0
  189. package/dist/signal-X7IQJGRQ.js.map +1 -0
  190. package/dist/slack-P2LFUJUQ.js +85 -0
  191. package/dist/slack-P2LFUJUQ.js.map +1 -0
  192. package/dist/{sms-M3JIOTCW.js → sms-4VME2HUL.js} +4 -4
  193. package/dist/sms-4VME2HUL.js.map +1 -0
  194. package/dist/{src-VYUE6LRA.js → src-S5KX4YEV.js} +179 -48
  195. package/dist/src-S5KX4YEV.js.map +1 -0
  196. package/dist/{stocks-XXWBPOCU.js → stocks-4M4HZWZS.js} +2 -2
  197. package/dist/stocks-4M4HZWZS.js.map +1 -0
  198. package/dist/text-extractor-OAUBAW5P.js +12 -0
  199. package/dist/text-extractor-OAUBAW5P.js.map +1 -0
  200. package/dist/{text-transform-6SGUA5Z4.js → text-transform-HCLCUDFZ.js} +2 -2
  201. package/dist/text-transform-HCLCUDFZ.js.map +1 -0
  202. package/dist/tools-FGPN522P.js +46 -0
  203. package/dist/tools-FGPN522P.js.map +1 -0
  204. package/dist/{tunnel-IWMXUML4.js → tunnel-XOUVVRAK.js} +4 -2
  205. package/dist/tunnel-XOUVVRAK.js.map +1 -0
  206. package/dist/{twilio-53GEW5JT.js → twilio-3L7DUNYQ.js} +2 -2
  207. package/dist/{unit-converter-ZYXMEZOE.js → unit-converter-LYPAHU64.js} +2 -2
  208. package/dist/unit-converter-LYPAHU64.js.map +1 -0
  209. package/dist/whatsapp-KRPQ4YUX.js +43 -0
  210. package/dist/whatsapp-KRPQ4YUX.js.map +1 -0
  211. package/dist/{word-document-7B6SJMAY.js → word-document-D6N2C47N.js} +4 -4
  212. package/dist/word-document-D6N2C47N.js.map +1 -0
  213. package/dist/workflow-store-ZYAYE5P6.js +373 -0
  214. package/dist/workflow-store-ZYAYE5P6.js.map +1 -0
  215. package/dist/writing-agent-VDGLNOGO.js +243 -0
  216. package/dist/writing-agent-VDGLNOGO.js.map +1 -0
  217. package/dist/{xero-QYO66D45.js → xero-UHAHVYSD.js} +2 -2
  218. package/dist/{zapier-webhook-TBZ5YF2A.js → zapier-webhook-NIELLTXR.js} +2 -2
  219. package/package.json +11 -1
  220. package/dist/archiver-AVNBYCKQ.js.map +0 -1
  221. package/dist/autonomy-ZXDBDQUJ.js.map +0 -1
  222. package/dist/bot-QRARP4UN.js +0 -36
  223. package/dist/brain-7XLLM3KC.js +0 -56
  224. package/dist/chunk-4GLYY4NN.js.map +0 -1
  225. package/dist/chunk-766ASQWE.js.map +0 -1
  226. package/dist/chunk-AYUKPTSM.js.map +0 -1
  227. package/dist/chunk-BRBWNV65.js.map +0 -1
  228. package/dist/chunk-BXZ6EA52.js.map +0 -1
  229. package/dist/chunk-EVE7MIIY.js.map +0 -1
  230. package/dist/chunk-H5RQOFO2.js.map +0 -1
  231. package/dist/chunk-I6BDYQIG.js.map +0 -1
  232. package/dist/chunk-IZJMVV7O.js +0 -347
  233. package/dist/chunk-IZJMVV7O.js.map +0 -1
  234. package/dist/chunk-O7IH7JTI.js +0 -1898
  235. package/dist/chunk-O7IH7JTI.js.map +0 -1
  236. package/dist/chunk-RZ4YESBG.js.map +0 -1
  237. package/dist/chunk-SPPMCAKG.js.map +0 -1
  238. package/dist/chunk-VRD5CYRL.js +0 -1568
  239. package/dist/chunk-VRD5CYRL.js.map +0 -1
  240. package/dist/chunk-XKYRH4FM.js.map +0 -1
  241. package/dist/chunk-ZLZKF2PM.js.map +0 -1
  242. package/dist/discord-B3HUPGQ6.js +0 -70
  243. package/dist/dist-UISMLMFN.js +0 -21847
  244. package/dist/dist-UISMLMFN.js.map +0 -1
  245. package/dist/enrichment-pipeline-MNHNW65K.js +0 -13
  246. package/dist/env-IWXUVTCB.js +0 -12
  247. package/dist/imessage-NGA2XF2V.js +0 -35
  248. package/dist/inbox-summarizer-NRI4S7IF.js +0 -47
  249. package/dist/presentations-DSV5IHG5.js.map +0 -1
  250. package/dist/scheduler-VK4WFERV.js +0 -63
  251. package/dist/signal-6CGDFYL2.js +0 -35
  252. package/dist/slack-IZQWIKOH.js +0 -75
  253. package/dist/src-VYUE6LRA.js.map +0 -1
  254. package/dist/tools-2RLEI2N6.js +0 -38
  255. package/dist/tunnel-IWMXUML4.js.map +0 -1
  256. package/dist/whatsapp-LFX6YKCM.js +0 -35
  257. package/dist/word-document-7B6SJMAY.js.map +0 -1
  258. /package/dist/{audit-logger-OBPR7CRO.js.map → agent-manager-7N7REQZQ.js.map} +0 -0
  259. /package/dist/{auth-UOX5K2BE.js.map → agent-types-2T4PXLFQ.js.map} +0 -0
  260. /package/dist/{backup-restore-PZ7CYYB7.js.map → audit-logger-AU3TMWKI.js.map} +0 -0
  261. /package/dist/{blocks-R3PODY47.js.map → auth-PH5IHISW.js.map} +0 -0
  262. /package/dist/{aws-s3-Q4LLZZPD.js.map → aws-s3-QZMURYXB.js.map} +0 -0
  263. /package/dist/{bot-QRARP4UN.js.map → backup-restore-72OQTZO3.js.map} +0 -0
  264. /package/dist/{brain-7XLLM3KC.js.map → blocks-YOWOESDD.js.map} +0 -0
  265. /package/dist/{chunk-PLDDJCW6.js.map → bot-MU2TJQ3Y.js.map} +0 -0
  266. /package/dist/{client-ZQSFPMOB.js.map → brain-SLA474EU.js.map} +0 -0
  267. /package/dist/{camera-monitor-M5CYKUU4.js.map → camera-monitor-LHTUWHEL.js.map} +0 -0
  268. /package/dist/{charts-V7ARZNKF.js.map → charts-FJ32GQK7.js.map} +0 -0
  269. /package/dist/{chunk-6PMVAAA7.js.map → chunk-2RGPWU77.js.map} +0 -0
  270. /package/dist/{chunk-TVEWKIK3.js.map → chunk-2WTKTG2C.js.map} +0 -0
  271. /package/dist/{chunk-MXAPLSJ5.js.map → chunk-45YXODSB.js.map} +0 -0
  272. /package/dist/{chunk-SJSUSJ47.js.map → chunk-4YJRBMMA.js.map} +0 -0
  273. /package/dist/{chunk-MQJ2ECQT.js.map → chunk-CUPEENUY.js.map} +0 -0
  274. /package/dist/{chunk-66OJ3WB4.js.map → chunk-H3BOLSTS.js.map} +0 -0
  275. /package/dist/{chunk-TYAGMJNV.js.map → chunk-JOA5A3G3.js.map} +0 -0
  276. /package/dist/{chunk-VEHFVBLI.js.map → chunk-KT7NLIXP.js.map} +0 -0
  277. /package/dist/{chunk-4UOE5TUZ.js.map → chunk-NMSHVO5O.js.map} +0 -0
  278. /package/dist/{chunk-NHMBTUMW.js.map → chunk-TAAZB5KN.js.map} +0 -0
  279. /package/dist/{clipboard-manager-TEO2GEDN.js.map → chunk-UP2VWCW5.js.map} +0 -0
  280. /package/dist/{cron-explain-HHQKPD3M.js.map → chunker-K6WTR62A.js.map} +0 -0
  281. /package/dist/{crypto-4AP47IKC.js.map → client-FOIYPOZQ.js.map} +0 -0
  282. /package/dist/{databases-37X4CI2Y.js.map → clipboard-manager-4SBNESGZ.js.map} +0 -0
  283. /package/dist/{discord-B3HUPGQ6.js.map → cost-tracker-EMOIOYH7.js.map} +0 -0
  284. /package/dist/{enrichment-pipeline-MNHNW65K.js.map → cron-explain-UOOOYWZZ.js.map} +0 -0
  285. /package/dist/{entity-resolution-Y3IUWEAT.js.map → crypto-2VG3RJR2.js.map} +0 -0
  286. /package/dist/{env-IWXUVTCB.js.map → databases-XDPMG5AV.js.map} +0 -0
  287. /package/dist/{hash-tool-ULQYD7B5.js.map → db-LRIOKQBO.js.map} +0 -0
  288. /package/dist/{heartbeat-monitor-GCISLXI3.js.map → discord-NKR3X4AV.js.map} +0 -0
  289. /package/dist/{imessage-NGA2XF2V.js.map → docx-parser-EXL4TN5E.js.map} +0 -0
  290. /package/dist/{inbox-summarizer-NRI4S7IF.js.map → enrichment-pipeline-CMUVBDC7.js.map} +0 -0
  291. /package/dist/{inventory-manager-352OHXWD.js.map → entity-resolution-4X4JU43O.js.map} +0 -0
  292. /package/dist/{json-tool-QE2SYHEG.js.map → env-CHOFICED.js.map} +0 -0
  293. /package/dist/{key-rotation-DPHU4ZTB.js.map → error-tracker-SVQSDQDW.js.map} +0 -0
  294. /package/dist/{google-workspace-DKWUVNGC.js.map → google-workspace-TSZPZK5G.js.map} +0 -0
  295. /package/dist/{mcp-3JI6W7ZE.js.map → hash-tool-ENAB5LWH.js.map} +0 -0
  296. /package/dist/{ocr-AC7NPX33.js.map → heartbeat-monitor-KRDYTDBF.js.map} +0 -0
  297. /package/dist/{ollama-BOAMSPLJ.js.map → hooks-N4MIFBVM.js.map} +0 -0
  298. /package/dist/{image-generation-OSU7FP6F.js.map → image-generation-MDE6AVQO.js.map} +0 -0
  299. /package/dist/{pages-MI523RB7.js.map → imessage-V2XNDDHT.js.map} +0 -0
  300. /package/dist/{pairing-IFQYCPNS.js.map → inbox-summarizer-DKKRYXDR.js.map} +0 -0
  301. /package/dist/{pdf-ALQVOEJR.js.map → inventory-manager-C67BSZM6.js.map} +0 -0
  302. /package/dist/{jira-GSGDBMIG.js.map → jira-PAGZWUBJ.js.map} +0 -0
  303. /package/dist/{prometheus-JNT2BD4L.js.map → json-tool-4FK5RNER.js.map} +0 -0
  304. /package/dist/{providers-J4LYPHDR.js.map → key-rotation-WCC5FOYS.js.map} +0 -0
  305. /package/dist/{qr-code-WIX4PB4U.js.map → knowledge-base-J7PJ7MZ3.js.map} +0 -0
  306. /package/dist/{mailchimp-KKNF6QJ7.js.map → mailchimp-ZFYDC44J.js.map} +0 -0
  307. /package/dist/{regex-tool-W4ABRKGK.js.map → mcp-3C2TN67D.js.map} +0 -0
  308. /package/dist/{scheduler-VK4WFERV.js.map → metrics-VJDWQWU7.js.map} +0 -0
  309. /package/dist/{microsoft365-UCBKJHNX.js.map → microsoft365-6G2IJMWC.js.map} +0 -0
  310. /package/dist/{search-BCLBO5E3.js.map → ocr-LGUIPKVZ.js.map} +0 -0
  311. /package/dist/{signal-6CGDFYL2.js.map → ollama-J7CU45WT.js.map} +0 -0
  312. /package/dist/{slack-IZQWIKOH.js.map → pages-XDE7JRCA.js.map} +0 -0
  313. /package/dist/{pair-JDFTERIK.js.map → pair-YZJFQUU5.js.map} +0 -0
  314. /package/dist/{sms-M3JIOTCW.js.map → pairing-77N47RAT.js.map} +0 -0
  315. /package/dist/{stocks-XXWBPOCU.js.map → pdf-67HGXCFJ.js.map} +0 -0
  316. /package/dist/{text-transform-6SGUA5Z4.js.map → pdf-parser-YLMTTYHL.js.map} +0 -0
  317. /package/dist/{tools-2RLEI2N6.js.map → prometheus-YETCZO4I.js.map} +0 -0
  318. /package/dist/{unit-converter-ZYXMEZOE.js.map → providers-H6YIC3MG.js.map} +0 -0
  319. /package/dist/{whatsapp-LFX6YKCM.js.map → qr-code-6WZJHRKL.js.map} +0 -0
  320. /package/dist/{quickbooks-XB4NII2S.js.map → quickbooks-N675W7IK.js.map} +0 -0
  321. /package/dist/{sendgrid-RNXCAFKM.js.map → sendgrid-QGJIVPWV.js.map} +0 -0
  322. /package/dist/{shopify-NCXYJB4R.js.map → shopify-ON2PAU27.js.map} +0 -0
  323. /package/dist/{twilio-53GEW5JT.js.map → twilio-3L7DUNYQ.js.map} +0 -0
  324. /package/dist/{xero-QYO66D45.js.map → xero-UHAHVYSD.js.map} +0 -0
  325. /package/dist/{zapier-webhook-TBZ5YF2A.js.map → zapier-webhook-NIELLTXR.js.map} +0 -0
package/README.md CHANGED
@@ -1,20 +1,58 @@
1
1
  # OpenSentinel
2
2
 
3
3
  [![CI](https://github.com/dsiemon2/OpenSentinel/actions/workflows/ci.yml/badge.svg)](https://github.com/dsiemon2/OpenSentinel/actions/workflows/ci.yml)
4
+ [![Version](https://img.shields.io/badge/version-3.6.1-blue)](https://github.com/dsiemon2/OpenSentinel/releases)
4
5
  [![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
5
6
  [![Bun](https://img.shields.io/badge/Bun-runtime-f9f1e1?logo=bun&logoColor=black)](https://bun.sh/)
6
7
  [![Docker](https://img.shields.io/badge/Docker-compose-2496ED?logo=docker&logoColor=white)](https://www.docker.com/)
8
+ [![Tests](https://img.shields.io/badge/tests-6%2C400%2B-brightgreen)](https://github.com/dsiemon2/OpenSentinel/actions)
7
9
  [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)
10
+ [![GitHub Stars](https://img.shields.io/github/stars/dsiemon2/OpenSentinel?style=social)](https://github.com/dsiemon2/OpenSentinel/stargazers)
8
11
 
9
- A self-hosted personal AI assistant powered by Claude, with JARVIS-like capabilities.
12
+ **Your self-hosted AI assistant: 9 LLM providers, 300+ features, 124 tools, 10+ channels, smart home, OSINT, finance, and more.**
10
13
 
11
- **Website**: [opensentinel.ai](https://opensentinel.ai) | **Dashboard**: [app.opensentinel.ai](https://app.opensentinel.ai)
14
+ **Website**: [opensentinel.ai](https://opensentinel.ai) | **Docs**: [docs.opensentinel.ai](https://docs.opensentinel.ai) | **Dashboard**: [app.opensentinel.ai](https://app.opensentinel.ai)
12
15
 
13
- ## What is OpenSentinel?
14
16
 
15
- OpenSentinel is your own personal AI assistant that runs on your infrastructure. Think of it like having Jarvis from Iron Man -- you can talk to it, ask questions, and it can take actions on your behalf. It connects to Telegram, Discord, Slack, a web dashboard, and a REST API, all backed by Claude as the reasoning engine.
17
+ ---
16
18
 
17
- ## Features
19
+ ## Table of Contents
20
+
21
+ - [Why OpenSentinel?](#why-opensentinel)
22
+ - [Key Features](#key-features)
23
+ - [Quick Start](#quick-start)
24
+ - [How to Use](#how-to-use)
25
+ - [Architecture](#architecture)
26
+ - [Comparison](#comparison)
27
+ - [Contributing](#contributing)
28
+ - [Community](#community)
29
+
30
+ ---
31
+
32
+ ## Why OpenSentinel?
33
+
34
+ OpenSentinel is a self-hosted personal AI assistant that runs on your infrastructure. Think JARVIS from Iron Man — talk to it via Telegram, Discord, Slack, or a web dashboard, and it takes action: controls your smart home, monitors your finances, searches public records, generates documents, and more.
35
+
36
+ Unlike chat-only interfaces, OpenSentinel is a **full-stack AI platform** with 124 tools, sub-agents, workflow automation, RAG memory, and enterprise security — all self-hosted.
37
+
38
+ **How it works**: You send a message (text, voice, or API call) → the Brain routes it to the right LLM provider → tools execute actions → you get a response with results.
39
+
40
+ ## Key Features
41
+
42
+ | Category | Highlights |
43
+ |----------|-----------|
44
+ | **LLM Providers** | Anthropic Claude, OpenAI, xAI Grok, Google Gemini, Groq, Mistral, OpenRouter, Ollama, custom endpoints |
45
+ | **Channels** | Telegram, Discord, Slack, Matrix, WhatsApp, Signal, iMessage, Zalo, Web Dashboard, Desktop App (Electron), Browser Extension |
46
+ | **Smart Home** | Home Assistant device control, automation triggers |
47
+ | **Finance** | Crypto trading (Coinbase/Binance), stocks, DeFi, Finnhub, FRED macroeconomic data |
48
+ | **OSINT** | FEC, SEC EDGAR, IRS 990, USASpending, OpenCorporates, entity resolution, graph explorer |
49
+ | **Productivity** | GitHub, Notion, Email (IMAP/SMTP), Google Drive, Dropbox, Spotify |
50
+ | **Voice** | Wake word detection, VAD, speaker diarization, ElevenLabs TTS |
51
+ | **Security** | AES-256-GCM encryption, 2FA, RBAC, SSO (SAML/OAuth/OIDC), audit logging, GDPR tools |
52
+ | **AI** | Sub-agents, RAG memory (HyDE, re-ranking, graph RAG), ML pipeline, workflow automation |
53
+
54
+ <details>
55
+ <summary><strong>Full Feature List (300+ features)</strong></summary>
18
56
 
19
57
  ### Core Capabilities
20
58
  - Answer questions and have conversations
@@ -24,6 +62,8 @@ OpenSentinel is your own personal AI assistant that runs on your infrastructure.
24
62
  - Search the internet
25
63
  - Set reminders and scheduled tasks
26
64
  - Remember things about you (advanced RAG: HyDE, re-ranking, multi-step, graph RAG, caching)
65
+ - Agentic RAG pipeline: tool pre-classification, memory middleware, pipeline orchestrator, Brain telemetry
66
+ - ML algorithms (Naive Bayes, Isolation Forest, K-Means, Markov Chain, Linear Regression) for intent parsing, anomaly detection, and forecasting
27
67
  - Respond with voice (JARVIS voice via ElevenLabs)
28
68
 
29
69
  ### Advanced Voice
@@ -34,17 +74,12 @@ OpenSentinel is your own personal AI assistant that runs on your infrastructure.
34
74
  - Noise cancellation
35
75
  - Voice note summarization
36
76
 
37
- ### Communication Platforms
38
- - Telegram bot with voice support
39
- - Discord bot with slash commands and voice channels
40
- - Slack bot with app mentions and threads
41
- - Matrix bot with mentions and DMs
42
- - Web dashboard
43
- - REST API
44
-
45
77
  ### Multi-Provider LLM
46
78
  - Anthropic Claude (default)
79
+ - Google Gemini (1M context, vision, tool use)
47
80
  - OpenRouter, Groq, Mistral, OpenAI
81
+ - xAI Grok
82
+ - HuggingFace Inference API (text embeddings)
48
83
  - Ollama (local/offline models)
49
84
  - Any OpenAI-compatible endpoint
50
85
  - Automatic provider registration from env vars
@@ -58,6 +93,7 @@ OpenSentinel is your own personal AI assistant that runs on your infrastructure.
58
93
 
59
94
  ### Multi-Modal Input
60
95
  - Image understanding and analysis
96
+ - Image/vision analysis from Web Chat uploads (base64 to Claude vision)
61
97
  - Document OCR
62
98
  - Screenshot interpretation
63
99
  - Video summarization
@@ -77,6 +113,8 @@ OpenSentinel is your own personal AI assistant that runs on your infrastructure.
77
113
  - Excel spreadsheets
78
114
  - Charts and diagrams
79
115
  - AI image generation (DALL-E)
116
+ - Secure file download UI with token-based access (1-hour expiry)
117
+ - Document parsing from uploads (PDF, DOCX, TXT, MD, HTML, CSV, JSON, XML, YAML)
80
118
 
81
119
  ### Personality System
82
120
  - 15 domain expert modes (coding, legal, medical, finance, etc.)
@@ -85,14 +123,13 @@ OpenSentinel is your own personal AI assistant that runs on your infrastructure.
85
123
  - Verbosity and humor controls
86
124
 
87
125
  ### Security
88
- - **Gateway token auth** (optional, disabled by default for self-hosted)
89
- - **AES-256-GCM field encryption** for data at rest
90
- - **Tamper-proof audit logs** with HMAC-SHA256 chain integrity
91
- - **Incident response system** with automated detection and escalation
126
+ - Gateway token auth (optional, disabled by default for self-hosted)
127
+ - AES-256-GCM field encryption for data at rest
128
+ - Tamper-proof audit logs with HMAC-SHA256 chain integrity
129
+ - Incident response system with automated detection and escalation
92
130
  - 2FA for sensitive operations (DB-persisted, encrypted secrets)
93
131
  - Biometric verification
94
132
  - Memory vault (encrypted storage)
95
- - Audit logging
96
133
  - GDPR compliance tools
97
134
  - Rate limiting
98
135
  - Autonomy levels (readonly/supervised/autonomous)
@@ -106,6 +143,8 @@ OpenSentinel is your own personal AI assistant that runs on your infrastructure.
106
143
  - Kubernetes deployment
107
144
 
108
145
  ### Observability
146
+ - Brain Dashboard with real-time pipeline visualization, activity feed, and score gauges
147
+ - Brain Telemetry event emitter with status state machine and metric accumulators
109
148
  - Metrics dashboard
110
149
  - Replay mode (re-run conversations)
111
150
  - Tool dry-run (preview without executing)
@@ -121,17 +160,14 @@ OpenSentinel is your own personal AI assistant that runs on your infrastructure.
121
160
  - **Home Assistant**: Smart home device control
122
161
  - **Spotify**: Playback, playlists, search
123
162
  - **Cloud Storage**: Google Drive, Dropbox
124
- - **Finance**: Crypto, stocks, currency, portfolio tracking, exchange trading (Coinbase/Binance), DeFi data, on-chain analytics, order books, backtesting
163
+ - **Finance**: Crypto, stocks, currency, portfolio tracking, exchange trading, DeFi, Finnhub, FRED
125
164
 
126
165
  ### OSINT & Public Records
127
- - **Graph Explorer**: D3.js force-directed knowledge graph visualization
128
- - **External API Search**: Auto-queries FEC, OpenCorporates when entities aren't in local DB
129
- - **Entity Resolution**: Jaro-Winkler fuzzy matching, exact/identifier/fuzzy/new resolution pipeline
130
- - **Public Records Clients**: FEC, SEC EDGAR, IRS 990, USASpending, OpenCorporates
131
- - **Rate Limiting**: Per-service sliding-window rate limiter for API compliance
132
-
133
- ### Infrastructure
134
- - Built-in tunnels (Cloudflare, ngrok, localtunnel)
166
+ - Graph Explorer: D3.js force-directed knowledge graph visualization
167
+ - External API Search: Auto-queries FEC, OpenCorporates when entities aren't in local DB
168
+ - Entity Resolution: Jaro-Winkler fuzzy matching pipeline
169
+ - Public Records Clients: FEC, SEC EDGAR, IRS 990, USASpending, OpenCorporates
170
+ - Rate Limiting: Per-service sliding-window rate limiter for API compliance
135
171
 
136
172
  ### Vision & Documents
137
173
  - Screen capture and webcam analysis
@@ -148,47 +184,42 @@ OpenSentinel is your own personal AI assistant that runs on your infrastructure.
148
184
  - **Electron Desktop App**: System tray, global hotkeys (Ctrl+Shift+M chat, Ctrl+Shift+O OpenSentinel)
149
185
  - **Browser Extension**: Chrome/Firefox popup chat, context menu
150
186
 
187
+ ### Infrastructure
188
+ - Built-in tunnels (Cloudflare, ngrok, localtunnel)
189
+ - Docker Compose (dev + hardened production config)
190
+
191
+ </details>
192
+
151
193
  ## Quick Start
152
194
 
195
+ ### Docker (Fastest)
196
+
197
+ ```bash
198
+ git clone https://github.com/dsiemon2/OpenSentinel.git
199
+ cd OpenSentinel
200
+ cp .env.example .env # Add your API keys (at minimum ANTHROPIC_API_KEY)
201
+ docker compose up -d # Starts PostgreSQL + Redis
202
+ bun install
203
+ bun run db:migrate
204
+ cd src/web && bun install && bun run build && cd ../..
205
+ bun run start
206
+ ```
207
+
208
+ Open [http://localhost:8030](http://localhost:8030) — no auth required by default (self-hosted).
209
+
210
+ ### Supported Platforms
211
+
212
+ | Platform | Status |
213
+ |----------|--------|
214
+ | Linux (Ubuntu/Debian) | Recommended |
215
+ | macOS | Supported |
216
+ | Windows (WSL2) | Supported |
217
+ | Docker | Supported |
218
+
153
219
  ### Prerequisites
154
220
  - [Bun](https://bun.sh) runtime
155
221
  - [Docker](https://docker.com) for PostgreSQL and Redis
156
- - API keys (Claude at minimum; see `.env.example` for all options)
157
-
158
- ### Installation
159
-
160
- 1. **Clone and install dependencies**
161
- ```bash
162
- git clone https://github.com/dsiemon2/OpenSentinel.git
163
- cd OpenSentinel
164
- bun install
165
- ```
166
-
167
- 2. **Set up environment variables**
168
- ```bash
169
- cp .env.example .env
170
- # Edit .env with your API keys
171
- ```
172
-
173
- 3. **Start database services**
174
- ```bash
175
- docker compose up -d
176
- ```
177
-
178
- 4. **Run database migrations**
179
- ```bash
180
- bun run db:migrate
181
- ```
182
-
183
- 5. **Build the web dashboard**
184
- ```bash
185
- cd src/web && bun install && bun run build && cd ../..
186
- ```
187
-
188
- 6. **Start OpenSentinel**
189
- ```bash
190
- bun run start
191
- ```
222
+ - API keys (Claude at minimum; see `.env.example` for all providers)
192
223
 
193
224
  ## How to Use
194
225
 
@@ -210,7 +241,7 @@ curl -X POST http://localhost:8030/api/ask \
210
241
  -d '{"message": "Hello, what can you do?"}'
211
242
  ```
212
243
 
213
- ## Commands (Telegram)
244
+ ### Telegram Commands
214
245
 
215
246
  | Command | Description |
216
247
  |---------|-------------|
@@ -239,13 +270,14 @@ curl -X POST http://localhost:8030/api/ask \
239
270
  │ Device Triggers │ │ │
240
271
  │ Calendar │ │ │
241
272
  ├─────────────────────────────────────────────────────────────────┤
242
- │ Providers: Anthropic, OpenRouter, Groq, Mistral, Ollama
273
+ │ Providers: Anthropic, OpenAI, xAI, Gemini, Groq, Mistral,
274
+ │ OpenRouter, Ollama, Custom │
243
275
  ├─────────────────────────────────────────────────────────────────┤
244
276
  │ Tools: Shell, Files, Browser, Search, OCR, Screenshots, │
245
- │ Video, Image Analysis, File Generation
277
+ │ Video, Image Analysis, File Generation (124 tools)
246
278
  ├─────────────────────────────────────────────────────────────────┤
247
279
  │ Intelligence: Predictive, Relationship Graph, Temporal, │
248
- │ Multi-lingual, Domain Experts
280
+ │ Multi-lingual, Domain Experts, ML Pipeline
249
281
  ├─────────────────────────────────────────────────────────────────┤
250
282
  │ Security: 2FA, Biometric, Vault, Audit, GDPR, Rate Limiting │
251
283
  ├─────────────────────────────────────────────────────────────────┤
@@ -255,6 +287,25 @@ curl -X POST http://localhost:8030/api/ask \
255
287
  └─────────────────────────────────────────────────────────────────┘
256
288
  ```
257
289
 
290
+ ## Comparison
291
+
292
+ | Feature | OpenSentinel | Open WebUI | Khoj | Leon AI |
293
+ |---------|:---:|:---:|:---:|:---:|
294
+ | LLM Providers | 9 | 3 | 3 | 1 |
295
+ | Chat Channels | 11 | 1 | 2 | 1 |
296
+ | Built-in Tools | 124 | ~20 | ~10 | ~30 |
297
+ | Smart Home | Home Assistant | - | - | - |
298
+ | Finance/Trading | Coinbase, Binance, Finnhub, FRED | - | - | - |
299
+ | OSINT/Public Records | FEC, SEC, IRS, OpenCorporates | - | - | - |
300
+ | Voice (Wake Word) | Yes | - | - | Yes |
301
+ | RAG Memory | HyDE, Graph RAG, Re-ranking | Basic | Yes | - |
302
+ | Sub-Agents | Yes | - | Yes | - |
303
+ | Workflow Automation | IFTTT-like | - | - | - |
304
+ | Enterprise SSO | SAML, OAuth, OIDC | LDAP | - | - |
305
+ | Desktop App | Electron | - | - | - |
306
+ | Browser Extension | Chrome/Firefox | - | Chrome | - |
307
+ | Test Coverage | 6,400+ tests | Unknown | Unknown | Unknown |
308
+
258
309
  ## Project Structure
259
310
 
260
311
  ```
@@ -269,13 +320,12 @@ src/
269
320
  │ ├── agents/ # Sub-agent system
270
321
  │ ├── enterprise/ # Multi-user, SSO, quotas
271
322
  │ ├── intelligence/ # Predictive, relationship, temporal
272
- │ ├── evolution/ # Evolution, achievements, modes
323
+ │ ├── ml/ # ML algorithms (Naive Bayes, Isolation Forest, K-Means)
273
324
  │ ├── observability/ # Metrics, replay, alerting
274
325
  │ ├── personality/ # Personas, mood, domain experts
275
326
  │ ├── plugins/ # Plugin system
276
327
  │ ├── providers/ # Multi-LLM provider abstraction
277
328
  │ ├── security/ # 2FA, vault, GDPR, audit
278
- │ ├── tunnel/ # Built-in tunnel support
279
329
  │ └── workflows/ # Automation engine
280
330
  ├── inputs/
281
331
  │ ├── telegram/ # Telegram bot
@@ -288,29 +338,21 @@ src/
288
338
  │ └── voice/ # Wake word, VAD, diarization
289
339
  ├── integrations/
290
340
  │ ├── email/ # IMAP/SMTP email
291
- │ ├── twilio/ # SMS/Phone calls
292
341
  │ ├── github/ # GitHub API
293
342
  │ ├── notion/ # Notion API
294
343
  │ ├── homeassistant/ # Home Assistant
295
344
  │ ├── spotify/ # Spotify API
296
- │ ├── cloud-storage/ # Google Drive, Dropbox
297
345
  │ ├── finance/ # Crypto, stocks, currency
298
- │ ├── public-records/ # FEC, SEC, IRS 990, USASpending, OpenCorporates
299
- │ ├── documents/ # Document ingestion
346
+ │ ├── public-records/ # FEC, SEC, IRS 990, OpenCorporates
300
347
  │ └── vision/ # Screen/webcam capture
301
- ├── tools/
302
- ├── file-generation/ # PDF, Word, Excel, PPT, images
303
- │ └── rendering/ # Math, code, markdown
304
- ├── outputs/
305
- │ ├── stt.ts # Speech-to-text
306
- │ └── tts.ts # Text-to-speech
307
- ├── db/
308
- │ └── schema.ts # Drizzle ORM schema
348
+ ├── tools/ # 124 tool implementations
349
+ ├── outputs/ # STT, TTS
350
+ ├── db/ # Database schema
309
351
  └── web/ # React dashboard
310
352
 
311
353
  desktop/ # Electron desktop app
312
354
  extension/ # Browser extension
313
- tests/ # 155+ test files, 5,000+ tests
355
+ tests/ # 187 test files, 6,400+ tests
314
356
  ```
315
357
 
316
358
  ## Ports
@@ -319,7 +361,7 @@ tests/ # 155+ test files, 5,000+ tests
319
361
  |---------|------|
320
362
  | OpenSentinel API + Dashboard | 8030 |
321
363
  | PostgreSQL | 5445 |
322
- | Redis | 6379 |
364
+ | Redis | 6385 |
323
365
 
324
366
  ## Contributing
325
367
 
@@ -348,6 +390,7 @@ Found a bug or have a feature request? [Open an issue](https://github.com/dsiemo
348
390
  - **GitHub Issues**: [Report bugs and request features](https://github.com/dsiemon2/OpenSentinel/issues)
349
391
  - **GitHub Discussions**: [Ask questions and share ideas](https://github.com/dsiemon2/OpenSentinel/discussions)
350
392
  - **Website**: [opensentinel.ai](https://opensentinel.ai)
393
+ - **Docs**: [docs.opensentinel.ai](https://docs.opensentinel.ai)
351
394
 
352
395
  ## License
353
396
 
@@ -0,0 +1,39 @@
1
+ import {
2
+ addAgentMessage,
3
+ addAgentProgress,
4
+ agentQueue,
5
+ agent_manager_default,
6
+ cancelAgent,
7
+ getAgent,
8
+ getAllAgents,
9
+ getRunningAgentCount,
10
+ getUserAgents,
11
+ shouldAgentStop,
12
+ spawnAgent,
13
+ updateAgentStatus,
14
+ updateAgentTokens
15
+ } from "./chunk-643M3AP5.js";
16
+ import "./chunk-6LTLIYAQ.js";
17
+ import "./chunk-BMOUYXLX.js";
18
+ import "./chunk-WZAH34TG.js";
19
+ import "./chunk-KABG5PG3.js";
20
+ import "./chunk-S4NJJS5C.js";
21
+ import "./chunk-PUNIMPMY.js";
22
+ import "./chunk-NYVBXUGD.js";
23
+ import "./chunk-UP2VWCW5.js";
24
+ export {
25
+ addAgentMessage,
26
+ addAgentProgress,
27
+ agentQueue,
28
+ cancelAgent,
29
+ agent_manager_default as default,
30
+ getAgent,
31
+ getAllAgents,
32
+ getRunningAgentCount,
33
+ getUserAgents,
34
+ shouldAgentStop,
35
+ spawnAgent,
36
+ updateAgentStatus,
37
+ updateAgentTokens
38
+ };
39
+ //# sourceMappingURL=agent-manager-7N7REQZQ.js.map
@@ -0,0 +1,280 @@
1
+ import {
2
+ AGENT_SYSTEM_PROMPTS,
3
+ AGENT_TOOL_PERMISSIONS
4
+ } from "./chunk-LFDXEYYB.js";
5
+ import {
6
+ TOOLS,
7
+ executeTool
8
+ } from "./chunk-6JY4HNUH.js";
9
+ import "./chunk-HKOPRRDJ.js";
10
+ import "./chunk-6UZPE35A.js";
11
+ import "./chunk-ADTDYJO7.js";
12
+ import "./chunk-CUPEENUY.js";
13
+ import "./chunk-2WTKTG2C.js";
14
+ import "./chunk-U2X2J3FI.js";
15
+ import "./chunk-X6Q3K3L2.js";
16
+ import "./chunk-ODCFS5WD.js";
17
+ import "./chunk-KM22GV7G.js";
18
+ import "./chunk-P6QINGFL.js";
19
+ import "./chunk-2RGPWU77.js";
20
+ import "./chunk-C6PELIHS.js";
21
+ import "./chunk-7WQO5J2M.js";
22
+ import {
23
+ addAgentMessage,
24
+ addAgentProgress,
25
+ shouldAgentStop,
26
+ updateAgentStatus,
27
+ updateAgentTokens
28
+ } from "./chunk-643M3AP5.js";
29
+ import {
30
+ metric
31
+ } from "./chunk-6LTLIYAQ.js";
32
+ import {
33
+ MODEL_TIERS
34
+ } from "./chunk-BMOUYXLX.js";
35
+ import "./chunk-WZAH34TG.js";
36
+ import "./chunk-6KONMXQ6.js";
37
+ import "./chunk-22VGGA7S.js";
38
+ import "./chunk-HN3F4WSW.js";
39
+ import "./chunk-A24GPVLY.js";
40
+ import "./chunk-AR34B6XR.js";
41
+ import "./chunk-UWUIJTT4.js";
42
+ import "./chunk-GUKKW7JI.js";
43
+ import {
44
+ providerRegistry
45
+ } from "./chunk-HTF2GIQC.js";
46
+ import "./chunk-DOYGMNMK.js";
47
+ import "./chunk-CQ4JURG7.js";
48
+ import "./chunk-KABG5PG3.js";
49
+ import "./chunk-S4NJJS5C.js";
50
+ import {
51
+ env
52
+ } from "./chunk-PUNIMPMY.js";
53
+ import "./chunk-NYVBXUGD.js";
54
+ import "./chunk-35WYTA3C.js";
55
+ import "./chunk-UP2VWCW5.js";
56
+
57
+ // src/core/agents/agent-processor.ts
58
+ import { Worker } from "bullmq";
59
+ import Redis from "ioredis";
60
+ var worker = null;
61
+ function getAgentTools(agentType, allTools = TOOLS) {
62
+ const allowedNames = new Set(AGENT_TOOL_PERMISSIONS[agentType] || []);
63
+ return allTools.filter((tool) => allowedNames.has(tool.name));
64
+ }
65
+ async function processAgentJob(job) {
66
+ const { agentId, userId, type, objective, context, tokenBudget, timeBudgetMs } = job.data;
67
+ console.log(`[AgentProcessor] Starting agent ${agentId} (type: ${type})`);
68
+ await updateAgentStatus(agentId, "running");
69
+ const startTime = Date.now();
70
+ const systemPrompt = AGENT_SYSTEM_PROMPTS[type] || AGENT_SYSTEM_PROMPTS.research;
71
+ const tools = getAgentTools(type);
72
+ let contextStr = "";
73
+ if (context && Object.keys(context).length > 0) {
74
+ contextStr = `
75
+
76
+ Context provided:
77
+ ${JSON.stringify(context, null, 2)}`;
78
+ }
79
+ const state = {
80
+ agentId,
81
+ step: 0,
82
+ totalInputTokens: 0,
83
+ totalOutputTokens: 0,
84
+ startTime,
85
+ messages: [
86
+ {
87
+ role: "user",
88
+ content: `Objective: ${objective}${contextStr}
89
+
90
+ Please begin working on this objective. Report your progress at each step.`
91
+ }
92
+ ]
93
+ };
94
+ await addAgentMessage(agentId, {
95
+ role: "user",
96
+ content: state.messages[0].content
97
+ });
98
+ const maxTurns = env.AGENT_MAX_TURNS ?? 20;
99
+ const model = MODEL_TIERS.balanced.model;
100
+ try {
101
+ for (let turn = 0; turn < maxTurns; turn++) {
102
+ const stopCheck = await shouldAgentStop(agentId);
103
+ if (stopCheck.stop) {
104
+ console.log(`[AgentProcessor] Agent ${agentId} stopped: ${stopCheck.reason}`);
105
+ const result2 = {
106
+ success: false,
107
+ error: stopCheck.reason,
108
+ tokensUsed: state.totalInputTokens + state.totalOutputTokens,
109
+ durationMs: Date.now() - startTime
110
+ };
111
+ await updateAgentStatus(agentId, stopCheck.reason?.includes("cancel") ? "cancelled" : "failed", result2);
112
+ return;
113
+ }
114
+ if (Date.now() - startTime >= timeBudgetMs) {
115
+ const result2 = {
116
+ success: false,
117
+ error: "Time budget exceeded",
118
+ tokensUsed: state.totalInputTokens + state.totalOutputTokens,
119
+ durationMs: Date.now() - startTime
120
+ };
121
+ await updateAgentStatus(agentId, "failed", result2);
122
+ return;
123
+ }
124
+ const provider = providerRegistry.getDefault();
125
+ const response = await provider.createMessage({
126
+ model,
127
+ max_tokens: 4096,
128
+ system: systemPrompt,
129
+ tools: tools.length > 0 ? tools : void 0,
130
+ messages: state.messages
131
+ });
132
+ state.totalInputTokens += response.usage.input_tokens;
133
+ state.totalOutputTokens += response.usage.output_tokens;
134
+ await updateAgentTokens(agentId, state.totalInputTokens + state.totalOutputTokens);
135
+ if (state.totalInputTokens + state.totalOutputTokens >= tokenBudget) {
136
+ const textContent = response.content.find((c) => c.type === "text");
137
+ const result2 = {
138
+ success: true,
139
+ summary: textContent?.text || "Token budget reached",
140
+ tokensUsed: state.totalInputTokens + state.totalOutputTokens,
141
+ durationMs: Date.now() - startTime
142
+ };
143
+ await updateAgentStatus(agentId, "completed", result2);
144
+ return;
145
+ }
146
+ if (response.stop_reason === "end_turn" || response.stop_reason === "stop") {
147
+ const textContent = response.content.find((c) => c.type === "text");
148
+ const finalText = textContent?.text || "";
149
+ await addAgentMessage(agentId, {
150
+ role: "assistant",
151
+ content: finalText
152
+ });
153
+ state.step++;
154
+ await addAgentProgress(agentId, state.step, "Completed objective", "completed", {
155
+ summary: finalText.slice(0, 500)
156
+ });
157
+ const result2 = {
158
+ success: true,
159
+ summary: finalText,
160
+ output: finalText,
161
+ tokensUsed: state.totalInputTokens + state.totalOutputTokens,
162
+ durationMs: Date.now() - startTime
163
+ };
164
+ await updateAgentStatus(agentId, "completed", result2);
165
+ console.log(`[AgentProcessor] Agent ${agentId} completed in ${turn + 1} turns`);
166
+ return;
167
+ }
168
+ if (response.stop_reason === "tool_use") {
169
+ const toolUseBlocks = response.content.filter((block) => block.type === "tool_use");
170
+ const toolResults = [];
171
+ for (const toolUse of toolUseBlocks) {
172
+ if (toolUse.type === "tool_use") {
173
+ const toolInput = { ...toolUse.input };
174
+ delete toolInput._callerContext;
175
+ state.step++;
176
+ await addAgentProgress(agentId, state.step, `Executing tool: ${toolUse.name}`, "running");
177
+ console.log(`[AgentProcessor] Agent ${agentId} using tool: ${toolUse.name}`);
178
+ const toolStartTime = Date.now();
179
+ try {
180
+ const result2 = await executeTool(toolUse.name, toolInput);
181
+ const toolDuration = Date.now() - toolStartTime;
182
+ metric.toolDuration(toolUse.name, toolDuration, result2.success);
183
+ toolResults.push({
184
+ type: "tool_result",
185
+ tool_use_id: toolUse.id,
186
+ content: JSON.stringify(result2)
187
+ });
188
+ await addAgentProgress(agentId, state.step, `Tool ${toolUse.name}: ${result2.success ? "success" : "failed"}`, result2.success ? "completed" : "failed");
189
+ } catch (err) {
190
+ const toolDuration = Date.now() - toolStartTime;
191
+ metric.toolDuration(toolUse.name, toolDuration, false);
192
+ toolResults.push({
193
+ type: "tool_result",
194
+ tool_use_id: toolUse.id,
195
+ content: JSON.stringify({ success: false, error: String(err) })
196
+ });
197
+ await addAgentProgress(agentId, state.step, `Tool ${toolUse.name} error: ${err}`, "failed");
198
+ }
199
+ }
200
+ }
201
+ state.messages.push({
202
+ role: "assistant",
203
+ content: response.content
204
+ });
205
+ state.messages.push({
206
+ role: "user",
207
+ content: toolResults
208
+ });
209
+ const textContent = response.content.find((c) => c.type === "text");
210
+ if (textContent?.text) {
211
+ await addAgentMessage(agentId, {
212
+ role: "assistant",
213
+ content: textContent.text
214
+ });
215
+ }
216
+ }
217
+ }
218
+ const result = {
219
+ success: true,
220
+ summary: `Agent completed after reaching max turns (${maxTurns})`,
221
+ tokensUsed: state.totalInputTokens + state.totalOutputTokens,
222
+ durationMs: Date.now() - startTime
223
+ };
224
+ await updateAgentStatus(agentId, "completed", result);
225
+ console.log(`[AgentProcessor] Agent ${agentId} reached max turns`);
226
+ } catch (error) {
227
+ console.error(`[AgentProcessor] Agent ${agentId} failed:`, error);
228
+ const result = {
229
+ success: false,
230
+ error: String(error),
231
+ tokensUsed: state.totalInputTokens + state.totalOutputTokens,
232
+ durationMs: Date.now() - startTime
233
+ };
234
+ await updateAgentStatus(agentId, "failed", result);
235
+ }
236
+ }
237
+ function startAgentProcessor() {
238
+ if (worker) {
239
+ console.log("[AgentProcessor] Worker already running");
240
+ return;
241
+ }
242
+ const concurrency = env.AGENT_PROCESSOR_CONCURRENCY ?? 1;
243
+ const connection = new Redis(env.REDIS_URL, {
244
+ maxRetriesPerRequest: null
245
+ });
246
+ worker = new Worker(
247
+ "sentinel-agents",
248
+ async (job) => {
249
+ await processAgentJob(job);
250
+ },
251
+ {
252
+ connection,
253
+ concurrency
254
+ }
255
+ );
256
+ worker.on("completed", (job) => {
257
+ console.log(`[AgentProcessor] Job ${job.id} completed for agent ${job.data.agentId}`);
258
+ metric.agentOperation("complete", job.data.type);
259
+ });
260
+ worker.on("failed", (job, err) => {
261
+ console.error(`[AgentProcessor] Job ${job?.id} failed:`, err.message);
262
+ if (job) {
263
+ metric.agentOperation("fail", job.data.type);
264
+ }
265
+ });
266
+ console.log(`[AgentProcessor] Worker started (concurrency: ${concurrency})`);
267
+ }
268
+ async function stopAgentProcessor() {
269
+ if (worker) {
270
+ await worker.close();
271
+ worker = null;
272
+ console.log("[AgentProcessor] Worker stopped");
273
+ }
274
+ }
275
+ export {
276
+ getAgentTools,
277
+ startAgentProcessor,
278
+ stopAgentProcessor
279
+ };
280
+ //# sourceMappingURL=agent-processor-I23VWQY3.js.map