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,213 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createLogger
|
|
3
|
+
} from "./chunk-7BNFELEK.js";
|
|
4
|
+
import {
|
|
5
|
+
providerRegistry
|
|
6
|
+
} from "./chunk-GW6V4D43.js";
|
|
7
|
+
import {
|
|
8
|
+
db
|
|
9
|
+
} from "./chunk-5BTVJR7R.js";
|
|
10
|
+
import {
|
|
11
|
+
m365AnalysisResults
|
|
12
|
+
} from "./chunk-ZIBRVA3Y.js";
|
|
13
|
+
|
|
14
|
+
// src/integrations/m365/analyzer.ts
|
|
15
|
+
import { eq, desc } from "drizzle-orm";
|
|
16
|
+
var log = createLogger("m365:analyzer");
|
|
17
|
+
var SYSTEM_PROMPT = `You are a security analyst reviewing an email for phishing, business-email-compromise, and credential-harvesting risk.
|
|
18
|
+
|
|
19
|
+
Return STRICT JSON with this exact shape:
|
|
20
|
+
{
|
|
21
|
+
"riskScore": <integer 0-100>,
|
|
22
|
+
"category": <"Safe" | "Suspicious" | "Phishing">,
|
|
23
|
+
"explanation": [<short strings, each one signal>],
|
|
24
|
+
"recommendedActions": [<short strings, each one actionable step>]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
Scoring guidance:
|
|
28
|
+
- 0-34 Safe: typical business mail, known-good sender patterns, no red flags.
|
|
29
|
+
- 35-69 Suspicious: one or more soft signals (urgency, consumer sender for business content, lookalike domain).
|
|
30
|
+
- 70-100 Phishing: credential harvest, wire-transfer / gift-card fraud, brand impersonation, malicious link patterns.
|
|
31
|
+
|
|
32
|
+
Be specific in explanations \u2014 name the signal, not a category. Return JSON only, no prose.`;
|
|
33
|
+
async function analyzeEmail(input) {
|
|
34
|
+
const started = Date.now();
|
|
35
|
+
const provider = safeGetProvider();
|
|
36
|
+
if (!provider) {
|
|
37
|
+
const result = heuristicAnalyze(input);
|
|
38
|
+
return { ...result, latencyMs: Date.now() - started };
|
|
39
|
+
}
|
|
40
|
+
const userContent = JSON.stringify({
|
|
41
|
+
subject: input.subject,
|
|
42
|
+
sender: input.sender,
|
|
43
|
+
body: truncate(input.body ?? "", 8e3),
|
|
44
|
+
headers: input.headers ?? {}
|
|
45
|
+
});
|
|
46
|
+
try {
|
|
47
|
+
const caps = provider.getCapabilities();
|
|
48
|
+
const model = caps?.defaultModel || (typeof provider.defaultModel === "string" ? provider.defaultModel : "claude-sonnet-4-6");
|
|
49
|
+
const response = await provider.createMessage({
|
|
50
|
+
model,
|
|
51
|
+
max_tokens: 800,
|
|
52
|
+
system: SYSTEM_PROMPT,
|
|
53
|
+
messages: [{ role: "user", content: userContent }]
|
|
54
|
+
});
|
|
55
|
+
const text = extractText(response);
|
|
56
|
+
const parsed = parseJsonResponse(text);
|
|
57
|
+
if (!parsed) throw new Error("LLM returned unparseable JSON");
|
|
58
|
+
const result = {
|
|
59
|
+
riskScore: clampScore(parsed.riskScore),
|
|
60
|
+
category: normaliseCategory(parsed.category, clampScore(parsed.riskScore)),
|
|
61
|
+
explanation: Array.isArray(parsed.explanation) ? parsed.explanation.map(String) : [],
|
|
62
|
+
recommendedActions: Array.isArray(parsed.recommendedActions) ? parsed.recommendedActions.map(String) : [],
|
|
63
|
+
engine: "llm",
|
|
64
|
+
model,
|
|
65
|
+
latencyMs: Date.now() - started
|
|
66
|
+
};
|
|
67
|
+
return result;
|
|
68
|
+
} catch (err) {
|
|
69
|
+
log.warn("LLM analysis failed, falling back to heuristic", {
|
|
70
|
+
error: err instanceof Error ? err.message : String(err)
|
|
71
|
+
});
|
|
72
|
+
const result = heuristicAnalyze(input);
|
|
73
|
+
return { ...result, latencyMs: Date.now() - started };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function persistAnalysis(opts) {
|
|
77
|
+
const inserted = await db.insert(m365AnalysisResults).values({
|
|
78
|
+
userKey: opts.userKey,
|
|
79
|
+
inputType: opts.inputType ?? "email",
|
|
80
|
+
inputId: opts.inputId ?? null,
|
|
81
|
+
subject: opts.input.subject,
|
|
82
|
+
sender: opts.input.sender,
|
|
83
|
+
riskScore: opts.result.riskScore,
|
|
84
|
+
category: opts.result.category,
|
|
85
|
+
explanation: opts.result.explanation,
|
|
86
|
+
recommendedActions: opts.result.recommendedActions,
|
|
87
|
+
engine: opts.result.engine,
|
|
88
|
+
model: opts.result.model ?? null,
|
|
89
|
+
latencyMs: opts.result.latencyMs
|
|
90
|
+
}).returning({ id: m365AnalysisResults.id });
|
|
91
|
+
return inserted[0].id;
|
|
92
|
+
}
|
|
93
|
+
async function listAnalyses(userKey, limit = 50) {
|
|
94
|
+
return db.select().from(m365AnalysisResults).where(eq(m365AnalysisResults.userKey, userKey)).orderBy(desc(m365AnalysisResults.createdAt)).limit(limit);
|
|
95
|
+
}
|
|
96
|
+
var KNOWN_BRANDS = [
|
|
97
|
+
"paypal.com",
|
|
98
|
+
"microsoft.com",
|
|
99
|
+
"apple.com",
|
|
100
|
+
"amazon.com",
|
|
101
|
+
"google.com",
|
|
102
|
+
"netflix.com",
|
|
103
|
+
"chase.com",
|
|
104
|
+
"bankofamerica.com"
|
|
105
|
+
];
|
|
106
|
+
function heuristicAnalyze(input) {
|
|
107
|
+
const explanation = [];
|
|
108
|
+
let score = 0;
|
|
109
|
+
const sender = input.sender.toLowerCase();
|
|
110
|
+
const body = (input.body ?? "").toLowerCase();
|
|
111
|
+
const subject = input.subject.toLowerCase();
|
|
112
|
+
const combined = `${body} ${subject}`;
|
|
113
|
+
if (/(urgent|immediately|act now|wire transfer|gift card|verify your account|password expires)/i.test(combined)) {
|
|
114
|
+
score += 25;
|
|
115
|
+
explanation.push("Urgency or credential-harvest phrasing detected.");
|
|
116
|
+
}
|
|
117
|
+
if (/(click here|tap here|verify account|reset your password|confirm identity|login to continue|restore access|regain access)/i.test(combined)) {
|
|
118
|
+
score += 20;
|
|
119
|
+
explanation.push("Common social-engineering phrases detected.");
|
|
120
|
+
}
|
|
121
|
+
if (/(account (has been )?(suspended|terminated|locked|disabled|compromised))/i.test(combined)) {
|
|
122
|
+
score += 20;
|
|
123
|
+
explanation.push("Account-status fear phrasing detected.");
|
|
124
|
+
}
|
|
125
|
+
for (const brand of KNOWN_BRANDS) {
|
|
126
|
+
const brandName = brand.split(".")[0];
|
|
127
|
+
if (sender.includes(brandName) && !sender.endsWith(`@${brand}`) && !sender.endsWith(`.${brand}`)) {
|
|
128
|
+
score += 50;
|
|
129
|
+
explanation.push(`Possible impersonation of ${brand} \u2014 sender domain does not match.`);
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (/@(gmail|outlook|hotmail|yahoo|proton)\.com$/.test(sender) && /(invoice|wire|payment|urgent)/i.test(combined)) {
|
|
134
|
+
score += 15;
|
|
135
|
+
explanation.push("Consumer mailbox is requesting business payment action.");
|
|
136
|
+
}
|
|
137
|
+
const linkCount = (body.match(/https?:\/\/[^\s)<]+/g) || []).length;
|
|
138
|
+
if (linkCount > 10) {
|
|
139
|
+
score += 10;
|
|
140
|
+
explanation.push(`High link density (${linkCount} URLs).`);
|
|
141
|
+
}
|
|
142
|
+
score = Math.min(100, score);
|
|
143
|
+
const category = normaliseCategory(void 0, score);
|
|
144
|
+
const recommendedActions = category === "Phishing" ? [
|
|
145
|
+
"Do not click links or open attachments.",
|
|
146
|
+
"Report to your security team or phishing@ mailbox.",
|
|
147
|
+
"Verify sender via a trusted out-of-band channel."
|
|
148
|
+
] : category === "Suspicious" ? [
|
|
149
|
+
"Verify sender identity through a known channel before acting.",
|
|
150
|
+
"Inspect link destinations before clicking."
|
|
151
|
+
] : ["No high-risk signals detected \u2014 proceed with normal vigilance."];
|
|
152
|
+
return {
|
|
153
|
+
riskScore: score,
|
|
154
|
+
category,
|
|
155
|
+
explanation: explanation.length ? explanation : ["No major high-risk indicators detected."],
|
|
156
|
+
recommendedActions,
|
|
157
|
+
engine: "heuristic",
|
|
158
|
+
latencyMs: 0
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
function safeGetProvider() {
|
|
162
|
+
try {
|
|
163
|
+
return providerRegistry.getDefault();
|
|
164
|
+
} catch {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function truncate(s, n) {
|
|
169
|
+
return s.length > n ? s.slice(0, n) + "...[truncated]" : s;
|
|
170
|
+
}
|
|
171
|
+
function clampScore(x) {
|
|
172
|
+
const n = Number(x);
|
|
173
|
+
if (!Number.isFinite(n)) return 0;
|
|
174
|
+
return Math.max(0, Math.min(100, Math.round(n)));
|
|
175
|
+
}
|
|
176
|
+
function normaliseCategory(raw, score) {
|
|
177
|
+
const v = typeof raw === "string" ? raw.toLowerCase() : "";
|
|
178
|
+
if (v.includes("phish")) return "Phishing";
|
|
179
|
+
if (v.includes("suspic")) return "Suspicious";
|
|
180
|
+
if (v.includes("safe")) return "Safe";
|
|
181
|
+
if (score >= 70) return "Phishing";
|
|
182
|
+
if (score >= 35) return "Suspicious";
|
|
183
|
+
return "Safe";
|
|
184
|
+
}
|
|
185
|
+
function extractText(response) {
|
|
186
|
+
const r = response;
|
|
187
|
+
if (!r) return "";
|
|
188
|
+
if (typeof r.content === "string") return r.content;
|
|
189
|
+
if (Array.isArray(r.content)) {
|
|
190
|
+
return r.content.map((b) => typeof b === "string" ? b : b?.text ?? "").join("");
|
|
191
|
+
}
|
|
192
|
+
if (typeof r.text === "string") return r.text;
|
|
193
|
+
return "";
|
|
194
|
+
}
|
|
195
|
+
function parseJsonResponse(text) {
|
|
196
|
+
if (!text) return null;
|
|
197
|
+
const match = text.match(/\{[\s\S]*\}/);
|
|
198
|
+
if (!match) return null;
|
|
199
|
+
try {
|
|
200
|
+
return JSON.parse(match[0]);
|
|
201
|
+
} catch {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export {
|
|
207
|
+
analyzeEmail,
|
|
208
|
+
persistAnalysis,
|
|
209
|
+
listAnalyses,
|
|
210
|
+
heuristicAnalyze,
|
|
211
|
+
parseJsonResponse
|
|
212
|
+
};
|
|
213
|
+
//# sourceMappingURL=chunk-SDLOMKCW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/integrations/m365/analyzer.ts"],"sourcesContent":["/**\n * Email risk analysis — LLM first, with a deterministic heuristic fallback.\n *\n * Uses the default LLM provider from providerRegistry (typically Anthropic) to\n * produce structured { riskScore, category, explanation, recommendedActions }.\n * Falls back to regex heuristics when no provider is registered — useful for\n * tests and self-hosted deployments without an LLM key.\n */\n\nimport { db, m365AnalysisResults } from \"../../db\";\nimport { providerRegistry } from \"../../core/providers\";\nimport { eq, desc } from \"drizzle-orm\";\nimport { createLogger } from \"../../core/logger\";\n\nconst log = createLogger(\"m365:analyzer\");\n\nexport interface AnalysisInput {\n subject: string;\n sender: string;\n body?: string;\n headers?: Record<string, string>;\n}\n\nexport type AnalysisCategory = \"Safe\" | \"Suspicious\" | \"Phishing\" | \"Error\";\n\nexport interface AnalysisResult {\n riskScore: number; // 0-100\n category: AnalysisCategory;\n explanation: string[];\n recommendedActions: string[];\n engine: \"llm\" | \"heuristic\";\n model?: string;\n latencyMs: number;\n}\n\nconst SYSTEM_PROMPT = `You are a security analyst reviewing an email for phishing, business-email-compromise, and credential-harvesting risk.\n\nReturn STRICT JSON with this exact shape:\n{\n \"riskScore\": <integer 0-100>,\n \"category\": <\"Safe\" | \"Suspicious\" | \"Phishing\">,\n \"explanation\": [<short strings, each one signal>],\n \"recommendedActions\": [<short strings, each one actionable step>]\n}\n\nScoring guidance:\n- 0-34 Safe: typical business mail, known-good sender patterns, no red flags.\n- 35-69 Suspicious: one or more soft signals (urgency, consumer sender for business content, lookalike domain).\n- 70-100 Phishing: credential harvest, wire-transfer / gift-card fraud, brand impersonation, malicious link patterns.\n\nBe specific in explanations — name the signal, not a category. Return JSON only, no prose.`;\n\nexport async function analyzeEmail(input: AnalysisInput): Promise<AnalysisResult> {\n const started = Date.now();\n const provider = safeGetProvider();\n\n if (!provider) {\n const result = heuristicAnalyze(input);\n return { ...result, latencyMs: Date.now() - started };\n }\n\n const userContent = JSON.stringify({\n subject: input.subject,\n sender: input.sender,\n body: truncate(input.body ?? \"\", 8000),\n headers: input.headers ?? {},\n });\n\n try {\n const caps = provider.getCapabilities();\n const model =\n (caps as any)?.defaultModel ||\n (typeof (provider as any).defaultModel === \"string\" ? (provider as any).defaultModel : \"claude-sonnet-4-6\");\n\n const response = await provider.createMessage({\n model,\n max_tokens: 800,\n system: SYSTEM_PROMPT,\n messages: [{ role: \"user\", content: userContent }],\n });\n\n const text = extractText(response);\n const parsed = parseJsonResponse(text);\n if (!parsed) throw new Error(\"LLM returned unparseable JSON\");\n\n const result: AnalysisResult = {\n riskScore: clampScore(parsed.riskScore),\n category: normaliseCategory(parsed.category, clampScore(parsed.riskScore)),\n explanation: Array.isArray(parsed.explanation) ? parsed.explanation.map(String) : [],\n recommendedActions: Array.isArray(parsed.recommendedActions)\n ? parsed.recommendedActions.map(String)\n : [],\n engine: \"llm\",\n model,\n latencyMs: Date.now() - started,\n };\n return result;\n } catch (err) {\n log.warn(\"LLM analysis failed, falling back to heuristic\", {\n error: err instanceof Error ? err.message : String(err),\n });\n const result = heuristicAnalyze(input);\n return { ...result, latencyMs: Date.now() - started };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Persistence\n// ---------------------------------------------------------------------------\n\nexport interface PersistOpts {\n userKey: string;\n input: AnalysisInput;\n inputId?: string;\n inputType?: \"email\" | \"file\" | \"document\";\n result: AnalysisResult;\n}\n\nexport async function persistAnalysis(opts: PersistOpts): Promise<string> {\n const inserted = await db\n .insert(m365AnalysisResults)\n .values({\n userKey: opts.userKey,\n inputType: opts.inputType ?? \"email\",\n inputId: opts.inputId ?? null,\n subject: opts.input.subject,\n sender: opts.input.sender,\n riskScore: opts.result.riskScore,\n category: opts.result.category,\n explanation: opts.result.explanation,\n recommendedActions: opts.result.recommendedActions,\n engine: opts.result.engine,\n model: opts.result.model ?? null,\n latencyMs: opts.result.latencyMs,\n })\n .returning({ id: m365AnalysisResults.id });\n return inserted[0].id;\n}\n\nexport async function listAnalyses(userKey: string, limit = 50) {\n return db\n .select()\n .from(m365AnalysisResults)\n .where(eq(m365AnalysisResults.userKey, userKey))\n .orderBy(desc(m365AnalysisResults.createdAt))\n .limit(limit);\n}\n\n// ---------------------------------------------------------------------------\n// Heuristic fallback\n// ---------------------------------------------------------------------------\n\nconst KNOWN_BRANDS = [\n \"paypal.com\",\n \"microsoft.com\",\n \"apple.com\",\n \"amazon.com\",\n \"google.com\",\n \"netflix.com\",\n \"chase.com\",\n \"bankofamerica.com\",\n];\n\nexport function heuristicAnalyze(input: AnalysisInput): AnalysisResult {\n const explanation: string[] = [];\n let score = 0;\n\n const sender = input.sender.toLowerCase();\n const body = (input.body ?? \"\").toLowerCase();\n const subject = input.subject.toLowerCase();\n const combined = `${body} ${subject}`;\n\n if (/(urgent|immediately|act now|wire transfer|gift card|verify your account|password expires)/i.test(combined)) {\n score += 25;\n explanation.push(\"Urgency or credential-harvest phrasing detected.\");\n }\n\n if (/(click here|tap here|verify account|reset your password|confirm identity|login to continue|restore access|regain access)/i.test(combined)) {\n score += 20;\n explanation.push(\"Common social-engineering phrases detected.\");\n }\n\n if (/(account (has been )?(suspended|terminated|locked|disabled|compromised))/i.test(combined)) {\n score += 20;\n explanation.push(\"Account-status fear phrasing detected.\");\n }\n\n for (const brand of KNOWN_BRANDS) {\n const brandName = brand.split(\".\")[0];\n if (sender.includes(brandName) && !sender.endsWith(`@${brand}`) && !sender.endsWith(`.${brand}`)) {\n score += 50;\n explanation.push(`Possible impersonation of ${brand} — sender domain does not match.`);\n break;\n }\n }\n\n if (/@(gmail|outlook|hotmail|yahoo|proton)\\.com$/.test(sender) && /(invoice|wire|payment|urgent)/i.test(combined)) {\n score += 15;\n explanation.push(\"Consumer mailbox is requesting business payment action.\");\n }\n\n const linkCount = (body.match(/https?:\\/\\/[^\\s)<]+/g) || []).length;\n if (linkCount > 10) {\n score += 10;\n explanation.push(`High link density (${linkCount} URLs).`);\n }\n\n score = Math.min(100, score);\n const category = normaliseCategory(undefined, score);\n\n const recommendedActions: string[] =\n category === \"Phishing\"\n ? [\n \"Do not click links or open attachments.\",\n \"Report to your security team or phishing@ mailbox.\",\n \"Verify sender via a trusted out-of-band channel.\",\n ]\n : category === \"Suspicious\"\n ? [\n \"Verify sender identity through a known channel before acting.\",\n \"Inspect link destinations before clicking.\",\n ]\n : [\"No high-risk signals detected — proceed with normal vigilance.\"];\n\n return {\n riskScore: score,\n category,\n explanation: explanation.length ? explanation : [\"No major high-risk indicators detected.\"],\n recommendedActions,\n engine: \"heuristic\",\n latencyMs: 0,\n };\n}\n\n// ---------------------------------------------------------------------------\n// internals\n// ---------------------------------------------------------------------------\n\nfunction safeGetProvider() {\n try {\n return providerRegistry.getDefault();\n } catch {\n return null;\n }\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length > n ? s.slice(0, n) + \"...[truncated]\" : s;\n}\n\nfunction clampScore(x: unknown): number {\n const n = Number(x);\n if (!Number.isFinite(n)) return 0;\n return Math.max(0, Math.min(100, Math.round(n)));\n}\n\nfunction normaliseCategory(raw: unknown, score: number): AnalysisCategory {\n const v = typeof raw === \"string\" ? raw.toLowerCase() : \"\";\n if (v.includes(\"phish\")) return \"Phishing\";\n if (v.includes(\"suspic\")) return \"Suspicious\";\n if (v.includes(\"safe\")) return \"Safe\";\n if (score >= 70) return \"Phishing\";\n if (score >= 35) return \"Suspicious\";\n return \"Safe\";\n}\n\nfunction extractText(response: unknown): string {\n // Provider response may be { content: string | blocks[] } or shaped differently.\n const r = response as any;\n if (!r) return \"\";\n if (typeof r.content === \"string\") return r.content;\n if (Array.isArray(r.content)) {\n return r.content\n .map((b: any) => (typeof b === \"string\" ? b : b?.text ?? \"\"))\n .join(\"\");\n }\n if (typeof r.text === \"string\") return r.text;\n return \"\";\n}\n\nexport function parseJsonResponse(text: string): {\n riskScore?: unknown;\n category?: unknown;\n explanation?: unknown;\n recommendedActions?: unknown;\n} | null {\n if (!text) return null;\n // Extract the first {...} block — tolerant of LLMs that wrap with code fences or prose.\n const match = text.match(/\\{[\\s\\S]*\\}/);\n if (!match) return null;\n try {\n return JSON.parse(match[0]);\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import {
|
|
2
|
+
metric
|
|
3
|
+
} from "./chunk-YEDEAX6Y.js";
|
|
4
|
+
import {
|
|
5
|
+
db
|
|
6
|
+
} from "./chunk-5BTVJR7R.js";
|
|
7
|
+
import {
|
|
8
|
+
errorLogs
|
|
9
|
+
} from "./chunk-ZIBRVA3Y.js";
|
|
10
|
+
|
|
11
|
+
// src/core/observability/error-tracker.ts
|
|
12
|
+
import { eq, and, gte, lte, desc } from "drizzle-orm";
|
|
13
|
+
async function trackError(error) {
|
|
14
|
+
metric.error(error.source);
|
|
15
|
+
console.error(`[${error.source.toUpperCase()}] ${error.errorType}: ${error.message}`);
|
|
16
|
+
if (error.stack) {
|
|
17
|
+
console.error(error.stack);
|
|
18
|
+
}
|
|
19
|
+
const [logged] = await db.insert(errorLogs).values({
|
|
20
|
+
source: error.source,
|
|
21
|
+
errorType: error.errorType,
|
|
22
|
+
errorCode: error.errorCode,
|
|
23
|
+
message: error.message,
|
|
24
|
+
stack: error.stack,
|
|
25
|
+
context: error.context,
|
|
26
|
+
userId: error.userId,
|
|
27
|
+
conversationId: error.conversationId
|
|
28
|
+
}).returning();
|
|
29
|
+
return logged.id;
|
|
30
|
+
}
|
|
31
|
+
function captureException(err, source, context, userId) {
|
|
32
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
33
|
+
return trackError({
|
|
34
|
+
source,
|
|
35
|
+
errorType: error.constructor.name,
|
|
36
|
+
message: error.message,
|
|
37
|
+
stack: error.stack,
|
|
38
|
+
context,
|
|
39
|
+
userId
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function withErrorTracking(fn, source, getContext) {
|
|
43
|
+
return (async (...args) => {
|
|
44
|
+
try {
|
|
45
|
+
return await fn(...args);
|
|
46
|
+
} catch (err) {
|
|
47
|
+
const context = getContext ? getContext(...args) : void 0;
|
|
48
|
+
await captureException(err, source, context);
|
|
49
|
+
throw err;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async function queryErrors(query = {}) {
|
|
54
|
+
const {
|
|
55
|
+
source,
|
|
56
|
+
errorType,
|
|
57
|
+
startDate,
|
|
58
|
+
endDate,
|
|
59
|
+
userId,
|
|
60
|
+
resolved,
|
|
61
|
+
limit = 100
|
|
62
|
+
} = query;
|
|
63
|
+
const conditions = [];
|
|
64
|
+
if (source) {
|
|
65
|
+
conditions.push(eq(errorLogs.source, source));
|
|
66
|
+
}
|
|
67
|
+
if (errorType) {
|
|
68
|
+
conditions.push(eq(errorLogs.errorType, errorType));
|
|
69
|
+
}
|
|
70
|
+
if (startDate) {
|
|
71
|
+
conditions.push(gte(errorLogs.createdAt, startDate));
|
|
72
|
+
}
|
|
73
|
+
if (endDate) {
|
|
74
|
+
conditions.push(lte(errorLogs.createdAt, endDate));
|
|
75
|
+
}
|
|
76
|
+
if (userId) {
|
|
77
|
+
conditions.push(eq(errorLogs.userId, userId));
|
|
78
|
+
}
|
|
79
|
+
if (resolved !== void 0) {
|
|
80
|
+
conditions.push(eq(errorLogs.resolved, resolved));
|
|
81
|
+
}
|
|
82
|
+
let q = db.select().from(errorLogs);
|
|
83
|
+
if (conditions.length > 0) {
|
|
84
|
+
q = q.where(and(...conditions));
|
|
85
|
+
}
|
|
86
|
+
return q.orderBy(desc(errorLogs.createdAt)).limit(limit);
|
|
87
|
+
}
|
|
88
|
+
async function getRecentErrors(hours = 24, source) {
|
|
89
|
+
const since = new Date(Date.now() - hours * 60 * 60 * 1e3);
|
|
90
|
+
const conditions = [gte(errorLogs.createdAt, since)];
|
|
91
|
+
if (source) {
|
|
92
|
+
conditions.push(eq(errorLogs.source, source));
|
|
93
|
+
}
|
|
94
|
+
return db.select().from(errorLogs).where(and(...conditions)).orderBy(desc(errorLogs.createdAt)).limit(100);
|
|
95
|
+
}
|
|
96
|
+
async function getErrorStats(startDate, endDate) {
|
|
97
|
+
const errors = await db.select().from(errorLogs).where(
|
|
98
|
+
and(
|
|
99
|
+
gte(errorLogs.createdAt, startDate),
|
|
100
|
+
lte(errorLogs.createdAt, endDate)
|
|
101
|
+
)
|
|
102
|
+
);
|
|
103
|
+
const stats = {};
|
|
104
|
+
for (const error of errors) {
|
|
105
|
+
if (!stats[error.errorType]) {
|
|
106
|
+
stats[error.errorType] = { count: 0, sources: {} };
|
|
107
|
+
}
|
|
108
|
+
stats[error.errorType].count++;
|
|
109
|
+
stats[error.errorType].sources[error.source] = (stats[error.errorType].sources[error.source] || 0) + 1;
|
|
110
|
+
}
|
|
111
|
+
return stats;
|
|
112
|
+
}
|
|
113
|
+
async function markErrorResolved(errorId) {
|
|
114
|
+
const [updated] = await db.update(errorLogs).set({ resolved: true }).where(eq(errorLogs.id, errorId)).returning();
|
|
115
|
+
return !!updated;
|
|
116
|
+
}
|
|
117
|
+
async function getUnresolvedErrors() {
|
|
118
|
+
return db.select().from(errorLogs).where(eq(errorLogs.resolved, false)).orderBy(desc(errorLogs.createdAt)).limit(100);
|
|
119
|
+
}
|
|
120
|
+
async function getSimilarErrors(errorType, message, limit = 10) {
|
|
121
|
+
return db.select().from(errorLogs).where(eq(errorLogs.errorType, errorType)).orderBy(desc(errorLogs.createdAt)).limit(limit);
|
|
122
|
+
}
|
|
123
|
+
async function cleanupOldErrors(daysToKeep = 90) {
|
|
124
|
+
const cutoff = new Date(Date.now() - daysToKeep * 24 * 60 * 60 * 1e3);
|
|
125
|
+
await db.delete(errorLogs).where(and(lte(errorLogs.createdAt, cutoff), eq(errorLogs.resolved, true)));
|
|
126
|
+
return 0;
|
|
127
|
+
}
|
|
128
|
+
var errorContext = {
|
|
129
|
+
tool: (toolName, input) => ({
|
|
130
|
+
toolName,
|
|
131
|
+
input
|
|
132
|
+
}),
|
|
133
|
+
api: (endpoint, method, statusCode) => ({
|
|
134
|
+
endpoint,
|
|
135
|
+
method,
|
|
136
|
+
statusCode
|
|
137
|
+
}),
|
|
138
|
+
telegram: (chatId, messageType) => ({
|
|
139
|
+
chatId: String(chatId),
|
|
140
|
+
messageType
|
|
141
|
+
}),
|
|
142
|
+
agent: (agentId, agentType, step) => ({
|
|
143
|
+
agentId,
|
|
144
|
+
agentType,
|
|
145
|
+
step
|
|
146
|
+
})
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
export {
|
|
150
|
+
trackError,
|
|
151
|
+
captureException,
|
|
152
|
+
withErrorTracking,
|
|
153
|
+
queryErrors,
|
|
154
|
+
getRecentErrors,
|
|
155
|
+
getErrorStats,
|
|
156
|
+
markErrorResolved,
|
|
157
|
+
getUnresolvedErrors,
|
|
158
|
+
getSimilarErrors,
|
|
159
|
+
cleanupOldErrors,
|
|
160
|
+
errorContext
|
|
161
|
+
};
|
|
162
|
+
//# sourceMappingURL=chunk-TKBVW7ZJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/observability/error-tracker.ts"],"sourcesContent":["import { db } from \"../../db\";\nimport { errorLogs, NewErrorLog } from \"../../db/schema\";\nimport { eq, and, gte, lte, desc, isNull } from \"drizzle-orm\";\nimport { metric } from \"./metrics\";\n\nexport type ErrorSource =\n | \"brain\"\n | \"tool\"\n | \"telegram\"\n | \"api\"\n | \"scheduler\"\n | \"memory\"\n | \"agent\"\n | \"security\"\n | \"unknown\";\n\nexport interface TrackedError {\n source: ErrorSource;\n errorType: string;\n errorCode?: string;\n message: string;\n stack?: string;\n context?: Record<string, unknown>;\n userId?: string;\n conversationId?: string;\n}\n\nexport async function trackError(error: TrackedError): Promise<string> {\n // Record metric\n metric.error(error.source);\n\n // Log to console\n console.error(`[${error.source.toUpperCase()}] ${error.errorType}: ${error.message}`);\n if (error.stack) {\n console.error(error.stack);\n }\n\n // Store in database\n const [logged] = await db\n .insert(errorLogs)\n .values({\n source: error.source,\n errorType: error.errorType,\n errorCode: error.errorCode,\n message: error.message,\n stack: error.stack,\n context: error.context,\n userId: error.userId,\n conversationId: error.conversationId,\n })\n .returning();\n\n return logged.id;\n}\n\n// Convenience function to track errors from catch blocks\nexport function captureException(\n err: unknown,\n source: ErrorSource,\n context?: Record<string, unknown>,\n userId?: string\n): Promise<string> {\n const error = err instanceof Error ? err : new Error(String(err));\n\n return trackError({\n source,\n errorType: error.constructor.name,\n message: error.message,\n stack: error.stack,\n context,\n userId,\n });\n}\n\n// Wrapper to capture errors from async functions\nexport function withErrorTracking<T extends (...args: unknown[]) => Promise<unknown>>(\n fn: T,\n source: ErrorSource,\n getContext?: (...args: Parameters<T>) => Record<string, unknown>\n): T {\n return (async (...args: Parameters<T>) => {\n try {\n return await fn(...args);\n } catch (err) {\n const context = getContext ? getContext(...args) : undefined;\n await captureException(err, source, context);\n throw err;\n }\n }) as T;\n}\n\nexport interface ErrorQuery {\n source?: ErrorSource;\n errorType?: string;\n startDate?: Date;\n endDate?: Date;\n userId?: string;\n resolved?: boolean;\n limit?: number;\n}\n\nexport async function queryErrors(query: ErrorQuery = {}) {\n const {\n source,\n errorType,\n startDate,\n endDate,\n userId,\n resolved,\n limit = 100,\n } = query;\n\n const conditions = [];\n\n if (source) {\n conditions.push(eq(errorLogs.source, source));\n }\n\n if (errorType) {\n conditions.push(eq(errorLogs.errorType, errorType));\n }\n\n if (startDate) {\n conditions.push(gte(errorLogs.createdAt, startDate));\n }\n\n if (endDate) {\n conditions.push(lte(errorLogs.createdAt, endDate));\n }\n\n if (userId) {\n conditions.push(eq(errorLogs.userId, userId));\n }\n\n if (resolved !== undefined) {\n conditions.push(eq(errorLogs.resolved, resolved));\n }\n\n let q = db.select().from(errorLogs);\n\n if (conditions.length > 0) {\n q = q.where(and(...conditions)) as typeof q;\n }\n\n return q.orderBy(desc(errorLogs.createdAt)).limit(limit);\n}\n\nexport async function getRecentErrors(\n hours: number = 24,\n source?: ErrorSource\n): Promise<typeof errorLogs.$inferSelect[]> {\n const since = new Date(Date.now() - hours * 60 * 60 * 1000);\n\n const conditions = [gte(errorLogs.createdAt, since)];\n\n if (source) {\n conditions.push(eq(errorLogs.source, source));\n }\n\n return db\n .select()\n .from(errorLogs)\n .where(and(...conditions))\n .orderBy(desc(errorLogs.createdAt))\n .limit(100);\n}\n\nexport async function getErrorStats(\n startDate: Date,\n endDate: Date\n): Promise<Record<string, { count: number; sources: Record<string, number> }>> {\n const errors = await db\n .select()\n .from(errorLogs)\n .where(\n and(\n gte(errorLogs.createdAt, startDate),\n lte(errorLogs.createdAt, endDate)\n )\n );\n\n const stats: Record<string, { count: number; sources: Record<string, number> }> = {};\n\n for (const error of errors) {\n if (!stats[error.errorType]) {\n stats[error.errorType] = { count: 0, sources: {} };\n }\n stats[error.errorType].count++;\n stats[error.errorType].sources[error.source] =\n (stats[error.errorType].sources[error.source] || 0) + 1;\n }\n\n return stats;\n}\n\nexport async function markErrorResolved(errorId: string): Promise<boolean> {\n const [updated] = await db\n .update(errorLogs)\n .set({ resolved: true })\n .where(eq(errorLogs.id, errorId))\n .returning();\n\n return !!updated;\n}\n\nexport async function getUnresolvedErrors(): Promise<typeof errorLogs.$inferSelect[]> {\n return db\n .select()\n .from(errorLogs)\n .where(eq(errorLogs.resolved, false))\n .orderBy(desc(errorLogs.createdAt))\n .limit(100);\n}\n\n// Error grouping for similar errors\nexport async function getSimilarErrors(\n errorType: string,\n message: string,\n limit: number = 10\n): Promise<typeof errorLogs.$inferSelect[]> {\n return db\n .select()\n .from(errorLogs)\n .where(eq(errorLogs.errorType, errorType))\n .orderBy(desc(errorLogs.createdAt))\n .limit(limit);\n}\n\n// Cleanup old errors\nexport async function cleanupOldErrors(daysToKeep: number = 90): Promise<number> {\n const cutoff = new Date(Date.now() - daysToKeep * 24 * 60 * 60 * 1000);\n await db\n .delete(errorLogs)\n .where(and(lte(errorLogs.createdAt, cutoff), eq(errorLogs.resolved, true)));\n return 0;\n}\n\n// Error context helpers\nexport const errorContext = {\n tool: (toolName: string, input: Record<string, unknown>) => ({\n toolName,\n input,\n }),\n\n api: (endpoint: string, method: string, statusCode?: number) => ({\n endpoint,\n method,\n statusCode,\n }),\n\n telegram: (chatId: string | number, messageType: string) => ({\n chatId: String(chatId),\n messageType,\n }),\n\n agent: (agentId: string, agentType: string, step?: number) => ({\n agentId,\n agentType,\n step,\n }),\n};\n"],"mappings":";;;;;;;;;;;AAEA,SAAS,IAAI,KAAK,KAAK,KAAK,YAAoB;AAyBhD,eAAsB,WAAW,OAAsC;AAErE,SAAO,MAAM,MAAM,MAAM;AAGzB,UAAQ,MAAM,IAAI,MAAM,OAAO,YAAY,CAAC,KAAK,MAAM,SAAS,KAAK,MAAM,OAAO,EAAE;AACpF,MAAI,MAAM,OAAO;AACf,YAAQ,MAAM,MAAM,KAAK;AAAA,EAC3B;AAGA,QAAM,CAAC,MAAM,IAAI,MAAM,GACpB,OAAO,SAAS,EAChB,OAAO;AAAA,IACN,QAAQ,MAAM;AAAA,IACd,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM;AAAA,IACjB,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,IACd,gBAAgB,MAAM;AAAA,EACxB,CAAC,EACA,UAAU;AAEb,SAAO,OAAO;AAChB;AAGO,SAAS,iBACd,KACA,QACA,SACA,QACiB;AACjB,QAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAEhE,SAAO,WAAW;AAAA,IAChB;AAAA,IACA,WAAW,MAAM,YAAY;AAAA,IAC7B,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAGO,SAAS,kBACd,IACA,QACA,YACG;AACH,UAAQ,UAAU,SAAwB;AACxC,QAAI;AACF,aAAO,MAAM,GAAG,GAAG,IAAI;AAAA,IACzB,SAAS,KAAK;AACZ,YAAM,UAAU,aAAa,WAAW,GAAG,IAAI,IAAI;AACnD,YAAM,iBAAiB,KAAK,QAAQ,OAAO;AAC3C,YAAM;AAAA,IACR;AAAA,EACF;AACF;AAYA,eAAsB,YAAY,QAAoB,CAAC,GAAG;AACxD,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,EACV,IAAI;AAEJ,QAAM,aAAa,CAAC;AAEpB,MAAI,QAAQ;AACV,eAAW,KAAK,GAAG,UAAU,QAAQ,MAAM,CAAC;AAAA,EAC9C;AAEA,MAAI,WAAW;AACb,eAAW,KAAK,GAAG,UAAU,WAAW,SAAS,CAAC;AAAA,EACpD;AAEA,MAAI,WAAW;AACb,eAAW,KAAK,IAAI,UAAU,WAAW,SAAS,CAAC;AAAA,EACrD;AAEA,MAAI,SAAS;AACX,eAAW,KAAK,IAAI,UAAU,WAAW,OAAO,CAAC;AAAA,EACnD;AAEA,MAAI,QAAQ;AACV,eAAW,KAAK,GAAG,UAAU,QAAQ,MAAM,CAAC;AAAA,EAC9C;AAEA,MAAI,aAAa,QAAW;AAC1B,eAAW,KAAK,GAAG,UAAU,UAAU,QAAQ,CAAC;AAAA,EAClD;AAEA,MAAI,IAAI,GAAG,OAAO,EAAE,KAAK,SAAS;AAElC,MAAI,WAAW,SAAS,GAAG;AACzB,QAAI,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC;AAAA,EAChC;AAEA,SAAO,EAAE,QAAQ,KAAK,UAAU,SAAS,CAAC,EAAE,MAAM,KAAK;AACzD;AAEA,eAAsB,gBACpB,QAAgB,IAChB,QAC0C;AAC1C,QAAM,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,QAAQ,KAAK,KAAK,GAAI;AAE1D,QAAM,aAAa,CAAC,IAAI,UAAU,WAAW,KAAK,CAAC;AAEnD,MAAI,QAAQ;AACV,eAAW,KAAK,GAAG,UAAU,QAAQ,MAAM,CAAC;AAAA,EAC9C;AAEA,SAAO,GACJ,OAAO,EACP,KAAK,SAAS,EACd,MAAM,IAAI,GAAG,UAAU,CAAC,EACxB,QAAQ,KAAK,UAAU,SAAS,CAAC,EACjC,MAAM,GAAG;AACd;AAEA,eAAsB,cACpB,WACA,SAC6E;AAC7E,QAAM,SAAS,MAAM,GAClB,OAAO,EACP,KAAK,SAAS,EACd;AAAA,IACC;AAAA,MACE,IAAI,UAAU,WAAW,SAAS;AAAA,MAClC,IAAI,UAAU,WAAW,OAAO;AAAA,IAClC;AAAA,EACF;AAEF,QAAM,QAA4E,CAAC;AAEnF,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,MAAM,MAAM,SAAS,GAAG;AAC3B,YAAM,MAAM,SAAS,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC,EAAE;AAAA,IACnD;AACA,UAAM,MAAM,SAAS,EAAE;AACvB,UAAM,MAAM,SAAS,EAAE,QAAQ,MAAM,MAAM,KACxC,MAAM,MAAM,SAAS,EAAE,QAAQ,MAAM,MAAM,KAAK,KAAK;AAAA,EAC1D;AAEA,SAAO;AACT;AAEA,eAAsB,kBAAkB,SAAmC;AACzE,QAAM,CAAC,OAAO,IAAI,MAAM,GACrB,OAAO,SAAS,EAChB,IAAI,EAAE,UAAU,KAAK,CAAC,EACtB,MAAM,GAAG,UAAU,IAAI,OAAO,CAAC,EAC/B,UAAU;AAEb,SAAO,CAAC,CAAC;AACX;AAEA,eAAsB,sBAAgE;AACpF,SAAO,GACJ,OAAO,EACP,KAAK,SAAS,EACd,MAAM,GAAG,UAAU,UAAU,KAAK,CAAC,EACnC,QAAQ,KAAK,UAAU,SAAS,CAAC,EACjC,MAAM,GAAG;AACd;AAGA,eAAsB,iBACpB,WACA,SACA,QAAgB,IAC0B;AAC1C,SAAO,GACJ,OAAO,EACP,KAAK,SAAS,EACd,MAAM,GAAG,UAAU,WAAW,SAAS,CAAC,EACxC,QAAQ,KAAK,UAAU,SAAS,CAAC,EACjC,MAAM,KAAK;AAChB;AAGA,eAAsB,iBAAiB,aAAqB,IAAqB;AAC/E,QAAM,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,aAAa,KAAK,KAAK,KAAK,GAAI;AACrE,QAAM,GACH,OAAO,SAAS,EAChB,MAAM,IAAI,IAAI,UAAU,WAAW,MAAM,GAAG,GAAG,UAAU,UAAU,IAAI,CAAC,CAAC;AAC5E,SAAO;AACT;AAGO,IAAM,eAAe;AAAA,EAC1B,MAAM,CAAC,UAAkB,WAAoC;AAAA,IAC3D;AAAA,IACA;AAAA,EACF;AAAA,EAEA,KAAK,CAAC,UAAkB,QAAgB,gBAAyB;AAAA,IAC/D;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,UAAU,CAAC,QAAyB,iBAAyB;AAAA,IAC3D,QAAQ,OAAO,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,OAAO,CAAC,SAAiB,WAAmB,UAAmB;AAAA,IAC7D;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
getNotionClient,
|
|
3
3
|
getRootPageId,
|
|
4
4
|
init_client
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-C6PELIHS.js";
|
|
6
6
|
|
|
7
7
|
// src/integrations/notion/databases.ts
|
|
8
8
|
init_client();
|
|
@@ -194,7 +194,7 @@ async function createDatabaseEntry(options) {
|
|
|
194
194
|
params.cover = { type: "external", external: { url: options.cover } };
|
|
195
195
|
}
|
|
196
196
|
if (options.content) {
|
|
197
|
-
const { markdownToBlocks, createBlockObject } = await import("./blocks-
|
|
197
|
+
const { markdownToBlocks, createBlockObject } = await import("./blocks-YOWOESDD.js");
|
|
198
198
|
const blocks = markdownToBlocks(options.content);
|
|
199
199
|
params.children = blocks.map(createBlockObject);
|
|
200
200
|
}
|
|
@@ -454,4 +454,4 @@ export {
|
|
|
454
454
|
archiveDatabaseEntry,
|
|
455
455
|
createDatabase
|
|
456
456
|
};
|
|
457
|
-
//# sourceMappingURL=chunk-
|
|
457
|
+
//# sourceMappingURL=chunk-U2X2J3FI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/integrations/notion/databases.ts"],"sourcesContent":["import { getNotionClient, getRootPageId } from \"./client\";\r\n\r\n/**\r\n * Database operations for Notion\r\n * Handles querying databases and creating entries\r\n */\r\n\r\n// Type definitions for API responses\r\ninterface PageObjectResponse {\r\n id: string;\r\n url: string;\r\n created_time: string;\r\n last_edited_time: string;\r\n archived: boolean;\r\n properties: Record<string, any>;\r\n}\r\n\r\ninterface QueryDatabaseParams {\r\n database_id: string;\r\n filter?: any;\r\n sorts?: any[];\r\n start_cursor?: string;\r\n page_size?: number;\r\n}\r\n\r\nexport type PropertyType =\r\n | \"title\"\r\n | \"rich_text\"\r\n | \"number\"\r\n | \"select\"\r\n | \"multi_select\"\r\n | \"date\"\r\n | \"checkbox\"\r\n | \"url\"\r\n | \"email\"\r\n | \"phone_number\"\r\n | \"formula\"\r\n | \"relation\"\r\n | \"rollup\"\r\n | \"created_time\"\r\n | \"created_by\"\r\n | \"last_edited_time\"\r\n | \"last_edited_by\"\r\n | \"files\"\r\n | \"status\";\r\n\r\nexport type FilterOperator =\r\n | \"equals\"\r\n | \"does_not_equal\"\r\n | \"contains\"\r\n | \"does_not_contain\"\r\n | \"starts_with\"\r\n | \"ends_with\"\r\n | \"is_empty\"\r\n | \"is_not_empty\"\r\n | \"greater_than\"\r\n | \"less_than\"\r\n | \"greater_than_or_equal_to\"\r\n | \"less_than_or_equal_to\"\r\n | \"before\"\r\n | \"after\"\r\n | \"on_or_before\"\r\n | \"on_or_after\"\r\n | \"past_week\"\r\n | \"past_month\"\r\n | \"past_year\"\r\n | \"next_week\"\r\n | \"next_month\"\r\n | \"next_year\";\r\n\r\nexport interface FilterCondition {\r\n property: string;\r\n type?: PropertyType;\r\n operator: FilterOperator;\r\n value?: string | number | boolean | Date;\r\n}\r\n\r\nexport interface SortOption {\r\n property?: string;\r\n timestamp?: \"created_time\" | \"last_edited_time\";\r\n direction: \"ascending\" | \"descending\";\r\n}\r\n\r\nexport interface QueryOptions {\r\n filter?: FilterCondition | FilterCondition[];\r\n filterOperator?: \"and\" | \"or\";\r\n sorts?: SortOption[];\r\n startCursor?: string;\r\n pageSize?: number;\r\n}\r\n\r\nexport interface DatabaseEntry {\r\n id: string;\r\n url: string;\r\n createdTime: string;\r\n lastEditedTime: string;\r\n archived: boolean;\r\n properties: Record<string, any>;\r\n}\r\n\r\nexport interface DatabaseInfo {\r\n id: string;\r\n title: string;\r\n description: string;\r\n url: string;\r\n createdTime: string;\r\n lastEditedTime: string;\r\n isInline: boolean;\r\n properties: Record<string, { type: PropertyType; name: string }>;\r\n}\r\n\r\nexport interface CreateEntryOptions {\r\n databaseId: string;\r\n properties: Record<string, any>;\r\n content?: string;\r\n icon?: string;\r\n cover?: string;\r\n}\r\n\r\n/**\r\n * Convert filter condition to Notion API filter format\r\n */\r\nfunction buildFilter(condition: FilterCondition): any {\r\n const { property, type, operator, value } = condition;\r\n\r\n // Determine property type from operator if not specified\r\n let propertyType = type;\r\n if (!propertyType) {\r\n if (\r\n [\r\n \"contains\",\r\n \"does_not_contain\",\r\n \"starts_with\",\r\n \"ends_with\",\r\n \"equals\",\r\n \"does_not_equal\",\r\n ].includes(operator)\r\n ) {\r\n propertyType = \"rich_text\";\r\n } else if (\r\n [\r\n \"greater_than\",\r\n \"less_than\",\r\n \"greater_than_or_equal_to\",\r\n \"less_than_or_equal_to\",\r\n ].includes(operator)\r\n ) {\r\n propertyType = \"number\";\r\n } else if (\r\n [\r\n \"before\",\r\n \"after\",\r\n \"on_or_before\",\r\n \"on_or_after\",\r\n \"past_week\",\r\n \"past_month\",\r\n \"past_year\",\r\n \"next_week\",\r\n \"next_month\",\r\n \"next_year\",\r\n ].includes(operator)\r\n ) {\r\n propertyType = \"date\";\r\n } else if ([\"is_empty\", \"is_not_empty\"].includes(operator)) {\r\n propertyType = \"rich_text\";\r\n }\r\n }\r\n\r\n const filter: any = { property };\r\n\r\n switch (propertyType) {\r\n case \"title\":\r\n case \"rich_text\":\r\n filter[propertyType || \"rich_text\"] = { [operator]: value ?? true };\r\n break;\r\n\r\n case \"number\":\r\n filter.number = { [operator]: value };\r\n break;\r\n\r\n case \"checkbox\":\r\n filter.checkbox = { [operator]: value };\r\n break;\r\n\r\n case \"select\":\r\n filter.select = { [operator]: value };\r\n break;\r\n\r\n case \"multi_select\":\r\n filter.multi_select = { [operator]: value };\r\n break;\r\n\r\n case \"date\":\r\n if (\r\n [\r\n \"past_week\",\r\n \"past_month\",\r\n \"past_year\",\r\n \"next_week\",\r\n \"next_month\",\r\n \"next_year\",\r\n ].includes(operator)\r\n ) {\r\n filter.date = { [operator]: {} };\r\n } else {\r\n filter.date = {\r\n [operator]: value instanceof Date ? value.toISOString() : value,\r\n };\r\n }\r\n break;\r\n\r\n case \"url\":\r\n case \"email\":\r\n case \"phone_number\":\r\n filter[propertyType] = { [operator]: value };\r\n break;\r\n\r\n case \"status\":\r\n filter.status = { [operator]: value };\r\n break;\r\n\r\n default:\r\n filter.rich_text = { [operator]: value ?? true };\r\n }\r\n\r\n return filter;\r\n}\r\n\r\n/**\r\n * Query a Notion database\r\n */\r\nexport async function queryDatabase(\r\n databaseId: string,\r\n options: QueryOptions = {}\r\n): Promise<{\r\n results: DatabaseEntry[];\r\n hasMore: boolean;\r\n nextCursor: string | null;\r\n}> {\r\n const notion = getNotionClient();\r\n\r\n const params: QueryDatabaseParams = {\r\n database_id: databaseId,\r\n };\r\n\r\n // Build filter\r\n if (options.filter) {\r\n if (Array.isArray(options.filter)) {\r\n if (options.filter.length === 1) {\r\n params.filter = buildFilter(options.filter[0]);\r\n } else {\r\n const filters = options.filter.map(buildFilter);\r\n params.filter =\r\n options.filterOperator === \"or\"\r\n ? { or: filters as any }\r\n : { and: filters as any };\r\n }\r\n } else {\r\n params.filter = buildFilter(options.filter);\r\n }\r\n }\r\n\r\n // Build sorts\r\n if (options.sorts) {\r\n params.sorts = options.sorts.map((sort) => {\r\n if (sort.timestamp) {\r\n return { timestamp: sort.timestamp, direction: sort.direction };\r\n }\r\n return { property: sort.property!, direction: sort.direction };\r\n });\r\n }\r\n\r\n // Pagination\r\n if (options.startCursor) {\r\n params.start_cursor = options.startCursor;\r\n }\r\n if (options.pageSize) {\r\n params.page_size = options.pageSize;\r\n }\r\n\r\n // Use dataSources.query for newer SDK versions, fallback to databases.query\r\n const response = await ((notion as any).dataSources?.query?.(params) ??\r\n (notion as any).databases.query(params));\r\n\r\n const results: DatabaseEntry[] = response.results.map((page: any) => {\r\n const p = page as PageObjectResponse;\r\n return {\r\n id: p.id,\r\n url: p.url,\r\n createdTime: p.created_time,\r\n lastEditedTime: p.last_edited_time,\r\n archived: p.archived,\r\n properties: extractPropertyValues(p.properties),\r\n };\r\n });\r\n\r\n return {\r\n results,\r\n hasMore: response.has_more,\r\n nextCursor: response.next_cursor,\r\n };\r\n}\r\n\r\n/**\r\n * Query all results from a database (handles pagination)\r\n */\r\nexport async function queryAllDatabaseEntries(\r\n databaseId: string,\r\n options: Omit<QueryOptions, \"startCursor\" | \"pageSize\"> = {}\r\n): Promise<DatabaseEntry[]> {\r\n const allResults: DatabaseEntry[] = [];\r\n let cursor: string | undefined;\r\n\r\n do {\r\n const response = await queryDatabase(databaseId, {\r\n ...options,\r\n startCursor: cursor,\r\n pageSize: 100,\r\n });\r\n allResults.push(...response.results);\r\n cursor = response.nextCursor ?? undefined;\r\n } while (cursor);\r\n\r\n return allResults;\r\n}\r\n\r\n/**\r\n * Get database information\r\n */\r\nexport async function getDatabase(databaseId: string): Promise<DatabaseInfo> {\r\n const notion = getNotionClient();\r\n\r\n const response = await notion.databases.retrieve({\r\n database_id: databaseId,\r\n }) as any;\r\n\r\n const properties: Record<string, { type: PropertyType; name: string }> = {};\r\n for (const [name, prop] of Object.entries(response.properties || {})) {\r\n const p = prop as any;\r\n properties[name] = {\r\n type: p.type as PropertyType,\r\n name: p.name,\r\n };\r\n }\r\n\r\n return {\r\n id: response.id,\r\n title: response.title.map((t: any) => t.plain_text).join(\"\"),\r\n description: response.description.map((t: any) => t.plain_text).join(\"\"),\r\n url: response.url,\r\n createdTime: response.created_time,\r\n lastEditedTime: response.last_edited_time,\r\n isInline: response.is_inline,\r\n properties,\r\n };\r\n}\r\n\r\n/**\r\n * Create an entry in a database\r\n */\r\nexport async function createDatabaseEntry(\r\n options: CreateEntryOptions\r\n): Promise<DatabaseEntry> {\r\n const notion = getNotionClient();\r\n\r\n const params: any = {\r\n parent: { database_id: options.databaseId },\r\n properties: buildDatabaseProperties(options.properties),\r\n };\r\n\r\n // Add icon\r\n if (options.icon) {\r\n if (options.icon.startsWith(\"http\")) {\r\n params.icon = { type: \"external\", external: { url: options.icon } };\r\n } else {\r\n params.icon = { type: \"emoji\", emoji: options.icon };\r\n }\r\n }\r\n\r\n // Add cover\r\n if (options.cover) {\r\n params.cover = { type: \"external\", external: { url: options.cover } };\r\n }\r\n\r\n // Add content as children\r\n if (options.content) {\r\n const { markdownToBlocks, createBlockObject } = await import(\"./blocks\");\r\n const blocks = markdownToBlocks(options.content);\r\n params.children = blocks.map(createBlockObject);\r\n }\r\n\r\n const response = (await notion.pages.create(params)) as PageObjectResponse;\r\n\r\n return {\r\n id: response.id,\r\n url: response.url,\r\n createdTime: response.created_time,\r\n lastEditedTime: response.last_edited_time,\r\n archived: response.archived,\r\n properties: extractPropertyValues(response.properties),\r\n };\r\n}\r\n\r\n/**\r\n * Update a database entry\r\n */\r\nexport async function updateDatabaseEntry(\r\n pageId: string,\r\n properties: Record<string, any>\r\n): Promise<DatabaseEntry> {\r\n const notion = getNotionClient();\r\n\r\n const response = (await notion.pages.update({\r\n page_id: pageId,\r\n properties: buildDatabaseProperties(properties),\r\n })) as PageObjectResponse;\r\n\r\n return {\r\n id: response.id,\r\n url: response.url,\r\n createdTime: response.created_time,\r\n lastEditedTime: response.last_edited_time,\r\n archived: response.archived,\r\n properties: extractPropertyValues(response.properties),\r\n };\r\n}\r\n\r\n/**\r\n * Archive a database entry\r\n */\r\nexport async function archiveDatabaseEntry(pageId: string): Promise<void> {\r\n const notion = getNotionClient();\r\n\r\n await notion.pages.update({\r\n page_id: pageId,\r\n archived: true,\r\n });\r\n}\r\n\r\n/**\r\n * Create a new database\r\n */\r\nexport async function createDatabase(options: {\r\n parentPageId?: string;\r\n title: string;\r\n properties: Record<string, { type: PropertyType; options?: any }>;\r\n isInline?: boolean;\r\n}): Promise<DatabaseInfo> {\r\n const notion = getNotionClient();\r\n\r\n const parentId = options.parentPageId || getRootPageId();\r\n if (!parentId) {\r\n throw new Error(\"No parent page specified and no root page configured\");\r\n }\r\n\r\n const properties: Record<string, any> = {};\r\n\r\n for (const [name, config] of Object.entries(options.properties)) {\r\n properties[name] = buildPropertySchema(config.type, config.options);\r\n }\r\n\r\n // Ensure there's a title property\r\n if (!Object.values(properties).some((p) => p.type === \"title\")) {\r\n properties[\"Name\"] = { title: {} };\r\n }\r\n\r\n const response = (await notion.databases.create({\r\n parent: { type: \"page_id\", page_id: parentId },\r\n title: [{ text: { content: options.title } }],\r\n properties,\r\n is_inline: options.isInline ?? false,\r\n } as any)) as any;\r\n\r\n const resultProperties: Record<string, { type: PropertyType; name: string }> =\r\n {};\r\n for (const [name, prop] of Object.entries(response.properties || {})) {\r\n const p = prop as any;\r\n resultProperties[name] = {\r\n type: p.type as PropertyType,\r\n name: p.name,\r\n };\r\n }\r\n\r\n return {\r\n id: response.id,\r\n title: response.title.map((t: any) => t.plain_text).join(\"\"),\r\n description: \"\",\r\n url: response.url,\r\n createdTime: response.created_time,\r\n lastEditedTime: response.last_edited_time,\r\n isInline: response.is_inline,\r\n properties: resultProperties,\r\n };\r\n}\r\n\r\n/**\r\n * Build property schema for database creation\r\n */\r\nfunction buildPropertySchema(\r\n type: PropertyType,\r\n options?: any\r\n): Record<string, any> {\r\n switch (type) {\r\n case \"title\":\r\n return { title: {} };\r\n\r\n case \"rich_text\":\r\n return { rich_text: {} };\r\n\r\n case \"number\":\r\n return { number: { format: options?.format || \"number\" } };\r\n\r\n case \"select\":\r\n return {\r\n select: {\r\n options: options?.options?.map((opt: string) => ({ name: opt })) || [],\r\n },\r\n };\r\n\r\n case \"multi_select\":\r\n return {\r\n multi_select: {\r\n options: options?.options?.map((opt: string) => ({ name: opt })) || [],\r\n },\r\n };\r\n\r\n case \"date\":\r\n return { date: {} };\r\n\r\n case \"checkbox\":\r\n return { checkbox: {} };\r\n\r\n case \"url\":\r\n return { url: {} };\r\n\r\n case \"email\":\r\n return { email: {} };\r\n\r\n case \"phone_number\":\r\n return { phone_number: {} };\r\n\r\n case \"status\":\r\n return {\r\n status: {\r\n options:\r\n options?.options?.map((opt: string) => ({ name: opt })) || [\r\n { name: \"Not started\" },\r\n { name: \"In progress\" },\r\n { name: \"Done\" },\r\n ],\r\n },\r\n };\r\n\r\n default:\r\n return { rich_text: {} };\r\n }\r\n}\r\n\r\n/**\r\n * Build database properties for entry creation/update\r\n */\r\nfunction buildDatabaseProperties(\r\n properties: Record<string, any>\r\n): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n\r\n for (const [key, value] of Object.entries(properties)) {\r\n if (value === undefined) continue;\r\n\r\n // Handle explicit type specification\r\n if (typeof value === \"object\" && value !== null && value._type) {\r\n const { _type, ...rest } = value;\r\n result[key] = buildTypedProperty(_type, rest);\r\n continue;\r\n }\r\n\r\n // Auto-detect type\r\n if (typeof value === \"string\") {\r\n // Check if it looks like a title property\r\n if (key.toLowerCase() === \"name\" || key.toLowerCase() === \"title\") {\r\n result[key] = { title: [{ text: { content: value } }] };\r\n } else if (value.startsWith(\"http://\") || value.startsWith(\"https://\")) {\r\n result[key] = { url: value };\r\n } else if (value.includes(\"@\") && value.includes(\".\")) {\r\n result[key] = { email: value };\r\n } else {\r\n result[key] = { rich_text: [{ text: { content: value } }] };\r\n }\r\n } else if (typeof value === \"number\") {\r\n result[key] = { number: value };\r\n } else if (typeof value === \"boolean\") {\r\n result[key] = { checkbox: value };\r\n } else if (value instanceof Date) {\r\n result[key] = { date: { start: value.toISOString() } };\r\n } else if (Array.isArray(value)) {\r\n // Multi-select\r\n result[key] = { multi_select: value.map((v) => ({ name: String(v) })) };\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Build typed property value\r\n */\r\nfunction buildTypedProperty(\r\n type: PropertyType,\r\n value: any\r\n): Record<string, any> {\r\n switch (type) {\r\n case \"title\":\r\n return { title: [{ text: { content: value.content || value } }] };\r\n\r\n case \"rich_text\":\r\n return { rich_text: [{ text: { content: value.content || value } }] };\r\n\r\n case \"number\":\r\n return { number: value.value ?? value };\r\n\r\n case \"select\":\r\n return { select: { name: value.name || value } };\r\n\r\n case \"multi_select\":\r\n const options = Array.isArray(value) ? value : value.options || [value];\r\n return { multi_select: options.map((v: any) => ({ name: v.name || v })) };\r\n\r\n case \"date\":\r\n return {\r\n date: {\r\n start:\r\n value.start instanceof Date\r\n ? value.start.toISOString()\r\n : value.start || value,\r\n end: value.end\r\n ? value.end instanceof Date\r\n ? value.end.toISOString()\r\n : value.end\r\n : undefined,\r\n },\r\n };\r\n\r\n case \"checkbox\":\r\n return { checkbox: value.checked ?? value };\r\n\r\n case \"url\":\r\n return { url: value.url || value };\r\n\r\n case \"email\":\r\n return { email: value.email || value };\r\n\r\n case \"phone_number\":\r\n return { phone_number: value.phone || value };\r\n\r\n case \"status\":\r\n return { status: { name: value.name || value } };\r\n\r\n default:\r\n return { rich_text: [{ text: { content: String(value) } }] };\r\n }\r\n}\r\n\r\n/**\r\n * Extract simplified property values from Notion response\r\n */\r\nfunction extractPropertyValues(\r\n properties: Record<string, any>\r\n): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n\r\n for (const [name, prop] of Object.entries(properties)) {\r\n switch (prop.type) {\r\n case \"title\":\r\n result[name] = prop.title?.map((t: any) => t.plain_text).join(\"\") || \"\";\r\n break;\r\n\r\n case \"rich_text\":\r\n result[name] =\r\n prop.rich_text?.map((t: any) => t.plain_text).join(\"\") || \"\";\r\n break;\r\n\r\n case \"number\":\r\n result[name] = prop.number;\r\n break;\r\n\r\n case \"select\":\r\n result[name] = prop.select?.name || null;\r\n break;\r\n\r\n case \"multi_select\":\r\n result[name] = prop.multi_select?.map((s: any) => s.name) || [];\r\n break;\r\n\r\n case \"date\":\r\n result[name] = prop.date\r\n ? { start: prop.date.start, end: prop.date.end }\r\n : null;\r\n break;\r\n\r\n case \"checkbox\":\r\n result[name] = prop.checkbox;\r\n break;\r\n\r\n case \"url\":\r\n result[name] = prop.url;\r\n break;\r\n\r\n case \"email\":\r\n result[name] = prop.email;\r\n break;\r\n\r\n case \"phone_number\":\r\n result[name] = prop.phone_number;\r\n break;\r\n\r\n case \"formula\":\r\n result[name] = prop.formula?.[prop.formula.type];\r\n break;\r\n\r\n case \"relation\":\r\n result[name] = prop.relation?.map((r: any) => r.id) || [];\r\n break;\r\n\r\n case \"rollup\":\r\n result[name] = prop.rollup?.[prop.rollup.type];\r\n break;\r\n\r\n case \"created_time\":\r\n result[name] = prop.created_time;\r\n break;\r\n\r\n case \"created_by\":\r\n result[name] = prop.created_by?.id;\r\n break;\r\n\r\n case \"last_edited_time\":\r\n result[name] = prop.last_edited_time;\r\n break;\r\n\r\n case \"last_edited_by\":\r\n result[name] = prop.last_edited_by?.id;\r\n break;\r\n\r\n case \"files\":\r\n result[name] =\r\n prop.files?.map((f: any) => f.file?.url || f.external?.url) || [];\r\n break;\r\n\r\n case \"status\":\r\n result[name] = prop.status?.name || null;\r\n break;\r\n\r\n default:\r\n result[name] = prop;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n"],"mappings":"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","names":[]}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
var __create = Object.create;
|
|
2
1
|
var __defProp = Object.defineProperty;
|
|
3
2
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
3
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
6
4
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
5
|
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
8
6
|
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
@@ -28,14 +26,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
28
26
|
}
|
|
29
27
|
return to;
|
|
30
28
|
};
|
|
31
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
32
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
33
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
34
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
35
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
36
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
37
|
-
mod
|
|
38
|
-
));
|
|
39
29
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
40
30
|
|
|
41
31
|
export {
|
|
@@ -43,7 +33,6 @@ export {
|
|
|
43
33
|
__esm,
|
|
44
34
|
__commonJS,
|
|
45
35
|
__export,
|
|
46
|
-
__toESM,
|
|
47
36
|
__toCommonJS
|
|
48
37
|
};
|
|
49
|
-
//# sourceMappingURL=chunk-
|
|
38
|
+
//# sourceMappingURL=chunk-UP2VWCW5.js.map
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
resolveEntity
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-2I5QHYG6.js";
|
|
4
4
|
import {
|
|
5
|
-
db
|
|
6
|
-
|
|
7
|
-
graphRelationships
|
|
8
|
-
} from "./chunk-XKYRH4FM.js";
|
|
5
|
+
db
|
|
6
|
+
} from "./chunk-5BTVJR7R.js";
|
|
9
7
|
import {
|
|
10
8
|
env
|
|
11
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-4KIHDIXZ.js";
|
|
10
|
+
import {
|
|
11
|
+
graphEntities,
|
|
12
|
+
graphRelationships
|
|
13
|
+
} from "./chunk-ZIBRVA3Y.js";
|
|
12
14
|
|
|
13
15
|
// src/core/intelligence/enrichment-pipeline.ts
|
|
14
16
|
import { eq as eq2, sql } from "drizzle-orm";
|
|
@@ -2438,4 +2440,4 @@ export {
|
|
|
2438
2440
|
enrichEntity,
|
|
2439
2441
|
batchEnrich
|
|
2440
2442
|
};
|
|
2441
|
-
//# sourceMappingURL=chunk-
|
|
2443
|
+
//# sourceMappingURL=chunk-V3OKHQUX.js.map
|