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
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
env
|
|
3
|
-
} from "./chunk-ZLZKF2PM.js";
|
|
4
1
|
import {
|
|
5
2
|
__export
|
|
6
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UP2VWCW5.js";
|
|
7
4
|
|
|
8
5
|
// src/db/schema.ts
|
|
9
6
|
var schema_exports = {};
|
|
@@ -23,6 +20,9 @@ __export(schema_exports, {
|
|
|
23
20
|
graphEntities: () => graphEntities,
|
|
24
21
|
graphRelationships: () => graphRelationships,
|
|
25
22
|
incidentTimeline: () => incidentTimeline,
|
|
23
|
+
m365AnalysisResults: () => m365AnalysisResults,
|
|
24
|
+
m365Connections: () => m365Connections,
|
|
25
|
+
m365OauthStates: () => m365OauthStates,
|
|
26
26
|
memories: () => memories,
|
|
27
27
|
messages: () => messages,
|
|
28
28
|
metrics: () => metrics,
|
|
@@ -625,41 +625,71 @@ var incidentTimeline = pgTable(
|
|
|
625
625
|
},
|
|
626
626
|
(table) => [index("incident_timeline_incident_idx").on(table.incidentId)]
|
|
627
627
|
);
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
import { drizzle } from "drizzle-orm/postgres-js";
|
|
631
|
-
import postgres from "postgres";
|
|
632
|
-
var _client = null;
|
|
633
|
-
var _db = null;
|
|
634
|
-
function getDb() {
|
|
635
|
-
if (!_db) {
|
|
636
|
-
_client = postgres(env.DATABASE_URL);
|
|
637
|
-
_db = drizzle(_client, { schema: schema_exports });
|
|
638
|
-
}
|
|
639
|
-
return _db;
|
|
640
|
-
}
|
|
641
|
-
var db = new Proxy(
|
|
642
|
-
{},
|
|
628
|
+
var m365OauthStates = pgTable(
|
|
629
|
+
"m365_oauth_states",
|
|
643
630
|
{
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
631
|
+
state: text("state").primaryKey(),
|
|
632
|
+
codeVerifier: text("code_verifier").notNull(),
|
|
633
|
+
userKey: text("user_key"),
|
|
634
|
+
returnTo: text("return_to"),
|
|
635
|
+
createdAt: timestamp("created_at").defaultNow().notNull(),
|
|
636
|
+
expiresAt: timestamp("expires_at").notNull()
|
|
637
|
+
},
|
|
638
|
+
(table) => [index("m365_oauth_states_expires_idx").on(table.expiresAt)]
|
|
639
|
+
);
|
|
640
|
+
var m365Connections = pgTable(
|
|
641
|
+
"m365_connections",
|
|
642
|
+
{
|
|
643
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
644
|
+
userKey: text("user_key").notNull().unique(),
|
|
645
|
+
microsoftUserId: text("microsoft_user_id"),
|
|
646
|
+
email: text("email"),
|
|
647
|
+
displayName: text("display_name"),
|
|
648
|
+
accessTokenEncrypted: text("access_token_encrypted").notNull(),
|
|
649
|
+
refreshTokenEncrypted: text("refresh_token_encrypted"),
|
|
650
|
+
scope: text("scope"),
|
|
651
|
+
tokenType: text("token_type").default("Bearer"),
|
|
652
|
+
expiresAt: timestamp("expires_at").notNull(),
|
|
653
|
+
createdAt: timestamp("created_at").defaultNow().notNull(),
|
|
654
|
+
updatedAt: timestamp("updated_at").defaultNow().notNull()
|
|
655
|
+
},
|
|
656
|
+
(table) => [index("m365_connections_user_idx").on(table.userKey)]
|
|
657
|
+
);
|
|
658
|
+
var m365AnalysisResults = pgTable(
|
|
659
|
+
"m365_analysis_results",
|
|
660
|
+
{
|
|
661
|
+
id: uuid("id").primaryKey().defaultRandom(),
|
|
662
|
+
userKey: text("user_key").notNull(),
|
|
663
|
+
inputType: text("input_type").notNull().$type(),
|
|
664
|
+
inputId: text("input_id"),
|
|
665
|
+
subject: text("subject"),
|
|
666
|
+
sender: text("sender"),
|
|
667
|
+
riskScore: integer("risk_score").notNull(),
|
|
668
|
+
category: text("category").notNull().$type(),
|
|
669
|
+
explanation: jsonb("explanation").$type(),
|
|
670
|
+
recommendedActions: jsonb("recommended_actions").$type(),
|
|
671
|
+
engine: text("engine").notNull().$type(),
|
|
672
|
+
model: text("model"),
|
|
673
|
+
latencyMs: integer("latency_ms"),
|
|
674
|
+
createdAt: timestamp("created_at").defaultNow().notNull()
|
|
675
|
+
},
|
|
676
|
+
(table) => [
|
|
677
|
+
index("m365_analysis_user_idx").on(table.userKey),
|
|
678
|
+
index("m365_analysis_created_idx").on(table.createdAt)
|
|
679
|
+
]
|
|
653
680
|
);
|
|
654
681
|
|
|
655
682
|
export {
|
|
683
|
+
users,
|
|
656
684
|
conversations,
|
|
657
685
|
messages,
|
|
658
686
|
memories,
|
|
687
|
+
scheduledTasks,
|
|
659
688
|
toolLogs,
|
|
660
689
|
sessions,
|
|
661
690
|
auditLogs,
|
|
662
691
|
apiKeys,
|
|
692
|
+
rateLimits,
|
|
663
693
|
metrics,
|
|
664
694
|
errorLogs,
|
|
665
695
|
usagePatterns,
|
|
@@ -672,10 +702,20 @@ export {
|
|
|
672
702
|
agentMessages,
|
|
673
703
|
agentProgress,
|
|
674
704
|
personas,
|
|
705
|
+
organizations,
|
|
706
|
+
organizationMembers,
|
|
707
|
+
sharedMemories,
|
|
708
|
+
usageQuotas,
|
|
675
709
|
graphEntities,
|
|
676
710
|
graphRelationships,
|
|
711
|
+
documents,
|
|
712
|
+
documentChunks,
|
|
713
|
+
twoFactorAuth,
|
|
677
714
|
securityIncidents,
|
|
678
715
|
incidentTimeline,
|
|
679
|
-
|
|
716
|
+
m365OauthStates,
|
|
717
|
+
m365Connections,
|
|
718
|
+
m365AnalysisResults,
|
|
719
|
+
schema_exports
|
|
680
720
|
};
|
|
681
|
-
//# sourceMappingURL=chunk-
|
|
721
|
+
//# sourceMappingURL=chunk-ZIBRVA3Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/db/schema.ts"],"sourcesContent":["import {\r\n pgTable,\r\n text,\r\n timestamp,\r\n uuid,\r\n integer,\r\n jsonb,\r\n boolean,\r\n vector,\r\n index,\r\n customType,\r\n} from \"drizzle-orm/pg-core\";\r\n\r\n// Custom tsvector type for full-text search\r\nconst tsvector = customType<{ data: string }>({\r\n dataType() {\r\n return \"tsvector\";\r\n },\r\n});\r\n\r\n// Users table\r\nexport const users = pgTable(\"users\", {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n telegramId: text(\"telegram_id\").unique(),\r\n name: text(\"name\"),\r\n preferences: jsonb(\"preferences\").$type<{\r\n timezone?: string;\r\n language?: string;\r\n verbosity?: \"terse\" | \"normal\" | \"detailed\";\r\n persona?: \"formal\" | \"casual\" | \"snarky\";\r\n }>(),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\r\n});\r\n\r\n// Conversations table\r\nexport const conversations = pgTable(\"conversations\", {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\").references(() => users.id),\r\n title: text(\"title\"),\r\n source: text(\"source\").notNull().default(\"telegram\"), // telegram, web, api\r\n metadata: jsonb(\"metadata\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\r\n});\r\n\r\n// Messages table\r\nexport const messages = pgTable(\r\n \"messages\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n conversationId: uuid(\"conversation_id\")\r\n .references(() => conversations.id)\r\n .notNull(),\r\n role: text(\"role\").notNull().$type<\"user\" | \"assistant\" | \"system\">(),\r\n content: text(\"content\").notNull(),\r\n tokenCount: integer(\"token_count\"),\r\n metadata: jsonb(\"metadata\"),\r\n encrypted: boolean(\"encrypted\").default(false).notNull(),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"messages_conversation_idx\").on(table.conversationId)]\r\n);\r\n\r\n// Memories table with vector embeddings for RAG\r\nexport const memories = pgTable(\r\n \"memories\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\").references(() => users.id),\r\n type: text(\"type\")\r\n .notNull()\r\n .$type<\"episodic\" | \"semantic\" | \"procedural\">(),\r\n content: text(\"content\").notNull(),\r\n embedding: vector(\"embedding\", { dimensions: 1536 }), // OpenAI embedding size\r\n searchVector: tsvector(\"search_vector\"), // Full-text search vector (GIN indexed)\r\n importance: integer(\"importance\").default(5), // 1-10 scale\r\n source: text(\"source\"), // Where this memory came from\r\n provenance: text(\"provenance\"), // Origin tracking: \"conversation:id\", \"api:manual\", \"extraction:auto\"\r\n metadata: jsonb(\"metadata\"),\r\n encrypted: boolean(\"encrypted\").default(false).notNull(),\r\n lastAccessed: timestamp(\"last_accessed\").defaultNow(),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"memories_user_idx\").on(table.userId)]\r\n);\r\n\r\n// Scheduled tasks table\r\nexport const scheduledTasks = pgTable(\"scheduled_tasks\", {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\").references(() => users.id),\r\n name: text(\"name\").notNull(),\r\n description: text(\"description\"),\r\n cronExpression: text(\"cron_expression\"),\r\n nextRunAt: timestamp(\"next_run_at\"),\r\n lastRunAt: timestamp(\"last_run_at\"),\r\n enabled: boolean(\"enabled\").default(true),\r\n action: jsonb(\"action\").$type<{\r\n type: \"message\" | \"command\" | \"webhook\";\r\n payload: Record<string, unknown>;\r\n }>(),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n});\r\n\r\n// Tool execution logs\r\nexport const toolLogs = pgTable(\r\n \"tool_logs\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n conversationId: uuid(\"conversation_id\").references(() => conversations.id),\r\n toolName: text(\"tool_name\").notNull(),\r\n input: jsonb(\"input\"),\r\n output: jsonb(\"output\"),\r\n success: boolean(\"success\").notNull(),\r\n durationMs: integer(\"duration_ms\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"tool_logs_conversation_idx\").on(table.conversationId)]\r\n);\r\n\r\n// ============================================\r\n// SECURITY TABLES (Phase 1)\r\n// ============================================\r\n\r\n// Sessions table for session management\r\nexport const sessions = pgTable(\r\n \"sessions\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\")\r\n .references(() => users.id)\r\n .notNull(),\r\n token: text(\"token\").notNull().unique(),\r\n deviceInfo: jsonb(\"device_info\").$type<{\r\n userAgent?: string;\r\n platform?: string;\r\n browser?: string;\r\n }>(),\r\n ipAddress: text(\"ip_address\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n expiresAt: timestamp(\"expires_at\").notNull(),\r\n lastActiveAt: timestamp(\"last_active_at\").defaultNow(),\r\n },\r\n (table) => [index(\"sessions_user_idx\").on(table.userId)]\r\n);\r\n\r\n// Audit logs table for tracking all actions\r\nexport const auditLogs = pgTable(\r\n \"audit_logs\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\").references(() => users.id),\r\n sessionId: uuid(\"session_id\").references(() => sessions.id),\r\n action: text(\"action\").notNull(), // 'tool_use', 'login', 'settings_change', etc.\r\n resource: text(\"resource\"), // 'shell', 'file', 'memory', etc.\r\n resourceId: text(\"resource_id\"), // ID of the affected resource\r\n details: jsonb(\"details\"),\r\n ipAddress: text(\"ip_address\"),\r\n userAgent: text(\"user_agent\"),\r\n success: boolean(\"success\").default(true),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n // Tamper-proof chain fields (SOC 2)\r\n sequenceNumber: integer(\"sequence_number\"),\r\n entryHash: text(\"entry_hash\"),\r\n previousHash: text(\"previous_hash\"),\r\n },\r\n (table) => [\r\n index(\"audit_logs_user_idx\").on(table.userId),\r\n index(\"audit_logs_action_idx\").on(table.action),\r\n index(\"audit_logs_created_idx\").on(table.createdAt),\r\n index(\"audit_logs_sequence_idx\").on(table.sequenceNumber),\r\n ]\r\n);\r\n\r\n// API keys table for programmatic access\r\nexport const apiKeys = pgTable(\r\n \"api_keys\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\")\r\n .references(() => users.id)\r\n .notNull(),\r\n name: text(\"name\").notNull(),\r\n keyHash: text(\"key_hash\").notNull(), // bcrypt hash of the key\r\n keyPrefix: text(\"key_prefix\").notNull(), // First 8 chars for identification (e.g., \"mb_live_\")\r\n permissions: jsonb(\"permissions\").$type<string[]>(), // ['chat:basic', 'tools:shell', etc.]\r\n lastUsedAt: timestamp(\"last_used_at\"),\r\n expiresAt: timestamp(\"expires_at\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n revokedAt: timestamp(\"revoked_at\"),\r\n },\r\n (table) => [index(\"api_keys_user_idx\").on(table.userId)]\r\n);\r\n\r\n// Rate limits table for tracking request rates\r\nexport const rateLimits = pgTable(\r\n \"rate_limits\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n identifier: text(\"identifier\").notNull(), // userId, IP, or API key prefix\r\n endpoint: text(\"endpoint\").notNull(), // 'api/chat', 'tool/shell', etc.\r\n windowStart: timestamp(\"window_start\").notNull(),\r\n requestCount: integer(\"request_count\").default(0),\r\n lastRequest: timestamp(\"last_request\"),\r\n },\r\n (table) => [\r\n index(\"rate_limits_identifier_endpoint_idx\").on(\r\n table.identifier,\r\n table.endpoint\r\n ),\r\n ]\r\n);\r\n\r\n// ============================================\r\n// OBSERVABILITY TABLES (Phase 1)\r\n// ============================================\r\n\r\n// Metrics table for performance tracking\r\nexport const metrics = pgTable(\r\n \"metrics\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n name: text(\"name\").notNull(), // 'response_latency', 'token_usage', 'tool_duration', etc.\r\n value: integer(\"value\").notNull(),\r\n unit: text(\"unit\"), // 'ms', 'tokens', 'bytes', etc.\r\n tags: jsonb(\"tags\").$type<Record<string, string>>(), // { tool: 'shell', status: 'success' }\r\n timestamp: timestamp(\"timestamp\").defaultNow().notNull(),\r\n },\r\n (table) => [\r\n index(\"metrics_name_timestamp_idx\").on(table.name, table.timestamp),\r\n ]\r\n);\r\n\r\n// Error logs table for centralized error tracking\r\nexport const errorLogs = pgTable(\r\n \"error_logs\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n source: text(\"source\").notNull(), // 'brain', 'tool', 'telegram', 'api', 'scheduler'\r\n errorType: text(\"error_type\").notNull(), // 'ApiError', 'ValidationError', etc.\r\n errorCode: text(\"error_code\"), // Application-specific error codes\r\n message: text(\"message\").notNull(),\r\n stack: text(\"stack\"),\r\n context: jsonb(\"context\"), // Additional context like request data\r\n userId: uuid(\"user_id\").references(() => users.id),\r\n conversationId: uuid(\"conversation_id\").references(() => conversations.id),\r\n resolved: boolean(\"resolved\").default(false),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [\r\n index(\"error_logs_source_idx\").on(table.source),\r\n index(\"error_logs_created_idx\").on(table.createdAt),\r\n ]\r\n);\r\n\r\n// ============================================\r\n// EVOLUTION SYSTEM TABLES (Phase 2)\r\n// ============================================\r\n\r\n// Usage patterns for evolution tracking\r\nexport const usagePatterns = pgTable(\r\n \"usage_patterns\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\")\r\n .references(() => users.id)\r\n .notNull(),\r\n patternType: text(\"pattern_type\").notNull(), // 'tool_usage', 'topic', 'time_of_day', 'complexity'\r\n patternKey: text(\"pattern_key\").notNull(), // e.g., 'shell', 'morning', 'coding'\r\n patternData: jsonb(\"pattern_data\"),\r\n confidence: integer(\"confidence\").default(0), // 0-100\r\n firstSeen: timestamp(\"first_seen\").defaultNow().notNull(),\r\n lastSeen: timestamp(\"last_seen\").defaultNow(),\r\n occurrences: integer(\"occurrences\").default(1),\r\n },\r\n (table) => [\r\n index(\"usage_patterns_user_idx\").on(table.userId),\r\n index(\"usage_patterns_type_idx\").on(table.patternType),\r\n ]\r\n);\r\n\r\n// Achievements definitions\r\nexport const achievements = pgTable(\"achievements\", {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n code: text(\"code\").notNull().unique(), // 'first_tool_use', 'power_user', 'researcher'\r\n name: text(\"name\").notNull(),\r\n description: text(\"description\"),\r\n iconEmoji: text(\"icon_emoji\"), // Emoji to display\r\n category: text(\"category\"), // 'exploration', 'productivity', 'mastery'\r\n criteria: jsonb(\"criteria\").$type<{\r\n type: string; // 'count', 'streak', 'threshold'\r\n metric: string; // 'tool_uses', 'conversations', 'memories'\r\n threshold: number;\r\n conditions?: Record<string, unknown>;\r\n }>(),\r\n points: integer(\"points\").default(10),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n});\r\n\r\n// User achievements (unlocked)\r\nexport const userAchievements = pgTable(\r\n \"user_achievements\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\")\r\n .references(() => users.id)\r\n .notNull(),\r\n achievementId: uuid(\"achievement_id\")\r\n .references(() => achievements.id)\r\n .notNull(),\r\n unlockedAt: timestamp(\"unlocked_at\").defaultNow().notNull(),\r\n progress: integer(\"progress\").default(100), // For progressive achievements\r\n notified: boolean(\"notified\").default(false),\r\n },\r\n (table) => [index(\"user_achievements_user_idx\").on(table.userId)]\r\n);\r\n\r\n// Evolution transformation modes\r\nexport const evolutionModes = pgTable(\r\n \"molt_modes\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\")\r\n .references(() => users.id)\r\n .notNull(),\r\n mode: text(\"mode\")\r\n .notNull()\r\n .$type<\"productivity\" | \"creative\" | \"research\" | \"learning\">(),\r\n activatedAt: timestamp(\"activated_at\").defaultNow().notNull(),\r\n deactivatedAt: timestamp(\"deactivated_at\"),\r\n metadata: jsonb(\"metadata\"),\r\n },\r\n (table) => [index(\"molt_modes_user_idx\").on(table.userId)]\r\n);\r\n\r\n// Archived memories (for memory shedding)\r\nexport const archivedMemories = pgTable(\r\n \"archived_memories\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n originalMemoryId: uuid(\"original_memory_id\").notNull(),\r\n userId: uuid(\"user_id\").references(() => users.id),\r\n type: text(\"type\")\r\n .notNull()\r\n .$type<\"episodic\" | \"semantic\" | \"procedural\">(),\r\n content: text(\"content\").notNull(),\r\n reason: text(\"reason\"), // 'stale', 'duplicate', 'low_importance', 'user_request'\r\n originalCreatedAt: timestamp(\"original_created_at\"),\r\n archivedAt: timestamp(\"archived_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"archived_memories_user_idx\").on(table.userId)]\r\n);\r\n\r\n// ============================================\r\n// CALENDAR & TRIGGERS TABLES (Phase 3)\r\n// ============================================\r\n\r\nexport const calendarTriggers = pgTable(\r\n \"calendar_triggers\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\")\r\n .references(() => users.id)\r\n .notNull(),\r\n name: text(\"name\").notNull(),\r\n calendarSource: text(\"calendar_source\").notNull(), // 'google', 'outlook', 'ical'\r\n calendarId: text(\"calendar_id\"),\r\n triggerType: text(\"trigger_type\").notNull(), // 'event_start', 'event_end', 'daily_briefing'\r\n offsetMinutes: integer(\"offset_minutes\").default(0), // Trigger X minutes before/after\r\n action: jsonb(\"action\").$type<{\r\n type: \"message\" | \"tool\" | \"webhook\";\r\n payload: Record<string, unknown>;\r\n }>(),\r\n enabled: boolean(\"enabled\").default(true),\r\n lastTriggered: timestamp(\"last_triggered\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"calendar_triggers_user_idx\").on(table.userId)]\r\n);\r\n\r\n// ============================================\r\n// SUB-AGENT TABLES (Phase 4)\r\n// ============================================\r\n\r\nexport const subAgents = pgTable(\r\n \"sub_agents\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n parentConversationId: uuid(\"parent_conversation_id\").references(\r\n () => conversations.id\r\n ),\r\n userId: uuid(\"user_id\")\r\n .references(() => users.id)\r\n .notNull(),\r\n type: text(\"type\")\r\n .notNull()\r\n .$type<\"research\" | \"coding\" | \"writing\" | \"analysis\">(),\r\n name: text(\"name\").notNull(),\r\n status: text(\"status\")\r\n .notNull()\r\n .$type<\"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\">(),\r\n objective: text(\"objective\").notNull(),\r\n context: jsonb(\"context\"),\r\n result: jsonb(\"result\"),\r\n tokenBudget: integer(\"token_budget\").default(50000),\r\n tokensUsed: integer(\"tokens_used\").default(0),\r\n timeBudgetMs: integer(\"time_budget_ms\").default(3600000), // 1 hour default\r\n startedAt: timestamp(\"started_at\"),\r\n completedAt: timestamp(\"completed_at\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [\r\n index(\"sub_agents_user_idx\").on(table.userId),\r\n index(\"sub_agents_status_idx\").on(table.status),\r\n ]\r\n);\r\n\r\nexport const agentMessages = pgTable(\r\n \"agent_messages\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n agentId: uuid(\"agent_id\")\r\n .references(() => subAgents.id)\r\n .notNull(),\r\n role: text(\"role\")\r\n .notNull()\r\n .$type<\"user\" | \"assistant\" | \"system\" | \"tool_result\">(),\r\n content: text(\"content\").notNull(),\r\n metadata: jsonb(\"metadata\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"agent_messages_agent_idx\").on(table.agentId)]\r\n);\r\n\r\nexport const agentProgress = pgTable(\r\n \"agent_progress\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n agentId: uuid(\"agent_id\")\r\n .references(() => subAgents.id)\r\n .notNull(),\r\n step: integer(\"step\").notNull(),\r\n description: text(\"description\").notNull(),\r\n status: text(\"status\")\r\n .notNull()\r\n .$type<\"pending\" | \"running\" | \"completed\" | \"failed\">(),\r\n output: jsonb(\"output\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"agent_progress_agent_idx\").on(table.agentId)]\r\n);\r\n\r\n// ============================================\r\n// PERSONALITY TABLES (Phase 5)\r\n// ============================================\r\n\r\nexport const personas = pgTable(\r\n \"personas\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\").references(() => users.id), // null = system persona\r\n name: text(\"name\").notNull(),\r\n description: text(\"description\"),\r\n basePrompt: text(\"base_prompt\").notNull(),\r\n isDefault: boolean(\"is_default\").default(false),\r\n isSystem: boolean(\"is_system\").default(false), // Built-in personas\r\n settings: jsonb(\"settings\").$type<{\r\n verbosity: \"terse\" | \"normal\" | \"detailed\";\r\n humor: \"off\" | \"subtle\" | \"full\";\r\n formality: \"formal\" | \"casual\" | \"professional\";\r\n emoji: boolean;\r\n proactivity: \"minimal\" | \"moderate\" | \"proactive\";\r\n }>(),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"personas_user_idx\").on(table.userId)]\r\n);\r\n\r\n// ============================================\r\n// ENTERPRISE TABLES (Phase 6)\r\n// ============================================\r\n\r\nexport const organizations = pgTable(\"organizations\", {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n name: text(\"name\").notNull(),\r\n slug: text(\"slug\").unique(),\r\n settings: jsonb(\"settings\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n updatedAt: timestamp(\"updated_at\").defaultNow(),\r\n});\r\n\r\nexport const organizationMembers = pgTable(\r\n \"organization_members\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n organizationId: uuid(\"organization_id\")\r\n .references(() => organizations.id)\r\n .notNull(),\r\n userId: uuid(\"user_id\")\r\n .references(() => users.id)\r\n .notNull(),\r\n role: text(\"role\").notNull().$type<\"owner\" | \"admin\" | \"member\" | \"viewer\">(),\r\n joinedAt: timestamp(\"joined_at\").defaultNow().notNull(),\r\n },\r\n (table) => [\r\n index(\"org_members_org_idx\").on(table.organizationId),\r\n index(\"org_members_user_idx\").on(table.userId),\r\n ]\r\n);\r\n\r\nexport const sharedMemories = pgTable(\r\n \"shared_memories\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n organizationId: uuid(\"organization_id\")\r\n .references(() => organizations.id)\r\n .notNull(),\r\n memoryId: uuid(\"memory_id\")\r\n .references(() => memories.id)\r\n .notNull(),\r\n sharedBy: uuid(\"shared_by\")\r\n .references(() => users.id)\r\n .notNull(),\r\n sharedAt: timestamp(\"shared_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"shared_memories_org_idx\").on(table.organizationId)]\r\n);\r\n\r\nexport const usageQuotas = pgTable(\r\n \"usage_quotas\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\").references(() => users.id),\r\n organizationId: uuid(\"organization_id\").references(() => organizations.id),\r\n quotaType: text(\"quota_type\").notNull(), // 'tokens_daily', 'tokens_monthly', 'agents_concurrent'\r\n limitValue: integer(\"limit_value\").notNull(),\r\n currentValue: integer(\"current_value\").default(0),\r\n resetAt: timestamp(\"reset_at\"),\r\n updatedAt: timestamp(\"updated_at\").defaultNow(),\r\n },\r\n (table) => [\r\n index(\"usage_quotas_user_idx\").on(table.userId),\r\n index(\"usage_quotas_org_idx\").on(table.organizationId),\r\n ]\r\n);\r\n\r\n// ============================================\r\n// KNOWLEDGE GRAPH TABLES\r\n// ============================================\r\n\r\n// Graph entities — people, projects, topics, events, organizations, locations\r\nexport const graphEntities = pgTable(\r\n \"graph_entities\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\").references(() => users.id),\r\n type: text(\"type\")\r\n .notNull()\r\n .$type<\"person\" | \"project\" | \"topic\" | \"event\" | \"organization\" | \"location\">(),\r\n name: text(\"name\").notNull(),\r\n aliases: jsonb(\"aliases\").$type<string[]>().default([]),\r\n description: text(\"description\"),\r\n attributes: jsonb(\"attributes\").$type<Record<string, unknown>>().default({}),\r\n importance: integer(\"importance\").default(50), // 0-100\r\n mentionCount: integer(\"mention_count\").default(1),\r\n embedding: vector(\"embedding\", { dimensions: 1536 }),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\r\n },\r\n (table) => [\r\n index(\"graph_entities_user_idx\").on(table.userId),\r\n index(\"graph_entities_type_idx\").on(table.type),\r\n index(\"graph_entities_name_idx\").on(table.name),\r\n ]\r\n);\r\n\r\n// Graph relationships — connections between entities\r\nexport const graphRelationships = pgTable(\r\n \"graph_relationships\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n sourceEntityId: uuid(\"source_entity_id\")\r\n .references(() => graphEntities.id, { onDelete: \"cascade\" })\r\n .notNull(),\r\n targetEntityId: uuid(\"target_entity_id\")\r\n .references(() => graphEntities.id, { onDelete: \"cascade\" })\r\n .notNull(),\r\n type: text(\"type\")\r\n .notNull()\r\n .$type<\r\n | \"knows\" | \"works_with\" | \"works_on\" | \"family\" | \"friend\"\r\n | \"colleague\" | \"manages\" | \"reports_to\" | \"belongs_to\"\r\n | \"related_to\" | \"located_in\" | \"interested_in\" | \"expert_in\"\r\n | \"mentioned_in\" | \"participates_in\"\r\n >(),\r\n strength: integer(\"strength\").default(50), // 0-100\r\n bidirectional: boolean(\"bidirectional\").default(false),\r\n context: text(\"context\"),\r\n attributes: jsonb(\"attributes\").$type<Record<string, unknown>>().default({}),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\r\n },\r\n (table) => [\r\n index(\"graph_rel_source_idx\").on(table.sourceEntityId),\r\n index(\"graph_rel_target_idx\").on(table.targetEntityId),\r\n index(\"graph_rel_type_idx\").on(table.type),\r\n ]\r\n);\r\n\r\n// ============================================\r\n// DOCUMENT KNOWLEDGE BASE TABLES\r\n// ============================================\r\n\r\nexport const documents = pgTable(\r\n \"documents\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n name: text(\"name\").notNull(),\r\n filename: text(\"filename\"),\r\n mimeType: text(\"mime_type\"),\r\n fileSize: integer(\"file_size\"),\r\n source: text(\"source\"), // 'upload', 'url', 'api'\r\n sourceUrl: text(\"source_url\"),\r\n metadata: jsonb(\"metadata\"),\r\n status: text(\"status\")\r\n .notNull()\r\n .$type<\"pending\" | \"processing\" | \"completed\" | \"failed\">()\r\n .default(\"pending\"),\r\n errorMessage: text(\"error_message\"),\r\n chunkCount: integer(\"chunk_count\").default(0),\r\n totalTokens: integer(\"total_tokens\").default(0),\r\n userId: uuid(\"user_id\").references(() => users.id),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\r\n processedAt: timestamp(\"processed_at\"),\r\n },\r\n (table) => [\r\n index(\"documents_user_idx\").on(table.userId),\r\n index(\"documents_status_idx\").on(table.status),\r\n ]\r\n);\r\n\r\nexport const documentChunks = pgTable(\r\n \"document_chunks\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n documentId: uuid(\"document_id\")\r\n .references(() => documents.id, { onDelete: \"cascade\" })\r\n .notNull(),\r\n chunkIndex: integer(\"chunk_index\").notNull(),\r\n content: text(\"content\").notNull(),\r\n embedding: vector(\"embedding\", { dimensions: 1536 }),\r\n tokenCount: integer(\"token_count\"),\r\n metadata: jsonb(\"metadata\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [\r\n index(\"document_chunks_document_idx\").on(table.documentId),\r\n ]\r\n);\r\n\r\n// ============================================\r\n// TYPE EXPORTS\r\n// ============================================\r\n\r\nexport type User = typeof users.$inferSelect;\r\nexport type NewUser = typeof users.$inferInsert;\r\nexport type Conversation = typeof conversations.$inferSelect;\r\nexport type NewConversation = typeof conversations.$inferInsert;\r\nexport type Message = typeof messages.$inferSelect;\r\nexport type NewMessage = typeof messages.$inferInsert;\r\nexport type Memory = typeof memories.$inferSelect;\r\nexport type NewMemory = typeof memories.$inferInsert;\r\n\r\n// Security types\r\nexport type Session = typeof sessions.$inferSelect;\r\nexport type NewSession = typeof sessions.$inferInsert;\r\nexport type AuditLog = typeof auditLogs.$inferSelect;\r\nexport type NewAuditLog = typeof auditLogs.$inferInsert;\r\nexport type ApiKey = typeof apiKeys.$inferSelect;\r\nexport type NewApiKey = typeof apiKeys.$inferInsert;\r\n\r\n// Observability types\r\nexport type Metric = typeof metrics.$inferSelect;\r\nexport type NewMetric = typeof metrics.$inferInsert;\r\nexport type ErrorLog = typeof errorLogs.$inferSelect;\r\nexport type NewErrorLog = typeof errorLogs.$inferInsert;\r\n\r\n// Evolution system types\r\nexport type UsagePattern = typeof usagePatterns.$inferSelect;\r\nexport type NewUsagePattern = typeof usagePatterns.$inferInsert;\r\nexport type Achievement = typeof achievements.$inferSelect;\r\nexport type NewAchievement = typeof achievements.$inferInsert;\r\nexport type UserAchievement = typeof userAchievements.$inferSelect;\r\nexport type EvolutionMode = typeof evolutionModes.$inferSelect;\r\nexport type NewEvolutionMode = typeof evolutionModes.$inferInsert;\r\n\r\n// Sub-agent types\r\nexport type SubAgent = typeof subAgents.$inferSelect;\r\nexport type NewSubAgent = typeof subAgents.$inferInsert;\r\nexport type AgentMessage = typeof agentMessages.$inferSelect;\r\nexport type AgentProgress = typeof agentProgress.$inferSelect;\r\n\r\n// Personality types\r\nexport type Persona = typeof personas.$inferSelect;\r\nexport type NewPersona = typeof personas.$inferInsert;\r\n\r\n// Enterprise types\r\nexport type Organization = typeof organizations.$inferSelect;\r\nexport type NewOrganization = typeof organizations.$inferInsert;\r\nexport type OrganizationMember = typeof organizationMembers.$inferSelect;\r\n\r\n// Knowledge graph types\r\nexport type GraphEntity = typeof graphEntities.$inferSelect;\r\nexport type NewGraphEntity = typeof graphEntities.$inferInsert;\r\nexport type GraphRelationship = typeof graphRelationships.$inferSelect;\r\nexport type NewGraphRelationship = typeof graphRelationships.$inferInsert;\r\n\r\n// Document knowledge base types\r\nexport type Document = typeof documents.$inferSelect;\r\nexport type NewDocument = typeof documents.$inferInsert;\r\nexport type DocumentChunk = typeof documentChunks.$inferSelect;\r\nexport type NewDocumentChunk = typeof documentChunks.$inferInsert;\r\n\r\n// ============================================\r\n// SOC 2 COMPLIANCE TABLES\r\n// ============================================\r\n\r\n// Two-factor authentication (persisted, encrypted secrets)\r\nexport const twoFactorAuth = pgTable(\r\n \"two_factor_auth\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userId: uuid(\"user_id\")\r\n .references(() => users.id, { onDelete: \"cascade\" })\r\n .notNull()\r\n .unique(),\r\n secretEncrypted: text(\"secret_encrypted\").notNull(),\r\n recoveryCodes: jsonb(\"recovery_codes\").$type<string[]>().notNull(),\r\n enabledAt: timestamp(\"enabled_at\").notNull(),\r\n lastVerifiedAt: timestamp(\"last_verified_at\"),\r\n keyVersion: integer(\"key_version\").default(1).notNull(),\r\n metadata: jsonb(\"metadata\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"two_factor_auth_user_idx\").on(table.userId)]\r\n);\r\n\r\n// Security incidents tracking\r\nexport const securityIncidents = pgTable(\r\n \"security_incidents\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n incidentNumber: text(\"incident_number\").notNull().unique(),\r\n title: text(\"title\").notNull(),\r\n description: text(\"description\").notNull(),\r\n type: text(\"type\")\r\n .notNull()\r\n .$type<\r\n | \"brute_force\"\r\n | \"unauthorized_access\"\r\n | \"data_breach\"\r\n | \"suspicious_activity\"\r\n | \"system_compromise\"\r\n | \"policy_violation\"\r\n >(),\r\n severity: text(\"severity\")\r\n .notNull()\r\n .$type<\"low\" | \"medium\" | \"high\" | \"critical\">(),\r\n status: text(\"status\")\r\n .notNull()\r\n .$type<\"open\" | \"investigating\" | \"contained\" | \"resolved\" | \"closed\">()\r\n .default(\"open\"),\r\n userId: uuid(\"user_id\").references(() => users.id),\r\n assignedTo: uuid(\"assigned_to\").references(() => users.id),\r\n source: text(\"source\").notNull(),\r\n sourceData: jsonb(\"source_data\"),\r\n impactAssessment: text(\"impact_assessment\"),\r\n containmentActions: jsonb(\"containment_actions\"),\r\n resolutionNotes: text(\"resolution_notes\"),\r\n relatedIncidents: jsonb(\"related_incidents\").$type<string[]>(),\r\n metadata: jsonb(\"metadata\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\r\n investigatedAt: timestamp(\"investigated_at\"),\r\n containedAt: timestamp(\"contained_at\"),\r\n resolvedAt: timestamp(\"resolved_at\"),\r\n closedAt: timestamp(\"closed_at\"),\r\n },\r\n (table) => [\r\n index(\"security_incidents_status_idx\").on(table.status),\r\n index(\"security_incidents_severity_idx\").on(table.severity),\r\n index(\"security_incidents_created_idx\").on(table.createdAt),\r\n ]\r\n);\r\n\r\n// Incident timeline events\r\nexport const incidentTimeline = pgTable(\r\n \"incident_timeline\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n incidentId: uuid(\"incident_id\")\r\n .references(() => securityIncidents.id, { onDelete: \"cascade\" })\r\n .notNull(),\r\n eventType: text(\"event_type\")\r\n .notNull()\r\n .$type<\r\n | \"created\"\r\n | \"status_change\"\r\n | \"assignment\"\r\n | \"comment\"\r\n | \"action_taken\"\r\n | \"escalation\"\r\n | \"resolution\"\r\n >(),\r\n description: text(\"description\").notNull(),\r\n performedBy: uuid(\"performed_by\").references(() => users.id),\r\n metadata: jsonb(\"metadata\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"incident_timeline_incident_idx\").on(table.incidentId)]\r\n);\r\n\r\n// SOC 2 types\r\nexport type TwoFactorAuthRecord = typeof twoFactorAuth.$inferSelect;\r\nexport type NewTwoFactorAuthRecord = typeof twoFactorAuth.$inferInsert;\r\nexport type SecurityIncident = typeof securityIncidents.$inferSelect;\r\nexport type NewSecurityIncident = typeof securityIncidents.$inferInsert;\r\nexport type IncidentTimelineEvent = typeof incidentTimeline.$inferSelect;\r\n\r\n// ---------------------------------------------------------------------------\r\n// Microsoft 365 / Entra ID integration\r\n// ---------------------------------------------------------------------------\r\n\r\n// Pending OAuth states — CSRF + PKCE. Short-lived (expires in minutes).\r\n// We reject callbacks whose state is not present or expired.\r\nexport const m365OauthStates = pgTable(\r\n \"m365_oauth_states\",\r\n {\r\n state: text(\"state\").primaryKey(),\r\n codeVerifier: text(\"code_verifier\").notNull(),\r\n userKey: text(\"user_key\"),\r\n returnTo: text(\"return_to\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n expiresAt: timestamp(\"expires_at\").notNull(),\r\n },\r\n (table) => [index(\"m365_oauth_states_expires_idx\").on(table.expiresAt)]\r\n);\r\n\r\n// Per-user Microsoft 365 OAuth connections. Tokens are encrypted at rest.\r\nexport const m365Connections = pgTable(\r\n \"m365_connections\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userKey: text(\"user_key\").notNull().unique(),\r\n microsoftUserId: text(\"microsoft_user_id\"),\r\n email: text(\"email\"),\r\n displayName: text(\"display_name\"),\r\n accessTokenEncrypted: text(\"access_token_encrypted\").notNull(),\r\n refreshTokenEncrypted: text(\"refresh_token_encrypted\"),\r\n scope: text(\"scope\"),\r\n tokenType: text(\"token_type\").default(\"Bearer\"),\r\n expiresAt: timestamp(\"expires_at\").notNull(),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n updatedAt: timestamp(\"updated_at\").defaultNow().notNull(),\r\n },\r\n (table) => [index(\"m365_connections_user_idx\").on(table.userKey)]\r\n);\r\n\r\n// Persisted analysis history — lets the dashboard show prior verdicts.\r\nexport const m365AnalysisResults = pgTable(\r\n \"m365_analysis_results\",\r\n {\r\n id: uuid(\"id\").primaryKey().defaultRandom(),\r\n userKey: text(\"user_key\").notNull(),\r\n inputType: text(\"input_type\").notNull().$type<\"email\" | \"file\" | \"document\">(),\r\n inputId: text(\"input_id\"),\r\n subject: text(\"subject\"),\r\n sender: text(\"sender\"),\r\n riskScore: integer(\"risk_score\").notNull(),\r\n category: text(\"category\").notNull().$type<\"Safe\" | \"Suspicious\" | \"Phishing\" | \"Error\">(),\r\n explanation: jsonb(\"explanation\").$type<string[]>(),\r\n recommendedActions: jsonb(\"recommended_actions\").$type<string[]>(),\r\n engine: text(\"engine\").notNull().$type<\"llm\" | \"heuristic\">(),\r\n model: text(\"model\"),\r\n latencyMs: integer(\"latency_ms\"),\r\n createdAt: timestamp(\"created_at\").defaultNow().notNull(),\r\n },\r\n (table) => [\r\n index(\"m365_analysis_user_idx\").on(table.userKey),\r\n index(\"m365_analysis_created_idx\").on(table.createdAt),\r\n ]\r\n);\r\n\r\nexport type M365Connection = typeof m365Connections.$inferSelect;\r\nexport type NewM365Connection = typeof m365Connections.$inferInsert;\r\nexport type M365OauthState = typeof m365OauthStates.$inferSelect;\r\nexport type NewM365OauthState = typeof m365OauthStates.$inferInsert;\r\nexport type M365AnalysisResult = typeof m365AnalysisResults.$inferSelect;\r\nexport type NewM365AnalysisResult = typeof m365AnalysisResults.$inferInsert;\r\n"],"mappings":"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","names":[]}
|