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
@@ -0,0 +1,66 @@
1
+ import {
2
+ SYSTEM_PROMPT,
3
+ chat,
4
+ chatWithTools,
5
+ compactConversation,
6
+ intentParser,
7
+ needsCompaction,
8
+ qualityScorer,
9
+ reflectionTracker,
10
+ requestTracer,
11
+ streamChat,
12
+ streamChatWithTools
13
+ } from "./chunk-ZMML6T63.js";
14
+ import "./chunk-5JJTLWOR.js";
15
+ import "./chunk-QPY3WRVM.js";
16
+ import "./chunk-ADTDYJO7.js";
17
+ import "./chunk-DTISLIMB.js";
18
+ import "./chunk-CUPEENUY.js";
19
+ import "./chunk-2WTKTG2C.js";
20
+ import "./chunk-U2X2J3FI.js";
21
+ import "./chunk-X6Q3K3L2.js";
22
+ import "./chunk-ODCFS5WD.js";
23
+ import "./chunk-KM22GV7G.js";
24
+ import "./chunk-P6QINGFL.js";
25
+ import "./chunk-HJSEEFO3.js";
26
+ import "./chunk-C6PELIHS.js";
27
+ import "./chunk-7WQO5J2M.js";
28
+ import "./chunk-WMFYI7XC.js";
29
+ import "./chunk-YEDEAX6Y.js";
30
+ import {
31
+ costTracker,
32
+ modelRouter
33
+ } from "./chunk-6ZNCY2GI.js";
34
+ import "./chunk-WZAH34TG.js";
35
+ import "./chunk-6KONMXQ6.js";
36
+ import "./chunk-22VGGA7S.js";
37
+ import "./chunk-HN3F4WSW.js";
38
+ import "./chunk-V3OKHQUX.js";
39
+ import "./chunk-2I5QHYG6.js";
40
+ import "./chunk-CZTMGHUC.js";
41
+ import "./chunk-4WH6MFEW.js";
42
+ import "./chunk-GW6V4D43.js";
43
+ import "./chunk-DOYGMNMK.js";
44
+ import "./chunk-CQ4JURG7.js";
45
+ import "./chunk-BBN4VCNK.js";
46
+ import "./chunk-5BTVJR7R.js";
47
+ import "./chunk-4KIHDIXZ.js";
48
+ import "./chunk-ZIBRVA3Y.js";
49
+ import "./chunk-35WYTA3C.js";
50
+ import "./chunk-UP2VWCW5.js";
51
+ export {
52
+ SYSTEM_PROMPT,
53
+ chat,
54
+ chatWithTools,
55
+ compactConversation,
56
+ costTracker,
57
+ intentParser,
58
+ modelRouter,
59
+ needsCompaction,
60
+ qualityScorer,
61
+ reflectionTracker,
62
+ requestTracer,
63
+ streamChat,
64
+ streamChatWithTools
65
+ };
66
+ //# sourceMappingURL=brain-6QTXN4QP.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  __require
3
- } from "./chunk-PLDDJCW6.js";
3
+ } from "./chunk-UP2VWCW5.js";
4
4
 
5
5
  // src/tools/camera-monitor.ts
6
6
  import { spawn, execSync } from "child_process";
@@ -332,4 +332,4 @@ export {
332
332
  snapshotHA,
333
333
  snapshotRTSP
334
334
  };
335
- //# sourceMappingURL=camera-monitor-M5CYKUU4.js.map
335
+ //# sourceMappingURL=camera-monitor-LHTUWHEL.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  isPathAllowed
3
3
  } from "./chunk-CQ4JURG7.js";
4
- import "./chunk-PLDDJCW6.js";
4
+ import "./chunk-UP2VWCW5.js";
5
5
 
6
6
  // src/tools/file-generation/charts.ts
7
7
  import { join } from "path";
@@ -238,4 +238,4 @@ export {
238
238
  generateChart,
239
239
  quickChart
240
240
  };
241
- //# sourceMappingURL=charts-V7ARZNKF.js.map
241
+ //# sourceMappingURL=charts-FJ32GQK7.js.map
@@ -1,8 +1,10 @@
1
1
  import {
2
- db,
2
+ db
3
+ } from "./chunk-5BTVJR7R.js";
4
+ import {
3
5
  graphEntities,
4
6
  graphRelationships
5
- } from "./chunk-XKYRH4FM.js";
7
+ } from "./chunk-ZIBRVA3Y.js";
6
8
 
7
9
  // src/core/intelligence/entity-resolution.ts
8
10
  import { eq, ilike, sql } from "drizzle-orm";
@@ -262,4 +264,4 @@ export {
262
264
  mergeEntities,
263
265
  findDuplicates
264
266
  };
265
- //# sourceMappingURL=chunk-WRAKK6K6.js.map
267
+ //# sourceMappingURL=chunk-2I5QHYG6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/intelligence/entity-resolution.ts"],"sourcesContent":["/**\r\n * Entity Resolution Pipeline\r\n *\r\n * Resolves, deduplicates, and matches entities across multiple public records\r\n * databases (FEC, IRS 990, USAspending, SEC EDGAR, OpenCorporates).\r\n *\r\n * Flow: exact match → identifier match (EIN/CIK/FEC) → fuzzy match → create new\r\n */\r\n\r\nimport { db } from \"../../db\";\r\nimport { graphEntities, graphRelationships } from \"../../db/schema\";\r\nimport { eq, ilike, sql } from \"drizzle-orm\";\r\n\r\n// Extended entity type for OSINT sources\r\nexport type OSINTEntityType =\r\n | \"person\"\r\n | \"organization\"\r\n | \"committee\"\r\n | \"contract\"\r\n | \"filing\"\r\n | \"location\"\r\n | \"topic\";\r\n\r\nexport interface EntityCandidate {\r\n name: string;\r\n type: OSINTEntityType;\r\n source: string; // \"fec\" | \"irs990\" | \"usaspending\" | \"sec\" | \"opencorporates\" | \"manual\"\r\n identifiers?: {\r\n ein?: string;\r\n cik?: string;\r\n fecId?: string;\r\n duns?: string;\r\n uei?: string;\r\n };\r\n attributes?: Record<string, unknown>;\r\n aliases?: string[];\r\n}\r\n\r\nexport interface ResolvedEntity {\r\n isNew: boolean;\r\n entityId: string; // postgres graphEntities.id\r\n confidence: number; // 0-1\r\n matchedBy: \"exact\" | \"fuzzy\" | \"identifier\" | \"new\";\r\n}\r\n\r\n/**\r\n * Normalize an entity name for comparison.\r\n * Strips punctuation, extra whitespace, common suffixes.\r\n */\r\nexport function normalizeEntityName(name: string): string {\r\n return name\r\n .toLowerCase()\r\n .replace(/[.,;:'\"!?()\\[\\]{}]/g, \"\")\r\n .replace(/\\b(inc|llc|corp|ltd|co|foundation|fund|assoc|association|committee|pac)\\b\\.?/gi, \"\")\r\n .replace(/\\s+/g, \" \")\r\n .trim();\r\n}\r\n\r\n/**\r\n * Jaro-Winkler similarity between two strings (0-1).\r\n */\r\nexport function fuzzyMatch(a: string, b: string): number {\r\n const s1 = normalizeEntityName(a);\r\n const s2 = normalizeEntityName(b);\r\n\r\n if (s1 === s2) return 1.0;\r\n if (s1.length === 0 || s2.length === 0) return 0.0;\r\n\r\n const matchWindow = Math.max(Math.floor(Math.max(s1.length, s2.length) / 2) - 1, 0);\r\n const s1Matches = new Array(s1.length).fill(false);\r\n const s2Matches = new Array(s2.length).fill(false);\r\n\r\n let matches = 0;\r\n let transpositions = 0;\r\n\r\n for (let i = 0; i < s1.length; i++) {\r\n const start = Math.max(0, i - matchWindow);\r\n const end = Math.min(i + matchWindow + 1, s2.length);\r\n for (let j = start; j < end; j++) {\r\n if (s2Matches[j] || s1[i] !== s2[j]) continue;\r\n s1Matches[i] = true;\r\n s2Matches[j] = true;\r\n matches++;\r\n break;\r\n }\r\n }\r\n\r\n if (matches === 0) return 0.0;\r\n\r\n let k = 0;\r\n for (let i = 0; i < s1.length; i++) {\r\n if (!s1Matches[i]) continue;\r\n while (!s2Matches[k]) k++;\r\n if (s1[i] !== s2[k]) transpositions++;\r\n k++;\r\n }\r\n\r\n const jaro =\r\n (matches / s1.length + matches / s2.length + (matches - transpositions / 2) / matches) / 3;\r\n\r\n // Winkler bonus for common prefix (up to 4 chars)\r\n let prefix = 0;\r\n for (let i = 0; i < Math.min(4, Math.min(s1.length, s2.length)); i++) {\r\n if (s1[i] === s2[i]) prefix++;\r\n else break;\r\n }\r\n\r\n return jaro + prefix * 0.1 * (1 - jaro);\r\n}\r\n\r\n/**\r\n * Match entity by EIN (Employer Identification Number).\r\n */\r\nexport async function matchByEIN(ein: string): Promise<string | null> {\r\n try {\r\n const results = await db\r\n .select({ id: graphEntities.id })\r\n .from(graphEntities)\r\n .where(sql`${graphEntities.attributes}->>'ein' = ${ein}`)\r\n .limit(1);\r\n return results.length > 0 ? results[0].id : null;\r\n } catch (error) {\r\n console.error(\"[EntityResolution] EIN match error:\", error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Match entity by CIK (SEC Central Index Key).\r\n */\r\nexport async function matchByCIK(cik: string): Promise<string | null> {\r\n try {\r\n const results = await db\r\n .select({ id: graphEntities.id })\r\n .from(graphEntities)\r\n .where(sql`${graphEntities.attributes}->>'cik' = ${cik}`)\r\n .limit(1);\r\n return results.length > 0 ? results[0].id : null;\r\n } catch (error) {\r\n console.error(\"[EntityResolution] CIK match error:\", error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Match entity by FEC committee/candidate ID.\r\n */\r\nexport async function matchByFECId(fecId: string): Promise<string | null> {\r\n try {\r\n const results = await db\r\n .select({ id: graphEntities.id })\r\n .from(graphEntities)\r\n .where(sql`${graphEntities.attributes}->>'fecId' = ${fecId}`)\r\n .limit(1);\r\n return results.length > 0 ? results[0].id : null;\r\n } catch (error) {\r\n console.error(\"[EntityResolution] FEC ID match error:\", error);\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * Core entity resolution function.\r\n * Resolves a candidate entity against the existing knowledge graph.\r\n *\r\n * Resolution order:\r\n * 1. Exact name match\r\n * 2. Identifier match (EIN, CIK, FEC ID)\r\n * 3. Fuzzy name match (Jaro-Winkler > 0.85)\r\n * 4. Create new entity\r\n */\r\nexport async function resolveEntity(candidate: EntityCandidate): Promise<ResolvedEntity> {\r\n try {\r\n // 1. Exact name match\r\n const exactMatches = await db\r\n .select({ id: graphEntities.id })\r\n .from(graphEntities)\r\n .where(ilike(graphEntities.name, candidate.name))\r\n .limit(1);\r\n\r\n if (exactMatches.length > 0) {\r\n // Update with new source attributes\r\n await mergeAttributes(exactMatches[0].id, candidate);\r\n return {\r\n isNew: false,\r\n entityId: exactMatches[0].id,\r\n confidence: 1.0,\r\n matchedBy: \"exact\",\r\n };\r\n }\r\n\r\n // 2. Identifier match\r\n if (candidate.identifiers) {\r\n if (candidate.identifiers.ein) {\r\n const id = await matchByEIN(candidate.identifiers.ein);\r\n if (id) {\r\n await mergeAttributes(id, candidate);\r\n return { isNew: false, entityId: id, confidence: 0.99, matchedBy: \"identifier\" };\r\n }\r\n }\r\n if (candidate.identifiers.cik) {\r\n const id = await matchByCIK(candidate.identifiers.cik);\r\n if (id) {\r\n await mergeAttributes(id, candidate);\r\n return { isNew: false, entityId: id, confidence: 0.99, matchedBy: \"identifier\" };\r\n }\r\n }\r\n if (candidate.identifiers.fecId) {\r\n const id = await matchByFECId(candidate.identifiers.fecId);\r\n if (id) {\r\n await mergeAttributes(id, candidate);\r\n return { isNew: false, entityId: id, confidence: 0.99, matchedBy: \"identifier\" };\r\n }\r\n }\r\n }\r\n\r\n // 3. Fuzzy name match against existing entities of the same type\r\n const typeFilter = [\"person\", \"organization\", \"committee\"].includes(candidate.type)\r\n ? candidate.type\r\n : undefined;\r\n\r\n const potentialMatches = await db\r\n .select({ id: graphEntities.id, name: graphEntities.name, aliases: graphEntities.aliases })\r\n .from(graphEntities)\r\n .where(typeFilter ? eq(graphEntities.type, typeFilter as any) : sql`true`)\r\n .limit(500);\r\n\r\n let bestMatch: { id: string; score: number } | null = null;\r\n\r\n for (const entity of potentialMatches) {\r\n // Check main name\r\n const nameScore = fuzzyMatch(candidate.name, entity.name);\r\n if (nameScore > (bestMatch?.score ?? 0.85)) {\r\n bestMatch = { id: entity.id, score: nameScore };\r\n }\r\n\r\n // Check aliases\r\n const aliases = (entity.aliases as string[]) || [];\r\n for (const alias of aliases) {\r\n const aliasScore = fuzzyMatch(candidate.name, alias);\r\n if (aliasScore > (bestMatch?.score ?? 0.85)) {\r\n bestMatch = { id: entity.id, score: aliasScore };\r\n }\r\n }\r\n }\r\n\r\n if (bestMatch) {\r\n await mergeAttributes(bestMatch.id, candidate);\r\n return {\r\n isNew: false,\r\n entityId: bestMatch.id,\r\n confidence: bestMatch.score,\r\n matchedBy: \"fuzzy\",\r\n };\r\n }\r\n\r\n // 4. Create new entity\r\n const newEntity = await db\r\n .insert(graphEntities)\r\n .values({\r\n type: mapOSINTTypeToGraphType(candidate.type) as any,\r\n name: candidate.name,\r\n aliases: candidate.aliases || [],\r\n description: `Discovered from ${candidate.source}`,\r\n attributes: {\r\n ...candidate.attributes,\r\n ...candidate.identifiers,\r\n sources: [candidate.source],\r\n discoveredAt: new Date().toISOString(),\r\n },\r\n importance: 5,\r\n mentionCount: 1,\r\n })\r\n .returning({ id: graphEntities.id });\r\n\r\n console.log(`[EntityResolution] Created new entity: ${candidate.name} (${candidate.type}) from ${candidate.source}`);\r\n\r\n return {\r\n isNew: true,\r\n entityId: newEntity[0].id,\r\n confidence: 1.0,\r\n matchedBy: \"new\",\r\n };\r\n } catch (error) {\r\n console.error(\"[EntityResolution] Error resolving entity:\", error);\r\n throw error;\r\n }\r\n}\r\n\r\n/**\r\n * Merge new attributes and aliases into an existing entity.\r\n */\r\nasync function mergeAttributes(entityId: string, candidate: EntityCandidate): Promise<void> {\r\n try {\r\n const existing = await db\r\n .select({ attributes: graphEntities.attributes, aliases: graphEntities.aliases, mentionCount: graphEntities.mentionCount })\r\n .from(graphEntities)\r\n .where(eq(graphEntities.id, entityId))\r\n .limit(1);\r\n\r\n if (existing.length === 0) return;\r\n\r\n const currentAttrs = (existing[0].attributes as Record<string, unknown>) || {};\r\n const currentAliases = (existing[0].aliases as string[]) || [];\r\n const currentSources = (currentAttrs.sources as string[]) || [];\r\n\r\n // Merge attributes\r\n const mergedAttrs = {\r\n ...currentAttrs,\r\n ...candidate.attributes,\r\n ...candidate.identifiers,\r\n sources: [...new Set([...currentSources, candidate.source])],\r\n lastUpdated: new Date().toISOString(),\r\n };\r\n\r\n // Merge aliases\r\n const newAliases = candidate.aliases || [];\r\n const mergedAliases = [...new Set([...currentAliases, ...newAliases])];\r\n\r\n await db\r\n .update(graphEntities)\r\n .set({\r\n attributes: mergedAttrs,\r\n aliases: mergedAliases,\r\n mentionCount: (existing[0].mentionCount || 0) + 1,\r\n })\r\n .where(eq(graphEntities.id, entityId));\r\n } catch (error) {\r\n console.error(\"[EntityResolution] Error merging attributes:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Map OSINT entity types to the existing graph entity types.\r\n */\r\nfunction mapOSINTTypeToGraphType(type: OSINTEntityType): string {\r\n switch (type) {\r\n case \"person\": return \"person\";\r\n case \"organization\": return \"organization\";\r\n case \"committee\": return \"organization\";\r\n case \"contract\": return \"event\";\r\n case \"filing\": return \"event\";\r\n case \"location\": return \"location\";\r\n case \"topic\": return \"topic\";\r\n default: return \"organization\";\r\n }\r\n}\r\n\r\n/**\r\n * Merge two entities (mark duplicate as alias of primary).\r\n */\r\nexport async function mergeEntities(primaryId: string, duplicateId: string): Promise<void> {\r\n try {\r\n const [primary, duplicate] = await Promise.all([\r\n db.select().from(graphEntities).where(eq(graphEntities.id, primaryId)).limit(1),\r\n db.select().from(graphEntities).where(eq(graphEntities.id, duplicateId)).limit(1),\r\n ]);\r\n\r\n if (primary.length === 0 || duplicate.length === 0) return;\r\n\r\n // Add duplicate name as alias\r\n const aliases = [...new Set([\r\n ...((primary[0].aliases as string[]) || []),\r\n duplicate[0].name,\r\n ...((duplicate[0].aliases as string[]) || []),\r\n ])];\r\n\r\n // Merge attributes\r\n const mergedAttrs = {\r\n ...((duplicate[0].attributes as Record<string, unknown>) || {}),\r\n ...((primary[0].attributes as Record<string, unknown>) || {}),\r\n };\r\n\r\n await db\r\n .update(graphEntities)\r\n .set({ aliases, attributes: mergedAttrs })\r\n .where(eq(graphEntities.id, primaryId));\r\n\r\n // Reassign all relationships from duplicate to primary\r\n await db\r\n .update(graphRelationships)\r\n .set({ sourceEntityId: primaryId })\r\n .where(eq(graphRelationships.sourceEntityId, duplicateId));\r\n\r\n await db\r\n .update(graphRelationships)\r\n .set({ targetEntityId: primaryId })\r\n .where(eq(graphRelationships.targetEntityId, duplicateId));\r\n\r\n // Delete the duplicate\r\n await db.delete(graphEntities).where(eq(graphEntities.id, duplicateId));\r\n\r\n console.log(`[EntityResolution] Merged entity ${duplicate[0].name} into ${primary[0].name}`);\r\n } catch (error) {\r\n console.error(\"[EntityResolution] Error merging entities:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Find potential duplicate entities based on fuzzy matching.\r\n */\r\nexport async function findDuplicates(\r\n threshold: number = 0.85\r\n): Promise<Array<{ entities: [string, string]; names: [string, string]; score: number }>> {\r\n try {\r\n const allEntities = await db\r\n .select({ id: graphEntities.id, name: graphEntities.name })\r\n .from(graphEntities)\r\n .limit(1000);\r\n\r\n const duplicates: Array<{ entities: [string, string]; names: [string, string]; score: number }> = [];\r\n\r\n for (let i = 0; i < allEntities.length; i++) {\r\n for (let j = i + 1; j < allEntities.length; j++) {\r\n const score = fuzzyMatch(allEntities[i].name, allEntities[j].name);\r\n if (score >= threshold && score < 1.0) {\r\n duplicates.push({\r\n entities: [allEntities[i].id, allEntities[j].id],\r\n names: [allEntities[i].name, allEntities[j].name],\r\n score,\r\n });\r\n }\r\n }\r\n }\r\n\r\n return duplicates.sort((a, b) => b.score - a.score);\r\n } catch (error) {\r\n console.error(\"[EntityResolution] Error finding duplicates:\", error);\r\n return [];\r\n }\r\n}\r\n"],"mappings":"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","names":[]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  getNotionClient,
3
3
  init_client
4
- } from "./chunk-VRD5CYRL.js";
4
+ } from "./chunk-C6PELIHS.js";
5
5
 
6
6
  // src/integrations/notion/blocks.ts
7
7
  init_client();
@@ -449,4 +449,4 @@ export {
449
449
  markdownToBlocks,
450
450
  blocksToMarkdown
451
451
  };
452
- //# sourceMappingURL=chunk-TVEWKIK3.js.map
452
+ //# sourceMappingURL=chunk-2WTKTG2C.js.map
@@ -0,0 +1,143 @@
1
+ import {
2
+ createLogger
3
+ } from "./chunk-7BNFELEK.js";
4
+ import {
5
+ db
6
+ } from "./chunk-5BTVJR7R.js";
7
+ import {
8
+ env
9
+ } from "./chunk-4KIHDIXZ.js";
10
+ import {
11
+ m365OauthStates
12
+ } from "./chunk-ZIBRVA3Y.js";
13
+
14
+ // src/integrations/m365/oauth.ts
15
+ import { createHash, randomBytes } from "crypto";
16
+ import { eq, lt } from "drizzle-orm";
17
+ var log = createLogger("m365:oauth");
18
+ var STATE_TTL_MS = 10 * 60 * 1e3;
19
+ function getM365Config() {
20
+ if (!env.M365_CLIENT_ID || !env.M365_CLIENT_SECRET) return null;
21
+ return {
22
+ clientId: env.M365_CLIENT_ID,
23
+ clientSecret: env.M365_CLIENT_SECRET,
24
+ tenantId: env.M365_TENANT_ID || "common",
25
+ redirectUri: env.M365_REDIRECT_URI || `http://localhost:${env.PORT}/api/m365/auth/callback`,
26
+ scopes: env.M365_GRAPH_SCOPES
27
+ };
28
+ }
29
+ function isM365Configured() {
30
+ return getM365Config() !== null;
31
+ }
32
+ function base64Url(buf) {
33
+ return buf.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
34
+ }
35
+ function generateCodeVerifier() {
36
+ return base64Url(randomBytes(32));
37
+ }
38
+ function generateCodeChallenge(verifier) {
39
+ return base64Url(createHash("sha256").update(verifier).digest());
40
+ }
41
+ async function persistState(opts) {
42
+ await db.insert(m365OauthStates).values({
43
+ state: opts.state,
44
+ codeVerifier: opts.codeVerifier,
45
+ userKey: opts.userKey ?? null,
46
+ returnTo: opts.returnTo ?? null,
47
+ expiresAt: new Date(Date.now() + STATE_TTL_MS)
48
+ });
49
+ }
50
+ async function consumeState(state) {
51
+ const rows = await db.select().from(m365OauthStates).where(eq(m365OauthStates.state, state)).limit(1);
52
+ if (rows.length === 0) return null;
53
+ const row = rows[0];
54
+ await db.delete(m365OauthStates).where(eq(m365OauthStates.state, state));
55
+ if (row.expiresAt.getTime() < Date.now()) {
56
+ log.warn("state expired", { state });
57
+ return null;
58
+ }
59
+ return {
60
+ codeVerifier: row.codeVerifier,
61
+ userKey: row.userKey,
62
+ returnTo: row.returnTo
63
+ };
64
+ }
65
+ async function cleanupExpiredStates() {
66
+ const result = await db.delete(m365OauthStates).where(lt(m365OauthStates.expiresAt, /* @__PURE__ */ new Date()));
67
+ return result?.count ?? 0;
68
+ }
69
+ function buildAuthorizeUrl(config, params) {
70
+ const query = new URLSearchParams({
71
+ client_id: config.clientId,
72
+ response_type: "code",
73
+ redirect_uri: config.redirectUri,
74
+ response_mode: "query",
75
+ scope: config.scopes,
76
+ state: params.state,
77
+ code_challenge: params.codeChallenge,
78
+ code_challenge_method: "S256"
79
+ });
80
+ if (params.loginHint) query.set("login_hint", params.loginHint);
81
+ return `https://login.microsoftonline.com/${config.tenantId}/oauth2/v2.0/authorize?${query.toString()}`;
82
+ }
83
+ async function postToken(config, body) {
84
+ const url = `https://login.microsoftonline.com/${config.tenantId}/oauth2/v2.0/token`;
85
+ const res = await fetch(url, {
86
+ method: "POST",
87
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
88
+ body: body.toString()
89
+ });
90
+ const data = await res.json();
91
+ if (!res.ok || data.error || !data.access_token) {
92
+ const msg = data.error_description || data.error || `token endpoint returned ${res.status}`;
93
+ throw new Error(`M365 token exchange failed: ${msg}`);
94
+ }
95
+ return {
96
+ accessToken: data.access_token,
97
+ refreshToken: data.refresh_token,
98
+ expiresAt: new Date(Date.now() + data.expires_in * 1e3),
99
+ scope: data.scope,
100
+ tokenType: data.token_type ?? "Bearer"
101
+ };
102
+ }
103
+ async function exchangeCodeForTokens(config, code, codeVerifier) {
104
+ const body = new URLSearchParams({
105
+ client_id: config.clientId,
106
+ client_secret: config.clientSecret,
107
+ grant_type: "authorization_code",
108
+ code,
109
+ redirect_uri: config.redirectUri,
110
+ code_verifier: codeVerifier
111
+ });
112
+ return postToken(config, body);
113
+ }
114
+ async function refreshTokens(config, refreshToken) {
115
+ const body = new URLSearchParams({
116
+ client_id: config.clientId,
117
+ client_secret: config.clientSecret,
118
+ grant_type: "refresh_token",
119
+ refresh_token: refreshToken,
120
+ scope: config.scopes
121
+ });
122
+ return postToken(config, body);
123
+ }
124
+ var REFRESH_BUFFER_MS = 2 * 60 * 1e3;
125
+ function shouldRefresh(expiresAt) {
126
+ return expiresAt.getTime() - Date.now() < REFRESH_BUFFER_MS;
127
+ }
128
+
129
+ export {
130
+ getM365Config,
131
+ isM365Configured,
132
+ generateCodeVerifier,
133
+ generateCodeChallenge,
134
+ persistState,
135
+ consumeState,
136
+ cleanupExpiredStates,
137
+ buildAuthorizeUrl,
138
+ exchangeCodeForTokens,
139
+ refreshTokens,
140
+ REFRESH_BUFFER_MS,
141
+ shouldRefresh
142
+ };
143
+ //# sourceMappingURL=chunk-3AWAWRWB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/integrations/m365/oauth.ts"],"sourcesContent":["/**\n * Microsoft 365 / Entra ID OAuth helpers.\n *\n * Implements the Authorization Code flow with PKCE and a server-side state\n * store for CSRF protection. No client secret is leaked to the browser.\n *\n * Flow:\n * 1. buildLoginUrl() — generate state + code_verifier, persist, redirect user.\n * 2. exchangeCode() — on callback, verify state, exchange code for tokens.\n * 3. refreshTokens() — called by token-store when access_token is near expiry.\n */\n\nimport { createHash, randomBytes } from \"crypto\";\nimport { db, m365OauthStates } from \"../../db\";\nimport { env } from \"../../config/env\";\nimport { createLogger } from \"../../core/logger\";\nimport { eq, lt } from \"drizzle-orm\";\n\nconst log = createLogger(\"m365:oauth\");\n\nconst STATE_TTL_MS = 10 * 60 * 1000; // 10 minutes\n\nexport interface TokenSet {\n accessToken: string;\n refreshToken?: string;\n expiresAt: Date;\n scope?: string;\n tokenType: string;\n}\n\nexport interface M365Config {\n clientId: string;\n clientSecret: string;\n tenantId: string;\n redirectUri: string;\n scopes: string;\n}\n\nexport function getM365Config(): M365Config | null {\n if (!env.M365_CLIENT_ID || !env.M365_CLIENT_SECRET) return null;\n return {\n clientId: env.M365_CLIENT_ID,\n clientSecret: env.M365_CLIENT_SECRET,\n tenantId: env.M365_TENANT_ID || \"common\",\n redirectUri:\n env.M365_REDIRECT_URI || `http://localhost:${env.PORT}/api/m365/auth/callback`,\n scopes: env.M365_GRAPH_SCOPES,\n };\n}\n\nexport function isM365Configured(): boolean {\n return getM365Config() !== null;\n}\n\n// ---------------------------------------------------------------------------\n// PKCE helpers\n// ---------------------------------------------------------------------------\n\nfunction base64Url(buf: Buffer): string {\n return buf.toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=/g, \"\");\n}\n\nexport function generateCodeVerifier(): string {\n return base64Url(randomBytes(32));\n}\n\nexport function generateCodeChallenge(verifier: string): string {\n return base64Url(createHash(\"sha256\").update(verifier).digest());\n}\n\n// ---------------------------------------------------------------------------\n// State store — persisted so we can validate across redirect\n// ---------------------------------------------------------------------------\n\nexport async function persistState(opts: {\n state: string;\n codeVerifier: string;\n userKey?: string;\n returnTo?: string;\n}): Promise<void> {\n await db.insert(m365OauthStates).values({\n state: opts.state,\n codeVerifier: opts.codeVerifier,\n userKey: opts.userKey ?? null,\n returnTo: opts.returnTo ?? null,\n expiresAt: new Date(Date.now() + STATE_TTL_MS),\n });\n}\n\nexport async function consumeState(state: string): Promise<{\n codeVerifier: string;\n userKey: string | null;\n returnTo: string | null;\n} | null> {\n const rows = await db.select().from(m365OauthStates).where(eq(m365OauthStates.state, state)).limit(1);\n if (rows.length === 0) return null;\n const row = rows[0];\n await db.delete(m365OauthStates).where(eq(m365OauthStates.state, state));\n\n if (row.expiresAt.getTime() < Date.now()) {\n log.warn(\"state expired\", { state });\n return null;\n }\n\n return {\n codeVerifier: row.codeVerifier,\n userKey: row.userKey,\n returnTo: row.returnTo,\n };\n}\n\n// Periodic cleanup — call opportunistically from routes\nexport async function cleanupExpiredStates(): Promise<number> {\n const result = await db.delete(m365OauthStates).where(lt(m365OauthStates.expiresAt, new Date()));\n return (result as any)?.count ?? 0;\n}\n\n// ---------------------------------------------------------------------------\n// URL builders / token exchange\n// ---------------------------------------------------------------------------\n\nexport function buildAuthorizeUrl(\n config: M365Config,\n params: { state: string; codeChallenge: string; loginHint?: string }\n): string {\n const query = new URLSearchParams({\n client_id: config.clientId,\n response_type: \"code\",\n redirect_uri: config.redirectUri,\n response_mode: \"query\",\n scope: config.scopes,\n state: params.state,\n code_challenge: params.codeChallenge,\n code_challenge_method: \"S256\",\n });\n if (params.loginHint) query.set(\"login_hint\", params.loginHint);\n\n return `https://login.microsoftonline.com/${config.tenantId}/oauth2/v2.0/authorize?${query.toString()}`;\n}\n\ninterface TokenResponse {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n scope?: string;\n token_type?: string;\n error?: string;\n error_description?: string;\n}\n\nasync function postToken(config: M365Config, body: URLSearchParams): Promise<TokenSet> {\n const url = `https://login.microsoftonline.com/${config.tenantId}/oauth2/v2.0/token`;\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: body.toString(),\n });\n const data = (await res.json()) as TokenResponse;\n\n if (!res.ok || data.error || !data.access_token) {\n const msg = data.error_description || data.error || `token endpoint returned ${res.status}`;\n throw new Error(`M365 token exchange failed: ${msg}`);\n }\n\n return {\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n expiresAt: new Date(Date.now() + data.expires_in * 1000),\n scope: data.scope,\n tokenType: data.token_type ?? \"Bearer\",\n };\n}\n\nexport async function exchangeCodeForTokens(\n config: M365Config,\n code: string,\n codeVerifier: string\n): Promise<TokenSet> {\n const body = new URLSearchParams({\n client_id: config.clientId,\n client_secret: config.clientSecret,\n grant_type: \"authorization_code\",\n code,\n redirect_uri: config.redirectUri,\n code_verifier: codeVerifier,\n });\n return postToken(config, body);\n}\n\nexport async function refreshTokens(\n config: M365Config,\n refreshToken: string\n): Promise<TokenSet> {\n const body = new URLSearchParams({\n client_id: config.clientId,\n client_secret: config.clientSecret,\n grant_type: \"refresh_token\",\n refresh_token: refreshToken,\n scope: config.scopes,\n });\n return postToken(config, body);\n}\n\n// Expiry buffer — refresh if access_token has less than this many ms left.\nexport const REFRESH_BUFFER_MS = 2 * 60 * 1000;\n\nexport function shouldRefresh(expiresAt: Date): boolean {\n return expiresAt.getTime() - Date.now() < REFRESH_BUFFER_MS;\n}\n"],"mappings":"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","names":[]}
@@ -76,6 +76,10 @@ var envSchema = z.object({
76
76
  GIPHY_API_KEY: z.string().optional(),
77
77
  // Finance (optional)
78
78
  ALPHA_VANTAGE_API_KEY: z.string().optional(),
79
+ FRED_API_KEY: z.string().optional(),
80
+ // Federal Reserve Economic Data
81
+ FINNHUB_API_KEY: z.string().optional(),
82
+ // Finnhub financial market data
79
83
  // Exchange Trading (optional)
80
84
  COINBASE_API_KEY: z.string().optional(),
81
85
  COINBASE_PRIVATE_KEY: z.string().optional(),
@@ -83,6 +87,10 @@ var envSchema = z.object({
83
87
  BINANCE_API_SECRET: z.string().optional(),
84
88
  BINANCE_TESTNET: z.coerce.boolean().optional().default(false),
85
89
  EXCHANGE_REQUIRE_CONFIRMATION: z.coerce.boolean().optional().default(true),
90
+ EXCHANGE_MAX_TRADE_SIZE: z.coerce.number().optional().default(100),
91
+ EXCHANGE_MAX_DAILY_SPEND: z.coerce.number().optional().default(500),
92
+ EXCHANGE_MAX_TRADES_PER_HOUR: z.coerce.number().optional().default(5),
93
+ EXCHANGE_AGENT_TRADING_ENABLED: z.coerce.boolean().optional().default(false),
86
94
  // DeFi (optional)
87
95
  DEFILLAMA_API_KEY: z.string().optional(),
88
96
  // Pro tier
@@ -113,6 +121,17 @@ var envSchema = z.object({
113
121
  OUTLOOK_CLIENT_SECRET: z.string().optional(),
114
122
  OUTLOOK_REDIRECT_URI: z.string().url().optional(),
115
123
  OUTLOOK_REFRESH_TOKEN: z.string().optional(),
124
+ // Microsoft 365 / Entra ID (Graph API — mail, files, sites)
125
+ // Scoped broader than Outlook Calendar: powers /api/m365/* routes.
126
+ M365_CLIENT_ID: z.string().optional(),
127
+ M365_CLIENT_SECRET: z.string().optional(),
128
+ M365_TENANT_ID: z.string().optional().default("common"),
129
+ M365_REDIRECT_URI: z.string().optional(),
130
+ M365_GRAPH_SCOPES: z.string().optional().default(
131
+ "openid profile offline_access User.Read Mail.Read Mail.ReadWrite Mail.Send Calendars.Read Files.Read"
132
+ ),
133
+ M365_ANALYZE_RATE_LIMIT: z.coerce.number().optional().default(30),
134
+ M365_ANALYZE_RATE_REFILL: z.coerce.number().optional().default(0.5),
116
135
  // Dropbox (additional OAuth fields)
117
136
  DROPBOX_CLIENT_ID: z.string().optional(),
118
137
  DROPBOX_CLIENT_SECRET: z.string().optional(),
@@ -130,6 +149,12 @@ var envSchema = z.object({
130
149
  OPENAI_COMPATIBLE_API_KEY: z.string().optional(),
131
150
  OPENAI_COMPATIBLE_BASE_URL: z.string().optional(),
132
151
  OPENAI_COMPATIBLE_MODEL: z.string().optional(),
152
+ // xAI (Grok)
153
+ XAI_API_KEY: z.string().optional(),
154
+ XAI_DEFAULT_MODEL: z.string().optional().default("grok-2"),
155
+ // Google Gemini (optional)
156
+ GEMINI_API_KEY: z.string().optional(),
157
+ GEMINI_DEFAULT_MODEL: z.string().optional().default("gemini-2.0-flash"),
133
158
  // Ollama (local models)
134
159
  OLLAMA_ENABLED: z.coerce.boolean().optional().default(false),
135
160
  OLLAMA_BASE_URL: z.string().optional().default("http://localhost:11434"),
@@ -222,6 +247,22 @@ var envSchema = z.object({
222
247
  MULTISTEP_MAX_STEPS: z.coerce.number().optional().default(2),
223
248
  RETRIEVAL_CACHE_ENABLED: z.coerce.boolean().optional().default(false),
224
249
  CONTEXTUAL_QUERY_ENABLED: z.coerce.boolean().optional().default(false),
250
+ // Agentic RAG Pipeline
251
+ TOOL_CLASSIFIER_ENABLED: z.coerce.boolean().optional().default(false),
252
+ TOOL_CLASSIFIER_TIMEOUT_MS: z.coerce.number().optional().default(5e3),
253
+ TOOL_CLASSIFIER_MAX_CATEGORIES: z.coerce.number().optional().default(3),
254
+ // AI Memory (auto-extract/search)
255
+ AUTO_MEMORY_EXTRACT_ENABLED: z.coerce.boolean().optional().default(false),
256
+ AUTO_MEMORY_EXTRACT_DEDUP_THRESHOLD: z.coerce.number().optional().default(0.9),
257
+ AUTO_MEMORY_SEARCH_THRESHOLD: z.coerce.number().optional().default(0.3),
258
+ // Agentic Pipeline Orchestrator
259
+ AGENTIC_PIPELINE_ENABLED: z.coerce.boolean().optional().default(false),
260
+ AGENTIC_PRE_EXECUTION_ENABLED: z.coerce.boolean().optional().default(false),
261
+ AGENTIC_PRE_EXECUTION_TIMEOUT_MS: z.coerce.number().optional().default(8e3),
262
+ // Agent Processor
263
+ AGENT_PROCESSOR_ENABLED: z.coerce.boolean().optional().default(false),
264
+ AGENT_PROCESSOR_CONCURRENCY: z.coerce.number().optional().default(1),
265
+ AGENT_MAX_TURNS: z.coerce.number().optional().default(20),
225
266
  // SOC 2 Encryption & Audit
226
267
  ENCRYPTION_MASTER_KEY: z.string().optional(),
227
268
  // 32-byte base64 key for field encryption
@@ -246,7 +287,7 @@ function configure(config) {
246
287
  );
247
288
  }
248
289
  _env = result.data;
249
- _providerInitPromise = import("./providers-J4LYPHDR.js").then((m) => m.initializeProviders()).catch(() => {
290
+ _providerInitPromise = import("./providers-2YQ6E3IF.js").then((m) => m.initializeProviders()).catch(() => {
250
291
  });
251
292
  return _env;
252
293
  }
@@ -307,4 +348,4 @@ export {
307
348
  ready,
308
349
  env
309
350
  };
310
- //# sourceMappingURL=chunk-ZLZKF2PM.js.map
351
+ //# sourceMappingURL=chunk-4KIHDIXZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/env.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\nconst envSchema = z.object({\r\n // Claude API\r\n CLAUDE_API_KEY: z.string().min(1, \"CLAUDE_API_KEY is required\"),\r\n\r\n // Telegram\r\n TELEGRAM_BOT_TOKEN: z.string().optional().default(\"\"),\r\n TELEGRAM_CHAT_ID: z.string().optional().default(\"\"),\r\n\r\n // OpenAI (Whisper STT)\r\n OPENAI_API_KEY: z.string().optional().default(\"\"),\r\n\r\n // ElevenLabs TTS\r\n ELEVENLABS_API_KEY: z.string().optional().default(\"\"),\r\n ELEVENLABS_VOICE_ID: z.string().optional().default(\"\"),\r\n\r\n // Database\r\n DATABASE_URL: z\r\n .string()\r\n .default(\"\"),\r\n\r\n // Redis\r\n REDIS_URL: z.string().default(\"redis://localhost:6379\"),\r\n\r\n // Discord (optional)\r\n DISCORD_BOT_TOKEN: z.string().optional(),\r\n DISCORD_CLIENT_ID: z.string().optional(),\r\n DISCORD_GUILD_ID: z.string().optional(),\r\n DISCORD_ALLOWED_USER_IDS: z.string().optional(), // Comma-separated list\r\n DISCORD_ALLOWED_ROLE_IDS: z.string().optional(), // Comma-separated list\r\n\r\n // Slack (optional)\r\n SLACK_BOT_TOKEN: z.string().optional(),\r\n SLACK_SIGNING_SECRET: z.string().optional(),\r\n SLACK_APP_TOKEN: z.string().optional(),\r\n SLACK_SOCKET_MODE: z.coerce.boolean().optional().default(false),\r\n SLACK_PORT: z.coerce.number().optional().default(3000),\r\n SLACK_ALLOWED_USER_IDS: z.string().optional(), // Comma-separated list\r\n SLACK_ALLOWED_CHANNEL_IDS: z.string().optional(), // Comma-separated list\r\n\r\n // Notion (optional)\r\n NOTION_API_KEY: z.string().optional(),\r\n NOTION_ROOT_PAGE_ID: z.string().optional(),\r\n\r\n // Email (optional)\r\n EMAIL_IMAP_HOST: z.string().optional(),\r\n EMAIL_IMAP_PORT: z.coerce.number().optional().default(993),\r\n EMAIL_IMAP_SECURE: z.coerce.boolean().optional().default(true),\r\n EMAIL_SMTP_HOST: z.string().optional(),\r\n EMAIL_SMTP_PORT: z.coerce.number().optional().default(587),\r\n EMAIL_SMTP_SECURE: z.coerce.boolean().optional().default(false),\r\n EMAIL_USER: z.string().optional(),\r\n EMAIL_PASSWORD: z.string().optional(),\r\n EMAIL_PROVIDER: z.enum([\"gmail\", \"outlook\", \"yahoo\", \"custom\"]).optional(),\r\n\r\n // Local Mail Server (Dovecot master user for multi-account access)\r\n EMAIL_MASTER_USER: z.string().optional(),\r\n EMAIL_MASTER_PASSWORD: z.string().optional(),\r\n EMAIL_LOCAL_IMAP_HOST: z.string().optional().default(\"127.0.0.1\"),\r\n EMAIL_LOCAL_IMAP_PORT: z.coerce.number().optional().default(993),\r\n EMAIL_LOCAL_SMTP_HOST: z.string().optional().default(\"127.0.0.1\"),\r\n EMAIL_LOCAL_SMTP_PORT: z.coerce.number().optional().default(25),\r\n\r\n // GitHub (optional)\r\n GITHUB_TOKEN: z.string().optional(),\r\n GITHUB_WEBHOOK_SECRET: z.string().optional(),\r\n\r\n // Google Services (unified OAuth2 — optional, falls back to service-specific)\r\n GOOGLE_CLIENT_ID: z.string().optional(),\r\n GOOGLE_CLIENT_SECRET: z.string().optional(),\r\n GOOGLE_REDIRECT_URI: z.string().optional(),\r\n GOOGLE_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // Google Drive (optional)\r\n GOOGLE_DRIVE_CLIENT_ID: z.string().optional(),\r\n GOOGLE_DRIVE_CLIENT_SECRET: z.string().optional(),\r\n GOOGLE_DRIVE_REDIRECT_URI: z.string().optional(),\r\n GOOGLE_DRIVE_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // Dropbox (optional)\r\n DROPBOX_APP_KEY: z.string().optional(),\r\n DROPBOX_APP_SECRET: z.string().optional(),\r\n DROPBOX_ACCESS_TOKEN: z.string().optional(),\r\n DROPBOX_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // GIF Search (optional)\r\n TENOR_API_KEY: z.string().optional(),\r\n GIPHY_API_KEY: z.string().optional(),\r\n\r\n // Finance (optional)\r\n ALPHA_VANTAGE_API_KEY: z.string().optional(),\r\n FRED_API_KEY: z.string().optional(), // Federal Reserve Economic Data\r\n FINNHUB_API_KEY: z.string().optional(), // Finnhub financial market data\r\n\r\n // Exchange Trading (optional)\r\n COINBASE_API_KEY: z.string().optional(),\r\n COINBASE_PRIVATE_KEY: z.string().optional(),\r\n BINANCE_API_KEY: z.string().optional(),\r\n BINANCE_API_SECRET: z.string().optional(),\r\n BINANCE_TESTNET: z.coerce.boolean().optional().default(false),\r\n EXCHANGE_REQUIRE_CONFIRMATION: z.coerce.boolean().optional().default(true),\r\n EXCHANGE_MAX_TRADE_SIZE: z.coerce.number().optional().default(100),\r\n EXCHANGE_MAX_DAILY_SPEND: z.coerce.number().optional().default(500),\r\n EXCHANGE_MAX_TRADES_PER_HOUR: z.coerce.number().optional().default(5),\r\n EXCHANGE_AGENT_TRADING_ENABLED: z.coerce.boolean().optional().default(false),\r\n\r\n // DeFi (optional)\r\n DEFILLAMA_API_KEY: z.string().optional(), // Pro tier\r\n\r\n // On-Chain Analytics (optional)\r\n ETHERSCAN_API_KEY: z.string().optional(),\r\n ALCHEMY_API_KEY: z.string().optional(),\r\n ALCHEMY_NETWORK: z.string().optional().default(\"eth-mainnet\"),\r\n\r\n // Optional\r\n HUGGINGFACE_ACCESS_TOKEN: z.string().optional(),\r\n TWILIO_ACCOUNT_SID: z.string().optional(),\r\n TWILIO_AUTH_TOKEN: z.string().optional(),\r\n TWILIO_PHONE_NUMBER: z.string().optional(),\r\n\r\n // Home Assistant (optional)\r\n HOME_ASSISTANT_URL: z.string().url().optional(),\r\n HOME_ASSISTANT_TOKEN: z.string().optional(),\r\n\r\n // Spotify (optional)\r\n SPOTIFY_CLIENT_ID: z.string().optional(),\r\n SPOTIFY_CLIENT_SECRET: z.string().optional(),\r\n SPOTIFY_REDIRECT_URI: z.string().optional(),\r\n SPOTIFY_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // Google Calendar (optional)\r\n GOOGLE_CALENDAR_CLIENT_ID: z.string().optional(),\r\n GOOGLE_CALENDAR_CLIENT_SECRET: z.string().optional(),\r\n GOOGLE_CALENDAR_REDIRECT_URI: z.string().url().optional(),\r\n GOOGLE_CALENDAR_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // Outlook Calendar (optional)\r\n OUTLOOK_CLIENT_ID: z.string().optional(),\r\n OUTLOOK_CLIENT_SECRET: z.string().optional(),\r\n OUTLOOK_REDIRECT_URI: z.string().url().optional(),\r\n OUTLOOK_REFRESH_TOKEN: z.string().optional(),\r\n\r\n // Microsoft 365 / Entra ID (Graph API — mail, files, sites)\r\n // Scoped broader than Outlook Calendar: powers /api/m365/* routes.\r\n M365_CLIENT_ID: z.string().optional(),\r\n M365_CLIENT_SECRET: z.string().optional(),\r\n M365_TENANT_ID: z.string().optional().default(\"common\"),\r\n M365_REDIRECT_URI: z.string().optional(),\r\n M365_GRAPH_SCOPES: z\r\n .string()\r\n .optional()\r\n .default(\r\n \"openid profile offline_access User.Read Mail.Read Mail.ReadWrite Mail.Send Calendars.Read Files.Read\"\r\n ),\r\n M365_ANALYZE_RATE_LIMIT: z.coerce.number().optional().default(30),\r\n M365_ANALYZE_RATE_REFILL: z.coerce.number().optional().default(0.5),\r\n\r\n // Dropbox (additional OAuth fields)\r\n DROPBOX_CLIENT_ID: z.string().optional(),\r\n DROPBOX_CLIENT_SECRET: z.string().optional(),\r\n DROPBOX_REDIRECT_URI: z.string().url().optional(),\r\n\r\n // MCP (Model Context Protocol)\r\n MCP_ENABLED: z.coerce.boolean().optional().default(true),\r\n MCP_CONFIG_PATH: z.string().optional().default(\"./mcp.json\"),\r\n\r\n // Multi-Provider LLM\r\n LLM_PROVIDER: z.string().optional().default(\"anthropic\"),\r\n OPENROUTER_API_KEY: z.string().optional(),\r\n OPENROUTER_BASE_URL: z.string().optional(),\r\n GROQ_API_KEY: z.string().optional(),\r\n MISTRAL_API_KEY: z.string().optional(),\r\n OPENAI_LLM_ENABLED: z.coerce.boolean().optional().default(false),\r\n OPENAI_COMPATIBLE_API_KEY: z.string().optional(),\r\n OPENAI_COMPATIBLE_BASE_URL: z.string().optional(),\r\n OPENAI_COMPATIBLE_MODEL: z.string().optional(),\r\n\r\n // xAI (Grok)\r\n XAI_API_KEY: z.string().optional(),\r\n XAI_DEFAULT_MODEL: z.string().optional().default(\"grok-2\"),\r\n\r\n // Google Gemini (optional)\r\n GEMINI_API_KEY: z.string().optional(),\r\n GEMINI_DEFAULT_MODEL: z.string().optional().default(\"gemini-2.0-flash\"),\r\n\r\n // Ollama (local models)\r\n OLLAMA_ENABLED: z.coerce.boolean().optional().default(false),\r\n OLLAMA_BASE_URL: z.string().optional().default(\"http://localhost:11434\"),\r\n OLLAMA_DEFAULT_MODEL: z.string().optional().default(\"llama3.1\"),\r\n\r\n // Model Routing\r\n MODEL_ROUTING_ENABLED: z.coerce.boolean().optional().default(true),\r\n MODEL_OPUS_ENABLED: z.coerce.boolean().optional().default(false),\r\n\r\n // Context Compaction\r\n COMPACTION_ENABLED: z.coerce.boolean().optional().default(true),\r\n COMPACTION_TOKEN_THRESHOLD: z.coerce.number().optional().default(80000),\r\n COMPACTION_PRESERVE_RECENT: z.coerce.number().optional().default(6),\r\n\r\n // Security (OWASP Agentic)\r\n PROMPT_GUARD_ENABLED: z.coerce.boolean().optional().default(true),\r\n PROMPT_GUARD_THRESHOLD: z.coerce.number().optional().default(0.7),\r\n CIRCUIT_BREAKER_ENABLED: z.coerce.boolean().optional().default(true),\r\n TOOL_SANDBOX_ENABLED: z.coerce.boolean().optional().default(true),\r\n\r\n // Observability\r\n COST_TRACKING_ENABLED: z.coerce.boolean().optional().default(true),\r\n QUALITY_SCORING_ENABLED: z.coerce.boolean().optional().default(true),\r\n REQUEST_TRACING_ENABLED: z.coerce.boolean().optional().default(true),\r\n\r\n // Intent Parser & Gateway\r\n LOCAL_INTENT_PARSER_ENABLED: z.coerce.boolean().optional().default(true),\r\n UNIFIED_GATEWAY_ENABLED: z.coerce.boolean().optional().default(false),\r\n\r\n // WhatsApp (optional)\r\n WHATSAPP_ENABLED: z.coerce.boolean().optional().default(false),\r\n WHATSAPP_AUTH_DIR: z.string().optional().default(\"./whatsapp-auth\"),\r\n WHATSAPP_ALLOWED_NUMBERS: z.string().optional(), // Comma-separated\r\n\r\n // Signal (optional)\r\n SIGNAL_ENABLED: z.coerce.boolean().optional().default(false),\r\n SIGNAL_PHONE_NUMBER: z.string().optional(),\r\n SIGNAL_CLI_PATH: z.string().optional().default(\"signal-cli\"),\r\n SIGNAL_ALLOWED_NUMBERS: z.string().optional(), // Comma-separated\r\n\r\n // iMessage (optional, macOS only)\r\n IMESSAGE_ENABLED: z.coerce.boolean().optional().default(false),\r\n IMESSAGE_MODE: z.enum([\"bluebubbles\", \"applescript\"]).optional().default(\"applescript\"),\r\n IMESSAGE_BLUEBUBBLES_URL: z.string().optional(),\r\n IMESSAGE_BLUEBUBBLES_PASSWORD: z.string().optional(),\r\n IMESSAGE_ALLOWED_NUMBERS: z.string().optional(), // Comma-separated\r\n\r\n // Tunnel Support\r\n TUNNEL_ENABLED: z.coerce.boolean().optional().default(false),\r\n TUNNEL_PROVIDER: z.enum([\"cloudflare\", \"ngrok\", \"localtunnel\"]).optional().default(\"cloudflare\"),\r\n TUNNEL_SUBDOMAIN: z.string().optional(),\r\n TUNNEL_AUTH_TOKEN: z.string().optional(),\r\n\r\n // Autonomy Levels\r\n AUTONOMY_LEVEL: z.enum([\"readonly\", \"supervised\", \"autonomous\"]).optional().default(\"autonomous\"),\r\n\r\n // Prometheus/OpenTelemetry\r\n PROMETHEUS_ENABLED: z.coerce.boolean().optional().default(false),\r\n PROMETHEUS_PATH: z.string().optional().default(\"/metrics\"),\r\n\r\n // Device Pairing\r\n PAIRING_ENABLED: z.coerce.boolean().optional().default(false),\r\n PAIRING_CODE_LIFETIME_MINUTES: z.coerce.number().optional().default(5),\r\n\r\n // Gateway Authentication (OpenClaw-style)\r\n // If set, web UI and API requests require this token. Unset = open access (localhost-friendly).\r\n GATEWAY_TOKEN: z.string().optional(),\r\n\r\n // Matrix (optional)\r\n MATRIX_ENABLED: z.coerce.boolean().optional().default(false),\r\n MATRIX_HOMESERVER_URL: z.string().optional(),\r\n MATRIX_ACCESS_TOKEN: z.string().optional(),\r\n MATRIX_USER_ID: z.string().optional(),\r\n MATRIX_ALLOWED_ROOM_IDS: z.string().optional(), // Comma-separated\r\n MATRIX_AUTO_JOIN: z.coerce.boolean().optional().default(true),\r\n MATRIX_E2E_ENABLED: z.coerce.boolean().optional().default(false),\r\n\r\n // Neo4j (OSINT graph database)\r\n NEO4J_URI: z.string().optional().default(\"bolt://localhost:7687\"),\r\n NEO4J_USER: z.string().optional().default(\"neo4j\"),\r\n NEO4J_PASSWORD: z.string().optional().default(\"\"),\r\n NEO4J_DATABASE: z.string().optional().default(\"neo4j\"),\r\n\r\n // OSINT API Keys\r\n FEC_API_KEY: z.string().optional().default(\"\"),\r\n OPENCORPORATES_API_TOKEN: z.string().optional().default(\"\"),\r\n SEC_EDGAR_USER_AGENT: z.string().optional().default(\"OpenSentinel/2.1 (contact@opensentinel.ai)\"),\r\n\r\n // OSINT Feature Toggle\r\n OSINT_ENABLED: z.coerce.boolean().optional().default(false),\r\n OSINT_RATE_LIMIT_BUFFER_MS: z.coerce.number().optional().default(200),\r\n\r\n // Embedding Provider\r\n EMBEDDING_PROVIDER: z.enum([\"openai\", \"huggingface\", \"tfidf\"]).optional().default(\"openai\"),\r\n EMBEDDING_MODEL: z.string().optional(),\r\n EMBEDDING_DIMENSIONS: z.coerce.number().optional(),\r\n EMBEDDING_DB_DIMENSIONS: z.coerce.number().optional().default(1536),\r\n EMBEDDING_BATCH_SIZE: z.coerce.number().optional().default(32),\r\n\r\n // Advanced RAG\r\n HYDE_ENABLED: z.coerce.boolean().optional().default(false),\r\n RERANK_ENABLED: z.coerce.boolean().optional().default(false),\r\n RERANK_MIN_SCORE: z.coerce.number().optional().default(3),\r\n MULTISTEP_RAG_ENABLED: z.coerce.boolean().optional().default(false),\r\n MULTISTEP_MAX_STEPS: z.coerce.number().optional().default(2),\r\n RETRIEVAL_CACHE_ENABLED: z.coerce.boolean().optional().default(false),\r\n CONTEXTUAL_QUERY_ENABLED: z.coerce.boolean().optional().default(false),\r\n\r\n // Agentic RAG Pipeline\r\n TOOL_CLASSIFIER_ENABLED: z.coerce.boolean().optional().default(false),\r\n TOOL_CLASSIFIER_TIMEOUT_MS: z.coerce.number().optional().default(5000),\r\n TOOL_CLASSIFIER_MAX_CATEGORIES: z.coerce.number().optional().default(3),\r\n\r\n // AI Memory (auto-extract/search)\r\n AUTO_MEMORY_EXTRACT_ENABLED: z.coerce.boolean().optional().default(false),\r\n AUTO_MEMORY_EXTRACT_DEDUP_THRESHOLD: z.coerce.number().optional().default(0.9),\r\n AUTO_MEMORY_SEARCH_THRESHOLD: z.coerce.number().optional().default(0.3),\r\n\r\n // Agentic Pipeline Orchestrator\r\n AGENTIC_PIPELINE_ENABLED: z.coerce.boolean().optional().default(false),\r\n AGENTIC_PRE_EXECUTION_ENABLED: z.coerce.boolean().optional().default(false),\r\n AGENTIC_PRE_EXECUTION_TIMEOUT_MS: z.coerce.number().optional().default(8000),\r\n\r\n // Agent Processor\r\n AGENT_PROCESSOR_ENABLED: z.coerce.boolean().optional().default(false),\r\n AGENT_PROCESSOR_CONCURRENCY: z.coerce.number().optional().default(1),\r\n AGENT_MAX_TURNS: z.coerce.number().optional().default(20),\r\n\r\n // SOC 2 Encryption & Audit\r\n ENCRYPTION_MASTER_KEY: z.string().optional(), // 32-byte base64 key for field encryption\r\n AUDIT_SIGNING_KEY: z.string().optional(), // HMAC key for tamper-proof audit logs\r\n\r\n // Server\r\n PORT: z.coerce.number().default(8030),\r\n NODE_ENV: z.enum([\"development\", \"production\", \"test\"]).default(\"development\"),\r\n});\r\n\r\nexport type Env = z.infer<typeof envSchema>;\r\n\r\n// Internal mutable store\r\nlet _env: Env | null = null;\r\n\r\n/**\r\n * Programmatic configuration for library use.\r\n * Call this before any module accesses `env`.\r\n * Config values are merged with process.env (config takes precedence).\r\n */\r\nlet _providerInitPromise: Promise<void> | null = null;\r\n\r\nexport function configure(config: Partial<Env> & { CLAUDE_API_KEY: string }): Env {\r\n const merged = { ...process.env, ...config };\r\n const result = envSchema.safeParse(merged);\r\n\r\n if (!result.success) {\r\n const errors = result.error.errors.map(\r\n (e) => `${e.path.join(\".\")}: ${e.message}`\r\n );\r\n throw new Error(\r\n `OpenSentinel configuration validation failed:\\n ${errors.join(\"\\n \")}`\r\n );\r\n }\r\n\r\n _env = result.data;\r\n\r\n // Auto-initialize LLM providers after configuration\r\n _providerInitPromise = import(\"../core/providers\").then((m) => m.initializeProviders()).catch(() => {});\r\n\r\n return _env;\r\n}\r\n\r\n/**\r\n * Wait for provider initialization to complete.\r\n * Call after configure() if you need providers ready before first API call.\r\n */\r\nexport async function ready(): Promise<void> {\r\n if (_providerInitPromise) await _providerInitPromise;\r\n}\r\n\r\n/**\r\n * Load config from process.env.\r\n * Called lazily on first access if configure() was not called.\r\n *\r\n * When used as a library, env vars may not be set at import time\r\n * (module-level singletons trigger this during static initialization).\r\n * In that case, we populate with defaults and partial values rather\r\n * than throwing — services will fail with clear errors when actually used.\r\n */\r\nfunction loadFromProcessEnv(): Env {\r\n const result = envSchema.safeParse(process.env);\r\n\r\n if (!result.success) {\r\n // If running as CLI (not library), throw so the user sees the error immediately\r\n if (process.env.__OPENSENTINEL_CLI__) {\r\n const errors = result.error.errors.map(\r\n (e) => `${e.path.join(\".\")}: ${e.message}`\r\n );\r\n throw new Error(\r\n `Environment validation failed:\\n ${errors.join(\"\\n \")}`\r\n );\r\n }\r\n\r\n // For library use: populate with whatever we have, fill missing with defaults\r\n // Services will fail individually when they try to use undefined API keys\r\n const lenientSchema = envSchema.extend({\r\n CLAUDE_API_KEY: z.string().default(\"\"),\r\n });\r\n const lenientResult = lenientSchema.safeParse(process.env);\r\n _env = (lenientResult.success ? lenientResult.data : {}) as Env;\r\n return _env;\r\n }\r\n\r\n _env = result.data;\r\n return _env;\r\n}\r\n\r\n/**\r\n * The env accessor. Lazy — loads from process.env on first access\r\n * if configure() was not called first.\r\n *\r\n * All 37+ consumer files keep using `env.SOME_PROP` unchanged.\r\n */\r\nexport const env: Env = new Proxy({} as Env, {\r\n get(_target, prop: string) {\r\n if (!_env) {\r\n loadFromProcessEnv();\r\n }\r\n return (_env as any)[prop];\r\n },\r\n has(_target, prop: string) {\r\n if (!_env) {\r\n loadFromProcessEnv();\r\n }\r\n return prop in (_env as any);\r\n },\r\n ownKeys() {\r\n if (!_env) {\r\n loadFromProcessEnv();\r\n }\r\n return Reflect.ownKeys(_env as any);\r\n },\r\n getOwnPropertyDescriptor(_target, prop) {\r\n if (!_env) {\r\n loadFromProcessEnv();\r\n }\r\n return Object.getOwnPropertyDescriptor(_env as any, prop);\r\n },\r\n});\r\n"],"mappings":"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","names":[]}
@@ -1,16 +1,12 @@
1
+ import {
2
+ providerRegistry
3
+ } from "./chunk-GW6V4D43.js";
1
4
  import {
2
5
  isPathAllowed
3
6
  } from "./chunk-CQ4JURG7.js";
4
- import {
5
- env
6
- } from "./chunk-ZLZKF2PM.js";
7
7
 
8
8
  // src/tools/image-analysis.ts
9
- import Anthropic from "@anthropic-ai/sdk";
10
9
  import { readFile } from "fs/promises";
11
- var anthropic = new Anthropic({
12
- apiKey: env.CLAUDE_API_KEY
13
- });
14
10
  var SUPPORTED_TYPES = {
15
11
  ".jpg": "image/jpeg",
16
12
  ".jpeg": "image/jpeg",
@@ -24,7 +20,8 @@ function getMimeType(filename) {
24
20
  }
25
21
  async function analyzeImageUrl(imageUrl, prompt) {
26
22
  try {
27
- const response = await anthropic.messages.create({
23
+ const provider = providerRegistry.getDefault();
24
+ const response = await provider.createMessage({
28
25
  model: "claude-sonnet-4-20250514",
29
26
  max_tokens: 1024,
30
27
  messages: [
@@ -49,7 +46,7 @@ async function analyzeImageUrl(imageUrl, prompt) {
49
46
  const textContent = response.content.find((c) => c.type === "text");
50
47
  return {
51
48
  success: true,
52
- analysis: textContent?.type === "text" ? textContent.text : void 0
49
+ analysis: textContent?.text
53
50
  };
54
51
  } catch (error) {
55
52
  return {
@@ -75,7 +72,8 @@ async function analyzeImageFile(filePath, prompt) {
75
72
  }
76
73
  const imageData = await readFile(filePath);
77
74
  const base64 = imageData.toString("base64");
78
- const response = await anthropic.messages.create({
75
+ const provider = providerRegistry.getDefault();
76
+ const response = await provider.createMessage({
79
77
  model: "claude-sonnet-4-20250514",
80
78
  max_tokens: 1024,
81
79
  messages: [
@@ -86,7 +84,7 @@ async function analyzeImageFile(filePath, prompt) {
86
84
  type: "image",
87
85
  source: {
88
86
  type: "base64",
89
- media_type: mimeType,
87
+ mediaType: mimeType,
90
88
  data: base64
91
89
  }
92
90
  },
@@ -101,7 +99,7 @@ async function analyzeImageFile(filePath, prompt) {
101
99
  const textContent = response.content.find((c) => c.type === "text");
102
100
  return {
103
101
  success: true,
104
- analysis: textContent?.type === "text" ? textContent.text : void 0
102
+ analysis: textContent?.text
105
103
  };
106
104
  } catch (error) {
107
105
  return {
@@ -113,7 +111,8 @@ async function analyzeImageFile(filePath, prompt) {
113
111
  async function analyzeImageBuffer(imageBuffer, mimeType, prompt) {
114
112
  try {
115
113
  const base64 = imageBuffer.toString("base64");
116
- const response = await anthropic.messages.create({
114
+ const provider = providerRegistry.getDefault();
115
+ const response = await provider.createMessage({
117
116
  model: "claude-sonnet-4-20250514",
118
117
  max_tokens: 1024,
119
118
  messages: [
@@ -124,7 +123,7 @@ async function analyzeImageBuffer(imageBuffer, mimeType, prompt) {
124
123
  type: "image",
125
124
  source: {
126
125
  type: "base64",
127
- media_type: mimeType,
126
+ mediaType: mimeType,
128
127
  data: base64
129
128
  }
130
129
  },
@@ -139,7 +138,7 @@ async function analyzeImageBuffer(imageBuffer, mimeType, prompt) {
139
138
  const textContent = response.content.find((c) => c.type === "text");
140
139
  return {
141
140
  success: true,
142
- analysis: textContent?.type === "text" ? textContent.text : void 0
141
+ analysis: textContent?.text
143
142
  };
144
143
  } catch (error) {
145
144
  return {
@@ -287,4 +286,4 @@ export {
287
286
  extractStructuredData,
288
287
  ocr_default
289
288
  };
290
- //# sourceMappingURL=chunk-EVE7MIIY.js.map
289
+ //# sourceMappingURL=chunk-4WH6MFEW.js.map