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.
- package/README.md +126 -83
- package/dist/agent-manager-7N7REQZQ.js +39 -0
- package/dist/agent-processor-I23VWQY3.js +280 -0
- package/dist/agent-processor-I23VWQY3.js.map +1 -0
- package/dist/agent-types-2T4PXLFQ.js +12 -0
- package/dist/alerting-4I37GG4U.js +699 -0
- package/dist/alerting-4I37GG4U.js.map +1 -0
- package/dist/analysis-agent-JWN2GXYE.js +288 -0
- package/dist/analysis-agent-JWN2GXYE.js.map +1 -0
- package/dist/{archiver-AVNBYCKQ.js → archiver-XLRIIXPY.js} +86 -17
- package/dist/archiver-XLRIIXPY.js.map +1 -0
- package/dist/{audit-logger-OBPR7CRO.js → audit-logger-AU3TMWKI.js} +6 -5
- package/dist/{auth-UOX5K2BE.js → auth-PH5IHISW.js} +2 -2
- package/dist/{autonomy-ZXDBDQUJ.js → autonomy-N7W5XPLX.js} +4 -3
- package/dist/autonomy-N7W5XPLX.js.map +1 -0
- package/dist/{aws-s3-Q4LLZZPD.js → aws-s3-QZMURYXB.js} +2 -2
- package/dist/{backup-restore-PZ7CYYB7.js → backup-restore-72OQTZO3.js} +2 -2
- package/dist/{blocks-R3PODY47.js → blocks-YOWOESDD.js} +4 -4
- package/dist/bot-MU2TJQ3Y.js +46 -0
- package/dist/brain-SLA474EU.js +65 -0
- package/dist/{camera-monitor-M5CYKUU4.js → camera-monitor-LHTUWHEL.js} +2 -2
- package/dist/{charts-V7ARZNKF.js → charts-FJ32GQK7.js} +2 -2
- package/dist/{chunk-6PMVAAA7.js → chunk-2RGPWU77.js} +3 -3
- package/dist/{chunk-TVEWKIK3.js → chunk-2WTKTG2C.js} +2 -2
- package/dist/{chunk-MXAPLSJ5.js → chunk-45YXODSB.js} +2 -2
- package/dist/{chunk-SJSUSJ47.js → chunk-4YJRBMMA.js} +2 -2
- package/dist/chunk-643M3AP5.js +564 -0
- package/dist/chunk-643M3AP5.js.map +1 -0
- package/dist/{chunk-766ASQWE.js → chunk-6JY4HNUH.js} +2413 -2368
- package/dist/chunk-6JY4HNUH.js.map +1 -0
- package/dist/chunk-6LTLIYAQ.js +194 -0
- package/dist/chunk-6LTLIYAQ.js.map +1 -0
- package/dist/chunk-6UZPE35A.js +724 -0
- package/dist/chunk-6UZPE35A.js.map +1 -0
- package/dist/chunk-6W6PTJFT.js +181 -0
- package/dist/chunk-6W6PTJFT.js.map +1 -0
- package/dist/chunk-7MZN73J2.js +162 -0
- package/dist/chunk-7MZN73J2.js.map +1 -0
- package/dist/{chunk-SVAPX2XN.js → chunk-A24GPVLY.js} +9 -7
- package/dist/{chunk-SVAPX2XN.js.map → chunk-A24GPVLY.js.map} +1 -1
- package/dist/chunk-AD6YEH6U.js +3408 -0
- package/dist/chunk-AD6YEH6U.js.map +1 -0
- package/dist/chunk-ADTDYJO7.js +265 -0
- package/dist/chunk-ADTDYJO7.js.map +1 -0
- package/dist/{chunk-WRAKK6K6.js → chunk-AR34B6XR.js} +5 -3
- package/dist/{chunk-WRAKK6K6.js.map → chunk-AR34B6XR.js.map} +1 -1
- package/dist/chunk-BMOUYXLX.js +418 -0
- package/dist/chunk-BMOUYXLX.js.map +1 -0
- package/dist/chunk-C6PELIHS.js +60 -0
- package/dist/chunk-C6PELIHS.js.map +1 -0
- package/dist/{chunk-MQJ2ECQT.js → chunk-CUPEENUY.js} +3 -3
- package/dist/{chunk-RZ4YESBG.js → chunk-DOYGMNMK.js} +1 -1
- package/dist/chunk-DOYGMNMK.js.map +1 -0
- package/dist/chunk-FFV2SXFD.js +380 -0
- package/dist/chunk-FFV2SXFD.js.map +1 -0
- package/dist/{chunk-EVE7MIIY.js → chunk-GUKKW7JI.js} +15 -16
- package/dist/chunk-GUKKW7JI.js.map +1 -0
- package/dist/{chunk-66OJ3WB4.js → chunk-H3BOLSTS.js} +2 -2
- package/dist/chunk-HKOPRRDJ.js +1021 -0
- package/dist/chunk-HKOPRRDJ.js.map +1 -0
- package/dist/{chunk-BXZ6EA52.js → chunk-HTF2GIQC.js} +57 -3
- package/dist/chunk-HTF2GIQC.js.map +1 -0
- package/dist/{chunk-TYAGMJNV.js → chunk-JOA5A3G3.js} +5 -5
- package/dist/{chunk-OCVQGBJK.js → chunk-KABG5PG3.js} +6 -4
- package/dist/{chunk-OCVQGBJK.js.map → chunk-KABG5PG3.js.map} +1 -1
- package/dist/{chunk-VEHFVBLI.js → chunk-KT7NLIXP.js} +2 -2
- package/dist/chunk-LFDXEYYB.js +150 -0
- package/dist/chunk-LFDXEYYB.js.map +1 -0
- package/dist/{chunk-I6BDYQIG.js → chunk-M7YLQHFP.js} +6 -6
- package/dist/chunk-M7YLQHFP.js.map +1 -0
- package/dist/{chunk-AYUKPTSM.js → chunk-MFK34XSY.js} +96 -218
- package/dist/chunk-MFK34XSY.js.map +1 -0
- package/dist/chunk-MIC5IBQF.js +386 -0
- package/dist/chunk-MIC5IBQF.js.map +1 -0
- package/dist/{chunk-4UOE5TUZ.js → chunk-NMSHVO5O.js} +4 -4
- package/dist/{chunk-XKYRH4FM.js → chunk-NYVBXUGD.js} +13 -32
- package/dist/chunk-NYVBXUGD.js.map +1 -0
- package/dist/chunk-ODCFS5WD.js +463 -0
- package/dist/chunk-ODCFS5WD.js.map +1 -0
- package/dist/{chunk-ZLZKF2PM.js → chunk-PUNIMPMY.js} +32 -2
- package/dist/chunk-PUNIMPMY.js.map +1 -0
- package/dist/chunk-S4NJJS5C.js +37 -0
- package/dist/chunk-S4NJJS5C.js.map +1 -0
- package/dist/{chunk-NHMBTUMW.js → chunk-TAAZB5KN.js} +2 -2
- package/dist/{chunk-BRBWNV65.js → chunk-U2X2J3FI.js} +3 -3
- package/dist/chunk-U2X2J3FI.js.map +1 -0
- package/dist/{chunk-PLDDJCW6.js → chunk-UP2VWCW5.js} +1 -12
- package/dist/{chunk-4GLYY4NN.js → chunk-UWUIJTT4.js} +8 -2
- package/dist/chunk-UWUIJTT4.js.map +1 -0
- package/dist/{chunk-SPPMCAKG.js → chunk-VKMFUIVA.js} +2 -2
- package/dist/chunk-VKMFUIVA.js.map +1 -0
- package/dist/chunk-WZAH34TG.js +129 -0
- package/dist/chunk-WZAH34TG.js.map +1 -0
- package/dist/{chunk-H5RQOFO2.js → chunk-X6Q3K3L2.js} +6 -6
- package/dist/chunk-X6Q3K3L2.js.map +1 -0
- package/dist/chunk-XTX7EK43.js +134 -0
- package/dist/chunk-XTX7EK43.js.map +1 -0
- package/dist/chunk-ZIYTHUM5.js +457 -0
- package/dist/chunk-ZIYTHUM5.js.map +1 -0
- package/dist/chunker-K6WTR62A.js +12 -0
- package/dist/cli.js +1 -1
- package/dist/{client-ZQSFPMOB.js → client-FOIYPOZQ.js} +5 -6
- package/dist/{clipboard-manager-TEO2GEDN.js → clipboard-manager-4SBNESGZ.js} +2 -2
- package/dist/coding-agent-DESSU3AC.js +233 -0
- package/dist/coding-agent-DESSU3AC.js.map +1 -0
- package/dist/commands/setup.js +1 -1
- package/dist/commands/start.js +2 -2
- package/dist/commands/status.js +1 -1
- package/dist/commands/stop.js +1 -1
- package/dist/commands/utils.js +1 -1
- package/dist/cost-tracker-EMOIOYH7.js +11 -0
- package/dist/{cron-explain-HHQKPD3M.js → cron-explain-UOOOYWZZ.js} +2 -2
- package/dist/{crypto-4AP47IKC.js → crypto-2VG3RJR2.js} +2 -2
- package/dist/{databases-37X4CI2Y.js → databases-XDPMG5AV.js} +4 -4
- package/dist/db-LRIOKQBO.js +77 -0
- package/dist/discord-NKR3X4AV.js +80 -0
- package/dist/documents-EYIYLZK2.js +184 -0
- package/dist/documents-EYIYLZK2.js.map +1 -0
- package/dist/docx-parser-EXL4TN5E.js +16 -0
- package/dist/{email-K7LO2IPB.js → email-EAQNULVD.js} +33 -25
- package/dist/{email-K7LO2IPB.js.map → email-EAQNULVD.js.map} +1 -1
- package/dist/{enhanced-retrieval-DNLLEM4Z.js → enhanced-retrieval-OGHT6TS5.js} +11 -8
- package/dist/{enhanced-retrieval-DNLLEM4Z.js.map → enhanced-retrieval-OGHT6TS5.js.map} +1 -1
- package/dist/enrichment-pipeline-CMUVBDC7.js +14 -0
- package/dist/{entity-resolution-Y3IUWEAT.js → entity-resolution-4X4JU43O.js} +6 -5
- package/dist/env-CHOFICED.js +12 -0
- package/dist/error-tracker-SVQSDQDW.js +32 -0
- package/dist/finnhub-X7ZMQSXF.js +178 -0
- package/dist/finnhub-X7ZMQSXF.js.map +1 -0
- package/dist/fred-TMUF3J2V.js +203 -0
- package/dist/fred-TMUF3J2V.js.map +1 -0
- package/dist/github-KGNILDWJ.js +833 -0
- package/dist/github-KGNILDWJ.js.map +1 -0
- package/dist/{google-workspace-DKWUVNGC.js → google-workspace-TSZPZK5G.js} +2 -2
- package/dist/{hash-tool-ULQYD7B5.js → hash-tool-ENAB5LWH.js} +2 -2
- package/dist/{heartbeat-monitor-GCISLXI3.js → heartbeat-monitor-KRDYTDBF.js} +2 -2
- package/dist/hooks-N4MIFBVM.js +14 -0
- package/dist/{image-generation-OSU7FP6F.js → image-generation-MDE6AVQO.js} +2 -2
- package/dist/imessage-V2XNDDHT.js +43 -0
- package/dist/inbox-summarizer-DKKRYXDR.js +55 -0
- package/dist/{incident-response-C5J7Q6DT.js → incident-response-ZTIKUWEO.js} +8 -6
- package/dist/{incident-response-C5J7Q6DT.js.map → incident-response-ZTIKUWEO.js.map} +1 -1
- package/dist/{inventory-manager-352OHXWD.js → inventory-manager-C67BSZM6.js} +2 -2
- package/dist/{jira-GSGDBMIG.js → jira-PAGZWUBJ.js} +2 -2
- package/dist/{json-tool-QE2SYHEG.js → json-tool-4FK5RNER.js} +2 -2
- package/dist/{key-rotation-DPHU4ZTB.js → key-rotation-WCC5FOYS.js} +2 -2
- package/dist/knowledge-base-J7PJ7MZ3.js +46 -0
- package/dist/lib.d.ts +73 -1
- package/dist/lib.js +86 -76
- package/dist/lib.js.map +1 -1
- package/dist/{mailchimp-KKNF6QJ7.js → mailchimp-ZFYDC44J.js} +2 -2
- package/dist/{matrix-QVHG76I7.js → matrix-XHTR53VQ.js} +29 -21
- package/dist/{matrix-QVHG76I7.js.map → matrix-XHTR53VQ.js.map} +1 -1
- package/dist/{mcp-3JI6W7ZE.js → mcp-3C2TN67D.js} +3 -3
- package/dist/metrics-VJDWQWU7.js +25 -0
- package/dist/{microsoft365-UCBKJHNX.js → microsoft365-6G2IJMWC.js} +2 -2
- package/dist/multi-user-S56GUD6L.js +411 -0
- package/dist/multi-user-S56GUD6L.js.map +1 -0
- package/dist/{ocr-AC7NPX33.js → ocr-LGUIPKVZ.js} +6 -4
- package/dist/{ollama-BOAMSPLJ.js → ollama-J7CU45WT.js} +2 -2
- package/dist/osint-agent-RL5XPBRQ.js +189 -0
- package/dist/osint-agent-RL5XPBRQ.js.map +1 -0
- package/dist/{pages-MI523RB7.js → pages-XDE7JRCA.js} +5 -5
- package/dist/{pair-JDFTERIK.js → pair-YZJFQUU5.js} +2 -2
- package/dist/{pairing-IFQYCPNS.js → pairing-77N47RAT.js} +2 -2
- package/dist/{pdf-ALQVOEJR.js → pdf-67HGXCFJ.js} +3 -3
- package/dist/pdf-parser-YLMTTYHL.js +14 -0
- package/dist/{presentations-DSV5IHG5.js → presentations-HXTAMGHT.js} +3 -3
- package/dist/presentations-HXTAMGHT.js.map +1 -0
- package/dist/{prometheus-JNT2BD4L.js → prometheus-YETCZO4I.js} +2 -2
- package/dist/{providers-J4LYPHDR.js → providers-H6YIC3MG.js} +6 -4
- package/dist/{qr-code-WIX4PB4U.js → qr-code-6WZJHRKL.js} +2 -2
- package/dist/{quickbooks-XB4NII2S.js → quickbooks-N675W7IK.js} +2 -2
- package/dist/{regex-tool-W4ABRKGK.js → regex-tool-6Q63LQ7B.js} +2 -2
- package/dist/regex-tool-6Q63LQ7B.js.map +1 -0
- package/dist/research-agent-WCRSY3UZ.js +168 -0
- package/dist/research-agent-WCRSY3UZ.js.map +1 -0
- package/dist/risk-engine-YKCPT5D5.js +10 -0
- package/dist/risk-engine-YKCPT5D5.js.map +1 -0
- package/dist/scheduler-CA5UNHZV.js +73 -0
- package/dist/scheduler-CA5UNHZV.js.map +1 -0
- package/dist/schema-ALJ67YVG.js +72 -0
- package/dist/schema-ALJ67YVG.js.map +1 -0
- package/dist/{search-BCLBO5E3.js → search-GMLKBHSW.js} +4 -4
- package/dist/search-GMLKBHSW.js.map +1 -0
- package/dist/{sendgrid-RNXCAFKM.js → sendgrid-QGJIVPWV.js} +2 -2
- package/dist/{shopify-NCXYJB4R.js → shopify-ON2PAU27.js} +2 -2
- package/dist/signal-X7IQJGRQ.js +43 -0
- package/dist/signal-X7IQJGRQ.js.map +1 -0
- package/dist/slack-P2LFUJUQ.js +85 -0
- package/dist/slack-P2LFUJUQ.js.map +1 -0
- package/dist/{sms-M3JIOTCW.js → sms-4VME2HUL.js} +4 -4
- package/dist/sms-4VME2HUL.js.map +1 -0
- package/dist/{src-VYUE6LRA.js → src-S5KX4YEV.js} +179 -48
- package/dist/src-S5KX4YEV.js.map +1 -0
- package/dist/{stocks-XXWBPOCU.js → stocks-4M4HZWZS.js} +2 -2
- package/dist/stocks-4M4HZWZS.js.map +1 -0
- package/dist/text-extractor-OAUBAW5P.js +12 -0
- package/dist/text-extractor-OAUBAW5P.js.map +1 -0
- package/dist/{text-transform-6SGUA5Z4.js → text-transform-HCLCUDFZ.js} +2 -2
- package/dist/text-transform-HCLCUDFZ.js.map +1 -0
- package/dist/tools-FGPN522P.js +46 -0
- package/dist/tools-FGPN522P.js.map +1 -0
- package/dist/{tunnel-IWMXUML4.js → tunnel-XOUVVRAK.js} +4 -2
- package/dist/tunnel-XOUVVRAK.js.map +1 -0
- package/dist/{twilio-53GEW5JT.js → twilio-3L7DUNYQ.js} +2 -2
- package/dist/{unit-converter-ZYXMEZOE.js → unit-converter-LYPAHU64.js} +2 -2
- package/dist/unit-converter-LYPAHU64.js.map +1 -0
- package/dist/whatsapp-KRPQ4YUX.js +43 -0
- package/dist/whatsapp-KRPQ4YUX.js.map +1 -0
- package/dist/{word-document-7B6SJMAY.js → word-document-D6N2C47N.js} +4 -4
- package/dist/word-document-D6N2C47N.js.map +1 -0
- package/dist/workflow-store-ZYAYE5P6.js +373 -0
- package/dist/workflow-store-ZYAYE5P6.js.map +1 -0
- package/dist/writing-agent-VDGLNOGO.js +243 -0
- package/dist/writing-agent-VDGLNOGO.js.map +1 -0
- package/dist/{xero-QYO66D45.js → xero-UHAHVYSD.js} +2 -2
- package/dist/{zapier-webhook-TBZ5YF2A.js → zapier-webhook-NIELLTXR.js} +2 -2
- package/package.json +11 -1
- package/dist/archiver-AVNBYCKQ.js.map +0 -1
- package/dist/autonomy-ZXDBDQUJ.js.map +0 -1
- package/dist/bot-QRARP4UN.js +0 -36
- package/dist/brain-7XLLM3KC.js +0 -56
- package/dist/chunk-4GLYY4NN.js.map +0 -1
- package/dist/chunk-766ASQWE.js.map +0 -1
- package/dist/chunk-AYUKPTSM.js.map +0 -1
- package/dist/chunk-BRBWNV65.js.map +0 -1
- package/dist/chunk-BXZ6EA52.js.map +0 -1
- package/dist/chunk-EVE7MIIY.js.map +0 -1
- package/dist/chunk-H5RQOFO2.js.map +0 -1
- package/dist/chunk-I6BDYQIG.js.map +0 -1
- package/dist/chunk-IZJMVV7O.js +0 -347
- package/dist/chunk-IZJMVV7O.js.map +0 -1
- package/dist/chunk-O7IH7JTI.js +0 -1898
- package/dist/chunk-O7IH7JTI.js.map +0 -1
- package/dist/chunk-RZ4YESBG.js.map +0 -1
- package/dist/chunk-SPPMCAKG.js.map +0 -1
- package/dist/chunk-VRD5CYRL.js +0 -1568
- package/dist/chunk-VRD5CYRL.js.map +0 -1
- package/dist/chunk-XKYRH4FM.js.map +0 -1
- package/dist/chunk-ZLZKF2PM.js.map +0 -1
- package/dist/discord-B3HUPGQ6.js +0 -70
- package/dist/dist-UISMLMFN.js +0 -21847
- package/dist/dist-UISMLMFN.js.map +0 -1
- package/dist/enrichment-pipeline-MNHNW65K.js +0 -13
- package/dist/env-IWXUVTCB.js +0 -12
- package/dist/imessage-NGA2XF2V.js +0 -35
- package/dist/inbox-summarizer-NRI4S7IF.js +0 -47
- package/dist/presentations-DSV5IHG5.js.map +0 -1
- package/dist/scheduler-VK4WFERV.js +0 -63
- package/dist/signal-6CGDFYL2.js +0 -35
- package/dist/slack-IZQWIKOH.js +0 -75
- package/dist/src-VYUE6LRA.js.map +0 -1
- package/dist/tools-2RLEI2N6.js +0 -38
- package/dist/tunnel-IWMXUML4.js.map +0 -1
- package/dist/whatsapp-LFX6YKCM.js +0 -35
- package/dist/word-document-7B6SJMAY.js.map +0 -1
- /package/dist/{audit-logger-OBPR7CRO.js.map → agent-manager-7N7REQZQ.js.map} +0 -0
- /package/dist/{auth-UOX5K2BE.js.map → agent-types-2T4PXLFQ.js.map} +0 -0
- /package/dist/{backup-restore-PZ7CYYB7.js.map → audit-logger-AU3TMWKI.js.map} +0 -0
- /package/dist/{blocks-R3PODY47.js.map → auth-PH5IHISW.js.map} +0 -0
- /package/dist/{aws-s3-Q4LLZZPD.js.map → aws-s3-QZMURYXB.js.map} +0 -0
- /package/dist/{bot-QRARP4UN.js.map → backup-restore-72OQTZO3.js.map} +0 -0
- /package/dist/{brain-7XLLM3KC.js.map → blocks-YOWOESDD.js.map} +0 -0
- /package/dist/{chunk-PLDDJCW6.js.map → bot-MU2TJQ3Y.js.map} +0 -0
- /package/dist/{client-ZQSFPMOB.js.map → brain-SLA474EU.js.map} +0 -0
- /package/dist/{camera-monitor-M5CYKUU4.js.map → camera-monitor-LHTUWHEL.js.map} +0 -0
- /package/dist/{charts-V7ARZNKF.js.map → charts-FJ32GQK7.js.map} +0 -0
- /package/dist/{chunk-6PMVAAA7.js.map → chunk-2RGPWU77.js.map} +0 -0
- /package/dist/{chunk-TVEWKIK3.js.map → chunk-2WTKTG2C.js.map} +0 -0
- /package/dist/{chunk-MXAPLSJ5.js.map → chunk-45YXODSB.js.map} +0 -0
- /package/dist/{chunk-SJSUSJ47.js.map → chunk-4YJRBMMA.js.map} +0 -0
- /package/dist/{chunk-MQJ2ECQT.js.map → chunk-CUPEENUY.js.map} +0 -0
- /package/dist/{chunk-66OJ3WB4.js.map → chunk-H3BOLSTS.js.map} +0 -0
- /package/dist/{chunk-TYAGMJNV.js.map → chunk-JOA5A3G3.js.map} +0 -0
- /package/dist/{chunk-VEHFVBLI.js.map → chunk-KT7NLIXP.js.map} +0 -0
- /package/dist/{chunk-4UOE5TUZ.js.map → chunk-NMSHVO5O.js.map} +0 -0
- /package/dist/{chunk-NHMBTUMW.js.map → chunk-TAAZB5KN.js.map} +0 -0
- /package/dist/{clipboard-manager-TEO2GEDN.js.map → chunk-UP2VWCW5.js.map} +0 -0
- /package/dist/{cron-explain-HHQKPD3M.js.map → chunker-K6WTR62A.js.map} +0 -0
- /package/dist/{crypto-4AP47IKC.js.map → client-FOIYPOZQ.js.map} +0 -0
- /package/dist/{databases-37X4CI2Y.js.map → clipboard-manager-4SBNESGZ.js.map} +0 -0
- /package/dist/{discord-B3HUPGQ6.js.map → cost-tracker-EMOIOYH7.js.map} +0 -0
- /package/dist/{enrichment-pipeline-MNHNW65K.js.map → cron-explain-UOOOYWZZ.js.map} +0 -0
- /package/dist/{entity-resolution-Y3IUWEAT.js.map → crypto-2VG3RJR2.js.map} +0 -0
- /package/dist/{env-IWXUVTCB.js.map → databases-XDPMG5AV.js.map} +0 -0
- /package/dist/{hash-tool-ULQYD7B5.js.map → db-LRIOKQBO.js.map} +0 -0
- /package/dist/{heartbeat-monitor-GCISLXI3.js.map → discord-NKR3X4AV.js.map} +0 -0
- /package/dist/{imessage-NGA2XF2V.js.map → docx-parser-EXL4TN5E.js.map} +0 -0
- /package/dist/{inbox-summarizer-NRI4S7IF.js.map → enrichment-pipeline-CMUVBDC7.js.map} +0 -0
- /package/dist/{inventory-manager-352OHXWD.js.map → entity-resolution-4X4JU43O.js.map} +0 -0
- /package/dist/{json-tool-QE2SYHEG.js.map → env-CHOFICED.js.map} +0 -0
- /package/dist/{key-rotation-DPHU4ZTB.js.map → error-tracker-SVQSDQDW.js.map} +0 -0
- /package/dist/{google-workspace-DKWUVNGC.js.map → google-workspace-TSZPZK5G.js.map} +0 -0
- /package/dist/{mcp-3JI6W7ZE.js.map → hash-tool-ENAB5LWH.js.map} +0 -0
- /package/dist/{ocr-AC7NPX33.js.map → heartbeat-monitor-KRDYTDBF.js.map} +0 -0
- /package/dist/{ollama-BOAMSPLJ.js.map → hooks-N4MIFBVM.js.map} +0 -0
- /package/dist/{image-generation-OSU7FP6F.js.map → image-generation-MDE6AVQO.js.map} +0 -0
- /package/dist/{pages-MI523RB7.js.map → imessage-V2XNDDHT.js.map} +0 -0
- /package/dist/{pairing-IFQYCPNS.js.map → inbox-summarizer-DKKRYXDR.js.map} +0 -0
- /package/dist/{pdf-ALQVOEJR.js.map → inventory-manager-C67BSZM6.js.map} +0 -0
- /package/dist/{jira-GSGDBMIG.js.map → jira-PAGZWUBJ.js.map} +0 -0
- /package/dist/{prometheus-JNT2BD4L.js.map → json-tool-4FK5RNER.js.map} +0 -0
- /package/dist/{providers-J4LYPHDR.js.map → key-rotation-WCC5FOYS.js.map} +0 -0
- /package/dist/{qr-code-WIX4PB4U.js.map → knowledge-base-J7PJ7MZ3.js.map} +0 -0
- /package/dist/{mailchimp-KKNF6QJ7.js.map → mailchimp-ZFYDC44J.js.map} +0 -0
- /package/dist/{regex-tool-W4ABRKGK.js.map → mcp-3C2TN67D.js.map} +0 -0
- /package/dist/{scheduler-VK4WFERV.js.map → metrics-VJDWQWU7.js.map} +0 -0
- /package/dist/{microsoft365-UCBKJHNX.js.map → microsoft365-6G2IJMWC.js.map} +0 -0
- /package/dist/{search-BCLBO5E3.js.map → ocr-LGUIPKVZ.js.map} +0 -0
- /package/dist/{signal-6CGDFYL2.js.map → ollama-J7CU45WT.js.map} +0 -0
- /package/dist/{slack-IZQWIKOH.js.map → pages-XDE7JRCA.js.map} +0 -0
- /package/dist/{pair-JDFTERIK.js.map → pair-YZJFQUU5.js.map} +0 -0
- /package/dist/{sms-M3JIOTCW.js.map → pairing-77N47RAT.js.map} +0 -0
- /package/dist/{stocks-XXWBPOCU.js.map → pdf-67HGXCFJ.js.map} +0 -0
- /package/dist/{text-transform-6SGUA5Z4.js.map → pdf-parser-YLMTTYHL.js.map} +0 -0
- /package/dist/{tools-2RLEI2N6.js.map → prometheus-YETCZO4I.js.map} +0 -0
- /package/dist/{unit-converter-ZYXMEZOE.js.map → providers-H6YIC3MG.js.map} +0 -0
- /package/dist/{whatsapp-LFX6YKCM.js.map → qr-code-6WZJHRKL.js.map} +0 -0
- /package/dist/{quickbooks-XB4NII2S.js.map → quickbooks-N675W7IK.js.map} +0 -0
- /package/dist/{sendgrid-RNXCAFKM.js.map → sendgrid-QGJIVPWV.js.map} +0 -0
- /package/dist/{shopify-NCXYJB4R.js.map → shopify-ON2PAU27.js.map} +0 -0
- /package/dist/{twilio-53GEW5JT.js.map → twilio-3L7DUNYQ.js.map} +0 -0
- /package/dist/{xero-QYO66D45.js.map → xero-UHAHVYSD.js.map} +0 -0
- /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
|
[](https://github.com/dsiemon2/OpenSentinel/actions/workflows/ci.yml)
|
|
4
|
+
[](https://github.com/dsiemon2/OpenSentinel/releases)
|
|
4
5
|
[](https://www.typescriptlang.org/)
|
|
5
6
|
[](https://bun.sh/)
|
|
6
7
|
[](https://www.docker.com/)
|
|
8
|
+
[](https://github.com/dsiemon2/OpenSentinel/actions)
|
|
7
9
|
[](LICENSE)
|
|
10
|
+
[](https://github.com/dsiemon2/OpenSentinel/stargazers)
|
|
8
11
|
|
|
9
|
-
|
|
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
|
-
|
|
17
|
+
---
|
|
16
18
|
|
|
17
|
-
##
|
|
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
|
-
-
|
|
89
|
-
-
|
|
90
|
-
-
|
|
91
|
-
-
|
|
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
|
|
163
|
+
- **Finance**: Crypto, stocks, currency, portfolio tracking, exchange trading, DeFi, Finnhub, FRED
|
|
125
164
|
|
|
126
165
|
### OSINT & Public Records
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
-
|
|
130
|
-
-
|
|
131
|
-
-
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
-
│ ├──
|
|
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,
|
|
299
|
-
│ ├── documents/ # Document ingestion
|
|
346
|
+
│ ├── public-records/ # FEC, SEC, IRS 990, OpenCorporates
|
|
300
347
|
│ └── vision/ # Screen/webcam capture
|
|
301
|
-
├── tools/
|
|
302
|
-
|
|
303
|
-
|
|
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/ #
|
|
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 |
|
|
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
|