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
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
env
|
|
3
|
-
} from "./chunk-ZLZKF2PM.js";
|
|
4
1
|
import {
|
|
5
2
|
__export
|
|
6
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UP2VWCW5.js";
|
|
7
4
|
|
|
8
5
|
// src/db/schema.ts
|
|
9
6
|
var schema_exports = {};
|
|
@@ -626,40 +623,17 @@ var incidentTimeline = pgTable(
|
|
|
626
623
|
(table) => [index("incident_timeline_incident_idx").on(table.incidentId)]
|
|
627
624
|
);
|
|
628
625
|
|
|
629
|
-
// src/db/index.ts
|
|
630
|
-
import { drizzle } from "drizzle-orm/postgres-js";
|
|
631
|
-
import postgres from "postgres";
|
|
632
|
-
var _client = null;
|
|
633
|
-
var _db = null;
|
|
634
|
-
function getDb() {
|
|
635
|
-
if (!_db) {
|
|
636
|
-
_client = postgres(env.DATABASE_URL);
|
|
637
|
-
_db = drizzle(_client, { schema: schema_exports });
|
|
638
|
-
}
|
|
639
|
-
return _db;
|
|
640
|
-
}
|
|
641
|
-
var db = new Proxy(
|
|
642
|
-
{},
|
|
643
|
-
{
|
|
644
|
-
get(_target, prop) {
|
|
645
|
-
const instance = getDb();
|
|
646
|
-
const value = instance[prop];
|
|
647
|
-
if (typeof value === "function") {
|
|
648
|
-
return value.bind(instance);
|
|
649
|
-
}
|
|
650
|
-
return value;
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
);
|
|
654
|
-
|
|
655
626
|
export {
|
|
627
|
+
users,
|
|
656
628
|
conversations,
|
|
657
629
|
messages,
|
|
658
630
|
memories,
|
|
631
|
+
scheduledTasks,
|
|
659
632
|
toolLogs,
|
|
660
633
|
sessions,
|
|
661
634
|
auditLogs,
|
|
662
635
|
apiKeys,
|
|
636
|
+
rateLimits,
|
|
663
637
|
metrics,
|
|
664
638
|
errorLogs,
|
|
665
639
|
usagePatterns,
|
|
@@ -672,10 +646,17 @@ export {
|
|
|
672
646
|
agentMessages,
|
|
673
647
|
agentProgress,
|
|
674
648
|
personas,
|
|
649
|
+
organizations,
|
|
650
|
+
organizationMembers,
|
|
651
|
+
sharedMemories,
|
|
652
|
+
usageQuotas,
|
|
675
653
|
graphEntities,
|
|
676
654
|
graphRelationships,
|
|
655
|
+
documents,
|
|
656
|
+
documentChunks,
|
|
657
|
+
twoFactorAuth,
|
|
677
658
|
securityIncidents,
|
|
678
659
|
incidentTimeline,
|
|
679
|
-
|
|
660
|
+
schema_exports
|
|
680
661
|
};
|
|
681
|
-
//# sourceMappingURL=chunk-
|
|
662
|
+
//# sourceMappingURL=chunk-NYVBXUGD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db/schema.ts"],"sourcesContent":["import {\n pgTable,\n text,\n timestamp,\n uuid,\n integer,\n jsonb,\n boolean,\n vector,\n index,\n customType,\n} from \"drizzle-orm/pg-core\";\n\n// Custom tsvector type for full-text search\nconst tsvector = customType<{ data: string }>({\n dataType() {\n return \"tsvector\";\n },\n});\n\n// Users table\nexport const users = pgTable(\"users\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n telegramId: text(\"telegram_id\").unique(),\n name: text(\"name\"),\n preferences: jsonb(\"preferences\").$type<{\n timezone?: string;\n language?: string;\n verbosity?: \"terse\" | \"normal\" | \"detailed\";\n persona?: \"formal\" | \"casual\" | \"snarky\";\n }>(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n});\n\n// Conversations table\nexport const conversations = pgTable(\"conversations\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").references(() => users.id),\n title: text(\"title\"),\n source: text(\"source\").notNull().default(\"telegram\"), // telegram, web, api\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n});\n\n// Messages table\nexport const messages = pgTable(\n \"messages\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n conversationId: uuid(\"conversation_id\")\n .references(() => conversations.id)\n .notNull(),\n role: text(\"role\").notNull().$type<\"user\" | \"assistant\" | \"system\">(),\n content: text(\"content\").notNull(),\n tokenCount: integer(\"token_count\"),\n metadata: jsonb(\"metadata\"),\n encrypted: boolean(\"encrypted\").default(false).notNull(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [index(\"messages_conversation_idx\").on(table.conversationId)]\n);\n\n// Memories table with vector embeddings for RAG\nexport const memories = pgTable(\n \"memories\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").references(() => users.id),\n type: text(\"type\")\n .notNull()\n .$type<\"episodic\" | \"semantic\" | \"procedural\">(),\n content: text(\"content\").notNull(),\n embedding: vector(\"embedding\", { dimensions: 1536 }), // OpenAI embedding size\n searchVector: tsvector(\"search_vector\"), // Full-text search vector (GIN indexed)\n importance: integer(\"importance\").default(5), // 1-10 scale\n source: text(\"source\"), // Where this memory came from\n provenance: text(\"provenance\"), // Origin tracking: \"conversation:id\", \"api:manual\", \"extraction:auto\"\n metadata: jsonb(\"metadata\"),\n encrypted: boolean(\"encrypted\").default(false).notNull(),\n lastAccessed: timestamp(\"last_accessed\").defaultNow(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [index(\"memories_user_idx\").on(table.userId)]\n);\n\n// Scheduled tasks table\nexport const scheduledTasks = pgTable(\"scheduled_tasks\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").references(() => users.id),\n name: text(\"name\").notNull(),\n description: text(\"description\"),\n cronExpression: text(\"cron_expression\"),\n nextRunAt: timestamp(\"next_run_at\"),\n lastRunAt: timestamp(\"last_run_at\"),\n enabled: boolean(\"enabled\").default(true),\n action: jsonb(\"action\").$type<{\n type: \"message\" | \"command\" | \"webhook\";\n payload: Record<string, unknown>;\n }>(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n});\n\n// Tool execution logs\nexport const toolLogs = pgTable(\n \"tool_logs\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n conversationId: uuid(\"conversation_id\").references(() => conversations.id),\n toolName: text(\"tool_name\").notNull(),\n input: jsonb(\"input\"),\n output: jsonb(\"output\"),\n success: boolean(\"success\").notNull(),\n durationMs: integer(\"duration_ms\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [index(\"tool_logs_conversation_idx\").on(table.conversationId)]\n);\n\n// ============================================\n// SECURITY TABLES (Phase 1)\n// ============================================\n\n// Sessions table for session management\nexport const sessions = pgTable(\n \"sessions\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .references(() => users.id)\n .notNull(),\n token: text(\"token\").notNull().unique(),\n deviceInfo: jsonb(\"device_info\").$type<{\n userAgent?: string;\n platform?: string;\n browser?: string;\n }>(),\n ipAddress: text(\"ip_address\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n expiresAt: timestamp(\"expires_at\").notNull(),\n lastActiveAt: timestamp(\"last_active_at\").defaultNow(),\n },\n (table) => [index(\"sessions_user_idx\").on(table.userId)]\n);\n\n// Audit logs table for tracking all actions\nexport const auditLogs = pgTable(\n \"audit_logs\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").references(() => users.id),\n sessionId: uuid(\"session_id\").references(() => sessions.id),\n action: text(\"action\").notNull(), // 'tool_use', 'login', 'settings_change', etc.\n resource: text(\"resource\"), // 'shell', 'file', 'memory', etc.\n resourceId: text(\"resource_id\"), // ID of the affected resource\n details: jsonb(\"details\"),\n ipAddress: text(\"ip_address\"),\n userAgent: text(\"user_agent\"),\n success: boolean(\"success\").default(true),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n // Tamper-proof chain fields (SOC 2)\n sequenceNumber: integer(\"sequence_number\"),\n entryHash: text(\"entry_hash\"),\n previousHash: text(\"previous_hash\"),\n },\n (table) => [\n index(\"audit_logs_user_idx\").on(table.userId),\n index(\"audit_logs_action_idx\").on(table.action),\n index(\"audit_logs_created_idx\").on(table.createdAt),\n index(\"audit_logs_sequence_idx\").on(table.sequenceNumber),\n ]\n);\n\n// API keys table for programmatic access\nexport const apiKeys = pgTable(\n \"api_keys\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .references(() => users.id)\n .notNull(),\n name: text(\"name\").notNull(),\n keyHash: text(\"key_hash\").notNull(), // bcrypt hash of the key\n keyPrefix: text(\"key_prefix\").notNull(), // First 8 chars for identification (e.g., \"mb_live_\")\n permissions: jsonb(\"permissions\").$type<string[]>(), // ['chat:basic', 'tools:shell', etc.]\n lastUsedAt: timestamp(\"last_used_at\"),\n expiresAt: timestamp(\"expires_at\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n revokedAt: timestamp(\"revoked_at\"),\n },\n (table) => [index(\"api_keys_user_idx\").on(table.userId)]\n);\n\n// Rate limits table for tracking request rates\nexport const rateLimits = pgTable(\n \"rate_limits\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n identifier: text(\"identifier\").notNull(), // userId, IP, or API key prefix\n endpoint: text(\"endpoint\").notNull(), // 'api/chat', 'tool/shell', etc.\n windowStart: timestamp(\"window_start\").notNull(),\n requestCount: integer(\"request_count\").default(0),\n lastRequest: timestamp(\"last_request\"),\n },\n (table) => [\n index(\"rate_limits_identifier_endpoint_idx\").on(\n table.identifier,\n table.endpoint\n ),\n ]\n);\n\n// ============================================\n// OBSERVABILITY TABLES (Phase 1)\n// ============================================\n\n// Metrics table for performance tracking\nexport const metrics = pgTable(\n \"metrics\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n name: text(\"name\").notNull(), // 'response_latency', 'token_usage', 'tool_duration', etc.\n value: integer(\"value\").notNull(),\n unit: text(\"unit\"), // 'ms', 'tokens', 'bytes', etc.\n tags: jsonb(\"tags\").$type<Record<string, string>>(), // { tool: 'shell', status: 'success' }\n timestamp: timestamp(\"timestamp\").defaultNow().notNull(),\n },\n (table) => [\n index(\"metrics_name_timestamp_idx\").on(table.name, table.timestamp),\n ]\n);\n\n// Error logs table for centralized error tracking\nexport const errorLogs = pgTable(\n \"error_logs\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n source: text(\"source\").notNull(), // 'brain', 'tool', 'telegram', 'api', 'scheduler'\n errorType: text(\"error_type\").notNull(), // 'ApiError', 'ValidationError', etc.\n errorCode: text(\"error_code\"), // Application-specific error codes\n message: text(\"message\").notNull(),\n stack: text(\"stack\"),\n context: jsonb(\"context\"), // Additional context like request data\n userId: uuid(\"user_id\").references(() => users.id),\n conversationId: uuid(\"conversation_id\").references(() => conversations.id),\n resolved: boolean(\"resolved\").default(false),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"error_logs_source_idx\").on(table.source),\n index(\"error_logs_created_idx\").on(table.createdAt),\n ]\n);\n\n// ============================================\n// EVOLUTION SYSTEM TABLES (Phase 2)\n// ============================================\n\n// Usage patterns for evolution tracking\nexport const usagePatterns = pgTable(\n \"usage_patterns\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .references(() => users.id)\n .notNull(),\n patternType: text(\"pattern_type\").notNull(), // 'tool_usage', 'topic', 'time_of_day', 'complexity'\n patternKey: text(\"pattern_key\").notNull(), // e.g., 'shell', 'morning', 'coding'\n patternData: jsonb(\"pattern_data\"),\n confidence: integer(\"confidence\").default(0), // 0-100\n firstSeen: timestamp(\"first_seen\").defaultNow().notNull(),\n lastSeen: timestamp(\"last_seen\").defaultNow(),\n occurrences: integer(\"occurrences\").default(1),\n },\n (table) => [\n index(\"usage_patterns_user_idx\").on(table.userId),\n index(\"usage_patterns_type_idx\").on(table.patternType),\n ]\n);\n\n// Achievements definitions\nexport const achievements = pgTable(\"achievements\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n code: text(\"code\").notNull().unique(), // 'first_tool_use', 'power_user', 'researcher'\n name: text(\"name\").notNull(),\n description: text(\"description\"),\n iconEmoji: text(\"icon_emoji\"), // Emoji to display\n category: text(\"category\"), // 'exploration', 'productivity', 'mastery'\n criteria: jsonb(\"criteria\").$type<{\n type: string; // 'count', 'streak', 'threshold'\n metric: string; // 'tool_uses', 'conversations', 'memories'\n threshold: number;\n conditions?: Record<string, unknown>;\n }>(),\n points: integer(\"points\").default(10),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n});\n\n// User achievements (unlocked)\nexport const userAchievements = pgTable(\n \"user_achievements\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .references(() => users.id)\n .notNull(),\n achievementId: uuid(\"achievement_id\")\n .references(() => achievements.id)\n .notNull(),\n unlockedAt: timestamp(\"unlocked_at\").defaultNow().notNull(),\n progress: integer(\"progress\").default(100), // For progressive achievements\n notified: boolean(\"notified\").default(false),\n },\n (table) => [index(\"user_achievements_user_idx\").on(table.userId)]\n);\n\n// Evolution transformation modes\nexport const evolutionModes = pgTable(\n \"molt_modes\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .references(() => users.id)\n .notNull(),\n mode: text(\"mode\")\n .notNull()\n .$type<\"productivity\" | \"creative\" | \"research\" | \"learning\">(),\n activatedAt: timestamp(\"activated_at\").defaultNow().notNull(),\n deactivatedAt: timestamp(\"deactivated_at\"),\n metadata: jsonb(\"metadata\"),\n },\n (table) => [index(\"molt_modes_user_idx\").on(table.userId)]\n);\n\n// Archived memories (for memory shedding)\nexport const archivedMemories = pgTable(\n \"archived_memories\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n originalMemoryId: uuid(\"original_memory_id\").notNull(),\n userId: uuid(\"user_id\").references(() => users.id),\n type: text(\"type\")\n .notNull()\n .$type<\"episodic\" | \"semantic\" | \"procedural\">(),\n content: text(\"content\").notNull(),\n reason: text(\"reason\"), // 'stale', 'duplicate', 'low_importance', 'user_request'\n originalCreatedAt: timestamp(\"original_created_at\"),\n archivedAt: timestamp(\"archived_at\").defaultNow().notNull(),\n },\n (table) => [index(\"archived_memories_user_idx\").on(table.userId)]\n);\n\n// ============================================\n// CALENDAR & TRIGGERS TABLES (Phase 3)\n// ============================================\n\nexport const calendarTriggers = pgTable(\n \"calendar_triggers\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .references(() => users.id)\n .notNull(),\n name: text(\"name\").notNull(),\n calendarSource: text(\"calendar_source\").notNull(), // 'google', 'outlook', 'ical'\n calendarId: text(\"calendar_id\"),\n triggerType: text(\"trigger_type\").notNull(), // 'event_start', 'event_end', 'daily_briefing'\n offsetMinutes: integer(\"offset_minutes\").default(0), // Trigger X minutes before/after\n action: jsonb(\"action\").$type<{\n type: \"message\" | \"tool\" | \"webhook\";\n payload: Record<string, unknown>;\n }>(),\n enabled: boolean(\"enabled\").default(true),\n lastTriggered: timestamp(\"last_triggered\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [index(\"calendar_triggers_user_idx\").on(table.userId)]\n);\n\n// ============================================\n// SUB-AGENT TABLES (Phase 4)\n// ============================================\n\nexport const subAgents = pgTable(\n \"sub_agents\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n parentConversationId: uuid(\"parent_conversation_id\").references(\n () => conversations.id\n ),\n userId: uuid(\"user_id\")\n .references(() => users.id)\n .notNull(),\n type: text(\"type\")\n .notNull()\n .$type<\"research\" | \"coding\" | \"writing\" | \"analysis\">(),\n name: text(\"name\").notNull(),\n status: text(\"status\")\n .notNull()\n .$type<\"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\">(),\n objective: text(\"objective\").notNull(),\n context: jsonb(\"context\"),\n result: jsonb(\"result\"),\n tokenBudget: integer(\"token_budget\").default(50000),\n tokensUsed: integer(\"tokens_used\").default(0),\n timeBudgetMs: integer(\"time_budget_ms\").default(3600000), // 1 hour default\n startedAt: timestamp(\"started_at\"),\n completedAt: timestamp(\"completed_at\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"sub_agents_user_idx\").on(table.userId),\n index(\"sub_agents_status_idx\").on(table.status),\n ]\n);\n\nexport const agentMessages = pgTable(\n \"agent_messages\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n agentId: uuid(\"agent_id\")\n .references(() => subAgents.id)\n .notNull(),\n role: text(\"role\")\n .notNull()\n .$type<\"user\" | \"assistant\" | \"system\" | \"tool_result\">(),\n content: text(\"content\").notNull(),\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [index(\"agent_messages_agent_idx\").on(table.agentId)]\n);\n\nexport const agentProgress = pgTable(\n \"agent_progress\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n agentId: uuid(\"agent_id\")\n .references(() => subAgents.id)\n .notNull(),\n step: integer(\"step\").notNull(),\n description: text(\"description\").notNull(),\n status: text(\"status\")\n .notNull()\n .$type<\"pending\" | \"running\" | \"completed\" | \"failed\">(),\n output: jsonb(\"output\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [index(\"agent_progress_agent_idx\").on(table.agentId)]\n);\n\n// ============================================\n// PERSONALITY TABLES (Phase 5)\n// ============================================\n\nexport const personas = pgTable(\n \"personas\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").references(() => users.id), // null = system persona\n name: text(\"name\").notNull(),\n description: text(\"description\"),\n basePrompt: text(\"base_prompt\").notNull(),\n isDefault: boolean(\"is_default\").default(false),\n isSystem: boolean(\"is_system\").default(false), // Built-in personas\n settings: jsonb(\"settings\").$type<{\n verbosity: \"terse\" | \"normal\" | \"detailed\";\n humor: \"off\" | \"subtle\" | \"full\";\n formality: \"formal\" | \"casual\" | \"professional\";\n emoji: boolean;\n proactivity: \"minimal\" | \"moderate\" | \"proactive\";\n }>(),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [index(\"personas_user_idx\").on(table.userId)]\n);\n\n// ============================================\n// ENTERPRISE TABLES (Phase 6)\n// ============================================\n\nexport const organizations = pgTable(\"organizations\", {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n name: text(\"name\").notNull(),\n slug: text(\"slug\").unique(),\n settings: jsonb(\"settings\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow(),\n});\n\nexport const organizationMembers = pgTable(\n \"organization_members\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n organizationId: uuid(\"organization_id\")\n .references(() => organizations.id)\n .notNull(),\n userId: uuid(\"user_id\")\n .references(() => users.id)\n .notNull(),\n role: text(\"role\").notNull().$type<\"owner\" | \"admin\" | \"member\" | \"viewer\">(),\n joinedAt: timestamp(\"joined_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"org_members_org_idx\").on(table.organizationId),\n index(\"org_members_user_idx\").on(table.userId),\n ]\n);\n\nexport const sharedMemories = pgTable(\n \"shared_memories\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n organizationId: uuid(\"organization_id\")\n .references(() => organizations.id)\n .notNull(),\n memoryId: uuid(\"memory_id\")\n .references(() => memories.id)\n .notNull(),\n sharedBy: uuid(\"shared_by\")\n .references(() => users.id)\n .notNull(),\n sharedAt: timestamp(\"shared_at\").defaultNow().notNull(),\n },\n (table) => [index(\"shared_memories_org_idx\").on(table.organizationId)]\n);\n\nexport const usageQuotas = pgTable(\n \"usage_quotas\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").references(() => users.id),\n organizationId: uuid(\"organization_id\").references(() => organizations.id),\n quotaType: text(\"quota_type\").notNull(), // 'tokens_daily', 'tokens_monthly', 'agents_concurrent'\n limitValue: integer(\"limit_value\").notNull(),\n currentValue: integer(\"current_value\").default(0),\n resetAt: timestamp(\"reset_at\"),\n updatedAt: timestamp(\"updated_at\").defaultNow(),\n },\n (table) => [\n index(\"usage_quotas_user_idx\").on(table.userId),\n index(\"usage_quotas_org_idx\").on(table.organizationId),\n ]\n);\n\n// ============================================\n// KNOWLEDGE GRAPH TABLES\n// ============================================\n\n// Graph entities — people, projects, topics, events, organizations, locations\nexport const graphEntities = pgTable(\n \"graph_entities\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\").references(() => users.id),\n type: text(\"type\")\n .notNull()\n .$type<\"person\" | \"project\" | \"topic\" | \"event\" | \"organization\" | \"location\">(),\n name: text(\"name\").notNull(),\n aliases: jsonb(\"aliases\").$type<string[]>().default([]),\n description: text(\"description\"),\n attributes: jsonb(\"attributes\").$type<Record<string, unknown>>().default({}),\n importance: integer(\"importance\").default(50), // 0-100\n mentionCount: integer(\"mention_count\").default(1),\n embedding: vector(\"embedding\", { dimensions: 1536 }),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"graph_entities_user_idx\").on(table.userId),\n index(\"graph_entities_type_idx\").on(table.type),\n index(\"graph_entities_name_idx\").on(table.name),\n ]\n);\n\n// Graph relationships — connections between entities\nexport const graphRelationships = pgTable(\n \"graph_relationships\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n sourceEntityId: uuid(\"source_entity_id\")\n .references(() => graphEntities.id, { onDelete: \"cascade\" })\n .notNull(),\n targetEntityId: uuid(\"target_entity_id\")\n .references(() => graphEntities.id, { onDelete: \"cascade\" })\n .notNull(),\n type: text(\"type\")\n .notNull()\n .$type<\n | \"knows\" | \"works_with\" | \"works_on\" | \"family\" | \"friend\"\n | \"colleague\" | \"manages\" | \"reports_to\" | \"belongs_to\"\n | \"related_to\" | \"located_in\" | \"interested_in\" | \"expert_in\"\n | \"mentioned_in\" | \"participates_in\"\n >(),\n strength: integer(\"strength\").default(50), // 0-100\n bidirectional: boolean(\"bidirectional\").default(false),\n context: text(\"context\"),\n attributes: jsonb(\"attributes\").$type<Record<string, unknown>>().default({}),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"graph_rel_source_idx\").on(table.sourceEntityId),\n index(\"graph_rel_target_idx\").on(table.targetEntityId),\n index(\"graph_rel_type_idx\").on(table.type),\n ]\n);\n\n// ============================================\n// DOCUMENT KNOWLEDGE BASE TABLES\n// ============================================\n\nexport const documents = pgTable(\n \"documents\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n name: text(\"name\").notNull(),\n filename: text(\"filename\"),\n mimeType: text(\"mime_type\"),\n fileSize: integer(\"file_size\"),\n source: text(\"source\"), // 'upload', 'url', 'api'\n sourceUrl: text(\"source_url\"),\n metadata: jsonb(\"metadata\"),\n status: text(\"status\")\n .notNull()\n .$type<\"pending\" | \"processing\" | \"completed\" | \"failed\">()\n .default(\"pending\"),\n errorMessage: text(\"error_message\"),\n chunkCount: integer(\"chunk_count\").default(0),\n totalTokens: integer(\"total_tokens\").default(0),\n userId: uuid(\"user_id\").references(() => users.id),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n processedAt: timestamp(\"processed_at\"),\n },\n (table) => [\n index(\"documents_user_idx\").on(table.userId),\n index(\"documents_status_idx\").on(table.status),\n ]\n);\n\nexport const documentChunks = pgTable(\n \"document_chunks\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n documentId: uuid(\"document_id\")\n .references(() => documents.id, { onDelete: \"cascade\" })\n .notNull(),\n chunkIndex: integer(\"chunk_index\").notNull(),\n content: text(\"content\").notNull(),\n embedding: vector(\"embedding\", { dimensions: 1536 }),\n tokenCount: integer(\"token_count\"),\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [\n index(\"document_chunks_document_idx\").on(table.documentId),\n ]\n);\n\n// ============================================\n// TYPE EXPORTS\n// ============================================\n\nexport type User = typeof users.$inferSelect;\nexport type NewUser = typeof users.$inferInsert;\nexport type Conversation = typeof conversations.$inferSelect;\nexport type NewConversation = typeof conversations.$inferInsert;\nexport type Message = typeof messages.$inferSelect;\nexport type NewMessage = typeof messages.$inferInsert;\nexport type Memory = typeof memories.$inferSelect;\nexport type NewMemory = typeof memories.$inferInsert;\n\n// Security types\nexport type Session = typeof sessions.$inferSelect;\nexport type NewSession = typeof sessions.$inferInsert;\nexport type AuditLog = typeof auditLogs.$inferSelect;\nexport type NewAuditLog = typeof auditLogs.$inferInsert;\nexport type ApiKey = typeof apiKeys.$inferSelect;\nexport type NewApiKey = typeof apiKeys.$inferInsert;\n\n// Observability types\nexport type Metric = typeof metrics.$inferSelect;\nexport type NewMetric = typeof metrics.$inferInsert;\nexport type ErrorLog = typeof errorLogs.$inferSelect;\nexport type NewErrorLog = typeof errorLogs.$inferInsert;\n\n// Evolution system types\nexport type UsagePattern = typeof usagePatterns.$inferSelect;\nexport type NewUsagePattern = typeof usagePatterns.$inferInsert;\nexport type Achievement = typeof achievements.$inferSelect;\nexport type NewAchievement = typeof achievements.$inferInsert;\nexport type UserAchievement = typeof userAchievements.$inferSelect;\nexport type EvolutionMode = typeof evolutionModes.$inferSelect;\nexport type NewEvolutionMode = typeof evolutionModes.$inferInsert;\n\n// Sub-agent types\nexport type SubAgent = typeof subAgents.$inferSelect;\nexport type NewSubAgent = typeof subAgents.$inferInsert;\nexport type AgentMessage = typeof agentMessages.$inferSelect;\nexport type AgentProgress = typeof agentProgress.$inferSelect;\n\n// Personality types\nexport type Persona = typeof personas.$inferSelect;\nexport type NewPersona = typeof personas.$inferInsert;\n\n// Enterprise types\nexport type Organization = typeof organizations.$inferSelect;\nexport type NewOrganization = typeof organizations.$inferInsert;\nexport type OrganizationMember = typeof organizationMembers.$inferSelect;\n\n// Knowledge graph types\nexport type GraphEntity = typeof graphEntities.$inferSelect;\nexport type NewGraphEntity = typeof graphEntities.$inferInsert;\nexport type GraphRelationship = typeof graphRelationships.$inferSelect;\nexport type NewGraphRelationship = typeof graphRelationships.$inferInsert;\n\n// Document knowledge base types\nexport type Document = typeof documents.$inferSelect;\nexport type NewDocument = typeof documents.$inferInsert;\nexport type DocumentChunk = typeof documentChunks.$inferSelect;\nexport type NewDocumentChunk = typeof documentChunks.$inferInsert;\n\n// ============================================\n// SOC 2 COMPLIANCE TABLES\n// ============================================\n\n// Two-factor authentication (persisted, encrypted secrets)\nexport const twoFactorAuth = pgTable(\n \"two_factor_auth\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n userId: uuid(\"user_id\")\n .references(() => users.id, { onDelete: \"cascade\" })\n .notNull()\n .unique(),\n secretEncrypted: text(\"secret_encrypted\").notNull(),\n recoveryCodes: jsonb(\"recovery_codes\").$type<string[]>().notNull(),\n enabledAt: timestamp(\"enabled_at\").notNull(),\n lastVerifiedAt: timestamp(\"last_verified_at\"),\n keyVersion: integer(\"key_version\").default(1).notNull(),\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n },\n (table) => [index(\"two_factor_auth_user_idx\").on(table.userId)]\n);\n\n// Security incidents tracking\nexport const securityIncidents = pgTable(\n \"security_incidents\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n incidentNumber: text(\"incident_number\").notNull().unique(),\n title: text(\"title\").notNull(),\n description: text(\"description\").notNull(),\n type: text(\"type\")\n .notNull()\n .$type<\n | \"brute_force\"\n | \"unauthorized_access\"\n | \"data_breach\"\n | \"suspicious_activity\"\n | \"system_compromise\"\n | \"policy_violation\"\n >(),\n severity: text(\"severity\")\n .notNull()\n .$type<\"low\" | \"medium\" | \"high\" | \"critical\">(),\n status: text(\"status\")\n .notNull()\n .$type<\"open\" | \"investigating\" | \"contained\" | \"resolved\" | \"closed\">()\n .default(\"open\"),\n userId: uuid(\"user_id\").references(() => users.id),\n assignedTo: uuid(\"assigned_to\").references(() => users.id),\n source: text(\"source\").notNull(),\n sourceData: jsonb(\"source_data\"),\n impactAssessment: text(\"impact_assessment\"),\n containmentActions: jsonb(\"containment_actions\"),\n resolutionNotes: text(\"resolution_notes\"),\n relatedIncidents: jsonb(\"related_incidents\").$type<string[]>(),\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\n investigatedAt: timestamp(\"investigated_at\"),\n containedAt: timestamp(\"contained_at\"),\n resolvedAt: timestamp(\"resolved_at\"),\n closedAt: timestamp(\"closed_at\"),\n },\n (table) => [\n index(\"security_incidents_status_idx\").on(table.status),\n index(\"security_incidents_severity_idx\").on(table.severity),\n index(\"security_incidents_created_idx\").on(table.createdAt),\n ]\n);\n\n// Incident timeline events\nexport const incidentTimeline = pgTable(\n \"incident_timeline\",\n {\n id: uuid(\"id\").primaryKey().defaultRandom(),\n incidentId: uuid(\"incident_id\")\n .references(() => securityIncidents.id, { onDelete: \"cascade\" })\n .notNull(),\n eventType: text(\"event_type\")\n .notNull()\n .$type<\n | \"created\"\n | \"status_change\"\n | \"assignment\"\n | \"comment\"\n | \"action_taken\"\n | \"escalation\"\n | \"resolution\"\n >(),\n description: text(\"description\").notNull(),\n performedBy: uuid(\"performed_by\").references(() => users.id),\n metadata: jsonb(\"metadata\"),\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\n },\n (table) => [index(\"incident_timeline_incident_idx\").on(table.incidentId)]\n);\n\n// SOC 2 types\nexport type TwoFactorAuthRecord = typeof twoFactorAuth.$inferSelect;\nexport type NewTwoFactorAuthRecord = typeof twoFactorAuth.$inferInsert;\nexport type SecurityIncident = typeof securityIncidents.$inferSelect;\nexport type NewSecurityIncident = typeof securityIncidents.$inferInsert;\nexport type IncidentTimelineEvent = typeof incidentTimeline.$inferSelect;\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,463 @@
|
|
|
1
|
+
// src/core/intelligence/risk-engine.ts
|
|
2
|
+
var DEFAULT_CONFIG = {
|
|
3
|
+
maxCostPerRequest: 5,
|
|
4
|
+
maxCostPerHour: 50,
|
|
5
|
+
maxCostPerDay: 200,
|
|
6
|
+
maxToolsPerMinute: 30,
|
|
7
|
+
maxToolsPerHour: 500,
|
|
8
|
+
maxMessagesPerMinute: 60,
|
|
9
|
+
blockedTools: [],
|
|
10
|
+
blockedPatterns: [],
|
|
11
|
+
safeMode: false,
|
|
12
|
+
killSwitch: false,
|
|
13
|
+
customChecks: [],
|
|
14
|
+
maxTradeSize: 100,
|
|
15
|
+
maxDailyTradeSpend: 500,
|
|
16
|
+
maxTradesPerHour: 5
|
|
17
|
+
};
|
|
18
|
+
var costTracker = {
|
|
19
|
+
hourly: /* @__PURE__ */ new Map(),
|
|
20
|
+
daily: /* @__PURE__ */ new Map()
|
|
21
|
+
};
|
|
22
|
+
var rateTracker = /* @__PURE__ */ new Map();
|
|
23
|
+
var tradeSpendTracker = {
|
|
24
|
+
daily: /* @__PURE__ */ new Map(),
|
|
25
|
+
hourlyCount: /* @__PURE__ */ new Map()
|
|
26
|
+
};
|
|
27
|
+
var auditLog = [];
|
|
28
|
+
var RiskEngine = class {
|
|
29
|
+
config;
|
|
30
|
+
checks = [];
|
|
31
|
+
constructor(config = {}) {
|
|
32
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
33
|
+
this.initializeBuiltInChecks();
|
|
34
|
+
this.checks.push(...this.config.customChecks);
|
|
35
|
+
}
|
|
36
|
+
initializeBuiltInChecks() {
|
|
37
|
+
this.checks.push({
|
|
38
|
+
name: "kill_switch",
|
|
39
|
+
description: "Emergency kill switch - blocks all actions",
|
|
40
|
+
severity: "critical",
|
|
41
|
+
check: () => !this.config.killSwitch,
|
|
42
|
+
failMessage: "Kill switch is active. All actions are blocked."
|
|
43
|
+
});
|
|
44
|
+
this.checks.push({
|
|
45
|
+
name: "safe_mode",
|
|
46
|
+
description: "Safe mode restricts to read-only operations",
|
|
47
|
+
severity: "high",
|
|
48
|
+
check: (ctx) => {
|
|
49
|
+
if (!this.config.safeMode) return true;
|
|
50
|
+
const readOnlyActions = [
|
|
51
|
+
"read",
|
|
52
|
+
"search",
|
|
53
|
+
"list",
|
|
54
|
+
"get",
|
|
55
|
+
"query",
|
|
56
|
+
"analyze",
|
|
57
|
+
"view"
|
|
58
|
+
];
|
|
59
|
+
return readOnlyActions.some(
|
|
60
|
+
(a) => ctx.action.toLowerCase().includes(a)
|
|
61
|
+
);
|
|
62
|
+
},
|
|
63
|
+
failMessage: "Safe mode is active. Only read-only operations are allowed."
|
|
64
|
+
});
|
|
65
|
+
this.checks.push({
|
|
66
|
+
name: "blocked_tools",
|
|
67
|
+
description: "Prevents execution of blocked tools",
|
|
68
|
+
severity: "high",
|
|
69
|
+
check: (ctx) => !ctx.toolName || !this.config.blockedTools.includes(ctx.toolName),
|
|
70
|
+
failMessage: "This tool is blocked by the risk policy."
|
|
71
|
+
});
|
|
72
|
+
this.checks.push({
|
|
73
|
+
name: "blocked_patterns",
|
|
74
|
+
description: "Prevents actions matching blocked patterns",
|
|
75
|
+
severity: "high",
|
|
76
|
+
check: (ctx) => {
|
|
77
|
+
const inputStr = JSON.stringify(ctx.input || {});
|
|
78
|
+
return !this.config.blockedPatterns.some(
|
|
79
|
+
(pattern) => new RegExp(pattern, "i").test(inputStr)
|
|
80
|
+
);
|
|
81
|
+
},
|
|
82
|
+
failMessage: "Input matches a blocked pattern."
|
|
83
|
+
});
|
|
84
|
+
this.checks.push({
|
|
85
|
+
name: "cost_per_request",
|
|
86
|
+
description: "Limits cost per individual request",
|
|
87
|
+
severity: "medium",
|
|
88
|
+
check: (ctx) => !ctx.estimatedCost || ctx.estimatedCost <= this.config.maxCostPerRequest,
|
|
89
|
+
failMessage: `Request exceeds maximum cost of $${this.config.maxCostPerRequest}.`
|
|
90
|
+
});
|
|
91
|
+
this.checks.push({
|
|
92
|
+
name: "hourly_cost_limit",
|
|
93
|
+
description: "Limits total cost per hour",
|
|
94
|
+
severity: "high",
|
|
95
|
+
check: (ctx) => {
|
|
96
|
+
const key = ctx.userId || "global";
|
|
97
|
+
const now = Date.now();
|
|
98
|
+
const hourMs = 3600 * 1e3;
|
|
99
|
+
const entry = costTracker.hourly.get(key);
|
|
100
|
+
if (!entry || now - entry.windowStart > hourMs) {
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
return entry.total + (ctx.estimatedCost || 0) <= this.config.maxCostPerHour;
|
|
104
|
+
},
|
|
105
|
+
failMessage: `Hourly cost limit of $${this.config.maxCostPerHour} exceeded.`
|
|
106
|
+
});
|
|
107
|
+
this.checks.push({
|
|
108
|
+
name: "daily_cost_limit",
|
|
109
|
+
description: "Limits total cost per day",
|
|
110
|
+
severity: "high",
|
|
111
|
+
check: (ctx) => {
|
|
112
|
+
const key = ctx.userId || "global";
|
|
113
|
+
const now = Date.now();
|
|
114
|
+
const dayMs = 86400 * 1e3;
|
|
115
|
+
const entry = costTracker.daily.get(key);
|
|
116
|
+
if (!entry || now - entry.windowStart > dayMs) {
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
return entry.total + (ctx.estimatedCost || 0) <= this.config.maxCostPerDay;
|
|
120
|
+
},
|
|
121
|
+
failMessage: `Daily cost limit of $${this.config.maxCostPerDay} exceeded.`
|
|
122
|
+
});
|
|
123
|
+
this.checks.push({
|
|
124
|
+
name: "tool_rate_limit_minute",
|
|
125
|
+
description: "Limits tool executions per minute",
|
|
126
|
+
severity: "medium",
|
|
127
|
+
check: (ctx) => {
|
|
128
|
+
if (!ctx.toolName) return true;
|
|
129
|
+
return this.checkRate(
|
|
130
|
+
`tool:${ctx.userId || "global"}`,
|
|
131
|
+
60 * 1e3,
|
|
132
|
+
this.config.maxToolsPerMinute
|
|
133
|
+
);
|
|
134
|
+
},
|
|
135
|
+
failMessage: `Tool execution rate limit exceeded (${this.config.maxToolsPerMinute}/min).`
|
|
136
|
+
});
|
|
137
|
+
this.checks.push({
|
|
138
|
+
name: "tool_rate_limit_hour",
|
|
139
|
+
description: "Limits tool executions per hour",
|
|
140
|
+
severity: "medium",
|
|
141
|
+
check: (ctx) => {
|
|
142
|
+
if (!ctx.toolName) return true;
|
|
143
|
+
return this.checkRate(
|
|
144
|
+
`tool_hourly:${ctx.userId || "global"}`,
|
|
145
|
+
3600 * 1e3,
|
|
146
|
+
this.config.maxToolsPerHour
|
|
147
|
+
);
|
|
148
|
+
},
|
|
149
|
+
failMessage: `Tool execution hourly limit exceeded (${this.config.maxToolsPerHour}/hr).`
|
|
150
|
+
});
|
|
151
|
+
this.checks.push({
|
|
152
|
+
name: "message_rate_limit",
|
|
153
|
+
description: "Limits messages per minute",
|
|
154
|
+
severity: "medium",
|
|
155
|
+
check: (ctx) => {
|
|
156
|
+
if (ctx.action !== "send_message") return true;
|
|
157
|
+
return this.checkRate(
|
|
158
|
+
`msg:${ctx.userId || "global"}`,
|
|
159
|
+
60 * 1e3,
|
|
160
|
+
this.config.maxMessagesPerMinute
|
|
161
|
+
);
|
|
162
|
+
},
|
|
163
|
+
failMessage: `Message rate limit exceeded (${this.config.maxMessagesPerMinute}/min).`
|
|
164
|
+
});
|
|
165
|
+
this.checks.push({
|
|
166
|
+
name: "command_injection",
|
|
167
|
+
description: "Prevents command injection in tool inputs",
|
|
168
|
+
severity: "critical",
|
|
169
|
+
check: (ctx) => {
|
|
170
|
+
if (!ctx.input) return true;
|
|
171
|
+
const dangerousPatterns = [
|
|
172
|
+
/;\s*(rm|del|format|mkfs|dd)\s/i,
|
|
173
|
+
/\|\s*(bash|sh|cmd|powershell)/i,
|
|
174
|
+
/`[^`]*`/,
|
|
175
|
+
/\$\([^)]*\)/,
|
|
176
|
+
/>\s*\/dev\//i
|
|
177
|
+
];
|
|
178
|
+
const inputStr = JSON.stringify(ctx.input);
|
|
179
|
+
return !dangerousPatterns.some((p) => p.test(inputStr));
|
|
180
|
+
},
|
|
181
|
+
failMessage: "Potential command injection detected in input."
|
|
182
|
+
});
|
|
183
|
+
this.checks.push({
|
|
184
|
+
name: "sensitive_data",
|
|
185
|
+
description: "Prevents leaking sensitive data patterns",
|
|
186
|
+
severity: "high",
|
|
187
|
+
check: (ctx) => {
|
|
188
|
+
if (!ctx.input) return true;
|
|
189
|
+
const sensitivePatterns = [
|
|
190
|
+
/\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b/,
|
|
191
|
+
// credit card
|
|
192
|
+
/\b\d{3}-\d{2}-\d{4}\b/,
|
|
193
|
+
// SSN
|
|
194
|
+
/-----BEGIN\s+(RSA\s+)?PRIVATE\s+KEY-----/
|
|
195
|
+
// private key
|
|
196
|
+
];
|
|
197
|
+
const inputStr = JSON.stringify(ctx.input);
|
|
198
|
+
return !sensitivePatterns.some((p) => p.test(inputStr));
|
|
199
|
+
},
|
|
200
|
+
failMessage: "Sensitive data pattern detected in input."
|
|
201
|
+
});
|
|
202
|
+
this.checks.push({
|
|
203
|
+
name: "trade_size_limit",
|
|
204
|
+
description: "Blocks orders exceeding maximum single trade size",
|
|
205
|
+
severity: "critical",
|
|
206
|
+
check: (ctx) => {
|
|
207
|
+
if (ctx.toolName !== "crypto_exchange") return true;
|
|
208
|
+
const input = ctx.input || {};
|
|
209
|
+
if (input.action !== "place_order") return true;
|
|
210
|
+
const estimatedTotal = input._estimatedTotal || 0;
|
|
211
|
+
if (estimatedTotal <= 0) return true;
|
|
212
|
+
return estimatedTotal <= this.config.maxTradeSize;
|
|
213
|
+
},
|
|
214
|
+
failMessage: `Trade exceeds maximum single order size of $${this.config.maxTradeSize}.`
|
|
215
|
+
});
|
|
216
|
+
this.checks.push({
|
|
217
|
+
name: "daily_trade_spend_limit",
|
|
218
|
+
description: "Blocks when daily trade spending cap exceeded",
|
|
219
|
+
severity: "critical",
|
|
220
|
+
check: (ctx) => {
|
|
221
|
+
if (ctx.toolName !== "crypto_exchange") return true;
|
|
222
|
+
const input = ctx.input || {};
|
|
223
|
+
if (input.action !== "place_order") return true;
|
|
224
|
+
const estimatedTotal = input._estimatedTotal || 0;
|
|
225
|
+
if (estimatedTotal <= 0) return true;
|
|
226
|
+
const key = ctx.userId || "global";
|
|
227
|
+
const now = Date.now();
|
|
228
|
+
const dayMs = 86400 * 1e3;
|
|
229
|
+
const entry = tradeSpendTracker.daily.get(key);
|
|
230
|
+
if (!entry || now - entry.windowStart > dayMs) {
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
return entry.total + estimatedTotal <= this.config.maxDailyTradeSpend;
|
|
234
|
+
},
|
|
235
|
+
failMessage: `Daily trade spend limit of $${this.config.maxDailyTradeSpend} exceeded.`
|
|
236
|
+
});
|
|
237
|
+
this.checks.push({
|
|
238
|
+
name: "trade_rate_limit",
|
|
239
|
+
description: "Blocks when hourly trade count exceeded",
|
|
240
|
+
severity: "high",
|
|
241
|
+
check: (ctx) => {
|
|
242
|
+
if (ctx.toolName !== "crypto_exchange") return true;
|
|
243
|
+
const input = ctx.input || {};
|
|
244
|
+
if (input.action !== "place_order") return true;
|
|
245
|
+
const key = ctx.userId || "global";
|
|
246
|
+
const now = Date.now();
|
|
247
|
+
const hourMs = 3600 * 1e3;
|
|
248
|
+
const entry = tradeSpendTracker.hourlyCount.get(key);
|
|
249
|
+
if (!entry || now - entry.windowStart > hourMs) {
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
return entry.count < this.config.maxTradesPerHour;
|
|
253
|
+
},
|
|
254
|
+
failMessage: `Trade rate limit exceeded (${this.config.maxTradesPerHour}/hr).`
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
checkRate(key, windowMs, maxCount) {
|
|
258
|
+
const now = Date.now();
|
|
259
|
+
let entry = rateTracker.get(key);
|
|
260
|
+
if (!entry) {
|
|
261
|
+
entry = { timestamps: [] };
|
|
262
|
+
rateTracker.set(key, entry);
|
|
263
|
+
}
|
|
264
|
+
entry.timestamps = entry.timestamps.filter((t) => now - t < windowMs);
|
|
265
|
+
return entry.timestamps.length < maxCount;
|
|
266
|
+
}
|
|
267
|
+
recordRate(key) {
|
|
268
|
+
let entry = rateTracker.get(key);
|
|
269
|
+
if (!entry) {
|
|
270
|
+
entry = { timestamps: [] };
|
|
271
|
+
rateTracker.set(key, entry);
|
|
272
|
+
}
|
|
273
|
+
entry.timestamps.push(Date.now());
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Evaluate all risk checks for an action
|
|
277
|
+
* This is the main entry point - NON-BYPASSABLE
|
|
278
|
+
*/
|
|
279
|
+
async evaluate(context) {
|
|
280
|
+
const results = [];
|
|
281
|
+
let allowed = true;
|
|
282
|
+
for (const check of this.checks) {
|
|
283
|
+
let passed;
|
|
284
|
+
try {
|
|
285
|
+
passed = await check.check(context);
|
|
286
|
+
} catch {
|
|
287
|
+
passed = false;
|
|
288
|
+
}
|
|
289
|
+
results.push({
|
|
290
|
+
name: check.name,
|
|
291
|
+
passed,
|
|
292
|
+
severity: check.severity,
|
|
293
|
+
message: passed ? void 0 : check.failMessage
|
|
294
|
+
});
|
|
295
|
+
if (!passed && (check.severity === "critical" || check.severity === "high")) {
|
|
296
|
+
allowed = false;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const decision = {
|
|
300
|
+
allowed,
|
|
301
|
+
checks: results,
|
|
302
|
+
timestamp: /* @__PURE__ */ new Date(),
|
|
303
|
+
context
|
|
304
|
+
};
|
|
305
|
+
auditLog.push(decision);
|
|
306
|
+
if (auditLog.length > 1e4) {
|
|
307
|
+
auditLog.splice(0, auditLog.length - 5e3);
|
|
308
|
+
}
|
|
309
|
+
if (allowed) {
|
|
310
|
+
if (context.toolName) {
|
|
311
|
+
this.recordRate(`tool:${context.userId || "global"}`);
|
|
312
|
+
this.recordRate(`tool_hourly:${context.userId || "global"}`);
|
|
313
|
+
}
|
|
314
|
+
if (context.action === "send_message") {
|
|
315
|
+
this.recordRate(`msg:${context.userId || "global"}`);
|
|
316
|
+
}
|
|
317
|
+
if (context.estimatedCost) {
|
|
318
|
+
this.recordCost(context.userId || "global", context.estimatedCost);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
return decision;
|
|
322
|
+
}
|
|
323
|
+
recordCost(userId, cost) {
|
|
324
|
+
const now = Date.now();
|
|
325
|
+
const hourMs = 3600 * 1e3;
|
|
326
|
+
const dayMs = 86400 * 1e3;
|
|
327
|
+
let hourly = costTracker.hourly.get(userId);
|
|
328
|
+
if (!hourly || now - hourly.windowStart > hourMs) {
|
|
329
|
+
hourly = { total: 0, windowStart: now };
|
|
330
|
+
costTracker.hourly.set(userId, hourly);
|
|
331
|
+
}
|
|
332
|
+
hourly.total += cost;
|
|
333
|
+
let daily = costTracker.daily.get(userId);
|
|
334
|
+
if (!daily || now - daily.windowStart > dayMs) {
|
|
335
|
+
daily = { total: 0, windowStart: now };
|
|
336
|
+
costTracker.daily.set(userId, daily);
|
|
337
|
+
}
|
|
338
|
+
daily.total += cost;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Add a custom risk check
|
|
342
|
+
*/
|
|
343
|
+
addCheck(check) {
|
|
344
|
+
this.checks.push(check);
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Activate kill switch
|
|
348
|
+
*/
|
|
349
|
+
activateKillSwitch() {
|
|
350
|
+
this.config.killSwitch = true;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Deactivate kill switch
|
|
354
|
+
*/
|
|
355
|
+
deactivateKillSwitch() {
|
|
356
|
+
this.config.killSwitch = false;
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Enable safe mode
|
|
360
|
+
*/
|
|
361
|
+
enableSafeMode() {
|
|
362
|
+
this.config.safeMode = true;
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Disable safe mode
|
|
366
|
+
*/
|
|
367
|
+
disableSafeMode() {
|
|
368
|
+
this.config.safeMode = false;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Block a tool
|
|
372
|
+
*/
|
|
373
|
+
blockTool(toolName) {
|
|
374
|
+
if (!this.config.blockedTools.includes(toolName)) {
|
|
375
|
+
this.config.blockedTools.push(toolName);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Unblock a tool
|
|
380
|
+
*/
|
|
381
|
+
unblockTool(toolName) {
|
|
382
|
+
this.config.blockedTools = this.config.blockedTools.filter(
|
|
383
|
+
(t) => t !== toolName
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Get recent audit log
|
|
388
|
+
*/
|
|
389
|
+
getAuditLog(limit = 100) {
|
|
390
|
+
return auditLog.slice(-limit);
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Get current configuration
|
|
394
|
+
*/
|
|
395
|
+
getConfig() {
|
|
396
|
+
return { ...this.config };
|
|
397
|
+
}
|
|
398
|
+
/**
|
|
399
|
+
* Update configuration
|
|
400
|
+
*/
|
|
401
|
+
updateConfig(updates) {
|
|
402
|
+
Object.assign(this.config, updates);
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Record trade spend after a successful trade execution.
|
|
406
|
+
* Call this after a trade completes to track daily/hourly limits.
|
|
407
|
+
*/
|
|
408
|
+
recordTradeSpend(userId, amountUsd) {
|
|
409
|
+
const now = Date.now();
|
|
410
|
+
const dayMs = 86400 * 1e3;
|
|
411
|
+
const hourMs = 3600 * 1e3;
|
|
412
|
+
let daily = tradeSpendTracker.daily.get(userId);
|
|
413
|
+
if (!daily || now - daily.windowStart > dayMs) {
|
|
414
|
+
daily = { total: 0, windowStart: now };
|
|
415
|
+
tradeSpendTracker.daily.set(userId, daily);
|
|
416
|
+
}
|
|
417
|
+
daily.total += amountUsd;
|
|
418
|
+
let hourly = tradeSpendTracker.hourlyCount.get(userId);
|
|
419
|
+
if (!hourly || now - hourly.windowStart > hourMs) {
|
|
420
|
+
hourly = { count: 0, windowStart: now };
|
|
421
|
+
tradeSpendTracker.hourlyCount.set(userId, hourly);
|
|
422
|
+
}
|
|
423
|
+
hourly.count += 1;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Register risk engine as a hook on tool:execute to intercept
|
|
427
|
+
* financial tool calls at the hook level.
|
|
428
|
+
*/
|
|
429
|
+
registerAsHook(hookMgr) {
|
|
430
|
+
return hookMgr.register({
|
|
431
|
+
event: "tool:execute",
|
|
432
|
+
phase: "before",
|
|
433
|
+
name: "risk-engine-financial",
|
|
434
|
+
priority: 3,
|
|
435
|
+
// Run before tool sandbox (priority 5)
|
|
436
|
+
handler: async (context) => {
|
|
437
|
+
const toolName = context.data.toolName || "";
|
|
438
|
+
const input = context.data.input || {};
|
|
439
|
+
if (toolName !== "crypto_exchange") return context;
|
|
440
|
+
const decision = await this.evaluate({
|
|
441
|
+
action: "tool_execute",
|
|
442
|
+
userId: context.userId,
|
|
443
|
+
toolName,
|
|
444
|
+
input
|
|
445
|
+
});
|
|
446
|
+
if (!decision.allowed) {
|
|
447
|
+
context.cancelled = true;
|
|
448
|
+
const failedChecks = decision.checks.filter((c) => !c.passed).map((c) => c.message).join("; ");
|
|
449
|
+
context.cancelReason = `[RiskEngine] BLOCKED: ${failedChecks}`;
|
|
450
|
+
console.log(`[RiskEngine] Blocked ${toolName}: ${failedChecks}`);
|
|
451
|
+
}
|
|
452
|
+
return context;
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
var riskEngine = new RiskEngine();
|
|
458
|
+
|
|
459
|
+
export {
|
|
460
|
+
RiskEngine,
|
|
461
|
+
riskEngine
|
|
462
|
+
};
|
|
463
|
+
//# sourceMappingURL=chunk-ODCFS5WD.js.map
|