opensentinel 3.1.1 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -83
- package/dist/agent-manager-JZ4IM7XI.js +39 -0
- package/dist/agent-processor-DDDHC2SO.js +281 -0
- package/dist/agent-processor-DDDHC2SO.js.map +1 -0
- package/dist/agent-types-2T4PXLFQ.js +12 -0
- package/dist/alerting-LK7VVYTX.js +699 -0
- package/dist/alerting-LK7VVYTX.js.map +1 -0
- package/dist/analysis-agent-JWN2GXYE.js +288 -0
- package/dist/analysis-agent-JWN2GXYE.js.map +1 -0
- package/dist/analyzer-OTWE3ARE.js +22 -0
- package/dist/{archiver-AVNBYCKQ.js → archiver-FPGKRP6P.js} +2 -2
- package/dist/{audit-logger-OBPR7CRO.js → audit-logger-CI4WZQPD.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-VDHBGUVI.js +47 -0
- package/dist/brain-6QTXN4QP.js +66 -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-WRAKK6K6.js → chunk-2I5QHYG6.js} +5 -3
- package/dist/chunk-2I5QHYG6.js.map +1 -0
- package/dist/{chunk-TVEWKIK3.js → chunk-2WTKTG2C.js} +2 -2
- package/dist/chunk-3AWAWRWB.js +143 -0
- package/dist/chunk-3AWAWRWB.js.map +1 -0
- package/dist/{chunk-ZLZKF2PM.js → chunk-4KIHDIXZ.js} +43 -2
- package/dist/chunk-4KIHDIXZ.js.map +1 -0
- package/dist/{chunk-EVE7MIIY.js → chunk-4WH6MFEW.js} +15 -16
- package/dist/chunk-4WH6MFEW.js.map +1 -0
- package/dist/{chunk-I6BDYQIG.js → chunk-56UJS2LA.js} +6 -6
- package/dist/chunk-56UJS2LA.js.map +1 -0
- package/dist/chunk-5BTVJR7R.js +37 -0
- package/dist/chunk-5BTVJR7R.js.map +1 -0
- package/dist/chunk-5JJTLWOR.js +1021 -0
- package/dist/chunk-5JJTLWOR.js.map +1 -0
- package/dist/chunk-66SAOZPU.js +236 -0
- package/dist/chunk-66SAOZPU.js.map +1 -0
- package/dist/chunk-6HGMRR4J.js +113 -0
- package/dist/chunk-6HGMRR4J.js.map +1 -0
- package/dist/chunk-6W6PTJFT.js +181 -0
- package/dist/chunk-6W6PTJFT.js.map +1 -0
- package/dist/chunk-6ZNCY2GI.js +418 -0
- package/dist/chunk-6ZNCY2GI.js.map +1 -0
- package/dist/chunk-7BNFELEK.js +31 -0
- package/dist/chunk-7BNFELEK.js.map +1 -0
- package/dist/chunk-ADTDYJO7.js +265 -0
- package/dist/chunk-ADTDYJO7.js.map +1 -0
- package/dist/{chunk-OCVQGBJK.js → chunk-BBN4VCNK.js} +6 -4
- package/dist/chunk-BBN4VCNK.js.map +1 -0
- package/dist/{chunk-SJSUSJ47.js → chunk-BNZHWAZC.js} +2 -2
- 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-NHMBTUMW.js → chunk-CWT6CAE5.js} +2 -2
- package/dist/{chunk-4GLYY4NN.js → chunk-CZTMGHUC.js} +8 -2
- package/dist/chunk-CZTMGHUC.js.map +1 -0
- package/dist/{chunk-RZ4YESBG.js → chunk-DOYGMNMK.js} +1 -1
- package/dist/chunk-DOYGMNMK.js.map +1 -0
- package/dist/chunk-DTISLIMB.js +89 -0
- package/dist/chunk-DTISLIMB.js.map +1 -0
- package/dist/{chunk-SPPMCAKG.js → chunk-GBVJTRXS.js} +2 -2
- package/dist/chunk-GBVJTRXS.js.map +1 -0
- package/dist/{chunk-AYUKPTSM.js → chunk-GJETKBOY.js} +96 -218
- package/dist/chunk-GJETKBOY.js.map +1 -0
- package/dist/{chunk-BXZ6EA52.js → chunk-GW6V4D43.js} +57 -3
- package/dist/chunk-GW6V4D43.js.map +1 -0
- package/dist/{chunk-6PMVAAA7.js → chunk-HJSEEFO3.js} +3 -3
- package/dist/{chunk-TYAGMJNV.js → chunk-HQZQFEAX.js} +5 -5
- package/dist/{chunk-MXAPLSJ5.js → chunk-J4JW73TT.js} +2 -2
- package/dist/{chunk-VEHFVBLI.js → chunk-JHYYFPKX.js} +2 -2
- package/dist/chunk-LFDXEYYB.js +150 -0
- package/dist/chunk-LFDXEYYB.js.map +1 -0
- package/dist/chunk-MIC5IBQF.js +386 -0
- package/dist/chunk-MIC5IBQF.js.map +1 -0
- package/dist/chunk-ODCFS5WD.js +463 -0
- package/dist/chunk-ODCFS5WD.js.map +1 -0
- package/dist/{chunk-XMCVRVTF.js → chunk-P64EV4YY.js} +1 -1
- package/dist/chunk-P64EV4YY.js.map +1 -0
- package/dist/chunk-PBOCSGNL.js +84 -0
- package/dist/chunk-PBOCSGNL.js.map +1 -0
- package/dist/{chunk-66OJ3WB4.js → chunk-PD3CTDO6.js} +2 -2
- package/dist/chunk-QPY3WRVM.js +647 -0
- package/dist/chunk-QPY3WRVM.js.map +1 -0
- package/dist/chunk-S2EOIVF4.js +3907 -0
- package/dist/chunk-S2EOIVF4.js.map +1 -0
- package/dist/chunk-SDLOMKCW.js +213 -0
- package/dist/chunk-SDLOMKCW.js.map +1 -0
- package/dist/chunk-TKBVW7ZJ.js +162 -0
- package/dist/chunk-TKBVW7ZJ.js.map +1 -0
- 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-SVAPX2XN.js → chunk-V3OKHQUX.js} +9 -7
- package/dist/{chunk-SVAPX2XN.js.map → chunk-V3OKHQUX.js.map} +1 -1
- package/dist/{chunk-4UOE5TUZ.js → chunk-WMDVOWN6.js} +4 -4
- package/dist/chunk-WMFYI7XC.js +564 -0
- package/dist/chunk-WMFYI7XC.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-YEDEAX6Y.js +194 -0
- package/dist/chunk-YEDEAX6Y.js.map +1 -0
- package/dist/{chunk-XKYRH4FM.js → chunk-ZIBRVA3Y.js} +70 -30
- package/dist/chunk-ZIBRVA3Y.js.map +1 -0
- package/dist/chunk-ZIYTHUM5.js +457 -0
- package/dist/chunk-ZIYTHUM5.js.map +1 -0
- package/dist/{chunk-766ASQWE.js → chunk-ZMML6T63.js} +2711 -2329
- package/dist/chunk-ZMML6T63.js.map +1 -0
- package/dist/chunk-ZVHG4KF2.js +380 -0
- package/dist/chunk-ZVHG4KF2.js.map +1 -0
- package/dist/chunker-K6WTR62A.js +12 -0
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +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 +2 -2
- package/dist/commands/start.js +3 -3
- package/dist/commands/status.js +2 -2
- package/dist/commands/stop.js +2 -2
- package/dist/commands/utils.js +2 -2
- package/dist/cost-tracker-KZQSTSE2.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-I7MNG6CL.js +83 -0
- package/dist/discord-6UQHCN27.js +81 -0
- package/dist/documents-PFHSK7SZ.js +184 -0
- package/dist/documents-PFHSK7SZ.js.map +1 -0
- package/dist/docx-parser-EXL4TN5E.js +16 -0
- package/dist/{email-K7LO2IPB.js → email-6OIN4SYL.js} +34 -25
- package/dist/email-6OIN4SYL.js.map +1 -0
- package/dist/{enhanced-retrieval-DNLLEM4Z.js → enhanced-retrieval-JWX2HWU4.js} +12 -8
- package/dist/{enhanced-retrieval-DNLLEM4Z.js.map → enhanced-retrieval-JWX2HWU4.js.map} +1 -1
- package/dist/enrichment-pipeline-7FE5R5ZI.js +14 -0
- package/dist/{entity-resolution-Y3IUWEAT.js → entity-resolution-7Z6STVXX.js} +6 -5
- package/dist/env-GN5VHI43.js +12 -0
- package/dist/error-tracker-64DEH3D7.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-DUWSXCNP.js +833 -0
- package/dist/github-DUWSXCNP.js.map +1 -0
- package/dist/{google-workspace-DKWUVNGC.js → google-workspace-TSZPZK5G.js} +2 -2
- package/dist/graph-client-NB475AK5.js +17 -0
- 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-DSGSGUZS.js +44 -0
- package/dist/inbox-summarizer-F2KAU72V.js +56 -0
- package/dist/{incident-response-C5J7Q6DT.js → incident-response-E3UGMX5G.js} +8 -6
- package/dist/incident-response-E3UGMX5G.js.map +1 -0
- 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-5SMMOGQJ.js +46 -0
- package/dist/lib.d.ts +94 -1
- package/dist/lib.js +83 -66
- package/dist/lib.js.map +1 -1
- package/dist/{mailchimp-KKNF6QJ7.js → mailchimp-ZFYDC44J.js} +2 -2
- package/dist/{matrix-QVHG76I7.js → matrix-WYGEOZL5.js} +30 -21
- package/dist/{matrix-QVHG76I7.js.map → matrix-WYGEOZL5.js.map} +1 -1
- package/dist/{mcp-3JI6W7ZE.js → mcp-DJ2QDA6A.js} +3 -3
- package/dist/metrics-BH3ZLGEV.js +25 -0
- package/dist/{microsoft365-UCBKJHNX.js → microsoft365-6G2IJMWC.js} +2 -2
- package/dist/multi-user-XAEMB244.js +411 -0
- package/dist/multi-user-XAEMB244.js.map +1 -0
- package/dist/oauth-UPJYFOVU.js +34 -0
- package/dist/{ocr-AC7NPX33.js → ocr-UONKTQU7.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-UOET2FVZ.js} +3 -3
- package/dist/presentations-UOET2FVZ.js.map +1 -0
- package/dist/{prometheus-JNT2BD4L.js → prometheus-YETCZO4I.js} +2 -2
- package/dist/prometheus-YETCZO4I.js.map +1 -0
- package/dist/{providers-J4LYPHDR.js → providers-2YQ6E3IF.js} +6 -4
- package/dist/providers-2YQ6E3IF.js.map +1 -0
- package/dist/{qr-code-WIX4PB4U.js → qr-code-6WZJHRKL.js} +2 -2
- package/dist/qr-code-6WZJHRKL.js.map +1 -0
- 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-6PLLAQI7.js +74 -0
- package/dist/scheduler-6PLLAQI7.js.map +1 -0
- package/dist/schema-ETY7L2VA.js +78 -0
- package/dist/schema-ETY7L2VA.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/sharepoint-V5P4Q62L.js +30 -0
- package/dist/sharepoint-V5P4Q62L.js.map +1 -0
- package/dist/{shopify-NCXYJB4R.js → shopify-ON2PAU27.js} +2 -2
- package/dist/signal-7D5EPGVL.js +44 -0
- package/dist/signal-7D5EPGVL.js.map +1 -0
- package/dist/slack-KSS6YK5Z.js +86 -0
- package/dist/slack-KSS6YK5Z.js.map +1 -0
- package/dist/{sms-M3JIOTCW.js → sms-CSUCC7HL.js} +4 -4
- package/dist/sms-CSUCC7HL.js.map +1 -0
- package/dist/{src-VYUE6LRA.js → src-GO7GGW7O.js} +190 -52
- package/dist/src-GO7GGW7O.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/token-store-SEWRX6RE.js +20 -0
- package/dist/token-store-SEWRX6RE.js.map +1 -0
- package/dist/tools-PJZ6RI4P.js +47 -0
- package/dist/tools-PJZ6RI4P.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-DWXK25V2.js +44 -0
- package/dist/whatsapp-DWXK25V2.js.map +1 -0
- package/dist/{word-document-7B6SJMAY.js → word-document-AV3YB4L2.js} +4 -4
- package/dist/word-document-AV3YB4L2.js.map +1 -0
- package/dist/workflow-store-5Y56GUP7.js +373 -0
- package/dist/workflow-store-5Y56GUP7.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/drizzle/0002_mushy_master_mold.sql +139 -139
- package/drizzle/0003_overjoyed_rhodey.sql +46 -0
- package/drizzle/meta/0002_snapshot.json +3636 -3636
- package/drizzle/meta/0003_snapshot.json +3946 -0
- package/drizzle/meta/_journal.json +7 -0
- package/package.json +110 -100
- 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-OCVQGBJK.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-WRAKK6K6.js.map +0 -1
- package/dist/chunk-XKYRH4FM.js.map +0 -1
- package/dist/chunk-XMCVRVTF.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/email-K7LO2IPB.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/incident-response-C5J7Q6DT.js.map +0 -1
- 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-JZ4IM7XI.js.map} +0 -0
- /package/dist/{auth-UOX5K2BE.js.map → agent-types-2T4PXLFQ.js.map} +0 -0
- /package/dist/{backup-restore-PZ7CYYB7.js.map → analyzer-OTWE3ARE.js.map} +0 -0
- /package/dist/{archiver-AVNBYCKQ.js.map → archiver-FPGKRP6P.js.map} +0 -0
- /package/dist/{blocks-R3PODY47.js.map → audit-logger-CI4WZQPD.js.map} +0 -0
- /package/dist/{bot-QRARP4UN.js.map → auth-PH5IHISW.js.map} +0 -0
- /package/dist/{aws-s3-Q4LLZZPD.js.map → aws-s3-QZMURYXB.js.map} +0 -0
- /package/dist/{brain-7XLLM3KC.js.map → backup-restore-72OQTZO3.js.map} +0 -0
- /package/dist/{chunk-PLDDJCW6.js.map → blocks-YOWOESDD.js.map} +0 -0
- /package/dist/{client-ZQSFPMOB.js.map → bot-VDHBGUVI.js.map} +0 -0
- /package/dist/{clipboard-manager-TEO2GEDN.js.map → brain-6QTXN4QP.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-TVEWKIK3.js.map → chunk-2WTKTG2C.js.map} +0 -0
- /package/dist/{chunk-SJSUSJ47.js.map → chunk-BNZHWAZC.js.map} +0 -0
- /package/dist/{chunk-MQJ2ECQT.js.map → chunk-CUPEENUY.js.map} +0 -0
- /package/dist/{chunk-NHMBTUMW.js.map → chunk-CWT6CAE5.js.map} +0 -0
- /package/dist/{chunk-6PMVAAA7.js.map → chunk-HJSEEFO3.js.map} +0 -0
- /package/dist/{chunk-TYAGMJNV.js.map → chunk-HQZQFEAX.js.map} +0 -0
- /package/dist/{chunk-MXAPLSJ5.js.map → chunk-J4JW73TT.js.map} +0 -0
- /package/dist/{chunk-VEHFVBLI.js.map → chunk-JHYYFPKX.js.map} +0 -0
- /package/dist/{chunk-66OJ3WB4.js.map → chunk-PD3CTDO6.js.map} +0 -0
- /package/dist/{cron-explain-HHQKPD3M.js.map → chunk-UP2VWCW5.js.map} +0 -0
- /package/dist/{chunk-4UOE5TUZ.js.map → chunk-WMDVOWN6.js.map} +0 -0
- /package/dist/{crypto-4AP47IKC.js.map → chunker-K6WTR62A.js.map} +0 -0
- /package/dist/{databases-37X4CI2Y.js.map → client-FOIYPOZQ.js.map} +0 -0
- /package/dist/{discord-B3HUPGQ6.js.map → clipboard-manager-4SBNESGZ.js.map} +0 -0
- /package/dist/{enrichment-pipeline-MNHNW65K.js.map → cost-tracker-KZQSTSE2.js.map} +0 -0
- /package/dist/{entity-resolution-Y3IUWEAT.js.map → cron-explain-UOOOYWZZ.js.map} +0 -0
- /package/dist/{env-IWXUVTCB.js.map → crypto-2VG3RJR2.js.map} +0 -0
- /package/dist/{hash-tool-ULQYD7B5.js.map → databases-XDPMG5AV.js.map} +0 -0
- /package/dist/{heartbeat-monitor-GCISLXI3.js.map → db-I7MNG6CL.js.map} +0 -0
- /package/dist/{imessage-NGA2XF2V.js.map → discord-6UQHCN27.js.map} +0 -0
- /package/dist/{inbox-summarizer-NRI4S7IF.js.map → docx-parser-EXL4TN5E.js.map} +0 -0
- /package/dist/{inventory-manager-352OHXWD.js.map → enrichment-pipeline-7FE5R5ZI.js.map} +0 -0
- /package/dist/{json-tool-QE2SYHEG.js.map → entity-resolution-7Z6STVXX.js.map} +0 -0
- /package/dist/{key-rotation-DPHU4ZTB.js.map → env-GN5VHI43.js.map} +0 -0
- /package/dist/{mcp-3JI6W7ZE.js.map → error-tracker-64DEH3D7.js.map} +0 -0
- /package/dist/{google-workspace-DKWUVNGC.js.map → google-workspace-TSZPZK5G.js.map} +0 -0
- /package/dist/{ocr-AC7NPX33.js.map → graph-client-NB475AK5.js.map} +0 -0
- /package/dist/{ollama-BOAMSPLJ.js.map → hash-tool-ENAB5LWH.js.map} +0 -0
- /package/dist/{pages-MI523RB7.js.map → heartbeat-monitor-KRDYTDBF.js.map} +0 -0
- /package/dist/{pairing-IFQYCPNS.js.map → hooks-N4MIFBVM.js.map} +0 -0
- /package/dist/{image-generation-OSU7FP6F.js.map → image-generation-MDE6AVQO.js.map} +0 -0
- /package/dist/{pdf-ALQVOEJR.js.map → imessage-DSGSGUZS.js.map} +0 -0
- /package/dist/{prometheus-JNT2BD4L.js.map → inbox-summarizer-F2KAU72V.js.map} +0 -0
- /package/dist/{providers-J4LYPHDR.js.map → inventory-manager-C67BSZM6.js.map} +0 -0
- /package/dist/{jira-GSGDBMIG.js.map → jira-PAGZWUBJ.js.map} +0 -0
- /package/dist/{qr-code-WIX4PB4U.js.map → json-tool-4FK5RNER.js.map} +0 -0
- /package/dist/{regex-tool-W4ABRKGK.js.map → key-rotation-WCC5FOYS.js.map} +0 -0
- /package/dist/{scheduler-VK4WFERV.js.map → knowledge-base-5SMMOGQJ.js.map} +0 -0
- /package/dist/{mailchimp-KKNF6QJ7.js.map → mailchimp-ZFYDC44J.js.map} +0 -0
- /package/dist/{search-BCLBO5E3.js.map → mcp-DJ2QDA6A.js.map} +0 -0
- /package/dist/{signal-6CGDFYL2.js.map → metrics-BH3ZLGEV.js.map} +0 -0
- /package/dist/{microsoft365-UCBKJHNX.js.map → microsoft365-6G2IJMWC.js.map} +0 -0
- /package/dist/{slack-IZQWIKOH.js.map → oauth-UPJYFOVU.js.map} +0 -0
- /package/dist/{sms-M3JIOTCW.js.map → ocr-UONKTQU7.js.map} +0 -0
- /package/dist/{stocks-XXWBPOCU.js.map → ollama-J7CU45WT.js.map} +0 -0
- /package/dist/{text-transform-6SGUA5Z4.js.map → pages-XDE7JRCA.js.map} +0 -0
- /package/dist/{pair-JDFTERIK.js.map → pair-YZJFQUU5.js.map} +0 -0
- /package/dist/{tools-2RLEI2N6.js.map → pairing-77N47RAT.js.map} +0 -0
- /package/dist/{unit-converter-ZYXMEZOE.js.map → pdf-67HGXCFJ.js.map} +0 -0
- /package/dist/{whatsapp-LFX6YKCM.js.map → pdf-parser-YLMTTYHL.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
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import {
|
|
2
|
+
SYSTEM_PROMPT,
|
|
3
|
+
chat,
|
|
4
|
+
chatWithTools,
|
|
5
|
+
compactConversation,
|
|
6
|
+
intentParser,
|
|
7
|
+
needsCompaction,
|
|
8
|
+
qualityScorer,
|
|
9
|
+
reflectionTracker,
|
|
10
|
+
requestTracer,
|
|
11
|
+
streamChat,
|
|
12
|
+
streamChatWithTools
|
|
13
|
+
} from "./chunk-ZMML6T63.js";
|
|
14
|
+
import "./chunk-5JJTLWOR.js";
|
|
15
|
+
import "./chunk-QPY3WRVM.js";
|
|
16
|
+
import "./chunk-ADTDYJO7.js";
|
|
17
|
+
import "./chunk-DTISLIMB.js";
|
|
18
|
+
import "./chunk-CUPEENUY.js";
|
|
19
|
+
import "./chunk-2WTKTG2C.js";
|
|
20
|
+
import "./chunk-U2X2J3FI.js";
|
|
21
|
+
import "./chunk-X6Q3K3L2.js";
|
|
22
|
+
import "./chunk-ODCFS5WD.js";
|
|
23
|
+
import "./chunk-KM22GV7G.js";
|
|
24
|
+
import "./chunk-P6QINGFL.js";
|
|
25
|
+
import "./chunk-HJSEEFO3.js";
|
|
26
|
+
import "./chunk-C6PELIHS.js";
|
|
27
|
+
import "./chunk-7WQO5J2M.js";
|
|
28
|
+
import "./chunk-WMFYI7XC.js";
|
|
29
|
+
import "./chunk-YEDEAX6Y.js";
|
|
30
|
+
import {
|
|
31
|
+
costTracker,
|
|
32
|
+
modelRouter
|
|
33
|
+
} from "./chunk-6ZNCY2GI.js";
|
|
34
|
+
import "./chunk-WZAH34TG.js";
|
|
35
|
+
import "./chunk-6KONMXQ6.js";
|
|
36
|
+
import "./chunk-22VGGA7S.js";
|
|
37
|
+
import "./chunk-HN3F4WSW.js";
|
|
38
|
+
import "./chunk-V3OKHQUX.js";
|
|
39
|
+
import "./chunk-2I5QHYG6.js";
|
|
40
|
+
import "./chunk-CZTMGHUC.js";
|
|
41
|
+
import "./chunk-4WH6MFEW.js";
|
|
42
|
+
import "./chunk-GW6V4D43.js";
|
|
43
|
+
import "./chunk-DOYGMNMK.js";
|
|
44
|
+
import "./chunk-CQ4JURG7.js";
|
|
45
|
+
import "./chunk-BBN4VCNK.js";
|
|
46
|
+
import "./chunk-5BTVJR7R.js";
|
|
47
|
+
import "./chunk-4KIHDIXZ.js";
|
|
48
|
+
import "./chunk-ZIBRVA3Y.js";
|
|
49
|
+
import "./chunk-35WYTA3C.js";
|
|
50
|
+
import "./chunk-UP2VWCW5.js";
|
|
51
|
+
export {
|
|
52
|
+
SYSTEM_PROMPT,
|
|
53
|
+
chat,
|
|
54
|
+
chatWithTools,
|
|
55
|
+
compactConversation,
|
|
56
|
+
costTracker,
|
|
57
|
+
intentParser,
|
|
58
|
+
modelRouter,
|
|
59
|
+
needsCompaction,
|
|
60
|
+
qualityScorer,
|
|
61
|
+
reflectionTracker,
|
|
62
|
+
requestTracer,
|
|
63
|
+
streamChat,
|
|
64
|
+
streamChatWithTools
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=brain-6QTXN4QP.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
__require
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UP2VWCW5.js";
|
|
4
4
|
|
|
5
5
|
// src/tools/camera-monitor.ts
|
|
6
6
|
import { spawn, execSync } from "child_process";
|
|
@@ -332,4 +332,4 @@ export {
|
|
|
332
332
|
snapshotHA,
|
|
333
333
|
snapshotRTSP
|
|
334
334
|
};
|
|
335
|
-
//# sourceMappingURL=camera-monitor-
|
|
335
|
+
//# sourceMappingURL=camera-monitor-LHTUWHEL.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isPathAllowed
|
|
3
3
|
} from "./chunk-CQ4JURG7.js";
|
|
4
|
-
import "./chunk-
|
|
4
|
+
import "./chunk-UP2VWCW5.js";
|
|
5
5
|
|
|
6
6
|
// src/tools/file-generation/charts.ts
|
|
7
7
|
import { join } from "path";
|
|
@@ -238,4 +238,4 @@ export {
|
|
|
238
238
|
generateChart,
|
|
239
239
|
quickChart
|
|
240
240
|
};
|
|
241
|
-
//# sourceMappingURL=charts-
|
|
241
|
+
//# sourceMappingURL=charts-FJ32GQK7.js.map
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
|
-
db
|
|
2
|
+
db
|
|
3
|
+
} from "./chunk-5BTVJR7R.js";
|
|
4
|
+
import {
|
|
3
5
|
graphEntities,
|
|
4
6
|
graphRelationships
|
|
5
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ZIBRVA3Y.js";
|
|
6
8
|
|
|
7
9
|
// src/core/intelligence/entity-resolution.ts
|
|
8
10
|
import { eq, ilike, sql } from "drizzle-orm";
|
|
@@ -262,4 +264,4 @@ export {
|
|
|
262
264
|
mergeEntities,
|
|
263
265
|
findDuplicates
|
|
264
266
|
};
|
|
265
|
-
//# sourceMappingURL=chunk-
|
|
267
|
+
//# sourceMappingURL=chunk-2I5QHYG6.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/intelligence/entity-resolution.ts"],"sourcesContent":["/**\r\n * Entity Resolution Pipeline\r\n *\r\n * Resolves, deduplicates, and matches entities across multiple public records\r\n * databases (FEC, IRS 990, USAspending, SEC EDGAR, OpenCorporates).\r\n *\r\n * Flow: exact match → identifier match (EIN/CIK/FEC) → fuzzy match → create new\r\n */\r\n\r\nimport { db } from \"../../db\";\r\nimport { graphEntities, graphRelationships } from \"../../db/schema\";\r\nimport { eq, ilike, sql } from \"drizzle-orm\";\r\n\r\n// Extended entity type for OSINT sources\r\nexport type OSINTEntityType =\r\n | \"person\"\r\n | \"organization\"\r\n | \"committee\"\r\n | \"contract\"\r\n | \"filing\"\r\n | \"location\"\r\n | \"topic\";\r\n\r\nexport interface EntityCandidate {\r\n name: string;\r\n type: OSINTEntityType;\r\n source: string; // \"fec\" | \"irs990\" | \"usaspending\" | \"sec\" | \"opencorporates\" | \"manual\"\r\n identifiers?: {\r\n ein?: string;\r\n cik?: string;\r\n fecId?: string;\r\n duns?: string;\r\n uei?: string;\r\n };\r\n attributes?: Record<string, unknown>;\r\n aliases?: string[];\r\n}\r\n\r\nexport interface ResolvedEntity {\r\n isNew: boolean;\r\n entityId: string; // postgres graphEntities.id\r\n confidence: number; // 0-1\r\n matchedBy: \"exact\" | \"fuzzy\" | \"identifier\" | \"new\";\r\n}\r\n\r\n/**\r\n * Normalize an entity name for comparison.\r\n * Strips punctuation, extra whitespace, common suffixes.\r\n */\r\nexport function normalizeEntityName(name: string): string {\r\n return name\r\n .toLowerCase()\r\n .replace(/[.,;:'\"!?()\\[\\]{}]/g, \"\")\r\n .replace(/\\b(inc|llc|corp|ltd|co|foundation|fund|assoc|association|committee|pac)\\b\\.?/gi, \"\")\r\n .replace(/\\s+/g, \" \")\r\n .trim();\r\n}\r\n\r\n/**\r\n * Jaro-Winkler similarity between two strings (0-1).\r\n */\r\nexport function fuzzyMatch(a: string, b: string): number {\r\n const s1 = normalizeEntityName(a);\r\n const s2 = normalizeEntityName(b);\r\n\r\n if (s1 === s2) return 1.0;\r\n if (s1.length === 0 || s2.length === 0) return 0.0;\r\n\r\n const matchWindow = Math.max(Math.floor(Math.max(s1.length, s2.length) / 2) - 1, 0);\r\n const s1Matches = new Array(s1.length).fill(false);\r\n const s2Matches = new Array(s2.length).fill(false);\r\n\r\n let matches = 0;\r\n let transpositions = 0;\r\n\r\n for (let i = 0; i < s1.length; i++) {\r\n const start = Math.max(0, i - matchWindow);\r\n const end = Math.min(i + matchWindow + 1, s2.length);\r\n for (let j = start; j < end; j++) {\r\n if (s2Matches[j] || s1[i] !== s2[j]) continue;\r\n s1Matches[i] = true;\r\n s2Matches[j] = true;\r\n matches++;\r\n break;\r\n }\r\n }\r\n\r\n if (matches === 0) return 0.0;\r\n\r\n let k = 0;\r\n for (let i = 0; i < s1.length; i++) {\r\n if (!s1Matches[i]) continue;\r\n while (!s2Matches[k]) k++;\r\n if (s1[i] !== s2[k]) transpositions++;\r\n k++;\r\n }\r\n\r\n const jaro =\r\n (matches / s1.length + matches / s2.length + (matches - transpositions / 2) / matches) / 3;\r\n\r\n // Winkler bonus for common prefix (up to 4 chars)\r\n let prefix = 0;\r\n for (let i = 0; i < Math.min(4, Math.min(s1.length, s2.length)); i++) {\r\n if (s1[i] === s2[i]) prefix++;\r\n else break;\r\n }\r\n\r\n return jaro + prefix * 0.1 * (1 - jaro);\r\n}\r\n\r\n/**\r\n * Match entity by EIN (Employer Identification Number).\r\n */\r\nexport async function matchByEIN(ein: string): Promise<string | null> {\r\n try {\r\n const results = await db\r\n .select({ id: graphEntities.id })\r\n .from(graphEntities)\r\n .where(sql`${graphEntities.attributes}->>'ein' = ${ein}`)\r\n .limit(1);\r\n return results.length > 0 ? results[0].id : null;\r\n } catch (error) {\r\n console.error(\"[EntityResolution] EIN match error:\", error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Match entity by CIK (SEC Central Index Key).\r\n */\r\nexport async function matchByCIK(cik: string): Promise<string | null> {\r\n try {\r\n const results = await db\r\n .select({ id: graphEntities.id })\r\n .from(graphEntities)\r\n .where(sql`${graphEntities.attributes}->>'cik' = ${cik}`)\r\n .limit(1);\r\n return results.length > 0 ? results[0].id : null;\r\n } catch (error) {\r\n console.error(\"[EntityResolution] CIK match error:\", error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Match entity by FEC committee/candidate ID.\r\n */\r\nexport async function matchByFECId(fecId: string): Promise<string | null> {\r\n try {\r\n const results = await db\r\n .select({ id: graphEntities.id })\r\n .from(graphEntities)\r\n .where(sql`${graphEntities.attributes}->>'fecId' = ${fecId}`)\r\n .limit(1);\r\n return results.length > 0 ? results[0].id : null;\r\n } catch (error) {\r\n console.error(\"[EntityResolution] FEC ID match error:\", error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Core entity resolution function.\r\n * Resolves a candidate entity against the existing knowledge graph.\r\n *\r\n * Resolution order:\r\n * 1. Exact name match\r\n * 2. Identifier match (EIN, CIK, FEC ID)\r\n * 3. Fuzzy name match (Jaro-Winkler > 0.85)\r\n * 4. Create new entity\r\n */\r\nexport async function resolveEntity(candidate: EntityCandidate): Promise<ResolvedEntity> {\r\n try {\r\n // 1. Exact name match\r\n const exactMatches = await db\r\n .select({ id: graphEntities.id })\r\n .from(graphEntities)\r\n .where(ilike(graphEntities.name, candidate.name))\r\n .limit(1);\r\n\r\n if (exactMatches.length > 0) {\r\n // Update with new source attributes\r\n await mergeAttributes(exactMatches[0].id, candidate);\r\n return {\r\n isNew: false,\r\n entityId: exactMatches[0].id,\r\n confidence: 1.0,\r\n matchedBy: \"exact\",\r\n };\r\n }\r\n\r\n // 2. Identifier match\r\n if (candidate.identifiers) {\r\n if (candidate.identifiers.ein) {\r\n const id = await matchByEIN(candidate.identifiers.ein);\r\n if (id) {\r\n await mergeAttributes(id, candidate);\r\n return { isNew: false, entityId: id, confidence: 0.99, matchedBy: \"identifier\" };\r\n }\r\n }\r\n if (candidate.identifiers.cik) {\r\n const id = await matchByCIK(candidate.identifiers.cik);\r\n if (id) {\r\n await mergeAttributes(id, candidate);\r\n return { isNew: false, entityId: id, confidence: 0.99, matchedBy: \"identifier\" };\r\n }\r\n }\r\n if (candidate.identifiers.fecId) {\r\n const id = await matchByFECId(candidate.identifiers.fecId);\r\n if (id) {\r\n await mergeAttributes(id, candidate);\r\n return { isNew: false, entityId: id, confidence: 0.99, matchedBy: \"identifier\" };\r\n }\r\n }\r\n }\r\n\r\n // 3. Fuzzy name match against existing entities of the same type\r\n const typeFilter = [\"person\", \"organization\", \"committee\"].includes(candidate.type)\r\n ? candidate.type\r\n : undefined;\r\n\r\n const potentialMatches = await db\r\n .select({ id: graphEntities.id, name: graphEntities.name, aliases: graphEntities.aliases })\r\n .from(graphEntities)\r\n .where(typeFilter ? eq(graphEntities.type, typeFilter as any) : sql`true`)\r\n .limit(500);\r\n\r\n let bestMatch: { id: string; score: number } | null = null;\r\n\r\n for (const entity of potentialMatches) {\r\n // Check main name\r\n const nameScore = fuzzyMatch(candidate.name, entity.name);\r\n if (nameScore > (bestMatch?.score ?? 0.85)) {\r\n bestMatch = { id: entity.id, score: nameScore };\r\n }\r\n\r\n // Check aliases\r\n const aliases = (entity.aliases as string[]) || [];\r\n for (const alias of aliases) {\r\n const aliasScore = fuzzyMatch(candidate.name, alias);\r\n if (aliasScore > (bestMatch?.score ?? 0.85)) {\r\n bestMatch = { id: entity.id, score: aliasScore };\r\n }\r\n }\r\n }\r\n\r\n if (bestMatch) {\r\n await mergeAttributes(bestMatch.id, candidate);\r\n return {\r\n isNew: false,\r\n entityId: bestMatch.id,\r\n confidence: bestMatch.score,\r\n matchedBy: \"fuzzy\",\r\n };\r\n }\r\n\r\n // 4. Create new entity\r\n const newEntity = await db\r\n .insert(graphEntities)\r\n .values({\r\n type: mapOSINTTypeToGraphType(candidate.type) as any,\r\n name: candidate.name,\r\n aliases: candidate.aliases || [],\r\n description: `Discovered from ${candidate.source}`,\r\n attributes: {\r\n ...candidate.attributes,\r\n ...candidate.identifiers,\r\n sources: [candidate.source],\r\n discoveredAt: new Date().toISOString(),\r\n },\r\n importance: 5,\r\n mentionCount: 1,\r\n })\r\n .returning({ id: graphEntities.id });\r\n\r\n console.log(`[EntityResolution] Created new entity: ${candidate.name} (${candidate.type}) from ${candidate.source}`);\r\n\r\n return {\r\n isNew: true,\r\n entityId: newEntity[0].id,\r\n confidence: 1.0,\r\n matchedBy: \"new\",\r\n };\r\n } catch (error) {\r\n console.error(\"[EntityResolution] Error resolving entity:\", error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Merge new attributes and aliases into an existing entity.\r\n */\r\nasync function mergeAttributes(entityId: string, candidate: EntityCandidate): Promise<void> {\r\n try {\r\n const existing = await db\r\n .select({ attributes: graphEntities.attributes, aliases: graphEntities.aliases, mentionCount: graphEntities.mentionCount })\r\n .from(graphEntities)\r\n .where(eq(graphEntities.id, entityId))\r\n .limit(1);\r\n\r\n if (existing.length === 0) return;\r\n\r\n const currentAttrs = (existing[0].attributes as Record<string, unknown>) || {};\r\n const currentAliases = (existing[0].aliases as string[]) || [];\r\n const currentSources = (currentAttrs.sources as string[]) || [];\r\n\r\n // Merge attributes\r\n const mergedAttrs = {\r\n ...currentAttrs,\r\n ...candidate.attributes,\r\n ...candidate.identifiers,\r\n sources: [...new Set([...currentSources, candidate.source])],\r\n lastUpdated: new Date().toISOString(),\r\n };\r\n\r\n // Merge aliases\r\n const newAliases = candidate.aliases || [];\r\n const mergedAliases = [...new Set([...currentAliases, ...newAliases])];\r\n\r\n await db\r\n .update(graphEntities)\r\n .set({\r\n attributes: mergedAttrs,\r\n aliases: mergedAliases,\r\n mentionCount: (existing[0].mentionCount || 0) + 1,\r\n })\r\n .where(eq(graphEntities.id, entityId));\r\n } catch (error) {\r\n console.error(\"[EntityResolution] Error merging attributes:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Map OSINT entity types to the existing graph entity types.\r\n */\r\nfunction mapOSINTTypeToGraphType(type: OSINTEntityType): string {\r\n switch (type) {\r\n case \"person\": return \"person\";\r\n case \"organization\": return \"organization\";\r\n case \"committee\": return \"organization\";\r\n case \"contract\": return \"event\";\r\n case \"filing\": return \"event\";\r\n case \"location\": return \"location\";\r\n case \"topic\": return \"topic\";\r\n default: return \"organization\";\r\n }\r\n}\r\n\r\n/**\r\n * Merge two entities (mark duplicate as alias of primary).\r\n */\r\nexport async function mergeEntities(primaryId: string, duplicateId: string): Promise<void> {\r\n try {\r\n const [primary, duplicate] = await Promise.all([\r\n db.select().from(graphEntities).where(eq(graphEntities.id, primaryId)).limit(1),\r\n db.select().from(graphEntities).where(eq(graphEntities.id, duplicateId)).limit(1),\r\n ]);\r\n\r\n if (primary.length === 0 || duplicate.length === 0) return;\r\n\r\n // Add duplicate name as alias\r\n const aliases = [...new Set([\r\n ...((primary[0].aliases as string[]) || []),\r\n duplicate[0].name,\r\n ...((duplicate[0].aliases as string[]) || []),\r\n ])];\r\n\r\n // Merge attributes\r\n const mergedAttrs = {\r\n ...((duplicate[0].attributes as Record<string, unknown>) || {}),\r\n ...((primary[0].attributes as Record<string, unknown>) || {}),\r\n };\r\n\r\n await db\r\n .update(graphEntities)\r\n .set({ aliases, attributes: mergedAttrs })\r\n .where(eq(graphEntities.id, primaryId));\r\n\r\n // Reassign all relationships from duplicate to primary\r\n await db\r\n .update(graphRelationships)\r\n .set({ sourceEntityId: primaryId })\r\n .where(eq(graphRelationships.sourceEntityId, duplicateId));\r\n\r\n await db\r\n .update(graphRelationships)\r\n .set({ targetEntityId: primaryId })\r\n .where(eq(graphRelationships.targetEntityId, duplicateId));\r\n\r\n // Delete the duplicate\r\n await db.delete(graphEntities).where(eq(graphEntities.id, duplicateId));\r\n\r\n console.log(`[EntityResolution] Merged entity ${duplicate[0].name} into ${primary[0].name}`);\r\n } catch (error) {\r\n console.error(\"[EntityResolution] Error merging entities:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Find potential duplicate entities based on fuzzy matching.\r\n */\r\nexport async function findDuplicates(\r\n threshold: number = 0.85\r\n): Promise<Array<{ entities: [string, string]; names: [string, string]; score: number }>> {\r\n try {\r\n const allEntities = await db\r\n .select({ id: graphEntities.id, name: graphEntities.name })\r\n .from(graphEntities)\r\n .limit(1000);\r\n\r\n const duplicates: Array<{ entities: [string, string]; names: [string, string]; score: number }> = [];\r\n\r\n for (let i = 0; i < allEntities.length; i++) {\r\n for (let j = i + 1; j < allEntities.length; j++) {\r\n const score = fuzzyMatch(allEntities[i].name, allEntities[j].name);\r\n if (score >= threshold && score < 1.0) {\r\n duplicates.push({\r\n entities: [allEntities[i].id, allEntities[j].id],\r\n names: [allEntities[i].name, allEntities[j].name],\r\n score,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return duplicates.sort((a, b) => b.score - a.score);\r\n } catch (error) {\r\n console.error(\"[EntityResolution] Error finding duplicates:\", error);\r\n return [];\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;AAWA,SAAS,IAAI,OAAO,WAAW;AAsCxB,SAAS,oBAAoB,MAAsB;AACxD,SAAO,KACJ,YAAY,EACZ,QAAQ,uBAAuB,EAAE,EACjC,QAAQ,kFAAkF,EAAE,EAC5F,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAKO,SAAS,WAAW,GAAW,GAAmB;AACvD,QAAM,KAAK,oBAAoB,CAAC;AAChC,QAAM,KAAK,oBAAoB,CAAC;AAEhC,MAAI,OAAO,GAAI,QAAO;AACtB,MAAI,GAAG,WAAW,KAAK,GAAG,WAAW,EAAG,QAAO;AAE/C,QAAM,cAAc,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC;AAClF,QAAM,YAAY,IAAI,MAAM,GAAG,MAAM,EAAE,KAAK,KAAK;AACjD,QAAM,YAAY,IAAI,MAAM,GAAG,MAAM,EAAE,KAAK,KAAK;AAEjD,MAAI,UAAU;AACd,MAAI,iBAAiB;AAErB,WAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;AAClC,UAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,WAAW;AACzC,UAAM,MAAM,KAAK,IAAI,IAAI,cAAc,GAAG,GAAG,MAAM;AACnD,aAAS,IAAI,OAAO,IAAI,KAAK,KAAK;AAChC,UAAI,UAAU,CAAC,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,EAAG;AACrC,gBAAU,CAAC,IAAI;AACf,gBAAU,CAAC,IAAI;AACf;AACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,EAAG,QAAO;AAE1B,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,GAAG,QAAQ,KAAK;AAClC,QAAI,CAAC,UAAU,CAAC,EAAG;AACnB,WAAO,CAAC,UAAU,CAAC,EAAG;AACtB,QAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAG;AACrB;AAAA,EACF;AAEA,QAAM,QACH,UAAU,GAAG,SAAS,UAAU,GAAG,UAAU,UAAU,iBAAiB,KAAK,WAAW;AAG3F,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC,GAAG,KAAK;AACpE,QAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAG;AAAA,QAChB;AAAA,EACP;AAEA,SAAO,OAAO,SAAS,OAAO,IAAI;AACpC;AAKA,eAAsB,WAAW,KAAqC;AACpE,MAAI;AACF,UAAM,UAAU,MAAM,GACnB,OAAO,EAAE,IAAI,cAAc,GAAG,CAAC,EAC/B,KAAK,aAAa,EAClB,MAAM,MAAM,cAAc,UAAU,cAAc,GAAG,EAAE,EACvD,MAAM,CAAC;AACV,WAAO,QAAQ,SAAS,IAAI,QAAQ,CAAC,EAAE,KAAK;AAAA,EAC9C,SAAS,OAAO;AACd,YAAQ,MAAM,uCAAuC,KAAK;AAC1D,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,WAAW,KAAqC;AACpE,MAAI;AACF,UAAM,UAAU,MAAM,GACnB,OAAO,EAAE,IAAI,cAAc,GAAG,CAAC,EAC/B,KAAK,aAAa,EAClB,MAAM,MAAM,cAAc,UAAU,cAAc,GAAG,EAAE,EACvD,MAAM,CAAC;AACV,WAAO,QAAQ,SAAS,IAAI,QAAQ,CAAC,EAAE,KAAK;AAAA,EAC9C,SAAS,OAAO;AACd,YAAQ,MAAM,uCAAuC,KAAK;AAC1D,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,aAAa,OAAuC;AACxE,MAAI;AACF,UAAM,UAAU,MAAM,GACnB,OAAO,EAAE,IAAI,cAAc,GAAG,CAAC,EAC/B,KAAK,aAAa,EAClB,MAAM,MAAM,cAAc,UAAU,gBAAgB,KAAK,EAAE,EAC3D,MAAM,CAAC;AACV,WAAO,QAAQ,SAAS,IAAI,QAAQ,CAAC,EAAE,KAAK;AAAA,EAC9C,SAAS,OAAO;AACd,YAAQ,MAAM,0CAA0C,KAAK;AAC7D,WAAO;AAAA,EACT;AACF;AAYA,eAAsB,cAAc,WAAqD;AACvF,MAAI;AAEF,UAAM,eAAe,MAAM,GACxB,OAAO,EAAE,IAAI,cAAc,GAAG,CAAC,EAC/B,KAAK,aAAa,EAClB,MAAM,MAAM,cAAc,MAAM,UAAU,IAAI,CAAC,EAC/C,MAAM,CAAC;AAEV,QAAI,aAAa,SAAS,GAAG;AAE3B,YAAM,gBAAgB,aAAa,CAAC,EAAE,IAAI,SAAS;AACnD,aAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU,aAAa,CAAC,EAAE;AAAA,QAC1B,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,IACF;AAGA,QAAI,UAAU,aAAa;AACzB,UAAI,UAAU,YAAY,KAAK;AAC7B,cAAM,KAAK,MAAM,WAAW,UAAU,YAAY,GAAG;AACrD,YAAI,IAAI;AACN,gBAAM,gBAAgB,IAAI,SAAS;AACnC,iBAAO,EAAE,OAAO,OAAO,UAAU,IAAI,YAAY,MAAM,WAAW,aAAa;AAAA,QACjF;AAAA,MACF;AACA,UAAI,UAAU,YAAY,KAAK;AAC7B,cAAM,KAAK,MAAM,WAAW,UAAU,YAAY,GAAG;AACrD,YAAI,IAAI;AACN,gBAAM,gBAAgB,IAAI,SAAS;AACnC,iBAAO,EAAE,OAAO,OAAO,UAAU,IAAI,YAAY,MAAM,WAAW,aAAa;AAAA,QACjF;AAAA,MACF;AACA,UAAI,UAAU,YAAY,OAAO;AAC/B,cAAM,KAAK,MAAM,aAAa,UAAU,YAAY,KAAK;AACzD,YAAI,IAAI;AACN,gBAAM,gBAAgB,IAAI,SAAS;AACnC,iBAAO,EAAE,OAAO,OAAO,UAAU,IAAI,YAAY,MAAM,WAAW,aAAa;AAAA,QACjF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,aAAa,CAAC,UAAU,gBAAgB,WAAW,EAAE,SAAS,UAAU,IAAI,IAC9E,UAAU,OACV;AAEJ,UAAM,mBAAmB,MAAM,GAC5B,OAAO,EAAE,IAAI,cAAc,IAAI,MAAM,cAAc,MAAM,SAAS,cAAc,QAAQ,CAAC,EACzF,KAAK,aAAa,EAClB,MAAM,aAAa,GAAG,cAAc,MAAM,UAAiB,IAAI,SAAS,EACxE,MAAM,GAAG;AAEZ,QAAI,YAAkD;AAEtD,eAAW,UAAU,kBAAkB;AAErC,YAAM,YAAY,WAAW,UAAU,MAAM,OAAO,IAAI;AACxD,UAAI,aAAa,WAAW,SAAS,OAAO;AAC1C,oBAAY,EAAE,IAAI,OAAO,IAAI,OAAO,UAAU;AAAA,MAChD;AAGA,YAAM,UAAW,OAAO,WAAwB,CAAC;AACjD,iBAAW,SAAS,SAAS;AAC3B,cAAM,aAAa,WAAW,UAAU,MAAM,KAAK;AACnD,YAAI,cAAc,WAAW,SAAS,OAAO;AAC3C,sBAAY,EAAE,IAAI,OAAO,IAAI,OAAO,WAAW;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAEA,QAAI,WAAW;AACb,YAAM,gBAAgB,UAAU,IAAI,SAAS;AAC7C,aAAO;AAAA,QACL,OAAO;AAAA,QACP,UAAU,UAAU;AAAA,QACpB,YAAY,UAAU;AAAA,QACtB,WAAW;AAAA,MACb;AAAA,IACF;AAGA,UAAM,YAAY,MAAM,GACrB,OAAO,aAAa,EACpB,OAAO;AAAA,MACN,MAAM,wBAAwB,UAAU,IAAI;AAAA,MAC5C,MAAM,UAAU;AAAA,MAChB,SAAS,UAAU,WAAW,CAAC;AAAA,MAC/B,aAAa,mBAAmB,UAAU,MAAM;AAAA,MAChD,YAAY;AAAA,QACV,GAAG,UAAU;AAAA,QACb,GAAG,UAAU;AAAA,QACb,SAAS,CAAC,UAAU,MAAM;AAAA,QAC1B,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,MACvC;AAAA,MACA,YAAY;AAAA,MACZ,cAAc;AAAA,IAChB,CAAC,EACA,UAAU,EAAE,IAAI,cAAc,GAAG,CAAC;AAErC,YAAQ,IAAI,0CAA0C,UAAU,IAAI,KAAK,UAAU,IAAI,UAAU,UAAU,MAAM,EAAE;AAEnH,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU,UAAU,CAAC,EAAE;AAAA,MACvB,YAAY;AAAA,MACZ,WAAW;AAAA,IACb;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,8CAA8C,KAAK;AACjE,UAAM;AAAA,EACR;AACF;AAKA,eAAe,gBAAgB,UAAkB,WAA2C;AAC1F,MAAI;AACF,UAAM,WAAW,MAAM,GACpB,OAAO,EAAE,YAAY,cAAc,YAAY,SAAS,cAAc,SAAS,cAAc,cAAc,aAAa,CAAC,EACzH,KAAK,aAAa,EAClB,MAAM,GAAG,cAAc,IAAI,QAAQ,CAAC,EACpC,MAAM,CAAC;AAEV,QAAI,SAAS,WAAW,EAAG;AAE3B,UAAM,eAAgB,SAAS,CAAC,EAAE,cAA0C,CAAC;AAC7E,UAAM,iBAAkB,SAAS,CAAC,EAAE,WAAwB,CAAC;AAC7D,UAAM,iBAAkB,aAAa,WAAwB,CAAC;AAG9D,UAAM,cAAc;AAAA,MAClB,GAAG;AAAA,MACH,GAAG,UAAU;AAAA,MACb,GAAG,UAAU;AAAA,MACb,SAAS,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,gBAAgB,UAAU,MAAM,CAAC,CAAC;AAAA,MAC3D,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC;AAGA,UAAM,aAAa,UAAU,WAAW,CAAC;AACzC,UAAM,gBAAgB,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,gBAAgB,GAAG,UAAU,CAAC,CAAC;AAErE,UAAM,GACH,OAAO,aAAa,EACpB,IAAI;AAAA,MACH,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,eAAe,SAAS,CAAC,EAAE,gBAAgB,KAAK;AAAA,IAClD,CAAC,EACA,MAAM,GAAG,cAAc,IAAI,QAAQ,CAAC;AAAA,EACzC,SAAS,OAAO;AACd,YAAQ,MAAM,gDAAgD,KAAK;AAAA,EACrE;AACF;AAKA,SAAS,wBAAwB,MAA+B;AAC9D,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAgB,aAAO;AAAA,IAC5B,KAAK;AAAa,aAAO;AAAA,IACzB,KAAK;AAAY,aAAO;AAAA,IACxB,KAAK;AAAU,aAAO;AAAA,IACtB,KAAK;AAAY,aAAO;AAAA,IACxB,KAAK;AAAS,aAAO;AAAA,IACrB;AAAS,aAAO;AAAA,EAClB;AACF;AAKA,eAAsB,cAAc,WAAmB,aAAoC;AACzF,MAAI;AACF,UAAM,CAAC,SAAS,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC7C,GAAG,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,GAAG,cAAc,IAAI,SAAS,CAAC,EAAE,MAAM,CAAC;AAAA,MAC9E,GAAG,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,GAAG,cAAc,IAAI,WAAW,CAAC,EAAE,MAAM,CAAC;AAAA,IAClF,CAAC;AAED,QAAI,QAAQ,WAAW,KAAK,UAAU,WAAW,EAAG;AAGpD,UAAM,UAAU,CAAC,GAAG,oBAAI,IAAI;AAAA,MAC1B,GAAK,QAAQ,CAAC,EAAE,WAAwB,CAAC;AAAA,MACzC,UAAU,CAAC,EAAE;AAAA,MACb,GAAK,UAAU,CAAC,EAAE,WAAwB,CAAC;AAAA,IAC7C,CAAC,CAAC;AAGF,UAAM,cAAc;AAAA,MAClB,GAAK,UAAU,CAAC,EAAE,cAA0C,CAAC;AAAA,MAC7D,GAAK,QAAQ,CAAC,EAAE,cAA0C,CAAC;AAAA,IAC7D;AAEA,UAAM,GACH,OAAO,aAAa,EACpB,IAAI,EAAE,SAAS,YAAY,YAAY,CAAC,EACxC,MAAM,GAAG,cAAc,IAAI,SAAS,CAAC;AAGxC,UAAM,GACH,OAAO,kBAAkB,EACzB,IAAI,EAAE,gBAAgB,UAAU,CAAC,EACjC,MAAM,GAAG,mBAAmB,gBAAgB,WAAW,CAAC;AAE3D,UAAM,GACH,OAAO,kBAAkB,EACzB,IAAI,EAAE,gBAAgB,UAAU,CAAC,EACjC,MAAM,GAAG,mBAAmB,gBAAgB,WAAW,CAAC;AAG3D,UAAM,GAAG,OAAO,aAAa,EAAE,MAAM,GAAG,cAAc,IAAI,WAAW,CAAC;AAEtE,YAAQ,IAAI,oCAAoC,UAAU,CAAC,EAAE,IAAI,SAAS,QAAQ,CAAC,EAAE,IAAI,EAAE;AAAA,EAC7F,SAAS,OAAO;AACd,YAAQ,MAAM,8CAA8C,KAAK;AAAA,EACnE;AACF;AAKA,eAAsB,eACpB,YAAoB,MACoE;AACxF,MAAI;AACF,UAAM,cAAc,MAAM,GACvB,OAAO,EAAE,IAAI,cAAc,IAAI,MAAM,cAAc,KAAK,CAAC,EACzD,KAAK,aAAa,EAClB,MAAM,GAAI;AAEb,UAAM,aAA4F,CAAC;AAEnG,aAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,eAAS,IAAI,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC/C,cAAM,QAAQ,WAAW,YAAY,CAAC,EAAE,MAAM,YAAY,CAAC,EAAE,IAAI;AACjE,YAAI,SAAS,aAAa,QAAQ,GAAK;AACrC,qBAAW,KAAK;AAAA,YACd,UAAU,CAAC,YAAY,CAAC,EAAE,IAAI,YAAY,CAAC,EAAE,EAAE;AAAA,YAC/C,OAAO,CAAC,YAAY,CAAC,EAAE,MAAM,YAAY,CAAC,EAAE,IAAI;AAAA,YAChD;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,EACpD,SAAS,OAAO;AACd,YAAQ,MAAM,gDAAgD,KAAK;AACnE,WAAO,CAAC;AAAA,EACV;AACF;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
getNotionClient,
|
|
3
3
|
init_client
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-C6PELIHS.js";
|
|
5
5
|
|
|
6
6
|
// src/integrations/notion/blocks.ts
|
|
7
7
|
init_client();
|
|
@@ -449,4 +449,4 @@ export {
|
|
|
449
449
|
markdownToBlocks,
|
|
450
450
|
blocksToMarkdown
|
|
451
451
|
};
|
|
452
|
-
//# sourceMappingURL=chunk-
|
|
452
|
+
//# sourceMappingURL=chunk-2WTKTG2C.js.map
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createLogger
|
|
3
|
+
} from "./chunk-7BNFELEK.js";
|
|
4
|
+
import {
|
|
5
|
+
db
|
|
6
|
+
} from "./chunk-5BTVJR7R.js";
|
|
7
|
+
import {
|
|
8
|
+
env
|
|
9
|
+
} from "./chunk-4KIHDIXZ.js";
|
|
10
|
+
import {
|
|
11
|
+
m365OauthStates
|
|
12
|
+
} from "./chunk-ZIBRVA3Y.js";
|
|
13
|
+
|
|
14
|
+
// src/integrations/m365/oauth.ts
|
|
15
|
+
import { createHash, randomBytes } from "crypto";
|
|
16
|
+
import { eq, lt } from "drizzle-orm";
|
|
17
|
+
var log = createLogger("m365:oauth");
|
|
18
|
+
var STATE_TTL_MS = 10 * 60 * 1e3;
|
|
19
|
+
function getM365Config() {
|
|
20
|
+
if (!env.M365_CLIENT_ID || !env.M365_CLIENT_SECRET) return null;
|
|
21
|
+
return {
|
|
22
|
+
clientId: env.M365_CLIENT_ID,
|
|
23
|
+
clientSecret: env.M365_CLIENT_SECRET,
|
|
24
|
+
tenantId: env.M365_TENANT_ID || "common",
|
|
25
|
+
redirectUri: env.M365_REDIRECT_URI || `http://localhost:${env.PORT}/api/m365/auth/callback`,
|
|
26
|
+
scopes: env.M365_GRAPH_SCOPES
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function isM365Configured() {
|
|
30
|
+
return getM365Config() !== null;
|
|
31
|
+
}
|
|
32
|
+
function base64Url(buf) {
|
|
33
|
+
return buf.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
34
|
+
}
|
|
35
|
+
function generateCodeVerifier() {
|
|
36
|
+
return base64Url(randomBytes(32));
|
|
37
|
+
}
|
|
38
|
+
function generateCodeChallenge(verifier) {
|
|
39
|
+
return base64Url(createHash("sha256").update(verifier).digest());
|
|
40
|
+
}
|
|
41
|
+
async function persistState(opts) {
|
|
42
|
+
await db.insert(m365OauthStates).values({
|
|
43
|
+
state: opts.state,
|
|
44
|
+
codeVerifier: opts.codeVerifier,
|
|
45
|
+
userKey: opts.userKey ?? null,
|
|
46
|
+
returnTo: opts.returnTo ?? null,
|
|
47
|
+
expiresAt: new Date(Date.now() + STATE_TTL_MS)
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
async function consumeState(state) {
|
|
51
|
+
const rows = await db.select().from(m365OauthStates).where(eq(m365OauthStates.state, state)).limit(1);
|
|
52
|
+
if (rows.length === 0) return null;
|
|
53
|
+
const row = rows[0];
|
|
54
|
+
await db.delete(m365OauthStates).where(eq(m365OauthStates.state, state));
|
|
55
|
+
if (row.expiresAt.getTime() < Date.now()) {
|
|
56
|
+
log.warn("state expired", { state });
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
codeVerifier: row.codeVerifier,
|
|
61
|
+
userKey: row.userKey,
|
|
62
|
+
returnTo: row.returnTo
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
async function cleanupExpiredStates() {
|
|
66
|
+
const result = await db.delete(m365OauthStates).where(lt(m365OauthStates.expiresAt, /* @__PURE__ */ new Date()));
|
|
67
|
+
return result?.count ?? 0;
|
|
68
|
+
}
|
|
69
|
+
function buildAuthorizeUrl(config, params) {
|
|
70
|
+
const query = new URLSearchParams({
|
|
71
|
+
client_id: config.clientId,
|
|
72
|
+
response_type: "code",
|
|
73
|
+
redirect_uri: config.redirectUri,
|
|
74
|
+
response_mode: "query",
|
|
75
|
+
scope: config.scopes,
|
|
76
|
+
state: params.state,
|
|
77
|
+
code_challenge: params.codeChallenge,
|
|
78
|
+
code_challenge_method: "S256"
|
|
79
|
+
});
|
|
80
|
+
if (params.loginHint) query.set("login_hint", params.loginHint);
|
|
81
|
+
return `https://login.microsoftonline.com/${config.tenantId}/oauth2/v2.0/authorize?${query.toString()}`;
|
|
82
|
+
}
|
|
83
|
+
async function postToken(config, body) {
|
|
84
|
+
const url = `https://login.microsoftonline.com/${config.tenantId}/oauth2/v2.0/token`;
|
|
85
|
+
const res = await fetch(url, {
|
|
86
|
+
method: "POST",
|
|
87
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
88
|
+
body: body.toString()
|
|
89
|
+
});
|
|
90
|
+
const data = await res.json();
|
|
91
|
+
if (!res.ok || data.error || !data.access_token) {
|
|
92
|
+
const msg = data.error_description || data.error || `token endpoint returned ${res.status}`;
|
|
93
|
+
throw new Error(`M365 token exchange failed: ${msg}`);
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
accessToken: data.access_token,
|
|
97
|
+
refreshToken: data.refresh_token,
|
|
98
|
+
expiresAt: new Date(Date.now() + data.expires_in * 1e3),
|
|
99
|
+
scope: data.scope,
|
|
100
|
+
tokenType: data.token_type ?? "Bearer"
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async function exchangeCodeForTokens(config, code, codeVerifier) {
|
|
104
|
+
const body = new URLSearchParams({
|
|
105
|
+
client_id: config.clientId,
|
|
106
|
+
client_secret: config.clientSecret,
|
|
107
|
+
grant_type: "authorization_code",
|
|
108
|
+
code,
|
|
109
|
+
redirect_uri: config.redirectUri,
|
|
110
|
+
code_verifier: codeVerifier
|
|
111
|
+
});
|
|
112
|
+
return postToken(config, body);
|
|
113
|
+
}
|
|
114
|
+
async function refreshTokens(config, refreshToken) {
|
|
115
|
+
const body = new URLSearchParams({
|
|
116
|
+
client_id: config.clientId,
|
|
117
|
+
client_secret: config.clientSecret,
|
|
118
|
+
grant_type: "refresh_token",
|
|
119
|
+
refresh_token: refreshToken,
|
|
120
|
+
scope: config.scopes
|
|
121
|
+
});
|
|
122
|
+
return postToken(config, body);
|
|
123
|
+
}
|
|
124
|
+
var REFRESH_BUFFER_MS = 2 * 60 * 1e3;
|
|
125
|
+
function shouldRefresh(expiresAt) {
|
|
126
|
+
return expiresAt.getTime() - Date.now() < REFRESH_BUFFER_MS;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export {
|
|
130
|
+
getM365Config,
|
|
131
|
+
isM365Configured,
|
|
132
|
+
generateCodeVerifier,
|
|
133
|
+
generateCodeChallenge,
|
|
134
|
+
persistState,
|
|
135
|
+
consumeState,
|
|
136
|
+
cleanupExpiredStates,
|
|
137
|
+
buildAuthorizeUrl,
|
|
138
|
+
exchangeCodeForTokens,
|
|
139
|
+
refreshTokens,
|
|
140
|
+
REFRESH_BUFFER_MS,
|
|
141
|
+
shouldRefresh
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=chunk-3AWAWRWB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/integrations/m365/oauth.ts"],"sourcesContent":["/**\n * Microsoft 365 / Entra ID OAuth helpers.\n *\n * Implements the Authorization Code flow with PKCE and a server-side state\n * store for CSRF protection. No client secret is leaked to the browser.\n *\n * Flow:\n * 1. buildLoginUrl() — generate state + code_verifier, persist, redirect user.\n * 2. exchangeCode() — on callback, verify state, exchange code for tokens.\n * 3. refreshTokens() — called by token-store when access_token is near expiry.\n */\n\nimport { createHash, randomBytes } from \"crypto\";\nimport { db, m365OauthStates } from \"../../db\";\nimport { env } from \"../../config/env\";\nimport { createLogger } from \"../../core/logger\";\nimport { eq, lt } from \"drizzle-orm\";\n\nconst log = createLogger(\"m365:oauth\");\n\nconst STATE_TTL_MS = 10 * 60 * 1000; // 10 minutes\n\nexport interface TokenSet {\n accessToken: string;\n refreshToken?: string;\n expiresAt: Date;\n scope?: string;\n tokenType: string;\n}\n\nexport interface M365Config {\n clientId: string;\n clientSecret: string;\n tenantId: string;\n redirectUri: string;\n scopes: string;\n}\n\nexport function getM365Config(): M365Config | null {\n if (!env.M365_CLIENT_ID || !env.M365_CLIENT_SECRET) return null;\n return {\n clientId: env.M365_CLIENT_ID,\n clientSecret: env.M365_CLIENT_SECRET,\n tenantId: env.M365_TENANT_ID || \"common\",\n redirectUri:\n env.M365_REDIRECT_URI || `http://localhost:${env.PORT}/api/m365/auth/callback`,\n scopes: env.M365_GRAPH_SCOPES,\n };\n}\n\nexport function isM365Configured(): boolean {\n return getM365Config() !== null;\n}\n\n// ---------------------------------------------------------------------------\n// PKCE helpers\n// ---------------------------------------------------------------------------\n\nfunction base64Url(buf: Buffer): string {\n return buf.toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\n\nexport function generateCodeVerifier(): string {\n return base64Url(randomBytes(32));\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return base64Url(createHash(\"sha256\").update(verifier).digest());\n}\n\n// ---------------------------------------------------------------------------\n// State store — persisted so we can validate across redirect\n// ---------------------------------------------------------------------------\n\nexport async function persistState(opts: {\n state: string;\n codeVerifier: string;\n userKey?: string;\n returnTo?: string;\n}): Promise<void> {\n await db.insert(m365OauthStates).values({\n state: opts.state,\n codeVerifier: opts.codeVerifier,\n userKey: opts.userKey ?? null,\n returnTo: opts.returnTo ?? null,\n expiresAt: new Date(Date.now() + STATE_TTL_MS),\n });\n}\n\nexport async function consumeState(state: string): Promise<{\n codeVerifier: string;\n userKey: string | null;\n returnTo: string | null;\n} | null> {\n const rows = await db.select().from(m365OauthStates).where(eq(m365OauthStates.state, state)).limit(1);\n if (rows.length === 0) return null;\n const row = rows[0];\n await db.delete(m365OauthStates).where(eq(m365OauthStates.state, state));\n\n if (row.expiresAt.getTime() < Date.now()) {\n log.warn(\"state expired\", { state });\n return null;\n }\n\n return {\n codeVerifier: row.codeVerifier,\n userKey: row.userKey,\n returnTo: row.returnTo,\n };\n}\n\n// Periodic cleanup — call opportunistically from routes\nexport async function cleanupExpiredStates(): Promise<number> {\n const result = await db.delete(m365OauthStates).where(lt(m365OauthStates.expiresAt, new Date()));\n return (result as any)?.count ?? 0;\n}\n\n// ---------------------------------------------------------------------------\n// URL builders / token exchange\n// ---------------------------------------------------------------------------\n\nexport function buildAuthorizeUrl(\n config: M365Config,\n params: { state: string; codeChallenge: string; loginHint?: string }\n): string {\n const query = new URLSearchParams({\n client_id: config.clientId,\n response_type: \"code\",\n redirect_uri: config.redirectUri,\n response_mode: \"query\",\n scope: config.scopes,\n state: params.state,\n code_challenge: params.codeChallenge,\n code_challenge_method: \"S256\",\n });\n if (params.loginHint) query.set(\"login_hint\", params.loginHint);\n\n return `https://login.microsoftonline.com/${config.tenantId}/oauth2/v2.0/authorize?${query.toString()}`;\n}\n\ninterface TokenResponse {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n scope?: string;\n token_type?: string;\n error?: string;\n error_description?: string;\n}\n\nasync function postToken(config: M365Config, body: URLSearchParams): Promise<TokenSet> {\n const url = `https://login.microsoftonline.com/${config.tenantId}/oauth2/v2.0/token`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n const data = (await res.json()) as TokenResponse;\n\n if (!res.ok || data.error || !data.access_token) {\n const msg = data.error_description || data.error || `token endpoint returned ${res.status}`;\n throw new Error(`M365 token exchange failed: ${msg}`);\n }\n\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n expiresAt: new Date(Date.now() + data.expires_in * 1000),\n scope: data.scope,\n tokenType: data.token_type ?? \"Bearer\",\n };\n}\n\nexport async function exchangeCodeForTokens(\n config: M365Config,\n code: string,\n codeVerifier: string\n): Promise<TokenSet> {\n const body = new URLSearchParams({\n client_id: config.clientId,\n client_secret: config.clientSecret,\n grant_type: \"authorization_code\",\n code,\n redirect_uri: config.redirectUri,\n code_verifier: codeVerifier,\n });\n return postToken(config, body);\n}\n\nexport async function refreshTokens(\n config: M365Config,\n refreshToken: string\n): Promise<TokenSet> {\n const body = new URLSearchParams({\n client_id: config.clientId,\n client_secret: config.clientSecret,\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n scope: config.scopes,\n });\n return postToken(config, body);\n}\n\n// Expiry buffer — refresh if access_token has less than this many ms left.\nexport const REFRESH_BUFFER_MS = 2 * 60 * 1000;\n\nexport function shouldRefresh(expiresAt: Date): boolean {\n return expiresAt.getTime() - Date.now() < REFRESH_BUFFER_MS;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -76,6 +76,10 @@ var envSchema = z.object({
|
|
|
76
76
|
GIPHY_API_KEY: z.string().optional(),
|
|
77
77
|
// Finance (optional)
|
|
78
78
|
ALPHA_VANTAGE_API_KEY: z.string().optional(),
|
|
79
|
+
FRED_API_KEY: z.string().optional(),
|
|
80
|
+
// Federal Reserve Economic Data
|
|
81
|
+
FINNHUB_API_KEY: z.string().optional(),
|
|
82
|
+
// Finnhub financial market data
|
|
79
83
|
// Exchange Trading (optional)
|
|
80
84
|
COINBASE_API_KEY: z.string().optional(),
|
|
81
85
|
COINBASE_PRIVATE_KEY: z.string().optional(),
|
|
@@ -83,6 +87,10 @@ var envSchema = z.object({
|
|
|
83
87
|
BINANCE_API_SECRET: z.string().optional(),
|
|
84
88
|
BINANCE_TESTNET: z.coerce.boolean().optional().default(false),
|
|
85
89
|
EXCHANGE_REQUIRE_CONFIRMATION: z.coerce.boolean().optional().default(true),
|
|
90
|
+
EXCHANGE_MAX_TRADE_SIZE: z.coerce.number().optional().default(100),
|
|
91
|
+
EXCHANGE_MAX_DAILY_SPEND: z.coerce.number().optional().default(500),
|
|
92
|
+
EXCHANGE_MAX_TRADES_PER_HOUR: z.coerce.number().optional().default(5),
|
|
93
|
+
EXCHANGE_AGENT_TRADING_ENABLED: z.coerce.boolean().optional().default(false),
|
|
86
94
|
// DeFi (optional)
|
|
87
95
|
DEFILLAMA_API_KEY: z.string().optional(),
|
|
88
96
|
// Pro tier
|
|
@@ -113,6 +121,17 @@ var envSchema = z.object({
|
|
|
113
121
|
OUTLOOK_CLIENT_SECRET: z.string().optional(),
|
|
114
122
|
OUTLOOK_REDIRECT_URI: z.string().url().optional(),
|
|
115
123
|
OUTLOOK_REFRESH_TOKEN: z.string().optional(),
|
|
124
|
+
// Microsoft 365 / Entra ID (Graph API — mail, files, sites)
|
|
125
|
+
// Scoped broader than Outlook Calendar: powers /api/m365/* routes.
|
|
126
|
+
M365_CLIENT_ID: z.string().optional(),
|
|
127
|
+
M365_CLIENT_SECRET: z.string().optional(),
|
|
128
|
+
M365_TENANT_ID: z.string().optional().default("common"),
|
|
129
|
+
M365_REDIRECT_URI: z.string().optional(),
|
|
130
|
+
M365_GRAPH_SCOPES: z.string().optional().default(
|
|
131
|
+
"openid profile offline_access User.Read Mail.Read Mail.ReadWrite Mail.Send Calendars.Read Files.Read"
|
|
132
|
+
),
|
|
133
|
+
M365_ANALYZE_RATE_LIMIT: z.coerce.number().optional().default(30),
|
|
134
|
+
M365_ANALYZE_RATE_REFILL: z.coerce.number().optional().default(0.5),
|
|
116
135
|
// Dropbox (additional OAuth fields)
|
|
117
136
|
DROPBOX_CLIENT_ID: z.string().optional(),
|
|
118
137
|
DROPBOX_CLIENT_SECRET: z.string().optional(),
|
|
@@ -130,6 +149,12 @@ var envSchema = z.object({
|
|
|
130
149
|
OPENAI_COMPATIBLE_API_KEY: z.string().optional(),
|
|
131
150
|
OPENAI_COMPATIBLE_BASE_URL: z.string().optional(),
|
|
132
151
|
OPENAI_COMPATIBLE_MODEL: z.string().optional(),
|
|
152
|
+
// xAI (Grok)
|
|
153
|
+
XAI_API_KEY: z.string().optional(),
|
|
154
|
+
XAI_DEFAULT_MODEL: z.string().optional().default("grok-2"),
|
|
155
|
+
// Google Gemini (optional)
|
|
156
|
+
GEMINI_API_KEY: z.string().optional(),
|
|
157
|
+
GEMINI_DEFAULT_MODEL: z.string().optional().default("gemini-2.0-flash"),
|
|
133
158
|
// Ollama (local models)
|
|
134
159
|
OLLAMA_ENABLED: z.coerce.boolean().optional().default(false),
|
|
135
160
|
OLLAMA_BASE_URL: z.string().optional().default("http://localhost:11434"),
|
|
@@ -222,6 +247,22 @@ var envSchema = z.object({
|
|
|
222
247
|
MULTISTEP_MAX_STEPS: z.coerce.number().optional().default(2),
|
|
223
248
|
RETRIEVAL_CACHE_ENABLED: z.coerce.boolean().optional().default(false),
|
|
224
249
|
CONTEXTUAL_QUERY_ENABLED: z.coerce.boolean().optional().default(false),
|
|
250
|
+
// Agentic RAG Pipeline
|
|
251
|
+
TOOL_CLASSIFIER_ENABLED: z.coerce.boolean().optional().default(false),
|
|
252
|
+
TOOL_CLASSIFIER_TIMEOUT_MS: z.coerce.number().optional().default(5e3),
|
|
253
|
+
TOOL_CLASSIFIER_MAX_CATEGORIES: z.coerce.number().optional().default(3),
|
|
254
|
+
// AI Memory (auto-extract/search)
|
|
255
|
+
AUTO_MEMORY_EXTRACT_ENABLED: z.coerce.boolean().optional().default(false),
|
|
256
|
+
AUTO_MEMORY_EXTRACT_DEDUP_THRESHOLD: z.coerce.number().optional().default(0.9),
|
|
257
|
+
AUTO_MEMORY_SEARCH_THRESHOLD: z.coerce.number().optional().default(0.3),
|
|
258
|
+
// Agentic Pipeline Orchestrator
|
|
259
|
+
AGENTIC_PIPELINE_ENABLED: z.coerce.boolean().optional().default(false),
|
|
260
|
+
AGENTIC_PRE_EXECUTION_ENABLED: z.coerce.boolean().optional().default(false),
|
|
261
|
+
AGENTIC_PRE_EXECUTION_TIMEOUT_MS: z.coerce.number().optional().default(8e3),
|
|
262
|
+
// Agent Processor
|
|
263
|
+
AGENT_PROCESSOR_ENABLED: z.coerce.boolean().optional().default(false),
|
|
264
|
+
AGENT_PROCESSOR_CONCURRENCY: z.coerce.number().optional().default(1),
|
|
265
|
+
AGENT_MAX_TURNS: z.coerce.number().optional().default(20),
|
|
225
266
|
// SOC 2 Encryption & Audit
|
|
226
267
|
ENCRYPTION_MASTER_KEY: z.string().optional(),
|
|
227
268
|
// 32-byte base64 key for field encryption
|
|
@@ -246,7 +287,7 @@ function configure(config) {
|
|
|
246
287
|
);
|
|
247
288
|
}
|
|
248
289
|
_env = result.data;
|
|
249
|
-
_providerInitPromise = import("./providers-
|
|
290
|
+
_providerInitPromise = import("./providers-2YQ6E3IF.js").then((m) => m.initializeProviders()).catch(() => {
|
|
250
291
|
});
|
|
251
292
|
return _env;
|
|
252
293
|
}
|
|
@@ -307,4 +348,4 @@ export {
|
|
|
307
348
|
ready,
|
|
308
349
|
env
|
|
309
350
|
};
|
|
310
|
-
//# sourceMappingURL=chunk-
|
|
351
|
+
//# sourceMappingURL=chunk-4KIHDIXZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config/env.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\nconst envSchema = z.object({\r\n // Claude API\r\n CLAUDE_API_KEY: z.string().min(1, \"CLAUDE_API_KEY is required\"),\r\n\r\n // Telegram\r\n TELEGRAM_BOT_TOKEN: z.string().optional().default(\"\"),\r\n TELEGRAM_CHAT_ID: z.string().optional().default(\"\"),\r\n\r\n // OpenAI (Whisper STT)\r\n OPENAI_API_KEY: z.string().optional().default(\"\"),\r\n\r\n // ElevenLabs TTS\r\n ELEVENLABS_API_KEY: z.string().optional().default(\"\"),\r\n ELEVENLABS_VOICE_ID: z.string().optional().default(\"\"),\r\n\r\n // Database\r\n DATABASE_URL: z\r\n .string()\r\n .default(\"\"),\r\n\r\n // Redis\r\n REDIS_URL: z.string().default(\"redis://localhost:6379\"),\r\n\r\n // Discord (optional)\r\n DISCORD_BOT_TOKEN: z.string().optional(),\r\n DISCORD_CLIENT_ID: z.string().optional(),\r\n DISCORD_GUILD_ID: z.string().optional(),\r\n DISCORD_ALLOWED_USER_IDS: z.string().optional(), // Comma-separated list\r\n DISCORD_ALLOWED_ROLE_IDS: z.string().optional(), // Comma-separated list\r\n\r\n // Slack (optional)\r\n SLACK_BOT_TOKEN: z.string().optional(),\r\n SLACK_SIGNING_SECRET: z.string().optional(),\r\n SLACK_APP_TOKEN: z.string().optional(),\r\n SLACK_SOCKET_MODE: z.coerce.boolean().optional().default(false),\r\n SLACK_PORT: z.coerce.number().optional().default(3000),\r\n SLACK_ALLOWED_USER_IDS: z.string().optional(), // Comma-separated list\r\n SLACK_ALLOWED_CHANNEL_IDS: z.string().optional(), // Comma-separated list\r\n\r\n // Notion (optional)\r\n NOTION_API_KEY: z.string().optional(),\r\n NOTION_ROOT_PAGE_ID: z.string().optional(),\r\n\r\n // Email (optional)\r\n EMAIL_IMAP_HOST: z.string().optional(),\r\n EMAIL_IMAP_PORT: z.coerce.number().optional().default(993),\r\n EMAIL_IMAP_SECURE: z.coerce.boolean().optional().default(true),\r\n EMAIL_SMTP_HOST: z.string().optional(),\r\n EMAIL_SMTP_PORT: z.coerce.number().optional().default(587),\r\n EMAIL_SMTP_SECURE: z.coerce.boolean().optional().default(false),\r\n EMAIL_USER: z.string().optional(),\r\n EMAIL_PASSWORD: z.string().optional(),\r\n EMAIL_PROVIDER: z.enum([\"gmail\", \"outlook\", \"yahoo\", \"custom\"]).optional(),\r\n\r\n // Local Mail Server (Dovecot master user for multi-account access)\r\n EMAIL_MASTER_USER: z.string().optional(),\r\n EMAIL_MASTER_PASSWORD: z.string().optional(),\r\n EMAIL_LOCAL_IMAP_HOST: z.string().optional().default(\"127.0.0.1\"),\r\n EMAIL_LOCAL_IMAP_PORT: z.coerce.number().optional().default(993),\r\n EMAIL_LOCAL_SMTP_HOST: z.string().optional().default(\"127.0.0.1\"),\r\n EMAIL_LOCAL_SMTP_PORT: z.coerce.number().optional().default(25),\r\n\r\n // GitHub (optional)\r\n GITHUB_TOKEN: z.string().optional(),\r\n GITHUB_WEBHOOK_SECRET: z.string().optional(),\r\n\r\n // Google Services (unified OAuth2 — optional, falls back to service-specific)\r\n GOOGLE_CLIENT_ID: z.string().optional(),\r\n GOOGLE_CLIENT_SECRET: z.string().optional(),\r\n GOOGLE_REDIRECT_URI: z.string().optional(),\r\n GOOGLE_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // Google Drive (optional)\r\n GOOGLE_DRIVE_CLIENT_ID: z.string().optional(),\r\n GOOGLE_DRIVE_CLIENT_SECRET: z.string().optional(),\r\n GOOGLE_DRIVE_REDIRECT_URI: z.string().optional(),\r\n GOOGLE_DRIVE_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // Dropbox (optional)\r\n DROPBOX_APP_KEY: z.string().optional(),\r\n DROPBOX_APP_SECRET: z.string().optional(),\r\n DROPBOX_ACCESS_TOKEN: z.string().optional(),\r\n DROPBOX_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // GIF Search (optional)\r\n TENOR_API_KEY: z.string().optional(),\r\n GIPHY_API_KEY: z.string().optional(),\r\n\r\n // Finance (optional)\r\n ALPHA_VANTAGE_API_KEY: z.string().optional(),\r\n FRED_API_KEY: z.string().optional(), // Federal Reserve Economic Data\r\n FINNHUB_API_KEY: z.string().optional(), // Finnhub financial market data\r\n\r\n // Exchange Trading (optional)\r\n COINBASE_API_KEY: z.string().optional(),\r\n COINBASE_PRIVATE_KEY: z.string().optional(),\r\n BINANCE_API_KEY: z.string().optional(),\r\n BINANCE_API_SECRET: z.string().optional(),\r\n BINANCE_TESTNET: z.coerce.boolean().optional().default(false),\r\n EXCHANGE_REQUIRE_CONFIRMATION: z.coerce.boolean().optional().default(true),\r\n EXCHANGE_MAX_TRADE_SIZE: z.coerce.number().optional().default(100),\r\n EXCHANGE_MAX_DAILY_SPEND: z.coerce.number().optional().default(500),\r\n EXCHANGE_MAX_TRADES_PER_HOUR: z.coerce.number().optional().default(5),\r\n EXCHANGE_AGENT_TRADING_ENABLED: z.coerce.boolean().optional().default(false),\r\n\r\n // DeFi (optional)\r\n DEFILLAMA_API_KEY: z.string().optional(), // Pro tier\r\n\r\n // On-Chain Analytics (optional)\r\n ETHERSCAN_API_KEY: z.string().optional(),\r\n ALCHEMY_API_KEY: z.string().optional(),\r\n ALCHEMY_NETWORK: z.string().optional().default(\"eth-mainnet\"),\r\n\r\n // Optional\r\n HUGGINGFACE_ACCESS_TOKEN: z.string().optional(),\r\n TWILIO_ACCOUNT_SID: z.string().optional(),\r\n TWILIO_AUTH_TOKEN: z.string().optional(),\r\n TWILIO_PHONE_NUMBER: z.string().optional(),\r\n\r\n // Home Assistant (optional)\r\n HOME_ASSISTANT_URL: z.string().url().optional(),\r\n HOME_ASSISTANT_TOKEN: z.string().optional(),\r\n\r\n // Spotify (optional)\r\n SPOTIFY_CLIENT_ID: z.string().optional(),\r\n SPOTIFY_CLIENT_SECRET: z.string().optional(),\r\n SPOTIFY_REDIRECT_URI: z.string().optional(),\r\n SPOTIFY_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // Google Calendar (optional)\r\n GOOGLE_CALENDAR_CLIENT_ID: z.string().optional(),\r\n GOOGLE_CALENDAR_CLIENT_SECRET: z.string().optional(),\r\n GOOGLE_CALENDAR_REDIRECT_URI: z.string().url().optional(),\r\n GOOGLE_CALENDAR_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // Outlook Calendar (optional)\r\n OUTLOOK_CLIENT_ID: z.string().optional(),\r\n OUTLOOK_CLIENT_SECRET: z.string().optional(),\r\n OUTLOOK_REDIRECT_URI: z.string().url().optional(),\r\n OUTLOOK_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // Microsoft 365 / Entra ID (Graph API — mail, files, sites)\r\n // Scoped broader than Outlook Calendar: powers /api/m365/* routes.\r\n M365_CLIENT_ID: z.string().optional(),\r\n M365_CLIENT_SECRET: z.string().optional(),\r\n M365_TENANT_ID: z.string().optional().default(\"common\"),\r\n M365_REDIRECT_URI: z.string().optional(),\r\n M365_GRAPH_SCOPES: z\r\n .string()\r\n .optional()\r\n .default(\r\n \"openid profile offline_access User.Read Mail.Read Mail.ReadWrite Mail.Send Calendars.Read Files.Read\"\r\n ),\r\n M365_ANALYZE_RATE_LIMIT: z.coerce.number().optional().default(30),\r\n M365_ANALYZE_RATE_REFILL: z.coerce.number().optional().default(0.5),\r\n\r\n // Dropbox (additional OAuth fields)\r\n DROPBOX_CLIENT_ID: z.string().optional(),\r\n DROPBOX_CLIENT_SECRET: z.string().optional(),\r\n DROPBOX_REDIRECT_URI: z.string().url().optional(),\r\n\r\n // MCP (Model Context Protocol)\r\n MCP_ENABLED: z.coerce.boolean().optional().default(true),\r\n MCP_CONFIG_PATH: z.string().optional().default(\"./mcp.json\"),\r\n\r\n // Multi-Provider LLM\r\n LLM_PROVIDER: z.string().optional().default(\"anthropic\"),\r\n OPENROUTER_API_KEY: z.string().optional(),\r\n OPENROUTER_BASE_URL: z.string().optional(),\r\n GROQ_API_KEY: z.string().optional(),\r\n MISTRAL_API_KEY: z.string().optional(),\r\n OPENAI_LLM_ENABLED: z.coerce.boolean().optional().default(false),\r\n OPENAI_COMPATIBLE_API_KEY: z.string().optional(),\r\n OPENAI_COMPATIBLE_BASE_URL: z.string().optional(),\r\n OPENAI_COMPATIBLE_MODEL: z.string().optional(),\r\n\r\n // xAI (Grok)\r\n XAI_API_KEY: z.string().optional(),\r\n XAI_DEFAULT_MODEL: z.string().optional().default(\"grok-2\"),\r\n\r\n // Google Gemini (optional)\r\n GEMINI_API_KEY: z.string().optional(),\r\n GEMINI_DEFAULT_MODEL: z.string().optional().default(\"gemini-2.0-flash\"),\r\n\r\n // Ollama (local models)\r\n OLLAMA_ENABLED: z.coerce.boolean().optional().default(false),\r\n OLLAMA_BASE_URL: z.string().optional().default(\"http://localhost:11434\"),\r\n OLLAMA_DEFAULT_MODEL: z.string().optional().default(\"llama3.1\"),\r\n\r\n // Model Routing\r\n MODEL_ROUTING_ENABLED: z.coerce.boolean().optional().default(true),\r\n MODEL_OPUS_ENABLED: z.coerce.boolean().optional().default(false),\r\n\r\n // Context Compaction\r\n COMPACTION_ENABLED: z.coerce.boolean().optional().default(true),\r\n COMPACTION_TOKEN_THRESHOLD: z.coerce.number().optional().default(80000),\r\n COMPACTION_PRESERVE_RECENT: z.coerce.number().optional().default(6),\r\n\r\n // Security (OWASP Agentic)\r\n PROMPT_GUARD_ENABLED: z.coerce.boolean().optional().default(true),\r\n PROMPT_GUARD_THRESHOLD: z.coerce.number().optional().default(0.7),\r\n CIRCUIT_BREAKER_ENABLED: z.coerce.boolean().optional().default(true),\r\n TOOL_SANDBOX_ENABLED: z.coerce.boolean().optional().default(true),\r\n\r\n // Observability\r\n COST_TRACKING_ENABLED: z.coerce.boolean().optional().default(true),\r\n QUALITY_SCORING_ENABLED: z.coerce.boolean().optional().default(true),\r\n REQUEST_TRACING_ENABLED: z.coerce.boolean().optional().default(true),\r\n\r\n // Intent Parser & Gateway\r\n LOCAL_INTENT_PARSER_ENABLED: z.coerce.boolean().optional().default(true),\r\n UNIFIED_GATEWAY_ENABLED: z.coerce.boolean().optional().default(false),\r\n\r\n // WhatsApp (optional)\r\n WHATSAPP_ENABLED: z.coerce.boolean().optional().default(false),\r\n WHATSAPP_AUTH_DIR: z.string().optional().default(\"./whatsapp-auth\"),\r\n WHATSAPP_ALLOWED_NUMBERS: z.string().optional(), // Comma-separated\r\n\r\n // Signal (optional)\r\n SIGNAL_ENABLED: z.coerce.boolean().optional().default(false),\r\n SIGNAL_PHONE_NUMBER: z.string().optional(),\r\n SIGNAL_CLI_PATH: z.string().optional().default(\"signal-cli\"),\r\n SIGNAL_ALLOWED_NUMBERS: z.string().optional(), // Comma-separated\r\n\r\n // iMessage (optional, macOS only)\r\n IMESSAGE_ENABLED: z.coerce.boolean().optional().default(false),\r\n IMESSAGE_MODE: z.enum([\"bluebubbles\", \"applescript\"]).optional().default(\"applescript\"),\r\n IMESSAGE_BLUEBUBBLES_URL: z.string().optional(),\r\n IMESSAGE_BLUEBUBBLES_PASSWORD: z.string().optional(),\r\n IMESSAGE_ALLOWED_NUMBERS: z.string().optional(), // Comma-separated\r\n\r\n // Tunnel Support\r\n TUNNEL_ENABLED: z.coerce.boolean().optional().default(false),\r\n TUNNEL_PROVIDER: z.enum([\"cloudflare\", \"ngrok\", \"localtunnel\"]).optional().default(\"cloudflare\"),\r\n TUNNEL_SUBDOMAIN: z.string().optional(),\r\n TUNNEL_AUTH_TOKEN: z.string().optional(),\r\n\r\n // Autonomy Levels\r\n AUTONOMY_LEVEL: z.enum([\"readonly\", \"supervised\", \"autonomous\"]).optional().default(\"autonomous\"),\r\n\r\n // Prometheus/OpenTelemetry\r\n PROMETHEUS_ENABLED: z.coerce.boolean().optional().default(false),\r\n PROMETHEUS_PATH: z.string().optional().default(\"/metrics\"),\r\n\r\n // Device Pairing\r\n PAIRING_ENABLED: z.coerce.boolean().optional().default(false),\r\n PAIRING_CODE_LIFETIME_MINUTES: z.coerce.number().optional().default(5),\r\n\r\n // Gateway Authentication (OpenClaw-style)\r\n // If set, web UI and API requests require this token. Unset = open access (localhost-friendly).\r\n GATEWAY_TOKEN: z.string().optional(),\r\n\r\n // Matrix (optional)\r\n MATRIX_ENABLED: z.coerce.boolean().optional().default(false),\r\n MATRIX_HOMESERVER_URL: z.string().optional(),\r\n MATRIX_ACCESS_TOKEN: z.string().optional(),\r\n MATRIX_USER_ID: z.string().optional(),\r\n MATRIX_ALLOWED_ROOM_IDS: z.string().optional(), // Comma-separated\r\n MATRIX_AUTO_JOIN: z.coerce.boolean().optional().default(true),\r\n MATRIX_E2E_ENABLED: z.coerce.boolean().optional().default(false),\r\n\r\n // Neo4j (OSINT graph database)\r\n NEO4J_URI: z.string().optional().default(\"bolt://localhost:7687\"),\r\n NEO4J_USER: z.string().optional().default(\"neo4j\"),\r\n NEO4J_PASSWORD: z.string().optional().default(\"\"),\r\n NEO4J_DATABASE: z.string().optional().default(\"neo4j\"),\r\n\r\n // OSINT API Keys\r\n FEC_API_KEY: z.string().optional().default(\"\"),\r\n OPENCORPORATES_API_TOKEN: z.string().optional().default(\"\"),\r\n SEC_EDGAR_USER_AGENT: z.string().optional().default(\"OpenSentinel/2.1 (contact@opensentinel.ai)\"),\r\n\r\n // OSINT Feature Toggle\r\n OSINT_ENABLED: z.coerce.boolean().optional().default(false),\r\n OSINT_RATE_LIMIT_BUFFER_MS: z.coerce.number().optional().default(200),\r\n\r\n // Embedding Provider\r\n EMBEDDING_PROVIDER: z.enum([\"openai\", \"huggingface\", \"tfidf\"]).optional().default(\"openai\"),\r\n EMBEDDING_MODEL: z.string().optional(),\r\n EMBEDDING_DIMENSIONS: z.coerce.number().optional(),\r\n EMBEDDING_DB_DIMENSIONS: z.coerce.number().optional().default(1536),\r\n EMBEDDING_BATCH_SIZE: z.coerce.number().optional().default(32),\r\n\r\n // Advanced RAG\r\n HYDE_ENABLED: z.coerce.boolean().optional().default(false),\r\n RERANK_ENABLED: z.coerce.boolean().optional().default(false),\r\n RERANK_MIN_SCORE: z.coerce.number().optional().default(3),\r\n MULTISTEP_RAG_ENABLED: z.coerce.boolean().optional().default(false),\r\n MULTISTEP_MAX_STEPS: z.coerce.number().optional().default(2),\r\n RETRIEVAL_CACHE_ENABLED: z.coerce.boolean().optional().default(false),\r\n CONTEXTUAL_QUERY_ENABLED: z.coerce.boolean().optional().default(false),\r\n\r\n // Agentic RAG Pipeline\r\n TOOL_CLASSIFIER_ENABLED: z.coerce.boolean().optional().default(false),\r\n TOOL_CLASSIFIER_TIMEOUT_MS: z.coerce.number().optional().default(5000),\r\n TOOL_CLASSIFIER_MAX_CATEGORIES: z.coerce.number().optional().default(3),\r\n\r\n // AI Memory (auto-extract/search)\r\n AUTO_MEMORY_EXTRACT_ENABLED: z.coerce.boolean().optional().default(false),\r\n AUTO_MEMORY_EXTRACT_DEDUP_THRESHOLD: z.coerce.number().optional().default(0.9),\r\n AUTO_MEMORY_SEARCH_THRESHOLD: z.coerce.number().optional().default(0.3),\r\n\r\n // Agentic Pipeline Orchestrator\r\n AGENTIC_PIPELINE_ENABLED: z.coerce.boolean().optional().default(false),\r\n AGENTIC_PRE_EXECUTION_ENABLED: z.coerce.boolean().optional().default(false),\r\n AGENTIC_PRE_EXECUTION_TIMEOUT_MS: z.coerce.number().optional().default(8000),\r\n\r\n // Agent Processor\r\n AGENT_PROCESSOR_ENABLED: z.coerce.boolean().optional().default(false),\r\n AGENT_PROCESSOR_CONCURRENCY: z.coerce.number().optional().default(1),\r\n AGENT_MAX_TURNS: z.coerce.number().optional().default(20),\r\n\r\n // SOC 2 Encryption & Audit\r\n ENCRYPTION_MASTER_KEY: z.string().optional(), // 32-byte base64 key for field encryption\r\n AUDIT_SIGNING_KEY: z.string().optional(), // HMAC key for tamper-proof audit logs\r\n\r\n // Server\r\n PORT: z.coerce.number().default(8030),\r\n NODE_ENV: z.enum([\"development\", \"production\", \"test\"]).default(\"development\"),\r\n});\r\n\r\nexport type Env = z.infer<typeof envSchema>;\r\n\r\n// Internal mutable store\r\nlet _env: Env | null = null;\r\n\r\n/**\r\n * Programmatic configuration for library use.\r\n * Call this before any module accesses `env`.\r\n * Config values are merged with process.env (config takes precedence).\r\n */\r\nlet _providerInitPromise: Promise<void> | null = null;\r\n\r\nexport function configure(config: Partial<Env> & { CLAUDE_API_KEY: string }): Env {\r\n const merged = { ...process.env, ...config };\r\n const result = envSchema.safeParse(merged);\r\n\r\n if (!result.success) {\r\n const errors = result.error.errors.map(\r\n (e) => `${e.path.join(\".\")}: ${e.message}`\r\n );\r\n throw new Error(\r\n `OpenSentinel configuration validation failed:\\n ${errors.join(\"\\n \")}`\r\n );\r\n }\r\n\r\n _env = result.data;\r\n\r\n // Auto-initialize LLM providers after configuration\r\n _providerInitPromise = import(\"../core/providers\").then((m) => m.initializeProviders()).catch(() => {});\r\n\r\n return _env;\r\n}\r\n\r\n/**\r\n * Wait for provider initialization to complete.\r\n * Call after configure() if you need providers ready before first API call.\r\n */\r\nexport async function ready(): Promise<void> {\r\n if (_providerInitPromise) await _providerInitPromise;\r\n}\r\n\r\n/**\r\n * Load config from process.env.\r\n * Called lazily on first access if configure() was not called.\r\n *\r\n * When used as a library, env vars may not be set at import time\r\n * (module-level singletons trigger this during static initialization).\r\n * In that case, we populate with defaults and partial values rather\r\n * than throwing — services will fail with clear errors when actually used.\r\n */\r\nfunction loadFromProcessEnv(): Env {\r\n const result = envSchema.safeParse(process.env);\r\n\r\n if (!result.success) {\r\n // If running as CLI (not library), throw so the user sees the error immediately\r\n if (process.env.__OPENSENTINEL_CLI__) {\r\n const errors = result.error.errors.map(\r\n (e) => `${e.path.join(\".\")}: ${e.message}`\r\n );\r\n throw new Error(\r\n `Environment validation failed:\\n ${errors.join(\"\\n \")}`\r\n );\r\n }\r\n\r\n // For library use: populate with whatever we have, fill missing with defaults\r\n // Services will fail individually when they try to use undefined API keys\r\n const lenientSchema = envSchema.extend({\r\n CLAUDE_API_KEY: z.string().default(\"\"),\r\n });\r\n const lenientResult = lenientSchema.safeParse(process.env);\r\n _env = (lenientResult.success ? lenientResult.data : {}) as Env;\r\n return _env;\r\n }\r\n\r\n _env = result.data;\r\n return _env;\r\n}\r\n\r\n/**\r\n * The env accessor. Lazy — loads from process.env on first access\r\n * if configure() was not called first.\r\n *\r\n * All 37+ consumer files keep using `env.SOME_PROP` unchanged.\r\n */\r\nexport const env: Env = new Proxy({} as Env, {\r\n get(_target, prop: string) {\r\n if (!_env) {\r\n loadFromProcessEnv();\r\n }\r\n return (_env as any)[prop];\r\n },\r\n has(_target, prop: string) {\r\n if (!_env) {\r\n loadFromProcessEnv();\r\n }\r\n return prop in (_env as any);\r\n },\r\n ownKeys() {\r\n if (!_env) {\r\n loadFromProcessEnv();\r\n }\r\n return Reflect.ownKeys(_env as any);\r\n },\r\n getOwnPropertyDescriptor(_target, prop) {\r\n if (!_env) {\r\n loadFromProcessEnv();\r\n }\r\n return Object.getOwnPropertyDescriptor(_env as any, prop);\r\n },\r\n});\r\n"],"mappings":"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","names":[]}
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
providerRegistry
|
|
3
|
+
} from "./chunk-GW6V4D43.js";
|
|
1
4
|
import {
|
|
2
5
|
isPathAllowed
|
|
3
6
|
} from "./chunk-CQ4JURG7.js";
|
|
4
|
-
import {
|
|
5
|
-
env
|
|
6
|
-
} from "./chunk-ZLZKF2PM.js";
|
|
7
7
|
|
|
8
8
|
// src/tools/image-analysis.ts
|
|
9
|
-
import Anthropic from "@anthropic-ai/sdk";
|
|
10
9
|
import { readFile } from "fs/promises";
|
|
11
|
-
var anthropic = new Anthropic({
|
|
12
|
-
apiKey: env.CLAUDE_API_KEY
|
|
13
|
-
});
|
|
14
10
|
var SUPPORTED_TYPES = {
|
|
15
11
|
".jpg": "image/jpeg",
|
|
16
12
|
".jpeg": "image/jpeg",
|
|
@@ -24,7 +20,8 @@ function getMimeType(filename) {
|
|
|
24
20
|
}
|
|
25
21
|
async function analyzeImageUrl(imageUrl, prompt) {
|
|
26
22
|
try {
|
|
27
|
-
const
|
|
23
|
+
const provider = providerRegistry.getDefault();
|
|
24
|
+
const response = await provider.createMessage({
|
|
28
25
|
model: "claude-sonnet-4-20250514",
|
|
29
26
|
max_tokens: 1024,
|
|
30
27
|
messages: [
|
|
@@ -49,7 +46,7 @@ async function analyzeImageUrl(imageUrl, prompt) {
|
|
|
49
46
|
const textContent = response.content.find((c) => c.type === "text");
|
|
50
47
|
return {
|
|
51
48
|
success: true,
|
|
52
|
-
analysis: textContent?.
|
|
49
|
+
analysis: textContent?.text
|
|
53
50
|
};
|
|
54
51
|
} catch (error) {
|
|
55
52
|
return {
|
|
@@ -75,7 +72,8 @@ async function analyzeImageFile(filePath, prompt) {
|
|
|
75
72
|
}
|
|
76
73
|
const imageData = await readFile(filePath);
|
|
77
74
|
const base64 = imageData.toString("base64");
|
|
78
|
-
const
|
|
75
|
+
const provider = providerRegistry.getDefault();
|
|
76
|
+
const response = await provider.createMessage({
|
|
79
77
|
model: "claude-sonnet-4-20250514",
|
|
80
78
|
max_tokens: 1024,
|
|
81
79
|
messages: [
|
|
@@ -86,7 +84,7 @@ async function analyzeImageFile(filePath, prompt) {
|
|
|
86
84
|
type: "image",
|
|
87
85
|
source: {
|
|
88
86
|
type: "base64",
|
|
89
|
-
|
|
87
|
+
mediaType: mimeType,
|
|
90
88
|
data: base64
|
|
91
89
|
}
|
|
92
90
|
},
|
|
@@ -101,7 +99,7 @@ async function analyzeImageFile(filePath, prompt) {
|
|
|
101
99
|
const textContent = response.content.find((c) => c.type === "text");
|
|
102
100
|
return {
|
|
103
101
|
success: true,
|
|
104
|
-
analysis: textContent?.
|
|
102
|
+
analysis: textContent?.text
|
|
105
103
|
};
|
|
106
104
|
} catch (error) {
|
|
107
105
|
return {
|
|
@@ -113,7 +111,8 @@ async function analyzeImageFile(filePath, prompt) {
|
|
|
113
111
|
async function analyzeImageBuffer(imageBuffer, mimeType, prompt) {
|
|
114
112
|
try {
|
|
115
113
|
const base64 = imageBuffer.toString("base64");
|
|
116
|
-
const
|
|
114
|
+
const provider = providerRegistry.getDefault();
|
|
115
|
+
const response = await provider.createMessage({
|
|
117
116
|
model: "claude-sonnet-4-20250514",
|
|
118
117
|
max_tokens: 1024,
|
|
119
118
|
messages: [
|
|
@@ -124,7 +123,7 @@ async function analyzeImageBuffer(imageBuffer, mimeType, prompt) {
|
|
|
124
123
|
type: "image",
|
|
125
124
|
source: {
|
|
126
125
|
type: "base64",
|
|
127
|
-
|
|
126
|
+
mediaType: mimeType,
|
|
128
127
|
data: base64
|
|
129
128
|
}
|
|
130
129
|
},
|
|
@@ -139,7 +138,7 @@ async function analyzeImageBuffer(imageBuffer, mimeType, prompt) {
|
|
|
139
138
|
const textContent = response.content.find((c) => c.type === "text");
|
|
140
139
|
return {
|
|
141
140
|
success: true,
|
|
142
|
-
analysis: textContent?.
|
|
141
|
+
analysis: textContent?.text
|
|
143
142
|
};
|
|
144
143
|
} catch (error) {
|
|
145
144
|
return {
|
|
@@ -287,4 +286,4 @@ export {
|
|
|
287
286
|
extractStructuredData,
|
|
288
287
|
ocr_default
|
|
289
288
|
};
|
|
290
|
-
//# sourceMappingURL=chunk-
|
|
289
|
+
//# sourceMappingURL=chunk-4WH6MFEW.js.map
|