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.
Files changed (361) hide show
  1. package/README.md +138 -83
  2. package/dist/agent-manager-JZ4IM7XI.js +39 -0
  3. package/dist/agent-processor-DDDHC2SO.js +281 -0
  4. package/dist/agent-processor-DDDHC2SO.js.map +1 -0
  5. package/dist/agent-types-2T4PXLFQ.js +12 -0
  6. package/dist/alerting-LK7VVYTX.js +699 -0
  7. package/dist/alerting-LK7VVYTX.js.map +1 -0
  8. package/dist/analysis-agent-JWN2GXYE.js +288 -0
  9. package/dist/analysis-agent-JWN2GXYE.js.map +1 -0
  10. package/dist/analyzer-OTWE3ARE.js +22 -0
  11. package/dist/{archiver-AVNBYCKQ.js → archiver-FPGKRP6P.js} +2 -2
  12. package/dist/{audit-logger-OBPR7CRO.js → audit-logger-CI4WZQPD.js} +6 -5
  13. package/dist/{auth-UOX5K2BE.js → auth-PH5IHISW.js} +2 -2
  14. package/dist/{autonomy-ZXDBDQUJ.js → autonomy-N7W5XPLX.js} +4 -3
  15. package/dist/autonomy-N7W5XPLX.js.map +1 -0
  16. package/dist/{aws-s3-Q4LLZZPD.js → aws-s3-QZMURYXB.js} +2 -2
  17. package/dist/{backup-restore-PZ7CYYB7.js → backup-restore-72OQTZO3.js} +2 -2
  18. package/dist/{blocks-R3PODY47.js → blocks-YOWOESDD.js} +4 -4
  19. package/dist/bot-VDHBGUVI.js +47 -0
  20. package/dist/brain-6QTXN4QP.js +66 -0
  21. package/dist/{camera-monitor-M5CYKUU4.js → camera-monitor-LHTUWHEL.js} +2 -2
  22. package/dist/{charts-V7ARZNKF.js → charts-FJ32GQK7.js} +2 -2
  23. package/dist/{chunk-WRAKK6K6.js → chunk-2I5QHYG6.js} +5 -3
  24. package/dist/chunk-2I5QHYG6.js.map +1 -0
  25. package/dist/{chunk-TVEWKIK3.js → chunk-2WTKTG2C.js} +2 -2
  26. package/dist/chunk-3AWAWRWB.js +143 -0
  27. package/dist/chunk-3AWAWRWB.js.map +1 -0
  28. package/dist/{chunk-ZLZKF2PM.js → chunk-4KIHDIXZ.js} +43 -2
  29. package/dist/chunk-4KIHDIXZ.js.map +1 -0
  30. package/dist/{chunk-EVE7MIIY.js → chunk-4WH6MFEW.js} +15 -16
  31. package/dist/chunk-4WH6MFEW.js.map +1 -0
  32. package/dist/{chunk-I6BDYQIG.js → chunk-56UJS2LA.js} +6 -6
  33. package/dist/chunk-56UJS2LA.js.map +1 -0
  34. package/dist/chunk-5BTVJR7R.js +37 -0
  35. package/dist/chunk-5BTVJR7R.js.map +1 -0
  36. package/dist/chunk-5JJTLWOR.js +1021 -0
  37. package/dist/chunk-5JJTLWOR.js.map +1 -0
  38. package/dist/chunk-66SAOZPU.js +236 -0
  39. package/dist/chunk-66SAOZPU.js.map +1 -0
  40. package/dist/chunk-6HGMRR4J.js +113 -0
  41. package/dist/chunk-6HGMRR4J.js.map +1 -0
  42. package/dist/chunk-6W6PTJFT.js +181 -0
  43. package/dist/chunk-6W6PTJFT.js.map +1 -0
  44. package/dist/chunk-6ZNCY2GI.js +418 -0
  45. package/dist/chunk-6ZNCY2GI.js.map +1 -0
  46. package/dist/chunk-7BNFELEK.js +31 -0
  47. package/dist/chunk-7BNFELEK.js.map +1 -0
  48. package/dist/chunk-ADTDYJO7.js +265 -0
  49. package/dist/chunk-ADTDYJO7.js.map +1 -0
  50. package/dist/{chunk-OCVQGBJK.js → chunk-BBN4VCNK.js} +6 -4
  51. package/dist/chunk-BBN4VCNK.js.map +1 -0
  52. package/dist/{chunk-SJSUSJ47.js → chunk-BNZHWAZC.js} +2 -2
  53. package/dist/chunk-C6PELIHS.js +60 -0
  54. package/dist/chunk-C6PELIHS.js.map +1 -0
  55. package/dist/{chunk-MQJ2ECQT.js → chunk-CUPEENUY.js} +3 -3
  56. package/dist/{chunk-NHMBTUMW.js → chunk-CWT6CAE5.js} +2 -2
  57. package/dist/{chunk-4GLYY4NN.js → chunk-CZTMGHUC.js} +8 -2
  58. package/dist/chunk-CZTMGHUC.js.map +1 -0
  59. package/dist/{chunk-RZ4YESBG.js → chunk-DOYGMNMK.js} +1 -1
  60. package/dist/chunk-DOYGMNMK.js.map +1 -0
  61. package/dist/chunk-DTISLIMB.js +89 -0
  62. package/dist/chunk-DTISLIMB.js.map +1 -0
  63. package/dist/{chunk-SPPMCAKG.js → chunk-GBVJTRXS.js} +2 -2
  64. package/dist/chunk-GBVJTRXS.js.map +1 -0
  65. package/dist/{chunk-AYUKPTSM.js → chunk-GJETKBOY.js} +96 -218
  66. package/dist/chunk-GJETKBOY.js.map +1 -0
  67. package/dist/{chunk-BXZ6EA52.js → chunk-GW6V4D43.js} +57 -3
  68. package/dist/chunk-GW6V4D43.js.map +1 -0
  69. package/dist/{chunk-6PMVAAA7.js → chunk-HJSEEFO3.js} +3 -3
  70. package/dist/{chunk-TYAGMJNV.js → chunk-HQZQFEAX.js} +5 -5
  71. package/dist/{chunk-MXAPLSJ5.js → chunk-J4JW73TT.js} +2 -2
  72. package/dist/{chunk-VEHFVBLI.js → chunk-JHYYFPKX.js} +2 -2
  73. package/dist/chunk-LFDXEYYB.js +150 -0
  74. package/dist/chunk-LFDXEYYB.js.map +1 -0
  75. package/dist/chunk-MIC5IBQF.js +386 -0
  76. package/dist/chunk-MIC5IBQF.js.map +1 -0
  77. package/dist/chunk-ODCFS5WD.js +463 -0
  78. package/dist/chunk-ODCFS5WD.js.map +1 -0
  79. package/dist/{chunk-XMCVRVTF.js → chunk-P64EV4YY.js} +1 -1
  80. package/dist/chunk-P64EV4YY.js.map +1 -0
  81. package/dist/chunk-PBOCSGNL.js +84 -0
  82. package/dist/chunk-PBOCSGNL.js.map +1 -0
  83. package/dist/{chunk-66OJ3WB4.js → chunk-PD3CTDO6.js} +2 -2
  84. package/dist/chunk-QPY3WRVM.js +647 -0
  85. package/dist/chunk-QPY3WRVM.js.map +1 -0
  86. package/dist/chunk-S2EOIVF4.js +3907 -0
  87. package/dist/chunk-S2EOIVF4.js.map +1 -0
  88. package/dist/chunk-SDLOMKCW.js +213 -0
  89. package/dist/chunk-SDLOMKCW.js.map +1 -0
  90. package/dist/chunk-TKBVW7ZJ.js +162 -0
  91. package/dist/chunk-TKBVW7ZJ.js.map +1 -0
  92. package/dist/{chunk-BRBWNV65.js → chunk-U2X2J3FI.js} +3 -3
  93. package/dist/chunk-U2X2J3FI.js.map +1 -0
  94. package/dist/{chunk-PLDDJCW6.js → chunk-UP2VWCW5.js} +1 -12
  95. package/dist/{chunk-SVAPX2XN.js → chunk-V3OKHQUX.js} +9 -7
  96. package/dist/{chunk-SVAPX2XN.js.map → chunk-V3OKHQUX.js.map} +1 -1
  97. package/dist/{chunk-4UOE5TUZ.js → chunk-WMDVOWN6.js} +4 -4
  98. package/dist/chunk-WMFYI7XC.js +564 -0
  99. package/dist/chunk-WMFYI7XC.js.map +1 -0
  100. package/dist/chunk-WZAH34TG.js +129 -0
  101. package/dist/chunk-WZAH34TG.js.map +1 -0
  102. package/dist/{chunk-H5RQOFO2.js → chunk-X6Q3K3L2.js} +6 -6
  103. package/dist/chunk-X6Q3K3L2.js.map +1 -0
  104. package/dist/chunk-XTX7EK43.js +134 -0
  105. package/dist/chunk-XTX7EK43.js.map +1 -0
  106. package/dist/chunk-YEDEAX6Y.js +194 -0
  107. package/dist/chunk-YEDEAX6Y.js.map +1 -0
  108. package/dist/{chunk-XKYRH4FM.js → chunk-ZIBRVA3Y.js} +70 -30
  109. package/dist/chunk-ZIBRVA3Y.js.map +1 -0
  110. package/dist/chunk-ZIYTHUM5.js +457 -0
  111. package/dist/chunk-ZIYTHUM5.js.map +1 -0
  112. package/dist/{chunk-766ASQWE.js → chunk-ZMML6T63.js} +2711 -2329
  113. package/dist/chunk-ZMML6T63.js.map +1 -0
  114. package/dist/chunk-ZVHG4KF2.js +380 -0
  115. package/dist/chunk-ZVHG4KF2.js.map +1 -0
  116. package/dist/chunker-K6WTR62A.js +12 -0
  117. package/dist/cli.js +1 -1
  118. package/dist/cli.js.map +1 -1
  119. package/dist/{client-ZQSFPMOB.js → client-FOIYPOZQ.js} +5 -6
  120. package/dist/{clipboard-manager-TEO2GEDN.js → clipboard-manager-4SBNESGZ.js} +2 -2
  121. package/dist/coding-agent-DESSU3AC.js +233 -0
  122. package/dist/coding-agent-DESSU3AC.js.map +1 -0
  123. package/dist/commands/setup.js +2 -2
  124. package/dist/commands/start.js +3 -3
  125. package/dist/commands/status.js +2 -2
  126. package/dist/commands/stop.js +2 -2
  127. package/dist/commands/utils.js +2 -2
  128. package/dist/cost-tracker-KZQSTSE2.js +11 -0
  129. package/dist/{cron-explain-HHQKPD3M.js → cron-explain-UOOOYWZZ.js} +2 -2
  130. package/dist/{crypto-4AP47IKC.js → crypto-2VG3RJR2.js} +2 -2
  131. package/dist/{databases-37X4CI2Y.js → databases-XDPMG5AV.js} +4 -4
  132. package/dist/db-I7MNG6CL.js +83 -0
  133. package/dist/discord-6UQHCN27.js +81 -0
  134. package/dist/documents-PFHSK7SZ.js +184 -0
  135. package/dist/documents-PFHSK7SZ.js.map +1 -0
  136. package/dist/docx-parser-EXL4TN5E.js +16 -0
  137. package/dist/{email-K7LO2IPB.js → email-6OIN4SYL.js} +34 -25
  138. package/dist/email-6OIN4SYL.js.map +1 -0
  139. package/dist/{enhanced-retrieval-DNLLEM4Z.js → enhanced-retrieval-JWX2HWU4.js} +12 -8
  140. package/dist/{enhanced-retrieval-DNLLEM4Z.js.map → enhanced-retrieval-JWX2HWU4.js.map} +1 -1
  141. package/dist/enrichment-pipeline-7FE5R5ZI.js +14 -0
  142. package/dist/{entity-resolution-Y3IUWEAT.js → entity-resolution-7Z6STVXX.js} +6 -5
  143. package/dist/env-GN5VHI43.js +12 -0
  144. package/dist/error-tracker-64DEH3D7.js +32 -0
  145. package/dist/finnhub-X7ZMQSXF.js +178 -0
  146. package/dist/finnhub-X7ZMQSXF.js.map +1 -0
  147. package/dist/fred-TMUF3J2V.js +203 -0
  148. package/dist/fred-TMUF3J2V.js.map +1 -0
  149. package/dist/github-DUWSXCNP.js +833 -0
  150. package/dist/github-DUWSXCNP.js.map +1 -0
  151. package/dist/{google-workspace-DKWUVNGC.js → google-workspace-TSZPZK5G.js} +2 -2
  152. package/dist/graph-client-NB475AK5.js +17 -0
  153. package/dist/{hash-tool-ULQYD7B5.js → hash-tool-ENAB5LWH.js} +2 -2
  154. package/dist/{heartbeat-monitor-GCISLXI3.js → heartbeat-monitor-KRDYTDBF.js} +2 -2
  155. package/dist/hooks-N4MIFBVM.js +14 -0
  156. package/dist/{image-generation-OSU7FP6F.js → image-generation-MDE6AVQO.js} +2 -2
  157. package/dist/imessage-DSGSGUZS.js +44 -0
  158. package/dist/inbox-summarizer-F2KAU72V.js +56 -0
  159. package/dist/{incident-response-C5J7Q6DT.js → incident-response-E3UGMX5G.js} +8 -6
  160. package/dist/incident-response-E3UGMX5G.js.map +1 -0
  161. package/dist/{inventory-manager-352OHXWD.js → inventory-manager-C67BSZM6.js} +2 -2
  162. package/dist/{jira-GSGDBMIG.js → jira-PAGZWUBJ.js} +2 -2
  163. package/dist/{json-tool-QE2SYHEG.js → json-tool-4FK5RNER.js} +2 -2
  164. package/dist/{key-rotation-DPHU4ZTB.js → key-rotation-WCC5FOYS.js} +2 -2
  165. package/dist/knowledge-base-5SMMOGQJ.js +46 -0
  166. package/dist/lib.d.ts +94 -1
  167. package/dist/lib.js +83 -66
  168. package/dist/lib.js.map +1 -1
  169. package/dist/{mailchimp-KKNF6QJ7.js → mailchimp-ZFYDC44J.js} +2 -2
  170. package/dist/{matrix-QVHG76I7.js → matrix-WYGEOZL5.js} +30 -21
  171. package/dist/{matrix-QVHG76I7.js.map → matrix-WYGEOZL5.js.map} +1 -1
  172. package/dist/{mcp-3JI6W7ZE.js → mcp-DJ2QDA6A.js} +3 -3
  173. package/dist/metrics-BH3ZLGEV.js +25 -0
  174. package/dist/{microsoft365-UCBKJHNX.js → microsoft365-6G2IJMWC.js} +2 -2
  175. package/dist/multi-user-XAEMB244.js +411 -0
  176. package/dist/multi-user-XAEMB244.js.map +1 -0
  177. package/dist/oauth-UPJYFOVU.js +34 -0
  178. package/dist/{ocr-AC7NPX33.js → ocr-UONKTQU7.js} +6 -4
  179. package/dist/{ollama-BOAMSPLJ.js → ollama-J7CU45WT.js} +2 -2
  180. package/dist/osint-agent-RL5XPBRQ.js +189 -0
  181. package/dist/osint-agent-RL5XPBRQ.js.map +1 -0
  182. package/dist/{pages-MI523RB7.js → pages-XDE7JRCA.js} +5 -5
  183. package/dist/{pair-JDFTERIK.js → pair-YZJFQUU5.js} +2 -2
  184. package/dist/{pairing-IFQYCPNS.js → pairing-77N47RAT.js} +2 -2
  185. package/dist/{pdf-ALQVOEJR.js → pdf-67HGXCFJ.js} +3 -3
  186. package/dist/pdf-parser-YLMTTYHL.js +14 -0
  187. package/dist/{presentations-DSV5IHG5.js → presentations-UOET2FVZ.js} +3 -3
  188. package/dist/presentations-UOET2FVZ.js.map +1 -0
  189. package/dist/{prometheus-JNT2BD4L.js → prometheus-YETCZO4I.js} +2 -2
  190. package/dist/prometheus-YETCZO4I.js.map +1 -0
  191. package/dist/{providers-J4LYPHDR.js → providers-2YQ6E3IF.js} +6 -4
  192. package/dist/providers-2YQ6E3IF.js.map +1 -0
  193. package/dist/{qr-code-WIX4PB4U.js → qr-code-6WZJHRKL.js} +2 -2
  194. package/dist/qr-code-6WZJHRKL.js.map +1 -0
  195. package/dist/{quickbooks-XB4NII2S.js → quickbooks-N675W7IK.js} +2 -2
  196. package/dist/{regex-tool-W4ABRKGK.js → regex-tool-6Q63LQ7B.js} +2 -2
  197. package/dist/regex-tool-6Q63LQ7B.js.map +1 -0
  198. package/dist/research-agent-WCRSY3UZ.js +168 -0
  199. package/dist/research-agent-WCRSY3UZ.js.map +1 -0
  200. package/dist/risk-engine-YKCPT5D5.js +10 -0
  201. package/dist/risk-engine-YKCPT5D5.js.map +1 -0
  202. package/dist/scheduler-6PLLAQI7.js +74 -0
  203. package/dist/scheduler-6PLLAQI7.js.map +1 -0
  204. package/dist/schema-ETY7L2VA.js +78 -0
  205. package/dist/schema-ETY7L2VA.js.map +1 -0
  206. package/dist/{search-BCLBO5E3.js → search-GMLKBHSW.js} +4 -4
  207. package/dist/search-GMLKBHSW.js.map +1 -0
  208. package/dist/{sendgrid-RNXCAFKM.js → sendgrid-QGJIVPWV.js} +2 -2
  209. package/dist/sharepoint-V5P4Q62L.js +30 -0
  210. package/dist/sharepoint-V5P4Q62L.js.map +1 -0
  211. package/dist/{shopify-NCXYJB4R.js → shopify-ON2PAU27.js} +2 -2
  212. package/dist/signal-7D5EPGVL.js +44 -0
  213. package/dist/signal-7D5EPGVL.js.map +1 -0
  214. package/dist/slack-KSS6YK5Z.js +86 -0
  215. package/dist/slack-KSS6YK5Z.js.map +1 -0
  216. package/dist/{sms-M3JIOTCW.js → sms-CSUCC7HL.js} +4 -4
  217. package/dist/sms-CSUCC7HL.js.map +1 -0
  218. package/dist/{src-VYUE6LRA.js → src-GO7GGW7O.js} +190 -52
  219. package/dist/src-GO7GGW7O.js.map +1 -0
  220. package/dist/{stocks-XXWBPOCU.js → stocks-4M4HZWZS.js} +2 -2
  221. package/dist/stocks-4M4HZWZS.js.map +1 -0
  222. package/dist/text-extractor-OAUBAW5P.js +12 -0
  223. package/dist/text-extractor-OAUBAW5P.js.map +1 -0
  224. package/dist/{text-transform-6SGUA5Z4.js → text-transform-HCLCUDFZ.js} +2 -2
  225. package/dist/text-transform-HCLCUDFZ.js.map +1 -0
  226. package/dist/token-store-SEWRX6RE.js +20 -0
  227. package/dist/token-store-SEWRX6RE.js.map +1 -0
  228. package/dist/tools-PJZ6RI4P.js +47 -0
  229. package/dist/tools-PJZ6RI4P.js.map +1 -0
  230. package/dist/{tunnel-IWMXUML4.js → tunnel-XOUVVRAK.js} +4 -2
  231. package/dist/tunnel-XOUVVRAK.js.map +1 -0
  232. package/dist/{twilio-53GEW5JT.js → twilio-3L7DUNYQ.js} +2 -2
  233. package/dist/{unit-converter-ZYXMEZOE.js → unit-converter-LYPAHU64.js} +2 -2
  234. package/dist/unit-converter-LYPAHU64.js.map +1 -0
  235. package/dist/whatsapp-DWXK25V2.js +44 -0
  236. package/dist/whatsapp-DWXK25V2.js.map +1 -0
  237. package/dist/{word-document-7B6SJMAY.js → word-document-AV3YB4L2.js} +4 -4
  238. package/dist/word-document-AV3YB4L2.js.map +1 -0
  239. package/dist/workflow-store-5Y56GUP7.js +373 -0
  240. package/dist/workflow-store-5Y56GUP7.js.map +1 -0
  241. package/dist/writing-agent-VDGLNOGO.js +243 -0
  242. package/dist/writing-agent-VDGLNOGO.js.map +1 -0
  243. package/dist/{xero-QYO66D45.js → xero-UHAHVYSD.js} +2 -2
  244. package/dist/{zapier-webhook-TBZ5YF2A.js → zapier-webhook-NIELLTXR.js} +2 -2
  245. package/drizzle/0002_mushy_master_mold.sql +139 -139
  246. package/drizzle/0003_overjoyed_rhodey.sql +46 -0
  247. package/drizzle/meta/0002_snapshot.json +3636 -3636
  248. package/drizzle/meta/0003_snapshot.json +3946 -0
  249. package/drizzle/meta/_journal.json +7 -0
  250. package/package.json +110 -100
  251. package/dist/autonomy-ZXDBDQUJ.js.map +0 -1
  252. package/dist/bot-QRARP4UN.js +0 -36
  253. package/dist/brain-7XLLM3KC.js +0 -56
  254. package/dist/chunk-4GLYY4NN.js.map +0 -1
  255. package/dist/chunk-766ASQWE.js.map +0 -1
  256. package/dist/chunk-AYUKPTSM.js.map +0 -1
  257. package/dist/chunk-BRBWNV65.js.map +0 -1
  258. package/dist/chunk-BXZ6EA52.js.map +0 -1
  259. package/dist/chunk-EVE7MIIY.js.map +0 -1
  260. package/dist/chunk-H5RQOFO2.js.map +0 -1
  261. package/dist/chunk-I6BDYQIG.js.map +0 -1
  262. package/dist/chunk-IZJMVV7O.js +0 -347
  263. package/dist/chunk-IZJMVV7O.js.map +0 -1
  264. package/dist/chunk-O7IH7JTI.js +0 -1898
  265. package/dist/chunk-O7IH7JTI.js.map +0 -1
  266. package/dist/chunk-OCVQGBJK.js.map +0 -1
  267. package/dist/chunk-RZ4YESBG.js.map +0 -1
  268. package/dist/chunk-SPPMCAKG.js.map +0 -1
  269. package/dist/chunk-VRD5CYRL.js +0 -1568
  270. package/dist/chunk-VRD5CYRL.js.map +0 -1
  271. package/dist/chunk-WRAKK6K6.js.map +0 -1
  272. package/dist/chunk-XKYRH4FM.js.map +0 -1
  273. package/dist/chunk-XMCVRVTF.js.map +0 -1
  274. package/dist/chunk-ZLZKF2PM.js.map +0 -1
  275. package/dist/discord-B3HUPGQ6.js +0 -70
  276. package/dist/dist-UISMLMFN.js +0 -21847
  277. package/dist/dist-UISMLMFN.js.map +0 -1
  278. package/dist/email-K7LO2IPB.js.map +0 -1
  279. package/dist/enrichment-pipeline-MNHNW65K.js +0 -13
  280. package/dist/env-IWXUVTCB.js +0 -12
  281. package/dist/imessage-NGA2XF2V.js +0 -35
  282. package/dist/inbox-summarizer-NRI4S7IF.js +0 -47
  283. package/dist/incident-response-C5J7Q6DT.js.map +0 -1
  284. package/dist/presentations-DSV5IHG5.js.map +0 -1
  285. package/dist/scheduler-VK4WFERV.js +0 -63
  286. package/dist/signal-6CGDFYL2.js +0 -35
  287. package/dist/slack-IZQWIKOH.js +0 -75
  288. package/dist/src-VYUE6LRA.js.map +0 -1
  289. package/dist/tools-2RLEI2N6.js +0 -38
  290. package/dist/tunnel-IWMXUML4.js.map +0 -1
  291. package/dist/whatsapp-LFX6YKCM.js +0 -35
  292. package/dist/word-document-7B6SJMAY.js.map +0 -1
  293. /package/dist/{audit-logger-OBPR7CRO.js.map → agent-manager-JZ4IM7XI.js.map} +0 -0
  294. /package/dist/{auth-UOX5K2BE.js.map → agent-types-2T4PXLFQ.js.map} +0 -0
  295. /package/dist/{backup-restore-PZ7CYYB7.js.map → analyzer-OTWE3ARE.js.map} +0 -0
  296. /package/dist/{archiver-AVNBYCKQ.js.map → archiver-FPGKRP6P.js.map} +0 -0
  297. /package/dist/{blocks-R3PODY47.js.map → audit-logger-CI4WZQPD.js.map} +0 -0
  298. /package/dist/{bot-QRARP4UN.js.map → auth-PH5IHISW.js.map} +0 -0
  299. /package/dist/{aws-s3-Q4LLZZPD.js.map → aws-s3-QZMURYXB.js.map} +0 -0
  300. /package/dist/{brain-7XLLM3KC.js.map → backup-restore-72OQTZO3.js.map} +0 -0
  301. /package/dist/{chunk-PLDDJCW6.js.map → blocks-YOWOESDD.js.map} +0 -0
  302. /package/dist/{client-ZQSFPMOB.js.map → bot-VDHBGUVI.js.map} +0 -0
  303. /package/dist/{clipboard-manager-TEO2GEDN.js.map → brain-6QTXN4QP.js.map} +0 -0
  304. /package/dist/{camera-monitor-M5CYKUU4.js.map → camera-monitor-LHTUWHEL.js.map} +0 -0
  305. /package/dist/{charts-V7ARZNKF.js.map → charts-FJ32GQK7.js.map} +0 -0
  306. /package/dist/{chunk-TVEWKIK3.js.map → chunk-2WTKTG2C.js.map} +0 -0
  307. /package/dist/{chunk-SJSUSJ47.js.map → chunk-BNZHWAZC.js.map} +0 -0
  308. /package/dist/{chunk-MQJ2ECQT.js.map → chunk-CUPEENUY.js.map} +0 -0
  309. /package/dist/{chunk-NHMBTUMW.js.map → chunk-CWT6CAE5.js.map} +0 -0
  310. /package/dist/{chunk-6PMVAAA7.js.map → chunk-HJSEEFO3.js.map} +0 -0
  311. /package/dist/{chunk-TYAGMJNV.js.map → chunk-HQZQFEAX.js.map} +0 -0
  312. /package/dist/{chunk-MXAPLSJ5.js.map → chunk-J4JW73TT.js.map} +0 -0
  313. /package/dist/{chunk-VEHFVBLI.js.map → chunk-JHYYFPKX.js.map} +0 -0
  314. /package/dist/{chunk-66OJ3WB4.js.map → chunk-PD3CTDO6.js.map} +0 -0
  315. /package/dist/{cron-explain-HHQKPD3M.js.map → chunk-UP2VWCW5.js.map} +0 -0
  316. /package/dist/{chunk-4UOE5TUZ.js.map → chunk-WMDVOWN6.js.map} +0 -0
  317. /package/dist/{crypto-4AP47IKC.js.map → chunker-K6WTR62A.js.map} +0 -0
  318. /package/dist/{databases-37X4CI2Y.js.map → client-FOIYPOZQ.js.map} +0 -0
  319. /package/dist/{discord-B3HUPGQ6.js.map → clipboard-manager-4SBNESGZ.js.map} +0 -0
  320. /package/dist/{enrichment-pipeline-MNHNW65K.js.map → cost-tracker-KZQSTSE2.js.map} +0 -0
  321. /package/dist/{entity-resolution-Y3IUWEAT.js.map → cron-explain-UOOOYWZZ.js.map} +0 -0
  322. /package/dist/{env-IWXUVTCB.js.map → crypto-2VG3RJR2.js.map} +0 -0
  323. /package/dist/{hash-tool-ULQYD7B5.js.map → databases-XDPMG5AV.js.map} +0 -0
  324. /package/dist/{heartbeat-monitor-GCISLXI3.js.map → db-I7MNG6CL.js.map} +0 -0
  325. /package/dist/{imessage-NGA2XF2V.js.map → discord-6UQHCN27.js.map} +0 -0
  326. /package/dist/{inbox-summarizer-NRI4S7IF.js.map → docx-parser-EXL4TN5E.js.map} +0 -0
  327. /package/dist/{inventory-manager-352OHXWD.js.map → enrichment-pipeline-7FE5R5ZI.js.map} +0 -0
  328. /package/dist/{json-tool-QE2SYHEG.js.map → entity-resolution-7Z6STVXX.js.map} +0 -0
  329. /package/dist/{key-rotation-DPHU4ZTB.js.map → env-GN5VHI43.js.map} +0 -0
  330. /package/dist/{mcp-3JI6W7ZE.js.map → error-tracker-64DEH3D7.js.map} +0 -0
  331. /package/dist/{google-workspace-DKWUVNGC.js.map → google-workspace-TSZPZK5G.js.map} +0 -0
  332. /package/dist/{ocr-AC7NPX33.js.map → graph-client-NB475AK5.js.map} +0 -0
  333. /package/dist/{ollama-BOAMSPLJ.js.map → hash-tool-ENAB5LWH.js.map} +0 -0
  334. /package/dist/{pages-MI523RB7.js.map → heartbeat-monitor-KRDYTDBF.js.map} +0 -0
  335. /package/dist/{pairing-IFQYCPNS.js.map → hooks-N4MIFBVM.js.map} +0 -0
  336. /package/dist/{image-generation-OSU7FP6F.js.map → image-generation-MDE6AVQO.js.map} +0 -0
  337. /package/dist/{pdf-ALQVOEJR.js.map → imessage-DSGSGUZS.js.map} +0 -0
  338. /package/dist/{prometheus-JNT2BD4L.js.map → inbox-summarizer-F2KAU72V.js.map} +0 -0
  339. /package/dist/{providers-J4LYPHDR.js.map → inventory-manager-C67BSZM6.js.map} +0 -0
  340. /package/dist/{jira-GSGDBMIG.js.map → jira-PAGZWUBJ.js.map} +0 -0
  341. /package/dist/{qr-code-WIX4PB4U.js.map → json-tool-4FK5RNER.js.map} +0 -0
  342. /package/dist/{regex-tool-W4ABRKGK.js.map → key-rotation-WCC5FOYS.js.map} +0 -0
  343. /package/dist/{scheduler-VK4WFERV.js.map → knowledge-base-5SMMOGQJ.js.map} +0 -0
  344. /package/dist/{mailchimp-KKNF6QJ7.js.map → mailchimp-ZFYDC44J.js.map} +0 -0
  345. /package/dist/{search-BCLBO5E3.js.map → mcp-DJ2QDA6A.js.map} +0 -0
  346. /package/dist/{signal-6CGDFYL2.js.map → metrics-BH3ZLGEV.js.map} +0 -0
  347. /package/dist/{microsoft365-UCBKJHNX.js.map → microsoft365-6G2IJMWC.js.map} +0 -0
  348. /package/dist/{slack-IZQWIKOH.js.map → oauth-UPJYFOVU.js.map} +0 -0
  349. /package/dist/{sms-M3JIOTCW.js.map → ocr-UONKTQU7.js.map} +0 -0
  350. /package/dist/{stocks-XXWBPOCU.js.map → ollama-J7CU45WT.js.map} +0 -0
  351. /package/dist/{text-transform-6SGUA5Z4.js.map → pages-XDE7JRCA.js.map} +0 -0
  352. /package/dist/{pair-JDFTERIK.js.map → pair-YZJFQUU5.js.map} +0 -0
  353. /package/dist/{tools-2RLEI2N6.js.map → pairing-77N47RAT.js.map} +0 -0
  354. /package/dist/{unit-converter-ZYXMEZOE.js.map → pdf-67HGXCFJ.js.map} +0 -0
  355. /package/dist/{whatsapp-LFX6YKCM.js.map → pdf-parser-YLMTTYHL.js.map} +0 -0
  356. /package/dist/{quickbooks-XB4NII2S.js.map → quickbooks-N675W7IK.js.map} +0 -0
  357. /package/dist/{sendgrid-RNXCAFKM.js.map → sendgrid-QGJIVPWV.js.map} +0 -0
  358. /package/dist/{shopify-NCXYJB4R.js.map → shopify-ON2PAU27.js.map} +0 -0
  359. /package/dist/{twilio-53GEW5JT.js.map → twilio-3L7DUNYQ.js.map} +0 -0
  360. /package/dist/{xero-QYO66D45.js.map → xero-UHAHVYSD.js.map} +0 -0
  361. /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-PLDDJCW6.js";
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
- // src/db/index.ts
630
- import { drizzle } from "drizzle-orm/postgres-js";
631
- import postgres from "postgres";
632
- var _client = null;
633
- var _db = null;
634
- function getDb() {
635
- if (!_db) {
636
- _client = postgres(env.DATABASE_URL);
637
- _db = drizzle(_client, { schema: schema_exports });
638
- }
639
- return _db;
640
- }
641
- var db = new Proxy(
642
- {},
628
+ var m365OauthStates = pgTable(
629
+ "m365_oauth_states",
643
630
  {
644
- get(_target, prop) {
645
- const instance = getDb();
646
- const value = instance[prop];
647
- if (typeof value === "function") {
648
- return value.bind(instance);
649
- }
650
- return value;
651
- }
652
- }
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
- db
716
+ m365OauthStates,
717
+ m365Connections,
718
+ m365AnalysisResults,
719
+ schema_exports
680
720
  };
681
- //# sourceMappingURL=chunk-XKYRH4FM.js.map
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":[]}